wave-agent-sdk 0.0.3 → 0.0.5

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 (53) hide show
  1. package/dist/agent.d.ts +61 -4
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +84 -8
  4. package/dist/hooks/manager.d.ts.map +1 -1
  5. package/dist/hooks/manager.js +1 -1
  6. package/dist/managers/aiManager.d.ts +2 -1
  7. package/dist/managers/aiManager.d.ts.map +1 -1
  8. package/dist/managers/aiManager.js +37 -6
  9. package/dist/managers/mcpManager.js +5 -5
  10. package/dist/managers/messageManager.d.ts +13 -2
  11. package/dist/managers/messageManager.d.ts.map +1 -1
  12. package/dist/managers/messageManager.js +20 -7
  13. package/dist/managers/skillManager.js +3 -3
  14. package/dist/managers/slashCommandManager.js +1 -1
  15. package/dist/managers/subagentManager.d.ts +3 -1
  16. package/dist/managers/subagentManager.d.ts.map +1 -1
  17. package/dist/managers/subagentManager.js +5 -1
  18. package/dist/services/aiService.d.ts +9 -1
  19. package/dist/services/aiService.d.ts.map +1 -1
  20. package/dist/services/aiService.js +17 -3
  21. package/dist/services/memory.js +5 -5
  22. package/dist/services/session.d.ts +64 -15
  23. package/dist/services/session.d.ts.map +1 -1
  24. package/dist/services/session.js +80 -30
  25. package/dist/tools/bashTool.js +2 -2
  26. package/dist/tools/deleteFileTool.js +1 -1
  27. package/dist/tools/editTool.js +1 -1
  28. package/dist/tools/multiEditTool.js +2 -2
  29. package/dist/tools/writeTool.js +1 -1
  30. package/dist/types.d.ts +12 -0
  31. package/dist/types.d.ts.map +1 -1
  32. package/dist/utils/messageOperations.d.ts +2 -2
  33. package/dist/utils/messageOperations.d.ts.map +1 -1
  34. package/dist/utils/messageOperations.js +2 -1
  35. package/package.json +1 -1
  36. package/src/agent.ts +103 -9
  37. package/src/hooks/manager.ts +4 -2
  38. package/src/managers/aiManager.ts +43 -7
  39. package/src/managers/mcpManager.ts +5 -5
  40. package/src/managers/messageManager.ts +34 -5
  41. package/src/managers/skillManager.ts +3 -3
  42. package/src/managers/slashCommandManager.ts +1 -1
  43. package/src/managers/subagentManager.ts +14 -2
  44. package/src/services/aiService.ts +29 -6
  45. package/src/services/memory.ts +5 -5
  46. package/src/services/session.ts +93 -26
  47. package/src/tools/bashTool.ts +2 -2
  48. package/src/tools/deleteFileTool.ts +1 -1
  49. package/src/tools/editTool.ts +1 -1
  50. package/src/tools/multiEditTool.ts +2 -2
  51. package/src/tools/writeTool.ts +1 -1
  52. package/src/types.ts +13 -0
  53. package/src/utils/messageOperations.ts +3 -1
package/dist/agent.d.ts CHANGED
@@ -2,7 +2,7 @@ import { type MessageManagerCallbacks } from "./managers/messageManager.js";
2
2
  import { type McpManagerCallbacks } from "./managers/mcpManager.js";
3
3
  import { type BackgroundBashManagerCallbacks } from "./managers/backgroundBashManager.js";
4
4
  import type { SlashCommand, CustomSlashCommand } from "./types.js";
5
- import type { Message, Logger, McpServerStatus } from "./types.js";
5
+ import type { Message, Logger, McpServerStatus, Usage } from "./types.js";
6
6
  /**
7
7
  * Configuration options for Agent instances
8
8
  *
@@ -25,6 +25,12 @@ export interface AgentOptions {
25
25
  workdir?: string;
26
26
  /**Optional custom system prompt - if provided, replaces default system prompt */
27
27
  systemPrompt?: string;
28
+ /**
29
+ * Optional custom directory for session file storage
30
+ * @default join(homedir(), ".wave", "sessions")
31
+ * @example "/path/to/custom/sessions"
32
+ */
33
+ sessionDir?: string;
28
34
  }
29
35
  export interface AgentCallbacks extends MessageManagerCallbacks, BackgroundBashManagerCallbacks, McpManagerCallbacks {
30
36
  }
