@adhdev/daemon-core 0.9.39 → 0.9.40

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/dist/index.mjs CHANGED
@@ -1790,9 +1790,7 @@ function hydrateCliParsedMessages(parsedMessages, options) {
1790
1790
  };
1791
1791
  });
1792
1792
  }
1793
- function chooseMoreComparableCliMessage(left, right) {
1794
- const leftComparable = normalizeComparableMessageContent(left.content || "");
1795
- const rightComparable = normalizeComparableMessageContent(right.content || "");
1793
+ function chooseMoreComparableCliMessage(left, right, leftComparable = normalizeComparableMessageContent(left.content || ""), rightComparable = normalizeComparableMessageContent(right.content || "")) {
1796
1794
  if (leftComparable && leftComparable === rightComparable) {
1797
1795
  const leftNewlines = String(left.content || "").split(/\r\n|\n|\r/g).length - 1;
1798
1796
  const rightNewlines = String(right.content || "").split(/\r\n|\n|\r/g).length - 1;
@@ -1807,24 +1805,32 @@ function dedupeConsecutiveComparableCliMessages(messages) {
1807
1805
  ...message,
1808
1806
  content: typeof message.content === "string" ? message.content : String(message.content || "")
1809
1807
  };
1808
+ const currentComparable = normalizeComparableMessageContent(current.content || "");
1810
1809
  const previous = deduped[deduped.length - 1];
1811
1810
  if (!previous) {
1812
- deduped.push(current);
1811
+ deduped.push({ message: current, comparable: currentComparable });
1813
1812
  continue;
1814
1813
  }
1815
- const previousComparable = normalizeComparableMessageContent(previous.content || "");
1816
- const currentComparable = normalizeComparableMessageContent(current.content || "");
1817
- const sameRole = previous.role === current.role;
1818
- const sameKind = (previous.kind || "standard") === (current.kind || "standard");
1819
- const sameSender = (previous.senderName || "") === (current.senderName || "");
1820
- const comparableMatch = previousComparable && previousComparable === currentComparable;
1814
+ const sameRole = previous.message.role === current.role;
1815
+ const sameKind = (previous.message.kind || "standard") === (current.kind || "standard");
1816
+ const sameSender = (previous.message.senderName || "") === (current.senderName || "");
1817
+ const comparableMatch = previous.comparable && previous.comparable === currentComparable;
1821
1818
  if (sameRole && sameKind && sameSender && comparableMatch) {
1822
- deduped[deduped.length - 1] = chooseMoreComparableCliMessage(previous, current);
1819
+ const selected = chooseMoreComparableCliMessage(
1820
+ previous.message,
1821
+ current,
1822
+ previous.comparable,
1823
+ currentComparable
1824
+ );
1825
+ deduped[deduped.length - 1] = {
1826
+ message: selected,
1827
+ comparable: selected === current ? currentComparable : previous.comparable
1828
+ };
1823
1829
  continue;
1824
1830
  }
1825
- deduped.push(current);
1831
+ deduped.push({ message: current, comparable: currentComparable });
1826
1832
  }
1827
- return deduped;
1833
+ return deduped.map((entry) => entry.message);
1828
1834
  }
1829
1835
  function normalizeCliParsedMessages(parsedMessages, options) {
1830
1836
  return dedupeConsecutiveComparableCliMessages(hydrateCliParsedMessages(parsedMessages, options).map((message) => ({
@@ -10470,68 +10476,66 @@ function normalizeReadChatMessages(payload) {
10470
10476
  const messages = Array.isArray(payload.messages) ? payload.messages : [];
10471
10477
  return normalizeChatMessages(messages);
10472
10478
  }
10473
- function buildReadChatReplayCollapseSignature(message) {
10474
- if (!message) return "";
10479
+ function normalizeReadChatReplayTextContent(content) {
10480
+ return flattenContent(content || "").replace(/\s+/g, " ").trim();
10481
+ }
10482
+ function getReadChatReplayCollapseInfo(message) {
10483
+ if (!message) return null;
10475
10484
  const role = typeof message.role === "string" ? message.role.trim().toLowerCase() : "";
10476
10485
  const kind = typeof message.kind === "string" ? message.kind.trim().toLowerCase() : "standard";
10477
10486
  const senderName = typeof message.senderName === "string" ? message.senderName.trim().toLowerCase() : "";
10478
- const content = flattenContent(message.content || "").replace(/\s+/g, " ").trim();
10479
- return `${role}:${kind}:${senderName}:${content}`;
10480
- }
10481
- function shouldCollapseReadChatReplayDuplicate(message) {
10482
- if (!message) return false;
10483
- const role = typeof message.role === "string" ? message.role.trim().toLowerCase() : "";
10484
- return role === "assistant" || role === "system";
10485
- }
10486
- function normalizeReadChatReplayText(message) {
10487
- return flattenContent(message?.content || "").replace(/\s+/g, " ").trim();
10487
+ const collapsible = role === "assistant" || role === "system";
10488
+ if (!collapsible) return { role, kind, senderName, content: "", signature: "", collapsible };
10489
+ const content = normalizeReadChatReplayTextContent(message.content);
10490
+ return {
10491
+ role,
10492
+ kind,
10493
+ senderName,
10494
+ content,
10495
+ signature: `${role}:${kind}:${senderName}:${content}`,
10496
+ collapsible
10497
+ };
10488
10498
  }
10489
- function isStableReadChatAssistantAnswer(message) {
10490
- if (!message) return false;
10491
- const role = typeof message.role === "string" ? message.role.trim().toLowerCase() : "";
10492
- const kind = typeof message.kind === "string" ? message.kind.trim().toLowerCase() : "standard";
10493
- if (role !== "assistant") return false;
10494
- if (kind && kind !== "standard") return false;
10495
- const content = normalizeReadChatReplayText(message);
10496
- if (content.length < 160) return false;
10497
- if (/^(bash|shell|terminal) command\b/i.test(content)) return false;
10499
+ function isStableReadChatAssistantAnswerInfo(info) {
10500
+ if (!info) return false;
10501
+ if (info.role !== "assistant") return false;
10502
+ if (info.kind && info.kind !== "standard") return false;
10503
+ if (info.content.length < 160) return false;
10504
+ if (/^(bash|shell|terminal) command\b/i.test(info.content)) return false;
10498
10505
  return true;
10499
10506
  }
10500
- function isReplayedAssistantAnswerAfterStableAnswer(message, stableAnswer) {
10501
- if (!message || !stableAnswer) return false;
10502
- const role = typeof message.role === "string" ? message.role.trim().toLowerCase() : "";
10503
- const kind = typeof message.kind === "string" ? message.kind.trim().toLowerCase() : "standard";
10504
- if (role !== "assistant") return false;
10505
- if (kind && kind !== "standard") return false;
10506
- const content = normalizeReadChatReplayText(message);
10507
- const stableContent = normalizeReadChatReplayText(stableAnswer);
10507
+ function isReplayedAssistantAnswerAfterStableAnswerInfo(info, stableContent) {
10508
+ if (!info || !stableContent) return false;
10509
+ if (info.role !== "assistant") return false;
10510
+ if (info.kind && info.kind !== "standard") return false;
10511
+ const content = info.content;
10508
10512
  if (content.length < 80 || stableContent.length < 80) return false;
10509
10513
  return content === stableContent || content.startsWith(stableContent) || stableContent.startsWith(content);
10510
10514
  }
10511
10515
  function collapseReplayDuplicatesFromReadChat(messages) {
10512
10516
  const collapsed = [];
10513
10517
  const replaySignaturesInCurrentTurn = /* @__PURE__ */ new Set();
10514
- let stableAssistantAnswerInCurrentTurn = null;
10518
+ let stableAssistantAnswerContentInCurrentTurn = "";
10519
+ let previousReplaySignature = "";
10515
10520
  for (const message of messages) {
10516
- const role = typeof message.role === "string" ? message.role.trim().toLowerCase() : "";
10517
- if (role === "user") {
10521
+ const info = getReadChatReplayCollapseInfo(message);
10522
+ if (info?.role === "user") {
10518
10523
  replaySignaturesInCurrentTurn.clear();
10519
- stableAssistantAnswerInCurrentTurn = null;
10524
+ stableAssistantAnswerContentInCurrentTurn = "";
10525
+ previousReplaySignature = "";
10520
10526
  }
10521
- const signature = buildReadChatReplayCollapseSignature(message);
10522
- const previous = collapsed[collapsed.length - 1];
10523
- const previousSignature = buildReadChatReplayCollapseSignature(previous);
10524
- if (shouldCollapseReadChatReplayDuplicate(message) && signature) {
10525
- if (previousSignature === signature) continue;
10526
- if (replaySignaturesInCurrentTurn.has(signature)) continue;
10527
- if (isReplayedAssistantAnswerAfterStableAnswer(message, stableAssistantAnswerInCurrentTurn)) continue;
10527
+ if (info?.collapsible && info.signature) {
10528
+ if (previousReplaySignature === info.signature) continue;
10529
+ if (replaySignaturesInCurrentTurn.has(info.signature)) continue;
10530
+ if (isReplayedAssistantAnswerAfterStableAnswerInfo(info, stableAssistantAnswerContentInCurrentTurn)) continue;
10528
10531
  }
10529
10532
  collapsed.push(message);
10530
- if (shouldCollapseReadChatReplayDuplicate(message) && signature) {
10531
- replaySignaturesInCurrentTurn.add(signature);
10533
+ previousReplaySignature = info?.collapsible ? info.signature : "";
10534
+ if (info?.collapsible && info.signature) {
10535
+ replaySignaturesInCurrentTurn.add(info.signature);
10532
10536
  }
10533
- if (isStableReadChatAssistantAnswer(message)) {
10534
- stableAssistantAnswerInCurrentTurn = message;
10537
+ if (isStableReadChatAssistantAnswerInfo(info)) {
10538
+ stableAssistantAnswerContentInCurrentTurn = info?.content || "";
10535
10539
  }
10536
10540
  }
10537
10541
  return collapsed;
@@ -10611,13 +10615,17 @@ function computeReadChatSync(messages, cursor) {
10611
10615
  };
10612
10616
  }
10613
10617
  if (cursor.tailLimit > 0 && knownSignature === lastMessageSignature) {
10614
- return {
10615
- syncMode: "noop",
10616
- replaceFrom: totalMessages,
10617
- messages: [],
10618
- totalMessages,
10619
- lastMessageSignature
10620
- };
10618
+ const requestedTailCount = Math.min(totalMessages, cursor.tailLimit);
10619
+ if (knownMessageCount >= requestedTailCount) {
10620
+ return {
10621
+ syncMode: "noop",
10622
+ replaceFrom: totalMessages,
10623
+ messages: [],
10624
+ totalMessages,
10625
+ lastMessageSignature
10626
+ };
10627
+ }
10628
+ return buildBoundedTailSync(messages, cursor);
10621
10629
  }
10622
10630
  if (knownMessageCount < totalMessages) {
10623
10631
  const anchorSignature = getChatMessageSignature(messages[knownMessageCount - 1]);