veryfront 0.1.192 → 0.1.193

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/esm/deno.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export default {
2
2
  "name": "veryfront",
3
- "version": "0.1.192",
3
+ "version": "0.1.193",
4
4
  "license": "Apache-2.0",
5
5
  "nodeModulesDir": "auto",
6
6
  "exclude": [
@@ -1 +1 @@
1
- {"version":3,"file":"ag-ui-handler.d.ts","sourceRoot":"","sources":["../../../src/src/agent/ag-ui-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,KAAK,EAAW,MAAM,YAAY,CAAC;AACjD,OAAO,EAGL,KAAK,uBAAuB,EAC7B,MAAM,oBAAoB,CAAC;AAsC5B,QAAA,MAAM,sBAAsB;;;;iBAO1B,CAAC;AAEH,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;;2BAqBzB,CAAC;AAYH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAe5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAG5D,KAAK,eAAe,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAia7D,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EACJ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvB,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACvF,cAAc,CAAC,EAAE,uBAAuB,CAAC,eAAe,CAAC,CAAC;CAC3D;AAED,MAAM,WAAW,0BAA2B,SAAQ,kBAAkB;IACpE,KAAK,EAAE,KAAK,CAAC;CACd;AAUD,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,kBAAkB,GAC3B,CAAC,YAAY,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAChD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,0BAA0B,EAClC,OAAO,CAAC,EAAE,kBAAkB,GAC3B,CAAC,YAAY,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC"}
1
+ {"version":3,"file":"ag-ui-handler.d.ts","sourceRoot":"","sources":["../../../src/src/agent/ag-ui-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,KAAK,EAAW,MAAM,YAAY,CAAC;AACjD,OAAO,EAGL,KAAK,uBAAuB,EAC7B,MAAM,oBAAoB,CAAC;AAsC5B,QAAA,MAAM,sBAAsB;;;;iBAO1B,CAAC;AAEH,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;;2BAqBzB,CAAC;AAYH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAe5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAG5D,KAAK,eAAe,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAyY7D,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EACJ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvB,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACvF,cAAc,CAAC,EAAE,uBAAuB,CAAC,eAAe,CAAC,CAAC;CAC3D;AAED,MAAM,WAAW,0BAA2B,SAAQ,kBAAkB;IACpE,KAAK,EAAE,KAAK,CAAC;CACd;AAUD,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,kBAAkB,GAC3B,CAAC,YAAY,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAChD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,0BAA0B,EAClC,OAAO,CAAC,EAAE,kBAAkB,GAC3B,CAAC,YAAY,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC"}
@@ -5,7 +5,8 @@ import { AgentRuntime, RunAlreadyExistsError, } from "./runtime/index.js";
5
5
  import { INVALID_ARGUMENT } from "../errors/index.js";
6
6
  import { SKILL_TOOL_IDS } from "../skill/types.js";
7
7
  import { toolRegistry } from "../tool/index.js";
8
- import { createStreamTransformState, finalizeRunEvents, formatAgUiEvent, mapRuntimeEventToAgUi, parseSseJsonEvents, } from "../internal-agents/ag-ui-sse.js";
8
+ import { createStreamTransformState, finalizeRunEvents, formatAgUiEvent, mapRuntimeEventToAgUi, } from "../internal-agents/ag-ui-sse.js";
9
+ import { streamDataStreamEvents } from "./data-stream.js";
9
10
  const AGENT_ID_PATTERN = /^[a-zA-Z0-9_-]+$/;
10
11
  const MAX_TOOL_PARAMETERS_BYTES = 16_384;
11
12
  const MAX_CONTEXT_ITEM_BYTES = 16_384;
@@ -202,9 +203,6 @@ async function createAgUiStreamResponse(options) {
202
203
  const stream = new ReadableStream({
203
204
  start: async (controller) => {
204
205
  const state = createStreamTransformState();
205
- let reader = null;
206
- let remainder = "";
207
- const decoder = new TextDecoder();
208
206
  const prepareToolResultIfNeeded = (event, payload) => {
209
207
  if (event !== "ToolCallStart" && event !== "ToolCallArgs" &&
210
208
  event !== "ToolCallEnd") {
@@ -235,26 +233,7 @@ async function createAgUiStreamResponse(options) {
235
233
  closeController(controller);
236
234
  return;
237
235
  }
238
- reader = upstreamBody.getReader();
239
- while (true) {
240
- const { done, value } = await reader.read();
241
- if (done)
242
- break;
243
- remainder += decoder.decode(value, { stream: true });
244
- const parsed = parseSseJsonEvents(remainder);
245
- remainder = parsed.remainder;
246
- for (const event of parsed.events) {
247
- for (const mapped of mapRuntimeEventToAgUi(state, event)) {
248
- prepareToolResultIfNeeded(mapped.event, mapped.payload);
249
- if (!enqueueEvent(controller, mapped.event, mapped.payload)) {
250
- return;
251
- }
252
- }
253
- }
254
- }
255
- remainder += decoder.decode();
256
- const parsed = parseSseJsonEvents(remainder);
257
- for (const event of parsed.events) {
236
+ for await (const event of streamDataStreamEvents(upstreamBody)) {
258
237
  for (const mapped of mapRuntimeEventToAgUi(state, event)) {
259
238
  prepareToolResultIfNeeded(mapped.event, mapped.payload);
260
239
  if (!enqueueEvent(controller, mapped.event, mapped.payload)) {
@@ -276,7 +255,6 @@ async function createAgUiStreamResponse(options) {
276
255
  });
277
256
  }
278
257
  finally {
279
- await reader?.cancel().catch(() => undefined);
280
258
  closeController(controller);
281
259
  }
282
260
  },
@@ -0,0 +1,11 @@
1
+ import type { AgUiRuntimeStreamEvent } from "./ag-ui-browser-encoder.js";
2
+ export declare function stripLeadingEmptyObjectPlaceholder(rawArgs: string): string;
3
+ export declare function mergeToolInputDelta(currentArguments: string, nextDelta: string): string;
4
+ export declare function mergeToolCallInput(currentArguments: string, nextInput: string): string;
5
+ export declare function parseToolInputObject(input: unknown): Record<string, unknown>;
6
+ export declare function parseDataStreamSseEvents(chunk: string): {
7
+ events: AgUiRuntimeStreamEvent[];
8
+ remainder: string;
9
+ };
10
+ export declare function streamDataStreamEvents(stream: ReadableStream<Uint8Array>): AsyncGenerator<AgUiRuntimeStreamEvent>;
11
+ //# sourceMappingURL=data-stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-stream.d.ts","sourceRoot":"","sources":["../../../src/src/agent/data-stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAMzE,wBAAgB,kCAAkC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQ1E;AAED,wBAAgB,mBAAmB,CAAC,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAMvF;AAED,wBAAgB,kBAAkB,CAAC,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CActF;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiB5E;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG;IACvD,MAAM,EAAE,sBAAsB,EAAE,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;CACnB,CAoBA;AAED,wBAAuB,sBAAsB,CAC3C,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,GACjC,cAAc,CAAC,sBAAsB,CAAC,CAkCxC"}
@@ -0,0 +1,96 @@
1
+ function isRecord(value) {
2
+ return typeof value === "object" && value !== null && !Array.isArray(value);
3
+ }
4
+ export function stripLeadingEmptyObjectPlaceholder(rawArgs) {
5
+ let normalized = rawArgs.trim();
6
+ while (normalized.startsWith("{}") && normalized.slice(2).trimStart().startsWith("{")) {
7
+ normalized = normalized.slice(2).trimStart();
8
+ }
9
+ return normalized;
10
+ }
11
+ export function mergeToolInputDelta(currentArguments, nextDelta) {
12
+ if (currentArguments === "{}" && nextDelta.trimStart().startsWith("{")) {
13
+ return nextDelta;
14
+ }
15
+ return currentArguments + nextDelta;
16
+ }
17
+ export function mergeToolCallInput(currentArguments, nextInput) {
18
+ if (currentArguments.length === 0) {
19
+ return nextInput;
20
+ }
21
+ if (nextInput.trim() === "{}" && currentArguments.trim().startsWith("{")) {
22
+ return currentArguments;
23
+ }
24
+ if (currentArguments.trim() === "{}" && nextInput.trim().startsWith("{")) {
25
+ return nextInput;
26
+ }
27
+ return nextInput;
28
+ }
29
+ export function parseToolInputObject(input) {
30
+ if (isRecord(input)) {
31
+ return input;
32
+ }
33
+ if (typeof input === "string") {
34
+ try {
35
+ const parsed = JSON.parse(stripLeadingEmptyObjectPlaceholder(input));
36
+ if (isRecord(parsed)) {
37
+ return parsed;
38
+ }
39
+ }
40
+ catch {
41
+ return {};
42
+ }
43
+ }
44
+ return {};
45
+ }
46
+ export function parseDataStreamSseEvents(chunk) {
47
+ const blocks = chunk.split("\n\n");
48
+ const remainder = blocks.pop() ?? "";
49
+ const events = blocks.flatMap((block) => {
50
+ const dataLines = block.split("\n")
51
+ .filter((line) => line.startsWith("data:"))
52
+ .map((line) => line.slice(5).trimStart());
53
+ if (!dataLines.length) {
54
+ return [];
55
+ }
56
+ try {
57
+ return [JSON.parse(dataLines.join("\n"))];
58
+ }
59
+ catch {
60
+ return [];
61
+ }
62
+ });
63
+ return { events, remainder };
64
+ }
65
+ export async function* streamDataStreamEvents(stream) {
66
+ const reader = stream.getReader();
67
+ const decoder = new TextDecoder();
68
+ let remainder = "";
69
+ let completed = false;
70
+ try {
71
+ while (true) {
72
+ const { done, value } = await reader.read();
73
+ if (done) {
74
+ completed = true;
75
+ break;
76
+ }
77
+ remainder += decoder.decode(value, { stream: true });
78
+ const parsed = parseDataStreamSseEvents(remainder);
79
+ remainder = parsed.remainder;
80
+ for (const event of parsed.events) {
81
+ yield event;
82
+ }
83
+ }
84
+ remainder += decoder.decode();
85
+ const parsed = parseDataStreamSseEvents(`${remainder}\n\n`);
86
+ for (const event of parsed.events) {
87
+ yield event;
88
+ }
89
+ }
90
+ finally {
91
+ if (!completed) {
92
+ await reader.cancel().catch(() => undefined);
93
+ }
94
+ reader.releaseLock();
95
+ }
96
+ }
@@ -86,6 +86,7 @@ export { agentAsTool, createWorkflow, getAgent, getAgentsAsTools, getAllAgentIds
86
86
  export { agent } from "./factory.js";
87
87
  export { type AgUiRuntimeContextItem, AgUiRuntimeContextItemSchema, type AgUiRuntimeInjectedTool, AgUiRuntimeInjectedToolSchema, type AgUiRuntimeMessage, AgUiRuntimeMessageSchema, type AgUiRuntimeRequest, AgUiRuntimeRequestSchema, } from "./runtime-ag-ui-contract.js";
88
88
  export { type AgUiBrowserEncodedEvent, type AgUiBrowserEncoderState, type AgUiBrowserRunFinishedMetadata, type AgUiRuntimeStreamEvent, createAgUiBrowserEncoderState, finalizeAgUiBrowserEvents, mapRuntimeStreamEventToAgUiBrowserEvents, } from "./ag-ui-browser-encoder.js";
89
+ export { mergeToolCallInput, mergeToolInputDelta, parseDataStreamSseEvents, parseToolInputObject, streamDataStreamEvents, stripLeadingEmptyObjectPlaceholder, } from "./data-stream.js";
89
90
  export { expandAllowedRemoteToolNames, getProviderNativeToolNames, type ProviderNativeToolInventoryOptions, } from "./provider-native-tool-inventory.js";
90
91
  export { type AgUiCancelHandlerOptions, type AgUiResumeHandlerOptions, type AgUiResumeSignal, AgUiResumeSignalSchema, createAgUiCancelHandler, createAgUiResumeHandler, } from "./ag-ui-run-control.js";
91
92
  export { type AgUiContextItem, type AgUiHandlerConfigWithAgent, type AgUiHandlerOptions, type AgUiInjectedTool, type AgUiRequest, AgUiRequestSchema, createAgUiHandler, } from "./ag-ui-handler.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/src/agent/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/src/agent/index.ts"],"names":[],"mappings":"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"}
@@ -85,6 +85,7 @@ export { agentAsTool, createWorkflow, getAgent, getAgentsAsTools, getAllAgentIds
85
85
  export { agent } from "./factory.js";
86
86
  export { AgUiRuntimeContextItemSchema, AgUiRuntimeInjectedToolSchema, AgUiRuntimeMessageSchema, AgUiRuntimeRequestSchema, } from "./runtime-ag-ui-contract.js";
87
87
  export { createAgUiBrowserEncoderState, finalizeAgUiBrowserEvents, mapRuntimeStreamEventToAgUiBrowserEvents, } from "./ag-ui-browser-encoder.js";
88
+ export { mergeToolCallInput, mergeToolInputDelta, parseDataStreamSseEvents, parseToolInputObject, streamDataStreamEvents, stripLeadingEmptyObjectPlaceholder, } from "./data-stream.js";
88
89
  export { expandAllowedRemoteToolNames, getProviderNativeToolNames, } from "./provider-native-tool-inventory.js";
89
90
  export { AgUiResumeSignalSchema, createAgUiCancelHandler, createAgUiResumeHandler, } from "./ag-ui-run-control.js";
90
91
  export { AgUiRequestSchema, createAgUiHandler, } from "./ag-ui-handler.js";
@@ -1 +1 @@
1
- {"version":3,"file":"chat-stream-handler.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/chat-stream-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAqB,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAWtF,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC1C,WAAW,EAAE,mBAAmB,EAAE,CAAC;IACnC,KAAK,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CAChF;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,KAAK,IAAI,CAAC;CACZ;AAoHD,wBAAgB,iBAAiB,IAAI,eAAe,CAQnD;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,+BAA+B,EAC3C,OAAO,EAAE,WAAW,EACpB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,SAAS,CAAC,EAAE,mBAAmB,EAC/B,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,IAAI,CAAC,CAqPf"}
1
+ {"version":3,"file":"chat-stream-handler.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/chat-stream-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAqB,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAYtF,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC1C,WAAW,EAAE,mBAAmB,EAAE,CAAC;IACnC,KAAK,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CAChF;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,KAAK,IAAI,CAAC;CACZ;AAyED,wBAAgB,iBAAiB,IAAI,eAAe,CAQnD;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,+BAA+B,EAC3C,OAAO,EAAE,WAAW,EACpB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,SAAS,CAAC,EAAE,mBAAmB,EAC/B,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,IAAI,CAAC,CAqPf"}
@@ -8,6 +8,7 @@
8
8
  * @module agent/runtime/chat-stream-handler
9
9
  */
10
10
  import { sendSSE } from "./sse-utils.js";
11
+ import { mergeToolCallInput, mergeToolInputDelta, parseToolInputObject } from "../data-stream.js";
11
12
  import { isDynamicTool } from "./tool-helpers.js";
12
13
  import { serverLogger } from "../../utils/index.js";
13
14
  import { isAnyDebugEnabled } from "../../utils/constants/env.js";
@@ -24,41 +25,6 @@ function normalizeToolInputString(input) {
24
25
  }
25
26
  return JSON.stringify(input ?? null) ?? "null";
26
27
  }
27
- function mergeToolInputDelta(currentArguments, nextDelta) {
28
- if (currentArguments === "{}" && nextDelta.trimStart().startsWith("{")) {
29
- return nextDelta;
30
- }
31
- return currentArguments + nextDelta;
32
- }
33
- function mergeToolCallInput(currentArguments, nextInput) {
34
- if (currentArguments.length === 0) {
35
- return nextInput;
36
- }
37
- if (nextInput.trim() === "{}" && currentArguments.trim().startsWith("{")) {
38
- return currentArguments;
39
- }
40
- if (currentArguments.trim() === "{}" && nextInput.trim().startsWith("{")) {
41
- return nextInput;
42
- }
43
- return nextInput;
44
- }
45
- function normalizeToolInputObject(input) {
46
- if (isRecord(input)) {
47
- return input;
48
- }
49
- if (typeof input === "string") {
50
- try {
51
- const parsed = JSON.parse(input);
52
- if (isRecord(parsed)) {
53
- return parsed;
54
- }
55
- }
56
- catch {
57
- return {};
58
- }
59
- }
60
- return {};
61
- }
62
28
  function summarizeDebugValue(value) {
63
29
  if (value instanceof Error) {
64
30
  return {
@@ -206,7 +172,7 @@ export function processStream(result, state, controller, encoder, textPartId, ca
206
172
  dynamic: typedPart.dynamic,
207
173
  });
208
174
  const dynamic = isDynamicTool(typedPart.toolName);
209
- const inputObj = normalizeToolInputObject(typedPart.input);
175
+ const inputObj = parseToolInputObject(typedPart.input);
210
176
  sendSSE(controller, encoder, {
211
177
  type: "tool-input-available",
212
178
  toolCallId: toolId,
@@ -1 +1 @@
1
- {"version":3,"file":"ag-ui-sse.d.ts","sourceRoot":"","sources":["../../../src/src/internal-agents/ag-ui-sse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,uBAAuB,EACvB,uBAAuB,EACvB,8BAA8B,EAC9B,sBAAsB,EACvB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAEL,yBAAyB,EAE1B,MAAM,mCAAmC,CAAC;AAO3C,KAAK,gBAAgB,GAAG,sBAAsB,CAAC;AAC/C,MAAM,MAAM,mBAAmB,GAAG,8BAA8B,CAAC;AACjE,MAAM,MAAM,oBAAoB,GAAG,uBAAuB,CAAC;AAC3D,MAAM,MAAM,eAAe,GAAG,uBAAuB,CAAC;AAEtD,wBAAgB,0BAA0B,IAAI,oBAAoB,CAEjE;AAsFD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,CAI3F;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG;IACjD,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB,CAyBA;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,oBAAoB,EAC3B,KAAK,EAAE,gBAAgB,GACtB,eAAe,EAAE,CAEnB;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,oBAAoB,EAC3B,QAAQ,EAAE,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC,CAAC,CAAC,GACxD,eAAe,EAAE,CAEnB"}
1
+ {"version":3,"file":"ag-ui-sse.d.ts","sourceRoot":"","sources":["../../../src/src/internal-agents/ag-ui-sse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,uBAAuB,EACvB,uBAAuB,EACvB,8BAA8B,EAC9B,sBAAsB,EACvB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAEL,yBAAyB,EAE1B,MAAM,mCAAmC,CAAC;AAK3C,KAAK,gBAAgB,GAAG,sBAAsB,CAAC;AAC/C,MAAM,MAAM,mBAAmB,GAAG,8BAA8B,CAAC;AACjE,MAAM,MAAM,oBAAoB,GAAG,uBAAuB,CAAC;AAC3D,MAAM,MAAM,eAAe,GAAG,uBAAuB,CAAC;AAEtD,wBAAgB,0BAA0B,IAAI,oBAAoB,CAEjE;AAsFD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,CAI3F;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG;IACjD,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB,CAMA;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,oBAAoB,EAC3B,KAAK,EAAE,gBAAgB,GACtB,eAAe,EAAE,CAEnB;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,oBAAoB,EAC3B,QAAQ,EAAE,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC,CAAC,CAAC,GACxD,eAAe,EAAE,CAEnB"}
@@ -1,8 +1,7 @@
1
+ import { parseDataStreamSseEvents } from "../agent/data-stream.js";
1
2
  import { createAgUiBrowserEncoderState, finalizeAgUiBrowserEvents, mapRuntimeStreamEventToAgUiBrowserEvents, } from "../agent/ag-ui-browser-encoder.js";
2
- import { serverLogger } from "../utils/index.js";
3
3
  import { z } from "zod";
4
4
  const encoder = new TextEncoder();
5
- const logger = serverLogger.component("internal-agents-ag-ui-sse");
6
5
  export function createStreamTransformState() {
7
6
  return createAgUiBrowserEncoderState();
8
7
  }
@@ -93,28 +92,11 @@ export function formatAgUiEvent(event, payload) {
93
92
  return encoder.encode(`event: ${event}\ndata: ${JSON.stringify(validatedPayload)}\n\n`);
94
93
  }
95
94
  export function parseSseJsonEvents(chunk) {
96
- const blocks = chunk.split("\n\n");
97
- const remainder = blocks.pop() ?? "";
98
- const events = blocks.flatMap((block) => {
99
- const dataLines = block.split("\n")
100
- .filter((line) => line.startsWith("data:"))
101
- .map((line) => line.slice(5).trimStart());
102
- if (!dataLines.length) {
103
- return [];
104
- }
105
- try {
106
- const payload = JSON.parse(dataLines.join("\n"));
107
- return [payload];
108
- }
109
- catch (error) {
110
- logger.warn("Skipping malformed runtime SSE event payload", {
111
- error,
112
- dataLength: dataLines.join("\n").length,
113
- });
114
- return [];
115
- }
116
- });
117
- return { events, remainder };
95
+ const parsed = parseDataStreamSseEvents(chunk);
96
+ return {
97
+ events: parsed.events,
98
+ remainder: parsed.remainder,
99
+ };
118
100
  }
119
101
  export function mapRuntimeEventToAgUi(state, event) {
120
102
  return mapRuntimeStreamEventToAgUiBrowserEvents(state, event);
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "0.1.192";
1
+ export declare const VERSION = "0.1.193";
2
2
  //# sourceMappingURL=version-constant.d.ts.map
@@ -1,3 +1,3 @@
1
1
  // Keep in sync with deno.json version.
2
2
  // scripts/release.ts updates this constant during releases.
3
- export const VERSION = "0.1.192";
3
+ export const VERSION = "0.1.193";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "veryfront",
3
- "version": "0.1.192",
3
+ "version": "0.1.193",
4
4
  "description": "The simplest way to build AI-powered apps",
5
5
  "keywords": [
6
6
  "react",
package/src/deno.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export default {
2
2
  "name": "veryfront",
3
- "version": "0.1.192",
3
+ "version": "0.1.193",
4
4
  "license": "Apache-2.0",
5
5
  "nodeModulesDir": "auto",
6
6
  "exclude": [
@@ -15,8 +15,8 @@ import {
15
15
  finalizeRunEvents,
16
16
  formatAgUiEvent,
17
17
  mapRuntimeEventToAgUi,
18
- parseSseJsonEvents,
19
18
  } from "../internal-agents/ag-ui-sse.js";
19
+ import { streamDataStreamEvents } from "./data-stream.js";
20
20
 
21
21
  const AGENT_ID_PATTERN = /^[a-zA-Z0-9_-]+$/;
22
22
  const MAX_TOOL_PARAMETERS_BYTES = 16_384;
@@ -296,9 +296,6 @@ async function createAgUiStreamResponse(
296
296
  const stream = new ReadableStream<Uint8Array>({
297
297
  start: async (controller) => {
298
298
  const state = createStreamTransformState();
299
- let reader: ReadableStreamDefaultReader<Uint8Array> | null = null;
300
- let remainder = "";
301
- const decoder = new TextDecoder();
302
299
  const prepareToolResultIfNeeded = (event: string, payload: Record<string, unknown>) => {
303
300
  if (
304
301
  event !== "ToolCallStart" && event !== "ToolCallArgs" &&
@@ -335,29 +332,9 @@ async function createAgUiStreamResponse(
335
332
  return;
336
333
  }
337
334
 
338
- reader = upstreamBody.getReader();
339
-
340
- while (true) {
341
- const { done, value } = await reader.read();
342
- if (done) break;
343
-
344
- remainder += decoder.decode(value, { stream: true });
345
- const parsed = parseSseJsonEvents(remainder);
346
- remainder = parsed.remainder;
347
-
348
- for (const event of parsed.events as AgUiRuntimePart[]) {
349
- for (const mapped of mapRuntimeEventToAgUi(state, event)) {
350
- prepareToolResultIfNeeded(mapped.event, mapped.payload);
351
- if (!enqueueEvent(controller, mapped.event, mapped.payload)) {
352
- return;
353
- }
354
- }
355
- }
356
- }
357
-
358
- remainder += decoder.decode();
359
- const parsed = parseSseJsonEvents(remainder);
360
- for (const event of parsed.events as AgUiRuntimePart[]) {
335
+ for await (
336
+ const event of streamDataStreamEvents(upstreamBody) as AsyncIterable<AgUiRuntimePart>
337
+ ) {
361
338
  for (const mapped of mapRuntimeEventToAgUi(state, event)) {
362
339
  prepareToolResultIfNeeded(mapped.event, mapped.payload);
363
340
  if (!enqueueEvent(controller, mapped.event, mapped.payload)) {
@@ -378,7 +355,6 @@ async function createAgUiStreamResponse(
378
355
  message: error instanceof Error ? error.message : "Agent run failed",
379
356
  });
380
357
  } finally {
381
- await reader?.cancel().catch(() => undefined);
382
358
  closeController(controller);
383
359
  }
384
360
  },
@@ -0,0 +1,121 @@
1
+ import type { AgUiRuntimeStreamEvent } from "./ag-ui-browser-encoder.js";
2
+
3
+ function isRecord(value: unknown): value is Record<string, unknown> {
4
+ return typeof value === "object" && value !== null && !Array.isArray(value);
5
+ }
6
+
7
+ export function stripLeadingEmptyObjectPlaceholder(rawArgs: string): string {
8
+ let normalized = rawArgs.trim();
9
+
10
+ while (normalized.startsWith("{}") && normalized.slice(2).trimStart().startsWith("{")) {
11
+ normalized = normalized.slice(2).trimStart();
12
+ }
13
+
14
+ return normalized;
15
+ }
16
+
17
+ export function mergeToolInputDelta(currentArguments: string, nextDelta: string): string {
18
+ if (currentArguments === "{}" && nextDelta.trimStart().startsWith("{")) {
19
+ return nextDelta;
20
+ }
21
+
22
+ return currentArguments + nextDelta;
23
+ }
24
+
25
+ export function mergeToolCallInput(currentArguments: string, nextInput: string): string {
26
+ if (currentArguments.length === 0) {
27
+ return nextInput;
28
+ }
29
+
30
+ if (nextInput.trim() === "{}" && currentArguments.trim().startsWith("{")) {
31
+ return currentArguments;
32
+ }
33
+
34
+ if (currentArguments.trim() === "{}" && nextInput.trim().startsWith("{")) {
35
+ return nextInput;
36
+ }
37
+
38
+ return nextInput;
39
+ }
40
+
41
+ export function parseToolInputObject(input: unknown): Record<string, unknown> {
42
+ if (isRecord(input)) {
43
+ return input;
44
+ }
45
+
46
+ if (typeof input === "string") {
47
+ try {
48
+ const parsed = JSON.parse(stripLeadingEmptyObjectPlaceholder(input));
49
+ if (isRecord(parsed)) {
50
+ return parsed;
51
+ }
52
+ } catch {
53
+ return {};
54
+ }
55
+ }
56
+
57
+ return {};
58
+ }
59
+
60
+ export function parseDataStreamSseEvents(chunk: string): {
61
+ events: AgUiRuntimeStreamEvent[];
62
+ remainder: string;
63
+ } {
64
+ const blocks = chunk.split("\n\n");
65
+ const remainder = blocks.pop() ?? "";
66
+ const events = blocks.flatMap((block) => {
67
+ const dataLines = block.split("\n")
68
+ .filter((line) => line.startsWith("data:"))
69
+ .map((line) => line.slice(5).trimStart());
70
+
71
+ if (!dataLines.length) {
72
+ return [];
73
+ }
74
+
75
+ try {
76
+ return [JSON.parse(dataLines.join("\n")) as AgUiRuntimeStreamEvent];
77
+ } catch {
78
+ return [];
79
+ }
80
+ });
81
+
82
+ return { events, remainder };
83
+ }
84
+
85
+ export async function* streamDataStreamEvents(
86
+ stream: ReadableStream<Uint8Array>,
87
+ ): AsyncGenerator<AgUiRuntimeStreamEvent> {
88
+ const reader = stream.getReader();
89
+ const decoder = new TextDecoder();
90
+ let remainder = "";
91
+ let completed = false;
92
+
93
+ try {
94
+ while (true) {
95
+ const { done, value } = await reader.read();
96
+ if (done) {
97
+ completed = true;
98
+ break;
99
+ }
100
+
101
+ remainder += decoder.decode(value, { stream: true });
102
+ const parsed = parseDataStreamSseEvents(remainder);
103
+ remainder = parsed.remainder;
104
+
105
+ for (const event of parsed.events) {
106
+ yield event;
107
+ }
108
+ }
109
+
110
+ remainder += decoder.decode();
111
+ const parsed = parseDataStreamSseEvents(`${remainder}\n\n`);
112
+ for (const event of parsed.events) {
113
+ yield event;
114
+ }
115
+ } finally {
116
+ if (!completed) {
117
+ await reader.cancel().catch(() => undefined);
118
+ }
119
+ reader.releaseLock();
120
+ }
121
+ }
@@ -160,6 +160,14 @@ export {
160
160
  finalizeAgUiBrowserEvents,
161
161
  mapRuntimeStreamEventToAgUiBrowserEvents,
162
162
  } from "./ag-ui-browser-encoder.js";
163
+ export {
164
+ mergeToolCallInput,
165
+ mergeToolInputDelta,
166
+ parseDataStreamSseEvents,
167
+ parseToolInputObject,
168
+ streamDataStreamEvents,
169
+ stripLeadingEmptyObjectPlaceholder,
170
+ } from "./data-stream.js";
163
171
  export {
164
172
  expandAllowedRemoteToolNames,
165
173
  getProviderNativeToolNames,
@@ -10,6 +10,7 @@
10
10
 
11
11
  import type { RuntimeStreamPart, RuntimeStreamResult } from "./runtime-tool-types.js";
12
12
  import { sendSSE } from "./sse-utils.js";
13
+ import { mergeToolCallInput, mergeToolInputDelta, parseToolInputObject } from "../data-stream.js";
13
14
  import { isDynamicTool } from "./tool-helpers.js";
14
15
  import { serverLogger } from "../../utils/index.js";
15
16
  import { isAnyDebugEnabled } from "../../utils/constants/env.js";
@@ -66,49 +67,6 @@ function normalizeToolInputString(input: unknown): string {
66
67
  return JSON.stringify(input ?? null) ?? "null";
67
68
  }
68
69
 
69
- function mergeToolInputDelta(currentArguments: string, nextDelta: string): string {
70
- if (currentArguments === "{}" && nextDelta.trimStart().startsWith("{")) {
71
- return nextDelta;
72
- }
73
-
74
- return currentArguments + nextDelta;
75
- }
76
-
77
- function mergeToolCallInput(currentArguments: string, nextInput: string): string {
78
- if (currentArguments.length === 0) {
79
- return nextInput;
80
- }
81
-
82
- if (nextInput.trim() === "{}" && currentArguments.trim().startsWith("{")) {
83
- return currentArguments;
84
- }
85
-
86
- if (currentArguments.trim() === "{}" && nextInput.trim().startsWith("{")) {
87
- return nextInput;
88
- }
89
-
90
- return nextInput;
91
- }
92
-
93
- function normalizeToolInputObject(input: unknown): Record<string, unknown> {
94
- if (isRecord(input)) {
95
- return input;
96
- }
97
-
98
- if (typeof input === "string") {
99
- try {
100
- const parsed = JSON.parse(input);
101
- if (isRecord(parsed)) {
102
- return parsed;
103
- }
104
- } catch {
105
- return {};
106
- }
107
- }
108
-
109
- return {};
110
- }
111
-
112
70
  function summarizeDebugValue(value: unknown): unknown {
113
71
  if (value instanceof Error) {
114
72
  return {
@@ -298,7 +256,7 @@ export function processStream(
298
256
  });
299
257
 
300
258
  const dynamic = isDynamicTool(typedPart.toolName);
301
- const inputObj = normalizeToolInputObject(typedPart.input);
259
+ const inputObj = parseToolInputObject(typedPart.input);
302
260
  sendSSE(controller, encoder, {
303
261
  type: "tool-input-available",
304
262
  toolCallId: toolId,
@@ -4,16 +4,15 @@ import type {
4
4
  AgUiBrowserRunFinishedMetadata,
5
5
  AgUiRuntimeStreamEvent,
6
6
  } from "../agent/ag-ui-browser-encoder.js";
7
+ import { parseDataStreamSseEvents } from "../agent/data-stream.js";
7
8
  import {
8
9
  createAgUiBrowserEncoderState,
9
10
  finalizeAgUiBrowserEvents,
10
11
  mapRuntimeStreamEventToAgUiBrowserEvents,
11
12
  } from "../agent/ag-ui-browser-encoder.js";
12
- import { serverLogger } from "../utils/index.js";
13
13
  import { z } from "zod";
14
14
 
15
15
  const encoder = new TextEncoder();
16
- const logger = serverLogger.component("internal-agents-ag-ui-sse");
17
16
 
18
17
  type RuntimeDataEvent = AgUiRuntimeStreamEvent;
19
18
  export type RunFinishedMetadata = AgUiBrowserRunFinishedMetadata;
@@ -118,30 +117,11 @@ export function parseSseJsonEvents(chunk: string): {
118
117
  events: RuntimeDataEvent[];
119
118
  remainder: string;
120
119
  } {
121
- const blocks = chunk.split("\n\n");
122
- const remainder = blocks.pop() ?? "";
123
- const events = blocks.flatMap((block) => {
124
- const dataLines = block.split("\n")
125
- .filter((line) => line.startsWith("data:"))
126
- .map((line) => line.slice(5).trimStart());
127
-
128
- if (!dataLines.length) {
129
- return [];
130
- }
131
-
132
- try {
133
- const payload = JSON.parse(dataLines.join("\n")) as RuntimeDataEvent;
134
- return [payload];
135
- } catch (error) {
136
- logger.warn("Skipping malformed runtime SSE event payload", {
137
- error,
138
- dataLength: dataLines.join("\n").length,
139
- });
140
- return [];
141
- }
142
- });
143
-
144
- return { events, remainder };
120
+ const parsed = parseDataStreamSseEvents(chunk);
121
+ return {
122
+ events: parsed.events,
123
+ remainder: parsed.remainder,
124
+ };
145
125
  }
146
126
 
147
127
  export function mapRuntimeEventToAgUi(
@@ -1,3 +1,3 @@
1
1
  // Keep in sync with deno.json version.
2
2
  // scripts/release.ts updates this constant during releases.
3
- export const VERSION = "0.1.192";
3
+ export const VERSION = "0.1.193";