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 +1 -1
- package/esm/src/agent/ag-ui-handler.d.ts.map +1 -1
- package/esm/src/agent/ag-ui-handler.js +3 -25
- package/esm/src/agent/data-stream.d.ts +11 -0
- package/esm/src/agent/data-stream.d.ts.map +1 -0
- package/esm/src/agent/data-stream.js +96 -0
- package/esm/src/agent/index.d.ts +1 -0
- package/esm/src/agent/index.d.ts.map +1 -1
- package/esm/src/agent/index.js +1 -0
- package/esm/src/agent/runtime/chat-stream-handler.d.ts.map +1 -1
- package/esm/src/agent/runtime/chat-stream-handler.js +2 -36
- package/esm/src/internal-agents/ag-ui-sse.d.ts.map +1 -1
- package/esm/src/internal-agents/ag-ui-sse.js +6 -24
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/package.json +1 -1
- package/src/deno.js +1 -1
- package/src/src/agent/ag-ui-handler.ts +4 -28
- package/src/src/agent/data-stream.ts +121 -0
- package/src/src/agent/index.ts +8 -0
- package/src/src/agent/runtime/chat-stream-handler.ts +2 -44
- package/src/src/internal-agents/ag-ui-sse.ts +6 -26
- package/src/src/utils/version-constant.ts +1 -1
package/esm/deno.js
CHANGED
|
@@ -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;
|
|
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,
|
|
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
|
-
|
|
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
|
+
}
|
package/esm/src/agent/index.d.ts
CHANGED
|
@@ -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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"}
|
package/esm/src/agent/index.js
CHANGED
|
@@ -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;
|
|
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 =
|
|
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;
|
|
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
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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.
|
|
1
|
+
export declare const VERSION = "0.1.193";
|
|
2
2
|
//# sourceMappingURL=version-constant.d.ts.map
|
package/package.json
CHANGED
package/src/deno.js
CHANGED
|
@@ -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
|
-
|
|
339
|
-
|
|
340
|
-
|
|
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
|
+
}
|
package/src/src/agent/index.ts
CHANGED
|
@@ -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 =
|
|
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
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
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(
|