@draht/ai 2026.10.20 → 2026.10.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.
- package/dist/api/anthropic-messages.d.ts.map +1 -1
- package/dist/api/anthropic-messages.js +155 -111
- package/dist/api/anthropic-messages.js.map +1 -1
- package/dist/api/azure-openai-config.d.ts +15 -0
- package/dist/api/azure-openai-config.d.ts.map +1 -0
- package/dist/api/azure-openai-config.js +76 -0
- package/dist/api/azure-openai-config.js.map +1 -0
- package/dist/api/azure-openai-responses.d.ts +3 -6
- package/dist/api/azure-openai-responses.d.ts.map +1 -1
- package/dist/api/azure-openai-responses.js +19 -83
- package/dist/api/azure-openai-responses.js.map +1 -1
- package/dist/api/bedrock-converse-stream.d.ts.map +1 -1
- package/dist/api/bedrock-converse-stream.js +86 -22
- package/dist/api/bedrock-converse-stream.js.map +1 -1
- package/dist/api/classifier-shared.d.ts +21 -0
- package/dist/api/classifier-shared.d.ts.map +1 -0
- package/dist/api/classifier-shared.js +99 -0
- package/dist/api/classifier-shared.js.map +1 -0
- package/dist/api/cloudflare-workers-ai-system-one.d.ts.map +1 -1
- package/dist/api/cloudflare-workers-ai-system-one.js +15 -9
- package/dist/api/cloudflare-workers-ai-system-one.js.map +1 -1
- package/dist/api/google-generative-ai.js +4 -4
- package/dist/api/google-generative-ai.js.map +1 -1
- package/dist/api/google-shared.d.ts.map +1 -1
- package/dist/api/google-shared.js +3 -1
- package/dist/api/google-shared.js.map +1 -1
- package/dist/api/google-vertex.d.ts.map +1 -1
- package/dist/api/google-vertex.js +9 -9
- package/dist/api/google-vertex.js.map +1 -1
- package/dist/api/lazy.d.ts +7 -2
- package/dist/api/lazy.d.ts.map +1 -1
- package/dist/api/lazy.js +28 -8
- package/dist/api/lazy.js.map +1 -1
- package/dist/api/llama-cpp-classify.d.ts.map +1 -1
- package/dist/api/llama-cpp-classify.js +4 -1
- package/dist/api/llama-cpp-classify.js.map +1 -1
- package/dist/api/mistral-conversations.d.ts.map +1 -1
- package/dist/api/mistral-conversations.js +38 -18
- package/dist/api/mistral-conversations.js.map +1 -1
- package/dist/api/openai-codex-responses.d.ts.map +1 -1
- package/dist/api/openai-codex-responses.js +21 -13
- package/dist/api/openai-codex-responses.js.map +1 -1
- package/dist/api/openai-completions.d.ts.map +1 -1
- package/dist/api/openai-completions.js +49 -38
- package/dist/api/openai-completions.js.map +1 -1
- package/dist/api/openai-decisions.d.ts +4 -0
- package/dist/api/openai-decisions.d.ts.map +1 -0
- package/dist/api/openai-decisions.js +162 -0
- package/dist/api/openai-decisions.js.map +1 -0
- package/dist/api/openai-decisions.lazy.d.ts +3 -0
- package/dist/api/openai-decisions.lazy.d.ts.map +1 -0
- package/dist/api/openai-decisions.lazy.js +4 -0
- package/dist/api/openai-decisions.lazy.js.map +1 -0
- package/dist/api/openai-responses-shared.d.ts +26 -0
- package/dist/api/openai-responses-shared.d.ts.map +1 -1
- package/dist/api/openai-responses-shared.js +82 -16
- package/dist/api/openai-responses-shared.js.map +1 -1
- package/dist/api/openai-responses.d.ts.map +1 -1
- package/dist/api/openai-responses.js +47 -18
- package/dist/api/openai-responses.js.map +1 -1
- package/dist/api/openrouter-images.d.ts.map +1 -1
- package/dist/api/openrouter-images.js +4 -3
- package/dist/api/openrouter-images.js.map +1 -1
- package/dist/api/pi-messages.d.ts.map +1 -1
- package/dist/api/pi-messages.js +3 -3
- package/dist/api/pi-messages.js.map +1 -1
- package/dist/api/simple-options.d.ts +2 -1
- package/dist/api/simple-options.d.ts.map +1 -1
- package/dist/api/simple-options.js +12 -2
- package/dist/api/simple-options.js.map +1 -1
- package/dist/api/system-one-shared.d.ts +0 -1
- package/dist/api/system-one-shared.d.ts.map +1 -1
- package/dist/api/system-one-shared.js +5 -89
- package/dist/api/system-one-shared.js.map +1 -1
- package/dist/api/transform-messages.d.ts +16 -1
- package/dist/api/transform-messages.d.ts.map +1 -1
- package/dist/api/transform-messages.js +28 -15
- package/dist/api/transform-messages.js.map +1 -1
- package/dist/api/typesafe-system-one.d.ts.map +1 -1
- package/dist/api/typesafe-system-one.js +2 -1
- package/dist/api/typesafe-system-one.js.map +1 -1
- package/dist/auth/oauth/anthropic.d.ts.map +1 -1
- package/dist/auth/oauth/anthropic.js +65 -7
- package/dist/auth/oauth/anthropic.js.map +1 -1
- package/dist/auth/oauth/load.d.ts +2 -0
- package/dist/auth/oauth/load.d.ts.map +1 -1
- package/dist/auth/oauth/load.js +5 -0
- package/dist/auth/oauth/load.js.map +1 -1
- package/dist/auth/oauth/openai-chatgpt.d.ts.map +1 -1
- package/dist/auth/oauth/openai-chatgpt.js +11 -14
- package/dist/auth/oauth/openai-chatgpt.js.map +1 -1
- package/dist/auth/oauth/openai-codex.d.ts.map +1 -1
- package/dist/auth/oauth/openai-codex.js +7 -5
- package/dist/auth/oauth/openai-codex.js.map +1 -1
- package/dist/auth/oauth/opencode-go.d.ts +3 -12
- package/dist/auth/oauth/opencode-go.d.ts.map +1 -1
- package/dist/auth/oauth/opencode-go.js +229 -34
- package/dist/auth/oauth/opencode-go.js.map +1 -1
- package/dist/auth/resolve.d.ts +16 -1
- package/dist/auth/resolve.d.ts.map +1 -1
- package/dist/auth/resolve.js +51 -27
- package/dist/auth/resolve.js.map +1 -1
- package/dist/auth/types.d.ts +5 -0
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/auth/types.js.map +1 -1
- package/dist/bun-oauth.d.ts.map +1 -1
- package/dist/bun-oauth.js +2 -1
- package/dist/bun-oauth.js.map +1 -1
- package/dist/env-api-keys.js +1 -1
- package/dist/env-api-keys.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/models.d.ts +9 -0
- package/dist/models.d.ts.map +1 -1
- package/dist/models.generated.d.ts +4 -4
- package/dist/models.generated.d.ts.map +1 -1
- package/dist/models.generated.js +4 -4
- package/dist/models.generated.js.map +1 -1
- package/dist/models.js +26 -14
- package/dist/models.js.map +1 -1
- package/dist/providers/all.js +2 -2
- package/dist/providers/all.js.map +1 -1
- package/dist/providers/azure.d.ts +3 -0
- package/dist/providers/azure.d.ts.map +1 -0
- package/dist/providers/azure.js +46 -0
- package/dist/providers/azure.js.map +1 -0
- package/dist/providers/azure.models.d.ts +6 -0
- package/dist/providers/azure.models.d.ts.map +1 -0
- package/dist/providers/azure.models.js +8 -0
- package/dist/providers/azure.models.js.map +1 -0
- package/dist/providers/compat-schema.d.ts +491 -0
- package/dist/providers/compat-schema.d.ts.map +1 -0
- package/dist/providers/compat-schema.js +386 -0
- package/dist/providers/compat-schema.js.map +1 -0
- package/dist/providers/data/.manifest.json +1 -1
- package/dist/providers/data/amazon-bedrock.json +1 -1
- package/dist/providers/data/anthropic.json +1 -1
- package/dist/providers/data/azure.json +1 -0
- package/dist/providers/data/baseten.json +1 -1
- package/dist/providers/data/cerebras.json +1 -1
- package/dist/providers/data/cloudflare-ai-gateway.json +1 -1
- package/dist/providers/data/cloudflare-workers-ai.json +1 -1
- package/dist/providers/data/fireworks.json +1 -1
- package/dist/providers/data/github-copilot.json +1 -1
- package/dist/providers/data/google-vertex.json +1 -1
- package/dist/providers/data/google.json +1 -1
- package/dist/providers/data/groq.json +1 -1
- package/dist/providers/data/huggingface.json +1 -1
- package/dist/providers/data/kimi-coding.json +1 -1
- package/dist/providers/data/meta.json +1 -1
- package/dist/providers/data/minimax-cn.json +1 -1
- package/dist/providers/data/minimax.json +1 -1
- package/dist/providers/data/mistral.json +1 -1
- package/dist/providers/data/moonshotai-cn.json +1 -1
- package/dist/providers/data/nvidia.json +1 -1
- package/dist/providers/data/openai-codex.json +1 -1
- package/dist/providers/data/openai.json +1 -1
- package/dist/providers/data/opencode-go.json +1 -1
- package/dist/providers/data/opencode.json +1 -1
- package/dist/providers/data/openrouter.json +1 -1
- package/dist/providers/data/qwen-token-plan-cn.json +1 -1
- package/dist/providers/data/qwen-token-plan.json +1 -1
- package/dist/providers/data/radius.json +1 -1
- package/dist/providers/data/together.json +1 -1
- package/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/dist/providers/data/xai.json +1 -1
- package/dist/providers/data/xiaomi-token-plan-ams.json +1 -1
- package/dist/providers/data/xiaomi-token-plan-cn.json +1 -1
- package/dist/providers/data/xiaomi-token-plan-sgp.json +1 -1
- package/dist/providers/data/xiaomi.json +1 -1
- package/dist/providers/data/zai-coding-cn.json +1 -1
- package/dist/providers/faux.d.ts.map +1 -1
- package/dist/providers/faux.js +25 -8
- package/dist/providers/faux.js.map +1 -1
- package/dist/providers/kimi-coding.d.ts +1 -1
- package/dist/providers/kimi-coding.js +3 -3
- package/dist/providers/kimi-coding.js.map +1 -1
- package/dist/providers/model-schema.d.ts +91 -0
- package/dist/providers/model-schema.d.ts.map +1 -0
- package/dist/providers/model-schema.js +57 -0
- package/dist/providers/model-schema.js.map +1 -0
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +12 -3
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/opencode-go.d.ts +3 -1
- package/dist/providers/opencode-go.d.ts.map +1 -1
- package/dist/providers/opencode-go.js +4 -3
- package/dist/providers/opencode-go.js.map +1 -1
- package/dist/providers/opencode.d.ts.map +1 -1
- package/dist/providers/opencode.js +10 -2
- package/dist/providers/opencode.js.map +1 -1
- package/dist/providers/openrouter-api.d.ts +40 -0
- package/dist/providers/openrouter-api.d.ts.map +1 -0
- package/dist/providers/openrouter-api.js +41 -0
- package/dist/providers/openrouter-api.js.map +1 -0
- package/dist/providers/openrouter.d.ts +11 -1
- package/dist/providers/openrouter.d.ts.map +1 -1
- package/dist/providers/openrouter.js +52 -1
- package/dist/providers/openrouter.js.map +1 -1
- package/dist/providers/radius.d.ts.map +1 -1
- package/dist/providers/radius.js +4 -12
- package/dist/providers/radius.js.map +1 -1
- package/dist/telemetry.d.ts +288 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +191 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/types.d.ts +42 -310
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/estimate.js +1 -1
- package/dist/utils/estimate.js.map +1 -1
- package/dist/utils/event-stream.d.ts +10 -1
- package/dist/utils/event-stream.d.ts.map +1 -1
- package/dist/utils/event-stream.js +25 -0
- package/dist/utils/event-stream.js.map +1 -1
- package/dist/utils/identity.d.ts +65 -0
- package/dist/utils/identity.d.ts.map +1 -0
- package/dist/utils/identity.js +145 -0
- package/dist/utils/identity.js.map +1 -0
- package/dist/utils/json-parse.d.ts +10 -0
- package/dist/utils/json-parse.d.ts.map +1 -1
- package/dist/utils/json-parse.js +26 -1
- package/dist/utils/json-parse.js.map +1 -1
- package/dist/utils/model-operations.d.ts +3 -1
- package/dist/utils/model-operations.d.ts.map +1 -1
- package/dist/utils/model-operations.js +6 -0
- package/dist/utils/model-operations.js.map +1 -1
- package/dist/utils/overflow.d.ts +1 -0
- package/dist/utils/overflow.d.ts.map +1 -1
- package/dist/utils/overflow.js +6 -1
- package/dist/utils/overflow.js.map +1 -1
- package/dist/utils/provider-retry.d.ts +2 -0
- package/dist/utils/provider-retry.d.ts.map +1 -1
- package/dist/utils/provider-retry.js +2 -0
- package/dist/utils/provider-retry.js.map +1 -1
- package/dist/utils/retry.d.ts.map +1 -1
- package/dist/utils/retry.js +30 -10
- package/dist/utils/retry.js.map +1 -1
- package/dist/utils/transcript.d.ts +27 -10
- package/dist/utils/transcript.d.ts.map +1 -1
- package/dist/utils/transcript.js +34 -20
- package/dist/utils/transcript.js.map +1 -1
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +3 -0
- package/dist/utils/validation.js.map +1 -1
- package/dist/utils/version.d.ts +2 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +5 -0
- package/dist/utils/version.js.map +1 -0
- package/package.json +5 -5
- package/dist/providers/azure-openai-responses.d.ts +0 -3
- package/dist/providers/azure-openai-responses.d.ts.map +0 -1
- package/dist/providers/azure-openai-responses.js +0 -14
- package/dist/providers/azure-openai-responses.js.map +0 -1
- package/dist/providers/azure-openai-responses.models.d.ts +0 -6
- package/dist/providers/azure-openai-responses.models.d.ts.map +0 -1
- package/dist/providers/azure-openai-responses.models.js +0 -8
- package/dist/providers/azure-openai-responses.models.js.map +0 -1
- package/dist/providers/data/azure-openai-responses.json +0 -1
- package/dist/utils/assistant-message-frame.d.ts +0 -77
- package/dist/utils/assistant-message-frame.d.ts.map +0 -1
- package/dist/utils/assistant-message-frame.js +0 -425
- package/dist/utils/assistant-message-frame.js.map +0 -1
- package/dist/utils/draht-user-agent.d.ts +0 -2
- package/dist/utils/draht-user-agent.d.ts.map +0 -1
- package/dist/utils/draht-user-agent.js +0 -12
- package/dist/utils/draht-user-agent.js.map +0 -1
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import type { AssistantMessage, AssistantMessageEvent, TextContent, ThinkingContent, ToolCall } from "../types.ts";
|
|
2
|
-
/**
|
|
3
|
-
* Compact, replayable assistant-message progress. Terminal settlement is
|
|
4
|
-
* intentionally excluded and must be persisted separately.
|
|
5
|
-
*/
|
|
6
|
-
export type AssistantMessageFrame = {
|
|
7
|
-
type: "start";
|
|
8
|
-
partial: AssistantMessage;
|
|
9
|
-
} | {
|
|
10
|
-
type: "text_start";
|
|
11
|
-
contentIndex: number;
|
|
12
|
-
content: TextContent;
|
|
13
|
-
} | {
|
|
14
|
-
type: "text_delta";
|
|
15
|
-
contentIndex: number;
|
|
16
|
-
delta: string;
|
|
17
|
-
} | {
|
|
18
|
-
type: "text_end";
|
|
19
|
-
contentIndex: number;
|
|
20
|
-
content: string;
|
|
21
|
-
textSignature?: string;
|
|
22
|
-
} | {
|
|
23
|
-
type: "thinking_start";
|
|
24
|
-
contentIndex: number;
|
|
25
|
-
content: ThinkingContent;
|
|
26
|
-
} | {
|
|
27
|
-
type: "thinking_delta";
|
|
28
|
-
contentIndex: number;
|
|
29
|
-
delta: string;
|
|
30
|
-
} | {
|
|
31
|
-
type: "thinking_end";
|
|
32
|
-
contentIndex: number;
|
|
33
|
-
content: string;
|
|
34
|
-
thinkingSignature?: string;
|
|
35
|
-
redacted?: boolean;
|
|
36
|
-
} | {
|
|
37
|
-
type: "toolcall_start";
|
|
38
|
-
contentIndex: number;
|
|
39
|
-
toolCall: ToolCall;
|
|
40
|
-
} | {
|
|
41
|
-
type: "toolcall_checkpoint";
|
|
42
|
-
contentIndex: number;
|
|
43
|
-
json: string;
|
|
44
|
-
} | {
|
|
45
|
-
type: "toolcall_delta";
|
|
46
|
-
contentIndex: number;
|
|
47
|
-
delta: string;
|
|
48
|
-
} | {
|
|
49
|
-
type: "toolcall_end";
|
|
50
|
-
contentIndex: number;
|
|
51
|
-
id: string;
|
|
52
|
-
name: string;
|
|
53
|
-
arguments: ToolCall["arguments"];
|
|
54
|
-
thoughtSignature?: string;
|
|
55
|
-
namespace?: string;
|
|
56
|
-
};
|
|
57
|
-
/**
|
|
58
|
-
* Encodes one assistant stream. `partial` remains a shared live accumulator;
|
|
59
|
-
* the encoder uses per-block offsets to avoid replaying deltas already visible
|
|
60
|
-
* when an older queued event is consumed.
|
|
61
|
-
*/
|
|
62
|
-
export declare class AssistantMessageFrameEncoder {
|
|
63
|
-
private started;
|
|
64
|
-
private terminal;
|
|
65
|
-
private readonly blocks;
|
|
66
|
-
encode(event: AssistantMessageEvent): AssistantMessageFrame | undefined;
|
|
67
|
-
private startBlock;
|
|
68
|
-
private block;
|
|
69
|
-
private endBlock;
|
|
70
|
-
private encodeTextDelta;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Replay compact frames without mutating them. Returns `undefined` when the
|
|
74
|
-
* iterable contains no start frame.
|
|
75
|
-
*/
|
|
76
|
-
export declare function reduceAssistantMessageFrames(frames: Iterable<AssistantMessageFrame>): AssistantMessage | undefined;
|
|
77
|
-
//# sourceMappingURL=assistant-message-frame.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"assistant-message-frame.d.ts","sourceRoot":"","sources":["../../src/utils/assistant-message-frame.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGnH;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAC9B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,gBAAgB,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,GAClE;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GACnF;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,eAAe,CAAA;CAAE,GAC1E;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC/D;IACA,IAAI,EAAE,cAAc,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;CAClB,GACD;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,GACpE;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnE;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC/D;IACA,IAAI,EAAE,cAAc,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAqGL;;;;GAIG;AACH,qBAAa,4BAA4B;IACxC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwC;IAE/D,MAAM,CAAC,KAAK,EAAE,qBAAqB,GAAG,qBAAqB,GAAG,SAAS,CA6ItE;IAED,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,KAAK;IAUb,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,eAAe;CAgBvB;AA0CD;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,QAAQ,CAAC,qBAAqB,CAAC,GAAG,gBAAgB,GAAG,SAAS,CAsHlH"}
|
|
@@ -1,425 +0,0 @@
|
|
|
1
|
-
import { parseStreamingJson } from "./json-parse.js";
|
|
2
|
-
function cloneTextContent(content) {
|
|
3
|
-
return {
|
|
4
|
-
type: "text",
|
|
5
|
-
text: content.text,
|
|
6
|
-
...(content.textSignature === undefined ? {} : { textSignature: content.textSignature }),
|
|
7
|
-
};
|
|
8
|
-
}
|
|
9
|
-
function cloneThinkingContent(content) {
|
|
10
|
-
return {
|
|
11
|
-
type: "thinking",
|
|
12
|
-
thinking: content.thinking,
|
|
13
|
-
...(content.thinkingSignature === undefined ? {} : { thinkingSignature: content.thinkingSignature }),
|
|
14
|
-
...(content.redacted === undefined ? {} : { redacted: content.redacted }),
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
function cloneToolCall(toolCall) {
|
|
18
|
-
return {
|
|
19
|
-
type: "toolCall",
|
|
20
|
-
id: toolCall.id,
|
|
21
|
-
name: toolCall.name,
|
|
22
|
-
arguments: structuredClone(toolCall.arguments),
|
|
23
|
-
...(toolCall.thoughtSignature === undefined ? {} : { thoughtSignature: toolCall.thoughtSignature }),
|
|
24
|
-
...(toolCall.namespace === undefined ? {} : { namespace: toolCall.namespace }),
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
function cloneStartMessage(message) {
|
|
28
|
-
return {
|
|
29
|
-
role: "assistant",
|
|
30
|
-
content: [],
|
|
31
|
-
api: message.api,
|
|
32
|
-
provider: message.provider,
|
|
33
|
-
model: message.model,
|
|
34
|
-
...(message.responseModel === undefined ? {} : { responseModel: message.responseModel }),
|
|
35
|
-
...(message.responseId === undefined ? {} : { responseId: message.responseId }),
|
|
36
|
-
...(message.providerThinkingLevel === undefined ? {} : { providerThinkingLevel: message.providerThinkingLevel }),
|
|
37
|
-
...(message.diagnostics === undefined ? {} : { diagnostics: structuredClone(message.diagnostics) }),
|
|
38
|
-
usage: structuredClone(message.usage),
|
|
39
|
-
stopReason: "pending",
|
|
40
|
-
timestamp: message.timestamp,
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
function assertContentIndex(contentIndex) {
|
|
44
|
-
if (!Number.isSafeInteger(contentIndex) || contentIndex < 0) {
|
|
45
|
-
throw new Error(`Invalid assistant message frame contentIndex: ${contentIndex}`);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
function eventBlock(event) {
|
|
49
|
-
assertContentIndex(event.contentIndex);
|
|
50
|
-
const block = event.partial.content[event.contentIndex];
|
|
51
|
-
if (!block) {
|
|
52
|
-
throw new Error(`${event.type} event has no content block at index ${event.contentIndex}`);
|
|
53
|
-
}
|
|
54
|
-
return block;
|
|
55
|
-
}
|
|
56
|
-
function serializedArguments(argumentsValue) {
|
|
57
|
-
const serialized = JSON.stringify(argumentsValue);
|
|
58
|
-
if (serialized === undefined)
|
|
59
|
-
throw new Error("Tool-call arguments are not JSON-serializable");
|
|
60
|
-
return serialized;
|
|
61
|
-
}
|
|
62
|
-
const EMPTY_PARSED_TOOL_ARGUMENTS = serializedArguments(parseStreamingJson(""));
|
|
63
|
-
function isJsonPrefix(snapshot, current) {
|
|
64
|
-
if (typeof snapshot === "string")
|
|
65
|
-
return typeof current === "string" && current.startsWith(snapshot);
|
|
66
|
-
if (Array.isArray(snapshot)) {
|
|
67
|
-
return (Array.isArray(current) &&
|
|
68
|
-
snapshot.length <= current.length &&
|
|
69
|
-
snapshot.every((value, index) => isJsonPrefix(value, current[index])));
|
|
70
|
-
}
|
|
71
|
-
if (typeof snapshot !== "object" || snapshot === null)
|
|
72
|
-
return Object.is(snapshot, current);
|
|
73
|
-
if (typeof current !== "object" || current === null || Array.isArray(current))
|
|
74
|
-
return false;
|
|
75
|
-
const currentRecord = current;
|
|
76
|
-
return Object.entries(snapshot).every(([key, value]) => Object.hasOwn(currentRecord, key) && isJsonPrefix(value, currentRecord[key]));
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Encodes one assistant stream. `partial` remains a shared live accumulator;
|
|
80
|
-
* the encoder uses per-block offsets to avoid replaying deltas already visible
|
|
81
|
-
* when an older queued event is consumed.
|
|
82
|
-
*/
|
|
83
|
-
export class AssistantMessageFrameEncoder {
|
|
84
|
-
started = false;
|
|
85
|
-
terminal = false;
|
|
86
|
-
blocks = new Map();
|
|
87
|
-
encode(event) {
|
|
88
|
-
if (this.terminal)
|
|
89
|
-
throw new Error(`Assistant message event ${event.type} follows a terminal event`);
|
|
90
|
-
switch (event.type) {
|
|
91
|
-
case "start":
|
|
92
|
-
if (this.started)
|
|
93
|
-
throw new Error("Assistant message stream contains more than one start event");
|
|
94
|
-
this.started = true;
|
|
95
|
-
return { type: "start", partial: cloneStartMessage(event.partial) };
|
|
96
|
-
case "done":
|
|
97
|
-
if (!this.started)
|
|
98
|
-
throw new Error("Assistant message done event appears before start");
|
|
99
|
-
this.terminal = true;
|
|
100
|
-
return undefined;
|
|
101
|
-
case "error":
|
|
102
|
-
this.terminal = true;
|
|
103
|
-
return undefined;
|
|
104
|
-
}
|
|
105
|
-
if (!this.started)
|
|
106
|
-
throw new Error(`Assistant message ${event.type} event appears before start`);
|
|
107
|
-
switch (event.type) {
|
|
108
|
-
case "text_start": {
|
|
109
|
-
const content = eventBlock(event);
|
|
110
|
-
if (content.type !== "text") {
|
|
111
|
-
throw new Error(`text_start event points to ${content.type} block at index ${event.contentIndex}`);
|
|
112
|
-
}
|
|
113
|
-
this.startBlock(event.contentIndex, {
|
|
114
|
-
kind: "text",
|
|
115
|
-
coveredChars: content.text.length,
|
|
116
|
-
deltaChars: 0,
|
|
117
|
-
});
|
|
118
|
-
return { type: "text_start", contentIndex: event.contentIndex, content: cloneTextContent(content) };
|
|
119
|
-
}
|
|
120
|
-
case "text_delta":
|
|
121
|
-
return this.encodeTextDelta(event.contentIndex, event.delta, "text");
|
|
122
|
-
case "text_end": {
|
|
123
|
-
const content = eventBlock(event);
|
|
124
|
-
if (content.type !== "text") {
|
|
125
|
-
throw new Error(`text_end event points to ${content.type} block at index ${event.contentIndex}`);
|
|
126
|
-
}
|
|
127
|
-
this.endBlock(event.contentIndex, "text");
|
|
128
|
-
return {
|
|
129
|
-
type: "text_end",
|
|
130
|
-
contentIndex: event.contentIndex,
|
|
131
|
-
content: event.content,
|
|
132
|
-
...(content.textSignature === undefined ? {} : { textSignature: content.textSignature }),
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
case "thinking_start": {
|
|
136
|
-
const content = eventBlock(event);
|
|
137
|
-
if (content.type !== "thinking") {
|
|
138
|
-
throw new Error(`thinking_start event points to ${content.type} block at index ${event.contentIndex}`);
|
|
139
|
-
}
|
|
140
|
-
this.startBlock(event.contentIndex, {
|
|
141
|
-
kind: "thinking",
|
|
142
|
-
coveredChars: content.thinking.length,
|
|
143
|
-
deltaChars: 0,
|
|
144
|
-
});
|
|
145
|
-
return {
|
|
146
|
-
type: "thinking_start",
|
|
147
|
-
contentIndex: event.contentIndex,
|
|
148
|
-
content: cloneThinkingContent(content),
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
case "thinking_delta":
|
|
152
|
-
return this.encodeTextDelta(event.contentIndex, event.delta, "thinking");
|
|
153
|
-
case "thinking_end": {
|
|
154
|
-
const content = eventBlock(event);
|
|
155
|
-
if (content.type !== "thinking") {
|
|
156
|
-
throw new Error(`thinking_end event points to ${content.type} block at index ${event.contentIndex}`);
|
|
157
|
-
}
|
|
158
|
-
this.endBlock(event.contentIndex, "thinking");
|
|
159
|
-
return {
|
|
160
|
-
type: "thinking_end",
|
|
161
|
-
contentIndex: event.contentIndex,
|
|
162
|
-
content: event.content,
|
|
163
|
-
...(content.thinkingSignature === undefined ? {} : { thinkingSignature: content.thinkingSignature }),
|
|
164
|
-
...(content.redacted === undefined ? {} : { redacted: content.redacted }),
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
case "toolcall_start": {
|
|
168
|
-
const content = eventBlock(event);
|
|
169
|
-
if (content.type !== "toolCall") {
|
|
170
|
-
throw new Error(`toolcall_start event points to ${content.type} block at index ${event.contentIndex}`);
|
|
171
|
-
}
|
|
172
|
-
const snapshotArguments = serializedArguments(content.arguments);
|
|
173
|
-
const caughtUp = snapshotArguments === EMPTY_PARSED_TOOL_ARGUMENTS;
|
|
174
|
-
this.startBlock(event.contentIndex, {
|
|
175
|
-
kind: "toolCall",
|
|
176
|
-
caughtUp,
|
|
177
|
-
catchupJson: "",
|
|
178
|
-
snapshotArguments: caughtUp ? "" : snapshotArguments,
|
|
179
|
-
});
|
|
180
|
-
return { type: "toolcall_start", contentIndex: event.contentIndex, toolCall: cloneToolCall(content) };
|
|
181
|
-
}
|
|
182
|
-
case "toolcall_delta": {
|
|
183
|
-
const state = this.block(event.contentIndex, "toolCall");
|
|
184
|
-
if (state.kind !== "toolCall")
|
|
185
|
-
throw new Error("Unreachable tool-call encoder state");
|
|
186
|
-
if (state.caughtUp) {
|
|
187
|
-
return event.delta.length === 0
|
|
188
|
-
? undefined
|
|
189
|
-
: { type: "toolcall_delta", contentIndex: event.contentIndex, delta: event.delta };
|
|
190
|
-
}
|
|
191
|
-
state.catchupJson += event.delta;
|
|
192
|
-
const argumentsValue = parseStreamingJson(state.catchupJson);
|
|
193
|
-
if (serializedArguments(argumentsValue) !== state.snapshotArguments) {
|
|
194
|
-
// Legacy grammar calls include the initial input in toolcall_start, but their
|
|
195
|
-
// JSON delta stream still begins at an empty input. Its parsed arguments can
|
|
196
|
-
// therefore extend, rather than exactly reproduce, the start snapshot.
|
|
197
|
-
const snapshotArguments = parseStreamingJson(state.snapshotArguments);
|
|
198
|
-
if (!isJsonPrefix(snapshotArguments, argumentsValue))
|
|
199
|
-
return undefined;
|
|
200
|
-
}
|
|
201
|
-
state.caughtUp = true;
|
|
202
|
-
state.snapshotArguments = "";
|
|
203
|
-
const json = state.catchupJson;
|
|
204
|
-
state.catchupJson = "";
|
|
205
|
-
return json.length === 0
|
|
206
|
-
? undefined
|
|
207
|
-
: { type: "toolcall_checkpoint", contentIndex: event.contentIndex, json };
|
|
208
|
-
}
|
|
209
|
-
case "toolcall_end": {
|
|
210
|
-
const content = eventBlock(event);
|
|
211
|
-
if (content.type !== "toolCall") {
|
|
212
|
-
throw new Error(`toolcall_end event points to ${content.type} block at index ${event.contentIndex}`);
|
|
213
|
-
}
|
|
214
|
-
if (event.toolCall.type !== "toolCall") {
|
|
215
|
-
throw new Error(`toolcall_end event has invalid tool call at index ${event.contentIndex}`);
|
|
216
|
-
}
|
|
217
|
-
this.endBlock(event.contentIndex, "toolCall");
|
|
218
|
-
return {
|
|
219
|
-
type: "toolcall_end",
|
|
220
|
-
contentIndex: event.contentIndex,
|
|
221
|
-
id: event.toolCall.id,
|
|
222
|
-
name: event.toolCall.name,
|
|
223
|
-
arguments: structuredClone(event.toolCall.arguments),
|
|
224
|
-
...(event.toolCall.thoughtSignature === undefined
|
|
225
|
-
? {}
|
|
226
|
-
: { thoughtSignature: event.toolCall.thoughtSignature }),
|
|
227
|
-
...(event.toolCall.namespace === undefined ? {} : { namespace: event.toolCall.namespace }),
|
|
228
|
-
};
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
startBlock(contentIndex, state) {
|
|
233
|
-
assertContentIndex(contentIndex);
|
|
234
|
-
if (this.blocks.has(contentIndex)) {
|
|
235
|
-
throw new Error(`Assistant message block ${contentIndex} starts more than once`);
|
|
236
|
-
}
|
|
237
|
-
this.blocks.set(contentIndex, state);
|
|
238
|
-
}
|
|
239
|
-
block(contentIndex, kind) {
|
|
240
|
-
assertContentIndex(contentIndex);
|
|
241
|
-
const state = this.blocks.get(contentIndex);
|
|
242
|
-
if (state === undefined)
|
|
243
|
-
throw new Error(`Assistant message ${kind} block ${contentIndex} has not started`);
|
|
244
|
-
if (state.kind !== kind) {
|
|
245
|
-
throw new Error(`Assistant message block ${contentIndex} is ${state.kind}, not ${kind}`);
|
|
246
|
-
}
|
|
247
|
-
return state;
|
|
248
|
-
}
|
|
249
|
-
endBlock(contentIndex, kind) {
|
|
250
|
-
this.block(contentIndex, kind);
|
|
251
|
-
this.blocks.delete(contentIndex);
|
|
252
|
-
}
|
|
253
|
-
encodeTextDelta(contentIndex, delta, kind) {
|
|
254
|
-
const state = this.block(contentIndex, kind);
|
|
255
|
-
if (state.kind === "toolCall")
|
|
256
|
-
throw new Error("Unreachable text encoder state");
|
|
257
|
-
const deltaStart = state.deltaChars;
|
|
258
|
-
state.deltaChars += delta.length;
|
|
259
|
-
const covered = Math.max(0, state.coveredChars - deltaStart);
|
|
260
|
-
if (covered >= delta.length)
|
|
261
|
-
return undefined;
|
|
262
|
-
const uncovered = covered === 0 ? delta : delta.slice(covered);
|
|
263
|
-
return kind === "text"
|
|
264
|
-
? { type: "text_delta", contentIndex, delta: uncovered }
|
|
265
|
-
: { type: "thinking_delta", contentIndex, delta: uncovered };
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
function appendBlock(message, states, contentIndex, block, state) {
|
|
269
|
-
assertContentIndex(contentIndex);
|
|
270
|
-
if (contentIndex !== message.content.length) {
|
|
271
|
-
const reason = contentIndex < message.content.length ? "already exists" : "would leave a gap";
|
|
272
|
-
throw new Error(`Cannot start assistant message block at index ${contentIndex}: ${reason}`);
|
|
273
|
-
}
|
|
274
|
-
message.content.push(structuredClone(block));
|
|
275
|
-
states.set(contentIndex, state);
|
|
276
|
-
}
|
|
277
|
-
function activeBlock(message, states, contentIndex, expectedKind, frameType) {
|
|
278
|
-
assertContentIndex(contentIndex);
|
|
279
|
-
const state = states.get(contentIndex);
|
|
280
|
-
const block = message.content[contentIndex];
|
|
281
|
-
if (!state || !block) {
|
|
282
|
-
throw new Error(`${frameType} frame has no started block at index ${contentIndex}`);
|
|
283
|
-
}
|
|
284
|
-
if (state.kind !== expectedKind || block.type !== expectedKind) {
|
|
285
|
-
throw new Error(`${frameType} frame expected ${expectedKind} block at index ${contentIndex}, found ${block.type}`);
|
|
286
|
-
}
|
|
287
|
-
if (state.ended) {
|
|
288
|
-
throw new Error(`${frameType} frame follows the end of block at index ${contentIndex}`);
|
|
289
|
-
}
|
|
290
|
-
return { block, state };
|
|
291
|
-
}
|
|
292
|
-
/**
|
|
293
|
-
* Replay compact frames without mutating them. Returns `undefined` when the
|
|
294
|
-
* iterable contains no start frame.
|
|
295
|
-
*/
|
|
296
|
-
export function reduceAssistantMessageFrames(frames) {
|
|
297
|
-
let message;
|
|
298
|
-
let frameBeforeStart;
|
|
299
|
-
const states = new Map();
|
|
300
|
-
for (const frame of frames) {
|
|
301
|
-
if (frame.type === "start") {
|
|
302
|
-
if (message)
|
|
303
|
-
throw new Error("Assistant message frame sequence contains more than one start frame");
|
|
304
|
-
if (frameBeforeStart !== undefined)
|
|
305
|
-
throw new Error(`${frameBeforeStart} frame appears before the start frame`);
|
|
306
|
-
message = structuredClone(frame.partial);
|
|
307
|
-
continue;
|
|
308
|
-
}
|
|
309
|
-
if (!message) {
|
|
310
|
-
frameBeforeStart ??= frame.type;
|
|
311
|
-
continue;
|
|
312
|
-
}
|
|
313
|
-
switch (frame.type) {
|
|
314
|
-
case "text_start":
|
|
315
|
-
if (frame.content.type !== "text") {
|
|
316
|
-
throw new Error(`text_start frame contains ${frame.content.type} content`);
|
|
317
|
-
}
|
|
318
|
-
appendBlock(message, states, frame.contentIndex, frame.content, { kind: "text", ended: false });
|
|
319
|
-
break;
|
|
320
|
-
case "text_delta": {
|
|
321
|
-
const { block } = activeBlock(message, states, frame.contentIndex, "text", frame.type);
|
|
322
|
-
if (block.type !== "text")
|
|
323
|
-
throw new Error("Unreachable text frame state");
|
|
324
|
-
block.text += frame.delta;
|
|
325
|
-
break;
|
|
326
|
-
}
|
|
327
|
-
case "text_end": {
|
|
328
|
-
const { block, state } = activeBlock(message, states, frame.contentIndex, "text", frame.type);
|
|
329
|
-
if (block.type !== "text")
|
|
330
|
-
throw new Error("Unreachable text frame state");
|
|
331
|
-
block.text = frame.content;
|
|
332
|
-
delete block.textSignature;
|
|
333
|
-
if (frame.textSignature !== undefined)
|
|
334
|
-
block.textSignature = frame.textSignature;
|
|
335
|
-
state.ended = true;
|
|
336
|
-
break;
|
|
337
|
-
}
|
|
338
|
-
case "thinking_start":
|
|
339
|
-
if (frame.content.type !== "thinking") {
|
|
340
|
-
throw new Error(`thinking_start frame contains ${frame.content.type} content`);
|
|
341
|
-
}
|
|
342
|
-
appendBlock(message, states, frame.contentIndex, frame.content, {
|
|
343
|
-
kind: "thinking",
|
|
344
|
-
ended: false,
|
|
345
|
-
});
|
|
346
|
-
break;
|
|
347
|
-
case "thinking_delta": {
|
|
348
|
-
const { block } = activeBlock(message, states, frame.contentIndex, "thinking", frame.type);
|
|
349
|
-
if (block.type !== "thinking")
|
|
350
|
-
throw new Error("Unreachable thinking frame state");
|
|
351
|
-
block.thinking += frame.delta;
|
|
352
|
-
break;
|
|
353
|
-
}
|
|
354
|
-
case "thinking_end": {
|
|
355
|
-
const { block, state } = activeBlock(message, states, frame.contentIndex, "thinking", frame.type);
|
|
356
|
-
if (block.type !== "thinking")
|
|
357
|
-
throw new Error("Unreachable thinking frame state");
|
|
358
|
-
block.thinking = frame.content;
|
|
359
|
-
delete block.thinkingSignature;
|
|
360
|
-
delete block.redacted;
|
|
361
|
-
if (frame.thinkingSignature !== undefined)
|
|
362
|
-
block.thinkingSignature = frame.thinkingSignature;
|
|
363
|
-
if (frame.redacted !== undefined)
|
|
364
|
-
block.redacted = frame.redacted;
|
|
365
|
-
state.ended = true;
|
|
366
|
-
break;
|
|
367
|
-
}
|
|
368
|
-
case "toolcall_start":
|
|
369
|
-
if (frame.toolCall.type !== "toolCall") {
|
|
370
|
-
throw new Error(`toolcall_start frame contains ${frame.toolCall.type} content`);
|
|
371
|
-
}
|
|
372
|
-
appendBlock(message, states, frame.contentIndex, frame.toolCall, {
|
|
373
|
-
kind: "toolCall",
|
|
374
|
-
ended: false,
|
|
375
|
-
json: "",
|
|
376
|
-
});
|
|
377
|
-
break;
|
|
378
|
-
case "toolcall_checkpoint": {
|
|
379
|
-
const { block, state } = activeBlock(message, states, frame.contentIndex, "toolCall", frame.type);
|
|
380
|
-
if (block.type !== "toolCall" || state.kind !== "toolCall") {
|
|
381
|
-
throw new Error("Unreachable tool-call checkpoint state");
|
|
382
|
-
}
|
|
383
|
-
state.json = frame.json;
|
|
384
|
-
block.arguments = parseStreamingJson(frame.json);
|
|
385
|
-
break;
|
|
386
|
-
}
|
|
387
|
-
case "toolcall_delta": {
|
|
388
|
-
const { block, state } = activeBlock(message, states, frame.contentIndex, "toolCall", frame.type);
|
|
389
|
-
if (block.type !== "toolCall" || state.kind !== "toolCall") {
|
|
390
|
-
throw new Error("Unreachable tool-call frame state");
|
|
391
|
-
}
|
|
392
|
-
state.json += frame.delta;
|
|
393
|
-
break;
|
|
394
|
-
}
|
|
395
|
-
case "toolcall_end": {
|
|
396
|
-
const { block, state } = activeBlock(message, states, frame.contentIndex, "toolCall", frame.type);
|
|
397
|
-
if (block.type !== "toolCall")
|
|
398
|
-
throw new Error("Unreachable tool-call frame state");
|
|
399
|
-
block.id = frame.id;
|
|
400
|
-
block.name = frame.name;
|
|
401
|
-
block.arguments = structuredClone(frame.arguments);
|
|
402
|
-
delete block.thoughtSignature;
|
|
403
|
-
delete block.namespace;
|
|
404
|
-
if (frame.thoughtSignature !== undefined)
|
|
405
|
-
block.thoughtSignature = frame.thoughtSignature;
|
|
406
|
-
if (frame.namespace !== undefined)
|
|
407
|
-
block.namespace = frame.namespace;
|
|
408
|
-
state.ended = true;
|
|
409
|
-
break;
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
if (!message)
|
|
414
|
-
return undefined;
|
|
415
|
-
for (const [contentIndex, state] of states) {
|
|
416
|
-
if (state.kind !== "toolCall" || state.ended || state.json.length === 0)
|
|
417
|
-
continue;
|
|
418
|
-
const block = message.content[contentIndex];
|
|
419
|
-
if (block?.type !== "toolCall")
|
|
420
|
-
throw new Error("Unreachable tool-call frame state");
|
|
421
|
-
block.arguments = parseStreamingJson(state.json);
|
|
422
|
-
}
|
|
423
|
-
return message;
|
|
424
|
-
}
|
|
425
|
-
//# sourceMappingURL=assistant-message-frame.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"assistant-message-frame.js","sourceRoot":"","sources":["../../src/utils/assistant-message-frame.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage, AssistantMessageEvent, TextContent, ThinkingContent, ToolCall } from \"../types.ts\";\nimport { parseStreamingJson } from \"./json-parse.ts\";\n\n/**\n * Compact, replayable assistant-message progress. Terminal settlement is\n * intentionally excluded and must be persisted separately.\n */\nexport type AssistantMessageFrame =\n\t| { type: \"start\"; partial: AssistantMessage }\n\t| { type: \"text_start\"; contentIndex: number; content: TextContent }\n\t| { type: \"text_delta\"; contentIndex: number; delta: string }\n\t| { type: \"text_end\"; contentIndex: number; content: string; textSignature?: string }\n\t| { type: \"thinking_start\"; contentIndex: number; content: ThinkingContent }\n\t| { type: \"thinking_delta\"; contentIndex: number; delta: string }\n\t| {\n\t\t\ttype: \"thinking_end\";\n\t\t\tcontentIndex: number;\n\t\t\tcontent: string;\n\t\t\tthinkingSignature?: string;\n\t\t\tredacted?: boolean;\n\t }\n\t| { type: \"toolcall_start\"; contentIndex: number; toolCall: ToolCall }\n\t| { type: \"toolcall_checkpoint\"; contentIndex: number; json: string }\n\t| { type: \"toolcall_delta\"; contentIndex: number; delta: string }\n\t| {\n\t\t\ttype: \"toolcall_end\";\n\t\t\tcontentIndex: number;\n\t\t\tid: string;\n\t\t\tname: string;\n\t\t\targuments: ToolCall[\"arguments\"];\n\t\t\tthoughtSignature?: string;\n\t\t\tnamespace?: string;\n\t };\n\ntype EncoderBlockState =\n\t| { kind: \"text\" | \"thinking\"; coveredChars: number; deltaChars: number }\n\t| {\n\t\t\tkind: \"toolCall\";\n\t\t\tcaughtUp: boolean;\n\t\t\tcatchupJson: string;\n\t\t\tsnapshotArguments: string;\n\t };\n\ntype ReducerBlockState =\n\t| { kind: \"text\"; ended: boolean }\n\t| { kind: \"thinking\"; ended: boolean }\n\t| { kind: \"toolCall\"; ended: boolean; json: string };\n\nfunction cloneTextContent(content: TextContent): TextContent {\n\treturn {\n\t\ttype: \"text\",\n\t\ttext: content.text,\n\t\t...(content.textSignature === undefined ? {} : { textSignature: content.textSignature }),\n\t};\n}\n\nfunction cloneThinkingContent(content: ThinkingContent): ThinkingContent {\n\treturn {\n\t\ttype: \"thinking\",\n\t\tthinking: content.thinking,\n\t\t...(content.thinkingSignature === undefined ? {} : { thinkingSignature: content.thinkingSignature }),\n\t\t...(content.redacted === undefined ? {} : { redacted: content.redacted }),\n\t};\n}\n\nfunction cloneToolCall(toolCall: ToolCall): ToolCall {\n\treturn {\n\t\ttype: \"toolCall\",\n\t\tid: toolCall.id,\n\t\tname: toolCall.name,\n\t\targuments: structuredClone(toolCall.arguments),\n\t\t...(toolCall.thoughtSignature === undefined ? {} : { thoughtSignature: toolCall.thoughtSignature }),\n\t\t...(toolCall.namespace === undefined ? {} : { namespace: toolCall.namespace }),\n\t};\n}\n\nfunction cloneStartMessage(message: AssistantMessage): AssistantMessage {\n\treturn {\n\t\trole: \"assistant\",\n\t\tcontent: [],\n\t\tapi: message.api,\n\t\tprovider: message.provider,\n\t\tmodel: message.model,\n\t\t...(message.responseModel === undefined ? {} : { responseModel: message.responseModel }),\n\t\t...(message.responseId === undefined ? {} : { responseId: message.responseId }),\n\t\t...(message.providerThinkingLevel === undefined ? {} : { providerThinkingLevel: message.providerThinkingLevel }),\n\t\t...(message.diagnostics === undefined ? {} : { diagnostics: structuredClone(message.diagnostics) }),\n\t\tusage: structuredClone(message.usage),\n\t\tstopReason: \"pending\",\n\t\ttimestamp: message.timestamp,\n\t};\n}\n\nfunction assertContentIndex(contentIndex: number): void {\n\tif (!Number.isSafeInteger(contentIndex) || contentIndex < 0) {\n\t\tthrow new Error(`Invalid assistant message frame contentIndex: ${contentIndex}`);\n\t}\n}\n\nfunction eventBlock(event: Exclude<AssistantMessageEvent, { type: \"start\" | \"done\" | \"error\" }>) {\n\tassertContentIndex(event.contentIndex);\n\tconst block = event.partial.content[event.contentIndex];\n\tif (!block) {\n\t\tthrow new Error(`${event.type} event has no content block at index ${event.contentIndex}`);\n\t}\n\treturn block;\n}\n\nfunction serializedArguments(argumentsValue: ToolCall[\"arguments\"]): string {\n\tconst serialized = JSON.stringify(argumentsValue);\n\tif (serialized === undefined) throw new Error(\"Tool-call arguments are not JSON-serializable\");\n\treturn serialized;\n}\n\nconst EMPTY_PARSED_TOOL_ARGUMENTS = serializedArguments(parseStreamingJson<ToolCall[\"arguments\"]>(\"\"));\n\nfunction isJsonPrefix(snapshot: unknown, current: unknown): boolean {\n\tif (typeof snapshot === \"string\") return typeof current === \"string\" && current.startsWith(snapshot);\n\tif (Array.isArray(snapshot)) {\n\t\treturn (\n\t\t\tArray.isArray(current) &&\n\t\t\tsnapshot.length <= current.length &&\n\t\t\tsnapshot.every((value, index) => isJsonPrefix(value, current[index]))\n\t\t);\n\t}\n\tif (typeof snapshot !== \"object\" || snapshot === null) return Object.is(snapshot, current);\n\tif (typeof current !== \"object\" || current === null || Array.isArray(current)) return false;\n\tconst currentRecord = current as Record<string, unknown>;\n\treturn Object.entries(snapshot).every(\n\t\t([key, value]) => Object.hasOwn(currentRecord, key) && isJsonPrefix(value, currentRecord[key]),\n\t);\n}\n\n/**\n * Encodes one assistant stream. `partial` remains a shared live accumulator;\n * the encoder uses per-block offsets to avoid replaying deltas already visible\n * when an older queued event is consumed.\n */\nexport class AssistantMessageFrameEncoder {\n\tprivate started = false;\n\tprivate terminal = false;\n\tprivate readonly blocks = new Map<number, EncoderBlockState>();\n\n\tencode(event: AssistantMessageEvent): AssistantMessageFrame | undefined {\n\t\tif (this.terminal) throw new Error(`Assistant message event ${event.type} follows a terminal event`);\n\n\t\tswitch (event.type) {\n\t\t\tcase \"start\":\n\t\t\t\tif (this.started) throw new Error(\"Assistant message stream contains more than one start event\");\n\t\t\t\tthis.started = true;\n\t\t\t\treturn { type: \"start\", partial: cloneStartMessage(event.partial) };\n\t\t\tcase \"done\":\n\t\t\t\tif (!this.started) throw new Error(\"Assistant message done event appears before start\");\n\t\t\t\tthis.terminal = true;\n\t\t\t\treturn undefined;\n\t\t\tcase \"error\":\n\t\t\t\tthis.terminal = true;\n\t\t\t\treturn undefined;\n\t\t}\n\n\t\tif (!this.started) throw new Error(`Assistant message ${event.type} event appears before start`);\n\n\t\tswitch (event.type) {\n\t\t\tcase \"text_start\": {\n\t\t\t\tconst content = eventBlock(event);\n\t\t\t\tif (content.type !== \"text\") {\n\t\t\t\t\tthrow new Error(`text_start event points to ${content.type} block at index ${event.contentIndex}`);\n\t\t\t\t}\n\t\t\t\tthis.startBlock(event.contentIndex, {\n\t\t\t\t\tkind: \"text\",\n\t\t\t\t\tcoveredChars: content.text.length,\n\t\t\t\t\tdeltaChars: 0,\n\t\t\t\t});\n\t\t\t\treturn { type: \"text_start\", contentIndex: event.contentIndex, content: cloneTextContent(content) };\n\t\t\t}\n\t\t\tcase \"text_delta\":\n\t\t\t\treturn this.encodeTextDelta(event.contentIndex, event.delta, \"text\");\n\t\t\tcase \"text_end\": {\n\t\t\t\tconst content = eventBlock(event);\n\t\t\t\tif (content.type !== \"text\") {\n\t\t\t\t\tthrow new Error(`text_end event points to ${content.type} block at index ${event.contentIndex}`);\n\t\t\t\t}\n\t\t\t\tthis.endBlock(event.contentIndex, \"text\");\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"text_end\",\n\t\t\t\t\tcontentIndex: event.contentIndex,\n\t\t\t\t\tcontent: event.content,\n\t\t\t\t\t...(content.textSignature === undefined ? {} : { textSignature: content.textSignature }),\n\t\t\t\t};\n\t\t\t}\n\t\t\tcase \"thinking_start\": {\n\t\t\t\tconst content = eventBlock(event);\n\t\t\t\tif (content.type !== \"thinking\") {\n\t\t\t\t\tthrow new Error(`thinking_start event points to ${content.type} block at index ${event.contentIndex}`);\n\t\t\t\t}\n\t\t\t\tthis.startBlock(event.contentIndex, {\n\t\t\t\t\tkind: \"thinking\",\n\t\t\t\t\tcoveredChars: content.thinking.length,\n\t\t\t\t\tdeltaChars: 0,\n\t\t\t\t});\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"thinking_start\",\n\t\t\t\t\tcontentIndex: event.contentIndex,\n\t\t\t\t\tcontent: cloneThinkingContent(content),\n\t\t\t\t};\n\t\t\t}\n\t\t\tcase \"thinking_delta\":\n\t\t\t\treturn this.encodeTextDelta(event.contentIndex, event.delta, \"thinking\");\n\t\t\tcase \"thinking_end\": {\n\t\t\t\tconst content = eventBlock(event);\n\t\t\t\tif (content.type !== \"thinking\") {\n\t\t\t\t\tthrow new Error(`thinking_end event points to ${content.type} block at index ${event.contentIndex}`);\n\t\t\t\t}\n\t\t\t\tthis.endBlock(event.contentIndex, \"thinking\");\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"thinking_end\",\n\t\t\t\t\tcontentIndex: event.contentIndex,\n\t\t\t\t\tcontent: event.content,\n\t\t\t\t\t...(content.thinkingSignature === undefined ? {} : { thinkingSignature: content.thinkingSignature }),\n\t\t\t\t\t...(content.redacted === undefined ? {} : { redacted: content.redacted }),\n\t\t\t\t};\n\t\t\t}\n\t\t\tcase \"toolcall_start\": {\n\t\t\t\tconst content = eventBlock(event);\n\t\t\t\tif (content.type !== \"toolCall\") {\n\t\t\t\t\tthrow new Error(`toolcall_start event points to ${content.type} block at index ${event.contentIndex}`);\n\t\t\t\t}\n\t\t\t\tconst snapshotArguments = serializedArguments(content.arguments);\n\t\t\t\tconst caughtUp = snapshotArguments === EMPTY_PARSED_TOOL_ARGUMENTS;\n\t\t\t\tthis.startBlock(event.contentIndex, {\n\t\t\t\t\tkind: \"toolCall\",\n\t\t\t\t\tcaughtUp,\n\t\t\t\t\tcatchupJson: \"\",\n\t\t\t\t\tsnapshotArguments: caughtUp ? \"\" : snapshotArguments,\n\t\t\t\t});\n\t\t\t\treturn { type: \"toolcall_start\", contentIndex: event.contentIndex, toolCall: cloneToolCall(content) };\n\t\t\t}\n\t\t\tcase \"toolcall_delta\": {\n\t\t\t\tconst state = this.block(event.contentIndex, \"toolCall\");\n\t\t\t\tif (state.kind !== \"toolCall\") throw new Error(\"Unreachable tool-call encoder state\");\n\t\t\t\tif (state.caughtUp) {\n\t\t\t\t\treturn event.delta.length === 0\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: { type: \"toolcall_delta\", contentIndex: event.contentIndex, delta: event.delta };\n\t\t\t\t}\n\t\t\t\tstate.catchupJson += event.delta;\n\t\t\t\tconst argumentsValue = parseStreamingJson<ToolCall[\"arguments\"]>(state.catchupJson);\n\t\t\t\tif (serializedArguments(argumentsValue) !== state.snapshotArguments) {\n\t\t\t\t\t// Legacy grammar calls include the initial input in toolcall_start, but their\n\t\t\t\t\t// JSON delta stream still begins at an empty input. Its parsed arguments can\n\t\t\t\t\t// therefore extend, rather than exactly reproduce, the start snapshot.\n\t\t\t\t\tconst snapshotArguments = parseStreamingJson<ToolCall[\"arguments\"]>(state.snapshotArguments);\n\t\t\t\t\tif (!isJsonPrefix(snapshotArguments, argumentsValue)) return undefined;\n\t\t\t\t}\n\t\t\t\tstate.caughtUp = true;\n\t\t\t\tstate.snapshotArguments = \"\";\n\t\t\t\tconst json = state.catchupJson;\n\t\t\t\tstate.catchupJson = \"\";\n\t\t\t\treturn json.length === 0\n\t\t\t\t\t? undefined\n\t\t\t\t\t: { type: \"toolcall_checkpoint\", contentIndex: event.contentIndex, json };\n\t\t\t}\n\t\t\tcase \"toolcall_end\": {\n\t\t\t\tconst content = eventBlock(event);\n\t\t\t\tif (content.type !== \"toolCall\") {\n\t\t\t\t\tthrow new Error(`toolcall_end event points to ${content.type} block at index ${event.contentIndex}`);\n\t\t\t\t}\n\t\t\t\tif (event.toolCall.type !== \"toolCall\") {\n\t\t\t\t\tthrow new Error(`toolcall_end event has invalid tool call at index ${event.contentIndex}`);\n\t\t\t\t}\n\t\t\t\tthis.endBlock(event.contentIndex, \"toolCall\");\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"toolcall_end\",\n\t\t\t\t\tcontentIndex: event.contentIndex,\n\t\t\t\t\tid: event.toolCall.id,\n\t\t\t\t\tname: event.toolCall.name,\n\t\t\t\t\targuments: structuredClone(event.toolCall.arguments),\n\t\t\t\t\t...(event.toolCall.thoughtSignature === undefined\n\t\t\t\t\t\t? {}\n\t\t\t\t\t\t: { thoughtSignature: event.toolCall.thoughtSignature }),\n\t\t\t\t\t...(event.toolCall.namespace === undefined ? {} : { namespace: event.toolCall.namespace }),\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate startBlock(contentIndex: number, state: EncoderBlockState): void {\n\t\tassertContentIndex(contentIndex);\n\t\tif (this.blocks.has(contentIndex)) {\n\t\t\tthrow new Error(`Assistant message block ${contentIndex} starts more than once`);\n\t\t}\n\t\tthis.blocks.set(contentIndex, state);\n\t}\n\n\tprivate block(contentIndex: number, kind: EncoderBlockState[\"kind\"]): EncoderBlockState {\n\t\tassertContentIndex(contentIndex);\n\t\tconst state = this.blocks.get(contentIndex);\n\t\tif (state === undefined) throw new Error(`Assistant message ${kind} block ${contentIndex} has not started`);\n\t\tif (state.kind !== kind) {\n\t\t\tthrow new Error(`Assistant message block ${contentIndex} is ${state.kind}, not ${kind}`);\n\t\t}\n\t\treturn state;\n\t}\n\n\tprivate endBlock(contentIndex: number, kind: EncoderBlockState[\"kind\"]): void {\n\t\tthis.block(contentIndex, kind);\n\t\tthis.blocks.delete(contentIndex);\n\t}\n\n\tprivate encodeTextDelta(\n\t\tcontentIndex: number,\n\t\tdelta: string,\n\t\tkind: \"text\" | \"thinking\",\n\t): AssistantMessageFrame | undefined {\n\t\tconst state = this.block(contentIndex, kind);\n\t\tif (state.kind === \"toolCall\") throw new Error(\"Unreachable text encoder state\");\n\t\tconst deltaStart = state.deltaChars;\n\t\tstate.deltaChars += delta.length;\n\t\tconst covered = Math.max(0, state.coveredChars - deltaStart);\n\t\tif (covered >= delta.length) return undefined;\n\t\tconst uncovered = covered === 0 ? delta : delta.slice(covered);\n\t\treturn kind === \"text\"\n\t\t\t? { type: \"text_delta\", contentIndex, delta: uncovered }\n\t\t\t: { type: \"thinking_delta\", contentIndex, delta: uncovered };\n\t}\n}\n\nfunction appendBlock(\n\tmessage: AssistantMessage,\n\tstates: Map<number, ReducerBlockState>,\n\tcontentIndex: number,\n\tblock: TextContent | ThinkingContent | ToolCall,\n\tstate: ReducerBlockState,\n): void {\n\tassertContentIndex(contentIndex);\n\tif (contentIndex !== message.content.length) {\n\t\tconst reason = contentIndex < message.content.length ? \"already exists\" : \"would leave a gap\";\n\t\tthrow new Error(`Cannot start assistant message block at index ${contentIndex}: ${reason}`);\n\t}\n\tmessage.content.push(structuredClone(block));\n\tstates.set(contentIndex, state);\n}\n\nfunction activeBlock(\n\tmessage: AssistantMessage,\n\tstates: Map<number, ReducerBlockState>,\n\tcontentIndex: number,\n\texpectedKind: ReducerBlockState[\"kind\"],\n\tframeType: AssistantMessageFrame[\"type\"],\n): { block: TextContent | ThinkingContent | ToolCall; state: ReducerBlockState } {\n\tassertContentIndex(contentIndex);\n\tconst state = states.get(contentIndex);\n\tconst block = message.content[contentIndex];\n\tif (!state || !block) {\n\t\tthrow new Error(`${frameType} frame has no started block at index ${contentIndex}`);\n\t}\n\tif (state.kind !== expectedKind || block.type !== expectedKind) {\n\t\tthrow new Error(\n\t\t\t`${frameType} frame expected ${expectedKind} block at index ${contentIndex}, found ${block.type}`,\n\t\t);\n\t}\n\tif (state.ended) {\n\t\tthrow new Error(`${frameType} frame follows the end of block at index ${contentIndex}`);\n\t}\n\treturn { block, state };\n}\n\n/**\n * Replay compact frames without mutating them. Returns `undefined` when the\n * iterable contains no start frame.\n */\nexport function reduceAssistantMessageFrames(frames: Iterable<AssistantMessageFrame>): AssistantMessage | undefined {\n\tlet message: AssistantMessage | undefined;\n\tlet frameBeforeStart: AssistantMessageFrame[\"type\"] | undefined;\n\tconst states = new Map<number, ReducerBlockState>();\n\n\tfor (const frame of frames) {\n\t\tif (frame.type === \"start\") {\n\t\t\tif (message) throw new Error(\"Assistant message frame sequence contains more than one start frame\");\n\t\t\tif (frameBeforeStart !== undefined)\n\t\t\t\tthrow new Error(`${frameBeforeStart} frame appears before the start frame`);\n\t\t\tmessage = structuredClone(frame.partial);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!message) {\n\t\t\tframeBeforeStart ??= frame.type;\n\t\t\tcontinue;\n\t\t}\n\n\t\tswitch (frame.type) {\n\t\t\tcase \"text_start\":\n\t\t\t\tif (frame.content.type !== \"text\") {\n\t\t\t\t\tthrow new Error(`text_start frame contains ${frame.content.type} content`);\n\t\t\t\t}\n\t\t\t\tappendBlock(message, states, frame.contentIndex, frame.content, { kind: \"text\", ended: false });\n\t\t\t\tbreak;\n\t\t\tcase \"text_delta\": {\n\t\t\t\tconst { block } = activeBlock(message, states, frame.contentIndex, \"text\", frame.type);\n\t\t\t\tif (block.type !== \"text\") throw new Error(\"Unreachable text frame state\");\n\t\t\t\tblock.text += frame.delta;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"text_end\": {\n\t\t\t\tconst { block, state } = activeBlock(message, states, frame.contentIndex, \"text\", frame.type);\n\t\t\t\tif (block.type !== \"text\") throw new Error(\"Unreachable text frame state\");\n\t\t\t\tblock.text = frame.content;\n\t\t\t\tdelete block.textSignature;\n\t\t\t\tif (frame.textSignature !== undefined) block.textSignature = frame.textSignature;\n\t\t\t\tstate.ended = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"thinking_start\":\n\t\t\t\tif (frame.content.type !== \"thinking\") {\n\t\t\t\t\tthrow new Error(`thinking_start frame contains ${frame.content.type} content`);\n\t\t\t\t}\n\t\t\t\tappendBlock(message, states, frame.contentIndex, frame.content, {\n\t\t\t\t\tkind: \"thinking\",\n\t\t\t\t\tended: false,\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase \"thinking_delta\": {\n\t\t\t\tconst { block } = activeBlock(message, states, frame.contentIndex, \"thinking\", frame.type);\n\t\t\t\tif (block.type !== \"thinking\") throw new Error(\"Unreachable thinking frame state\");\n\t\t\t\tblock.thinking += frame.delta;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"thinking_end\": {\n\t\t\t\tconst { block, state } = activeBlock(message, states, frame.contentIndex, \"thinking\", frame.type);\n\t\t\t\tif (block.type !== \"thinking\") throw new Error(\"Unreachable thinking frame state\");\n\t\t\t\tblock.thinking = frame.content;\n\t\t\t\tdelete block.thinkingSignature;\n\t\t\t\tdelete block.redacted;\n\t\t\t\tif (frame.thinkingSignature !== undefined) block.thinkingSignature = frame.thinkingSignature;\n\t\t\t\tif (frame.redacted !== undefined) block.redacted = frame.redacted;\n\t\t\t\tstate.ended = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"toolcall_start\":\n\t\t\t\tif (frame.toolCall.type !== \"toolCall\") {\n\t\t\t\t\tthrow new Error(`toolcall_start frame contains ${frame.toolCall.type} content`);\n\t\t\t\t}\n\t\t\t\tappendBlock(message, states, frame.contentIndex, frame.toolCall, {\n\t\t\t\t\tkind: \"toolCall\",\n\t\t\t\t\tended: false,\n\t\t\t\t\tjson: \"\",\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase \"toolcall_checkpoint\": {\n\t\t\t\tconst { block, state } = activeBlock(message, states, frame.contentIndex, \"toolCall\", frame.type);\n\t\t\t\tif (block.type !== \"toolCall\" || state.kind !== \"toolCall\") {\n\t\t\t\t\tthrow new Error(\"Unreachable tool-call checkpoint state\");\n\t\t\t\t}\n\t\t\t\tstate.json = frame.json;\n\t\t\t\tblock.arguments = parseStreamingJson<ToolCall[\"arguments\"]>(frame.json);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"toolcall_delta\": {\n\t\t\t\tconst { block, state } = activeBlock(message, states, frame.contentIndex, \"toolCall\", frame.type);\n\t\t\t\tif (block.type !== \"toolCall\" || state.kind !== \"toolCall\") {\n\t\t\t\t\tthrow new Error(\"Unreachable tool-call frame state\");\n\t\t\t\t}\n\t\t\t\tstate.json += frame.delta;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"toolcall_end\": {\n\t\t\t\tconst { block, state } = activeBlock(message, states, frame.contentIndex, \"toolCall\", frame.type);\n\t\t\t\tif (block.type !== \"toolCall\") throw new Error(\"Unreachable tool-call frame state\");\n\t\t\t\tblock.id = frame.id;\n\t\t\t\tblock.name = frame.name;\n\t\t\t\tblock.arguments = structuredClone(frame.arguments);\n\t\t\t\tdelete block.thoughtSignature;\n\t\t\t\tdelete block.namespace;\n\t\t\t\tif (frame.thoughtSignature !== undefined) block.thoughtSignature = frame.thoughtSignature;\n\t\t\t\tif (frame.namespace !== undefined) block.namespace = frame.namespace;\n\t\t\t\tstate.ended = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!message) return undefined;\n\tfor (const [contentIndex, state] of states) {\n\t\tif (state.kind !== \"toolCall\" || state.ended || state.json.length === 0) continue;\n\t\tconst block = message.content[contentIndex];\n\t\tif (block?.type !== \"toolCall\") throw new Error(\"Unreachable tool-call frame state\");\n\t\tblock.arguments = parseStreamingJson<ToolCall[\"arguments\"]>(state.json);\n\t}\n\n\treturn message;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"draht-user-agent.d.ts","sourceRoot":"","sources":["../../src/utils/draht-user-agent.ts"],"names":[],"mappings":"AAgBA,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
function loadNodeOs() {
|
|
2
|
-
if (typeof process === "undefined" || !(process.versions?.node || process.versions?.bun)) {
|
|
3
|
-
return null;
|
|
4
|
-
}
|
|
5
|
-
return process.getBuiltinModule?.("node:os") ?? null;
|
|
6
|
-
}
|
|
7
|
-
// Keep runtime OS loading browser-safe. A top-level runtime import of node:os breaks browser/Vite builds.
|
|
8
|
-
const nodeOs = loadNodeOs();
|
|
9
|
-
export function getDrahtUserAgent() {
|
|
10
|
-
return nodeOs ? `draht (${nodeOs.platform()} ${nodeOs.release()}; ${nodeOs.arch()})` : "draht (browser)";
|
|
11
|
-
}
|
|
12
|
-
//# sourceMappingURL=draht-user-agent.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"draht-user-agent.js","sourceRoot":"","sources":["../../src/utils/draht-user-agent.ts"],"names":[],"mappings":"AAMA,SAAS,UAAU;IAClB,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,IAAI,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC;QAC1F,OAAO,IAAI,CAAC;IACb,CAAC;IACD,OAAQ,OAAsC,CAAC,gBAAgB,EAAE,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;AACtF,CAAC;AAED,0GAA0G;AAC1G,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;AAE5B,MAAM,UAAU,iBAAiB;IAChC,OAAO,MAAM,CAAC,CAAC,CAAC,UAAU,MAAM,CAAC,QAAQ,EAAE,IAAI,MAAM,CAAC,OAAO,EAAE,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC;AAC1G,CAAC","sourcesContent":["import type * as NodeOs from \"node:os\";\n\ntype ProcessWithOsBuiltinModule = typeof process & {\n\tgetBuiltinModule?: (id: \"node:os\") => typeof NodeOs;\n};\n\nfunction loadNodeOs(): typeof NodeOs | null {\n\tif (typeof process === \"undefined\" || !(process.versions?.node || process.versions?.bun)) {\n\t\treturn null;\n\t}\n\treturn (process as ProcessWithOsBuiltinModule).getBuiltinModule?.(\"node:os\") ?? null;\n}\n\n// Keep runtime OS loading browser-safe. A top-level runtime import of node:os breaks browser/Vite builds.\nconst nodeOs = loadNodeOs();\n\nexport function getDrahtUserAgent(): string {\n\treturn nodeOs ? `draht (${nodeOs.platform()} ${nodeOs.release()}; ${nodeOs.arch()})` : \"draht (browser)\";\n}\n"]}
|