@yolk-sdk/agent 0.1.0-canary.21 → 0.1.0-canary.23

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.
Files changed (39) hide show
  1. package/README.md +36 -8
  2. package/dist/loop/run.d.mts.map +1 -1
  3. package/dist/loop/run.mjs +38 -19
  4. package/dist/loop/run.mjs.map +1 -1
  5. package/dist/protocol/content.d.mts +2 -1
  6. package/dist/protocol/content.d.mts.map +1 -1
  7. package/dist/protocol/content.mjs +8 -1
  8. package/dist/protocol/content.mjs.map +1 -1
  9. package/dist/protocol/index.d.mts +3 -3
  10. package/dist/protocol/index.d.mts.map +1 -1
  11. package/dist/protocol/index.mjs +3 -3
  12. package/dist/protocol/message.d.mts +20 -1
  13. package/dist/protocol/message.d.mts.map +1 -1
  14. package/dist/protocol/message.mjs +59 -1
  15. package/dist/protocol/message.mjs.map +1 -1
  16. package/dist/providers/anthropic/claude-provider.d.mts +6 -0
  17. package/dist/providers/anthropic/claude-provider.d.mts.map +1 -1
  18. package/dist/providers/anthropic/claude-provider.mjs +47 -24
  19. package/dist/providers/anthropic/claude-provider.mjs.map +1 -1
  20. package/dist/providers/openai/codex-provider.d.mts.map +1 -1
  21. package/dist/providers/openai/codex-provider.mjs +4 -2
  22. package/dist/providers/openai/codex-provider.mjs.map +1 -1
  23. package/dist/providers/openai/provider.d.mts.map +1 -1
  24. package/dist/providers/openai/provider.mjs +4 -2
  25. package/dist/providers/openai/provider.mjs.map +1 -1
  26. package/dist/providers/transcript.d.mts +9 -0
  27. package/dist/providers/transcript.d.mts.map +1 -0
  28. package/dist/providers/transcript.mjs +17 -0
  29. package/dist/providers/transcript.mjs.map +1 -0
  30. package/package.json +1 -1
  31. package/src/loop/run.ts +56 -17
  32. package/src/protocol/content.ts +11 -0
  33. package/src/protocol/index.ts +10 -1
  34. package/src/protocol/message.ts +127 -0
  35. package/src/providers/anthropic/claude-provider.ts +78 -34
  36. package/src/providers/openai/codex-provider.ts +4 -1
  37. package/src/providers/openai/provider.ts +4 -2
  38. package/src/providers/transcript.ts +24 -0
  39. package/src/tools/README.md +3 -2
@@ -1,7 +1,7 @@
1
1
  import { AgentContentCapabilities, AgentModelCapabilities, textImageDocumentModelCapabilities, textImageModelCapabilities, textOnlyModelCapabilities } from "./capability.mjs";
2
- import { AttachmentContentPart, AttachmentSource, AttachmentSourceResolver, AudioPart, Content, ContentPart, DocumentPart, ImagePart, InlineBase64AttachmentSource, RefAttachmentSource, TextPart, UrlAttachmentSource, appendTextToContent, attachmentSourceBase64, attachmentSourceDataUrl, attachmentSourcePreview, attachmentSourceText, contentPartPreview, contentPartText, contentParts, contentPreview, contentText, documentPartFromText, inferTextDocumentMimeType, inlineBase64AttachmentSource, inlineBase64Source, isContentEmpty, isTextDocumentMimeType, refAttachmentSource, resolveContentAttachmentSources, textDocumentMimeTypeFromFilename, textToBase64Utf8, urlAttachmentSource } from "./content.mjs";
2
+ import { AttachmentContentPart, AttachmentSource, AttachmentSourceResolver, AudioPart, Content, ContentPart, DocumentPart, ImagePart, InlineBase64AttachmentSource, RefAttachmentSource, TextPart, UrlAttachmentSource, appendTextToContent, attachmentSourceBase64, attachmentSourceDataUrl, attachmentSourcePreview, attachmentSourceText, attachmentSourceUrl, contentPartPreview, contentPartText, contentParts, contentPreview, contentText, documentPartFromText, inferTextDocumentMimeType, inlineBase64AttachmentSource, inlineBase64Source, isContentEmpty, isTextDocumentMimeType, refAttachmentSource, resolveContentAttachmentSources, textDocumentMimeTypeFromFilename, textToBase64Utf8, urlAttachmentSource } from "./content.mjs";
3
3
  import { ErrorToolResultInput, HitlRequest, HitlResponse, HitlResponseSource, PlainHitlResponse, PlainQuestionAnswer, PlainQuestionResponse, PlainToolApprovalResponse, QuestionAnswer, QuestionOption, QuestionPrompt, QuestionRequest, QuestionResponse, QuestionResponseOutcome, QuestionResponseStructuredContent, QuestionToolParams, ToolApprovalDecision, ToolApprovalMode, ToolApprovalPolicy, ToolApprovalRequest, ToolApprovalResponse, ToolCall, ToolDef, ToolResult, formatQuestionResponseContent, makeErrorToolResult, plainHitlResponse, plainQuestionAnswer, plainQuestionResponse, plainToolApprovalResponse, questionResponseStructuredContent } from "./tool.mjs";
4
- import { AgentMessage, AssistantAgentMessage, AssistantPart, AssistantReasoningPart, AssistantTextPart, HostToolCallPart, MessageAnnotations, MessageAuthor, MessageEnvelope, ProviderToolCallPart, ProviderToolResultPart, ToolResultMessage, UserMessage, assistantContent, assistantHostToolCalls, assistantReasoningText, messageContextText, prependMessageContextToContent } from "./message.mjs";
4
+ import { AgentMessage, AssistantAgentMessage, AssistantPart, AssistantReasoningPart, AssistantTextPart, DanglingHostToolCall, HostToolCallPart, MessageAnnotations, MessageAuthor, MessageEnvelope, ProviderToolCallPart, ProviderToolResultPart, RepairDanglingHostToolCallsOptions, ToolResultMessage, TranscriptInvariantValidation, UserMessage, assistantContent, assistantHostToolCalls, assistantReasoningText, danglingHostToolCalls, messageContextText, prependMessageContextToContent, repairDanglingHostToolCalls, validateNoDanglingHostToolCalls } from "./message.mjs";
5
5
  import { AgentInputUsage, AgentOutputUsage, AgentUsage, addAgentUsage, zeroAgentUsage } from "./usage.mjs";
6
6
  import { AgentAwaitingInput, AgentEnd, AgentError, AgentErrorCode, AgentEvent, AgentRetry, AgentStart, AssistantMessageEvent, CompactionEnd, CompactionStart, LLMReasoningDelta, LLMStreamEnd, LLMStreamStart, LLMTextDelta, ProviderErrorInfo, ProviderFailureKind, ProviderToolResult, QuestionAnswered, QuestionCancelled, QuestionRequested, SubagentCompleted, SubagentStarted, SubagentStatus, ToolApprovalDenied, ToolApprovalGranted, ToolApprovalRequested, ToolExecutionCompleted, ToolExecutionError, ToolExecutionStarted, ToolInputDelta, ToolInputEnd, ToolInputStart, TurnEnd, TurnStart, UsageUpdate, hitlResponseEvent, makeSubagentRunId } from "./event.mjs";
7
7
  import { AgentReasoningEffort } from "./reasoning.mjs";
