From 3cd59600e97dbf3769d0bf7d75dcb101af1aff05 Mon Sep 17 00:00:00 2001 From: "Tommy D. Rossi" Date: Sat, 3 Jan 2026 15:45:48 +0100 Subject: [PATCH] filter labels for elements covered by opaque overlays Uses elementsFromPoint() to check if element is blocked by opaque overlays (modals, cookie banners, etc.). Skips elements where an opaque element with pointer-events appears above the target in the stacking order. Correctly shows only visible, interactable elements. --- playwriter/package.json | 1 + playwriter/src/aria-snapshot.ts | 67 +- .../assets/aria-labels-google-snapshot.txt | 2 +- .../aria-labels-hacker-news-snapshot.txt | 808 +++++++++--------- pnpm-lock.yaml | 24 +- 5 files changed, 492 insertions(+), 410 deletions(-) diff --git a/playwriter/package.json b/playwriter/package.json index 95a9a64..fd1e109 100644 --- a/playwriter/package.json +++ b/playwriter/package.json @@ -44,6 +44,7 @@ "@modelcontextprotocol/sdk": "^1.21.1", "cac": "^6.7.14", "chalk": "^5.6.2", + "colord": "^2.9.3", "devtools-protocol": "^0.0.1543509", "diff": "^8.0.2", "hono": "^4.10.6", diff --git a/playwriter/src/aria-snapshot.ts b/playwriter/src/aria-snapshot.ts index 9d9a07e..15a470b 100644 --- a/playwriter/src/aria-snapshot.ts +++ b/playwriter/src/aria-snapshot.ts @@ -237,11 +237,12 @@ export async function showAriaRefLabels({ page, interactiveOnly = true }: { // ElementHandles get unwrapped to DOM elements in browser context // Using 'any' types here since this code runs in browser context const labelCount = await page.evaluate( + // Using 'any' for browser types since this runs in browser context ({ refs, containerId, containerStyles, labelStyles, roleColors, defaultColors }: { refs: Array<{ ref: string role: string - element: { getBoundingClientRect(): { width: number; height: number; left: number; top: number; right: number; bottom: number } } + element: any // Element in browser context }> containerId: string containerStyles: string @@ -273,6 +274,65 @@ export async function showAriaRefLabels({ page, interactiveOnly = true }: { const LABEL_HEIGHT = 16 const LABEL_CHAR_WIDTH = 7 // approximate width per character + // Parse alpha from rgb/rgba color string (getComputedStyle always returns these formats) + const getColorAlpha = (color: string): number => { + if (color === 'transparent') return 0 + // Match rgba(r, g, b, a) or rgb(r, g, b) + const match = color.match(/rgba?\(\s*[\d.]+\s*,\s*[\d.]+\s*,\s*[\d.]+\s*(?:,\s*([\d.]+)\s*)?\)/) + if (match) { + return match[1] !== undefined ? parseFloat(match[1]) : 1 + } + return 1 // Default to opaque for unrecognized formats + } + + // Check if an element has an opaque background that would block elements behind it + const isOpaqueElement = (el: any): boolean => { + const style = win.getComputedStyle(el) + + // Check element opacity + const opacity = parseFloat(style.opacity) + if (opacity < 0.1) return false + + // Check background-color alpha + const bgAlpha = getColorAlpha(style.backgroundColor) + if (bgAlpha > 0.1) return true + + // Check if has background-image (usually opaque) + if (style.backgroundImage !== 'none') return true + + return false + } + + // Check if element is visible (not covered by opaque overlay) + const isElementVisible = (element: any, rect: any): boolean => { + const centerX = rect.left + rect.width / 2 + const centerY = rect.top + rect.height / 2 + + // Get all elements at this point, from top to bottom + const stack = doc.elementsFromPoint(centerX, centerY) as any[] + + // Find our target element in the stack + const targetIndex = stack.findIndex((el: any) => + element.contains(el) || el.contains(element) + ) + + // Element not in stack at all - not visible + if (targetIndex === -1) return false + + // Check if any opaque element is above our target + for (let i = 0; i < targetIndex; i++) { + const el = stack[i] + // Skip our own overlay container + if (el.id === containerId) continue + // Skip pointer-events: none elements (decorative overlays) + if (win.getComputedStyle(el).pointerEvents === 'none') continue + // If this element is opaque, our target is blocked + if (isOpaqueElement(el)) return false + } + + return true + } + // Check if two rectangles overlap const rectsOverlap = ( a: { left: number; top: number; right: number; bottom: number }, @@ -291,6 +351,11 @@ export async function showAriaRefLabels({ page, interactiveOnly = true }: { continue } + // Skip elements that are covered by opaque overlays + if (!isElementVisible(element, rect)) { + continue + } + // Calculate label position and dimensions const labelWidth = ref.length * LABEL_CHAR_WIDTH + 8 // +8 for padding const labelLeft = rect.left diff --git a/playwriter/src/assets/aria-labels-google-snapshot.txt b/playwriter/src/assets/aria-labels-google-snapshot.txt index 67d2713..4d2dd8a 100644 --- a/playwriter/src/assets/aria-labels-google-snapshot.txt +++ b/playwriter/src/assets/aria-labels-google-snapshot.txt @@ -31,7 +31,7 @@ - generic [ref=e55]: - text: "Google offered in:" - link [ref=e56] [cursor=pointer]: - - /url: https://www.google.com/setprefs?sig=0_9hKalRtXzD5AWtzEh3KSYnYsv7w%3D&hl=it&source=homepage&sa=X&ved=0ahUKEwjUxd_Qyu-RAxUqwskDHd_ZFnQQ2ZgBCBU + - /url: https://www.google.com/setprefs?sig=0_GcFvy0kvBkaZ22ghfnLBdpCO7v0%3D&hl=it&source=homepage&sa=X&ved=0ahUKEwiqtPX4ze-RAxWEkyYFHdD-Ma8Q2ZgBCBU - text: Italiano - contentinfo [ref=e58]: - generic [ref=e59]: Italy diff --git a/playwriter/src/assets/aria-labels-hacker-news-snapshot.txt b/playwriter/src/assets/aria-labels-hacker-news-snapshot.txt index 20b2429..bb90871 100644 --- a/playwriter/src/assets/aria-labels-hacker-news-snapshot.txt +++ b/playwriter/src/assets/aria-labels-hacker-news-snapshot.txt @@ -56,11 +56,11 @@ - link "indieweb.org" [ref=e42] [cursor=pointer]: - /url: from?site=indieweb.org - text: ) - - row "781 points by 47thpresident 18 hours ago | hide | 182 comments" [ref=e43]: + - row "790 points by 47thpresident 18 hours ago | hide | 184 comments" [ref=e43]: - cell [ref=e44] - - cell "781 points by 47thpresident 18 hours ago | hide | 182 comments" [ref=e45]: + - cell "790 points by 47thpresident 18 hours ago | hide | 184 comments" [ref=e45]: - generic [ref=e46]: - - text: 781 points by + - text: 790 points by - link "47thpresident" [ref=e47] [cursor=pointer]: - /url: user?id=47thpresident - generic "2026-01-02T19:48:25 1767383305" [ref=e48]: @@ -70,72 +70,72 @@ - link "hide" [ref=e50] [cursor=pointer]: - /url: hide?id=46468600&goto=news - text: "|" - - link "182 comments" [ref=e51] [cursor=pointer]: + - link "184 comments" [ref=e51] [cursor=pointer]: - /url: item?id=46468600 - row [ref=e52] - - row "2. upvote Daft Punk Easter Egg in the BPM Tempo of Harder, Better, Faster, Stronger? (madebywindmill.com)" [ref=e53]: + - row "2. upvote Trump says Venezuela’s Maduro captured after strikes (reuters.com)" [ref=e53]: - cell "2." [ref=e54] - cell "upvote" [ref=e55]: - link "upvote" [ref=e57] [cursor=pointer]: - - /url: vote?id=46469577&how=up&goto=news + - /url: vote?id=46473348&how=up&goto=news - generic "upvote" [ref=e58] - - cell "Daft Punk Easter Egg in the BPM Tempo of Harder, Better, Faster, Stronger? (madebywindmill.com)" [ref=e59]: + - cell "Trump says Venezuela’s Maduro captured after strikes (reuters.com)" [ref=e59]: - generic [ref=e60]: - - link "Daft Punk Easter Egg in the BPM Tempo of Harder, Better, Faster, Stronger?" [ref=e61] [cursor=pointer]: - - /url: https://www.madebywindmill.com/tempi/blog/hbfs-bpm/ + - link "Trump says Venezuela’s Maduro captured after strikes" [ref=e61] [cursor=pointer]: + - /url: https://www.reuters.com/world/americas/loud-noises-heard-venezuela-capital-southern-area-without-electricity-2026-01-03/ - generic [ref=e62]: - text: ( - - link "madebywindmill.com" [ref=e63] [cursor=pointer]: - - /url: from?site=madebywindmill.com + - link "reuters.com" [ref=e63] [cursor=pointer]: + - /url: from?site=reuters.com - text: ) - - row "578 points by simonw 17 hours ago | hide | 96 comments" [ref=e64]: + - row "593 points by jumpocelot 8 hours ago | hide | 1356 comments" [ref=e64]: - cell [ref=e65] - - cell "578 points by simonw 17 hours ago | hide | 96 comments" [ref=e66]: + - cell "593 points by jumpocelot 8 hours ago | hide | 1356 comments" [ref=e66]: - generic [ref=e67]: - - text: 578 points by - - link "simonw" [ref=e68] [cursor=pointer]: - - /url: user?id=simonw - - generic "2026-01-02T21:27:44 1767389264" [ref=e69]: - - link "17 hours ago" [ref=e70] [cursor=pointer]: - - /url: item?id=46469577 + - text: 593 points by + - link "jumpocelot" [ref=e68] [cursor=pointer]: + - /url: user?id=jumpocelot + - generic "2026-01-03T06:35:21 1767422121" [ref=e69]: + - link "8 hours ago" [ref=e70] [cursor=pointer]: + - /url: item?id=46473348 - text: "|" - link "hide" [ref=e71] [cursor=pointer]: - - /url: hide?id=46469577&goto=news + - /url: hide?id=46473348&goto=news - text: "|" - - link "96 comments" [ref=e72] [cursor=pointer]: - - /url: item?id=46469577 + - link "1356 comments" [ref=e72] [cursor=pointer]: + - /url: item?id=46473348 - row [ref=e73] - - row "3. upvote Trump says Venezuela’s Maduro captured after strikes (reuters.com)" [ref=e74]: + - row "3. upvote Daft Punk Easter Egg in the BPM Tempo of Harder, Better, Faster, Stronger? (madebywindmill.com)" [ref=e74]: - cell "3." [ref=e75] - cell "upvote" [ref=e76]: - link "upvote" [ref=e78] [cursor=pointer]: - - /url: vote?id=46473348&how=up&goto=news + - /url: vote?id=46469577&how=up&goto=news - generic "upvote" [ref=e79] - - cell "Trump says Venezuela’s Maduro captured after strikes (reuters.com)" [ref=e80]: + - cell "Daft Punk Easter Egg in the BPM Tempo of Harder, Better, Faster, Stronger? (madebywindmill.com)" [ref=e80]: - generic [ref=e81]: - - link "Trump says Venezuela’s Maduro captured after strikes" [ref=e82] [cursor=pointer]: - - /url: https://www.reuters.com/world/americas/loud-noises-heard-venezuela-capital-southern-area-without-electricity-2026-01-03/ + - link "Daft Punk Easter Egg in the BPM Tempo of Harder, Better, Faster, Stronger?" [ref=e82] [cursor=pointer]: + - /url: https://www.madebywindmill.com/tempi/blog/hbfs-bpm/ - generic [ref=e83]: - text: ( - - link "reuters.com" [ref=e84] [cursor=pointer]: - - /url: from?site=reuters.com + - link "madebywindmill.com" [ref=e84] [cursor=pointer]: + - /url: from?site=madebywindmill.com - text: ) - - row "553 points by jumpocelot 7 hours ago | hide | 1264 comments" [ref=e85]: + - row "581 points by simonw 17 hours ago | hide | 96 comments" [ref=e85]: - cell [ref=e86] - - cell "553 points by jumpocelot 7 hours ago | hide | 1264 comments" [ref=e87]: + - cell "581 points by simonw 17 hours ago | hide | 96 comments" [ref=e87]: - generic [ref=e88]: - - text: 553 points by - - link "jumpocelot" [ref=e89] [cursor=pointer]: - - /url: user?id=jumpocelot - - generic "2026-01-03T06:35:21 1767422121" [ref=e90]: - - link "7 hours ago" [ref=e91] [cursor=pointer]: - - /url: item?id=46473348 + - text: 581 points by + - link "simonw" [ref=e89] [cursor=pointer]: + - /url: user?id=simonw + - generic "2026-01-02T21:27:44 1767389264" [ref=e90]: + - link "17 hours ago" [ref=e91] [cursor=pointer]: + - /url: item?id=46469577 - text: "|" - link "hide" [ref=e92] [cursor=pointer]: - - /url: hide?id=46473348&goto=news + - /url: hide?id=46469577&goto=news - text: "|" - - link "1264 comments" [ref=e93] [cursor=pointer]: - - /url: item?id=46473348 + - link "96 comments" [ref=e93] [cursor=pointer]: + - /url: item?id=46469577 - row [ref=e94] - 'row "4. upvote Of Boot Vectors and Double Glitches: Bypassing RP2350''s Secure Boot (ccc.de)" [ref=e95]': - cell "4." [ref=e96] @@ -152,11 +152,11 @@ - link "ccc.de" [ref=e105] [cursor=pointer]: - /url: from?site=ccc.de - text: ) - - row "98 points by aberoham 11 hours ago | hide | 9 comments" [ref=e106]: + - row "100 points by aberoham 11 hours ago | hide | 10 comments" [ref=e106]: - cell [ref=e107] - - cell "98 points by aberoham 11 hours ago | hide | 9 comments" [ref=e108]: + - cell "100 points by aberoham 11 hours ago | hide | 10 comments" [ref=e108]: - generic [ref=e109]: - - text: 98 points by + - text: 100 points by - link "aberoham" [ref=e110] [cursor=pointer]: - /url: user?id=aberoham - generic "2025-12-27T16:49:39 1766854179" [ref=e111]: @@ -166,127 +166,127 @@ - link "hide" [ref=e113] [cursor=pointer]: - /url: hide?id=46403062&goto=news - text: "|" - - link "9 comments" [ref=e114] [cursor=pointer]: + - link "10 comments" [ref=e114] [cursor=pointer]: - /url: item?id=46403062 - row [ref=e115] - - row "5. upvote IPv6 just turned 30 and still hasn't taken over the world (theregister.com)" [ref=e116]: + - row "5. upvote X-Clacks-Overhead (hleb.dev)" [ref=e116]: - cell "5." [ref=e117] - cell "upvote" [ref=e118]: - link "upvote" [ref=e120] [cursor=pointer]: - - /url: vote?id=46465327&how=up&goto=news + - /url: vote?id=46475437&how=up&goto=news - generic "upvote" [ref=e121] - - cell "IPv6 just turned 30 and still hasn't taken over the world (theregister.com)" [ref=e122]: + - cell "X-Clacks-Overhead (hleb.dev)" [ref=e122]: - generic [ref=e123]: - - link "IPv6 just turned 30 and still hasn't taken over the world" [ref=e124] [cursor=pointer]: - - /url: https://www.theregister.com/2025/12/31/ipv6_at_30/ + - link "X-Clacks-Overhead" [ref=e124] [cursor=pointer]: + - /url: https://hleb.dev/post/x-clacks-overhead/ - generic [ref=e125]: - text: ( - - link "theregister.com" [ref=e126] [cursor=pointer]: - - /url: from?site=theregister.com - - text: ) - - row "424 points by Brajeshwar 23 hours ago | hide | 847 comments" [ref=e127]: - - cell [ref=e128] - - cell "424 points by Brajeshwar 23 hours ago | hide | 847 comments" [ref=e129]: - - generic [ref=e130]: - - text: 424 points by - - link "Brajeshwar" [ref=e131] [cursor=pointer]: - - /url: user?id=Brajeshwar - - generic "2026-01-02T14:55:09 1767365709" [ref=e132]: - - link "23 hours ago" [ref=e133] [cursor=pointer]: - - /url: item?id=46465327 - - text: "|" - - link "hide" [ref=e134] [cursor=pointer]: - - /url: hide?id=46465327&goto=news - - text: "|" - - link "847 comments" [ref=e135] [cursor=pointer]: - - /url: item?id=46465327 - - row [ref=e136] - - row "6. ParadeDB (YC S23) Is Hiring Database Engineers (paradedb.notion.site)" [ref=e137]: - - cell "6." [ref=e138] - - cell [ref=e139]: - - img [ref=e140] - - cell "ParadeDB (YC S23) Is Hiring Database Engineers (paradedb.notion.site)" [ref=e141]: - - generic [ref=e142]: - - link "ParadeDB (YC S23) Is Hiring Database Engineers" [ref=e143] [cursor=pointer]: - - /url: https://paradedb.notion.site/?p=172ea4ce9deb80898ef5d5097bd65544&pm=s - - generic [ref=e144]: - - text: ( - - link "paradedb.notion.site" [ref=e145] [cursor=pointer]: - - /url: from?site=paradedb.notion.site - - text: ) - - row "34 minutes ago | hide" [ref=e146]: - - cell [ref=e147] - - cell "34 minutes ago | hide" [ref=e148]: - - generic "2026-01-03T13:53:34 1767448414" [ref=e149]: - - link "34 minutes ago" [ref=e150] [cursor=pointer]: - - /url: item?id=46476636 - - text: "|" - - link "hide" [ref=e151] [cursor=pointer]: - - /url: hide?id=46476636&goto=news - - row [ref=e152] - - row "7. upvote A Beginner's Two-Component Crystal-Style Wi-Fi Detector (siliconjunction.wordpress.com)" [ref=e153]: - - cell "7." [ref=e154] - - cell "upvote" [ref=e155]: - - link "upvote" [ref=e157] [cursor=pointer]: - - /url: vote?id=46443730&how=up&goto=news - - generic "upvote" [ref=e158] - - cell "A Beginner's Two-Component Crystal-Style Wi-Fi Detector (siliconjunction.wordpress.com)" [ref=e159]: - - generic [ref=e160]: - - link "A Beginner's Two-Component Crystal-Style Wi-Fi Detector" [ref=e161] [cursor=pointer]: - - /url: https://siliconjunction.wordpress.com/2025/12/12/a-beginners-two-component-crystal-style-wi-fi-detector/ - - generic [ref=e162]: - - text: ( - - link "siliconjunction.wordpress.com" [ref=e163] [cursor=pointer]: - - /url: from?site=siliconjunction.wordpress.com - - text: ) - - row "65 points by jensgk 9 hours ago | hide | 24 comments" [ref=e164]: - - cell [ref=e165] - - cell "65 points by jensgk 9 hours ago | hide | 24 comments" [ref=e166]: - - generic [ref=e167]: - - text: 65 points by - - link "jensgk" [ref=e168] [cursor=pointer]: - - /url: user?id=jensgk - - generic "2025-12-31T13:00:42 1767186042" [ref=e169]: - - link "9 hours ago" [ref=e170] [cursor=pointer]: - - /url: item?id=46443730 - - text: "|" - - link "hide" [ref=e171] [cursor=pointer]: - - /url: hide?id=46443730&goto=news - - text: "|" - - link "24 comments" [ref=e172] [cursor=pointer]: - - /url: item?id=46443730 - - row [ref=e173] - - row "8. upvote X-Clacks-Overhead (hleb.dev)" [ref=e174]: - - cell "8." [ref=e175] - - cell "upvote" [ref=e176]: - - link "upvote" [ref=e178] [cursor=pointer]: - - /url: vote?id=46475437&how=up&goto=news - - generic "upvote" [ref=e179] - - cell "X-Clacks-Overhead (hleb.dev)" [ref=e180]: - - generic [ref=e181]: - - link "X-Clacks-Overhead" [ref=e182] [cursor=pointer]: - - /url: https://hleb.dev/post/x-clacks-overhead/ - - generic [ref=e183]: - - text: ( - - link "hleb.dev" [ref=e184] [cursor=pointer]: + - link "hleb.dev" [ref=e126] [cursor=pointer]: - /url: from?site=hleb.dev - text: ) - - row "10 points by hleb_dev 2 hours ago | hide | 3 comments" [ref=e185]: - - cell [ref=e186] - - cell "10 points by hleb_dev 2 hours ago | hide | 3 comments" [ref=e187]: - - generic [ref=e188]: - - text: 10 points by - - link "hleb_dev" [ref=e189] [cursor=pointer]: + - row "14 points by hleb_dev 3 hours ago | hide | 3 comments" [ref=e127]: + - cell [ref=e128] + - cell "14 points by hleb_dev 3 hours ago | hide | 3 comments" [ref=e129]: + - generic [ref=e130]: + - text: 14 points by + - link "hleb_dev" [ref=e131] [cursor=pointer]: - /url: user?id=hleb_dev - - generic "2026-01-03T11:37:07 1767440227" [ref=e190]: - - link "2 hours ago" [ref=e191] [cursor=pointer]: + - generic "2026-01-03T11:37:07 1767440227" [ref=e132]: + - link "3 hours ago" [ref=e133] [cursor=pointer]: - /url: item?id=46475437 - text: "|" - - link "hide" [ref=e192] [cursor=pointer]: + - link "hide" [ref=e134] [cursor=pointer]: - /url: hide?id=46475437&goto=news - text: "|" - - link "3 comments" [ref=e193] [cursor=pointer]: + - link "3 comments" [ref=e135] [cursor=pointer]: - /url: item?id=46475437 + - row [ref=e136] + - row "6. upvote IPv6 just turned 30 and still hasn't taken over the world (theregister.com)" [ref=e137]: + - cell "6." [ref=e138] + - cell "upvote" [ref=e139]: + - link "upvote" [ref=e141] [cursor=pointer]: + - /url: vote?id=46465327&how=up&goto=news + - generic "upvote" [ref=e142] + - cell "IPv6 just turned 30 and still hasn't taken over the world (theregister.com)" [ref=e143]: + - generic [ref=e144]: + - link "IPv6 just turned 30 and still hasn't taken over the world" [ref=e145] [cursor=pointer]: + - /url: https://www.theregister.com/2025/12/31/ipv6_at_30/ + - generic [ref=e146]: + - text: ( + - link "theregister.com" [ref=e147] [cursor=pointer]: + - /url: from?site=theregister.com + - text: ) + - row "428 points by Brajeshwar 23 hours ago | hide | 856 comments" [ref=e148]: + - cell [ref=e149] + - cell "428 points by Brajeshwar 23 hours ago | hide | 856 comments" [ref=e150]: + - generic [ref=e151]: + - text: 428 points by + - link "Brajeshwar" [ref=e152] [cursor=pointer]: + - /url: user?id=Brajeshwar + - generic "2026-01-02T14:55:09 1767365709" [ref=e153]: + - link "23 hours ago" [ref=e154] [cursor=pointer]: + - /url: item?id=46465327 + - text: "|" + - link "hide" [ref=e155] [cursor=pointer]: + - /url: hide?id=46465327&goto=news + - text: "|" + - link "856 comments" [ref=e156] [cursor=pointer]: + - /url: item?id=46465327 + - row [ref=e157] + - row "7. upvote A Beginner's Two-Component Crystal-Style Wi-Fi Detector (siliconjunction.wordpress.com)" [ref=e158]: + - cell "7." [ref=e159] + - cell "upvote" [ref=e160]: + - link "upvote" [ref=e162] [cursor=pointer]: + - /url: vote?id=46443730&how=up&goto=news + - generic "upvote" [ref=e163] + - cell "A Beginner's Two-Component Crystal-Style Wi-Fi Detector (siliconjunction.wordpress.com)" [ref=e164]: + - generic [ref=e165]: + - link "A Beginner's Two-Component Crystal-Style Wi-Fi Detector" [ref=e166] [cursor=pointer]: + - /url: https://siliconjunction.wordpress.com/2025/12/12/a-beginners-two-component-crystal-style-wi-fi-detector/ + - generic [ref=e167]: + - text: ( + - link "siliconjunction.wordpress.com" [ref=e168] [cursor=pointer]: + - /url: from?site=siliconjunction.wordpress.com + - text: ) + - row "66 points by jensgk 9 hours ago | hide | 25 comments" [ref=e169]: + - cell [ref=e170] + - cell "66 points by jensgk 9 hours ago | hide | 25 comments" [ref=e171]: + - generic [ref=e172]: + - text: 66 points by + - link "jensgk" [ref=e173] [cursor=pointer]: + - /url: user?id=jensgk + - generic "2025-12-31T13:00:42 1767186042" [ref=e174]: + - link "9 hours ago" [ref=e175] [cursor=pointer]: + - /url: item?id=46443730 + - text: "|" + - link "hide" [ref=e176] [cursor=pointer]: + - /url: hide?id=46443730&goto=news + - text: "|" + - link "25 comments" [ref=e177] [cursor=pointer]: + - /url: item?id=46443730 + - row [ref=e178] + - row "8. ParadeDB (YC S23) Is Hiring Database Engineers (paradedb.notion.site)" [ref=e179]: + - cell "8." [ref=e180] + - cell [ref=e181]: + - img [ref=e182] + - cell "ParadeDB (YC S23) Is Hiring Database Engineers (paradedb.notion.site)" [ref=e183]: + - generic [ref=e184]: + - link "ParadeDB (YC S23) Is Hiring Database Engineers" [ref=e185] [cursor=pointer]: + - /url: https://paradedb.notion.site/?p=172ea4ce9deb80898ef5d5097bd65544&pm=s + - generic [ref=e186]: + - text: ( + - link "paradedb.notion.site" [ref=e187] [cursor=pointer]: + - /url: from?site=paradedb.notion.site + - text: ) + - row "51 minutes ago | hide" [ref=e188]: + - cell [ref=e189] + - cell "51 minutes ago | hide" [ref=e190]: + - generic "2026-01-03T13:53:34 1767448414" [ref=e191]: + - link "51 minutes ago" [ref=e192] [cursor=pointer]: + - /url: item?id=46476636 + - text: "|" + - link "hide" [ref=e193] [cursor=pointer]: + - /url: hide?id=46476636&goto=news - row [ref=e194] - row "9. upvote 2026 will be my year of the Linux desktop (xeiaso.net)" [ref=e195]: - cell "9." [ref=e196] @@ -303,11 +303,11 @@ - link "xeiaso.net" [ref=e205] [cursor=pointer]: - /url: from?site=xeiaso.net - text: ) - - row "613 points by todsacerdoti 14 hours ago | hide | 452 comments" [ref=e206]: + - row "619 points by todsacerdoti 14 hours ago | hide | 456 comments" [ref=e206]: - cell [ref=e207] - - cell "613 points by todsacerdoti 14 hours ago | hide | 452 comments" [ref=e208]: + - cell "619 points by todsacerdoti 14 hours ago | hide | 456 comments" [ref=e208]: - generic [ref=e209]: - - text: 613 points by + - text: 619 points by - link "todsacerdoti" [ref=e210] [cursor=pointer]: - /url: user?id=todsacerdoti - generic "2026-01-03T00:15:47 1767399347" [ref=e211]: @@ -317,7 +317,7 @@ - link "hide" [ref=e213] [cursor=pointer]: - /url: hide?id=46471199&goto=news - text: "|" - - link "452 comments" [ref=e214] [cursor=pointer]: + - link "456 comments" [ref=e214] [cursor=pointer]: - /url: item?id=46471199 - row [ref=e215] - row "10. upvote Clicks Communicator (clicksphone.com)" [ref=e216]: @@ -335,11 +335,11 @@ - link "clicksphone.com" [ref=e226] [cursor=pointer]: - /url: from?site=clicksphone.com - text: ) - - row "358 points by microflash 21 hours ago | hide | 216 comments" [ref=e227]: + - row "360 points by microflash 21 hours ago | hide | 220 comments" [ref=e227]: - cell [ref=e228] - - cell "358 points by microflash 21 hours ago | hide | 216 comments" [ref=e229]: + - cell "360 points by microflash 21 hours ago | hide | 220 comments" [ref=e229]: - generic [ref=e230]: - - text: 358 points by + - text: 360 points by - link "microflash" [ref=e231] [cursor=pointer]: - /url: user?id=microflash - generic "2026-01-02T17:22:04 1767374524" [ref=e232]: @@ -349,290 +349,290 @@ - link "hide" [ref=e234] [cursor=pointer]: - /url: hide?id=46467057&goto=news - text: "|" - - link "216 comments" [ref=e235] [cursor=pointer]: + - link "220 comments" [ref=e235] [cursor=pointer]: - /url: item?id=46467057 - row [ref=e236] - - row "11. upvote Tally – A tool to help agents classify your bank transactions (tallyai.money)" [ref=e237]: + - 'row "11. upvote Ask HN: Who is hiring? (January 2026)" [ref=e237]': - cell "11." [ref=e238] - cell "upvote" [ref=e239]: - link "upvote" [ref=e241] [cursor=pointer]: - - /url: vote?id=46475218&how=up&goto=news - - generic "upvote" [ref=e242] - - cell "Tally – A tool to help agents classify your bank transactions (tallyai.money)" [ref=e243]: - - generic [ref=e244]: - - link "Tally – A tool to help agents classify your bank transactions" [ref=e245] [cursor=pointer]: - - /url: https://tallyai.money/ - - generic [ref=e246]: - - text: ( - - link "tallyai.money" [ref=e247] [cursor=pointer]: - - /url: from?site=tallyai.money - - text: ) - - row "71 points by ahmedatia 2 hours ago | hide | 59 comments" [ref=e248]: - - cell [ref=e249] - - cell "71 points by ahmedatia 2 hours ago | hide | 59 comments" [ref=e250]: - - generic [ref=e251]: - - text: 71 points by - - link "ahmedatia" [ref=e252] [cursor=pointer]: - - /url: user?id=ahmedatia - - generic "2026-01-03T11:02:33 1767438153" [ref=e253]: - - link "2 hours ago" [ref=e254] [cursor=pointer]: - - /url: item?id=46475218 - - text: "|" - - link "hide" [ref=e255] [cursor=pointer]: - - /url: hide?id=46475218&goto=news - - text: "|" - - link "59 comments" [ref=e256] [cursor=pointer]: - - /url: item?id=46475218 - - row [ref=e257] - - 'row "12. upvote Ask HN: Who is hiring? (January 2026)" [ref=e258]': - - cell "12." [ref=e259] - - cell "upvote" [ref=e260]: - - link "upvote" [ref=e262] [cursor=pointer]: - /url: vote?id=46466074&how=up&goto=news - - generic "upvote" [ref=e263] - - 'cell "Ask HN: Who is hiring? (January 2026)" [ref=e264]': - - 'link "Ask HN: Who is hiring? (January 2026)" [ref=e266] [cursor=pointer]': + - generic "upvote" [ref=e242] + - 'cell "Ask HN: Who is hiring? (January 2026)" [ref=e243]': + - 'link "Ask HN: Who is hiring? (January 2026)" [ref=e245] [cursor=pointer]': - /url: item?id=46466074 - - row "307 points by whoishiring 22 hours ago | hide | 188 comments" [ref=e267]: - - cell [ref=e268] - - cell "307 points by whoishiring 22 hours ago | hide | 188 comments" [ref=e269]: - - generic [ref=e270]: + - row "307 points by whoishiring 22 hours ago | hide | 188 comments" [ref=e246]: + - cell [ref=e247] + - cell "307 points by whoishiring 22 hours ago | hide | 188 comments" [ref=e248]: + - generic [ref=e249]: - text: 307 points by - - link "whoishiring" [ref=e271] [cursor=pointer]: + - link "whoishiring" [ref=e250] [cursor=pointer]: - /url: user?id=whoishiring - - generic "2026-01-02T16:00:42 1767369642" [ref=e272]: - - link "22 hours ago" [ref=e273] [cursor=pointer]: + - generic "2026-01-02T16:00:42 1767369642" [ref=e251]: + - link "22 hours ago" [ref=e252] [cursor=pointer]: - /url: item?id=46466074 - text: "|" - - link "hide" [ref=e274] [cursor=pointer]: + - link "hide" [ref=e253] [cursor=pointer]: - /url: hide?id=46466074&goto=news - text: "|" - - link "188 comments" [ref=e275] [cursor=pointer]: + - link "188 comments" [ref=e254] [cursor=pointer]: - /url: item?id=46466074 + - row [ref=e255] + - 'row "12. upvote GitHub – tomasf/Cadova: Swift DSL for parametric 3D modeling (github.com/tomasf)" [ref=e256]': + - cell "12." [ref=e257] + - cell "upvote" [ref=e258]: + - link "upvote" [ref=e260] [cursor=pointer]: + - /url: vote?id=46442624&how=up&goto=news + - generic "upvote" [ref=e261] + - 'cell "GitHub – tomasf/Cadova: Swift DSL for parametric 3D modeling (github.com/tomasf)" [ref=e262]': + - generic [ref=e263]: + - 'link "GitHub – tomasf/Cadova: Swift DSL for parametric 3D modeling" [ref=e264] [cursor=pointer]': + - /url: https://github.com/tomasf/Cadova + - generic [ref=e265]: + - text: ( + - link "github.com/tomasf" [ref=e266] [cursor=pointer]: + - /url: from?site=github.com/tomasf + - text: ) + - row "33 points by bdcravens 6 hours ago | hide | 4 comments" [ref=e267]: + - cell [ref=e268] + - cell "33 points by bdcravens 6 hours ago | hide | 4 comments" [ref=e269]: + - generic [ref=e270]: + - text: 33 points by + - link "bdcravens" [ref=e271] [cursor=pointer]: + - /url: user?id=bdcravens + - generic "2025-12-31T09:16:58 1767172618" [ref=e272]: + - link "6 hours ago" [ref=e273] [cursor=pointer]: + - /url: item?id=46442624 + - text: "|" + - link "hide" [ref=e274] [cursor=pointer]: + - /url: hide?id=46442624&goto=news + - text: "|" + - link "4 comments" [ref=e275] [cursor=pointer]: + - /url: item?id=46442624 - row [ref=e276] - - row "13. upvote How Smell Guides Our Inner World (quantamagazine.org)" [ref=e277]: + - row "13. upvote A Basic Just-In-Time Compiler (2015) (nullprogram.com)" [ref=e277]: - cell "13." [ref=e278] - cell "upvote" [ref=e279]: - link "upvote" [ref=e281] [cursor=pointer]: - - /url: vote?id=46417500&how=up&goto=news + - /url: vote?id=46471712&how=up&goto=news - generic "upvote" [ref=e282] - - cell "How Smell Guides Our Inner World (quantamagazine.org)" [ref=e283]: + - cell "A Basic Just-In-Time Compiler (2015) (nullprogram.com)" [ref=e283]: - generic [ref=e284]: - - link "How Smell Guides Our Inner World" [ref=e285] [cursor=pointer]: - - /url: https://www.quantamagazine.org/how-smell-guides-our-inner-world-20250703/ + - link "A Basic Just-In-Time Compiler (2015)" [ref=e285] [cursor=pointer]: + - /url: https://nullprogram.com/blog/2015/03/19/ - generic [ref=e286]: - text: ( - - link "quantamagazine.org" [ref=e287] [cursor=pointer]: - - /url: from?site=quantamagazine.org + - link "nullprogram.com" [ref=e287] [cursor=pointer]: + - /url: from?site=nullprogram.com - text: ) - - row "21 points by anarbadalov 7 hours ago | hide | 1 comment" [ref=e288]: + - row "79 points by ibobev 13 hours ago | hide | 16 comments" [ref=e288]: - cell [ref=e289] - - cell "21 points by anarbadalov 7 hours ago | hide | 1 comment" [ref=e290]: + - cell "79 points by ibobev 13 hours ago | hide | 16 comments" [ref=e290]: - generic [ref=e291]: - - text: 21 points by - - link "anarbadalov" [ref=e292] [cursor=pointer]: - - /url: user?id=anarbadalov - - generic "2025-12-29T04:35:32 1766982932" [ref=e293]: - - link "7 hours ago" [ref=e294] [cursor=pointer]: - - /url: item?id=46417500 + - text: 79 points by + - link "ibobev" [ref=e292] [cursor=pointer]: + - /url: user?id=ibobev + - generic "2026-01-03T01:18:07 1767403087" [ref=e293]: + - link "13 hours ago" [ref=e294] [cursor=pointer]: + - /url: item?id=46471712 - text: "|" - link "hide" [ref=e295] [cursor=pointer]: - - /url: hide?id=46417500&goto=news + - /url: hide?id=46471712&goto=news - text: "|" - - link "1 comment" [ref=e296] [cursor=pointer]: - - /url: item?id=46417500 + - link "16 comments" [ref=e296] [cursor=pointer]: + - /url: item?id=46471712 - row [ref=e297] - - 'row "14. upvote GitHub – tomasf/Cadova: Swift DSL for parametric 3D modeling (github.com/tomasf)" [ref=e298]': + - row "14. upvote How Smell Guides Our Inner World (quantamagazine.org)" [ref=e298]: - cell "14." [ref=e299] - cell "upvote" [ref=e300]: - link "upvote" [ref=e302] [cursor=pointer]: - - /url: vote?id=46442624&how=up&goto=news + - /url: vote?id=46417500&how=up&goto=news - generic "upvote" [ref=e303] - - 'cell "GitHub – tomasf/Cadova: Swift DSL for parametric 3D modeling (github.com/tomasf)" [ref=e304]': + - cell "How Smell Guides Our Inner World (quantamagazine.org)" [ref=e304]: - generic [ref=e305]: - - 'link "GitHub – tomasf/Cadova: Swift DSL for parametric 3D modeling" [ref=e306] [cursor=pointer]': - - /url: https://github.com/tomasf/Cadova + - link "How Smell Guides Our Inner World" [ref=e306] [cursor=pointer]: + - /url: https://www.quantamagazine.org/how-smell-guides-our-inner-world-20250703/ - generic [ref=e307]: - text: ( - - link "github.com/tomasf" [ref=e308] [cursor=pointer]: - - /url: from?site=github.com/tomasf + - link "quantamagazine.org" [ref=e308] [cursor=pointer]: + - /url: from?site=quantamagazine.org - text: ) - - row "30 points by bdcravens 5 hours ago | hide | 4 comments" [ref=e309]: + - row "21 points by anarbadalov 7 hours ago | hide | 2 comments" [ref=e309]: - cell [ref=e310] - - cell "30 points by bdcravens 5 hours ago | hide | 4 comments" [ref=e311]: + - cell "21 points by anarbadalov 7 hours ago | hide | 2 comments" [ref=e311]: - generic [ref=e312]: - - text: 30 points by - - link "bdcravens" [ref=e313] [cursor=pointer]: - - /url: user?id=bdcravens - - generic "2025-12-31T09:16:58 1767172618" [ref=e314]: - - link "5 hours ago" [ref=e315] [cursor=pointer]: - - /url: item?id=46442624 + - text: 21 points by + - link "anarbadalov" [ref=e313] [cursor=pointer]: + - /url: user?id=anarbadalov + - generic "2025-12-29T04:35:32 1766982932" [ref=e314]: + - link "7 hours ago" [ref=e315] [cursor=pointer]: + - /url: item?id=46417500 - text: "|" - link "hide" [ref=e316] [cursor=pointer]: - - /url: hide?id=46442624&goto=news + - /url: hide?id=46417500&goto=news - text: "|" - - link "4 comments" [ref=e317] [cursor=pointer]: - - /url: item?id=46442624 + - link "2 comments" [ref=e317] [cursor=pointer]: + - /url: item?id=46417500 - row [ref=e318] - - row "15. upvote A Basic Just-In-Time Compiler (2015) (nullprogram.com)" [ref=e319]: + - 'row "15. upvote IQuest-Coder: A new open-source code model beats Claude Sonnet 4.5 and GPT 5.1 [pdf] (github.com/iquestlab)" [ref=e319]': - cell "15." [ref=e320] - cell "upvote" [ref=e321]: - link "upvote" [ref=e323] [cursor=pointer]: - - /url: vote?id=46471712&how=up&goto=news + - /url: vote?id=46472667&how=up&goto=news - generic "upvote" [ref=e324] - - cell "A Basic Just-In-Time Compiler (2015) (nullprogram.com)" [ref=e325]: + - 'cell "IQuest-Coder: A new open-source code model beats Claude Sonnet 4.5 and GPT 5.1 [pdf] (github.com/iquestlab)" [ref=e325]': - generic [ref=e326]: - - link "A Basic Just-In-Time Compiler (2015)" [ref=e327] [cursor=pointer]: - - /url: https://nullprogram.com/blog/2015/03/19/ + - 'link "IQuest-Coder: A new open-source code model beats Claude Sonnet 4.5 and GPT 5.1 [pdf]" [ref=e327] [cursor=pointer]': + - /url: https://github.com/IQuestLab/IQuest-Coder-V1/blob/main/papers/IQuest_Coder_Technical_Report.pdf - generic [ref=e328]: - text: ( - - link "nullprogram.com" [ref=e329] [cursor=pointer]: - - /url: from?site=nullprogram.com + - link "github.com/iquestlab" [ref=e329] [cursor=pointer]: + - /url: from?site=github.com/iquestlab - text: ) - - row "77 points by ibobev 13 hours ago | hide | 16 comments" [ref=e330]: + - row "114 points by shenli3514 10 hours ago | hide | 33 comments" [ref=e330]: - cell [ref=e331] - - cell "77 points by ibobev 13 hours ago | hide | 16 comments" [ref=e332]: + - cell "114 points by shenli3514 10 hours ago | hide | 33 comments" [ref=e332]: - generic [ref=e333]: - - text: 77 points by - - link "ibobev" [ref=e334] [cursor=pointer]: - - /url: user?id=ibobev - - generic "2026-01-03T01:18:07 1767403087" [ref=e335]: - - link "13 hours ago" [ref=e336] [cursor=pointer]: - - /url: item?id=46471712 + - text: 114 points by + - link "shenli3514" [ref=e334] [cursor=pointer]: + - /url: user?id=shenli3514 + - generic "2026-01-03T04:01:03 1767412863" [ref=e335]: + - link "10 hours ago" [ref=e336] [cursor=pointer]: + - /url: item?id=46472667 - text: "|" - link "hide" [ref=e337] [cursor=pointer]: - - /url: hide?id=46471712&goto=news + - /url: hide?id=46472667&goto=news - text: "|" - - link "16 comments" [ref=e338] [cursor=pointer]: - - /url: item?id=46471712 + - link "33 comments" [ref=e338] [cursor=pointer]: + - /url: item?id=46472667 - row [ref=e339] - - 'row "16. upvote Show HN: The ASCII Side of the Moon (aleyan.com)" [ref=e340]': + - row "16. upvote Tally – A tool to help agents classify your bank transactions (tallyai.money)" [ref=e340]: - cell "16." [ref=e341] - cell "upvote" [ref=e342]: - link "upvote" [ref=e344] [cursor=pointer]: - - /url: vote?id=46421045&how=up&goto=news + - /url: vote?id=46475218&how=up&goto=news - generic "upvote" [ref=e345] - - 'cell "Show HN: The ASCII Side of the Moon (aleyan.com)" [ref=e346]': + - cell "Tally – A tool to help agents classify your bank transactions (tallyai.money)" [ref=e346]: - generic [ref=e347]: - - 'link "Show HN: The ASCII Side of the Moon" [ref=e348] [cursor=pointer]': - - /url: https://aleyan.com/projects/ascii-side-of-the-moon/?lat=32.72&lon=-117.16&date=2025-12-29T14%3A24Z + - link "Tally – A tool to help agents classify your bank transactions" [ref=e348] [cursor=pointer]: + - /url: https://tallyai.money/ - generic [ref=e349]: - text: ( - - link "aleyan.com" [ref=e350] [cursor=pointer]: - - /url: from?site=aleyan.com + - link "tallyai.money" [ref=e350] [cursor=pointer]: + - /url: from?site=tallyai.money - text: ) - - row "6 points by aleyan 3 hours ago | hide | discuss" [ref=e351]: + - row "73 points by ahmedatia 3 hours ago | hide | 59 comments" [ref=e351]: - cell [ref=e352] - - cell "6 points by aleyan 3 hours ago | hide | discuss" [ref=e353]: + - cell "73 points by ahmedatia 3 hours ago | hide | 59 comments" [ref=e353]: - generic [ref=e354]: - - text: 6 points by - - link "aleyan" [ref=e355] [cursor=pointer]: - - /url: user?id=aleyan - - generic "2025-12-29T14:24:08 1767018248" [ref=e356]: + - text: 73 points by + - link "ahmedatia" [ref=e355] [cursor=pointer]: + - /url: user?id=ahmedatia + - generic "2026-01-03T11:02:33 1767438153" [ref=e356]: - link "3 hours ago" [ref=e357] [cursor=pointer]: - - /url: item?id=46421045 + - /url: item?id=46475218 - text: "|" - link "hide" [ref=e358] [cursor=pointer]: - - /url: hide?id=46421045&goto=news + - /url: hide?id=46475218&goto=news - text: "|" - - link "discuss" [ref=e359] [cursor=pointer]: - - /url: item?id=46421045 + - link "59 comments" [ref=e359] [cursor=pointer]: + - /url: item?id=46475218 - row [ref=e360] - - row "17. upvote Profiling with Ctrl-C (2024) (yosefk.com)" [ref=e361]: + - row "17. upvote Linux kernel security work (kroah.com)" [ref=e361]: - cell "17." [ref=e362] - cell "upvote" [ref=e363]: - link "upvote" [ref=e365] [cursor=pointer]: - - /url: vote?id=46475296&how=up&goto=news + - /url: vote?id=46469623&how=up&goto=news - generic "upvote" [ref=e366] - - cell "Profiling with Ctrl-C (2024) (yosefk.com)" [ref=e367]: + - cell "Linux kernel security work (kroah.com)" [ref=e367]: - generic [ref=e368]: - - link "Profiling with Ctrl-C (2024)" [ref=e369] [cursor=pointer]: - - /url: https://yosefk.com/blog/profiling-with-ctrl-c.html + - link "Linux kernel security work" [ref=e369] [cursor=pointer]: + - /url: http://www.kroah.com/log/blog/2026/01/02/linux-kernel-security-work/ - generic [ref=e370]: - text: ( - - link "yosefk.com" [ref=e371] [cursor=pointer]: - - /url: from?site=yosefk.com + - link "kroah.com" [ref=e371] [cursor=pointer]: + - /url: from?site=kroah.com - text: ) - - row "9 points by hun3 3 hours ago | hide | discuss" [ref=e372]: + - row "127 points by chmaynard 17 hours ago | hide | 56 comments" [ref=e372]: - cell [ref=e373] - - cell "9 points by hun3 3 hours ago | hide | discuss" [ref=e374]: + - cell "127 points by chmaynard 17 hours ago | hide | 56 comments" [ref=e374]: - generic [ref=e375]: - - text: 9 points by - - link "hun3" [ref=e376] [cursor=pointer]: - - /url: user?id=hun3 - - generic "2026-01-03T11:13:48 1767438828" [ref=e377]: - - link "3 hours ago" [ref=e378] [cursor=pointer]: - - /url: item?id=46475296 + - text: 127 points by + - link "chmaynard" [ref=e376] [cursor=pointer]: + - /url: user?id=chmaynard + - generic "2026-01-02T21:31:34 1767389494" [ref=e377]: + - link "17 hours ago" [ref=e378] [cursor=pointer]: + - /url: item?id=46469623 - text: "|" - link "hide" [ref=e379] [cursor=pointer]: - - /url: hide?id=46475296&goto=news + - /url: hide?id=46469623&goto=news - text: "|" - - link "discuss" [ref=e380] [cursor=pointer]: - - /url: item?id=46475296 + - link "56 comments" [ref=e380] [cursor=pointer]: + - /url: item?id=46469623 - row [ref=e381] - - 'row "18. upvote IQuest-Coder: A new open-source code model beats Claude Sonnet 4.5 and GPT 5.1 [pdf] (github.com/iquestlab)" [ref=e382]': + - 'row "18. upvote Show HN: The ASCII Side of the Moon (aleyan.com)" [ref=e382]': - cell "18." [ref=e383] - cell "upvote" [ref=e384]: - link "upvote" [ref=e386] [cursor=pointer]: - - /url: vote?id=46472667&how=up&goto=news + - /url: vote?id=46421045&how=up&goto=news - generic "upvote" [ref=e387] - - 'cell "IQuest-Coder: A new open-source code model beats Claude Sonnet 4.5 and GPT 5.1 [pdf] (github.com/iquestlab)" [ref=e388]': + - 'cell "Show HN: The ASCII Side of the Moon (aleyan.com)" [ref=e388]': - generic [ref=e389]: - - 'link "IQuest-Coder: A new open-source code model beats Claude Sonnet 4.5 and GPT 5.1 [pdf]" [ref=e390] [cursor=pointer]': - - /url: https://github.com/IQuestLab/IQuest-Coder-V1/blob/main/papers/IQuest_Coder_Technical_Report.pdf + - 'link "Show HN: The ASCII Side of the Moon" [ref=e390] [cursor=pointer]': + - /url: https://aleyan.com/projects/ascii-side-of-the-moon/?lat=32.72&lon=-117.16&date=2025-12-29T14%3A24Z - generic [ref=e391]: - text: ( - - link "github.com/iquestlab" [ref=e392] [cursor=pointer]: - - /url: from?site=github.com/iquestlab + - link "aleyan.com" [ref=e392] [cursor=pointer]: + - /url: from?site=aleyan.com - text: ) - - row "112 points by shenli3514 10 hours ago | hide | 33 comments" [ref=e393]: + - row "8 points by aleyan 3 hours ago | hide | 1 comment" [ref=e393]: - cell [ref=e394] - - cell "112 points by shenli3514 10 hours ago | hide | 33 comments" [ref=e395]: + - cell "8 points by aleyan 3 hours ago | hide | 1 comment" [ref=e395]: - generic [ref=e396]: - - text: 112 points by - - link "shenli3514" [ref=e397] [cursor=pointer]: - - /url: user?id=shenli3514 - - generic "2026-01-03T04:01:03 1767412863" [ref=e398]: - - link "10 hours ago" [ref=e399] [cursor=pointer]: - - /url: item?id=46472667 + - text: 8 points by + - link "aleyan" [ref=e397] [cursor=pointer]: + - /url: user?id=aleyan + - generic "2025-12-29T14:24:08 1767018248" [ref=e398]: + - link "3 hours ago" [ref=e399] [cursor=pointer]: + - /url: item?id=46421045 - text: "|" - link "hide" [ref=e400] [cursor=pointer]: - - /url: hide?id=46472667&goto=news + - /url: hide?id=46421045&goto=news - text: "|" - - link "33 comments" [ref=e401] [cursor=pointer]: - - /url: item?id=46472667 + - link "1 comment" [ref=e401] [cursor=pointer]: + - /url: item?id=46421045 - row [ref=e402] - - row "19. upvote Linux kernel security work (kroah.com)" [ref=e403]: + - row "19. upvote Profiling with Ctrl-C (2024) (yosefk.com)" [ref=e403]: - cell "19." [ref=e404] - cell "upvote" [ref=e405]: - link "upvote" [ref=e407] [cursor=pointer]: - - /url: vote?id=46469623&how=up&goto=news + - /url: vote?id=46475296&how=up&goto=news - generic "upvote" [ref=e408] - - cell "Linux kernel security work (kroah.com)" [ref=e409]: + - cell "Profiling with Ctrl-C (2024) (yosefk.com)" [ref=e409]: - generic [ref=e410]: - - link "Linux kernel security work" [ref=e411] [cursor=pointer]: - - /url: http://www.kroah.com/log/blog/2026/01/02/linux-kernel-security-work/ + - link "Profiling with Ctrl-C (2024)" [ref=e411] [cursor=pointer]: + - /url: https://yosefk.com/blog/profiling-with-ctrl-c.html - generic [ref=e412]: - text: ( - - link "kroah.com" [ref=e413] [cursor=pointer]: - - /url: from?site=kroah.com + - link "yosefk.com" [ref=e413] [cursor=pointer]: + - /url: from?site=yosefk.com - text: ) - - row "126 points by chmaynard 16 hours ago | hide | 56 comments" [ref=e414]: + - row "9 points by hun3 3 hours ago | hide | discuss" [ref=e414]: - cell [ref=e415] - - cell "126 points by chmaynard 16 hours ago | hide | 56 comments" [ref=e416]: + - cell "9 points by hun3 3 hours ago | hide | discuss" [ref=e416]: - generic [ref=e417]: - - text: 126 points by - - link "chmaynard" [ref=e418] [cursor=pointer]: - - /url: user?id=chmaynard - - generic "2026-01-02T21:31:34 1767389494" [ref=e419]: - - link "16 hours ago" [ref=e420] [cursor=pointer]: - - /url: item?id=46469623 + - text: 9 points by + - link "hun3" [ref=e418] [cursor=pointer]: + - /url: user?id=hun3 + - generic "2026-01-03T11:13:48 1767438828" [ref=e419]: + - link "3 hours ago" [ref=e420] [cursor=pointer]: + - /url: item?id=46475296 - text: "|" - link "hide" [ref=e421] [cursor=pointer]: - - /url: hide?id=46469623&goto=news + - /url: hide?id=46475296&goto=news - text: "|" - - link "56 comments" [ref=e422] [cursor=pointer]: - - /url: item?id=46469623 + - link "discuss" [ref=e422] [cursor=pointer]: + - /url: item?id=46475296 - row [ref=e423] - row "20. upvote UK company sends factory with 1,000C furnace into space (bbc.co.uk)" [ref=e424]: - cell "20." [ref=e425] @@ -649,21 +649,21 @@ - link "bbc.co.uk" [ref=e434] [cursor=pointer]: - /url: from?site=bbc.co.uk - text: ) - - row "76 points by vekerdyb 12 hours ago | hide | 32 comments" [ref=e435]: + - row "77 points by vekerdyb 13 hours ago | hide | 33 comments" [ref=e435]: - cell [ref=e436] - - cell "76 points by vekerdyb 12 hours ago | hide | 32 comments" [ref=e437]: + - cell "77 points by vekerdyb 13 hours ago | hide | 33 comments" [ref=e437]: - generic [ref=e438]: - - text: 76 points by + - text: 77 points by - link "vekerdyb" [ref=e439] [cursor=pointer]: - /url: user?id=vekerdyb - generic "2025-12-31T08:04:30 1767168270" [ref=e440]: - - link "12 hours ago" [ref=e441] [cursor=pointer]: + - link "13 hours ago" [ref=e441] [cursor=pointer]: - /url: item?id=46442293 - text: "|" - link "hide" [ref=e442] [cursor=pointer]: - /url: hide?id=46442293&goto=news - text: "|" - - link "32 comments" [ref=e443] [cursor=pointer]: + - link "33 comments" [ref=e443] [cursor=pointer]: - /url: item?id=46442293 - row [ref=e444] - row "21. upvote Jank Lang Hit Alpha (github.com/jank-lang)" [ref=e445]: @@ -681,15 +681,15 @@ - link "github.com/jank-lang" [ref=e455] [cursor=pointer]: - /url: from?site=github.com/jank-lang - text: ) - - row "195 points by makemethrowaway 18 hours ago | hide | 27 comments" [ref=e456]: + - row "198 points by makemethrowaway 19 hours ago | hide | 27 comments" [ref=e456]: - cell [ref=e457] - - cell "195 points by makemethrowaway 18 hours ago | hide | 27 comments" [ref=e458]: + - cell "198 points by makemethrowaway 19 hours ago | hide | 27 comments" [ref=e458]: - generic [ref=e459]: - - text: 195 points by + - text: 198 points by - link "makemethrowaway" [ref=e460] [cursor=pointer]: - /url: user?id=makemethrowaway - generic "2026-01-02T19:39:38 1767382778" [ref=e461]: - - link "18 hours ago" [ref=e462] [cursor=pointer]: + - link "19 hours ago" [ref=e462] [cursor=pointer]: - /url: item?id=46468517 - text: "|" - link "hide" [ref=e463] [cursor=pointer]: @@ -713,15 +713,15 @@ - link "thephd.dev" [ref=e476] [cursor=pointer]: - /url: from?site=thephd.dev - text: ) - - row "50 points by ingve 11 hours ago | hide | 22 comments" [ref=e477]: + - row "50 points by ingve 12 hours ago | hide | 22 comments" [ref=e477]: - cell [ref=e478] - - cell "50 points by ingve 11 hours ago | hide | 22 comments" [ref=e479]: + - cell "50 points by ingve 12 hours ago | hide | 22 comments" [ref=e479]: - generic [ref=e480]: - text: 50 points by - link "ingve" [ref=e481] [cursor=pointer]: - /url: user?id=ingve - generic "2025-12-31T07:44:25 1767167065" [ref=e482]: - - link "11 hours ago" [ref=e483] [cursor=pointer]: + - link "12 hours ago" [ref=e483] [cursor=pointer]: - /url: item?id=46442229 - text: "|" - link "hide" [ref=e484] [cursor=pointer]: @@ -745,11 +745,11 @@ - link "github.com/lyehe" [ref=e497] [cursor=pointer]: - /url: from?site=github.com/lyehe - text: ) - - row "43 points by yxl448 10 hours ago | hide | 10 comments" [ref=e498]: + - row "44 points by yxl448 10 hours ago | hide | 11 comments" [ref=e498]: - cell [ref=e499] - - cell "43 points by yxl448 10 hours ago | hide | 10 comments" [ref=e500]: + - cell "44 points by yxl448 10 hours ago | hide | 11 comments" [ref=e500]: - generic [ref=e501]: - - text: 43 points by + - text: 44 points by - link "yxl448" [ref=e502] [cursor=pointer]: - /url: user?id=yxl448 - generic "2026-01-03T04:22:29 1767414149" [ref=e503]: @@ -759,7 +759,7 @@ - link "hide" [ref=e505] [cursor=pointer]: - /url: hide?id=46472772&goto=news - text: "|" - - link "10 comments" [ref=e506] [cursor=pointer]: + - link "11 comments" [ref=e506] [cursor=pointer]: - /url: item?id=46472772 - row [ref=e507] - row "24. upvote Adventure 751 (1980) (bluerenga.blog)" [ref=e508]: @@ -777,15 +777,15 @@ - link "bluerenga.blog" [ref=e518] [cursor=pointer]: - /url: from?site=bluerenga.blog - text: ) - - row "37 points by quuxplusone 11 hours ago | hide | 3 comments" [ref=e519]: + - row "37 points by quuxplusone 12 hours ago | hide | 3 comments" [ref=e519]: - cell [ref=e520] - - cell "37 points by quuxplusone 11 hours ago | hide | 3 comments" [ref=e521]: + - cell "37 points by quuxplusone 12 hours ago | hide | 3 comments" [ref=e521]: - generic [ref=e522]: - text: 37 points by - link "quuxplusone" [ref=e523] [cursor=pointer]: - /url: user?id=quuxplusone - generic "2026-01-03T02:38:06 1767407886" [ref=e524]: - - link "11 hours ago" [ref=e525] [cursor=pointer]: + - link "12 hours ago" [ref=e525] [cursor=pointer]: - /url: item?id=46472230 - text: "|" - link "hide" [ref=e526] [cursor=pointer]: @@ -809,11 +809,11 @@ - link "unixv4.dev" [ref=e539] [cursor=pointer]: - /url: from?site=unixv4.dev - text: ) - - row "155 points by pjmlp 19 hours ago | hide | 76 comments" [ref=e540]: + - row "156 points by pjmlp 19 hours ago | hide | 75 comments" [ref=e540]: - cell [ref=e541] - - cell "155 points by pjmlp 19 hours ago | hide | 76 comments" [ref=e542]: + - cell "156 points by pjmlp 19 hours ago | hide | 75 comments" [ref=e542]: - generic [ref=e543]: - - text: 155 points by + - text: 156 points by - link "pjmlp" [ref=e544] [cursor=pointer]: - /url: user?id=pjmlp - generic "2026-01-02T19:18:36 1767381516" [ref=e545]: @@ -823,66 +823,66 @@ - link "hide" [ref=e547] [cursor=pointer]: - /url: hide?id=46468283&goto=news - text: "|" - - link "76 comments" [ref=e548] [cursor=pointer]: + - link "75 comments" [ref=e548] [cursor=pointer]: - /url: item?id=46468283 - row [ref=e549] - - 'row "26. upvote Fighting Fire with Fire: Scalable Oral Exams (behind-the-enemy-lines.com)" [ref=e550]': + - 'row "26. upvote Ask HN: Who wants to be hired? (January 2026)" [ref=e550]': - cell "26." [ref=e551] - cell "upvote" [ref=e552]: - link "upvote" [ref=e554] [cursor=pointer]: - - /url: vote?id=46467677&how=up&goto=news - - generic "upvote" [ref=e555] - - 'cell "Fighting Fire with Fire: Scalable Oral Exams (behind-the-enemy-lines.com)" [ref=e556]': - - generic [ref=e557]: - - 'link "Fighting Fire with Fire: Scalable Oral Exams" [ref=e558] [cursor=pointer]': - - /url: https://www.behind-the-enemy-lines.com/2025/12/fighting-fire-with-fire-scalable-oral.html - - generic [ref=e559]: - - text: ( - - link "behind-the-enemy-lines.com" [ref=e560] [cursor=pointer]: - - /url: from?site=behind-the-enemy-lines.com - - text: ) - - row "177 points by sethbannon 20 hours ago | hide | 233 comments" [ref=e561]: - - cell [ref=e562] - - cell "177 points by sethbannon 20 hours ago | hide | 233 comments" [ref=e563]: - - generic [ref=e564]: - - text: 177 points by - - link "sethbannon" [ref=e565] [cursor=pointer]: - - /url: user?id=sethbannon - - generic "2026-01-02T18:18:47 1767377927" [ref=e566]: - - link "20 hours ago" [ref=e567] [cursor=pointer]: - - /url: item?id=46467677 - - text: "|" - - link "hide" [ref=e568] [cursor=pointer]: - - /url: hide?id=46467677&goto=news - - text: "|" - - link "233 comments" [ref=e569] [cursor=pointer]: - - /url: item?id=46467677 - - row [ref=e570] - - 'row "27. upvote Ask HN: Who wants to be hired? (January 2026)" [ref=e571]': - - cell "27." [ref=e572] - - cell "upvote" [ref=e573]: - - link "upvote" [ref=e575] [cursor=pointer]: - /url: vote?id=46466073&how=up&goto=news - - generic "upvote" [ref=e576] - - 'cell "Ask HN: Who wants to be hired? (January 2026)" [ref=e577]': - - 'link "Ask HN: Who wants to be hired? (January 2026)" [ref=e579] [cursor=pointer]': + - generic "upvote" [ref=e555] + - 'cell "Ask HN: Who wants to be hired? (January 2026)" [ref=e556]': + - 'link "Ask HN: Who wants to be hired? (January 2026)" [ref=e558] [cursor=pointer]': - /url: item?id=46466073 - - row "125 points by whoishiring 22 hours ago | hide | 231 comments" [ref=e580]: - - cell [ref=e581] - - cell "125 points by whoishiring 22 hours ago | hide | 231 comments" [ref=e582]: - - generic [ref=e583]: - - text: 125 points by - - link "whoishiring" [ref=e584] [cursor=pointer]: + - row "126 points by whoishiring 22 hours ago | hide | 234 comments" [ref=e559]: + - cell [ref=e560] + - cell "126 points by whoishiring 22 hours ago | hide | 234 comments" [ref=e561]: + - generic [ref=e562]: + - text: 126 points by + - link "whoishiring" [ref=e563] [cursor=pointer]: - /url: user?id=whoishiring - - generic "2026-01-02T16:00:42 1767369642" [ref=e585]: - - link "22 hours ago" [ref=e586] [cursor=pointer]: + - generic "2026-01-02T16:00:42 1767369642" [ref=e564]: + - link "22 hours ago" [ref=e565] [cursor=pointer]: - /url: item?id=46466073 - text: "|" - - link "hide" [ref=e587] [cursor=pointer]: + - link "hide" [ref=e566] [cursor=pointer]: - /url: hide?id=46466073&goto=news - text: "|" - - link "231 comments" [ref=e588] [cursor=pointer]: + - link "234 comments" [ref=e567] [cursor=pointer]: - /url: item?id=46466073 + - row [ref=e568] + - 'row "27. upvote Fighting Fire with Fire: Scalable Oral Exams (behind-the-enemy-lines.com)" [ref=e569]': + - cell "27." [ref=e570] + - cell "upvote" [ref=e571]: + - link "upvote" [ref=e573] [cursor=pointer]: + - /url: vote?id=46467677&how=up&goto=news + - generic "upvote" [ref=e574] + - 'cell "Fighting Fire with Fire: Scalable Oral Exams (behind-the-enemy-lines.com)" [ref=e575]': + - generic [ref=e576]: + - 'link "Fighting Fire with Fire: Scalable Oral Exams" [ref=e577] [cursor=pointer]': + - /url: https://www.behind-the-enemy-lines.com/2025/12/fighting-fire-with-fire-scalable-oral.html + - generic [ref=e578]: + - text: ( + - link "behind-the-enemy-lines.com" [ref=e579] [cursor=pointer]: + - /url: from?site=behind-the-enemy-lines.com + - text: ) + - row "177 points by sethbannon 20 hours ago | hide | 234 comments" [ref=e580]: + - cell [ref=e581] + - cell "177 points by sethbannon 20 hours ago | hide | 234 comments" [ref=e582]: + - generic [ref=e583]: + - text: 177 points by + - link "sethbannon" [ref=e584] [cursor=pointer]: + - /url: user?id=sethbannon + - generic "2026-01-02T18:18:47 1767377927" [ref=e585]: + - link "20 hours ago" [ref=e586] [cursor=pointer]: + - /url: item?id=46467677 + - text: "|" + - link "hide" [ref=e587] [cursor=pointer]: + - /url: hide?id=46467677&goto=news + - text: "|" + - link "234 comments" [ref=e588] [cursor=pointer]: + - /url: item?id=46467677 - row [ref=e589] - row "28. upvote Accounting for Computer Scientists (2011) (kleppmann.com)" [ref=e590]: - cell "28." [ref=e591] @@ -899,11 +899,11 @@ - link "kleppmann.com" [ref=e600] [cursor=pointer]: - /url: from?site=kleppmann.com - text: ) - - row "128 points by tosh 19 hours ago | hide | 49 comments" [ref=e601]: + - row "130 points by tosh 19 hours ago | hide | 50 comments" [ref=e601]: - cell [ref=e602] - - cell "128 points by tosh 19 hours ago | hide | 49 comments" [ref=e603]: + - cell "130 points by tosh 19 hours ago | hide | 50 comments" [ref=e603]: - generic [ref=e604]: - - text: 128 points by + - text: 130 points by - link "tosh" [ref=e605] [cursor=pointer]: - /url: user?id=tosh - generic "2026-01-02T18:16:07 1767377767" [ref=e606]: @@ -913,7 +913,7 @@ - link "hide" [ref=e608] [cursor=pointer]: - /url: hide?id=46467651&goto=news - text: "|" - - link "49 comments" [ref=e609] [cursor=pointer]: + - link "50 comments" [ref=e609] [cursor=pointer]: - /url: item?id=46467651 - row [ref=e610] - row "29. upvote The rsync algorithm (1996) [pdf] (cmu.edu)" [ref=e611]: @@ -931,11 +931,11 @@ - link "cmu.edu" [ref=e621] [cursor=pointer]: - /url: from?site=cmu.edu - text: ) - - row "160 points by vortex_ape 21 hours ago | hide | 23 comments" [ref=e622]: + - row "162 points by vortex_ape 21 hours ago | hide | 23 comments" [ref=e622]: - cell [ref=e623] - - cell "160 points by vortex_ape 21 hours ago | hide | 23 comments" [ref=e624]: + - cell "162 points by vortex_ape 21 hours ago | hide | 23 comments" [ref=e624]: - generic [ref=e625]: - - text: 160 points by + - text: 162 points by - link "vortex_ape" [ref=e626] [cursor=pointer]: - /url: user?id=vortex_ape - generic "2026-01-02T16:56:19 1767372979" [ref=e627]: @@ -963,15 +963,15 @@ - link "phys.org" [ref=e642] [cursor=pointer]: - /url: from?site=phys.org - text: ) - - row "40 points by wglb 12 hours ago | hide | 9 comments" [ref=e643]: + - row "40 points by wglb 13 hours ago | hide | 9 comments" [ref=e643]: - cell [ref=e644] - - cell "40 points by wglb 12 hours ago | hide | 9 comments" [ref=e645]: + - cell "40 points by wglb 13 hours ago | hide | 9 comments" [ref=e645]: - generic [ref=e646]: - text: 40 points by - link "wglb" [ref=e647] [cursor=pointer]: - /url: user?id=wglb - generic "2026-01-03T01:29:09 1767403749" [ref=e648]: - - link "12 hours ago" [ref=e649] [cursor=pointer]: + - link "13 hours ago" [ref=e649] [cursor=pointer]: - /url: item?id=46471784 - text: "|" - link "hide" [ref=e650] [cursor=pointer]: diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aa1c2eb..d84bfd2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -73,6 +73,9 @@ importers: chalk: specifier: ^5.6.2 version: 5.6.2 + colord: + specifier: ^2.9.3 + version: 2.9.3 devtools-protocol: specifier: ^0.0.1543509 version: 0.0.1543509 @@ -227,7 +230,7 @@ importers: version: 6.0.3(typescript@5.9.3)(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)) vitest: specifier: ^4.0.16 - version: 4.0.16(@opentelemetry/api@1.9.0)(@types/node@25.0.3)(@vitest/ui@4.0.8)(jiti@2.6.1)(jsdom@27.2.0(bufferutil@4.0.9))(lightningcss@1.30.2)(tsx@4.20.6) + version: 4.0.16(@opentelemetry/api@1.9.0)(@types/node@25.0.3)(@vitest/ui@4.0.8(vitest@4.0.8))(jiti@2.6.1)(jsdom@27.2.0(bufferutil@4.0.9))(lightningcss@1.30.2)(tsx@4.20.6) packages: @@ -2605,6 +2608,9 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} @@ -7221,6 +7227,14 @@ snapshots: optionalDependencies: vite: 7.3.0(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6) + '@vitest/mocker@4.0.8(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6))': + dependencies: + '@vitest/spy': 4.0.8 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6) + '@vitest/mocker@4.0.8(vite@7.2.2(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6))': dependencies: '@vitest/spy': 4.0.8 @@ -7272,7 +7286,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vitest: 4.0.8(@types/node@25.0.3)(@vitest/ui@4.0.8)(jiti@2.6.1)(jsdom@27.2.0(bufferutil@4.0.9))(lightningcss@1.30.2)(tsx@4.20.6) + vitest: 4.0.8(@types/node@24.10.1)(@vitest/ui@4.0.8)(jiti@2.6.1)(jsdom@27.2.0(bufferutil@4.0.9))(lightningcss@1.30.2)(tsx@4.20.6) '@vitest/utils@4.0.16': dependencies: @@ -7650,6 +7664,8 @@ snapshots: color-name@1.1.4: {} + colord@2.9.3: {} + colorette@2.0.20: {} combined-stream@1.0.8: @@ -9890,7 +9906,7 @@ snapshots: lightningcss: 1.30.2 tsx: 4.20.6 - vitest@4.0.16(@opentelemetry/api@1.9.0)(@types/node@25.0.3)(@vitest/ui@4.0.8)(jiti@2.6.1)(jsdom@27.2.0(bufferutil@4.0.9))(lightningcss@1.30.2)(tsx@4.20.6): + vitest@4.0.16(@opentelemetry/api@1.9.0)(@types/node@25.0.3)(@vitest/ui@4.0.8(vitest@4.0.8))(jiti@2.6.1)(jsdom@27.2.0(bufferutil@4.0.9))(lightningcss@1.30.2)(tsx@4.20.6): dependencies: '@vitest/expect': 4.0.16 '@vitest/mocker': 4.0.16(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)) @@ -9933,7 +9949,7 @@ snapshots: vitest@4.0.8(@types/node@24.10.1)(@vitest/ui@4.0.8)(jiti@2.6.1)(jsdom@27.2.0(bufferutil@4.0.9))(lightningcss@1.30.2)(tsx@4.20.6): dependencies: '@vitest/expect': 4.0.8 - '@vitest/mocker': 4.0.8(vite@7.2.2(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)) + '@vitest/mocker': 4.0.8(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)) '@vitest/pretty-format': 4.0.8 '@vitest/runner': 4.0.8 '@vitest/snapshot': 4.0.8