wave-agent-sdk 0.17.1 → 0.17.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/builtin/skills/deep-research/SKILL.md +90 -0
- package/builtin/skills/settings/ENV.md +6 -3
- package/dist/agent.d.ts +28 -1
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +128 -34
- package/dist/constants/goalPrompts.d.ts +2 -0
- package/dist/constants/goalPrompts.d.ts.map +1 -0
- package/dist/constants/goalPrompts.js +10 -0
- package/dist/constants/tools.d.ts +1 -0
- package/dist/constants/tools.d.ts.map +1 -1
- package/dist/constants/tools.js +1 -0
- package/dist/managers/aiManager.d.ts +7 -0
- package/dist/managers/aiManager.d.ts.map +1 -1
- package/dist/managers/aiManager.js +77 -41
- package/dist/managers/backgroundTaskManager.d.ts.map +1 -1
- package/dist/managers/backgroundTaskManager.js +10 -2
- package/dist/managers/goalManager.d.ts +43 -0
- package/dist/managers/goalManager.d.ts.map +1 -0
- package/dist/managers/goalManager.js +177 -0
- package/dist/managers/messageManager.d.ts +2 -2
- package/dist/managers/messageManager.d.ts.map +1 -1
- package/dist/managers/messageQueue.d.ts +10 -0
- package/dist/managers/messageQueue.d.ts.map +1 -1
- package/dist/managers/messageQueue.js +53 -1
- package/dist/managers/pluginManager.d.ts.map +1 -1
- package/dist/managers/pluginManager.js +7 -1
- package/dist/managers/skillManager.d.ts +2 -0
- package/dist/managers/skillManager.d.ts.map +1 -1
- package/dist/managers/skillManager.js +19 -9
- package/dist/managers/slashCommandManager.d.ts +6 -0
- package/dist/managers/slashCommandManager.d.ts.map +1 -1
- package/dist/managers/slashCommandManager.js +105 -0
- package/dist/managers/toolManager.d.ts.map +1 -1
- package/dist/managers/toolManager.js +5 -0
- package/dist/managers/workflowManager.d.ts +65 -0
- package/dist/managers/workflowManager.d.ts.map +1 -0
- package/dist/managers/workflowManager.js +380 -0
- package/dist/prompts/index.d.ts +2 -1
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +3 -3
- package/dist/services/aiService.d.ts +23 -0
- package/dist/services/aiService.d.ts.map +1 -1
- package/dist/services/aiService.js +102 -9
- package/dist/services/configurationService.d.ts +1 -1
- package/dist/services/configurationService.d.ts.map +1 -1
- package/dist/services/configurationService.js +3 -16
- package/dist/services/hook.d.ts.map +1 -1
- package/dist/services/hook.js +4 -0
- package/dist/services/session.d.ts +9 -1
- package/dist/services/session.d.ts.map +1 -1
- package/dist/services/session.js +28 -1
- package/dist/tools/bashTool.d.ts.map +1 -1
- package/dist/tools/bashTool.js +49 -7
- package/dist/tools/readTool.d.ts.map +1 -1
- package/dist/tools/readTool.js +1 -1
- package/dist/tools/taskManagementTools.d.ts.map +1 -1
- package/dist/tools/taskManagementTools.js +103 -157
- package/dist/tools/types.d.ts +2 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/webFetchTool.d.ts.map +1 -1
- package/dist/tools/webFetchTool.js +0 -9
- package/dist/tools/workflowTool.d.ts +11 -0
- package/dist/tools/workflowTool.d.ts.map +1 -0
- package/dist/tools/workflowTool.js +190 -0
- package/dist/types/agent.d.ts +2 -0
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/commands.d.ts +4 -0
- package/dist/types/commands.d.ts.map +1 -1
- package/dist/types/config.d.ts +2 -2
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/core.d.ts +1 -1
- package/dist/types/core.d.ts.map +1 -1
- package/dist/types/hooks.d.ts +2 -0
- package/dist/types/hooks.d.ts.map +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 +2 -2
- package/dist/types/messaging.d.ts.map +1 -1
- package/dist/types/processes.d.ts +6 -2
- package/dist/types/processes.d.ts.map +1 -1
- package/dist/types/workflow.d.ts +2 -0
- package/dist/types/workflow.d.ts.map +1 -0
- package/dist/types/workflow.js +1 -0
- package/dist/utils/cacheControlUtils.d.ts +13 -8
- package/dist/utils/cacheControlUtils.d.ts.map +1 -1
- package/dist/utils/cacheControlUtils.js +73 -102
- package/dist/utils/containerSetup.d.ts.map +1 -1
- package/dist/utils/containerSetup.js +7 -0
- package/dist/utils/markdownParser.d.ts.map +1 -1
- package/dist/utils/markdownParser.js +21 -6
- package/dist/utils/messageOperations.d.ts +2 -2
- package/dist/utils/messageOperations.d.ts.map +1 -1
- package/dist/utils/notificationXml.d.ts.map +1 -1
- package/dist/workflow/budgetTracker.d.ts +12 -0
- package/dist/workflow/budgetTracker.d.ts.map +1 -0
- package/dist/workflow/budgetTracker.js +30 -0
- package/dist/workflow/concurrencyLimiter.d.ts +14 -0
- package/dist/workflow/concurrencyLimiter.d.ts.map +1 -0
- package/dist/workflow/concurrencyLimiter.js +39 -0
- package/dist/workflow/journal.d.ts +19 -0
- package/dist/workflow/journal.d.ts.map +1 -0
- package/dist/workflow/journal.js +74 -0
- package/dist/workflow/progressReporter.d.ts +21 -0
- package/dist/workflow/progressReporter.d.ts.map +1 -0
- package/dist/workflow/progressReporter.js +118 -0
- package/dist/workflow/runState.d.ts +16 -0
- package/dist/workflow/runState.d.ts.map +1 -0
- package/dist/workflow/runState.js +57 -0
- package/dist/workflow/scriptRuntime.d.ts +35 -0
- package/dist/workflow/scriptRuntime.d.ts.map +1 -0
- package/dist/workflow/scriptRuntime.js +196 -0
- package/dist/workflow/structuredOutput.d.ts +27 -0
- package/dist/workflow/structuredOutput.d.ts.map +1 -0
- package/dist/workflow/structuredOutput.js +106 -0
- package/dist/workflow/types.d.ts +81 -0
- package/dist/workflow/types.d.ts.map +1 -0
- package/dist/workflow/types.js +1 -0
- package/dist/workflow/workflowApis.d.ts +46 -0
- package/dist/workflow/workflowApis.d.ts.map +1 -0
- package/dist/workflow/workflowApis.js +280 -0
- package/package.json +1 -1
- package/src/agent.ts +144 -34
- package/src/constants/goalPrompts.ts +10 -0
- package/src/constants/tools.ts +1 -0
- package/src/managers/aiManager.ts +91 -47
- package/src/managers/backgroundTaskManager.ts +16 -4
- package/src/managers/goalManager.ts +232 -0
- package/src/managers/messageManager.ts +2 -2
- package/src/managers/messageQueue.ts +59 -1
- package/src/managers/pluginManager.ts +8 -1
- package/src/managers/skillManager.ts +20 -9
- package/src/managers/slashCommandManager.ts +119 -0
- package/src/managers/toolManager.ts +7 -0
- package/src/managers/workflowManager.ts +491 -0
- package/src/prompts/index.ts +4 -2
- package/src/services/aiService.ts +166 -12
- package/src/services/configurationService.ts +2 -22
- package/src/services/hook.ts +5 -0
- package/src/services/session.ts +42 -2
- package/src/tools/bashTool.ts +64 -9
- package/src/tools/readTool.ts +1 -2
- package/src/tools/taskManagementTools.ts +146 -195
- package/src/tools/types.ts +2 -0
- package/src/tools/webFetchTool.ts +0 -12
- package/src/tools/workflowTool.ts +205 -0
- package/src/types/agent.ts +6 -0
- package/src/types/commands.ts +4 -0
- package/src/types/config.ts +2 -2
- package/src/types/core.ts +3 -3
- package/src/types/hooks.ts +2 -0
- package/src/types/index.ts +1 -0
- package/src/types/messaging.ts +2 -2
- package/src/types/processes.ts +10 -2
- package/src/types/workflow.ts +5 -0
- package/src/utils/cacheControlUtils.ts +106 -131
- package/src/utils/containerSetup.ts +9 -0
- package/src/utils/markdownParser.ts +26 -8
- package/src/utils/messageOperations.ts +2 -2
- package/src/utils/notificationXml.ts +6 -1
- package/src/workflow/budgetTracker.ts +34 -0
- package/src/workflow/concurrencyLimiter.ts +47 -0
- package/src/workflow/journal.ts +95 -0
- package/src/workflow/progressReporter.ts +141 -0
- package/src/workflow/runState.ts +65 -0
- package/src/workflow/scriptRuntime.ts +274 -0
- package/src/workflow/structuredOutput.ts +123 -0
- package/src/workflow/types.ts +95 -0
- package/src/workflow/workflowApis.ts +412 -0
|
@@ -17,6 +17,8 @@ export class SkillManager extends EventEmitter {
|
|
|
17
17
|
this.container = container;
|
|
18
18
|
this.skillMetadata = new Map();
|
|
19
19
|
this.skillContent = new Map();
|
|
20
|
+
this.pluginSkillMetadata = new Map();
|
|
21
|
+
this.pluginSkillContent = new Map();
|
|
20
22
|
this.initialized = false;
|
|
21
23
|
this.fileWatcher = null;
|
|
22
24
|
this.personalSkillsPath =
|
|
@@ -47,7 +49,7 @@ export class SkillManager extends EventEmitter {
|
|
|
47
49
|
* Refresh skills by re-discovering them
|
|
48
50
|
*/
|
|
49
51
|
async refreshSkills() {
|
|
50
|
-
// Clear
|
|
52
|
+
// Clear only discovered skills (builtin/personal/project), preserve plugin skills
|
|
51
53
|
this.skillMetadata.clear();
|
|
52
54
|
this.skillContent.clear();
|
|
53
55
|
const discovery = await this.discoverSkills();
|
|
@@ -61,6 +63,13 @@ export class SkillManager extends EventEmitter {
|
|
|
61
63
|
discovery.projectSkills.forEach((skill, name) => {
|
|
62
64
|
this.skillMetadata.set(name, skill);
|
|
63
65
|
});
|
|
66
|
+
// Restore plugin skills
|
|
67
|
+
this.pluginSkillMetadata.forEach((metadata, name) => {
|
|
68
|
+
this.skillMetadata.set(name, metadata);
|
|
69
|
+
});
|
|
70
|
+
this.pluginSkillContent.forEach((skill, name) => {
|
|
71
|
+
this.skillContent.set(name, skill);
|
|
72
|
+
});
|
|
64
73
|
// Log any discovery errors
|
|
65
74
|
if (discovery.errors.length > 0) {
|
|
66
75
|
logger?.warn(`Found ${discovery.errors.length} skill discovery errors`);
|
|
@@ -296,7 +305,7 @@ export class SkillManager extends EventEmitter {
|
|
|
296
305
|
catch (error) {
|
|
297
306
|
logger?.error(`Failed to execute skill '${skill_name}':`, error);
|
|
298
307
|
return {
|
|
299
|
-
content:
|
|
308
|
+
content: `**Error executing skill**: ${error instanceof Error ? error.message : String(error)}`,
|
|
300
309
|
};
|
|
301
310
|
}
|
|
302
311
|
}
|
|
@@ -309,13 +318,13 @@ export class SkillManager extends EventEmitter {
|
|
|
309
318
|
const skill = await this.loadSkill(skill_name);
|
|
310
319
|
if (!skill) {
|
|
311
320
|
return {
|
|
312
|
-
content:
|
|
321
|
+
content: `**Skill not found**: "${skill_name}"\n\nAvailable skills:\n${this.formatAvailableSkills()}`,
|
|
313
322
|
};
|
|
314
323
|
}
|
|
315
324
|
if (!skill.isValid) {
|
|
316
325
|
const errorMsg = formatSkillError(skill.skillPath, skill.errors);
|
|
317
326
|
return {
|
|
318
|
-
content:
|
|
327
|
+
content: `**Skill validation failed**:\n\n\`\`\`\n${errorMsg}\n\`\`\``,
|
|
319
328
|
};
|
|
320
329
|
}
|
|
321
330
|
const preparedContent = this.prepareSkillContent(skill, skillArgs || "");
|
|
@@ -324,7 +333,7 @@ export class SkillManager extends EventEmitter {
|
|
|
324
333
|
catch (error) {
|
|
325
334
|
logger?.error(`Failed to prepare skill '${skill_name}':`, error);
|
|
326
335
|
return {
|
|
327
|
-
content:
|
|
336
|
+
content: `**Error preparing skill**: ${error instanceof Error ? error.message : String(error)}`,
|
|
328
337
|
};
|
|
329
338
|
}
|
|
330
339
|
}
|
|
@@ -332,9 +341,7 @@ export class SkillManager extends EventEmitter {
|
|
|
332
341
|
* Prepare skill content with arguments but without bash execution
|
|
333
342
|
*/
|
|
334
343
|
prepareSkillContent(skill, argsString) {
|
|
335
|
-
const
|
|
336
|
-
const description = `*${skill.description}*\n\n`;
|
|
337
|
-
const skillPath = `📁 Skill location: \`${skill.skillPath}\`\n\n`;
|
|
344
|
+
const skillPath = `Base directory for this skill: ${skill.skillPath}\n\n`;
|
|
338
345
|
// Extract content after frontmatter
|
|
339
346
|
const contentMatch = skill.content.match(/^---\n[\s\S]*?\n---\n([\s\S]*)$/);
|
|
340
347
|
let mainContent = contentMatch ? contentMatch[1].trim() : skill.content;
|
|
@@ -346,7 +353,7 @@ export class SkillManager extends EventEmitter {
|
|
|
346
353
|
if (skill.pluginRoot) {
|
|
347
354
|
mainContent = mainContent.replace(/\$\{WAVE_PLUGIN_ROOT\}/g, skill.pluginRoot);
|
|
348
355
|
}
|
|
349
|
-
return
|
|
356
|
+
return skillPath + mainContent;
|
|
350
357
|
}
|
|
351
358
|
/**
|
|
352
359
|
* Execute bash commands in prepared skill content
|
|
@@ -395,6 +402,9 @@ export class SkillManager extends EventEmitter {
|
|
|
395
402
|
skill.name = namespacedName;
|
|
396
403
|
this.skillMetadata.set(namespacedName, metadata);
|
|
397
404
|
this.skillContent.set(namespacedName, skill);
|
|
405
|
+
// Also store in plugin-specific maps so they survive refreshSkills()
|
|
406
|
+
this.pluginSkillMetadata.set(namespacedName, metadata);
|
|
407
|
+
this.pluginSkillContent.set(namespacedName, skill);
|
|
398
408
|
}
|
|
399
409
|
logger?.debug(`Registered ${skills.length} plugin skills from ${pluginName}. Total skills: ${this.skillMetadata.size}`);
|
|
400
410
|
}
|
|
@@ -21,6 +21,7 @@ export declare class SlashCommandManager {
|
|
|
21
21
|
private get subagentManager();
|
|
22
22
|
private get memoryService();
|
|
23
23
|
private get hookManager();
|
|
24
|
+
private get goalManager();
|
|
24
25
|
private initializeBuiltinCommands;
|
|
25
26
|
/**
|
|
26
27
|
* Load custom commands from filesystem
|
|
@@ -71,6 +72,11 @@ export declare class SlashCommandManager {
|
|
|
71
72
|
* Check if command exists
|
|
72
73
|
*/
|
|
73
74
|
hasCommand(commandId: string): boolean;
|
|
75
|
+
/**
|
|
76
|
+
* Check if a slash command should bypass the message queue when AI is busy.
|
|
77
|
+
* Returns true for commands marked as immediate (boolean or function).
|
|
78
|
+
*/
|
|
79
|
+
isImmediateCommand(input: string): boolean;
|
|
74
80
|
/**
|
|
75
81
|
* Get custom command details
|
|
76
82
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slashCommandManager.d.ts","sourceRoot":"","sources":["../../src/managers/slashCommandManager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAQ1E,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAWlD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"slashCommandManager.d.ts","sourceRoot":"","sources":["../../src/managers/slashCommandManager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAQ1E,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAWlD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAQxD,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,mBAAmB;IAQ5B,OAAO,CAAC,SAAS;IAPnB,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,cAAc,CAAyC;IAC/D,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,6BAA6B,CAAgC;gBAG3D,SAAS,EAAE,SAAS,EAC5B,OAAO,EAAE,0BAA0B;IAK9B,UAAU,IAAI,IAAI;IAazB,OAAO,KAAK,cAAc,GAEzB;IAED,OAAO,KAAK,SAAS,GAEpB;IAED,OAAO,KAAK,qBAAqB,GAEhC;IAED,OAAO,KAAK,WAAW,GAEtB;IAED,OAAO,KAAK,YAAY,GAEvB;IAED,OAAO,KAAK,eAAe,GAE1B;IAED,OAAO,KAAK,aAAa,GAExB;IAED,OAAO,KAAK,WAAW,GAEtB;IAED,OAAO,KAAK,WAAW,GAEtB;IAED,OAAO,CAAC,yBAAyB;IA4LjC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA2C1B;;OAEG;IACI,qBAAqB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI;IAmM3D;;OAEG;IACI,sBAAsB,CAC3B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,kBAAkB,EAAE,GAC7B,IAAI;IA0CP;;OAEG;IACI,oBAAoB,IAAI,IAAI;IAWnC;;OAEG;IACI,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAInD;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACI,WAAW,IAAI,YAAY,EAAE;IAIpC;;OAEG;IACI,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI9D;;OAEG;IACU,cAAc,CACzB,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC;IA2BnB;;;OAGG;IACI,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG;QAClD,OAAO,EAAE,OAAO,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf;IAeD;;OAEG;IACI,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI7C;;;OAGG;IACI,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAQjD;;OAEG;IACI,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAI1E;;OAEG;IACI,iBAAiB,IAAI,kBAAkB,EAAE;IAIhD;;OAEG;YACW,+BAA+B;IAuD7C;;OAEG;IACI,mBAAmB,IAAI,IAAI;CAQnC"}
|
|
@@ -47,14 +47,20 @@ export class SlashCommandManager {
|
|
|
47
47
|
get hookManager() {
|
|
48
48
|
return this.container.get("HookManager");
|
|
49
49
|
}
|
|
50
|
+
get goalManager() {
|
|
51
|
+
return this.container.get("GoalManager");
|
|
52
|
+
}
|
|
50
53
|
initializeBuiltinCommands() {
|
|
51
54
|
// Register built-in clear command
|
|
52
55
|
this.registerCommand({
|
|
53
56
|
id: "clear",
|
|
54
57
|
name: "clear",
|
|
55
58
|
description: "Clear conversation history and reset session",
|
|
59
|
+
immediate: true,
|
|
56
60
|
handler: async () => {
|
|
57
61
|
this.aiManager.abortAIMessage();
|
|
62
|
+
// Clear any active goal
|
|
63
|
+
this.goalManager?.clearGoal();
|
|
58
64
|
// Capture old session info before clearing
|
|
59
65
|
const oldSessionId = this.messageManager.getSessionId();
|
|
60
66
|
const transcriptPath = this.messageManager.getTranscriptPath();
|
|
@@ -102,6 +108,7 @@ export class SlashCommandManager {
|
|
|
102
108
|
id: "compact",
|
|
103
109
|
name: "compact",
|
|
104
110
|
description: "Compact conversation history to reduce context usage",
|
|
111
|
+
immediate: true,
|
|
105
112
|
handler: async (args, signal) => {
|
|
106
113
|
this.aiManager.abortAIMessage();
|
|
107
114
|
const customInstructions = args?.trim() || undefined;
|
|
@@ -111,6 +118,91 @@ export class SlashCommandManager {
|
|
|
111
118
|
});
|
|
112
119
|
},
|
|
113
120
|
});
|
|
121
|
+
// Register built-in goal command
|
|
122
|
+
this.registerCommand({
|
|
123
|
+
id: "goal",
|
|
124
|
+
name: "goal",
|
|
125
|
+
description: "Set, check, or clear an autonomous goal for the session",
|
|
126
|
+
immediate: (args) => {
|
|
127
|
+
const trimmed = args?.trim() ?? "";
|
|
128
|
+
return (!trimmed ||
|
|
129
|
+
["clear", "stop", "off", "reset", "none", "cancel"].includes(trimmed));
|
|
130
|
+
},
|
|
131
|
+
handler: async (args) => {
|
|
132
|
+
const goalManager = this.goalManager;
|
|
133
|
+
if (!goalManager) {
|
|
134
|
+
this.messageManager.addUserMessage({
|
|
135
|
+
content: "Goal manager is not available",
|
|
136
|
+
isMeta: true,
|
|
137
|
+
});
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
const trimmed = args?.trim() ?? "";
|
|
141
|
+
// Clear aliases
|
|
142
|
+
if (["clear", "stop", "off", "reset", "none", "cancel"].includes(trimmed)) {
|
|
143
|
+
if (goalManager.isGoalActive()) {
|
|
144
|
+
goalManager.clearGoal();
|
|
145
|
+
this.messageManager.addUserMessage({
|
|
146
|
+
content: "<system-reminder>Goal cleared.</system-reminder>",
|
|
147
|
+
isMeta: true,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
this.messageManager.addUserMessage({
|
|
152
|
+
content: "<system-reminder>No active goal to clear.</system-reminder>",
|
|
153
|
+
isMeta: true,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
// Show status
|
|
159
|
+
if (!trimmed) {
|
|
160
|
+
if (goalManager.isGoalActive()) {
|
|
161
|
+
this.messageManager.addUserMessage({
|
|
162
|
+
content: `<system-reminder>${goalManager.getStatusString()}</system-reminder>`,
|
|
163
|
+
isMeta: true,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
this.messageManager.addUserMessage({
|
|
168
|
+
content: "<system-reminder>No active goal. Use /goal <condition> to set one.</system-reminder>",
|
|
169
|
+
isMeta: true,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
// Check plan mode
|
|
175
|
+
const permissionMode = this.container.has("PermissionMode")
|
|
176
|
+
? this.container.get("PermissionMode")
|
|
177
|
+
: undefined;
|
|
178
|
+
if (permissionMode === "plan") {
|
|
179
|
+
this.messageManager.addUserMessage({
|
|
180
|
+
content: "<system-reminder>Cannot set a goal in plan mode. Exit plan mode first.</system-reminder>",
|
|
181
|
+
isMeta: true,
|
|
182
|
+
});
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
// Set goal
|
|
186
|
+
try {
|
|
187
|
+
goalManager.setGoal(trimmed);
|
|
188
|
+
this.messageManager.addUserMessage({
|
|
189
|
+
content: `<system-reminder>Goal set: ${trimmed}. The agent will work autonomously until this goal is achieved.</system-reminder>`,
|
|
190
|
+
isMeta: true,
|
|
191
|
+
});
|
|
192
|
+
// Add the goal as a user directive to start working
|
|
193
|
+
this.messageManager.addUserMessage({
|
|
194
|
+
content: trimmed,
|
|
195
|
+
});
|
|
196
|
+
this.aiManager.sendAIMessage();
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
this.messageManager.addUserMessage({
|
|
200
|
+
content: `<system-reminder>Failed to set goal: ${error.message}</system-reminder>`,
|
|
201
|
+
isMeta: true,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
},
|
|
205
|
+
});
|
|
114
206
|
}
|
|
115
207
|
/**
|
|
116
208
|
* Load custom commands from filesystem
|
|
@@ -412,6 +504,19 @@ export class SlashCommandManager {
|
|
|
412
504
|
hasCommand(commandId) {
|
|
413
505
|
return this.commands.has(commandId);
|
|
414
506
|
}
|
|
507
|
+
/**
|
|
508
|
+
* Check if a slash command should bypass the message queue when AI is busy.
|
|
509
|
+
* Returns true for commands marked as immediate (boolean or function).
|
|
510
|
+
*/
|
|
511
|
+
isImmediateCommand(input) {
|
|
512
|
+
const { command: commandId, args } = parseSlashCommandInput(input);
|
|
513
|
+
const command = this.commands.get(commandId);
|
|
514
|
+
if (!command?.immediate)
|
|
515
|
+
return false;
|
|
516
|
+
if (typeof command.immediate === "boolean")
|
|
517
|
+
return command.immediate;
|
|
518
|
+
return command.immediate(args);
|
|
519
|
+
}
|
|
415
520
|
/**
|
|
416
521
|
* Get custom command details
|
|
417
522
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolManager.d.ts","sourceRoot":"","sources":["../../src/managers/toolManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"toolManager.d.ts","sourceRoot":"","sources":["../../src/managers/toolManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AA6B7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,EACV,cAAc,EAGf,MAAM,mBAAmB,CAAC;AAO3B,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAIlD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,SAAS,CAAC;IACrB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,wDAAwD;IACxD,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;CAC5B;AAED;;;;;GAKG;AACH,cAAM,WAAW;IACf,OAAO,CAAC,aAAa,CAAiC;IACtD,OAAO,CAAC,KAAK,CAAC,CAAW;IACzB,OAAO,CAAC,WAAW,CAAC,CAAe;IACnC,OAAO,CAAC,SAAS,CAAY;gBAEjB,OAAO,EAAE,kBAAkB;IAMvC,OAAO,KAAK,UAAU,GAErB;IAED;;OAEG;IACI,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAIvC;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACI,sBAAsB,IAAI,IAAI;IA0CrC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiBxB;;;;;;;;;;;;OAYG;IACG,OAAO,CACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC;IAqJtB,IAAI,IAAI,UAAU,EAAE;IAYpB,cAAc,CAAC,OAAO,CAAC,EAAE;QACvB,kBAAkB,CAAC,EAAE,qBAAqB,EAAE,CAAC;QAC7C,eAAe,CAAC,EAAE,aAAa,EAAE,CAAC;QAClC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,GAAG,0BAA0B,EAAE;IAuDhC;;OAEG;IACI,QAAQ,IAAI,UAAU,EAAE;IAI/B;;OAEG;IACI,iBAAiB,IAAI,cAAc;IAa1C;;;OAGG;IACI,iBAAiB,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAIpD;;OAEG;IACI,oBAAoB,IAAI,iBAAiB,GAAG,SAAS;IAI5D;;OAEG;IACI,cAAc,IACjB,OAAO,4BAA4B,EAAE,WAAW,GAChD,SAAS;CAKd;AAGD,OAAO,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -19,6 +19,7 @@ import { skillTool } from "../tools/skillTool.js";
|
|
|
19
19
|
import { taskCreateTool, taskGetTool, taskUpdateTool, taskListTool, } from "../tools/taskManagementTools.js";
|
|
20
20
|
import { enterWorktreeTool } from "../tools/enterWorktreeTool.js";
|
|
21
21
|
import { exitWorktreeTool } from "../tools/exitWorktreeTool.js";
|
|
22
|
+
import { workflowTool } from "../tools/workflowTool.js";
|
|
22
23
|
import * as aiService from "../services/aiService.js";
|
|
23
24
|
import { logger } from "../utils/globalLogger.js";
|
|
24
25
|
import { startToolSpan, endToolSpan } from "../telemetry/sessionTracing.js";
|
|
@@ -92,6 +93,7 @@ class ToolManager {
|
|
|
92
93
|
webFetchTool,
|
|
93
94
|
enterWorktreeTool,
|
|
94
95
|
exitWorktreeTool,
|
|
96
|
+
workflowTool,
|
|
95
97
|
];
|
|
96
98
|
for (const tool of builtInTools) {
|
|
97
99
|
if (this.shouldEnableTool(tool.name)) {
|
|
@@ -174,6 +176,9 @@ class ToolManager {
|
|
|
174
176
|
hookManager: this.container.has("HookManager")
|
|
175
177
|
? this.container.get("HookManager")
|
|
176
178
|
: undefined,
|
|
179
|
+
workflowManager: this.container.has("WorkflowManager")
|
|
180
|
+
? this.container.get("WorkflowManager")
|
|
181
|
+
: undefined,
|
|
177
182
|
sessionId: context.sessionId,
|
|
178
183
|
toolCallId: context.toolCallId,
|
|
179
184
|
};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { Container } from "../utils/container.js";
|
|
2
|
+
import type { WorkflowRun } from "../workflow/types.js";
|
|
3
|
+
export declare class WorkflowManager {
|
|
4
|
+
private runs;
|
|
5
|
+
private abortControllers;
|
|
6
|
+
private agentControllers;
|
|
7
|
+
private container;
|
|
8
|
+
private runStateStore;
|
|
9
|
+
constructor(container: Container);
|
|
10
|
+
private get stateStore();
|
|
11
|
+
private get backgroundTaskManager();
|
|
12
|
+
private get notificationQueue();
|
|
13
|
+
private get subagentManager();
|
|
14
|
+
private get workdir();
|
|
15
|
+
private get sessionDir();
|
|
16
|
+
/**
|
|
17
|
+
* Create a new workflow run from a script string or file path.
|
|
18
|
+
* Persists the script to the session directory.
|
|
19
|
+
*/
|
|
20
|
+
createRun(script: string, args?: unknown, opts?: {
|
|
21
|
+
budget?: number | null;
|
|
22
|
+
resumeFromRunId?: string;
|
|
23
|
+
}): Promise<WorkflowRun>;
|
|
24
|
+
/**
|
|
25
|
+
* Start executing a workflow run in the background.
|
|
26
|
+
* Returns immediately; the workflow runs asynchronously.
|
|
27
|
+
*/
|
|
28
|
+
startRun(runId: string, opts?: {
|
|
29
|
+
retryAgentIndex?: number;
|
|
30
|
+
}): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Resume a workflow run from its journal.
|
|
33
|
+
*/
|
|
34
|
+
resumeRun(runId: string): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Stop a running workflow.
|
|
37
|
+
*/
|
|
38
|
+
stopRun(runId: string): void;
|
|
39
|
+
/**
|
|
40
|
+
* Skip a specific agent in a running workflow.
|
|
41
|
+
* Aborts the agent's controller and lets the workflow continue.
|
|
42
|
+
*/
|
|
43
|
+
skipAgent(runId: string, agentIndex: number): void;
|
|
44
|
+
/**
|
|
45
|
+
* Retry a specific agent by removing its journal entry and resuming.
|
|
46
|
+
*/
|
|
47
|
+
retryAgent(runId: string, agentIndex: number): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Kill a running workflow — aborts all agent controllers plus the run controller.
|
|
50
|
+
*/
|
|
51
|
+
killRun(runId: string): void;
|
|
52
|
+
/**
|
|
53
|
+
* List all workflow runs (includes in-memory and persisted).
|
|
54
|
+
*/
|
|
55
|
+
listRuns(): Promise<WorkflowRun[]>;
|
|
56
|
+
/**
|
|
57
|
+
* Get a specific workflow run.
|
|
58
|
+
*/
|
|
59
|
+
getRun(runId: string): WorkflowRun | undefined;
|
|
60
|
+
/**
|
|
61
|
+
* Clean up all running workflows.
|
|
62
|
+
*/
|
|
63
|
+
cleanup(): void;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=workflowManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflowManager.d.ts","sourceRoot":"","sources":["../../src/managers/workflowManager.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAelD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAOxD,qBAAa,eAAe;IAC1B,OAAO,CAAC,IAAI,CAAkC;IAC9C,OAAO,CAAC,gBAAgB,CAAsC;IAC9D,OAAO,CAAC,gBAAgB,CAAmD;IAC3E,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,aAAa,CAA8B;gBAEvC,SAAS,EAAE,SAAS;IAKhC,OAAO,KAAK,UAAU,GAOrB;IAED,OAAO,KAAK,qBAAqB,GAEhC;IAED,OAAO,KAAK,iBAAiB,GAE5B;IAED,OAAO,KAAK,eAAe,GAE1B;IAED,OAAO,KAAK,OAAO,GAElB;IAED,OAAO,KAAK,UAAU,GASrB;IAED;;;OAGG;IACG,SAAS,CACb,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,OAAO,EACd,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE,GAC1D,OAAO,CAAC,WAAW,CAAC;IAoDvB;;;OAGG;IACG,QAAQ,CACZ,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE,GAClC,OAAO,CAAC,IAAI,CAAC;IA2NhB;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ7C;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAY5B;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAUlD;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBlE;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAsB5B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAcxC;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAI9C;;OAEG;IACH,OAAO,IAAI,IAAI;CAkBhB"}
|