Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,6 @@ Thumbs.db
*.swp
*.swo
*~

# OpenCode
.opencode/
3 changes: 3 additions & 0 deletions .npmignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,6 @@ lib/
# Git
.git/
.gitignore

# OpenCode
.opencode/
2 changes: 1 addition & 1 deletion lib/janitor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,7 @@ export class Janitor {
})
}

const modelSelection = await selectModel(currentModelInfo, this.logger, this.configModel)
const modelSelection = await selectModel(currentModelInfo, this.logger, this.configModel, this.workingDirectory)

this.logger.info("janitor", "Model selected for analysis", {
sessionID,
Expand Down
12 changes: 7 additions & 5 deletions lib/model-selector.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,13 +69,13 @@ function shouldSkipProvider(providerID: string): boolean {
* Attempts to import OpencodeAI with retry logic to handle plugin initialization timing issues.
* Some providers (like openai via @openhax/codex) may not be fully initialized on first attempt.
*/
async function importOpencodeAI(logger?: Logger, maxRetries: number = 3, delayMs: number = 100): Promise<any> {
async function importOpencodeAI(logger?: Logger, maxRetries: number = 3, delayMs: number = 100, workspaceDir?: string): Promise<any> {
let lastError: Error | undefined;

for (let attempt = 1; attempt <= maxRetries; attempt++) {
try {
const { OpencodeAI } = await import('@tarquinen/opencode-auth-provider');
return new OpencodeAI();
return new OpencodeAI({ workspaceDir });
} catch (error: any) {
lastError = error;

Expand Down Expand Up @@ -117,13 +117,15 @@ async function importOpencodeAI(logger?: Logger, maxRetries: number = 3, delayMs
export async function selectModel(
currentModel?: ModelInfo,
logger?: Logger,
configModel?: string
configModel?: string,
workspaceDir?: string
): Promise<ModelSelectionResult> {
logger?.info('model-selector', 'Model selection started', { currentModel, configModel });
logger?.info('model-selector', 'Model selection started', { currentModel, configModel, workspaceDir });

// Lazy import with retry logic - handles plugin initialization timing issues
// Some providers (like openai via @openhax/codex) may not be ready on first attempt
const opencodeAI = await importOpencodeAI(logger);
// Pass workspaceDir so OpencodeAI can find project-level config and plugins
const opencodeAI = await importOpencodeAI(logger, 3, 100, workspaceDir);

let failedModelInfo: ModelInfo | undefined;

Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@tarquinen/opencode-dcp",
"version": "0.3.6",
"version": "0.3.7",
"type": "module",
"description": "OpenCode plugin that optimizes token usage by pruning obsolete tool outputs from conversation context",
"main": "./dist/index.js",
Expand Down