@varo-ui/ai 2.0.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -10,6 +10,8 @@ pnpm add @varo-ui/ai
10
10
 
11
11
  ## Usage
12
12
 
13
+ For an application-owned chunked request, feed its bytes to the transport and connect the normalized event stream:
14
+
13
15
  ```ts
14
16
  import { createAgentSseEventSource, createAgentStreamController } from '@varo-ui/ai'
15
17
 
@@ -22,6 +24,10 @@ await controller.connect(transport.source)
22
24
 
23
25
  `connect()` owns the iterator lifecycle: protocol `done`/`error` events settle the connection and request iterator cleanup, while natural iterator exhaustion synthesizes `done`.
24
26
 
27
+ The application must call `transport.end()` on normal transport completion or `transport.fail(error)` on request failure. Unsubscribe UI listeners and call `controller.destroy()` at teardown. Controller cancellation closes its iterator and local streaming lifecycle; it does not authorize a purchase, execute a tool, abort an application's network request, or choose a retry policy.
28
+
29
+ The root export provides the compiled protocol/controller API; `@varo-ui/ai/source` remains an explicit source entry. Neither entry is a provider SDK or a renderer. Shared presentation types/helpers live in the Registry `agent-presentation` unit, while target lifecycle/render code remains in H5 or native source.
30
+
25
31
  ## Thread versions
26
32
 
27
33
  ```ts
@@ -35,4 +41,36 @@ thread.select('root')
35
41
 
36
42
  The controller owns an immutable acyclic version graph. `append()` and `fork()` activate the new version; invalid ids, missing parents, cycles, and post-destroy mutations fail immediately.
37
43
 
