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 <noreply@anthropic.com>
This commit is contained in:
parent
60298911f5
commit
d4f0369278
@ -28,14 +28,17 @@ import type {
|
|||||||
SdkRunnerResult,
|
SdkRunnerResult,
|
||||||
SdkUsageStats,
|
SdkUsageStats,
|
||||||
SdkCompletedToolCall,
|
SdkCompletedToolCall,
|
||||||
|
SdkProviderEnv,
|
||||||
} from "./types.js";
|
} from "./types.js";
|
||||||
import type { ThinkLevel } from "../../auto-reply/thinking.js";
|
import type { ThinkLevel } from "../../auto-reply/thinking.js";
|
||||||
|
import type { CcSdkModelTiers } from "../../config/types.agents.js";
|
||||||
import {
|
import {
|
||||||
isMessagingTool,
|
|
||||||
isMessagingToolSendAction,
|
isMessagingToolSendAction,
|
||||||
type MessagingToolSend,
|
type MessagingToolSend,
|
||||||
} from "../pi-embedded-messaging.js";
|
} from "../pi-embedded-messaging.js";
|
||||||
import { extractMessagingToolSend } from "../pi-embedded-subscribe.tools.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
|
// Session transcript recording is done in sdk-agent-runtime.ts, which receives
|
||||||
// completedToolCalls from the result and passes them to appendSdkToolCallsToSessionTranscript.
|
// 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_MCP_SERVER_NAME = "moltbot";
|
||||||
const DEFAULT_MAX_TURNS = 50;
|
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
|
// Event classification helpers
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
@ -314,6 +343,32 @@ export async function runSdkAgent(params: SdkRunnerParams): Promise<SdkRunnerRes
|
|||||||
emitEvent("lifecycle", { phase: "start", startedAt, runtime: "sdk" });
|
emitEvent("lifecycle", { phase: "start", startedAt, runtime: "sdk" });
|
||||||
emitEvent("sdk", { type: "sdk_runner_start", runId: params.runId });
|
emitEvent("sdk", { type: "sdk_runner_start", runId: params.runId });
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
// Step 0: Run before_agent_start hooks
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
const hookRunner = getGlobalHookRunner();
|
||||||
|
let effectivePrompt = params.prompt;
|
||||||
|
|
||||||
|
if (hookRunner?.hasHooks("before_agent_start")) {
|
||||||
|
try {
|
||||||
|
const hookResult = await hookRunner.runBeforeAgentStart(
|
||||||
|
{ prompt: params.prompt, messages: [] },
|
||||||
|
{
|
||||||
|
agentId: params.agentId ?? params.sessionKey?.split(":")[0] ?? "main",
|
||||||
|
sessionKey: params.sessionKey,
|
||||||
|
workspaceDir: params.workspaceDir,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
if (hookResult?.prependContext) {
|
||||||
|
effectivePrompt = `${hookResult.prependContext}\n\n${params.prompt}`;
|
||||||
|
log.debug(`hooks: prepended context to prompt (${hookResult.prependContext.length} chars)`);
|
||||||
|
}
|
||||||
|
} catch (hookErr) {
|
||||||
|
log.warn(`before_agent_start hook failed: ${String(hookErr)}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
// Step 1: Load the Claude Agent SDK
|
// Step 1: Load the Claude Agent SDK
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
@ -452,6 +507,7 @@ export async function runSdkAgent(params: SdkRunnerParams): Promise<SdkRunnerRes
|
|||||||
sdkOptions.permissionMode = params.permissionMode;
|
sdkOptions.permissionMode = params.permissionMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
<<<<<<< Updated upstream
|
||||||
// Native session resume (preferred) or history injection fallback.
|
// Native session resume (preferred) or history injection fallback.
|
||||||
// When claudeSessionId is provided, use the SDK's native resume feature
|
// When claudeSessionId is provided, use the SDK's native resume feature
|
||||||
// instead of injecting history into the system prompt.
|
// instead of injecting history into the system prompt.
|
||||||
@ -468,22 +524,47 @@ export async function runSdkAgent(params: SdkRunnerParams): Promise<SdkRunnerRes
|
|||||||
const historySuffix = useNativeSessionResume
|
const historySuffix = useNativeSessionResume
|
||||||
? "" // Skip history injection when using native resume
|
? "" // Skip history injection when using native resume
|
||||||
: buildHistorySystemPromptSuffix(params.conversationHistory);
|
: buildHistorySystemPromptSuffix(params.conversationHistory);
|
||||||
|
=======
|
||||||
|
// System prompt (with Moltbot-specific additions and conversation history suffix).
|
||||||
|
const systemPromptAdditions = buildSystemPromptAdditionsFromParams({
|
||||||
|
agentId: params.agentId,
|
||||||
|
sessionKey: params.sessionKey,
|
||||||
|
workspaceDir: params.workspaceDir,
|
||||||
|
timezone: params.timezone,
|
||||||
|
messageChannel: params.messageChannel,
|
||||||
|
channelHints: params.channelHints,
|
||||||
|
skills: params.skills,
|
||||||
|
});
|
||||||
|
const historySuffix = buildHistorySystemPromptSuffix(params.conversationHistory);
|
||||||
|
>>>>>>> Stashed changes
|
||||||
const baseSystemPrompt = params.systemPrompt ?? params.extraSystemPrompt;
|
const baseSystemPrompt = params.systemPrompt ?? params.extraSystemPrompt;
|
||||||
if (baseSystemPrompt || historySuffix) {
|
const combinedSystemPrompt = [systemPromptAdditions, baseSystemPrompt, historySuffix]
|
||||||
sdkOptions.systemPrompt = (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<string, string> = {};
|
||||||
|
|
||||||
|
// Add provider env vars.
|
||||||
if (params.providerConfig?.env) {
|
if (params.providerConfig?.env) {
|
||||||
const env: Record<string, string> = {};
|
|
||||||
for (const [key, value] of Object.entries(params.providerConfig.env)) {
|
for (const [key, value] of Object.entries(params.providerConfig.env)) {
|
||||||
if (value !== undefined) env[key] = value;
|
if (value !== undefined) envOverrides[key] = value;
|
||||||
}
|
|
||||||
if (Object.keys(env).length > 0) {
|
|
||||||
sdkOptions.env = env;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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.
|
// Model override from provider config.
|
||||||
if (params.providerConfig?.model) {
|
if (params.providerConfig?.model) {
|
||||||
sdkOptions.model = params.providerConfig.model;
|
sdkOptions.model = params.providerConfig.model;
|
||||||
@ -510,8 +591,8 @@ export async function runSdkAgent(params: SdkRunnerParams): Promise<SdkRunnerRes
|
|||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
|
|
||||||
const prompt = buildSdkPrompt({
|
const prompt = buildSdkPrompt({
|
||||||
prompt: params.prompt,
|
prompt: effectivePrompt,
|
||||||
systemPrompt: baseSystemPrompt,
|
systemPrompt: combinedSystemPrompt,
|
||||||
});
|
});
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
@ -930,6 +1011,26 @@ export async function runSdkAgent(params: SdkRunnerParams): Promise<SdkRunnerRes
|
|||||||
truncated,
|
truncated,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Run agent_end hooks (fire-and-forget).
|
||||||
|
if (hookRunner?.hasHooks("agent_end")) {
|
||||||
|
hookRunner
|
||||||
|
.runAgentEnd(
|
||||||
|
{
|
||||||
|
messages: [],
|
||||||
|
success: !aborted,
|
||||||
|
durationMs: Date.now() - startedAt,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
agentId: params.agentId ?? params.sessionKey?.split(":")[0] ?? "main",
|
||||||
|
sessionKey: params.sessionKey,
|
||||||
|
workspaceDir: params.workspaceDir,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.catch((err) => {
|
||||||
|
log.warn(`agent_end hook failed: ${err}`);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
payloads: [{ text: finalText }],
|
payloads: [{ text: finalText }],
|
||||||
meta: {
|
meta: {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user