@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 +30 -22
- package/dist/index.d.ts +3 -23
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +92 -19
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +6 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +74 -7
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/janitor.d.ts +5 -1
- package/dist/lib/janitor.d.ts.map +1 -1
- package/dist/lib/janitor.js +99 -41
- package/dist/lib/janitor.js.map +1 -1
- package/dist/lib/model-selector.d.ts +49 -0
- package/dist/lib/model-selector.d.ts.map +1 -0
- package/dist/lib/model-selector.js +281 -0
- package/dist/lib/model-selector.js.map +1 -0
- package/package.json +8 -6
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
|
-
##
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";
|
|
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
|
-
|
|
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
|
|
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
|
-
//
|
|
48
|
-
//
|
|
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 (
|
|
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
|
-
//
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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
|
-
|
|
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":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AAE5B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/config.d.ts
CHANGED
|
@@ -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
|
package/dist/lib/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../lib/config.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/lib/config.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
package/dist/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../lib/config.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/lib/janitor.d.ts
CHANGED
|
@@ -6,7 +6,11 @@ export declare class Janitor {
|
|
|
6
6
|
private logger;
|
|
7
7
|
private toolParametersCache;
|
|
8
8
|
private protectedTools;
|
|
9
|
-
|
|
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":"
|
|
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"}
|
package/dist/lib/janitor.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
22
|
-
this.logger.debug("janitor", "Fetching session messages", { sessionID });
|
|
23
|
-
const
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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 (
|
|
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:
|
|
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(
|
|
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 =
|
|
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 &&
|
|
93
|
+
else if (currentBatchId && normalizedId.startsWith('prt_')) {
|
|
88
94
|
const children = batchToolChildren.get(currentBatchId);
|
|
89
|
-
children.push(
|
|
95
|
+
children.push(normalizedId);
|
|
90
96
|
this.logger.debug("janitor", "Added child to batch tool", {
|
|
91
97
|
sessionID,
|
|
92
98
|
batchID: currentBatchId,
|
|
93
|
-
childID:
|
|
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 && !
|
|
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
|
-
//
|
|
161
|
-
//
|
|
162
|
-
const
|
|
163
|
-
|
|
164
|
-
|
|
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
|
-
|
|
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(
|
|
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:
|
|
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
|
-
|
|
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
|
|
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:
|
|
276
|
+
newlyPrunedCount: newlyPrunedIds.length
|
|
219
277
|
});
|
|
220
|
-
// Show toast notification if we pruned anything
|
|
221
|
-
if (
|
|
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
|
|
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 =
|
|
302
|
-
const title = `Pruned ${
|
|
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 =
|
|
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:
|
|
390
|
+
prunedCount: newlyPrunedIds.length,
|
|
333
391
|
estimatedTokensSaved,
|
|
334
392
|
totalCharsSaved,
|
|
335
393
|
toolsSummary: Array.from(toolsSummary.entries())
|
package/dist/lib/janitor.js.map
CHANGED
|
@@ -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.
|
|
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.
|
|
40
|
+
"@ai-sdk/openai-compatible": "^1.0.27",
|
|
41
41
|
"@opencode-ai/sdk": "latest",
|
|
42
|
-
"
|
|
43
|
-
"
|
|
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": "^
|
|
48
|
-
"typescript": "^5.
|
|
49
|
+
"@types/node": "^24.10.1",
|
|
50
|
+
"typescript": "^5.9.3"
|
|
49
51
|
},
|
|
50
52
|
"files": [
|
|
51
53
|
"dist/",
|