@tarquinen/opencode-dcp 0.4.17 → 1.0.0-beta.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.
Files changed (163) hide show
  1. package/README.md +58 -30
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +19 -59
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/config.d.ts +30 -13
  6. package/dist/lib/config.d.ts.map +1 -1
  7. package/dist/lib/config.js +339 -121
  8. package/dist/lib/config.js.map +1 -1
  9. package/dist/lib/hooks.d.ts +5 -13
  10. package/dist/lib/hooks.d.ts.map +1 -1
  11. package/dist/lib/hooks.js +26 -125
  12. package/dist/lib/hooks.js.map +1 -1
  13. package/dist/lib/logger.d.ts +5 -9
  14. package/dist/lib/logger.d.ts.map +1 -1
  15. package/dist/lib/logger.js +30 -160
  16. package/dist/lib/logger.js.map +1 -1
  17. package/dist/lib/messages/index.d.ts +2 -0
  18. package/dist/lib/messages/index.d.ts.map +1 -0
  19. package/dist/lib/messages/index.js +2 -0
  20. package/dist/lib/messages/index.js.map +1 -0
  21. package/dist/lib/messages/prune.d.ts +6 -0
  22. package/dist/lib/messages/prune.d.ts.map +1 -0
  23. package/dist/lib/messages/prune.js +85 -0
  24. package/dist/lib/messages/prune.js.map +1 -0
  25. package/dist/lib/messages/utils.d.ts +10 -0
  26. package/dist/lib/messages/utils.d.ts.map +1 -0
  27. package/dist/lib/messages/utils.js +103 -0
  28. package/dist/lib/messages/utils.js.map +1 -0
  29. package/dist/lib/model-selector.js +3 -3
  30. package/dist/lib/model-selector.js.map +1 -1
  31. package/dist/lib/{core/prompt.d.ts → prompt.d.ts} +1 -1
  32. package/dist/lib/prompt.d.ts.map +1 -0
  33. package/dist/lib/{core/prompt.js → prompt.js} +2 -6
  34. package/dist/lib/prompt.js.map +1 -0
  35. package/dist/lib/prompts/pruning.txt +1 -1
  36. package/dist/lib/prompts/tool.txt +3 -3
  37. package/dist/lib/state/index.d.ts +3 -27
  38. package/dist/lib/state/index.d.ts.map +1 -1
  39. package/dist/lib/state/index.js +3 -40
  40. package/dist/lib/state/index.js.map +1 -1
  41. package/dist/lib/state/persistence.d.ts +4 -4
  42. package/dist/lib/state/persistence.d.ts.map +1 -1
  43. package/dist/lib/state/persistence.js +24 -20
  44. package/dist/lib/state/persistence.js.map +1 -1
  45. package/dist/lib/state/state.d.ts +7 -0
  46. package/dist/lib/state/state.d.ts.map +1 -0
  47. package/dist/lib/state/state.js +76 -0
  48. package/dist/lib/state/state.js.map +1 -0
  49. package/dist/lib/state/tool-cache.d.ts +4 -6
  50. package/dist/lib/state/tool-cache.d.ts.map +1 -1
  51. package/dist/lib/state/tool-cache.js +14 -46
  52. package/dist/lib/state/tool-cache.js.map +1 -1
  53. package/dist/lib/state/types.d.ts +30 -0
  54. package/dist/lib/state/types.d.ts.map +1 -0
  55. package/dist/lib/state/types.js +2 -0
  56. package/dist/lib/state/types.js.map +1 -0
  57. package/dist/lib/strategies/deduplication.d.ts +10 -0
  58. package/dist/lib/strategies/deduplication.d.ts.map +1 -0
  59. package/dist/lib/strategies/deduplication.js +89 -0
  60. package/dist/lib/strategies/deduplication.js.map +1 -0
  61. package/dist/lib/strategies/index.d.ts +4 -0
  62. package/dist/lib/strategies/index.d.ts.map +1 -0
  63. package/dist/lib/strategies/index.js +4 -0
  64. package/dist/lib/strategies/index.js.map +1 -0
  65. package/dist/lib/strategies/on-idle.d.ts +14 -0
  66. package/dist/lib/strategies/on-idle.d.ts.map +1 -0
  67. package/dist/lib/strategies/on-idle.js +216 -0
  68. package/dist/lib/strategies/on-idle.js.map +1 -0
  69. package/dist/lib/strategies/prune-tool.d.ts +17 -0
  70. package/dist/lib/strategies/prune-tool.d.ts.map +1 -0
  71. package/dist/lib/strategies/prune-tool.js +70 -0
  72. package/dist/lib/strategies/prune-tool.js.map +1 -0
  73. package/dist/lib/ui/display-utils.d.ts +3 -12
  74. package/dist/lib/ui/display-utils.d.ts.map +1 -1
  75. package/dist/lib/ui/display-utils.js +12 -79
  76. package/dist/lib/ui/display-utils.js.map +1 -1
  77. package/dist/lib/ui/notification.d.ts +7 -23
  78. package/dist/lib/ui/notification.d.ts.map +1 -1
  79. package/dist/lib/ui/notification.js +38 -47
  80. package/dist/lib/ui/notification.js.map +1 -1
  81. package/dist/lib/utils.d.ts +9 -0
  82. package/dist/lib/utils.d.ts.map +1 -0
  83. package/dist/lib/utils.js +61 -0
  84. package/dist/lib/utils.js.map +1 -0
  85. package/package.json +1 -1
  86. package/dist/lib/core/janitor.d.ts +0 -38
  87. package/dist/lib/core/janitor.d.ts.map +0 -1
  88. package/dist/lib/core/janitor.js +0 -294
  89. package/dist/lib/core/janitor.js.map +0 -1
  90. package/dist/lib/core/prompt.d.ts.map +0 -1
  91. package/dist/lib/core/prompt.js.map +0 -1
  92. package/dist/lib/core/strategies/deduplication.d.ts +0 -7
  93. package/dist/lib/core/strategies/deduplication.d.ts.map +0 -1
  94. package/dist/lib/core/strategies/deduplication.js +0 -76
  95. package/dist/lib/core/strategies/deduplication.js.map +0 -1
  96. package/dist/lib/core/strategies/index.d.ts +0 -51
  97. package/dist/lib/core/strategies/index.d.ts.map +0 -1
  98. package/dist/lib/core/strategies/index.js +0 -48
  99. package/dist/lib/core/strategies/index.js.map +0 -1
  100. package/dist/lib/fetch-wrapper/formats/anthropic.d.ts +0 -8
  101. package/dist/lib/fetch-wrapper/formats/anthropic.d.ts.map +0 -1
  102. package/dist/lib/fetch-wrapper/formats/anthropic.js +0 -96
  103. package/dist/lib/fetch-wrapper/formats/anthropic.js.map +0 -1
  104. package/dist/lib/fetch-wrapper/formats/bedrock.d.ts +0 -8
  105. package/dist/lib/fetch-wrapper/formats/bedrock.d.ts.map +0 -1
  106. package/dist/lib/fetch-wrapper/formats/bedrock.js +0 -97
  107. package/dist/lib/fetch-wrapper/formats/bedrock.js.map +0 -1
  108. package/dist/lib/fetch-wrapper/formats/gemini.d.ts +0 -8
  109. package/dist/lib/fetch-wrapper/formats/gemini.d.ts.map +0 -1
  110. package/dist/lib/fetch-wrapper/formats/gemini.js +0 -134
  111. package/dist/lib/fetch-wrapper/formats/gemini.js.map +0 -1
  112. package/dist/lib/fetch-wrapper/formats/index.d.ts +0 -6
  113. package/dist/lib/fetch-wrapper/formats/index.d.ts.map +0 -1
  114. package/dist/lib/fetch-wrapper/formats/index.js +0 -6
  115. package/dist/lib/fetch-wrapper/formats/index.js.map +0 -1
  116. package/dist/lib/fetch-wrapper/formats/openai-chat.d.ts +0 -3
  117. package/dist/lib/fetch-wrapper/formats/openai-chat.d.ts.map +0 -1
  118. package/dist/lib/fetch-wrapper/formats/openai-chat.js +0 -100
  119. package/dist/lib/fetch-wrapper/formats/openai-chat.js.map +0 -1
  120. package/dist/lib/fetch-wrapper/formats/openai-responses.d.ts +0 -3
  121. package/dist/lib/fetch-wrapper/formats/openai-responses.d.ts.map +0 -1
  122. package/dist/lib/fetch-wrapper/formats/openai-responses.js +0 -63
  123. package/dist/lib/fetch-wrapper/formats/openai-responses.js.map +0 -1
  124. package/dist/lib/fetch-wrapper/gc-tracker.d.ts +0 -4
  125. package/dist/lib/fetch-wrapper/gc-tracker.d.ts.map +0 -1
  126. package/dist/lib/fetch-wrapper/gc-tracker.js +0 -61
  127. package/dist/lib/fetch-wrapper/gc-tracker.js.map +0 -1
  128. package/dist/lib/fetch-wrapper/handler.d.ts +0 -3
  129. package/dist/lib/fetch-wrapper/handler.d.ts.map +0 -1
  130. package/dist/lib/fetch-wrapper/handler.js +0 -118
  131. package/dist/lib/fetch-wrapper/handler.js.map +0 -1
  132. package/dist/lib/fetch-wrapper/index.d.ts +0 -18
  133. package/dist/lib/fetch-wrapper/index.d.ts.map +0 -1
  134. package/dist/lib/fetch-wrapper/index.js +0 -107
  135. package/dist/lib/fetch-wrapper/index.js.map +0 -1
  136. package/dist/lib/fetch-wrapper/prunable-list.d.ts +0 -8
  137. package/dist/lib/fetch-wrapper/prunable-list.d.ts.map +0 -1
  138. package/dist/lib/fetch-wrapper/prunable-list.js +0 -38
  139. package/dist/lib/fetch-wrapper/prunable-list.js.map +0 -1
  140. package/dist/lib/fetch-wrapper/tool-tracker.d.ts +0 -9
  141. package/dist/lib/fetch-wrapper/tool-tracker.d.ts.map +0 -1
  142. package/dist/lib/fetch-wrapper/tool-tracker.js +0 -12
  143. package/dist/lib/fetch-wrapper/tool-tracker.js.map +0 -1
  144. package/dist/lib/fetch-wrapper/types.d.ts +0 -62
  145. package/dist/lib/fetch-wrapper/types.d.ts.map +0 -1
  146. package/dist/lib/fetch-wrapper/types.js +0 -7
  147. package/dist/lib/fetch-wrapper/types.js.map +0 -1
  148. package/dist/lib/pruning-tool.d.ts +0 -20
  149. package/dist/lib/pruning-tool.d.ts.map +0 -1
  150. package/dist/lib/pruning-tool.js +0 -160
  151. package/dist/lib/pruning-tool.js.map +0 -1
  152. package/dist/lib/state/id-mapping.d.ts +0 -25
  153. package/dist/lib/state/id-mapping.d.ts.map +0 -1
  154. package/dist/lib/state/id-mapping.js +0 -51
  155. package/dist/lib/state/id-mapping.js.map +0 -1
  156. package/dist/lib/tokenizer.d.ts +0 -3
  157. package/dist/lib/tokenizer.d.ts.map +0 -1
  158. package/dist/lib/tokenizer.js +0 -16
  159. package/dist/lib/tokenizer.js.map +0 -1
  160. package/dist/lib/version-checker.d.ts +0 -9
  161. package/dist/lib/version-checker.d.ts.map +0 -1
  162. package/dist/lib/version-checker.js +0 -77
  163. package/dist/lib/version-checker.js.map +0 -1
