@salesforce/sfdx-agent-harness-claude 0.8.0 → 0.9.0

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/README.md CHANGED
@@ -3,6 +3,9 @@
3
3
  Claude Agent SDK-backed `AgentHarness` implementation for [`@salesforce/sfdx-agent-sdk`](../sfdx-agent-sdk). Provides
4
4
  `ClaudeHarnessFactory`, the entry point consumers pass to `createAgentManager`.
5
5
 
6
+ > **Closed source.** This package is published to npm under the [Salesforce Public Code License](../../LICENSE.txt) and
7
+ > is for use by Salesforce only.
8
+
6
9
  ## Install
7
10
 
8
11
  ```bash
@@ -51,8 +54,17 @@ prompt source:
51
54
 
52
55
  `'default'`, `'dontAsk'`, and `'auto'` are intentionally excluded because they require a prompt UI the harness does not
53
56
  provide. For human-in-the-loop gating, set `StreamOptions.requireToolApproval: true` per-call instead — the harness
54
- installs a `PreToolUse` SDK hook for that turn that gates every tool call through the SDK's `tool-approval-request`
55
- flow regardless of the factory-pinned permission mode.
57
+ installs a `PreToolUse` SDK hook for that turn that gates every tool call through the SDK's `tool-approval-request` flow
58
+ regardless of the factory-pinned permission mode.
59
+
60
+ ### Multimodal input
61
+
62
+ `chatSession.chat()` / harness `stream()` accept a `MessagePart[]` carrying `image` (PNG/JPEG) and `file` (PDF) parts
63
+ alongside text (see the SDK README for the part shapes). The harness lowers them to Anthropic `image` / `document`
64
+ content blocks sent over the Bedrock-native path. Files are validated pre-stream against the agent's gateway model
65
+ capabilities and caps — an unsupported format, an oversized file, or too many files rejects with
66
+ `AgentSDKError(MULTIMODAL_NOT_SUPPORTED)`; a malformed input part rejects with `INVALID_MESSAGE_CONTENT`. The caps
67
+ mirror the gateway SDK's conservative limits so a file behaves identically here and on the Mastra harness.
56
68
 
57
69
  ### Tool approval
58
70
 
@@ -24,6 +24,7 @@
24
24
  */
25
25
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
26
26
  import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
27
+ import { ALWAYS_LOAD_META_KEY } from './mcp-meta-keys.js';
27
28
  const BRIDGE_VERSION = '1.0.0';
28
29
  /**
29
30
  * Logical server name the bridge advertises. The Claude SDK derives the
@@ -40,10 +41,24 @@ export function buildConsumerToolsBridge(tools, parker) {
40
41
  if (tools.length === 0)
41
42
  return undefined;
42
43
  const instance = new McpServer({ name: CONSUMER_TOOLS_BRIDGE_SERVER_NAME, version: BRIDGE_VERSION }, { capabilities: { tools: {} } });
44
+ // Opt every consumer-declared tool out of tool-search deferral (#495).
45
+ // See ARCHITECTURE.md → "Harness-owned in-process MCP tools bypass
46
+ // Claude tool-search deferral".
47
+ //
48
+ // - **Set, not merge.** `ToolDefinition` has no `_meta` field today, so
49
+ // this assignment fully owns the slot. If `ToolDefinition` ever
50
+ // grows a consumer-supplied `_meta`, this would silently drop those
51
+ // keys and would need to switch to a merge.
52
+ // - **Unbounded.** Always-load is unconditional here; every entry in
53
+ // `AgentConfig.tools` lands in the prompt at rest. Fits the dominant
54
+ // consumer pattern (a small handful of consumer tools); a consumer
55
+ // with a very large tool catalog should reach for an external MCP
56
+ // server with `alwaysLoad: false` (the default) instead.
43
57
  const mcpTools = tools.map((t) => ({
44
58
  name: t.name,
45
59
  description: t.description ?? '',
46
60
  inputSchema: t.inputSchema,
61
+ _meta: { [ALWAYS_LOAD_META_KEY]: true },
47
62
  }));
48
63
  instance.server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: mcpTools }));
49
64
  instance.server.setRequestHandler(CallToolRequestSchema, async (request) => {
@@ -1 +1 @@
1
- {"version":3,"file":"claude-consumer-tool-bridge.js","sourceRoot":"","sources":["../src/claude-consumer-tool-bridge.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EACH,qBAAqB,EACrB,sBAAsB,GAGzB,MAAM,oCAAoC,CAAC;AAI5C,MAAM,cAAc,GAAG,OAAO,CAAC;AAE/B;;;;GAIG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAAG,+BAA+B,CAAC;AAajF;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CACpC,KAAuB,EACvB,MAA8B;IAE9B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAEzC,MAAM,QAAQ,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,iCAAiC,EAAE,OAAO,EAAE,cAAc,EAAE,EACpE,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAClC,CAAC;IAEF,MAAM,QAAQ,GAAW,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACvC,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;QAChC,WAAW,EAAE,CAAC,CAAC,WAAkC;KACpD,CAAC,CAAC,CAAC;IAEJ,QAAQ,CAAC,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IAE7F,QAAQ,CAAC,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAA2B,EAAE;QAChG,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QAC/D,MAAM,IAAI,GAAG,CAAC,QAAQ,IAAI,EAAE,CAA4B,CAAC;QAEzD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAE7D,OAAO;YACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1D,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxC,CAAC;IACN,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,iCAAiC,EAAE,QAAQ,EAAE,CAAC;AAC9E,CAAC;AAED,SAAS,eAAe,CAAC,MAAe;IACpC,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IAC9C,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"claude-consumer-tool-bridge.js","sourceRoot":"","sources":["../src/claude-consumer-tool-bridge.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EACH,qBAAqB,EACrB,sBAAsB,GAGzB,MAAM,oCAAoC,CAAC;AAG5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,MAAM,cAAc,GAAG,OAAO,CAAC;AAE/B;;;;GAIG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAAG,+BAA+B,CAAC;AAajF;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CACpC,KAAuB,EACvB,MAA8B;IAE9B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAEzC,MAAM,QAAQ,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,iCAAiC,EAAE,OAAO,EAAE,cAAc,EAAE,EACpE,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAClC,CAAC;IAEF,uEAAuE;IACvE,mEAAmE;IACnE,gCAAgC;IAChC,EAAE;IACF,wEAAwE;IACxE,kEAAkE;IAClE,sEAAsE;IACtE,8CAA8C;IAC9C,qEAAqE;IACrE,uEAAuE;IACvE,qEAAqE;IACrE,oEAAoE;IACpE,2DAA2D;IAC3D,MAAM,QAAQ,GAAW,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACvC,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;QAChC,WAAW,EAAE,CAAC,CAAC,WAAkC;QACjD,KAAK,EAAE,EAAE,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE;KAC1C,CAAC,CAAC,CAAC;IAEJ,QAAQ,CAAC,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IAE7F,QAAQ,CAAC,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAA2B,EAAE;QAChG,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QAC/D,MAAM,IAAI,GAAG,CAAC,QAAQ,IAAI,EAAE,CAA4B,CAAC;QAEzD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAE7D,OAAO;YACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1D,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxC,CAAC;IACN,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,iCAAiC,EAAE,QAAQ,EAAE,CAAC;AAC9E,CAAC;AAED,SAAS,eAAe,CAAC,MAAe;IACpC,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IAC9C,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;AACL,CAAC"}
@@ -62,12 +62,18 @@ export class ClaudeEventAdapter {
62
62
  if (block.type !== 'tool_result' || typeof block.tool_use_id !== 'string')
63
63
  continue;
64
64
  const toolName = this.toolCallNames.get(block.tool_use_id) ?? 'unknown';
65
+ const isError = block.is_error === true;
65
66
  events.push({
66
67
  type: 'tool-result',
67
68
  toolCallId: block.tool_use_id,
68
69
  toolName,
69
70
  result: block.content,
70
- isError: block.is_error,
71
+ isError,
72
+ ...(isError && block.content
73
+ ? {
74
+ error: new Error(typeof block.content === 'string' ? block.content : JSON.stringify(block.content)),
75
+ }
76
+ : {}),
71
77
  ...this.enrichmentFor(toolName),
72
78
  });
73
79
  this.consumePendingToolResult(block.tool_use_id, events);
@@ -130,12 +136,18 @@ export class ClaudeEventAdapter {
130
136
  }
131
137
  else if (block.type === 'mcp_tool_result') {
132
138
  const toolName = this.toolCallNames.get(block.tool_use_id) ?? 'unknown';
139
+ const isError = block.is_error === true;
133
140
  events.push({
134
141
  type: 'tool-result',
135
142
  toolCallId: block.tool_use_id,
136
143
  toolName,
137
144
  result: block.content,
138
- isError: block.is_error,
145
+ isError,
146
+ ...(isError && block.content
147
+ ? {
148
+ error: new Error(typeof block.content === 'string' ? block.content : JSON.stringify(block.content)),
149
+ }
150
+ : {}),
139
151
  ...this.enrichmentFor(toolName),
140
152
  });
141
153
  this.consumePendingToolResult(block.tool_use_id, events);
@@ -251,11 +263,13 @@ function buildResultUsage(usage) {
251
263
  return undefined;
252
264
  const safeInput = inputTokens ?? 0;
253
265
  const safeOutput = outputTokens ?? 0;
266
+ const cacheWriteInputTokens = usage?.cache_creation_input_tokens ? usage.cache_creation_input_tokens : undefined;
254
267
  return {
255
268
  inputTokens: safeInput,
256
269
  outputTokens: safeOutput,
257
270
  totalTokens: safeInput + safeOutput,
258
271
  ...(cachedInputTokens ? { cachedInputTokens } : {}),
272
+ ...(cacheWriteInputTokens ? { cacheWriteInputTokens } : {}),
259
273
  };
260
274
  }
261
275
  /**
@@ -269,6 +283,7 @@ function buildMessageDeltaUsage(usage) {
269
283
  const inputTokens = usage.input_tokens ?? undefined;
270
284
  const outputTokens = usage.output_tokens ?? undefined;
271
285
  const cachedInputTokens = usage.cache_read_input_tokens ?? undefined;
286
+ const cacheWriteInputTokens = usage.cache_creation_input_tokens ? usage.cache_creation_input_tokens : undefined;
272
287
  if (inputTokens === undefined && outputTokens === undefined)
273
288
  return undefined;
274
289
  const safeInput = inputTokens ?? 0;
@@ -278,6 +293,7 @@ function buildMessageDeltaUsage(usage) {
278
293
  outputTokens: safeOutput,
279
294
  totalTokens: safeInput + safeOutput,
280
295
  ...(cachedInputTokens ? { cachedInputTokens } : {}),
296
+ ...(cacheWriteInputTokens ? { cacheWriteInputTokens } : {}),
281
297
  };
282
298
  }
283
299
  /**
@@ -356,6 +372,36 @@ export function mapSessionMessageContent(message) {
356
372
  });
357
373
  }
358
374
  break;
375
+ case 'image': {
376
+ // Round-trip an Anthropic base64 image block back to an SDK ImagePart. Only
377
+ // base64 PNG/JPEG map cleanly; other shapes (URL sources, gif/webp) fall through to
378
+ // the placeholder default so we never inline a giant blob as text.
379
+ const src = block.source;
380
+ if (src?.type === 'base64' &&
381
+ typeof src.data === 'string' &&
382
+ (src.media_type === 'image/png' || src.media_type === 'image/jpeg')) {
383
+ parts.push({ type: 'image', mimeType: src.media_type, data: src.data });
384
+ }
385
+ else {
386
+ parts.push({ type: 'text', text: '[image]' });
387
+ }
388
+ break;
389
+ }
390
+ case 'document': {
391
+ const src = block.source;
392
+ if (src?.type === 'base64' && typeof src.data === 'string' && src.media_type === 'application/pdf') {
393
+ parts.push({
394
+ type: 'file',
395
+ mimeType: src.media_type,
396
+ data: src.data,
397
+ ...(typeof block.title === 'string' ? { fileName: block.title } : {}),
398
+ });
399
+ }
400
+ else {
401
+ parts.push({ type: 'text', text: '[document]' });
402
+ }
403
+ break;
404
+ }
359
405
  default:
360
406
  parts.push({ type: 'text', text: JSON.stringify(block) });
361
407
  }
@@ -1 +1 @@
1
- {"version":3,"file":"claude-event-adapter.js","sourceRoot":"","sources":["../src/claude-event-adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claude-event-adapter.js","sourceRoot":"","sources":["../src/claude-event-adapter.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { type Clock, type LogRecord, type UniqueIDGenerator, type Unsubscribe } from '@salesforce/agentic-common';
2
- import { type AgentHarness, type ChatStreamResult, type HarnessAgentConfig, type McpServerInfo, type Message, type StreamOptions, type TelemetryEventCallback, type ToolResultInfo } from '@salesforce/sfdx-agent-sdk';
3
- import type { LLMGatewayClient } from '@salesforce/llm-gateway-sdk';
2
+ import { type AgentHarness, type ChatStreamResult, type HarnessAgentConfig, type McpServerInfo, type Message, type MessagePart, type StreamOptions, type TelemetryEventCallback, type ToolResultInfo } from '@salesforce/sfdx-agent-sdk';
3
+ import { type LLMGatewayClient } from '@salesforce/llm-gateway-sdk';
4
4
  import { type SessionStore } from '@anthropic-ai/claude-agent-sdk';
5
5
  import type { ClaudeQueryEnvBuilder } from './claude-query-env-builder.js';
6
6
  import type { ClaudeQueryOptionsBuilder } from './claude-query-options-builder.js';
@@ -186,7 +186,23 @@ export declare class ClaudeHarness implements AgentHarness {
186
186
  * summarized again into the final summary.
187
187
  */
188
188
  private summarizeInChunks;
189
- stream(agentId: string, threadId: string, message: string, streamOptions?: StreamOptions): Promise<ChatStreamResult>;
189
+ /**
190
+ * Validates a `MessagePart[]` and lowers it to a single-message `AsyncIterable<SDKUserMessage>`
191
+ * carrying Anthropic content blocks (`text`, `image`, `document`).
192
+ *
193
+ * Pre-stream validation and the input-part guard live in the SDK's {@link lowerStreamInput}:
194
+ * `image` / `file` parts are validated against the agent's gateway `Model.supportedFormats` and
195
+ * the global gateway caps via the shared `validateMultimodalFiles`, so a file is accepted or
196
+ * rejected identically on the Claude and Mastra paths (we deliberately mirror the SDK's
197
+ * conservative caps even though the underlying Bedrock models may accept more), and a
198
+ * `reasoning` / `tool-call` / `tool-result` part rejects with `INVALID_MESSAGE_CONTENT`. This
199
+ * method only supplies the Anthropic-specific lowering of each part.
200
+ *
201
+ * Validation and block construction run synchronously (the returned generator only yields the
202
+ * pre-built message) so failures reject the caller's `stream()` promise before any query starts.
203
+ */
204
+ private buildMultimodalPrompt;
205
+ stream(agentId: string, threadId: string, message: string | MessagePart[], streamOptions?: StreamOptions): Promise<ChatStreamResult>;
190
206
  /**
191
207
  * Build the per-stream MCP bridge configs the Claude subprocess will
192
208
  * receive on `query({ options.mcpServers })`. Each external-server
@@ -4,7 +4,8 @@
4
4
  */
5
5
  import { realpath } from 'node:fs/promises';
6
6
  import { RealClock, UUIDGenerator, buildSummaryPrompt, getErrorMessage, isAbortError, } from '@salesforce/agentic-common';
7
- import { AgentSDKError, AgentSDKErrorType, HarnessBusOwner, McpServerStatus, } from '@salesforce/sfdx-agent-sdk';
7
+ import { AgentSDKError, AgentSDKErrorType, HarnessBusOwner, lowerStreamInput, McpServerStatus, resolveToolApprovalMode, } from '@salesforce/sfdx-agent-sdk';
8
+ import { validateMultimodalFiles } from '@salesforce/llm-gateway-sdk';
8
9
  import { deleteSession, forkSession, getSessionMessages, listSessions, query, } from '@anthropic-ai/claude-agent-sdk';
9
10
  import { ClaudeEventAdapter, mapSessionMessageContent } from './claude-event-adapter.js';
10
11
  import { ClaudeStreamBroker } from './claude-stream-broker.js';
@@ -20,6 +21,18 @@ import { DiskBackedSessionStore } from './disk-backed-session-store.js';
20
21
  import { ThreadContextStore } from './thread-context-store.js';
21
22
  import { teeTextStream } from './text-stream.js';
22
23
  import { MAX_TRANSCRIPT_CHARS, partToTranscriptText, splitIntoChunks } from './transcript.js';
24
+ /**
25
+ * Returns a shallow copy of `m` with `content` normalized: any `MessagePart[]`
26
+ * is reduced to a compact placeholder string via {@link partToTranscriptText} so
27
+ * raw base64 blobs never land in the sidecar JSON. All three
28
+ * `threadContextStore.write` call sites route through this helper.
29
+ */
30
+ function normalizeMessageForSidecar(m) {
31
+ return {
32
+ ...m,
33
+ content: typeof m.content === 'string' ? m.content : m.content.map((p) => partToTranscriptText(p)).join(' '),
34
+ };
35
+ }
23
36
  export class ClaudeHarness {
24
37
  envBuilder;
25
38
  optionsBuilder;
@@ -209,8 +222,8 @@ export class ClaudeHarness {
209
222
  projectRoot: resolvedProjectRoot,
210
223
  config,
211
224
  rulesAppend,
225
+ model: llmGatewayClient.getModel(),
212
226
  skillMap,
213
- modelId: llmGatewayClient.getModel().name,
214
227
  threads,
215
228
  mcpServers,
216
229
  });
@@ -473,8 +486,8 @@ export class ClaudeHarness {
473
486
  if (source.contextHistory.length === 0 && source.pendingContext.length === 0)
474
487
  return;
475
488
  await this.threadContextStore.write(projectRoot, threadId, {
476
- contextHistory: [...source.contextHistory],
477
- pendingContext: [...source.pendingContext],
489
+ contextHistory: source.contextHistory.map(normalizeMessageForSidecar),
490
+ pendingContext: source.pendingContext.map(normalizeMessageForSidecar),
478
491
  });
479
492
  }
480
493
  /**
@@ -606,7 +619,7 @@ export class ClaudeHarness {
606
619
  if (!agent.config.orgJwt) {
607
620
  throw new Error('Agent has no orgJwt configured');
608
621
  }
609
- const { env, nativeModelId } = await this.envBuilder.build(agent.config.orgJwt, agent.modelId);
622
+ const { env, nativeModelId } = await this.envBuilder.build(agent.config.orgJwt, agent.model.name);
610
623
  const summaryConfig = {
611
624
  orgJwt: agent.config.orgJwt,
612
625
  // The role declaration + summarization imperative + the
@@ -691,17 +704,65 @@ export class ClaudeHarness {
691
704
  ? this.summarize(agent, buildSummaryPrompt(merged))
692
705
  : this.summarizeInChunks(agent, merged);
693
706
  }
707
+ /**
708
+ * Validates a `MessagePart[]` and lowers it to a single-message `AsyncIterable<SDKUserMessage>`
709
+ * carrying Anthropic content blocks (`text`, `image`, `document`).
710
+ *
711
+ * Pre-stream validation and the input-part guard live in the SDK's {@link lowerStreamInput}:
712
+ * `image` / `file` parts are validated against the agent's gateway `Model.supportedFormats` and
713
+ * the global gateway caps via the shared `validateMultimodalFiles`, so a file is accepted or
714
+ * rejected identically on the Claude and Mastra paths (we deliberately mirror the SDK's
715
+ * conservative caps even though the underlying Bedrock models may accept more), and a
716
+ * `reasoning` / `tool-call` / `tool-result` part rejects with `INVALID_MESSAGE_CONTENT`. This
717
+ * method only supplies the Anthropic-specific lowering of each part.
718
+ *
719
+ * Validation and block construction run synchronously (the returned generator only yields the
720
+ * pre-built message) so failures reject the caller's `stream()` promise before any query starts.
721
+ */
722
+ buildMultimodalPrompt(agentState, parts) {
723
+ const content = lowerStreamInput(parts, (files) => validateMultimodalFiles(files, agentState.model), (part) => {
724
+ switch (part.type) {
725
+ case 'text':
726
+ return { type: 'text', text: part.text };
727
+ case 'image':
728
+ return {
729
+ type: 'image',
730
+ source: { type: 'base64', media_type: part.mimeType, data: part.data },
731
+ };
732
+ case 'file':
733
+ return {
734
+ type: 'document',
735
+ source: { type: 'base64', media_type: part.mimeType, data: part.data },
736
+ ...(part.fileName !== undefined ? { title: part.fileName } : {}),
737
+ };
738
+ }
739
+ });
740
+ const userMessage = {
741
+ type: 'user',
742
+ parent_tool_use_id: null,
743
+ message: { role: 'user', content },
744
+ };
745
+ return (async function* () {
746
+ yield userMessage;
747
+ })();
748
+ }
694
749
  async stream(agentId, threadId, message, streamOptions) {
695
750
  const agentState = this.agents.get(agentId);
696
751
  if (!agentState) {
697
752
  throw new Error(`Agent "${agentId}" not found`);
698
753
  }
699
- const { projectRoot, config, rulesAppend, modelId } = agentState;
754
+ const { projectRoot, config, rulesAppend, model } = agentState;
700
755
  const threadState = agentState.threads.get(threadId);
701
756
  if (!config.orgJwt) {
702
757
  throw new Error(`Agent "${agentId}" has no orgJwt configured`);
703
758
  }
704
- const { env, nativeModelId } = await this.envBuilder.build(config.orgJwt, modelId);
759
+ // Build (and pre-stream-validate) the query prompt. A plain string passes through; a
760
+ // MessagePart[] is validated against the model's capabilities and lowered to a single
761
+ // Anthropic user message carrying text / image / document content blocks. Validation runs
762
+ // synchronously here so failures reject the `stream()` promise (pre-stream contract) rather
763
+ // than surfacing mid-iteration.
764
+ const prompt = typeof message === 'string' ? message : this.buildMultimodalPrompt(agentState, message);
765
+ const { env, nativeModelId } = await this.envBuilder.build(config.orgJwt, model.name);
705
766
  const sessionOptions = threadState?.hasStreamed ? { resume: threadId } : { sessionId: threadId };
706
767
  const pendingContext = threadState?.pendingContext ?? [];
707
768
  const contextConfig = pendingContext.length > 0
@@ -716,8 +777,13 @@ export class ClaudeHarness {
716
777
  const lookup = (toolName) => lookupMcpToolMetadata(agentState.mcpServers, toolName);
717
778
  const adapter = new ClaudeEventAdapter(this.buses.getLogBus(), lookup);
718
779
  const controller = new AbortController();
780
+ // Resolve `requireToolApproval` to its canonical mode (#447):
781
+ // `undefined` (no gating), `'serial'`, or `'batch'`. The broker
782
+ // is allocated for both gating modes; only the emission shape
783
+ // differs.
784
+ const approvalMode = resolveToolApprovalMode(streamOptions?.requireToolApproval);
719
785
  let broker;
720
- if (streamOptions?.requireToolApproval) {
786
+ if (approvalMode !== undefined) {
721
787
  const key = this.brokerKey(agentId, threadId);
722
788
  this.brokers.get(key)?.dispose();
723
789
  broker = new ClaudeStreamBroker({
@@ -725,6 +791,7 @@ export class ClaudeHarness {
725
791
  toolApprovalTimeoutMs: this.toolApprovalTimeoutMs,
726
792
  abortController: controller,
727
793
  lookupMcpToolMetadata: lookup,
794
+ mode: approvalMode,
728
795
  });
729
796
  this.brokers.set(key, broker);
730
797
  }
@@ -737,7 +804,7 @@ export class ClaudeHarness {
737
804
  const consumerTools = config.tools ?? [];
738
805
  let consumerToolBroker;
739
806
  let consumerToolsBridge;
740
- if (!streamOptions?.requireToolApproval && consumerTools.length > 0) {
807
+ if (approvalMode === undefined && consumerTools.length > 0) {
741
808
  const key = this.brokerKey(agentId, threadId);
742
809
  this.consumerToolBrokers.get(key)?.dispose();
743
810
  consumerToolBroker = new ConsumerToolBroker(CONSUMER_TOOLS_BRIDGE_SERVER_NAME);
@@ -759,11 +826,28 @@ export class ClaudeHarness {
759
826
  options.sessionStore = this.sessionStore;
760
827
  if (streamOptions?.abortSignal) {
761
828
  streamOptions.abortSignal.throwIfAborted();
762
- streamOptions.abortSignal.addEventListener('abort', () => {
829
+ const onAbort = () => {
763
830
  controller.abort();
764
831
  broker?.abort();
765
832
  consumerToolBroker?.abort();
766
- }, { once: true });
833
+ };
834
+ const abortSignal = streamOptions.abortSignal;
835
+ abortSignal.addEventListener('abort', onAbort);
836
+ // Detach the listener at the per-stream controller's abort
837
+ // event. The harness aborts `controller` from end-of-stream
838
+ // paths (the eventStream generator's `finally`, broker
839
+ // dispose's `abortController.abort()`, consumer-tool broker's
840
+ // abort, the inbound abort listener above), so this fires
841
+ // exactly once per stream — natural completion, error, or
842
+ // forwarded abort. Without this, a long-lived consumer
843
+ // AbortController (session-scoped, app-scoped) would
844
+ // accumulate one listener per turn even when the turn never
845
+ // aborts. Tying cleanup to `controller.signal` instead of
846
+ // `broker?.onTeardown()` covers the no-broker path (most
847
+ // turns) too.
848
+ controller.signal.addEventListener('abort', () => abortSignal.removeEventListener('abort', onAbort), {
849
+ once: true,
850
+ });
767
851
  }
768
852
  if (threadState && pendingContext.length > 0) {
769
853
  threadState.pendingContext = [];
@@ -771,12 +855,13 @@ export class ClaudeHarness {
771
855
  // stream and the next addContext doesn't re-inject the
772
856
  // already-consumed pendingContext into the model's
773
857
  // systemPrompt. contextHistory persists unchanged.
858
+ // Normalize to placeholders so raw base64 never lands on disk.
774
859
  await this.threadContextStore.write(projectRoot, threadId, {
775
- pendingContext: threadState.pendingContext,
776
- contextHistory: threadState.contextHistory,
860
+ pendingContext: [],
861
+ contextHistory: threadState.contextHistory.map(normalizeMessageForSidecar),
777
862
  });
778
863
  }
779
- const queryResult = query({ prompt: message, options });
864
+ const queryResult = query({ prompt, options });
780
865
  if (threadState) {
781
866
  threadState.hasStreamed = true;
782
867
  }
@@ -815,17 +900,38 @@ export class ClaudeHarness {
815
900
  return teeTextStream(consumerToolBroker.initialSink().generator());
816
901
  }
817
902
  const logBus = this.buses.getLogBus();
903
+ // Snapshot here so the catch block can distinguish a
904
+ // consumer-forwarded abort (signal aborted before the iterator
905
+ // threw) from "iterator threw normally and the finally aborted
906
+ // `controller` for listener cleanup." Without this, the natural
907
+ // error path would mis-classify as abort once the finally runs.
908
+ const consumerAbortSignal = streamOptions?.abortSignal;
818
909
  async function* eventStream() {
819
910
  let terminalEmitted = false;
820
911
  try {
821
- for await (const msg of queryResult) {
822
- for (const event of adapter.mapMessage(msg)) {
823
- if (event.type === 'finish') {
824
- terminalEmitted = true;
912
+ try {
913
+ for await (const msg of queryResult) {
914
+ for (const event of adapter.mapMessage(msg)) {
915
+ if (event.type === 'finish') {
916
+ terminalEmitted = true;
917
+ }
918
+ yield event;
825
919
  }
826
- yield event;
827
920
  }
828
921
  }
922
+ finally {
923
+ // Abort the per-stream controller on every exit path
924
+ // (natural completion, iterator throw, consumer
925
+ // `return()` from a `break`). The abort fires the
926
+ // `controller.signal` listeners we register above
927
+ // (consumer-AbortSignal listener detach, broker
928
+ // teardown), so a turn that never explicitly aborts
929
+ // still releases its inbound listener. Idempotent —
930
+ // the inbound abort listener already aborted
931
+ // `controller` when applicable.
932
+ if (!controller.signal.aborted)
933
+ controller.abort();
934
+ }
829
935
  }
830
936
  catch (err) {
831
937
  // The Salesforce LLM Gateway's Bedrock-Claude path
@@ -853,13 +959,20 @@ export class ClaudeHarness {
853
959
  });
854
960
  return;
855
961
  }
856
- if (controller.signal.aborted) {
962
+ if (consumerAbortSignal?.aborted) {
857
963
  // When the consumer-supplied AbortSignal fires, the
858
964
  // harness forwards it onto its local controller and the
859
965
  // Claude SDK iterator throws whatever it throws (varies
860
966
  // by upstream version). Normalize to the SDK's
861
967
  // documented abort contract: AbortError-named Error +
862
968
  // `code: 'abort'`. Matches the Mastra harness convention.
969
+ //
970
+ // We check the CONSUMER's signal here, not
971
+ // `controller.signal` — the per-stream controller is
972
+ // also aborted from the generator's `finally` for
973
+ // listener cleanup on natural error paths, so checking
974
+ // it would mis-classify regular iterator failures as
975
+ // aborts.
863
976
  yield {
864
977
  type: 'error',
865
978
  error: new DOMException('The stream was aborted.', 'AbortError'),
@@ -903,8 +1016,8 @@ export class ClaudeHarness {
903
1016
  for (const [name, state] of agent.mcpServers) {
904
1017
  if (state.currentStatus !== McpServerStatus.Connected)
905
1018
  continue;
906
- const timeout = agent.config.mcpServers?.[name]?.timeout;
907
- out[name] = buildBridgeForServer(name, state.client, state.tools, timeout);
1019
+ const serverConfig = agent.config.mcpServers?.[name];
1020
+ out[name] = buildBridgeForServer(name, state.client, state.tools, serverConfig?.timeout, serverConfig?.alwaysLoad);
908
1021
  }
909
1022
  if (consumerToolsBridge) {
910
1023
  out[CONSUMER_TOOLS_BRIDGE_SERVER_NAME] = consumerToolsBridge;
@@ -925,7 +1038,16 @@ export class ClaudeHarness {
925
1038
  * fresh continuation sink returned here.
926
1039
  */
927
1040
  async submitToolResult(agentId, threadId, toolResult) {
928
- const broker = this.consumerToolBrokers.get(this.brokerKey(agentId, threadId));
1041
+ const key = this.brokerKey(agentId, threadId);
1042
+ // A `ClaudeStreamBroker` only exists when the originating turn was
1043
+ // approval-gated. The broker has no path to settle a
1044
+ // consumer-executed tool result (its decision shape is
1045
+ // approve/decline only), so refuse with cross-harness-parity
1046
+ // guidance — Mastra's submitToolResult emits the same shape.
1047
+ if (this.brokers.has(key)) {
1048
+ throw new Error(`ClaudeHarness.submitToolResult(): thread "${threadId}" on agent "${agentId}" is in approval-gated mode; settle pending approvals via approveToolCall / declineToolCall first`);
1049
+ }
1050
+ const broker = this.consumerToolBrokers.get(key);
929
1051
  if (!broker) {
930
1052
  throw new Error(`ClaudeHarness.submitToolResult(): no active consumer-tool stream for thread "${threadId}" on agent "${agentId}"`);
931
1053
  }
@@ -971,6 +1093,9 @@ export class ClaudeHarness {
971
1093
  // `pendingContext` → systemPrompt path on the next stream. Order is
972
1094
  // injection-order followed by persisted-transcript-order, matching
973
1095
  // the Mastra harness shape.
1096
+ // Consumer-visible content round-trips unchanged: contextHistory entries
1097
+ // are returned exactly as passed to addContext(), including any raw base64
1098
+ // in image/file parts. Only the sidecar-persisted copy is normalized (see addContext()).
974
1099
  const contextHistory = threadState?.contextHistory ?? [];
975
1100
  return contextHistory.length === 0 ? persisted : [...contextHistory, ...persisted];
976
1101
  }
@@ -995,7 +1120,7 @@ export class ClaudeHarness {
995
1120
  }
996
1121
  buildContextPrompt(baseInstructions, messages) {
997
1122
  const contextBlock = messages
998
- .map((m) => `[${m.role}]: ${typeof m.content === 'string' ? m.content : JSON.stringify(m.content)}`)
1123
+ .map((m) => `[${m.role}]: ${typeof m.content === 'string' ? m.content : m.content.map((p) => partToTranscriptText(p)).join(' ')}`)
999
1124
  .join('\n');
1000
1125
  const prefix = baseInstructions ? `${baseInstructions}\n\n` : '';
1001
1126
  return `${prefix}<prior-context>\n${contextBlock}\n</prior-context>`;
@@ -1022,9 +1147,12 @@ export class ClaudeHarness {
1022
1147
  // path (`memory.saveMessages`) propagates libsql failures, and
1023
1148
  // silently masking a write failure here would recreate the very
1024
1149
  // cross-restart drop the sidecar exists to prevent.
1150
+ // Normalize MessagePart[] content to placeholder text before writing so
1151
+ // raw base64 blobs never land in the sidecar JSON (same pattern as
1152
+ // compactThread's transcript builder).
1025
1153
  await this.threadContextStore.write(agent.projectRoot, threadId, {
1026
- pendingContext: threadState.pendingContext,
1027
- contextHistory: threadState.contextHistory,
1154
+ pendingContext: threadState.pendingContext.map(normalizeMessageForSidecar),
1155
+ contextHistory: threadState.contextHistory.map(normalizeMessageForSidecar),
1028
1156
  });
1029
1157
  }
1030
1158
  /**
@@ -1295,7 +1423,11 @@ function projectMcpServerStateToInfo(name, state) {
1295
1423
  }
1296
1424
  }
1297
1425
  function mapToolToInfo(serverName, tool) {
1298
- const info = { name: `mcp__${serverName}__${tool.name}` };
1426
+ const info = {
1427
+ name: `mcp__${serverName}__${tool.name}`,
1428
+ serverName,
1429
+ toolName: tool.name,
1430
+ };
1299
1431
  if (tool.description !== undefined && tool.description !== '') {
1300
1432
  info.description = tool.description;
1301
1433
  }