wave-agent-sdk 0.10.3 → 0.11.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.
- package/dist/agent.d.ts +8 -6
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +12 -9
- package/dist/builtin-skills/builtin-skills/loop/SKILL.md +53 -0
- package/dist/builtin-skills/builtin-skills/loop/parsing.ts +159 -0
- package/dist/builtin-skills/builtin-skills/settings/HOOKS.md +82 -0
- package/dist/builtin-skills/{settings → builtin-skills/settings}/SKILL.md +1 -1
- package/dist/builtin-skills/loop/parsing.d.ts +13 -0
- package/dist/builtin-skills/loop/parsing.d.ts.map +1 -0
- package/dist/builtin-skills/loop/parsing.js +125 -0
- package/dist/constants/tools.d.ts +3 -0
- package/dist/constants/tools.d.ts.map +1 -1
- package/dist/constants/tools.js +3 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/managers/aiManager.d.ts +0 -2
- package/dist/managers/aiManager.d.ts.map +1 -1
- package/dist/managers/aiManager.js +53 -14
- package/dist/managers/cronManager.d.ts +19 -0
- package/dist/managers/cronManager.d.ts.map +1 -0
- package/dist/managers/cronManager.js +124 -0
- package/dist/managers/hookManager.d.ts.map +1 -1
- package/dist/managers/hookManager.js +21 -13
- package/dist/managers/liveConfigManager.js +1 -1
- package/dist/managers/mcpManager.d.ts +1 -1
- package/dist/managers/mcpManager.d.ts.map +1 -1
- package/dist/managers/mcpManager.js +10 -2
- package/dist/managers/messageManager.d.ts +0 -1
- package/dist/managers/messageManager.d.ts.map +1 -1
- package/dist/managers/permissionManager.d.ts +27 -7
- package/dist/managers/permissionManager.d.ts.map +1 -1
- package/dist/managers/permissionManager.js +119 -14
- package/dist/managers/slashCommandManager.d.ts.map +1 -1
- package/dist/managers/slashCommandManager.js +11 -0
- package/dist/managers/subagentManager.d.ts +3 -0
- package/dist/managers/subagentManager.d.ts.map +1 -1
- package/dist/managers/subagentManager.js +10 -17
- package/dist/managers/toolManager.d.ts +1 -1
- package/dist/managers/toolManager.d.ts.map +1 -1
- package/dist/managers/toolManager.js +28 -4
- package/dist/services/configurationService.d.ts.map +1 -1
- package/dist/services/configurationService.js +8 -7
- package/dist/services/hook.d.ts.map +1 -1
- package/dist/services/hook.js +3 -10
- package/dist/services/initializationService.js +2 -2
- package/dist/services/jsonlHandler.d.ts.map +1 -1
- package/dist/services/jsonlHandler.js +3 -0
- package/dist/services/reversionService.d.ts +2 -2
- package/dist/services/reversionService.d.ts.map +1 -1
- package/dist/services/reversionService.js +3 -3
- package/dist/services/session.d.ts.map +1 -1
- package/dist/services/session.js +18 -11
- package/dist/tools/agentTool.js +1 -1
- package/dist/tools/bashTool.d.ts.map +1 -1
- package/dist/tools/bashTool.js +33 -12
- package/dist/tools/cronCreateTool.d.ts +3 -0
- package/dist/tools/cronCreateTool.d.ts.map +1 -0
- package/dist/tools/cronCreateTool.js +59 -0
- package/dist/tools/cronDeleteTool.d.ts +3 -0
- package/dist/tools/cronDeleteTool.d.ts.map +1 -0
- package/dist/tools/cronDeleteTool.js +38 -0
- package/dist/tools/cronListTool.d.ts +3 -0
- package/dist/tools/cronListTool.d.ts.map +1 -0
- package/dist/tools/cronListTool.js +30 -0
- package/dist/tools/readTool.d.ts.map +1 -1
- package/dist/tools/readTool.js +8 -32
- package/dist/tools/skillTool.d.ts +0 -3
- package/dist/tools/skillTool.d.ts.map +1 -1
- package/dist/tools/skillTool.js +4 -3
- package/dist/tools/taskOutputTool.d.ts.map +1 -1
- package/dist/tools/taskOutputTool.js +15 -8
- package/dist/tools/types.d.ts +2 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/types/agent.d.ts +10 -0
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/configuration.d.ts +1 -1
- package/dist/types/configuration.d.ts.map +1 -1
- package/dist/types/cron.d.ts +10 -0
- package/dist/types/cron.d.ts.map +1 -0
- package/dist/types/cron.js +1 -0
- package/dist/types/hooks.d.ts +1 -5
- package/dist/types/hooks.d.ts.map +1 -1
- package/dist/types/hooks.js +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/messaging.d.ts +1 -1
- package/dist/types/messaging.d.ts.map +1 -1
- package/dist/utils/containerSetup.d.ts.map +1 -1
- package/dist/utils/containerSetup.js +40 -13
- package/dist/utils/mcpUtils.d.ts +2 -2
- package/dist/utils/mcpUtils.d.ts.map +1 -1
- package/dist/utils/mcpUtils.js +1 -5
- package/package.json +2 -1
- package/src/agent.ts +17 -12
- package/src/builtin-skills/loop/SKILL.md +53 -0
- package/src/builtin-skills/loop/parsing.ts +159 -0
- package/src/builtin-skills/settings/HOOKS.md +44 -57
- package/src/builtin-skills/settings/SKILL.md +1 -1
- package/src/constants/tools.ts +3 -0
- package/src/index.ts +1 -0
- package/src/managers/aiManager.ts +72 -24
- package/src/managers/cronManager.ts +167 -0
- package/src/managers/hookManager.ts +27 -13
- package/src/managers/liveConfigManager.ts +2 -2
- package/src/managers/mcpManager.ts +23 -2
- package/src/managers/messageManager.ts +0 -6
- package/src/managers/permissionManager.ts +154 -18
- package/src/managers/slashCommandManager.ts +12 -0
- package/src/managers/subagentManager.ts +15 -19
- package/src/managers/toolManager.ts +37 -4
- package/src/services/configurationService.ts +8 -7
- package/src/services/hook.ts +5 -11
- package/src/services/initializationService.ts +3 -3
- package/src/services/jsonlHandler.ts +4 -0
- package/src/services/reversionService.ts +9 -4
- package/src/services/session.ts +19 -12
- package/src/tools/agentTool.ts +1 -1
- package/src/tools/bashTool.ts +43 -14
- package/src/tools/cronCreateTool.ts +73 -0
- package/src/tools/cronDeleteTool.ts +47 -0
- package/src/tools/cronListTool.ts +38 -0
- package/src/tools/readTool.ts +11 -33
- package/src/tools/skillTool.ts +6 -4
- package/src/tools/taskOutputTool.ts +14 -8
- package/src/tools/types.ts +2 -0
- package/src/types/agent.ts +10 -0
- package/src/types/configuration.ts +1 -1
- package/src/types/cron.ts +9 -0
- package/src/types/hooks.ts +5 -9
- package/src/types/index.ts +1 -0
- package/src/types/messaging.ts +1 -1
- package/src/utils/containerSetup.ts +50 -16
- package/src/utils/mcpUtils.ts +2 -5
- package/dist/builtin-skills/settings/HOOKS.md +0 -95
|
@@ -78,23 +78,17 @@ export class AIManager {
|
|
|
78
78
|
/**
|
|
79
79
|
* Get filtered tool configuration based on tools list
|
|
80
80
|
*/
|
|
81
|
-
getFilteredToolsConfig(
|
|
81
|
+
getFilteredToolsConfig() {
|
|
82
82
|
// Get available subagents and skills for dynamic prompts
|
|
83
83
|
const availableSubagents = this.subagentManager?.getConfigurations();
|
|
84
84
|
const availableSkills = this.skillManager
|
|
85
85
|
?.getAvailableSkills()
|
|
86
86
|
.filter((skill) => !skill.disableModelInvocation);
|
|
87
|
-
|
|
87
|
+
return this.toolManager.getToolsConfig({
|
|
88
88
|
availableSubagents,
|
|
89
89
|
availableSkills,
|
|
90
90
|
workdir: this.workdir,
|
|
91
91
|
});
|
|
92
|
-
// If no tools specified, return all tools
|
|
93
|
-
if (!tools || tools.length === 0) {
|
|
94
|
-
return allTools;
|
|
95
|
-
}
|
|
96
|
-
// Filter tools
|
|
97
|
-
return allTools.filter((tool) => tools.includes(tool.function.name));
|
|
98
92
|
}
|
|
99
93
|
setIsLoading(isLoading) {
|
|
100
94
|
this.isLoading = isLoading;
|
|
@@ -213,7 +207,7 @@ export class AIManager {
|
|
|
213
207
|
return this.container.get("SkillManager");
|
|
214
208
|
}
|
|
215
209
|
async sendAIMessage(options = {}) {
|
|
216
|
-
const { recursionDepth = 0, model, allowedRules,
|
|
210
|
+
const { recursionDepth = 0, model, allowedRules, maxTokens } = options;
|
|
217
211
|
// Only check isLoading for the initial call (recursionDepth === 0)
|
|
218
212
|
if (recursionDepth === 0 && this.isLoading) {
|
|
219
213
|
return;
|
|
@@ -253,7 +247,7 @@ export class AIManager {
|
|
|
253
247
|
logger?.debug("modelConfig in sendAIMessage", this.getModelConfig());
|
|
254
248
|
// Get current permission mode and plan file path
|
|
255
249
|
const currentMode = this.permissionManager?.getCurrentEffectiveMode(this.getModelConfig().permissionMode);
|
|
256
|
-
const toolsConfig = this.getFilteredToolsConfig(
|
|
250
|
+
const toolsConfig = this.getFilteredToolsConfig();
|
|
257
251
|
const toolNames = new Set(toolsConfig.map((t) => t.function.name));
|
|
258
252
|
const filteredToolPlugins = this.toolManager
|
|
259
253
|
.getTools()
|
|
@@ -324,7 +318,6 @@ export class AIManager {
|
|
|
324
318
|
name: toolCall.name,
|
|
325
319
|
parameters: toolCall.parameters,
|
|
326
320
|
parametersChunk: toolCall.parametersChunk,
|
|
327
|
-
compactParams: toolCall.parameters?.split("\n").pop()?.slice(-30),
|
|
328
321
|
stage: toolCall.stage || "streaming", // Default to streaming if stage not provided
|
|
329
322
|
});
|
|
330
323
|
};
|
|
@@ -456,7 +449,17 @@ export class AIManager {
|
|
|
456
449
|
}
|
|
457
450
|
}
|
|
458
451
|
const compactParams = this.generateCompactParams(toolName, toolArgs);
|
|
459
|
-
// Emit
|
|
452
|
+
// Emit start stage for non-streaming tool calls
|
|
453
|
+
if (!this.stream) {
|
|
454
|
+
this.messageManager.updateToolBlock({
|
|
455
|
+
id: toolId,
|
|
456
|
+
stage: "start",
|
|
457
|
+
name: toolName,
|
|
458
|
+
compactParams,
|
|
459
|
+
parameters: argsString,
|
|
460
|
+
});
|
|
461
|
+
}
|
|
462
|
+
// Emit running stage (tool execution about to start)
|
|
460
463
|
this.messageManager.updateToolBlock({
|
|
461
464
|
id: toolId,
|
|
462
465
|
stage: "running",
|
|
@@ -502,6 +505,7 @@ export class AIManager {
|
|
|
502
505
|
error: toolResult.error,
|
|
503
506
|
stage: "end",
|
|
504
507
|
name: toolName,
|
|
508
|
+
compactParams,
|
|
505
509
|
shortResult: toolResult.shortResult,
|
|
506
510
|
isManuallyBackgrounded: toolResult.isManuallyBackgrounded,
|
|
507
511
|
startLineNumber: toolResult.startLineNumber,
|
|
@@ -557,12 +561,48 @@ export class AIManager {
|
|
|
557
561
|
content: "Your response was cut off because it exceeded the output token limit. Please break your work into smaller pieces. Continue from where you left off.",
|
|
558
562
|
});
|
|
559
563
|
}
|
|
564
|
+
// Duplicate Tool Call Detection
|
|
565
|
+
if (toolCalls.length > 0) {
|
|
566
|
+
const messages = this.messageManager.getMessages();
|
|
567
|
+
// Find the most recent assistant message BEFORE the current one that has tool blocks
|
|
568
|
+
// The current assistant message is messages[messages.length - 1]
|
|
569
|
+
let previousAssistantWithTools;
|
|
570
|
+
for (let i = messages.length - 2; i >= 0; i--) {
|
|
571
|
+
const msg = messages[i];
|
|
572
|
+
if (msg.role === "assistant" &&
|
|
573
|
+
msg.blocks.some((b) => b.type === "tool")) {
|
|
574
|
+
previousAssistantWithTools = msg;
|
|
575
|
+
break;
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
if (previousAssistantWithTools) {
|
|
579
|
+
const previousToolBlocks = previousAssistantWithTools.blocks.filter((b) => b.type === "tool");
|
|
580
|
+
for (const currentToolCall of toolCalls) {
|
|
581
|
+
const currentName = currentToolCall.function?.name;
|
|
582
|
+
const currentArgs = currentToolCall.function?.arguments;
|
|
583
|
+
const isDuplicate = previousToolBlocks.some((prevBlock) => prevBlock.name === currentName &&
|
|
584
|
+
prevBlock.parameters === currentArgs);
|
|
585
|
+
if (isDuplicate && currentName) {
|
|
586
|
+
const toolId = currentToolCall.id;
|
|
587
|
+
const lastMessage = messages[messages.length - 1];
|
|
588
|
+
const toolBlock = lastMessage.blocks.find((b) => b.type === "tool" && b.id === toolId);
|
|
589
|
+
if (toolBlock) {
|
|
590
|
+
const warning = `\n\nNote: You just called this tool with the same arguments in the previous turn. Please ensure you are not in a loop and consider if you need to change your approach.`;
|
|
591
|
+
this.messageManager.updateToolBlock({
|
|
592
|
+
id: toolId,
|
|
593
|
+
result: (toolBlock.result || "") + warning,
|
|
594
|
+
stage: "end",
|
|
595
|
+
});
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
}
|
|
560
601
|
// Recursively call AI service, increment recursion depth, and pass same configuration
|
|
561
602
|
await this.sendAIMessage({
|
|
562
603
|
recursionDepth: recursionDepth + 1,
|
|
563
604
|
model,
|
|
564
605
|
allowedRules,
|
|
565
|
-
tools,
|
|
566
606
|
maxTokens,
|
|
567
607
|
});
|
|
568
608
|
}
|
|
@@ -604,7 +644,6 @@ export class AIManager {
|
|
|
604
644
|
recursionDepth: 0,
|
|
605
645
|
model,
|
|
606
646
|
allowedRules,
|
|
607
|
-
tools,
|
|
608
647
|
maxTokens,
|
|
609
648
|
});
|
|
610
649
|
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Container } from "../utils/container.js";
|
|
2
|
+
import { CronJob } from "../types/cron.js";
|
|
3
|
+
export declare class CronManager {
|
|
4
|
+
private container;
|
|
5
|
+
private jobs;
|
|
6
|
+
private interval;
|
|
7
|
+
constructor(container: Container);
|
|
8
|
+
private get aiManager();
|
|
9
|
+
private get messageManager();
|
|
10
|
+
start(): void;
|
|
11
|
+
stop(): void;
|
|
12
|
+
createJob(job: Omit<CronJob, "id" | "createdAt" | "nextRun" | "periodMs">): CronJob;
|
|
13
|
+
deleteJob(id: string): boolean;
|
|
14
|
+
listJobs(): CronJob[];
|
|
15
|
+
private applyJitter;
|
|
16
|
+
private getDeterministicRandom;
|
|
17
|
+
private checkJobs;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=cronManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cronManager.d.ts","sourceRoot":"","sources":["../../src/managers/cronManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAM3C,qBAAa,WAAW;IAIV,OAAO,CAAC,SAAS;IAH7B,OAAO,CAAC,IAAI,CAA8B;IAC1C,OAAO,CAAC,QAAQ,CAA+B;gBAE3B,SAAS,EAAE,SAAS;IAExC,OAAO,KAAK,SAAS,GAEpB;IAED,OAAO,KAAK,cAAc,GAEzB;IAEM,KAAK,IAAI,IAAI;IAKb,IAAI,IAAI,IAAI;IAOZ,SAAS,CACd,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,WAAW,GAAG,SAAS,GAAG,UAAU,CAAC,GAC9D,OAAO;IAiCH,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI9B,QAAQ,IAAI,OAAO,EAAE;IAI5B,OAAO,CAAC,WAAW;IAuBnB,OAAO,CAAC,sBAAsB;YAYhB,SAAS;CAuDxB"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { CronExpressionParser } from "cron-parser";
|
|
2
|
+
import { logger } from "../utils/globalLogger.js";
|
|
3
|
+
export class CronManager {
|
|
4
|
+
constructor(container) {
|
|
5
|
+
this.container = container;
|
|
6
|
+
this.jobs = new Map();
|
|
7
|
+
this.interval = null;
|
|
8
|
+
}
|
|
9
|
+
get aiManager() {
|
|
10
|
+
return this.container.get("AIManager");
|
|
11
|
+
}
|
|
12
|
+
get messageManager() {
|
|
13
|
+
return this.container.get("MessageManager");
|
|
14
|
+
}
|
|
15
|
+
start() {
|
|
16
|
+
if (this.interval)
|
|
17
|
+
return;
|
|
18
|
+
this.interval = setInterval(() => this.checkJobs(), 60000); // Check every minute
|
|
19
|
+
}
|
|
20
|
+
stop() {
|
|
21
|
+
if (this.interval) {
|
|
22
|
+
clearInterval(this.interval);
|
|
23
|
+
this.interval = null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
createJob(job) {
|
|
27
|
+
const id = Math.random().toString(36).substring(2, 11);
|
|
28
|
+
const createdAt = Date.now();
|
|
29
|
+
const interval = CronExpressionParser.parse(job.cron);
|
|
30
|
+
const nextRunDate = interval.next().toDate();
|
|
31
|
+
const nextRun = nextRunDate.getTime();
|
|
32
|
+
// Calculate periodMs
|
|
33
|
+
const secondRunDate = interval.next().toDate();
|
|
34
|
+
const periodMs = secondRunDate.getTime() - nextRunDate.getTime();
|
|
35
|
+
// Apply Jitter
|
|
36
|
+
const jitteredNextRun = this.applyJitter(nextRun, periodMs, job.recurring, nextRunDate, id);
|
|
37
|
+
const newJob = {
|
|
38
|
+
...job,
|
|
39
|
+
id,
|
|
40
|
+
createdAt,
|
|
41
|
+
nextRun: jitteredNextRun,
|
|
42
|
+
periodMs,
|
|
43
|
+
};
|
|
44
|
+
this.jobs.set(id, newJob);
|
|
45
|
+
return newJob;
|
|
46
|
+
}
|
|
47
|
+
deleteJob(id) {
|
|
48
|
+
return this.jobs.delete(id);
|
|
49
|
+
}
|
|
50
|
+
listJobs() {
|
|
51
|
+
return Array.from(this.jobs.values());
|
|
52
|
+
}
|
|
53
|
+
applyJitter(nextRun, periodMs, recurring, nextRunDate, id) {
|
|
54
|
+
const deterministicRandom = this.getDeterministicRandom(id);
|
|
55
|
+
if (recurring) {
|
|
56
|
+
// Recurring: Random delay up to 10% of period (max 15 min)
|
|
57
|
+
const maxJitter = Math.min(periodMs * 0.1, 15 * 60 * 1000);
|
|
58
|
+
return nextRun + deterministicRandom * maxJitter;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
// One-shot: Random early fire up to 90s if scheduled on :00 or :30
|
|
62
|
+
const minutes = nextRunDate.getMinutes();
|
|
63
|
+
const seconds = nextRunDate.getSeconds();
|
|
64
|
+
if ((minutes === 0 || minutes === 30) && seconds === 0) {
|
|
65
|
+
return nextRun - deterministicRandom * 90 * 1000;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return nextRun;
|
|
69
|
+
}
|
|
70
|
+
getDeterministicRandom(id) {
|
|
71
|
+
let hash = 0;
|
|
72
|
+
for (let i = 0; i < id.length; i++) {
|
|
73
|
+
const char = id.charCodeAt(i);
|
|
74
|
+
hash = (hash << 5) - hash + char;
|
|
75
|
+
hash |= 0; // Convert to 32bit integer
|
|
76
|
+
}
|
|
77
|
+
// Use a simple LCG-like approach to get a value between 0 and 1
|
|
78
|
+
const x = Math.sin(hash) * 10000;
|
|
79
|
+
return x - Math.floor(x);
|
|
80
|
+
}
|
|
81
|
+
async checkJobs() {
|
|
82
|
+
const now = Date.now();
|
|
83
|
+
const aiManager = this.aiManager;
|
|
84
|
+
const messageManager = this.messageManager;
|
|
85
|
+
for (const [id, job] of this.jobs.entries()) {
|
|
86
|
+
// Expiration: Recurring jobs MUST auto-expire after 7 days
|
|
87
|
+
if (job.recurring && now - job.createdAt > 7 * 24 * 60 * 60 * 1000) {
|
|
88
|
+
this.jobs.delete(id);
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (now >= job.nextRun) {
|
|
92
|
+
// Idle-Check: Only fire jobs if AIManager.isLoading is false
|
|
93
|
+
if (aiManager.isLoading) {
|
|
94
|
+
logger?.debug(`CronManager: Skipping job ${id} because AI is busy`);
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
logger?.info(`CronManager: Firing job ${id}: ${job.prompt}`);
|
|
98
|
+
// Execution
|
|
99
|
+
messageManager.addUserMessage({ content: job.prompt });
|
|
100
|
+
aiManager.sendAIMessage().catch((err) => {
|
|
101
|
+
logger?.error(`CronManager: Failed to execute job ${id}`, err);
|
|
102
|
+
});
|
|
103
|
+
if (job.recurring) {
|
|
104
|
+
// Schedule next run
|
|
105
|
+
try {
|
|
106
|
+
const interval = CronExpressionParser.parse(job.cron, {
|
|
107
|
+
currentDate: new Date(job.nextRun + 1000),
|
|
108
|
+
});
|
|
109
|
+
const nextRunDate = interval.next().toDate();
|
|
110
|
+
const nextRun = nextRunDate.getTime();
|
|
111
|
+
job.nextRun = this.applyJitter(nextRun, job.periodMs, true, nextRunDate, id);
|
|
112
|
+
}
|
|
113
|
+
catch (e) {
|
|
114
|
+
logger?.error(`CronManager: Failed to parse cron for recurring job ${id}`, e);
|
|
115
|
+
this.jobs.delete(id);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
this.jobs.delete(id);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hookManager.d.ts","sourceRoot":"","sources":["../../src/managers/hookManager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,KAAK,SAAS,EAEd,KAAK,oBAAoB,EACzB,KAAK,4BAA4B,EACjC,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EAI1B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,iBAAiB,EACjB,wBAAwB,EACzB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAIlD,qBAAa,WAAW;IAMpB,OAAO,CAAC,SAAS;IALnB,OAAO,CAAC,aAAa,CAAuC;IAC5D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAGvB,SAAS,EAAE,SAAS,EAC5B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,WAA+B;IAM1C;;;OAGG;IACH,iBAAiB,CACf,SAAS,CAAC,EAAE,wBAAwB,EACpC,YAAY,CAAC,EAAE,wBAAwB,GACtC,IAAI;IAyBP;;;OAGG;IACH,+BAA+B,CAAC,UAAU,EAAE,iBAAiB,GAAG,IAAI,GAAG,IAAI;IA6B3E;;OAEG;IACG,YAAY,CAChB,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,oBAAoB,GAAG,4BAA4B,GAC3D,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAoGjC;;;OAGG;IACH,kBAAkB,CAChB,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,mBAAmB,EAAE,EAC9B,cAAc,CAAC,EAAE,cAAc,EAC/B,MAAM,CAAC,EAAE,MAAM,EACf,cAAc,CAAC,EAAE,MAAM,GACtB;QACD,WAAW,EAAE,OAAO,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB;
|
|
1
|
+
{"version":3,"file":"hookManager.d.ts","sourceRoot":"","sources":["../../src/managers/hookManager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,KAAK,SAAS,EAEd,KAAK,oBAAoB,EACzB,KAAK,4BAA4B,EACjC,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EAI1B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,iBAAiB,EACjB,wBAAwB,EACzB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAIlD,qBAAa,WAAW;IAMpB,OAAO,CAAC,SAAS;IALnB,OAAO,CAAC,aAAa,CAAuC;IAC5D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAGvB,SAAS,EAAE,SAAS,EAC5B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,WAA+B;IAM1C;;;OAGG;IACH,iBAAiB,CACf,SAAS,CAAC,EAAE,wBAAwB,EACpC,YAAY,CAAC,EAAE,wBAAwB,GACtC,IAAI;IAyBP;;;OAGG;IACH,+BAA+B,CAAC,UAAU,EAAE,iBAAiB,GAAG,IAAI,GAAG,IAAI;IA6B3E;;OAEG;IACG,YAAY,CAChB,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,oBAAoB,GAAG,4BAA4B,GAC3D,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAoGjC;;;OAGG;IACH,kBAAkB,CAChB,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,mBAAmB,EAAE,EAC9B,cAAc,CAAC,EAAE,cAAc,EAC/B,MAAM,CAAC,EAAE,MAAM,EACf,cAAc,CAAC,EAAE,MAAM,GACtB;QACD,WAAW,EAAE,OAAO,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB;IA2CD;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAezB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA2E3B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAQ9B;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO;IAWtD;;OAEG;IACH,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,GAAG,oBAAoB;IA8DtE;;OAEG;IACH,OAAO,CAAC,4BAA4B;IAyCpC;;OAEG;IACH,gBAAgB,IAAI,wBAAwB,GAAG,SAAS;IAOxD;;OAEG;IACH,kBAAkB,IAAI,IAAI;IAI1B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA0DhC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA8BhC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAa/B;;OAEG;IACH,OAAO,CAAC,aAAa;IAqCrB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAgD3B;;OAEG;IACH,qBAAqB,IAAI;QACvB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;KAC3C;IAkDD;;OAEG;IACH,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,GAAG,IAAI;CAO3D"}
|
|
@@ -145,7 +145,11 @@ export class HookManager {
|
|
|
145
145
|
for (const result of results) {
|
|
146
146
|
if (result.exitCode === 2) {
|
|
147
147
|
// Handle blocking error immediately and return
|
|
148
|
-
|
|
148
|
+
const blockingResult = this.handleBlockingError(event, result, messageManager, toolId, toolParameters);
|
|
149
|
+
return {
|
|
150
|
+
shouldBlock: blockingResult.shouldBlock,
|
|
151
|
+
errorMessage: blockingResult.errorMessage,
|
|
152
|
+
};
|
|
149
153
|
}
|
|
150
154
|
}
|
|
151
155
|
// Second pass: Process all non-blocking results
|
|
@@ -176,7 +180,7 @@ export class HookManager {
|
|
|
176
180
|
source: MessageSource.HOOK,
|
|
177
181
|
});
|
|
178
182
|
}
|
|
179
|
-
// For other hook types (PreToolUse, PostToolUse, Stop), ignore stdout
|
|
183
|
+
// For other hook types (PreToolUse, PostToolUse, Stop, PermissionRequest), ignore stdout
|
|
180
184
|
}
|
|
181
185
|
/**
|
|
182
186
|
* Handle blocking error (exit code 2) - behavior varies by hook type
|
|
@@ -219,10 +223,10 @@ export class HookManager {
|
|
|
219
223
|
source: MessageSource.HOOK,
|
|
220
224
|
});
|
|
221
225
|
return { shouldBlock: true, errorMessage };
|
|
222
|
-
case "
|
|
223
|
-
// For
|
|
226
|
+
case "PermissionRequest":
|
|
227
|
+
// For permission request hooks with exit code 2, show stderr in error block and block (deny) permission
|
|
224
228
|
messageManager.addErrorBlock(errorMessage);
|
|
225
|
-
return { shouldBlock:
|
|
229
|
+
return { shouldBlock: true, errorMessage };
|
|
226
230
|
case "SubagentStop":
|
|
227
231
|
// Similar to Stop, show error and allow blocking
|
|
228
232
|
messageManager.addUserMessage({
|
|
@@ -377,7 +381,9 @@ export class HookManager {
|
|
|
377
381
|
errors.push("Context must have a valid timestamp Date object");
|
|
378
382
|
}
|
|
379
383
|
// Validate tool-specific requirements
|
|
380
|
-
if (event === "PreToolUse" ||
|
|
384
|
+
if (event === "PreToolUse" ||
|
|
385
|
+
event === "PostToolUse" ||
|
|
386
|
+
event === "PermissionRequest") {
|
|
381
387
|
if (!context.toolName || typeof context.toolName !== "string") {
|
|
382
388
|
errors.push(`${event} event requires a valid toolName in context`);
|
|
383
389
|
}
|
|
@@ -385,7 +391,6 @@ export class HookManager {
|
|
|
385
391
|
// Validate non-tool events don't have unexpected tool names
|
|
386
392
|
if ((event === "UserPromptSubmit" ||
|
|
387
393
|
event === "Stop" ||
|
|
388
|
-
event === "Notification" ||
|
|
389
394
|
event === "SubagentStop" ||
|
|
390
395
|
event === "WorktreeCreate") &&
|
|
391
396
|
context.toolName !== undefined) {
|
|
@@ -436,13 +441,14 @@ export class HookManager {
|
|
|
436
441
|
// For events that don't use matchers, config always applies
|
|
437
442
|
if (event === "UserPromptSubmit" ||
|
|
438
443
|
event === "Stop" ||
|
|
439
|
-
event === "Notification" ||
|
|
440
444
|
event === "SubagentStop" ||
|
|
441
445
|
event === "WorktreeCreate") {
|
|
442
446
|
return true;
|
|
443
447
|
}
|
|
444
448
|
// For tool-based events, check matcher if present
|
|
445
|
-
if (event === "PreToolUse" ||
|
|
449
|
+
if (event === "PreToolUse" ||
|
|
450
|
+
event === "PostToolUse" ||
|
|
451
|
+
event === "PermissionRequest") {
|
|
446
452
|
if (!config.matcher) {
|
|
447
453
|
// No matcher means applies to all tools
|
|
448
454
|
return true;
|
|
@@ -466,7 +472,10 @@ export class HookManager {
|
|
|
466
472
|
return errors;
|
|
467
473
|
}
|
|
468
474
|
// Validate matcher requirements
|
|
469
|
-
if ((event === "PreToolUse" ||
|
|
475
|
+
if ((event === "PreToolUse" ||
|
|
476
|
+
event === "PostToolUse" ||
|
|
477
|
+
event === "PermissionRequest") &&
|
|
478
|
+
config.matcher) {
|
|
470
479
|
if (!this.matcher.isValidPattern(config.matcher)) {
|
|
471
480
|
errors.push(`${prefix}: Invalid matcher pattern: ${config.matcher}`);
|
|
472
481
|
}
|
|
@@ -474,7 +483,6 @@ export class HookManager {
|
|
|
474
483
|
// Validate that non-tool events don't have matchers
|
|
475
484
|
if ((event === "UserPromptSubmit" ||
|
|
476
485
|
event === "Stop" ||
|
|
477
|
-
event === "Notification" ||
|
|
478
486
|
event === "SubagentStop" ||
|
|
479
487
|
event === "WorktreeCreate") &&
|
|
480
488
|
config.matcher) {
|
|
@@ -503,7 +511,7 @@ export class HookManager {
|
|
|
503
511
|
UserPromptSubmit: 0,
|
|
504
512
|
Stop: 0,
|
|
505
513
|
SubagentStop: 0,
|
|
506
|
-
|
|
514
|
+
PermissionRequest: 0,
|
|
507
515
|
WorktreeCreate: 0,
|
|
508
516
|
},
|
|
509
517
|
};
|
|
@@ -514,7 +522,7 @@ export class HookManager {
|
|
|
514
522
|
UserPromptSubmit: 0,
|
|
515
523
|
Stop: 0,
|
|
516
524
|
SubagentStop: 0,
|
|
517
|
-
|
|
525
|
+
PermissionRequest: 0,
|
|
518
526
|
WorktreeCreate: 0,
|
|
519
527
|
};
|
|
520
528
|
let totalConfigs = 0;
|
|
@@ -175,7 +175,7 @@ export class LiveConfigManager {
|
|
|
175
175
|
}
|
|
176
176
|
// Update permission manager if available
|
|
177
177
|
if (this.permissionManager) {
|
|
178
|
-
this.permissionManager.
|
|
178
|
+
this.permissionManager.updateConfiguredPermissionMode(this.currentConfiguration.permissions?.permissionMode);
|
|
179
179
|
this.permissionManager.updateAllowedRules(this.currentConfiguration.permissions?.allow || []);
|
|
180
180
|
this.permissionManager.updateDeniedRules(this.currentConfiguration.permissions?.deny || []);
|
|
181
181
|
this.permissionManager.updateAdditionalDirectories(this.currentConfiguration.permissions?.additionalDirectories || []);
|
|
@@ -34,7 +34,7 @@ export declare class McpManager {
|
|
|
34
34
|
connectServer(name: string): Promise<boolean>;
|
|
35
35
|
disconnectServer(name: string): Promise<boolean>;
|
|
36
36
|
getAllConnectedTools(): McpTool[];
|
|
37
|
-
executeMcpTool(toolName: string, args: Record<string, unknown
|
|
37
|
+
executeMcpTool(toolName: string, args: Record<string, unknown>, context?: ToolContext): Promise<{
|
|
38
38
|
success: boolean;
|
|
39
39
|
content: string;
|
|
40
40
|
serverName?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcpManager.d.ts","sourceRoot":"","sources":["../../src/managers/mcpManager.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAEjE,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,EACV,MAAM,EACN,eAAe,EACf,SAAS,EACT,OAAO,EACP,eAAe,EAChB,MAAM,mBAAmB,CAAC;AAQ3B,MAAM,WAAW,mBAAmB;IAClC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,IAAI,CAAC;CACxD;AAID,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,UAAU;IASnB,OAAO,CAAC,SAAS;IARnB,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,OAAO,CAA2C;IAC1D,OAAO,CAAC,WAAW,CAAyC;IAC5D,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,SAAS,CAAsB;gBAG7B,SAAS,EAAE,SAAS,EAC5B,OAAO,GAAE,iBAAsB;IAKjC;;OAEG;IACG,UAAU,CACd,OAAO,EAAE,MAAM,EACf,WAAW,GAAE,OAAe,GAC3B,OAAO,CAAC,IAAI,CAAC;IAwCV,kBAAkB,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAO/C,UAAU,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IA0CvC,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IAWrD,SAAS,IAAI,SAAS,GAAG,IAAI;IAI7B,aAAa,IAAI,eAAe,EAAE;IAIlC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIpD,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI;IASzE,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO;IAyBzD,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAgB7B,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA4F7C,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA2BtD,oBAAoB,IAAI,OAAO,EAAE;IAW3B,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"mcpManager.d.ts","sourceRoot":"","sources":["../../src/managers/mcpManager.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAEjE,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,EACV,MAAM,EACN,eAAe,EACf,SAAS,EACT,OAAO,EACP,eAAe,EAChB,MAAM,mBAAmB,CAAC;AAQ3B,MAAM,WAAW,mBAAmB;IAClC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,IAAI,CAAC;CACxD;AAID,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,UAAU;IASnB,OAAO,CAAC,SAAS;IARnB,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,OAAO,CAA2C;IAC1D,OAAO,CAAC,WAAW,CAAyC;IAC5D,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,SAAS,CAAsB;gBAG7B,SAAS,EAAE,SAAS,EAC5B,OAAO,GAAE,iBAAsB;IAKjC;;OAEG;IACG,UAAU,CACd,OAAO,EAAE,MAAM,EACf,WAAW,GAAE,OAAe,GAC3B,OAAO,CAAC,IAAI,CAAC;IAwCV,kBAAkB,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAO/C,UAAU,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IA0CvC,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IAWrD,SAAS,IAAI,SAAS,GAAG,IAAI;IAI7B,aAAa,IAAI,eAAe,EAAE;IAIlC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIpD,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI;IASzE,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO;IAyBzD,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAgB7B,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA4F7C,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA2BtD,oBAAoB,IAAI,OAAO,EAAE;IAW3B,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC;QACT,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,MAAM,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACtD,CAAC;YAsDY,uBAAuB;IA8D/B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAS9B;;OAEG;IACH,iBAAiB,IAAI,UAAU,EAAE;IA6BjC;;OAEG;IACH,iBAAiB,IAAI,0BAA0B,EAAE;IAIjD;;OAEG;IACG,wBAAwB,CAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC;IActB;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAcjC"}
|
|
@@ -267,11 +267,19 @@ export class McpManager {
|
|
|
267
267
|
return allTools;
|
|
268
268
|
}
|
|
269
269
|
// Execute MCP tool
|
|
270
|
-
async executeMcpTool(toolName, args) {
|
|
270
|
+
async executeMcpTool(toolName, args, context) {
|
|
271
271
|
// Check if it's a prefixed name: mcp__[serverName]__[toolName]
|
|
272
272
|
if (!toolName.startsWith("mcp__")) {
|
|
273
273
|
throw new Error(`Invalid MCP tool name: ${toolName}. Must start with 'mcp__'`);
|
|
274
274
|
}
|
|
275
|
+
// Permission check
|
|
276
|
+
if (context?.permissionManager) {
|
|
277
|
+
const permissionContext = context.permissionManager.createContext(toolName, context.permissionMode || "default", context.canUseToolCallback, args, context.toolCallId);
|
|
278
|
+
const decision = await context.permissionManager.checkPermission(permissionContext);
|
|
279
|
+
if (decision.behavior === "deny") {
|
|
280
|
+
throw new Error(decision.message || "Permission denied");
|
|
281
|
+
}
|
|
282
|
+
}
|
|
275
283
|
const parts = toolName.split("__");
|
|
276
284
|
if (parts.length < 3) {
|
|
277
285
|
throw new Error(`Invalid MCP tool name format: ${toolName}. Expected 'mcp__[server]__[tool]'`);
|
|
@@ -351,7 +359,7 @@ export class McpManager {
|
|
|
351
359
|
// Find which server this tool belongs to
|
|
352
360
|
const server = findToolServer(tool.name, servers);
|
|
353
361
|
if (server) {
|
|
354
|
-
const plugin = createMcpToolPlugin(tool, server.name, (name, args) => this.executeMcpTool(name, args));
|
|
362
|
+
const plugin = createMcpToolPlugin(tool, server.name, (name, args, context) => this.executeMcpTool(name, args, context));
|
|
355
363
|
mcpTools.set(plugin.name, plugin);
|
|
356
364
|
}
|
|
357
365
|
}
|
|
@@ -16,7 +16,6 @@ export interface MessageManagerCallbacks {
|
|
|
16
16
|
onErrorBlockAdded?: (error: string) => void;
|
|
17
17
|
onCompressBlockAdded?: (content: string) => void;
|
|
18
18
|
onCompressionStateChange?: (isCompressing: boolean) => void;
|
|
19
|
-
onMemoryBlockAdded?: (content: string, success: boolean, type: "project" | "user", storagePath: string) => void;
|
|
20
19
|
onAddBangMessage?: (command: string) => void;
|
|
21
20
|
onUpdateBangMessage?: (command: string, output: string) => void;
|
|
22
21
|
onCompleteBangMessage?: (command: string, exitCode: number) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messageManager.d.ts","sourceRoot":"","sources":["../../src/managers/messageManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAUL,iBAAiB,EACjB,KAAK,0BAA0B,EAEhC,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,EAIL,WAAW,EAEZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,qCAAqC,EAAE,MAAM,qBAAqB,CAAC;AAK5E,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,MAAM,WAAW,uBAAuB;IACtC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACjD,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,yBAAyB,CAAC,EAAE,CAAC,iBAAiB,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;IAE3C,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAEzD,uBAAuB,CAAC,EAAE,MAAM,IAAI,CAAC;IAErC,yBAAyB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAEzE,2BAA2B,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3E,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,0BAA0B,KAAK,IAAI,CAAC;IAClE,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,oBAAoB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,wBAAwB,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,KAAK,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"messageManager.d.ts","sourceRoot":"","sources":["../../src/managers/messageManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,12 +9,16 @@ import type { PermissionDecision, ToolPermissionContext, PermissionCallback, Per
|
|
|
9
9
|
import type { Logger } from "../types/index.js";
|
|
10
10
|
import { Container } from "../utils/container.js";
|
|
11
11
|
export interface PermissionManagerOptions {
|
|
12
|
-
/** Configured
|
|
13
|
-
|
|
12
|
+
/** Configured permission mode from settings */
|
|
13
|
+
configuredPermissionMode?: PermissionMode;
|
|
14
14
|
/** Allowed rules from settings */
|
|
15
15
|
allowedRules?: string[];
|
|
16
16
|
/** Denied rules from settings */
|
|
17
17
|
deniedRules?: string[];
|
|
18
|
+
/** Instance-specific allowed rules (from AgentOptions) */
|
|
19
|
+
instanceAllowedRules?: string[];
|
|
20
|
+
/** Instance-specific denied rules (from AgentOptions) */
|
|
21
|
+
instanceDeniedRules?: string[];
|
|
18
22
|
/** Additional directories considered part of the Safe Zone */
|
|
19
23
|
additionalDirectories?: string[];
|
|
20
24
|
/** The main working directory */
|
|
@@ -26,29 +30,33 @@ export interface PermissionManagerOptions {
|
|
|
26
30
|
}
|
|
27
31
|
export declare class PermissionManager {
|
|
28
32
|
private container;
|
|
29
|
-
private
|
|
33
|
+
private configuredPermissionMode?;
|
|
30
34
|
private allowedRules;
|
|
31
35
|
private deniedRules;
|
|
36
|
+
private instanceAllowedRules;
|
|
37
|
+
private instanceDeniedRules;
|
|
32
38
|
private temporaryRules;
|
|
33
39
|
private additionalDirectories;
|
|
34
40
|
private systemAdditionalDirectories;
|
|
35
41
|
private workdir?;
|
|
36
42
|
private planFilePath?;
|
|
37
|
-
private
|
|
43
|
+
private worktreeName?;
|
|
44
|
+
private mainRepoRoot?;
|
|
45
|
+
private onConfiguredPermissionModeChange?;
|
|
38
46
|
private _logger?;
|
|
39
47
|
constructor(container: Container, options?: PermissionManagerOptions);
|
|
40
48
|
/**
|
|
41
49
|
* Set a callback to be notified when the effective permission mode changes due to configuration updates
|
|
42
50
|
*/
|
|
43
|
-
|
|
51
|
+
setOnConfiguredPermissionModeChange(callback: (mode: PermissionMode) => void): void;
|
|
44
52
|
/**
|
|
45
53
|
* Update the configured default mode (e.g., when configuration reloads)
|
|
46
54
|
*/
|
|
47
|
-
|
|
55
|
+
updateConfiguredPermissionMode(permissionMode?: PermissionMode): void;
|
|
48
56
|
/**
|
|
49
57
|
* Get the configured default mode
|
|
50
58
|
*/
|
|
51
|
-
|
|
59
|
+
getConfiguredPermissionMode(): PermissionMode | undefined;
|
|
52
60
|
/**
|
|
53
61
|
* Get all currently allowed rules (user-defined)
|
|
54
62
|
*/
|
|
@@ -57,6 +65,14 @@ export declare class PermissionManager {
|
|
|
57
65
|
* Get all currently denied rules
|
|
58
66
|
*/
|
|
59
67
|
getDeniedRules(): string[];
|
|
68
|
+
/**
|
|
69
|
+
* Get all instance-specific allowed rules
|
|
70
|
+
*/
|
|
71
|
+
getInstanceAllowedRules(): string[];
|
|
72
|
+
/**
|
|
73
|
+
* Get all instance-specific denied rules
|
|
74
|
+
*/
|
|
75
|
+
getInstanceDeniedRules(): string[];
|
|
60
76
|
/**
|
|
61
77
|
* Get all additional directories
|
|
62
78
|
*/
|
|
@@ -122,6 +138,10 @@ export declare class PermissionManager {
|
|
|
122
138
|
* Determine if a tool requires permission checks based on its name
|
|
123
139
|
*/
|
|
124
140
|
isRestrictedTool(toolName: string): boolean;
|
|
141
|
+
/**
|
|
142
|
+
* Check if a tool is completely denied by name in instance or global rules
|
|
143
|
+
*/
|
|
144
|
+
isToolDenied(toolName: string): boolean;
|
|
125
145
|
/**
|
|
126
146
|
* Helper method to create a permission context for CLI integration
|
|
127
147
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissionManager.d.ts","sourceRoot":"","sources":["../../src/managers/permissionManager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EACV,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EACf,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAgBhD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AA4DlD,MAAM,WAAW,wBAAwB;IACvC
|
|
1
|
+
{"version":3,"file":"permissionManager.d.ts","sourceRoot":"","sources":["../../src/managers/permissionManager.ts"],"names":[],"mappings":"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"}
|