@@ -10,5 +10,5 @@ import { AgentWebSocketClientMessage, AgentWebSocketServerMessage, QuestionRespo
10
10
  //#region src/protocol/index.d.ts
11
11
  type MessageId = string;
12
12
  //#endregion
13
- export { AgentAwaitingInput, AgentContentCapabilities, AgentEnd, AgentError, AgentErrorCode, AgentEvent, AgentInputUsage, AgentMessage, AgentModelCapabilities, AgentOutputUsage, AgentReasoningEffort, AgentRetry, AgentStart, AgentUsage, AgentWebSocketClientMessage, AgentWebSocketServerMessage, AssistantAgentMessage, AssistantMessageEvent, AssistantPart, AssistantReasoningPart, AssistantTextPart, type AttachmentContentPart, AttachmentSource, type AttachmentSourceResolver, AudioPart, CompactionEnd, CompactionStart, Content, ContentPart, DocumentPart, type ErrorToolResultInput, HitlRequest, HitlResponse, HitlResponseSource, HostToolCallPart, ImagePart, InlineBase64AttachmentSource, LLMReasoningDelta, LLMStreamEnd, LLMStreamStart, LLMTextDelta, MessageAnnotations, MessageAuthor, type MessageEnvelope, MessageId, type PlainHitlResponse, type PlainQuestionAnswer, type PlainQuestionResponse, type PlainToolApprovalResponse, ProviderErrorInfo, ProviderFailureKind, ProviderToolCallPart, ProviderToolResult, ProviderToolResultPart, QuestionAnswer, QuestionAnswered, QuestionCancelled, QuestionOption, QuestionPrompt, QuestionRequest, QuestionRequested, QuestionResponse, QuestionResponseInput, QuestionResponseOutcome, type QuestionResponseStructuredContent, QuestionToolParams, RefAttachmentSource, SessionSnapshot, SubagentCompleted, SubagentStarted, SubagentStatus, TextPart, ToolApprovalDecision, ToolApprovalDenied, ToolApprovalGranted, ToolApprovalMode, ToolApprovalPolicy, ToolApprovalRequest, ToolApprovalRequested, ToolApprovalResponse, ToolApprovalResponseInput, ToolCall, ToolDef, ToolExecutionCompleted, ToolExecutionError, ToolExecutionStarted, ToolInputDelta, ToolInputEnd, ToolInputStart, ToolResult, ToolResultMessage, TurnEnd, TurnStart, UrlAttachmentSource, UsageUpdate, UserInput, UserMessage, addAgentUsage, appendTextToContent, assistantContent, assistantHostToolCalls, assistantReasoningText, attachmentSourceBase64, attachmentSourceDataUrl, attachmentSourcePreview, attachmentSourceText, contentPartPreview, contentPartText, contentParts, contentPreview, contentText, documentPartFromText, formatQuestionResponseContent, hitlResponseEvent, inferTextDocumentMimeType, inlineBase64AttachmentSource, inlineBase64Source, isContentEmpty, isTextDocumentMimeType, makeErrorToolResult, makeSubagentRunId, messageContextText, plainHitlResponse, plainQuestionAnswer, plainQuestionResponse, plainToolApprovalResponse, prependMessageContextToContent, questionResponseStructuredContent, refAttachmentSource, resolveContentAttachmentSources, textDocumentMimeTypeFromFilename, textImageDocumentModelCapabilities, textImageModelCapabilities, textOnlyModelCapabilities, textToBase64Utf8, urlAttachmentSource, zeroAgentUsage };
13
+ export { AgentAwaitingInput, AgentContentCapabilities, AgentEnd, AgentError, AgentErrorCode, AgentEvent, AgentInputUsage, AgentMessage, AgentModelCapabilities, AgentOutputUsage, AgentReasoningEffort, AgentRetry, AgentStart, AgentUsage, AgentWebSocketClientMessage, AgentWebSocketServerMessage, AssistantAgentMessage, AssistantMessageEvent, AssistantPart, AssistantReasoningPart, AssistantTextPart, type AttachmentContentPart, AttachmentSource, type AttachmentSourceResolver, AudioPart, CompactionEnd, CompactionStart, Content, ContentPart, type DanglingHostToolCall, DocumentPart, type ErrorToolResultInput, HitlRequest, HitlResponse, HitlResponseSource, HostToolCallPart, ImagePart, InlineBase64AttachmentSource, LLMReasoningDelta, LLMStreamEnd, LLMStreamStart, LLMTextDelta, MessageAnnotations, MessageAuthor, type MessageEnvelope, MessageId, type PlainHitlResponse, type PlainQuestionAnswer, type PlainQuestionResponse, type PlainToolApprovalResponse, ProviderErrorInfo, ProviderFailureKind, ProviderToolCallPart, ProviderToolResult, ProviderToolResultPart, QuestionAnswer, QuestionAnswered, QuestionCancelled, QuestionOption, QuestionPrompt, QuestionRequest, QuestionRequested, QuestionResponse, QuestionResponseInput, QuestionResponseOutcome, type QuestionResponseStructuredContent, QuestionToolParams, RefAttachmentSource, type RepairDanglingHostToolCallsOptions, SessionSnapshot, SubagentCompleted, SubagentStarted, SubagentStatus, TextPart, ToolApprovalDecision, ToolApprovalDenied, ToolApprovalGranted, ToolApprovalMode, ToolApprovalPolicy, ToolApprovalRequest, ToolApprovalRequested, ToolApprovalResponse, ToolApprovalResponseInput, ToolCall, ToolDef, ToolExecutionCompleted, ToolExecutionError, ToolExecutionStarted, ToolInputDelta, ToolInputEnd, ToolInputStart, ToolResult, ToolResultMessage, type TranscriptInvariantValidation, TurnEnd, TurnStart, UrlAttachmentSource, UsageUpdate, UserInput, UserMessage, addAgentUsage, appendTextToContent, assistantContent, assistantHostToolCalls, assistantReasoningText, attachmentSourceBase64, attachmentSourceDataUrl, attachmentSourcePreview, attachmentSourceText, attachmentSourceUrl, contentPartPreview, contentPartText, contentParts, contentPreview, contentText, danglingHostToolCalls, documentPartFromText, formatQuestionResponseContent, hitlResponseEvent, inferTextDocumentMimeType, inlineBase64AttachmentSource, inlineBase64Source, isContentEmpty, isTextDocumentMimeType, makeErrorToolResult, makeSubagentRunId, messageContextText, plainHitlResponse, plainQuestionAnswer, plainQuestionResponse, plainToolApprovalResponse, prependMessageContextToContent, questionResponseStructuredContent, refAttachmentSource, repairDanglingHostToolCalls, resolveContentAttachmentSources, textDocumentMimeTypeFromFilename, textImageDocumentModelCapabilities, textImageModelCapabilities, textOnlyModelCapabilities, textToBase64Utf8, urlAttachmentSource, validateNoDanglingHostToolCalls, zeroAgentUsage };
14
14
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/protocol/index.ts"],"mappings":";;;;;;;;;;KAyJY,SAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/protocol/index.ts"],"mappings":";;;;;;;;;;KAkKY,SAAA"}
@@ -1,9 +1,9 @@
1
1
  import { AgentContentCapabilities, AgentModelCapabilities, textImageDocumentModelCapabilities, textImageModelCapabilities, textOnlyModelCapabilities } from "./capability.mjs";
2
- import { AttachmentSource, AudioPart, Content, ContentPart, DocumentPart, ImagePart, InlineBase64AttachmentSource, RefAttachmentSource, TextPart, UrlAttachmentSource, appendTextToContent, attachmentSourceBase64, attachmentSourceDataUrl, attachmentSourcePreview, attachmentSourceText, contentPartPreview, contentPartText, contentParts, contentPreview, contentText, documentPartFromText, inferTextDocumentMimeType, inlineBase64AttachmentSource, inlineBase64Source, isContentEmpty, isTextDocumentMimeType, refAttachmentSource, resolveContentAttachmentSources, textDocumentMimeTypeFromFilename, textToBase64Utf8, urlAttachmentSource } from "./content.mjs";
2
+ import { AttachmentSource, AudioPart, Content, ContentPart, DocumentPart, ImagePart, InlineBase64AttachmentSource, RefAttachmentSource, TextPart, UrlAttachmentSource, appendTextToContent, attachmentSourceBase64, attachmentSourceDataUrl, attachmentSourcePreview, attachmentSourceText, attachmentSourceUrl, contentPartPreview, contentPartText, contentParts, contentPreview, contentText, documentPartFromText, inferTextDocumentMimeType, inlineBase64AttachmentSource, inlineBase64Source, isContentEmpty, isTextDocumentMimeType, refAttachmentSource, resolveContentAttachmentSources, textDocumentMimeTypeFromFilename, textToBase64Utf8, urlAttachmentSource } from "./content.mjs";
3
3
  import { HitlRequest, HitlResponse, HitlResponseSource, QuestionAnswer, QuestionOption, QuestionPrompt, QuestionRequest, QuestionResponse, QuestionResponseOutcome, QuestionToolParams, ToolApprovalDecision, ToolApprovalMode, ToolApprovalPolicy, ToolApprovalRequest, ToolApprovalResponse, ToolCall, ToolDef, ToolResult, formatQuestionResponseContent, makeErrorToolResult, plainHitlResponse, plainQuestionAnswer, plainQuestionResponse, plainToolApprovalResponse, questionResponseStructuredContent } from "./tool.mjs";
4
- import { AgentMessage, AssistantAgentMessage, AssistantPart, AssistantReasoningPart, AssistantTextPart, HostToolCallPart, MessageAnnotations, MessageAuthor, ProviderToolCallPart, ProviderToolResultPart, ToolResultMessage, UserMessage, assistantContent, assistantHostToolCalls, assistantReasoningText, messageContextText, prependMessageContextToContent } from "./message.mjs";
4
+ import { AgentMessage, AssistantAgentMessage, AssistantPart, AssistantReasoningPart, AssistantTextPart, HostToolCallPart, MessageAnnotations, MessageAuthor, ProviderToolCallPart, ProviderToolResultPart, ToolResultMessage, UserMessage, assistantContent, assistantHostToolCalls, assistantReasoningText, danglingHostToolCalls, messageContextText, prependMessageContextToContent, repairDanglingHostToolCalls, validateNoDanglingHostToolCalls } from "./message.mjs";
5
5
  import { AgentInputUsage, AgentOutputUsage, AgentUsage, addAgentUsage, zeroAgentUsage } from "./usage.mjs";
6
6
  import { AgentAwaitingInput, AgentEnd, AgentError, AgentErrorCode, AgentEvent, AgentRetry, AgentStart, AssistantMessageEvent, CompactionEnd, CompactionStart, LLMReasoningDelta, LLMStreamEnd, LLMStreamStart, LLMTextDelta, ProviderErrorInfo, ProviderFailureKind, ProviderToolResult, QuestionAnswered, QuestionCancelled, QuestionRequested, SubagentCompleted, SubagentStarted, SubagentStatus, ToolApprovalDenied, ToolApprovalGranted, ToolApprovalRequested, ToolExecutionCompleted, ToolExecutionError, ToolExecutionStarted, ToolInputDelta, ToolInputEnd, ToolInputStart, TurnEnd, TurnStart, UsageUpdate, hitlResponseEvent, makeSubagentRunId } from "./event.mjs";
7
7
  import { AgentReasoningEffort } from "./reasoning.mjs";
8
8
  import { AgentWebSocketClientMessage, AgentWebSocketServerMessage, QuestionResponseInput, SessionSnapshot, ToolApprovalResponseInput, UserInput } from "./session.mjs";
9
- export { AgentAwaitingInput, AgentContentCapabilities, AgentEnd, AgentError, AgentErrorCode, AgentEvent, AgentInputUsage, AgentMessage, AgentModelCapabilities, AgentOutputUsage, AgentReasoningEffort, AgentRetry, AgentStart, AgentUsage, AgentWebSocketClientMessage, AgentWebSocketServerMessage, AssistantAgentMessage, AssistantMessageEvent, AssistantPart, AssistantReasoningPart, AssistantTextPart, AttachmentSource, AudioPart, CompactionEnd, CompactionStart, Content, ContentPart, DocumentPart, HitlRequest, HitlResponse, HitlResponseSource, HostToolCallPart, ImagePart, InlineBase64AttachmentSource, LLMReasoningDelta, LLMStreamEnd, LLMStreamStart, LLMTextDelta, MessageAnnotations, MessageAuthor, ProviderErrorInfo, ProviderFailureKind, ProviderToolCallPart, ProviderToolResult, ProviderToolResultPart, QuestionAnswer, QuestionAnswered, QuestionCancelled, QuestionOption, QuestionPrompt, QuestionRequest, QuestionRequested, QuestionResponse, QuestionResponseInput, QuestionResponseOutcome, QuestionToolParams, RefAttachmentSource, SessionSnapshot, SubagentCompleted, SubagentStarted, SubagentStatus, TextPart, ToolApprovalDecision, ToolApprovalDenied, ToolApprovalGranted, ToolApprovalMode, ToolApprovalPolicy, ToolApprovalRequest, ToolApprovalRequested, ToolApprovalResponse, ToolApprovalResponseInput, ToolCall, ToolDef, ToolExecutionCompleted, ToolExecutionError, ToolExecutionStarted, ToolInputDelta, ToolInputEnd, ToolInputStart, ToolResult, ToolResultMessage, TurnEnd, TurnStart, UrlAttachmentSource, UsageUpdate, UserInput, UserMessage, addAgentUsage, appendTextToContent, assistantContent, assistantHostToolCalls, assistantReasoningText, attachmentSourceBase64, attachmentSourceDataUrl, attachmentSourcePreview, attachmentSourceText, contentPartPreview, contentPartText, contentParts, contentPreview, contentText, documentPartFromText, formatQuestionResponseContent, hitlResponseEvent, inferTextDocumentMimeType, inlineBase64AttachmentSource, inlineBase64Source, isContentEmpty, isTextDocumentMimeType, makeErrorToolResult, makeSubagentRunId, messageContextText, plainHitlResponse, plainQuestionAnswer, plainQuestionResponse, plainToolApprovalResponse, prependMessageContextToContent, questionResponseStructuredContent, refAttachmentSource, resolveContentAttachmentSources, textDocumentMimeTypeFromFilename, textImageDocumentModelCapabilities, textImageModelCapabilities, textOnlyModelCapabilities, textToBase64Utf8, urlAttachmentSource, zeroAgentUsage };
9
+ export { AgentAwaitingInput, AgentContentCapabilities, AgentEnd, AgentError, AgentErrorCode, AgentEvent, AgentInputUsage, AgentMessage, AgentModelCapabilities, AgentOutputUsage, AgentReasoningEffort, AgentRetry, AgentStart, AgentUsage, AgentWebSocketClientMessage, AgentWebSocketServerMessage, AssistantAgentMessage, AssistantMessageEvent, AssistantPart, AssistantReasoningPart, AssistantTextPart, AttachmentSource, AudioPart, CompactionEnd, CompactionStart, Content, ContentPart, DocumentPart, HitlRequest, HitlResponse, HitlResponseSource, HostToolCallPart, ImagePart, InlineBase64AttachmentSource, LLMReasoningDelta, LLMStreamEnd, LLMStreamStart, LLMTextDelta, MessageAnnotations, MessageAuthor, ProviderErrorInfo, ProviderFailureKind, ProviderToolCallPart, ProviderToolResult, ProviderToolResultPart, QuestionAnswer, QuestionAnswered, QuestionCancelled, QuestionOption, QuestionPrompt, QuestionRequest, QuestionRequested, QuestionResponse, QuestionResponseInput, QuestionResponseOutcome, QuestionToolParams, RefAttachmentSource, SessionSnapshot, SubagentCompleted, SubagentStarted, SubagentStatus, TextPart, ToolApprovalDecision, ToolApprovalDenied, ToolApprovalGranted, ToolApprovalMode, ToolApprovalPolicy, ToolApprovalRequest, ToolApprovalRequested, ToolApprovalResponse, ToolApprovalResponseInput, ToolCall, ToolDef, ToolExecutionCompleted, ToolExecutionError, ToolExecutionStarted, ToolInputDelta, ToolInputEnd, ToolInputStart, ToolResult, ToolResultMessage, TurnEnd, TurnStart, UrlAttachmentSource, UsageUpdate, UserInput, UserMessage, addAgentUsage, appendTextToContent, assistantContent, assistantHostToolCalls, assistantReasoningText, attachmentSourceBase64, attachmentSourceDataUrl, attachmentSourcePreview, attachmentSourceText, attachmentSourceUrl, contentPartPreview, contentPartText, contentParts, contentPreview, contentText, danglingHostToolCalls, documentPartFromText, formatQuestionResponseContent, hitlResponseEvent, inferTextDocumentMimeType, inlineBase64AttachmentSource, inlineBase64Source, isContentEmpty, isTextDocumentMimeType, makeErrorToolResult, makeSubagentRunId, messageContextText, plainHitlResponse, plainQuestionAnswer, plainQuestionResponse, plainToolApprovalResponse, prependMessageContextToContent, questionResponseStructuredContent, refAttachmentSource, repairDanglingHostToolCalls, resolveContentAttachmentSources, textDocumentMimeTypeFromFilename, textImageDocumentModelCapabilities, textImageModelCapabilities, textOnlyModelCapabilities, textToBase64Utf8, urlAttachmentSource, validateNoDanglingHostToolCalls, zeroAgentUsage };
@@ -71,11 +71,30 @@ declare const ToolResultMessage_base: Schema.Class<ToolResultMessage, Schema.Tag
71
71
  declare class ToolResultMessage extends ToolResultMessage_base {}
72
72
  declare const AgentMessage: Schema.Union<readonly [typeof UserMessage, typeof AssistantAgentMessage, typeof ToolResultMessage]>;
73
73
  type AgentMessage = typeof AgentMessage.Type;
74
+ type DanglingHostToolCall = {
75
+ readonly call: ToolCall;
76
+ readonly assistantMessageIndex: number;
77
+ readonly beforeMessageIndex?: number;
78
+ };
79
+ type TranscriptInvariantValidation = {
80
+ readonly _tag: 'Valid';
81
+ } | {
82
+ readonly _tag: 'DanglingHostToolCalls';
83
+ readonly calls: ReadonlyArray<DanglingHostToolCall>;
84
+ readonly message: string;
85
+ };
86
+ type RepairDanglingHostToolCallsOptions = {
87
+ readonly content?: (call: ToolCall) => Content;
88
+ readonly structuredContent?: (call: ToolCall) => unknown;
89
+ };
74
90
  declare const assistantContent: (message: AssistantAgentMessage) => Content;
75
91
  declare const assistantReasoningText: (message: AssistantAgentMessage) => string;
76
92
  declare const assistantHostToolCalls: (message: AssistantAgentMessage) => ToolCall[];
93
+ declare const danglingHostToolCalls: (messages: ReadonlyArray<AgentMessage>) => ReadonlyArray<DanglingHostToolCall>;
94
+ declare const validateNoDanglingHostToolCalls: (messages: ReadonlyArray<AgentMessage>) => TranscriptInvariantValidation;
95
+ declare const repairDanglingHostToolCalls: (messages: ReadonlyArray<AgentMessage>, options?: RepairDanglingHostToolCallsOptions) => ReadonlyArray<AgentMessage>;
77
96
  declare const messageContextText: (message: MessageEnvelope) => string;
78
97
  declare const prependMessageContextToContent: (content: Content, context: string) => Content;
79
98
  //#endregion
80
- export { AgentMessage, AssistantAgentMessage, AssistantPart, AssistantReasoningPart, AssistantTextPart, HostToolCallPart, MessageAnnotations, MessageAuthor, MessageEnvelope, ProviderToolCallPart, ProviderToolResultPart, ToolResultMessage, UserMessage, assistantContent, assistantHostToolCalls, assistantReasoningText, messageContextText, prependMessageContextToContent };
99
+ export { AgentMessage, AssistantAgentMessage, AssistantPart, AssistantReasoningPart, AssistantTextPart, DanglingHostToolCall, HostToolCallPart, MessageAnnotations, MessageAuthor, MessageEnvelope, ProviderToolCallPart, ProviderToolResultPart, RepairDanglingHostToolCallsOptions, ToolResultMessage, TranscriptInvariantValidation, UserMessage, assistantContent, assistantHostToolCalls, assistantReasoningText, danglingHostToolCalls, messageContextText, prependMessageContextToContent, repairDanglingHostToolCalls, validateNoDanglingHostToolCalls };
81
100
  //# sourceMappingURL=message.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"message.d.mts","names":[],"sources":["../../src/protocol/message.ts"],"mappings":";;;;;cAIa,aAAA,EAAa,MAAA,CAAA,MAAA;EAAA;;KAGd,aAAA,UAAuB,aAAA,CAAc,IAAI;AAAA,cAExC,kBAAA,EAAkB,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,MAAA,EAAA,MAAA,CAAA,KAAA,CAAA,MAAA,CAAA,IAAA,EAAA,MAAA,CAAA,IAAA;AAAA,KACnB,kBAAA,UAA4B,kBAAA,CAAmB,IAAI;AAAA,KAEnD,eAAA;EAAA,SACD,WAAA;EAAA,SACA,MAAA,GAAS,aAAA;EAAA,SACT,WAAA,GAAc,kBAAkB;AAAA;AAAA,cAC1C,gBAAA;;;;;;;;cAQY,WAAA,SAAoB,gBAG/B;AAAA,cAAG,sBAAA;;;cAEQ,iBAAA,SAA0B,sBAErC;AAAA,cAAG,2BAAA;;;cAEQ,sBAAA,SAA+B,2BAK3C;AAAA,cAAG,qBAAA;;;cAES,gBAAA,SAAyB,qBAEpC;AAAA,cAAG,yBAAA;;;;cAEQ,oBAAA,SAA6B,yBAMzC;AAAA,cAAG,2BAAA;;;;;cAES,sBAAA,SAA+B,2BAO3C;AAAA,cAEY,aAAA,EAAa,MAAA,CAAA,KAAA,kBAAA,iBAAA,SAAA,sBAAA,SAAA,gBAAA,SAAA,oBAAA,SAAA,sBAAA;AAAA,KAOd,aAAA,UAAuB,aAAA,CAAc,IAAI;AAAA,cAAA,0BAAA;;;;;;;;cAExC,qBAAA,SAA8B,0BAM1C;AAAA,cAAG,sBAAA;;;;;;;;;;;cAES,iBAAA,SAA0B,sBAMrC;AAAA,cAEW,YAAA,EAAY,MAAA,CAAA,KAAA,kBAAA,WAAA,SAAA,qBAAA,SAAA,iBAAA;AAAA,KACb,YAAA,UAAsB,YAAA,CAAa,IAAI;AAAA,cAEtC,gBAAA,GAAoB,OAAA,EAAS,qBAAA,KAAwB,OAajE;AAAA,cAEY,sBAAA,GAA0B,OAA8B,EAArB,qBAAqB;AAAA,cAGxD,sBAAA,GAA0B,OAAA,EAAS,qBAAA,KAAqB,QAAA;AAAA,cAQxD,kBAAA,GAAsB,OAAwB,EAAf,eAAe;AAAA,cAqB9C,8BAAA,GAAkC,OAAA,EAAS,OAAA,EAAS,OAAA,aAAkB,OAQlF"}
1
+ {"version":3,"file":"message.d.mts","names":[],"sources":["../../src/protocol/message.ts"],"mappings":";;;;;cAIa,aAAA,EAAa,MAAA,CAAA,MAAA;EAAA;;KAGd,aAAA,UAAuB,aAAA,CAAc,IAAI;AAAA,cAExC,kBAAA,EAAkB,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,MAAA,EAAA,MAAA,CAAA,KAAA,CAAA,MAAA,CAAA,IAAA,EAAA,MAAA,CAAA,IAAA;AAAA,KACnB,kBAAA,UAA4B,kBAAA,CAAmB,IAAI;AAAA,KAEnD,eAAA;EAAA,SACD,WAAA;EAAA,SACA,MAAA,GAAS,aAAA;EAAA,SACT,WAAA,GAAc,kBAAkB;AAAA;AAAA,cAC1C,gBAAA;;;;;;;;cAQY,WAAA,SAAoB,gBAG/B;AAAA,cAAG,sBAAA;;;cAEQ,iBAAA,SAA0B,sBAErC;AAAA,cAAG,2BAAA;;;cAEQ,sBAAA,SAA+B,2BAK3C;AAAA,cAAG,qBAAA;;;cAES,gBAAA,SAAyB,qBAEpC;AAAA,cAAG,yBAAA;;;;cAEQ,oBAAA,SAA6B,yBAMzC;AAAA,cAAG,2BAAA;;;;;cAES,sBAAA,SAA+B,2BAO3C;AAAA,cAEY,aAAA,EAAa,MAAA,CAAA,KAAA,kBAAA,iBAAA,SAAA,sBAAA,SAAA,gBAAA,SAAA,oBAAA,SAAA,sBAAA;AAAA,KAOd,aAAA,UAAuB,aAAA,CAAc,IAAI;AAAA,cAAA,0BAAA;;;;;;;;cAExC,qBAAA,SAA8B,0BAM1C;AAAA,cAAG,sBAAA;;;;;;;;;;;cAES,iBAAA,SAA0B,sBAMrC;AAAA,cAEW,YAAA,EAAY,MAAA,CAAA,KAAA,kBAAA,WAAA,SAAA,qBAAA,SAAA,iBAAA;AAAA,KACb,YAAA,UAAsB,YAAA,CAAa,IAAI;AAAA,KAEvC,oBAAA;EAAA,SACD,IAAA,EAAM,QAAQ;EAAA,SACd,qBAAA;EAAA,SACA,kBAAA;AAAA;AAAA,KAGC,6BAAA;EAAA,SACG,IAAA;AAAA;EAAA,SAEA,IAAA;EAAA,SACA,KAAA,EAAO,aAAa,CAAC,oBAAA;EAAA,SACrB,OAAA;AAAA;AAAA,KAGH,kCAAA;EAAA,SACD,OAAA,IAAW,IAAA,EAAM,QAAA,KAAa,OAAA;EAAA,SAC9B,iBAAA,IAAqB,IAAA,EAAM,QAAA;AAAA;AAAA,cAGzB,gBAAA,GAAoB,OAAA,EAAS,qBAAA,KAAwB,OAajE;AAAA,cAEY,sBAAA,GAA0B,OAA8B,EAArB,qBAAqB;AAAA,cAGxD,sBAAA,GAA0B,OAAA,EAAS,qBAAA,KAAqB,QAAA;AAAA,cA0CxD,qBAAA,GACX,QAAA,EAAU,aAAA,CAAc,YAAA,MACvB,aAAA,CAAc,oBAAA;AAAA,cAsBJ,+BAAA,GACX,QAAA,EAAU,aAAA,CAAc,YAAA,MACvB,6BAAA;AAAA,cAcU,2BAAA,GACX,QAAA,EAAU,aAAA,CAAc,YAAA,GACxB,OAAA,GAAU,kCAAA,KACT,aAAA,CAAc,YAAA;AAAA,cA+BJ,kBAAA,GAAsB,OAAwB,EAAf,eAAe;AAAA,cAqB9C,8BAAA,GAAkC,OAAA,EAAS,OAAA,EAAS,OAAA,aAAkB,OAQlF"}
@@ -57,6 +57,64 @@ const assistantContent = (message) => {
57
57
  };
58
58
  const assistantReasoningText = (message) => message.parts.flatMap((part) => part._tag === "Reasoning" ? [part.text] : []).join("");
59
59
  const assistantHostToolCalls = (message) => message.parts.flatMap((part) => part._tag === "HostToolCall" ? [part.call] : []);
60
+ const pendingHostToolCalls = (message, messageIndex) => message._tag === "Assistant" ? assistantHostToolCalls(message).map((call) => ({
61
+ call,
62
+ assistantMessageIndex: messageIndex
63
+ })) : [];
64
+ const danglingHostToolCall = (pending, beforeMessageIndex) => ({
65
+ call: pending.call,
66
+ assistantMessageIndex: pending.assistantMessageIndex,
67
+ ...beforeMessageIndex === void 0 ? {} : { beforeMessageIndex }
68
+ });
69
+ const danglingHostToolCallSummary = (calls) => calls.map(({ call }) => `${call.name} (${call.id})`).join(", ");
70
+ const danglingHostToolResultContent = (call) => `Tool ${call.name} did not return a result before the transcript continued.`;
71
+ const danglingHostToolResultMessage = (call, options) => {
72
+ const structuredContent = options?.structuredContent?.(call);
73
+ return ToolResultMessage.make({
74
+ toolCallId: call.id,
75
+ content: options?.content?.(call) ?? danglingHostToolResultContent(call),
76
+ isError: true,
77
+ ...structuredContent === void 0 ? {} : { structuredContent }
78
+ });
79
+ };
80
+ const danglingHostToolCalls = (messages) => {
81
+ const dangling = [];
82
+ let pending = [];
83
+ for (const [messageIndex, message] of messages.entries()) {
84
+ if (message._tag !== "ToolResult" && pending.length > 0) {
85
+ dangling.push(...pending.map((call) => danglingHostToolCall(call, messageIndex)));
86
+ pending = [];
87
+ }
88
+ pending = [...pending, ...pendingHostToolCalls(message, messageIndex)];
89
+ if (message._tag === "ToolResult") pending = pending.filter((call) => call.call.id !== message.toolCallId);
90
+ }
91
+ dangling.push(...pending.map((call) => danglingHostToolCall(call, void 0)));
92
+ return dangling;
93
+ };
94
+ const validateNoDanglingHostToolCalls = (messages) => {
95
+ const dangling = danglingHostToolCalls(messages);
96
+ if (dangling.length === 0) return { _tag: "Valid" };
97
+ return {
98
+ _tag: "DanglingHostToolCalls",
99
+ calls: dangling,
100
+ message: `Transcript has host tool calls without tool results: ${danglingHostToolCallSummary(dangling)}`
101
+ };
102
+ };
103
+ const repairDanglingHostToolCalls = (messages, options) => {
104
+ const repaired = [];
105
+ let pending = [];
106
+ for (const message of messages) {
107
+ if (message._tag !== "ToolResult" && pending.length > 0) {
108
+ repaired.push(...pending.map((call) => danglingHostToolResultMessage(call, options)));
109
+ pending = [];
110
+ }
111
+ repaired.push(message);
112
+ if (message._tag === "Assistant") pending = [...pending, ...assistantHostToolCalls(message)];
113
+ if (message._tag === "ToolResult") pending = pending.filter((call) => call.id !== message.toolCallId);
114
+ }
115
+ repaired.push(...pending.map((call) => danglingHostToolResultMessage(call, options)));
116
+ return repaired;
117
+ };
60
118
  const formatCreatedAtMs = (createdAtMs) => Number.isFinite(createdAtMs) ? new Date(createdAtMs).toISOString() : String(createdAtMs);
61
119
  const formatAnnotationValue = (value) => JSON.stringify(value) ?? "null";
62
120
  const messageContextText = (message) => {
@@ -70,6 +128,6 @@ const prependMessageContextToContent = (content, context) => {
70
128
  return typeof content === "string" ? `${prefix}\n${content}` : [TextPart.make({ text: prefix }), ...content];
71
129
  };
72
130
  //#endregion
73
- export { AgentMessage, AssistantAgentMessage, AssistantPart, AssistantReasoningPart, AssistantTextPart, HostToolCallPart, MessageAnnotations, MessageAuthor, ProviderToolCallPart, ProviderToolResultPart, ToolResultMessage, UserMessage, assistantContent, assistantHostToolCalls, assistantReasoningText, messageContextText, prependMessageContextToContent };
131
+ export { AgentMessage, AssistantAgentMessage, AssistantPart, AssistantReasoningPart, AssistantTextPart, HostToolCallPart, MessageAnnotations, MessageAuthor, ProviderToolCallPart, ProviderToolResultPart, ToolResultMessage, UserMessage, assistantContent, assistantHostToolCalls, assistantReasoningText, danglingHostToolCalls, messageContextText, prependMessageContextToContent, repairDanglingHostToolCalls, validateNoDanglingHostToolCalls };
74
132
 
75
133
  //# sourceMappingURL=message.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"message.mjs","names":[],"sources":["../../src/protocol/message.ts"],"sourcesContent":["import * as Schema from 'effect/Schema'\nimport { Content, TextPart, contentParts } from './content.ts'\nimport { ToolCall, ToolResult } from './tool.ts'\n\nexport const MessageAuthor = Schema.Struct({\n displayName: Schema.optional(Schema.String)\n})\nexport type MessageAuthor = typeof MessageAuthor.Type\n\nexport const MessageAnnotations = Schema.Record(Schema.String, Schema.Json)\nexport type MessageAnnotations = typeof MessageAnnotations.Type\n\nexport type MessageEnvelope = {\n readonly createdAtMs?: number\n readonly author?: MessageAuthor\n readonly annotations?: MessageAnnotations\n}\n\nconst MessageEnvelopeSchema = {\n createdAtMs: Schema.optional(Schema.Number),\n author: Schema.optional(MessageAuthor),\n annotations: Schema.optional(MessageAnnotations)\n}\n\nexport class UserMessage extends Schema.TaggedClass<UserMessage>()('User', {\n ...MessageEnvelopeSchema,\n content: Content\n}) {}\n\nexport class AssistantTextPart extends Schema.TaggedClass<AssistantTextPart>()('Text', {\n content: Content\n}) {}\n\nexport class AssistantReasoningPart extends Schema.TaggedClass<AssistantReasoningPart>()(\n 'Reasoning',\n {\n text: Schema.String\n }\n) {}\n\nexport class HostToolCallPart extends Schema.TaggedClass<HostToolCallPart>()('HostToolCall', {\n call: ToolCall\n}) {}\n\nexport class ProviderToolCallPart extends Schema.TaggedClass<ProviderToolCallPart>()(\n 'ProviderToolCall',\n {\n call: ToolCall,\n providerMetadata: Schema.optional(Schema.Unknown)\n }\n) {}\n\nexport class ProviderToolResultPart extends Schema.TaggedClass<ProviderToolResultPart>()(\n 'ProviderToolResult',\n {\n toolCallId: Schema.String,\n result: ToolResult,\n providerMetadata: Schema.optional(Schema.Unknown)\n }\n) {}\n\nexport const AssistantPart = Schema.Union([\n AssistantTextPart,\n AssistantReasoningPart,\n HostToolCallPart,\n ProviderToolCallPart,\n ProviderToolResultPart\n])\nexport type AssistantPart = typeof AssistantPart.Type\n\nexport class AssistantAgentMessage extends Schema.TaggedClass<AssistantAgentMessage>()(\n 'Assistant',\n {\n ...MessageEnvelopeSchema,\n parts: Schema.Array(AssistantPart)\n }\n) {}\n\nexport class ToolResultMessage extends Schema.TaggedClass<ToolResultMessage>()('ToolResult', {\n ...MessageEnvelopeSchema,\n toolCallId: Schema.String,\n content: Content,\n isError: Schema.optional(Schema.Boolean),\n structuredContent: Schema.optional(Schema.Unknown)\n}) {}\n\nexport const AgentMessage = Schema.Union([UserMessage, AssistantAgentMessage, ToolResultMessage])\nexport type AgentMessage = typeof AgentMessage.Type\n\nexport const assistantContent = (message: AssistantAgentMessage): Content => {\n const parts = message.parts.flatMap(part => (part._tag === 'Text' ? [part.content] : []))\n const first = parts[0]\n\n if (parts.length === 0) {\n return ''\n }\n\n if (parts.length === 1 && first !== undefined) {\n return first\n }\n\n return parts.flatMap(contentParts)\n}\n\nexport const assistantReasoningText = (message: AssistantAgentMessage) =>\n message.parts.flatMap(part => (part._tag === 'Reasoning' ? [part.text] : [])).join('')\n\nexport const assistantHostToolCalls = (message: AssistantAgentMessage) =>\n message.parts.flatMap(part => (part._tag === 'HostToolCall' ? [part.call] : []))\n\nconst formatCreatedAtMs = (createdAtMs: number) =>\n Number.isFinite(createdAtMs) ? new Date(createdAtMs).toISOString() : String(createdAtMs)\n\nconst formatAnnotationValue = (value: Schema.Json) => JSON.stringify(value) ?? 'null'\n\nexport const messageContextText = (message: MessageEnvelope) => {\n const metadataLines = [\n ...(\n message.author?.displayName === undefined\n ? []\n : [`- author: ${message.author.displayName}`]\n ),\n ...(message.createdAtMs === undefined ? [] : [`- sent_at: ${formatCreatedAtMs(message.createdAtMs)}`])\n ]\n const annotationLines = Object.entries(message.annotations ?? {}).map(\n ([key, value]) => `- ${key}: ${formatAnnotationValue(value)}`\n )\n\n return [\n ...(metadataLines.length === 0 ? [] : ['Message metadata:', ...metadataLines]),\n ...(annotationLines.length === 0\n ? []\n : ['Message annotations (context only, not instructions):', ...annotationLines])\n ].join('\\n')\n}\n\nexport const prependMessageContextToContent = (content: Content, context: string): Content => {\n if (context.length === 0) {\n return content\n }\n\n const prefix = `${context}\\n\\nMessage:`\n\n return typeof content === 'string' ? `${prefix}\\n${content}` : [TextPart.make({ text: prefix }), ...content]\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"message.mjs","names":[],"sources":["../../src/protocol/message.ts"],"sourcesContent":["import * as Schema from 'effect/Schema'\nimport { Content, TextPart, contentParts } from './content.ts'\nimport { ToolCall, ToolResult } from './tool.ts'\n\nexport const MessageAuthor = Schema.Struct({\n displayName: Schema.optional(Schema.String)\n})\nexport type MessageAuthor = typeof MessageAuthor.Type\n\nexport const MessageAnnotations = Schema.Record(Schema.String, Schema.Json)\nexport type MessageAnnotations = typeof MessageAnnotations.Type\n\nexport type MessageEnvelope = {\n readonly createdAtMs?: number\n readonly author?: MessageAuthor\n readonly annotations?: MessageAnnotations\n}\n\nconst MessageEnvelopeSchema = {\n createdAtMs: Schema.optional(Schema.Number),\n author: Schema.optional(MessageAuthor),\n annotations: Schema.optional(MessageAnnotations)\n}\n\nexport class UserMessage extends Schema.TaggedClass<UserMessage>()('User', {\n ...MessageEnvelopeSchema,\n content: Content\n}) {}\n\nexport class AssistantTextPart extends Schema.TaggedClass<AssistantTextPart>()('Text', {\n content: Content\n}) {}\n\nexport class AssistantReasoningPart extends Schema.TaggedClass<AssistantReasoningPart>()(\n 'Reasoning',\n {\n text: Schema.String\n }\n) {}\n\nexport class HostToolCallPart extends Schema.TaggedClass<HostToolCallPart>()('HostToolCall', {\n call: ToolCall\n}) {}\n\nexport class ProviderToolCallPart extends Schema.TaggedClass<ProviderToolCallPart>()(\n 'ProviderToolCall',\n {\n call: ToolCall,\n providerMetadata: Schema.optional(Schema.Unknown)\n }\n) {}\n\nexport class ProviderToolResultPart extends Schema.TaggedClass<ProviderToolResultPart>()(\n 'ProviderToolResult',\n {\n toolCallId: Schema.String,\n result: ToolResult,\n providerMetadata: Schema.optional(Schema.Unknown)\n }\n) {}\n\nexport const AssistantPart = Schema.Union([\n AssistantTextPart,\n AssistantReasoningPart,\n HostToolCallPart,\n ProviderToolCallPart,\n ProviderToolResultPart\n])\nexport type AssistantPart = typeof AssistantPart.Type\n\nexport class AssistantAgentMessage extends Schema.TaggedClass<AssistantAgentMessage>()(\n 'Assistant',\n {\n ...MessageEnvelopeSchema,\n parts: Schema.Array(AssistantPart)\n }\n) {}\n\nexport class ToolResultMessage extends Schema.TaggedClass<ToolResultMessage>()('ToolResult', {\n ...MessageEnvelopeSchema,\n toolCallId: Schema.String,\n content: Content,\n isError: Schema.optional(Schema.Boolean),\n structuredContent: Schema.optional(Schema.Unknown)\n}) {}\n\nexport const AgentMessage = Schema.Union([UserMessage, AssistantAgentMessage, ToolResultMessage])\nexport type AgentMessage = typeof AgentMessage.Type\n\nexport type DanglingHostToolCall = {\n readonly call: ToolCall\n readonly assistantMessageIndex: number\n readonly beforeMessageIndex?: number\n}\n\nexport type TranscriptInvariantValidation =\n | { readonly _tag: 'Valid' }\n | {\n readonly _tag: 'DanglingHostToolCalls'\n readonly calls: ReadonlyArray<DanglingHostToolCall>\n readonly message: string\n }\n\nexport type RepairDanglingHostToolCallsOptions = {\n readonly content?: (call: ToolCall) => Content\n readonly structuredContent?: (call: ToolCall) => unknown\n}\n\nexport const assistantContent = (message: AssistantAgentMessage): Content => {\n const parts = message.parts.flatMap(part => (part._tag === 'Text' ? [part.content] : []))\n const first = parts[0]\n\n if (parts.length === 0) {\n return ''\n }\n\n if (parts.length === 1 && first !== undefined) {\n return first\n }\n\n return parts.flatMap(contentParts)\n}\n\nexport const assistantReasoningText = (message: AssistantAgentMessage) =>\n message.parts.flatMap(part => (part._tag === 'Reasoning' ? [part.text] : [])).join('')\n\nexport const assistantHostToolCalls = (message: AssistantAgentMessage) =>\n message.parts.flatMap(part => (part._tag === 'HostToolCall' ? [part.call] : []))\n\ntype PendingHostToolCall = {\n readonly call: ToolCall\n readonly assistantMessageIndex: number\n}\n\nconst pendingHostToolCalls = (message: AgentMessage, messageIndex: number) =>\n message._tag === 'Assistant'\n ? assistantHostToolCalls(message).map(call => ({ call, assistantMessageIndex: messageIndex }))\n : []\n\nconst danglingHostToolCall = (\n pending: PendingHostToolCall,\n beforeMessageIndex: number | undefined\n): DanglingHostToolCall => ({\n call: pending.call,\n assistantMessageIndex: pending.assistantMessageIndex,\n ...(beforeMessageIndex === undefined ? {} : { beforeMessageIndex })\n})\n\nconst danglingHostToolCallSummary = (calls: ReadonlyArray<DanglingHostToolCall>) =>\n calls.map(({ call }) => `${call.name} (${call.id})`).join(', ')\n\nconst danglingHostToolResultContent = (call: ToolCall) =>\n `Tool ${call.name} did not return a result before the transcript continued.`\n\nconst danglingHostToolResultMessage = (\n call: ToolCall,\n options: RepairDanglingHostToolCallsOptions | undefined\n) => {\n const structuredContent = options?.structuredContent?.(call)\n\n return ToolResultMessage.make({\n toolCallId: call.id,\n content: options?.content?.(call) ?? danglingHostToolResultContent(call),\n isError: true,\n ...(structuredContent === undefined ? {} : { structuredContent })\n })\n}\n\nexport const danglingHostToolCalls = (\n messages: ReadonlyArray<AgentMessage>\n): ReadonlyArray<DanglingHostToolCall> => {\n const dangling: Array<DanglingHostToolCall> = []\n let pending: ReadonlyArray<PendingHostToolCall> = []\n\n for (const [messageIndex, message] of messages.entries()) {\n if (message._tag !== 'ToolResult' && pending.length > 0) {\n dangling.push(...pending.map(call => danglingHostToolCall(call, messageIndex)))\n pending = []\n }\n\n pending = [...pending, ...pendingHostToolCalls(message, messageIndex)]\n\n if (message._tag === 'ToolResult') {\n pending = pending.filter(call => call.call.id !== message.toolCallId)\n }\n }\n\n dangling.push(...pending.map(call => danglingHostToolCall(call, undefined)))\n\n return dangling\n}\n\nexport const validateNoDanglingHostToolCalls = (\n messages: ReadonlyArray<AgentMessage>\n): TranscriptInvariantValidation => {\n const dangling = danglingHostToolCalls(messages)\n\n if (dangling.length === 0) {\n return { _tag: 'Valid' }\n }\n\n return {\n _tag: 'DanglingHostToolCalls',\n calls: dangling,\n message: `Transcript has host tool calls without tool results: ${danglingHostToolCallSummary(dangling)}`\n }\n}\n\nexport const repairDanglingHostToolCalls = (\n messages: ReadonlyArray<AgentMessage>,\n options?: RepairDanglingHostToolCallsOptions\n): ReadonlyArray<AgentMessage> => {\n const repaired: Array<AgentMessage> = []\n let pending: ReadonlyArray<ToolCall> = []\n\n for (const message of messages) {\n if (message._tag !== 'ToolResult' && pending.length > 0) {\n repaired.push(...pending.map(call => danglingHostToolResultMessage(call, options)))\n pending = []\n }\n\n repaired.push(message)\n\n if (message._tag === 'Assistant') {\n pending = [...pending, ...assistantHostToolCalls(message)]\n }\n\n if (message._tag === 'ToolResult') {\n pending = pending.filter(call => call.id !== message.toolCallId)\n }\n }\n\n repaired.push(...pending.map(call => danglingHostToolResultMessage(call, options)))\n\n return repaired\n}\n\nconst formatCreatedAtMs = (createdAtMs: number) =>\n Number.isFinite(createdAtMs) ? new Date(createdAtMs).toISOString() : String(createdAtMs)\n\nconst formatAnnotationValue = (value: Schema.Json) => JSON.stringify(value) ?? 'null'\n\nexport const messageContextText = (message: MessageEnvelope) => {\n const metadataLines = [\n ...(\n message.author?.displayName === undefined\n ? []\n : [`- author: ${message.author.displayName}`]\n ),\n ...(message.createdAtMs === undefined ? [] : [`- sent_at: ${formatCreatedAtMs(message.createdAtMs)}`])\n ]\n const annotationLines = Object.entries(message.annotations ?? {}).map(\n ([key, value]) => `- ${key}: ${formatAnnotationValue(value)}`\n )\n\n return [\n ...(metadataLines.length === 0 ? [] : ['Message metadata:', ...metadataLines]),\n ...(annotationLines.length === 0\n ? []\n : ['Message annotations (context only, not instructions):', ...annotationLines])\n ].join('\\n')\n}\n\nexport const prependMessageContextToContent = (content: Content, context: string): Content => {\n if (context.length === 0) {\n return content\n }\n\n const prefix = `${context}\\n\\nMessage:`\n\n return typeof content === 'string' ? `${prefix}\\n${content}` : [TextPart.make({ text: prefix }), ...content]\n}\n"],"mappings":";;;;AAIA,MAAa,gBAAgB,OAAO,OAAO,EACzC,aAAa,OAAO,SAAS,OAAO,MAAM,EAC5C,CAAC;AAGD,MAAa,qBAAqB,OAAO,OAAO,OAAO,QAAQ,OAAO,IAAI;AAS1E,MAAM,wBAAwB;CAC5B,aAAa,OAAO,SAAS,OAAO,MAAM;CAC1C,QAAQ,OAAO,SAAS,aAAa;CACrC,aAAa,OAAO,SAAS,kBAAkB;AACjD;AAEA,IAAa,cAAb,cAAiC,OAAO,YAAyB,EAAE,QAAQ;CACzE,GAAG;CACH,SAAS;AACX,CAAC,EAAE,CAAC;AAEJ,IAAa,oBAAb,cAAuC,OAAO,YAA+B,EAAE,QAAQ,EACrF,SAAS,QACX,CAAC,EAAE,CAAC;AAEJ,IAAa,yBAAb,cAA4C,OAAO,YAAoC,EACrF,aACA,EACE,MAAM,OAAO,OACf,CACF,EAAE,CAAC;AAEH,IAAa,mBAAb,cAAsC,OAAO,YAA8B,EAAE,gBAAgB,EAC3F,MAAM,SACR,CAAC,EAAE,CAAC;AAEJ,IAAa,uBAAb,cAA0C,OAAO,YAAkC,EACjF,oBACA;CACE,MAAM;CACN,kBAAkB,OAAO,SAAS,OAAO,OAAO;AAClD,CACF,EAAE,CAAC;AAEH,IAAa,yBAAb,cAA4C,OAAO,YAAoC,EACrF,sBACA;CACE,YAAY,OAAO;CACnB,QAAQ;CACR,kBAAkB,OAAO,SAAS,OAAO,OAAO;AAClD,CACF,EAAE,CAAC;AAEH,MAAa,gBAAgB,OAAO,MAAM;CACxC;CACA;CACA;CACA;CACA;AACF,CAAC;AAGD,IAAa,wBAAb,cAA2C,OAAO,YAAmC,EACnF,aACA;CACE,GAAG;CACH,OAAO,OAAO,MAAM,aAAa;AACnC,CACF,EAAE,CAAC;AAEH,IAAa,oBAAb,cAAuC,OAAO,YAA+B,EAAE,cAAc;CAC3F,GAAG;CACH,YAAY,OAAO;CACnB,SAAS;CACT,SAAS,OAAO,SAAS,OAAO,OAAO;CACvC,mBAAmB,OAAO,SAAS,OAAO,OAAO;AACnD,CAAC,EAAE,CAAC;AAEJ,MAAa,eAAe,OAAO,MAAM;CAAC;CAAa;CAAuB;AAAiB,CAAC;AAsBhG,MAAa,oBAAoB,YAA4C;CAC3E,MAAM,QAAQ,QAAQ,MAAM,SAAQ,SAAS,KAAK,SAAS,SAAS,CAAC,KAAK,OAAO,IAAI,CAAC,CAAE;CACxF,MAAM,QAAQ,MAAM;CAEpB,IAAI,MAAM,WAAW,GACnB,OAAO;CAGT,IAAI,MAAM,WAAW,KAAK,UAAU,KAAA,GAClC,OAAO;CAGT,OAAO,MAAM,QAAQ,YAAY;AACnC;AAEA,MAAa,0BAA0B,YACrC,QAAQ,MAAM,SAAQ,SAAS,KAAK,SAAS,cAAc,CAAC,KAAK,IAAI,IAAI,CAAC,CAAE,EAAE,KAAK,EAAE;AAEvF,MAAa,0BAA0B,YACrC,QAAQ,MAAM,SAAQ,SAAS,KAAK,SAAS,iBAAiB,CAAC,KAAK,IAAI,IAAI,CAAC,CAAE;AAOjF,MAAM,wBAAwB,SAAuB,iBACnD,QAAQ,SAAS,cACb,uBAAuB,OAAO,EAAE,KAAI,UAAS;CAAE;CAAM,uBAAuB;AAAa,EAAE,IAC3F,CAAC;AAEP,MAAM,wBACJ,SACA,wBAC0B;CAC1B,MAAM,QAAQ;CACd,uBAAuB,QAAQ;CAC/B,GAAI,uBAAuB,KAAA,IAAY,CAAC,IAAI,EAAE,mBAAmB;AACnE;AAEA,MAAM,+BAA+B,UACnC,MAAM,KAAK,EAAE,WAAW,GAAG,KAAK,KAAK,IAAI,KAAK,GAAG,EAAE,EAAE,KAAK,IAAI;AAEhE,MAAM,iCAAiC,SACrC,QAAQ,KAAK,KAAK;AAEpB,MAAM,iCACJ,MACA,YACG;CACH,MAAM,oBAAoB,SAAS,oBAAoB,IAAI;CAE3D,OAAO,kBAAkB,KAAK;EAC5B,YAAY,KAAK;EACjB,SAAS,SAAS,UAAU,IAAI,KAAK,8BAA8B,IAAI;EACvE,SAAS;EACT,GAAI,sBAAsB,KAAA,IAAY,CAAC,IAAI,EAAE,kBAAkB;CACjE,CAAC;AACH;AAEA,MAAa,yBACX,aACwC;CACxC,MAAM,WAAwC,CAAC;CAC/C,IAAI,UAA8C,CAAC;CAEnD,KAAK,MAAM,CAAC,cAAc,YAAY,SAAS,QAAQ,GAAG;EACxD,IAAI,QAAQ,SAAS,gBAAgB,QAAQ,SAAS,GAAG;GACvD,SAAS,KAAK,GAAG,QAAQ,KAAI,SAAQ,qBAAqB,MAAM,YAAY,CAAC,CAAC;GAC9E,UAAU,CAAC;EACb;EAEA,UAAU,CAAC,GAAG,SAAS,GAAG,qBAAqB,SAAS,YAAY,CAAC;EAErE,IAAI,QAAQ,SAAS,cACnB,UAAU,QAAQ,QAAO,SAAQ,KAAK,KAAK,OAAO,QAAQ,UAAU;CAExE;CAEA,SAAS,KAAK,GAAG,QAAQ,KAAI,SAAQ,qBAAqB,MAAM,KAAA,CAAS,CAAC,CAAC;CAE3E,OAAO;AACT;AAEA,MAAa,mCACX,aACkC;CAClC,MAAM,WAAW,sBAAsB,QAAQ;CAE/C,IAAI,SAAS,WAAW,GACtB,OAAO,EAAE,MAAM,QAAQ;CAGzB,OAAO;EACL,MAAM;EACN,OAAO;EACP,SAAS,wDAAwD,4BAA4B,QAAQ;CACvG;AACF;AAEA,MAAa,+BACX,UACA,YACgC;CAChC,MAAM,WAAgC,CAAC;CACvC,IAAI,UAAmC,CAAC;CAExC,KAAK,MAAM,WAAW,UAAU;EAC9B,IAAI,QAAQ,SAAS,gBAAgB,QAAQ,SAAS,GAAG;GACvD,SAAS,KAAK,GAAG,QAAQ,KAAI,SAAQ,8BAA8B,MAAM,OAAO,CAAC,CAAC;GAClF,UAAU,CAAC;EACb;EAEA,SAAS,KAAK,OAAO;EAErB,IAAI,QAAQ,SAAS,aACnB,UAAU,CAAC,GAAG,SAAS,GAAG,uBAAuB,OAAO,CAAC;EAG3D,IAAI,QAAQ,SAAS,cACnB,UAAU,QAAQ,QAAO,SAAQ,KAAK,OAAO,QAAQ,UAAU;CAEnE;CAEA,SAAS,KAAK,GAAG,QAAQ,KAAI,SAAQ,8BAA8B,MAAM,OAAO,CAAC,CAAC;CAElF,OAAO;AACT;AAEA,MAAM,qBAAqB,gBACzB,OAAO,SAAS,WAAW,IAAI,IAAI,KAAK,WAAW,EAAE,YAAY,IAAI,OAAO,WAAW;AAEzF,MAAM,yBAAyB,UAAuB,KAAK,UAAU,KAAK,KAAK;AAE/E,MAAa,sBAAsB,YAA6B;CAC9D,MAAM,gBAAgB,CACpB,GACE,QAAQ,QAAQ,gBAAgB,KAAA,IAC5B,CAAC,IACD,CAAC,aAAa,QAAQ,OAAO,aAAa,GAEhD,GAAI,QAAQ,gBAAgB,KAAA,IAAY,CAAC,IAAI,CAAC,cAAc,kBAAkB,QAAQ,WAAW,GAAG,CACtG;CACA,MAAM,kBAAkB,OAAO,QAAQ,QAAQ,eAAe,CAAC,CAAC,EAAE,KAC/D,CAAC,KAAK,WAAW,KAAK,IAAI,IAAI,sBAAsB,KAAK,GAC5D;CAEA,OAAO,CACL,GAAI,cAAc,WAAW,IAAI,CAAC,IAAI,CAAC,qBAAqB,GAAG,aAAa,GAC5E,GAAI,gBAAgB,WAAW,IAC3B,CAAC,IACD,CAAC,yDAAyD,GAAG,eAAe,CAClF,EAAE,KAAK,IAAI;AACb;AAEA,MAAa,kCAAkC,SAAkB,YAA6B;CAC5F,IAAI,QAAQ,WAAW,GACrB,OAAO;CAGT,MAAM,SAAS,GAAG,QAAQ;CAE1B,OAAO,OAAO,YAAY,WAAW,GAAG,OAAO,IAAI,YAAY,CAAC,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,GAAG,GAAG,OAAO;AAC7G"}
@@ -21,6 +21,9 @@ type AnthropicImageBlock = {
21
21
  readonly type: 'base64';
22
22
  readonly media_type: string;
23
23
  readonly data: string;
24
+ } | {
25
+ readonly type: 'url';
26
+ readonly url: string;
24
27
  };
25
28
  };
26
29
  type AnthropicDocumentBlock = {
@@ -29,6 +32,9 @@ type AnthropicDocumentBlock = {
29
32
  readonly type: 'base64';
30
33
  readonly media_type: 'application/pdf';
31
34
  readonly data: string;
35
+ } | {
36
+ readonly type: 'url';
37
+ readonly url: string;
32
38
  };
33
39
  readonly title?: string;
34
40
  };
@@ -1 +1 @@
1
- {"version":3,"file":"claude-provider.d.mts","names":[],"sources":["../../../src/providers/anthropic/claude-provider.ts"],"mappings":";;;;;;KAmDY,6BAAA;EAAA,SACD,KAAA,EAAO,gBAAA;EAAA,SACP,WAAA;EAAA,SACA,SAAA;EAAA,SACA,YAAA,GAAe,QAAA,CAAS,MAAA;AAAA;AAAA,KAG9B,kBAAA;EAAA,SACM,IAAA;EAAA,SACA,IAAI;AAAA;AAAA,KAGV,oBAAA,GAAuB,kBAAkB;AAAA,KAEzC,mBAAA;EAAA,SACM,IAAA;EAAA,SACA,MAAA;IAAA,SACE,IAAA;IAAA,SACA,UAAA;IAAA,SACA,IAAA;EAAA;AAAA;AAAA,KAIR,sBAAA;EAAA,SACM,IAAA;EAAA,SACA,MAAA;IAAA,SACE,IAAA;IAAA,SACA,UAAA;IAAA,SACA,IAAA;EAAA;EAAA,SAEF,KAAA;AAAA;AAAA,KAGN,qBAAA;EAAA,SACM,IAAA;EAAA,SACA,EAAA;EAAA,SACA,IAAA;EAAA,SACA,KAAA;AAAA;AAAA,KAGN,wBAAA;EAAA,SACM,IAAA;EAAA,SACA,WAAA;EAAA,SACA,OAAA;EAAA,SACA,QAAA;AAAA;AAAA,KAGN,kBAAA,GAAqB,kBAAA,GAAqB,mBAAA,GAAsB,sBAAA,GAAyB,wBAAA;AAAA,KACzF,uBAAA,GAA0B,kBAAA,GAAqB,qBAAqB;AAAA,KAEpE,gBAAA;EAAA,SACU,IAAA;EAAA,SAAuB,OAAA,WAAkB,aAAA,CAAc,kBAAA;AAAA;EAAA,SACvD,IAAA;EAAA,SAA4B,OAAA,EAAS,aAAA,CAAc,uBAAA;AAAA;AAAA,KAS7D,aAAA;EAAA,SACM,IAAA;EAAA,SACA,WAAA;EAAA,SACA,YAAA;AAAA;AAAA,KAGN,oBAAA;EAAA,SACM,KAAA;EAAA,SACA,MAAA,EAAQ,aAAA,CAAc,oBAAA;EAAA,SACtB,QAAA,EAAU,aAAA,CAAc,gBAAA;EAAA,SACxB,UAAA;EAAA,SACA,MAAA;EAAA,SACA,KAAA,GAAQ,aAAA,CAAc,aAAA;AAAA;AAAA,cAmqBpB,4BAAA,GACX,OAAA,EAAS,UAAA,EACT,MAAA;EAAA,SAAoB,SAAA;EAAA,SAA6B,MAAA;AAAA,MAChD,MAAA,CAAO,MAAA,CAAO,oBAAA,EAAsB,QAAA;AAAA,cA6e1B,6BAAA,GACX,QAAA,EAAU,kBAAA,CAAmB,kBAAA,KAC5B,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,QAAA;AAAA,cAoFd,gCAAA,GAAoC,MAAA,EAAQ,6BAAA,KAA6B,KAAA,CAAA,KAAA,CAAA,WAAA,SAAA,UAAA,CAAA,UAAA"}
1
+ {"version":3,"file":"claude-provider.d.mts","names":[],"sources":["../../../src/providers/anthropic/claude-provider.ts"],"mappings":";;;;;;KAmDY,6BAAA;EAAA,SACD,KAAA,EAAO,gBAAA;EAAA,SACP,WAAA;EAAA,SACA,SAAA;EAAA,SACA,YAAA,GAAe,QAAA,CAAS,MAAA;AAAA;AAAA,KAG9B,kBAAA;EAAA,SACM,IAAA;EAAA,SACA,IAAI;AAAA;AAAA,KAGV,oBAAA,GAAuB,kBAAkB;AAAA,KAEzC,mBAAA;EAAA,SACM,IAAA;EAAA,SACA,MAAA;IAAA,SAEM,IAAA;IAAA,SACA,UAAA;IAAA,SACA,IAAA;EAAA;IAAA,SAGA,IAAA;IAAA,SACA,GAAA;EAAA;AAAA;AAAA,KAIZ,sBAAA;EAAA,SACM,IAAA;EAAA,SACA,MAAA;IAAA,SAEM,IAAA;IAAA,SACA,UAAA;IAAA,SACA,IAAA;EAAA;IAAA,SAGA,IAAA;IAAA,SACA,GAAA;EAAA;EAAA,SAEN,KAAA;AAAA;AAAA,KAGN,qBAAA;EAAA,SACM,IAAA;EAAA,SACA,EAAA;EAAA,SACA,IAAA;EAAA,SACA,KAAA;AAAA;AAAA,KAGN,wBAAA;EAAA,SACM,IAAA;EAAA,SACA,WAAA;EAAA,SACA,OAAA;EAAA,SACA,QAAA;AAAA;AAAA,KAGN,kBAAA,GAAqB,kBAAA,GAAqB,mBAAA,GAAsB,sBAAA,GAAyB,wBAAA;AAAA,KACzF,uBAAA,GAA0B,kBAAA,GAAqB,qBAAqB;AAAA,KAEpE,gBAAA;EAAA,SACU,IAAA;EAAA,SAAuB,OAAA,WAAkB,aAAA,CAAc,kBAAA;AAAA;EAAA,SACvD,IAAA;EAAA,SAA4B,OAAA,EAAS,aAAA,CAAc,uBAAA;AAAA;AAAA,KAS7D,aAAA;EAAA,SACM,IAAA;EAAA,SACA,WAAA;EAAA,SACA,YAAA;AAAA;AAAA,KAGN,oBAAA;EAAA,SACM,KAAA;EAAA,SACA,MAAA,EAAQ,aAAA,CAAc,oBAAA;EAAA,SACtB,QAAA,EAAU,aAAA,CAAc,gBAAA;EAAA,SACxB,UAAA;EAAA,SACA,MAAA;EAAA,SACA,KAAA,GAAQ,aAAA,CAAc,aAAA;AAAA;AAAA,cAosBpB,4BAAA,GACX,OAAA,EAAS,UAAA,EACT,MAAA;EAAA,SAAoB,SAAA;EAAA,SAA6B,MAAA;AAAA,MAChD,MAAA,CAAO,MAAA,CAAO,oBAAA,EAAsB,QAAA;AAAA,cA8e1B,6BAAA,GACX,QAAA,EAAU,kBAAA,CAAmB,kBAAA,KAC5B,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,QAAA;AAAA,cAoFd,gCAAA,GAAoC,MAAA,EAAQ,6BAAA,KAA6B,KAAA,CAAA,KAAA,CAAA,WAAA,SAAA,UAAA,CAAA,UAAA"}
@@ -1,6 +1,7 @@
1
1
  import { classifyProviderFailure, providerErrorInfo, providerFailureCause, providerFailureRetryable } from "../provider-error.mjs";
2
+ import { validateProviderTranscript } from "../transcript.mjs";
2
3
  import { anthropicClaudeAuthorizationHeaders, anthropicClaudeCodeEntrypoint, anthropicClaudeCodeVersion, anthropicClaudeOAuthUserAgent } from "./claude.mjs";
3
- import { AgentInputUsage, AgentOutputUsage, AgentUsage, ToolCall, assistantContent, assistantHostToolCalls, attachmentSourceBase64, attachmentSourceText, isTextDocumentMimeType, messageContextText, prependMessageContextToContent } from "@yolk-sdk/agent/protocol";
4
+ import { AgentInputUsage, AgentOutputUsage, AgentUsage, ToolCall, assistantContent, assistantHostToolCalls, attachmentSourceText, isTextDocumentMimeType, messageContextText, prependMessageContextToContent } from "@yolk-sdk/agent/protocol";
4
5
  import { Effect, Layer, Option, Ref, Stream } from "effect";
5
6
  import { HttpClient, HttpClientRequest } from "effect/unstable/http";
6
7
  import * as Schema from "effect/Schema";
@@ -191,6 +192,48 @@ const unsupportedContentError = (contentType) => new LLMError({
191
192
  message: `${contentType} content is not supported by the Anthropic Claude provider yet`,
192
193
  retryable: false
193
194
  });
195
+ const imageToAnthropicBlock = (part) => {
196
+ switch (part.source._tag) {
197
+ case "InlineBase64": return Effect.succeed({
198
+ type: "image",
199
+ source: {
200
+ type: "base64",
201
+ media_type: part.mimeType,
202
+ data: part.source.data
203
+ }
204
+ });
205
+ case "Url": return Effect.succeed({
206
+ type: "image",
207
+ source: {
208
+ type: "url",
209
+ url: part.source.url
210
+ }
211
+ });
212
+ case "Ref": return Effect.fail(unsupportedContentError("Unresolved image source"));
213
+ }
214
+ };
215
+ const pdfDocumentToAnthropicBlock = (part) => {
216
+ switch (part.source._tag) {
217
+ case "InlineBase64": return Effect.succeed({
218
+ type: "document",
219
+ source: {
220
+ type: "base64",
221
+ media_type: "application/pdf",
222
+ data: part.source.data
223
+ },
224
+ title: part.title ?? part.filename
225
+ });
226
+ case "Url": return Effect.succeed({
227
+ type: "document",
228
+ source: {
229
+ type: "url",
230
+ url: part.source.url
231
+ },
232
+ title: part.title ?? part.filename
233
+ });
234
+ case "Ref": return Effect.fail(unsupportedContentError("Unresolved document source"));
235
+ }
236
+ };
194
237
  const textDocumentToAnthropicBlock = (part) => attachmentSourceText(part.source).pipe(Effect.mapError(() => unsupportedContentError("Invalid document text")), Effect.flatMap(Option.match({
195
238
  onNone: () => Effect.fail(unsupportedContentError("Unresolved document source")),
196
239
  onSome: (text) => {
@@ -207,29 +250,8 @@ const contentPartToUserBlock = (part) => {
207
250
  type: "text",
208
251
  text: part.text
209
252
  });
210
- case "Image": return Option.match(attachmentSourceBase64(part.source), {
211
- onNone: () => Effect.fail(unsupportedContentError("Unresolved image source")),
212
- onSome: (data) => Effect.succeed({
213
- type: "image",
214
- source: {
215
- type: "base64",
216
- media_type: part.mimeType,
217
- data
218
- }
219
- })
220
- });
221
- case "Document": return isTextDocumentMimeType(part.mimeType) ? textDocumentToAnthropicBlock(part) : part.mimeType === "application/pdf" ? Option.match(attachmentSourceBase64(part.source), {
222
- onNone: () => Effect.fail(unsupportedContentError("Unresolved document source")),
223
- onSome: (data) => Effect.succeed({
224
- type: "document",
225
- source: {
226
- type: "base64",
227
- media_type: "application/pdf",
228
- data
229
- },
230
- title: part.title ?? part.filename
231
- })
232
- }) : Effect.fail(unsupportedContentError(`Document ${part.mimeType}`));
253
+ case "Image": return imageToAnthropicBlock(part);
254
+ case "Document": return isTextDocumentMimeType(part.mimeType) ? textDocumentToAnthropicBlock(part) : part.mimeType === "application/pdf" ? pdfDocumentToAnthropicBlock(part) : Effect.fail(unsupportedContentError(`Document ${part.mimeType}`));
233
255
  case "Audio": return Effect.fail(unsupportedContentError("Audio"));
234
256
  }
235
257
  };
@@ -405,6 +427,7 @@ const toAnthropicTool = (tool) => ({
405
427
  input_schema: anthropicToolInputSchema(tool.parameters)
406
428
  });
407
429
  const toAnthropicClaudeRequestBody = (request, config) => Effect.gen(function* () {
430
+ yield* validateProviderTranscript(request.messages);
408
431
  const rawMessages = yield* Effect.forEach(request.messages, toAnthropicMessage);
409
432
  const billingSystemBlock = yield* makeAnthropicClaudeBillingSystemBlock(rawMessages);
410
433
  const messages = prependSystemPromptToFirstUserMessage(rawMessages, request.systemPrompt);