wave-agent-sdk 0.12.8 → 0.12.9
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 -0
- package/builtin/skills/settings/PERMISSIONS.md +57 -0
- package/builtin/skills/settings/SKILL.md +12 -3
- package/dist/managers/permissionManager.d.ts +6 -0
- package/dist/managers/permissionManager.d.ts.map +1 -1
- package/dist/managers/permissionManager.js +9 -0
- package/dist/managers/subagentManager.d.ts.map +1 -1
- package/dist/managers/subagentManager.js +8 -0
- package/dist/services/aiService.js +4 -4
- package/dist/services/configurationService.d.ts.map +1 -1
- package/dist/services/configurationService.js +1 -0
- package/dist/services/initializationService.d.ts.map +1 -1
- package/dist/services/initializationService.js +2 -0
- package/dist/utils/cacheControlUtils.d.ts +8 -1
- package/dist/utils/cacheControlUtils.d.ts.map +1 -1
- package/dist/utils/cacheControlUtils.js +25 -8
- package/dist/utils/containerSetup.d.ts.map +1 -1
- package/dist/utils/containerSetup.js +2 -0
- package/package.json +1 -1
- package/src/managers/permissionManager.ts +12 -0
- package/src/managers/subagentManager.ts +15 -0
- package/src/services/aiService.ts +4 -4
- package/src/services/configurationService.ts +1 -0
- package/src/services/initializationService.ts +2 -0
- package/src/utils/cacheControlUtils.ts +27 -8
- package/src/utils/containerSetup.ts +2 -0
|
@@ -30,6 +30,7 @@ Wave uses several environment variables to control its core functionality.
|
|
|
30
30
|
| `WAVE_MAX_OUTPUT_TOKENS` | Maximum number of output tokens allowed. | `8192` |
|
|
31
31
|
| `WAVE_DISABLE_AUTO_MEMORY` | Set to `1` or `true` to disable the auto-memory feature. | `false` |
|
|
32
32
|
| `WAVE_TASK_LIST_ID` | Explicitly set the task list ID for the session. | (Session ID) |
|
|
33
|
+
| `WAVE_PROMPT_CACHE_REGEX` | Regex pattern to match model names that support prompt caching. Models matching this pattern will have cache control markers applied. | `claude` |
|
|
33
34
|
|
|
34
35
|
## Configuration Scopes
|
|
35
36
|
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Tool Permissions & Safe Zone
|
|
2
|
+
|
|
3
|
+
Wave includes a robust permission system to protect your system while allowing the AI to be productive. This system is centered around the "Safe Zone" and configurable permission modes.
|
|
4
|
+
|
|
5
|
+
## The Safe Zone
|
|
6
|
+
|
|
7
|
+
The Safe Zone is a set of directories where Wave is allowed to perform potentially sensitive operations (like editing or writing files) with reduced friction.
|
|
8
|
+
|
|
9
|
+
By default, the Safe Zone includes:
|
|
10
|
+
- The current project directory.
|
|
11
|
+
- The Wave configuration directories (`~/.wave/` and `.wave/`).
|
|
12
|
+
- The system temporary directory.
|
|
13
|
+
|
|
14
|
+
You can extend the Safe Zone by adding `additionalDirectories` to your `permissions` configuration in `settings.json`.
|
|
15
|
+
|
|
16
|
+
## Permission Modes
|
|
17
|
+
|
|
18
|
+
The `permissionMode` setting determines how Wave handles requests to use restricted tools (e.g., `Bash`, `Edit`, `Write`, `AskUserQuestion`).
|
|
19
|
+
|
|
20
|
+
| Mode | Description |
|
|
21
|
+
| :--- | :--- |
|
|
22
|
+
| `default` | **Recommended.** Wave will ask for your permission before using any restricted tool. |
|
|
23
|
+
| `bypassPermissions` | **Use with caution.** Wave will execute all tools without asking for permission. |
|
|
24
|
+
| `acceptEdits` | Wave will automatically allow `Edit` and `Write` operations within the Safe Zone. It will still ask for permission for `Bash` and operations outside the Safe Zone. |
|
|
25
|
+
| `plan` | Restricted mode for editing the plan file (usually internal). |
|
|
26
|
+
| `dontAsk` | Wave will automatically deny all restricted tools without asking. This is the most restrictive mode. |
|
|
27
|
+
|
|
28
|
+
### Example Configuration
|
|
29
|
+
|
|
30
|
+
```json
|
|
31
|
+
{
|
|
32
|
+
"permissions": {
|
|
33
|
+
"permissionMode": "default",
|
|
34
|
+
"additionalDirectories": ["/home/user/my-exports"],
|
|
35
|
+
"allow": ["ls -R", "git status"],
|
|
36
|
+
"deny": ["rm -rf"]
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Allow and Deny Rules
|
|
42
|
+
|
|
43
|
+
You can pre-approve or explicitly forbid specific operations using `allow` and `deny` rules.
|
|
44
|
+
|
|
45
|
+
- **`allow`**: An array of string patterns (e.g., bash commands or file paths) that are always permitted.
|
|
46
|
+
- **`deny`**: An array of string patterns that are always forbidden.
|
|
47
|
+
|
|
48
|
+
When a tool is called, Wave checks:
|
|
49
|
+
1. If the operation matches a `deny` rule, it is rejected.
|
|
50
|
+
2. If the operation matches an `allow` rule, it is permitted.
|
|
51
|
+
3. If no rules match, the behavior depends on the `permissionMode`.
|
|
52
|
+
|
|
53
|
+
## Managing Permissions via CLI
|
|
54
|
+
|
|
55
|
+
You can also manage permissions directly through the Wave interface:
|
|
56
|
+
- When Wave asks for permission, you can select "Always allow" to add a rule to your `settings.local.json`.
|
|
57
|
+
- You can ask Wave to "Update my permission mode to acceptEdits".
|
|
@@ -27,8 +27,12 @@ Hooks allow you to automate tasks when certain events occur (e.g., `WorktreeCrea
|
|
|
27
27
|
For detailed hook configuration, see [HOOKS.md](${WAVE_SKILL_DIR}/HOOKS.md).
|
|
28
28
|
|
|
29
29
|
### 2. Environment Variables
|
|
30
|
-
Set environment variables that will be available to all tools and hooks.
|
|
31
|
-
|
|
30
|
+
Set environment variables that will be available to all tools and hooks. Common `WAVE_*` variables include:
|
|
31
|
+
- `WAVE_MODEL`, `WAVE_FAST_MODEL`: Model selection
|
|
32
|
+
- `WAVE_MAX_INPUT_TOKENS`, `WAVE_MAX_OUTPUT_TOKENS`: Token limits
|
|
33
|
+
- `WAVE_API_KEY`, `WAVE_BASE_URL`: API configuration
|
|
34
|
+
|
|
35
|
+
For detailed configuration, see [ENV.md](${WAVE_SKILL_DIR}/ENV.md).
|
|
32
36
|
```json
|
|
33
37
|
{
|
|
34
38
|
"env": {
|
|
@@ -40,6 +44,7 @@ For detailed environment variable configuration and available `WAVE_*` variables
|
|
|
40
44
|
|
|
41
45
|
### 3. Permissions
|
|
42
46
|
Manage tool permissions and define the "Safe Zone". Changes to permissions take effect immediately with live reload.
|
|
47
|
+
For detailed permission configuration and available permission modes, see [PERMISSIONS.md](${WAVE_SKILL_DIR}/PERMISSIONS.md).
|
|
43
48
|
```json
|
|
44
49
|
{
|
|
45
50
|
"permissions": {
|
|
@@ -52,7 +57,7 @@ Manage tool permissions and define the "Safe Zone". Changes to permissions take
|
|
|
52
57
|
```
|
|
53
58
|
|
|
54
59
|
### 4. Model Configuration
|
|
55
|
-
Define which AI models Wave should use and set model-specific parameters like `temperature`, `reasoning_effort`, and `thinking`.
|
|
60
|
+
Define which AI models Wave should use and set model-specific parameters like `temperature`, `reasoning_effort`, and `thinking`. You can also configure model selection and token limits via environment variables in the `env` field.
|
|
56
61
|
For detailed model configuration, see [MODELS.md](${WAVE_SKILL_DIR}/MODELS.md).
|
|
57
62
|
```json
|
|
58
63
|
{
|
|
@@ -98,7 +103,11 @@ You can ask me to:
|
|
|
98
103
|
- "Update my project settings to enable auto-memory"
|
|
99
104
|
- "How do I configure a post-commit hook?"
|
|
100
105
|
- "What are the available permission modes?"
|
|
106
|
+
- "Update my permission mode to acceptEdits"
|
|
107
|
+
- "How do I extend the Safe Zone for permissions?"
|
|
101
108
|
- "How do I create a custom skill?"
|
|
102
109
|
- "How do I define a new subagent?"
|
|
110
|
+
- "How do I set max input tokens?"
|
|
111
|
+
- "How do I change the model?"
|
|
103
112
|
|
|
104
113
|
I will guide you through the process and ensure your configuration is valid.
|
|
@@ -21,6 +21,8 @@ export interface PermissionManagerOptions {
|
|
|
21
21
|
instanceDeniedRules?: string[];
|
|
22
22
|
/** Additional directories considered part of the Safe Zone */
|
|
23
23
|
additionalDirectories?: string[];
|
|
24
|
+
/** System additional directories (persistent across reloads) */
|
|
25
|
+
systemAdditionalDirectories?: string[];
|
|
24
26
|
/** The main working directory */
|
|
25
27
|
workdir?: string;
|
|
26
28
|
/** Path to the current plan file */
|
|
@@ -77,6 +79,10 @@ export declare class PermissionManager {
|
|
|
77
79
|
* Get all additional directories
|
|
78
80
|
*/
|
|
79
81
|
getAdditionalDirectories(): string[];
|
|
82
|
+
/**
|
|
83
|
+
* Get all system additional directories
|
|
84
|
+
*/
|
|
85
|
+
getSystemAdditionalDirectories(): string[];
|
|
80
86
|
/**
|
|
81
87
|
* Get all default allowed rules
|
|
82
88
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissionManager.d.ts","sourceRoot":"","sources":["../../src/managers/permissionManager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EACV,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EACf,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAkBhD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAgElD,MAAM,WAAW,wBAAwB;IACvC,+CAA+C;IAC/C,wBAAwB,CAAC,EAAE,cAAc,CAAC;IAC1C,kCAAkC;IAClC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,0DAA0D;IAC1D,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,yDAAyD;IACzD,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,8DAA8D;IAC9D,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oCAAoC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sBAAsB;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,iBAAiB;IAiB1B,OAAO,CAAC,SAAS;IAhBnB,OAAO,CAAC,wBAAwB,CAAC,CAAiB;IAClD,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,oBAAoB,CAAgB;IAC5C,OAAO,CAAC,mBAAmB,CAAgB;IAC3C,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,qBAAqB,CAAgB;IAC7C,OAAO,CAAC,2BAA2B,CAAgB;IACnD,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,gCAAgC,CAAC,CAAiC;IAC1E,OAAO,CAAC,OAAO,CAAC,CAAS;gBAGf,SAAS,EAAE,SAAS,EAC5B,OAAO,GAAE,wBAA6B;
|
|
1
|
+
{"version":3,"file":"permissionManager.d.ts","sourceRoot":"","sources":["../../src/managers/permissionManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -88,6 +88,9 @@ export class PermissionManager {
|
|
|
88
88
|
this.planFilePath = options.planFilePath;
|
|
89
89
|
this._logger = options.logger;
|
|
90
90
|
this.updateAdditionalDirectories(options.additionalDirectories || []);
|
|
91
|
+
for (const dir of options.systemAdditionalDirectories || []) {
|
|
92
|
+
this.addSystemAdditionalDirectory(dir);
|
|
93
|
+
}
|
|
91
94
|
this.worktreeName = this.container.get("WorktreeName");
|
|
92
95
|
this.mainRepoRoot = this.container.get("MainRepoRoot");
|
|
93
96
|
}
|
|
@@ -145,6 +148,12 @@ export class PermissionManager {
|
|
|
145
148
|
getAdditionalDirectories() {
|
|
146
149
|
return [...this.additionalDirectories];
|
|
147
150
|
}
|
|
151
|
+
/**
|
|
152
|
+
* Get all system additional directories
|
|
153
|
+
*/
|
|
154
|
+
getSystemAdditionalDirectories() {
|
|
155
|
+
return [...this.systemAdditionalDirectories];
|
|
156
|
+
}
|
|
148
157
|
/**
|
|
149
158
|
* Get all default allowed rules
|
|
150
159
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagentManager.d.ts","sourceRoot":"","sources":["../../src/managers/subagentManager.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"subagentManager.d.ts","sourceRoot":"","sources":["../../src/managers/subagentManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -78,6 +78,7 @@ export class SubagentManager {
|
|
|
78
78
|
AGENT_TOOL_NAME, // Always deny Agent tool in subagents to prevent recursion
|
|
79
79
|
],
|
|
80
80
|
additionalDirectories: parentPermissionManager?.getAdditionalDirectories(),
|
|
81
|
+
systemAdditionalDirectories: parentPermissionManager?.getSystemAdditionalDirectories(),
|
|
81
82
|
planFilePath: parentPermissionManager?.getPlanFilePath(),
|
|
82
83
|
});
|
|
83
84
|
subagentContainer.register("PermissionManager", subagentPermissionManager);
|
|
@@ -311,6 +312,11 @@ export class SubagentManager {
|
|
|
311
312
|
: undefined;
|
|
312
313
|
// If this was transitioned to background, update the background task
|
|
313
314
|
if (instance.backgroundTaskId && backgroundTaskManager) {
|
|
315
|
+
// Write final response and completion status to log before closing
|
|
316
|
+
if (instance.logStream && response) {
|
|
317
|
+
instance.logStream.write(`[${new Date().toISOString()}] Final response:\n${response}\n`);
|
|
318
|
+
}
|
|
319
|
+
instance.logStream?.write(`[${new Date().toISOString()}] Agent completed successfully\n`);
|
|
314
320
|
instance.logStream?.end();
|
|
315
321
|
const task = backgroundTaskManager.getTask(instance.backgroundTaskId);
|
|
316
322
|
if (task) {
|
|
@@ -330,6 +336,8 @@ export class SubagentManager {
|
|
|
330
336
|
: undefined;
|
|
331
337
|
// If this was transitioned to background, update the background task with error
|
|
332
338
|
if (instance.backgroundTaskId && backgroundTaskManager) {
|
|
339
|
+
// Write error to log before closing
|
|
340
|
+
instance.logStream?.write(`[${new Date().toISOString()}] Agent failed: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
333
341
|
instance.logStream?.end();
|
|
334
342
|
const task = backgroundTaskManager.getTask(instance.backgroundTaskId);
|
|
335
343
|
if (task) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { OpenAIClient } from "../utils/openaiClient.js";
|
|
2
2
|
import { logger } from "../utils/globalLogger.js";
|
|
3
3
|
import { addOnceAbortListener } from "../utils/abortUtils.js";
|
|
4
|
-
import { transformMessagesForClaudeCache, addCacheControlToLastTool,
|
|
4
|
+
import { transformMessagesForClaudeCache, addCacheControlToLastTool, supportsPromptCaching, extendUsageWithCacheMetrics, } from "../utils/cacheControlUtils.js";
|
|
5
5
|
import * as os from "os";
|
|
6
6
|
import * as fs from "fs";
|
|
7
7
|
import * as path from "path";
|
|
@@ -96,7 +96,7 @@ export async function callAgent(options) {
|
|
|
96
96
|
const currentModel = model || modelConfig.model;
|
|
97
97
|
const resolvedMaxTokens = options.maxTokens ?? modelConfig.maxTokens;
|
|
98
98
|
processedTools = tools;
|
|
99
|
-
if (
|
|
99
|
+
if (supportsPromptCaching(currentModel)) {
|
|
100
100
|
openaiMessages = transformMessagesForClaudeCache(openaiMessages, currentModel);
|
|
101
101
|
// Apply cache control to tools separately
|
|
102
102
|
if (tools && tools.length > 0) {
|
|
@@ -163,7 +163,7 @@ export async function callAgent(options) {
|
|
|
163
163
|
}
|
|
164
164
|
: undefined;
|
|
165
165
|
// Extend usage with cache metrics for Claude models
|
|
166
|
-
if (totalUsage &&
|
|
166
|
+
if (totalUsage && supportsPromptCaching(currentModel) && response.usage) {
|
|
167
167
|
totalUsage = extendUsageWithCacheMetrics(totalUsage, response.usage);
|
|
168
168
|
}
|
|
169
169
|
const result = {};
|
|
@@ -313,7 +313,7 @@ async function processStreamingResponse(stream, onContentUpdate, onToolUpdate, o
|
|
|
313
313
|
total_tokens: chunk.usage.total_tokens,
|
|
314
314
|
};
|
|
315
315
|
// Extend usage with cache metrics for Claude models
|
|
316
|
-
if (modelName &&
|
|
316
|
+
if (modelName && supportsPromptCaching(modelName)) {
|
|
317
317
|
chunkUsage = extendUsageWithCacheMetrics(chunkUsage, chunk.usage);
|
|
318
318
|
}
|
|
319
319
|
usage = chunkUsage;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configurationService.d.ts","sourceRoot":"","sources":["../../src/services/configurationService.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EACV,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,KAAK,EACN,MAAM,2BAA2B,CAAC;AAOnC,OAAO,EACL,KAAK,2BAA2B,EAChC,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAE7B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,aAAa,EACb,WAAW,EAGX,cAAc,EACd,YAAY,EACb,MAAM,mBAAmB,CAAC;AAK3B,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAGvC;;;;;GAKG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,oBAAoB,CAAkC;IAC9D,OAAO,CAAC,GAAG,CAA8B;IACzC,OAAO,CAAC,OAAO,CAAoB;IAEnC;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAMvC;;OAEG;IACG,uBAAuB,CAC3B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,uBAAuB,CAAC;IA4DnC;;OAEG;IACH,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,GAAG,gBAAgB;
|
|
1
|
+
{"version":3,"file":"configurationService.d.ts","sourceRoot":"","sources":["../../src/services/configurationService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initializationService.d.ts","sourceRoot":"","sources":["../../src/services/initializationService.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"initializationService.d.ts","sourceRoot":"","sources":["../../src/services/initializationService.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,OAAO,EACP,MAAM,EACN,YAAY,EACZ,WAAW,EACZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAIpD,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,YAAY,CAAC;IAC3B,eAAe,EAAE,eAAe,CAAC;IACjC,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,EAAE,WAAW,CAAC;IACzB,aAAa,EAAE,aAAa,CAAC;IAC7B,OAAO,EAAE,YAAY,CAAC;IACtB,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,WAAW,CAAC;IACxB,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,EAAE,cAAc,CAAC;IAC/B,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,WAAW,EAAE,WAAW,CAAC;IACzB,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,wBAAwB,EAAE,MAAM,IAAI,CAAC;CACtC;AAED,qBAAa,qBAAqB;WACZ,UAAU,CAC5B,OAAO,EAAE,qBAAqB,EAC9B,OAAO,CAAC,EAAE;QACR,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;QAC9B,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;KACtB,GACA,OAAO,CAAC,IAAI,CAAC;CAuRjB"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { handleSessionRestoration } from "./session.js";
|
|
2
2
|
import { setGlobalLogger } from "../utils/globalLogger.js";
|
|
3
3
|
import { LspManager } from "../managers/lspManager.js";
|
|
4
|
+
import { USER_MEMORY_FILE } from "../utils/constants.js";
|
|
4
5
|
export class InitializationService {
|
|
5
6
|
static async initialize(context, options) {
|
|
6
7
|
const { skillManager, subagentManager, container, toolManager, pluginManager, options: agentOptions, slashCommandManager, logger, mcpManager, workdir, lspManager, configurationService, hookManager, messageManager, memoryRuleManager, liveConfigManager, taskManager, setProjectMemory, setUserMemory, resolveAndValidateConfig, } = context;
|
|
@@ -108,6 +109,7 @@ export class InitializationService {
|
|
|
108
109
|
if (permissionManager) {
|
|
109
110
|
const autoMemoryDir = memoryService.getAutoMemoryDirectory(workdir);
|
|
110
111
|
permissionManager.addSystemAdditionalDirectory(autoMemoryDir);
|
|
112
|
+
permissionManager.addSystemAdditionalDirectory(USER_MEMORY_FILE);
|
|
111
113
|
}
|
|
112
114
|
}
|
|
113
115
|
}
|
|
@@ -42,12 +42,19 @@ export interface ClaudeUsage extends CompletionUsage {
|
|
|
42
42
|
ephemeral_1h_input_tokens: number;
|
|
43
43
|
};
|
|
44
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Determines if a model supports prompt caching
|
|
47
|
+
* @param modelName - Model identifier
|
|
48
|
+
* @returns True if model name matches the cache pattern (default: contains 'claude')
|
|
49
|
+
*/
|
|
50
|
+
export declare function supportsPromptCaching(modelName: string): boolean;
|
|
45
51
|
/**
|
|
46
52
|
* Determines if a model supports cache control
|
|
47
53
|
* @param modelName - Model identifier
|
|
48
54
|
* @returns True if model name contains 'claude' (case-insensitive)
|
|
55
|
+
* @deprecated Use supportsPromptCaching instead
|
|
49
56
|
*/
|
|
50
|
-
export declare
|
|
57
|
+
export declare const isClaudeModel: typeof supportsPromptCaching;
|
|
51
58
|
/**
|
|
52
59
|
* Validates cache control structure
|
|
53
60
|
* @param control - Object to validate
|
|
@@ -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,0BAA0B,EAE1B,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;;GAEG;AACH,MAAM,WAAW,gCACf,SAAQ,0BAA0B;IAClC,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,0BAA0B,CAAC,UAAU,CAAC,CAAC;IACjD,aAAa,CAAC,EAAE,YAAY,CAAC;CAC9B;AAED;;GAEG;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;CACH;AAUD;;;;GAIG;AACH,wBAAgB,
|
|
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,0BAA0B,EAE1B,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;;GAEG;AACH,MAAM,WAAW,gCACf,SAAQ,0BAA0B;IAClC,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,0BAA0B,CAAC,UAAU,CAAC,CAAC;IACjD,aAAa,CAAC,EAAE,YAAY,CAAC;CAC9B;AAED;;GAEG;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;CACH;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;AA0BD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,GAAG,yBAAyB,EAAE,EAC7C,WAAW,EAAE,OAAO,GACnB,mCAAmC,EAAE,CAkEvC;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,0BAA0B,EAAE,GAClC,gCAAgC,EAAE,CAwCpC;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,0BAA0B,EAAE,GACrC,MAAM,CAoBR;AAED;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,0BAA0B,EAAE,EACtC,SAAS,EAAE,MAAM,GAChB,0BAA0B,EAAE,CAgG9B;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,eAAe,EAC9B,YAAY,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAClC,WAAW,CAkCb;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAyCvE"}
|
|
@@ -13,11 +13,11 @@ import { logger } from "./globalLogger.js";
|
|
|
13
13
|
// Utility Functions (Basic Structure - to be implemented)
|
|
14
14
|
// ============================================================================
|
|
15
15
|
/**
|
|
16
|
-
* Determines if a model supports
|
|
16
|
+
* Determines if a model supports prompt caching
|
|
17
17
|
* @param modelName - Model identifier
|
|
18
|
-
* @returns True if model name contains 'claude'
|
|
18
|
+
* @returns True if model name matches the cache pattern (default: contains 'claude')
|
|
19
19
|
*/
|
|
20
|
-
export function
|
|
20
|
+
export function supportsPromptCaching(modelName) {
|
|
21
21
|
// Handle null, undefined, and non-string inputs
|
|
22
22
|
if (!modelName || typeof modelName !== "string") {
|
|
23
23
|
return false;
|
|
@@ -27,8 +27,23 @@ export function isClaudeModel(modelName) {
|
|
|
27
27
|
if (trimmed.length === 0) {
|
|
28
28
|
return false;
|
|
29
29
|
}
|
|
30
|
-
|
|
30
|
+
const cachePattern = process.env.WAVE_PROMPT_CACHE_REGEX || "claude";
|
|
31
|
+
try {
|
|
32
|
+
const regex = new RegExp(cachePattern, "i");
|
|
33
|
+
return regex.test(trimmed);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// If regex is invalid, fall back to simple includes check with default
|
|
37
|
+
return trimmed.toLowerCase().includes("claude");
|
|
38
|
+
}
|
|
31
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* Determines if a model supports cache control
|
|
42
|
+
* @param modelName - Model identifier
|
|
43
|
+
* @returns True if model name contains 'claude' (case-insensitive)
|
|
44
|
+
* @deprecated Use supportsPromptCaching instead
|
|
45
|
+
*/
|
|
46
|
+
export const isClaudeModel = supportsPromptCaching;
|
|
32
47
|
/**
|
|
33
48
|
* Validates cache control structure
|
|
34
49
|
* @param control - Object to validate
|
|
@@ -195,8 +210,8 @@ export function transformMessagesForClaudeCache(messages, modelName) {
|
|
|
195
210
|
if (messages.length === 0) {
|
|
196
211
|
return [];
|
|
197
212
|
}
|
|
198
|
-
// Only apply cache control for
|
|
199
|
-
if (!
|
|
213
|
+
// Only apply cache control for models that support prompt caching
|
|
214
|
+
if (!supportsPromptCaching(modelName)) {
|
|
200
215
|
return messages;
|
|
201
216
|
}
|
|
202
217
|
// Find the latest interval message index (20th, 40th, 60th, etc.)
|
|
@@ -228,11 +243,13 @@ export function transformMessagesForClaudeCache(messages, modelName) {
|
|
|
228
243
|
}
|
|
229
244
|
// Interval-based message caching: cache message at latest interval position (sliding window)
|
|
230
245
|
if (index === intervalMessageIndex) {
|
|
231
|
-
// If the message is a tool role, add cache control
|
|
246
|
+
// If the message is a tool role, add cache control to the content block
|
|
232
247
|
if (message.role === "tool") {
|
|
248
|
+
const content = typeof message.content === "string" ? message.content : "";
|
|
249
|
+
const transformedContent = addCacheControlToContent(content, true);
|
|
233
250
|
return {
|
|
234
251
|
...message,
|
|
235
|
-
|
|
252
|
+
content: transformedContent,
|
|
236
253
|
};
|
|
237
254
|
}
|
|
238
255
|
// If the message has tool calls, cache the last tool call instead of content
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"containerSetup.d.ts","sourceRoot":"","sources":["../../src/utils/containerSetup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAqB3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"containerSetup.d.ts","sourceRoot":"","sources":["../../src/utils/containerSetup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAqB3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAM3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EACV,cAAc,EACd,KAAK,EACL,IAAI,EACJ,cAAc,EAEf,MAAM,mBAAmB,CAAC;AAI3B,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAGhB,uBAAuB,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,IAAI,CAAC;IAC3D,aAAa,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IACvC,sBAAsB,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACvD,wBAAwB,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACzD,iBAAiB,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IAClD,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,0BAA0B,GACvC,SAAS,CA8PX"}
|
|
@@ -23,6 +23,7 @@ import { ReversionService } from "../services/reversionService.js";
|
|
|
23
23
|
import { MemoryService } from "../services/memory.js";
|
|
24
24
|
import { AutoMemoryService } from "../services/autoMemoryService.js";
|
|
25
25
|
import { getGitMainRepoRoot } from "./gitUtils.js";
|
|
26
|
+
import { USER_MEMORY_FILE } from "./constants.js";
|
|
26
27
|
import { logger } from "./globalLogger.js";
|
|
27
28
|
export function setupAgentContainer(setupOptions) {
|
|
28
29
|
const { options, workdir, configurationService, systemPrompt, stream, onBackgroundTasksChange, onTasksChange, onPermissionModeChange, handlePlanModeTransition, setPermissionMode, addPermissionRule, addUsage, } = setupOptions;
|
|
@@ -93,6 +94,7 @@ export function setupAgentContainer(setupOptions) {
|
|
|
93
94
|
if (configurationService.resolveAutoMemoryEnabled()) {
|
|
94
95
|
const autoMemoryDir = memoryService.getAutoMemoryDirectory(workdir);
|
|
95
96
|
permissionManager.addSystemAdditionalDirectory(autoMemoryDir);
|
|
97
|
+
permissionManager.addSystemAdditionalDirectory(USER_MEMORY_FILE);
|
|
96
98
|
}
|
|
97
99
|
container.register("PermissionManager", permissionManager);
|
|
98
100
|
permissionManager.setOnConfiguredPermissionModeChange((mode) => {
|
package/package.json
CHANGED
|
@@ -110,6 +110,8 @@ export interface PermissionManagerOptions {
|
|
|
110
110
|
instanceDeniedRules?: string[];
|
|
111
111
|
/** Additional directories considered part of the Safe Zone */
|
|
112
112
|
additionalDirectories?: string[];
|
|
113
|
+
/** System additional directories (persistent across reloads) */
|
|
114
|
+
systemAdditionalDirectories?: string[];
|
|
113
115
|
/** The main working directory */
|
|
114
116
|
workdir?: string;
|
|
115
117
|
/** Path to the current plan file */
|
|
@@ -147,6 +149,9 @@ export class PermissionManager {
|
|
|
147
149
|
this.planFilePath = options.planFilePath;
|
|
148
150
|
this._logger = options.logger;
|
|
149
151
|
this.updateAdditionalDirectories(options.additionalDirectories || []);
|
|
152
|
+
for (const dir of options.systemAdditionalDirectories || []) {
|
|
153
|
+
this.addSystemAdditionalDirectory(dir);
|
|
154
|
+
}
|
|
150
155
|
|
|
151
156
|
this.worktreeName = this.container.get<string>("WorktreeName");
|
|
152
157
|
this.mainRepoRoot = this.container.get<string>("MainRepoRoot");
|
|
@@ -220,6 +225,13 @@ export class PermissionManager {
|
|
|
220
225
|
return [...this.additionalDirectories];
|
|
221
226
|
}
|
|
222
227
|
|
|
228
|
+
/**
|
|
229
|
+
* Get all system additional directories
|
|
230
|
+
*/
|
|
231
|
+
public getSystemAdditionalDirectories(): string[] {
|
|
232
|
+
return [...this.systemAdditionalDirectories];
|
|
233
|
+
}
|
|
234
|
+
|
|
223
235
|
/**
|
|
224
236
|
* Get all default allowed rules
|
|
225
237
|
*/
|
|
@@ -194,6 +194,8 @@ export class SubagentManager {
|
|
|
194
194
|
],
|
|
195
195
|
additionalDirectories:
|
|
196
196
|
parentPermissionManager?.getAdditionalDirectories(),
|
|
197
|
+
systemAdditionalDirectories:
|
|
198
|
+
parentPermissionManager?.getSystemAdditionalDirectories(),
|
|
197
199
|
planFilePath: parentPermissionManager?.getPlanFilePath(),
|
|
198
200
|
});
|
|
199
201
|
subagentContainer.register("PermissionManager", subagentPermissionManager);
|
|
@@ -496,6 +498,15 @@ export class SubagentManager {
|
|
|
496
498
|
|
|
497
499
|
// If this was transitioned to background, update the background task
|
|
498
500
|
if (instance.backgroundTaskId && backgroundTaskManager) {
|
|
501
|
+
// Write final response and completion status to log before closing
|
|
502
|
+
if (instance.logStream && response) {
|
|
503
|
+
instance.logStream.write(
|
|
504
|
+
`[${new Date().toISOString()}] Final response:\n${response}\n`,
|
|
505
|
+
);
|
|
506
|
+
}
|
|
507
|
+
instance.logStream?.write(
|
|
508
|
+
`[${new Date().toISOString()}] Agent completed successfully\n`,
|
|
509
|
+
);
|
|
499
510
|
instance.logStream?.end();
|
|
500
511
|
const task = backgroundTaskManager.getTask(instance.backgroundTaskId);
|
|
501
512
|
if (task) {
|
|
@@ -516,6 +527,10 @@ export class SubagentManager {
|
|
|
516
527
|
|
|
517
528
|
// If this was transitioned to background, update the background task with error
|
|
518
529
|
if (instance.backgroundTaskId && backgroundTaskManager) {
|
|
530
|
+
// Write error to log before closing
|
|
531
|
+
instance.logStream?.write(
|
|
532
|
+
`[${new Date().toISOString()}] Agent failed: ${error instanceof Error ? error.message : String(error)}\n`,
|
|
533
|
+
);
|
|
519
534
|
instance.logStream?.end();
|
|
520
535
|
const task = backgroundTaskManager.getTask(instance.backgroundTaskId);
|
|
521
536
|
if (task) {
|
|
@@ -13,7 +13,7 @@ import type { GatewayConfig, ModelConfig } from "../types/index.js";
|
|
|
13
13
|
import {
|
|
14
14
|
transformMessagesForClaudeCache,
|
|
15
15
|
addCacheControlToLastTool,
|
|
16
|
-
|
|
16
|
+
supportsPromptCaching,
|
|
17
17
|
extendUsageWithCacheMetrics,
|
|
18
18
|
type ClaudeUsage,
|
|
19
19
|
} from "../utils/cacheControlUtils.js";
|
|
@@ -250,7 +250,7 @@ export async function callAgent(
|
|
|
250
250
|
|
|
251
251
|
processedTools = tools;
|
|
252
252
|
|
|
253
|
-
if (
|
|
253
|
+
if (supportsPromptCaching(currentModel)) {
|
|
254
254
|
openaiMessages = transformMessagesForClaudeCache(
|
|
255
255
|
openaiMessages,
|
|
256
256
|
currentModel,
|
|
@@ -351,7 +351,7 @@ export async function callAgent(
|
|
|
351
351
|
: undefined;
|
|
352
352
|
|
|
353
353
|
// Extend usage with cache metrics for Claude models
|
|
354
|
-
if (totalUsage &&
|
|
354
|
+
if (totalUsage && supportsPromptCaching(currentModel) && response.usage) {
|
|
355
355
|
totalUsage = extendUsageWithCacheMetrics(
|
|
356
356
|
totalUsage,
|
|
357
357
|
response.usage as Partial<ClaudeUsage>,
|
|
@@ -572,7 +572,7 @@ async function processStreamingResponse(
|
|
|
572
572
|
};
|
|
573
573
|
|
|
574
574
|
// Extend usage with cache metrics for Claude models
|
|
575
|
-
if (modelName &&
|
|
575
|
+
if (modelName && supportsPromptCaching(modelName)) {
|
|
576
576
|
chunkUsage = extendUsageWithCacheMetrics(
|
|
577
577
|
chunkUsage,
|
|
578
578
|
chunk.usage as Partial<ClaudeUsage>,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { handleSessionRestoration } from "./session.js";
|
|
2
2
|
import { setGlobalLogger } from "../utils/globalLogger.js";
|
|
3
3
|
import { LspManager } from "../managers/lspManager.js";
|
|
4
|
+
import { USER_MEMORY_FILE } from "../utils/constants.js";
|
|
4
5
|
import type {
|
|
5
6
|
Message,
|
|
6
7
|
Logger,
|
|
@@ -221,6 +222,7 @@ export class InitializationService {
|
|
|
221
222
|
if (permissionManager) {
|
|
222
223
|
const autoMemoryDir = memoryService.getAutoMemoryDirectory(workdir);
|
|
223
224
|
permissionManager.addSystemAdditionalDirectory(autoMemoryDir);
|
|
225
|
+
permissionManager.addSystemAdditionalDirectory(USER_MEMORY_FILE);
|
|
224
226
|
}
|
|
225
227
|
}
|
|
226
228
|
}
|
|
@@ -73,11 +73,11 @@ export interface ClaudeUsage extends CompletionUsage {
|
|
|
73
73
|
// ============================================================================
|
|
74
74
|
|
|
75
75
|
/**
|
|
76
|
-
* Determines if a model supports
|
|
76
|
+
* Determines if a model supports prompt caching
|
|
77
77
|
* @param modelName - Model identifier
|
|
78
|
-
* @returns True if model name contains 'claude'
|
|
78
|
+
* @returns True if model name matches the cache pattern (default: contains 'claude')
|
|
79
79
|
*/
|
|
80
|
-
export function
|
|
80
|
+
export function supportsPromptCaching(modelName: string): boolean {
|
|
81
81
|
// Handle null, undefined, and non-string inputs
|
|
82
82
|
if (!modelName || typeof modelName !== "string") {
|
|
83
83
|
return false;
|
|
@@ -89,9 +89,24 @@ export function isClaudeModel(modelName: string): boolean {
|
|
|
89
89
|
return false;
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
-
|
|
92
|
+
const cachePattern = process.env.WAVE_PROMPT_CACHE_REGEX || "claude";
|
|
93
|
+
try {
|
|
94
|
+
const regex = new RegExp(cachePattern, "i");
|
|
95
|
+
return regex.test(trimmed);
|
|
96
|
+
} catch {
|
|
97
|
+
// If regex is invalid, fall back to simple includes check with default
|
|
98
|
+
return trimmed.toLowerCase().includes("claude");
|
|
99
|
+
}
|
|
93
100
|
}
|
|
94
101
|
|
|
102
|
+
/**
|
|
103
|
+
* Determines if a model supports cache control
|
|
104
|
+
* @param modelName - Model identifier
|
|
105
|
+
* @returns True if model name contains 'claude' (case-insensitive)
|
|
106
|
+
* @deprecated Use supportsPromptCaching instead
|
|
107
|
+
*/
|
|
108
|
+
export const isClaudeModel = supportsPromptCaching;
|
|
109
|
+
|
|
95
110
|
/**
|
|
96
111
|
* Validates cache control structure
|
|
97
112
|
* @param control - Object to validate
|
|
@@ -308,8 +323,8 @@ export function transformMessagesForClaudeCache(
|
|
|
308
323
|
return [];
|
|
309
324
|
}
|
|
310
325
|
|
|
311
|
-
// Only apply cache control for
|
|
312
|
-
if (!
|
|
326
|
+
// Only apply cache control for models that support prompt caching
|
|
327
|
+
if (!supportsPromptCaching(modelName)) {
|
|
313
328
|
return messages;
|
|
314
329
|
}
|
|
315
330
|
|
|
@@ -352,11 +367,15 @@ export function transformMessagesForClaudeCache(
|
|
|
352
367
|
|
|
353
368
|
// Interval-based message caching: cache message at latest interval position (sliding window)
|
|
354
369
|
if (index === intervalMessageIndex) {
|
|
355
|
-
// If the message is a tool role, add cache control
|
|
370
|
+
// If the message is a tool role, add cache control to the content block
|
|
356
371
|
if (message.role === "tool") {
|
|
372
|
+
const content =
|
|
373
|
+
typeof message.content === "string" ? message.content : "";
|
|
374
|
+
const transformedContent = addCacheControlToContent(content, true);
|
|
375
|
+
|
|
357
376
|
return {
|
|
358
377
|
...message,
|
|
359
|
-
|
|
378
|
+
content: transformedContent,
|
|
360
379
|
} as ChatCompletionMessageParam;
|
|
361
380
|
}
|
|
362
381
|
// If the message has tool calls, cache the last tool call instead of content
|
|
@@ -24,6 +24,7 @@ import { ReversionService } from "../services/reversionService.js";
|
|
|
24
24
|
import { MemoryService } from "../services/memory.js";
|
|
25
25
|
import { AutoMemoryService } from "../services/autoMemoryService.js";
|
|
26
26
|
import { getGitMainRepoRoot } from "./gitUtils.js";
|
|
27
|
+
import { USER_MEMORY_FILE } from "./constants.js";
|
|
27
28
|
import type { AgentOptions } from "../types/index.js";
|
|
28
29
|
import type {
|
|
29
30
|
PermissionMode,
|
|
@@ -150,6 +151,7 @@ export function setupAgentContainer(
|
|
|
150
151
|
if (configurationService.resolveAutoMemoryEnabled()) {
|
|
151
152
|
const autoMemoryDir = memoryService.getAutoMemoryDirectory(workdir);
|
|
152
153
|
permissionManager.addSystemAdditionalDirectory(autoMemoryDir);
|
|
154
|
+
permissionManager.addSystemAdditionalDirectory(USER_MEMORY_FILE);
|
|
153
155
|
}
|
|
154
156
|
container.register("PermissionManager", permissionManager);
|
|
155
157
|
permissionManager.setOnConfiguredPermissionModeChange((mode) => {
|