package/README.md CHANGED
@@ -23,19 +23,15 @@ Restart OpenCode. The plugin will automatically start optimizing your sessions.
23
23
 
24
24
  ## How Pruning Works
25
25
 
26
- DCP uses two complementary techniques:
26
+ DCP uses multiple strategies to reduce context size:
27
27
 
28
- **Automatic Deduplication** — Silently identifies repeated tool calls (e.g., reading the same file multiple times) and keeps only the most recent output. Runs on every request with zero LLM cost.
28
+ **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.
29
29
 
30
- **AI Analysis** — Uses a language model to semantically analyze conversation context and identify tool outputs that are no longer relevant to the current task.
30
+ **Prune Thinking Blocks** — Removes LLM thinking/reasoning blocks from the conversation history.
31
31
 
32
- ## Context Pruning Tool
32
+ **On Idle Analysis** — Uses a language model to semantically analyze conversation context during idle periods and identify tool outputs that are no longer relevant.
33
33
 
34
- When `strategies.onTool` is enabled, DCP exposes a `prune` tool to Opencode that the AI can call to trigger pruning on demand.
35
-
36
- Adjust `nudge_freq` to control how aggressively the AI is prompted to prune — lower values trigger reminders sooner and more often.
37
-
38
- ## How It Works
34
+ **Prune Tool** Exposes a `prune` tool that the AI can call to manually trigger pruning when it determines context cleanup is needed.
39
35
 
