wave-agent-sdk 0.14.1 → 0.14.3

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 (92) hide show
  1. package/builtin/skills/settings/HOOKS.md +69 -0
  2. package/builtin/skills/settings/PLUGINS.md +171 -0
  3. package/builtin/skills/settings/SKILL.md +8 -3
  4. package/builtin/skills/settings/SUBAGENTS.md +21 -2
  5. package/dist/agent.d.ts +2 -2
  6. package/dist/agent.d.ts.map +1 -1
  7. package/dist/agent.js +12 -3
  8. package/dist/managers/aiManager.d.ts +6 -6
  9. package/dist/managers/aiManager.d.ts.map +1 -1
  10. package/dist/managers/aiManager.js +122 -59
  11. package/dist/managers/backgroundTaskManager.d.ts.map +1 -1
  12. package/dist/managers/backgroundTaskManager.js +28 -18
  13. package/dist/managers/hookManager.d.ts +16 -1
  14. package/dist/managers/hookManager.d.ts.map +1 -1
  15. package/dist/managers/hookManager.js +97 -8
  16. package/dist/managers/messageManager.d.ts +19 -4
  17. package/dist/managers/messageManager.d.ts.map +1 -1
  18. package/dist/managers/messageManager.js +63 -18
  19. package/dist/managers/pluginManager.d.ts +1 -0
  20. package/dist/managers/pluginManager.d.ts.map +1 -1
  21. package/dist/managers/pluginManager.js +7 -0
  22. package/dist/managers/subagentManager.d.ts +5 -0
  23. package/dist/managers/subagentManager.d.ts.map +1 -1
  24. package/dist/managers/subagentManager.js +35 -0
  25. package/dist/prompts/index.d.ts +1 -1
  26. package/dist/prompts/index.d.ts.map +1 -1
  27. package/dist/prompts/index.js +1 -1
  28. package/dist/services/MarketplaceService.d.ts +0 -11
  29. package/dist/services/MarketplaceService.d.ts.map +1 -1
  30. package/dist/services/MarketplaceService.js +21 -89
  31. package/dist/services/aiService.d.ts +3 -3
  32. package/dist/services/aiService.d.ts.map +1 -1
  33. package/dist/services/aiService.js +7 -7
  34. package/dist/services/hook.d.ts.map +1 -1
  35. package/dist/services/hook.js +15 -0
  36. package/dist/services/initializationService.d.ts.map +1 -1
  37. package/dist/services/initializationService.js +24 -1
  38. package/dist/services/interactionService.js +1 -1
  39. package/dist/services/pluginLoader.d.ts +5 -6
  40. package/dist/services/pluginLoader.d.ts.map +1 -1
  41. package/dist/services/pluginLoader.js +43 -53
  42. package/dist/services/session.d.ts +1 -1
  43. package/dist/services/session.js +7 -7
  44. package/dist/services/taskManager.d.ts +1 -1
  45. package/dist/services/taskManager.js +1 -1
  46. package/dist/types/core.d.ts +1 -1
  47. package/dist/types/core.d.ts.map +1 -1
  48. package/dist/types/hooks.d.ts +9 -1
  49. package/dist/types/hooks.d.ts.map +1 -1
  50. package/dist/types/hooks.js +2 -0
  51. package/dist/types/marketplace.d.ts +1 -26
  52. package/dist/types/marketplace.d.ts.map +1 -1
  53. package/dist/types/messaging.d.ts +3 -3
  54. package/dist/types/messaging.d.ts.map +1 -1
  55. package/dist/types/plugins.d.ts +3 -13
  56. package/dist/types/plugins.d.ts.map +1 -1
  57. package/dist/utils/convertMessagesForAPI.d.ts +1 -1
  58. package/dist/utils/convertMessagesForAPI.d.ts.map +1 -1
  59. package/dist/utils/convertMessagesForAPI.js +18 -7
  60. package/dist/utils/groupMessagesByApiRound.d.ts +1 -1
  61. package/dist/utils/groupMessagesByApiRound.js +6 -6
  62. package/dist/utils/messageOperations.d.ts.map +1 -1
  63. package/dist/utils/messageOperations.js +3 -3
  64. package/dist/utils/subagentParser.d.ts +8 -1
  65. package/dist/utils/subagentParser.d.ts.map +1 -1
  66. package/dist/utils/subagentParser.js +18 -3
  67. package/package.json +1 -1
  68. package/src/agent.ts +16 -3
  69. package/src/managers/aiManager.ts +142 -63
  70. package/src/managers/backgroundTaskManager.ts +32 -22
  71. package/src/managers/hookManager.ts +125 -10
  72. package/src/managers/messageManager.ts +76 -22
  73. package/src/managers/pluginManager.ts +10 -0
  74. package/src/managers/subagentManager.ts +47 -0
  75. package/src/prompts/index.ts +1 -1
  76. package/src/services/MarketplaceService.ts +26 -127
  77. package/src/services/aiService.ts +11 -11
  78. package/src/services/hook.ts +17 -0
  79. package/src/services/initializationService.ts +33 -1
  80. package/src/services/interactionService.ts +1 -1
  81. package/src/services/pluginLoader.ts +51 -67
  82. package/src/services/session.ts +7 -7
  83. package/src/services/taskManager.ts +1 -1
  84. package/src/types/core.ts +1 -1
  85. package/src/types/hooks.ts +16 -2
  86. package/src/types/marketplace.ts +1 -24
  87. package/src/types/messaging.ts +3 -3
  88. package/src/types/plugins.ts +3 -13
  89. package/src/utils/convertMessagesForAPI.ts +24 -9
  90. package/src/utils/groupMessagesByApiRound.ts +6 -6
  91. package/src/utils/messageOperations.ts +3 -5
  92. package/src/utils/subagentParser.ts +31 -4
