Skip to content

Commit 8227d64

Browse files
committed
ai nudge implementation
1 parent 7c90034 commit 8227d64

File tree

3 files changed

+37
-12
lines changed

3 files changed

+37
-12
lines changed

README.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,11 @@ DCP uses its own config file (`~/.config/opencode/dcp.jsonc` or `.opencode/dcp.j
8787
"enabled": false,
8888
// Additional tools to protect from pruning
8989
"protectedTools": [],
90-
// How often to nudge the AI to prune (every N tool results, 0 = disabled)
91-
"nudgeFrequency": 10
90+
// Nudge the LLM to use the prune tool (every <frequency> tool results)
91+
"nudge": {
92+
"enabled": true,
93+
"frequency": 10
94+
}
9295
}
9396
}
9497
}

lib/config.ts

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,15 @@ export interface OnIdle {
2121
protectedTools: string[]
2222
}
2323

24+
export interface PruneToolNudge {
25+
enabled: boolean
26+
frequency: number
27+
}
28+
2429
export interface PruneTool {
2530
enabled: boolean
2631
protectedTools: string[]
27-
nudgeFrequency: number
32+
nudge: PruneToolNudge
2833
}
2934

3035
export interface PluginConfig {
@@ -68,7 +73,9 @@ export const VALID_CONFIG_KEYS = new Set([
6873
'strategies.pruneTool',
6974
'strategies.pruneTool.enabled',
7075
'strategies.pruneTool.protectedTools',
71-
'strategies.pruneTool.nudgeFrequency',
76+
'strategies.pruneTool.nudge',
77+
'strategies.pruneTool.nudge.enabled',
78+
'strategies.pruneTool.nudge.frequency',
7279
])
7380

7481
// Extract all key paths from a config object for validation
@@ -160,8 +167,13 @@ function validateConfigTypes(config: Record<string, any>): ValidationError[] {
160167
if (strategies.pruneTool.protectedTools !== undefined && !Array.isArray(strategies.pruneTool.protectedTools)) {
161168
errors.push({ key: 'strategies.pruneTool.protectedTools', expected: 'string[]', actual: typeof strategies.pruneTool.protectedTools })
162169
}
163-
if (strategies.pruneTool.nudgeFrequency !== undefined && typeof strategies.pruneTool.nudgeFrequency !== 'number') {
164-
errors.push({ key: 'strategies.pruneTool.nudgeFrequency', expected: 'number', actual: typeof strategies.pruneTool.nudgeFrequency })
170+
if (strategies.pruneTool.nudge) {
171+
if (strategies.pruneTool.nudge.enabled !== undefined && typeof strategies.pruneTool.nudge.enabled !== 'boolean') {
172+
errors.push({ key: 'strategies.pruneTool.nudge.enabled', expected: 'boolean', actual: typeof strategies.pruneTool.nudge.enabled })
173+
}
174+
if (strategies.pruneTool.nudge.frequency !== undefined && typeof strategies.pruneTool.nudge.frequency !== 'number') {
175+
errors.push({ key: 'strategies.pruneTool.nudge.frequency', expected: 'number', actual: typeof strategies.pruneTool.nudge.frequency })
176+
}
165177
}
166178
}
167179
}
@@ -237,7 +249,10 @@ const defaultConfig: PluginConfig = {
237249
pruneTool: {
238250
enabled: false,
239251
protectedTools: [...DEFAULT_PROTECTED_TOOLS],
240-
nudgeFrequency: 10
252+
nudge: {
253+
enabled: true,
254+
frequency: 10
255+
}
241256
}
242257
}
243258
}
@@ -328,8 +343,11 @@ function createDefaultConfig(): void {
328343
"enabled": false,
329344
// Additional tools to protect from pruning
330345
"protectedTools": [],
331-
// How often to nudge the AI to prune (every N tool results, 0 = disabled)
332-
"nudgeFrequency": 10
346+
// Nudge the LLM to use the prune tool (every <frequency> tool results)
347+
"nudge": {
348+
"enabled": true,
349+
"frequency": 10
350+
}
333351
}
334352
}
335353
}
@@ -401,7 +419,10 @@ function mergeStrategies(
401419
...(override.pruneTool?.protectedTools ?? [])
402420
])
403421
],
404-
nudgeFrequency: override.pruneTool?.nudgeFrequency ?? base.pruneTool.nudgeFrequency
422+
nudge: {
423+
enabled: override.pruneTool?.nudge?.enabled ?? base.pruneTool.nudge.enabled,
424+
frequency: override.pruneTool?.nudge?.frequency ?? base.pruneTool.nudge.frequency
425+
}
405426
}
406427
}
407428
}
@@ -421,7 +442,8 @@ function deepCloneConfig(config: PluginConfig): PluginConfig {
421442
},
422443
pruneTool: {
423444
...config.strategies.pruneTool,
424-
protectedTools: [...config.strategies.pruneTool.protectedTools]
445+
protectedTools: [...config.strategies.pruneTool.protectedTools],
446+
nudge: { ...config.strategies.pruneTool.nudge }
425447
}
426448
}
427449
}

lib/messages/prune.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ export const insertPruneToolContext = (
4848
const prunableToolsList = buildPrunableToolsList(state, config, logger, messages)
4949

5050
let nudgeString = ""
51-
if (state.nudgeCounter >= config.strategies.pruneTool.nudgeFrequency) {
51+
if (config.strategies.pruneTool.nudge.enabled && state.nudgeCounter >= config.strategies.pruneTool.nudge.frequency) {
5252
logger.info("Inserting prune nudge message")
5353
nudgeString = "\n" + NUDGE_STRING
5454
}

0 commit comments

Comments
 (0)