chore: establish YCode replication baseline and TODO
This commit is contained in:
commit
6dc59f89ba
1118 files changed
+196002
No files matched your search
@@ -0,0 +1,42 @@
|
||||
// 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()
|
||||
}
|
||||
Reference in new issue
Block a user