@@ -58,6 +58,21 @@ async function buildHookJsonInput(context) {
58
58
  jsonInput.name = context.worktreeName;
59
59
  }
60
60
  }
61
+ // Add SessionStart-specific fields
62
+ if (context.event === "SessionStart") {
63
+ if (context.source !== undefined) {
64
+ jsonInput.source = context.source;
65
+ }
66
+ if (context.agentType !== undefined) {
67
+ jsonInput.agent_type = context.agentType;
68
+ }
69
+ }
70
+ // Add SessionEnd-specific fields
71
+ if (context.event === "SessionEnd") {
72
+ if (context.endSource !== undefined) {
73
+ jsonInput.end_source = context.endSource;
74
+ }
75
+ }
61
76
  return jsonInput;
62
77
  }
63
78
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"initializationService.d.ts","sourceRoot":"","sources":["../../src/services/initializationService.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,OAAO,EACP,MAAM,EACN,YAAY,EACZ,WAAW,EACZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAIpD,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,YAAY,CAAC;IAC3B,eAAe,EAAE,eAAe,CAAC;IACjC,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,EAAE,WAAW,CAAC;IACzB,aAAa,EAAE,aAAa,CAAC;IAC7B,OAAO,EAAE,YAAY,CAAC;IACtB,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,WAAW,CAAC;IACxB,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,EAAE,cAAc,CAAC;IAC/B,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,WAAW,EAAE,WAAW,CAAC;IACzB,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,wBAAwB,EAAE,MAAM,IAAI,CAAC;CACtC;AAED,qBAAa,qBAAqB;WACZ,UAAU,CAC5B,OAAO,EAAE,qBAAqB,EAC9B,OAAO,CAAC,EAAE;QACR,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;QAC9B,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;KACtB,GACA,OAAO,CAAC,IAAI,CAAC;CAyRjB"}
1
+ {"version":3,"file":"initializationService.d.ts","sourceRoot":"","sources":["../../src/services/initializationService.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,OAAO,EACP,MAAM,EACN,YAAY,EACZ,WAAW,EACZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAIpD,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,YAAY,CAAC;IAC3B,eAAe,EAAE,eAAe,CAAC;IACjC,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,EAAE,WAAW,CAAC;IACzB,aAAa,EAAE,aAAa,CAAC;IAC7B,OAAO,EAAE,YAAY,CAAC;IACtB,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,WAAW,CAAC;IACxB,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,EAAE,cAAc,CAAC;IAC/B,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,WAAW,EAAE,WAAW,CAAC;IACzB,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,wBAAwB,EAAE,MAAM,IAAI,CAAC;CACtC;AAED,qBAAa,qBAAqB;WACZ,UAAU,CAC5B,OAAO,EAAE,qBAAqB,EAC9B,OAAO,CAAC,EAAE;QACR,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;QAC9B,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;KACtB,GACA,OAAO,CAAC,IAAI,CAAC;CAyTjB"}
@@ -75,6 +75,29 @@ export class InitializationService {
75
75
  logger?.error("Failed to initialize hooks system:", error);
76
76
  // Don't throw error to prevent app startup failure
77
77
  }
78
+ // Execute SessionStart hooks
79
+ try {
80
+ const phaseStart = performance.now();
81
+ const sessionStartResult = await hookManager.executeSessionStartHooks("startup", messageManager.getSessionId(), messageManager.getTranscriptPath());
82
+ // Inject additionalContext as a meta user message (matches Claude Code)
83
+ if (sessionStartResult.additionalContext) {
84
+ messageManager.addUserMessage({
85
+ content: `<system-reminder>\nSessionStart hook additional context: ${sessionStartResult.additionalContext}\n</system-reminder>`,
86
+ isMeta: true,
87
+ });
88
+ }
89
+ // Inject initialUserMessage as a meta user message
90
+ if (sessionStartResult.initialUserMessage) {
91
+ messageManager.addUserMessage({
92
+ content: sessionStartResult.initialUserMessage,
93
+ isMeta: true,
94
+ });
95
+ }
96
+ logger?.debug(`Initialization Phase [SessionStart Hooks] took ${(performance.now() - phaseStart).toFixed(2)}ms`);
97
+ }
98
+ catch (error) {
99
+ logger?.warn("SessionStart hooks execution failed:", error);
100
+ }
78
101
  // Trigger WorktreeCreate hook if this is a new worktree
79
102
  if (agentOptions.isNewWorktree && hookManager) {
80
103
  try {
@@ -188,7 +211,7 @@ export class InitializationService {
188
211
  messageManager.rebuildUsageFromMessages(sessionToRestore?.messages || []);
189
212
  if (sessionToRestore) {
190
213
  messageManager.initializeFromSession(sessionToRestore);
191
- // Update task manager with the root session ID to ensure continuity across compressions
214
+ // Update task manager with the root session ID to ensure continuity across compactions
192
215
  taskManager.setTaskListId(sessionToRestore.rootSessionId || sessionToRestore.id);
193
216
  // After session is initialized, load tasks for the session
194
217
  const tasks = await taskManager.listTasks();
@@ -103,7 +103,7 @@ export class InteractionService {
103
103
  messageManager.rebuildUsageFromMessages(sessionData.messages);
104
104
  // 6. Initialize session state last
105
105
  messageManager.initializeFromSession(sessionData);
106
- // Update task manager with the root session ID to ensure continuity across compressions
106
+ // Update task manager with the root session ID to ensure continuity across compactions
107
107
  taskManager.setTaskListId(sessionData.rootSessionId || sessionData.id);
108
108
  // 7. Load tasks for the restored session
109
109
  const tasks = await taskManager.listTasks();
@@ -1,11 +1,6 @@
1
1
  import { PluginManifest, CustomSlashCommand, Skill, LspConfig, McpConfig, PartialHookConfiguration } from "../types/index.js";
2
+ import { type SubagentConfiguration } from "../utils/subagentParser.js";
2
3
  export declare class PluginLoader {
3
- /**
4
- * Finds the first existing plugin manifest path.
5
- * Prefers .wave-plugin/ for backward compatibility, falls back to .claude-plugin/.
6
- * Returns null if neither exists.
7
- */
8
- private static findPluginManifestPath;
9
4
  /**
10
5
  * Load and validate a plugin manifest from a directory
11
6
  * @param pluginPath Absolute path to the plugin directory
@@ -33,6 +28,10 @@ export declare class PluginLoader {
33
28
  * Load hooks configuration from a plugin
34
29
  */
35
30
  static loadHooksConfig(pluginPath: string): Promise<PartialHookConfiguration | undefined>;
31
+ /**
32
+ * Load agent configurations from a plugin's agents directory
33
+ */
34
+ static loadAgents(pluginPath: string): Promise<SubagentConfiguration[]>;
36
35
  /**
37
36
  * Validate the plugin manifest structure
38
37
  */
@@ -1 +1 @@
1
- {"version":3,"file":"pluginLoader.d.ts","sourceRoot":"","sources":["../../src/services/pluginLoader.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,KAAK,EACL,SAAS,EACT,SAAS,EACT,wBAAwB,EACzB,MAAM,mBAAmB,CAAC;AAK3B,qBAAa,YAAY;IACvB;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAkCrC;;;OAGG;WACU,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAgEtE;;;OAGG;IACH,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,kBAAkB,EAAE;IAK7D;;;OAGG;WACU,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAuC7D;;OAEG;WACU,aAAa,CACxB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAUjC;;OAEG;WACU,aAAa,CACxB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAUjC;;OAEG;WACU,eAAe,CAC1B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,wBAAwB,GAAG,SAAS,CAAC;IAUhD;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;CAgBhC"}
1
+ {"version":3,"file":"pluginLoader.d.ts","sourceRoot":"","sources":["../../src/services/pluginLoader.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,KAAK,EACL,SAAS,EACT,SAAS,EACT,wBAAwB,EACzB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,4BAA4B,CAAC;AAIpC,qBAAa,YAAY;IACvB;;;OAGG;WACU,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IA6CtE;;;OAGG;IACH,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,kBAAkB,EAAE;IAK7D;;;OAGG;WACU,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAuC7D;;OAEG;WACU,aAAa,CACxB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAUjC;;OAEG;WACU,aAAa,CACxB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAUjC;;OAEG;WACU,eAAe,CAC1B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,wBAAwB,GAAG,SAAS,CAAC;IAgBhD;;OAEG;WACU,UAAU,CACrB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,qBAAqB,EAAE,CAAC;IA2BnC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;CAgBhC"}
@@ -1,73 +1,30 @@
1
1
  import * as fs from "fs/promises";
2
- import * as fsSync from "fs";
3
2
  import * as path from "path";
4
3
  import { scanCommandsDirectory } from "../utils/customCommands.js";
5
4
  import { parseSkillFile } from "../utils/skillParser.js";
5
+ import { parseAgentFile, } from "../utils/subagentParser.js";
6
6
  import { resolveMcpConfig } from "../managers/mcpManager.js";
7
+ import { logger } from "../utils/globalLogger.js";
7
8
  export class PluginLoader {
8
- /**
9
- * Finds the first existing plugin manifest path.
10
- * Prefers .wave-plugin/ for backward compatibility, falls back to .claude-plugin/.
11
- * Returns null if neither exists.
12
- */
13
- static findPluginManifestPath(pluginPath) {
14
- const waveManifestPath = path.join(pluginPath, ".wave-plugin", "plugin.json");
15
- const claudeManifestPath = path.join(pluginPath, ".claude-plugin", "plugin.json");
16
- // Check .wave-plugin first for backward compatibility
17
- try {
18
- const waveStat = fsSync.statSync(waveManifestPath);
19
- if (waveStat.isFile()) {
20
- return waveManifestPath;
21
- }
22
- }
23
- catch {
24
- // .wave-plugin/plugin.json doesn't exist
25
- }
26
- try {
27
- const claudeStat = fsSync.statSync(claudeManifestPath);
28
- if (claudeStat.isFile()) {
29
- return claudeManifestPath;
30
- }
31
- }
32
- catch {
33
- // .claude-plugin/plugin.json doesn't exist
34
- }
35
- return null;
36
- }
37
9
  /**
38
10
  * Load and validate a plugin manifest from a directory
39
11
  * @param pluginPath Absolute path to the plugin directory
40
12
  */
41
13
  static async loadManifest(pluginPath) {
42
- const manifestPath = this.findPluginManifestPath(pluginPath);
43
- if (!manifestPath) {
44
- throw new Error(`Plugin manifest not found at ${pluginPath}. Neither .wave-plugin/plugin.json nor .claude-plugin/plugin.json exists.`);
45
- }
46
- // Determine which directory is being used for validation
47
- const pluginDirName = manifestPath.includes(".claude-plugin")
48
- ? ".claude-plugin"
49
- : ".wave-plugin";
50
- const pluginDirPath = path.join(pluginPath, pluginDirName);
51
- // T018: Ensure plugin.json is the only file in the manifest directory
52
- // For .claude-plugin/, marketplace.json is also allowed (Claude Code convention)
14
+ const dotWavePluginPath = path.join(pluginPath, ".wave-plugin");
15
+ const manifestPath = path.join(dotWavePluginPath, "plugin.json");
16
+ // T018: Ensure plugin.json is the only file in .wave-plugin/
53
17
  try {
54
- const entries = await fs.readdir(pluginDirPath);
55
- const allowedFiles = ["plugin.json"];
56
- if (pluginDirName === ".claude-plugin") {
57
- allowedFiles.push("marketplace.json");
58
- }
59
- const misplaced = entries.filter((e) => !allowedFiles.includes(e));
18
+ const entries = await fs.readdir(dotWavePluginPath);
19
+ const misplaced = entries.filter((e) => e !== "plugin.json");
60
20
  if (misplaced.length > 0) {
61
- const allowedMsg = pluginDirName === ".claude-plugin"
62
- ? "Only plugin.json and marketplace.json should be in this directory."
63
- : "Only plugin.json should be in this directory.";
64
- throw new Error(`Misplaced files/directories in ${pluginDirName}/: ${misplaced.join(", ")}. ${allowedMsg}`);
21
+ throw new Error(`Misplaced files/directories in .wave-plugin/: ${misplaced.join(", ")}. Only plugin.json should be in this directory.`);
65
22
  }
66
23
  }
67
24
  catch (error) {
68
25
  if (error instanceof Error &&
69
26
  error.code === "ENOENT") {
70
- throw new Error(`Plugin manifest directory not found at ${pluginDirPath}`);
27
+ throw new Error(`Plugin manifest directory not found at ${dotWavePluginPath}`);
71
28
  }
72
29
  throw error;
73
30
  }
@@ -168,12 +125,45 @@ export class PluginLoader {
168
125
  const hooksPath = path.join(pluginPath, "hooks", "hooks.json");
169
126
  try {
170
127
  const content = await fs.readFile(hooksPath, "utf-8");
171
- return JSON.parse(content);
128
+ const parsed = JSON.parse(content);
129
+ // Claude Code wrapper format: { "hooks": { "SessionStart": [...] } }
130
+ // (optional "description" sibling key)
131
+ if (parsed && typeof parsed === "object" && "hooks" in parsed) {
132
+ return parsed.hooks;
133
+ }
134
+ return undefined;
172
135
  }
173
136
  catch {
174
137
  return undefined;
175
138
  }
176
139
  }
140
+ /**
141
+ * Load agent configurations from a plugin's agents directory
142
+ */
143
+ static async loadAgents(pluginPath) {
144
+ const agentsPath = path.join(pluginPath, "agents");
145
+ const agents = [];
146
+ try {
147
+ const entries = await fs.readdir(agentsPath, { withFileTypes: true });
148
+ for (const entry of entries) {
149
+ if (entry.isFile() && entry.name.endsWith(".md")) {
150
+ const agentFilePath = path.join(agentsPath, entry.name);
151
+ try {
152
+ const config = parseAgentFile(agentFilePath, "plugin", pluginPath);
153
+ agents.push(config);
154
+ }
155
+ catch (parseError) {
156
+ // Log error but continue with other files
157
+ logger?.warn(`Warning: ${parseError instanceof Error ? parseError.message : String(parseError)}`);
158
+ }
159
+ }
160
+ }
161
+ }
162
+ catch {
163
+ // agents directory might not exist
164
+ }
165
+ return agents;
166
+ }
177
167
  /**
178
168
  * Validate the plugin manifest structure
179
169
  */
@@ -160,7 +160,7 @@ export declare function sessionExistsInJsonl(sessionId: string, workdir: string,
160
160
  /**
161
161
  * Get the content of the first message in a session
162
162
  * For user role: get text block content
163
- * For assistant role: get compress block content
163
+ * For assistant role: get compact block content
164
164
  * @param sessionId - Session ID to get first message from
165
165
  * @param workdir - Working directory for session operations
166
166
  * @returns Promise that resolves to the first message content or null if not found
@@ -637,7 +637,7 @@ export async function sessionExistsInJsonl(sessionId, workdir, sessionType) {
637
637
  /**
638
638
  * Get the content of the first message in a session
639
639
  * For user role: get text block content
640
- * For assistant role: get compress block content
640
+ * For assistant role: get compact block content
641
641
  * @param sessionId - Session ID to get first message from
642
642
  * @param workdir - Working directory for session operations
643
643
  * @returns Promise that resolves to the first message content or null if not found
@@ -778,17 +778,17 @@ export async function loadFullMessageThread(currentSessionId, workdir) {
778
778
  break;
779
779
  sessionIds.unshift(currentId);
780
780
  // Add messages from this session to the beginning of the list
781
- // But skip the "compress" block if it's not the first session in our traversal (which is the latest)
781
+ // But skip the "compact" block if it's not the first session in our traversal (which is the latest)
782
782
  // Actually, we should probably keep all messages and let the UI/logic handle it.
783
- // But wait, if we are concatenating, the "compress" block in session N summarizes session N-1.
784
- // So if we have session N-1 and session N, we should probably skip the compress block in session N.
783
+ // But wait, if we are concatenating, the "compact" block in session N summarizes session N-1.
784
+ // So if we have session N-1 and session N, we should probably skip the compact block in session N.
785
785
  const messages = sessionData.messages;
786
786
  if (allMessages.length > 0) {
787
787
  // If we already have messages (from "later" sessions),
788
788
  // we are now adding messages from an "earlier" session.
789
- // The later session's first message might be a "compress" block.
790
- if (allMessages[0].blocks.some((b) => b.type === "compress")) {
791
- // Remove the compress block from the later session's messages
789
+ // The later session's first message might be a "compact" block.
790
+ if (allMessages[0].blocks.some((b) => b.type === "compact")) {
791
+ // Remove the compact block from the later session's messages
792
792
  // because we are now providing the actual messages it summarized.
793
793
  allMessages.shift();
794
794
  }
@@ -10,7 +10,7 @@ export declare class TaskManager extends EventEmitter {
10
10
  setTaskListId(taskListId: string): void;
11
11
  /**
12
12
  * Syncs the task list ID with the current session's root session ID.
13
- * This is typically called when the session is cleared or compressed.
13
+ * This is typically called when the session is cleared or compacted.
14
14
  */
15
15
  syncWithSession(): Promise<void>;
16
16
  private getSessionDir;
@@ -18,7 +18,7 @@ export class TaskManager extends EventEmitter {
18
18
  }
19
19
  /**
20
20
  * Syncs the task list ID with the current session's root session ID.
21
- * This is typically called when the session is cleared or compressed.
21
+ * This is typically called when the session is cleared or compacted.
22
22
  */
23
23
  async syncWithSession() {
24
24
  const messageManager = this.container.get("MessageManager");
@@ -22,7 +22,7 @@ export interface Usage {
22
22
  completion_tokens: number;
23
23
  total_tokens: number;
24
24
  model?: string;
25
- operation_type?: "agent" | "compress";
25
+ operation_type?: "agent" | "compact";
26
26
  cache_read_input_tokens?: number;
27
27
  cache_creation_input_tokens?: number;
28
28
  cache_creation?: {
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/types/core.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD;;;GAGG;AACH,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACpC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACnC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACnC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACrC;AAED;;;GAGG;AACH,MAAM,WAAW,KAAK;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IAGtC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,cAAc,CAAC,EAAE;QACf,yBAAyB,EAAE,MAAM,CAAC;QAClC,yBAAyB,EAAE,MAAM,CAAC;KACnC,CAAC;CACH;AAED;;;GAGG;AACH,MAAM,WAAW,WAAY,SAAQ,eAAe;IAElD,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IAGrB;;;OAGG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAEjC;;;OAGG;IACH,2BAA2B,CAAC,EAAE,MAAM,CAAC;IAErC;;OAEG;IACH,cAAc,CAAC,EAAE;QACf,0CAA0C;QAC1C,yBAAyB,EAAE,MAAM,CAAC;QAClC,wCAAwC;QACxC,yBAAyB,EAAE,MAAM,CAAC;KACnC,CAAC;CACH;AAED;;;GAGG;AACH,MAAM,WAAW,MAAM;IACrB,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,UAAU,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,kBAAmB,SAAQ,KAAK;aAGzB,KAAK,EAAE,MAAM;aACb,QAAQ,CAAC,EAAE,OAAO;gBAFlC,OAAO,EAAE,MAAM,EACC,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,OAAO,YAAA;CAKrC;AAGD,eAAO,MAAM,aAAa;;;;;;CAShB,CAAC"}
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/types/core.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD;;;GAGG;AACH,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACpC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACnC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACnC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACrC;AAED;;;GAGG;AACH,MAAM,WAAW,KAAK;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAGrC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,cAAc,CAAC,EAAE;QACf,yBAAyB,EAAE,MAAM,CAAC;QAClC,yBAAyB,EAAE,MAAM,CAAC;KACnC,CAAC;CACH;AAED;;;GAGG;AACH,MAAM,WAAW,WAAY,SAAQ,eAAe;IAElD,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IAGrB;;;OAGG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAEjC;;;OAGG;IACH,2BAA2B,CAAC,EAAE,MAAM,CAAC;IAErC;;OAEG;IACH,cAAc,CAAC,EAAE;QACf,0CAA0C;QAC1C,yBAAyB,EAAE,MAAM,CAAC;QAClC,wCAAwC;QACxC,yBAAyB,EAAE,MAAM,CAAC;KACnC,CAAC;CACH;AAED;;;GAGG;AACH,MAAM,WAAW,MAAM;IACrB,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,UAAU,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,kBAAmB,SAAQ,KAAK;aAGzB,KAAK,EAAE,MAAM;aACb,QAAQ,CAAC,EAAE,OAAO;gBAFlC,OAAO,EAAE,MAAM,EACC,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,OAAO,YAAA;CAKrC;AAGD,eAAO,MAAM,aAAa;;;;;;CAShB,CAAC"}
@@ -5,7 +5,7 @@
5
5
  * enabling automated actions at specific workflow points.
6
6
  */
7
7
  export type { WaveConfiguration, HookConfiguration, PartialHookConfiguration, HookConfigurationRecord, } from "./configuration.js";
8
- export type HookEvent = "PreToolUse" | "PostToolUse" | "UserPromptSubmit" | "Stop" | "SubagentStop" | "PermissionRequest" | "WorktreeCreate" | "CwdChanged";
8
+ export type HookEvent = "PreToolUse" | "PostToolUse" | "UserPromptSubmit" | "Stop" | "SubagentStop" | "PermissionRequest" | "WorktreeCreate" | "CwdChanged" | "SessionStart" | "SessionEnd";
9
9
  export interface HookCommand {
10
10
  type: "command";
11
11
  command: string;
@@ -51,6 +51,8 @@ export declare class HookConfigurationError extends Error {
51
51
  readonly validationErrors: string[];
52
52
  constructor(configPath: string, validationErrors: string[]);
53
53
  }
54
+ export type SessionStartSource = "startup" | "resume" | "compact";
55
+ export type SessionEndSource = "exit" | "stop" | "compact";
54
56
  export declare function isValidHookEvent(event: string): event is HookEvent;
55
57
  export declare function isValidHookCommand(cmd: unknown): cmd is HookCommand;
56
58
  export declare function isValidHookEventConfig(config: unknown): config is HookEventConfig;
@@ -67,6 +69,9 @@ export interface HookJsonInput {
67
69
  name?: string;
68
70
  old_cwd?: string;
69
71
  new_cwd?: string;
72
+ source?: SessionStartSource;
73
+ agent_type?: string;
74
+ end_source?: SessionEndSource;
70
75
  }
71
76
  export interface ExtendedHookExecutionContext extends HookExecutionContext {
72
77
  sessionId?: string;
@@ -80,6 +85,9 @@ export interface ExtendedHookExecutionContext extends HookExecutionContext {
80
85
  worktreeName?: string;
81
86
  oldCwd?: string;
82
87
  newCwd?: string;
88
+ source?: SessionStartSource;
89
+ agentType?: string;
90
+ endSource?: SessionEndSource;
83
91
  }
84
92
  export interface HookEnvironment {
85
93
  WAVE_PROJECT_DIR: string;
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/types/hooks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAG5B,MAAM,MAAM,SAAS,GACjB,YAAY,GACZ,aAAa,GACb,kBAAkB,GAClB,MAAM,GACN,cAAc,GACd,mBAAmB,GACnB,gBAAgB,GAChB,YAAY,CAAC;AAGjB,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAGD,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAGD,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;CACjB;AAGD,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAGD,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAGD,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAGD,qBAAa,kBAAmB,SAAQ,KAAK;aAEzB,WAAW,EAAE,MAAM;aACnB,aAAa,EAAE,KAAK;aACpB,OAAO,EAAE,oBAAoB;gBAF7B,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,KAAK,EACpB,OAAO,EAAE,oBAAoB;CAKhD;AAGD,qBAAa,sBAAuB,SAAQ,KAAK;aAE7B,UAAU,EAAE,MAAM;aAClB,gBAAgB,EAAE,MAAM,EAAE;gBAD1B,UAAU,EAAE,MAAM,EAClB,gBAAgB,EAAE,MAAM,EAAE;CAO7C;AAGD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,SAAS,CAWlE;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,WAAW,CA4BnE;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,OAAO,GACd,MAAM,IAAI,eAAe,CAa3B;AAGD,MAAM,WAAW,aAAa;IAE5B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,SAAS,CAAC;IAG3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAGD,MAAM,WAAW,4BAA6B,SAAQ,oBAAoB;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAGD,MAAM,WAAW,eAAe;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB"}
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/types/hooks.ts"],"names":[],"mappings":"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"}
@@ -34,6 +34,8 @@ export function isValidHookEvent(event) {
34
34
  "PermissionRequest",
35
35
  "WorktreeCreate",
36
36
  "CwdChanged",
37
+ "SessionStart",
38
+ "SessionEnd",
37
39
  ].includes(event);
38
40
  }
39
41
  export function isValidHookCommand(cmd) {
@@ -5,27 +5,8 @@ export interface MarketplaceOwner {
5
5
  }
6
6
  export interface MarketplacePluginEntry {
7
7
  name: string;
8
- source: string | MarketplaceSource;
8
+ source: string;
9
9
  description: string;
10
- /** Claude Code compatibility: plugin category */
11
- category?: string;
12
- /** Claude Code compatibility: plugin tags */
13
- tags?: string[];
14
- /** Claude Code compatibility: when false, plugin.json is optional */
15
- strict?: boolean;
16
- /** Claude Code compatibility: inline manifest fields */
17
- version?: string;
18
- author?: {
19
- name: string;
20
- url?: string;
21
- };
22
- homepage?: string;
23
- repository?: string;
24
- license?: string;
25
- keywords?: string[];
26
- commands?: string;
27
- skills?: string;
28
- agents?: string;
29
10
  }
30
11
  export interface MarketplacePluginStatus extends MarketplacePluginEntry {
31
12
  marketplace: string;
@@ -39,8 +20,6 @@ export interface MarketplaceManifest {
39
20
  name: string;
40
21
  owner: MarketplaceOwner;
41
22
  plugins: MarketplacePluginEntry[];
42
- /** Claude Code compatibility: additional metadata */
43
- metadata?: Record<string, unknown>;
44
23
  }
45
24
  export type MarketplaceSource = {
46
25
  source: "directory";
@@ -53,10 +32,6 @@ export type MarketplaceSource = {
53
32
  source: "git";
54
33
  url: string;
55
34
  ref?: string;
56
- } | {
57
- source: "url";
58
- url: string;
59
- ref?: string;
60
35
  };
61
36
  export interface KnownMarketplace {
62
37
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"marketplace.d.ts","sourceRoot":"","sources":["../../src/types/marketplace.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"marketplace.d.ts","sourceRoot":"","sources":["../../src/types/marketplace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,uBAAwB,SAAQ,sBAAsB;IACrE,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,gBAAgB,CAAC;IACxB,OAAO,EAAE,sBAAsB,EAAE,CAAC;CACnC;AAED,MAAM,MAAM,iBAAiB,GACzB;IACE,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd,GACD;IACE,MAAM,EAAE,QAAQ,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GACD;IACE,MAAM,EAAE,KAAK,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEN,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,iBAAiB,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uFAAuF;IACvF,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;CAC1D;AAED,MAAM,WAAW,yBAAyB;IACxC,YAAY,EAAE,gBAAgB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B"}
@@ -15,7 +15,7 @@ export interface Message {
15
15
  additionalFields?: Record<string, unknown>;
16
16
  isMeta?: boolean;
17
17
  }
18
- export type MessageBlock = TextBlock | ErrorBlock | ToolBlock | ImageBlock | BangBlock | CompressBlock | ReasoningBlock | FileHistoryBlock | TaskNotificationBlock;
18
+ export type MessageBlock = TextBlock | ErrorBlock | ToolBlock | ImageBlock | BangBlock | CompactBlock | ReasoningBlock | FileHistoryBlock | TaskNotificationBlock;
19
19
  export interface TextBlock {
20
20
  type: "text";
21
21
  content: string;
@@ -65,8 +65,8 @@ export interface BangBlock {
65
65
  stage: "running" | "end";
66
66
  exitCode: number | null;
67
67
  }
68
- export interface CompressBlock {
69
- type: "compress";
68
+ export interface CompactBlock {
69
+ type: "compact";
70
70
  content: string;
71
71
  sessionId: string;
72
72
  }
@@ -1 +1 @@
1
- {"version":3,"file":"messaging.d.ts","sourceRoot":"","sources":["../../src/types/messaging.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAEvC,oBAAY,aAAa;IACvB,IAAI,SAAS;IACb,IAAI,SAAS;CACd;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,YAAY,GACpB,SAAS,GACT,UAAU,GACV,SAAS,GACT,UAAU,GACV,SAAS,GACT,aAAa,GACb,cAAc,GACd,gBAAgB,GAChB,qBAAqB,CAAC;AAE1B,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,KAAK,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;CAC7B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,KAAK,CAAC;QAEb,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;OAMG;IACH,KAAK,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,GAAG,KAAK,CAAC;IACjD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,SAAS,GAAG,KAAK,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,OAAO,gBAAgB,EAAE,YAAY,EAAE,CAAC;CACpD;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC;IAC5B,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
1
+ {"version":3,"file":"messaging.d.ts","sourceRoot":"","sources":["../../src/types/messaging.ts"],"names":[],"mappings":"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"}
@@ -3,8 +3,9 @@ import { Skill } from "./skills.js";
3
3
  import { LspConfig } from "./lsp.js";
4
4
  import { McpConfig } from "./mcp.js";
5
5
  import { PartialHookConfiguration } from "./configuration.js";
6
+ import { SubagentConfiguration } from "../utils/subagentParser.js";
6
7
  /**
7
- * Plugin manifest structure (.wave-plugin/plugin.json or .claude-plugin/plugin.json)
8
+ * Plugin manifest structure (.wave-plugin/plugin.json)
8
9
  */
9
10
  export interface PluginManifest {
10
11
  name: string;
@@ -13,18 +14,6 @@ export interface PluginManifest {
13
14
  author?: {
14
15
  name: string;
15
16
  };
16
- /** Claude Code compatibility: plugin keywords */
17
- keywords?: string[];
18
- /** Claude Code compatibility: plugin homepage URL */
19
- homepage?: string;
20
- /** Claude Code compatibility: repository info */
21
- repository?: string;
22
- /** Claude Code compatibility: license info */
23
- license?: string;
24
- /** Claude Code compatibility: plugin dependencies */
25
- dependencies?: Record<string, string>;
26
- /** Claude Code compatibility: user configuration schema */
27
- userConfig?: Record<string, unknown>;
28
17
  }
29
18
  /**
30
19
  * Plugin configuration in AgentOptions or wave.settings.json
@@ -40,6 +29,7 @@ export interface Plugin extends PluginManifest {
40
29
  path: string;
41
30
  commands: CustomSlashCommand[];
42
31
  skills: Skill[];
32
+ agents: SubagentConfiguration[];
43
33
  lspConfig?: LspConfig;
44
34
  mcpConfig?: McpConfig;
45
35
  hooksConfig?: PartialHookConfiguration;
@@ -1 +1 @@
1
- {"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../../src/types/plugins.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,MAAO,SAAQ,cAAc;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,WAAW,CAAC,EAAE,wBAAwB,CAAC;CACxC"}
1
+ {"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../../src/types/plugins.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,MAAO,SAAQ,cAAc;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,MAAM,EAAE,qBAAqB,EAAE,CAAC;IAChC,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,WAAW,CAAC,EAAE,wBAAwB,CAAC;CACxC"}
@@ -1,7 +1,7 @@
1
1
  import type { Message } from "../types/index.js";
2
2
  import { ChatCompletionMessageParam } from "openai/resources.js";
3
3
  /**
4
- * Convert message format to API call format, stopping when a compressed message is encountered.
4
+ * Convert message format to API call format, stopping when a compacted message is encountered.
5
5
  * Messages with no meaningful content or tool calls are filtered out.
6
6
  * @param messages Message list
7
7
  * @returns Converted API message format list
@@ -1 +1 @@
1
- {"version":3,"file":"convertMessagesForAPI.d.ts","sourceRoot":"","sources":["../../src/utils/convertMessagesForAPI.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAKjD,OAAO,EAEL,0BAA0B,EAC3B,MAAM,qBAAqB,CAAC;AA0B7B;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,OAAO,EAAE,GAClB,0BAA0B,EAAE,CAuO9B"}
1
+ {"version":3,"file":"convertMessagesForAPI.d.ts","sourceRoot":"","sources":["../../src/utils/convertMessagesForAPI.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAKjD,OAAO,EAEL,0BAA0B,EAC3B,MAAM,qBAAqB,CAAC;AA0B7B;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,OAAO,EAAE,GAClB,0BAA0B,EAAE,CAsP9B"}
@@ -25,7 +25,7 @@ function safeToolArguments(args) {
25
25
  }
26
26
  }
27
27
  /**
28
- * Convert message format to API call format, stopping when a compressed message is encountered.
28
+ * Convert message format to API call format, stopping when a compacted message is encountered.
29
29
  * Messages with no meaningful content or tool calls are filtered out.
30
30
  * @param messages Message list
31
31
  * @returns Converted API message format list
@@ -35,15 +35,15 @@ export function convertMessagesForAPI(messages) {
35
35
  const startIndex = messages.length - 1;
36
36
  for (let i = startIndex; i >= 0; i--) {
37
37
  const message = messages[i];
38
- // Check if a compression block is encountered, if so, stop iteration
38
+ // Check if a compaction block is encountered, if so, stop iteration
39
39
  if (message.role === "assistant" &&
40
- message.blocks.some((block) => block.type === "compress")) {
41
- // Add the content of the compression block as an assistant message to the history
42
- const compressBlock = message.blocks.find((block) => block.type === "compress");
43
- if (compressBlock && compressBlock.type === "compress") {
40
+ message.blocks.some((block) => block.type === "compact")) {
41
+ // Add the content of the compaction block as an assistant message to the history
42
+ const compactBlock = message.blocks.find((block) => block.type === "compact");
43
+ if (compactBlock && compactBlock.type === "compact") {
44
44
  recentMessages.unshift({
45
45
  role: "user",
46
- content: compressBlock.content,
46
+ content: compactBlock.content,
47
47
  });
48
48
  }
49
49
  break;
@@ -114,6 +114,16 @@ export function convertMessagesForAPI(messages) {
114
114
  .map((block) => (block.type === "text" ? block.content : ""))
115
115
  .join("\n");
116
116
  }
117
+ // Extract reasoning content from reasoning blocks
118
+ const reasoningBlocks = message.blocks.filter((block) => block.type === "reasoning" &&
119
+ block.content &&
120
+ block.content.trim().length > 0);
121
+ let reasoning_content;
122
+ if (reasoningBlocks.length > 0) {
123
+ reasoning_content = reasoningBlocks
124
+ .map((block) => (block.type === "reasoning" ? block.content : ""))
125
+ .join("\n");
126
+ }
117
127
  // Construct tool calls from tool blocks
118
128
  if (toolBlocks.length > 0) {
119
129
  tool_calls = toolBlocks
@@ -138,6 +148,7 @@ export function convertMessagesForAPI(messages) {
138
148
  role: "assistant",
139
149
  content: hasContent ? content : undefined,
140
150
  tool_calls,
151
+ ...(reasoning_content ? { reasoning_content } : {}),
141
152
  ...(message.additionalFields ? { ...message.additionalFields } : {}),
142
153
  };
143
154
  recentMessages.unshift(assistantMessage);
@@ -12,7 +12,7 @@ export interface ApiRound {
12
12
  * Boundaries:
13
13
  * - A new `role: "user"` message starts a new round.
14
14
  * - A new `role: "assistant"` message with a different `id` starts a new round.
15
- * - A message with a `compress` block is pushed as its own round and starts a
15
+ * - A message with a `compact` block is pushed as its own round and starts a
16
16
  * new round after it.
17
17
  */
18
18
  export declare function groupMessagesByApiRound(messages: Message[]): ApiRound[];