veryfront 0.1.185 → 0.1.187

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.185",
3
+ "version": "0.1.187",
4
4
  "license": "Apache-2.0",
5
5
  "nodeModulesDir": "auto",
6
6
  "exclude": [
@@ -1 +1 @@
1
- {"version":3,"file":"ag-ui-browser-encoder.d.ts","sourceRoot":"","sources":["../../../src/src/agent/ag-ui-browser-encoder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhF,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,QAAQ,EAAE,8BAA8B,CAAC;CAC1C;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,wBAAgB,6BAA6B,IAAI,uBAAuB,CAYvE;AAmJD,wBAAgB,wCAAwC,CACtD,KAAK,EAAE,uBAAuB,EAC9B,KAAK,EAAE,sBAAsB,GAC5B,uBAAuB,EAAE,CA0K3B;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,uBAAuB,EAC9B,QAAQ,EAAE,aAAa,GAAG,IAAI,GAC7B,uBAAuB,EAAE,CAmC3B"}
1
+ {"version":3,"file":"ag-ui-browser-encoder.d.ts","sourceRoot":"","sources":["../../../src/src/agent/ag-ui-browser-encoder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhF,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,QAAQ,EAAE,8BAA8B,CAAC;CAC1C;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,wBAAgB,6BAA6B,IAAI,uBAAuB,CAYvE;AA+JD,wBAAgB,wCAAwC,CACtD,KAAK,EAAE,uBAAuB,EAC9B,KAAK,EAAE,sBAAsB,GAC5B,uBAAuB,EAAE,CAoK3B;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,uBAAuB,EAC9B,QAAQ,EAAE,aAAa,GAAG,IAAI,GAC7B,uBAAuB,EAAE,CAmC3B"}
@@ -121,6 +121,14 @@ function createCustomDataEvent(name, value) {
121
121
  payload: { name, value },
122
122
  };
123
123
  }
124
+ function createStepEvent(state, type) {
125
+ return {
126
+ event: type,
127
+ payload: {
128
+ stepName: type === "StepStarted" ? nextStepName(state) : finishStepName(state),
129
+ },
130
+ };
131
+ }
124
132
  export function mapRuntimeStreamEventToAgUiBrowserEvents(state, event) {
125
133
  if (event.type.startsWith("data-")) {
126
134
  const name = event.type.slice("data-".length);
@@ -247,17 +255,11 @@ export function mapRuntimeStreamEventToAgUiBrowserEvents(state, event) {
247
255
  case "step-start":
248
256
  case "start-step":
249
257
  state.sawVisibleOutput = true;
250
- return [{
251
- event: "StepStarted",
252
- payload: { stepName: nextStepName(state) },
253
- }];
258
+ return [createStepEvent(state, "StepStarted")];
254
259
  case "step-end":
255
260
  case "finish-step":
256
261
  state.sawVisibleOutput = true;
257
- return [{
258
- event: "StepFinished",
259
- payload: { stepName: finishStepName(state) },
260
- }];
262
+ return [createStepEvent(state, "StepFinished")];
261
263
  case "data":
262
264
  applyDataMetadata(state, event);
263
265
  return [];
@@ -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;AA4FD,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,CAmPf"}
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"}
@@ -24,6 +24,24 @@ function normalizeToolInputString(input) {
24
24
  }
25
25
  return JSON.stringify(input ?? null) ?? "null";
26
26
  }
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
+ }
27
45
  function normalizeToolInputObject(input) {
28
46
  if (isRecord(input)) {
29
47
  return input;
@@ -166,7 +184,7 @@ export function processStream(result, state, controller, encoder, textPartId, ca
166
184
  const tc = state.toolCalls.get(toolId);
167
185
  if (!tc)
168
186
  break;
169
- tc.arguments += typedPart.delta;
187
+ tc.arguments = mergeToolInputDelta(tc.arguments, typedPart.delta);
170
188
  sendSSE(controller, encoder, {
171
189
  type: "tool-input-delta",
172
190
  toolCallId: toolId,
@@ -178,10 +196,12 @@ export function processStream(result, state, controller, encoder, textPartId, ca
178
196
  // tool-call fires when the full tool call is available
179
197
  const toolId = typedPart.toolCallId;
180
198
  const inputStr = normalizeToolInputString(typedPart.input);
199
+ const previousArguments = state.toolCalls.get(toolId)?.arguments ?? "";
200
+ const resolvedArguments = mergeToolCallInput(previousArguments, inputStr);
181
201
  state.toolCalls.set(toolId, {
182
202
  id: toolId,
183
203
  name: typedPart.toolName,
184
- arguments: inputStr,
204
+ arguments: resolvedArguments,
185
205
  providerExecuted: typedPart.providerExecuted,
186
206
  dynamic: typedPart.dynamic,
187
207
  });
@@ -1 +1 @@
1
- {"version":3,"file":"tool-helpers.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/tool-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAaxG;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACxC,cAAc,CAuBhB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;GAGG;AAEH,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC;AAqHvD,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,SAAS,EAC/D,QAAQ,EAAE,MAAM,GACf,IAAI,GAAG,IAAI,CAmBb;AAED,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,WAAW,EAAE,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,SAAS,EAC/D,OAAO,CAAC,EAAE,oBAAoB,EAC9B,sBAAsB,CAAC,EAAE,MAAM,EAAE,EACjC,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,GACrC,OAAO,CAAC,OAAO,CAAC,CAoClB;AAoBD;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,SAAS,EAC/D,OAAO,CAAC,EAAE;IACR,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;IAClC,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACvC,iBAAiB,CAAC,EAAE,oBAAoB,CAAC;CAC1C,GACA,OAAO,CAAC,cAAc,EAAE,CAAC,CA+E3B"}
1
+ {"version":3,"file":"tool-helpers.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/tool-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAaxG;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAYD;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACxC,cAAc,CAyBhB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;GAGG;AAEH,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC;AAqHvD,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,SAAS,EAC/D,QAAQ,EAAE,MAAM,GACf,IAAI,GAAG,IAAI,CAmBb;AAED,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,WAAW,EAAE,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,SAAS,EAC/D,OAAO,CAAC,EAAE,oBAAoB,EAC9B,sBAAsB,CAAC,EAAE,MAAM,EAAE,EACjC,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,GACrC,OAAO,CAAC,OAAO,CAAC,CAoClB;AAoBD;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,SAAS,EAC/D,OAAO,CAAC,EAAE;IACR,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;IAClC,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACvC,iBAAiB,CAAC,EAAE,oBAAoB,CAAC;CAC1C,GACA,OAAO,CAAC,cAAc,EAAE,CAAC,CA+E3B"}
@@ -12,6 +12,13 @@ import { serverLogger } from "../../utils/index.js";
12
12
  import { createError, toError } from "../../errors/veryfront-error.js";
13
13
  import { executeRemoteIntegrationTool, isRemoteIntegrationTool, } from "../../integrations/remote-tools.js";
14
14
  const logger = serverLogger.component("agent");
15
+ function stripLeadingEmptyObjectPlaceholder(rawArgs) {
16
+ let normalized = rawArgs.trim();
17
+ while (normalized.startsWith("{}") && normalized.slice(2).trimStart().startsWith("{")) {
18
+ normalized = normalized.slice(2).trimStart();
19
+ }
20
+ return normalized;
21
+ }
15
22
  /**
16
23
  * Parse tool arguments from raw string or object.
17
24
  * Returns parsed args and optional error message.
@@ -20,10 +27,11 @@ export function parseToolArgs(rawArgs) {
20
27
  try {
21
28
  // Handle empty string or whitespace-only string as empty object
22
29
  if (typeof rawArgs === "string") {
23
- const trimmed = rawArgs.trim();
30
+ const trimmed = stripLeadingEmptyObjectPlaceholder(rawArgs);
24
31
  if (trimmed === "" || trimmed === "{}") {
25
32
  return { args: {} };
26
33
  }
34
+ rawArgs = trimmed;
27
35
  }
28
36
  const parsed = typeof rawArgs === "string" ? JSON.parse(rawArgs) : rawArgs;
29
37
  if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "0.1.185";
1
+ export declare const VERSION = "0.1.187";
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.185";
3
+ export const VERSION = "0.1.187";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "veryfront",
3
- "version": "0.1.185",
3
+ "version": "0.1.187",
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.185",
3
+ "version": "0.1.187",
4
4
  "license": "Apache-2.0",
5
5
  "nodeModulesDir": "auto",
6
6
  "exclude": [
@@ -188,6 +188,18 @@ function createCustomDataEvent(
188
188
  };
189
189
  }
190
190
 
191
+ function createStepEvent(
192
+ state: AgUiBrowserEncoderState,
193
+ type: "StepStarted" | "StepFinished",
194
+ ): AgUiBrowserEncodedEvent {
195
+ return {
196
+ event: type,
197
+ payload: {
198
+ stepName: type === "StepStarted" ? nextStepName(state) : finishStepName(state),
199
+ },
200
+ };
201
+ }
202
+
191
203
  export function mapRuntimeStreamEventToAgUiBrowserEvents(
192
204
  state: AgUiBrowserEncoderState,
193
205
  event: AgUiRuntimeStreamEvent,
@@ -332,18 +344,12 @@ export function mapRuntimeStreamEventToAgUiBrowserEvents(
332
344
  case "step-start":
333
345
  case "start-step":
334
346
  state.sawVisibleOutput = true;
335
- return [{
336
- event: "StepStarted",
337
- payload: { stepName: nextStepName(state) },
338
- }];
347
+ return [createStepEvent(state, "StepStarted")];
339
348
 
340
349
  case "step-end":
341
350
  case "finish-step":
342
351
  state.sawVisibleOutput = true;
343
- return [{
344
- event: "StepFinished",
345
- payload: { stepName: finishStepName(state) },
346
- }];
352
+ return [createStepEvent(state, "StepFinished")];
347
353
 
348
354
  case "data":
349
355
  applyDataMetadata(state, event);
@@ -66,6 +66,30 @@ function normalizeToolInputString(input: unknown): string {
66
66
  return JSON.stringify(input ?? null) ?? "null";
67
67
  }
68
68
 
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
+
69
93
  function normalizeToolInputObject(input: unknown): Record<string, unknown> {
70
94
  if (isRecord(input)) {
71
95
  return input;
@@ -250,7 +274,7 @@ export function processStream(
250
274
  const tc = state.toolCalls.get(toolId);
251
275
  if (!tc) break;
252
276
 
253
- tc.arguments += typedPart.delta;
277
+ tc.arguments = mergeToolInputDelta(tc.arguments, typedPart.delta);
254
278
  sendSSE(controller, encoder, {
255
279
  type: "tool-input-delta",
256
280
  toolCallId: toolId,
@@ -263,10 +287,12 @@ export function processStream(
263
287
  // tool-call fires when the full tool call is available
264
288
  const toolId = typedPart.toolCallId;
265
289
  const inputStr = normalizeToolInputString(typedPart.input);
290
+ const previousArguments = state.toolCalls.get(toolId)?.arguments ?? "";
291
+ const resolvedArguments = mergeToolCallInput(previousArguments, inputStr);
266
292
  state.toolCalls.set(toolId, {
267
293
  id: toolId,
268
294
  name: typedPart.toolName,
269
- arguments: inputStr,
295
+ arguments: resolvedArguments,
270
296
  providerExecuted: typedPart.providerExecuted,
271
297
  dynamic: typedPart.dynamic,
272
298
  });
@@ -27,6 +27,16 @@ export interface ParsedToolArgs {
27
27
  error?: string;
28
28
  }
29
29
 
30
+ function stripLeadingEmptyObjectPlaceholder(rawArgs: string): string {
31
+ let normalized = rawArgs.trim();
32
+
33
+ while (normalized.startsWith("{}") && normalized.slice(2).trimStart().startsWith("{")) {
34
+ normalized = normalized.slice(2).trimStart();
35
+ }
36
+
37
+ return normalized;
38
+ }
39
+
30
40
  /**
31
41
  * Parse tool arguments from raw string or object.
32
42
  * Returns parsed args and optional error message.
@@ -37,10 +47,12 @@ export function parseToolArgs(
37
47
  try {
38
48
  // Handle empty string or whitespace-only string as empty object
39
49
  if (typeof rawArgs === "string") {
40
- const trimmed = rawArgs.trim();
50
+ const trimmed = stripLeadingEmptyObjectPlaceholder(rawArgs);
41
51
  if (trimmed === "" || trimmed === "{}") {
42
52
  return { args: {} };
43
53
  }
54
+
55
+ rawArgs = trimmed;
44
56
  }
45
57
 
46
58
  const parsed = typeof rawArgs === "string" ? JSON.parse(rawArgs) : rawArgs;
@@ -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.185";
3
+ export const VERSION = "0.1.187";