wave-agent-sdk 0.5.0 → 0.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent.d.ts +14 -11
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +64 -151
- package/dist/constants/subagents.d.ts +5 -0
- package/dist/constants/subagents.d.ts.map +1 -0
- package/dist/constants/subagents.js +4 -0
- package/dist/constants/tools.d.ts +4 -1
- package/dist/constants/tools.d.ts.map +1 -1
- package/dist/constants/tools.js +4 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/managers/aiManager.d.ts +2 -5
- package/dist/managers/aiManager.d.ts.map +1 -1
- package/dist/managers/aiManager.js +43 -48
- package/dist/managers/backgroundTaskManager.d.ts.map +1 -1
- package/dist/managers/backgroundTaskManager.js +63 -53
- package/dist/managers/foregroundTaskManager.d.ts.map +1 -1
- package/dist/managers/foregroundTaskManager.js +3 -2
- package/dist/managers/mcpManager.d.ts.map +1 -1
- package/dist/managers/messageManager.d.ts +13 -27
- package/dist/managers/messageManager.d.ts.map +1 -1
- package/dist/managers/messageManager.js +94 -89
- package/dist/managers/permissionManager.d.ts.map +1 -1
- package/dist/managers/permissionManager.js +25 -15
- package/dist/managers/planManager.d.ts +1 -1
- package/dist/managers/planManager.d.ts.map +1 -1
- package/dist/managers/planManager.js +2 -2
- package/dist/managers/reversionManager.d.ts.map +1 -1
- package/dist/managers/reversionManager.js +23 -2
- package/dist/managers/slashCommandManager.d.ts +3 -0
- package/dist/managers/slashCommandManager.d.ts.map +1 -1
- package/dist/managers/slashCommandManager.js +8 -3
- package/dist/managers/subagentManager.d.ts +8 -14
- package/dist/managers/subagentManager.d.ts.map +1 -1
- package/dist/managers/subagentManager.js +46 -112
- package/dist/managers/toolManager.d.ts +11 -0
- package/dist/managers/toolManager.d.ts.map +1 -1
- package/dist/managers/toolManager.js +20 -2
- package/dist/{constants/prompts.d.ts → prompts/index.d.ts} +17 -15
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +309 -0
- package/dist/services/aiService.d.ts +0 -1
- package/dist/services/aiService.d.ts.map +1 -1
- package/dist/services/aiService.js +4 -140
- package/dist/services/memory.d.ts +0 -3
- package/dist/services/memory.d.ts.map +1 -1
- package/dist/services/memory.js +0 -59
- package/dist/services/session.d.ts +15 -1
- package/dist/services/session.d.ts.map +1 -1
- package/dist/services/session.js +57 -1
- package/dist/services/taskManager.d.ts +25 -0
- package/dist/services/taskManager.d.ts.map +1 -0
- package/dist/services/taskManager.js +164 -0
- package/dist/tools/askUserQuestion.d.ts.map +1 -1
- package/dist/tools/askUserQuestion.js +39 -25
- package/dist/tools/bashTool.d.ts.map +1 -1
- package/dist/tools/bashTool.js +13 -11
- package/dist/tools/editTool.d.ts.map +1 -1
- package/dist/tools/editTool.js +2 -1
- package/dist/tools/exitPlanMode.d.ts.map +1 -1
- package/dist/tools/exitPlanMode.js +26 -2
- package/dist/tools/globTool.d.ts.map +1 -1
- package/dist/tools/globTool.js +8 -2
- package/dist/tools/grepTool.d.ts.map +1 -1
- package/dist/tools/grepTool.js +17 -6
- package/dist/tools/lsTool.d.ts.map +1 -1
- package/dist/tools/lsTool.js +3 -1
- package/dist/tools/readTool.d.ts.map +1 -1
- package/dist/tools/readTool.js +16 -1
- package/dist/tools/taskManagementTools.d.ts +6 -0
- package/dist/tools/taskManagementTools.d.ts.map +1 -0
- package/dist/tools/taskManagementTools.js +461 -0
- package/dist/tools/taskOutputTool.d.ts.map +1 -1
- package/dist/tools/taskOutputTool.js +32 -8
- package/dist/tools/taskStopTool.d.ts.map +1 -1
- package/dist/tools/taskStopTool.js +7 -1
- package/dist/tools/taskTool.d.ts.map +1 -1
- package/dist/tools/taskTool.js +37 -2
- package/dist/tools/types.d.ts +11 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/writeTool.d.ts.map +1 -1
- package/dist/tools/writeTool.js +9 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/messaging.d.ts +2 -18
- package/dist/types/messaging.d.ts.map +1 -1
- package/dist/types/processes.d.ts +16 -6
- package/dist/types/processes.d.ts.map +1 -1
- package/dist/types/tasks.d.ts +13 -0
- package/dist/types/tasks.d.ts.map +1 -0
- package/dist/types/tasks.js +1 -0
- package/dist/types/tools.d.ts +4 -1
- package/dist/types/tools.d.ts.map +1 -1
- package/dist/utils/builtinSubagents.d.ts.map +1 -1
- package/dist/utils/builtinSubagents.js +59 -44
- package/dist/utils/cacheControlUtils.d.ts.map +1 -1
- package/dist/utils/cacheControlUtils.js +18 -12
- package/dist/utils/constants.d.ts +0 -4
- package/dist/utils/constants.d.ts.map +1 -1
- package/dist/utils/constants.js +0 -4
- package/dist/utils/convertMessagesForAPI.js +2 -2
- package/dist/utils/editUtils.d.ts.map +1 -1
- package/dist/utils/editUtils.js +2 -2
- package/dist/utils/gitUtils.d.ts +7 -0
- package/dist/utils/gitUtils.d.ts.map +1 -0
- package/dist/utils/gitUtils.js +24 -0
- package/dist/utils/messageOperations.d.ts +3 -58
- package/dist/utils/messageOperations.d.ts.map +1 -1
- package/dist/utils/messageOperations.js +4 -146
- package/dist/utils/nameGenerator.d.ts +1 -1
- package/dist/utils/nameGenerator.d.ts.map +1 -1
- package/dist/utils/nameGenerator.js +19 -3
- package/package.json +1 -1
- package/src/agent.ts +86 -183
- package/src/constants/subagents.ts +4 -0
- package/src/constants/tools.ts +4 -1
- package/src/index.ts +1 -0
- package/src/managers/aiManager.ts +63 -70
- package/src/managers/backgroundTaskManager.ts +58 -54
- package/src/managers/foregroundTaskManager.ts +3 -2
- package/src/managers/mcpManager.ts +6 -3
- package/src/managers/messageManager.ts +126 -142
- package/src/managers/permissionManager.ts +32 -21
- package/src/managers/planManager.ts +2 -2
- package/src/managers/reversionManager.ts +26 -2
- package/src/managers/slashCommandManager.ts +12 -3
- package/src/managers/subagentManager.ts +60 -144
- package/src/managers/toolManager.ts +32 -2
- package/src/prompts/index.ts +366 -0
- package/src/services/aiService.ts +3 -145
- package/src/services/memory.ts +0 -72
- package/src/services/session.ts +73 -0
- package/src/services/taskManager.ts +195 -0
- package/src/tools/askUserQuestion.ts +51 -29
- package/src/tools/bashTool.ts +15 -17
- package/src/tools/editTool.ts +3 -1
- package/src/tools/exitPlanMode.ts +27 -3
- package/src/tools/globTool.ts +10 -2
- package/src/tools/grepTool.ts +17 -6
- package/src/tools/lsTool.ts +3 -1
- package/src/tools/readTool.ts +17 -1
- package/src/tools/taskManagementTools.ts +516 -0
- package/src/tools/taskOutputTool.ts +34 -12
- package/src/tools/taskStopTool.ts +7 -1
- package/src/tools/taskTool.ts +45 -1
- package/src/tools/types.ts +12 -0
- package/src/tools/writeTool.ts +9 -2
- package/src/types/index.ts +1 -0
- package/src/types/messaging.ts +1 -21
- package/src/types/processes.ts +18 -7
- package/src/types/tasks.ts +13 -0
- package/src/types/tools.ts +4 -1
- package/src/utils/builtinSubagents.ts +81 -45
- package/src/utils/cacheControlUtils.ts +26 -18
- package/src/utils/constants.ts +0 -5
- package/src/utils/convertMessagesForAPI.ts +2 -2
- package/src/utils/editUtils.ts +2 -6
- package/src/utils/gitUtils.ts +24 -0
- package/src/utils/messageOperations.ts +6 -229
- package/src/utils/nameGenerator.ts +20 -3
- package/dist/constants/prompts.d.ts.map +0 -1
- package/dist/constants/prompts.js +0 -118
- package/dist/tools/todoWriteTool.d.ts +0 -6
- package/dist/tools/todoWriteTool.d.ts.map +0 -1
- package/dist/tools/todoWriteTool.js +0 -220
- package/src/constants/prompts.ts +0 -155
- package/src/tools/todoWriteTool.ts +0 -257
|
@@ -201,25 +201,29 @@ export function transformMessagesForClaudeCache(messages, modelName) {
|
|
|
201
201
|
}
|
|
202
202
|
// Find the latest interval message index (20th, 40th, 60th, etc.)
|
|
203
203
|
const intervalMessageIndex = findIntervalMessageIndex(messages);
|
|
204
|
-
// Find
|
|
205
|
-
|
|
206
|
-
for (let i = messages.length - 1; i >= 0; i--) {
|
|
207
|
-
if (messages[i].role === "system") {
|
|
208
|
-
lastSystemIndex = i;
|
|
209
|
-
break;
|
|
210
|
-
}
|
|
211
|
-
}
|
|
204
|
+
// Find first system message index
|
|
205
|
+
const firstSystemIndex = messages.findIndex((m) => m.role === "system");
|
|
212
206
|
const result = messages.map((message, index) => {
|
|
213
207
|
// Validate message structure
|
|
214
208
|
if (!message || typeof message !== "object" || !message.role) {
|
|
215
209
|
logger.warn("Invalid message structure at index", index, ":", message);
|
|
216
210
|
return message; // Return as-is to avoid breaking the flow
|
|
217
211
|
}
|
|
218
|
-
//
|
|
219
|
-
if (message.role === "system" && index ===
|
|
212
|
+
// First system message: always cached (hardcoded)
|
|
213
|
+
if (message.role === "system" && index === firstSystemIndex) {
|
|
214
|
+
const content = message.content || "";
|
|
215
|
+
// If content is already an array, check if it already has cache control
|
|
216
|
+
if (Array.isArray(content)) {
|
|
217
|
+
const hasCacheControl = content.some((part) => part.type === "text" &&
|
|
218
|
+
part.cache_control);
|
|
219
|
+
if (hasCacheControl) {
|
|
220
|
+
return message;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
const transformedContent = addCacheControlToContent(content, true);
|
|
220
224
|
return {
|
|
221
225
|
...message,
|
|
222
|
-
content:
|
|
226
|
+
content: transformedContent,
|
|
223
227
|
};
|
|
224
228
|
}
|
|
225
229
|
// Interval-based message caching: cache message at latest interval position (sliding window)
|
|
@@ -242,9 +246,11 @@ export function transformMessagesForClaudeCache(messages, modelName) {
|
|
|
242
246
|
}
|
|
243
247
|
else {
|
|
244
248
|
// For other message types without tool calls, cache the content
|
|
249
|
+
const content = message.content || "";
|
|
250
|
+
const transformedContent = addCacheControlToContent(content, true);
|
|
245
251
|
return {
|
|
246
252
|
...message,
|
|
247
|
-
content:
|
|
253
|
+
content: transformedContent,
|
|
248
254
|
};
|
|
249
255
|
}
|
|
250
256
|
}
|
|
@@ -23,8 +23,4 @@ export declare const USER_MEMORY_FILE: string;
|
|
|
23
23
|
*/
|
|
24
24
|
export declare const DEFAULT_WAVE_MAX_INPUT_TOKENS = 96000;
|
|
25
25
|
export declare const DEFAULT_WAVE_MAX_OUTPUT_TOKENS = 8192;
|
|
26
|
-
/**
|
|
27
|
-
* Default number of messages to keep uncompressed
|
|
28
|
-
*/
|
|
29
|
-
export declare const DEFAULT_KEEP_LAST_MESSAGES_COUNT = 7;
|
|
30
26
|
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;;GAGG;AACH,eAAO,MAAM,cAAc,QAAmC,CAAC;AAE/D;;GAEG;AACH,eAAO,MAAM,mBAAmB,QAA6C,CAAC;AAE9E;;GAEG;AACH,eAAO,MAAM,mBAAmB,QAA0C,CAAC;AAE3E;;GAEG;AACH,eAAO,MAAM,gBAAgB,QAAyC,CAAC;AAEvE;;GAEG;AACH,eAAO,MAAM,6BAA6B,QAAQ,CAAC;AACnD,eAAO,MAAM,8BAA8B,OAAO,CAAC
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;;GAGG;AACH,eAAO,MAAM,cAAc,QAAmC,CAAC;AAE/D;;GAEG;AACH,eAAO,MAAM,mBAAmB,QAA6C,CAAC;AAE9E;;GAEG;AACH,eAAO,MAAM,mBAAmB,QAA0C,CAAC;AAE3E;;GAEG;AACH,eAAO,MAAM,gBAAgB,QAAyC,CAAC;AAEvE;;GAEG;AACH,eAAO,MAAM,6BAA6B,QAAQ,CAAC;AACnD,eAAO,MAAM,8BAA8B,OAAO,CAAC"}
|
package/dist/utils/constants.js
CHANGED
|
@@ -25,7 +25,3 @@ export const USER_MEMORY_FILE = path.join(DATA_DIRECTORY, "AGENTS.md");
|
|
|
25
25
|
*/
|
|
26
26
|
export const DEFAULT_WAVE_MAX_INPUT_TOKENS = 96000; // Default token limit
|
|
27
27
|
export const DEFAULT_WAVE_MAX_OUTPUT_TOKENS = 8192; // Default output token limit
|
|
28
|
-
/**
|
|
29
|
-
* Default number of messages to keep uncompressed
|
|
30
|
-
*/
|
|
31
|
-
export const DEFAULT_KEEP_LAST_MESSAGES_COUNT = 7;
|
|
@@ -41,8 +41,8 @@ export function convertMessagesForAPI(messages) {
|
|
|
41
41
|
const compressBlock = message.blocks.find((block) => block.type === "compress");
|
|
42
42
|
if (compressBlock && compressBlock.type === "compress") {
|
|
43
43
|
recentMessages.unshift({
|
|
44
|
-
role: "
|
|
45
|
-
content:
|
|
44
|
+
role: "assistant",
|
|
45
|
+
content: compressBlock.content,
|
|
46
46
|
});
|
|
47
47
|
}
|
|
48
48
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editUtils.d.ts","sourceRoot":"","sources":["../../src/utils/editUtils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,GACnB,MAAM,
|
|
1
|
+
{"version":3,"file":"editUtils.d.ts","sourceRoot":"","sources":["../../src/utils/editUtils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,GACnB,MAAM,CAoER"}
|
package/dist/utils/editUtils.js
CHANGED
|
@@ -60,8 +60,8 @@ export function analyzeEditMismatch(content, searchString) {
|
|
|
60
60
|
reportLines.push(`${lineNum.toString().padStart(4)} | ${actualLine}`);
|
|
61
61
|
}
|
|
62
62
|
else {
|
|
63
|
-
reportLines.push(`${lineNum.toString().padStart(4)} | - ${expectedLine}
|
|
64
|
-
reportLines.push(`${lineNum.toString().padStart(4)} | + ${actualLine}
|
|
63
|
+
reportLines.push(`${lineNum.toString().padStart(4)} | - ${expectedLine}`);
|
|
64
|
+
reportLines.push(`${lineNum.toString().padStart(4)} | + ${actualLine}`);
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
67
|
return reportLines.join("\n");
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitUtils.d.ts","sourceRoot":"","sources":["../../src/utils/gitUtils.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAevD"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as path from "node:path";
|
|
2
|
+
import * as fsSync from "node:fs";
|
|
3
|
+
/**
|
|
4
|
+
* Check if a directory is a git repository
|
|
5
|
+
* @param dirPath Directory path
|
|
6
|
+
* @returns "Yes" if it's a git repository, "No" otherwise
|
|
7
|
+
*/
|
|
8
|
+
export function isGitRepository(dirPath) {
|
|
9
|
+
try {
|
|
10
|
+
// Check if .git directory exists in current directory or any parent directory
|
|
11
|
+
let currentPath = path.resolve(dirPath);
|
|
12
|
+
while (currentPath !== path.dirname(currentPath)) {
|
|
13
|
+
const gitPath = path.join(currentPath, ".git");
|
|
14
|
+
if (fsSync.existsSync(gitPath)) {
|
|
15
|
+
return "Yes";
|
|
16
|
+
}
|
|
17
|
+
currentPath = path.dirname(currentPath);
|
|
18
|
+
}
|
|
19
|
+
return "No";
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return "No";
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { Message, Usage } from "../types/index.js";
|
|
2
2
|
import { MessageSource } from "../types/index.js";
|
|
3
|
-
import type { SubagentConfiguration } from "./subagentParser.js";
|
|
4
3
|
import { ChatCompletionMessageFunctionToolCall } from "openai/resources.js";
|
|
5
4
|
export interface UserMessageParams {
|
|
6
5
|
content: string;
|
|
@@ -17,7 +16,7 @@ export interface AddUserMessageParams extends UserMessageParams {
|
|
|
17
16
|
export interface UpdateToolBlockParams {
|
|
18
17
|
messages: Message[];
|
|
19
18
|
id: string;
|
|
20
|
-
parameters
|
|
19
|
+
parameters?: string;
|
|
21
20
|
result?: string;
|
|
22
21
|
success?: boolean;
|
|
23
22
|
error?: string;
|
|
@@ -37,19 +36,13 @@ export interface UpdateToolBlockParams {
|
|
|
37
36
|
}>;
|
|
38
37
|
compactParams?: string;
|
|
39
38
|
parametersChunk?: string;
|
|
39
|
+
isManuallyBackgrounded?: boolean;
|
|
40
40
|
}
|
|
41
41
|
export type AgentToolBlockUpdateParams = Omit<UpdateToolBlockParams, "messages">;
|
|
42
42
|
export interface AddErrorBlockParams {
|
|
43
43
|
messages: Message[];
|
|
44
44
|
error: string;
|
|
45
45
|
}
|
|
46
|
-
export interface AddMemoryBlockParams {
|
|
47
|
-
messages: Message[];
|
|
48
|
-
content: string;
|
|
49
|
-
isSuccess: boolean;
|
|
50
|
-
memoryType?: "project" | "user";
|
|
51
|
-
storagePath?: string;
|
|
52
|
-
}
|
|
53
46
|
export interface AddCommandOutputParams {
|
|
54
47
|
messages: Message[];
|
|
55
48
|
command: string;
|
|
@@ -64,11 +57,6 @@ export interface CompleteCommandParams {
|
|
|
64
57
|
command: string;
|
|
65
58
|
exitCode: number;
|
|
66
59
|
}
|
|
67
|
-
/**
|
|
68
|
-
* Extract text content from user messages in the messages array
|
|
69
|
-
* Excludes messages with source HOOK to prevent hook-generated content from entering user history
|
|
70
|
-
*/
|
|
71
|
-
export declare const extractUserInputHistory: (messages: Message[]) => string[];
|
|
72
60
|
/**
|
|
73
61
|
* Convert image file path to base64 format
|
|
74
62
|
* @param imagePath Image file path
|
|
@@ -77,54 +65,11 @@ export declare const extractUserInputHistory: (messages: Message[]) => string[];
|
|
|
77
65
|
export declare const convertImageToBase64: (imagePath: string) => string;
|
|
78
66
|
export declare const addUserMessageToMessages: ({ messages, content, images, customCommandContent, source, }: AddUserMessageParams) => Message[];
|
|
79
67
|
export declare const addAssistantMessageToMessages: (messages: Message[], content?: string, toolCalls?: ChatCompletionMessageFunctionToolCall[], usage?: Usage, additionalFields?: Record<string, unknown>) => Message[];
|
|
80
|
-
export declare const updateToolBlockInMessage: ({ messages, id, parameters, result, success, error, stage, name, shortResult, images, compactParams, parametersChunk, }: UpdateToolBlockParams) => Message[];
|
|
68
|
+
export declare const updateToolBlockInMessage: ({ messages, id, parameters, result, success, error, stage, name, shortResult, images, compactParams, parametersChunk, isManuallyBackgrounded, }: UpdateToolBlockParams) => Message[];
|
|
81
69
|
export declare const addErrorBlockToMessage: ({ messages, error, }: AddErrorBlockParams) => Message[];
|
|
82
|
-
export declare const addMemoryBlockToMessage: ({ messages, content, isSuccess, memoryType, storagePath, }: AddMemoryBlockParams) => Message[];
|
|
83
|
-
/**
|
|
84
|
-
* Count valid blocks from the end
|
|
85
|
-
* Only text, image, and tool type blocks are counted
|
|
86
|
-
* @param messages Message array
|
|
87
|
-
* @param targetCount Number of valid blocks to count
|
|
88
|
-
* @returns { messageIndex: number, blockCount: number } Message index and actual counted block count
|
|
89
|
-
*/
|
|
90
|
-
export declare const countValidBlocksFromEnd: (messages: Message[], targetCount: number) => {
|
|
91
|
-
messageIndex: number;
|
|
92
|
-
blockCount: number;
|
|
93
|
-
};
|
|
94
|
-
/**
|
|
95
|
-
* Get messages to be compressed and insertion position
|
|
96
|
-
* @param messages Message array
|
|
97
|
-
* @param keepLastCount Keep the last few valid blocks uncompressed
|
|
98
|
-
* @returns { messagesToCompress: Message[], insertIndex: number }
|
|
99
|
-
*/
|
|
100
|
-
export declare const getMessagesToCompress: (messages: Message[], keepLastCount?: number) => {
|
|
101
|
-
messagesToCompress: Message[];
|
|
102
|
-
insertIndex: number;
|
|
103
|
-
};
|
|
104
70
|
export declare const addCommandOutputMessage: ({ messages, command, }: AddCommandOutputParams) => Message[];
|
|
105
71
|
export declare const updateCommandOutputInMessage: ({ messages, command, output, }: UpdateCommandOutputParams) => Message[];
|
|
106
72
|
export declare const completeCommandInMessage: ({ messages, command, exitCode, }: CompleteCommandParams) => Message[];
|
|
107
|
-
export interface AddSubagentBlockParams {
|
|
108
|
-
messages: Message[];
|
|
109
|
-
subagentId: string;
|
|
110
|
-
subagentName: string;
|
|
111
|
-
status: "active" | "completed" | "error" | "aborted";
|
|
112
|
-
sessionId: string;
|
|
113
|
-
configuration: SubagentConfiguration;
|
|
114
|
-
runInBackground?: boolean;
|
|
115
|
-
}
|
|
116
|
-
export interface UpdateSubagentBlockParams {
|
|
117
|
-
messages: Message[];
|
|
118
|
-
subagentId: string;
|
|
119
|
-
status: "active" | "completed" | "error" | "aborted";
|
|
120
|
-
sessionId?: string;
|
|
121
|
-
}
|
|
122
|
-
export declare const addSubagentBlockToMessage: ({ messages, subagentId, subagentName, status, sessionId, configuration, runInBackground, }: AddSubagentBlockParams) => Message[];
|
|
123
|
-
export declare const updateSubagentBlockInMessage: (messages: Message[], subagentId: string, updates: Partial<{
|
|
124
|
-
status: "active" | "completed" | "error" | "aborted";
|
|
125
|
-
sessionId: string;
|
|
126
|
-
runInBackground: boolean;
|
|
127
|
-
}>) => Message[];
|
|
128
73
|
/**
|
|
129
74
|
* Removes the last user message from the messages array
|
|
130
75
|
* Used for hook error handling when the user prompt needs to be erased
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messageOperations.d.ts","sourceRoot":"","sources":["../../src/utils/messageOperations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"messageOperations.d.ts","sourceRoot":"","sources":["../../src/utils/messageOperations.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +1,6 @@
|
|
|
1
|
-
import { MessageSource } from "../types/index.js";
|
|
2
|
-
import { DEFAULT_KEEP_LAST_MESSAGES_COUNT } from "./constants.js";
|
|
3
1
|
import { readFileSync } from "fs";
|
|
4
2
|
import { extname } from "path";
|
|
5
3
|
import { logger } from "./globalLogger.js";
|
|
6
|
-
/**
|
|
7
|
-
* Extract text content from user messages in the messages array
|
|
8
|
-
* Excludes messages with source HOOK to prevent hook-generated content from entering user history
|
|
9
|
-
*/
|
|
10
|
-
export const extractUserInputHistory = (messages) => {
|
|
11
|
-
return messages
|
|
12
|
-
.filter((message) => message.role === "user")
|
|
13
|
-
.map((message) => {
|
|
14
|
-
// Extract text block content, excluding HOOK-sourced blocks
|
|
15
|
-
const textBlocks = message.blocks.filter((block) => block.type === "text" && block.source !== MessageSource.HOOK);
|
|
16
|
-
return textBlocks
|
|
17
|
-
.map((block) => block.content)
|
|
18
|
-
.join(" ")
|
|
19
|
-
.trim();
|
|
20
|
-
})
|
|
21
|
-
.filter((text) => text.length > 0); // Filter out empty text
|
|
22
|
-
};
|
|
23
4
|
/**
|
|
24
5
|
* Convert image file path to base64 format
|
|
25
6
|
* @param imagePath Image file path
|
|
@@ -116,7 +97,7 @@ export const addAssistantMessageToMessages = (messages, content, toolCalls, usag
|
|
|
116
97
|
return [...messages, initialAssistantMessage];
|
|
117
98
|
};
|
|
118
99
|
// Update Tool Block of the last assistant message
|
|
119
|
-
export const updateToolBlockInMessage = ({ messages, id, parameters, result, success, error, stage, name, shortResult, images, compactParams, parametersChunk, }) => {
|
|
100
|
+
export const updateToolBlockInMessage = ({ messages, id, parameters, result, success, error, stage, name, shortResult, images, compactParams, parametersChunk, isManuallyBackgrounded, }) => {
|
|
120
101
|
const newMessages = [...messages];
|
|
121
102
|
// Find the last assistant message
|
|
122
103
|
for (let i = newMessages.length - 1; i >= 0; i--) {
|
|
@@ -141,6 +122,8 @@ export const updateToolBlockInMessage = ({ messages, id, parameters, result, suc
|
|
|
141
122
|
toolBlock.compactParams = compactParams;
|
|
142
123
|
if (parametersChunk !== undefined)
|
|
143
124
|
toolBlock.parametersChunk = parametersChunk;
|
|
125
|
+
if (isManuallyBackgrounded !== undefined)
|
|
126
|
+
toolBlock.isManuallyBackgrounded = isManuallyBackgrounded;
|
|
144
127
|
}
|
|
145
128
|
}
|
|
146
129
|
else {
|
|
@@ -159,6 +142,7 @@ export const updateToolBlockInMessage = ({ messages, id, parameters, result, suc
|
|
|
159
142
|
stage: stage ?? "start",
|
|
160
143
|
compactParams: compactParams,
|
|
161
144
|
parametersChunk: parametersChunk,
|
|
145
|
+
isManuallyBackgrounded: isManuallyBackgrounded,
|
|
162
146
|
});
|
|
163
147
|
}
|
|
164
148
|
break;
|
|
@@ -198,83 +182,6 @@ export const addErrorBlockToMessage = ({ messages, error, }) => {
|
|
|
198
182
|
}
|
|
199
183
|
return newMessages;
|
|
200
184
|
};
|
|
201
|
-
// Add Memory Block as new assistant message
|
|
202
|
-
export const addMemoryBlockToMessage = ({ messages, content, isSuccess, memoryType, storagePath, }) => {
|
|
203
|
-
const newMessages = [...messages];
|
|
204
|
-
// Create new assistant message containing MemoryBlock
|
|
205
|
-
const memoryMessage = {
|
|
206
|
-
role: "assistant",
|
|
207
|
-
blocks: [
|
|
208
|
-
{
|
|
209
|
-
type: "memory",
|
|
210
|
-
content,
|
|
211
|
-
isSuccess,
|
|
212
|
-
memoryType,
|
|
213
|
-
storagePath,
|
|
214
|
-
},
|
|
215
|
-
],
|
|
216
|
-
};
|
|
217
|
-
// Add to end of message list
|
|
218
|
-
newMessages.push(memoryMessage);
|
|
219
|
-
return newMessages;
|
|
220
|
-
};
|
|
221
|
-
/**
|
|
222
|
-
* Count valid blocks from the end
|
|
223
|
-
* Only text, image, and tool type blocks are counted
|
|
224
|
-
* @param messages Message array
|
|
225
|
-
* @param targetCount Number of valid blocks to count
|
|
226
|
-
* @returns { messageIndex: number, blockCount: number } Message index and actual counted block count
|
|
227
|
-
*/
|
|
228
|
-
export const countValidBlocksFromEnd = (messages, targetCount) => {
|
|
229
|
-
let validBlockCount = 0;
|
|
230
|
-
// Iterate messages from end to beginning
|
|
231
|
-
for (let i = messages.length - 1; i >= 0; i--) {
|
|
232
|
-
const message = messages[i];
|
|
233
|
-
// Iterate through all blocks of current message
|
|
234
|
-
for (const block of message.blocks) {
|
|
235
|
-
// Only count valid block types
|
|
236
|
-
if (block.type === "text" ||
|
|
237
|
-
block.type === "image" ||
|
|
238
|
-
block.type === "tool") {
|
|
239
|
-
validBlockCount++;
|
|
240
|
-
// If target count reached, return current message index
|
|
241
|
-
if (validBlockCount >= targetCount) {
|
|
242
|
-
return { messageIndex: i, blockCount: validBlockCount };
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
// If target count not reached, return index 0
|
|
248
|
-
return { messageIndex: 0, blockCount: validBlockCount };
|
|
249
|
-
};
|
|
250
|
-
/**
|
|
251
|
-
* Get messages to be compressed and insertion position
|
|
252
|
-
* @param messages Message array
|
|
253
|
-
* @param keepLastCount Keep the last few valid blocks uncompressed
|
|
254
|
-
* @returns { messagesToCompress: Message[], insertIndex: number }
|
|
255
|
-
*/
|
|
256
|
-
export const getMessagesToCompress = (messages, keepLastCount = DEFAULT_KEEP_LAST_MESSAGES_COUNT) => {
|
|
257
|
-
// Calculate message position to keep from end to beginning
|
|
258
|
-
const { messageIndex } = countValidBlocksFromEnd(messages, keepLastCount);
|
|
259
|
-
// Find the last message containing compression block
|
|
260
|
-
let lastCompressIndex = -1;
|
|
261
|
-
for (let i = messages.length - 1; i >= 0; i--) {
|
|
262
|
-
const hasCompressBlock = messages[i].blocks.some((block) => block.type === "compress");
|
|
263
|
-
if (hasCompressBlock) {
|
|
264
|
-
lastCompressIndex = i;
|
|
265
|
-
break;
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
// Determine compression start position
|
|
269
|
-
// If compression block exists, start from compression block position (include compression block)
|
|
270
|
-
// If no compression block, start from beginning
|
|
271
|
-
const startIndex = lastCompressIndex >= 0 ? lastCompressIndex : 0;
|
|
272
|
-
// Messages to compress are all messages from start position to before calculated position
|
|
273
|
-
const messagesToCompress = messages.slice(startIndex, messageIndex);
|
|
274
|
-
// Change insertion position to negative number, indicating position from end
|
|
275
|
-
const insertIndex = messageIndex - messages.length;
|
|
276
|
-
return { messagesToCompress, insertIndex };
|
|
277
|
-
};
|
|
278
185
|
// Add command output block to message list
|
|
279
186
|
export const addCommandOutputMessage = ({ messages, command, }) => {
|
|
280
187
|
const outputMessage = {
|
|
@@ -328,55 +235,6 @@ export const completeCommandInMessage = ({ messages, command, exitCode, }) => {
|
|
|
328
235
|
}
|
|
329
236
|
return newMessages;
|
|
330
237
|
};
|
|
331
|
-
export const addSubagentBlockToMessage = ({ messages, subagentId, subagentName, status, sessionId, configuration, runInBackground, }) => {
|
|
332
|
-
const newMessages = [...messages];
|
|
333
|
-
// Find the last assistant message or create one
|
|
334
|
-
let lastAssistantMessage = newMessages[newMessages.length - 1];
|
|
335
|
-
if (!lastAssistantMessage || lastAssistantMessage.role !== "assistant") {
|
|
336
|
-
// Create new assistant message if the last message is not from assistant
|
|
337
|
-
lastAssistantMessage = {
|
|
338
|
-
id: `msg-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,
|
|
339
|
-
role: "assistant",
|
|
340
|
-
blocks: [],
|
|
341
|
-
};
|
|
342
|
-
newMessages.push(lastAssistantMessage);
|
|
343
|
-
}
|
|
344
|
-
// Add subagent block
|
|
345
|
-
lastAssistantMessage.blocks.push({
|
|
346
|
-
type: "subagent",
|
|
347
|
-
subagentId,
|
|
348
|
-
subagentName,
|
|
349
|
-
status,
|
|
350
|
-
sessionId,
|
|
351
|
-
configuration,
|
|
352
|
-
runInBackground,
|
|
353
|
-
});
|
|
354
|
-
return newMessages;
|
|
355
|
-
};
|
|
356
|
-
export const updateSubagentBlockInMessage = (messages, subagentId, updates) => {
|
|
357
|
-
const newMessages = [...messages];
|
|
358
|
-
// Find and update the subagent block
|
|
359
|
-
for (let i = newMessages.length - 1; i >= 0; i--) {
|
|
360
|
-
const message = newMessages[i];
|
|
361
|
-
if (message.role === "assistant") {
|
|
362
|
-
for (const block of message.blocks) {
|
|
363
|
-
if (block.type === "subagent" && block.subagentId === subagentId) {
|
|
364
|
-
if (updates.status !== undefined) {
|
|
365
|
-
block.status = updates.status;
|
|
366
|
-
}
|
|
367
|
-
if (updates.sessionId !== undefined) {
|
|
368
|
-
block.sessionId = updates.sessionId;
|
|
369
|
-
}
|
|
370
|
-
if (updates.runInBackground !== undefined) {
|
|
371
|
-
block.runInBackground = updates.runInBackground;
|
|
372
|
-
}
|
|
373
|
-
return newMessages;
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
return newMessages;
|
|
379
|
-
};
|
|
380
238
|
/**
|
|
381
239
|
* Removes the last user message from the messages array
|
|
382
240
|
* Used for hook error handling when the user prompt needs to be erased
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nameGenerator.d.ts","sourceRoot":"","sources":["../../src/utils/nameGenerator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoEH;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"nameGenerator.d.ts","sourceRoot":"","sources":["../../src/utils/nameGenerator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoEH;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAqBxD"}
|
|
@@ -68,8 +68,24 @@ const nouns = [
|
|
|
68
68
|
/**
|
|
69
69
|
* Generates a random English name (adjective-noun)
|
|
70
70
|
*/
|
|
71
|
-
export function generateRandomName() {
|
|
72
|
-
|
|
73
|
-
|
|
71
|
+
export function generateRandomName(seed) {
|
|
72
|
+
let adjIndex;
|
|
73
|
+
let nounIndex;
|
|
74
|
+
if (seed) {
|
|
75
|
+
// Simple hash function to derive indices from seed
|
|
76
|
+
let hash = 0;
|
|
77
|
+
for (let i = 0; i < seed.length; i++) {
|
|
78
|
+
hash = (hash << 5) - hash + seed.charCodeAt(i);
|
|
79
|
+
hash |= 0; // Convert to 32bit integer
|
|
80
|
+
}
|
|
81
|
+
adjIndex = Math.abs(hash) % adjectives.length;
|
|
82
|
+
nounIndex = Math.abs(hash >> 8) % nouns.length;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
adjIndex = Math.floor(Math.random() * adjectives.length);
|
|
86
|
+
nounIndex = Math.floor(Math.random() * nouns.length);
|
|
87
|
+
}
|
|
88
|
+
const adj = adjectives[adjIndex];
|
|
89
|
+
const noun = nouns[nounIndex];
|
|
74
90
|
return `${adj}-${noun}`;
|
|
75
91
|
}
|