@@ -41,20 +47,34 @@ export declare class Agent {
41
47
  private hookManager;
42
48
  private workdir;
43
49
  private systemPrompt?;
50
+ private _usages;
44
51
  private gatewayConfig;
45
52
  private modelConfig;
46
53
  private tokenLimit;
47
54
  /**
48
55
  * Agent constructor - handles configuration resolution and validation
49
56
  *
50
- * IMPORTANT: Keep this constructor's signature exactly the same as Agent.create()
51
- * to maintain API consistency. Both methods should accept the same AgentOptions.
57
+ * IMPORTANT: This constructor is private. Use Agent.create() instead for proper
58
+ * async initialization. Keep this constructor's signature exactly the same as
59
+ * Agent.create() to maintain API consistency.
52
60
  *
53
61
  * @param options - Configuration options for the Agent instance
62
+ * @param options.sessionDir - Optional custom directory for session storage
54
63
  */
55
- constructor(options: AgentOptions);
64
+ private constructor();
56
65
  get sessionId(): string;
57
66
  get messages(): Message[];
67
+ get usages(): Usage[];
68
+ /**
69
+ * Rebuild usage array from messages containing usage metadata
70
+ * Called during session restoration to reconstruct usage tracking
71
+ */
72
+ private rebuildUsageFromMessages;
73
+ /**
74
+ * Add usage data to the tracking array and trigger callbacks
75
+ * @param usage Usage data from AI operations
76
+ */
77
+ private addUsage;
58
78
  get latestTotalTokens(): number;
59
79
  get userInputHistory(): string[];
60
80
  /** Get working directory */
@@ -82,6 +102,43 @@ export declare class Agent {
82
102
  * @param options - Same AgentOptions interface used by constructor
83
103
  * @returns Promise<Agent> - Fully initialized Agent instance
84
104
  */
105
+ /**
106
+ * Create a new Agent instance with async initialization
107
+ *
108
+ * This is the recommended way to create Agent instances. The constructor is private
109
+ * to ensure proper async initialization of all components.
110
+ *
111
+ * @param options - Configuration options for the Agent instance
112
+ * @param options.apiKey - API key for the AI service (or set WAVE_API_KEY env var)
113
+ * @param options.baseURL - Base URL for the AI service (or set WAVE_BASE_URL env var)
114
+ * @param options.sessionDir - Optional custom directory for session file storage.
115
+ * If not provided, defaults to ~/.wave/sessions/. Can be relative or absolute path.
116
+ * Examples: "./app-sessions", "/var/myapp/sessions", "~/Documents/sessions"
117
+ * @param options.callbacks - Optional callbacks for various Agent events
118
+ * @param options.restoreSessionId - Optional session ID to restore from
119
+ * @param options.continueLastSession - Whether to continue the last session automatically
120
+ * @param options.logger - Optional custom logger implementation
121
+ * @param options.messages - Optional initial messages for testing convenience
122
+ * @param options.workdir - Working directory (defaults to process.cwd())
123
+ * @param options.systemPrompt - Optional custom system prompt
124
+ * @returns Promise that resolves to initialized Agent instance
125
+ *
126
+ * @example
127
+ * ```typescript
128
+ * // Basic usage with default session directory
129
+ * const agent = await Agent.create({
130
+ * apiKey: 'your-api-key',
131
+ * baseURL: 'https://api.example.com'
132
+ * });
133
+ *
134
+ * // Custom session directory
135
+ * const agent = await Agent.create({
136
+ * apiKey: 'your-api-key',
137
+ * baseURL: 'https://api.example.com',
138
+ * sessionDir: './app-sessions'
139
+ * });
140
+ * ```
141
+ */
85
142
  static create(options: AgentOptions): Promise<Agent>;
86
143
  /** Private initialization method, handles async initialization logic */
87
144
  private initialize;
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
package/dist/agent.js CHANGED
@@ -15,14 +15,17 @@ export class Agent {
15
15
  /**
16
16
  * Agent constructor - handles configuration resolution and validation
17
17
  *
18
- * IMPORTANT: Keep this constructor's signature exactly the same as Agent.create()
19
- * to maintain API consistency. Both methods should accept the same AgentOptions.
18
+ * IMPORTANT: This constructor is private. Use Agent.create() instead for proper
19
+ * async initialization. Keep this constructor's signature exactly the same as
20
+ * Agent.create() to maintain API consistency.
20
21
  *
21
22
  * @param options - Configuration options for the Agent instance
23
+ * @param options.sessionDir - Optional custom directory for session storage
22
24
  */
23
25
  constructor(options) {
24
26
  this.bashManager = null;
25
- const { callbacks = {}, logger, workdir, systemPrompt } = options;
27
+ this._usages = []; // Usage tracking array
28
+ const { callbacks = {}, logger, workdir, systemPrompt, sessionDir, } = options;
26
29
  // Resolve configuration from constructor args and environment variables
27
30
  const gatewayConfig = configResolver.resolveGatewayConfig(options.apiKey, options.baseURL);
28
31
  const modelConfig = configResolver.resolveModelConfig(options.agentModel, options.fastModel);
@@ -53,6 +56,7 @@ export class Agent {
53
56
  callbacks,
54
57
  workdir: this.workdir,
55
58
  logger: this.logger,
59
+ sessionDir,
56
60
  });
57
61
  // Initialize subagent manager with all dependencies in constructor
58
62
  // IMPORTANT: Must be initialized AFTER MessageManager
@@ -64,6 +68,7 @@ export class Agent {
64
68
  gatewayConfig,
65
69
  modelConfig,
66
70
  tokenLimit,
71
+ onUsageAdded: (usage) => this.addUsage(usage),
67
72
  });
68
73
  // Initialize AI manager with resolved configuration
69
74
  this.aiManager = new AIManager({
@@ -72,7 +77,12 @@ export class Agent {
72
77
  logger: this.logger,
73
78
  backgroundBashManager: this.backgroundBashManager,
74
79
  hookManager: this.hookManager,
75
- callbacks,
80
+ callbacks: {
81
+ ...callbacks,
82
+ onUsageAdded: (usage) => {
83
+ this.addUsage(usage);
84
+ },
85
+ },
76
86
  workdir: this.workdir,
77
87
  systemPrompt: this.systemPrompt,
78
88
  gatewayConfig: this.gatewayConfig,
@@ -99,6 +109,31 @@ export class Agent {
99
109
  get messages() {
100
110
  return this.messageManager.getMessages();
101
111
  }
112
+ get usages() {
113
+ return [...this._usages]; // Return copy to prevent external modification
114
+ }
115
+ /**
116
+ * Rebuild usage array from messages containing usage metadata
117
+ * Called during session restoration to reconstruct usage tracking
118
+ */
119
+ rebuildUsageFromMessages() {
120
+ this._usages = [];
121
+ this.messages.forEach((message) => {
122
+ if (message.role === "assistant" && message.usage) {
123
+ this._usages.push(message.usage);
124
+ }
125
+ });
126
+ // Trigger callback after rebuilding usage array
127
+ this.messageManager.triggerUsageChange();
128
+ }
129
+ /**
130
+ * Add usage data to the tracking array and trigger callbacks
131
+ * @param usage Usage data from AI operations
132
+ */
133
+ addUsage(usage) {
134
+ this._usages.push(usage);
135
+ this.messageManager.triggerUsageChange();
136
+ }
102
137
  get latestTotalTokens() {
103
138
  return this.messageManager.getlatestTotalTokens();
104
139
  }
@@ -138,6 +173,43 @@ export class Agent {
138
173
  * @param options - Same AgentOptions interface used by constructor
139
174
  * @returns Promise<Agent> - Fully initialized Agent instance
140
175
  */
176
+ /**
177
+ * Create a new Agent instance with async initialization
178
+ *
179
+ * This is the recommended way to create Agent instances. The constructor is private
180
+ * to ensure proper async initialization of all components.
181
+ *
182
+ * @param options - Configuration options for the Agent instance
183
+ * @param options.apiKey - API key for the AI service (or set WAVE_API_KEY env var)
184
+ * @param options.baseURL - Base URL for the AI service (or set WAVE_BASE_URL env var)
185
+ * @param options.sessionDir - Optional custom directory for session file storage.
186
+ * If not provided, defaults to ~/.wave/sessions/. Can be relative or absolute path.
187
+ * Examples: "./app-sessions", "/var/myapp/sessions", "~/Documents/sessions"
188
+ * @param options.callbacks - Optional callbacks for various Agent events
189
+ * @param options.restoreSessionId - Optional session ID to restore from
190
+ * @param options.continueLastSession - Whether to continue the last session automatically
191
+ * @param options.logger - Optional custom logger implementation
192
+ * @param options.messages - Optional initial messages for testing convenience
193
+ * @param options.workdir - Working directory (defaults to process.cwd())
194
+ * @param options.systemPrompt - Optional custom system prompt
195
+ * @returns Promise that resolves to initialized Agent instance
196
+ *
197
+ * @example
198
+ * ```typescript
199
+ * // Basic usage with default session directory
200
+ * const agent = await Agent.create({
201
+ * apiKey: 'your-api-key',
202
+ * baseURL: 'https://api.example.com'
203
+ * });
204
+ *
205
+ * // Custom session directory
206
+ * const agent = await Agent.create({
207
+ * apiKey: 'your-api-key',
208
+ * baseURL: 'https://api.example.com',
209
+ * sessionDir: './app-sessions'
210
+ * });
211
+ * ```
212
+ */
141
213
  static async create(options) {
142
214
  // Create Agent instance - configuration resolution and validation now happens in constructor
143
215
  const instance = new Agent(options);
@@ -178,7 +250,7 @@ export class Agent {
178
250
  // Initialize hooks configuration
179
251
  try {
180
252
  // Load hooks configuration from user and project settings
181
- this.logger?.info("Loading hooks configuration...");
253
+ this.logger?.debug("Loading hooks configuration...");
182
254
  this.hookManager.loadConfigurationFromSettings();
183
255
  this.logger?.debug("Hooks system initialized successfully");
184
256
  }
@@ -190,10 +262,14 @@ export class Agent {
190
262
  if (options?.messages) {
191
263
  // If messages are provided, use them directly (useful for testing)
192
264
  this.messageManager.setMessages(options.messages);
265
+ // Rebuild usage array from restored messages
266
+ this.rebuildUsageFromMessages();
193
267
  }
194
268
  else {
195
269
  // Otherwise, handle session restoration
196
270
  await this.messageManager.handleSessionRestoration(options?.restoreSessionId, options?.continueLastSession);
271
+ // Rebuild usage array from restored messages
272
+ this.rebuildUsageFromMessages();
197
273
  }
198
274
  }
199
275
  abortAIMessage() {
@@ -238,7 +314,7 @@ export class Agent {
238
314
  }
239
315
  /** Destroy managers, clean up resources */
240
316
  async destroy() {
241
- this.messageManager.saveSession();
317
+ await this.messageManager.saveSession();
242
318
  this.abortAIMessage();
243
319
  this.abortBashCommand();
244
320
  this.abortSlashCommand();
@@ -316,13 +392,13 @@ export class Agent {
316
392
  // Add successful MemoryBlock to the last assistant message
317
393
  const memoryText = message.substring(1).trim();
318
394
  const typeLabel = type === "project" ? "Project Memory" : "User Memory";
319
- const storagePath = type === "project" ? "WAVE.md" : "user-memory.md";
395
+ const storagePath = type === "project" ? "AGENTS.md" : "user-memory.md";
320
396
  this.messageManager.addMemoryBlock(`${typeLabel}: ${memoryText}`, true, type, storagePath);
321
397
  }
322
398
  catch (error) {
323
399
  // Add failed MemoryBlock to the last assistant message
324
400
  const typeLabel = type === "project" ? "Project Memory" : "User Memory";
325
- const storagePath = type === "project" ? "WAVE.md" : "user-memory.md";
401
+ const storagePath = type === "project" ? "AGENTS.md" : "user-memory.md";
326
402
  this.messageManager.addMemoryBlock(`${typeLabel} add failed: ${error instanceof Error ? error.message : String(error)}`, false, type, storagePath);
327
403
  }
328
404
  }
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/hooks/manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,KAAK,SAAS,EAEd,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EACzB,KAAK,4BAA4B,EACjC,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EAItB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,KAAK,YAAY,EAAe,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,KAAK,aAAa,EAAgB,MAAM,eAAe,CAAC;AAEjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,YAAY;IAE3B,iBAAiB,CACf,SAAS,CAAC,EAAE,wBAAwB,EACpC,YAAY,CAAC,EAAE,wBAAwB,GACtC,IAAI,CAAC;IAGR,6BAA6B,IAAI,IAAI,CAAC;IAGtC,YAAY,CACV,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,oBAAoB,GAAG,4BAA4B,GAC3D,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAGlC,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAGvD,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,GAAG,gBAAgB,CAAC;IAGnE,gBAAgB,IAAI,wBAAwB,GAAG,SAAS,CAAC;CAC1D;AAED,qBAAa,WAAY,YAAW,YAAY;IAC9C,OAAO,CAAC,aAAa,CAAuC;IAC5D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAG/B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,YAAgC,EACzC,QAAQ,CAAC,EAAE,aAAa,EACxB,MAAM,CAAC,EAAE,MAAM;IAWjB;;;OAGG;IACH,iBAAiB,CACf,SAAS,CAAC,EAAE,wBAAwB,EACpC,YAAY,CAAC,EAAE,wBAAwB,GACtC,IAAI;IAyBP;;;OAGG;IACH,6BAA6B,IAAI,IAAI;IAmCrC;;OAEG;IACG,YAAY,CAChB,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,oBAAoB,GAAG,4BAA4B,GAC3D,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAsHjC;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO;IAWtD;;OAEG;IACH,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,GAAG,gBAAgB;IA8ClE;;OAEG;IACH,OAAO,CAAC,4BAA4B;IAyCpC;;OAEG;IACH,gBAAgB,IAAI,wBAAwB,GAAG,SAAS;IAOxD;;OAEG;IACH,kBAAkB,IAAI,IAAI;IAI1B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAmDhC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA8BhC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAa/B;;OAEG;IACH,OAAO,CAAC,aAAa;IA4BrB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAqC3B;;OAEG;IACH,qBAAqB,IAAI;QACvB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;KAC3C;CA2CF"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/hooks/manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,KAAK,SAAS,EAEd,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EACzB,KAAK,4BAA4B,EACjC,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EAItB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,KAAK,YAAY,EAAe,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,KAAK,aAAa,EAAgB,MAAM,eAAe,CAAC;AAEjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,YAAY;IAE3B,iBAAiB,CACf,SAAS,CAAC,EAAE,wBAAwB,EACpC,YAAY,CAAC,EAAE,wBAAwB,GACtC,IAAI,CAAC;IAGR,6BAA6B,IAAI,IAAI,CAAC;IAGtC,YAAY,CACV,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,oBAAoB,GAAG,4BAA4B,GAC3D,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAGlC,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAGvD,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,GAAG,gBAAgB,CAAC;IAGnE,gBAAgB,IAAI,wBAAwB,GAAG,SAAS,CAAC;CAC1D;AAED,qBAAa,WAAY,YAAW,YAAY;IAC9C,OAAO,CAAC,aAAa,CAAuC;IAC5D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAG/B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,YAAgC,EACzC,QAAQ,CAAC,EAAE,aAAa,EACxB,MAAM,CAAC,EAAE,MAAM;IAWjB;;;OAGG;IACH,iBAAiB,CACf,SAAS,CAAC,EAAE,wBAAwB,EACpC,YAAY,CAAC,EAAE,wBAAwB,GACtC,IAAI;IAyBP;;;OAGG;IACH,6BAA6B,IAAI,IAAI;IAmCrC;;OAEG;IACG,YAAY,CAChB,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,oBAAoB,GAAG,4BAA4B,GAC3D,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAwHjC;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO;IAWtD;;OAEG;IACH,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,GAAG,gBAAgB;IA8ClE;;OAEG;IACH,OAAO,CAAC,4BAA4B;IAyCpC;;OAEG;IACH,gBAAgB,IAAI,wBAAwB,GAAG,SAAS;IAOxD;;OAEG;IACH,kBAAkB,IAAI,IAAI;IAI1B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAmDhC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA8BhC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAa/B;;OAEG;IACH,OAAO,CAAC,aAAa;IA4BrB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAqC3B;;OAEG;IACH,qBAAqB,IAAI;QACvB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;KAC3C;CA2CF"}
@@ -138,7 +138,7 @@ export class HookManager {
138
138
  // Generate execution summary
139
139
  const totalDuration = Date.now() - startTime;
140
140
  const summary = this.generateExecutionSummary(event, results, totalDuration);
141
- this.logger?.info(`[HookManager] ${event} execution summary: ${summary}`);
141
+ this.logger?.debug(`[HookManager] ${event} execution summary: ${summary}`);
142
142
  return results;
143
143
  }
144
144
  /**
@@ -1,10 +1,11 @@
1
- import type { Logger, GatewayConfig, ModelConfig } from "../types.js";
1
+ import type { Logger, GatewayConfig, ModelConfig, Usage } from "../types.js";
2
2
  import type { ToolManager } from "./toolManager.js";
3
3
  import type { MessageManager } from "./messageManager.js";
4
4
  import type { BackgroundBashManager } from "./backgroundBashManager.js";
5
5
  import type { HookManager } from "../hooks/index.js";
6
6
  export interface AIManagerCallbacks {
7
7
  onCompressionStateChange?: (isCompressing: boolean) => void;
8
+ onUsageAdded?: (usage: Usage) => void;
8
9
  }
9
10
  export interface AIManagerOptions {
10
11
  messageManager: MessageManager;
@@ -1 +1 @@
1
- {"version":3,"file":"aiManager.d.ts","sourceRoot":"","sources":["../../src/managers/aiManager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAExE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,MAAM,WAAW,kBAAkB;IACjC,wBAAwB,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,KAAK,IAAI,CAAC;CAC7D;AAED,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IAC9C,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,SAAS;IACb,SAAS,EAAE,OAAO,CAAS;IAClC,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,mBAAmB,CAAgC;IAC3D,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,qBAAqB,CAAC,CAAwB;IACtD,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAC,CAAS;IAG9B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,UAAU,CAAS;gBAEf,OAAO,EAAE,gBAAgB;IAgBrC,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,SAAS,CAAqB;IAEtC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAYvB,YAAY,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI;IAItC,cAAc,IAAI,IAAI;IAuB7B,OAAO,CAAC,qBAAqB;YAqBf,8BAA8B;IAoDrC,gBAAgB,IAAI,OAAO;IAI3B,gBAAgB,CAAC,aAAa,EAAE,OAAO,GAAG,IAAI;IAOxC,aAAa,CACxB,OAAO,GAAE;QACP,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACpB,GACL,OAAO,CAAC,IAAI,CAAC;IA+PhB;;OAEG;YACW,gBAAgB;IAmC9B;;OAEG;YACW,sBAAsB;IA0CpC;;OAEG;YACW,uBAAuB;CA2CtC"}
1
+ {"version":3,"file":"aiManager.d.ts","sourceRoot":"","sources":["../../src/managers/aiManager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAExE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,MAAM,WAAW,kBAAkB;IACjC,wBAAwB,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5D,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IAC9C,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,SAAS;IACb,SAAS,EAAE,OAAO,CAAS;IAClC,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,mBAAmB,CAAgC;IAC3D,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,qBAAqB,CAAC,CAAwB;IACtD,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAC,CAAS;IAG9B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,UAAU,CAAS;gBAEf,OAAO,EAAE,gBAAgB;IAgBrC,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,SAAS,CAAqB;IAEtC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAYvB,YAAY,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI;IAItC,cAAc,IAAI,IAAI;IAuB7B,OAAO,CAAC,qBAAqB;YAqBf,8BAA8B;IAoErC,gBAAgB,IAAI,OAAO;IAI3B,gBAAgB,CAAC,aAAa,EAAE,OAAO,GAAG,IAAI;IAOxC,aAAa,CACxB,OAAO,GAAE;QACP,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACpB,GACL,OAAO,CAAC,IAAI,CAAC;IAkRhB;;OAEG;YACW,gBAAgB;IAmC9B;;OAEG;YACW,sBAAsB;IA0CpC;;OAEG;YACW,uBAAuB;CA2CtC"}
@@ -83,7 +83,7 @@ export class AIManager {
83
83
  this.messageManager.setlatestTotalTokens(usage.total_tokens);
84
84
  // Check if token limit exceeded - use injected configuration
85
85
  if (usage.total_tokens > this.tokenLimit) {
86
- this.logger?.info(`Token usage exceeded ${this.tokenLimit}, compressing messages...`);
86
+ this.logger?.debug(`Token usage exceeded ${this.tokenLimit}, compressing messages...`);
87
87
  // Check if messages need compression
88
88
  const { messagesToCompress, insertIndex } = getMessagesToCompress(this.messageManager.getMessages(), 7);
89
89
  // If there are messages to compress, perform compression
@@ -91,15 +91,29 @@ export class AIManager {
91
91
  const recentChatMessages = convertMessagesForAPI(messagesToCompress);
92
92
  this.setIsCompressing(true);
93
93
  try {
94
- const compressedContent = await compressMessages({
94
+ const compressionResult = await compressMessages({
95
95
  gatewayConfig: this.gatewayConfig,
96
96
  modelConfig: this.modelConfig,
97
97
  messages: recentChatMessages,
98
98
  abortSignal: abortController.signal,
99
99
  });
100
100
  // Execute message reconstruction and sessionId update after compression
101
- this.messageManager.compressMessagesAndUpdateSession(insertIndex, compressedContent);
102
- this.logger?.info(`Successfully compressed ${messagesToCompress.length} messages and updated session`);
101
+ this.messageManager.compressMessagesAndUpdateSession(insertIndex, compressionResult.content);
102
+ // Handle usage tracking for compression operations
103
+ if (compressionResult.usage) {
104
+ const usage = {
105
+ prompt_tokens: compressionResult.usage.prompt_tokens,
106
+ completion_tokens: compressionResult.usage.completion_tokens,
107
+ total_tokens: compressionResult.usage.total_tokens,
108
+ model: this.modelConfig.fastModel,
109
+ operation_type: "compress",
110
+ };
111
+ // Notify Agent to add to usage tracking
112
+ if (this.callbacks?.onUsageAdded) {
113
+ this.callbacks.onUsageAdded(usage);
114
+ }
115
+ }
116
+ this.logger?.debug(`Successfully compressed ${messagesToCompress.length} messages and updated session`);
103
117
  }
104
118
  catch (compressError) {
105
119
  this.logger?.error("Failed to compress messages:", compressError);
@@ -163,8 +177,25 @@ export class AIManager {
163
177
  }
164
178
  }
165
179
  }
166
- // Add assistant message at once (including content and tool calls)
167
- this.messageManager.addAssistantMessage(content, toolCalls);
180
+ // Handle usage tracking for agent operations
181
+ let usage;
182
+ if (result.usage) {
183
+ usage = {
184
+ prompt_tokens: result.usage.prompt_tokens,
185
+ completion_tokens: result.usage.completion_tokens,
186
+ total_tokens: result.usage.total_tokens,
187
+ model: model || this.modelConfig.agentModel,
188
+ operation_type: "agent",
189
+ };
190
+ }
191
+ // Add assistant message at once (including content, tool calls, and usage)
192
+ this.messageManager.addAssistantMessage(content, toolCalls, usage);
193
+ // Notify Agent to add to usage tracking
194
+ if (usage) {
195
+ if (this.callbacks?.onUsageAdded) {
196
+ this.callbacks.onUsageAdded(usage);
197
+ }
198
+ }
168
199
  if (toolCalls.length > 0) {
169
200
  for (const functionToolCall of toolCalls) {
170
201
  const toolId = functionToolCall.id || "";
@@ -20,17 +20,17 @@ export class McpManager {
20
20
  this.configPath = join(workdir, ".mcp.json");
21
21
  this.workdir = workdir;
22
22
  if (autoConnect) {
23
- this.logger?.info("Initializing MCP servers...");
23
+ this.logger?.debug("Initializing MCP servers...");
24
24
  // Ensure MCP configuration is loaded
25
25
  const config = await this.ensureConfigLoaded();
26
26
  if (config && config.mcpServers) {
27
27
  // Connect to all configured servers
28
28
  const connectionPromises = Object.keys(config.mcpServers).map(async (serverName) => {
29
29
  try {
30
- this.logger?.info(`Connecting to MCP server: ${serverName}`);
30
+ this.logger?.debug(`Connecting to MCP server: ${serverName}`);
31
31
  const success = await this.connectServer(serverName);
32
32
  if (success) {
33
- this.logger?.info(`Successfully connected to MCP server: ${serverName}`);
33
+ this.logger?.debug(`Successfully connected to MCP server: ${serverName}`);
34
34
  }
35
35
  else {
36
36
  this.logger?.warn(`Failed to connect to MCP server: ${serverName}`);
@@ -43,7 +43,7 @@ export class McpManager {
43
43
  // Wait for all connection attempts to complete
44
44
  await Promise.all(connectionPromises);
45
45
  }
46
- this.logger?.info("MCP servers initialization completed");
46
+ this.logger?.debug("MCP servers initialization completed");
47
47
  // Trigger state change callback after initialization
48
48
  this.callbacks.onServersChange?.(this.getAllServers());
49
49
  }
@@ -188,7 +188,7 @@ export class McpManager {
188
188
  });
189
189
  };
190
190
  transport.onclose = () => {
191
- this.logger?.info(`MCP Server ${name} transport closed`);
191
+ this.logger?.debug(`MCP Server ${name} transport closed`);
192
192
  this.connections.delete(name);
193
193
  this.updateServerStatus(name, {
194
194
  status: "disconnected",
@@ -1,11 +1,12 @@
1
1
  import { type AgentToolBlockUpdateParams } from "../utils/messageOperations.js";
2
- import type { Logger, Message } from "../types.js";
2
+ import type { Logger, Message, Usage } from "../types.js";
3
3
  import { ChatCompletionMessageFunctionToolCall } from "openai/resources.js";
4
4
  export interface MessageManagerCallbacks {
5
5
  onMessagesChange?: (messages: Message[]) => void;
6
6
  onSessionIdChange?: (sessionId: string) => void;
7
7
  onLatestTotalTokensChange?: (latestTotalTokens: number) => void;
8
8
  onUserInputHistoryChange?: (history: string[]) => void;
9
+ onUsagesChange?: (usages: Usage[]) => void;
9
10
  onUserMessageAdded?: (content: string, images?: Array<{
10
11
  path: string;
11
12
  mimeType: string;
@@ -28,6 +29,11 @@ export interface MessageManagerOptions {
28
29
  callbacks: MessageManagerCallbacks;
29
30
  workdir: string;
30
31
  logger?: Logger;
32
+ /**
33
+ * Custom session directory path
34
+ * @default join(homedir(), ".wave", "sessions")
35
+ */
36
+ sessionDir?: string;
31
37
  }
32
38
  export declare class MessageManager {
33
39
  private sessionId;
@@ -38,6 +44,7 @@ export declare class MessageManager {
38
44
  private workdir;
39
45
  private logger?;
40
46
  private callbacks;
47
+ private sessionDir?;
41
48
  constructor(options: MessageManagerOptions);
42
49
  getSessionId(): string;
43
50
  getMessages(): Message[];
@@ -68,7 +75,7 @@ export declare class MessageManager {
68
75
  mimeType: string;
69
76
  }>): void;
70
77
  addCustomCommandMessage(commandName: string, content: string, originalInput?: string): void;
71
- addAssistantMessage(content?: string, toolCalls?: ChatCompletionMessageFunctionToolCall[]): void;
78
+ addAssistantMessage(content?: string, toolCalls?: ChatCompletionMessageFunctionToolCall[], usage?: Usage): void;
72
79
  updateToolBlock(params: AgentToolBlockUpdateParams): void;
73
80
  addDiffBlock(filePath: string, diffResult: Array<{
74
81
  value: string;
@@ -89,5 +96,9 @@ export declare class MessageManager {
89
96
  status: "active" | "completed" | "error" | "aborted";
90
97
  messages: Message[];
91
98
  }>): void;
99
+ /**
100
+ * Trigger usage change callback with all usage data from assistant messages
101
+ */
102
+ triggerUsageChange(): void;
92
103
  }
93
104
  //# sourceMappingURL=messageManager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"messageManager.d.ts","sourceRoot":"","sources":["../../src/managers/messageManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"messageManager.d.ts","sourceRoot":"","sources":["../../src/managers/messageManager.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,7 @@ export class MessageManager {
11
11
  this.workdir = options.workdir;
12
12
  this.callbacks = options.callbacks;
13
13
  this.logger = options.logger;
14
+ this.sessionDir = options.sessionDir;
14
15
  }
15
16
  // Getter methods
16
17
  getSessionId() {
@@ -26,7 +27,7 @@ export class MessageManager {
26
27
  return [...this.userInputHistory];
27
28
  }
28
29
  getTranscriptPath() {
29
- return getSessionFilePath(this.sessionId);
30
+ return getSessionFilePath(this.sessionId, this.sessionDir);
30
31
  }
31
32
  // Setter methods, will trigger callbacks
32
33
  setSessionId(sessionId) {
@@ -44,7 +45,7 @@ export class MessageManager {
44
45
  */
45
46
  async saveSession() {
46
47
  try {
47
- await saveSession(this.sessionId, this.messages, this.workdir, this.latestTotalTokens, this.sessionStartTime);
48
+ await saveSession(this.sessionId, this.messages, this.workdir, this.latestTotalTokens, this.sessionStartTime, this.sessionDir);
48
49
  }
49
50
  catch (error) {
50
51
  this.logger?.error("Failed to save session:", error);
@@ -56,7 +57,7 @@ export class MessageManager {
56
57
  async handleSessionRestoration(restoreSessionId, continueLastSession) {
57
58
  // Clean up expired sessions first
58
59
  try {
59
- await cleanupExpiredSessions(this.workdir);
60
+ await cleanupExpiredSessions(this.workdir, this.sessionDir);
60
61
  }
61
62
  catch (error) {
62
63
  console.warn("Failed to cleanup expired sessions:", error);
@@ -67,14 +68,14 @@ export class MessageManager {
67
68
  try {
68
69
  let sessionToRestore = null;
69
70
  if (restoreSessionId) {
70
- sessionToRestore = await loadSession(restoreSessionId);
71
+ sessionToRestore = await loadSession(restoreSessionId, this.sessionDir);
71
72
  if (!sessionToRestore) {
72
73
  console.error(`Session not found: ${restoreSessionId}`);
73
74
  process.exit(1);
74
75
  }
75
76
  }
76
77
  else if (continueLastSession) {
77
- sessionToRestore = await getLatestSession(this.workdir);
78
+ sessionToRestore = await getLatestSession(this.workdir, this.sessionDir);
78
79
  if (!sessionToRestore) {
79
80
  console.error(`No previous session found for workdir: ${this.workdir}`);
80
81
  process.exit(1);
@@ -157,8 +158,8 @@ export class MessageManager {
157
158
  this.setMessages(newMessages);
158
159
  this.callbacks.onCustomCommandAdded?.(commandName, content, originalInput);
159
160
  }
160
- addAssistantMessage(content, toolCalls) {
161
- const newMessages = addAssistantMessageToMessages(this.messages, content, toolCalls);
161
+ addAssistantMessage(content, toolCalls, usage) {
162
+ const newMessages = addAssistantMessageToMessages(this.messages, content, toolCalls, usage);
162
163
  this.setMessages(newMessages);
163
164
  this.callbacks.onAssistantMessageAdded?.(content, toolCalls);
164
165
  }
@@ -286,4 +287,16 @@ export class MessageManager {
286
287
  };
287
288
  this.callbacks.onSubAgentBlockUpdated?.(params.subagentId, params.messages);
288
289
  }
290
+ /**
291
+ * Trigger usage change callback with all usage data from assistant messages
292
+ */
293
+ triggerUsageChange() {
294
+ const usages = [];
295
+ for (const message of this.messages) {
296
+ if (message.role === "assistant" && message.usage) {
297
+ usages.push(message.usage);
298
+ }
299
+ }
300
+ this.callbacks.onUsagesChange?.(usages);
301
+ }
289
302
  }
@@ -19,7 +19,7 @@ export class SkillManager {
19
19
  * Initialize the skill manager by discovering available skills
20
20
  */
21
21
  async initialize() {
22
- this.logger?.info("Initializing SkillManager...");
22
+ this.logger?.debug("Initializing SkillManager...");
23
23
  try {
24
24
  // Clear existing data before discovery
25
25
  this.skillMetadata.clear();
@@ -40,7 +40,7 @@ export class SkillManager {
40
40
  });
41
41
  }
42
42
  this.initialized = true;
43
- this.logger?.info(`SkillManager initialized with ${this.skillMetadata.size} skills`);
43
+ this.logger?.debug(`SkillManager initialized with ${this.skillMetadata.size} skills`);
44
44
  }
45
45
  catch (error) {
46
46
  this.logger?.error("Failed to initialize SkillManager:", error);
@@ -184,7 +184,7 @@ export class SkillManager {
184
184
  */
185
185
  async executeSkill(args) {
186
186
  const { skill_name } = args;
187
- this.logger?.info(`Invoking skill: ${skill_name}`);
187
+ this.logger?.debug(`Invoking skill: ${skill_name}`);
188
188
  try {
189
189
  // Load the skill
190
190
  const skill = await this.loadSkill(skill_name);
@@ -51,7 +51,7 @@ export class SlashCommandManager {
51
51
  },
52
52
  });
53
53
  }
54
- this.logger?.info(`Loaded ${customCommands.length} custom commands`);
54
+ this.logger?.debug(`Loaded ${customCommands.length} custom commands`);
55
55
  }
56
56
  catch (error) {
57
57
  this.logger?.warn("Failed to load custom commands:", error);