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.
- package/dist/agent.d.ts +61 -4
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +84 -8
- package/dist/hooks/manager.d.ts.map +1 -1
- package/dist/hooks/manager.js +1 -1
- package/dist/managers/aiManager.d.ts +2 -1
- package/dist/managers/aiManager.d.ts.map +1 -1
- package/dist/managers/aiManager.js +37 -6
- package/dist/managers/mcpManager.js +5 -5
- package/dist/managers/messageManager.d.ts +13 -2
- package/dist/managers/messageManager.d.ts.map +1 -1
- package/dist/managers/messageManager.js +20 -7
- package/dist/managers/skillManager.js +3 -3
- package/dist/managers/slashCommandManager.js +1 -1
- package/dist/managers/subagentManager.d.ts +3 -1
- package/dist/managers/subagentManager.d.ts.map +1 -1
- package/dist/managers/subagentManager.js +5 -1
- package/dist/services/aiService.d.ts +9 -1
- package/dist/services/aiService.d.ts.map +1 -1
- package/dist/services/aiService.js +17 -3
- package/dist/services/memory.js +5 -5
- package/dist/services/session.d.ts +64 -15
- package/dist/services/session.d.ts.map +1 -1
- package/dist/services/session.js +80 -30
- package/dist/tools/bashTool.js +2 -2
- package/dist/tools/deleteFileTool.js +1 -1
- package/dist/tools/editTool.js +1 -1
- package/dist/tools/multiEditTool.js +2 -2
- package/dist/tools/writeTool.js +1 -1
- package/dist/types.d.ts +12 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/messageOperations.d.ts +2 -2
- package/dist/utils/messageOperations.d.ts.map +1 -1
- package/dist/utils/messageOperations.js +2 -1
- package/package.json +1 -1
- package/src/agent.ts +103 -9
- package/src/hooks/manager.ts +4 -2
- package/src/managers/aiManager.ts +43 -7
- package/src/managers/mcpManager.ts +5 -5
- package/src/managers/messageManager.ts +34 -5
- package/src/managers/skillManager.ts +3 -3
- package/src/managers/slashCommandManager.ts +1 -1
- package/src/managers/subagentManager.ts +14 -2
- package/src/services/aiService.ts +29 -6
- package/src/services/memory.ts +5 -5
- package/src/services/session.ts +93 -26
- package/src/tools/bashTool.ts +2 -2
- package/src/tools/deleteFileTool.ts +1 -1
- package/src/tools/editTool.ts +1 -1
- package/src/tools/multiEditTool.ts +2 -2
- package/src/tools/writeTool.ts +1 -1
- package/src/types.ts +13 -0
- 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:
|
|
51
|
-
*
|
|
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(
|
|
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;
|
package/dist/agent.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,8BAA8B,CAAC;AAKtC,OAAO,EAAc,KAAK,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEhF,OAAO,EAEL,KAAK,8BAA8B,EACpC,MAAM,qCAAqC,CAAC;AAE7C,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,KAAK,EACV,OAAO,EACP,MAAM,EACN,eAAe,
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,8BAA8B,CAAC;AAKtC,OAAO,EAAc,KAAK,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEhF,OAAO,EAEL,KAAK,8BAA8B,EACpC,MAAM,qCAAqC,CAAC;AAE7C,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,KAAK,EACV,OAAO,EACP,MAAM,EACN,eAAe,EAGf,KAAK,EACN,MAAM,YAAY,CAAC;AAMpB;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAE3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iFAAiF;IACjF,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cACf,SAAQ,uBAAuB,EAC7B,8BAA8B,EAC9B,mBAAmB;CAAG;AAE1B,qBAAa,KAAK;IAChB,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,SAAS,CAAY;IAE7B,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,qBAAqB,CAAwB;IACrD,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,mBAAmB,CAAsB;IACjD,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,OAAO,CAAe;IAG9B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,UAAU,CAAS;IAE3B;;;;;;;;;OASG;IACH,OAAO;IA+GP,IAAW,SAAS,IAAI,MAAM,CAE7B;IAED,IAAW,QAAQ,IAAI,OAAO,EAAE,CAE/B;IAED,IAAW,MAAM,IAAI,KAAK,EAAE,CAE3B;IAED;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAWhC;;;OAGG;IACH,OAAO,CAAC,QAAQ;IAKhB,IAAW,iBAAiB,IAAI,MAAM,CAErC;IAED,IAAW,gBAAgB,IAAI,MAAM,EAAE,CAEtC;IAED,4BAA4B;IAC5B,IAAW,gBAAgB,IAAI,MAAM,CAEpC;IAED,4BAA4B;IAC5B,IAAW,SAAS,IAAI,OAAO,CAE9B;IAED,qCAAqC;IACrC,IAAW,aAAa,IAAI,OAAO,CAElC;IAED,wCAAwC;IACxC,IAAW,gBAAgB,IAAI,OAAO,CAErC;IAED,uCAAuC;IAChC,wBAAwB,CAC7B,EAAE,EAAE,MAAM,EACV,MAAM,CAAC,EAAE,MAAM,GACd;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAI5D,iCAAiC;IAC1B,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI/C;;;;;;;;OAQG;IACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCG;WACU,MAAM,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC;IAW1D,wEAAwE;YAC1D,UAAU;IA4DjB,cAAc,IAAI,IAAI;IAI7B,2BAA2B;IACd,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM/D,uCAAuC;IAChC,aAAa,IAAI,IAAI;IAI5B,kFAAkF;IAC3E,YAAY,IAAI,IAAI;IAO3B,2BAA2B;IAC3B,OAAO,CAAC,iBAAiB;IAIzB,uCAAuC;IAChC,gBAAgB,IAAI,IAAI;IAI/B,wCAAwC;IACjC,iBAAiB,IAAI,IAAI;IAIhC,uCAAuC;IAChC,cAAc,IAAI,IAAI;IAI7B,4CAA4C;IACrC,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAIjD,2CAA2C;IAC9B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAcxB,WAAW,CACtB,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,GACjD,OAAO,CAAC,IAAI,CAAC;IAgEhB,iDAAiD;IACpC,UAAU,CACrB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,SAAS,GAAG,MAAM,GACvB,OAAO,CAAC,IAAI,CAAC;IAqChB,gCAAgC;IACzB,aAAa,IAAI,eAAe,EAAE;IAIzC,yBAAyB;IACZ,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAInE,4BAA4B;IACf,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMtE,uCAAuC;IAChC,gBAAgB,IAAI,YAAY,EAAE;IAIzC,oCAAoC;IAC7B,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIlD,6BAA6B;IACtB,oBAAoB,IAAI,IAAI;IAInC,iCAAiC;IAC1B,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAI1E,8BAA8B;IACvB,iBAAiB,IAAI,kBAAkB,EAAE;CAGjD"}
|
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:
|
|
19
|
-
*
|
|
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
|
-
|
|
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?.
|
|
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" ? "
|
|
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" ? "
|
|
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;
|
|
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"}
|
package/dist/hooks/manager.js
CHANGED
|
@@ -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?.
|
|
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;
|
|
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?.
|
|
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
|
|
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,
|
|
102
|
-
|
|
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
|
-
//
|
|
167
|
-
|
|
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?.
|
|
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?.
|
|
30
|
+
this.logger?.debug(`Connecting to MCP server: ${serverName}`);
|
|
31
31
|
const success = await this.connectServer(serverName);
|
|
32
32
|
if (success) {
|
|
33
|
-
this.logger?.
|
|
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?.
|
|
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?.
|
|
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":"AACA,OAAO,EAeL,KAAK,0BAA0B,EAChC,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;
|
|
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?.
|
|
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?.
|
|
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?.
|
|
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?.
|
|
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);
|