From ed12a2bacce195527b0db039821e809b0cd84a25 Mon Sep 17 00:00:00 2001 From: imabdulazeez Date: Sat, 30 May 2026 17:24:50 +0530 Subject: [PATCH 1/2] handle claude agent sdk 0.3.x system subtypes - no-op thinking_tokens to stop flooding work log - map permission_denied to runtime warning with tool + reason - map mirror_error to runtime.error --- .../src/provider/Layers/ClaudeAdapter.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/apps/server/src/provider/Layers/ClaudeAdapter.ts b/apps/server/src/provider/Layers/ClaudeAdapter.ts index ff9bbfe0231..7e9351e24d4 100644 --- a/apps/server/src/provider/Layers/ClaudeAdapter.ts +++ b/apps/server/src/provider/Layers/ClaudeAdapter.ts @@ -2267,6 +2267,24 @@ export const makeClaudeAdapter = Effect.fn("makeClaudeAdapter")(function* ( }, }); return; + case "thinking_tokens": + return; + case "permission_denied": + yield* emitRuntimeWarning( + context, + `Claude denied tool '${message.tool_name}'${ + message.decision_reason ? `: ${message.decision_reason}` : "" + }.`, + message, + ); + return; + case "mirror_error": + yield* emitRuntimeError( + context, + `Claude workspace mirror error: ${message.error}`, + message, + ); + return; default: yield* emitRuntimeWarning( context, From 423af15533b02aa300ab92ef5e58986455cbe2d4 Mon Sep 17 00:00:00 2001 From: imabdulazeez Date: Sat, 30 May 2026 17:43:48 +0530 Subject: [PATCH 2/2] add tool.denied provider runtime event for claude sdk - new ToolDeniedPayload schema and ProviderRuntimeToolDeniedEvent in contracts - permission_denied system subtype emits tool.denied instead of runtime warning - ingestion maps tool.denied to a distinct error-tone work-log entry --- .../Layers/ProviderRuntimeIngestion.ts | 20 +++++++++++++++++++ .../src/provider/Layers/ClaudeAdapter.ts | 17 +++++++++------- packages/contracts/src/providerRuntime.ts | 17 ++++++++++++++++ 3 files changed, 47 insertions(+), 7 deletions(-) diff --git a/apps/server/src/orchestration/Layers/ProviderRuntimeIngestion.ts b/apps/server/src/orchestration/Layers/ProviderRuntimeIngestion.ts index 59787e0b545..88f91105b66 100644 --- a/apps/server/src/orchestration/Layers/ProviderRuntimeIngestion.ts +++ b/apps/server/src/orchestration/Layers/ProviderRuntimeIngestion.ts @@ -344,6 +344,26 @@ function runtimeEventToActivities( ]; } + case "tool.denied": { + return [ + { + id: event.eventId, + createdAt: event.createdAt, + tone: "error", + kind: "tool.denied", + summary: `Tool denied: ${event.payload.toolName}`, + payload: { + toolName: event.payload.toolName, + ...(event.payload.toolUseId ? { toolUseId: event.payload.toolUseId } : {}), + ...(event.payload.reason ? { detail: truncateDetail(event.payload.reason) } : {}), + ...(event.payload.agentId ? { agentId: event.payload.agentId } : {}), + }, + turnId: toTurnId(event.turnId) ?? null, + ...maybeSequence, + }, + ]; + } + case "runtime.warning": { return [ { diff --git a/apps/server/src/provider/Layers/ClaudeAdapter.ts b/apps/server/src/provider/Layers/ClaudeAdapter.ts index 7e9351e24d4..f33526e5fd3 100644 --- a/apps/server/src/provider/Layers/ClaudeAdapter.ts +++ b/apps/server/src/provider/Layers/ClaudeAdapter.ts @@ -2270,13 +2270,16 @@ export const makeClaudeAdapter = Effect.fn("makeClaudeAdapter")(function* ( case "thinking_tokens": return; case "permission_denied": - yield* emitRuntimeWarning( - context, - `Claude denied tool '${message.tool_name}'${ - message.decision_reason ? `: ${message.decision_reason}` : "" - }.`, - message, - ); + yield* offerRuntimeEvent({ + ...base, + type: "tool.denied", + payload: { + toolName: message.tool_name, + ...(message.tool_use_id ? { toolUseId: message.tool_use_id } : {}), + ...(message.decision_reason ? { reason: message.decision_reason } : {}), + ...(message.agent_id ? { agentId: message.agent_id } : {}), + }, + }); return; case "mirror_error": yield* emitRuntimeError( diff --git a/packages/contracts/src/providerRuntime.ts b/packages/contracts/src/providerRuntime.ts index 5032dc4eb41..eb2563eff00 100644 --- a/packages/contracts/src/providerRuntime.ts +++ b/packages/contracts/src/providerRuntime.ts @@ -241,6 +241,7 @@ const ModelReroutedType = Schema.Literal("model.rerouted"); const ConfigWarningType = Schema.Literal("config.warning"); const DeprecationNoticeType = Schema.Literal("deprecation.notice"); const FilesPersistedType = Schema.Literal("files.persisted"); +const ToolDeniedType = Schema.Literal("tool.denied"); const RuntimeWarningType = Schema.Literal("runtime.warning"); const RuntimeErrorType = Schema.Literal("runtime.error"); @@ -589,6 +590,14 @@ const FilesPersistedPayload = Schema.Struct({ }); export type FilesPersistedPayload = typeof FilesPersistedPayload.Type; +const ToolDeniedPayload = Schema.Struct({ + toolName: TrimmedNonEmptyStringSchema, + toolUseId: Schema.optional(TrimmedNonEmptyStringSchema), + reason: Schema.optional(TrimmedNonEmptyStringSchema), + agentId: Schema.optional(TrimmedNonEmptyStringSchema), +}); +export type ToolDeniedPayload = typeof ToolDeniedPayload.Type; + const RuntimeWarningPayload = Schema.Struct({ message: TrimmedNonEmptyStringSchema, detail: Schema.optional(Schema.Unknown), @@ -934,6 +943,13 @@ const ProviderRuntimeFilesPersistedEvent = Schema.Struct({ }); export type ProviderRuntimeFilesPersistedEvent = typeof ProviderRuntimeFilesPersistedEvent.Type; +const ProviderRuntimeToolDeniedEvent = Schema.Struct({ + ...ProviderRuntimeEventBase.fields, + type: ToolDeniedType, + payload: ToolDeniedPayload, +}); +export type ProviderRuntimeToolDeniedEvent = typeof ProviderRuntimeToolDeniedEvent.Type; + const ProviderRuntimeWarningEvent = Schema.Struct({ ...ProviderRuntimeEventBase.fields, type: RuntimeWarningType, @@ -994,6 +1010,7 @@ export const ProviderRuntimeEventV2 = Schema.Union([ ProviderRuntimeConfigWarningEvent, ProviderRuntimeDeprecationNoticeEvent, ProviderRuntimeFilesPersistedEvent, + ProviderRuntimeToolDeniedEvent, ProviderRuntimeWarningEvent, ProviderRuntimeErrorEvent, ]);