diff --git a/packages/server/src/server/agent/agent-sdk-types.ts b/packages/server/src/server/agent/agent-sdk-types.ts index 08eec8714..afeeed9f0 100644 --- a/packages/server/src/server/agent/agent-sdk-types.ts +++ b/packages/server/src/server/agent/agent-sdk-types.ts @@ -236,6 +236,11 @@ export type PersistedAgentDescriptor = { export type AgentSessionConfig = { provider: AgentProvider; cwd: string; + /** + * Provider-agnostic system/developer instruction string. + * Mapped by each provider to its native instruction field. + */ + systemPrompt?: string; modeId?: string; model?: string; thinkingOptionId?: string; diff --git a/packages/server/src/server/agent/providers/claude-agent.ts b/packages/server/src/server/agent/providers/claude-agent.ts index 6eaf9bc0d..c259712da 100644 --- a/packages/server/src/server/agent/providers/claude-agent.ts +++ b/packages/server/src/server/agent/providers/claude-agent.ts @@ -896,6 +896,13 @@ class ClaudeAgentSession implements AgentSession { // For "on" we omit maxThinkingTokens (SDK default max). } + const appendedSystemPrompt = [ + getOrchestratorModeInstructions(), + this.config.systemPrompt?.trim(), + ] + .filter((entry): entry is string => typeof entry === "string" && entry.length > 0) + .join("\n\n"); + const base: ClaudeOptions = { cwd: this.config.cwd, includePartialMessages: true, @@ -904,11 +911,11 @@ class ClaudeAgentSession implements AgentSession { canUseTool: this.handlePermissionRequest, ...(this.claudePath ? { pathToClaudeCodeExecutable: this.claudePath } : {}), // Use Claude Code preset system prompt and load CLAUDE.md files - // Append orchestrator mode instructions for agents + // Append provider-agnostic system prompt and orchestrator instructions for agents. systemPrompt: { type: "preset", preset: "claude_code", - append: [getOrchestratorModeInstructions()].filter(Boolean).join("\n"), + append: appendedSystemPrompt, }, settingSources: ["user", "project"], stderr: (data: string) => { diff --git a/packages/server/src/server/agent/providers/codex-app-server-agent.ts b/packages/server/src/server/agent/providers/codex-app-server-agent.ts index e218c3f9b..ddf44bd5c 100644 --- a/packages/server/src/server/agent/providers/codex-app-server-agent.ts +++ b/packages/server/src/server/agent/providers/codex-app-server-agent.ts @@ -1269,7 +1269,13 @@ class CodexAppServerAgentSession implements AgentSession { const settings: Record = {}; if (match.model) settings.model = match.model; if (match.reasoning_effort) settings.reasoning_effort = match.reasoning_effort; - if (match.developer_instructions) settings.developer_instructions = match.developer_instructions; + const developerInstructions = [ + match.developer_instructions?.trim(), + this.config.systemPrompt?.trim(), + ] + .filter((entry): entry is string => typeof entry === "string" && entry.length > 0) + .join("\n\n"); + if (developerInstructions) settings.developer_instructions = developerInstructions; if (this.config.model) settings.model = this.config.model; const thinkingOptionId = this.config.thinkingOptionId; if (thinkingOptionId) settings.reasoning_effort = thinkingOptionId; @@ -1714,6 +1720,9 @@ class CodexAppServerAgentSession implements AgentSession { cwd: this.config.cwd ?? null, approvalPolicy, sandbox, + ...(this.config.systemPrompt?.trim() + ? { developerInstructions: this.config.systemPrompt.trim() } + : {}), ...(Object.keys(innerConfig).length > 0 ? { config: innerConfig } : {}), })) as CodexThreadStartResponse; const threadId = response?.thread?.id; diff --git a/packages/server/src/server/agent/providers/codex-mcp-agent.ts b/packages/server/src/server/agent/providers/codex-mcp-agent.ts index dd7fba32b..85be3bd85 100644 --- a/packages/server/src/server/agent/providers/codex-mcp-agent.ts +++ b/packages/server/src/server/agent/providers/codex-mcp-agent.ts @@ -2907,7 +2907,10 @@ function buildCodexMcpConfig( } - const combinedDeveloperInstructions = [developerInstructions] + const combinedDeveloperInstructions = [ + developerInstructions, + config.systemPrompt?.trim(), + ] .filter(Boolean) .join("\n\n"); diff --git a/packages/server/src/server/session.ts b/packages/server/src/server/session.ts index bbb984027..672534059 100644 --- a/packages/server/src/server/session.ts +++ b/packages/server/src/server/session.ts @@ -4546,6 +4546,7 @@ export class Session { const config: AgentSessionConfig = { provider, cwd, + systemPrompt: VOICE_AGENT_SYSTEM_INSTRUCTION, modeId: this.voiceLlmModeId ?? "default", ...(model ? { model } : {}), mcpServers: { @@ -4632,8 +4633,6 @@ export class Session { private buildVoiceAgentPrompt(userText: string): string { const transcription = escapeXmlText(userText.trim()); return [ - VOICE_AGENT_SYSTEM_INSTRUCTION, - "", "", transcription, "",