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 resolvedModel = model || await getParentSessionModel(parentSessionID);
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, parentModel);
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 (parentModel) {
34320
- promptBody.model = parentModel;
34321
- log(`Using parent model for sync agent call`, { subagent_type, ...parentModel });
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 backgroundManager = createBackgroundManager(ctx, pluginConfig.background_task);
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
- export declare function createCallOmcoAgent(ctx: PluginInput, manager: BackgroundManager): ToolDefinition;
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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-claudecode-opencode",
3
- "version": "0.6.3",
3
+ "version": "0.6.4",
4
4
  "description": "OpenCode port of oh-my-claudecode - Multi-agent orchestration plugin (omco)",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",