@ottocode/web-sdk 0.1.314 → 0.1.315

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.
@@ -3124,6 +3124,78 @@ var useSecureInputStore = create11((set) => ({
3124
3124
  clearPendingInputs: () => set({ pendingInputs: [] })
3125
3125
  }));
3126
3126
 
3127
+ // src/hooks/tool-preview-helpers.ts
3128
+ function bestEffortUnescapeJsonString(value) {
3129
+ try {
3130
+ return JSON.parse(`"${value.replace(/\\$/, "")}"`);
3131
+ } catch {
3132
+ return value.replace(/\\n/g, `
3133
+ `).replace(/\\t/g, "\t").replace(/\\r/g, "\r").replace(/\\"/g, '"').replace(/\\\\/g, "\\");
3134
+ }
3135
+ }
3136
+ function extractJsonStringFieldAt(text, field, startIndex, requireClosed = false) {
3137
+ const marker = `"${field}"`;
3138
+ const markerIndex = text.indexOf(marker, Math.max(0, startIndex));
3139
+ if (markerIndex === -1)
3140
+ return;
3141
+ const colonIndex = text.indexOf(":", markerIndex + marker.length);
3142
+ if (colonIndex === -1)
3143
+ return;
3144
+ const quoteIndex = text.indexOf('"', colonIndex + 1);
3145
+ if (quoteIndex === -1)
3146
+ return;
3147
+ let escaped = "";
3148
+ let escaping = false;
3149
+ let closed = false;
3150
+ let endIndex = text.length;
3151
+ for (let i = quoteIndex + 1;i < text.length; i += 1) {
3152
+ const char = text[i];
3153
+ if (escaping) {
3154
+ escaped += `\\${char}`;
3155
+ escaping = false;
3156
+ continue;
3157
+ }
3158
+ if (char === "\\") {
3159
+ escaping = true;
3160
+ continue;
3161
+ }
3162
+ if (char === '"') {
3163
+ closed = true;
3164
+ endIndex = i + 1;
3165
+ break;
3166
+ }
3167
+ escaped += char;
3168
+ }
3169
+ if (requireClosed && !closed)
3170
+ return;
3171
+ return {
3172
+ value: bestEffortUnescapeJsonString(escaped),
3173
+ endIndex,
3174
+ closed
3175
+ };
3176
+ }
3177
+ function extractStreamingMultiEditPreviewEdits(buffer) {
3178
+ const editsStart = buffer.indexOf('"edits"');
3179
+ if (editsStart === -1)
3180
+ return [];
3181
+ const edits = [];
3182
+ let cursor = editsStart;
3183
+ const maxPreviewEdits = 50;
3184
+ while (cursor < buffer.length && edits.length < maxPreviewEdits) {
3185
+ const oldString = extractJsonStringFieldAt(buffer, "oldString", cursor, true);
3186
+ if (!oldString)
3187
+ break;
3188
+ const newString = extractJsonStringFieldAt(buffer, "newString", oldString.endIndex, false);
3189
+ if (!newString)
3190
+ break;
3191
+ edits.push({ oldString: oldString.value, newString: newString.value });
3192
+ cursor = Math.max(newString.endIndex, oldString.endIndex + 1);
3193
+ if (!newString.closed)
3194
+ break;
3195
+ }
3196
+ return edits;
3197
+ }
3198
+
3127
3199
  // src/hooks/useSessionStream.ts
3128
3200
  var TOOL_PREVIEW_THROTTLE_MS = 500;
3129
3201
  var TOOL_PREVIEW_THROTTLE_MIN_CHARS = 8000;
@@ -3277,7 +3349,7 @@ ${value.slice(-STREAMING_TOOL_INPUT_TAIL_CHARS)}`;
3277
3349
  toolInputBuffersRef.current.set(key, next);
3278
3350
  return parseArgsRecord(next);
3279
3351
  };
3280
- const bestEffortUnescapeJsonString = (value) => {
3352
+ const bestEffortUnescapeJsonString2 = (value) => {
3281
3353
  try {
3282
3354
  return JSON.parse(`"${value.replace(/\\$/, "")}"`);
3283
3355
  } catch {
@@ -3318,7 +3390,7 @@ ${value.slice(-STREAMING_TOOL_INPUT_TAIL_CHARS)}`;
3318
3390
  }
