@tarquinen/opencode-dcp 0.1.12 → 0.2.2

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 CHANGED
@@ -25,7 +25,36 @@ Add to your OpenCode configuration:
25
25
 
26
26
  Restart OpenCode. The plugin will automatically start optimizing your sessions.
27
27
 
28
- ## Updating
28
+ ## Configuration
29
+
30
+ The plugin creates a configuration file at `~/.config/opencode/dcp.jsonc` on first run. You can edit this file to customize the plugin's behavior.
31
+
32
+ ```jsonc
33
+ {
34
+ // Enable or disable the Dynamic Context Pruning plugin
35
+ "enabled": true,
36
+
37
+ // Enable debug logging to ~/.config/opencode/logs/dcp/YYYY-MM-DD.log
38
+ "debug": false,
39
+
40
+ // List of tools that should never be pruned from context
41
+ // The 'task' tool is protected by default to preserve subagent coordination
42
+ "protectedTools": ["task"]
43
+ }
44
+ ```
45
+
46
+ ### Configuration Options
47
+
48
+ - **`enabled`** (boolean, default: `true`)
49
+ Enable or disable the plugin without removing it from your OpenCode configuration.
50
+
51
+ - **`debug`** (boolean, default: `false`)
52
+ Enable detailed debug logging. Logs are written to `~/.config/opencode/logs/dcp/YYYY-MM-DD.log`.
53
+
54
+ - **`protectedTools`** (string[], default: `["task"]`)
55
+ List of tool names that should never be pruned from context. The `task` tool is protected by default to ensure subagent coordination works correctly.
56
+
57
+ After modifying the configuration, restart OpenCode for changes to take effect.
29
58
 
30
59
  OpenCode automatically installs plugins from npm to `~/.cache/opencode/node_modules/`. To force an update to the latest version:
31
60
 
@@ -61,27 +90,6 @@ If you want to ensure a specific version is always used, you can pin it in your
61
90
  }
