donobu 5.60.6 → 5.60.7

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.
@@ -204,25 +204,21 @@ class MiscUtils {
204
204
  * Merges adjacent user messages (some LLMs like Gemini's or Anthropic's require this).
205
205
  */
206
206
  static mergeAdjacentUserMessages(messages) {
207
- let updatedMessages = [];
208
- for (let i = 0; i < messages.length; ++i) {
209
- if (i === messages.length - 1) {
210
- updatedMessages.push(messages[i]);
211
- break;
212
- }
213
- const message = messages[i];
214
- const adjacentMessage = messages[i + 1];
215
- if (message.type === 'user' && adjacentMessage.type === 'user') {
216
- const mergedMessage = {
207
+ const updatedMessages = [];
208
+ // Fold each user message into the previously emitted one when that is also
209
+ // a user message. Folding into the accumulated result (rather than
210
+ // consuming pairs) collapses runs of any length — pair-consuming would
211
+ // leave the 3rd, 5th, ... message in a run un-merged.
212
+ for (const message of messages) {
213
+ const last = updatedMessages[updatedMessages.length - 1];
214
+ if (message.type === 'user' && last?.type === 'user') {
215
+ updatedMessages[updatedMessages.length - 1] = {
217
216
  type: 'user',
218
- items: [...message.items, ...adjacentMessage.items],
217
+ items: [...last.items, ...message.items],
219
218
  };
220
- updatedMessages.push(mergedMessage);
221
- // Skip the next message.
222
- ++i;
223
219
  }
224
220
  else {
225
- updatedMessages.push(messages[i]);
221
+ updatedMessages.push(message);
226
222
  }
227
223
  }
228
224
  return updatedMessages;
@@ -204,25 +204,21 @@ class MiscUtils {
204
204
  * Merges adjacent user messages (some LLMs like Gemini's or Anthropic's require this).
205
205
  */
206
206
  static mergeAdjacentUserMessages(messages) {
207
- let updatedMessages = [];
208
- for (let i = 0; i < messages.length; ++i) {
209
- if (i === messages.length - 1) {
210
- updatedMessages.push(messages[i]);
211
- break;
212
- }
213
- const message = messages[i];
214
- const adjacentMessage = messages[i + 1];
215
- if (message.type === 'user' && adjacentMessage.type === 'user') {
216
- const mergedMessage = {
207
+ const updatedMessages = [];
208
+ // Fold each user message into the previously emitted one when that is also
209
+ // a user message. Folding into the accumulated result (rather than
210
+ // consuming pairs) collapses runs of any length — pair-consuming would
211
+ // leave the 3rd, 5th, ... message in a run un-merged.
212
+ for (const message of messages) {
213
+ const last = updatedMessages[updatedMessages.length - 1];
214
+ if (message.type === 'user' && last?.type === 'user') {
215
+ updatedMessages[updatedMessages.length - 1] = {
217
216
  type: 'user',
218
- items: [...message.items, ...adjacentMessage.items],
217
+ items: [...last.items, ...message.items],
219
218
  };
220
- updatedMessages.push(mergedMessage);
221
- // Skip the next message.
222
- ++i;
223
219
  }
224
220
  else {
225
- updatedMessages.push(messages[i]);
221
+ updatedMessages.push(message);
226
222
  }
227
223
  }
228
224
  return updatedMessages;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "donobu",
3
- "version": "5.60.6",
3
+ "version": "5.60.7",
4
4
  "description": "Create browser automations with an LLM agent and replay them as Playwright scripts.",
5
5
  "main": "dist/main.js",
6
6
  "module": "dist/esm/main.js",