// Assessment captures of the user-owned YCode app; WorkBuddy is observed separately through REA. import fs from 'node:fs/promises' const targets = await (await fetch('http://127.0.0.1:9237/json/list')).json() const socket = new WebSocket(targets.find(target => target.type === 'page').webSocketDebuggerUrl) await new Promise(resolve => { socket.onopen = resolve }) let seq = 0 const pending = new Map() socket.onmessage = event => { const response = JSON.parse(event.data) const pair = pending.get(response.id) if (pair) { pending.delete(response.id); response.error ? pair.reject(response.error) : pair.resolve(response.result) } } const send = (method, params = {}) => new Promise((resolve, reject) => { const id = ++seq; pending.set(id, { resolve, reject }); socket.send(JSON.stringify({ id, method, params })) }) const evaluate = async expression => (await send('Runtime.evaluate', { expression, returnByValue: true, awaitPromise: true })).result.value await fs.mkdir('.tmp/assessment-ycode', { recursive: true }) try { await send('Emulation.setDeviceMetricsOverride', { width: 1336, height: 901, deviceScaleFactor: 1, mobile: false }) const wasOpen = await evaluate('!!document.querySelector(".right-sidebar")') for (const open of [false, true]) { await evaluate(`(()=>{const button=document.querySelector('.chat-head button[title="${open ? '展开右侧栏' : '收起右侧栏'}"]');button?.click()})()`) await evaluate('new Promise(resolve=>setTimeout(resolve,400))') const state = await evaluate(`(()=>{ const selectors=['.app-shell','.sidebar','.chat-pane','.chat-head','.chat-messages','.right-sidebar','.right-panel__top','.wb-composer','.cr-agent__content','.cr-text-block','.msg__status','.cr-collapse--completed']; return{viewport:{width:innerWidth,height:innerHeight},panelsOpen:!!document.querySelector('.right-sidebar'), title:document.querySelector('.chat-head__title')?.textContent, nodes:selectors.map(selector=>({selector,items:[...document.querySelectorAll(selector)].map(node=>{const rect=node.getBoundingClientRect(),style=getComputedStyle(node);return{bounds:[rect.x,rect.y,rect.width,rect.height],fontSize:style.fontSize,lineHeight:style.lineHeight,padding:style.padding,gap:style.gap,text:selector==='.msg__status'?node.textContent:undefined}})})), toolCount:document.querySelectorAll('[data-tool-call-id]').length, renderedMessages:{users:document.querySelectorAll('.msg--user').length,assistants:document.querySelectorAll('.msg--assistant').length}} })()`) const name = open ? 'panel-open' : 'panel-closed' const screenshot = await send('Page.captureScreenshot', { format: 'png', fromSurface: true }) await fs.writeFile(`.tmp/assessment-ycode/${name}.png`, Buffer.from(screenshot.data, 'base64')) await fs.writeFile(`.tmp/assessment-ycode/${name}.json`, JSON.stringify(state, null, 2)) console.log(JSON.stringify({ name, viewport: state.viewport, title: state.title, toolCount: state.toolCount })) } await evaluate(`document.querySelector('.chat-head button[title="${wasOpen ? '展开右侧栏' : '收起右侧栏'}"]')?.click()`) } finally { await send('Emulation.clearDeviceMetricsOverride') socket.close() }