Files
ycode/scripts/assessment-ycode-capture.mjs
T

43 lines
3.2 KiB
JavaScript

// 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()
}