40
36
  Your session history is never modified. DCP replaces pruned outputs with a placeholder before sending requests to your LLM.
41
37
 
@@ -49,35 +45,67 @@ LLM providers like Anthropic and OpenAI cache prompts based on exact prefix matc
49
45
 
50
46
  DCP uses its own config file (`~/.config/opencode/dcp.jsonc` or `.opencode/dcp.jsonc`), created automatically on first run.
51
47
 
52
- ### Options
53
-
54
- | Option | Default | Description |
55
- |--------|---------|-------------|
56
- | `enabled` | `true` | Enable/disable the plugin |
57
- | `debug` | `false` | Log to `~/.config/opencode/logs/dcp/` |
58
- | `model` | (session) | Model for analysis (e.g., `"anthropic/claude-haiku-4-5"`) |
59
- | `showModelErrorToasts` | `true` | Show notifications on model fallback |
60
- | `showUpdateToasts` | `true` | Show notifications when a new version is available |
61
- | `strictModelSelection` | `false` | Only run AI analysis with session or configured model (disables fallback models) |
62
- | `pruning_summary` | `"detailed"` | `"off"`, `"minimal"`, or `"detailed"` |
63
- | `nudge_freq` | `10` | How often to remind AI to prune (lower = more frequent) |
64
- | `protectedTools` | `["task", "todowrite", "todoread", "prune", "batch", "write", "edit"]` | Tools that are never pruned |
65
- | `strategies.onIdle` | `["ai-analysis"]` | Strategies for automatic pruning |
66
- | `strategies.onTool` | `["ai-analysis"]` | Strategies when AI calls `prune` |
67
-
68
- **Strategies:** `"ai-analysis"` uses LLM to identify prunable outputs. Empty array disables that trigger. Deduplication runs automatically on every request.
48
+ <details>
49
+ <summary><strong>Default Configuration</strong> (click to expand)</summary>
69
50
 
