From 503d0f97c7bfa0ccf19405732df53ea4a7846697 Mon Sep 17 00:00:00 2001 From: achuvyas-kv Date: Fri, 26 Jun 2026 13:22:29 +0530 Subject: [PATCH] chore: enhance chat input detection, and improve dom snapshotting --- icon128.png | Bin 0 -> 7480 bytes new-logo.png | Bin 0 -> 20857 bytes runners/extension/chatLocator.js | 32 +++++++ runners/extension/frameDiscovery.js | 32 ++++--- runners/extension/frame_collect.js | 36 +++++++- runners/extension/frame_snapshot.js | 113 +++++++++++++++++++++++-- runners/extension/icons/icon128.png | Bin 9071 -> 2074 bytes runners/extension/icons/icon16.png | Bin 9071 -> 598 bytes runners/extension/icons/icon32.png | Bin 9071 -> 994 bytes runners/extension/icons/icon48.png | Bin 9071 -> 1204 bytes runners/extension/icons/logo.png | Bin 19709 -> 17316 bytes runners/extension/popup.html | 35 ++++---- runners/extension/popup.js | 4 +- runners/extension/responseExtractor.js | 89 ++++++++++++------- 14 files changed, 271 insertions(+), 70 deletions(-) create mode 100644 icon128.png create mode 100644 new-logo.png diff --git a/icon128.png b/icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..f3beebf7f8aa602cb93e3880c653c942ccc3e297 GIT binary patch literal 7480 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 a@d>RHPTT`t)#UlRK2(%dm8p<2_WvLAQQxHi literal 0 HcmV?d00001 diff --git a/new-logo.png b/new-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ed937f7e31333e4223b41c88d867517e824a7155 GIT binary patch literal 20857 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 f.bestInputSelector && (f.bestInputScore || 0) >= 12) + .sort((a, b) => (b.bestInputScore || 0) - (a.bestInputScore || 0)); + for (const f of ranked) { + if (state.OPFOR_STOP) return { ok: false, error: "Run stopped." }; + const visible = await actVerifyInputVisible(tabId, f.frameId, f.bestInputSelector); + if (!visible) continue; + const siteSnapshot = detFrames.find((x) => x.frameId === 0)?.snapshot || f.snapshot || ""; + return { + ok: true, + plan: { + inputSelector: f.bestInputSelector, + submit: f.bestSendSelector + ? { method: "click", buttonSelector: f.bestSendSelector } + : { method: "enter" }, + confidence: 0.9, + }, + best: { frameId: f.frameId, frameUrl: f.frameUrl || "", snapshot: siteSnapshot }, + siteSnapshot, + }; + } + } catch { + /* fall through to the LLM planner */ + } + const collectAxSnapshots = async () => { let results; try { diff --git a/runners/extension/frameDiscovery.js b/runners/extension/frameDiscovery.js index 8fd80ce8..da3fb6b7 100644 --- a/runners/extension/frameDiscovery.js +++ b/runners/extension/frameDiscovery.js @@ -13,6 +13,9 @@ export async function collectFrames(tabId) { frameUrl: r.result?.frameUrl, inputCount: r.result?.inputCount ?? 0, chatScore: r.result?.chatScore ?? 0, + bestInputSelector: r.result?.bestInputSelector ?? "", + bestInputScore: r.result?.bestInputScore ?? 0, + bestSendSelector: r.result?.bestSendSelector ?? "", })) .filter((f) => typeof f.snapshot === "string" && f.snapshot.length > 0); } @@ -57,11 +60,7 @@ export async function pickChatFrame(tabId) { const frames = await collectFrames(tabId); if (!frames.length) throw new Error("No frames collected."); - frames.sort((a, b) => { - const boost = embeddedChatBoost(b) - embeddedChatBoost(a); - if (boost !== 0) return boost; - return (b.chatScore || 0) - (a.chatScore || 0) || (b.inputCount || 0) - (a.inputCount || 0); - }); + frames.sort(sortByChatRelevance); return { frames, best: frames[0] }; } @@ -74,14 +73,25 @@ export async function pickChatFrameWithRetry(tabId, { maxRetries = 6, intervalMs for (let i = 0; i < maxRetries; i++) { await sleep(i === 0 ? 600 : intervalMs); frames = await collectFrames(tabId); - if (frames.some((f) => (f.chatScore || 0) > 0)) break; + // Wait for the chat INPUT itself, not merely a chat signal. chatScore can go + // positive from container markup while the composer is still mounting (open + // animation, lazy render, input shown only after a greeting) — breaking on + // chatScore alone snapshots too early and misses the input. + if (frames.some((f) => (f.bestInputScore || 0) > 0)) break; } if (!frames.length) throw new Error("No frames collected."); - frames.sort((a, b) => { - const boost = embeddedChatBoost(b) - embeddedChatBoost(a); - if (boost !== 0) return boost; - return (b.chatScore || 0) - (a.chatScore || 0) || (b.inputCount || 0) - (a.inputCount || 0); - }); + frames.sort(sortByChatRelevance); return { frames, best: frames[0] }; } + +// Shared ranking: embedded-chat URL boost, then a real input, then chat signal. +function sortByChatRelevance(a, b) { + const boost = embeddedChatBoost(b) - embeddedChatBoost(a); + if (boost !== 0) return boost; + return ( + (b.bestInputScore || 0) - (a.bestInputScore || 0) || + (b.chatScore || 0) - (a.chatScore || 0) || + (b.inputCount || 0) - (a.inputCount || 0) + ); +} diff --git a/runners/extension/frame_collect.js b/runners/extension/frame_collect.js index 8a95eee0..084fbe82 100644 --- a/runners/extension/frame_collect.js +++ b/runners/extension/frame_collect.js @@ -12,6 +12,17 @@ function escapeCssValue(v) { return String(v).replace(/["\\]/g, "\\$&"); } +function nthOfTypeSelector(el) { + const tag = el.tagName.toLowerCase(); + const parent = el.parentElement || el.getRootNode?.()?.host?.shadowRoot; + const siblings = parent ? Array.from(parent.children || []) : []; + const sameTag = siblings.filter((c) => c.tagName === el.tagName); + if (sameTag.length <= 1) return tag; + const idx = sameTag.indexOf(el); + // :nth-of-type is 1-based among same-type element siblings — equals our index+1. + return idx >= 0 ? `${tag}:nth-of-type(${idx + 1})` : tag; +} + function selectorFromEl(el) { if (!(el instanceof Element)) return null; const testid = el.getAttribute("data-testid"); @@ -19,10 +30,13 @@ function selectorFromEl(el) { const aria = el.getAttribute("aria-label"); if (aria) return `${el.tagName.toLowerCase()}[aria-label="${escapeCssValue(aria)}"]`; const id = el.getAttribute("id"); - if (id) return `#${escapeCssValue(id)}`; + // Skip dynamic ids (e.g. "radix-:r3:") that aren't valid/stable CSS identifiers. + if (id && /^[A-Za-z][\w-]*$/.test(id)) return `#${escapeCssValue(id)}`; const name = el.getAttribute("name"); if (name) return `${el.tagName.toLowerCase()}[name="${escapeCssValue(name)}"]`; - return el.tagName.toLowerCase(); + // No stable attribute — fall back to a positional selector so we don't return a + // bare tag that matches (and later actuates) the wrong element. + return nthOfTypeSelector(el); } function getShadowRoot(el) { @@ -602,6 +616,15 @@ function collectSanitizedDomSnapshot() { return true; }); + // Track the single best non-search input deterministically, so callers can use + // the heuristic directly instead of relying on a (non-deterministic) LLM pick. + let bestInput = null; + for (const el of inputs) { + if (looksLikeSiteSearch(el)) continue; + const sc = scoreInput(el); + if (!bestInput || sc > bestInput.score) bestInput = { el, score: sc }; + } + lines.push(""); lines.push("CANDIDATE_INPUTS:"); for (const el of inputs.slice(0, 40)) { @@ -700,13 +723,16 @@ function collectSanitizedDomSnapshot() { lines.push(""); lines.push("CANDIDATE_BUTTONS:"); + let bestSendSelector = ""; for (const el of buttons) { const aria = (el.getAttribute?.("aria-label") || "").toLowerCase(); const text = (el.textContent || "").trim().toLowerCase(); const looksLikeSend = aria.includes("send") || text === "send" || text.includes("send") || text.includes("submit"); + const selStr = deepPathSelector(el); + if (looksLikeSend && !bestSendSelector) bestSendSelector = selStr; lines.push( - `- ${looksLikeSend ? "sendish=1" : "sendish=0"} selector="${deepPathSelector(el)}" ${describeEl(el)}` + `- ${looksLikeSend ? "sendish=1" : "sendish=0"} selector="${selStr}" ${describeEl(el)}` ); } @@ -744,6 +770,10 @@ function collectSanitizedDomSnapshot() { snapshot: lines.join("\n").slice(0, 60_000), inputCount: inputs.length, chatScore, + // Deterministic best chat input + send button for this frame (no LLM needed). + bestInputSelector: bestInput ? deepPathSelector(bestInput.el) : "", + bestInputScore: bestInput ? bestInput.score : 0, + bestSendSelector, }; } diff --git a/runners/extension/frame_snapshot.js b/runners/extension/frame_snapshot.js index 8ad5261b..0c6cd25a 100644 --- a/runners/extension/frame_snapshot.js +++ b/runners/extension/frame_snapshot.js @@ -21,8 +21,77 @@ "menuitem", "option", ]); - const MIN_MSG = 20; - const MAX_MSG = 1000; + // Lowered from 20 → 2 so terse bot replies ("Done.", "Order #4521 shipped.") + // are captured instead of being silently dropped. MAX raised to a large sanity + // bound because per-message granularity now comes from block-structure (see + // collectText), not an arbitrary character cap. + const MIN_MSG = 2; + const MAX_MSG = 20000; + + // Inline tags never count as block-level message containers — their text is + // part of the surrounding block, so we must NOT recurse past their parent + // (that would lose the plain-text siblings around , , etc.). + const INLINE_TAGS = new Set([ + "a", + "b", + "i", + "em", + "strong", + "span", + "code", + "small", + "sub", + "sup", + "mark", + "u", + "s", + "abbr", + "cite", + "q", + "time", + "label", + "kbd", + "samp", + "var", + "wbr", + "bdi", + "bdo", + "del", + "ins", + "br", + "img", + "svg", + "picture", + ]); + + function isBlockish(el) { + const tag = el.tagName?.toLowerCase(); + if (tag && INLINE_TAGS.has(tag)) return false; + try { + const d = window.getComputedStyle(el).display; + return !(d === "inline" || d === "inline-block" || d === "contents" || d === "none"); + } catch { + return true; // assume block when style is unavailable + } + } + + // Count block-level child elements that carry their own text. ≥1 means this node + // is a CONTAINER of sub-blocks (transcript, message list, message row) and we + // should recurse into it; 0 means it's a leaf text block (a single message / + // paragraph) safe to capture as one node. This is what stops a short transcript + // from collapsing into a single mega-node (which broke the diff + echo filter). + function blockTextChildren(node) { + let n = 0; + for (const c of node.children || []) { + if (!isBlockish(c)) continue; + const t = (c.textContent || "").replace(/\s+/g, " ").trim(); + if (t.length >= MIN_MSG) { + n++; + if (n >= 1) break; + } + } + return n; + } // ── Text collector (shared by both fast and full paths) ────────────────────── function collectText(node, depth, out) { @@ -46,7 +115,9 @@ const role = (node.getAttribute?.("role") || "").toLowerCase(); if (SKIP_ROLES.has(role)) return; const text = (node.textContent || "").replace(/\s+/g, " ").trim(); - if (text.length >= MIN_MSG && text.length <= MAX_MSG) { + // Capture only LEAF text blocks (no block-level child carries its own text). + // Containers fall through and recurse, so each message becomes its own node. + if (text.length >= MIN_MSG && text.length <= MAX_MSG && blockTextChildren(node) === 0) { out.push(text); return; } @@ -75,18 +146,38 @@ }; } - // ── Fast path: reuse selector from previous full scan ──────────────────────── + // ── Fast path: reuse the container from a previous full scan ───────────────── + // Prefer a direct reference to the element over re-running querySelector on a + // cached string. String selectors are brittle: hashed/CSS-module class names, + // dynamic ids (radix-:r3:, which is also invalid CSS and throws), and + // first-match ambiguity all make the string resolve to the wrong element or + // none. Holding the node itself is stable until the framework re-renders it. + const cachedEl = globalThis.__OPFOR_CONTAINER_EL__; + if (cachedEl && cachedEl.isConnected) { + try { + const result = snapshotEl(cachedEl, globalThis.__OPFOR_CONTAINER_SEL__ || ""); + if (result.nodeCount > 0) return result; + // Element still present but empty — fall through to full scan. + } catch { + /* swallowed */ + } + } + + // Secondary fast path: the cached selector string (used when the page-world + // element ref was lost, e.g. seeded by the orchestrator across calls). const cachedSel = globalThis.__OPFOR_CONTAINER_SEL__; if (cachedSel) { try { const el = document.querySelector(cachedSel); if (el) { const result = snapshotEl(el, cachedSel); - if (result.nodeCount > 0) return result; - // Container found but empty — fall through to full scan + if (result.nodeCount > 0) { + globalThis.__OPFOR_CONTAINER_EL__ = el; + return result; + } } } catch { - /* swallowed */ + /* swallowed (invalid/dynamic selector) — fall through to full scan */ } } @@ -216,14 +307,18 @@ const best = candidates[0].el; - // Build selector and cache it for fast subsequent polls + // Cache the element itself for fast subsequent polls (stable across re-renders + // that only change attributes). Keep a best-effort selector string as backup. let sel = best.tagName.toLowerCase(); - if (best.id) { + if (best.id && /^[A-Za-z][\w-]*$/.test(best.id)) { + // Only use #id when it's a static, valid CSS identifier (skip dynamic ids + // like "radix-:r3:" / ":r0:" that change per render and break querySelector). sel = "#" + best.id; } else if (typeof best.className === "string" && best.className.trim()) { const parts = best.className.trim().split(/\s+/).slice(0, 2); sel = best.tagName.toLowerCase() + "." + parts.join("."); } + globalThis.__OPFOR_CONTAINER_EL__ = best; globalThis.__OPFOR_CONTAINER_SEL__ = sel; const result = snapshotEl(best, sel); diff --git a/runners/extension/icons/icon128.png b/runners/extension/icons/icon128.png index 68e391f53f9e899e3c7515cf59b9be2de3695659..4f4def9f34bf4cf53a01798d3ef0cc2a11b8742d 100644 GIT binary patch literal 2074 zcmds2`8ON*7XPNvCe~=Rp|NXgujNUfCAII=-ZDf))moG^)^?C~#x|q`V;vGyX``4* z^)VA$Ny{VB#a0wG(hzG~ih8{CmwErgyXSoF=WgfRAMW{_o9*suFD`--0RV_QI@ov$ znDia+V*>x&?CQS-1R;9bTY)CF+>#)%3HiY>)Wrp83Su~bWJUm??;`@B1ONa^g8-<2 zA>V7XBY$^EH0b~0?}HBagc1RO{p@ICc{vHPTIrT0XM2)`j~^M*AxLGbsJz0$bDTNO z7PiejwuT;#+e+{rYn_0;oUF_&pPn3^qvV%4%M<+<8Z4C!ZTpTQ6imw+J)WzqsbVm1 zu5>O_^7|&;am|NJ_PE}_+NDu`bLUsSIX0$TrS}+Y4#<(9u|T35ViY@N9Ei@HIIobB zf9s10g&)arX35-)qrB`4_4aOJ_!66kKQu+~&wXtv8}TX#xJ@55k3GD=pZaexkfXhk*wEo^U|Wqft!^D%xC6FDc*6$_hus<5>lZ^{08 zNGK|6r?o{#qGhI+kkY=RxT}NQHu30a^0Kzls0ax|2r54COQROdAPT482K}e;u!(*$ z?5eyUXE3>K*lds|>jXPpMs9h;Z_`aUr})`CX6(W*eh}KQi*?4fSNV_^rLfizZTM6N z>ohqcmiO7B+Cc+P!6o3U&3ai|NA!+kxQ`Tk5_2S#9{@U)Wj)AM#jkbc**FaJ?yXSpQdSt{ep~B z_3F{^9d8m9E~($)ZP~}_hoQ_!5Kp zaYn790#7#m@=hBFA07`{&3x-NTeE4j&lzA9>&&FJPgHvo_^b5#2)&)+g0uUVr`L^9 zA@%JewY!UqpzJrjhN9gzuTBxUL+{Xp^7jTG+0jn|4mBC=b+zQGf#phA=?#}1iaE3E zQ(^_PBmxQsr5dnifKzGy`z@f<<}Oeo4U-nM1uUYf*8s3cJm_17kS45VAb_;CpFIi% zzo&NyWIeMhMTdbP(RdgD9iP>_5ugvbECE2=N4G`=kahm8;7mL=^#@ZRiEY4u|C0rK z+;Op+?2baUZ;VcbwzwfyMs>TfJym-{(<_D%dfG2>Kgmf}mg$cT_uF2JXKddN=R3W- zAWFg;jFetuBrFjWa1)aa=1T8S;t_tC2Rgk)F9NCMHgG^-25pcjd(+`j;SU>&%$ajHf|&=bF@Lg z6%VMY7E$6_iPOvgeD~X*fx(?RHzS*zEUgPb{-?W{g+j+xm%HrVpN+y`BwP0zpZ;f} zE^Yx5JD@3b_|Hw#X?AVI;6hH+IXi*;jAL;K={ ztpl;B6zkS-FeFV)eL>mRN+PDt%+`e|F1#@WrCh&MyWvhlYTEWPBafb>yTbmX(NtG= zq=2xs)~dZ4->-i%^{*0|@PK-c&9E{caaVq&$%CT68m=U;AZ|NxB!H8i2NBK$rNPtx zSV#`Q&mv6`oDKJ6q(()e^T=k}0#`ZVuSh9G_;1s%Vco&U2-46UNElUJoUY;{)<_+@ z^x4m%AESx+(+sFe>@*T_G8J#{r~*BI(T!QC`UBjxRT@tw<@O8dLe#T8h#q6Oeo!B; zn^SZ&W$JY5==FPgh^dQqX%X=8sOVl8%i&+MRx|vgfmg3O(CNB_x=6R`Td7>+L}_AD zu)^K#m|aSg?uLxplL@V!yXR*)50+wjR-MCTT*HJhIpXuk5{2r3n^oT;kIea)Q5Dfz zTJxX}b(S~2Pjy%RPQYw54gQ zmGu6EJUF{FyT6#%tiBL7hmKNhhT`w1c17c{Z{`%xy$~bt_Y=Il+THaVCry67i{K9g N=4k6`(_|HR_rJ`#mL32A literal 9071 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 QbN~PV07*qoM6N<$f))O(!~g&Q literal 9071 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 literal 19709 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
- OPFOR + Agent OPFOR
diff --git a/runners/extension/popup.js b/runners/extension/popup.js index a02627f7..0a4fe450 100644 --- a/runners/extension/popup.js +++ b/runners/extension/popup.js @@ -1321,7 +1321,7 @@ function generateHtmlReport(report) { --line:#E2E8F0;--line-2:#CBD5E1; --pass:#059669;--pass-bg:#D1FAE5;--pass-border:#6EE7B7; --fail:#DC2626;--fail-bg:#FEE2E2;--fail-border:#FCA5A5; - --accent:#f5ad5c; + --accent:#FF4D4F; } *{box-sizing:border-box;margin:0;padding:0} html{background:var(--bg)} @@ -1337,7 +1337,7 @@ function generateHtmlReport(report) { .cover-inner{max-width:960px;margin:0 auto;padding:36px 24px 32px} .cover-top{display:flex;align-items:flex-start;justify-content:space-between;gap:24px;margin-bottom:28px} .cover-brand{display:flex;align-items:center;gap:10px} - .cover-brand-icon{width:36px;height:36px;background:linear-gradient(135deg,#f5ad5c,#c47a2a);border-radius:8px;display:flex;align-items:center;justify-content:center;flex-shrink:0} + .cover-brand-icon{width:36px;height:36px;background:linear-gradient(135deg,#FF4D4F,#c4302a);border-radius:8px;display:flex;align-items:center;justify-content:center;flex-shrink:0} .cover-brand-name{font-size:15px;font-weight:700;letter-spacing:0.04em;color:#fff} .cover-brand-sub{font-size:11px;color:#94A3B8;letter-spacing:0.08em;text-transform:uppercase;margin-top:1px} .cover-classification{padding:4px 12px;border:1px solid rgba(255,255,255,0.15);border-radius:4px;font-size:11px;font-weight:600;letter-spacing:0.1em;text-transform:uppercase;color:#CBD5E1} diff --git a/runners/extension/responseExtractor.js b/runners/extension/responseExtractor.js index ebb3e5ca..51e556ed 100644 --- a/runners/extension/responseExtractor.js +++ b/runners/extension/responseExtractor.js @@ -28,16 +28,20 @@ function diffTextNodes(pre, post) { let i = 0; while (i < preNorm.length && i < postNorm.length && preNorm[i] === postNorm[i]) i++; - const candidates = post.slice(i); - const preNormSet = new Set(preNorm); - const filtered = candidates.filter((t) => !preNormSet.has(stripLeadingTimestamp(t))); - const result = filtered.length > 0 ? filtered : candidates; - - if (result.length > post.length * 0.8 && post.length > 5) { - const fullFiltered = post.filter((t) => !preNormSet.has(stripLeadingTimestamp(t))); - return { text: fullFiltered.join("\n") }; + // Clean append: the common prefix covered every prior node, so the new nodes + // are exactly the appended tail. Use this POSITIONAL diff directly — do NOT + // value-filter against the whole prior transcript, or a reply that repeats an + // earlier message verbatim (e.g. the same canned answer on two turns) gets + // deduped away, leaving only the user echo → "could not extract". + if (i >= preNorm.length) { + return { text: post.slice(i).join("\n") }; } - return { text: result.join("\n") }; + + // Prefix diverged (full re-render / reordered / virtualized transcript): fall + // back to a value diff — surface post nodes whose text isn't present in pre. + const preSet = new Set(preNorm); + const valueNew = post.filter((t) => !preSet.has(stripLeadingTimestamp(t))); + return { text: (valueNew.length ? valueNew : post.slice(i)).join("\n") }; } // ── Scan all frames, return the best container snapshot ─────────────────────── @@ -58,24 +62,47 @@ async function scanBestFrame(tabId) { return iframeHits.length > 0 ? iframeHits[0] : hits[0] || null; } +// Snapshot one specific frame (the frame the message is actually sent into). +async function snapshotFrame(tabId, frameId) { + const results = await chrome.scripting.executeScript({ + target: { tabId, frameIds: [frameId] }, + files: ["frame_snapshot.js"], + }); + const r = results?.[0]; + return r?.result ? { frameId: r.frameId, ...r.result } : null; +} + // ── Public API ──────────────────────────────────────────────────────────────── /** * Take a pre-send snapshot of the chat container. * Returns an object suitable for passing as prevSnapshot to extractResponse. */ -export async function snapshotCurrentResponse(tabId, _frameId) { +export async function snapshotCurrentResponse(tabId, frameId) { + const empty = (containerFrameId) => ({ + text: "", + messageCount: 0, + botCount: 0, + textNodes: [], + nodeCount: 0, + containerFrameId, + }); try { - const snap = await scanBestFrame(tabId); - if (!snap) - return { - text: "", - messageCount: 0, - botCount: 0, - textNodes: [], - nodeCount: 0, - containerFrameId: null, - }; + // Anchor the response read to the SAME frame the message is sent into. The + // response always appears in the send frame's transcript, so reading from a + // different (higher-"scoring") iframe is the main cause of missed replies. + // Only when no send frame is known do we fall back to scanning all frames. + let snap = null; + const hasFrame = frameId !== null && frameId !== undefined; + if (hasFrame) { + snap = await snapshotFrame(tabId, frameId); + // Send frame has no chat container yet (e.g. empty transcript on turn 1): + // still anchor reads to it — polling picks up the container once a reply renders. + if (!snap?.ok) return empty(frameId); + } else { + snap = await scanBestFrame(tabId); + if (!snap) return empty(null); + } return { text: snap.fullText || "", messageCount: snap.nodeCount, @@ -84,21 +111,18 @@ export async function snapshotCurrentResponse(tabId, _frameId) { nodeCount: snap.nodeCount, fullText: snap.fullText, lastNodeText: snap.lastNodeText, - containerFrameId: snap.frameId, + containerFrameId: snap.frameId ?? (hasFrame ? frameId : null), containerSel: snap.sel, }; } catch { - return { - text: "", - messageCount: 0, - botCount: 0, - textNodes: [], - nodeCount: 0, - containerFrameId: null, - }; + return empty(hasFrameIdSafe(frameId)); } } +function hasFrameIdSafe(frameId) { + return frameId === null || frameId === undefined ? null : frameId; +} + /** * Poll until a new, complete bot response appears, then return it via text-node diff. * @@ -269,7 +293,12 @@ export async function extractResponse(tabId, frameId, lastUserText = "", prevSna if (stableCount >= neededStable) { const { text: rawDiff } = diffTextNodes(baseTextNodes, snap.textNodes); const diffLines = rawDiff.split("\n").filter((l) => l.trim()); - const botLines = diffLines.filter((l) => !isUserEcho(l) && !isTypingIndicator(l)); + // Drop pure-timestamp lines (e.g. message-bubble "3:45 PM" footers) that now + // surface as their own nodes — they strip to empty and aren't real reply text. + const isTimestampOnly = (l) => stripLeadingTimestamp(l).trim() === ""; + const botLines = diffLines.filter( + (l) => !isUserEcho(l) && !isTypingIndicator(l) && !isTimestampOnly(l) + ); if (botLines.length > 0) { return {