oh-my-claudecode-opencode 0.6.3 → 0.6.4
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/dist/index.js
CHANGED
|
@@ -21669,7 +21669,7 @@ function generateTaskId() {
|
|
|
21669
21669
|
taskCounter++;
|
|
21670
21670
|
return `bg_${Date.now().toString(36)}_${taskCounter.toString(36)}`;
|
|
21671
21671
|
}
|
|
21672
|
-
function createBackgroundManager(ctx, config2) {
|
|
21672
|
+
function createBackgroundManager(ctx, config2, modelService) {
|
|
21673
21673
|
const tasks = new Map;
|
|
21674
21674
|
const defaultConcurrency = config2?.defaultConcurrency ?? 5;
|
|
21675
21675
|
const modelCache = new Map;
|
|
@@ -21726,7 +21726,14 @@ function createBackgroundManager(ctx, config2) {
|
|
|
21726
21726
|
};
|
|
21727
21727
|
tasks.set(taskId, task);
|
|
21728
21728
|
log(`Background task created`, { taskId, description, agent });
|
|
21729
|
-
const
|
|
21729
|
+
const parentModel = model || await getParentSessionModel(parentSessionID);
|
|
21730
|
+
const resolvedModel = modelService ? modelService.resolveModelForAgent(agent, parentModel) : parentModel;
|
|
21731
|
+
if (resolvedModel && resolvedModel !== parentModel) {
|
|
21732
|
+
log(`[background-manager] Using tier-mapped model for ${agent}`, {
|
|
21733
|
+
providerID: resolvedModel.providerID,
|
|
21734
|
+
modelID: resolvedModel.modelID
|
|
21735
|
+
});
|
|
21736
|
+
}
|
|
21730
21737
|
(async () => {
|
|
21731
21738
|
try {
|
|
21732
21739
|
const sessionResp = await ctx.client.session.create({
|
|
@@ -34256,7 +34263,7 @@ Use \`background_output\` to get results. Prompts MUST be in English.`,
|
|
|
34256
34263
|
}
|
|
34257
34264
|
|
|
34258
34265
|
// src/tools/call-omco-agent.ts
|
|
34259
|
-
function createCallOmcoAgent(ctx, manager) {
|
|
34266
|
+
function createCallOmcoAgent(ctx, manager, modelService) {
|
|
34260
34267
|
const agentNames = listAgentNames();
|
|
34261
34268
|
const agentList = agentNames.map((name) => {
|
|
34262
34269
|
const agent = getAgent(name);
|
|
@@ -34293,8 +34300,15 @@ Prompts MUST be in English. Use \`background_output\` for async results.`,
|
|
|
34293
34300
|
|
|
34294
34301
|
${prompt}`;
|
|
34295
34302
|
const parentModel = await manager.getParentSessionModel(context.sessionID);
|
|
34303
|
+
const resolvedModel = modelService ? modelService.resolveModelForAgent(subagent_type, parentModel) : parentModel;
|
|
34304
|
+
if (resolvedModel && resolvedModel !== parentModel) {
|
|
34305
|
+
log(`[call-omco-agent] Using tier-mapped model for ${subagent_type}`, {
|
|
34306
|
+
providerID: resolvedModel.providerID,
|
|
34307
|
+
modelID: resolvedModel.modelID
|
|
34308
|
+
});
|
|
34309
|
+
}
|
|
34296
34310
|
if (run_in_background) {
|
|
34297
|
-
const task = await manager.createTask(context.sessionID, description, enhancedPrompt, subagent_type,
|
|
34311
|
+
const task = await manager.createTask(context.sessionID, description, enhancedPrompt, subagent_type, resolvedModel);
|
|
34298
34312
|
return JSON.stringify({
|
|
34299
34313
|
task_id: task.id,
|
|
34300
34314
|
session_id: task.sessionID,
|
|
@@ -34316,9 +34330,9 @@ ${prompt}`;
|
|
|
34316
34330
|
const promptBody = {
|
|
34317
34331
|
parts: [{ type: "text", text: enhancedPrompt }]
|
|
34318
34332
|
};
|
|
34319
|
-
if (
|
|
34320
|
-
promptBody.model =
|
|
34321
|
-
log(`Using
|
|
34333
|
+
if (resolvedModel) {
|
|
34334
|
+
promptBody.model = resolvedModel;
|
|
34335
|
+
log(`Using resolved model for sync agent call`, { subagent_type, ...resolvedModel });
|
|
34322
34336
|
}
|
|
34323
34337
|
const promptResp = await ctx.client.session.prompt({
|
|
34324
34338
|
path: { id: sessionID },
|
|
@@ -34438,6 +34452,51 @@ class ModelResolver {
|
|
|
34438
34452
|
}
|
|
34439
34453
|
}
|
|
34440
34454
|
|
|
34455
|
+
// src/tools/model-resolution-service.ts
|
|
34456
|
+
function parseModelString(model) {
|
|
34457
|
+
if (!model.includes("/")) {
|
|
34458
|
+
return;
|
|
34459
|
+
}
|
|
34460
|
+
const [providerID, ...rest] = model.split("/");
|
|
34461
|
+
const modelID = rest.join("/");
|
|
34462
|
+
if (!providerID || !modelID) {
|
|
34463
|
+
return;
|
|
34464
|
+
}
|
|
34465
|
+
return { providerID, modelID };
|
|
34466
|
+
}
|
|
34467
|
+
function createModelResolutionService(modelMappingConfig, agentOverrides) {
|
|
34468
|
+
const resolver = new ModelResolver(modelMappingConfig);
|
|
34469
|
+
const debugLogging = modelMappingConfig?.debugLogging ?? false;
|
|
34470
|
+
const tierDefaults = resolver.getTierDefaults();
|
|
34471
|
+
const hasConfiguredTiers = Object.values(tierDefaults).some((m) => m.includes("/"));
|
|
34472
|
+
const resolveModelForAgent = (agentName, fallbackModel) => {
|
|
34473
|
+
const agentDef = getAgent(agentName);
|
|
34474
|
+
const agentTier = agentDef?.model;
|
|
34475
|
+
const agentOverride = agentOverrides?.[agentName];
|
|
34476
|
+
const resolution = resolver.resolve(agentName, agentTier, agentOverride);
|
|
34477
|
+
const modelConfig = parseModelString(resolution.model);
|
|
34478
|
+
if (modelConfig) {
|
|
34479
|
+
if (debugLogging) {
|
|
34480
|
+
log(`[model-resolution] Resolved ${agentName}: ${resolution.model} (source: ${resolution.source})`);
|
|
34481
|
+
}
|
|
34482
|
+
return modelConfig;
|
|
34483
|
+
}
|
|
34484
|
+
if (debugLogging) {
|
|
34485
|
+
log(`[model-resolution] ${agentName}: No provider mapping for "${resolution.model}", using fallback`, {
|
|
34486
|
+
fallback: fallbackModel ? `${fallbackModel.providerID}/${fallbackModel.modelID}` : "none"
|
|
34487
|
+
});
|
|
34488
|
+
}
|
|
34489
|
+
return fallbackModel;
|
|
34490
|
+
};
|
|
34491
|
+
const isTierMappingConfigured = () => {
|
|
34492
|
+
return hasConfiguredTiers;
|
|
34493
|
+
};
|
|
34494
|
+
return {
|
|
34495
|
+
resolveModelForAgent,
|
|
34496
|
+
isTierMappingConfigured
|
|
34497
|
+
};
|
|
34498
|
+
}
|
|
34499
|
+
|
|
34441
34500
|
// src/skills/index.ts
|
|
34442
34501
|
import { join as join4, dirname as dirname2 } from "path";
|
|
34443
34502
|
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
@@ -38323,9 +38382,13 @@ function resumeSession(sessionId) {
|
|
|
38323
38382
|
var OmoOmcsPlugin = async (ctx) => {
|
|
38324
38383
|
const pluginConfig = loadConfig(ctx.directory);
|
|
38325
38384
|
console.log("[omco] Config loaded:", pluginConfig);
|
|
38326
|
-
const
|
|
38385
|
+
const modelService = createModelResolutionService(pluginConfig.model_mapping, pluginConfig.agents);
|
|
38386
|
+
if (modelService.isTierMappingConfigured()) {
|
|
38387
|
+
log("[omco] Model tier mapping configured - agents will use tier-specific models");
|
|
38388
|
+
}
|
|
38389
|
+
const backgroundManager = createBackgroundManager(ctx, pluginConfig.background_task, modelService);
|
|
38327
38390
|
const backgroundTools = createBackgroundTools(backgroundManager, ctx.client);
|
|
38328
|
-
const callOmcoAgent = createCallOmcoAgent(ctx, backgroundManager);
|
|
38391
|
+
const callOmcoAgent = createCallOmcoAgent(ctx, backgroundManager, modelService);
|
|
38329
38392
|
const systemPromptInjector = createSystemPromptInjector(ctx);
|
|
38330
38393
|
const skillInjector = createSkillInjector(ctx);
|
|
38331
38394
|
const ralphLoop = createRalphLoopHook(ctx, {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { PluginInput } from "@opencode-ai/plugin";
|
|
2
2
|
import type { BackgroundTaskConfig } from "../config";
|
|
3
|
+
import type { ModelResolutionService } from "./model-resolution-service";
|
|
3
4
|
export interface BackgroundTask {
|
|
4
5
|
id: string;
|
|
5
6
|
status: "running" | "completed" | "failed" | "cancelled";
|
|
@@ -24,4 +25,4 @@ export interface BackgroundManager {
|
|
|
24
25
|
waitForTask: (taskId: string, timeoutMs?: number) => Promise<BackgroundTask>;
|
|
25
26
|
getParentSessionModel: (parentSessionID: string) => Promise<ModelConfig | undefined>;
|
|
26
27
|
}
|
|
27
|
-
export declare function createBackgroundManager(ctx: PluginInput, config?: BackgroundTaskConfig): BackgroundManager;
|
|
28
|
+
export declare function createBackgroundManager(ctx: PluginInput, config?: BackgroundTaskConfig, modelService?: ModelResolutionService): BackgroundManager;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import { type PluginInput, type ToolDefinition } from "@opencode-ai/plugin";
|
|
2
2
|
import type { BackgroundManager } from "./background-manager";
|
|
3
|
-
|
|
3
|
+
import type { ModelResolutionService } from "./model-resolution-service";
|
|
4
|
+
export declare function createCallOmcoAgent(ctx: PluginInput, manager: BackgroundManager, modelService?: ModelResolutionService): ToolDefinition;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model Resolution Service
|
|
3
|
+
*
|
|
4
|
+
* Centralized model resolution for agent invocations.
|
|
5
|
+
* Connects ModelResolver (config-based tier mapping) to runtime tool calls.
|
|
6
|
+
*
|
|
7
|
+
* Priority chain:
|
|
8
|
+
* 1. Per-agent config model override
|
|
9
|
+
* 2. Per-agent config tier → tierDefaults
|
|
10
|
+
* 3. Agent definition tier → tierDefaults
|
|
11
|
+
* 4. Fallback to sonnet tier
|
|
12
|
+
* 5. If all else fails, use parent session model
|
|
13
|
+
*/
|
|
14
|
+
import { type AgentModelConfig, type ModelMappingConfig } from "../config/model-resolver";
|
|
15
|
+
export interface ModelConfig {
|
|
16
|
+
providerID: string;
|
|
17
|
+
modelID: string;
|
|
18
|
+
}
|
|
19
|
+
export interface ModelResolutionService {
|
|
20
|
+
/**
|
|
21
|
+
* Resolve model for an agent based on tier configuration
|
|
22
|
+
* @param agentName - Name of the agent (canonical or alias)
|
|
23
|
+
* @param fallbackModel - Parent session model to use if resolution fails
|
|
24
|
+
* @returns Resolved ModelConfig or undefined if should use fallback
|
|
25
|
+
*/
|
|
26
|
+
resolveModelForAgent(agentName: string, fallbackModel?: ModelConfig): ModelConfig | undefined;
|
|
27
|
+
/**
|
|
28
|
+
* Check if tier mapping is configured (tierDefaults has provider/model format)
|
|
29
|
+
*/
|
|
30
|
+
isTierMappingConfigured(): boolean;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create a ModelResolutionService instance
|
|
34
|
+
*
|
|
35
|
+
* @param modelMappingConfig - Config from omco.json model_mapping section
|
|
36
|
+
* @param agentOverrides - Per-agent config overrides from omco.json agents section
|
|
37
|
+
*/
|
|
38
|
+
export declare function createModelResolutionService(modelMappingConfig?: ModelMappingConfig, agentOverrides?: Record<string, AgentModelConfig>): ModelResolutionService;
|