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.
Files changed (169) hide show
  1. package/builtin/skills/deep-research/SKILL.md +90 -0
  2. package/builtin/skills/settings/ENV.md +6 -3
  3. package/dist/agent.d.ts +28 -1
  4. package/dist/agent.d.ts.map +1 -1
  5. package/dist/agent.js +128 -34
  6. package/dist/constants/goalPrompts.d.ts +2 -0
  7. package/dist/constants/goalPrompts.d.ts.map +1 -0
  8. package/dist/constants/goalPrompts.js +10 -0
  9. package/dist/constants/tools.d.ts +1 -0
  10. package/dist/constants/tools.d.ts.map +1 -1
  11. package/dist/constants/tools.js +1 -0
  12. package/dist/managers/aiManager.d.ts +7 -0
  13. package/dist/managers/aiManager.d.ts.map +1 -1
  14. package/dist/managers/aiManager.js +77 -41
  15. package/dist/managers/backgroundTaskManager.d.ts.map +1 -1
  16. package/dist/managers/backgroundTaskManager.js +10 -2
  17. package/dist/managers/goalManager.d.ts +43 -0
  18. package/dist/managers/goalManager.d.ts.map +1 -0
  19. package/dist/managers/goalManager.js +177 -0
  20. package/dist/managers/messageManager.d.ts +2 -2
  21. package/dist/managers/messageManager.d.ts.map +1 -1
  22. package/dist/managers/messageQueue.d.ts +10 -0
  23. package/dist/managers/messageQueue.d.ts.map +1 -1
  24. package/dist/managers/messageQueue.js +53 -1
  25. package/dist/managers/pluginManager.d.ts.map +1 -1
  26. package/dist/managers/pluginManager.js +7 -1
  27. package/dist/managers/skillManager.d.ts +2 -0
  28. package/dist/managers/skillManager.d.ts.map +1 -1
  29. package/dist/managers/skillManager.js +19 -9
  30. package/dist/managers/slashCommandManager.d.ts +6 -0
  31. package/dist/managers/slashCommandManager.d.ts.map +1 -1
  32. package/dist/managers/slashCommandManager.js +105 -0
  33. package/dist/managers/toolManager.d.ts.map +1 -1
  34. package/dist/managers/toolManager.js +5 -0
  35. package/dist/managers/workflowManager.d.ts +65 -0
  36. package/dist/managers/workflowManager.d.ts.map +1 -0
  37. package/dist/managers/workflowManager.js +380 -0
  38. package/dist/prompts/index.d.ts +2 -1
  39. package/dist/prompts/index.d.ts.map +1 -1
  40. package/dist/prompts/index.js +3 -3
  41. package/dist/services/aiService.d.ts +23 -0
  42. package/dist/services/aiService.d.ts.map +1 -1
  43. package/dist/services/aiService.js +102 -9
  44. package/dist/services/configurationService.d.ts +1 -1
  45. package/dist/services/configurationService.d.ts.map +1 -1
  46. package/dist/services/configurationService.js +3 -16
  47. package/dist/services/hook.d.ts.map +1 -1
  48. package/dist/services/hook.js +4 -0
  49. package/dist/services/session.d.ts +9 -1
  50. package/dist/services/session.d.ts.map +1 -1
  51. package/dist/services/session.js +28 -1
  52. package/dist/tools/bashTool.d.ts.map +1 -1
  53. package/dist/tools/bashTool.js +49 -7
  54. package/dist/tools/readTool.d.ts.map +1 -1
  55. package/dist/tools/readTool.js +1 -1
  56. package/dist/tools/taskManagementTools.d.ts.map +1 -1
  57. package/dist/tools/taskManagementTools.js +103 -157
  58. package/dist/tools/types.d.ts +2 -0
  59. package/dist/tools/types.d.ts.map +1 -1
  60. package/dist/tools/webFetchTool.d.ts.map +1 -1
  61. package/dist/tools/webFetchTool.js +0 -9
  62. package/dist/tools/workflowTool.d.ts +11 -0
  63. package/dist/tools/workflowTool.d.ts.map +1 -0
  64. package/dist/tools/workflowTool.js +190 -0
  65. package/dist/types/agent.d.ts +2 -0
  66. package/dist/types/agent.d.ts.map +1 -1
  67. package/dist/types/commands.d.ts +4 -0
  68. package/dist/types/commands.d.ts.map +1 -1
  69. package/dist/types/config.d.ts +2 -2
  70. package/dist/types/config.d.ts.map +1 -1
  71. package/dist/types/core.d.ts +1 -1
  72. package/dist/types/core.d.ts.map +1 -1
  73. package/dist/types/hooks.d.ts +2 -0
  74. package/dist/types/hooks.d.ts.map +1 -1
  75. package/dist/types/index.d.ts +1 -0
  76. package/dist/types/index.d.ts.map +1 -1
  77. package/dist/types/index.js +1 -0
  78. package/dist/types/messaging.d.ts +2 -2
  79. package/dist/types/messaging.d.ts.map +1 -1
  80. package/dist/types/processes.d.ts +6 -2
  81. package/dist/types/processes.d.ts.map +1 -1
  82. package/dist/types/workflow.d.ts +2 -0
  83. package/dist/types/workflow.d.ts.map +1 -0
  84. package/dist/types/workflow.js +1 -0
  85. package/dist/utils/cacheControlUtils.d.ts +13 -8
  86. package/dist/utils/cacheControlUtils.d.ts.map +1 -1
  87. package/dist/utils/cacheControlUtils.js +73 -102
  88. package/dist/utils/containerSetup.d.ts.map +1 -1
  89. package/dist/utils/containerSetup.js +7 -0
  90. package/dist/utils/markdownParser.d.ts.map +1 -1
  91. package/dist/utils/markdownParser.js +21 -6
  92. package/dist/utils/messageOperations.d.ts +2 -2
  93. package/dist/utils/messageOperations.d.ts.map +1 -1
  94. package/dist/utils/notificationXml.d.ts.map +1 -1
  95. package/dist/workflow/budgetTracker.d.ts +12 -0
  96. package/dist/workflow/budgetTracker.d.ts.map +1 -0
  97. package/dist/workflow/budgetTracker.js +30 -0
  98. package/dist/workflow/concurrencyLimiter.d.ts +14 -0
  99. package/dist/workflow/concurrencyLimiter.d.ts.map +1 -0
  100. package/dist/workflow/concurrencyLimiter.js +39 -0
  101. package/dist/workflow/journal.d.ts +19 -0
  102. package/dist/workflow/journal.d.ts.map +1 -0
  103. package/dist/workflow/journal.js +74 -0
  104. package/dist/workflow/progressReporter.d.ts +21 -0
  105. package/dist/workflow/progressReporter.d.ts.map +1 -0
  106. package/dist/workflow/progressReporter.js +118 -0
  107. package/dist/workflow/runState.d.ts +16 -0
  108. package/dist/workflow/runState.d.ts.map +1 -0
  109. package/dist/workflow/runState.js +57 -0
  110. package/dist/workflow/scriptRuntime.d.ts +35 -0
  111. package/dist/workflow/scriptRuntime.d.ts.map +1 -0
  112. package/dist/workflow/scriptRuntime.js +196 -0
  113. package/dist/workflow/structuredOutput.d.ts +27 -0
  114. package/dist/workflow/structuredOutput.d.ts.map +1 -0
  115. package/dist/workflow/structuredOutput.js +106 -0
  116. package/dist/workflow/types.d.ts +81 -0
  117. package/dist/workflow/types.d.ts.map +1 -0
  118. package/dist/workflow/types.js +1 -0
  119. package/dist/workflow/workflowApis.d.ts +46 -0
  120. package/dist/workflow/workflowApis.d.ts.map +1 -0
  121. package/dist/workflow/workflowApis.js +280 -0
  122. package/package.json +1 -1
  123. package/src/agent.ts +144 -34
  124. package/src/constants/goalPrompts.ts +10 -0
  125. package/src/constants/tools.ts +1 -0
  126. package/src/managers/aiManager.ts +91 -47
  127. package/src/managers/backgroundTaskManager.ts +16 -4
  128. package/src/managers/goalManager.ts +232 -0
  129. package/src/managers/messageManager.ts +2 -2
  130. package/src/managers/messageQueue.ts +59 -1
  131. package/src/managers/pluginManager.ts +8 -1
  132. package/src/managers/skillManager.ts +20 -9
  133. package/src/managers/slashCommandManager.ts +119 -0
  134. package/src/managers/toolManager.ts +7 -0
  135. package/src/managers/workflowManager.ts +491 -0
  136. package/src/prompts/index.ts +4 -2
  137. package/src/services/aiService.ts +166 -12
  138. package/src/services/configurationService.ts +2 -22
  139. package/src/services/hook.ts +5 -0
  140. package/src/services/session.ts +42 -2
  141. package/src/tools/bashTool.ts +64 -9
  142. package/src/tools/readTool.ts +1 -2
  143. package/src/tools/taskManagementTools.ts +146 -195
  144. package/src/tools/types.ts +2 -0
  145. package/src/tools/webFetchTool.ts +0 -12
  146. package/src/tools/workflowTool.ts +205 -0
  147. package/src/types/agent.ts +6 -0
  148. package/src/types/commands.ts +4 -0
  149. package/src/types/config.ts +2 -2
  150. package/src/types/core.ts +3 -3
  151. package/src/types/hooks.ts +2 -0
  152. package/src/types/index.ts +1 -0
  153. package/src/types/messaging.ts +2 -2
  154. package/src/types/processes.ts +10 -2
  155. package/src/types/workflow.ts +5 -0
  156. package/src/utils/cacheControlUtils.ts +106 -131
  157. package/src/utils/containerSetup.ts +9 -0
  158. package/src/utils/markdownParser.ts +26 -8
  159. package/src/utils/messageOperations.ts +2 -2
  160. package/src/utils/notificationXml.ts +6 -1
  161. package/src/workflow/budgetTracker.ts +34 -0
  162. package/src/workflow/concurrencyLimiter.ts +47 -0
  163. package/src/workflow/journal.ts +95 -0
  164. package/src/workflow/progressReporter.ts +141 -0
  165. package/src/workflow/runState.ts +65 -0
  166. package/src/workflow/scriptRuntime.ts +274 -0
  167. package/src/workflow/structuredOutput.ts +123 -0
  168. package/src/workflow/types.ts +95 -0
  169. 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 existing data before discovery
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: `❌ **Error executing skill**: ${error instanceof Error ? error.message : String(error)}`,
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: `❌ **Skill not found**: "${skill_name}"\n\nAvailable skills:\n${this.formatAvailableSkills()}`,
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: `❌ **Skill validation failed**:\n\n\`\`\`\n${errorMsg}\n\`\`\``,
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: `❌ **Error preparing skill**: ${error instanceof Error ? error.message : String(error)}`,
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 header = `🧠 **${skill.name}** (${skill.type} skill)\n\n`;
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 header + description + skillPath + mainContent;
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;AAOxD,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,CAAC,yBAAyB;IAsFjC;;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;;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"}
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;AA4B7E,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;IAyCrC;;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;IAgJtB,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"}
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"}