62
91
  ```
63
92
 
64
- ## Debug Logging
65
-
66
- Enable debug logging by setting the `OPENCODE_DCP_DEBUG` environment variable:
67
-
68
- ```bash
69
- # For one session
70
- OPENCODE_DCP_DEBUG=1 opencode
71
-
72
- # For all sessions
73
- export OPENCODE_DCP_DEBUG=1
74
- opencode
75
- ```
76
-
77
- Logs are written to `~/.config/opencode/logs/dcp/YYYY-MM-DD.log`.
78
-
79
- Watch logs in real-time:
80
-
81
- ```bash
82
- tail -f ~/.config/opencode/logs/dcp/$(date +%Y-%m-%d).log
83
- ```
84
-
85
93
  ## License
86
94
 
87
95
  MIT
package/dist/index.d.ts CHANGED
@@ -1,24 +1,4 @@
1
- declare const _default: (ctx: import("@opencode-ai/plugin").PluginInput) => Promise<{
2
- /**
3
- * Event Hook: Triggers janitor analysis when session becomes idle
4
- */
5
- event: ({ event }: {
6
- event: import("@opencode-ai/sdk").Event;
7
- }) => Promise<void>;
8
- /**
9
- * Chat Params Hook: Wraps fetch function to filter pruned tool responses
10
- */
11
- "chat.params": (input: {
12
- sessionID: string;
13
- agent: string;
14
- model: import("@opencode-ai/sdk").Model;
15
- provider: import("@opencode-ai/sdk").Provider;
16
- message: import("@opencode-ai/sdk").UserMessage;
17
- }, output: {
18
- temperature: number;
19
- topP: number;
20
- options: Record<string, any>;
21
- }) => Promise<void>;
22
- }>;
23
- export default _default;
1
+ import type { Plugin } from "@opencode-ai/plugin";
2
+ declare const plugin: Plugin;
3
+ export default plugin;
24
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";IAgFQ;;OAEG;;;;IA8BH;;OAEG;;;;;;;;;;;;;AAzGX,wBAoPmB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAuCjD,QAAA,MAAM,MAAM,EAAE,MAoSK,CAAA;AAEnB,eAAe,MAAM,CAAA"}
package/dist/index.js CHANGED
@@ -4,8 +4,37 @@ import { StateManager } from "./lib/state";
4
4
  import { Janitor } from "./lib/janitor";
5
5
  import { join } from "path";
6
6
  import { homedir } from "os";
7
- export default (async (ctx) => {
7
+ /**
8
+ * Checks if a session is a subagent (child session)
9
+ * Subagent sessions should skip pruning operations
10
+ */
11
+ async function isSubagentSession(client, sessionID, logger) {
12
+ try {
13
+ const result = await client.session.get({ path: { id: sessionID } });
14
+ if (result.data?.parentID) {
15
+ logger.debug("subagent-check", "Detected subagent session, skipping pruning", {
16
+ sessionID,
17
+ parentID: result.data.parentID
18
+ });
19
+ return true;
20
+ }
21
+ return false;
22
+ }
23
+ catch (error) {
24
+ logger.error("subagent-check", "Failed to check if session is subagent", {
25
+ sessionID,
26
+ error: error.message
27
+ });
28
+ // On error, assume it's not a subagent and continue (fail open)
29
+ return false;
30
+ }
31
+ }
32
+ const plugin = (async (ctx) => {
8
33
  const config = getConfig();
34
+ // Exit early if plugin is disabled
35
+ if (!config.enabled) {
36
+ return {};
37
+ }
9
38
  // Suppress AI SDK warnings about responseFormat (harmless for our use case)
10
39
  if (typeof globalThis !== 'undefined') {
11
40
  globalThis.AI_SDK_LOG_WARNINGS = false;
@@ -14,7 +43,8 @@ export default (async (ctx) => {
14
43
  const logger = new Logger(config.debug);
15
44
  const stateManager = new StateManager();
16
45
  const toolParametersCache = new Map(); // callID -> parameters
17
- const janitor = new Janitor(ctx.client, stateManager, logger, toolParametersCache, config.protectedTools);
46
+ const modelCache = new Map(); // sessionID -> model info
47
+ const janitor = new Janitor(ctx.client, stateManager, logger, toolParametersCache, config.protectedTools, modelCache);
18
48
  const cacheToolParameters = (messages, component) => {
19
49
  for (const message of messages) {
20
50
  if (message.role !== 'assistant' || !Array.isArray(message.tool_calls)) {
@@ -44,15 +74,25 @@ export default (async (ctx) => {
44
74
  }
45
75
  }
46
76
  };
47
- // Lightweight global fetch wrapper that only caches tool parameters so Janitor can display
48
- // meaningful metadata even if the plugin loads mid-session before chat.params runs.
77
+ // Global fetch wrapper that caches tool parameters for janitor metadata
78
+ // Note: Pruning is handled per-session in the chat.params hook, not here
79
+ // This works because all providers ultimately call globalThis.fetch
49
80
  const originalGlobalFetch = globalThis.fetch;
50
81
  globalThis.fetch = async (input, init) => {
51
82
  if (init?.body && typeof init.body === 'string') {
52
83
  try {
53
84
  const body = JSON.parse(init.body);
54
85
  if (body.messages && Array.isArray(body.messages)) {
86
+ // Cache tool parameters for janitor metadata
55
87
  cacheToolParameters(body.messages, "global-fetch");
88
+ // Log tool messages for debugging
89
+ const toolMessages = body.messages.filter((m) => m.role === 'tool');
90
+ if (toolMessages.length > 0) {
91
+ logger.debug("global-fetch", "Found tool messages in request", {
92
+ toolMessageCount: toolMessages.length,
93
+ toolCallIds: toolMessages.map((m) => m.tool_call_id).slice(0, 5)
94
+ });
95
+ }
56
96
  }
57
97
  }
58
98
  catch (e) {
@@ -62,8 +102,10 @@ export default (async (ctx) => {
62
102
  return originalGlobalFetch(input, init);
63
103
  };
64
104
  logger.info("plugin", "Dynamic Context Pruning plugin initialized", {
105
+ enabled: config.enabled,
65
106
  debug: config.debug,
66
107
  protectedTools: config.protectedTools,
108
+ configFile: join(homedir(), ".config", "opencode", "dcp.jsonc"),
67
109
  logDirectory: join(homedir(), ".config", "opencode", "logs", "dcp"),
68
110
  globalFetchWrapped: true
69
111
  });
@@ -73,16 +115,9 @@ export default (async (ctx) => {
73
115
  */
74
116
  event: async ({ event }) => {
75
117
  if (event.type === "session.status" && event.properties.status.type === "idle") {
76
- // Get session info to check if it's a subagent
77
- const result = await ctx.client.session.get({ path: { id: event.properties.sessionID } });
78
118
  // Skip pruning for subagent sessions
79
- if (result.data?.parentID) {
80
- logger.debug("event", "Skipping janitor for subagent session", {
81
- sessionID: event.properties.sessionID,
82
- parentID: result.data.parentID
83
- });
119
+ if (await isSubagentSession(ctx.client, event.properties.sessionID, logger))
84
120
  return;
85
- }
86
121
  logger.debug("event", "Session became idle, triggering janitor", {
87
122
  sessionID: event.properties.sessionID
88
123
  });
@@ -101,16 +136,53 @@ export default (async (ctx) => {
101
136
  */
102
137
  "chat.params": async (input, output) => {
103
138
  const sessionId = input.sessionID;
104
- // Get session info to check if it's a subagent
105
- const result = await ctx.client.session.get({ path: { id: sessionId } });
106
- // Skip pruning for subagent sessions
107
- if (result.data?.parentID) {
108
- logger.debug("chat.params", "Skipping context pruning for subagent session", {
139
+ // Debug: Log the entire input structure to see what we're getting
140
+ logger.debug("chat.params", "Hook input structure", {
141
+ sessionID: sessionId,
142
+ hasProvider: !!input.provider,
143
+ hasModel: !!input.model,
144
+ providerKeys: input.provider ? Object.keys(input.provider) : [],
145
+ provider: input.provider,
146
+ modelKeys: input.model ? Object.keys(input.model) : [],
147
+ model: input.model
148
+ });
149
+ // Cache model information for this session so janitor can access it
150
+ // The provider.id is actually nested at provider.info.id (not in SDK types)
151
+ let providerID = input.provider?.info?.id || input.provider?.id;
152
+ const modelID = input.model?.id;
153
+ // If provider.id is not available, try to get it from the message
154
+ if (!providerID && input.message?.model?.providerID) {
155
+ providerID = input.message.model.providerID;
156
+ logger.debug("chat.params", "Got providerID from message instead of provider object", {
157
+ sessionID: sessionId,
158
+ providerID: providerID
159
+ });
160
+ }
161
+ if (providerID && modelID) {
162
+ modelCache.set(sessionId, {
163
+ providerID: providerID,
164
+ modelID: modelID
165
+ });
166
+ logger.debug("chat.params", "Cached model info for session", {
109
167
  sessionID: sessionId,
110
- parentID: result.data.parentID
168
+ providerID: providerID,
169
+ modelID: modelID
111
170
  });
112
- return; // Don't wrap fetch, let it pass through unchanged
113
171
  }
172
+ else {
173
+ logger.warn("chat.params", "Missing provider or model info in hook input", {
174
+ sessionID: sessionId,
175
+ hasProvider: !!input.provider,
176
+ hasModel: !!input.model,
177
+ providerID: providerID,
178
+ modelID: modelID,
179
+ inputKeys: Object.keys(input),
180
+ messageModel: input.message?.model
181
+ });
182
+ }
183
+ // Skip pruning for subagent sessions
184
+ if (await isSubagentSession(ctx.client, sessionId, logger))
185
+ return;
114
186
  logger.debug("chat.params", "Wrapping fetch for session", {
115
187
  sessionID: sessionId,
116
188
  hasFetch: !!output.options["fetch"],
@@ -222,4 +294,5 @@ export default (async (ctx) => {
222
294
  },
223
295
  };
224
296
  });
297
+ export default plugin;
225
298
  //# sourceMappingURL=index.js.map
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":"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"}
@@ -1,6 +1,12 @@
1
1
  export interface PluginConfig {
2
+ enabled: boolean;
2
3
  debug: boolean;
3
4
  protectedTools: string[];
4
5
  }
6
+ /**
7
+ * Loads configuration from ~/.config/opencode/dcp.jsonc or dcp.json
8
+ * Creates the file with defaults if it doesn't exist
9
+ * Supports both JSON and JSONC (JSON with Comments) formats
10
+ */
5
11
  export declare function getConfig(): PluginConfig;
6
12
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../lib/config.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,YAAY;IACzB,KAAK,EAAE,OAAO,CAAA;IACd,cAAc,EAAE,MAAM,EAAE,CAAA;CAC3B;AAOD,wBAAgB,SAAS,IAAI,YAAY,CAQxC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../lib/config.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,YAAY;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;IACd,cAAc,EAAE,MAAM,EAAE,CAAA;CAC3B;AAmDD;;;;GAIG;AACH,wBAAgB,SAAS,IAAI,YAAY,CA0BxC"}
@@ -1,13 +1,80 @@
1
+ // lib/config.ts
2
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
3
+ import { join } from 'path';
4
+ import { homedir } from 'os';
5
+ import { parse } from 'jsonc-parser';
6
+ import { Logger } from './logger';
1
7
  const defaultConfig = {
2
- debug: false, // Default to false, can be enabled via environment variable
8
+ enabled: true, // Plugin is enabled by default
9
+ debug: false, // Disable debug logging by default
3
10
  protectedTools: ['task'] // Tools that should never be pruned
4
11
  };
12
+ const CONFIG_DIR = join(homedir(), '.config', 'opencode');
13
+ const CONFIG_PATH_JSONC = join(CONFIG_DIR, 'dcp.jsonc');
14
+ const CONFIG_PATH_JSON = join(CONFIG_DIR, 'dcp.json');
15
+ /**
16
+ * Determines which config file to use (prefers .jsonc, falls back to .json)
17
+ */
18
+ function getConfigPath() {
19
+ if (existsSync(CONFIG_PATH_JSONC)) {
20
+ return CONFIG_PATH_JSONC;
21
+ }
22
+ if (existsSync(CONFIG_PATH_JSON)) {
23
+ return CONFIG_PATH_JSON;
24
+ }
25
+ // Default to .jsonc for new installations (supports comments)
26
+ return CONFIG_PATH_JSONC;
27
+ }
28
+ /**
29
+ * Creates the default configuration file with helpful comments
30
+ */
31
+ function createDefaultConfig() {
32
+ // Ensure the directory exists
33
+ if (!existsSync(CONFIG_DIR)) {
34
+ mkdirSync(CONFIG_DIR, { recursive: true });
35
+ }
36
+ const configContent = `{
37
+ // Enable or disable the Dynamic Context Pruning plugin
38
+ "enabled": true,
39
+
40
+ // Enable debug logging to ~/.config/opencode/logs/dcp/YYYY-MM-DD.log
41
+ "debug": false,
42
+
43
+ // List of tools that should never be pruned from context
44
+ // The 'task' tool is protected by default to preserve subagent coordination
45
+ "protectedTools": ["task"]
46
+ }
47
+ `;
48
+ writeFileSync(CONFIG_PATH_JSONC, configContent, 'utf-8');
49
+ }
50
+ /**
51
+ * Loads configuration from ~/.config/opencode/dcp.jsonc or dcp.json
52
+ * Creates the file with defaults if it doesn't exist
53
+ * Supports both JSON and JSONC (JSON with Comments) formats
54
+ */
5
55
  export function getConfig() {
6
- // Check for environment variable
7
- const debugEnv = process.env.OPENCODE_DCP_DEBUG;
8
- return {
9
- debug: debugEnv === 'true' || debugEnv === '1' || defaultConfig.debug,
10
- protectedTools: defaultConfig.protectedTools
11
- };
56
+ const configPath = getConfigPath();
57
+ // Create default config if neither file exists
58
+ if (!existsSync(configPath)) {
59
+ createDefaultConfig();
60
+ }
61
+ try {
62
+ const fileContent = readFileSync(configPath, 'utf-8');
63
+ // jsonc-parser handles both JSON and JSONC formats
64
+ const userConfig = parse(fileContent);
65
+ // Merge user config with defaults (user config takes precedence)
66
+ return {
67
+ enabled: userConfig.enabled ?? defaultConfig.enabled,
68
+ debug: userConfig.debug ?? defaultConfig.debug,
69
+ protectedTools: userConfig.protectedTools ?? defaultConfig.protectedTools
70
+ };
71
+ }
72
+ catch (error) {
73
+ // Log errors to file (always enabled for config errors)
74
+ const logger = new Logger(true);
75
+ logger.error('config', `Failed to read config from ${configPath}: ${error.message}`);
76
+ logger.error('config', 'Using default configuration');
77
+ return defaultConfig;
78
+ }
12
79
  }
13
80
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../lib/config.ts"],"names":[],"mappings":"AAMA,MAAM,aAAa,GAAiB;IAChC,KAAK,EAAE,KAAK,EAAE,4DAA4D;IAC1E,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC,oCAAoC;CAChE,CAAA;AAED,MAAM,UAAU,SAAS;IACrB,iCAAiC;IACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAA;IAE/C,OAAO;QACH,KAAK,EAAE,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,GAAG,IAAI,aAAa,CAAC,KAAK;QACrE,cAAc,EAAE,aAAa,CAAC,cAAc;KAC/C,CAAA;AACL,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../lib/config.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAChB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AAC5B,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAQjC,MAAM,aAAa,GAAiB;IAChC,OAAO,EAAE,IAAI,EAAE,+BAA+B;IAC9C,KAAK,EAAE,KAAK,EAAE,mCAAmC;IACjD,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC,oCAAoC;CAChE,CAAA;AAED,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAA;AACzD,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA;AACvD,MAAM,gBAAgB,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;AAErD;;GAEG;AACH,SAAS,aAAa;IAClB,IAAI,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAChC,OAAO,iBAAiB,CAAA;IAC5B,CAAC;IACD,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC/B,OAAO,gBAAgB,CAAA;IAC3B,CAAC;IACD,8DAA8D;IAC9D,OAAO,iBAAiB,CAAA;AAC5B,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB;IACxB,8BAA8B;IAC9B,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1B,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC9C,CAAC;IAED,MAAM,aAAa,GAAG;;;;;;;;;;;CAWzB,CAAA;IAEG,aAAa,CAAC,iBAAiB,EAAE,aAAa,EAAE,OAAO,CAAC,CAAA;AAC5D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS;IACrB,MAAM,UAAU,GAAG,aAAa,EAAE,CAAA;IAElC,+CAA+C;IAC/C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1B,mBAAmB,EAAE,CAAA;IACzB,CAAC;IAED,IAAI,CAAC;QACD,MAAM,WAAW,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;QACrD,mDAAmD;QACnD,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,CAA0B,CAAA;QAE9D,iEAAiE;QACjE,OAAO;YACH,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI,aAAa,CAAC,OAAO;YACpD,KAAK,EAAE,UAAU,CAAC,KAAK,IAAI,aAAa,CAAC,KAAK;YAC9C,cAAc,EAAE,UAAU,CAAC,cAAc,IAAI,aAAa,CAAC,cAAc;SAC5E,CAAA;IACL,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QAClB,wDAAwD;QACxD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAA;QAC/B,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,8BAA8B,UAAU,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QACpF,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,6BAA6B,CAAC,CAAA;QACrD,OAAO,aAAa,CAAA;IACxB,CAAC;AACL,CAAC"}
@@ -6,7 +6,11 @@ export declare class Janitor {
6
6
  private logger;
7
7
  private toolParametersCache;
8
8
  private protectedTools;
9
- constructor(client: any, stateManager: StateManager, logger: Logger, toolParametersCache: Map<string, any>, protectedTools: string[]);
9
+ private modelCache;
10
+ constructor(client: any, stateManager: StateManager, logger: Logger, toolParametersCache: Map<string, any>, protectedTools: string[], modelCache: Map<string, {
11
+ providerID: string;
12
+ modelID: string;
13
+ }>);
10
14
  run(sessionID: string): Promise<void>;
11
15
  }
12
16
  //# sourceMappingURL=janitor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"janitor.d.ts","sourceRoot":"","sources":["../../lib/janitor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAG3C,qBAAa,OAAO;IAEZ,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,mBAAmB;IAC3B,OAAO,CAAC,cAAc;gBAJd,MAAM,EAAE,GAAG,EACX,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,MAAM,EACd,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EACrC,cAAc,EAAE,MAAM,EAAE;IAG9B,GAAG,CAAC,SAAS,EAAE,MAAM;CAsX9B"}
1
+ {"version":3,"file":"janitor.d.ts","sourceRoot":"","sources":["../../lib/janitor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAI3C,qBAAa,OAAO;IAEZ,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,mBAAmB;IAC3B,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,UAAU;gBALV,MAAM,EAAE,GAAG,EACX,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,MAAM,EACd,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EACrC,cAAc,EAAE,MAAM,EAAE,EACxB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAGtE,GAAG,CAAC,SAAS,EAAE,MAAM;CAob9B"}
@@ -1,31 +1,34 @@
1
1
  import { generateObject } from "ai";
2
- import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
3
2
  import { z } from "zod";
4
3
  import { buildAnalysisPrompt } from "./prompt";
4
+ import { selectModel, extractModelFromSession } from "./model-selector";
5
5
  export class Janitor {
6
6
  client;
7
7
  stateManager;
8
8
  logger;
9
9
  toolParametersCache;
10
10
  protectedTools;
11
- constructor(client, stateManager, logger, toolParametersCache, protectedTools) {
11
+ modelCache;
12
+ constructor(client, stateManager, logger, toolParametersCache, protectedTools, modelCache) {
12
13
  this.client = client;
13
14
  this.stateManager = stateManager;
14
15
  this.logger = logger;
15
16
  this.toolParametersCache = toolParametersCache;
16
17
  this.protectedTools = protectedTools;
18
+ this.modelCache = modelCache;
17
19
  }
18
20
  async run(sessionID) {
19
21
  this.logger.info("janitor", "Starting analysis", { sessionID });
20
22
  try {
21
- // Fetch session history from OpenCode API
22
- this.logger.debug("janitor", "Fetching session messages", { sessionID });
23
- const response = await this.client.session.messages({
24
- path: { id: sessionID },
25
- query: { limit: 100 }
26
- });
23
+ // Fetch session info and messages from OpenCode API
24
+ this.logger.debug("janitor", "Fetching session info and messages", { sessionID });
25
+ const [sessionInfoResponse, messagesResponse] = await Promise.all([
26
+ this.client.session.get({ path: { id: sessionID } }),
27
+ this.client.session.messages({ path: { id: sessionID }, query: { limit: 100 } })
28
+ ]);
29
+ const sessionInfo = sessionInfoResponse.data;
27
30
  // Handle the response format - it should be { data: Array<{info, parts}> } or just the array
28
- const messages = response.data || response;
31
+ const messages = messagesResponse.data || messagesResponse;
29
32
  this.logger.debug("janitor", "Retrieved messages", {
30
33
  sessionID,
31
34
  messageCount: messages.length
@@ -49,20 +52,23 @@ export class Janitor {
49
52
  if (msg.parts) {
50
53
  for (const part of msg.parts) {
51
54
  if (part.type === "tool" && part.callID) {
52
- toolCallIds.push(part.callID);
55
+ // Normalize tool call IDs to lowercase for consistent comparison
56
+ const normalizedId = part.callID.toLowerCase();
57
+ toolCallIds.push(normalizedId);
53
58
  // Try to get parameters from cache first, fall back to part.parameters
54
- const cachedData = this.toolParametersCache.get(part.callID);
59
+ // Cache might have either case, so check both
60
+ const cachedData = this.toolParametersCache.get(part.callID) || this.toolParametersCache.get(normalizedId);
55
61
  const parameters = cachedData?.parameters || part.parameters;
56
62
  // Track tool metadata (name and parameters)
57
- toolMetadata.set(part.callID, {
63
+ toolMetadata.set(normalizedId, {
58
64
  tool: part.tool,
59
65
  parameters: parameters
60
66
  });
61
67
  // Debug: log what we're storing
62
- if (part.callID.startsWith('prt_') || part.tool === "read" || part.tool === "list") {
68
+ if (normalizedId.startsWith('prt_') || part.tool === "read" || part.tool === "list") {
63
69
  this.logger.debug("janitor", "Storing tool metadata", {
64
70
  sessionID,
65
- callID: part.callID,
71
+ callID: normalizedId,
66
72
  tool: part.tool,
67
73
  hasParameters: !!parameters,
68
74
  hasCached: !!cachedData,
@@ -71,11 +77,11 @@ export class Janitor {
71
77
  }
72
78
  // Track the output content for size calculation
73
79
  if (part.state?.status === "completed" && part.state.output) {
74
- toolOutputs.set(part.callID, part.state.output);
80
+ toolOutputs.set(normalizedId, part.state.output);
75
81
  }
76
82
  // Check if this is a batch tool by looking at the tool name
77
83
  if (part.tool === "batch") {
78
- const batchId = part.callID;
84
+ const batchId = normalizedId;
79
85
  currentBatchId = batchId;
80
86
  batchToolChildren.set(batchId, []);
81
87
  this.logger.debug("janitor", "Found batch tool", {
@@ -84,18 +90,18 @@ export class Janitor {
84
90
  });
85
91
  }
86
92
  // If we're inside a batch and this is a prt_ (parallel) tool call, it's a child
87
- else if (currentBatchId && part.callID.startsWith('prt_')) {
93
+ else if (currentBatchId && normalizedId.startsWith('prt_')) {
88
94
  const children = batchToolChildren.get(currentBatchId);
89
- children.push(part.callID);
95
+ children.push(normalizedId);
90
96
  this.logger.debug("janitor", "Added child to batch tool", {
91
97
  sessionID,
92
98
  batchID: currentBatchId,
93
- childID: part.callID,
99
+ childID: normalizedId,
94
100
  totalChildren: children.length
95
101
  });
96
102
  }
97
103
  // If we hit a non-batch, non-prt_ tool, we're out of the batch
98
- else if (currentBatchId && !part.callID.startsWith('prt_')) {
104
+ else if (currentBatchId && !normalizedId.startsWith('prt_')) {
99
105
  this.logger.debug("janitor", "Batch tool ended", {
100
106
  sessionID,
101
107
  batchID: currentBatchId,
@@ -127,6 +133,7 @@ export class Janitor {
127
133
  toolCallCount: toolCallIds.length,
128
134
  toolCallIds,
129
135
  alreadyPrunedCount: alreadyPrunedIds.length,
136
+ alreadyPrunedIds: alreadyPrunedIds.slice(0, 5), // Show first 5 for brevity
130
137
  unprunedCount: unprunedToolCallIds.length
131
138
  });
132
139
  // Filter out protected tools from being considered for pruning
@@ -157,18 +164,55 @@ export class Janitor {
157
164
  });
158
165
  return;
159
166
  }
160
- // Use big-pickle model - no auth needed!
161
- // Use big-pickle model (public and free, no auth needed)
162
- const openai = createOpenAICompatible({
163
- baseURL: "https://opencode.ai/zen/v1",
164
- name: "opencode",
167
+ // Select appropriate model with intelligent fallback
168
+ // Try to get model from cache first, otherwise extractModelFromSession won't find it
169
+ const cachedModelInfo = this.modelCache.get(sessionID);
170
+ const sessionModelInfo = extractModelFromSession(sessionInfo, this.logger);
171
+ let currentModelInfo = cachedModelInfo || sessionModelInfo;
172
+ // Skip GitHub Copilot for background analysis - it has expensive usage
173
+ if (currentModelInfo && currentModelInfo.providerID === 'github-copilot') {
174
+ this.logger.info("janitor", "Skipping GitHub Copilot for analysis (expensive), forcing fallback", {
175
+ sessionID,
176
+ originalProvider: currentModelInfo.providerID,
177
+ originalModel: currentModelInfo.modelID
178
+ });
179
+ currentModelInfo = undefined; // Force fallback to cheaper model
180
+ }
181
+ else if (cachedModelInfo) {
182
+ this.logger.debug("janitor", "Using cached model info", {
183
+ sessionID,
184
+ providerID: cachedModelInfo.providerID,
185
+ modelID: cachedModelInfo.modelID
186
+ });
187
+ }
188
+ const modelSelection = await selectModel(currentModelInfo, this.logger);
189
+ this.logger.info("janitor", "Model selected for analysis", {
190
+ sessionID,
191
+ modelInfo: modelSelection.modelInfo,
192
+ tier: modelSelection.tier,
193
+ reason: modelSelection.reason
194
+ });
195
+ // Log comprehensive stats before AI call
196
+ this.logger.info("janitor", "Preparing AI analysis", {
197
+ sessionID,
198
+ totalToolCallsInSession: toolCallIds.length,
199
+ alreadyPrunedCount: alreadyPrunedIds.length,
200
+ protectedToolsCount: protectedToolCallIds.length,
201
+ candidatesForPruning: prunableToolCallIds.length,
202
+ candidateTools: prunableToolCallIds.map(id => {
203
+ const meta = toolMetadata.get(id);
204
+ return meta ? `${meta.tool}[${id.substring(0, 12)}...]` : id.substring(0, 12) + '...';
205
+ }).slice(0, 10), // Show first 10 for brevity
206
+ batchToolCount: batchToolChildren.size,
207
+ batchDetails: Array.from(batchToolChildren.entries()).map(([batchId, children]) => ({
208
+ batchId: batchId.substring(0, 20) + '...',
209
+ childCount: children.length
210
+ }))
165
211
  });
166
- const model = openai("big-pickle");
167
212
  this.logger.debug("janitor", "Starting shadow inference", { sessionID });
168
213
  // Analyze which tool calls are obsolete
169
214
  const result = await generateObject({
170
- model,
171
- mode: "json", // Use JSON mode instead of native structured outputs
215
+ model: modelSelection.model,
172
216
  schema: z.object({
173
217
  pruned_tool_call_ids: z.array(z.string()),
174
218
  reasoning: z.string(),
@@ -176,21 +220,26 @@ export class Janitor {
176
220
  prompt: buildAnalysisPrompt(prunableToolCallIds, messages, this.protectedTools)
177
221
  });
178
222
  // Expand batch tool IDs to include their children
223
+ // Note: IDs are already normalized to lowercase when collected from messages
179
224
  const expandedPrunedIds = new Set();
180
225
  for (const prunedId of result.object.pruned_tool_call_ids) {
181
- expandedPrunedIds.add(prunedId);
226
+ const normalizedId = prunedId.toLowerCase();
227
+ expandedPrunedIds.add(normalizedId);
182
228
  // If this is a batch tool, add all its children
183
- const children = batchToolChildren.get(prunedId);
229
+ const children = batchToolChildren.get(normalizedId);
184
230
  if (children) {
185
231
  this.logger.debug("janitor", "Expanding batch tool to include children", {
186
232
  sessionID,
187
- batchID: prunedId,
233
+ batchID: normalizedId,
188
234
  childCount: children.length,
189
235
  childIDs: children
190
236
  });
191
237
  children.forEach(childId => expandedPrunedIds.add(childId));
192
238
  }
193
239
  }
240
+ // Calculate which IDs are actually NEW (not already pruned)
241
+ const newlyPrunedIds = Array.from(expandedPrunedIds).filter(id => !alreadyPrunedIds.includes(id));
242
+ // finalPrunedIds includes everything (new + already pruned) for logging
194
243
  const finalPrunedIds = Array.from(expandedPrunedIds);
195
244
  this.logger.info("janitor", "Analysis complete", {
196
245
  sessionID,
@@ -199,9 +248,18 @@ export class Janitor {
199
248
  prunedIds: finalPrunedIds,
200
249
  reasoning: result.object.reasoning
201
250
  });
202
- // Calculate approximate size saved from newly pruned tool outputs (using expanded IDs)
251
+ this.logger.debug("janitor", "Pruning ID details", {
252
+ sessionID,
253
+ alreadyPrunedCount: alreadyPrunedIds.length,
254
+ alreadyPrunedIds: alreadyPrunedIds,
255
+ finalPrunedCount: finalPrunedIds.length,
256
+ finalPrunedIds: finalPrunedIds,
257
+ newlyPrunedCount: newlyPrunedIds.length,
258
+ newlyPrunedIds: newlyPrunedIds
259
+ });
260
+ // Calculate approximate size saved from newly pruned tool outputs
203
261
  let totalCharsSaved = 0;
204
- for (const prunedId of finalPrunedIds) {
262
+ for (const prunedId of newlyPrunedIds) {
205
263
  const output = toolOutputs.get(prunedId);
206
264
  if (output) {
207
265
  totalCharsSaved += output.length;
@@ -215,10 +273,10 @@ export class Janitor {
215
273
  this.logger.debug("janitor", "Updated state manager", {
216
274
  sessionID,
217
275
  totalPrunedCount: allPrunedIds.length,
218
- newlyPrunedCount: finalPrunedIds.length
276
+ newlyPrunedCount: newlyPrunedIds.length
219
277
  });
220
- // Show toast notification if we pruned anything
221
- if (finalPrunedIds.length > 0) {
278
+ // Show toast notification if we pruned anything NEW
279
+ if (newlyPrunedIds.length > 0) {
222
280
  try {
223
281
  // Helper function to shorten paths for display
224
282
  const shortenPath = (path) => {
@@ -242,7 +300,7 @@ export class Janitor {
242
300
  };
243
301
  // Build a summary of pruned tools by grouping them
244
302
  const toolsSummary = new Map(); // tool name -> [parameters]
245
- for (const prunedId of finalPrunedIds) {
303
+ for (const prunedId of newlyPrunedIds) {
246
304
  const metadata = toolMetadata.get(prunedId);
247
305
  if (metadata) {
248
306
  const toolName = metadata.tool;
@@ -298,8 +356,8 @@ export class Janitor {
298
356
  }
299
357
  }
300
358
  // Format the message with tool details
301
- const toolText = finalPrunedIds.length === 1 ? 'tool' : 'tools';
302
- const title = `Pruned ${finalPrunedIds.length} ${toolText} from context`;
359
+ const toolText = newlyPrunedIds.length === 1 ? 'tool' : 'tools';
360
+ const title = `Pruned ${newlyPrunedIds.length} ${toolText} from context`;
303
361
  let message = `~${estimatedTokensSaved.toLocaleString()} tokens saved\n`;
304
362
  for (const [toolName, params] of toolsSummary.entries()) {
305
363
  if (params.length > 0) {
@@ -310,7 +368,7 @@ export class Janitor {
310
368
  }
311
369
  else {
312
370
  // For tools with no specific params (like batch), just show the tool name and count
313
- const count = finalPrunedIds.filter(id => {
371
+ const count = newlyPrunedIds.filter(id => {
314
372
  const m = toolMetadata.get(id);
315
373
  return m && m.tool === toolName;
316
374
  }).length;
@@ -329,7 +387,7 @@ export class Janitor {
329
387
  });
330
388
  this.logger.info("janitor", "Toast notification shown", {
331
389
  sessionID,
332
- prunedCount: finalPrunedIds.length,
390
+ prunedCount: newlyPrunedIds.length,
333
391
  estimatedTokensSaved,
334
392
  totalCharsSaved,
335
393
  toolsSummary: Array.from(toolsSummary.entries())
@@ -1 +1 @@
1
- {"version":3,"file":"janitor.js","sourceRoot":"","sources":["../../lib/janitor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"janitor.js","sourceRoot":"","sources":["../../lib/janitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Model Selection and Fallback Logic
3
+ *
4
+ * This module handles intelligent model selection for the DCP plugin's analysis tasks.
5
+ * It attempts to use the same model as the current session, with cascading fallbacks
6
+ * to faster/cheaper alternatives when needed.
7
+ */
8
+ import type { LanguageModel } from 'ai';
9
+ import type { Logger } from './logger';
10
+ export interface ModelInfo {
11
+ providerID: string;
12
+ modelID: string;
13
+ }
14
+ export interface ModelTierConfig {
15
+ tier1Models: string[];
16
+ tier2Models: string[];
17
+ }
18
+ /**
19
+ * Model tier mappings for each provider
20
+ * Tier 1: High-quality models
21
+ * Tier 2: Fast, cost-effective alternatives
22
+ */
23
+ export declare const MODEL_TIERS: Record<string, ModelTierConfig>;
24
+ export interface ModelSelectionResult {
25
+ model: LanguageModel;
26
+ modelInfo: ModelInfo;
27
+ tier: 'primary' | 'tier2-same-provider' | 'tier2-other-provider' | 'fallback';
28
+ reason?: string;
29
+ }
30
+ /**
31
+ * Main model selection function with intelligent fallback logic
32
+ *
33
+ * Selection hierarchy:
34
+ * 1. Try the current session's model
35
+ * 2. If tier 1, fall back to tier 2 from same provider
36
+ * 3. Try tier 2 models from other authenticated providers
37
+ * 4. Ultimate fallback to big-pickle (free, no auth)
38
+ *
39
+ * @param currentModel - The model being used in the current session (optional)
40
+ * @param logger - Logger instance for debug output
41
+ * @returns Selected model with metadata about the selection
42
+ */
43
+ export declare function selectModel(currentModel?: ModelInfo, logger?: Logger): Promise<ModelSelectionResult>;
44
+ /**
45
+ * Helper to extract model info from OpenCode session state
46
+ * This can be used by the plugin to get the current session's model
47
+ */
48
+ export declare function extractModelFromSession(sessionState: any, logger?: Logger): ModelInfo | undefined;
49
+ //# sourceMappingURL=model-selector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-selector.d.ts","sourceRoot":"","sources":["../../lib/model-selector.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAGxC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,WAAW,SAAS;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAkCvD,CAAC;AAiBF,MAAM,WAAW,oBAAoB;IACjC,KAAK,EAAE,aAAa,CAAC;IACrB,SAAS,EAAE,SAAS,CAAC;IACrB,IAAI,EAAE,SAAS,GAAG,qBAAqB,GAAG,sBAAsB,GAAG,UAAU,CAAC;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAiCD;;;;;;;;;;;;GAYG;AACH,wBAAsB,WAAW,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAqJ1G;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAgCjG"}
@@ -0,0 +1,281 @@
1
+ /**
2
+ * Model Selection and Fallback Logic
3
+ *
4
+ * This module handles intelligent model selection for the DCP plugin's analysis tasks.
5
+ * It attempts to use the same model as the current session, with cascading fallbacks
6
+ * to faster/cheaper alternatives when needed.
7
+ */
8
+ import { createOpenAICompatible } from '@ai-sdk/openai-compatible';
9
+ import { OpencodeAI } from '@tarquinen/opencode-auth-provider';
10
+ /**
11
+ * Model tier mappings for each provider
12
+ * Tier 1: High-quality models
13
+ * Tier 2: Fast, cost-effective alternatives
14
+ */
15
+ export const MODEL_TIERS = {
16
+ openai: {
17
+ tier1Models: ['gpt-5.1-codex', 'gpt-5.1', 'gpt-5', 'gpt-4o', 'gpt-4-turbo'],
18
+ tier2Models: ['gpt-5.1-codex-mini', 'gpt-5-mini', 'gpt-5-nano', 'gpt-4.1-mini', 'gpt-4o-mini', 'gpt-3.5-turbo']
19
+ },
20
+ anthropic: {
21
+ tier1Models: ['claude-sonnet-4.5', 'claude-sonnet-4', 'claude-opus-4.1', 'claude-3-5-sonnet-20241022', 'claude-3-opus-20240229'],
22
+ tier2Models: ['claude-haiku-4-5', 'claude-3-5-haiku-20241022', 'claude-3-haiku-20240307']
23
+ },
24
+ google: {
25
+ tier1Models: ['gemini-3-pro-preview', 'gemini-2.5-pro', 'gemini-2.0-pro', 'gemini-1.5-pro'],
26
+ tier2Models: ['gemini-2.5-flash', 'gemini-2.5-flash-lite', 'gemini-2.0-flash-lite', 'gemini-1.5-flash', 'gemini-1.5-flash-8b']
27
+ },
28
+ deepseek: {
29
+ tier1Models: ['deepseek-r1', 'deepseek-v3.1', 'deepseek-reasoner', 'deepseek-coder'],
30
+ tier2Models: ['deepseek-chat']
31
+ },
32
+ xai: {
33
+ tier1Models: ['grok-4', 'grok-code-fast-1', 'grok-3'],
34
+ tier2Models: ['grok-4-fast', 'grok-3-mini', 'grok-2-mini']
35
+ },
36
+ qwen: {
37
+ tier1Models: ['qwen3-coder-480b', 'qwen3-max', 'qwen2.5-coder-32b'],
38
+ tier2Models: ['qwen3-coder-flash', 'qwen-flash', 'qwen-turbo']
39
+ },
40
+ zhipu: {
41
+ tier1Models: ['glm-4.6', 'glm-4.5', 'glm-4'],
42
+ tier2Models: ['glm-4.5-air', 'glm-4.5-flash', 'glm-4-flash']
43
+ },
44
+ // Default fallback - no auth required
45
+ bigpickle: {
46
+ tier1Models: ['big-pickle'],
47
+ tier2Models: ['big-pickle']
48
+ }
49
+ };
50
+ /**
51
+ * Provider priority order for fallback selection
52
+ * Providers earlier in the list are preferred over later ones
53
+ */
54
+ const PROVIDER_PRIORITY = [
55
+ 'openai',
56
+ 'anthropic',
57
+ 'google',
58
+ 'deepseek',
59
+ 'xai',
60
+ 'qwen',
61
+ 'zhipu',
62
+ 'bigpickle'
63
+ ];
64
+ /**
65
+ * Gets a tier 2 (fast) model for a given provider
66
+ */
67
+ function getTier2Model(providerID) {
68
+ const config = MODEL_TIERS[providerID.toLowerCase()];
69
+ if (!config || config.tier2Models.length === 0) {
70
+ return null;
71
+ }
72
+ return config.tier2Models[0];
73
+ }
74
+ /**
75
+ * Checks if a model belongs to tier 1 (primary) for a provider
76
+ */
77
+ function isTier1Model(providerID, modelID) {
78
+ const config = MODEL_TIERS[providerID.toLowerCase()];
79
+ if (!config)
80
+ return false;
81
+ return config.tier1Models.some(m => modelID.toLowerCase().includes(m.toLowerCase()));
82
+ }
83
+ /**
84
+ * Gets the fallback big-pickle model (no auth required)
85
+ */
86
+ function getBigPickleModel() {
87
+ const bigPickle = createOpenAICompatible({
88
+ name: 'big-pickle',
89
+ baseURL: 'https://models.fly.dev/v1',
90
+ });
91
+ return bigPickle('big-pickle');
92
+ }
93
+ /**
94
+ * Main model selection function with intelligent fallback logic
95
+ *
96
+ * Selection hierarchy:
97
+ * 1. Try the current session's model
98
+ * 2. If tier 1, fall back to tier 2 from same provider
99
+ * 3. Try tier 2 models from other authenticated providers
100
+ * 4. Ultimate fallback to big-pickle (free, no auth)
101
+ *
102
+ * @param currentModel - The model being used in the current session (optional)
103
+ * @param logger - Logger instance for debug output
104
+ * @returns Selected model with metadata about the selection
105
+ */
106
+ export async function selectModel(currentModel, logger) {
107
+ logger?.info('model-selector', 'Model selection started', { currentModel });
108
+ const opencodeAI = new OpencodeAI();
109
+ // Step 1: Try to use the current session's model
110
+ if (currentModel) {
111
+ logger?.debug('model-selector', 'Step 1: Attempting to use current session model', {
112
+ providerID: currentModel.providerID,
113
+ modelID: currentModel.modelID
114
+ });
115
+ try {
116
+ const model = await opencodeAI.getLanguageModel(currentModel.providerID, currentModel.modelID);
117
+ logger?.info('model-selector', '✓ Successfully using current session model', {
118
+ providerID: currentModel.providerID,
119
+ modelID: currentModel.modelID
120
+ });
121
+ return {
122
+ model,
123
+ modelInfo: currentModel,
124
+ tier: 'primary',
125
+ reason: 'Using current session model'
126
+ };
127
+ }
128
+ catch (error) {
129
+ // Continue to fallback logic
130
+ logger?.warn('model-selector', '✗ Failed to use session model', {
131
+ providerID: currentModel.providerID,
132
+ modelID: currentModel.modelID,
133
+ error: error.message
134
+ });
135
+ }
136
+ // Step 2: If current model is tier 1, try tier 2 from same provider
137
+ const isTier1 = isTier1Model(currentModel.providerID, currentModel.modelID);
138
+ logger?.debug('model-selector', 'Checking if current model is tier 1', {
139
+ providerID: currentModel.providerID,
140
+ modelID: currentModel.modelID,
141
+ isTier1
142
+ });
143
+ if (isTier1) {
144
+ const tier2ModelID = getTier2Model(currentModel.providerID);
145
+ logger?.debug('model-selector', 'Step 2: Attempting tier 2 fallback from same provider', {
146
+ providerID: currentModel.providerID,
147
+ tier2ModelID
148
+ });
149
+ if (tier2ModelID) {
150
+ try {
151
+ const model = await opencodeAI.getLanguageModel(currentModel.providerID, tier2ModelID);
152
+ logger?.info('model-selector', '✓ Successfully using tier 2 model from same provider', {
153
+ providerID: currentModel.providerID,
154
+ modelID: tier2ModelID
155
+ });
156
+ return {
157
+ model,
158
+ modelInfo: { providerID: currentModel.providerID, modelID: tier2ModelID },
159
+ tier: 'tier2-same-provider',
160
+ reason: `Falling back to faster model from same provider: ${tier2ModelID}`
161
+ };
162
+ }
163
+ catch (error) {
164
+ logger?.warn('model-selector', '✗ Failed to use tier 2 model from same provider', {
165
+ providerID: currentModel.providerID,
166
+ modelID: tier2ModelID,
167
+ error: error.message
168
+ });
169
+ }
170
+ }
171
+ else {
172
+ logger?.debug('model-selector', 'No tier 2 model available for provider', {
173
+ providerID: currentModel.providerID
174
+ });
175
+ }
176
+ }
177
+ }
178
+ else {
179
+ logger?.debug('model-selector', 'No current session model provided, skipping steps 1-2');
180
+ }
181
+ // Step 3: Try tier 2 models from other authenticated providers
182
+ logger?.debug('model-selector', 'Step 3: Fetching available authenticated providers');
183
+ const providers = await opencodeAI.listProviders();
184
+ const availableProviderIDs = Object.keys(providers);
185
+ logger?.info('model-selector', 'Available authenticated providers', {
186
+ providerCount: availableProviderIDs.length,
187
+ providerIDs: availableProviderIDs,
188
+ providers: Object.entries(providers).map(([id, info]) => ({
189
+ id,
190
+ source: info.source,
191
+ name: info.info.name
192
+ }))
193
+ });
194
+ logger?.debug('model-selector', 'Attempting tier 2 models from other providers', {
195
+ priorityOrder: PROVIDER_PRIORITY,
196
+ currentProvider: currentModel?.providerID
197
+ });
198
+ for (const providerID of PROVIDER_PRIORITY) {
199
+ if (providerID === 'bigpickle') {
200
+ logger?.debug('model-selector', 'Skipping bigpickle (saving for final fallback)');
201
+ continue;
202
+ }
203
+ if (currentModel && providerID === currentModel.providerID) {
204
+ logger?.debug('model-selector', `Skipping ${providerID} (already tried as current provider)`);
205
+ continue;
206
+ }
207
+ if (!providers[providerID]) {
208
+ logger?.debug('model-selector', `Skipping ${providerID} (not authenticated)`);
209
+ continue;
210
+ }
211
+ const tier2ModelID = getTier2Model(providerID);
212
+ if (!tier2ModelID) {
213
+ logger?.debug('model-selector', `Skipping ${providerID} (no tier 2 model configured)`);
214
+ continue;
215
+ }
216
+ logger?.debug('model-selector', `Attempting ${providerID}/${tier2ModelID}`);
217
+ try {
218
+ const model = await opencodeAI.getLanguageModel(providerID, tier2ModelID);
219
+ logger?.info('model-selector', `✓ Successfully using tier 2 model from other provider`, {
220
+ providerID,
221
+ modelID: tier2ModelID
222
+ });
223
+ return {
224
+ model,
225
+ modelInfo: { providerID, modelID: tier2ModelID },
226
+ tier: 'tier2-other-provider',
227
+ reason: `Falling back to ${providerID}/${tier2ModelID}`
228
+ };
229
+ }
230
+ catch (error) {
231
+ logger?.warn('model-selector', `✗ Failed to use ${providerID}/${tier2ModelID}`, {
232
+ error: error.message
233
+ });
234
+ continue;
235
+ }
236
+ }
237
+ // Step 4: Ultimate fallback to big-pickle
238
+ logger?.debug('model-selector', 'Step 4: Using ultimate fallback (big-pickle)');
239
+ logger?.info('model-selector', '✓ Using big-pickle (free, no auth required)');
240
+ return {
241
+ model: getBigPickleModel(),
242
+ modelInfo: { providerID: 'bigpickle', modelID: 'big-pickle' },
243
+ tier: 'fallback',
244
+ reason: 'Using free big-pickle model (no authenticated providers available)'
245
+ };
246
+ }
247
+ /**
248
+ * Helper to extract model info from OpenCode session state
249
+ * This can be used by the plugin to get the current session's model
250
+ */
251
+ export function extractModelFromSession(sessionState, logger) {
252
+ logger?.debug('model-selector', 'Extracting model from session state');
253
+ // Try to get from ACP session state
254
+ if (sessionState?.model?.providerID && sessionState?.model?.modelID) {
255
+ logger?.info('model-selector', 'Found model in ACP session state', {
256
+ providerID: sessionState.model.providerID,
257
+ modelID: sessionState.model.modelID
258
+ });
259
+ return {
260
+ providerID: sessionState.model.providerID,
261
+ modelID: sessionState.model.modelID
262
+ };
263
+ }
264
+ // Try to get from last message
265
+ if (sessionState?.messages && Array.isArray(sessionState.messages)) {
266
+ const lastMessage = sessionState.messages[sessionState.messages.length - 1];
267
+ if (lastMessage?.model?.providerID && lastMessage?.model?.modelID) {
268
+ logger?.info('model-selector', 'Found model in last message', {
269
+ providerID: lastMessage.model.providerID,
270
+ modelID: lastMessage.model.modelID
271
+ });
272
+ return {
273
+ providerID: lastMessage.model.providerID,
274
+ modelID: lastMessage.model.modelID
275
+ };
276
+ }
277
+ }
278
+ logger?.warn('model-selector', 'Could not extract model from session state');
279
+ return undefined;
280
+ }
281
+ //# sourceMappingURL=model-selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-selector.js","sourceRoot":"","sources":["../../lib/model-selector.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "@tarquinen/opencode-dcp",
4
- "version": "0.1.12",
4
+ "version": "0.2.2",
5
5
  "type": "module",
6
6
  "description": "OpenCode plugin that optimizes token usage by pruning obsolete tool outputs from conversation context",
7
7
  "main": "./dist/index.js",
@@ -37,15 +37,17 @@
37
37
  "@opencode-ai/plugin": ">=0.13.7"
38
38
  },
39
39
  "dependencies": {
40
- "@ai-sdk/openai-compatible": "^1.0.0",
40
+ "@ai-sdk/openai-compatible": "^1.0.27",
41
41
  "@opencode-ai/sdk": "latest",
42
- "ai": "^5.0.0",
43
- "zod": "^3.23.0"
42
+ "@tarquinen/opencode-auth-provider": "^0.1.3",
43
+ "ai": "^5.0.98",
44
+ "jsonc-parser": "^3.3.1",
45
+ "zod": "^4.1.12"
44
46
  },
45
47
  "devDependencies": {
46
48
  "@opencode-ai/plugin": ">=0.13.7",
47
- "@types/node": "^22.0.0",
48
- "typescript": "^5.7.0"
49
+ "@types/node": "^24.10.1",
50
+ "typescript": "^5.9.3"
49
51
  },
50
52
  "files": [
51
53
  "dist/",