feat: align conversation state, composer and scoped approvals
This commit is contained in:
1 parent
771ca540f7
commit
308b98df23
61 files changed
+1701
-292
No files matched your search
@@ -22,17 +22,17 @@ if (!process.versions.electron) {
|
||||
const env = { ...process.env, YCODE_QA_DIRECTORY: directory, YCODE_USER_DATA_DIR: data, YCODE_DISABLE_GPU: '1', YCODE_QA_OFFSCREEN: '1' }
|
||||
delete env.ELECTRON_RUN_AS_NODE; delete env.ELECTRON_RENDERER_URL
|
||||
const child = require('node:child_process').spawn(require('electron'),
|
||||
['--no-sandbox', '--disable-gpu-sandbox', __filename], { env, windowsHide: true, stdio: ['ignore', 'pipe', 'pipe'] })
|
||||
[__filename], { env, windowsHide: true, stdio: ['ignore', 'pipe', 'pipe'] })
|
||||
let output = ''
|
||||
child.stdout.on('data', bytes => { output += bytes; if (bytes.toString().includes('TASK_MENU_')) process.stdout.write(bytes) })
|
||||
child.stderr.on('data', bytes => { output += bytes })
|
||||
const timer = setTimeout(() => child.kill(), 150000)
|
||||
child.once('exit', async code => {
|
||||
child.once('exit', async (code, signal) => {
|
||||
clearTimeout(timer)
|
||||
await fs.writeFile(path.join(directory, 'process.log'), output)
|
||||
console.log(JSON.stringify({ directory, exitCode: code }))
|
||||
if (code) console.error(output)
|
||||
process.exitCode = code ? 1 : 0
|
||||
console.log(JSON.stringify({ directory, exitCode: code, signal }))
|
||||
if (code !== 0) console.error(output)
|
||||
process.exitCode = code === 0 ? 0 : 1
|
||||
})
|
||||
})()
|
||||
} else {
|
||||
@@ -163,22 +163,22 @@ if (!process.versions.electron) {
|
||||
await step('archive-confirm')
|
||||
await read(openMenu); await wait(menuSource, 'menu for archive')
|
||||
await read(clickItemByLabel('归档'))
|
||||
await wait(`!!document.querySelector('.task-confirm-dialog[data-task-confirm-kind="archive"]')`, 'archive confirmation')
|
||||
const archiveConfirm = await read(`(()=>{const dialog=document.querySelector('.task-confirm-dialog');const box=node=>{const r=node.getBoundingClientRect();return [r.x,r.y,r.width,r.height]};const style=getComputedStyle(dialog);return {box:box(dialog),title:dialog.querySelector('.wb-modal__title')?.textContent,desc:dialog.querySelector('.task-confirm-dialog__description')?.textContent,cancel:dialog.querySelector('.task-confirm-dialog__cancel')?.textContent,confirm:dialog.querySelector('.task-confirm-dialog__confirm')?.textContent,padding:style.padding,borderRadius:style.borderRadius}})()`)
|
||||
await wait(`!!document.querySelector('.task-popconfirm [data-task-confirm-kind="archive"]')`, 'archive confirmation')
|
||||
const archiveConfirm = await read(`(()=>{const dialog=document.querySelector('.task-popconfirm');const box=node=>{const r=node.getBoundingClientRect();return [r.x,r.y,r.width,r.height]};const style=getComputedStyle(dialog);return {box:box(dialog),title:dialog.querySelector('.task-popconfirm__title')?.textContent,desc:dialog.querySelector('.task-popconfirm__description')?.textContent,cancel:dialog.querySelector('.task-popconfirm__cancel')?.textContent,confirm:dialog.querySelector('.task-popconfirm__confirm')?.textContent,padding:style.padding,borderRadius:style.borderRadius}})()`)
|
||||
check('archive opens a confirmation before changing the task', archiveConfirm.title, '归档任务')
|
||||
check('archive confirmation points to the in-product archive entry', archiveConfirm.desc, '确认将该任务归档吗?归档后可在侧栏「已归档」中查看并恢复。')
|
||||
check('archive confirmation does not reintroduce removed data management', archiveConfirm.desc.includes('数据管理'), false)
|
||||
check('archive restores the documented original destination', archiveConfirm.desc, '确认将该任务归档吗?归档后可在“系统设置-数据管理”中查看。')
|
||||
check('archive explains the unavailable destination and working fallback', await read(`document.querySelector('.task-popconfirm__compatibility').textContent.includes('侧栏“已归档”')`), true)
|
||||
check('archive confirmation actions use the recovered labels', [archiveConfirm.cancel, archiveConfirm.confirm], ['取消', '确认归档'])
|
||||
check('archive confirmation uses the recovered 480px shell', [Math.round(archiveConfirm.box[2]), archiveConfirm.padding, archiveConfirm.borderRadius], [480, '24px', '24px'])
|
||||
check('archive confirmation uses the plan-defined 240px popconfirm', [Math.round(archiveConfirm.box[2]), archiveConfirm.padding, archiveConfirm.borderRadius], [240, '16px', '12px'])
|
||||
await shot('archive-confirm')
|
||||
await read(`document.querySelector('.task-confirm-dialog__cancel').click()`)
|
||||
await wait(`!document.querySelector('.task-confirm-dialog')`, 'archive cancellation closes')
|
||||
await read(`document.querySelector('.task-popconfirm__cancel').click()`)
|
||||
await wait(`!document.querySelector('.task-popconfirm')`, 'archive cancellation closes')
|
||||
check('cancelling archive keeps the task visible', await read(`document.querySelectorAll('[data-session-id]').length`), 2)
|
||||
|
||||
await read(openMenu); await wait(menuSource, 'menu for archive confirm')
|
||||
await read(clickItemByLabel('归档'))
|
||||
await wait(`!!document.querySelector('.task-confirm-dialog__confirm')`, 'archive confirmation confirm')
|
||||
await read(`document.querySelector('.task-confirm-dialog__confirm').click()`)
|
||||
await wait(`!!document.querySelector('.task-popconfirm__confirm')`, 'archive confirmation confirm')
|
||||
await read(`document.querySelector('.task-popconfirm__confirm').click()`)
|
||||
await wait(`document.querySelectorAll('[data-session-id]').length===1`, 'archive completes after confirmation')
|
||||
const visibleAfterArchive = await read(`document.querySelectorAll('[data-session-id]').length`)
|
||||
check('archive hides exactly one row', visibleAfterArchive, 1)
|
||||
@@ -189,14 +189,14 @@ if (!process.versions.electron) {
|
||||
const remainingId = await read(`window.ycode.session.list().then(list=>list[0].id)`)
|
||||
await read(openMenu); await wait(menuSource, 'menu for delete')
|
||||
await read(clickItemByLabel('删除任务'))
|
||||
await wait(`!!document.querySelector('.task-confirm-dialog[data-task-confirm-kind="delete"]')`, 'delete confirmation')
|
||||
const deleteConfirm = await read(`(()=>{const dialog=document.querySelector('.task-confirm-dialog');return {title:dialog.querySelector('.wb-modal__title')?.textContent,desc:dialog.querySelector('.task-confirm-dialog__description')?.textContent,cancel:dialog.querySelector('.task-confirm-dialog__cancel')?.textContent,confirm:dialog.querySelector('.task-confirm-dialog__confirm')?.textContent,running:dialog.getAttribute('data-task-confirm-running')}})()`)
|
||||
await wait(`!!document.querySelector('.task-popconfirm [data-task-confirm-kind="delete"]')`, 'delete confirmation')
|
||||
const deleteConfirm = await read(`(()=>{const dialog=document.querySelector('.task-popconfirm');return {title:dialog.querySelector('.task-popconfirm__title')?.textContent,desc:dialog.querySelector('.task-popconfirm__description')?.textContent,cancel:dialog.querySelector('.task-popconfirm__cancel')?.textContent,confirm:dialog.querySelector('.task-popconfirm__confirm')?.textContent,running:dialog.querySelector('[data-task-confirm-kind]').getAttribute('data-task-confirm-running')}})()`)
|
||||
check('delete uses the idle confirmation title', deleteConfirm.title, '删除任务?')
|
||||
check('delete uses the idle confirmation description', deleteConfirm.desc, '删除后,这些任务将从你的所有设备中移除,且无法恢复。')
|
||||
check('delete confirmation actions use the recovered idle labels', [deleteConfirm.cancel, deleteConfirm.confirm], ['取消', '确认'])
|
||||
check('idle delete is not marked as running', deleteConfirm.running, null)
|
||||
await shot('delete-confirm')
|
||||
await read(`document.querySelector('.task-confirm-dialog__confirm').click()`)
|
||||
await read(`document.querySelector('.task-popconfirm__confirm').click()`)
|
||||
await wait(`window.ycode.session.listArchived().then(list=>!list.some(item=>item.id===${JSON.stringify(remainingId)}))`, 'delete completes after confirmation')
|
||||
check('delete removes that session from the store', await read(`window.ycode.session.listArchived().then(list=>list.some(item=>item.id===${JSON.stringify(remainingId)}))`), false)
|
||||
check('delete leaves only the archived session', await read(`window.ycode.session.listArchived().then(list=>list.length)`), 1)
|
||||
|
||||
Reference in new issue
Block a user