wave-agent-sdk 0.17.9 → 0.17.11
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/builtin/skills/settings/ENV.md +1 -1
- package/dist/managers/aiManager.d.ts +11 -4
- package/dist/managers/aiManager.d.ts.map +1 -1
- package/dist/managers/aiManager.js +232 -200
- package/dist/managers/backgroundTaskManager.js +1 -1
- package/dist/managers/bangManager.js +1 -1
- package/dist/managers/hookManager.js +2 -4
- package/dist/managers/mcpManager.d.ts.map +1 -1
- package/dist/managers/mcpManager.js +1 -3
- package/dist/managers/messageManager.d.ts.map +1 -1
- package/dist/managers/messageManager.js +1 -8
- package/dist/managers/toolManager.d.ts +6 -0
- package/dist/managers/toolManager.d.ts.map +1 -1
- package/dist/managers/toolManager.js +17 -12
- package/dist/services/aiService.d.ts.map +1 -1
- package/dist/services/aiService.js +20 -12
- package/dist/services/authService.d.ts +0 -1
- package/dist/services/authService.d.ts.map +1 -1
- package/dist/services/authService.js +1 -29
- package/dist/services/configurationService.d.ts.map +1 -1
- package/dist/services/configurationService.js +13 -0
- package/dist/services/fileWatcher.d.ts +2 -0
- package/dist/services/fileWatcher.d.ts.map +1 -1
- package/dist/services/fileWatcher.js +12 -1
- package/dist/services/jsonlHandler.d.ts +1 -1
- package/dist/services/jsonlHandler.d.ts.map +1 -1
- package/dist/services/jsonlHandler.js +7 -22
- package/dist/services/session.d.ts +2 -9
- package/dist/services/session.d.ts.map +1 -1
- package/dist/services/session.js +16 -46
- package/dist/tools/bashTool.d.ts.map +1 -1
- package/dist/tools/bashTool.js +3 -1
- package/dist/tools/editTool.d.ts.map +1 -1
- package/dist/tools/editTool.js +28 -1
- package/dist/tools/enterPlanMode.d.ts.map +1 -1
- package/dist/tools/enterPlanMode.js +8 -0
- package/dist/tools/exitPlanMode.d.ts.map +1 -1
- package/dist/tools/exitPlanMode.js +8 -0
- package/dist/tools/readTool.d.ts.map +1 -1
- package/dist/tools/readTool.js +18 -10
- package/dist/tools/types.d.ts +8 -2
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/writeTool.d.ts.map +1 -1
- package/dist/tools/writeTool.js +14 -1
- package/dist/types/agent.d.ts +0 -2
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/config.d.ts +1 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/utils/cacheControlUtils.d.ts +20 -15
- package/dist/utils/cacheControlUtils.d.ts.map +1 -1
- package/dist/utils/cacheControlUtils.js +69 -66
- package/dist/utils/constants.d.ts +1 -1
- package/dist/utils/constants.js +1 -1
- package/dist/utils/containerSetup.d.ts.map +1 -1
- package/dist/utils/containerSetup.js +1 -6
- package/dist/utils/taskReminder.d.ts +17 -0
- package/dist/utils/taskReminder.d.ts.map +1 -0
- package/dist/utils/taskReminder.js +76 -0
- package/package.json +1 -1
- package/src/managers/aiManager.ts +326 -262
- package/src/managers/backgroundTaskManager.ts +1 -1
- package/src/managers/bangManager.ts +1 -1
- package/src/managers/hookManager.ts +6 -6
- package/src/managers/mcpManager.ts +2 -4
- package/src/managers/messageManager.ts +1 -9
- package/src/managers/toolManager.ts +18 -12
- package/src/services/aiService.ts +23 -12
- package/src/services/authService.ts +1 -31
- package/src/services/configurationService.ts +21 -0
- package/src/services/fileWatcher.ts +15 -1
- package/src/services/jsonlHandler.ts +7 -27
- package/src/services/session.ts +16 -57
- package/src/tools/bashTool.ts +3 -1
- package/src/tools/editTool.ts +31 -1
- package/src/tools/enterPlanMode.ts +9 -0
- package/src/tools/exitPlanMode.ts +10 -0
- package/src/tools/readTool.ts +20 -10
- package/src/tools/types.ts +15 -3
- package/src/tools/writeTool.ts +15 -1
- package/src/types/agent.ts +0 -2
- package/src/types/config.ts +1 -0
- package/src/utils/cacheControlUtils.ts +77 -95
- package/src/utils/constants.ts +1 -1
- package/src/utils/containerSetup.ts +3 -7
- package/src/utils/taskReminder.ts +108 -0
package/dist/services/session.js
CHANGED
|
@@ -24,35 +24,11 @@ import { extractLatestTotalTokens } from "../utils/tokenCalculation.js";
|
|
|
24
24
|
import { logger } from "../utils/globalLogger.js";
|
|
25
25
|
import { getMessageContent } from "../utils/messageOperations.js";
|
|
26
26
|
/**
|
|
27
|
-
* Generate a new session ID
|
|
28
|
-
*
|
|
29
|
-
* @returns Timestamp-prefixed session ID string
|
|
27
|
+
* Generate a new session ID using Node.js native crypto.randomUUID()
|
|
28
|
+
* @returns UUID string for session identification
|
|
30
29
|
*/
|
|
31
30
|
export function generateSessionId() {
|
|
32
|
-
|
|
33
|
-
const ts = [
|
|
34
|
-
now.getFullYear(),
|
|
35
|
-
String(now.getMonth() + 1).padStart(2, "0"),
|
|
36
|
-
String(now.getDate()).padStart(2, "0"),
|
|
37
|
-
String(now.getHours()).padStart(2, "0"),
|
|
38
|
-
String(now.getMinutes()).padStart(2, "0"),
|
|
39
|
-
String(now.getSeconds()).padStart(2, "0"),
|
|
40
|
-
].join("");
|
|
41
|
-
const shortId = randomUUID().slice(0, 8);
|
|
42
|
-
return `${ts}-${shortId}`;
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Parse the timestamp prefix from a session ID back into a Date
|
|
46
|
-
* Format: {YYYYMMDDHHmmss}-{8hex} (e.g. 20260527143025-a1b2c3d4)
|
|
47
|
-
* @returns Date from the session ID timestamp prefix
|
|
48
|
-
*/
|
|
49
|
-
export function parseSessionIdTimestamp(sessionId) {
|
|
50
|
-
const match = sessionId.match(/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/);
|
|
51
|
-
if (!match) {
|
|
52
|
-
return new Date(); // Fallback to now for legacy UUID-format session IDs
|
|
53
|
-
}
|
|
54
|
-
const [, year, month, day, hour, minute, second] = match;
|
|
55
|
-
return new Date(Number(year), Number(month) - 1, Number(day), Number(hour), Number(minute), Number(second));
|
|
31
|
+
return randomUUID();
|
|
56
32
|
}
|
|
57
33
|
/**
|
|
58
34
|
* Generate filename for subagent sessions
|
|
@@ -199,9 +175,9 @@ export async function appendMessages(sessionId, newMessages, workdir, sessionTyp
|
|
|
199
175
|
firstMessage =
|
|
200
176
|
(await getFirstMessageContent(sessionId, workdir)) || undefined;
|
|
201
177
|
}
|
|
202
|
-
// Derive createdAt from session ID
|
|
178
|
+
// Derive createdAt from session ID if not in index
|
|
203
179
|
if (!createdAt) {
|
|
204
|
-
createdAt = new Date(
|
|
180
|
+
createdAt = new Date();
|
|
205
181
|
}
|
|
206
182
|
await updateSessionIndex(projectDir.encodedPath, {
|
|
207
183
|
id: sessionId,
|
|
@@ -380,14 +356,12 @@ export async function listSessionsFromJsonl(workdir) {
|
|
|
380
356
|
}
|
|
381
357
|
try {
|
|
382
358
|
const filePath = join(projectDir.encodedPath, file);
|
|
383
|
-
// Validate main session filename format (
|
|
384
|
-
const newFormatMatch = file.match(/^(\d{14}-[0-9a-f]{8})\.jsonl$/);
|
|
359
|
+
// Validate main session filename format (UUID.jsonl)
|
|
385
360
|
const uuidMatch = file.match(/^([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.jsonl$/);
|
|
386
|
-
|
|
387
|
-
if (!match) {
|
|
361
|
+
if (!uuidMatch) {
|
|
388
362
|
continue; // Skip invalid filenames
|
|
389
363
|
}
|
|
390
|
-
const sessionId =
|
|
364
|
+
const sessionId = uuidMatch[1];
|
|
391
365
|
// PERFORMANCE OPTIMIZATION: Only read the last message for timestamps and tokens
|
|
392
366
|
const jsonlHandler = new JsonlHandler();
|
|
393
367
|
const lastMessage = await jsonlHandler.getLastMessage(filePath);
|
|
@@ -410,7 +384,7 @@ export async function listSessionsFromJsonl(workdir) {
|
|
|
410
384
|
sessionType: "main",
|
|
411
385
|
subagentType: undefined, // No longer stored in metadata
|
|
412
386
|
workdir: projectDir.originalPath,
|
|
413
|
-
createdAt: new Date(
|
|
387
|
+
createdAt: new Date(),
|
|
414
388
|
lastActiveAt,
|
|
415
389
|
latestTotalTokens: lastMessage?.usage
|
|
416
390
|
? extractLatestTotalTokens([lastMessage])
|
|
@@ -554,17 +528,13 @@ export async function cleanupExpiredSessionsFromJsonl(workdir) {
|
|
|
554
528
|
const indexPath = join(projectDir.encodedPath, SESSION_INDEX_FILENAME);
|
|
555
529
|
const indexContent = await fs.readFile(indexPath, "utf8");
|
|
556
530
|
const index = JSON.parse(indexContent);
|
|
557
|
-
|
|
558
|
-
const
|
|
559
|
-
const
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
newSubagentMatch?.[1] ??
|
|
565
|
-
uuidMatch?.[1] ??
|
|
566
|
-
subagentMatch?.[1] ??
|
|
567
|
-
null;
|
|
531
|
+
const uuidMatch = file.match(/^([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.jsonl$/);
|
|
532
|
+
const subagentMatch = file.match(/^subagent-([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.jsonl$/);
|
|
533
|
+
const sessionId = uuidMatch
|
|
534
|
+
? uuidMatch[1]
|
|
535
|
+
: subagentMatch
|
|
536
|
+
? subagentMatch[1]
|
|
537
|
+
: null;
|
|
568
538
|
if (sessionId && index.sessions[sessionId]) {
|
|
569
539
|
delete index.sessions[sessionId];
|
|
570
540
|
await fs.writeFile(indexPath, JSON.stringify(index, null, 2), "utf8");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bashTool.d.ts","sourceRoot":"","sources":["../../src/tools/bashTool.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAuBtE;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"bashTool.d.ts","sourceRoot":"","sources":["../../src/tools/bashTool.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAuBtE;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,UAuhBtB,CAAC"}
|
package/dist/tools/bashTool.js
CHANGED
|
@@ -206,7 +206,9 @@ The working directory persists between commands. Try to maintain your current wo
|
|
|
206
206
|
stdio: "pipe",
|
|
207
207
|
detached: true,
|
|
208
208
|
cwd: context.workdir,
|
|
209
|
-
env:
|
|
209
|
+
env: {
|
|
210
|
+
...process.env,
|
|
211
|
+
},
|
|
210
212
|
});
|
|
211
213
|
let outputBuffer = "";
|
|
212
214
|
let errorBuffer = "";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editTool.d.ts","sourceRoot":"","sources":["../../src/tools/editTool.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"editTool.d.ts","sourceRoot":"","sources":["../../src/tools/editTool.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAgBtE;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,UAkRtB,CAAC"}
|
package/dist/tools/editTool.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { readFile, writeFile } from "fs/promises";
|
|
1
|
+
import { readFile, writeFile, stat } from "fs/promises";
|
|
2
|
+
import { createHash } from "crypto";
|
|
2
3
|
import { logger } from "../utils/globalLogger.js";
|
|
3
4
|
import { resolvePath, getDisplayPath } from "../utils/path.js";
|
|
4
5
|
import { escapeRegExp, analyzeEditMismatch } from "../utils/editUtils.js";
|
|
@@ -15,6 +16,7 @@ function formatCompactParams(args, context) {
|
|
|
15
16
|
*/
|
|
16
17
|
export const editTool = {
|
|
17
18
|
name: EDIT_TOOL_NAME,
|
|
19
|
+
isConcurrencySafe: false,
|
|
18
20
|
formatCompactParams,
|
|
19
21
|
prompt: () => `Performs exact string replacements in files.
|
|
20
22
|
|
|
@@ -116,6 +118,20 @@ Usage:
|
|
|
116
118
|
error: `Failed to read file: ${readError instanceof Error ? readError.message : String(readError)}`,
|
|
117
119
|
};
|
|
118
120
|
}
|
|
121
|
+
// Staleness check: file must not have been modified since last Read
|
|
122
|
+
if (context.readFileState) {
|
|
123
|
+
const state = context.readFileState.get(resolvedPath);
|
|
124
|
+
if (state) {
|
|
125
|
+
const currentStats = await stat(resolvedPath);
|
|
126
|
+
if (currentStats.mtime.getTime() !== state.mtime) {
|
|
127
|
+
return {
|
|
128
|
+
success: false,
|
|
129
|
+
content: "",
|
|
130
|
+
error: "File has been unexpectedly modified since last read. Read it again before editing it.",
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
119
135
|
// Normalize line endings for matching
|
|
120
136
|
const normalizedContent = originalContent.replace(/\r\n/g, "\n");
|
|
121
137
|
const normalizedOldString = oldString.replace(/\r\n/g, "\n");
|
|
@@ -200,6 +216,17 @@ Usage:
|
|
|
200
216
|
error: `Failed to write file: ${writeError instanceof Error ? writeError.message : String(writeError)}`,
|
|
201
217
|
};
|
|
202
218
|
}
|
|
219
|
+
// Update readFileState so subsequent serialized edits see fresh state
|
|
220
|
+
if (context.readFileState) {
|
|
221
|
+
const newStats = await stat(resolvedPath);
|
|
222
|
+
const hash = createHash("sha256").update(newContent).digest("hex");
|
|
223
|
+
context.readFileState.set(resolvedPath, {
|
|
224
|
+
mtime: newStats.mtime.getTime(),
|
|
225
|
+
hash,
|
|
226
|
+
offset: undefined,
|
|
227
|
+
limit: undefined,
|
|
228
|
+
});
|
|
229
|
+
}
|
|
203
230
|
const shortResult = replaceAll
|
|
204
231
|
? `Replaced ${replacementCount} instances`
|
|
205
232
|
: "Text replaced successfully";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enterPlanMode.d.ts","sourceRoot":"","sources":["../../src/tools/enterPlanMode.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAItE;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"enterPlanMode.d.ts","sourceRoot":"","sources":["../../src/tools/enterPlanMode.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAItE;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,UAmH/B,CAAC"}
|
|
@@ -42,6 +42,14 @@ export const enterPlanModeTool = {
|
|
|
42
42
|
`,
|
|
43
43
|
execute: async (_args, context) => {
|
|
44
44
|
try {
|
|
45
|
+
// Runtime guard: tool is always visible but only works outside plan mode
|
|
46
|
+
if (context.permissionMode === "plan") {
|
|
47
|
+
return {
|
|
48
|
+
success: false,
|
|
49
|
+
content: "Already in plan mode. Use ExitPlanMode to exit.",
|
|
50
|
+
error: "Already in plan mode",
|
|
51
|
+
};
|
|
52
|
+
}
|
|
45
53
|
if (!context.permissionManager) {
|
|
46
54
|
return {
|
|
47
55
|
success: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exitPlanMode.d.ts","sourceRoot":"","sources":["../../src/tools/exitPlanMode.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAItE;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"exitPlanMode.d.ts","sourceRoot":"","sources":["../../src/tools/exitPlanMode.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAItE;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,UAiI9B,CAAC"}
|
|
@@ -46,6 +46,14 @@ Ensure your plan is complete and unambiguous:
|
|
|
46
46
|
`,
|
|
47
47
|
execute: async (_args, context) => {
|
|
48
48
|
try {
|
|
49
|
+
// Runtime guard: tool is always visible but only works in plan mode
|
|
50
|
+
if (context.permissionMode !== "plan") {
|
|
51
|
+
return {
|
|
52
|
+
success: false,
|
|
53
|
+
content: "Not in plan mode. ExitPlanMode can only be used when actively in plan mode.",
|
|
54
|
+
error: "Not in plan mode",
|
|
55
|
+
};
|
|
56
|
+
}
|
|
49
57
|
if (!context.permissionManager) {
|
|
50
58
|
return {
|
|
51
59
|
success: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"readTool.d.ts","sourceRoot":"","sources":["../../src/tools/readTool.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAkItE;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"readTool.d.ts","sourceRoot":"","sources":["../../src/tools/readTool.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAkItE;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,UAsStB,CAAC"}
|
package/dist/tools/readTool.js
CHANGED
|
@@ -206,18 +206,24 @@ Usage:
|
|
|
206
206
|
? filePath
|
|
207
207
|
: resolvePath(filePath, context.workdir);
|
|
208
208
|
const stats = await stat(actualFilePath);
|
|
209
|
-
// Deduplication
|
|
209
|
+
// Deduplication: only dedup if the exact same range was read before
|
|
210
210
|
if (context.readFileState) {
|
|
211
211
|
const state = context.readFileState.get(actualFilePath);
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
212
|
+
// Only dedup entries from a prior Read with explicit offset (not Edit/Write entries)
|
|
213
|
+
if (state &&
|
|
214
|
+
state.mtime === stats.mtime.getTime() &&
|
|
215
|
+
state.offset !== undefined) {
|
|
216
|
+
const rangeMatch = state.offset === offset && state.limit === limit;
|
|
217
|
+
if (rangeMatch) {
|
|
218
|
+
return {
|
|
219
|
+
success: true,
|
|
220
|
+
content: `File ${filePath} has not changed since last read. The content from the earlier Read tool_result in this conversation is still current — refer to that instead of re-reading.`,
|
|
221
|
+
shortResult: "File unchanged",
|
|
222
|
+
metadata: {
|
|
223
|
+
type: "file_unchanged",
|
|
224
|
+
},
|
|
225
|
+
};
|
|
226
|
+
}
|
|
221
227
|
}
|
|
222
228
|
}
|
|
223
229
|
// Resource Limits
|
|
@@ -243,6 +249,8 @@ Usage:
|
|
|
243
249
|
context.readFileState.set(actualFilePath, {
|
|
244
250
|
mtime: stats.mtime.getTime(),
|
|
245
251
|
hash,
|
|
252
|
+
offset, // undefined for full reads
|
|
253
|
+
limit, // undefined for full reads
|
|
246
254
|
});
|
|
247
255
|
}
|
|
248
256
|
// Check if file is empty
|
package/dist/tools/types.d.ts
CHANGED
|
@@ -19,6 +19,12 @@ export interface ToolPlugin {
|
|
|
19
19
|
workdir?: string;
|
|
20
20
|
isSubagent?: boolean;
|
|
21
21
|
}) => string;
|
|
22
|
+
/**
|
|
23
|
+
* Whether this tool is safe to run in parallel with other tools.
|
|
24
|
+
* Default (undefined) = true (parallel). Set to false for tools that
|
|
25
|
+
* perform read-modify-write on shared resources (e.g. Edit, Write).
|
|
26
|
+
*/
|
|
27
|
+
isConcurrencySafe?: boolean;
|
|
22
28
|
}
|
|
23
29
|
export interface ToolResult {
|
|
24
30
|
success: boolean;
|
|
@@ -87,6 +93,8 @@ export interface ToolContext {
|
|
|
87
93
|
readFileState?: Map<string, {
|
|
88
94
|
mtime: number;
|
|
89
95
|
hash: string;
|
|
96
|
+
offset?: number;
|
|
97
|
+
limit?: number;
|
|
90
98
|
}>;
|
|
91
99
|
/** Hook manager instance for executing hooks */
|
|
92
100
|
hookManager?: import("../managers/hookManager.js").HookManager;
|
|
@@ -94,8 +102,6 @@ export interface ToolContext {
|
|
|
94
102
|
onCwdChange?: (newCwd: string) => void;
|
|
95
103
|
/** Original working directory (before any cd changes) for CWD reset */
|
|
96
104
|
originalWorkdir?: string;
|
|
97
|
-
/** Merged environment variables (process.env + agent env) for child processes */
|
|
98
|
-
env?: Record<string, string>;
|
|
99
105
|
/** Workflow manager instance for workflow orchestration */
|
|
100
106
|
workflowManager?: import("../managers/workflowManager.js").WorkflowManager;
|
|
101
107
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EACnB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,0BAA0B,CAAC;IACnC,OAAO,EAAE,CACP,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,WAAW,KACjB,OAAO,CAAC,UAAU,CAAC,CAAC;IACzB,mBAAmB,CAAC,EAAE,CACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,WAAW,KACjB,MAAM,CAAC;IACZ;;OAEG;IACH,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE;QACf,kBAAkB,CAAC,EAAE,qBAAqB,EAAE,CAAC;QAC7C,eAAe,CAAC,EAAE,aAAa,EAAE,CAAC;QAClC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,KAAK,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writeTool.d.ts","sourceRoot":"","sources":["../../src/tools/writeTool.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"writeTool.d.ts","sourceRoot":"","sources":["../../src/tools/writeTool.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAItE;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE,UAoNvB,CAAC"}
|
package/dist/tools/writeTool.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { readFile, writeFile, mkdir } from "fs/promises";
|
|
1
|
+
import { readFile, writeFile, mkdir, stat } from "fs/promises";
|
|
2
|
+
import { createHash } from "crypto";
|
|
2
3
|
import { dirname } from "path";
|
|
3
4
|
import { logger } from "../utils/globalLogger.js";
|
|
4
5
|
import { resolvePath, getDisplayPath } from "../utils/path.js";
|
|
@@ -8,6 +9,7 @@ import { READ_TOOL_NAME } from "../constants/tools.js";
|
|
|
8
9
|
*/
|
|
9
10
|
export const writeTool = {
|
|
10
11
|
name: "Write",
|
|
12
|
+
isConcurrencySafe: false,
|
|
11
13
|
config: {
|
|
12
14
|
type: "function",
|
|
13
15
|
function: {
|
|
@@ -134,6 +136,17 @@ Usage:
|
|
|
134
136
|
error: `Failed to write file: ${writeError instanceof Error ? writeError.message : String(writeError)}`,
|
|
135
137
|
};
|
|
136
138
|
}
|
|
139
|
+
// Update readFileState so subsequent serialized edits pass staleness check
|
|
140
|
+
if (context.readFileState) {
|
|
141
|
+
const newStats = await stat(resolvedPath);
|
|
142
|
+
const hash = createHash("sha256").update(content).digest("hex");
|
|
143
|
+
context.readFileState.set(resolvedPath, {
|
|
144
|
+
mtime: newStats.mtime.getTime(),
|
|
145
|
+
hash,
|
|
146
|
+
offset: undefined,
|
|
147
|
+
limit: undefined,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
137
150
|
const shortResult = isExistingFile ? "File overwritten" : "File created";
|
|
138
151
|
const lines = content.split("\n").length;
|
|
139
152
|
const chars = content.length;
|
package/dist/types/agent.d.ts
CHANGED
|
@@ -84,8 +84,6 @@ export interface AgentOptions {
|
|
|
84
84
|
* File-based hooks (from config.json/.waverc.json) merge on top of these.
|
|
85
85
|
*/
|
|
86
86
|
hooks?: PartialHookConfiguration;
|
|
87
|
-
/** Per-agent environment variables, merged on top of process.env for bash, MCP, and hooks */
|
|
88
|
-
env?: Record<string, string>;
|
|
89
87
|
[key: string]: unknown;
|
|
90
88
|
}
|
|
91
89
|
export interface AgentCallbacks extends MessageManagerCallbacks, BackgroundTaskManagerCallbacks, McpManagerCallbacks, SubagentManagerCallbacks {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/types/agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EACV,OAAO,EACP,MAAM,EACN,cAAc,EACd,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,cAAc,EACd,eAAe,EAChB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,sCAAsC,CAAC;AAC3F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAE3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mFAAmF;IACnF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,mFAAmF;IACnF,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACzD,YAAY,CAAC,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;IAC7C,KAAK,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,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;IACtB,6CAA6C;IAC7C,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,gCAAgC;IAChC,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,uEAAuE;IACvE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,qFAAqF;IACrF,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,oCAAoC;IACpC,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,4BAA4B;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8CAA8C;IAC9C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC7C,iFAAiF;IACjF,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B;;;OAGG;IACH,KAAK,CAAC,EAAE,wBAAwB,CAAC;IACjC,
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/types/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/types/config.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB"}
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* to optimize token usage and reduce costs. Cache control is only applied to Claude
|
|
6
6
|
* models and preserves backward compatibility with existing message formats.
|
|
7
7
|
*/
|
|
8
|
-
import type { ChatCompletionMessageParam, ChatCompletionContentPart, ChatCompletionContentPartText,
|
|
8
|
+
import type { ChatCompletionMessageParam, ChatCompletionContentPart, ChatCompletionContentPartText, CompletionUsage } from "openai/resources";
|
|
9
9
|
/**
|
|
10
10
|
* Cache control directive for Claude models
|
|
11
11
|
*/
|
|
@@ -20,14 +20,6 @@ export interface ClaudeChatCompletionContentPartText extends ChatCompletionConte
|
|
|
20
20
|
text: string;
|
|
21
21
|
cache_control?: CacheControl;
|
|
22
22
|
}
|
|
23
|
-
/**
|
|
24
|
-
* Extended tool definition with cache control support
|
|
25
|
-
*/
|
|
26
|
-
export interface ClaudeChatCompletionFunctionTool extends ChatCompletionFunctionTool {
|
|
27
|
-
type: "function";
|
|
28
|
-
function: ChatCompletionFunctionTool["function"];
|
|
29
|
-
cache_control?: CacheControl;
|
|
30
|
-
}
|
|
31
23
|
/**
|
|
32
24
|
* Extended prompt_tokens_details with cache_creation_input_tokens
|
|
33
25
|
* Some models (e.g. Gemini, DeepSeek) return this field inside prompt_tokens_details
|
|
@@ -78,18 +70,31 @@ export declare function isValidCacheControl(control: unknown): control is CacheC
|
|
|
78
70
|
*/
|
|
79
71
|
export declare function addCacheControlToContent(content: string | ChatCompletionContentPart[], shouldCache: boolean): ClaudeChatCompletionContentPartText[];
|
|
80
72
|
/**
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
*
|
|
73
|
+
* Counts the total number of content blocks across all messages.
|
|
74
|
+
* Each element in a message's content array counts as one block.
|
|
75
|
+
* String content counts as one block. Null/undefined content counts as zero
|
|
76
|
+
* (e.g. assistant messages with only tool_calls).
|
|
77
|
+
* @param messages - Array of chat messages
|
|
78
|
+
* @returns Total content block count
|
|
84
79
|
*/
|
|
85
|
-
export declare function
|
|
80
|
+
export declare function countContentBlocks(messages: ChatCompletionMessageParam[]): number;
|
|
86
81
|
/**
|
|
87
|
-
* Transforms messages for
|
|
82
|
+
* Transforms messages for explicit cache control.
|
|
83
|
+
*
|
|
84
|
+
* Cache breakpoints (following Claude Code's "last message marker" strategy):
|
|
85
|
+
* 1. System message — always marked (stable prefix)
|
|
86
|
+
* 2. Last message — the last user/assistant message with content is marked.
|
|
87
|
+
* The API scans backward from this marker within 20 blocks. Since each
|
|
88
|
+
* turn adds ~2 blocks (< 20), the previous request's marker position
|
|
89
|
+
* always falls within the scan window, ensuring cache hits.
|
|
90
|
+
*
|
|
91
|
+
* Tools are marked separately via addCacheControlToLastTool (called by aiService).
|
|
92
|
+
*
|
|
88
93
|
* @param messages - Original OpenAI message array
|
|
89
94
|
* @param modelName - Model name for cache detection
|
|
90
95
|
* @returns Messages with cache control markers applied
|
|
91
96
|
*/
|
|
92
|
-
export declare function
|
|
97
|
+
export declare function transformMessagesForExplicitCache(messages: ChatCompletionMessageParam[], modelName: string): ChatCompletionMessageParam[];
|
|
93
98
|
/**
|
|
94
99
|
* Extends standard usage with cache metrics
|
|
95
100
|
* Extracts cache tokens from both Claude-specific top-level fields and
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cacheControlUtils.d.ts","sourceRoot":"","sources":["../../src/utils/cacheControlUtils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,0BAA0B,EAC1B,yBAAyB,EACzB,6BAA6B,EAC7B,
|
|
1
|
+
{"version":3,"file":"cacheControlUtils.d.ts","sourceRoot":"","sources":["../../src/utils/cacheControlUtils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,0BAA0B,EAC1B,yBAAyB,EACzB,6BAA6B,EAC7B,eAAe,EAChB,MAAM,kBAAkB,CAAC;AAO1B;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,WAAW,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,mCACf,SAAQ,6BAA6B;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,YAAY,CAAC;CAC9B;AAED;;;GAGG;AACH,MAAM,WAAW,2BACf,SAAQ,eAAe,CAAC,mBAAmB;IAC3C,2BAA2B,CAAC,EAAE,MAAM,CAAC;CACtC;AAED;;;GAGG;AACH,MAAM,WAAW,WAAY,SAAQ,eAAe;IAClD,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IAGrB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,cAAc,CAAC,EAAE;QACf,yBAAyB,EAAE,MAAM,CAAC;QAClC,yBAAyB,EAAE,MAAM,CAAC;KACnC,CAAC;IAGF,qBAAqB,CAAC,EAAE,2BAA2B,CAAC;CACrD;AAUD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAoBhE;AAED;;;;;GAKG;AACH,eAAO,MAAM,aAAa,8BAAwB,CAAC;AAEnD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,YAAY,CAQ7E;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,GAAG,yBAAyB,EAAE,EAC7C,WAAW,EAAE,OAAO,GACnB,mCAAmC,EAAE,CAmFvC;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,0BAA0B,EAAE,GACrC,MAAM,CAYR;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iCAAiC,CAC/C,QAAQ,EAAE,0BAA0B,EAAE,EACtC,SAAS,EAAE,MAAM,GAChB,0BAA0B,EAAE,CAsF9B;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,eAAe,EAC9B,YAAY,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAClC,WAAW,CAiDb;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAyCvE"}
|