From ec613506641a35502189a5d72ac6c02ae223269f Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Tue, 30 Dec 2025 19:08:55 +0900 Subject: [PATCH] refactor(dcp-for-compaction): migrate from experimental config to hook system MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add 'dcp-for-compaction' to HookNameSchema - Remove dcp_for_compaction from ExperimentalConfigSchema - Update executor.ts to use dcpForCompaction parameter - Enable DCP by default (can be disabled via disabled_hooks) - Update all 4 README files (EN, KO, JA, ZH-CN) ๐Ÿค– GENERATED WITH ASSISTANCE OF [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode) --- README.ja.md | 8 ++++---- README.ko.md | 8 ++++---- README.md | 8 ++++---- README.zh-cn.md | 8 ++++---- src/config/schema.ts | 3 +-- .../executor.test.ts | 2 ++ .../anthropic-context-window-limit-recovery/executor.ts | 9 ++++++--- .../anthropic-context-window-limit-recovery/index.ts | 8 ++++++-- src/index.ts | 5 ++++- 9 files changed, 35 insertions(+), 24 deletions(-) diff --git a/README.ja.md b/README.ja.md index 693a1ca..fd6161d 100644 --- a/README.ja.md +++ b/README.ja.md @@ -874,7 +874,7 @@ Oh My OpenCode ใฏไปฅไธ‹ใฎๅ ดๆ‰€ใ‹ใ‚‰ใƒ•ใƒƒใ‚ฏใ‚’่ชญใฟ่พผใ‚“ใงๅฎŸ่กŒใ—ใพ } ``` -ๅˆฉ็”จๅฏ่ƒฝใชใƒ•ใƒƒใ‚ฏ๏ผš`todo-continuation-enforcer`, `context-window-monitor`, `session-recovery`, `session-notification`, `comment-checker`, `grep-output-truncator`, `tool-output-truncator`, `directory-agents-injector`, `directory-readme-injector`, `empty-task-response-detector`, `think-mode`, `anthropic-context-window-limit-recovery`, `rules-injector`, `background-notification`, `auto-update-checker`, `startup-toast`, `keyword-detector`, `agent-usage-reminder`, `non-interactive-env`, `interactive-bash-session`, `empty-message-sanitizer`, `preemptive-compaction`, `compaction-context-injector`, `thinking-block-validator`, `claude-code-hooks`, `ralph-loop` +ๅˆฉ็”จๅฏ่ƒฝใชใƒ•ใƒƒใ‚ฏ๏ผš`todo-continuation-enforcer`, `context-window-monitor`, `session-recovery`, `session-notification`, `comment-checker`, `grep-output-truncator`, `tool-output-truncator`, `directory-agents-injector`, `directory-readme-injector`, `empty-task-response-detector`, `think-mode`, `anthropic-context-window-limit-recovery`, `rules-injector`, `background-notification`, `auto-update-checker`, `startup-toast`, `keyword-detector`, `agent-usage-reminder`, `non-interactive-env`, `interactive-bash-session`, `empty-message-sanitizer`, `preemptive-compaction`, `compaction-context-injector`, `thinking-block-validator`, `claude-code-hooks`, `ralph-loop`, `dcp-for-compaction` **`auto-update-checker`ใจ`startup-toast`ใซใคใ„ใฆ**: `startup-toast` ใƒ•ใƒƒใ‚ฏใฏ `auto-update-checker` ใฎใ‚ตใƒ–ๆฉŸ่ƒฝใงใ™ใ€‚ใ‚ขใƒƒใƒ—ใƒ‡ใƒผใƒˆใƒใ‚งใƒƒใ‚ฏใฏๆœ‰ๅŠนใชใพใพ่ตทๅ‹•ใƒˆใƒผใ‚นใƒˆ้€š็Ÿฅใฎใฟใ‚’็„กๅŠนๅŒ–ใ™ใ‚‹ใซใฏใ€`disabled_hooks` ใซ `"startup-toast"` ใ‚’่ฟฝๅŠ ใ—ใฆใใ ใ•ใ„ใ€‚ใ™ในใฆใฎใ‚ขใƒƒใƒ—ใƒ‡ใƒผใƒˆใƒใ‚งใƒƒใ‚ฏๆฉŸ่ƒฝ๏ผˆใƒˆใƒผใ‚นใƒˆใ‚’ๅซใ‚€๏ผ‰ใ‚’็„กๅŠนๅŒ–ใ™ใ‚‹ใซใฏใ€`"auto-update-checker"` ใ‚’่ฟฝๅŠ ใ—ใฆใใ ใ•ใ„ใ€‚ @@ -928,8 +928,7 @@ OpenCode ใงใ‚ตใƒใƒผใƒˆใ•ใ‚Œใ‚‹ใ™ในใฆใฎ LSP ๆง‹ๆˆใŠใ‚ˆใณใ‚ซใ‚นใ‚ฟใƒ ่จญ "experimental": { "aggressive_truncation": true, "auto_resume": true, - "truncate_all_tool_outputs": false, - "dcp_for_compaction": true + "truncate_all_tool_outputs": false } } ``` @@ -939,7 +938,8 @@ OpenCode ใงใ‚ตใƒใƒผใƒˆใ•ใ‚Œใ‚‹ใ™ในใฆใฎ LSP ๆง‹ๆˆใŠใ‚ˆใณใ‚ซใ‚นใ‚ฟใƒ ่จญ | `aggressive_truncation` | `false` | ใƒˆใƒผใ‚ฏใƒณๅˆถ้™ใ‚’่ถ…ใˆใŸๅ ดๅˆใ€ใƒ„ใƒผใƒซๅ‡บๅŠ›ใ‚’็ฉๆฅต็š„ใซๅˆ‡ใ‚Š่ฉฐใ‚ใฆๅˆถ้™ๅ†…ใซๅŽใ‚ใพใ™ใ€‚ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใฎๅˆ‡ใ‚Š่ฉฐใ‚ใ‚ˆใ‚Š็ฉๆฅต็š„ใงใ™ใ€‚ไธๅๅˆ†ใชๅ ดๅˆใฏ่ฆ็ด„/ๅพฉๅ…ƒใซใƒ•ใ‚ฉใƒผใƒซใƒใƒƒใ‚ฏใ—ใพใ™ใ€‚ | | `auto_resume` | `false` | thinking block ใ‚จใƒฉใƒผใ‚„ thinking disabled violation ใ‹ใ‚‰ใฎๅ›žๅพฉๆˆๅŠŸๅพŒใ€่‡ชๅ‹•็š„ใซใ‚ปใƒƒใ‚ทใƒงใƒณใ‚’ๅ†้–‹ใ—ใพใ™ใ€‚ๆœ€ๅพŒใฎใƒฆใƒผใ‚ถใƒผใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’ๆŠฝๅ‡บใ—ใฆ็ถš่กŒใ—ใพใ™ใ€‚ | | `truncate_all_tool_outputs` | `true` | ใƒ—ใƒญใƒณใƒ—ใƒˆใŒ้•ทใใชใ‚Šใ™ใŽใ‚‹ใฎใ‚’้˜ฒใใŸใ‚ใ€ใ‚ณใƒณใƒ†ใ‚ญใ‚นใƒˆใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใฎไฝฟ็”จ็ŠถๆณใซๅŸบใฅใ„ใฆใ™ในใฆใฎใƒ„ใƒผใƒซๅ‡บๅŠ›ใ‚’ๅ‹•็š„ใซๅˆ‡ใ‚Š่ฉฐใ‚ใพใ™ใ€‚ๅฎŒๅ…จใชใƒ„ใƒผใƒซๅ‡บๅŠ›ใŒๅฟ…่ฆใชๅ ดๅˆใฏ`false`ใซ่จญๅฎšใ—ใฆ็„กๅŠนๅŒ–ใ—ใพใ™ใ€‚ | -| `dcp_for_compaction` | `false` | ๆœ‰ๅŠนใซใ™ใ‚‹ใจใ€ใƒˆใƒผใ‚ฏใƒณๅˆถ้™ใ‚จใƒฉใƒผ็™บ็”Ÿๆ™‚ใซDCP๏ผˆDynamic Context Pruning๏ผ‰ใŒๆœ€ๅˆใซๅฎŸ่กŒใ•ใ‚Œใ€ใใฎๅพŒใ‚ณใƒณใƒ‘ใ‚ฏใ‚ทใƒงใƒณใŒๅฎŸ่กŒใ•ใ‚Œใพใ™ใ€‚DCPใŒไธ่ฆใชใ‚ณใƒณใƒ†ใ‚ญใ‚นใƒˆใ‚’ๆ•ด็†ใ—ใŸๅพŒใ€ใ™ใใซใ‚ณใƒณใƒ‘ใ‚ฏใ‚ทใƒงใƒณใŒ้€ฒ่กŒใ—ใพใ™ใ€‚ใƒˆใƒผใ‚ฏใƒณๅˆถ้™ใซ้”ใ—ใŸ้š›ใซใ‚ˆใ‚Šใ‚นใƒžใƒผใƒˆใชๅ›žๅพฉใŒๅฟ…่ฆใชๅ ดๅˆใฏๆœ‰ๅŠนใซใ—ใฆใใ ใ•ใ„ใ€‚ | + +**ๆณจๆ„**: `dcp-for-compaction`๏ผˆใ‚ณใƒณใƒ‘ใ‚ฏใ‚ทใƒงใƒณ็”จๅ‹•็š„ใ‚ณใƒณใƒ†ใ‚ญใ‚นใƒˆๆ•ด็†๏ผ‰ใฏใƒ•ใƒƒใ‚ฏใจใ—ใฆ็ฎก็†ใ•ใ‚Œใ‚‹ใ‚ˆใ†ใซใชใ‚Šใพใ—ใŸใ€‚ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใงๆœ‰ๅŠนใงใ€`disabled_hooks: ["dcp-for-compaction"]`ใง็„กๅŠนๅŒ–ใงใใพใ™ใ€‚ **่ญฆๅ‘Š**๏ผšใ“ใ‚Œใ‚‰ใฎๆฉŸ่ƒฝใฏๅฎŸ้จ“็š„ใงใ‚ใ‚Šใ€ไบˆๆœŸใ—ใชใ„ๅ‹•ไฝœใ‚’ๅผ•ใ่ตทใ“ใ™ๅฏ่ƒฝๆ€งใŒใ‚ใ‚Šใพใ™ใ€‚ๅฝฑ้Ÿฟใ‚’็†่งฃใ—ใŸๅ ดๅˆใซใฎใฟๆœ‰ๅŠนใซใ—ใฆใใ ใ•ใ„ใ€‚ diff --git a/README.ko.md b/README.ko.md index e6ba300..62e98ce 100644 --- a/README.ko.md +++ b/README.ko.md @@ -871,7 +871,7 @@ Schema ์ž๋™ ์™„์„ฑ์ด ์ง€์›๋ฉ๋‹ˆ๋‹ค: } ``` -์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ›…: `todo-continuation-enforcer`, `context-window-monitor`, `session-recovery`, `session-notification`, `comment-checker`, `grep-output-truncator`, `tool-output-truncator`, `directory-agents-injector`, `directory-readme-injector`, `empty-task-response-detector`, `think-mode`, `anthropic-context-window-limit-recovery`, `rules-injector`, `background-notification`, `auto-update-checker`, `startup-toast`, `keyword-detector`, `agent-usage-reminder`, `non-interactive-env`, `interactive-bash-session`, `empty-message-sanitizer`, `preemptive-compaction`, `compaction-context-injector`, `thinking-block-validator`, `claude-code-hooks`, `ralph-loop` +์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ›…: `todo-continuation-enforcer`, `context-window-monitor`, `session-recovery`, `session-notification`, `comment-checker`, `grep-output-truncator`, `tool-output-truncator`, `directory-agents-injector`, `directory-readme-injector`, `empty-task-response-detector`, `think-mode`, `anthropic-context-window-limit-recovery`, `rules-injector`, `background-notification`, `auto-update-checker`, `startup-toast`, `keyword-detector`, `agent-usage-reminder`, `non-interactive-env`, `interactive-bash-session`, `empty-message-sanitizer`, `preemptive-compaction`, `compaction-context-injector`, `thinking-block-validator`, `claude-code-hooks`, `ralph-loop`, `dcp-for-compaction` **`auto-update-checker`์™€ `startup-toast`์— ๋Œ€ํ•œ ์ฐธ๊ณ ์‚ฌํ•ญ**: `startup-toast` ํ›…์€ `auto-update-checker`์˜ ํ•˜์œ„ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ ํ™•์ธ์€ ์œ ์ง€ํ•˜๋ฉด์„œ ์‹œ์ž‘ ํ† ์ŠคํŠธ ์•Œ๋ฆผ๋งŒ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด `disabled_hooks`์— `"startup-toast"`๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”. ๋ชจ๋“  ์—…๋ฐ์ดํŠธ ํ™•์ธ ๊ธฐ๋Šฅ(ํ† ์ŠคํŠธ ํฌํ•จ)์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด `"auto-update-checker"`๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”. @@ -925,8 +925,7 @@ OpenCode ์—์„œ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  LSP ๊ตฌ์„ฑ ๋ฐ ์ปค์Šคํ…€ ์„ค์ • (opencode.js "experimental": { "aggressive_truncation": true, "auto_resume": true, - "truncate_all_tool_outputs": false, - "dcp_for_compaction": true + "truncate_all_tool_outputs": false } } ``` @@ -936,7 +935,8 @@ OpenCode ์—์„œ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  LSP ๊ตฌ์„ฑ ๋ฐ ์ปค์Šคํ…€ ์„ค์ • (opencode.js | `aggressive_truncation` | `false` | ํ† ํฐ ์ œํ•œ์„ ์ดˆ๊ณผํ•˜๋ฉด ๋„๊ตฌ ์ถœ๋ ฅ์„ ๊ณต๊ฒฉ์ ์œผ๋กœ ์ž˜๋ผ๋‚ด์–ด ์ œํ•œ ๋‚ด์— ๋งž์ถฅ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ truncation๋ณด๋‹ค ๋” ๊ณต๊ฒฉ์ ์ž…๋‹ˆ๋‹ค. ๋ถ€์กฑํ•˜๋ฉด ์š”์•ฝ/๋ณต๊ตฌ๋กœ fallbackํ•ฉ๋‹ˆ๋‹ค. | | `auto_resume` | `false` | thinking block ์—๋Ÿฌ๋‚˜ thinking disabled violation์œผ๋กœ๋ถ€ํ„ฐ ์„ฑ๊ณต์ ์œผ๋กœ ๋ณต๊ตฌํ•œ ํ›„ ์ž๋™์œผ๋กœ ์„ธ์…˜์„ ์žฌ๊ฐœํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ์‚ฌ์šฉ์ž ๋ฉ”์‹œ์ง€๋ฅผ ์ถ”์ถœํ•˜์—ฌ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค. | | `truncate_all_tool_outputs` | `true` | ํ”„๋กฌํ”„ํŠธ๊ฐ€ ๋„ˆ๋ฌด ๊ธธ์–ด์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ ์‚ฌ์šฉ๋Ÿ‰์— ๋”ฐ๋ผ ๋ชจ๋“  ๋„๊ตฌ ์ถœ๋ ฅ์„ ๋™์ ์œผ๋กœ ์ž˜๋ผ๋ƒ…๋‹ˆ๋‹ค. ์ „์ฒด ๋„๊ตฌ ์ถœ๋ ฅ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ `false`๋กœ ์„ค์ •ํ•˜์—ฌ ๋น„ํ™œ์„ฑํ™”ํ•˜์„ธ์š”. | -| `dcp_for_compaction` | `false` | ํ™œ์„ฑํ™”ํ•˜๋ฉด, ํ† ํฐ ์ œํ•œ ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ DCP(Dynamic Context Pruning)๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ์‹คํ–‰๋˜๊ณ , ๊ทธ ๋‹ค์Œ compaction์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. DCP๊ฐ€ ๋ถˆํ•„์š”ํ•œ ์ปจํ…์ŠคํŠธ๋ฅผ ์ •๋ฆฌํ•œ ํ›„ ๋ฐ”๋กœ compaction์ด ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. ํ† ํฐ ์ œํ•œ์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ ๋” ์Šค๋งˆํŠธํ•œ ๋ณต๊ตฌ๋ฅผ ์›ํ•˜๋ฉด ํ™œ์„ฑํ™”ํ•˜์„ธ์š”. | + +**์ฐธ๊ณ **: `dcp-for-compaction` (์ปดํŒฉ์…˜์šฉ ๋™์  ์ปจํ…์ŠคํŠธ ์ •๋ฆฌ)์€ ์ด์ œ ํ›…์œผ๋กœ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ, `disabled_hooks: ["dcp-for-compaction"]`์œผ๋กœ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. **๊ฒฝ๊ณ **: ์ด ๊ธฐ๋Šฅ๋“ค์€ ์‹คํ—˜์ ์ด๋ฉฐ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋™์ž‘์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜๋ฏธ๋ฅผ ์ดํ•ดํ•œ ๊ฒฝ์šฐ์—๋งŒ ํ™œ์„ฑํ™”ํ•˜์„ธ์š”. diff --git a/README.md b/README.md index 5bc12b5..7c7a9c5 100644 --- a/README.md +++ b/README.md @@ -910,7 +910,7 @@ Disable specific built-in hooks via `disabled_hooks` in `~/.config/opencode/oh-m } ``` -Available hooks: `todo-continuation-enforcer`, `context-window-monitor`, `session-recovery`, `session-notification`, `comment-checker`, `grep-output-truncator`, `tool-output-truncator`, `directory-agents-injector`, `directory-readme-injector`, `empty-task-response-detector`, `think-mode`, `anthropic-context-window-limit-recovery`, `rules-injector`, `background-notification`, `auto-update-checker`, `startup-toast`, `keyword-detector`, `agent-usage-reminder`, `non-interactive-env`, `interactive-bash-session`, `empty-message-sanitizer`, `preemptive-compaction`, `compaction-context-injector`, `thinking-block-validator`, `claude-code-hooks`, `ralph-loop` +Available hooks: `todo-continuation-enforcer`, `context-window-monitor`, `session-recovery`, `session-notification`, `comment-checker`, `grep-output-truncator`, `tool-output-truncator`, `directory-agents-injector`, `directory-readme-injector`, `empty-task-response-detector`, `think-mode`, `anthropic-context-window-limit-recovery`, `rules-injector`, `background-notification`, `auto-update-checker`, `startup-toast`, `keyword-detector`, `agent-usage-reminder`, `non-interactive-env`, `interactive-bash-session`, `empty-message-sanitizer`, `preemptive-compaction`, `compaction-context-injector`, `thinking-block-validator`, `claude-code-hooks`, `ralph-loop`, `dcp-for-compaction` **Note on `auto-update-checker` and `startup-toast`**: The `startup-toast` hook is a sub-feature of `auto-update-checker`. To disable only the startup toast notification while keeping update checking enabled, add `"startup-toast"` to `disabled_hooks`. To disable all update checking features (including the toast), add `"auto-update-checker"` to `disabled_hooks`. @@ -964,8 +964,7 @@ Opt-in experimental features that may change or be removed in future versions. U "experimental": { "aggressive_truncation": true, "auto_resume": true, - "truncate_all_tool_outputs": false, - "dcp_for_compaction": true + "truncate_all_tool_outputs": false } } ``` @@ -975,7 +974,8 @@ Opt-in experimental features that may change or be removed in future versions. U | `aggressive_truncation` | `false` | When token limit is exceeded, aggressively truncates tool outputs to fit within limits. More aggressive than the default truncation behavior. Falls back to summarize/revert if insufficient. | | `auto_resume` | `false` | Automatically resumes session after successful recovery from thinking block errors or thinking disabled violations. Extracts the last user message and continues. | | `truncate_all_tool_outputs` | `true` | Dynamically truncates ALL tool outputs based on context window usage to prevent prompts from becoming too long. Disable by setting to `false` if you need full tool outputs. | -| `dcp_for_compaction` | `false` | When enabled, Dynamic Context Pruning (DCP) runs FIRST when token limit errors occur, before attempting compaction. DCP prunes redundant context, then compaction runs immediately. Enable this for smarter recovery when hitting token limits. | + +**Note**: `dcp-for-compaction` (Dynamic Context Pruning for compaction) is now a hook, not an experimental feature. It's enabled by default and can be disabled via `disabled_hooks: ["dcp-for-compaction"]`. **Warning**: These features are experimental and may cause unexpected behavior. Enable only if you understand the implications. diff --git a/README.zh-cn.md b/README.zh-cn.md index 6bc0587..c12e8ac 100644 --- a/README.zh-cn.md +++ b/README.zh-cn.md @@ -878,7 +878,7 @@ Sisyphus Agent ไนŸ่ƒฝ่‡ชๅฎšไน‰๏ผš } ``` -ๅฏๅ…ณ็š„ hook๏ผš`todo-continuation-enforcer`ใ€`context-window-monitor`ใ€`session-recovery`ใ€`session-notification`ใ€`comment-checker`ใ€`grep-output-truncator`ใ€`tool-output-truncator`ใ€`directory-agents-injector`ใ€`directory-readme-injector`ใ€`empty-task-response-detector`ใ€`think-mode`ใ€`anthropic-context-window-limit-recovery`ใ€`rules-injector`ใ€`background-notification`ใ€`auto-update-checker`ใ€`startup-toast`ใ€`keyword-detector`ใ€`agent-usage-reminder`ใ€`non-interactive-env`ใ€`interactive-bash-session`ใ€`empty-message-sanitizer`ใ€`preemptive-compaction`ใ€`compaction-context-injector`ใ€`thinking-block-validator`ใ€`claude-code-hooks`ใ€`ralph-loop` +ๅฏๅ…ณ็š„ hook๏ผš`todo-continuation-enforcer`ใ€`context-window-monitor`ใ€`session-recovery`ใ€`session-notification`ใ€`comment-checker`ใ€`grep-output-truncator`ใ€`tool-output-truncator`ใ€`directory-agents-injector`ใ€`directory-readme-injector`ใ€`empty-task-response-detector`ใ€`think-mode`ใ€`anthropic-context-window-limit-recovery`ใ€`rules-injector`ใ€`background-notification`ใ€`auto-update-checker`ใ€`startup-toast`ใ€`keyword-detector`ใ€`agent-usage-reminder`ใ€`non-interactive-env`ใ€`interactive-bash-session`ใ€`empty-message-sanitizer`ใ€`preemptive-compaction`ใ€`compaction-context-injector`ใ€`thinking-block-validator`ใ€`claude-code-hooks`ใ€`ralph-loop`ใ€`dcp-for-compaction` **ๅ…ณไบŽ `auto-update-checker` ๅ’Œ `startup-toast`**: `startup-toast` hook ๆ˜ฏ `auto-update-checker` ็š„ๅญๅŠŸ่ƒฝใ€‚่‹ฅๆƒณไฟๆŒๆ›ดๆ–ฐๆฃ€ๆŸฅไฝ†ๅช็ฆ็”จๅฏๅŠจๆ็คบ้€š็Ÿฅ๏ผŒๅœจ `disabled_hooks` ไธญๆทปๅŠ  `"startup-toast"`ใ€‚่‹ฅ่ฆ็ฆ็”จๆ‰€ๆœ‰ๆ›ดๆ–ฐๆฃ€ๆŸฅๅŠŸ่ƒฝ๏ผˆๅŒ…ๆ‹ฌๆ็คบ๏ผ‰๏ผŒๆทปๅŠ  `"auto-update-checker"`ใ€‚ @@ -932,8 +932,7 @@ Oh My OpenCode ้€ไฝ ้‡ๆž„ๅทฅๅ…ท๏ผˆ้‡ๅ‘ฝๅใ€ไปฃ็ ๆ“ไฝœ๏ผ‰ใ€‚ "experimental": { "aggressive_truncation": true, "auto_resume": true, - "truncate_all_tool_outputs": false, - "dcp_for_compaction": true + "truncate_all_tool_outputs": false } } ``` @@ -943,7 +942,8 @@ Oh My OpenCode ้€ไฝ ้‡ๆž„ๅทฅๅ…ท๏ผˆ้‡ๅ‘ฝๅใ€ไปฃ็ ๆ“ไฝœ๏ผ‰ใ€‚ | `aggressive_truncation` | `false` | ่ถ…ๅ‡บ token ้™ๅˆถๆ—ถ๏ผŒๆฟ€่ฟ›ๅœฐๆˆชๆ–ญๅทฅๅ…ท่พ“ๅ‡บไปฅ้€‚ๅบ”้™ๅˆถใ€‚ๆฏ”้ป˜่ฎคๆˆชๆ–ญๆ›ดๆฟ€่ฟ›ใ€‚ไธๅคŸ็š„่ฏไผšๅ›ž้€€ๅˆฐๆ‘˜่ฆ/ๆขๅคใ€‚ | | `auto_resume` | `false` | ไปŽ thinking block ้”™่ฏฏๆˆ– thinking disabled violation ๆˆๅŠŸๆขๅคๅŽ๏ผŒ่‡ชๅŠจๆขๅคไผš่ฏใ€‚ๆๅ–ๆœ€ๅŽไธ€ๆก็”จๆˆทๆถˆๆฏ็ปง็ปญๆ‰ง่กŒใ€‚ | | `truncate_all_tool_outputs` | `true` | ไธบ้˜ฒๆญขๆ็คบ่ฟ‡้•ฟ๏ผŒๆ นๆฎไธŠไธ‹ๆ–‡็ช—ๅฃไฝฟ็”จๆƒ…ๅ†ตๅŠจๆ€ๆˆชๆ–ญๆ‰€ๆœ‰ๅทฅๅ…ท่พ“ๅ‡บใ€‚ๅฆ‚้œ€ๅฎŒๆ•ดๅทฅๅ…ท่พ“ๅ‡บ๏ผŒ่ฎพ็ฝฎไธบ `false` ็ฆ็”จๆญคๅŠŸ่ƒฝใ€‚ | -| `dcp_for_compaction` | `false` | ๅฏ็”จๅŽ๏ผŒๅฝ“ๅ‘็”Ÿ token ้™ๅˆถ้”™่ฏฏๆ—ถ๏ผŒDCP๏ผˆๅŠจๆ€ไธŠไธ‹ๆ–‡ๅ‰ชๆž๏ผ‰้ฆ–ๅ…ˆ่ฟ่กŒ๏ผŒ็„ถๅŽ็ซ‹ๅณๆ‰ง่กŒๅŽ‹็ผฉใ€‚DCP ๆธ…็†ไธๅฟ…่ฆ็š„ไธŠไธ‹ๆ–‡ๅŽ๏ผŒๅŽ‹็ผฉ็ซ‹ๅณ่ฟ›่กŒใ€‚ๅฝ“่พพๅˆฐ token ้™ๅˆถๆ—ถ้œ€่ฆๆ›ดๆ™บ่ƒฝ็š„ๆขๅค่ฏทๅฏ็”จๆญค้€‰้กนใ€‚ | + +**ๆณจๆ„**: `dcp-for-compaction`๏ผˆๅŽ‹็ผฉ็”จๅŠจๆ€ไธŠไธ‹ๆ–‡ๅ‰ชๆž๏ผ‰็Žฐๅœจไฝœไธบ hook ็ฎก็†ใ€‚้ป˜่ฎคๅฏ็”จ๏ผŒๅฏ้€š่ฟ‡ `disabled_hooks: ["dcp-for-compaction"]` ็ฆ็”จใ€‚ **่ญฆๅ‘Š**๏ผš่ฟ™ไบ›ๅŠŸ่ƒฝๆ˜ฏๅฎž้ชŒๆ€ง็š„๏ผŒๅฏ่ƒฝไผšๅฏผ่‡ดๆ„ๅค–่กŒไธบใ€‚ๅชๆœ‰ๅœจ็†่งฃๅ…ถๅฝฑๅ“็š„ๆƒ…ๅ†ตไธ‹ๆ‰ๅฏ็”จใ€‚ diff --git a/src/config/schema.ts b/src/config/schema.ts index 1440100..aed8c1c 100644 --- a/src/config/schema.ts +++ b/src/config/schema.ts @@ -66,6 +66,7 @@ export const HookNameSchema = z.enum([ "empty-message-sanitizer", "thinking-block-validator", "ralph-loop", + "dcp-for-compaction", ]) export const BuiltinCommandNameSchema = z.enum([ @@ -172,8 +173,6 @@ export const ExperimentalConfigSchema = z.object({ truncate_all_tool_outputs: z.boolean().default(true), /** Dynamic context pruning configuration */ dynamic_context_pruning: DynamicContextPruningConfigSchema.optional(), - /** Enable DCP (Dynamic Context Pruning) for compaction - runs first when token limit exceeded (default: false) */ - dcp_for_compaction: z.boolean().optional(), }) export const SkillSourceSchema = z.union([ diff --git a/src/hooks/anthropic-context-window-limit-recovery/executor.test.ts b/src/hooks/anthropic-context-window-limit-recovery/executor.test.ts index 75861aa..3650a8d 100644 --- a/src/hooks/anthropic-context-window-limit-recovery/executor.test.ts +++ b/src/hooks/anthropic-context-window-limit-recovery/executor.test.ts @@ -151,6 +151,7 @@ describe("executeCompact lock management", () => { truncate_all_tool_outputs: false, aggressive_truncation: true, } + const dcpForCompaction = true // #when: Execute compaction with experimental flag await executeCompact( @@ -160,6 +161,7 @@ describe("executeCompact lock management", () => { mockClient, directory, experimental, + dcpForCompaction, ) // #then: Lock should be cleared even on early return diff --git a/src/hooks/anthropic-context-window-limit-recovery/executor.ts b/src/hooks/anthropic-context-window-limit-recovery/executor.ts index dcfa0cf..3c1fac9 100644 --- a/src/hooks/anthropic-context-window-limit-recovery/executor.ts +++ b/src/hooks/anthropic-context-window-limit-recovery/executor.ts @@ -337,6 +337,7 @@ export async function executeCompact( client: any, directory: string, experimental?: ExperimentalConfig, + dcpForCompaction?: boolean, ): Promise { if (autoCompactState.compactionInProgress.has(sessionID)) { await (client as Client).tui @@ -358,10 +359,10 @@ export async function executeCompact( const errorData = autoCompactState.errorDataBySession.get(sessionID); const truncateState = getOrCreateTruncateState(autoCompactState, sessionID); - // DCP FIRST - run before any other recovery attempts when token limit exceeded + // DCP FIRST - run before any other recovery attempts when token limit exceeded (controlled by dcp-for-compaction hook) const dcpState = getOrCreateDcpState(autoCompactState, sessionID); if ( - experimental?.dcp_for_compaction && + dcpForCompaction !== false && !dcpState.attempted && errorData?.currentTokens && errorData?.maxTokens && @@ -374,7 +375,7 @@ export async function executeCompact( maxTokens: errorData.maxTokens, }); - const dcpConfig = experimental.dynamic_context_pruning ?? { + const dcpConfig = experimental?.dynamic_context_pruning ?? { enabled: true, notification: "detailed" as const, protected_tools: ["task", "todowrite", "todoread", "lsp_rename", "lsp_code_action_resolve"], @@ -618,6 +619,7 @@ export async function executeCompact( client, directory, experimental, + dcpForCompaction, ); }, 500); return; @@ -696,6 +698,7 @@ export async function executeCompact( client, directory, experimental, + dcpForCompaction, ); }, cappedDelay); return; diff --git a/src/hooks/anthropic-context-window-limit-recovery/index.ts b/src/hooks/anthropic-context-window-limit-recovery/index.ts index 5ed0c27..a924664 100644 --- a/src/hooks/anthropic-context-window-limit-recovery/index.ts +++ b/src/hooks/anthropic-context-window-limit-recovery/index.ts @@ -7,6 +7,7 @@ import { log } from "../../shared/logger" export interface AnthropicContextWindowLimitRecoveryOptions { experimental?: ExperimentalConfig + dcpForCompaction?: boolean } function createRecoveryState(): AutoCompactState { @@ -25,6 +26,7 @@ function createRecoveryState(): AutoCompactState { export function createAnthropicContextWindowLimitRecoveryHook(ctx: PluginInput, options?: AnthropicContextWindowLimitRecoveryOptions) { const autoCompactState = createRecoveryState() const experimental = options?.experimental + const dcpForCompaction = options?.dcpForCompaction const eventHandler = async ({ event }: { event: { type: string; properties?: unknown } }) => { const props = event.properties as Record | undefined @@ -81,7 +83,8 @@ export function createAnthropicContextWindowLimitRecoveryHook(ctx: PluginInput, autoCompactState, ctx.client, ctx.directory, - experimental + experimental, + dcpForCompaction ) }, 300) } @@ -140,7 +143,8 @@ export function createAnthropicContextWindowLimitRecoveryHook(ctx: PluginInput, autoCompactState, ctx.client, ctx.directory, - experimental + experimental, + dcpForCompaction ) } } diff --git a/src/index.ts b/src/index.ts index 75e00bf..1e680a0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -274,7 +274,10 @@ const OhMyOpenCodePlugin: Plugin = async (ctx) => { disabledHooks: (pluginConfig.claude_code?.hooks ?? true) ? undefined : true, }); const anthropicContextWindowLimitRecovery = isHookEnabled("anthropic-context-window-limit-recovery") - ? createAnthropicContextWindowLimitRecoveryHook(ctx, { experimental: pluginConfig.experimental }) + ? createAnthropicContextWindowLimitRecoveryHook(ctx, { + experimental: pluginConfig.experimental, + dcpForCompaction: isHookEnabled("dcp-for-compaction"), + }) : null; const compactionContextInjector = createCompactionContextInjector(); const preemptiveCompaction = createPreemptiveCompactionHook(ctx, {