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
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { SubagentConfiguration } from "../utils/subagentParser.js";
|
|
2
|
-
import type { Message, Logger, GatewayConfig, ModelConfig } from "../types.js";
|
|
2
|
+
import type { Message, Logger, GatewayConfig, ModelConfig, Usage } from "../types.js";
|
|
3
3
|
import { AIManager } from "./aiManager.js";
|
|
4
4
|
import { MessageManager } from "./messageManager.js";
|
|
5
5
|
import { ToolManager } from "./toolManager.js";
|
|
@@ -21,6 +21,7 @@ export interface SubagentManagerOptions {
|
|
|
21
21
|
gatewayConfig: GatewayConfig;
|
|
22
22
|
modelConfig: ModelConfig;
|
|
23
23
|
tokenLimit: number;
|
|
24
|
+
onUsageAdded?: (usage: Usage) => void;
|
|
24
25
|
}
|
|
25
26
|
export declare class SubagentManager {
|
|
26
27
|
private instances;
|
|
@@ -32,6 +33,7 @@ export declare class SubagentManager {
|
|
|
32
33
|
private gatewayConfig;
|
|
33
34
|
private modelConfig;
|
|
34
35
|
private tokenLimit;
|
|
36
|
+
private onUsageAdded?;
|
|
35
37
|
constructor(options: SubagentManagerOptions);
|
|
36
38
|
/**
|
|
37
39
|
* Initialize the SubagentManager by loading and caching configurations
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagentManager.d.ts","sourceRoot":"","sources":["../../src/managers/subagentManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"subagentManager.d.ts","sourceRoot":"","sources":["../../src/managers/subagentManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EACV,OAAO,EACP,MAAM,EACN,aAAa,EACb,WAAW,EACX,KAAK,EACN,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EACL,cAAc,EAEf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,qBAAqB,CAAC;IACrC,SAAS,EAAE,SAAS,CAAC;IACrB,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,cAAc,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC;IACtE,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,WAAW,CAAC;IAC/B,oBAAoB,EAAE,cAAc,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACvC;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAuC;IACxD,OAAO,CAAC,oBAAoB,CAAwC;IAEpE,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,iBAAiB,CAAc;IACvC,OAAO,CAAC,oBAAoB,CAAiB;IAC7C,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAC,CAAyB;gBAElC,OAAO,EAAE,sBAAsB;IAW3C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAY5D;;OAEG;IACH,iBAAiB,IAAI,qBAAqB,EAAE;IAS5C;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM;IAK/B;;OAEG;IACG,cAAc,CAClB,aAAa,EAAE,qBAAqB,EACpC,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,gBAAgB,CAAC;IAsF5B;;;;;OAKG;IACG,WAAW,CACf,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC;IAiElB;;OAEG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAIxD;;OAEG;IACH,oBAAoB,CAClB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,GACjC,IAAI;IAOP;;OAEG;IACH,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAOhE;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAiC1C;;OAEG;IACH,iBAAiB,IAAI,IAAI;IAOzB;;OAEG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAYzC;;OAEG;IACH,kBAAkB,IAAI,gBAAgB,EAAE;IAOxC;;OAEG;IACH,OAAO,IAAI,IAAI;CAKhB"}
|
|
@@ -12,6 +12,7 @@ export class SubagentManager {
|
|
|
12
12
|
this.gatewayConfig = options.gatewayConfig;
|
|
13
13
|
this.modelConfig = options.modelConfig;
|
|
14
14
|
this.tokenLimit = options.tokenLimit;
|
|
15
|
+
this.onUsageAdded = options.onUsageAdded;
|
|
15
16
|
}
|
|
16
17
|
/**
|
|
17
18
|
* Initialize the SubagentManager by loading and caching configurations
|
|
@@ -94,6 +95,9 @@ export class SubagentManager {
|
|
|
94
95
|
agentModel: modelToUse,
|
|
95
96
|
},
|
|
96
97
|
tokenLimit: this.tokenLimit,
|
|
98
|
+
callbacks: {
|
|
99
|
+
onUsageAdded: this.onUsageAdded,
|
|
100
|
+
},
|
|
97
101
|
});
|
|
98
102
|
const instance = {
|
|
99
103
|
subagentId,
|
|
@@ -215,7 +219,7 @@ export class SubagentManager {
|
|
|
215
219
|
status: "aborted",
|
|
216
220
|
messages: instance.messages,
|
|
217
221
|
});
|
|
218
|
-
this.logger?.
|
|
222
|
+
this.logger?.debug(`Aborted subagent instance: ${subagentId}`);
|
|
219
223
|
return true;
|
|
220
224
|
}
|
|
221
225
|
catch (error) {
|
|
@@ -29,5 +29,13 @@ export interface CompressMessagesOptions {
|
|
|
29
29
|
messages: ChatCompletionMessageParam[];
|
|
30
30
|
abortSignal?: AbortSignal;
|
|
31
31
|
}
|
|
32
|
-
export
|
|
32
|
+
export interface CompressMessagesResult {
|
|
33
|
+
content: string;
|
|
34
|
+
usage?: {
|
|
35
|
+
prompt_tokens: number;
|
|
36
|
+
completion_tokens: number;
|
|
37
|
+
total_tokens: number;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export declare function compressMessages(options: CompressMessagesOptions): Promise<CompressMessagesResult>;
|
|
33
41
|
//# sourceMappingURL=aiService.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aiService.d.ts","sourceRoot":"","sources":["../../src/services/aiService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAEL,0BAA0B,EAC1B,0BAA0B,EAC3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AA4D9D,MAAM,WAAW,gBAAgB;IAE/B,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,WAAW,CAAC;IAGzB,QAAQ,EAAE,0BAA0B,EAAE,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,0BAA0B,EAAE,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,6BAA6B,EAAE,CAAC;IAC7C,KAAK,CAAC,EAAE;QACN,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,wBAAsB,SAAS,CAC7B,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC,CA6G1B;AAED,MAAM,WAAW,uBAAuB;IAEtC,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,WAAW,CAAC;IAGzB,QAAQ,EAAE,0BAA0B,EAAE,CAAC;IACvC,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"aiService.d.ts","sourceRoot":"","sources":["../../src/services/aiService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAEL,0BAA0B,EAC1B,0BAA0B,EAC3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AA4D9D,MAAM,WAAW,gBAAgB;IAE/B,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,WAAW,CAAC;IAGzB,QAAQ,EAAE,0BAA0B,EAAE,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,0BAA0B,EAAE,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,6BAA6B,EAAE,CAAC;IAC7C,KAAK,CAAC,EAAE;QACN,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,wBAAsB,SAAS,CAC7B,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC,CA6G1B;AAED,MAAM,WAAW,uBAAuB;IAEtC,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,WAAW,CAAC;IAGzB,QAAQ,EAAE,0BAA0B,EAAE,CAAC;IACvC,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE;QACN,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,sBAAsB,CAAC,CAuGjC"}
|
|
@@ -197,14 +197,28 @@ For technical conversations, structure as:
|
|
|
197
197
|
}, {
|
|
198
198
|
signal: abortSignal,
|
|
199
199
|
});
|
|
200
|
-
|
|
201
|
-
"Failed to compress conversation history"
|
|
200
|
+
const content = response.choices[0]?.message?.content?.trim() ||
|
|
201
|
+
"Failed to compress conversation history";
|
|
202
|
+
const usage = response.usage
|
|
203
|
+
? {
|
|
204
|
+
prompt_tokens: response.usage.prompt_tokens,
|
|
205
|
+
completion_tokens: response.usage.completion_tokens,
|
|
206
|
+
total_tokens: response.usage.total_tokens,
|
|
207
|
+
}
|
|
208
|
+
: undefined;
|
|
209
|
+
return {
|
|
210
|
+
content,
|
|
211
|
+
usage,
|
|
212
|
+
};
|
|
202
213
|
}
|
|
203
214
|
catch (error) {
|
|
204
215
|
if (error.name === "AbortError") {
|
|
205
216
|
throw new Error("Compression request was aborted");
|
|
206
217
|
}
|
|
207
218
|
// // logger.error("Failed to compress messages:", error);
|
|
208
|
-
return
|
|
219
|
+
return {
|
|
220
|
+
content: "Failed to compress conversation history",
|
|
221
|
+
usage: undefined,
|
|
222
|
+
};
|
|
209
223
|
}
|
|
210
224
|
}
|
package/dist/services/memory.js
CHANGED
|
@@ -10,7 +10,7 @@ export const addMemory = async (message, workdir) => {
|
|
|
10
10
|
return;
|
|
11
11
|
}
|
|
12
12
|
try {
|
|
13
|
-
const memoryFilePath = path.join(workdir, "
|
|
13
|
+
const memoryFilePath = path.join(workdir, "AGENTS.md");
|
|
14
14
|
// Format memory entry, starting with -, no timestamp
|
|
15
15
|
const memoryEntry = `- ${message.substring(1).trim()}\n`;
|
|
16
16
|
// Check if file exists
|
|
@@ -32,7 +32,7 @@ export const addMemory = async (message, workdir) => {
|
|
|
32
32
|
const updatedContent = existingContent + memoryEntry;
|
|
33
33
|
// Write file
|
|
34
34
|
await fs.writeFile(memoryFilePath, updatedContent, "utf-8");
|
|
35
|
-
// logger.
|
|
35
|
+
// logger.debug(`Memory added to ${memoryFilePath}:`, message);
|
|
36
36
|
}
|
|
37
37
|
catch (error) {
|
|
38
38
|
// logger.error("Failed to add memory:", error);
|
|
@@ -53,7 +53,7 @@ export const ensureUserMemoryFile = async () => {
|
|
|
53
53
|
if (error.code === "ENOENT") {
|
|
54
54
|
const initialContent = "# User Memory\n\nThis is the user-level memory file, recording important information and context across projects.\n\n";
|
|
55
55
|
await fs.writeFile(USER_MEMORY_FILE, initialContent, "utf-8");
|
|
56
|
-
// logger.
|
|
56
|
+
// logger.debug(`Created user memory file: ${USER_MEMORY_FILE}`);
|
|
57
57
|
}
|
|
58
58
|
else {
|
|
59
59
|
throw error;
|
|
@@ -77,7 +77,7 @@ export const addUserMemory = async (message) => {
|
|
|
77
77
|
const updatedContent = existingContent + memoryEntry;
|
|
78
78
|
// Write file
|
|
79
79
|
await fs.writeFile(USER_MEMORY_FILE, updatedContent, "utf-8");
|
|
80
|
-
// logger.
|
|
80
|
+
// logger.debug(`User memory added to ${USER_MEMORY_FILE}:`, message);
|
|
81
81
|
}
|
|
82
82
|
catch (error) {
|
|
83
83
|
// logger.error("Failed to add user memory:", error);
|
|
@@ -97,7 +97,7 @@ export const getUserMemoryContent = async () => {
|
|
|
97
97
|
// Read project memory file content
|
|
98
98
|
export const readMemoryFile = async (workdir) => {
|
|
99
99
|
try {
|
|
100
|
-
const memoryFilePath = path.join(workdir, "
|
|
100
|
+
const memoryFilePath = path.join(workdir, "AGENTS.md");
|
|
101
101
|
return await fs.readFile(memoryFilePath, "utf-8");
|
|
102
102
|
}
|
|
103
103
|
catch (error) {
|
|
@@ -19,36 +19,85 @@ export interface SessionMetadata {
|
|
|
19
19
|
lastActiveAt: string;
|
|
20
20
|
latestTotalTokens: number;
|
|
21
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Resolve session directory path with fallback to default
|
|
24
|
+
* @param sessionDir Optional custom session directory
|
|
25
|
+
* @returns Resolved session directory path
|
|
26
|
+
*/
|
|
27
|
+
export declare function resolveSessionDir(sessionDir?: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* Ensure session directory exists
|
|
30
|
+
* @param sessionDir Optional custom session directory
|
|
31
|
+
*/
|
|
32
|
+
export declare function ensureSessionDir(sessionDir?: string): Promise<void>;
|
|
22
33
|
/**
|
|
23
34
|
* Generate session file path
|
|
24
35
|
*/
|
|
25
|
-
export declare function getSessionFilePath(sessionId: string): string;
|
|
36
|
+
export declare function getSessionFilePath(sessionId: string, sessionDir?: string): string;
|
|
26
37
|
/**
|
|
27
|
-
* Save session data
|
|
38
|
+
* Save session data to storage
|
|
39
|
+
*
|
|
40
|
+
* @param sessionId - Unique identifier for the session
|
|
41
|
+
* @param messages - Array of messages to save
|
|
42
|
+
* @param workdir - Working directory for the session
|
|
43
|
+
* @param latestTotalTokens - Total tokens used in the session
|
|
44
|
+
* @param startedAt - ISO timestamp when session started (defaults to current time)
|
|
45
|
+
* @param sessionDir - Optional custom directory for session storage (defaults to ~/.wave/sessions/)
|
|
46
|
+
* @throws {Error} When session cannot be saved due to permission or disk space issues
|
|
28
47
|
*/
|
|
29
|
-
export declare function saveSession(sessionId: string, messages: Message[], workdir: string, latestTotalTokens?: number, startedAt?: string): Promise<void>;
|
|
48
|
+
export declare function saveSession(sessionId: string, messages: Message[], workdir: string, latestTotalTokens?: number, startedAt?: string, sessionDir?: string): Promise<void>;
|
|
30
49
|
/**
|
|
31
|
-
* Load session data
|
|
50
|
+
* Load session data from storage
|
|
51
|
+
*
|
|
52
|
+
* @param sessionId - Unique identifier for the session to load
|
|
53
|
+
* @param sessionDir - Optional custom directory for session storage (defaults to ~/.wave/sessions/)
|
|
54
|
+
* @returns Promise that resolves to session data or null if session doesn't exist
|
|
55
|
+
* @throws {Error} When session exists but cannot be read or contains invalid data
|
|
32
56
|
*/
|
|
33
|
-
export declare function loadSession(sessionId: string): Promise<SessionData | null>;
|
|
57
|
+
export declare function loadSession(sessionId: string, sessionDir?: string): Promise<SessionData | null>;
|
|
34
58
|
/**
|
|
35
|
-
* Get most recent session
|
|
59
|
+
* Get the most recent session for a specific working directory
|
|
60
|
+
*
|
|
61
|
+
* @param workdir - Working directory to find the most recent session for
|
|
62
|
+
* @param sessionDir - Optional custom directory for session storage (defaults to ~/.wave/sessions/)
|
|
63
|
+
* @returns Promise that resolves to the most recent session data or null if no sessions exist
|
|
64
|
+
* @throws {Error} When session directory cannot be accessed or session data is corrupted
|
|
36
65
|
*/
|
|
37
|
-
export declare function getLatestSession(workdir: string): Promise<SessionData | null>;
|
|
66
|
+
export declare function getLatestSession(workdir: string, sessionDir?: string): Promise<SessionData | null>;
|
|
38
67
|
/**
|
|
39
|
-
* List all sessions
|
|
68
|
+
* List all sessions for a specific working directory or across all working directories
|
|
69
|
+
*
|
|
70
|
+
* @param workdir - Working directory to filter sessions by
|
|
71
|
+
* @param includeAllWorkdirs - If true, returns sessions from all working directories
|
|
72
|
+
* @param sessionDir - Optional custom directory for session storage (defaults to ~/.wave/sessions/)
|
|
73
|
+
* @returns Promise that resolves to array of session metadata objects
|
|
74
|
+
* @throws {Error} When session directory cannot be accessed or read
|
|
40
75
|
*/
|
|
41
|
-
export declare function listSessions(workdir: string, includeAllWorkdirs?: boolean): Promise<SessionMetadata[]>;
|
|
76
|
+
export declare function listSessions(workdir: string, includeAllWorkdirs?: boolean, sessionDir?: string): Promise<SessionMetadata[]>;
|
|
42
77
|
/**
|
|
43
|
-
* Delete session
|
|
78
|
+
* Delete a session from storage
|
|
79
|
+
*
|
|
80
|
+
* @param sessionId - Unique identifier for the session to delete
|
|
81
|
+
* @param sessionDir - Optional custom directory for session storage (defaults to ~/.wave/sessions/)
|
|
82
|
+
* @returns Promise that resolves to true if session was deleted, false if it didn't exist
|
|
83
|
+
* @throws {Error} When session exists but cannot be deleted due to permission issues
|
|
44
84
|
*/
|
|
45
|
-
export declare function deleteSession(sessionId: string): Promise<boolean>;
|
|
85
|
+
export declare function deleteSession(sessionId: string, sessionDir?: string): Promise<boolean>;
|
|
46
86
|
/**
|
|
47
|
-
* Clean up expired sessions
|
|
87
|
+
* Clean up expired sessions older than the configured maximum age
|
|
88
|
+
*
|
|
89
|
+
* @param workdir - Working directory to clean up sessions for
|
|
90
|
+
* @param sessionDir - Optional custom directory for session storage (defaults to ~/.wave/sessions/)
|
|
91
|
+
* @returns Promise that resolves to the number of sessions that were deleted
|
|
92
|
+
* @throws {Error} When session directory cannot be accessed or sessions cannot be deleted
|
|
48
93
|
*/
|
|
49
|
-
export declare function cleanupExpiredSessions(workdir: string): Promise<number>;
|
|
94
|
+
export declare function cleanupExpiredSessions(workdir: string, sessionDir?: string): Promise<number>;
|
|
50
95
|
/**
|
|
51
|
-
* Check if session exists
|
|
96
|
+
* Check if a session exists in storage
|
|
97
|
+
*
|
|
98
|
+
* @param sessionId - Unique identifier for the session to check
|
|
99
|
+
* @param sessionDir - Optional custom directory for session storage (defaults to ~/.wave/sessions/)
|
|
100
|
+
* @returns Promise that resolves to true if session exists, false otherwise
|
|
52
101
|
*/
|
|
53
|
-
export declare function sessionExists(sessionId: string): Promise<boolean>;
|
|
102
|
+
export declare function sessionExists(sessionId: string, sessionDir?: string): Promise<boolean>;
|
|
54
103
|
//# sourceMappingURL=session.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/services/session.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,QAAQ,EAAE;QACR,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/services/session.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,QAAQ,EAAE;QACR,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAOD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOzE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,CAIR;AAcD;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE,MAAM,EACf,iBAAiB,GAAE,MAAU,EAC7B,SAAS,CAAC,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAoCf;AAED;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAmB7B;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAa7B;AAED;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,kBAAkB,UAAQ,EAC1B,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,eAAe,EAAE,CAAC,CA4C5B;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CAYlB;AAED;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CA4BjB;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CASlB"}
|
package/dist/services/session.js
CHANGED
|
@@ -5,12 +5,22 @@ import { homedir } from "os";
|
|
|
5
5
|
const SESSION_DIR = join(homedir(), ".wave", "sessions");
|
|
6
6
|
const VERSION = "1.0.0";
|
|
7
7
|
const MAX_SESSION_AGE_DAYS = 30;
|
|
8
|
+
/**
|
|
9
|
+
* Resolve session directory path with fallback to default
|
|
10
|
+
* @param sessionDir Optional custom session directory
|
|
11
|
+
* @returns Resolved session directory path
|
|
12
|
+
*/
|
|
13
|
+
export function resolveSessionDir(sessionDir) {
|
|
14
|
+
return sessionDir || SESSION_DIR;
|
|
15
|
+
}
|
|
8
16
|
/**
|
|
9
17
|
* Ensure session directory exists
|
|
18
|
+
* @param sessionDir Optional custom session directory
|
|
10
19
|
*/
|
|
11
|
-
async function ensureSessionDir() {
|
|
20
|
+
export async function ensureSessionDir(sessionDir) {
|
|
21
|
+
const resolvedDir = resolveSessionDir(sessionDir);
|
|
12
22
|
try {
|
|
13
|
-
await fs.mkdir(
|
|
23
|
+
await fs.mkdir(resolvedDir, { recursive: true });
|
|
14
24
|
}
|
|
15
25
|
catch (error) {
|
|
16
26
|
throw new Error(`Failed to create session directory: ${error}`);
|
|
@@ -19,9 +29,10 @@ async function ensureSessionDir() {
|
|
|
19
29
|
/**
|
|
20
30
|
* Generate session file path
|
|
21
31
|
*/
|
|
22
|
-
export function getSessionFilePath(sessionId) {
|
|
32
|
+
export function getSessionFilePath(sessionId, sessionDir) {
|
|
23
33
|
const shortId = sessionId.split("_")[2] || sessionId.slice(-8);
|
|
24
|
-
|
|
34
|
+
const resolvedDir = resolveSessionDir(sessionDir);
|
|
35
|
+
return join(resolvedDir, `session_${shortId}.json`);
|
|
25
36
|
}
|
|
26
37
|
/**
|
|
27
38
|
* Filter out diff blocks from messages to avoid saving unimportant data
|
|
@@ -35,9 +46,17 @@ function filterDiffBlocks(messages) {
|
|
|
35
46
|
.filter((message) => message.blocks.length > 0);
|
|
36
47
|
}
|
|
37
48
|
/**
|
|
38
|
-
* Save session data
|
|
49
|
+
* Save session data to storage
|
|
50
|
+
*
|
|
51
|
+
* @param sessionId - Unique identifier for the session
|
|
52
|
+
* @param messages - Array of messages to save
|
|
53
|
+
* @param workdir - Working directory for the session
|
|
54
|
+
* @param latestTotalTokens - Total tokens used in the session
|
|
55
|
+
* @param startedAt - ISO timestamp when session started (defaults to current time)
|
|
56
|
+
* @param sessionDir - Optional custom directory for session storage (defaults to ~/.wave/sessions/)
|
|
57
|
+
* @throws {Error} When session cannot be saved due to permission or disk space issues
|
|
39
58
|
*/
|
|
40
|
-
export async function saveSession(sessionId, messages, workdir, latestTotalTokens = 0, startedAt) {
|
|
59
|
+
export async function saveSession(sessionId, messages, workdir, latestTotalTokens = 0, startedAt, sessionDir) {
|
|
41
60
|
// Do not save session files in test environment
|
|
42
61
|
if (process.env.NODE_ENV === "test") {
|
|
43
62
|
return;
|
|
@@ -46,7 +65,7 @@ export async function saveSession(sessionId, messages, workdir, latestTotalToken
|
|
|
46
65
|
if (messages.length === 0) {
|
|
47
66
|
return;
|
|
48
67
|
}
|
|
49
|
-
await ensureSessionDir();
|
|
68
|
+
await ensureSessionDir(sessionDir);
|
|
50
69
|
// Filter out diff blocks before saving
|
|
51
70
|
const filteredMessages = filterDiffBlocks(messages);
|
|
52
71
|
const now = new Date().toISOString();
|
|
@@ -62,7 +81,7 @@ export async function saveSession(sessionId, messages, workdir, latestTotalToken
|
|
|
62
81
|
latestTotalTokens,
|
|
63
82
|
},
|
|
64
83
|
};
|
|
65
|
-
const filePath = getSessionFilePath(sessionId);
|
|
84
|
+
const filePath = getSessionFilePath(sessionId, sessionDir);
|
|
66
85
|
try {
|
|
67
86
|
await fs.writeFile(filePath, JSON.stringify(sessionData, null, 2), "utf-8");
|
|
68
87
|
}
|
|
@@ -71,10 +90,15 @@ export async function saveSession(sessionId, messages, workdir, latestTotalToken
|
|
|
71
90
|
}
|
|
72
91
|
}
|
|
73
92
|
/**
|
|
74
|
-
* Load session data
|
|
93
|
+
* Load session data from storage
|
|
94
|
+
*
|
|
95
|
+
* @param sessionId - Unique identifier for the session to load
|
|
96
|
+
* @param sessionDir - Optional custom directory for session storage (defaults to ~/.wave/sessions/)
|
|
97
|
+
* @returns Promise that resolves to session data or null if session doesn't exist
|
|
98
|
+
* @throws {Error} When session exists but cannot be read or contains invalid data
|
|
75
99
|
*/
|
|
76
|
-
export async function loadSession(sessionId) {
|
|
77
|
-
const filePath = getSessionFilePath(sessionId);
|
|
100
|
+
export async function loadSession(sessionId, sessionDir) {
|
|
101
|
+
const filePath = getSessionFilePath(sessionId, sessionDir);
|
|
78
102
|
try {
|
|
79
103
|
const content = await fs.readFile(filePath, "utf-8");
|
|
80
104
|
const sessionData = JSON.parse(content);
|
|
@@ -92,31 +116,43 @@ export async function loadSession(sessionId) {
|
|
|
92
116
|
}
|
|
93
117
|
}
|
|
94
118
|
/**
|
|
95
|
-
* Get most recent session
|
|
119
|
+
* Get the most recent session for a specific working directory
|
|
120
|
+
*
|
|
121
|
+
* @param workdir - Working directory to find the most recent session for
|
|
122
|
+
* @param sessionDir - Optional custom directory for session storage (defaults to ~/.wave/sessions/)
|
|
123
|
+
* @returns Promise that resolves to the most recent session data or null if no sessions exist
|
|
124
|
+
* @throws {Error} When session directory cannot be accessed or session data is corrupted
|
|
96
125
|
*/
|
|
97
|
-
export async function getLatestSession(workdir) {
|
|
98
|
-
const sessions = await listSessions(workdir);
|
|
126
|
+
export async function getLatestSession(workdir, sessionDir) {
|
|
127
|
+
const sessions = await listSessions(workdir, false, sessionDir);
|
|
99
128
|
if (sessions.length === 0) {
|
|
100
129
|
return null;
|
|
101
130
|
}
|
|
102
131
|
// Sort by last active time, return the latest
|
|
103
132
|
const latestSession = sessions.sort((a, b) => new Date(b.lastActiveAt).getTime() - new Date(a.lastActiveAt).getTime())[0];
|
|
104
|
-
return loadSession(latestSession.id);
|
|
133
|
+
return loadSession(latestSession.id, sessionDir);
|
|
105
134
|
}
|
|
106
135
|
/**
|
|
107
|
-
* List all sessions
|
|
136
|
+
* List all sessions for a specific working directory or across all working directories
|
|
137
|
+
*
|
|
138
|
+
* @param workdir - Working directory to filter sessions by
|
|
139
|
+
* @param includeAllWorkdirs - If true, returns sessions from all working directories
|
|
140
|
+
* @param sessionDir - Optional custom directory for session storage (defaults to ~/.wave/sessions/)
|
|
141
|
+
* @returns Promise that resolves to array of session metadata objects
|
|
142
|
+
* @throws {Error} When session directory cannot be accessed or read
|
|
108
143
|
*/
|
|
109
|
-
export async function listSessions(workdir, includeAllWorkdirs = false) {
|
|
144
|
+
export async function listSessions(workdir, includeAllWorkdirs = false, sessionDir) {
|
|
110
145
|
try {
|
|
111
|
-
await ensureSessionDir();
|
|
112
|
-
const
|
|
146
|
+
await ensureSessionDir(sessionDir);
|
|
147
|
+
const resolvedDir = resolveSessionDir(sessionDir);
|
|
148
|
+
const files = await fs.readdir(resolvedDir);
|
|
113
149
|
const sessions = [];
|
|
114
150
|
for (const file of files) {
|
|
115
151
|
if (!file.startsWith("session_") || !file.endsWith(".json")) {
|
|
116
152
|
continue;
|
|
117
153
|
}
|
|
118
154
|
try {
|
|
119
|
-
const filePath = join(
|
|
155
|
+
const filePath = join(resolvedDir, file);
|
|
120
156
|
const content = await fs.readFile(filePath, "utf-8");
|
|
121
157
|
const sessionData = JSON.parse(content);
|
|
122
158
|
// Only return sessions for the current working directory, unless includeAllWorkdirs is true
|
|
@@ -144,10 +180,15 @@ export async function listSessions(workdir, includeAllWorkdirs = false) {
|
|
|
144
180
|
}
|
|
145
181
|
}
|
|
146
182
|
/**
|
|
147
|
-
* Delete session
|
|
183
|
+
* Delete a session from storage
|
|
184
|
+
*
|
|
185
|
+
* @param sessionId - Unique identifier for the session to delete
|
|
186
|
+
* @param sessionDir - Optional custom directory for session storage (defaults to ~/.wave/sessions/)
|
|
187
|
+
* @returns Promise that resolves to true if session was deleted, false if it didn't exist
|
|
188
|
+
* @throws {Error} When session exists but cannot be deleted due to permission issues
|
|
148
189
|
*/
|
|
149
|
-
export async function deleteSession(sessionId) {
|
|
150
|
-
const filePath = getSessionFilePath(sessionId);
|
|
190
|
+
export async function deleteSession(sessionId, sessionDir) {
|
|
191
|
+
const filePath = getSessionFilePath(sessionId, sessionDir);
|
|
151
192
|
try {
|
|
152
193
|
await fs.unlink(filePath);
|
|
153
194
|
return true;
|
|
@@ -160,14 +201,19 @@ export async function deleteSession(sessionId) {
|
|
|
160
201
|
}
|
|
161
202
|
}
|
|
162
203
|
/**
|
|
163
|
-
* Clean up expired sessions
|
|
204
|
+
* Clean up expired sessions older than the configured maximum age
|
|
205
|
+
*
|
|
206
|
+
* @param workdir - Working directory to clean up sessions for
|
|
207
|
+
* @param sessionDir - Optional custom directory for session storage (defaults to ~/.wave/sessions/)
|
|
208
|
+
* @returns Promise that resolves to the number of sessions that were deleted
|
|
209
|
+
* @throws {Error} When session directory cannot be accessed or sessions cannot be deleted
|
|
164
210
|
*/
|
|
165
|
-
export async function cleanupExpiredSessions(workdir) {
|
|
211
|
+
export async function cleanupExpiredSessions(workdir, sessionDir) {
|
|
166
212
|
// Do not perform cleanup operations in test environment
|
|
167
213
|
if (process.env.NODE_ENV === "test") {
|
|
168
214
|
return 0;
|
|
169
215
|
}
|
|
170
|
-
const sessions = await listSessions(workdir, true);
|
|
216
|
+
const sessions = await listSessions(workdir, true, sessionDir);
|
|
171
217
|
const now = new Date();
|
|
172
218
|
const maxAge = MAX_SESSION_AGE_DAYS * 24 * 60 * 60 * 1000; // Convert to milliseconds
|
|
173
219
|
let deletedCount = 0;
|
|
@@ -175,7 +221,7 @@ export async function cleanupExpiredSessions(workdir) {
|
|
|
175
221
|
const sessionAge = now.getTime() - new Date(session.lastActiveAt).getTime();
|
|
176
222
|
if (sessionAge > maxAge) {
|
|
177
223
|
try {
|
|
178
|
-
await deleteSession(session.id);
|
|
224
|
+
await deleteSession(session.id, sessionDir);
|
|
179
225
|
deletedCount++;
|
|
180
226
|
}
|
|
181
227
|
catch (error) {
|
|
@@ -186,10 +232,14 @@ export async function cleanupExpiredSessions(workdir) {
|
|
|
186
232
|
return deletedCount;
|
|
187
233
|
}
|
|
188
234
|
/**
|
|
189
|
-
* Check if session exists
|
|
235
|
+
* Check if a session exists in storage
|
|
236
|
+
*
|
|
237
|
+
* @param sessionId - Unique identifier for the session to check
|
|
238
|
+
* @param sessionDir - Optional custom directory for session storage (defaults to ~/.wave/sessions/)
|
|
239
|
+
* @returns Promise that resolves to true if session exists, false otherwise
|
|
190
240
|
*/
|
|
191
|
-
export async function sessionExists(sessionId) {
|
|
192
|
-
const filePath = getSessionFilePath(sessionId);
|
|
241
|
+
export async function sessionExists(sessionId, sessionDir) {
|
|
242
|
+
const filePath = getSessionFilePath(sessionId, sessionDir);
|
|
193
243
|
try {
|
|
194
244
|
await fs.access(filePath);
|
|
195
245
|
return true;
|
package/dist/tools/bashTool.js
CHANGED
|
@@ -36,9 +36,9 @@ export const bashTool = {
|
|
|
36
36
|
execute: async (args, context) => {
|
|
37
37
|
const command = args.command;
|
|
38
38
|
const runInBackground = args.run_in_background;
|
|
39
|
-
// Set default timeout:
|
|
39
|
+
// Set default timeout: 60s for foreground, no timeout for background
|
|
40
40
|
const timeout = args.timeout ??
|
|
41
|
-
(runInBackground ? undefined :
|
|
41
|
+
(runInBackground ? undefined : 60000);
|
|
42
42
|
if (!command || typeof command !== "string") {
|
|
43
43
|
return {
|
|
44
44
|
success: false,
|
|
@@ -38,7 +38,7 @@ export const deleteFileTool = {
|
|
|
38
38
|
const filePath = resolvePath(targetFile, context.workdir);
|
|
39
39
|
// Delete file
|
|
40
40
|
await unlink(filePath);
|
|
41
|
-
// logger.
|
|
41
|
+
// logger.debug(`Successfully deleted file: ${filePath}`);
|
|
42
42
|
return {
|
|
43
43
|
success: true,
|
|
44
44
|
content: `Successfully deleted file: ${targetFile}`,
|
package/dist/tools/editTool.js
CHANGED
|
@@ -138,7 +138,7 @@ export const editTool = {
|
|
|
138
138
|
const shortResult = replaceAll
|
|
139
139
|
? `Replaced ${replacementCount} instances`
|
|
140
140
|
: "Text replaced successfully";
|
|
141
|
-
// logger.
|
|
141
|
+
// logger.debug(`Edit tool: ${shortResult}`);
|
|
142
142
|
return {
|
|
143
143
|
success: true,
|
|
144
144
|
content: shortResult,
|
|
@@ -123,7 +123,7 @@ export const multiEditTool = {
|
|
|
123
123
|
if (edits[0] && edits[0].old_string === "") {
|
|
124
124
|
originalContent = "";
|
|
125
125
|
isNewFile = true;
|
|
126
|
-
// logger.
|
|
126
|
+
// logger.debug(`Creating new file: ${resolvedPath}`);
|
|
127
127
|
}
|
|
128
128
|
else {
|
|
129
129
|
return {
|
|
@@ -192,7 +192,7 @@ export const multiEditTool = {
|
|
|
192
192
|
? `Created file with ${edits.length} operations`
|
|
193
193
|
: `Applied ${edits.length} edits`;
|
|
194
194
|
const detailedContent = `${shortResult}\n\nOperations performed:\n${appliedEdits.map((edit, i) => `${i + 1}. ${edit}`).join("\n")}`;
|
|
195
|
-
// logger.
|
|
195
|
+
// logger.debug(`MultiEdit tool: ${shortResult}`);
|
|
196
196
|
return {
|
|
197
197
|
success: true,
|
|
198
198
|
content: detailedContent,
|
package/dist/tools/writeTool.js
CHANGED
|
@@ -103,7 +103,7 @@ export const writeTool = {
|
|
|
103
103
|
const lines = content.split("\n").length;
|
|
104
104
|
const chars = content.length;
|
|
105
105
|
const detailedContent = `${shortResult} (${lines} lines, ${chars} characters)`;
|
|
106
|
-
// logger.
|
|
106
|
+
// logger.debug(`Write tool: ${shortResult}`);
|
|
107
107
|
return {
|
|
108
108
|
success: true,
|
|
109
109
|
content: detailedContent,
|
package/dist/types.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ export interface Logger {
|
|
|
12
12
|
export interface Message {
|
|
13
13
|
role: "user" | "assistant";
|
|
14
14
|
blocks: MessageBlock[];
|
|
15
|
+
usage?: Usage;
|
|
15
16
|
}
|
|
16
17
|
export type MessageBlock = TextBlock | ErrorBlock | ToolBlock | ImageBlock | DiffBlock | CommandOutputBlock | CompressBlock | MemoryBlock | CustomCommandBlock | SubagentBlock;
|
|
17
18
|
export interface TextBlock {
|
|
@@ -266,6 +267,17 @@ export declare class ConfigurationError extends Error {
|
|
|
266
267
|
readonly provided?: unknown | undefined;
|
|
267
268
|
constructor(message: string, field: string, provided?: unknown | undefined);
|
|
268
269
|
}
|
|
270
|
+
/**
|
|
271
|
+
* Usage statistics for AI operations
|
|
272
|
+
* Extends OpenAI's Usage format with additional tracking fields
|
|
273
|
+
*/
|
|
274
|
+
export interface Usage {
|
|
275
|
+
prompt_tokens: number;
|
|
276
|
+
completion_tokens: number;
|
|
277
|
+
total_tokens: number;
|
|
278
|
+
model?: string;
|
|
279
|
+
operation_type?: "agent" | "compress";
|
|
280
|
+
}
|
|
269
281
|
export declare const CONFIG_ERRORS: {
|
|
270
282
|
readonly MISSING_API_KEY: "Gateway configuration requires apiKey. Provide via constructor or AIGW_TOKEN environment variable.";
|
|
271
283
|
readonly MISSING_BASE_URL: "Gateway configuration requires baseURL. Provide via constructor or AIGW_URL environment variable.";
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD;;;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,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,MAAM,EAAE,YAAY,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Message } from "../types.js";
|
|
1
|
+
import type { Message, Usage } from "../types.js";
|
|
2
2
|
import { ChatCompletionMessageFunctionToolCall } from "openai/resources.js";
|
|
3
3
|
export interface AddUserMessageParams {
|
|
4
4
|
messages: Message[];
|
|
@@ -86,7 +86,7 @@ export declare const extractUserInputHistory: (messages: Message[]) => string[];
|
|
|
86
86
|
*/
|
|
87
87
|
export declare const convertImageToBase64: (imagePath: string) => string;
|
|
88
88
|
export declare const addUserMessageToMessages: ({ messages, content, images, customCommandBlock, }: AddUserMessageParams) => Message[];
|
|
89
|
-
export declare const addAssistantMessageToMessages: (messages: Message[], content?: string, toolCalls?: ChatCompletionMessageFunctionToolCall[]) => Message[];
|
|
89
|
+
export declare const addAssistantMessageToMessages: (messages: Message[], content?: string, toolCalls?: ChatCompletionMessageFunctionToolCall[], usage?: Usage) => Message[];
|
|
90
90
|
export declare const addDiffBlockToMessage: ({ messages, path, diffResult, }: AddDiffBlockParams) => Message[];
|
|
91
91
|
export declare const updateToolBlockInMessage: ({ messages, id, parameters, result, success, error, isRunning, name, shortResult, images, compactParams, }: UpdateToolBlockParams) => Message[];
|
|
92
92
|
export declare const addErrorBlockToMessage: ({ messages, error, }: AddErrorBlockParams) => Message[];
|