@tuanhung303/opencode-acp 2.2.0 → 2.2.1
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/README.md +131 -71
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/commands/budget.d.ts +15 -0
- package/dist/lib/commands/budget.d.ts.map +1 -0
- package/dist/lib/commands/budget.js +120 -0
- package/dist/lib/commands/budget.js.map +1 -0
- package/dist/lib/commands/context.d.ts +1 -1
- package/dist/lib/commands/context.js +4 -4
- package/dist/lib/commands/context.js.map +1 -1
- package/dist/lib/commands/help.d.ts.map +1 -1
- package/dist/lib/commands/help.js +2 -0
- package/dist/lib/commands/help.js.map +1 -1
- package/dist/lib/commands/protected.d.ts +17 -0
- package/dist/lib/commands/protected.d.ts.map +1 -0
- package/dist/lib/commands/protected.js +50 -0
- package/dist/lib/commands/protected.js.map +1 -0
- package/dist/lib/commands/stats.d.ts +1 -1
- package/dist/lib/commands/stats.d.ts.map +1 -1
- package/dist/lib/commands/stats.js +24 -4
- package/dist/lib/commands/stats.js.map +1 -1
- package/dist/lib/commands/sweep.d.ts.map +1 -1
- package/dist/lib/commands/sweep.js +5 -2
- package/dist/lib/commands/sweep.js.map +1 -1
- package/dist/lib/config-schema.d.ts +119 -0
- package/dist/lib/config-schema.d.ts.map +1 -0
- package/dist/lib/config-schema.js +97 -0
- package/dist/lib/config-schema.js.map +1 -0
- package/dist/lib/config.d.ts +7 -30
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +45 -483
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/hooks.d.ts +14 -0
- package/dist/lib/hooks.d.ts.map +1 -1
- package/dist/lib/hooks.js +120 -13
- package/dist/lib/hooks.js.map +1 -1
- package/dist/lib/logger.d.ts +25 -1
- package/dist/lib/logger.d.ts.map +1 -1
- package/dist/lib/logger.js +45 -4
- package/dist/lib/logger.js.map +1 -1
- package/dist/lib/messages/index.d.ts +1 -1
- package/dist/lib/messages/index.d.ts.map +1 -1
- package/dist/lib/messages/index.js +1 -1
- package/dist/lib/messages/index.js.map +1 -1
- package/dist/lib/messages/inject.d.ts +6 -1
- package/dist/lib/messages/inject.d.ts.map +1 -1
- package/dist/lib/messages/inject.js +8 -125
- package/dist/lib/messages/inject.js.map +1 -1
- package/dist/lib/messages/prune.d.ts +8 -0
- package/dist/lib/messages/prune.d.ts.map +1 -1
- package/dist/lib/messages/prune.js +89 -2
- package/dist/lib/messages/prune.js.map +1 -1
- package/dist/lib/messages/utils.d.ts +12 -0
- package/dist/lib/messages/utils.d.ts.map +1 -1
- package/dist/lib/messages/utils.js +34 -0
- package/dist/lib/messages/utils.js.map +1 -1
- package/dist/lib/prompts/discard-tool-spec.d.ts +1 -1
- package/dist/lib/prompts/discard-tool-spec.d.ts.map +1 -1
- package/dist/lib/prompts/discard-tool-spec.js +30 -17
- package/dist/lib/prompts/discard-tool-spec.js.map +1 -1
- package/dist/lib/prompts/extract-tool-spec.d.ts +1 -1
- package/dist/lib/prompts/extract-tool-spec.d.ts.map +1 -1
- package/dist/lib/prompts/extract-tool-spec.js +19 -11
- package/dist/lib/prompts/extract-tool-spec.js.map +1 -1
- package/dist/lib/prompts/index.d.ts.map +1 -1
- package/dist/lib/prompts/index.js +2 -7
- package/dist/lib/prompts/index.js.map +1 -1
- package/dist/lib/prompts/restore-tool-spec.d.ts +2 -0
- package/dist/lib/prompts/restore-tool-spec.d.ts.map +1 -0
- package/dist/lib/prompts/restore-tool-spec.js +37 -0
- package/dist/lib/prompts/restore-tool-spec.js.map +1 -0
- package/dist/lib/prompts/system/both.d.ts +1 -1
- package/dist/lib/prompts/system/both.d.ts.map +1 -1
- package/dist/lib/prompts/system/both.js +20 -16
- package/dist/lib/prompts/system/both.js.map +1 -1
- package/dist/lib/prompts/system/discard.d.ts +1 -1
- package/dist/lib/prompts/system/discard.d.ts.map +1 -1
- package/dist/lib/prompts/system/discard.js +19 -16
- package/dist/lib/prompts/system/discard.js.map +1 -1
- package/dist/lib/prompts/system/extract.d.ts +1 -1
- package/dist/lib/prompts/system/extract.d.ts.map +1 -1
- package/dist/lib/prompts/system/extract.js +19 -16
- package/dist/lib/prompts/system/extract.js.map +1 -1
- package/dist/lib/protected-file-patterns.js +1 -1
- package/dist/lib/protected-file-patterns.js.map +1 -1
- package/dist/lib/safe-execute.d.ts +20 -0
- package/dist/lib/safe-execute.d.ts.map +1 -0
- package/dist/lib/safe-execute.js +38 -0
- package/dist/lib/safe-execute.js.map +1 -0
- package/dist/lib/shared-utils.js +1 -1
- package/dist/lib/shared-utils.js.map +1 -1
- package/dist/lib/state/persistence.d.ts +6 -1
- package/dist/lib/state/persistence.d.ts.map +1 -1
- package/dist/lib/state/persistence.js +59 -1
- package/dist/lib/state/persistence.js.map +1 -1
- package/dist/lib/state/state.d.ts.map +1 -1
- package/dist/lib/state/state.js +54 -3
- package/dist/lib/state/state.js.map +1 -1
- package/dist/lib/state/tool-cache.d.ts +2 -0
- package/dist/lib/state/tool-cache.d.ts.map +1 -1
- package/dist/lib/state/tool-cache.js +34 -12
- package/dist/lib/state/tool-cache.js.map +1 -1
- package/dist/lib/state/types.d.ts +50 -5
- package/dist/lib/state/types.d.ts.map +1 -1
- package/dist/lib/strategies/deduplication.d.ts +1 -0
- package/dist/lib/strategies/deduplication.d.ts.map +1 -1
- package/dist/lib/strategies/deduplication.js +87 -3
- package/dist/lib/strategies/deduplication.js.map +1 -1
- package/dist/lib/strategies/index.d.ts +1 -5
- package/dist/lib/strategies/index.d.ts.map +1 -1
- package/dist/lib/strategies/index.js +1 -5
- package/dist/lib/strategies/index.js.map +1 -1
- package/dist/lib/strategies/purge-errors.d.ts.map +1 -1
- package/dist/lib/strategies/purge-errors.js +4 -1
- package/dist/lib/strategies/purge-errors.js.map +1 -1
- package/dist/lib/strategies/supersede-writes.d.ts.map +1 -1
- package/dist/lib/strategies/supersede-writes.js +7 -1
- package/dist/lib/strategies/supersede-writes.js.map +1 -1
- package/dist/lib/strategies/tools.d.ts +1 -0
- package/dist/lib/strategies/tools.d.ts.map +1 -1
- package/dist/lib/strategies/tools.js +215 -62
- package/dist/lib/strategies/tools.js.map +1 -1
- package/dist/lib/ui/notification.d.ts +5 -2
- package/dist/lib/ui/notification.d.ts.map +1 -1
- package/dist/lib/ui/notification.js +10 -6
- package/dist/lib/ui/notification.js.map +1 -1
- package/dist/lib/ui/utils.d.ts +3 -3
- package/dist/lib/ui/utils.d.ts.map +1 -1
- package/dist/lib/ui/utils.js +38 -12
- package/dist/lib/ui/utils.js.map +1 -1
- package/package.json +7 -12
- package/dist/lib/prompts/nudge/both.d.ts +0 -2
- package/dist/lib/prompts/nudge/both.d.ts.map +0 -1
- package/dist/lib/prompts/nudge/both.js +0 -11
- package/dist/lib/prompts/nudge/both.js.map +0 -1
- package/dist/lib/prompts/nudge/discard.d.ts +0 -2
- package/dist/lib/prompts/nudge/discard.d.ts.map +0 -1
- package/dist/lib/prompts/nudge/discard.js +0 -10
- package/dist/lib/prompts/nudge/discard.js.map +0 -1
- package/dist/lib/prompts/nudge/extract.d.ts +0 -2
- package/dist/lib/prompts/nudge/extract.d.ts.map +0 -1
- package/dist/lib/prompts/nudge/extract.js +0 -10
- package/dist/lib/prompts/nudge/extract.js.map +0 -1
- package/dist/lib/strategies/head-tail-truncation.d.ts +0 -15
- package/dist/lib/strategies/head-tail-truncation.d.ts.map +0 -1
- package/dist/lib/strategies/head-tail-truncation.js +0 -144
- package/dist/lib/strategies/head-tail-truncation.js.map +0 -1
- package/dist/lib/strategies/placeholder-compression.d.ts +0 -5
- package/dist/lib/strategies/placeholder-compression.d.ts.map +0 -1
- package/dist/lib/strategies/placeholder-compression.js +0 -148
- package/dist/lib/strategies/placeholder-compression.js.map +0 -1
- package/dist/lib/strategies/prune-thinking.d.ts +0 -15
- package/dist/lib/strategies/prune-thinking.d.ts.map +0 -1
- package/dist/lib/strategies/prune-thinking.js +0 -79
- package/dist/lib/strategies/prune-thinking.js.map +0 -1
- package/dist/lib/strategies/read-consolidation.d.ts +0 -21
- package/dist/lib/strategies/read-consolidation.d.ts.map +0 -1
- package/dist/lib/strategies/read-consolidation.js +0 -155
- package/dist/lib/strategies/read-consolidation.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,42 +1,10 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
["
|
|
16
|
-
B --> C[Deduplication]
|
|
17
|
-
B --> D[Supersede Writes]
|
|
18
|
-
B --> E[Purge Errors]
|
|
19
|
-
B --> F[Read Consolidation]
|
|
20
|
-
B --> G[Prune Thinking]
|
|
21
|
-
B --> H[Head-Tail Truncation]
|
|
22
|
-
|
|
23
|
-
C --> |Removes identical calls| I[Context Saved]
|
|
24
|
-
D --> |Prunes writes after reads| I
|
|
25
|
-
E --> |Strips failed call inputs| I
|
|
26
|
-
F --> |Stale reads point to new| I
|
|
27
|
-
G --> |Strips reasoning/thinking| I
|
|
28
|
-
H --> |Middle-out truncation| I
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
subgraph "LLM-Driven (High Precision)"
|
|
32
|
-
A --> J[AI Nudge]
|
|
33
|
-
J --> |Suggests Cleanup| K{Agent Action}
|
|
34
|
-
K --> L[Discard Tool]
|
|
35
|
-
K --> M[Extract Tool]
|
|
36
|
-
L --> |Direct removal| I
|
|
37
|
-
M --> |Summarize then remove| I
|
|
38
|
-
end
|
|
39
|
-
```
|
|
1
|
+
# Agentic Context Pruning Plugin
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/@tarquinen/opencode-acp)
|
|
4
|
+
|
|
5
|
+
Automatically reduces token usage in OpenCode by removing obsolete tools from conversation history.
|
|
6
|
+
|
|
7
|
+

|
|
40
8
|
|
|
41
9
|
## Installation
|
|
42
10
|
|
|
@@ -45,61 +13,153 @@ Add to your OpenCode config:
|
|
|
45
13
|
```jsonc
|
|
46
14
|
// opencode.jsonc
|
|
47
15
|
{
|
|
48
|
-
"plugin": ["@
|
|
16
|
+
"plugin": ["@tarquinen/opencode-acp@latest"],
|
|
49
17
|
}
|
|
50
18
|
```
|
|
51
19
|
|
|
52
|
-
|
|
20
|
+
Using `@latest` ensures you always get the newest version automatically when OpenCode starts.
|
|
21
|
+
|
|
22
|
+
Restart OpenCode. The plugin will automatically start optimizing your sessions.
|
|
23
|
+
|
|
24
|
+
## How Pruning Works
|
|
25
|
+
|
|
26
|
+
ACP uses multiple tools and strategies to reduce context size:
|
|
27
|
+
|
|
28
|
+
### Tools
|
|
29
|
+
|
|
30
|
+
**Discard** — Exposes a `discard` tool that the AI can call to remove completed or noisy tool content from context.
|
|
31
|
+
|
|
32
|
+
**Extract** — Exposes an `extract` tool that the AI can call to distill valuable context into concise summaries before removing the tool content.
|
|
53
33
|
|
|
54
|
-
###
|
|
34
|
+
### Strategies
|
|
55
35
|
|
|
56
|
-
|
|
57
|
-
- **Read Consolidation**: When the same file is read multiple times, older outputs are replaced with pointers to the newest version.
|
|
58
|
-
- **Prune Thinking**: Strips ephemeral reasoning blocks (Claude `<thinking>` or OpenAI `reasoning`) from older messages.
|
|
59
|
-
- **Supersede Writes**: Automatically prunes `write` tool inputs once a subsequent `read` of the same file confirms the state.
|
|
60
|
-
- **Deduplication**: Eliminates identical tool calls while preserving the most recent result.
|
|
61
|
-
- **Purge Errors**: Automatically clears inputs from failed tool calls after 2 turns.
|
|
36
|
+
**Deduplication** — Identifies repeated tool calls (e.g., reading the same file multiple times) and keeps only the most recent output. Runs automatically on every request with zero LLM cost.
|
|
62
37
|
|
|
63
|
-
|
|
38
|
+
**Supersede Writes** — Prunes write tool inputs for files that have subsequently been read. When a file is written and later read, the original write content becomes redundant since the current file state is captured in the read result. Runs automatically on every request with zero LLM cost.
|
|
64
39
|
|
|
65
|
-
|
|
66
|
-
- **`extract`**: The agent distills valuable findings into a concise summary before purging the raw data.
|
|
40
|
+
**Purge Errors** — Prunes tool inputs for tools that returned errors after a configurable number of turns (default: 4). Error messages are preserved for context, but the potentially large input content is removed. Runs automatically on every request with zero LLM cost.
|
|
67
41
|
|
|
68
|
-
|
|
42
|
+
Your session history is never modified—ACP replaces pruned content with placeholders before sending requests to your LLM.
|
|
69
43
|
|
|
70
|
-
|
|
44
|
+
## Impact on Prompt Caching
|
|
71
45
|
|
|
72
|
-
|
|
73
|
-
| :------------------- | :------- | :---------- |
|
|
74
|
-
| `purgeErrors.turns` | 4 | **2** |
|
|
75
|
-
| `nudgeFrequency` | 10 | **5** |
|
|
76
|
-
| `supersedeWrites` | Disabled | **Enabled** |
|
|
77
|
-
| `pruneThinking` | N/A | **Enabled** |
|
|
78
|
-
| `headTailTruncation` | N/A | **Enabled** |
|
|
46
|
+
LLM providers like Anthropic and OpenAI cache prompts based on exact prefix matching. When ACP prunes a tool output, it changes the message content, which invalidates cached prefixes from that point forward.
|
|
79
47
|
|
|
80
|
-
|
|
48
|
+
**Trade-off:** You lose some cache read benefits but gain larger token savings from reduced context size and performance improvements through reduced context poisoning. In most cases, the token savings outweigh the cache miss cost—especially in long sessions where context bloat becomes significant.
|
|
81
49
|
|
|
82
|
-
|
|
50
|
+
> **Note:** In testing, cache hit rates were approximately 65% with ACP enabled vs 85% without.
|
|
51
|
+
|
|
52
|
+
**Best use case:** Providers that count usage in requests, such as Github Copilot and Google Antigravity have no negative price impact.
|
|
53
|
+
|
|
54
|
+
## Configuration
|
|
55
|
+
|
|
56
|
+
ACP uses its own config file:
|
|
57
|
+
|
|
58
|
+
- Global: `~/.config/opencode/acp.jsonc` (or `acp.json`), created automatically on first run
|
|
59
|
+
- Custom config directory: `$OPENCODE_CONFIG_DIR/acp.jsonc` (or `acp.json`), if `OPENCODE_CONFIG_DIR` is set
|
|
60
|
+
- Project: `.opencode/acp.jsonc` (or `acp.json`) in your project's `.opencode` directory
|
|
61
|
+
|
|
62
|
+
<details>
|
|
63
|
+
<summary><strong>Default Configuration</strong> (click to expand)</summary>
|
|
83
64
|
|
|
84
65
|
```jsonc
|
|
85
66
|
{
|
|
67
|
+
"$schema": "https://raw.githubusercontent.com/opencode-acp/opencode-acp/master/acp.schema.json",
|
|
68
|
+
// Enable or disable the plugin
|
|
69
|
+
"enabled": true,
|
|
70
|
+
// Enable debug logging to ~/.config/opencode/logs/acp/
|
|
71
|
+
"debug": false,
|
|
72
|
+
// Notification display: "off", "minimal", or "detailed"
|
|
73
|
+
"pruneNotification": "detailed",
|
|
74
|
+
// Slash commands configuration
|
|
75
|
+
"commands": {
|
|
76
|
+
"enabled": true,
|
|
77
|
+
// Additional tools to protect from pruning via commands (e.g., /acp sweep)
|
|
78
|
+
"protectedTools": [],
|
|
79
|
+
},
|
|
80
|
+
// Protect from pruning for <turns> message turns
|
|
81
|
+
"turnProtection": {
|
|
82
|
+
"enabled": false,
|
|
83
|
+
"turns": 4,
|
|
84
|
+
},
|
|
85
|
+
// Protect file operations from pruning via glob patterns
|
|
86
|
+
// Patterns match tool parameters.filePath (e.g. read/write/edit)
|
|
87
|
+
"protectedFilePatterns": [],
|
|
88
|
+
// LLM-driven context pruning tools
|
|
89
|
+
"tools": {
|
|
90
|
+
// Shared settings for all prune tools
|
|
91
|
+
"settings": {
|
|
92
|
+
// Additional tools to protect from pruning
|
|
93
|
+
"protectedTools": [],
|
|
94
|
+
},
|
|
95
|
+
// Removes tool content from context without preservation (for completed tasks or noise)
|
|
96
|
+
"discard": {
|
|
97
|
+
"enabled": true,
|
|
98
|
+
},
|
|
99
|
+
// Distills key findings into preserved knowledge before removing raw content
|
|
100
|
+
"extract": {
|
|
101
|
+
"enabled": true,
|
|
102
|
+
// Show distillation content as an ignored message notification
|
|
103
|
+
"showDistillation": false,
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
// Automatic pruning strategies
|
|
86
107
|
"strategies": {
|
|
87
|
-
|
|
88
|
-
"
|
|
108
|
+
// Remove duplicate tool calls (same tool with same arguments)
|
|
109
|
+
"deduplication": {
|
|
110
|
+
"enabled": true,
|
|
111
|
+
// Additional tools to protect from pruning
|
|
112
|
+
"protectedTools": [],
|
|
113
|
+
},
|
|
114
|
+
// Prune write tool inputs when the file has been subsequently read
|
|
115
|
+
"supersedeWrites": {
|
|
116
|
+
"enabled": false,
|
|
117
|
+
},
|
|
118
|
+
// Prune tool inputs for errored tools after X turns
|
|
119
|
+
"purgeErrors": {
|
|
89
120
|
"enabled": true,
|
|
90
|
-
|
|
91
|
-
"
|
|
121
|
+
// Number of turns before errored tool inputs are pruned
|
|
122
|
+
"turns": 4,
|
|
123
|
+
// Additional tools to protect from pruning
|
|
124
|
+
"protectedTools": [],
|
|
92
125
|
},
|
|
93
|
-
"readConsolidation": { "enabled": true },
|
|
94
126
|
},
|
|
95
127
|
}
|
|
96
128
|
```
|
|
97
129
|
|
|
98
|
-
|
|
130
|
+
</details>
|
|
131
|
+
|
|
132
|
+
### Commands
|
|
133
|
+
|
|
134
|
+
ACP provides a `/acp` slash command:
|
|
135
|
+
|
|
136
|
+
- `/acp` — Shows available ACP commands
|
|
137
|
+
- `/acp context` — Shows a breakdown of your current session's token usage by category (system, user, assistant, tools, etc.) and how much has been saved through pruning.
|
|
138
|
+
- `/acp stats` — Shows cumulative pruning statistics across all sessions.
|
|
139
|
+
- `/acp sweep` — Prunes all tools since the last user message. Accepts an optional count: `/acp sweep 10` prunes the last 10 tools. Respects `commands.protectedTools`.
|
|
140
|
+
|
|
141
|
+
### Turn Protection
|
|
142
|
+
|
|
143
|
+
When enabled, turn protection prevents tool outputs from being pruned for a configurable number of message turns. This gives the AI time to reference recent tool outputs before they become prunable. Applies to both `discard` and `extract` tools, as well as automatic strategies.
|
|
144
|
+
|
|
145
|
+
### Protected Tools
|
|
146
|
+
|
|
147
|
+
By default, these tools are always protected from pruning across all strategies:
|
|
148
|
+
`task`, `todowrite`, `todoread`, `discard`, `extract`, `batch`, `write`, `edit`, `plan_enter`, `plan_exit`
|
|
149
|
+
|
|
150
|
+
The `protectedTools` arrays in each section add to this default list.
|
|
151
|
+
|
|
152
|
+
### Config Precedence
|
|
153
|
+
|
|
154
|
+
Settings are merged in order:
|
|
155
|
+
Defaults → Global (`~/.config/opencode/acp.jsonc`) → Config Dir (`$OPENCODE_CONFIG_DIR/acp.jsonc`) → Project (`.opencode/acp.jsonc`).
|
|
156
|
+
Each level overrides the previous, so project settings take priority over config-dir and global, which take priority over defaults.
|
|
157
|
+
|
|
158
|
+
Restart OpenCode after making config changes.
|
|
159
|
+
|
|
160
|
+
## Limitations
|
|
99
161
|
|
|
100
|
-
|
|
101
|
-
- `/acp stats`: Cumulative efficiency report.
|
|
102
|
-
- `/acp sweep`: Force a manual cleanup of the current session.
|
|
162
|
+
**Subagents** — ACP is disabled for subagents. Subagents are not designed to be token efficient; what matters is that the final message returned to the main agent is a concise summary of findings. ACP's pruning could interfere with this summarization behavior.
|
|
103
163
|
|
|
104
164
|
## License
|
|
105
165
|
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAYjD,QAAA,MAAM,MAAM,EAAE,MAwGK,CAAA;AAEnB,eAAe,MAAM,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { getConfig } from "./lib/config";
|
|
2
2
|
import { Logger } from "./lib/logger";
|
|
3
3
|
import { createSessionState } from "./lib/state";
|
|
4
|
-
import { createDiscardTool, createExtractTool } from "./lib/strategies";
|
|
5
|
-
import { createChatMessageTransformHandler, createCommandExecuteHandler, createSystemPromptHandler, } from "./lib/hooks";
|
|
4
|
+
import { createDiscardTool, createExtractTool, createRestoreTool } from "./lib/strategies";
|
|
5
|
+
import { createChatMessageTransformHandler, createCommandExecuteHandler, createSystemPromptHandler, createToolExecuteAfterHandler, } from "./lib/hooks";
|
|
6
6
|
const plugin = (async (ctx) => {
|
|
7
7
|
const config = getConfig(ctx);
|
|
8
8
|
if (!config.enabled) {
|
|
@@ -23,6 +23,7 @@ const plugin = (async (ctx) => {
|
|
|
23
23
|
logger.debug("Cached variant from chat.message hook", { variant: input.variant });
|
|
24
24
|
},
|
|
25
25
|
"command.execute.before": createCommandExecuteHandler(ctx.client, state, logger, config, ctx.directory),
|
|
26
|
+
"tool.execute.after": createToolExecuteAfterHandler(ctx.client, state, logger, config, ctx.directory),
|
|
26
27
|
tool: {
|
|
27
28
|
...(config.tools.discard.enabled && {
|
|
28
29
|
discard: createDiscardTool({
|
|
@@ -42,6 +43,13 @@ const plugin = (async (ctx) => {
|
|
|
42
43
|
workingDirectory: ctx.directory,
|
|
43
44
|
}),
|
|
44
45
|
}),
|
|
46
|
+
restore: createRestoreTool({
|
|
47
|
+
client: ctx.client,
|
|
48
|
+
state,
|
|
49
|
+
logger,
|
|
50
|
+
config,
|
|
51
|
+
workingDirectory: ctx.directory,
|
|
52
|
+
}),
|
|
45
53
|
},
|
|
46
54
|
config: async (opencodeConfig) => {
|
|
47
55
|
if (config.commands.enabled) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ACP Budget command handler.
|
|
3
|
+
* Shows context budget, usage, and recommendations.
|
|
4
|
+
*/
|
|
5
|
+
import type { Logger } from "../logger";
|
|
6
|
+
import type { SessionState, WithParts } from "../state";
|
|
7
|
+
export interface BudgetCommandContext {
|
|
8
|
+
client: any;
|
|
9
|
+
state: SessionState;
|
|
10
|
+
logger: Logger;
|
|
11
|
+
sessionId: string;
|
|
12
|
+
messages: WithParts[];
|
|
13
|
+
}
|
|
14
|
+
export declare function handleBudgetCommand(ctx: BudgetCommandContext): Promise<void>;
|
|
15
|
+
//# sourceMappingURL=budget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"budget.d.ts","sourceRoot":"","sources":["../../../lib/commands/budget.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAKvD,MAAM,WAAW,oBAAoB;IACjC,MAAM,EAAE,GAAG,CAAA;IACX,KAAK,EAAE,YAAY,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,SAAS,EAAE,CAAA;CACxB;AAgID,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CASlF"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ACP Budget command handler.
|
|
3
|
+
* Shows context budget, usage, and recommendations.
|
|
4
|
+
*/
|
|
5
|
+
import { sendIgnoredMessage } from "../ui/notification";
|
|
6
|
+
import { formatTokenCount } from "../ui/utils";
|
|
7
|
+
import { getCurrentParams } from "../strategies/utils";
|
|
8
|
+
// Estimate tokens from message content (rough approximation)
|
|
9
|
+
function estimateTokens(text) {
|
|
10
|
+
// Rough estimate: 1 token ≈ 4 characters for English text
|
|
11
|
+
return Math.ceil(text.length / 4);
|
|
12
|
+
}
|
|
13
|
+
function calculateContextStats(messages) {
|
|
14
|
+
let systemTokens = 0;
|
|
15
|
+
let userTokens = 0;
|
|
16
|
+
let assistantTokens = 0;
|
|
17
|
+
let toolTokens = 0;
|
|
18
|
+
let toolCount = 0;
|
|
19
|
+
for (const msg of messages) {
|
|
20
|
+
const role = msg.info.role;
|
|
21
|
+
const parts = msg.parts || [];
|
|
22
|
+
for (const part of parts) {
|
|
23
|
+
let text = "";
|
|
24
|
+
if (part.type === "text" && "text" in part && part.text) {
|
|
25
|
+
text = part.text;
|
|
26
|
+
}
|
|
27
|
+
else if (part.type === "tool" &&
|
|
28
|
+
"state" in part &&
|
|
29
|
+
part.state &&
|
|
30
|
+
"output" in part.state &&
|
|
31
|
+
part.state.output) {
|
|
32
|
+
text = part.state.output;
|
|
33
|
+
toolCount++;
|
|
34
|
+
toolTokens += estimateTokens(text);
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
const tokens = estimateTokens(text);
|
|
38
|
+
if (role === "user") {
|
|
39
|
+
userTokens += tokens;
|
|
40
|
+
}
|
|
41
|
+
else if (role === "assistant") {
|
|
42
|
+
assistantTokens += tokens;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
totalTokens: systemTokens + userTokens + assistantTokens + toolTokens,
|
|
48
|
+
systemTokens,
|
|
49
|
+
userTokens,
|
|
50
|
+
assistantTokens,
|
|
51
|
+
toolTokens,
|
|
52
|
+
toolCount,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function getBatchRecommendation(toolCount) {
|
|
56
|
+
if (toolCount < 20) {
|
|
57
|
+
return "Discard individually as needed";
|
|
58
|
+
}
|
|
59
|
+
else if (toolCount < 50) {
|
|
60
|
+
return "Batch 5-10 tools at a time";
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
return "Batch 10-20 tools at a time";
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function getPruningRecommendation(stats) {
|
|
67
|
+
const toolRatio = stats.toolCount > 0 ? stats.toolTokens / stats.totalTokens : 0;
|
|
68
|
+
if (toolRatio > 0.6) {
|
|
69
|
+
return "⚠️ Tools dominate context. Consider pruning 10+ tools.";
|
|
70
|
+
}
|
|
71
|
+
else if (stats.totalTokens > 10000) {
|
|
72
|
+
return "💡 Large context. Prune completed tasks to improve performance.";
|
|
73
|
+
}
|
|
74
|
+
else if (stats.toolCount > 30) {
|
|
75
|
+
return "💡 Many tools in context. Review for pruning candidates.";
|
|
76
|
+
}
|
|
77
|
+
return "✅ Context size is healthy.";
|
|
78
|
+
}
|
|
79
|
+
function formatBudgetMessage(state, messages) {
|
|
80
|
+
const lines = [];
|
|
81
|
+
const stats = calculateContextStats(messages);
|
|
82
|
+
lines.push("╭───────────────────────────────────────────────────────────╮");
|
|
83
|
+
lines.push("│ Context Budget │");
|
|
84
|
+
lines.push("╰───────────────────────────────────────────────────────────╯");
|
|
85
|
+
lines.push("");
|
|
86
|
+
// Current usage breakdown
|
|
87
|
+
lines.push("📊 Current Usage:");
|
|
88
|
+
lines.push(` Total: ${formatTokenCount(stats.totalTokens)} tokens`);
|
|
89
|
+
lines.push(` System: ${formatTokenCount(stats.systemTokens)} tokens`);
|
|
90
|
+
lines.push(` User: ${formatTokenCount(stats.userTokens)} tokens`);
|
|
91
|
+
lines.push(` Assistant: ${formatTokenCount(stats.assistantTokens)} tokens`);
|
|
92
|
+
lines.push(` Tools: ${formatTokenCount(stats.toolTokens)} tokens (${stats.toolCount} tools)`);
|
|
93
|
+
lines.push("");
|
|
94
|
+
// Pruning history
|
|
95
|
+
lines.push("✂️ Pruning History:");
|
|
96
|
+
lines.push(` Total tokens saved: ${formatTokenCount(state.stats.totalPruneTokens)}`);
|
|
97
|
+
lines.push(` Total tools pruned: ${state.stats.totalPruneMessages}`);
|
|
98
|
+
lines.push(` Recent discards: ${state.discardHistory.length}`);
|
|
99
|
+
lines.push("");
|
|
100
|
+
// Recommendations
|
|
101
|
+
lines.push("💡 Recommendations:");
|
|
102
|
+
lines.push(` ${getPruningRecommendation(stats)}`);
|
|
103
|
+
lines.push(` Batch size guide: ${getBatchRecommendation(stats.toolCount)}`);
|
|
104
|
+
lines.push("");
|
|
105
|
+
// Quick actions
|
|
106
|
+
lines.push("⚡ Quick Actions:");
|
|
107
|
+
lines.push(" • Run '/acp sweep' to prune since last message");
|
|
108
|
+
lines.push(" • Run '/acp context' for detailed breakdown");
|
|
109
|
+
lines.push(" • Use discard({hashes: [...], reason: 'completion'})");
|
|
110
|
+
lines.push("");
|
|
111
|
+
return lines.join("\n");
|
|
112
|
+
}
|
|
113
|
+
export async function handleBudgetCommand(ctx) {
|
|
114
|
+
const { client, state, logger, sessionId, messages } = ctx;
|
|
115
|
+
const message = formatBudgetMessage(state, messages);
|
|
116
|
+
const params = getCurrentParams(state, messages, logger);
|
|
117
|
+
await sendIgnoredMessage(client, sessionId, message, params, logger);
|
|
118
|
+
logger.info("Budget command executed");
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=budget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"budget.js","sourceRoot":"","sources":["../../../lib/commands/budget.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* ACP Context Command
|
|
3
3
|
* Shows a visual breakdown of token usage in the current session.
|
|
4
4
|
*
|
|
5
5
|
* TOKEN CALCULATION STRATEGY
|
|
@@ -65,7 +65,7 @@ function analyzeTokens(state, messages) {
|
|
|
65
65
|
let lastAssistant;
|
|
66
66
|
for (let i = messages.length - 1; i >= 0; i--) {
|
|
67
67
|
const msg = messages[i];
|
|
68
|
-
if (msg.info.role === "assistant") {
|
|
68
|
+
if (msg && msg.info.role === "assistant") {
|
|
69
69
|
const assistantInfo = msg.info;
|
|
70
70
|
if (assistantInfo.tokens?.output > 0) {
|
|
71
71
|
lastAssistant = assistantInfo;
|
|
@@ -152,7 +152,7 @@ function formatContextMessage(breakdown) {
|
|
|
152
152
|
];
|
|
153
153
|
const maxLabelLen = Math.max(...categories.map((c) => c.label.length));
|
|
154
154
|
lines.push("╭───────────────────────────────────────────────────────────╮");
|
|
155
|
-
lines.push("│
|
|
155
|
+
lines.push("│ ACP Context Analysis │");
|
|
156
156
|
lines.push("╰───────────────────────────────────────────────────────────╯");
|
|
157
157
|
lines.push("");
|
|
158
158
|
lines.push("Session Context Breakdown:");
|
|
@@ -173,7 +173,7 @@ function formatContextMessage(breakdown) {
|
|
|
173
173
|
const withoutPruning = breakdown.total + breakdown.prunedTokens;
|
|
174
174
|
lines.push(` Pruned: ${breakdown.prunedCount} tools (~${formatTokenCount(breakdown.prunedTokens)})`);
|
|
175
175
|
lines.push(` Current context: ~${formatTokenCount(breakdown.total)}`);
|
|
176
|
-
lines.push(` Without
|
|
176
|
+
lines.push(` Without ACP: ~${formatTokenCount(withoutPruning)}`);
|
|
177
177
|
}
|
|
178
178
|
else {
|
|
179
179
|
lines.push(` Current context: ~${formatTokenCount(breakdown.total)}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../lib/commands/context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAIH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAsBnE,SAAS,aAAa,CAAC,KAAmB,EAAE,QAAqB;IAC7D,MAAM,SAAS,GAAmB;QAC9B,MAAM,EAAE,CAAC;QACT,IAAI,EAAE,CAAC;QACP,SAAS,EAAE,CAAC;QACZ,KAAK,EAAE,CAAC;QACR,SAAS,EAAE,CAAC;QACZ,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,gBAAgB;QAC1C,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM;QACvC,KAAK,EAAE,CAAC;KACX,CAAA;IAED,IAAI,cAA4C,CAAA;IAChD,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAChC,MAAM,aAAa,GAAG,GAAG,CAAC,IAAwB,CAAA;YAClD,IAAI,aAAa,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,IAAI,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC;gBAC3E,cAAc,GAAG,aAAa,CAAA;gBAC9B,MAAK;YACT,CAAC;QACL,CAAC;IACL,CAAC;IAED,IAAI,aAA2C,CAAA;IAC/C,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;QACvB,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../lib/commands/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../../lib/commands/help.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAIvD,MAAM,WAAW,kBAAkB;IAC/B,MAAM,EAAE,GAAG,CAAA;IACX,KAAK,EAAE,YAAY,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,SAAS,EAAE,CAAA;CACxB;
|
|
1
|
+
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../../lib/commands/help.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAIvD,MAAM,WAAW,kBAAkB;IAC/B,MAAM,EAAE,GAAG,CAAA;IACX,KAAK,EAAE,YAAY,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,SAAS,EAAE,CAAA;CACxB;AAmBD,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAS9E"}
|
|
@@ -13,6 +13,8 @@ function formatHelpMessage() {
|
|
|
13
13
|
lines.push(" /acp context Show token usage breakdown for current session");
|
|
14
14
|
lines.push(" /acp stats Show ACP pruning statistics");
|
|
15
15
|
lines.push(" /acp sweep [n] Prune tools since last user message, or last n tools");
|
|
16
|
+
lines.push(" /acp protected Show protected tools and file patterns");
|
|
17
|
+
lines.push(" /acp budget Show context budget and recommendations");
|
|
16
18
|
lines.push("");
|
|
17
19
|
return lines.join("\n");
|
|
18
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../../lib/commands/help.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAUtD,SAAS,iBAAiB;IACtB,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAA;IAC3E,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAA;IAC3E,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAA;IAC3E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAA;IAChF,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAA;IAC7D,KAAK,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAA;IACtF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEd,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAuB;IAC3D,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAA;IAE1D,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAA;IAEnC,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;IACxD,MAAM,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAEpE,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;AACxC,CAAC"}
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../../lib/commands/help.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAUtD,SAAS,iBAAiB;IACtB,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAA;IAC3E,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAA;IAC3E,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAA;IAC3E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAA;IAChF,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAA;IAC7D,KAAK,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAA;IACtF,KAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAA;IACxE,KAAK,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAA;IACzE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEd,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAuB;IAC3D,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAA;IAE1D,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAA;IAEnC,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;IACxD,MAAM,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAEpE,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;AACxC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ACP Protected command handler.
|
|
3
|
+
* Shows protected tools and file patterns.
|
|
4
|
+
*/
|
|
5
|
+
import type { Logger } from "../logger";
|
|
6
|
+
import type { SessionState, WithParts } from "../state";
|
|
7
|
+
import type { PluginConfig } from "../config";
|
|
8
|
+
export interface ProtectedCommandContext {
|
|
9
|
+
client: any;
|
|
10
|
+
state: SessionState;
|
|
11
|
+
logger: Logger;
|
|
12
|
+
sessionId: string;
|
|
13
|
+
messages: WithParts[];
|
|
14
|
+
config: PluginConfig;
|
|
15
|
+
}
|
|
16
|
+
export declare function handleProtectedCommand(ctx: ProtectedCommandContext): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=protected.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protected.d.ts","sourceRoot":"","sources":["../../../lib/commands/protected.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAGvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAE7C,MAAM,WAAW,uBAAuB;IACpC,MAAM,EAAE,GAAG,CAAA;IACX,KAAK,EAAE,YAAY,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,SAAS,EAAE,CAAA;IACrB,MAAM,EAAE,YAAY,CAAA;CACvB;AAgDD,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CASxF"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ACP Protected command handler.
|
|
3
|
+
* Shows protected tools and file patterns.
|
|
4
|
+
*/
|
|
5
|
+
import { sendIgnoredMessage } from "../ui/notification";
|
|
6
|
+
import { getCurrentParams } from "../strategies/utils";
|
|
7
|
+
function formatProtectedMessage(config) {
|
|
8
|
+
const lines = [];
|
|
9
|
+
lines.push("╭───────────────────────────────────────────────────────────╮");
|
|
10
|
+
lines.push("│ Protected from Pruning │");
|
|
11
|
+
lines.push("╰───────────────────────────────────────────────────────────╯");
|
|
12
|
+
lines.push("");
|
|
13
|
+
// Protected tools
|
|
14
|
+
lines.push("📋 Protected Tools:");
|
|
15
|
+
lines.push(" These tools cannot be discarded:");
|
|
16
|
+
const protectedTools = config.tools.settings.protectedTools;
|
|
17
|
+
for (const tool of protectedTools) {
|
|
18
|
+
lines.push(` • ${tool}`);
|
|
19
|
+
}
|
|
20
|
+
lines.push("");
|
|
21
|
+
// Protected file patterns
|
|
22
|
+
lines.push("📁 Protected File Patterns:");
|
|
23
|
+
if (config.protectedFilePatterns.length === 0) {
|
|
24
|
+
lines.push(" No file patterns are protected.");
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
lines.push(" Files matching these patterns cannot be discarded:");
|
|
28
|
+
for (const pattern of config.protectedFilePatterns) {
|
|
29
|
+
lines.push(` • ${pattern}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
lines.push("");
|
|
33
|
+
// Strategy-specific protected tools
|
|
34
|
+
lines.push("🔧 Strategy-Specific Protection:");
|
|
35
|
+
lines.push(` Deduplication: ${config.strategies.deduplication.protectedTools.join(", ") || "none"}`);
|
|
36
|
+
lines.push(` Purge Errors: ${config.strategies.purgeErrors.protectedTools.join(", ") || "none"}`);
|
|
37
|
+
lines.push("");
|
|
38
|
+
lines.push("💡 To modify protection, update your ACP config:");
|
|
39
|
+
lines.push(" ~/.config/opencode/acp.jsonc");
|
|
40
|
+
lines.push("");
|
|
41
|
+
return lines.join("\n");
|
|
42
|
+
}
|
|
43
|
+
export async function handleProtectedCommand(ctx) {
|
|
44
|
+
const { client, state, logger, sessionId, messages, config } = ctx;
|
|
45
|
+
const message = formatProtectedMessage(config);
|
|
46
|
+
const params = getCurrentParams(state, messages, logger);
|
|
47
|
+
await sendIgnoredMessage(client, sessionId, message, params, logger);
|
|
48
|
+
logger.info("Protected command executed");
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=protected.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protected.js","sourceRoot":"","sources":["../../../lib/commands/protected.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAYtD,SAAS,sBAAsB,CAAC,MAAoB;IAChD,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAA;IAC3E,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAA;IAC3E,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAA;IAC3E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEd,kBAAkB;IAClB,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;IACjC,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAA;IACjD,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAA;IAC3D,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAA;IAC9B,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEd,0BAA0B;IAC1B,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAA;IACzC,IAAI,MAAM,CAAC,qBAAqB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAA;IACpD,CAAC;SAAM,CAAC;QACJ,KAAK,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAA;QACnE,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,qBAAqB,EAAE,CAAC;YACjD,KAAK,CAAC,IAAI,CAAC,QAAQ,OAAO,EAAE,CAAC,CAAA;QACjC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEd,oCAAoC;IACpC,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAA;IAC9C,KAAK,CAAC,IAAI,CACN,qBAAqB,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE,CAC7F,CAAA;IACD,KAAK,CAAC,IAAI,CACN,oBAAoB,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE,CAC1F,CAAA;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEd,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAA;IAC9D,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAA;IAC7C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEd,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,GAA4B;IACrE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAG,CAAA;IAElE,MAAM,OAAO,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAA;IAE9C,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;IACxD,MAAM,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAEpE,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAA;AAC7C,CAAC"}
|