38
- [Documentation](https://daguanren21.github.io/Varo/ai/) · [Repository](https://github.com/daguanren21/Varo)
44
+ ## Install presentation source separately
45
+
46
+ ```bash
47
+ # Conversation-only dependency closure
48
+ pnpm dlx @varo-ui/cli add --target h5 blocks/agent-chat
49
+ pnpm dlx @varo-ui/cli add --target weapp blocks/agent-chat
50
+
51
+ # Optional individual units
52
+ pnpm dlx @varo-ui/cli add --target h5 components/agent-workspace
53
+ pnpm dlx @varo-ui/cli add --target weapp components/agent-rag
54
+
55
+ # Intentional full suite
56
+ pnpm dlx @varo-ui/cli add --target h5 components/agent-ui
57
+ ```
58
+
59
+ | Registry item | Responsibility |
60
+ | ------------------------------- | ---------------------------------------------------------------------------------------- |
61
+ | `components/agent-presentation` | Pure presentation types and helpers shared by renderers |
62
+ | `components/agent-conversation` | Conversation, Markdown, streaming, reasoning, tools, approvals, and composition |
63
+ | `components/agent-workspace` | Context/retrieval receipts, task presentation, thread versions, and workspace placement |
64
+ | `components/agent-advanced` | Optional diffs, media, citations, tables, workflows, fine-tuning controls, and artifacts |
65
+ | `components/agent-rag` | Retrieval pipeline progress and source-linked answers |
66
+ | `components/agent-ui` | Deliberate composition of the full suite, not a compatibility alias |
67
+
68
+ `blocks/agent-chat` selects the conversation closure and does not pull advanced/RAG/fine-tuning source. When migrating from an all-in-one install, choose the unit you actually use; manually reconcile existing local customizations before any `--force` replacement. The CLI reports npm dependencies without installing them.
69
+
70
+ Rendered Agent units depend on optional `themes/agent`; `themes/base` no longer carries Agent tokens/helpers. H5 source brings dependency CSS imports. Native source consumers load all installed `src/styles/*.css` globally through `weapp.styles` with `include: 'app.vue'`, `varo.css` first, including `varo-agent.css`. Do not import page/global CSS from component-local WXSS.
71
+
72
+ These units declare H5/Weapp renderer support. The experimental `alipay`, `tt`, `xhs`, `donut-android`, `donut-ios`, and `donut-ohos` profiles do not gain Agent admission merely by sharing the native renderer; the complete selected manifest closure must explicitly admit a profile.
73
+
74
+ Registry source and styles are canonical. `pnpm sync:registry` projects them into the playgrounds and docs Agent source; `pnpm check:generated` detects drift. After generation and package builds, `pnpm check:consumers` checks the minimal Chat closure in actual CLI consumers. None of these commands asserts provider/network execution policy or device certification.
75
+
76
+ [Documentation](https://varo.weapp.dev/ai/) · [Repository](https://github.com/daguanren21/Varo)
package/dist/index.d.mts CHANGED
@@ -1,62 +1,61 @@
1
1
  import { GetMarkdownOptions, ParsedNode, ParsedNode as ParsedNode$1 } from "stream-markdown-parser";
2
-
3
2
  //#region src/types.d.ts
4
- type AgentMessageRole = 'assistant' | 'system' | 'user';
5
- type AgentStreamStatus = 'idle' | 'streaming' | 'waiting' | 'completed' | 'failed' | 'cancelled';
6
- type AgentPartStatus = 'waiting' | 'running' | 'completed' | 'failed';
7
- interface AgentMessageStartEvent {
3
+ export type AgentMessageRole = 'assistant' | 'system' | 'user';
4
+ export type AgentStreamStatus = 'idle' | 'streaming' | 'waiting' | 'completed' | 'failed' | 'cancelled';
5
+ export type AgentPartStatus = 'waiting' | 'running' | 'completed' | 'failed';
6
+ export interface AgentMessageStartEvent {
8
7
  messageId: string;
9
8
  role: AgentMessageRole;
10
9
  type: 'message.start';
11
10
  }
12
- interface AgentTextDeltaEvent {
11
+ export interface AgentTextDeltaEvent {
13
12
  delta: string;
14
13
  messageId: string;
15
14
  type: 'text.delta';
16
15
  }
17
- interface AgentMessageEndEvent {
16
+ export interface AgentMessageEndEvent {
18
17
  messageId: string;
19
18
  type: 'message.end';
20
19
  }
21
- interface AgentReasoningStartEvent {
20
+ export interface AgentReasoningStartEvent {
22
21
  id: string;
23
22
  title: string;
24
23
  type: 'reasoning.start';
25
24
  }
26
- interface AgentReasoningDeltaEvent {
25
+ export interface AgentReasoningDeltaEvent {
27
26
  delta: string;
28
27
  id: string;
29
28
  type: 'reasoning.delta';
30
29
  }
31
- interface AgentReasoningEndEvent {
30
+ export interface AgentReasoningEndEvent {
32
31
  durationMs?: number;
33
32
  id: string;
34
33
  type: 'reasoning.end';
35
34
  }
36
- interface AgentToolStartEvent {
35
+ export interface AgentToolStartEvent {
37
36
  id: string;
38
37
  input?: unknown;
39
38
  name: string;
40
39
  summary?: string;
41
40
  type: 'tool.start';
42
41
  }
43
- interface AgentToolUpdateEvent {
42
+ export interface AgentToolUpdateEvent {
44
43
  id: string;
45
44
  summary?: string;
46
45
  type: 'tool.update';
47
46
  }
48
- interface AgentToolResultEvent {
47
+ export interface AgentToolResultEvent {
49
48
  id: string;
50
49
  output?: unknown;
51
50
  summary?: string;
52
51
  type: 'tool.result';
53
52
  }
54
- interface AgentToolErrorEvent {
53
+ export interface AgentToolErrorEvent {
55
54
  error: string;
56
55
  id: string;
57
56
  type: 'tool.error';
58
57
  }
59
- interface AgentApprovalRequiredEvent {
58
+ export interface AgentApprovalRequiredEvent {
60
59
  choices?: Array<{
61
60
  description?: string;
62
61
  disabled?: boolean;
@@ -68,45 +67,45 @@ interface AgentApprovalRequiredEvent {
68
67
  title: string;
69
68
  type: 'approval.required';
70
69
  }
71
- interface AgentApprovalResolvedEvent {
70
+ export interface AgentApprovalResolvedEvent {
72
71
  id: string;
73
72
  type: 'approval.resolved';
74
73
  value: string;
75
74
  }
76
- interface AgentDataEvent {
75
+ export interface AgentDataEvent {
77
76
  name: string;
78
77
  type: 'data';
79
78
  value: unknown;
80
79
  }
81
- interface AgentErrorEvent {
80
+ export interface AgentErrorEvent {
82
81
  code?: string;
83
82
  message: string;
84
83
  retryable?: boolean;
85
84
  type: 'error';
86
85
  }
87
- interface AgentDoneEvent {
86
+ export interface AgentDoneEvent {
88
87
  type: 'done';
89
88
  usage?: {
90
89
  inputTokens?: number;
91
90
  outputTokens?: number;
92
91
  };
93
92
  }
94
- type AgentStreamEvent = AgentMessageStartEvent | AgentTextDeltaEvent | AgentMessageEndEvent | AgentReasoningStartEvent | AgentReasoningDeltaEvent | AgentReasoningEndEvent | AgentToolStartEvent | AgentToolUpdateEvent | AgentToolResultEvent | AgentToolErrorEvent | AgentApprovalRequiredEvent | AgentApprovalResolvedEvent | AgentDataEvent | AgentErrorEvent | AgentDoneEvent;
95
- interface AgentStreamMessage {
93
+ export type AgentStreamEvent = AgentMessageStartEvent | AgentTextDeltaEvent | AgentMessageEndEvent | AgentReasoningStartEvent | AgentReasoningDeltaEvent | AgentReasoningEndEvent | AgentToolStartEvent | AgentToolUpdateEvent | AgentToolResultEvent | AgentToolErrorEvent | AgentApprovalRequiredEvent | AgentApprovalResolvedEvent | AgentDataEvent | AgentErrorEvent | AgentDoneEvent;
94
+ export interface AgentStreamMessage {
96
95
  final: boolean;
97
96
  id: string;
98
97
  role: AgentMessageRole;
99
98
  source: string;
100
99
  visible: string;
101
100
  }
102
- interface AgentReasoningPart {
101
+ export interface AgentReasoningPart {
103
102
  content: string;
104
103
  durationMs?: number;
105
104
  id: string;
106
105
  status: AgentPartStatus;
107
106
  title: string;
108
107
  }
109
- interface AgentToolPart {
108
+ export interface AgentToolPart {
110
109
  error?: string;
111
110
  id: string;
112
111
  input?: unknown;
@@ -115,7 +114,7 @@ interface AgentToolPart {
115
114
  status: AgentPartStatus;
116
115
  summary?: string;
117
116
  }
118
- interface AgentApprovalPart {
117
+ export interface AgentApprovalPart {
119
118
  choices: AgentApprovalRequiredEvent['choices'];
120
119
  description?: string;
121
120
  id: string;
@@ -123,11 +122,11 @@ interface AgentApprovalPart {
123
122
  status: 'waiting' | 'completed';
124
123
  title: string;
125
124
  }
126
- interface AgentDataPart {
125
+ export interface AgentDataPart {
127
126
  name: string;
128
127
  value: unknown;
129
128
  }
130
- interface AgentStreamSnapshot {
129
+ export interface AgentStreamSnapshot {
131
130
  approval?: AgentApprovalPart;
132
131
  data: AgentDataPart[];
133
132
  error?: AgentErrorEvent;
@@ -138,7 +137,7 @@ interface AgentStreamSnapshot {
138
137
  tools: AgentToolPart[];
139
138
  usage?: AgentDoneEvent['usage'];
140
139
  }
141
- interface TextStreamSnapshot {
140
+ export interface TextStreamSnapshot {
142
141
  caughtUp: boolean;
143
142
  done: boolean;
144
143
  final: boolean;
@@ -147,7 +146,7 @@ interface TextStreamSnapshot {
147
146
  source: string;
148
147
  visible: string;
149
148
  }
150
- interface TextStreamOptions {
149
+ export interface TextStreamOptions {
151
150
  burstInitialContent?: boolean;
152
151
  burstRevealThresholdChars?: number;
153
152
  catchUpLatencyMs?: number;
@@ -160,7 +159,7 @@ interface TextStreamOptions {
160
159
  startDelayMs?: number;
161
160
  targetLatencyMs?: number;
162
161
  }
163
- interface TextStreamController {
162
+ export interface TextStreamController {
164
163
  destroy: () => void;
165
164
  dispose: () => void;
166
165
  enqueue: (chunk: string) => void;
@@ -176,7 +175,7 @@ interface TextStreamController {
176
175
  resume: () => void;
177
176
  subscribe: (listener: () => void) => () => void;
178
177
  }
179
- interface AgentStreamController {
178
+ export interface AgentStreamController {
180
179
  cancel: (reason?: string) => void;
181
180
  connect: (events: AsyncIterable<AgentStreamEvent>) => Promise<AgentStreamSnapshot>;
182
181
  destroy: () => void;
@@ -185,13 +184,13 @@ interface AgentStreamController {
185
184
  reset: () => void;
186
185
  subscribe: (listener: () => void) => () => void;
187
186
  }
188
- interface AgentEventChannel {
187
+ export interface AgentEventChannel {
189
188
  end: () => void;
190
189
  fail: (error: unknown) => void;
191
190
  push: (event: AgentStreamEvent) => void;
192
191
  source: AsyncIterable<AgentStreamEvent>;
193
192
  }
194
- interface AgentThreadVersion {
193
+ export interface AgentThreadVersion {
195
194
  readonly createdAt?: string;
196
195
  readonly id: string;
197
196
  readonly label?: string;
@@ -200,11 +199,11 @@ interface AgentThreadVersion {
200
199
  readonly pinned?: boolean;
201
200
  readonly summary?: string;
202
201
  }
203
- interface AgentThreadSnapshot {
202
+ export interface AgentThreadSnapshot {
204
203
  readonly activeVersionId?: string;
205
204
  readonly versions: readonly AgentThreadVersion[];
206
205
  }
207
- interface AgentThreadController {
206
+ export interface AgentThreadController {
208
207
  append: (version: AgentThreadVersion) => void;
209
208
  destroy: () => void;
210
209
  fork: (parentId: string, version: Omit<AgentThreadVersion, 'parentId'>) => void;
@@ -215,36 +214,36 @@ interface AgentThreadController {
215
214
  }
216
215
  //#endregion
217
216
  //#region src/agent-stream.d.ts
218
- interface AgentStreamControllerOptions {
217
+ export interface AgentStreamControllerOptions {
219
218
  text?: TextStreamOptions;
220
219
  }
221
- declare function createAgentStreamController(options?: AgentStreamControllerOptions): AgentStreamController;
220
+ export declare function createAgentStreamController(options?: AgentStreamControllerOptions): AgentStreamController;
222
221
  //#endregion
223
222
  //#region src/event-channel.d.ts
224
- declare function createAgentEventChannel(): AgentEventChannel;
223
+ export declare function createAgentEventChannel(): AgentEventChannel;
225
224
  //#endregion
226
225
  //#region src/event-parser.d.ts
227
- declare function parseAgentStreamEvent(value: unknown): AgentStreamEvent;
226
+ export declare function parseAgentStreamEvent(value: unknown): AgentStreamEvent;
228
227
  //#endregion
229
228
  //#region src/markdown.d.ts
230
- interface StreamingMarkdownParserOptions {
229
+ export interface StreamingMarkdownParserOptions {
231
230
  customHtmlTags?: readonly string[];
232
231
  enableMath?: boolean;
233
232
  includeSourceMap?: boolean;
234
233
  markdownItOptions?: GetMarkdownOptions['markdownItOptions'];
235
234
  validateLink?: (url: string) => boolean;
236
235
  }
237
- interface StreamingMarkdownParser {
236
+ export interface StreamingMarkdownParser {
238
237
  parse: (content: string, options?: {
239
238
  final?: boolean;
240
239
  }) => ParsedNode$1[];
241
240
  reset: () => void;
242
241
  }
243
- declare function createStreamingMarkdownParser(options?: StreamingMarkdownParserOptions): StreamingMarkdownParser;
242
+ export declare function createStreamingMarkdownParser(options?: StreamingMarkdownParserOptions): StreamingMarkdownParser;
244
243
  //#endregion
245
244
  //#region src/markdown-view.d.ts
246
- type AgentMarkdownNodeKind = 'admonition' | 'blockquote' | 'checkbox' | 'code-block' | 'definition' | 'definition-list' | 'emphasis' | 'footnote' | 'hardbreak' | 'heading' | 'highlight' | 'image' | 'inline-code' | 'insert' | 'link' | 'list' | 'list-item' | 'math-block' | 'math-inline' | 'paragraph' | 'strikethrough' | 'strong' | 'subscript' | 'superscript' | 'table' | 'table-cell' | 'table-row' | 'text' | 'thematic-break';
247
- interface AgentMarkdownViewNode {
245
+ export type AgentMarkdownNodeKind = 'admonition' | 'blockquote' | 'checkbox' | 'code-block' | 'definition' | 'definition-list' | 'emphasis' | 'footnote' | 'hardbreak' | 'heading' | 'highlight' | 'image' | 'inline-code' | 'insert' | 'link' | 'list' | 'list-item' | 'math-block' | 'math-inline' | 'paragraph' | 'strikethrough' | 'strong' | 'subscript' | 'superscript' | 'table' | 'table-cell' | 'table-row' | 'text' | 'thematic-break';
246
+ export interface AgentMarkdownViewNode {
248
247
  align?: 'center' | 'left' | 'right';
249
248
  alt?: string;
250
249
  checked?: boolean;
@@ -260,7 +259,7 @@ interface AgentMarkdownViewNode {
260
259
  text?: string;
261
260
  title?: string;
262
261
  }
263
- type AgentRichTextNode = {
262
+ export type AgentRichTextNode = {
264
263
  text: string;
265
264
  type: 'text';
266
265
  } | {
@@ -268,24 +267,24 @@ type AgentRichTextNode = {
268
267
  children?: AgentRichTextNode[];
269
268
  name: 'br' | 'code' | 'del' | 'em' | 'ins' | 'mark' | 'span' | 'strong' | 'sub' | 'sup';
270
269
  };
271
- declare function toAgentRichTextNodes(nodes: AgentMarkdownViewNode[]): AgentRichTextNode[] | undefined;
272
- declare function normalizeMarkdownNode(node: ParsedNode$1): AgentMarkdownViewNode;
273
- declare function normalizeMarkdownNodes(nodes: ParsedNode$1[]): AgentMarkdownViewNode[];
270
+ export declare function toAgentRichTextNodes(nodes: AgentMarkdownViewNode[]): AgentRichTextNode[] | undefined;
271
+ export declare function normalizeMarkdownNode(node: ParsedNode$1): AgentMarkdownViewNode;
272
+ export declare function normalizeMarkdownNodes(nodes: ParsedNode$1[]): AgentMarkdownViewNode[];
274
273
  //#endregion
275
274
  //#region src/sse.d.ts
276
- interface AgentSseEventSource {
275
+ export interface AgentSseEventSource {
277
276
  end: () => void;
278
277
  fail: (error: unknown) => void;
279
278
  feed: (chunk: string | ArrayBuffer | Uint8Array) => void;
280
279
  source: AsyncIterable<AgentStreamEvent>;
281
280
  }
282
- declare function createAgentSseEventSource(): AgentSseEventSource;
281
+ export declare function createAgentSseEventSource(): AgentSseEventSource;
283
282
  //#endregion
284
283
  //#region src/text-stream.d.ts
285
- declare function createTextStream(options?: TextStreamOptions): TextStreamController;
284
+ export declare function createTextStream(options?: TextStreamOptions): TextStreamController;
286
285
  //#endregion
287
286
  //#region src/thread.d.ts
288
- declare function createAgentThreadController(initial?: AgentThreadSnapshot): AgentThreadController;
287
+ export declare function createAgentThreadController(initial?: AgentThreadSnapshot): AgentThreadController;
289
288
  //#endregion
290
- export { AgentApprovalPart, AgentApprovalRequiredEvent, AgentApprovalResolvedEvent, AgentDataEvent, AgentDataPart, AgentDoneEvent, AgentErrorEvent, AgentEventChannel, AgentMarkdownNodeKind, AgentMarkdownViewNode, AgentMessageEndEvent, AgentMessageRole, AgentMessageStartEvent, AgentPartStatus, AgentReasoningDeltaEvent, AgentReasoningEndEvent, AgentReasoningPart, AgentReasoningStartEvent, AgentRichTextNode, AgentSseEventSource, AgentStreamController, AgentStreamControllerOptions, AgentStreamEvent, AgentStreamMessage, AgentStreamSnapshot, AgentStreamStatus, AgentTextDeltaEvent, AgentThreadController, AgentThreadSnapshot, AgentThreadVersion, AgentToolErrorEvent, AgentToolPart, AgentToolResultEvent, AgentToolStartEvent, AgentToolUpdateEvent, type ParsedNode, StreamingMarkdownParser, StreamingMarkdownParserOptions, TextStreamController, TextStreamOptions, TextStreamSnapshot, createAgentEventChannel, createAgentSseEventSource, createAgentStreamController, createAgentThreadController, createStreamingMarkdownParser, createTextStream, normalizeMarkdownNode, normalizeMarkdownNodes, parseAgentStreamEvent, toAgentRichTextNodes };
289
+ export type { ParsedNode };
291
290
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/agent-stream.ts","../src/event-channel.ts","../src/event-parser.ts","../src/markdown.ts","../src/markdown-view.ts","../src/sse.ts","../src/text-stream.ts","../src/thread.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/agent-stream.ts","../src/event-channel.ts","../src/event-parser.ts","../src/markdown.ts","../src/markdown-view.ts","../src/sse.ts","../src/text-stream.ts","../src/thread.ts"],"mappings":";;YAAY;YACA;YACA;iBAEK;EACf;EACA,MAAM;EACN;;iBAGe;EACf;EACA;EACA;;iBAGe;EACf;EACA;;iBAGe;EACf;EACA;EACA;;iBAGe;EACf;EACA;EACA;;iBAGe;EACf;EACA;EACA;;iBAGe;EACf;EACA;EACA;EACA;EACA;;iBAGe;EACf;EACA;EACA;;iBAGe;EACf;EACA;EACA;EACA;;iBAGe;EACf;EACA;EACA;;iBAGe;EACf,UAAU;IACR;IACA;IACA;IACA;;EAEF;EACA;EACA;EACA;;iBAGe;EACf;EACA;EACA;;iBAGe;EACf;EACA;EACA;;iBAGe;EACf;EACA;EACA;EACA;;iBAGe;EACf;EACA;IACE;IACA;;;YAIQ,mBACN,yBACA,sBACA,uBACA,2BACA,2BACA,yBACA,sBACA,uBACA,uBACA,sBACA,6BACA,6BACA,iBACA,kBACA;iBAEW;EACf;EACA;EACA,MAAM;EACN;EACA;;iBAGe;EACf;EACA;EACA;EACA,QAAQ;EACR;;iBAGe;EACf;EACA;EACA;EACA;EACA;EACA,QAAQ;EACR;;iBAGe;EACf,SAAS;EACT;EACA;EACA;EACA;EACA;;iBAGe;EACf;EACA;;iBAGe;EACf,WAAW;EACX,MAAM;EACN,QAAQ;EACR;EACA,UAAU;EACV,WAAW;EACX,QAAQ;EACR,OAAO;EACP,QAAQ;;iBAGO;EACf;EACA;EACA;EACA;EACA;EACA;EACA;;iBAGe;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;iBAGe;EACf;EACA;EACA,UAAU;EACV,SAAS;IAAY;;EACrB;EACA,mBAAmB;EACnB;EACA,QAAQ,kBAAkB;IAAY;;EACtC;EACA,YAAY;;iBAGG;EACf,SAAS;EACT,UAAU,QAAQ,cAAc,sBAAsB,QAAQ;EAC9D;EACA,mBAAmB;EACnB,OAAO,OAAO;EACd;EACA,YAAY;;iBAGG;EACf;EACA,OAAO;EACP,OAAO,OAAO;EACd,QAAQ,cAAc;;iBAGP;WACN;WACA;WACA;WACA;WACA;WACA;WACA;;iBAGM;WACN;WACA,mBAAmB;;iBAGb;EACf,SAAS,SAAS;EAClB;EACA,OAAO,kBAAkB,SAAS,KAAK;EACvC,mBAAmB;EACnB,QAAQ,UAAU;EAClB,SAAS;EACT,YAAY;;;;iBC/OG;EACf,OAAO;;wBAsBO,4BACd,UAAS,+BACR;;;wBCnCa,2BAA2B;;;wBCgD3B,sBAAsB,iBAAiB;;;iBC1CtC;EACf;EACA;EACA;EACA,oBAAoB;EACpB,gBAAgB;;iBAGD;EACf,QAAQ,iBAAiB;IAAY;QAAsB;EAC3D;;wBAKc,8BACd,UAAS,iCACR;;;YCtBS;iBA+BK;EACf;EACA;EACA;EACA,WAAW;EACX;EACA;EACA,MAAM;EACN;EACA;EACA;EACA;EACA;EACA;EACA;;YAGU;EAER;EACA;;EAGA,QAAQ;EACR,WAAW;EACX;;wBAmEY,qBAAqB,OAAO,0BAA0B;wBA+CtD,sBAAsB,MAAM,eAAa;wBAoIzC,uBAAuB,OAAO,iBAAe;;;iBC7S5C;EACf;EACA,OAAO;EACP,OAAO,gBAAgB,cAAc;EACrC,QAAQ,cAAc;;wBAiFR,6BAA6B;;;wBCqL7B,iBAAiB,UAAS,oBAAyB;;;wBCxMnD,4BACd,UAAU,sBACT"}
package/dist/index.mjs CHANGED
@@ -419,7 +419,6 @@ function createAgentStreamController(options = {}) {
419
419
  setSnapshot({ usage: event.usage });
420
420
  if (!snapshot.message) setSnapshot({ status: "completed" });
421
421
  finalStatus();
422
- break;
423
422
  }
424
423
  }
425
424
  async function waitForTerminal() {
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["node"],"sources":["../src/text-stream.ts","../src/agent-stream.ts","../src/event-channel.ts","../src/type-guards.ts","../src/event-parser.ts","../src/markdown.ts","../src/markdown-view.ts","../src/sse.ts","../src/thread.ts"],"sourcesContent":["import type { TextStreamController, TextStreamOptions, TextStreamSnapshot } from './types'\nimport { createSmoothMarkdownStream } from 'markstream-core'\n\ninterface SegmenterLike {\n segment: (value: string) => Iterable<{ segment: string }>\n}\n\nfunction splitGraphemes(value: string): string[] {\n const intlRuntime: unknown = Intl\n if (\n typeof intlRuntime !== 'object'\n || intlRuntime === null\n || !('Segmenter' in intlRuntime)\n || typeof intlRuntime.Segmenter !== 'function'\n ) {\n return Array.from(value)\n }\n\n // Runtime constructor shape is checked above; TypeScript's configured Intl lib omits Segmenter.\n const Segmenter = intlRuntime.Segmenter as new (\n locale?: string,\n options?: { granularity: 'grapheme' }\n ) => SegmenterLike\n return Array.from(new Segmenter(undefined, { granularity: 'grapheme' }).segment(value), item => item.segment)\n}\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.min(max, Math.max(min, value))\n}\n\nfunction hasUnclosedFence(value: string) {\n let marker: '`' | '~' | undefined\n let markerLength = 0\n for (const line of value.split(/\\r?\\n/)) {\n const match = /^ {0,3}(`{3,}|~{3,})/.exec(line)\n if (!match) { continue }\n const nextMarker = match[1][0] as '`' | '~'\n const nextLength = match[1].length\n if (!marker) {\n marker = nextMarker\n markerLength = nextLength\n }\n else if (marker === nextMarker && nextLength >= markerLength) {\n marker = undefined\n markerLength = 0\n }\n }\n return marker !== undefined\n}\n\nfunction fenceSafeCommitCount(visible: string, source: string, segments: string[]) {\n if (segments.length === 0) { return 0 }\n const candidate = visible + segments.join('')\n const lineStart = candidate.lastIndexOf('\\n') + 1\n const candidateLine = candidate.slice(lineStart)\n const sourceLineEnd = source.indexOf('\\n', lineStart)\n const sourceLine = source.slice(lineStart, sourceLineEnd < 0 ? source.length : sourceLineEnd)\n const match = /^ {0,3}(`+|~+)/.exec(sourceLine)\n if (!match) { return segments.length }\n\n const marker = match[1]\n const unresolvedCandidate = marker.length < 3 && sourceLine.trim() === marker\n const completeFence = marker.length >= 3\n if ((unresolvedCandidate || completeFence) && /^ {0,3}(?:`+|~+)/.test(candidateLine)) {\n return 0\n }\n return segments.length\n}\n\nfunction createTimerTextStream(options: TextStreamOptions = {}): TextStreamController {\n const minCharsPerSecond = Math.max(1, options.minCharsPerSecond ?? 40)\n const maxCharsPerSecond = Math.max(minCharsPerSecond, options.maxCharsPerSecond ?? 1000)\n const targetLatencyMs = Math.max(1, options.targetLatencyMs ?? 900)\n const catchUpLatencyMs = Math.max(1, options.catchUpLatencyMs ?? 350)\n const maxCommitFps = Math.max(1, Math.min(30, options.maxCommitFps ?? 30))\n const maxCharsPerCommit = Math.max(1, options.maxCharsPerCommit ?? 80)\n const catchUpThreshold = Math.max(0, options.catchUpThreshold ?? 600)\n const startDelayMs = Math.max(0, options.startDelayMs ?? 80)\n const flushOnFinish = options.flushOnFinish ?? false\n const burstInitialContent = options.burstInitialContent ?? false\n const burstRevealThresholdChars = Math.max(1, options.burstRevealThresholdChars ?? 2048)\n const listeners = new Set<() => void>()\n const pending: string[] = []\n let pendingOffset = 0\n let source = ''\n let visible = ''\n let done = false\n let paused = false\n let destroyed = false\n let timer: ReturnType<typeof setTimeout> | undefined\n let lastTick = Date.now()\n let firstPendingAt = 0\n let budget = 0\n\n function pendingCount() {\n return pending.length - pendingOffset\n }\n\n function snapshot(): TextStreamSnapshot {\n const pendingChars = Math.max(0, source.length - visible.length)\n return {\n caughtUp: pendingCount() === 0,\n done,\n final: done && pendingCount() === 0,\n paused,\n pendingChars,\n source,\n visible,\n }\n }\n\n function emit() {\n listeners.forEach(listener => listener())\n }\n\n function compactPending() {\n if (pendingOffset < 1024 || pendingOffset * 2 < pending.length) { return }\n pending.splice(0, pendingOffset)\n pendingOffset = 0\n }\n\n function schedule() {\n if (destroyed || paused || timer || pendingCount() === 0) { return }\n // The scheduler and tick callback are mutually recursive by design.\n // eslint-disable-next-line ts/no-use-before-define\n timer = setTimeout(tick, Math.ceil(1000 / maxCommitFps))\n }\n\n function tick() {\n timer = undefined\n if (destroyed || paused) { return }\n\n const now = Date.now()\n if (firstPendingAt && now - firstPendingAt < startDelayMs) {\n schedule()\n return\n }\n firstPendingAt = 0\n\n const deltaMs = Math.max(1, now - lastTick)\n lastTick = now\n const backlog = pendingCount()\n if (backlog === 0) {\n emit()\n return\n }\n\n const latencyMs = backlog >= catchUpThreshold ? catchUpLatencyMs : targetLatencyMs\n const latencyCps = (backlog * 1000) / latencyMs\n const cps = clamp(latencyCps, minCharsPerSecond, maxCharsPerSecond)\n budget += (cps * deltaMs) / 1000\n const commitCount = Math.min(backlog, maxCharsPerCommit, Math.max(1, Math.floor(budget)))\n let proposedSegments = pending.slice(pendingOffset, pendingOffset + commitCount)\n let safeCommitCount = fenceSafeCommitCount(visible, source, proposedSegments)\n if (safeCommitCount === 0) {\n const newlineOffset = pending.slice(pendingOffset).findIndex(segment => segment.includes('\\n'))\n if (newlineOffset >= 0) {\n proposedSegments = pending.slice(pendingOffset, pendingOffset + newlineOffset + 1)\n safeCommitCount = fenceSafeCommitCount(visible, source, proposedSegments)\n }\n }\n if (safeCommitCount === 0) {\n emit()\n schedule()\n return\n }\n budget = Math.max(0, budget - safeCommitCount)\n visible += proposedSegments.slice(0, safeCommitCount).join('')\n pendingOffset += safeCommitCount\n compactPending()\n emit()\n schedule()\n }\n\n function cancelTimer() {\n clearTimeout(timer)\n timer = undefined\n }\n\n function destroy() {\n if (destroyed) { return }\n destroyed = true\n cancelTimer()\n pending.length = 0\n listeners.clear()\n }\n\n return {\n destroy,\n dispose: destroy,\n enqueue(chunk) {\n if (destroyed || !chunk) { return }\n if (done) { done = false }\n const initialChunk = source.length === 0\n source += chunk\n pending.push(...splitGraphemes(chunk))\n if (initialChunk) { firstPendingAt = Date.now() }\n lastTick = Date.now()\n\n if (\n initialChunk\n && burstInitialContent\n && pendingCount() >= burstRevealThresholdChars\n && !hasUnclosedFence(source)\n ) {\n visible = source\n pending.length = 0\n pendingOffset = 0\n firstPendingAt = 0\n }\n\n emit()\n schedule()\n },\n finish(finishOptions = {}) {\n if (destroyed) { return }\n done = true\n if (finishOptions.flush ?? flushOnFinish) {\n visible = source\n pending.length = 0\n pendingOffset = 0\n cancelTimer()\n }\n emit()\n schedule()\n },\n flush() {\n if (destroyed) { return }\n visible = source\n pending.length = 0\n pendingOffset = 0\n budget = 0\n cancelTimer()\n emit()\n },\n getSnapshot: snapshot,\n pause() {\n if (destroyed || paused) { return }\n paused = true\n cancelTimer()\n emit()\n },\n reset(content = '', _resetOptions = {}) {\n cancelTimer()\n source = content\n visible = content\n pending.length = 0\n pendingOffset = 0\n done = false\n paused = false\n budget = 0\n firstPendingAt = 0\n lastTick = Date.now()\n emit()\n },\n resume() {\n if (destroyed || !paused) { return }\n paused = false\n lastTick = Date.now()\n emit()\n schedule()\n },\n subscribe(listener) {\n if (destroyed) { return () => {} }\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n }\n}\n\nexport function createTextStream(options: TextStreamOptions = {}): TextStreamController {\n if (typeof requestAnimationFrame !== 'function' || typeof cancelAnimationFrame !== 'function') {\n return createTimerTextStream(options)\n }\n\n const controller = createSmoothMarkdownStream(options)\n return {\n destroy: controller.destroy,\n dispose: controller.dispose,\n enqueue: controller.enqueue,\n finish: controller.finish,\n flush: controller.flush,\n getSnapshot: controller.getSnapshot,\n pause: controller.pause,\n reset: controller.reset,\n resume: controller.resume,\n subscribe: controller.subscribe,\n }\n}\n","import { createTextStream } from './text-stream'\nimport type {\n AgentApprovalPart,\n AgentErrorEvent,\n AgentReasoningPart,\n AgentStreamController,\n AgentStreamEvent,\n AgentStreamSnapshot,\n AgentToolPart,\n TextStreamOptions\n} from './types'\n\nexport interface AgentStreamControllerOptions {\n text?: TextStreamOptions\n}\n\nfunction requestIteratorCleanup(iterator: AsyncIterator<AgentStreamEvent>) {\n try {\n const cleanup = iterator.return?.()\n if (cleanup) void cleanup.catch(() => undefined)\n } catch {\n // Cleanup failures must not replace an already terminal connection result.\n }\n}\n\nfunction initialSnapshot(): AgentStreamSnapshot {\n return {\n data: [],\n eventCount: 0,\n reasoning: [],\n status: 'idle',\n tools: []\n }\n}\n\nexport function createAgentStreamController(\n options: AgentStreamControllerOptions = {}\n): AgentStreamController {\n const text = createTextStream(options.text)\n const listeners = new Set<() => void>()\n let snapshot = initialSnapshot()\n let destroyed = false\n let cancelled = false\n let transportDone = false\n let connecting = false\n let cancelActiveConnect: (() => void) | undefined\n\n function emit() {\n listeners.forEach((listener) => listener())\n }\n\n function setSnapshot(update: Partial<AgentStreamSnapshot>) {\n snapshot = { ...snapshot, ...update }\n emit()\n }\n\n function updateReasoning(id: string, update: Partial<AgentReasoningPart>) {\n setSnapshot({\n reasoning: snapshot.reasoning.map((part) => (part.id === id ? { ...part, ...update } : part))\n })\n }\n\n function updateTool(id: string, update: Partial<AgentToolPart>) {\n setSnapshot({\n tools: snapshot.tools.map((part) => (part.id === id ? { ...part, ...update } : part))\n })\n }\n\n function finalStatus() {\n const textSnapshot = text.getSnapshot()\n if (!transportDone || !textSnapshot.final) return\n setSnapshot({ status: snapshot.error ? 'failed' : cancelled ? 'cancelled' : 'completed' })\n }\n\n const unsubscribeText = text.subscribe(() => {\n if (destroyed || !snapshot.message) return\n const textSnapshot = text.getSnapshot()\n snapshot = {\n ...snapshot,\n message: {\n ...snapshot.message,\n final: textSnapshot.final,\n source: textSnapshot.source,\n visible: textSnapshot.visible\n }\n }\n emit()\n finalStatus()\n })\n\n function push(event: AgentStreamEvent) {\n if (destroyed || cancelled) return\n snapshot = { ...snapshot, eventCount: snapshot.eventCount + 1 }\n\n switch (event.type) {\n case 'message.start':\n transportDone = false\n text.reset()\n setSnapshot({\n error: undefined,\n message: {\n final: false,\n id: event.messageId,\n role: event.role,\n source: '',\n visible: ''\n },\n status: 'streaming'\n })\n break\n case 'text.delta':\n if (snapshot.message?.id === event.messageId) text.enqueue(event.delta)\n break\n case 'message.end':\n if (snapshot.message?.id === event.messageId) text.finish()\n break\n case 'reasoning.start':\n setSnapshot({\n reasoning: [\n ...snapshot.reasoning,\n { content: '', id: event.id, status: 'running', title: event.title }\n ]\n })\n break\n case 'reasoning.delta': {\n const part = snapshot.reasoning.find((item) => item.id === event.id)\n if (part) updateReasoning(event.id, { content: `${part.content}${event.delta}` })\n break\n }\n case 'reasoning.end':\n updateReasoning(event.id, { durationMs: event.durationMs, status: 'completed' })\n break\n case 'tool.start':\n setSnapshot({\n tools: [\n ...snapshot.tools,\n {\n id: event.id,\n input: event.input,\n name: event.name,\n status: 'running',\n summary: event.summary\n }\n ]\n })\n break\n case 'tool.update':\n updateTool(event.id, { summary: event.summary })\n break\n case 'tool.result':\n updateTool(event.id, {\n output: event.output,\n status: 'completed',\n summary: event.summary\n })\n break\n case 'tool.error':\n updateTool(event.id, { error: event.error, status: 'failed' })\n break\n case 'approval.required': {\n const approval: AgentApprovalPart = {\n choices: event.choices ?? [],\n description: event.description,\n id: event.id,\n status: 'waiting',\n title: event.title\n }\n setSnapshot({ approval, status: 'waiting' })\n break\n }\n case 'approval.resolved':\n if (snapshot.approval?.id === event.id) {\n setSnapshot({\n approval: {\n ...snapshot.approval,\n resolvedValue: event.value,\n status: 'completed'\n },\n status: 'streaming'\n })\n }\n break\n case 'data':\n setSnapshot({ data: [...snapshot.data, { name: event.name, value: event.value }] })\n break\n case 'error':\n transportDone = true\n text.finish({ flush: true })\n setSnapshot({ error: event, status: 'failed' })\n break\n case 'done':\n transportDone = true\n text.finish()\n setSnapshot({ usage: event.usage })\n if (!snapshot.message) setSnapshot({ status: 'completed' })\n finalStatus()\n break\n }\n }\n\n async function waitForTerminal() {\n if (snapshot.status === 'completed' || snapshot.status === 'failed' || snapshot.status === 'cancelled') {\n return snapshot\n }\n\n return await new Promise<AgentStreamSnapshot>((resolve) => {\n const unsubscribe = subscribe(() => {\n if (snapshot.status !== 'completed' && snapshot.status !== 'failed' && snapshot.status !== 'cancelled') return\n unsubscribe()\n resolve(snapshot)\n })\n })\n }\n\n function subscribe(listener: () => void) {\n if (destroyed) return () => {}\n listeners.add(listener)\n return () => listeners.delete(listener)\n }\n\n function reset() {\n text.reset()\n snapshot = initialSnapshot()\n cancelled = false\n transportDone = false\n emit()\n }\n\n function cancel(reason = 'Cancelled') {\n if (destroyed || cancelled) return\n cancelled = true\n transportDone = true\n text.finish({ flush: true })\n const error: AgentErrorEvent = { code: 'cancelled', message: reason, retryable: true, type: 'error' }\n setSnapshot({ error, status: 'cancelled' })\n cancelActiveConnect?.()\n }\n\n return {\n cancel,\n async connect(events) {\n if (connecting) throw new Error('Agent stream controller is already connected')\n connecting = true\n reset()\n const iterator = events[Symbol.asyncIterator]()\n let resolveCancellation: (() => void) | undefined\n const cancellation = new Promise<void>((resolve) => {\n resolveCancellation = resolve\n })\n cancelActiveConnect = resolveCancellation\n\n let protocolTerminal = false\n try {\n try {\n while (!cancelled && !destroyed) {\n const outcome = await Promise.race([\n iterator.next().then((result) => ({ kind: 'event' as const, result })),\n cancellation.then(() => ({ kind: 'cancelled' as const }))\n ])\n if (outcome.kind === 'cancelled' || outcome.result.done) break\n const event = outcome.result.value\n push(event)\n if (event.type === 'done' || event.type === 'error') {\n protocolTerminal = true\n break\n }\n }\n if (!transportDone && !cancelled && !destroyed) push({ type: 'done' })\n } catch (error) {\n push({\n message: error instanceof Error ? error.message : String(error),\n retryable: true,\n type: 'error'\n })\n } finally {\n if (protocolTerminal || cancelled || destroyed) requestIteratorCleanup(iterator)\n }\n return await waitForTerminal()\n } finally {\n connecting = false\n cancelActiveConnect = undefined\n }\n },\n destroy() {\n if (destroyed) return\n cancel('Agent stream controller destroyed')\n destroyed = true\n unsubscribeText()\n text.destroy()\n listeners.clear()\n },\n getSnapshot() {\n return snapshot\n },\n push,\n reset,\n subscribe\n }\n}\n","import type { AgentEventChannel, AgentStreamEvent } from './types'\n\nexport function createAgentEventChannel(): AgentEventChannel {\n const queue: AgentStreamEvent[] = []\n let ended = false\n let failure: Error | undefined\n let wake: (() => void) | undefined\n\n function stopConsuming() {\n ended = true\n queue.length = 0\n notify()\n }\n\n async function* iterate(): AsyncGenerator<AgentStreamEvent> {\n try {\n while (!ended || queue.length > 0) {\n if (failure) throw failure\n const event = queue.shift()\n if (event) {\n yield event\n continue\n }\n\n await new Promise<void>((resolve) => {\n wake = resolve\n })\n wake = undefined\n }\n if (failure) throw failure\n } finally {\n stopConsuming()\n }\n }\n\n function createIterator(): AsyncIterator<AgentStreamEvent> {\n const iterator = iterate()\n return {\n next() {\n return iterator.next()\n },\n return() {\n stopConsuming()\n return iterator.return(undefined)\n }\n }\n }\n\n function notify() {\n wake?.()\n }\n\n return {\n end() {\n ended = true\n notify()\n },\n fail(error) {\n failure = error instanceof Error ? error : new Error(String(error))\n ended = true\n notify()\n },\n push(event) {\n if (ended) return\n queue.push(event)\n notify()\n },\n source: {\n [Symbol.asyncIterator]: createIterator\n }\n }\n}\n","export function isUnknownRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","import { isUnknownRecord } from './type-guards'\nimport type { AgentApprovalRequiredEvent, AgentStreamEvent } from './types'\n\n\nfunction requiredString(value: Record<string, unknown>, key: string): string {\n const field = value[key]\n if (typeof field !== 'string' || field.length === 0) {\n throw new TypeError(`Agent stream event field \"${key}\" must be a non-empty string`)\n }\n return field\n}\n\nfunction optionalString(value: Record<string, unknown>, key: string): string | undefined {\n const field = value[key]\n if (field === undefined) return undefined\n if (typeof field !== 'string') throw new TypeError(`Agent stream event field \"${key}\" must be a string`)\n return field\n}\n\nfunction optionalBoolean(value: Record<string, unknown>, key: string): boolean | undefined {\n const field = value[key]\n if (field === undefined) return undefined\n if (typeof field !== 'boolean') throw new TypeError(`Agent stream event field \"${key}\" must be a boolean`)\n return field\n}\n\nfunction optionalNumber(value: Record<string, unknown>, key: string): number | undefined {\n const field = value[key]\n if (field === undefined) return undefined\n if (typeof field !== 'number' || !Number.isFinite(field)) {\n throw new TypeError(`Agent stream event field \"${key}\" must be a finite number`)\n }\n return field\n}\n\nfunction parseChoices(value: unknown): AgentApprovalRequiredEvent['choices'] {\n if (value === undefined) return undefined\n if (!Array.isArray(value)) throw new TypeError('Agent approval choices must be an array')\n\n return value.map((choice) => {\n if (!isUnknownRecord(choice)) throw new TypeError('Agent approval choice must be an object')\n return {\n description: optionalString(choice, 'description'),\n disabled: optionalBoolean(choice, 'disabled'),\n label: requiredString(choice, 'label'),\n value: requiredString(choice, 'value')\n }\n })\n}\n\nexport function parseAgentStreamEvent(value: unknown): AgentStreamEvent {\n if (!isUnknownRecord(value) || typeof value.type !== 'string') {\n throw new TypeError('Agent stream event must be an object with a string type')\n }\n\n switch (value.type) {\n case 'message.start': {\n const role = requiredString(value, 'role')\n if (role !== 'assistant' && role !== 'system' && role !== 'user') {\n throw new TypeError(`Unsupported agent message role: ${role}`)\n }\n return { messageId: requiredString(value, 'messageId'), role, type: value.type }\n }\n case 'text.delta':\n return {\n delta: requiredString(value, 'delta'),\n messageId: requiredString(value, 'messageId'),\n type: value.type\n }\n case 'message.end':\n return { messageId: requiredString(value, 'messageId'), type: value.type }\n case 'reasoning.start':\n return {\n id: requiredString(value, 'id'),\n title: requiredString(value, 'title'),\n type: value.type\n }\n case 'reasoning.delta':\n return {\n delta: requiredString(value, 'delta'),\n id: requiredString(value, 'id'),\n type: value.type\n }\n case 'reasoning.end':\n return {\n durationMs: optionalNumber(value, 'durationMs'),\n id: requiredString(value, 'id'),\n type: value.type\n }\n case 'tool.start':\n return {\n id: requiredString(value, 'id'),\n input: value.input,\n name: requiredString(value, 'name'),\n summary: optionalString(value, 'summary'),\n type: value.type\n }\n case 'tool.update':\n return {\n id: requiredString(value, 'id'),\n summary: optionalString(value, 'summary'),\n type: value.type\n }\n case 'tool.result':\n return {\n id: requiredString(value, 'id'),\n output: value.output,\n summary: optionalString(value, 'summary'),\n type: value.type\n }\n case 'tool.error':\n return {\n error: requiredString(value, 'error'),\n id: requiredString(value, 'id'),\n type: value.type\n }\n case 'approval.required':\n return {\n choices: parseChoices(value.choices),\n description: optionalString(value, 'description'),\n id: requiredString(value, 'id'),\n title: requiredString(value, 'title'),\n type: value.type\n }\n case 'approval.resolved':\n return {\n id: requiredString(value, 'id'),\n type: value.type,\n value: requiredString(value, 'value')\n }\n case 'data':\n if (!('value' in value)) throw new TypeError('Agent data event must include a value field')\n return { name: requiredString(value, 'name'), type: value.type, value: value.value }\n case 'error':\n return {\n code: optionalString(value, 'code'),\n message: requiredString(value, 'message'),\n retryable: optionalBoolean(value, 'retryable'),\n type: value.type\n }\n case 'done': {\n const usage = value.usage\n if (usage !== undefined && !isUnknownRecord(usage)) {\n throw new TypeError('Agent done usage must be an object')\n }\n return {\n type: value.type,\n usage: usage\n ? {\n inputTokens: optionalNumber(usage, 'inputTokens'),\n outputTokens: optionalNumber(usage, 'outputTokens')\n }\n : undefined\n }\n }\n default:\n throw new TypeError(`Unsupported agent stream event type: ${value.type}`)\n }\n}\n","import {\n getMarkdown,\n isUnsafeHtmlUrl,\n parseMarkdownToStructure,\n type GetMarkdownOptions,\n type ParsedNode\n} from 'stream-markdown-parser'\n\nexport interface StreamingMarkdownParserOptions {\n customHtmlTags?: readonly string[]\n enableMath?: boolean\n includeSourceMap?: boolean\n markdownItOptions?: GetMarkdownOptions['markdownItOptions']\n validateLink?: (url: string) => boolean\n}\n\nexport interface StreamingMarkdownParser {\n parse: (content: string, options?: { final?: boolean }) => ParsedNode[]\n reset: () => void\n}\n\nlet parserId = 0\n\nexport function createStreamingMarkdownParser(\n options: StreamingMarkdownParserOptions = {}\n): StreamingMarkdownParser {\n parserId += 1\n const validateLink = options.validateLink ?? ((url: string) => !isUnsafeHtmlUrl(url))\n const markdown = getMarkdown(`varo-agent-${parserId}`, {\n customHtmlTags: options.customHtmlTags,\n enableMath: options.enableMath ?? true,\n markdownItOptions: {\n breaks: true,\n html: false,\n linkify: true,\n ...options.markdownItOptions,\n validateLink\n }\n })\n\n return {\n parse(content, parseOptions = {}) {\n return parseMarkdownToStructure(content, markdown, {\n customHtmlTags: options.customHtmlTags,\n final: parseOptions.final ?? false,\n includeSourceMap: options.includeSourceMap ?? false,\n reuseStableTopLevelNodes: true,\n streamParse: 'auto',\n validateLink\n })\n },\n reset() {\n markdown.stream?.reset?.()\n }\n }\n}\n\nexport type { ParsedNode } from 'stream-markdown-parser'\n","import type { ParsedNode } from 'stream-markdown-parser'\nimport { isUnknownRecord } from './type-guards'\n\nexport type AgentMarkdownNodeKind\n = | 'admonition'\n | 'blockquote'\n | 'checkbox'\n | 'code-block'\n | 'definition'\n | 'definition-list'\n | 'emphasis'\n | 'footnote'\n | 'hardbreak'\n | 'heading'\n | 'highlight'\n | 'image'\n | 'inline-code'\n | 'insert'\n | 'link'\n | 'list'\n | 'list-item'\n | 'math-block'\n | 'math-inline'\n | 'paragraph'\n | 'strikethrough'\n | 'strong'\n | 'subscript'\n | 'superscript'\n | 'table'\n | 'table-cell'\n | 'table-row'\n | 'text'\n | 'thematic-break'\n\nexport interface AgentMarkdownViewNode {\n align?: 'center' | 'left' | 'right'\n alt?: string\n checked?: boolean\n children?: AgentMarkdownViewNode[]\n header?: boolean\n href?: string\n kind: AgentMarkdownNodeKind\n language?: string\n level?: number\n loading?: boolean\n ordered?: boolean\n start?: number\n text?: string\n title?: string\n}\n\nexport type AgentRichTextNode\n = | {\n text: string\n type: 'text'\n }\n | {\n attrs?: Record<string, string>\n children?: AgentRichTextNode[]\n name: 'br' | 'code' | 'del' | 'em' | 'ins' | 'mark' | 'span' | 'strong' | 'sub' | 'sup'\n }\ntype AgentRichTextElementName = Extract<AgentRichTextNode, { name: string }>['name']\n\nfunction richTextChildren(children: AgentMarkdownViewNode[] | undefined): AgentRichTextNode[] | undefined {\n const result: AgentRichTextNode[] = []\n for (const child of children ?? []) {\n // Recursive inline nodes intentionally alternate between element and child normalization.\n // eslint-disable-next-line ts/no-use-before-define\n const normalized = richTextNode(child)\n if (!normalized) { return undefined }\n result.push(normalized)\n }\n return result\n}\n\nfunction richTextNode(node: AgentMarkdownViewNode): AgentRichTextNode | undefined {\n if (node.kind === 'text') { return { text: node.text ?? '', type: 'text' } }\n if (node.kind === 'hardbreak') { return { name: 'br' } }\n if (node.kind === 'checkbox') { return { text: node.checked ? '☑ ' : '☐ ', type: 'text' } }\n\n const names: Partial<Record<AgentMarkdownNodeKind, AgentRichTextElementName>> = {\n emphasis: 'em',\n strikethrough: 'del',\n strong: 'strong',\n subscript: 'sub',\n superscript: 'sup',\n }\n const name = names[node.kind]\n if (name) {\n const children = richTextChildren(node.children)\n return children ? { children, name } : undefined\n }\n\n if (node.kind === 'highlight' || node.kind === 'insert') {\n const children = richTextChildren(node.children)\n if (!children) { return undefined }\n return {\n attrs: {\n style: node.kind === 'highlight'\n ? 'background:rgba(250,146,0,.18);border-radius:2px;'\n : 'text-decoration:underline;',\n },\n children,\n name: 'span',\n }\n }\n\n if (node.kind === 'inline-code') {\n return {\n attrs: {\n style: 'font-family:monospace;padding:1px 4px;border-radius:4px;background:rgba(127,127,127,.12);',\n },\n children: [{ text: node.text ?? '', type: 'text' }],\n name: 'code',\n }\n }\n if (node.kind === 'math-inline') {\n return {\n attrs: { style: 'font-family:monospace;' },\n children: [{ text: node.text ?? '', type: 'text' }],\n name: 'span',\n }\n }\n return undefined\n}\n\nexport function toAgentRichTextNodes(nodes: AgentMarkdownViewNode[]): AgentRichTextNode[] | undefined {\n return richTextChildren(nodes)\n}\n\nfunction stringValue(value: unknown, fallback = '') {\n return typeof value === 'string' ? value : fallback\n}\n\nfunction booleanValue(value: unknown) {\n return typeof value === 'boolean' ? value : undefined\n}\n\nfunction numberValue(value: unknown) {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined\n}\n\nfunction alignValue(value: unknown): 'center' | 'left' | 'right' | undefined {\n return value === 'center' || value === 'left' || value === 'right' ? value : undefined\n}\n\nfunction nodeField(node: ParsedNode, key: string): unknown {\n return key in node ? Reflect.get(node, key) : undefined\n}\n\nfunction normalizeUnknownNode(value: unknown): AgentMarkdownViewNode | undefined {\n if (!isUnknownRecord(value) || typeof value.type !== 'string' || typeof value.raw !== 'string') { return undefined }\n // The required BaseNode fields are validated above; extension fields stay runtime-checked.\n const node = value as ParsedNode\n // Recursive block normalization is declared below to keep the public switch centralized.\n // eslint-disable-next-line ts/no-use-before-define\n return normalizeMarkdownNode(node)\n}\n\nfunction normalizeChildren(value: unknown): AgentMarkdownViewNode[] {\n if (!Array.isArray(value)) { return [] }\n const result: AgentMarkdownViewNode[] = []\n value.forEach((item) => {\n const normalized = normalizeUnknownNode(item)\n if (normalized) { result.push(normalized) }\n })\n return result\n}\n\nfunction textNode(text: string): AgentMarkdownViewNode {\n return { kind: 'text', text }\n}\n\nexport function normalizeMarkdownNode(node: ParsedNode): AgentMarkdownViewNode {\n const fallback = stringValue(node.raw)\n\n switch (node.type) {\n case 'text':\n return textNode(stringValue(node.content, fallback))\n case 'heading':\n return {\n children: normalizeChildren(node.children),\n kind: 'heading',\n level: numberValue(nodeField(node, 'level')) ?? 2,\n text: stringValue(nodeField(node, 'text')),\n }\n case 'paragraph':\n case 'inline':\n return { children: normalizeChildren(node.children), kind: 'paragraph' }\n case 'list':\n return {\n children: normalizeChildren(nodeField(node, 'items')),\n kind: 'list',\n ordered: booleanValue(nodeField(node, 'ordered')) ?? false,\n start: numberValue(nodeField(node, 'start')),\n }\n case 'list_item':\n return { children: normalizeChildren(node.children), kind: 'list-item' }\n case 'code_block':\n return {\n kind: 'code-block',\n language: stringValue(nodeField(node, 'language')),\n loading: booleanValue(node.loading),\n text: stringValue(node.code, fallback),\n }\n case 'inline_code':\n return { kind: 'inline-code', text: stringValue(node.code, fallback) }\n case 'link':\n return {\n children: normalizeChildren(node.children),\n href: stringValue(nodeField(node, 'href')),\n kind: 'link',\n text: stringValue(nodeField(node, 'text')),\n title: stringValue(nodeField(node, 'title')),\n }\n case 'image':\n return {\n alt: stringValue(nodeField(node, 'alt')),\n href: stringValue(nodeField(node, 'src')),\n kind: 'image',\n title: stringValue(nodeField(node, 'title')),\n }\n case 'thematic_break':\n return { kind: 'thematic-break' }\n case 'blockquote':\n return { children: normalizeChildren(node.children), kind: 'blockquote' }\n case 'table': {\n const header = nodeField(node, 'header')\n const rows = nodeField(node, 'rows')\n return {\n children: normalizeChildren(Array.isArray(rows) ? [header, ...rows] : [header]),\n kind: 'table',\n }\n }\n case 'table_row':\n return { children: normalizeChildren(nodeField(node, 'cells')), kind: 'table-row' }\n case 'table_cell':\n return {\n align: alignValue(nodeField(node, 'align')),\n children: normalizeChildren(node.children),\n header: booleanValue(nodeField(node, 'header')),\n kind: 'table-cell',\n }\n case 'strong':\n return { children: normalizeChildren(node.children), kind: 'strong' }\n case 'emphasis':\n return { children: normalizeChildren(node.children), kind: 'emphasis' }\n case 'strikethrough':\n return { children: normalizeChildren(node.children), kind: 'strikethrough' }\n case 'highlight':\n return { children: normalizeChildren(node.children), kind: 'highlight' }\n case 'insert':\n return { children: normalizeChildren(node.children), kind: 'insert' }\n case 'subscript':\n return { children: normalizeChildren(node.children), kind: 'subscript' }\n case 'superscript':\n return { children: normalizeChildren(node.children), kind: 'superscript' }\n case 'checkbox':\n case 'checkbox_input':\n return { checked: booleanValue(nodeField(node, 'checked')), kind: 'checkbox' }\n case 'emoji':\n return textNode(stringValue(nodeField(node, 'markup'), fallback))\n case 'definition_list':\n return { children: normalizeChildren(nodeField(node, 'items')), kind: 'definition-list' }\n case 'definition_item':\n return {\n children: [\n { children: normalizeChildren(nodeField(node, 'term')), header: true, kind: 'definition' },\n { children: normalizeChildren(nodeField(node, 'definition')), kind: 'definition' },\n ],\n kind: 'definition',\n }\n case 'footnote':\n return { children: normalizeChildren(node.children), kind: 'footnote', title: stringValue(nodeField(node, 'id')) }\n case 'footnote_reference':\n case 'reference':\n return { kind: 'footnote', text: stringValue(nodeField(node, 'id')) }\n case 'admonition':\n return {\n children: normalizeChildren(node.children),\n kind: 'admonition',\n text: stringValue(nodeField(node, 'kind')),\n title: stringValue(nodeField(node, 'title')),\n }\n case 'vmr_container':\n return {\n children: normalizeChildren(node.children),\n kind: 'admonition',\n loading: booleanValue(node.loading),\n title: stringValue(nodeField(node, 'name')),\n }\n case 'hardbreak':\n return { kind: 'hardbreak' }\n case 'math_inline':\n return { kind: 'math-inline', text: stringValue(node.content, fallback) }\n case 'math_block':\n return { kind: 'math-block', text: stringValue(node.content, fallback) }\n case 'html_block':\n case 'html_inline':\n return textNode(stringValue(node.content, fallback))\n default:\n return textNode(fallback)\n }\n}\n\nexport function normalizeMarkdownNodes(nodes: ParsedNode[]): AgentMarkdownViewNode[] {\n return nodes.map(normalizeMarkdownNode)\n}\n","import { createAgentEventChannel } from './event-channel'\nimport { parseAgentStreamEvent } from './event-parser'\nimport type { AgentStreamEvent } from './types'\n\nexport interface AgentSseEventSource {\n end: () => void\n fail: (error: unknown) => void\n feed: (chunk: string | ArrayBuffer | Uint8Array) => void\n source: AsyncIterable<AgentStreamEvent>\n}\n\ninterface Utf8ChunkDecoder {\n decode: (chunk: Uint8Array, final?: boolean) => string\n}\n\nfunction createFallbackUtf8Decoder(): Utf8ChunkDecoder {\n let carry = new Uint8Array(0)\n\n return {\n decode(chunk, final = false) {\n const bytes = new Uint8Array(carry.length + chunk.length)\n bytes.set(carry)\n bytes.set(chunk, carry.length)\n let cursor = 0\n let result = ''\n\n while (cursor < bytes.length) {\n const first = bytes[cursor]\n if (first < 0x80) {\n result += String.fromCodePoint(first)\n cursor += 1\n continue\n }\n\n const size = first >= 0xf0 ? 4 : first >= 0xe0 ? 3 : first >= 0xc0 ? 2 : 1\n if (size === 1) {\n result += '\\uFFFD'\n cursor += 1\n continue\n }\n if (cursor + size > bytes.length) break\n\n let codePoint = first & (size === 2 ? 0x1f : size === 3 ? 0x0f : 0x07)\n let valid = true\n for (let index = 1; index < size; index += 1) {\n const continuation = bytes[cursor + index]\n if ((continuation & 0xc0) !== 0x80) {\n valid = false\n break\n }\n codePoint = (codePoint << 6) | (continuation & 0x3f)\n }\n\n if (!valid || codePoint > 0x10ffff) {\n result += '\\uFFFD'\n cursor += 1\n continue\n }\n\n result += String.fromCodePoint(codePoint)\n cursor += size\n }\n\n carry = bytes.slice(cursor)\n if (final && carry.length > 0) {\n result += '\\uFFFD'\n carry = new Uint8Array(0)\n }\n return result\n }\n }\n}\n\nfunction createUtf8Decoder(): Utf8ChunkDecoder {\n if (typeof TextDecoder === 'function') {\n const decoder = new TextDecoder()\n return {\n decode(chunk, final = false) {\n return decoder.decode(chunk, { stream: !final })\n }\n }\n }\n return createFallbackUtf8Decoder()\n}\n\nfunction toBytes(chunk: ArrayBuffer | Uint8Array) {\n return chunk instanceof Uint8Array ? chunk : new Uint8Array(chunk)\n}\n\nexport function createAgentSseEventSource(): AgentSseEventSource {\n const channel = createAgentEventChannel()\n const decoder = createUtf8Decoder()\n const dataLines: string[] = []\n let textBuffer = ''\n let ended = false\n\n function clearBufferedInput() {\n dataLines.length = 0\n textBuffer = ''\n }\n\n function closeSource() {\n if (ended) return\n ended = true\n clearBufferedInput()\n channel.end()\n }\n\n function failSource(error: unknown) {\n if (ended) return\n ended = true\n clearBufferedInput()\n channel.fail(error)\n }\n\n function finishWith(event: AgentStreamEvent) {\n channel.push(event)\n closeSource()\n }\n\n function dispatch() {\n if (dataLines.length === 0 || ended) return\n const payload = dataLines.join('\\n')\n dataLines.length = 0\n if (payload === '[DONE]') {\n finishWith({ type: 'done' })\n return\n }\n\n try {\n const event = parseAgentStreamEvent(JSON.parse(payload))\n if (event.type === 'done' || event.type === 'error') finishWith(event)\n else channel.push(event)\n } catch (error) {\n failSource(error)\n }\n }\n\n function processLine(line: string) {\n const normalized = line.endsWith('\\r') ? line.slice(0, -1) : line\n if (normalized.length === 0) {\n dispatch()\n return\n }\n if (normalized.startsWith(':')) return\n if (normalized === 'data') {\n dataLines.push('')\n return\n }\n if (normalized.startsWith('data:')) {\n const value = normalized.slice(5)\n dataLines.push(value.startsWith(' ') ? value.slice(1) : value)\n }\n }\n\n function appendText(value: string) {\n if (ended) return\n textBuffer += value\n let lineEnd = textBuffer.indexOf('\\n')\n while (lineEnd >= 0) {\n processLine(textBuffer.slice(0, lineEnd))\n if (ended) return\n textBuffer = textBuffer.slice(lineEnd + 1)\n lineEnd = textBuffer.indexOf('\\n')\n }\n }\n\n return {\n end() {\n if (ended) return\n appendText(decoder.decode(new Uint8Array(0), true))\n if (ended) return\n if (textBuffer.length > 0) processLine(textBuffer)\n dispatch()\n closeSource()\n },\n fail(error) {\n failSource(error)\n },\n feed(chunk) {\n if (ended) return\n appendText(typeof chunk === 'string' ? chunk : decoder.decode(toBytes(chunk)))\n },\n source: channel.source\n }\n}\n","import type {\n AgentThreadController,\n AgentThreadSnapshot,\n AgentThreadVersion,\n} from './types'\n\nconst DESTROYED_ERROR = 'Agent thread controller is destroyed'\n\nfunction assertVersionId(id: string) {\n if (id.length === 0) throw new Error('Agent thread version id must not be empty')\n}\n\nfunction freezeVersion(version: AgentThreadVersion): AgentThreadVersion {\n return Object.freeze({ ...version })\n}\n\nfunction freezeSnapshot(\n versions: readonly AgentThreadVersion[],\n activeVersionId?: string,\n): AgentThreadSnapshot {\n if (activeVersionId === undefined) return Object.freeze({ versions })\n return Object.freeze({ activeVersionId, versions })\n}\n\nfunction validateSnapshot(initial?: AgentThreadSnapshot): AgentThreadSnapshot {\n const sourceVersions = initial?.versions ?? []\n const versionsById = new Map<string, AgentThreadVersion>()\n\n for (const version of sourceVersions) {\n assertVersionId(version.id)\n if (versionsById.has(version.id)) {\n throw new Error(`Agent thread version \"${version.id}\" is duplicated`)\n }\n versionsById.set(version.id, version)\n }\n\n for (const version of sourceVersions) {\n if (version.parentId !== undefined && !versionsById.has(version.parentId)) {\n throw new Error(`Agent thread parent version \"${version.parentId}\" does not exist`)\n }\n }\n\n const resolvedIds = new Set<string>()\n for (const version of sourceVersions) {\n if (resolvedIds.has(version.id)) continue\n\n const path: string[] = []\n const pathIds = new Set<string>()\n let current: AgentThreadVersion | undefined = version\n while (current !== undefined && !resolvedIds.has(current.id)) {\n if (pathIds.has(current.id)) {\n throw new Error(`Agent thread version \"${current.id}\" has a cyclic parent chain`)\n }\n path.push(current.id)\n pathIds.add(current.id)\n current = current.parentId === undefined\n ? undefined\n : versionsById.get(current.parentId)\n }\n path.forEach(id => resolvedIds.add(id))\n }\n\n const activeVersionId = initial?.activeVersionId\n if (activeVersionId !== undefined && !versionsById.has(activeVersionId)) {\n throw new Error(`Agent thread active version \"${activeVersionId}\" does not exist`)\n }\n\n return freezeSnapshot(Object.freeze(sourceVersions.map(freezeVersion)), activeVersionId)\n}\n\nexport function createAgentThreadController(\n initial?: AgentThreadSnapshot,\n): AgentThreadController {\n const listeners = new Set<() => void>()\n let snapshot = validateSnapshot(initial)\n let destroyed = false\n\n function assertActive() {\n if (destroyed) throw new Error(DESTROYED_ERROR)\n }\n\n function findVersion(id: string) {\n return snapshot.versions.find(version => version.id === id)\n }\n\n function replace(nextSnapshot: AgentThreadSnapshot) {\n snapshot = nextSnapshot\n listeners.forEach(listener => listener())\n }\n\n function append(version: AgentThreadVersion) {\n assertActive()\n assertVersionId(version.id)\n if (findVersion(version.id)) {\n throw new Error(`Agent thread version \"${version.id}\" already exists`)\n }\n if (version.parentId !== undefined && !findVersion(version.parentId)) {\n throw new Error(`Agent thread parent version \"${version.parentId}\" does not exist`)\n }\n\n const versions = Object.freeze([...snapshot.versions, freezeVersion(version)])\n replace(freezeSnapshot(versions, version.id))\n }\n\n function fork(\n parentId: string,\n version: Omit<AgentThreadVersion, 'parentId'>,\n ) {\n assertActive()\n assertVersionId(version.id)\n if (findVersion(version.id)) {\n throw new Error(`Agent thread version \"${version.id}\" already exists`)\n }\n if (!findVersion(parentId)) {\n throw new Error(`Agent thread parent version \"${parentId}\" does not exist`)\n }\n\n const forkedVersion = freezeVersion({ ...version, parentId })\n const versions = Object.freeze([...snapshot.versions, forkedVersion])\n replace(freezeSnapshot(versions, forkedVersion.id))\n }\n\n function select(id: string) {\n assertActive()\n if (!findVersion(id)) {\n throw new Error(`Agent thread version \"${id}\" does not exist`)\n }\n replace(freezeSnapshot(snapshot.versions, id))\n }\n\n function reset(nextInitial?: AgentThreadSnapshot) {\n assertActive()\n const nextSnapshot = validateSnapshot(nextInitial)\n replace(nextSnapshot)\n }\n\n function subscribe(listener: () => void) {\n assertActive()\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n }\n\n return {\n append,\n destroy() {\n if (destroyed) return\n destroyed = true\n listeners.clear()\n },\n fork,\n getSnapshot() {\n return snapshot\n },\n reset,\n select,\n subscribe,\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["node"],"sources":["../src/text-stream.ts","../src/agent-stream.ts","../src/event-channel.ts","../src/type-guards.ts","../src/event-parser.ts","../src/markdown.ts","../src/markdown-view.ts","../src/sse.ts","../src/thread.ts"],"sourcesContent":["import type { TextStreamController, TextStreamOptions, TextStreamSnapshot } from './types'\nimport { createSmoothMarkdownStream } from 'markstream-core'\n\ninterface SegmenterLike {\n segment: (value: string) => Iterable<{ segment: string }>\n}\n\nfunction splitGraphemes(value: string): string[] {\n const intlRuntime: unknown = Intl\n if (\n typeof intlRuntime !== 'object'\n || intlRuntime === null\n || !('Segmenter' in intlRuntime)\n || typeof intlRuntime.Segmenter !== 'function'\n ) {\n return Array.from(value)\n }\n\n // Runtime constructor shape is checked above; TypeScript's configured Intl lib omits Segmenter.\n const Segmenter = intlRuntime.Segmenter as new (\n locale?: string,\n options?: { granularity: 'grapheme' }\n ) => SegmenterLike\n return Array.from(new Segmenter(undefined, { granularity: 'grapheme' }).segment(value), item => item.segment)\n}\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.min(max, Math.max(min, value))\n}\n\nfunction hasUnclosedFence(value: string) {\n let marker: '`' | '~' | undefined\n let markerLength = 0\n for (const line of value.split(/\\r?\\n/)) {\n const match = /^ {0,3}(`{3,}|~{3,})/.exec(line)\n if (!match) { continue }\n const nextMarker = match[1][0] as '`' | '~'\n const nextLength = match[1].length\n if (!marker) {\n marker = nextMarker\n markerLength = nextLength\n }\n else if (marker === nextMarker && nextLength >= markerLength) {\n marker = undefined\n markerLength = 0\n }\n }\n return marker !== undefined\n}\n\nfunction fenceSafeCommitCount(visible: string, source: string, segments: string[]) {\n if (segments.length === 0) { return 0 }\n const candidate = visible + segments.join('')\n const lineStart = candidate.lastIndexOf('\\n') + 1\n const candidateLine = candidate.slice(lineStart)\n const sourceLineEnd = source.indexOf('\\n', lineStart)\n const sourceLine = source.slice(lineStart, sourceLineEnd < 0 ? source.length : sourceLineEnd)\n const match = /^ {0,3}(`+|~+)/.exec(sourceLine)\n if (!match) { return segments.length }\n\n const marker = match[1]\n const unresolvedCandidate = marker.length < 3 && sourceLine.trim() === marker\n const completeFence = marker.length >= 3\n if ((unresolvedCandidate || completeFence) && /^ {0,3}(?:`+|~+)/.test(candidateLine)) {\n return 0\n }\n return segments.length\n}\n\nfunction createTimerTextStream(options: TextStreamOptions = {}): TextStreamController {\n const minCharsPerSecond = Math.max(1, options.minCharsPerSecond ?? 40)\n const maxCharsPerSecond = Math.max(minCharsPerSecond, options.maxCharsPerSecond ?? 1000)\n const targetLatencyMs = Math.max(1, options.targetLatencyMs ?? 900)\n const catchUpLatencyMs = Math.max(1, options.catchUpLatencyMs ?? 350)\n const maxCommitFps = Math.max(1, Math.min(30, options.maxCommitFps ?? 30))\n const maxCharsPerCommit = Math.max(1, options.maxCharsPerCommit ?? 80)\n const catchUpThreshold = Math.max(0, options.catchUpThreshold ?? 600)\n const startDelayMs = Math.max(0, options.startDelayMs ?? 80)\n const flushOnFinish = options.flushOnFinish ?? false\n const burstInitialContent = options.burstInitialContent ?? false\n const burstRevealThresholdChars = Math.max(1, options.burstRevealThresholdChars ?? 2048)\n const listeners = new Set<() => void>()\n const pending: string[] = []\n let pendingOffset = 0\n let source = ''\n let visible = ''\n let done = false\n let paused = false\n let destroyed = false\n let timer: ReturnType<typeof setTimeout> | undefined\n let lastTick = Date.now()\n let firstPendingAt = 0\n let budget = 0\n\n function pendingCount() {\n return pending.length - pendingOffset\n }\n\n function snapshot(): TextStreamSnapshot {\n const pendingChars = Math.max(0, source.length - visible.length)\n return {\n caughtUp: pendingCount() === 0,\n done,\n final: done && pendingCount() === 0,\n paused,\n pendingChars,\n source,\n visible,\n }\n }\n\n function emit() {\n listeners.forEach(listener => listener())\n }\n\n function compactPending() {\n if (pendingOffset < 1024 || pendingOffset * 2 < pending.length) { return }\n pending.splice(0, pendingOffset)\n pendingOffset = 0\n }\n\n function schedule() {\n if (destroyed || paused || timer || pendingCount() === 0) { return }\n // The scheduler and tick callback are mutually recursive by design.\n // eslint-disable-next-line ts/no-use-before-define\n timer = setTimeout(tick, Math.ceil(1000 / maxCommitFps))\n }\n\n function tick() {\n timer = undefined\n if (destroyed || paused) { return }\n\n const now = Date.now()\n if (firstPendingAt && now - firstPendingAt < startDelayMs) {\n schedule()\n return\n }\n firstPendingAt = 0\n\n const deltaMs = Math.max(1, now - lastTick)\n lastTick = now\n const backlog = pendingCount()\n if (backlog === 0) {\n emit()\n return\n }\n\n const latencyMs = backlog >= catchUpThreshold ? catchUpLatencyMs : targetLatencyMs\n const latencyCps = (backlog * 1000) / latencyMs\n const cps = clamp(latencyCps, minCharsPerSecond, maxCharsPerSecond)\n budget += (cps * deltaMs) / 1000\n const commitCount = Math.min(backlog, maxCharsPerCommit, Math.max(1, Math.floor(budget)))\n let proposedSegments = pending.slice(pendingOffset, pendingOffset + commitCount)\n let safeCommitCount = fenceSafeCommitCount(visible, source, proposedSegments)\n if (safeCommitCount === 0) {\n const newlineOffset = pending.slice(pendingOffset).findIndex(segment => segment.includes('\\n'))\n if (newlineOffset >= 0) {\n proposedSegments = pending.slice(pendingOffset, pendingOffset + newlineOffset + 1)\n safeCommitCount = fenceSafeCommitCount(visible, source, proposedSegments)\n }\n }\n if (safeCommitCount === 0) {\n emit()\n schedule()\n return\n }\n budget = Math.max(0, budget - safeCommitCount)\n visible += proposedSegments.slice(0, safeCommitCount).join('')\n pendingOffset += safeCommitCount\n compactPending()\n emit()\n schedule()\n }\n\n function cancelTimer() {\n clearTimeout(timer)\n timer = undefined\n }\n\n function destroy() {\n if (destroyed) { return }\n destroyed = true\n cancelTimer()\n pending.length = 0\n listeners.clear()\n }\n\n return {\n destroy,\n dispose: destroy,\n enqueue(chunk) {\n if (destroyed || !chunk) { return }\n if (done) { done = false }\n const initialChunk = source.length === 0\n source += chunk\n pending.push(...splitGraphemes(chunk))\n if (initialChunk) { firstPendingAt = Date.now() }\n lastTick = Date.now()\n\n if (\n initialChunk\n && burstInitialContent\n && pendingCount() >= burstRevealThresholdChars\n && !hasUnclosedFence(source)\n ) {\n visible = source\n pending.length = 0\n pendingOffset = 0\n firstPendingAt = 0\n }\n\n emit()\n schedule()\n },\n finish(finishOptions = {}) {\n if (destroyed) { return }\n done = true\n if (finishOptions.flush ?? flushOnFinish) {\n visible = source\n pending.length = 0\n pendingOffset = 0\n cancelTimer()\n }\n emit()\n schedule()\n },\n flush() {\n if (destroyed) { return }\n visible = source\n pending.length = 0\n pendingOffset = 0\n budget = 0\n cancelTimer()\n emit()\n },\n getSnapshot: snapshot,\n pause() {\n if (destroyed || paused) { return }\n paused = true\n cancelTimer()\n emit()\n },\n reset(content = '', _resetOptions = {}) {\n cancelTimer()\n source = content\n visible = content\n pending.length = 0\n pendingOffset = 0\n done = false\n paused = false\n budget = 0\n firstPendingAt = 0\n lastTick = Date.now()\n emit()\n },\n resume() {\n if (destroyed || !paused) { return }\n paused = false\n lastTick = Date.now()\n emit()\n schedule()\n },\n subscribe(listener) {\n if (destroyed) { return () => {} }\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n }\n}\n\nexport function createTextStream(options: TextStreamOptions = {}): TextStreamController {\n if (typeof requestAnimationFrame !== 'function' || typeof cancelAnimationFrame !== 'function') {\n return createTimerTextStream(options)\n }\n\n const controller = createSmoothMarkdownStream(options)\n return {\n destroy: controller.destroy,\n dispose: controller.dispose,\n enqueue: controller.enqueue,\n finish: controller.finish,\n flush: controller.flush,\n getSnapshot: controller.getSnapshot,\n pause: controller.pause,\n reset: controller.reset,\n resume: controller.resume,\n subscribe: controller.subscribe,\n }\n}\n","import { createTextStream } from './text-stream'\nimport type {\n AgentApprovalPart,\n AgentErrorEvent,\n AgentReasoningPart,\n AgentStreamController,\n AgentStreamEvent,\n AgentStreamSnapshot,\n AgentToolPart,\n TextStreamOptions\n} from './types'\n\nexport interface AgentStreamControllerOptions {\n text?: TextStreamOptions\n}\n\nfunction requestIteratorCleanup(iterator: AsyncIterator<AgentStreamEvent>) {\n try {\n const cleanup = iterator.return?.()\n if (cleanup) void cleanup.catch(() => undefined)\n } catch {\n // Cleanup failures must not replace an already terminal connection result.\n }\n}\n\nfunction initialSnapshot(): AgentStreamSnapshot {\n return {\n data: [],\n eventCount: 0,\n reasoning: [],\n status: 'idle',\n tools: []\n }\n}\n\nexport function createAgentStreamController(\n options: AgentStreamControllerOptions = {}\n): AgentStreamController {\n const text = createTextStream(options.text)\n const listeners = new Set<() => void>()\n let snapshot = initialSnapshot()\n let destroyed = false\n let cancelled = false\n let transportDone = false\n let connecting = false\n let cancelActiveConnect: (() => void) | undefined\n\n function emit() {\n listeners.forEach((listener) => listener())\n }\n\n function setSnapshot(update: Partial<AgentStreamSnapshot>) {\n snapshot = { ...snapshot, ...update }\n emit()\n }\n\n function updateReasoning(id: string, update: Partial<AgentReasoningPart>) {\n setSnapshot({\n reasoning: snapshot.reasoning.map((part) => (part.id === id ? { ...part, ...update } : part))\n })\n }\n\n function updateTool(id: string, update: Partial<AgentToolPart>) {\n setSnapshot({\n tools: snapshot.tools.map((part) => (part.id === id ? { ...part, ...update } : part))\n })\n }\n\n function finalStatus() {\n const textSnapshot = text.getSnapshot()\n if (!transportDone || !textSnapshot.final) return\n setSnapshot({ status: snapshot.error ? 'failed' : cancelled ? 'cancelled' : 'completed' })\n }\n\n const unsubscribeText = text.subscribe(() => {\n if (destroyed || !snapshot.message) return\n const textSnapshot = text.getSnapshot()\n snapshot = {\n ...snapshot,\n message: {\n ...snapshot.message,\n final: textSnapshot.final,\n source: textSnapshot.source,\n visible: textSnapshot.visible\n }\n }\n emit()\n finalStatus()\n })\n\n function push(event: AgentStreamEvent) {\n if (destroyed || cancelled) return\n snapshot = { ...snapshot, eventCount: snapshot.eventCount + 1 }\n\n switch (event.type) {\n case 'message.start':\n transportDone = false\n text.reset()\n setSnapshot({\n error: undefined,\n message: {\n final: false,\n id: event.messageId,\n role: event.role,\n source: '',\n visible: ''\n },\n status: 'streaming'\n })\n break\n case 'text.delta':\n if (snapshot.message?.id === event.messageId) text.enqueue(event.delta)\n break\n case 'message.end':\n if (snapshot.message?.id === event.messageId) text.finish()\n break\n case 'reasoning.start':\n setSnapshot({\n reasoning: [\n ...snapshot.reasoning,\n { content: '', id: event.id, status: 'running', title: event.title }\n ]\n })\n break\n case 'reasoning.delta': {\n const part = snapshot.reasoning.find((item) => item.id === event.id)\n if (part) updateReasoning(event.id, { content: `${part.content}${event.delta}` })\n break\n }\n case 'reasoning.end':\n updateReasoning(event.id, { durationMs: event.durationMs, status: 'completed' })\n break\n case 'tool.start':\n setSnapshot({\n tools: [\n ...snapshot.tools,\n {\n id: event.id,\n input: event.input,\n name: event.name,\n status: 'running',\n summary: event.summary\n }\n ]\n })\n break\n case 'tool.update':\n updateTool(event.id, { summary: event.summary })\n break\n case 'tool.result':\n updateTool(event.id, {\n output: event.output,\n status: 'completed',\n summary: event.summary\n })\n break\n case 'tool.error':\n updateTool(event.id, { error: event.error, status: 'failed' })\n break\n case 'approval.required': {\n const approval: AgentApprovalPart = {\n choices: event.choices ?? [],\n description: event.description,\n id: event.id,\n status: 'waiting',\n title: event.title\n }\n setSnapshot({ approval, status: 'waiting' })\n break\n }\n case 'approval.resolved':\n if (snapshot.approval?.id === event.id) {\n setSnapshot({\n approval: {\n ...snapshot.approval,\n resolvedValue: event.value,\n status: 'completed'\n },\n status: 'streaming'\n })\n }\n break\n case 'data':\n setSnapshot({ data: [...snapshot.data, { name: event.name, value: event.value }] })\n break\n case 'error':\n transportDone = true\n text.finish({ flush: true })\n setSnapshot({ error: event, status: 'failed' })\n break\n case 'done':\n transportDone = true\n text.finish()\n setSnapshot({ usage: event.usage })\n if (!snapshot.message) setSnapshot({ status: 'completed' })\n finalStatus()\n break\n }\n }\n\n async function waitForTerminal() {\n if (snapshot.status === 'completed' || snapshot.status === 'failed' || snapshot.status === 'cancelled') {\n return snapshot\n }\n\n return await new Promise<AgentStreamSnapshot>((resolve) => {\n const unsubscribe = subscribe(() => {\n if (snapshot.status !== 'completed' && snapshot.status !== 'failed' && snapshot.status !== 'cancelled') return\n unsubscribe()\n resolve(snapshot)\n })\n })\n }\n\n function subscribe(listener: () => void) {\n if (destroyed) return () => {}\n listeners.add(listener)\n return () => listeners.delete(listener)\n }\n\n function reset() {\n text.reset()\n snapshot = initialSnapshot()\n cancelled = false\n transportDone = false\n emit()\n }\n\n function cancel(reason = 'Cancelled') {\n if (destroyed || cancelled) return\n cancelled = true\n transportDone = true\n text.finish({ flush: true })\n const error: AgentErrorEvent = { code: 'cancelled', message: reason, retryable: true, type: 'error' }\n setSnapshot({ error, status: 'cancelled' })\n cancelActiveConnect?.()\n }\n\n return {\n cancel,\n async connect(events) {\n if (connecting) throw new Error('Agent stream controller is already connected')\n connecting = true\n reset()\n const iterator = events[Symbol.asyncIterator]()\n let resolveCancellation: (() => void) | undefined\n const cancellation = new Promise<void>((resolve) => {\n resolveCancellation = resolve\n })\n cancelActiveConnect = resolveCancellation\n\n let protocolTerminal = false\n try {\n try {\n while (!cancelled && !destroyed) {\n const outcome = await Promise.race([\n iterator.next().then((result) => ({ kind: 'event' as const, result })),\n cancellation.then(() => ({ kind: 'cancelled' as const }))\n ])\n if (outcome.kind === 'cancelled' || outcome.result.done) break\n const event = outcome.result.value\n push(event)\n if (event.type === 'done' || event.type === 'error') {\n protocolTerminal = true\n break\n }\n }\n if (!transportDone && !cancelled && !destroyed) push({ type: 'done' })\n } catch (error) {\n push({\n message: error instanceof Error ? error.message : String(error),\n retryable: true,\n type: 'error'\n })\n } finally {\n if (protocolTerminal || cancelled || destroyed) requestIteratorCleanup(iterator)\n }\n return await waitForTerminal()\n } finally {\n connecting = false\n cancelActiveConnect = undefined\n }\n },\n destroy() {\n if (destroyed) return\n cancel('Agent stream controller destroyed')\n destroyed = true\n unsubscribeText()\n text.destroy()\n listeners.clear()\n },\n getSnapshot() {\n return snapshot\n },\n push,\n reset,\n subscribe\n }\n}\n","import type { AgentEventChannel, AgentStreamEvent } from './types'\n\nexport function createAgentEventChannel(): AgentEventChannel {\n const queue: AgentStreamEvent[] = []\n let ended = false\n let failure: Error | undefined\n let wake: (() => void) | undefined\n\n function stopConsuming() {\n ended = true\n queue.length = 0\n notify()\n }\n\n async function* iterate(): AsyncGenerator<AgentStreamEvent> {\n try {\n while (!ended || queue.length > 0) {\n if (failure) throw failure\n const event = queue.shift()\n if (event) {\n yield event\n continue\n }\n\n await new Promise<void>((resolve) => {\n wake = resolve\n })\n wake = undefined\n }\n if (failure) throw failure\n } finally {\n stopConsuming()\n }\n }\n\n function createIterator(): AsyncIterator<AgentStreamEvent> {\n const iterator = iterate()\n return {\n next() {\n return iterator.next()\n },\n return() {\n stopConsuming()\n return iterator.return(undefined)\n }\n }\n }\n\n function notify() {\n wake?.()\n }\n\n return {\n end() {\n ended = true\n notify()\n },\n fail(error) {\n failure = error instanceof Error ? error : new Error(String(error))\n ended = true\n notify()\n },\n push(event) {\n if (ended) return\n queue.push(event)\n notify()\n },\n source: {\n [Symbol.asyncIterator]: createIterator\n }\n }\n}\n","export function isUnknownRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","import { isUnknownRecord } from './type-guards'\nimport type { AgentApprovalRequiredEvent, AgentStreamEvent } from './types'\n\n\nfunction requiredString(value: Record<string, unknown>, key: string): string {\n const field = value[key]\n if (typeof field !== 'string' || field.length === 0) {\n throw new TypeError(`Agent stream event field \"${key}\" must be a non-empty string`)\n }\n return field\n}\n\nfunction optionalString(value: Record<string, unknown>, key: string): string | undefined {\n const field = value[key]\n if (field === undefined) return undefined\n if (typeof field !== 'string') throw new TypeError(`Agent stream event field \"${key}\" must be a string`)\n return field\n}\n\nfunction optionalBoolean(value: Record<string, unknown>, key: string): boolean | undefined {\n const field = value[key]\n if (field === undefined) return undefined\n if (typeof field !== 'boolean') throw new TypeError(`Agent stream event field \"${key}\" must be a boolean`)\n return field\n}\n\nfunction optionalNumber(value: Record<string, unknown>, key: string): number | undefined {\n const field = value[key]\n if (field === undefined) return undefined\n if (typeof field !== 'number' || !Number.isFinite(field)) {\n throw new TypeError(`Agent stream event field \"${key}\" must be a finite number`)\n }\n return field\n}\n\nfunction parseChoices(value: unknown): AgentApprovalRequiredEvent['choices'] {\n if (value === undefined) return undefined\n if (!Array.isArray(value)) throw new TypeError('Agent approval choices must be an array')\n\n return value.map((choice) => {\n if (!isUnknownRecord(choice)) throw new TypeError('Agent approval choice must be an object')\n return {\n description: optionalString(choice, 'description'),\n disabled: optionalBoolean(choice, 'disabled'),\n label: requiredString(choice, 'label'),\n value: requiredString(choice, 'value')\n }\n })\n}\n\nexport function parseAgentStreamEvent(value: unknown): AgentStreamEvent {\n if (!isUnknownRecord(value) || typeof value.type !== 'string') {\n throw new TypeError('Agent stream event must be an object with a string type')\n }\n\n switch (value.type) {\n case 'message.start': {\n const role = requiredString(value, 'role')\n if (role !== 'assistant' && role !== 'system' && role !== 'user') {\n throw new TypeError(`Unsupported agent message role: ${role}`)\n }\n return { messageId: requiredString(value, 'messageId'), role, type: value.type }\n }\n case 'text.delta':\n return {\n delta: requiredString(value, 'delta'),\n messageId: requiredString(value, 'messageId'),\n type: value.type\n }\n case 'message.end':\n return { messageId: requiredString(value, 'messageId'), type: value.type }\n case 'reasoning.start':\n return {\n id: requiredString(value, 'id'),\n title: requiredString(value, 'title'),\n type: value.type\n }\n case 'reasoning.delta':\n return {\n delta: requiredString(value, 'delta'),\n id: requiredString(value, 'id'),\n type: value.type\n }\n case 'reasoning.end':\n return {\n durationMs: optionalNumber(value, 'durationMs'),\n id: requiredString(value, 'id'),\n type: value.type\n }\n case 'tool.start':\n return {\n id: requiredString(value, 'id'),\n input: value.input,\n name: requiredString(value, 'name'),\n summary: optionalString(value, 'summary'),\n type: value.type\n }\n case 'tool.update':\n return {\n id: requiredString(value, 'id'),\n summary: optionalString(value, 'summary'),\n type: value.type\n }\n case 'tool.result':\n return {\n id: requiredString(value, 'id'),\n output: value.output,\n summary: optionalString(value, 'summary'),\n type: value.type\n }\n case 'tool.error':\n return {\n error: requiredString(value, 'error'),\n id: requiredString(value, 'id'),\n type: value.type\n }\n case 'approval.required':\n return {\n choices: parseChoices(value.choices),\n description: optionalString(value, 'description'),\n id: requiredString(value, 'id'),\n title: requiredString(value, 'title'),\n type: value.type\n }\n case 'approval.resolved':\n return {\n id: requiredString(value, 'id'),\n type: value.type,\n value: requiredString(value, 'value')\n }\n case 'data':\n if (!('value' in value)) throw new TypeError('Agent data event must include a value field')\n return { name: requiredString(value, 'name'), type: value.type, value: value.value }\n case 'error':\n return {\n code: optionalString(value, 'code'),\n message: requiredString(value, 'message'),\n retryable: optionalBoolean(value, 'retryable'),\n type: value.type\n }\n case 'done': {\n const usage = value.usage\n if (usage !== undefined && !isUnknownRecord(usage)) {\n throw new TypeError('Agent done usage must be an object')\n }\n return {\n type: value.type,\n usage: usage\n ? {\n inputTokens: optionalNumber(usage, 'inputTokens'),\n outputTokens: optionalNumber(usage, 'outputTokens')\n }\n : undefined\n }\n }\n default:\n throw new TypeError(`Unsupported agent stream event type: ${value.type}`)\n }\n}\n","import {\n getMarkdown,\n isUnsafeHtmlUrl,\n parseMarkdownToStructure,\n type GetMarkdownOptions,\n type ParsedNode\n} from 'stream-markdown-parser'\n\nexport interface StreamingMarkdownParserOptions {\n customHtmlTags?: readonly string[]\n enableMath?: boolean\n includeSourceMap?: boolean\n markdownItOptions?: GetMarkdownOptions['markdownItOptions']\n validateLink?: (url: string) => boolean\n}\n\nexport interface StreamingMarkdownParser {\n parse: (content: string, options?: { final?: boolean }) => ParsedNode[]\n reset: () => void\n}\n\nlet parserId = 0\n\nexport function createStreamingMarkdownParser(\n options: StreamingMarkdownParserOptions = {}\n): StreamingMarkdownParser {\n parserId += 1\n const validateLink = options.validateLink ?? ((url: string) => !isUnsafeHtmlUrl(url))\n const markdown = getMarkdown(`varo-agent-${parserId}`, {\n customHtmlTags: options.customHtmlTags,\n enableMath: options.enableMath ?? true,\n markdownItOptions: {\n breaks: true,\n html: false,\n linkify: true,\n ...options.markdownItOptions,\n validateLink\n }\n })\n\n return {\n parse(content, parseOptions = {}) {\n return parseMarkdownToStructure(content, markdown, {\n customHtmlTags: options.customHtmlTags,\n final: parseOptions.final ?? false,\n includeSourceMap: options.includeSourceMap ?? false,\n reuseStableTopLevelNodes: true,\n streamParse: 'auto',\n validateLink\n })\n },\n reset() {\n markdown.stream?.reset?.()\n }\n }\n}\n\nexport type { ParsedNode } from 'stream-markdown-parser'\n","import type { ParsedNode } from 'stream-markdown-parser'\nimport { isUnknownRecord } from './type-guards'\n\nexport type AgentMarkdownNodeKind\n = | 'admonition'\n | 'blockquote'\n | 'checkbox'\n | 'code-block'\n | 'definition'\n | 'definition-list'\n | 'emphasis'\n | 'footnote'\n | 'hardbreak'\n | 'heading'\n | 'highlight'\n | 'image'\n | 'inline-code'\n | 'insert'\n | 'link'\n | 'list'\n | 'list-item'\n | 'math-block'\n | 'math-inline'\n | 'paragraph'\n | 'strikethrough'\n | 'strong'\n | 'subscript'\n | 'superscript'\n | 'table'\n | 'table-cell'\n | 'table-row'\n | 'text'\n | 'thematic-break'\n\nexport interface AgentMarkdownViewNode {\n align?: 'center' | 'left' | 'right'\n alt?: string\n checked?: boolean\n children?: AgentMarkdownViewNode[]\n header?: boolean\n href?: string\n kind: AgentMarkdownNodeKind\n language?: string\n level?: number\n loading?: boolean\n ordered?: boolean\n start?: number\n text?: string\n title?: string\n}\n\nexport type AgentRichTextNode\n = | {\n text: string\n type: 'text'\n }\n | {\n attrs?: Record<string, string>\n children?: AgentRichTextNode[]\n name: 'br' | 'code' | 'del' | 'em' | 'ins' | 'mark' | 'span' | 'strong' | 'sub' | 'sup'\n }\ntype AgentRichTextElementName = Extract<AgentRichTextNode, { name: string }>['name']\n\nfunction richTextChildren(children: AgentMarkdownViewNode[] | undefined): AgentRichTextNode[] | undefined {\n const result: AgentRichTextNode[] = []\n for (const child of children ?? []) {\n // Recursive inline nodes intentionally alternate between element and child normalization.\n // eslint-disable-next-line ts/no-use-before-define\n const normalized = richTextNode(child)\n if (!normalized) { return undefined }\n result.push(normalized)\n }\n return result\n}\n\nfunction richTextNode(node: AgentMarkdownViewNode): AgentRichTextNode | undefined {\n if (node.kind === 'text') { return { text: node.text ?? '', type: 'text' } }\n if (node.kind === 'hardbreak') { return { name: 'br' } }\n if (node.kind === 'checkbox') { return { text: node.checked ? '☑ ' : '☐ ', type: 'text' } }\n\n const names: Partial<Record<AgentMarkdownNodeKind, AgentRichTextElementName>> = {\n emphasis: 'em',\n strikethrough: 'del',\n strong: 'strong',\n subscript: 'sub',\n superscript: 'sup',\n }\n const name = names[node.kind]\n if (name) {\n const children = richTextChildren(node.children)\n return children ? { children, name } : undefined\n }\n\n if (node.kind === 'highlight' || node.kind === 'insert') {\n const children = richTextChildren(node.children)\n if (!children) { return undefined }\n return {\n attrs: {\n style: node.kind === 'highlight'\n ? 'background:rgba(250,146,0,.18);border-radius:2px;'\n : 'text-decoration:underline;',\n },\n children,\n name: 'span',\n }\n }\n\n if (node.kind === 'inline-code') {\n return {\n attrs: {\n style: 'font-family:monospace;padding:1px 4px;border-radius:4px;background:rgba(127,127,127,.12);',\n },\n children: [{ text: node.text ?? '', type: 'text' }],\n name: 'code',\n }\n }\n if (node.kind === 'math-inline') {\n return {\n attrs: { style: 'font-family:monospace;' },\n children: [{ text: node.text ?? '', type: 'text' }],\n name: 'span',\n }\n }\n return undefined\n}\n\nexport function toAgentRichTextNodes(nodes: AgentMarkdownViewNode[]): AgentRichTextNode[] | undefined {\n return richTextChildren(nodes)\n}\n\nfunction stringValue(value: unknown, fallback = '') {\n return typeof value === 'string' ? value : fallback\n}\n\nfunction booleanValue(value: unknown) {\n return typeof value === 'boolean' ? value : undefined\n}\n\nfunction numberValue(value: unknown) {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined\n}\n\nfunction alignValue(value: unknown): 'center' | 'left' | 'right' | undefined {\n return value === 'center' || value === 'left' || value === 'right' ? value : undefined\n}\n\nfunction nodeField(node: ParsedNode, key: string): unknown {\n return key in node ? Reflect.get(node, key) : undefined\n}\n\nfunction normalizeUnknownNode(value: unknown): AgentMarkdownViewNode | undefined {\n if (!isUnknownRecord(value) || typeof value.type !== 'string' || typeof value.raw !== 'string') { return undefined }\n // The required BaseNode fields are validated above; extension fields stay runtime-checked.\n const node = value as ParsedNode\n // Recursive block normalization is declared below to keep the public switch centralized.\n // eslint-disable-next-line ts/no-use-before-define\n return normalizeMarkdownNode(node)\n}\n\nfunction normalizeChildren(value: unknown): AgentMarkdownViewNode[] {\n if (!Array.isArray(value)) { return [] }\n const result: AgentMarkdownViewNode[] = []\n value.forEach((item) => {\n const normalized = normalizeUnknownNode(item)\n if (normalized) { result.push(normalized) }\n })\n return result\n}\n\nfunction textNode(text: string): AgentMarkdownViewNode {\n return { kind: 'text', text }\n}\n\nexport function normalizeMarkdownNode(node: ParsedNode): AgentMarkdownViewNode {\n const fallback = stringValue(node.raw)\n\n switch (node.type) {\n case 'text':\n return textNode(stringValue(node.content, fallback))\n case 'heading':\n return {\n children: normalizeChildren(node.children),\n kind: 'heading',\n level: numberValue(nodeField(node, 'level')) ?? 2,\n text: stringValue(nodeField(node, 'text')),\n }\n case 'paragraph':\n case 'inline':\n return { children: normalizeChildren(node.children), kind: 'paragraph' }\n case 'list':\n return {\n children: normalizeChildren(nodeField(node, 'items')),\n kind: 'list',\n ordered: booleanValue(nodeField(node, 'ordered')) ?? false,\n start: numberValue(nodeField(node, 'start')),\n }\n case 'list_item':\n return { children: normalizeChildren(node.children), kind: 'list-item' }\n case 'code_block':\n return {\n kind: 'code-block',\n language: stringValue(nodeField(node, 'language')),\n loading: booleanValue(node.loading),\n text: stringValue(node.code, fallback),\n }\n case 'inline_code':\n return { kind: 'inline-code', text: stringValue(node.code, fallback) }\n case 'link':\n return {\n children: normalizeChildren(node.children),\n href: stringValue(nodeField(node, 'href')),\n kind: 'link',\n text: stringValue(nodeField(node, 'text')),\n title: stringValue(nodeField(node, 'title')),\n }\n case 'image':\n return {\n alt: stringValue(nodeField(node, 'alt')),\n href: stringValue(nodeField(node, 'src')),\n kind: 'image',\n title: stringValue(nodeField(node, 'title')),\n }\n case 'thematic_break':\n return { kind: 'thematic-break' }\n case 'blockquote':\n return { children: normalizeChildren(node.children), kind: 'blockquote' }\n case 'table': {\n const header = nodeField(node, 'header')\n const rows = nodeField(node, 'rows')\n return {\n children: normalizeChildren(Array.isArray(rows) ? [header, ...rows] : [header]),\n kind: 'table',\n }\n }\n case 'table_row':\n return { children: normalizeChildren(nodeField(node, 'cells')), kind: 'table-row' }\n case 'table_cell':\n return {\n align: alignValue(nodeField(node, 'align')),\n children: normalizeChildren(node.children),\n header: booleanValue(nodeField(node, 'header')),\n kind: 'table-cell',\n }\n case 'strong':\n return { children: normalizeChildren(node.children), kind: 'strong' }\n case 'emphasis':\n return { children: normalizeChildren(node.children), kind: 'emphasis' }\n case 'strikethrough':\n return { children: normalizeChildren(node.children), kind: 'strikethrough' }\n case 'highlight':\n return { children: normalizeChildren(node.children), kind: 'highlight' }\n case 'insert':\n return { children: normalizeChildren(node.children), kind: 'insert' }\n case 'subscript':\n return { children: normalizeChildren(node.children), kind: 'subscript' }\n case 'superscript':\n return { children: normalizeChildren(node.children), kind: 'superscript' }\n case 'checkbox':\n case 'checkbox_input':\n return { checked: booleanValue(nodeField(node, 'checked')), kind: 'checkbox' }\n case 'emoji':\n return textNode(stringValue(nodeField(node, 'markup'), fallback))\n case 'definition_list':\n return { children: normalizeChildren(nodeField(node, 'items')), kind: 'definition-list' }\n case 'definition_item':\n return {\n children: [\n { children: normalizeChildren(nodeField(node, 'term')), header: true, kind: 'definition' },\n { children: normalizeChildren(nodeField(node, 'definition')), kind: 'definition' },\n ],\n kind: 'definition',\n }\n case 'footnote':\n return { children: normalizeChildren(node.children), kind: 'footnote', title: stringValue(nodeField(node, 'id')) }\n case 'footnote_reference':\n case 'reference':\n return { kind: 'footnote', text: stringValue(nodeField(node, 'id')) }\n case 'admonition':\n return {\n children: normalizeChildren(node.children),\n kind: 'admonition',\n text: stringValue(nodeField(node, 'kind')),\n title: stringValue(nodeField(node, 'title')),\n }\n case 'vmr_container':\n return {\n children: normalizeChildren(node.children),\n kind: 'admonition',\n loading: booleanValue(node.loading),\n title: stringValue(nodeField(node, 'name')),\n }\n case 'hardbreak':\n return { kind: 'hardbreak' }\n case 'math_inline':\n return { kind: 'math-inline', text: stringValue(node.content, fallback) }\n case 'math_block':\n return { kind: 'math-block', text: stringValue(node.content, fallback) }\n case 'html_block':\n case 'html_inline':\n return textNode(stringValue(node.content, fallback))\n default:\n return textNode(fallback)\n }\n}\n\nexport function normalizeMarkdownNodes(nodes: ParsedNode[]): AgentMarkdownViewNode[] {\n return nodes.map(normalizeMarkdownNode)\n}\n","import { createAgentEventChannel } from './event-channel'\nimport { parseAgentStreamEvent } from './event-parser'\nimport type { AgentStreamEvent } from './types'\n\nexport interface AgentSseEventSource {\n end: () => void\n fail: (error: unknown) => void\n feed: (chunk: string | ArrayBuffer | Uint8Array) => void\n source: AsyncIterable<AgentStreamEvent>\n}\n\ninterface Utf8ChunkDecoder {\n decode: (chunk: Uint8Array, final?: boolean) => string\n}\n\nfunction createFallbackUtf8Decoder(): Utf8ChunkDecoder {\n let carry = new Uint8Array(0)\n\n return {\n decode(chunk, final = false) {\n const bytes = new Uint8Array(carry.length + chunk.length)\n bytes.set(carry)\n bytes.set(chunk, carry.length)\n let cursor = 0\n let result = ''\n\n while (cursor < bytes.length) {\n const first = bytes[cursor]\n if (first < 0x80) {\n result += String.fromCodePoint(first)\n cursor += 1\n continue\n }\n\n const size = first >= 0xf0 ? 4 : first >= 0xe0 ? 3 : first >= 0xc0 ? 2 : 1\n if (size === 1) {\n result += '\\uFFFD'\n cursor += 1\n continue\n }\n if (cursor + size > bytes.length) break\n\n let codePoint = first & (size === 2 ? 0x1f : size === 3 ? 0x0f : 0x07)\n let valid = true\n for (let index = 1; index < size; index += 1) {\n const continuation = bytes[cursor + index]\n if ((continuation & 0xc0) !== 0x80) {\n valid = false\n break\n }\n codePoint = (codePoint << 6) | (continuation & 0x3f)\n }\n\n if (!valid || codePoint > 0x10ffff) {\n result += '\\uFFFD'\n cursor += 1\n continue\n }\n\n result += String.fromCodePoint(codePoint)\n cursor += size\n }\n\n carry = bytes.slice(cursor)\n if (final && carry.length > 0) {\n result += '\\uFFFD'\n carry = new Uint8Array(0)\n }\n return result\n }\n }\n}\n\nfunction createUtf8Decoder(): Utf8ChunkDecoder {\n if (typeof TextDecoder === 'function') {\n const decoder = new TextDecoder()\n return {\n decode(chunk, final = false) {\n return decoder.decode(chunk, { stream: !final })\n }\n }\n }\n return createFallbackUtf8Decoder()\n}\n\nfunction toBytes(chunk: ArrayBuffer | Uint8Array) {\n return chunk instanceof Uint8Array ? chunk : new Uint8Array(chunk)\n}\n\nexport function createAgentSseEventSource(): AgentSseEventSource {\n const channel = createAgentEventChannel()\n const decoder = createUtf8Decoder()\n const dataLines: string[] = []\n let textBuffer = ''\n let ended = false\n\n function clearBufferedInput() {\n dataLines.length = 0\n textBuffer = ''\n }\n\n function closeSource() {\n if (ended) return\n ended = true\n clearBufferedInput()\n channel.end()\n }\n\n function failSource(error: unknown) {\n if (ended) return\n ended = true\n clearBufferedInput()\n channel.fail(error)\n }\n\n function finishWith(event: AgentStreamEvent) {\n channel.push(event)\n closeSource()\n }\n\n function dispatch() {\n if (dataLines.length === 0 || ended) return\n const payload = dataLines.join('\\n')\n dataLines.length = 0\n if (payload === '[DONE]') {\n finishWith({ type: 'done' })\n return\n }\n\n try {\n const event = parseAgentStreamEvent(JSON.parse(payload))\n if (event.type === 'done' || event.type === 'error') finishWith(event)\n else channel.push(event)\n } catch (error) {\n failSource(error)\n }\n }\n\n function processLine(line: string) {\n const normalized = line.endsWith('\\r') ? line.slice(0, -1) : line\n if (normalized.length === 0) {\n dispatch()\n return\n }\n if (normalized.startsWith(':')) return\n if (normalized === 'data') {\n dataLines.push('')\n return\n }\n if (normalized.startsWith('data:')) {\n const value = normalized.slice(5)\n dataLines.push(value.startsWith(' ') ? value.slice(1) : value)\n }\n }\n\n function appendText(value: string) {\n if (ended) return\n textBuffer += value\n let lineEnd = textBuffer.indexOf('\\n')\n while (lineEnd >= 0) {\n processLine(textBuffer.slice(0, lineEnd))\n if (ended) return\n textBuffer = textBuffer.slice(lineEnd + 1)\n lineEnd = textBuffer.indexOf('\\n')\n }\n }\n\n return {\n end() {\n if (ended) return\n appendText(decoder.decode(new Uint8Array(0), true))\n if (ended) return\n if (textBuffer.length > 0) processLine(textBuffer)\n dispatch()\n closeSource()\n },\n fail(error) {\n failSource(error)\n },\n feed(chunk) {\n if (ended) return\n appendText(typeof chunk === 'string' ? chunk : decoder.decode(toBytes(chunk)))\n },\n source: channel.source\n }\n}\n","import type {\n AgentThreadController,\n AgentThreadSnapshot,\n AgentThreadVersion,\n} from './types'\n\nconst DESTROYED_ERROR = 'Agent thread controller is destroyed'\n\nfunction assertVersionId(id: string) {\n if (id.length === 0) throw new Error('Agent thread version id must not be empty')\n}\n\nfunction freezeVersion(version: AgentThreadVersion): AgentThreadVersion {\n return Object.freeze({ ...version })\n}\n\nfunction freezeSnapshot(\n versions: readonly AgentThreadVersion[],\n activeVersionId?: string,\n): AgentThreadSnapshot {\n if (activeVersionId === undefined) return Object.freeze({ versions })\n return Object.freeze({ activeVersionId, versions })\n}\n\nfunction validateSnapshot(initial?: AgentThreadSnapshot): AgentThreadSnapshot {\n const sourceVersions = initial?.versions ?? []\n const versionsById = new Map<string, AgentThreadVersion>()\n\n for (const version of sourceVersions) {\n assertVersionId(version.id)\n if (versionsById.has(version.id)) {\n throw new Error(`Agent thread version \"${version.id}\" is duplicated`)\n }\n versionsById.set(version.id, version)\n }\n\n for (const version of sourceVersions) {\n if (version.parentId !== undefined && !versionsById.has(version.parentId)) {\n throw new Error(`Agent thread parent version \"${version.parentId}\" does not exist`)\n }\n }\n\n const resolvedIds = new Set<string>()\n for (const version of sourceVersions) {\n if (resolvedIds.has(version.id)) continue\n\n const path: string[] = []\n const pathIds = new Set<string>()\n let current: AgentThreadVersion | undefined = version\n while (current !== undefined && !resolvedIds.has(current.id)) {\n if (pathIds.has(current.id)) {\n throw new Error(`Agent thread version \"${current.id}\" has a cyclic parent chain`)\n }\n path.push(current.id)\n pathIds.add(current.id)\n current = current.parentId === undefined\n ? undefined\n : versionsById.get(current.parentId)\n }\n path.forEach(id => resolvedIds.add(id))\n }\n\n const activeVersionId = initial?.activeVersionId\n if (activeVersionId !== undefined && !versionsById.has(activeVersionId)) {\n throw new Error(`Agent thread active version \"${activeVersionId}\" does not exist`)\n }\n\n return freezeSnapshot(Object.freeze(sourceVersions.map(freezeVersion)), activeVersionId)\n}\n\nexport function createAgentThreadController(\n initial?: AgentThreadSnapshot,\n): AgentThreadController {\n const listeners = new Set<() => void>()\n let snapshot = validateSnapshot(initial)\n let destroyed = false\n\n function assertActive() {\n if (destroyed) throw new Error(DESTROYED_ERROR)\n }\n\n function findVersion(id: string) {\n return snapshot.versions.find(version => version.id === id)\n }\n\n function replace(nextSnapshot: AgentThreadSnapshot) {\n snapshot = nextSnapshot\n listeners.forEach(listener => listener())\n }\n\n function append(version: AgentThreadVersion) {\n assertActive()\n assertVersionId(version.id)\n if (findVersion(version.id)) {\n throw new Error(`Agent thread version \"${version.id}\" already exists`)\n }\n if (version.parentId !== undefined && !findVersion(version.parentId)) {\n throw new Error(`Agent thread parent version \"${version.parentId}\" does not exist`)\n }\n\n const versions = Object.freeze([...snapshot.versions, freezeVersion(version)])\n replace(freezeSnapshot(versions, version.id))\n }\n\n function fork(\n parentId: string,\n version: Omit<AgentThreadVersion, 'parentId'>,\n ) {\n assertActive()\n assertVersionId(version.id)\n if (findVersion(version.id)) {\n throw new Error(`Agent thread version \"${version.id}\" already exists`)\n }\n if (!findVersion(parentId)) {\n throw new Error(`Agent thread parent version \"${parentId}\" does not exist`)\n }\n\n const forkedVersion = freezeVersion({ ...version, parentId })\n const versions = Object.freeze([...snapshot.versions, forkedVersion])\n replace(freezeSnapshot(versions, forkedVersion.id))\n }\n\n function select(id: string) {\n assertActive()\n if (!findVersion(id)) {\n throw new Error(`Agent thread version \"${id}\" does not exist`)\n }\n replace(freezeSnapshot(snapshot.versions, id))\n }\n\n function reset(nextInitial?: AgentThreadSnapshot) {\n assertActive()\n const nextSnapshot = validateSnapshot(nextInitial)\n replace(nextSnapshot)\n }\n\n function subscribe(listener: () => void) {\n assertActive()\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n }\n\n return {\n append,\n destroy() {\n if (destroyed) return\n destroyed = true\n listeners.clear()\n },\n fork,\n getSnapshot() {\n return snapshot\n },\n reset,\n select,\n subscribe,\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@varo-ui/ai",
3
3
  "type": "module",
4
- "version": "2.0.0",
4
+ "version": "2.2.0",
5
5
  "description": "Shared event protocol, streaming controller, and safe Markdown primitives for Varo Agent UI.",
6
6
  "author": "daguanren21 <1363917353@qq.com>",
7
7
  "license": "MIT",
@@ -37,8 +37,8 @@
37
37
  "src"
38
38
  ],
39
39
  "dependencies": {
40
- "markstream-core": "^2.0.7",
41
- "stream-markdown-parser": "^1.2.13"
40
+ "markstream-core": "^2.0.12",
41
+ "stream-markdown-parser": "^1.2.16"
42
42
  },
43
43
  "scripts": {
44
44
  "build": "tsdown",
@@ -46,7 +46,7 @@
46
46
  "dev": "tsdown --watch",
47
47
  "lint": "echo agent-core lint pending",
48
48
  "typecheck": "tsc -p tsconfig.json --noEmit",
49
- "test": "vitest run --passWithNoTests",
49
+ "test": "vitest run --config ../../vitest.config.ts --dir . --passWithNoTests",
50
50
  "test:e2e": "echo agent-core has no e2e"
51
51
  }
52
52
  }