70
51
  ```jsonc
71
52
  {
53
+ // Enable or disable the plugin
72
54
  "enabled": true,
55
+ // Enable debug logging to ~/.config/opencode/logs/dcp/
56
+ "debug": false,
57
+ // Show toast notifications when a new version is available
58
+ "showUpdateToasts": true,
59
+ // Summary display: "off", "minimal", or "detailed"
60
+ "pruningSummary": "detailed",
61
+ // Strategies for pruning tokens from chat history
73
62
  "strategies": {
74
- "onIdle": ["ai-analysis"],
75
- "onTool": ["ai-analysis"]
76
- },
77
- "protectedTools": ["task", "todowrite", "todoread", "prune", "batch", "write", "edit"]
63
+ // Remove duplicate tool calls (same tool with same arguments)
64
+ "deduplication": {
65
+ "enabled": true,
66
+ // Additional tools to protect from pruning
67
+ "protectedTools": []
68
+ },
69
+ // Remove thinking/reasoning LLM blocks
70
+ "pruneThinkingBlocks": {
71
+ "enabled": false
72
+ },
73
+ // Exposes a prune tool to your LLM to call when it determines pruning is necessary
74
+ "pruneTool": {
75
+ "enabled": true,
76
+ // Additional tools to protect from pruning
77
+ "protectedTools": [],
78
+ // Nudge the LLM to use the prune tool (every <frequency> tool results)
79
+ "nudge": {
80
+ "enabled": true,
81
+ "frequency": 10
82
+ }
83
+ },
84
+ // (Legacy) Run an LLM to analyze what tool calls are no longer relevant on idle
85
+ "onIdle": {
86
+ "enabled": false,
87
+ // Override model for analysis (format: "provider/model")
88
+ // "model": "anthropic/claude-haiku-4-5",
89
+ // Show toast notifications when model selection fails
90
+ "showModelErrorToasts": true,
91
+ // When true, fallback models are not permitted
92
+ "strictModelSelection": false,
93
+ // Additional tools to protect from pruning
94
+ "protectedTools": []
95
+ }
96
+ }
78
97
  }
79
98
  ```
