From d4f0369278cc498b0a4da1af24a19053d7ea4e08 Mon Sep 17 00:00:00 2001 From: David Garson Date: Wed, 28 Jan 2026 11:23:41 -0700 Subject: [PATCH] fix: restore missing CCSDK functionality after merge Add back features lost during merge conflict resolution: - Hook integration (before_agent_start, agent_end hooks) - System prompt additions via buildSystemPromptAdditionsFromParams - Model tier environment variables (ANTHROPIC_DEFAULT_*_MODEL) - Use effectivePrompt from hooks instead of raw params.prompt Co-Authored-By: Claude Opus 4.5 --- src/agents/claude-agent-sdk/sdk-runner.ts | 123 ++++++++++++++++++++-- 1 file changed, 112 insertions(+), 11 deletions(-) diff --git a/src/agents/claude-agent-sdk/sdk-runner.ts b/src/agents/claude-agent-sdk/sdk-runner.ts index 2b871c423..bad7c7f2a 100644 --- a/src/agents/claude-agent-sdk/sdk-runner.ts +++ b/src/agents/claude-agent-sdk/sdk-runner.ts @@ -28,14 +28,17 @@ import type { SdkRunnerResult, SdkUsageStats, SdkCompletedToolCall, + SdkProviderEnv, } from "./types.js"; import type { ThinkLevel } from "../../auto-reply/thinking.js"; +import type { CcSdkModelTiers } from "../../config/types.agents.js"; import { - isMessagingTool, isMessagingToolSendAction, type MessagingToolSend, } from "../pi-embedded-messaging.js"; import { extractMessagingToolSend } from "../pi-embedded-subscribe.tools.js"; +import { buildSystemPromptAdditionsFromParams } from "./system-prompt.js"; +import { getGlobalHookRunner } from "../../plugins/hook-runner-global.js"; // Session transcript recording is done in sdk-agent-runtime.ts, which receives // completedToolCalls from the result and passes them to appendSdkToolCallsToSessionTranscript. @@ -141,6 +144,32 @@ const DEFAULT_MAX_EXTRACTED_CHARS = 120_000; const DEFAULT_MCP_SERVER_NAME = "moltbot"; const DEFAULT_MAX_TURNS = 50; +// --------------------------------------------------------------------------- +// Model tier environment helpers +// --------------------------------------------------------------------------- + +/** + * Build environment variables for model tier configuration. + * + * The Claude Code SDK uses these environment variables to select models + * for different task complexity tiers. + */ +function buildModelTierEnv(modelTiers?: CcSdkModelTiers): SdkProviderEnv { + const env: SdkProviderEnv = {}; + + if (modelTiers?.haiku) { + env.ANTHROPIC_DEFAULT_HAIKU_MODEL = modelTiers.haiku; + } + if (modelTiers?.sonnet) { + env.ANTHROPIC_DEFAULT_SONNET_MODEL = modelTiers.sonnet; + } + if (modelTiers?.opus) { + env.ANTHROPIC_DEFAULT_OPUS_MODEL = modelTiers.opus; + } + + return env; +} + // --------------------------------------------------------------------------- // Event classification helpers // --------------------------------------------------------------------------- @@ -314,6 +343,32 @@ export async function runSdkAgent(params: SdkRunnerParams): Promise>>>>>> Stashed changes const baseSystemPrompt = params.systemPrompt ?? params.extraSystemPrompt; - if (baseSystemPrompt || historySuffix) { - sdkOptions.systemPrompt = (baseSystemPrompt ?? "") + historySuffix; + const combinedSystemPrompt = [systemPromptAdditions, baseSystemPrompt, historySuffix] + .filter(Boolean) + .join("\n\n"); + if (combinedSystemPrompt) { + sdkOptions.systemPrompt = combinedSystemPrompt; } - // Provider env overrides (z.AI, custom endpoints, etc.). + // Provider env overrides (z.AI, custom endpoints, etc.) and model tier config. + const envOverrides: Record = {}; + + // Add provider env vars. if (params.providerConfig?.env) { - const env: Record = {}; for (const [key, value] of Object.entries(params.providerConfig.env)) { - if (value !== undefined) env[key] = value; - } - if (Object.keys(env).length > 0) { - sdkOptions.env = env; + if (value !== undefined) envOverrides[key] = value; } } + // Add model tier env vars. + const modelTierEnv = buildModelTierEnv(params.modelTiers); + for (const [key, value] of Object.entries(modelTierEnv)) { + if (value !== undefined) envOverrides[key] = value; + } + + if (Object.keys(envOverrides).length > 0) { + sdkOptions.env = envOverrides; + } + // Model override from provider config. if (params.providerConfig?.model) { sdkOptions.model = params.providerConfig.model; @@ -510,8 +591,8 @@ export async function runSdkAgent(params: SdkRunnerParams): Promise { + log.warn(`agent_end hook failed: ${err}`); + }); + } + return { payloads: [{ text: finalText }], meta: {