@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.
@@ -3,7 +3,9 @@
3
3
  * setMode, changeModel, setThoughtLevel, resolveAction, chatHistory
4
4
  */
5
5
  import type { CommandResult, CommandHelpers } from './handler.js';
6
+ import type { ChatMessage } from '../types.js';
6
7
  export declare const READ_CHAT_PROVIDER_EVAL_TIMEOUT_MS = 25000;
8
+ export declare function collapseReplayDuplicatesFromReadChat(messages: ChatMessage[]): ChatMessage[];
7
9
  export declare function handleChatHistory(h: CommandHelpers, args: any): Promise<CommandResult>;
8
10
  export declare function handleReadChat(h: CommandHelpers, args: any): Promise<CommandResult>;
9
11
  export declare function handleSendChat(h: CommandHelpers, args: any): Promise<CommandResult>;
package/dist/index.js CHANGED
@@ -1792,9 +1792,7 @@ function hydrateCliParsedMessages(parsedMessages, options) {
1792
1792
  };
1793
1793
  });
1794
1794
  }
1795
- function chooseMoreComparableCliMessage(left, right) {
1796
- const leftComparable = normalizeComparableMessageContent(left.content || "");
1797
- const rightComparable = normalizeComparableMessageContent(right.content || "");
1795
+ function chooseMoreComparableCliMessage(left, right, leftComparable = normalizeComparableMessageContent(left.content || ""), rightComparable = normalizeComparableMessageContent(right.content || "")) {
1798
1796
  if (leftComparable && leftComparable === rightComparable) {
1799
1797
  const leftNewlines = String(left.content || "").split(/\r\n|\n|\r/g).length - 1;
1800
1798
  const rightNewlines = String(right.content || "").split(/\r\n|\n|\r/g).length - 1;
@@ -1809,24 +1807,32 @@ function dedupeConsecutiveComparableCliMessages(messages) {
1809
1807
  ...message,
1810
1808
  content: typeof message.content === "string" ? message.content : String(message.content || "")
1811
1809
  };
1810
+ const currentComparable = normalizeComparableMessageContent(current.content || "");
1812
1811
  const previous = deduped[deduped.length - 1];
1813
1812
  if (!previous) {
1814
- deduped.push(current);
1813
+ deduped.push({ message: current, comparable: currentComparable });
1815
1814
  continue;
1816
1815
  }
1817
- const previousComparable = normalizeComparableMessageContent(previous.content || "");
1818
- const currentComparable = normalizeComparableMessageContent(current.content || "");
1819
- const sameRole = previous.role === current.role;
1820
- const sameKind = (previous.kind || "standard") === (current.kind || "standard");
1821
- const sameSender = (previous.senderName || "") === (current.senderName || "");
1822
- const comparableMatch = previousComparable && previousComparable === currentComparable;
1816
+ const sameRole = previous.message.role === current.role;
1817
+ const sameKind = (previous.message.kind || "standard") === (current.kind || "standard");
1818
+ const sameSender = (previous.message.senderName || "") === (current.senderName || "");
1819
+ const comparableMatch = previous.comparable && previous.comparable === currentComparable;
1823
1820
  if (sameRole && sameKind && sameSender && comparableMatch) {
1824
- deduped[deduped.length - 1] = chooseMoreComparableCliMessage(previous, current);
1821
+ const selected = chooseMoreComparableCliMessage(
1822
+ previous.message,
1823
+ current,
1824
+ previous.comparable,
1825
+ currentComparable
1826
+ );
1827
+ deduped[deduped.length - 1] = {
1828
+ message: selected,
1829
+ comparable: selected === current ? currentComparable : previous.comparable
1830
+ };
1825
1831
  continue;
1826
1832
  }
1827
- deduped.push(current);
1833
+ deduped.push({ message: current, comparable: currentComparable });
1828
1834
  }
1829
- return deduped;
1835
+ return deduped.map((entry) => entry.message);
1830
1836
  }
1831
1837
  function normalizeCliParsedMessages(parsedMessages, options) {
1832
1838
  return dedupeConsecutiveComparableCliMessages(hydrateCliParsedMessages(parsedMessages, options).map((message) => ({
@@ -10623,68 +10629,66 @@ function normalizeReadChatMessages(payload) {
10623
10629
  const messages = Array.isArray(payload.messages) ? payload.messages : [];
10624
10630
  return normalizeChatMessages(messages);
10625
10631
  }
10626
- function buildReadChatReplayCollapseSignature(message) {
10627
- if (!message) return "";
10632
+ function normalizeReadChatReplayTextContent(content) {
10633
+ return flattenContent(content || "").replace(/\s+/g, " ").trim();
10634
+ }
10635
+ function getReadChatReplayCollapseInfo(message) {
10636
+ if (!message) return null;
10628
10637
  const role = typeof message.role === "string" ? message.role.trim().toLowerCase() : "";
10629
10638
  const kind = typeof message.kind === "string" ? message.kind.trim().toLowerCase() : "standard";
10630
10639
  const senderName = typeof message.senderName === "string" ? message.senderName.trim().toLowerCase() : "";
10631
- const content = flattenContent(message.content || "").replace(/\s+/g, " ").trim();
10632
- return `${role}:${kind}:${senderName}:${content}`;
10633
- }
10634
- function shouldCollapseReadChatReplayDuplicate(message) {
10635
- if (!message) return false;
10636
- const role = typeof message.role === "string" ? message.role.trim().toLowerCase() : "";
10637
- return role === "assistant" || role === "system";
10638
- }
10639
- function normalizeReadChatReplayText(message) {
10640
- return flattenContent(message?.content || "").replace(/\s+/g, " ").trim();
10640
+ const collapsible = role === "assistant" || role === "system";
10641
+ if (!collapsible) return { role, kind, senderName, content: "", signature: "", collapsible };
10642
+ const content = normalizeReadChatReplayTextContent(message.content);
10643
+ return {
10644
+ role,
10645
+ kind,
10646
+ senderName,
10647
+ content,
10648
+ signature: `${role}:${kind}:${senderName}:${content}`,
10649
+ collapsible
10650
+ };
10641
10651
  }
10642
- function isStableReadChatAssistantAnswer(message) {
10643
- if (!message) return false;
10644
- const role = typeof message.role === "string" ? message.role.trim().toLowerCase() : "";
10645
- const kind = typeof message.kind === "string" ? message.kind.trim().toLowerCase() : "standard";
10646
- if (role !== "assistant") return false;
10647
- if (kind && kind !== "standard") return false;
10648
- const content = normalizeReadChatReplayText(message);
10649
- if (content.length < 160) return false;
10650
- if (/^(bash|shell|terminal) command\b/i.test(content)) return false;
10652
+ function isStableReadChatAssistantAnswerInfo(info) {
10653
+ if (!info) return false;
10654
+ if (info.role !== "assistant") return false;
10655
+ if (info.kind && info.kind !== "standard") return false;
10656
+ if (info.content.length < 160) return false;
10657
+ if (/^(bash|shell|terminal) command\b/i.test(info.content)) return false;
10651
10658
  return true;
10652
10659
  }
10653
- function isReplayedAssistantAnswerAfterStableAnswer(message, stableAnswer) {
10654
- if (!message || !stableAnswer) return false;
10655
- const role = typeof message.role === "string" ? message.role.trim().toLowerCase() : "";
10656
- const kind = typeof message.kind === "string" ? message.kind.trim().toLowerCase() : "standard";
10657
- if (role !== "assistant") return false;
10658
- if (kind && kind !== "standard") return false;
10659
- const content = normalizeReadChatReplayText(message);
10660
- const stableContent = normalizeReadChatReplayText(stableAnswer);
10660
+ function isReplayedAssistantAnswerAfterStableAnswerInfo(info, stableContent) {
10661
+ if (!info || !stableContent) return false;
10662
+ if (info.role !== "assistant") return false;
10663
+ if (info.kind && info.kind !== "standard") return false;
10664
+ const content = info.content;
10661
10665
  if (content.length < 80 || stableContent.length < 80) return false;
10662
10666
  return content === stableContent || content.startsWith(stableContent) || stableContent.startsWith(content);
10663
10667
  }
10664
10668
  function collapseReplayDuplicatesFromReadChat(messages) {
10665
10669
  const collapsed = [];
10666
10670
  const replaySignaturesInCurrentTurn = /* @__PURE__ */ new Set();
10667
- let stableAssistantAnswerInCurrentTurn = null;
10671
+ let stableAssistantAnswerContentInCurrentTurn = "";
10672
+ let previousReplaySignature = "";
10668
10673
  for (const message of messages) {
10669
- const role = typeof message.role === "string" ? message.role.trim().toLowerCase() : "";
10670
- if (role === "user") {
10674
+ const info = getReadChatReplayCollapseInfo(message);
10675
+ if (info?.role === "user") {
10671
10676
  replaySignaturesInCurrentTurn.clear();
10672
- stableAssistantAnswerInCurrentTurn = null;
10677
+ stableAssistantAnswerContentInCurrentTurn = "";
10678
+ previousReplaySignature = "";
10673
10679
  }
10674
- const signature = buildReadChatReplayCollapseSignature(message);
10675
- const previous = collapsed[collapsed.length - 1];
10676
- const previousSignature = buildReadChatReplayCollapseSignature(previous);
10677
- if (shouldCollapseReadChatReplayDuplicate(message) && signature) {
10678
- if (previousSignature === signature) continue;
10679
- if (replaySignaturesInCurrentTurn.has(signature)) continue;
10680
- if (isReplayedAssistantAnswerAfterStableAnswer(message, stableAssistantAnswerInCurrentTurn)) continue;
10680
+ if (info?.collapsible && info.signature) {
10681
+ if (previousReplaySignature === info.signature) continue;
10682
+ if (replaySignaturesInCurrentTurn.has(info.signature)) continue;
10683
+ if (isReplayedAssistantAnswerAfterStableAnswerInfo(info, stableAssistantAnswerContentInCurrentTurn)) continue;
10681
10684
  }
10682
10685
  collapsed.push(message);
10683
- if (shouldCollapseReadChatReplayDuplicate(message) && signature) {
10684
- replaySignaturesInCurrentTurn.add(signature);
10686
+ previousReplaySignature = info?.collapsible ? info.signature : "";
10687
+ if (info?.collapsible && info.signature) {
10688
+ replaySignaturesInCurrentTurn.add(info.signature);
10685
10689
  }
10686
- if (isStableReadChatAssistantAnswer(message)) {
10687
- stableAssistantAnswerInCurrentTurn = message;
10690
+ if (isStableReadChatAssistantAnswerInfo(info)) {
10691
+ stableAssistantAnswerContentInCurrentTurn = info?.content || "";
10688
10692
  }
10689
10693
  }
10690
10694
  return collapsed;
@@ -10764,13 +10768,17 @@ function computeReadChatSync(messages, cursor) {
10764
10768
  };
10765
10769
  }
10766
10770
  if (cursor.tailLimit > 0 && knownSignature === lastMessageSignature) {
10767
- return {
10768
- syncMode: "noop",
10769
- replaceFrom: totalMessages,
10770
- messages: [],
10771
- totalMessages,
10772
- lastMessageSignature
10773
- };
10771
+ const requestedTailCount = Math.min(totalMessages, cursor.tailLimit);
10772
+ if (knownMessageCount >= requestedTailCount) {
10773
+ return {
10774
+ syncMode: "noop",
10775
+ replaceFrom: totalMessages,
10776
+ messages: [],
10777
+ totalMessages,
10778
+ lastMessageSignature
10779
+ };
10780
+ }
10781
+ return buildBoundedTailSync(messages, cursor);
10774
10782
  }
10775
10783
  if (knownMessageCount < totalMessages) {
10776
10784
  const anchorSignature = getChatMessageSignature(messages[knownMessageCount - 1]);