80
99
 
100
+ </details>
101
+
102
+ ### Protected Tools
103
+
104
+ By default, these tools are always protected from pruning across all strategies:
105
+ `task`, `todowrite`, `todoread`, `prune`, `batch`, `write`, `edit`
106
+
107
+ The `protectedTools` arrays in each strategy add to this default list.
108
+
81
109
  ### Config Precedence
82
110
 
83
111
  Settings are merged in order: **Defaults** → **Global** (`~/.config/opencode/dcp.jsonc`) → **Project** (`.opencode/dcp.jsonc`). Each level overrides the previous, so project settings take priority over global, which takes priority over defaults.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAWjD,QAAA,MAAM,MAAM,EAAE,MA2FK,CAAA;AAEnB,eAAe,MAAM,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAOjD,QAAA,MAAM,MAAM,EAAE,MAmDK,CAAA;AAEnB,eAAe,MAAM,CAAA"}
package/dist/index.js CHANGED
@@ -1,14 +1,10 @@
1
1
  import { getConfig } from "./lib/config";
2
2
  import { Logger } from "./lib/logger";
3
- import { createJanitorContext } from "./lib/core/janitor";
4
- import { checkForUpdates } from "./lib/version-checker";
5
- import { createPluginState } from "./lib/state";
6
- import { installFetchWrapper } from "./lib/fetch-wrapper";
7
- import { createPruningTool } from "./lib/pruning-tool";
8
- import { createEventHandler, createChatParamsHandler } from "./lib/hooks";
9
- import { createToolTracker } from "./lib/fetch-wrapper/tool-tracker";
3
+ import { createSessionState } from "./lib/state";
4
+ import { createPruneTool } from "./lib/strategies";
5
+ import { createChatMessageTransformHandler, createEventHandler } from "./lib/hooks";
10
6
  const plugin = (async (ctx) => {
11
- const { config, migrations } = getConfig(ctx);
7
+ const config = getConfig(ctx);
12
8
  if (!config.enabled) {
13
9
  return {};
14
10
  }
@@ -18,71 +14,35 @@ const plugin = (async (ctx) => {
18
14
  }
19
15
  // Initialize core components
20
16
  const logger = new Logger(config.debug);
21
- const state = createPluginState();
22
- const janitorCtx = createJanitorContext(ctx.client, state, logger, {
23
- protectedTools: config.protectedTools,
24
- model: config.model,
25
- showModelErrorToasts: config.showModelErrorToasts ?? true,
26
- strictModelSelection: config.strictModelSelection ?? false,
27
- pruningSummary: config.pruning_summary,
28
- workingDirectory: ctx.directory
29
- });
30
- // Create tool tracker for nudge injection
31
- const toolTracker = createToolTracker();
32
- // Install global fetch wrapper for context pruning and system message injection
33
- installFetchWrapper(state, logger, ctx.client, config, toolTracker);
17
+ const state = createSessionState();
34
18
  // Log initialization
35
- logger.info("plugin", "DCP initialized", {
19
+ logger.info("DCP initialized", {
36
20
  strategies: config.strategies,
37
- model: config.model || "auto"
38
21
  });
39
- // Check for updates after a delay
40
- setTimeout(() => {
41
- checkForUpdates(ctx.client, logger, config.showUpdateToasts ?? true).catch(() => { });
42
- }, 5000);
43
- // Show migration toast if there were config migrations
44
- if (migrations.length > 0) {
45
- setTimeout(async () => {
46
- try {
47
- await ctx.client.tui.showToast({
48
- body: {
49
- title: "DCP: Config upgraded",
50
- message: migrations.join('\n'),
51
- variant: "info",
52
- duration: 8000
53
- }
54
- });
55
- }
56
- catch {
57
- // Silently ignore toast errors
58
- }
59
- }, 7000);
60
- }
61
22
  return {
23
+ "experimental.chat.messages.transform": createChatMessageTransformHandler(ctx.client, state, logger, config),
24
+ tool: config.strategies.pruneTool.enabled ? {
25
+ prune: createPruneTool({
26
+ client: ctx.client,
27
+ state,
28
+ logger,
29
+ config,
30
+ workingDirectory: ctx.directory
31
+ }),
32
+ } : undefined,
62
33
  config: async (opencodeConfig) => {
63
34
  // Add prune to primary_tools by mutating the opencode config
64
35
  // This works because config is cached and passed by reference
65
- if (config.strategies.onTool.length > 0) {
36
+ if (config.strategies.pruneTool.enabled) {
66
37
  const existingPrimaryTools = opencodeConfig.experimental?.primary_tools ?? [];
67
38
  opencodeConfig.experimental = {
68
39
  ...opencodeConfig.experimental,
69
40
  primary_tools: [...existingPrimaryTools, "prune"],
70
41
  };
71
- logger.info("plugin", "Added 'prune' to experimental.primary_tools via config mutation");
42
+ logger.info("Added 'prune' to experimental.primary_tools via config mutation");
72
43
  }
73
44
  },
74
- event: createEventHandler(ctx.client, janitorCtx, logger, config, toolTracker),
75
- "chat.params": createChatParamsHandler(ctx.client, state, logger, toolTracker),
76
- tool: config.strategies.onTool.length > 0 ? {
77
- prune: createPruningTool({
78
- client: ctx.client,
79
- state,
80
- logger,
81
- config,
82
- notificationCtx: janitorCtx.notificationCtx,
83
- workingDirectory: ctx.directory
84
- }, toolTracker),
85
- } : undefined,
45
+ event: createEventHandler(ctx.client, config, state, logger, ctx.directory),
86
46
  };
87
47
  });
88
48
  export default plugin;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
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,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,iCAAiC,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAEnF,MAAM,MAAM,GAAW,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IAClC,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAA;IAE7B,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,EAAE,CAAA;IACb,CAAC;IAED,2BAA2B;IAC3B,IAAI,OAAO,UAAU,KAAK,WAAW,EAAE,CAAC;QACnC,UAAkB,CAAC,mBAAmB,GAAG,KAAK,CAAA;IACnD,CAAC;IAED,6BAA6B;IAC7B,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACvC,MAAM,KAAK,GAAG,kBAAkB,EAAE,CAAA;IAElC,qBAAqB;IACrB,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE;QAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;KAChC,CAAC,CAAA;IAEF,OAAO;QACH,sCAAsC,EAAE,iCAAiC,CACrE,GAAG,CAAC,MAAM,EACV,KAAK,EACL,MAAM,EACN,MAAM,CACT;QACD,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YACxC,KAAK,EAAE,eAAe,CAAC;gBACnB,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,KAAK;gBACL,MAAM;gBACN,MAAM;gBACN,gBAAgB,EAAE,GAAG,CAAC,SAAS;aAClC,CAAC;SACL,CAAC,CAAC,CAAC,SAAS;QACb,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;YAC7B,6DAA6D;YAC7D,8DAA8D;YAC9D,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;gBACtC,MAAM,oBAAoB,GAAG,cAAc,CAAC,YAAY,EAAE,aAAa,IAAI,EAAE,CAAA;gBAC7E,cAAc,CAAC,YAAY,GAAG;oBAC1B,GAAG,cAAc,CAAC,YAAY;oBAC9B,aAAa,EAAE,CAAC,GAAG,oBAAoB,EAAE,OAAO,CAAC;iBACpD,CAAA;gBACD,MAAM,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAA;YAClF,CAAC;QACL,CAAC;QACD,KAAK,EAAE,kBAAkB,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC;KAC9E,CAAA;AACL,CAAC,CAAkB,CAAA;AAEnB,eAAe,MAAM,CAAA"}
@@ -1,23 +1,40 @@
1
1
  import type { PluginInput } from '@opencode-ai/plugin';
2
- export type PruningStrategy = "deduplication" | "ai-analysis";
3
- export interface PluginConfig {
2
+ export interface Deduplication {
4
3
  enabled: boolean;
5
- debug: boolean;
6
4
  protectedTools: string[];
5
+ }
6
+ export interface PruneThinkingBlocks {
7
+ enabled: boolean;
8
+ }
9
+ export interface OnIdle {
10
+ enabled: boolean;
7
11
  model?: string;
8
12
  showModelErrorToasts?: boolean;
9
- showUpdateToasts?: boolean;
10
13
  strictModelSelection?: boolean;
11
- pruning_summary: "off" | "minimal" | "detailed";
12
- nudge_freq: number;
14
+ protectedTools: string[];
15
+ }
16
+ export interface PruneToolNudge {
17
+ enabled: boolean;
18
+ frequency: number;
19
+ }
20
+ export interface PruneTool {
21
+ enabled: boolean;
22
+ protectedTools: string[];
23
+ nudge: PruneToolNudge;
24
+ }
25
+ export interface PluginConfig {
26
+ enabled: boolean;
27
+ debug: boolean;
28
+ showUpdateToasts?: boolean;
29
+ pruningSummary: "off" | "minimal" | "detailed";
13
30
  strategies: {
14
- onIdle: PruningStrategy[];
15
- onTool: PruningStrategy[];
31
+ deduplication: Deduplication;
32
+ pruneThinkingBlocks: PruneThinkingBlocks;
33
+ onIdle: OnIdle;
34
+ pruneTool: PruneTool;
16
35
  };
17
36
  }
18
- export interface ConfigResult {
19
- config: PluginConfig;
20
- migrations: string[];
21
- }
22
- export declare function getConfig(ctx?: PluginInput): ConfigResult;
37
+ export declare const VALID_CONFIG_KEYS: Set<string>;
38
+ export declare function getInvalidConfigKeys(userConfig: Record<string, any>): string[];
39
+ export declare function getConfig(ctx: PluginInput): PluginConfig;
23
40
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../lib/config.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEtD,MAAM,MAAM,eAAe,GAAG,eAAe,GAAG,aAAa,CAAA;AAE7D,MAAM,WAAW,YAAY;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;IACd,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,eAAe,EAAE,KAAK,GAAG,SAAS,GAAG,UAAU,CAAA;IAC/C,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE;QACR,MAAM,EAAE,eAAe,EAAE,CAAA;QACzB,MAAM,EAAE,eAAe,EAAE,CAAA;KAC5B,CAAA;CACJ;AAED,MAAM,WAAW,YAAY;IACzB,MAAM,EAAE,YAAY,CAAA;IACpB,UAAU,EAAE,MAAM,EAAE,CAAA;CACvB;AA0JD,wBAAgB,SAAS,CAAC,GAAG,CAAC,EAAE,WAAW,GAAG,YAAY,CAsEzD"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../lib/config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEtD,MAAM,WAAW,aAAa;IAC1B,OAAO,EAAE,OAAO,CAAA;IAChB,cAAc,EAAE,MAAM,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAChC,OAAO,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,MAAM;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,cAAc,EAAE,MAAM,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,cAAc;IAC3B,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,SAAS;IACtB,OAAO,EAAE,OAAO,CAAA;IAChB,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,KAAK,EAAE,cAAc,CAAA;CACxB;AAED,MAAM,WAAW,YAAY;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;IACd,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,cAAc,EAAE,KAAK,GAAG,SAAS,GAAG,UAAU,CAAA;IAC9C,UAAU,EAAE;QACR,aAAa,EAAE,aAAa,CAAA;QAC5B,mBAAmB,EAAE,mBAAmB,CAAA;QACxC,MAAM,EAAE,MAAM,CAAA;QACd,SAAS,EAAE,SAAS,CAAA;KACvB,CAAA;CACJ;AAKD,eAAO,MAAM,iBAAiB,aA4B5B,CAAA;AAgBF,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,EAAE,CAG9E;AAkWD,wBAAgB,SAAS,CAAC,GAAG,EAAE,WAAW,GAAG,YAAY,CAkExD"}