3319
3391
  if (requireClosed && !closed)
3320
3392
  return;
3321
- return bestEffortUnescapeJsonString(escaped);
3393
+ return bestEffortUnescapeJsonString2(escaped);
3322
3394
  };
3323
3395
  const getBufferedToolInput = (payload) => {
3324
3396
  const key = getToolBufferKey(payload);
@@ -3355,7 +3427,7 @@ ${argContent.slice(-STREAMING_WRITE_CONTENT_PREVIEW_CHARS)}`;
3355
3427
  }
3356
3428
  const rawTail = buffer.slice(Math.max(valueStart, buffer.length - STREAMING_WRITE_CONTENT_PREVIEW_CHARS));
3357
3429
  return `… showing latest streamed content only …
3358
- ${bestEffortUnescapeJsonString(rawTail)}`;
3430
+ ${bestEffortUnescapeJsonString2(rawTail)}`;
3359
3431
  };
3360
3432
  const getStreamingPatchPreviewContent = (args, buffer) => {
3361
3433
  const argPatch = args?.patch;
@@ -3384,9 +3456,9 @@ ${argPatch.slice(-STREAMING_PATCH_PREVIEW_TAIL_CHARS)}`;
3384
3456
  }
3385
3457
  const rawHead = buffer.slice(valueStart, valueStart + STREAMING_PATCH_PREVIEW_HEAD_CHARS);
3386
3458
  const rawTail = buffer.slice(-STREAMING_PATCH_PREVIEW_TAIL_CHARS);
3387
- return `${bestEffortUnescapeJsonString(rawHead)}
3459
+ return `${bestEffortUnescapeJsonString2(rawHead)}
3388
3460
  … patch preview truncated while streaming …
3389
- ${bestEffortUnescapeJsonString(rawTail)}`;
3461
+ ${bestEffortUnescapeJsonString2(rawTail)}`;
3390
3462
  };
3391
3463
  const getResultRecord = (payload) => payload?.result && typeof payload.result === "object" && !Array.isArray(payload.result) ? payload.result : null;
3392
3464
  const getArtifactRecord = (payload) => {
@@ -3562,14 +3634,15 @@ ${bestEffortUnescapeJsonString(rawTail)}`;
3562
3634
  return lines.join(`
3563
3635
  `);
3564
3636
  };
3565
- const getMultiEditPreviewEdits = (args) => {
3637
+ const getMultiEditPreviewEdits = (args, buffer) => {
3566
3638
  const edits = Array.isArray(args?.edits) ? args.edits : [];
3567
- return edits.flatMap((edit) => {
3639
+ const parsedEdits = edits.flatMap((edit) => {
3568
3640
  if (!edit || typeof edit !== "object" || Array.isArray(edit))
3569
3641
  return [];
3570
3642
  const record = edit;
3571
3643
  return typeof record.oldString === "string" && typeof record.newString === "string" ? [{ oldString: record.oldString, newString: record.newString }] : [];
3572
3644
  });
3645
+ return parsedEdits.length > 0 ? parsedEdits : extractStreamingMultiEditPreviewEdits(buffer);
3573
3646
  };
3574
3647
  const getEditPreviewPatch = (toolName, path, args, buffer, artifact) => {
3575
3648
  if (typeof artifact?.patch === "string")
@@ -3579,7 +3652,7 @@ ${bestEffortUnescapeJsonString(rawTail)}`;
3579
3652
  const newString = getStringArg(args, buffer, "newString");
3580
3653
  return oldString !== undefined && newString !== undefined ? buildStringEditPatchPreview(path, [{ oldString, newString }]) : undefined;
3581
3654
  }
3582
- const edits = getMultiEditPreviewEdits(args);
3655
+ const edits = getMultiEditPreviewEdits(args, buffer);
3583
3656
  return buildStringEditPatchPreview(path, edits);
3584
3657
  };
3585
3658
  const handleReadToolActivity = (eventType, payload, delta) => {
@@ -8591,4 +8664,4 @@ export {
8591
8664
  getAgentToolCount
8592
8665
  };
8593
8666
 
8594
- //# debugId=FCCD29FAF084571164756E2164756E21
8667
+ //# debugId=EA09E996DD4075CD64756E2164756E21