From bac89daf877a272623785d40557f292920dd7aad Mon Sep 17 00:00:00 2001 From: "xiaohan.yuan" Date: Wed, 21 Oct 2026 13:46:57 +0800 Subject: [PATCH 1/2] docs(acceptance): record B01 follow-up and B02 Windows verification --- docs/协作/B01-验收-02.md | 55 ++ docs/协作/B02-验收-01.md | 75 ++ .../协作/evidence/B01-review-02/alignment.txt | 25 + .../evidence/B01-review-02/archive-light.png | Bin 0 -> 67009 bytes docs/协作/evidence/B01-review-02/build.txt | 660 ++++++++++++++ .../evidence/B01-review-02/delete-dark.png | Bin 0 -> 66909 bytes .../evidence/B01-review-02/menu-report.json | 769 +++++++++++++++++ .../B01-review-02/mode-ask-dark-focus.png | Bin 0 -> 5418 bytes .../B01-review-02/mode-cjs-runner.cjs | 45 + .../B01-review-02/mode-cjs-runner.txt | 2 + .../B01-review-02/mode-host-probe.cjs | 84 ++ .../B01-review-02/mode-host-report.json | 35 + .../B01-review-02/mode-plan-focus.png | Bin 0 -> 3418 bytes .../evidence/B01-review-02/mode-report.json | 368 ++++++++ .../B01-review-02/original-mode-runner.txt | 2 + .../popconfirm-browser-report.json | 817 ++++++++++++++++++ .../B01-review-02/popconfirm-cjs-runner.cjs | 44 + .../B01-review-02/question-report.json | 362 ++++++++ .../evidence/B01-review-02/regressions.json | 27 + .../B01-review-02/typed-part-repro.mjs | 96 ++ .../B01-review-02/typed-part-result.json | 105 +++ .../协作/evidence/B02-review-01/alignment.txt | 25 + docs/协作/evidence/B02-review-01/build.txt | 660 ++++++++++++++ .../evidence/B02-review-01/dom-report.json | 70 ++ docs/协作/evidence/B02-review-01/dom.txt | 5 + .../evidence/B02-review-01/hover-control.json | 6 + .../B02-review-01/hover-diagnostics.json | 36 + .../B02-review-01/installed-dark-hover.png | Bin 0 -> 37052 bytes .../B02-review-01/installed-light.png | Bin 0 -> 37691 bytes .../B02-review-01/installed-narrow.png | Bin 0 -> 36050 bytes .../evidence/B02-review-01/native-report.json | 453 ++++++++++ .../B02-review-01/original-ui-runner.txt | 17 + .../B02-review-01/pointer-ui-probe.mjs | 417 +++++++++ .../B02-review-01/pointer-ui-runner.txt | 14 + .../B02-review-01/recommended-backend.txt | 7 + .../evidence/B02-review-01/test-results.json | 22 + .../evidence/B02-review-01/token-check.txt | 29 + 37 files changed, 5332 insertions(+) create mode 100644 docs/协作/B01-验收-02.md create mode 100644 docs/协作/B02-验收-01.md create mode 100644 docs/协作/evidence/B01-review-02/alignment.txt create mode 100644 docs/协作/evidence/B01-review-02/archive-light.png create mode 100644 docs/协作/evidence/B01-review-02/build.txt create mode 100644 docs/协作/evidence/B01-review-02/delete-dark.png create mode 100644 docs/协作/evidence/B01-review-02/menu-report.json create mode 100644 docs/协作/evidence/B01-review-02/mode-ask-dark-focus.png create mode 100644 docs/协作/evidence/B01-review-02/mode-cjs-runner.cjs create mode 100644 docs/协作/evidence/B01-review-02/mode-cjs-runner.txt create mode 100644 docs/协作/evidence/B01-review-02/mode-host-probe.cjs create mode 100644 docs/协作/evidence/B01-review-02/mode-host-report.json create mode 100644 docs/协作/evidence/B01-review-02/mode-plan-focus.png create mode 100644 docs/协作/evidence/B01-review-02/mode-report.json create mode 100644 docs/协作/evidence/B01-review-02/original-mode-runner.txt create mode 100644 docs/协作/evidence/B01-review-02/popconfirm-browser-report.json create mode 100644 docs/协作/evidence/B01-review-02/popconfirm-cjs-runner.cjs create mode 100644 docs/协作/evidence/B01-review-02/question-report.json create mode 100644 docs/协作/evidence/B01-review-02/regressions.json create mode 100644 docs/协作/evidence/B01-review-02/typed-part-repro.mjs create mode 100644 docs/协作/evidence/B01-review-02/typed-part-result.json create mode 100644 docs/协作/evidence/B02-review-01/alignment.txt create mode 100644 docs/协作/evidence/B02-review-01/build.txt create mode 100644 docs/协作/evidence/B02-review-01/dom-report.json create mode 100644 docs/协作/evidence/B02-review-01/dom.txt create mode 100644 docs/协作/evidence/B02-review-01/hover-control.json create mode 100644 docs/协作/evidence/B02-review-01/hover-diagnostics.json create mode 100644 docs/协作/evidence/B02-review-01/installed-dark-hover.png create mode 100644 docs/协作/evidence/B02-review-01/installed-light.png create mode 100644 docs/协作/evidence/B02-review-01/installed-narrow.png create mode 100644 docs/协作/evidence/B02-review-01/native-report.json create mode 100644 docs/协作/evidence/B02-review-01/original-ui-runner.txt create mode 100644 docs/协作/evidence/B02-review-01/pointer-ui-probe.mjs create mode 100644 docs/协作/evidence/B02-review-01/pointer-ui-runner.txt create mode 100644 docs/协作/evidence/B02-review-01/recommended-backend.txt create mode 100644 docs/协作/evidence/B02-review-01/test-results.json create mode 100644 docs/协作/evidence/B02-review-01/token-check.txt diff --git a/docs/协作/B01-验收-02.md b/docs/协作/B01-验收-02.md new file mode 100644 index 0000000..a1cdd88 --- /dev/null +++ b/docs/协作/B01-验收-02.md @@ -0,0 +1,55 @@ +# B01 验收 02:F01 与模式、确认弹窗 + +日期:2026-10-21(Asia/Shanghai)。对应 [交付 02](B01-交付-02.md),固定受测代码 **`1ed71b63b5af9a98b942ff47c66df5799d4d2c8a`**。 + +**结论:F01 原始反例已通过,A05/A06 本次交付的功能与已确认样式修复通过独立 Windows 检查;原生模式测试入口仍需修复。B01 不全量关闭。** + +本记录补齐前轮已执行但未正式回传的结果。没有使用后来 B02 或测试清理提交替代受测代码。新建本轮专用文档检出,避免复用出现并发推进的旧文档检出;未修改产品、正式测试、依赖或构建配置。 + +## 1. 环境与数据 + +Windows 11 IoT 企业版 LTSC 64 位,10.0.26100;Node 24.21.0、npm 11.19.0、Electron 37.10.3。固定 SHA 的独立检出执行 `npm ci --legacy-peer-deps --no-audit --no-fund`,显式补执行 Electron 安装脚本后构建;没有复用开发机依赖。jsdom 30.1.3 安装于 `.tmp/b01-dom`。 + +所有应用/组件窗口均使用测试 userData、home、workspace。仅使用本地持久化消息或受控回调,不请求模型、SDK query/CLI,不操作用户实际会话,不访问 WorkBuddy 原版。已有真实用户 dev 未被这些测试结束或替换。 + +## 2. 分项结果 + +| 项目 | 独立结果 | 范围 | +| --- | --- | --- | +| F01/AC1.3 原生计划、任务状态 | 通过,关闭本次具体失败 | 原验收 reducer→MessageBubble 反例现在 `retainsUserChoices=true`,两卡均保持 false;新增原生身份回归覆盖插入、重排、外层切换、消息隔离和无 ID 同位置 fallback | +| A05/AC3.1 模式标签 | 本次功能与样式修复通过 | 同一组件真实 Chromium 的透明背景、pill、32px/13px/500/20px、16px 原位槽、hover/focus 替换、禁用与窄窗;95 项通过 | +| A05 宿主草稿/权限 | 通过 | 实际 main/preload/renderer 中,两模式均以原生键盘退出,草稿原样保留,full-access 保存值保持,返回 craft 后权限控件恢复可用 | +| A06/AC3.2~3.3 确认浮层 | 本次已确认参数与行为通过 | 原生应用 71 项菜单/IPC/落库检查;浅深主题主/次/危险按钮、240px 壳、16px 圆角、600 标题、66px 最小宽、19px inset | +| A06 busy/失败/重试 | 通过,组件层 | 同一 TaskPopconfirm 的真实 Chromium 夹具 78 项:运行中“停止并删除”、重复点击锁、busy 不能退出、错误保留及重试。受控回调,不证明真实运行任务终止链路 | +| A01/A04 回归 | 通过指定回归 | alignment、问答真实窗口及浅深/窄窗/长内容壳检查通过 | + +按钮本轮实际几何为高 28px、圆角 6px、字体 12px,按交付的 small Button 规格验证;**并未由此认定原版所有按钮几何或整页像素完成 1:1**。ModeChip 的原版 SVG 仍未替换;没有同版本、同状态原版运行对照,原版完整视觉结论继续未验证。 + +F01 原始结果:[JSON](evidence/B01-review-02/typed-part-result.json)、[反例源码](evidence/B01-review-02/typed-part-repro.mjs)。在固定受测检出中,将脚本复制到 `.tmp/b01-readonly-review/` 后执行 `node .tmp/b01-readonly-review/typed-part-repro.mjs --assert`,本轮退出 0。本文仅引用当前产品模式的执行结果,不将脚本的其他分支视为本轮已运行。 + +## 3. T01:原生模式测试入口在 Windows 超时 + +`node scripts/test-mode-chip-native.mjs` 本轮运行 60 秒后被其超时定时器结束,父进程记录 `exitCode:null`。仅生成 fixture,没有 report 或 failure;因此**该命令没有通过**。[原始结果](evidence/B01-review-02/original-mode-runner.txt)。 + +验收端另用 `.tmp` 下 CJS 异步测试入口加载同一份已生成 fixture,保留原尺寸、主题、布局、禁用与原生输入检查,并补齐原生键盘字符事件;95 项通过。[入口](evidence/B01-review-02/mode-cjs-runner.cjs)、[报告](evidence/B01-review-02/mode-report.json)、[运行结果](evidence/B01-review-02/mode-cjs-runner.txt)。 + +开发端需修正式测试入口的 Windows 可运行性、事件序列及超时诊断。静态线索是原 ESM 入口在顶层等待 fixture 构建与 `app.whenReady()`;这不是本轮已经证明的唯一根因,不能只改扩长 timeout 就宣布修复。CJS 对照说明组件在同一环境可运行,不把入口超时等同于产品模式功能失败。 + +## 4. 其他命令与既有失败 + +- 独立 `npm run build`、带 DOM 环境的 `test:alignment`、`test:conversation`、`test:workbuddy-import`、`test:artifacts` 均退出 0。 +- `check:tokens` 仍退出 1,为既有六项;`test:fold-summary` 仍退出 1,为既存 Windows CRLF 摘要问题。没有刷新 baseline、修改生成物/manifest,不能将这些命令写成通过。 +- 原生菜单 71 项、CJS 模式 95 项、弹窗 Chromium 78 项均为实际执行,不是 `--build-only`。 +- 只有显示并允许 compositor 推进后,才采纳弹窗 busy 动画颜色结果;初次隐藏窗口的未稳定颜色没有列为产品缺陷。 + +证据:[构建](evidence/B01-review-02/build.txt)、[alignment](evidence/B01-review-02/alignment.txt)、[其他命令](evidence/B01-review-02/regressions.json)、[原生菜单](evidence/B01-review-02/menu-report.json)、[弹窗](evidence/B01-review-02/popconfirm-browser-report.json)、[模式宿主](evidence/B01-review-02/mode-host-report.json)、[问答](evidence/B01-review-02/question-report.json)。 + +截图:[归档浅色](evidence/B01-review-02/archive-light.png)、[删除深色](evidence/B01-review-02/delete-dark.png)、[计划聚焦](evidence/B01-review-02/mode-plan-focus.png)、[仅问答深色聚焦](evidence/B01-review-02/mode-ask-dark-focus.png)。已人工查看。 + +复跑模式与弹窗的验收入口时,先在指定 SHA 构建,使用交付脚本的 `--build-only` 生成 fixture,再把对应 CJS 验收入口复制到该检出的 `.tmp/`,传入生成目录;不要提交或复制生成 JS/依赖作为源码交付。宿主探针同样只放 `.tmp/`,自行建立隔离数据。 + +## 5. 后续 + +F01 不再要求重复修复,A05/A06 本次已测行为不推倒重做。后续补 T01 自动化入口、原版 SVG/同状态完整视觉、真实运行中停止链路等未验证边界。YC-002、YC-004、A07/A08没有在本轮交付,不因本记录关闭;保留用户撤回骨架补丁的决定。 + +本记录是验收文档交接,不是产品修复。最终批次状态仍以逐项 AC 为准。 diff --git a/docs/协作/B02-验收-01.md b/docs/协作/B02-验收-01.md new file mode 100644 index 0000000..f3c29e5 --- /dev/null +++ b/docs/协作/B02-验收-01.md @@ -0,0 +1,75 @@ +# B02 验收 01:推荐技能卡片与底部入口 + +日期:2026-10-21(Asia/Shanghai)。对应 [需求](B02-需求.md) 和 [交付 01](B02-交付-01.md),固定受测代码 **`14a1354c95a2081fb32e36917a1b05873b2a662b`**。 + +**结论:本次已安装推荐卡片及底部重复入口的功能修复通过;Windows 受控 UI 62 项、DOM 45 项通过。原仓库 UI 命令在 hover selector 上失败,测试可移植性需补;原版完整像素与真实宿主安装/使用端到端未验证,不将 B02 全量关闭。** + +## 1. 固定版本与隔离 + +在新建 `b02-accept-01` managed worktree 检出指定提交,独立执行 npm ci、Electron 安装脚本和完整构建。起止 Git 受控文件均无修改;未使用正在运行的用户 dev,也未复用上一轮固定验收检出来替换用户窗口。 + +Windows 11 IoT 企业版 LTSC 64 位,10.0.26100;Node 24.21.0、npm 11.19.0、Electron 37.10.3、独立 `.tmp/b02-dom` 的 jsdom 30.1.3。所有 UI 夹具自建 userData,受控 IPC、推荐目录和技能列表,不下载真实技能、不调用模型或修改真实用户技能。 + +本轮之后的 `a839d23` 测试清理、B03 需求及其 merge 没有被混入该 SHA 的产品验收。B03 没有交付,不能据此认定完全访问问题已修。 + +## 2. AC 结果 + +| AC | 结论 | 已验证范围 | +| --- | --- | --- | +| AC5.1 current 动作与卡壳 | 通过 | 安装后 `sm-card--installed`、原动作槽 `sm-use-btn` 出现,Plus/添加按钮不渲染;不再保留卡片下方重复使用动作 | +| AC5.2 已恢复样式 | 通过已测样式;原版完整对照未验证 | 24×24 动作槽、16×16 SVG,默认透明、浅深 hover 颜色变化、可聚焦与尺寸稳定;720px 窄窗无溢出。未证明当前 WorkBuddy 同状态逐像素一致 | +| AC5.3 状态刷新 | 通过受控宿主场景 | 安装、重开、外部安装/卸载/旧 progress 等现有回归通过;不要求重启 | +| AC5.4 身份与异常 | 通过指定 DOM/受控状态矩阵 | 禁用、仅模型调用、损坏、不同来源/版本、修改与 workspace 不冒充 current;没有改身份/安装后端 | +| AC5.5 替换与重复确认 | 通过受控场景 | 安装/更新/替换/修复动作区分;确认、取消及 current 防重复回归通过,后端覆盖保护没有放宽 | +| AC5.6 使用 | 通过组件与 callback;完整宿主端到端未验证 | current 使用回调、禁用先启用/启用失败,以及卡片动作去重通过;成功 toast 使用动作保留。没有实际下载后进入主应用新草稿并验证不发送的完整链路 | +| AC6.1~6.4 footer/导航 | 通过指定场景 | footer DOM/专用 props 与样式移除;顶部已安装计数和切换保留;错误/空目录及重试恢复通过,旧测试不再依赖 footer | + +已人工查看:[安装后浅色](evidence/B02-review-01/installed-light.png)、[深色使用 hover](evidence/B02-review-01/installed-dark-hover.png)、[窄窗](evidence/B02-review-01/installed-narrow.png)。右上顶部“已安装(1)”与安装成功 toast 是保留的导航/瞬时使用动作,不是用户要求移除的底部永久入口。 + +## 3. T02:原 UI 入口的 hover 选择器断言不可用 + +原命令 `npm run test:recommended-skills:ui` 本轮实际退出 **1**,停在: + +```text +light pointer enters use action: false +``` + +不能将原命令记为通过,也不能仅凭这条失败认定使用按钮不可点击。 + +独立诊断发现: + +- 原生鼠标输入后的按钮背景已从透明变为 `rgb(230, 230, 230)`;命中测试返回按钮内部 SVG,pointer-events 为 auto。 +- `button.matches(':hover')` 返回 false,`document.querySelectorAll(':hover')` 为空。 +- 同页添加完全独立的普通 button 对照后,鼠标输入命中该 button,CSS `:hover` 背景准确变化为 `rgb(50, 60, 70)`,但其 `matches(':hover')` 同为 false。这是本环境/事件与 selector 观察边界,不能归为仅 YCode 组件特有问题。 +- 显示/聚焦窗口及独立 CDP Input 鼠标事件也复现相同 selector 结果;没有通过更换产品源码消除。 + +[原始失败](evidence/B02-review-01/original-ui-runner.txt)、[对照结果](evidence/B02-review-01/hover-control.json)、[卡片命中与样式诊断](evidence/B02-review-01/hover-diagnostics.json)。 + +验收端仅在 `.tmp` 的独立探针中,把这条 predicate 换成**原生 `pointerenter` 事件 `isTrusted=true`、`pointerType=mouse`**,保留其他安装、错误/重试、导航、浅深色、实际背景变化、尺寸、焦点和窄窗断言,没有修改产品或正式测试。此入口完整执行 **62 项通过**;浅色 hover 为 `rgb(230, 230, 230)`,深色为 `color(srgb 1 1 1 / 0.08)`。 + +开发端应修正式 UI 入口的可移植性/诊断,不删除真实 hover 验收目标或改为仅检查 class。focus 本轮验证了实际 activeElement 与槽位;未额外证明完整原生键盘导航或屏幕阅读器行为。 + +证据:[独立探针](evidence/B02-review-01/pointer-ui-probe.mjs)、[62 项与计算样式](evidence/B02-review-01/native-report.json)、[运行日志](evidence/B02-review-01/pointer-ui-runner.txt)。重跑时在固定 SHA 安装依赖,将该探针复制成 `.tmp/b02-acceptance/recommended-skills-ui-pointer.mjs` 后执行;它的 Electron 子进程使用该固定路径,自建临时数据。 + +## 4. 全部命令与证明范围 + +| 命令 | 结果 | +| --- | --- | +| `npm ci --legacy-peer-deps --no-audit --no-fund`、Electron 安装、`npm run build` | 独立 Windows 通过,未改依赖/锁文件 | +| `npm run test:recommended-skills:dom`,设置独立 DOM 模块 | 45 项通过,是真实 React DOM/受控宿主,不是布局或真实安装 | +| `npm run test:alignment`,设置 DOM 模块 | 通过;SDK 部分为 mock,不作真实授权结论 | +| `npm run test:recommended-skills` | 退出 0,但 real-package 缺失而 SKIP;紧随的通用 PASS 不能解释为真实发布包验证通过 | +| `npm run test:composer-capabilities` | 退出 0 | +| 原仓库 `test:recommended-skills:ui` | **退出 1**,T02;独立 pointer 入口另行 62 项通过,二者分别记账 | +| `check:tokens` | 退出 1,同六个既有文件;本批 relevant 裸 px 计数下降,没有刷新 baseline | +| `test:fold-summary` | 退出 1,既存 Windows CRLF 摘要问题;未修改生成文件/manifest | + +证据:[构建](evidence/B02-review-01/build.txt)、[DOM 报告](evidence/B02-review-01/dom-report.json)、[alignment](evidence/B02-review-01/alignment.txt)、[其他结果](evidence/B02-review-01/test-results.json)、[后端及真实包 SKIP](evidence/B02-review-01/recommended-backend.txt)、[token](evidence/B02-review-01/token-check.txt)。 + +UI 日志中的“下载失败”“安装取消”“目录不可用”是夹具刻意注入并检查恢复的场景,不是本次真实网络故障;没有发起网络技能安装。 + +## 5. 回传 + +本次用户指出的“已安装仍保留添加按钮”和“底部查看已安装技能”已获得独立修复证据,不要求重复实现。开发端补 T02 正式自动化入口;完整原版对照、宿主安装/使用端到端、键盘/辅助技术边界继续列为未验证,不以组件 62 项冒充全链路通过。 + +本验收只提交文档、日志、截图与独立验收探针,不修改产品/正式测试/依赖/配置。新需求 B03 和后续测试清理按各自记录处理。本文推送成功后,推送窗口交回开发端。 diff --git a/docs/协作/evidence/B01-review-02/alignment.txt b/docs/协作/evidence/B01-review-02/alignment.txt new file mode 100644 index 0000000..ffa37b6 --- /dev/null +++ b/docs/协作/evidence/B01-review-02/alignment.txt @@ -0,0 +1,25 @@ + +> ycode@0.0.7 test:alignment +> node scripts/run-alignment-regression.mjs + +PASS model alignment: fresh/legacy migration, new/edit/default/delete/reload, valid selection (offline host fixtures) +PASS model settings: deferred owner switch, rename mapping, addition selection, empty deletion, immutable history +PASS session factory: first-send preference, mode preservation, invalid permission rejection (isolated ports) +{"historyMessages":10000,"bytes":747781,"parseMs":5.6311999999999784,"storeHydrationMs":0.28300000000001546,"note":"Node parsing/store benchmark only, not browser rendering or Windows IPC performance"} +session-composer-alignment: loading/cache/retry/races/model/permissions/modes/SSR passed +alignment-conversation: local groups, original expanded order, question projection and truthful status passed +A01 native MessageBubble identity aliases, immutable inputs and ordinary raw output passed +A01 imported native card, linked dedup and unknown-position compatibility passed +question-answer-shell: structural and recovered CSS contracts passed +question-answer-shell: DOM hierarchy, controls linkage, click, Enter, Space and inert contracts passed +Runtime progress, session-grant scope and approval lifecycle regressions passed +Permission intercept static rendering passed; interactive keyboard/focus remains UI acceptance +Claude host approval policy unit checks passed (no SDK process/application/matching verification) +Mock SDK replay lifecycle passed: fail closed, retry, session isolation, independent mode guard +task popconfirm DOM regression: 34 checks passed (jsdom, not pixel validation) +question-interaction: 24 DOM behavioral checks passed +question-identity: 30 A01 DOM checks passed (not Electron/pixel/SDK acceptance) +completed-fold-nested: real question/tool/thinking/local-summary remount, event, keyboard and identity contracts passed +completed-fold-native-identity: real reducer done correction, native IDs, insertion/reorder, repeated outer toggles, message isolation and legacy fallback passed +Permission intercept DOM: 14 checks passed (not pixel/SDK verification) +{"checks":37,"passed":true,"scope":"Isolated React DOM and CSS contracts; no native keyboard/layout/pixel acceptance"} diff --git a/docs/协作/evidence/B01-review-02/archive-light.png b/docs/协作/evidence/B01-review-02/archive-light.png new file mode 100644 index 0000000000000000000000000000000000000000..cc721cd383e8061c29ef0b19912e8e1a175808c9 GIT binary patch literal 67009 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 literal 0 HcmV?d00001 diff --git a/docs/协作/evidence/B01-review-02/build.txt b/docs/协作/evidence/B01-review-02/build.txt new file mode 100644 index 0000000..aaff724 --- /dev/null +++ b/docs/协作/evidence/B01-review-02/build.txt @@ -0,0 +1,660 @@ + +> ycode@0.0.7 build +> npm run typecheck && electron-vite build + + +> ycode@0.0.7 typecheck +> tsc --noEmit -p tsconfig.node.json && tsc --noEmit -p tsconfig.web.json + +vite v8.3.4 building ssr environment for production... +transforming... +✓ 444 modules transformed. +rendering chunks... +out/main/index.mjs 1,596.10 kB + +✓ built in 400ms +vite v8.3.4 building ssr environment for production... +transforming... +✓ 2 modules transformed. +rendering chunks... +out/preload/index.cjs 15.89 kB + +✓ built in 23ms +vite v8.3.4 building client environment for production... +transforming... +✓ 3039 modules transformed. +rendering chunks... +out/renderer/settings.html 1.57 kB +out/renderer/index.html 1.75 kB +out/renderer/assets/KaTeX_Size3-Regular-CTq5MqoE.woff 4.42 kB +out/renderer/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 4.92 kB +out/renderer/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 5.20 kB +out/renderer/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 5.46 kB +out/renderer/assets/KaTeX_Size4-Regular-BF-4gkZK.woff 5.98 kB +out/renderer/assets/KaTeX_Size2-Regular-oD1tc_U0.woff 6.18 kB +out/renderer/assets/KaTeX_Size1-Regular-C195tn64.woff 6.49 kB +out/renderer/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 6.90 kB +out/renderer/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 6.91 kB +out/renderer/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf 7.58 kB +out/renderer/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff 7.65 kB +out/renderer/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff 7.71 kB +out/renderer/assets/archify-owner-avatar-BdE-HOjX.jpg 9.46 kB +out/renderer/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 9.64 kB +out/renderer/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 10.34 kB +out/renderer/assets/KaTeX_Size4-Regular-DWFBv043.ttf 10.36 kB +out/renderer/assets/KaTeX_Script-Regular-D5yQViql.woff 10.58 kB +out/renderer/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 11.31 kB +out/renderer/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 11.34 kB +out/renderer/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf 11.50 kB +out/renderer/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 12.02 kB +out/renderer/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 12.21 kB +out/renderer/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf 12.22 kB +out/renderer/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff 12.31 kB +out/renderer/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf 12.34 kB +out/renderer/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf 12.36 kB +out/renderer/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff 13.20 kB +out/renderer/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff 13.29 kB +out/renderer/assets/workbuddy-buddy-thumbnail-2713ed5b-CUhW0EYr.png 13.42 kB +out/renderer/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 13.56 kB +out/renderer/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff 14.11 kB +out/renderer/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff 14.40 kB +out/renderer/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff 16.02 kB +out/renderer/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 16.40 kB +out/renderer/assets/KaTeX_Math-Italic-t53AETM-.woff2 16.44 kB +out/renderer/assets/KaTeX_Script-Regular-C5JkGWo-.ttf 16.64 kB +out/renderer/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 16.78 kB +out/renderer/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 16.98 kB +out/renderer/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff 18.66 kB +out/renderer/assets/KaTeX_Math-Italic-DA0__PXp.woff 18.74 kB +out/renderer/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff 19.41 kB +out/renderer/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf 19.43 kB +out/renderer/assets/KaTeX_Fraktur-Regular-CB_wures.ttf 19.57 kB +out/renderer/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf 19.58 kB +out/renderer/assets/KaTeX_Main-Italic-BMLOBm91.woff 19.67 kB +out/renderer/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf 22.36 kB +out/renderer/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf 24.50 kB +out/renderer/assets/KaTeX_Main-Bold-Cx986IdX.woff2 25.32 kB +out/renderer/assets/KaTeX_Main-Regular-B22Nviop.woff2 26.27 kB +out/renderer/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf 27.55 kB +out/renderer/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 28.07 kB +out/renderer/assets/KaTeX_Main-Bold-Jm3AIy58.woff 29.91 kB +out/renderer/assets/KaTeX_Main-Regular-Dr94JaBh.woff 30.77 kB +out/renderer/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf 31.19 kB +out/renderer/assets/KaTeX_Math-Italic-flOr_0UB.ttf 31.30 kB +out/renderer/assets/design-case-3-DaIvrslH.png 32.76 kB +out/renderer/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf 32.96 kB +out/renderer/assets/KaTeX_AMS-Regular-DMm9YOAa.woff 33.51 kB +out/renderer/assets/KaTeX_Main-Italic-3WenGoN9.ttf 33.58 kB +out/renderer/assets/design-case-4-0hVdAJQR.png 45.16 kB +out/renderer/assets/design-case-2-BH_iQ5r3.png 45.56 kB +out/renderer/assets/KaTeX_Main-Bold-waoOVXN0.ttf 51.33 kB +out/renderer/assets/design-case-1-DOYiafVz.png 52.97 kB +out/renderer/assets/KaTeX_Main-Regular-ypZvNtVU.ttf 53.58 kB +out/renderer/assets/KaTeX_AMS-Regular-DRggAlZN.ttf 63.63 kB +out/renderer/assets/workbuddy-appearance-dark-CXQX3TZX.png 109.34 kB +out/renderer/assets/workbuddy-appearance-light-BbpPCukh.png 113.02 kB +out/renderer/assets/codicon-ngg6Pgfi-ngg6Pgfi.ttf 121.97 kB +out/renderer/assets/kimi-DiLyRSiJ.svg 129.22 kB +out/renderer/assets/json.worker-DEWrzUkU-FVRG9O7E.js 438.21 kB +out/renderer/assets/worker-portable-D1lwTqsk-Dg0RNmO0.js 456.22 kB +out/renderer/assets/landing-hero-B6659kdy.png 629.28 kB +out/renderer/assets/html.worker-BC4B-9NY-BDdNc3ca.js 756.63 kB +out/renderer/assets/css.worker-D7wyZb8r-YRw1jg-F.js 1,086.92 kB +out/renderer/assets/ts.worker-BsXRl7a--BbqraoNr.js 8,187.30 kB +out/renderer/assets/ArtifactPierreDiff-CNAfnhAF.css 1.16 kB +out/renderer/assets/GeneralSettingsPanel-CntDyB52.css 1.25 kB +out/renderer/assets/AgentsSettingsPanel-R0teGDyD.css 2.56 kB +out/renderer/assets/AboutHelpSettingsPanel-ksqGLObi.css 5.72 kB +out/renderer/assets/updates-ui-COSnOGKS.css 6.84 kB +out/renderer/assets/AppearanceSettingsPanel-DcaRECSa.css 8.03 kB +out/renderer/assets/ShortcutsSettingsPanel-Bu_5_488.css 18.05 kB +out/renderer/assets/MemorySettingsPanel-C3dtDAif.css 32.49 kB +out/renderer/assets/ModelSettingsPanel-BjNmxQAH.css 88.98 kB +out/renderer/assets/PersonalizationSettingsPanel-DnAyzaM6.css 98.77 kB +out/renderer/assets/app-DH7L1ZF2.css 259.93 kB +out/renderer/assets/index-CvX53u9X.css 2,683.62 kB +out/renderer/assets/pie-WAS4IAKB-1a9lbjhh.js 0.11 kB +out/renderer/assets/info-A6RAGUB7-Dsq8pPGK.js 0.11 kB +out/renderer/assets/radar-RG4KPBEZ-BwNT2qWb.js 0.11 kB +out/renderer/assets/packet-AYTQ26CC-C-iOIVQo.js 0.11 kB +out/renderer/assets/cynefin-OW5HDTMX-CTYbUR58.js 0.11 kB +out/renderer/assets/treemap-WGGIJYW6-CWek0LQD.js 0.11 kB +out/renderer/assets/wardley-WFR3VGLG-BnrEXTnU.js 0.11 kB +out/renderer/assets/gitGraph-4MIJSDKK-NHpEvzKf.js 0.12 kB +out/renderer/assets/railroad-74A4TZTK-CyYHr3KR.js 0.12 kB +out/renderer/assets/treeView-Q6P3EWNA-CzdWA6Mh.js 0.12 kB +out/renderer/assets/railroad-peg-WCYAUIDC-DyA9P8dX.js 0.12 kB +out/renderer/assets/architecture-7GRP2DOG-VyF0wzFW.js 0.12 kB +out/renderer/assets/railroad-abnf-HS5TGJTU-DWOH6PDU.js 0.12 kB +out/renderer/assets/railroad-ebnf-LZEXJU2U-B8jXqV-T.js 0.12 kB +out/renderer/assets/eventmodeling-NTZA5JFV-Dmu4IHsI.js 0.12 kB +out/renderer/assets/array-75Ih5Qg4.js 0.16 kB +out/renderer/assets/channel-Bye_tFRR.js 0.25 kB +out/renderer/assets/init-DHdG6DHP.js 0.27 kB +out/renderer/assets/chunk-Y2CYZVJY-CrOJDJJy.js 0.38 kB +out/renderer/assets/chunk-JWPE2WC7-BWmaSNkB.js 0.42 kB +out/renderer/assets/chunk-2Q5K7J3B-BBOGhvIe.js 0.44 kB +out/renderer/assets/prism-tsx-BJWEHjlk.js 0.48 kB +out/renderer/assets/chunk-5VM5RSS4-D50WUAUX.js 0.52 kB +out/renderer/assets/chunk-XXDRQBXY-BsO966Nz.js 0.58 kB +out/renderer/assets/flowDiagram-HODETNUW-BZrFLTC0.js 0.59 kB +out/renderer/assets/prism-json-DxLGXN1o.js 0.62 kB +out/renderer/assets/codeowners-C7Y3CTAA-BmB2_gvY.js 0.75 kB +out/renderer/assets/prism-clike-BcH_eOfE.js 0.89 kB +out/renderer/assets/tsv-DVa1_Ovr-BeS2kE5e.js 0.94 kB +out/renderer/assets/shellsession-C0HwRpr0-B630Ulnl.js 0.96 kB +out/renderer/assets/javascript-DGySzfUB-CQaVVFGk.js 0.99 kB +out/renderer/assets/settings-CauUETdq.js 1.01 kB +out/renderer/assets/infoDiagram-27XIBGKW-Bulf8uQR.js 1.09 kB +out/renderer/assets/swimlanesDiagram-VR7AAH4N-BSjvAxa9.js 1.09 kB +out/renderer/assets/html-derivative-D3Jld805-D0QQ5MTi.js 1.10 kB +out/renderer/assets/prism-go-Cw8Jg9YT.js 1.11 kB +out/renderer/assets/classDiagram-ZZMXUADV-B5IckmXo.js 1.16 kB +out/renderer/assets/classDiagram-v2-VYDZK3BY-pNfhH-ZZ.js 1.16 kB +out/renderer/assets/stateDiagram-v2-MP3YSRHH-DhZlJKgF.js 1.16 kB +out/renderer/assets/qmldir-DIq06gp2-CFVtueeV.js 1.20 kB +out/renderer/assets/git-rebase-CgwCWTNR-Cpss9r90.js 1.23 kB +out/renderer/assets/chunk-POPQ4Y6H-7RcIGbEp.js 1.23 kB +out/renderer/assets/azcli-Bsxmaz-H-Dgh56k5-.js 1.26 kB +out/renderer/assets/personalization-prefs-DASR3vwn.js 1.28 kB +out/renderer/assets/csv-BRhERoQG-DKrQczXm.js 1.36 kB +out/renderer/assets/prism-latex-CHSuA_Lo.js 1.38 kB +out/renderer/assets/jsx-runtime-C48wkPcG.js 1.41 kB +out/renderer/assets/git-commit-DGtBy1vY-s2uHofP2.js 1.47 kB +out/renderer/assets/AgentsSettingsPanel-CMYBwUKH.js 1.56 kB +out/renderer/assets/xsl-DV28r3Jw-B8bWzO_h.js 1.59 kB +out/renderer/assets/dotenv-DXc2fSbR-CUbEjgJq.js 1.62 kB +out/renderer/assets/general-settings-icons-DOmPIusw.js 1.64 kB +out/renderer/assets/prism-scala-CRTYzCpy.js 1.65 kB +out/renderer/assets/ini-D4-1Iswn-DaNDgFS8.js 1.65 kB +out/renderer/assets/prism-typescript-D-7ZUUQ-.js 1.65 kB +out/renderer/assets/sizeCapture-INFHLROL-CCEMv_MJ.js 1.68 kB +out/renderer/assets/csp-Bsbijh2H-033SDyRW.js 1.69 kB +out/renderer/assets/sparql-Mj-YIaDH-DAUou2oc.js 1.71 kB +out/renderer/assets/prism-css-Cmyw76Xa.js 1.73 kB +out/renderer/assets/ini-DMSv7OY2-xgSkktY4.js 1.74 kB +out/renderer/assets/rolldown-runtime-BJCASTsb-DKQFAHUF.js 1.78 kB +out/renderer/assets/line-D_yBR5ay.js 1.89 kB +out/renderer/assets/fortran-fixed-form-D91DiZLE-NxoUlVkB.js 1.91 kB +out/renderer/assets/docker-B7J3eHK7-C3FNXPS_.js 1.96 kB +out/renderer/assets/hxml-938TheZ7-pE5ojWPT.js 1.97 kB +out/renderer/assets/desktop-BwI-o01e-Da9rFJOd.js 2.03 kB +out/renderer/assets/ordinal-CmpyCcm_.js 2.22 kB +out/renderer/assets/prism-c-B7tsC1jE.js 2.23 kB +out/renderer/assets/rolldown-runtime-EITvVbkG.js 2.32 kB +out/renderer/assets/erb-BgMB3Uiw-CLkRQ9Hf.js 2.40 kB +out/renderer/assets/prism-kotlin-Bc2NQYRR.js 2.43 kB +out/renderer/assets/jssm-CIisorE2-ggX0kbSA.js 2.44 kB +out/renderer/assets/prism-python-CTkfasgb.js 2.48 kB +out/renderer/assets/reg-mzCtpvUf-BHC3bGU6.js 2.54 kB +out/renderer/assets/bat-2PwuskcT-BbFmQdFU.js 2.55 kB +out/renderer/assets/prism-mermaid-DSoNsh6-.js 2.56 kB +out/renderer/assets/pla-HAHcX3CH-DHyEyFew.js 2.57 kB +out/renderer/assets/sb-O6mPt74--_nMcDiF8.js 2.60 kB +out/renderer/assets/chunk-GVQU2GXP-Wi49q5c7.js 2.61 kB +out/renderer/assets/edge-DcEd3r9D-ZJX3cnY_.js 2.62 kB +out/renderer/assets/scheme-C-yCXfo--BHhgh59u.js 2.66 kB +out/renderer/assets/flow9-z3HgHIql-qOic_Sv2.js 2.72 kB +out/renderer/assets/prism-yaml-cmjQ_1eD.js 2.77 kB +out/renderer/assets/gleam-DEEAoY6G-DgJJp7nh.js 2.78 kB +out/renderer/assets/railroadDiagram-O6MQD6OU-DqFNIv2D.js 2.78 kB +out/renderer/assets/diff-lAxbRYdS--5gtlmD4.js 2.79 kB +out/renderer/assets/hy-BKymZdC0-4uNvYh3y.js 2.86 kB +out/renderer/assets/dockerfile-CnkhFuxG-CfXHMZr-.js 3.01 kB +out/renderer/assets/openscad-BRTETpP_-BThzc9qL.js 3.03 kB +out/renderer/assets/pascaligo-DI1dd1Zd-D23AoFdQ.js 3.03 kB +out/renderer/assets/log-Cn1ZE6kb-BE4srnlV.js 3.05 kB +out/renderer/assets/objective-c-gNYZndaF-4hkcNMcE.js 3.06 kB +out/renderer/assets/sparql-DxWbGozt-B7qTmycl.js 3.08 kB +out/renderer/assets/prism-markup-templating-D4pSJIpH.js 3.11 kB +out/renderer/assets/prism-cpp-CEgmwlDT.js 3.11 kB +out/renderer/assets/cameligo-B6LDhzzR-DSNRk43W.js 3.12 kB +out/renderer/assets/wenyan-BVgiL1tD-C7ph_xMt.js 3.12 kB +out/renderer/assets/cairo-D_LzMZ4I-C21twps2.js 3.17 kB +out/renderer/assets/prism-rust-Du0Qa8GC.js 3.18 kB +out/renderer/assets/lua-CJt09SGy-3O0VAMVx.js 3.19 kB +out/renderer/assets/graphql-C0cKWTiE-BQOKksLE.js 3.20 kB +out/renderer/assets/berry-DTcSbIs7-DsDdtWdB.js 3.20 kB +out/renderer/assets/jsonl-Cn_fzNA8-cIG9lf61.js 3.21 kB +out/renderer/assets/json-CKKhFIOr-DuiQFrCF.js 3.29 kB +out/renderer/assets/mips-Df5bwPtM-DJn7b529.js 3.29 kB +out/renderer/assets/jsonc-Bf3Xcgeq-BGBJ2TDY.js 3.31 kB +out/renderer/assets/logo-BxqPaaID-DK9gUnx4.js 3.33 kB +out/renderer/assets/abnfDiagram-VCTEODGH-BcjOgNTo.js 3.36 kB +out/renderer/assets/go-BejFoqvR-BnGoIlsY.js 3.42 kB +out/renderer/assets/po-DI6EG-tz-DIkePE8T.js 3.44 kB +out/renderer/assets/lexon-5NyrCfQ6-B1bdOCGH.js 3.45 kB +out/renderer/assets/prism-sql-BggiY1Ht.js 3.45 kB +out/renderer/assets/json5-BlijqrwT-Ci88mndw.js 3.45 kB +out/renderer/assets/mipsasm-U3SQfJCQ-kat_Vj1M.js 3.46 kB +out/renderer/assets/sophia-foSZ3xPI-DGYIHURw.js 3.47 kB +out/renderer/assets/tasl-C74Cvwdf-se1Ptgso.js 3.49 kB +out/renderer/assets/genie-CjS3m_gh-DHydh9_z.js 3.56 kB +out/renderer/assets/prism-swift-xplGsQ1n.js 3.56 kB +out/renderer/assets/vala-DMgevQbf-ByJQiTkp.js 3.57 kB +out/renderer/assets/pegDiagram-XKGWAZYB-C8lDnYYb.js 3.59 kB +out/renderer/assets/rel-D6dNeDZv-CUAJzmkw.js 3.60 kB +out/renderer/assets/prism-java-6uFEGwWz.js 3.63 kB +out/renderer/assets/fsharp-Ba-cvOiG-BoxQhS9v.js 3.64 kB +out/renderer/assets/chunk-P2QGCYS3-HlyjybPv.js 3.65 kB +out/renderer/assets/ebnfDiagram-PWID7BFC-CcIdRN64.js 3.66 kB +out/renderer/assets/qsharp-78iLGMHs-Dbh3PRIx.js 3.68 kB +out/renderer/assets/m3-Bu81_nWr-4t51Qx0i.js 3.69 kB +out/renderer/assets/chunk-F27PBJKO-CSIxpenx.js 3.70 kB +out/renderer/assets/pascal-DyPgZbsX-Ba58YM7a.js 3.71 kB +out/renderer/assets/path-CSWwviF2.js 3.79 kB +out/renderer/assets/fluent-BSSEgVQa-BCOQigl1.js 3.81 kB +out/renderer/assets/splunk-BdqSfgpd-BtOEh0Mo.js 3.81 kB +out/renderer/assets/jsonnet-Bn71vRY8-QjPNMWdY.js 3.82 kB +out/renderer/assets/ssh-config-BO51LXox-DkFt_ueS.js 3.82 kB +out/renderer/assets/bicep-DujF3y-4-DHww3ZLF.js 3.87 kB +out/renderer/assets/narrat-DdgkgBr0-CSyxDqta.js 3.87 kB +out/renderer/assets/redis-Bo427DT4-DBDF4ZWx.js 3.88 kB +out/renderer/assets/turtle-DAmmiOda-C48PN72o.js 3.92 kB +out/renderer/assets/dist-CE9GMTNb.js 3.97 kB +out/renderer/assets/prism-jsx-BO0yI1A3.js 3.97 kB +out/renderer/assets/xml-BBFzlEmT-CqLnJtYa.js 3.99 kB +out/renderer/assets/java-Z7anYNQ6-DdC7WVZS.js 4.01 kB +out/renderer/assets/r-Xh-gXEK4-DKEPC8dA.js 4.02 kB +out/renderer/assets/ron-CdysqNkW-BG7UwPdX.js 4.11 kB +out/renderer/assets/zenscript-XbBI4c9W-C-aTQo6e.js 4.12 kB +out/renderer/assets/glsl-CZF-bvQV-UaBdSZy0.js 4.14 kB +out/renderer/assets/shell-DGp7WuK3-X00pamiI.js 4.15 kB +out/renderer/assets/gn-DJxfXStl-BD_k0CWf.js 4.20 kB +out/renderer/assets/kotlin-C61BvWgT-B7MkJpdU.js 4.20 kB +out/renderer/assets/typespec-B704GmX3-f1l-QmOw.js 4.26 kB +out/renderer/assets/kdl-YTd72GVl-DLkP_pAB.js 4.27 kB +out/renderer/assets/AppearanceSettingsPanel-B_352Jrg.js 4.28 kB +out/renderer/assets/hurl-CDXCvJNd-Xd5k76nE.js 4.28 kB +out/renderer/assets/cypher-CjfQI0Y9-9gjOyi6P.js 4.33 kB +out/renderer/assets/pascal-CLPA94yO-C11lM2uy.js 4.35 kB +out/renderer/assets/powershell-CaPzBwIT-C9KgMPOP.js 4.50 kB +out/renderer/assets/tcl-D-NiFh9X-CYwv4uzi.js 4.63 kB +out/renderer/assets/apex-BE-040ts-wdfiR7V6.js 4.65 kB +out/renderer/assets/tcl-DowxIvU4-Bbhzqrsw.js 4.65 kB +out/renderer/assets/rosmsg-DDyuMVTo-DSHWRdSZ.js 4.72 kB +out/renderer/assets/nextflow-DVTlkzu9-Cis-JUmb.js 4.75 kB +out/renderer/assets/http-DhxVjYFh-CjwVOaui.js 4.76 kB +out/renderer/assets/hcl-CbjaVS9i-DCS43mBd.js 4.79 kB +out/renderer/assets/rust-Ij2gfGoT-DLzaBWYs.js 4.83 kB +out/renderer/assets/polar-CwTxzzWE-DygHL4ZA.js 4.87 kB +out/renderer/assets/prism-ruby-PgHh3fQm.js 4.91 kB +out/renderer/assets/fennel-COJTUo2O-DYh8-dep.js 4.97 kB +out/renderer/assets/bibtex-yEKRWsaj-xHthw1sC.js 5.00 kB +out/renderer/assets/coffee-CcgZJF1B-DkN4xoBX.js 5.04 kB +out/renderer/assets/llvm-DiFwU398-BQjCVu39.js 5.25 kB +out/renderer/assets/less-CXux59mP-BM7SkPLH.js 5.27 kB +out/renderer/assets/msdax-DEyWhkWP-CwdIr_-P.js 5.29 kB +out/renderer/assets/prism-javascript-B6zosBCV.js 5.31 kB +out/renderer/assets/wgsl-Ds7VVNHP-yP3bMkfO.js 5.34 kB +out/renderer/assets/markdown-CBag5COD-B_1rbk64.js 5.36 kB +out/renderer/assets/dart-DK8_VUW5-Bnb_Tn57.js 5.39 kB +out/renderer/assets/zig-BBWfbOQ5-B8x_JL1P.js 5.54 kB +out/renderer/assets/restructuredtext-D2p7PcFG-DDHAm_JI.js 5.55 kB +out/renderer/assets/dax-CmrIxjmL-CDTyHmZ_.js 5.56 kB +out/renderer/assets/gdresource-4lq4eh4q-CjhvlVte.js 5.56 kB +out/renderer/assets/qml-D6gd64uC-_ykXVPoZ.js 5.57 kB +out/renderer/assets/bicep-wTwvD1CI-C568hcwN.js 5.58 kB +out/renderer/assets/cssMode-Z-o80aSY-Crw7T5pi.js 5.59 kB +out/renderer/assets/awk-DTjcVAOD-BmfaVU4m.js 5.66 kB +out/renderer/assets/liquid-Dv-zz5BA-D9ukCDuL.js 5.71 kB +out/renderer/assets/csharp-DpS7Vfy9-CbQzv1ql.js 5.76 kB +out/renderer/assets/coq-BFytDJOI-C5vNmx0q.js 5.81 kB +out/renderer/assets/swift-C3A42nmX-BBVToPkN.js 5.83 kB +out/renderer/assets/xml-bIkPj5aH-Bx1v5u6-.js 5.89 kB +out/renderer/assets/ecl-CYzojQ6a-C8m0_osY.js 5.91 kB +out/renderer/assets/jinja-Dl-Ji_JA-BBL5sTd0.js 5.92 kB +out/renderer/assets/lean-Cu10prRO-BUTVAAdc.js 6.03 kB +out/renderer/assets/yaml-GEMDST6R-D-0AGe4F.js 6.09 kB +out/renderer/assets/moonbit-B8-g2u5v-CGBFUznC.js 6.10 kB +out/renderer/assets/powerquery-tKWDTKOo-CejxekA_.js 6.11 kB +out/renderer/assets/SourceCodePreview-Czir01Qu.js 6.11 kB +out/renderer/assets/python-CHafhQyI-DmJIfgbV.js 6.14 kB +out/renderer/assets/shaderlab-Df7nOKvI-0G488FSx.js 6.16 kB +out/renderer/assets/css-sG8ozMHf-pZGexMoj.js 6.17 kB +out/renderer/assets/cpp-CipCPBaT-7uQRIwsC.js 6.17 kB +out/renderer/assets/vb-BKV3Sgm5-D5ytx6Ln.js 6.29 kB +out/renderer/assets/htmlMode-BDZbYlMj-2xcr-6-m.js 6.40 kB +out/renderer/assets/red-CYaKK_PD-iiAMl8iL.js 6.45 kB +out/renderer/assets/min-dark-DGPfDRqJ-gZu6HtcU.js 6.48 kB +out/renderer/assets/pug-EKWpNZSi-oQ708bsr.js 6.51 kB +out/renderer/assets/prisma-CdZyz3OC-ChFCtYaa.js 6.53 kB +out/renderer/assets/gdshader-ryZhEIxg-DpcQqwXn.js 6.55 kB +out/renderer/assets/ara-_lrJyEFe-qigo-wGx.js 6.56 kB +out/renderer/assets/clojure-WSq30mUj-Bswhoa1y.js 6.61 kB +out/renderer/assets/toml-DPP887_3-aOuHoLTy.js 6.62 kB +out/renderer/assets/postcss-CcIp2ENG-DpmxBCXW.js 6.64 kB +out/renderer/assets/verilog-bragEGMk-CemzLugw.js 6.64 kB +out/renderer/assets/solarized-light-BIMszn7B-vPMkTTwP.js 6.68 kB +out/renderer/assets/cypher-COYrq2Yy-BtVrfsLp.js 6.75 kB +out/renderer/assets/arc-LpCwTDer.js 6.75 kB +out/renderer/assets/proto-CQIfhs_g-Deqofbl3.js 6.77 kB +out/renderer/assets/smalltalk-BLGdLDJX-BKGgemER.js 6.79 kB +out/renderer/assets/vb-D1Cw85Ss-BSz-V9M4.js 6.86 kB +out/renderer/assets/talonscript-DA9pg7Tj-CPXKQ95R.js 6.96 kB +out/renderer/assets/r-Bb2Mu7Fo-Dq0URONw.js 7.00 kB +out/renderer/assets/solarized-dark-D_I-4EGa-BZbeAUhW.js 7.04 kB +out/renderer/assets/diagram-Z3DM3KII-CRFA9WLO.js 7.08 kB +out/renderer/assets/riscv-CQHqXr1Z-BFlZFId-.js 7.11 kB +out/renderer/assets/soy-DybHqX1A-DOhErZPj.js 7.15 kB +out/renderer/assets/min-light-BF0EjVgr-DvViuJW_.js 7.16 kB +out/renderer/assets/scheme-Dn0tgEWN-BK64z0tZ.js 7.37 kB +out/renderer/assets/prism-bash-B2ETaHUm.js 7.43 kB +out/renderer/assets/typescript-sfPIqb8J-DtIl1kXb.js 7.44 kB +out/renderer/assets/hlsl-CAmjcFpk-B3FZWMVz.js 7.48 kB +out/renderer/assets/mdx-Bdu4uO-C-BrzgNjCw.js 7.58 kB +out/renderer/assets/qss-DkzwWM0J-04JPp7d-.js 7.67 kB +out/renderer/assets/html-DKbmsqz6-Cnkf6ew3.js 7.69 kB +out/renderer/assets/systemd-CS6mVasZ-HbzlQlDs.js 8.07 kB +out/renderer/assets/monokai-CYqILLdj-CEXuJ8HO.js 8.08 kB +out/renderer/assets/twig-r8vgPZrm-D2l24YwI.js 8.18 kB +out/renderer/assets/updates-ui-BoiWSsup.js 8.22 kB +out/renderer/assets/wgsl-D_5Qxf6T-D508aVGZ.js 8.27 kB +out/renderer/assets/sdbl-BXfz6d3_-C4Qk7OPN.js 8.42 kB +out/renderer/assets/regexp-Dv0OUts_-BqK6b4KR.js 8.46 kB +out/renderer/assets/prism-php-dzcOOH50.js 8.49 kB +out/renderer/assets/systemverilog-BreNGkRs-RIXr4hNf.js 8.65 kB +out/renderer/assets/plsql-C-xpsZfV-frBdohcC.js 8.71 kB +out/renderer/assets/vue-html-DvuHo2mm-b7I-opwf.js 8.71 kB +out/renderer/assets/haml-CIYwkycC-3fSMp7m2.js 8.81 kB +out/renderer/assets/scss-CLoW-2dr-BBC_GO_6.js 8.86 kB +out/renderer/assets/dart-CBkkDIWs-ezKLFP5s.js 8.94 kB +out/renderer/assets/horizon-CELVL8Ba-x0NmpRb6.js 8.97 kB +out/renderer/assets/horizon-bright-DBDyMeUQ-Bhh-QDk3.js 8.98 kB +out/renderer/assets/julia-DvNkK6LK-Bi3Rlfah.js 9.04 kB +out/renderer/assets/clojure-886L7m2N-BhGJsUM7.js 9.14 kB +out/renderer/assets/make-CsAfL-jc-DaQVAww0.js 9.18 kB +out/renderer/assets/andromeeda--j5Bq-48-DxyWS_fJ.js 9.21 kB +out/renderer/assets/dark-plus-FAPM6M6c-DKexDF--.js 9.29 kB +out/renderer/assets/sas-BQIEUTPQ-Bwx-ZPYU.js 9.31 kB +out/renderer/assets/slack-dark-nDxLkSCC-C5pzIEPN.js 9.31 kB +out/renderer/assets/perl-Bec3eWyr-CDmSu3_s.js 9.32 kB +out/renderer/assets/plastic-DY_h9Vzh-CZzPFkTC.js 9.49 kB +out/renderer/assets/sass-Ysv8HTNa-CHNQIGaT.js 9.49 kB +out/renderer/assets/st-BrgXZ-Ag-BUs-RRgp.js 9.58 kB +out/renderer/assets/typst-Co5rZla4-COemceoz.js 9.61 kB +out/renderer/assets/slack-ochin-7zJWY-K--C7KFpXik.js 9.63 kB +out/renderer/assets/defaultLocale-QNqK0iCN.js 9.84 kB +out/renderer/assets/handlebars-CIJAyfa9-6toBlNYk.js 9.94 kB +out/renderer/assets/jison-Cbw0l5It-BNek_9Kq.js 9.95 kB +out/renderer/assets/sql-DviNlDJO-CwV6bDIP.js 9.97 kB +out/renderer/assets/kotlin-DIw6ua6F-CdVnL0aF.js 10.01 kB +out/renderer/assets/cmake-CyNDuJo8-2Hk4zQCd.js 10.07 kB +out/renderer/assets/light-plus-DkScKIB5-e8Q5AKjf.js 10.14 kB +out/renderer/assets/hcl-DoJdlYjN-DdpM5wFm.js 10.25 kB +out/renderer/assets/scala-Dj45wWzI-CAMCqIXS.js 10.40 kB +out/renderer/assets/postiats-SaHD9Qcv-FPvOr1pn.js 10.45 kB +out/renderer/assets/beancount-CyZf3Huc-C4n-y8pc.js 10.58 kB +out/renderer/assets/tex-gcnXexI3-BUpeblVA.js 10.60 kB +out/renderer/assets/php-Bn8AF0uj-CBbpr2vs.js 10.62 kB +out/renderer/assets/nextflow-groovy-D4ZyOBoZ-C7jziUwg.js 10.63 kB +out/renderer/assets/dream-maker-5oXa1Z51-CLRrQkBL.js 10.67 kB +out/renderer/assets/ts-tags-xeTAUNHG-CG_gr3En.js 10.70 kB +out/renderer/assets/raku-Bfr41qeN-C7t9XlCj.js 10.72 kB +out/renderer/assets/mysql-CZJtil0v-CP4gK9vT.js 10.73 kB +out/renderer/assets/task-menu-icons-BRdNqJF0.js 10.78 kB +out/renderer/assets/prism-csharp-D9xOwbIN.js 10.91 kB +out/renderer/assets/yaml-CsitfczK-Cu7vbJZs.js 10.97 kB +out/renderer/assets/diagram-UQ7AKVKN-BXObzj4d.js 11.05 kB +out/renderer/assets/elm-Dl1XrIiD-CwXBAFKd.js 11.18 kB +out/renderer/assets/just-He7qscmV-Bkq-0zku.js 11.19 kB +out/renderer/assets/redshift-Djb4PK3z-9Ar4PFWD.js 11.35 kB +out/renderer/assets/github-light-B_J7N1HZ-DWSXFnsf.js 11.38 kB +out/renderer/assets/ruby-CxOCB7_P-BzsjPJ6Z.js 11.48 kB +out/renderer/assets/prolog-DAqMMM08-BFKdnH0S.js 11.56 kB +out/renderer/assets/terraform-BW8B2WXV-zeRjs0zr.js 11.59 kB +out/renderer/assets/github-dark-BgqEY2WG-C9QbkZU3.js 11.60 kB +out/renderer/assets/puppet-CaR8DEdW-Biai9WKX.js 11.65 kB +out/renderer/assets/pkl-DrXR3Dxy-Bno7kqPT.js 11.67 kB +out/renderer/assets/laserwave-Clkc4Pj8-DOjuqF9n.js 11.69 kB +out/renderer/assets/pieDiagram-E7YTZNPT-D3EPLKnW.js 11.95 kB +out/renderer/assets/rst-BJFdabDk-Cv-fSo2B.js 12.04 kB +out/renderer/assets/linear-WS155L0r.js 12.11 kB +out/renderer/assets/wasm-DYwNZ-r4-BrA6oOvM.js 12.21 kB +out/renderer/assets/hjson-CmvCiVhY-BdH9CbZ2.js 12.25 kB +out/renderer/assets/razor-D5kquflS-CWY5AfCS.js 12.39 kB +out/renderer/assets/abap-BJyKdrbp-hWIyERPx.js 12.52 kB +out/renderer/assets/handlebars-B1z64YSt-MC-VEvxc.js 12.52 kB +out/renderer/assets/apache-BUbWdjM2-2Zu7IlVl.js 12.66 kB +out/renderer/assets/vesper-B5lCMuIY-CXGQHRuW.js 12.88 kB +out/renderer/assets/pgsql-BYm17UA1-Cvj1smQI.js 12.93 kB +out/renderer/assets/protobuf-BOGxqb2m-yTWn-oM_.js 12.98 kB +out/renderer/assets/bat-D2y8Uewi-CEJzP2ue.js 13.09 kB +out/renderer/assets/fish-CaZR_ofm-BcO_q5kQ.js 13.24 kB +out/renderer/assets/elixir-Lipcswxh-DnZCznfr.js 13.27 kB +out/renderer/assets/v-wnWoBHkK-CzCOTyIp.js 13.41 kB +out/renderer/assets/AboutHelpSettingsPanel-Ui_VOvh7.js 13.48 kB +out/renderer/assets/vitesse-light-DQXFiRFx-Ct7fN8pJ.js 13.81 kB +out/renderer/assets/aurora-x-9vUYYjHV-CImifmUW.js 13.85 kB +out/renderer/assets/vitesse-black-cwK5rWgD-BGrq81WC.js 13.87 kB +out/renderer/assets/vitesse-dark-CsfgW0oH-Dx8cqxrm.js 13.96 kB +out/renderer/assets/ShortcutsSettingsPanel-KgJeI7QZ.js 14.15 kB +out/renderer/assets/pug-D0UckVoV-BTWU19Nk.js 14.16 kB +out/renderer/assets/synthwave-84-LX1B8mRG-yuUErnSx.js 14.23 kB +out/renderer/assets/github-light-default-BRmIzqWc-B3gMi7zW.js 14.36 kB +out/renderer/assets/clarity-AxkJPY5c-DfVHSVIk.js 14.48 kB +out/renderer/assets/github-light-high-contrast-BUKIZOxn-DL0r2b0z.js 14.49 kB +out/renderer/assets/github-dark-dimmed-DoIdqTey-CDc6YqEM.js 14.64 kB +out/renderer/assets/github-dark-default-CwWjzI40-_0bgyJYv.js 14.64 kB +out/renderer/assets/chunk-PWAF6VOD-DuIRO4kt.js 14.76 kB +out/renderer/assets/github-dark-high-contrast-bFLNMLvK-BUp3HmXY.js 14.80 kB +out/renderer/assets/diagram-S7CK7UJ4-DV_ERwD-.js 14.98 kB +out/renderer/assets/gnuplot-Dw3FRha5-D6o75ylb.js 14.98 kB +out/renderer/assets/rust-C0Ih6nmc-Bm01RMLz.js 15.27 kB +out/renderer/assets/actionscript-3-O8jnLcvn-C7OtofMN.js 15.41 kB +out/renderer/assets/luau-BzxGbjcn-aQpsBeQB.js 15.64 kB +out/renderer/assets/nix-zl191KBb-CxSq6jsB.js 15.85 kB +out/renderer/assets/lua-BwTLfNCK-IuSxl8fO.js 16.04 kB +out/renderer/assets/abap-FvPUHv8B-BVQp86jh.js 16.05 kB +out/renderer/assets/solidity-96fhzG-Q-CZEni-ZB.js 16.28 kB +out/renderer/assets/matlab-8ZQqHKQX-g_ODc8QU.js 16.29 kB +out/renderer/assets/cue-eHSfcyUV-BO0bCEDm.js 16.40 kB +out/renderer/assets/kusto-D8vBBISG-C0y2Wtyy.js 16.45 kB +out/renderer/assets/powerquery-B7BjLMcF-BkVSWPtX.js 16.49 kB +out/renderer/assets/elixir-B1NaQxrO-Ba6X-FuW.js 16.50 kB +out/renderer/assets/react-DrereneL.js 16.50 kB +out/renderer/assets/odin-B-YqhW9I-B-ZI05Ll.js 16.71 kB +out/renderer/assets/solidity-Dpt2BLAA-BD_YSA0r.js 16.98 kB +out/renderer/assets/bird2-BMkLvc4r-CyoW3El7.js 17.17 kB +out/renderer/assets/kanagawa-wave-CM_o6oKV-VzWuxPSA.js 17.32 kB +out/renderer/assets/kanagawa-lotus-Cj3XDpoG-cmeMwVaD.js 17.32 kB +out/renderer/assets/kanagawa-dragon-D_NPnIy_-Cyd8MANv.js 17.33 kB +out/renderer/assets/cynefinDiagram-5FMLGOSQ-4X_-lqaW.js 17.61 kB +out/renderer/assets/stateDiagram-D77RDMKH-B5Qv9-kY.js 18.11 kB +out/renderer/assets/chunk-L3NEJ4N5-MEgGvnk-.js 18.16 kB +out/renderer/assets/liquid-D_7zu7XR-BZ3z6-Mj.js 18.46 kB +out/renderer/assets/svelte-DUGqPubT-CAfIEh4G.js 18.60 kB +out/renderer/assets/graphql-ObxcfEHH-9pUo2yjR.js 18.65 kB +out/renderer/assets/jsonMode-DdQpkp6D-Bsga_9WC.js 18.79 kB +out/renderer/assets/material-theme-q28j4V_0-s4HtqlFv.js 18.81 kB +out/renderer/assets/material-theme-ocean-DAvlEnSm-Cyw7qD-l.js 18.83 kB +out/renderer/assets/material-theme-darker-CHEuMVX9-D-hz3EEt.js 18.83 kB +out/renderer/assets/material-theme-lighter-DY4T1_JG-C0HwKluR.js 18.84 kB +out/renderer/assets/material-theme-palenight-CqDFvQ-v-RoTowTME.js 18.84 kB +out/renderer/assets/gherkin-BcjDDslM-BdnbjalD.js 19.20 kB +out/renderer/assets/gdscript-CekKc1U_-DVmAmHvE.js 19.21 kB +out/renderer/assets/groovy-DH3arekX-StnUgJL0.js 19.38 kB +out/renderer/assets/mdc-D-U85KZE-DPbAVRTg.js 19.85 kB +out/renderer/assets/diagram-VSXAHHWV-BjMahNBE.js 20.01 kB +out/renderer/assets/move-CmExnPjU-DPj_eIaE.js 20.22 kB +out/renderer/assets/ayu-dark-BeByMiYw-CS3MEELg.js 20.27 kB +out/renderer/assets/ayu-mirage-C1jJ6Jfs-CnA8kJ7r.js 20.28 kB +out/renderer/assets/ayu-light-DmTZeN54-CDULCKqM.js 20.35 kB +out/renderer/assets/glimmer-js-D9ZnrcNN-BS431Ogg.js 20.44 kB +out/renderer/assets/glimmer-ts-DuhFj6qR-CsFesiaT.js 20.44 kB +out/renderer/assets/viml-DPVJ_KYe-De3CdqgJ.js 20.56 kB +out/renderer/assets/nushell-Cd8Dwa1M-Dhf9XkYz.js 20.62 kB +out/renderer/assets/snazzy-light-B8znOqT6-B1FX3-IF.js 20.97 kB +out/renderer/assets/dagre-GXQ25YYZ-DHWBBxAd.js 21.01 kB +out/renderer/assets/dracula-DeMffiYO-Bl4juROY.js 21.26 kB +out/renderer/assets/dracula-soft-BnfvpcDv-CYsUeSum.js 21.27 kB +out/renderer/assets/twig-7zjsCqYg-CMujKsZl.js 21.44 kB +out/renderer/assets/freemarker2-enkimFXA-0bWMkoTL.js 21.73 kB +out/renderer/assets/PersonalizationSettingsPanel-B06BA6F_.js 21.87 kB +out/renderer/assets/rose-pine-CEVQiaW0-DaA_4NNK.js 21.94 kB +out/renderer/assets/rose-pine-moon-B9bum7Ik-B6_AhIsD.js 21.96 kB +out/renderer/assets/rose-pine-dawn-2Q5fMoJp-DxMkAwKM.js 21.96 kB +out/renderer/assets/powershell-ycAdP1r9-B7r4Hnhz.js 22.11 kB +out/renderer/assets/common-lisp-DcFHcTKh-CWH5diwh.js 22.81 kB +out/renderer/assets/gruvbox-dark-hard-gOzMLqif-DDlcfu4q.js 22.83 kB +out/renderer/assets/gruvbox-dark-soft-CKvURktN-C6MJezBg.js 22.83 kB +out/renderer/assets/gruvbox-light-hard-CMa_c48J-BUQ67Msp.js 22.84 kB +out/renderer/assets/gruvbox-light-soft-yfAGJYsX-DNM2qqWB.js 22.84 kB +out/renderer/assets/gruvbox-dark-medium-BQSVGwWb-qh8C4DPZ.js 22.84 kB +out/renderer/assets/gruvbox-light-medium-B9S5UNr1-DZxV_o-P.js 22.84 kB +out/renderer/assets/nim-CD961Jl3-CuyTrDpQ.js 22.91 kB +out/renderer/assets/cadence-C2JmJjDr-B-b63Epg.js 23.87 kB +out/renderer/assets/sql-C_oMiPb0-CRnSOxMo.js 23.87 kB +out/renderer/assets/wit-CXpQol8Q-D2NEDOhy.js 24.11 kB +out/renderer/assets/templ-gFcHJbF7-BqIwRUQe.js 24.38 kB +out/renderer/assets/astro-kV3HjkbP-CH6o6jKA.js 24.46 kB +out/renderer/assets/vhdl-Ci4REirV-D-qSzcJD.js 24.46 kB +out/renderer/assets/purescript-DCsDAdnX-DsynrkKe.js 24.97 kB +out/renderer/assets/vue-Cuk7Vimg-CFbFXIr8.js 25.25 kB +out/renderer/assets/surrealql-GFjNBdcm-Vm68TOTE.js 25.34 kB +out/renderer/assets/one-light-CMfGrl_P-B-1jUQM9.js 25.49 kB +out/renderer/assets/night-owl-light-CAEa42tO-TPCLv7z5.js 26.10 kB +out/renderer/assets/system-verilog-D_bVVpLE-C_dvOlr3.js 26.41 kB +out/renderer/assets/angular-html-BrLPO2Fv-DJgz5E5d.js 26.48 kB +out/renderer/assets/typespec-D5WYs8C4-AaOHagqW.js 26.72 kB +out/renderer/assets/nord-DlCAGdjr-Div2jUYm.js 26.91 kB +out/renderer/assets/codeql-DidIlXer-D6RBJOzg.js 27.08 kB +out/renderer/assets/scss-BhK8Ovpn-DfDLQi2C.js 27.52 kB +out/renderer/assets/coffee-DrMWXxy6-BoavQsuh.js 27.68 kB +out/renderer/assets/java-DaupjRFz-zQd9RZAc.js 27.69 kB +out/renderer/assets/razor-B2hRAVmz-Dj7TOgY5.js 27.72 kB +out/renderer/assets/apl-C42PBett-BNW4FTmO.js 27.87 kB +out/renderer/assets/chunk-SVP7TREG-Dxm-4rnd.js 28.38 kB +out/renderer/assets/fsharp-BHFgIxsY-CvR6tsY8.js 28.48 kB +out/renderer/assets/marko-DXKHPFnH-C0z2-ucz.js 28.74 kB +out/renderer/assets/GeneralSettingsPanel-CA6yOnsk.js 29.10 kB +out/renderer/assets/night-owl-DegwdXaM-6ZGfBB7K.js 29.11 kB +out/renderer/assets/c3-BOs4FlGA-BuhFXrRY.js 29.17 kB +out/renderer/assets/MemorySettingsPanel-cqwWfj-O.js 29.75 kB +out/renderer/assets/crystal-DlzoxO28-BWa_t1Io.js 29.84 kB +out/renderer/assets/applescript-ij24h7OO-_xHQcvud.js 29.87 kB +out/renderer/assets/tsMode-SiG-Sp2b-WC-zK_wx.js 30.55 kB +out/renderer/assets/pierre-dark-Daa2n9wr-D7rla9B_.js 30.74 kB +out/renderer/assets/pierre-light-D_hZXvUj-DJnIOKLO.js 30.75 kB +out/renderer/assets/pierre-dark-soft-BhNM3pgh-Dp_VeHWv.js 30.76 kB +out/renderer/assets/pierre-light-soft-BVrSv6ZG-C6Na39F-.js 30.76 kB +out/renderer/assets/ishikawaDiagram-5VMMS53U-BtIQYepA.js 30.78 kB +out/renderer/assets/pierre-dark-tritanopia-CGKuoAZi-C0HpbU3l.js 30.78 kB +out/renderer/assets/pierre-light-tritanopia-BiDEaWaH-wWduIsi3.js 30.78 kB +out/renderer/assets/pierre-dark-protanopia-deuteranopia-Cs1lz9lE-enlgPsHw.js 30.82 kB +out/renderer/assets/pierre-light-protanopia-deuteranopia-BM0RLBB_-Dz5iBHkO.js 30.82 kB +out/renderer/assets/stylus-ZCryC73G-urFW3_yk.js 31.29 kB +out/renderer/assets/diagram-VX7I27RA-CAJ5TuHp.js 31.44 kB +out/renderer/assets/scala-BBsC3Oz3-VCjyobQG.js 31.48 kB +out/renderer/assets/mermaid-D6CQfUGU-C6DHNxVz.js 33.37 kB +out/renderer/assets/poimandres-EIt_jotH-DHKFQj5Q.js 33.69 kB +out/renderer/assets/kanban-definition-UXKFOSKX-BLcNSZUB.js 33.91 kB +out/renderer/assets/one-dark-pro-DR9QpZM3-BA4d4lw2.js 33.98 kB +out/renderer/assets/mermaid-parser.core-CstzWfPU.js 34.66 kB +out/renderer/assets/haxe-BWT5wSyZ-BuUsQb-h.js 35.38 kB +out/renderer/assets/nginx-DhtViCEk-C18zABFg.js 35.58 kB +out/renderer/assets/houston-BdS5A_yD-NUige_z1.js 35.61 kB +out/renderer/assets/tokyo-night-BS1_DFu7-CYsPn2J-.js 35.86 kB +out/renderer/assets/erlang-Dd62d0xZ-DHVWwcKa.js 37.71 kB +out/renderer/assets/rough.esm-BX5QqLti.js 38.33 kB +out/renderer/assets/mindmap-definition-YA3MSWOX-B-zior9K.js 38.59 kB +out/renderer/assets/cobol-D7RZfOK--CEk2iYO9.js 39.37 kB +out/renderer/assets/journeyDiagram-3NMN7TZE-dygzCaXh.js 40.13 kB +out/renderer/assets/julia-ZzkUXm0W-BIm_zTAN.js 40.32 kB +out/renderer/assets/lspLanguageFeatures-DK9zifhE-DeEqLmGO.js 40.76 kB +out/renderer/assets/asm-DYVIzeEk-Byg5xzam.js 40.91 kB +out/renderer/assets/haskell-Ba6HbLj8-D0OYaIy8.js 41.78 kB +out/renderer/assets/sankeyDiagram-P5KCCOFB-D1WB71c9.js 41.83 kB +out/renderer/assets/shellscript-B69gKcss-49Zm6IyC.js 41.97 kB +out/renderer/assets/wardleyDiagram-VM6X3IG4-DCbKgC_S.js 42.40 kB +out/renderer/assets/perl-Dv6Cq_FS-DIORmO5G.js 43.55 kB +out/renderer/assets/pierre-dark-vibrant-BMsyYliQ-84Eeh-Uj.js 44.96 kB +out/renderer/assets/pierre-light-vibrant-CWzM4Pa_-QZvTkTJe.js 44.97 kB +out/renderer/assets/ruby-DWcdJvcx-q0K84ieK.js 46.50 kB +out/renderer/assets/go-BOpYl7fu-BiT4MB-v.js 47.02 kB +out/renderer/assets/apex-B48ZHHzN-BBt8sSNQ.js 47.18 kB +out/renderer/assets/catppuccin-mocha-cPsH7Lup-SVLZehhk.js 47.46 kB +out/renderer/assets/catppuccin-latte-DcEecI7n-jo2cPJyK.js 47.46 kB +out/renderer/assets/catppuccin-frappe-BdOW2tdI-BI0Hc9cS.js 47.46 kB +out/renderer/assets/catppuccin-macchiato-Bvz_yAZY-DWewRa4S.js 47.47 kB +out/renderer/assets/ada-BT0j8ine-CLTLBE8n.js 48.28 kB +out/renderer/assets/d-B1HbH29p-Bi6t8Ck6.js 49.10 kB +out/renderer/assets/css-NFwnoVns-BvwuZkcY.js 49.49 kB +out/renderer/assets/imba-C-oGt11l-CqKI0OVw.js 50.13 kB +out/renderer/assets/requirementDiagram-BXWQKSXE-C3ERdAvT.js 51.39 kB +out/renderer/assets/erDiagram-RLTQ6QDP-DVzk9HUA.js 52.41 kB +out/renderer/assets/browserify-C9uP_nIr.js 52.80 kB +out/renderer/assets/gitGraphDiagram-WWUBYQGX-gZr6P8x8.js 53.82 kB +out/renderer/assets/everforest-dark-gCM8XhEI-DzRrg06U.js 53.94 kB +out/renderer/assets/everforest-light-DhK35DkL-BEDtvHw1.js 53.95 kB +out/renderer/assets/timeline-definition-24CTP7MA-DuvjToaj.js 54.31 kB +out/renderer/assets/wikitext-CQNrXTmv-DJ18wIlO.js 56.09 kB +out/renderer/assets/stata-BUONSdsT-BPnapjPC.js 57.23 kB +out/renderer/assets/quadrantDiagram-AXDQQJYC-D8rBdZOq.js 58.21 kB +out/renderer/assets/html-Dq1ixqYb-okJOhOmu.js 58.25 kB +out/renderer/assets/chunk-OSK3NFVY-DeXYmBeV.js 58.56 kB +out/renderer/assets/ocaml-CUdGm1iq-BKX30YEX.js 62.65 kB +out/renderer/assets/model-settings-source-JYisGYmM.js 63.03 kB +out/renderer/assets/ballerina-CpYcPBJI-D9ac3462.js 64.89 kB +out/renderer/assets/markdown-BSrOIEaF-BFwOzGIM.js 65.52 kB +out/renderer/assets/chunk-IMKFNOWR-20hk4CFt.js 67.22 kB +out/renderer/assets/mojo-BNaitZ-7-E_psDM2x.js 70.00 kB +out/renderer/assets/python-Cld0Iwtn-tcCJ5L_g.js 70.17 kB +out/renderer/assets/blockDiagram-I7D4REHJ-BEOA2O5R.js 71.01 kB +out/renderer/assets/bsl-CtP8370o-Pi14XlIU.js 71.07 kB +out/renderer/assets/c-B4augMcT-B5ncIjy5.js 72.57 kB +out/renderer/assets/chunk-75Z2AOVW-D7MfFP0x.js 72.67 kB +out/renderer/assets/latex-g2Pus_l2-CP0G7LTN.js 72.85 kB +out/renderer/assets/vyper-C1nscAY5-BTAKd5p2.js 74.85 kB +out/renderer/assets/ModelSettingsPanel-Bq69xf7M.js 76.64 kB +out/renderer/assets/xychartDiagram-S5SC5T6Z-BLJZsQxl.js 76.79 kB +out/renderer/assets/chunk-GMAD6QVW-Cutm-G6X.js 77.76 kB +out/renderer/assets/hack-B1ag3l4X-CEYIfPfg.js 80.58 kB +out/renderer/assets/src-DsgKm1PY.js 83.16 kB +out/renderer/assets/chunk-TICWLB2K-BF9Dr4eB.js 83.88 kB +out/renderer/assets/fortran-free-form-CsgtTAg3-Dm0PhuY8.js 89.20 kB +out/renderer/assets/vennDiagram-4TSXK5OY-rjTACDc3.js 89.26 kB +out/renderer/assets/csharp-YOPVljXo-CBjcozlW.js 89.91 kB +out/renderer/assets/racket--xYIV9-n-NDM2V4Sc.js 92.62 kB +out/renderer/assets/swift-CgzYrGBX-CaMD6i-j.js 94.14 kB +out/renderer/assets/less-BGhX8xko-CbSvNyvq.js 99.00 kB +out/renderer/assets/chunk-SHT3W25Y-CG3rN0Mp.js 104.10 kB +out/renderer/assets/objective-c-CmcWiAft-DY5tZuMk.js 105.62 kB +out/renderer/assets/blade-Bq8WPf0E-BehdttJf.js 105.98 kB +out/renderer/assets/c4Diagram-7LVT6UL2--i1UKJXs.js 107.96 kB +out/renderer/assets/php-X15vsN4N-ChBJUzAp.js 111.49 kB +out/renderer/assets/dagre-CzI-C3sx.js 122.98 kB +out/renderer/assets/ganttDiagram-EL5Y4UJY-B2ep6Zsp.js 123.77 kB +out/renderer/assets/graphlib-CoAzpIqe.js 127.44 kB +out/renderer/assets/asciidoc-DJWalVNM-Daa-Gl9r.js 146.30 kB +out/renderer/assets/mdx-C_Ato9sK-CDV72_N0.js 146.49 kB +out/renderer/assets/editor.main-POO0Vbhx-DgMLeBiB.js 161.32 kB +out/renderer/assets/cose-bilkent-JH36ORCC-CA60tZpq.js 165.63 kB +out/renderer/assets/objective-cpp-BggTCHV8-BRaaCyEF.js 172.18 kB +out/renderer/assets/javascript-AfZCJ9Uc-C_GZREFb.js 175.31 kB +out/renderer/assets/tsx-BOlKGefW-D7XVyutE.js 176.00 kB +out/renderer/assets/jsx-CPd9p36x-D5Ck2u9I.js 178.26 kB +out/renderer/assets/sequenceDiagram-WJ2MYXX4-DrQZvAZS.js 190.05 kB +out/renderer/assets/typescript-4sRsPriL-Ce01imBq.js 191.16 kB +out/renderer/assets/mermaid.core-CzJUxOu4.js 191.57 kB +out/renderer/assets/angular-ts-YduEkmVa-936ueej5.js 193.82 kB +out/renderer/assets/vue-vine-DXhYlaTf-C8MW7tnI.js 201.27 kB +out/renderer/assets/SourceSelect-Dd7kI5iL.js 203.20 kB +out/renderer/assets/chunk-4HAMMTFA-CZEROUgO.js 210.32 kB +out/renderer/assets/swimlanes-42K2YHIH-Bejk4_Vq.js 265.51 kB +out/renderer/assets/wolfram-BVoTES0L-W3A5YqXk.js 267.14 kB +out/renderer/assets/chunk-DU6HZSFF-BsNLw-4v.js 271.07 kB +out/renderer/assets/architectureDiagram-5GKGNRK7-BXf_ZoM6.js 318.23 kB +out/renderer/assets/katex-Y9ra-ykP.js 497.35 kB +out/renderer/assets/texmath-Bkeg3ZLn.js 594.25 kB +out/renderer/assets/wasm-CVjZL0jK-DcJkdGs4.js 622.62 kB +out/renderer/assets/cpp-9jHBA231-DB3feGjZ.js 626.73 kB +out/renderer/assets/app-4914IQSi.js 675.57 kB +out/renderer/assets/emacs-lisp-DjtOxg4j-CzQ0CKOn.js 780.06 kB +out/renderer/assets/cytoscape.esm-bVGYt-iW.js 869.69 kB +out/renderer/assets/ArtifactPierreDiff-DpqRTCz8.js 1,119.58 kB +out/renderer/assets/chunk-FOHPRMQF-BCllzKJD.js 1,154.18 kB +out/renderer/assets/index-iOggdyqw.js 3,760.13 kB +out/renderer/assets/editor.api2-dPwET-7w-BYIQ9bT3.js 4,889.23 kB + +✓ built in 4.77s diff --git a/docs/协作/evidence/B01-review-02/delete-dark.png b/docs/协作/evidence/B01-review-02/delete-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..594546349358ca4dc17eccbb78e65c425179d20b GIT binary patch literal 66909 zcmd43Wl&sQ7d4nC2{9~4f;wm5v7 z+}&O00Pj2VP0cs;RZUGz&Hclz?#q>Z&)IwJwbtn%C72BE1M&wqZrs3yzJ{pWxPc{f z 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

Dn*P%YMUc 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 P2MSnSwzD9Z-F)z0Pv9B| literal 0 HcmV?d00001 diff --git a/docs/协作/evidence/B01-review-02/mode-cjs-runner.cjs b/docs/协作/evidence/B01-review-02/mode-cjs-runner.cjs new file mode 100644 index 0000000..fd92616 --- /dev/null +++ b/docs/协作/evidence/B01-review-02/mode-cjs-runner.cjs @@ -0,0 +1,45 @@ +// Acceptance-only CJS harness for the unchanged supplied component fixture. +// Same assertions and native inputs, without ESM top-level await or rebuilding inside Electron. +const fs=require('fs'),path=require('path'),assert=require('assert/strict'); +const {createHash}=require('crypto'); +const electronModule=require('electron'); +const base=path.resolve('.tmp'); +const file='src/renderer/src/workbuddy/composer/ModeChip.tsx'; +if(!process.versions.electron){const env={...process.env};delete env.ELECTRON_RUN_AS_NODE;delete env.ELECTRON_RENDERER_URL;const child=require('child_process').spawn(electronModule,[__filename,process.argv.at(-1)],{env,windowsHide:true,stdio:'inherit'});const timer=setTimeout(()=>child.kill(),60000);child.once('exit',(code,signal)=>{clearTimeout(timer);console.log(JSON.stringify({exitCode:code,signal}));process.exitCode=code===0?0:1});}else{;(async()=>{ +const { app, BrowserWindow } = electronModule, output = path.resolve(process.argv.at(-1)) + assert.ok(path.dirname(output) === base && path.basename(output).startsWith('mode-chip-native-')) + fs.mkdirSync(path.join(output, 'data'), {recursive:true}); app.setPath('userData', path.join(output, 'data')); app.disableHardwareAcceleration() + let win; const checks = [], samples = [], errors = [] + try { + await app.whenReady(); win = new BrowserWindow({ width: 800, height: 300, show: false, webPreferences: { contextIsolation: true, nodeIntegration: false, backgroundThrottling: false } }) + win.webContents.on('console-message', event => { if (event.level === 'error' || event.level >= 3) errors.push(event.message) }) + await win.loadFile(path.join(output, 'index.html')); win.showInactive() + const read = code => win.webContents.executeJavaScript(code), pause = () => new Promise(resolve => setTimeout(resolve, 80)) + const check = (label, actual, expected = true) => { assert.deepEqual(actual, expected, label); checks.push(label) } + const key = async keyCode => { win.focus();win.webContents.focus();await pause();win.webContents.sendInputEvent({type:'keyDown',keyCode});if(keyCode==='Enter'||keyCode==='Space')win.webContents.sendInputEvent({type:'char',keyCode:keyCode==='Enter'?'\r':' '});win.webContents.sendInputEvent({type:'keyUp',keyCode});await pause() } + const sample = () => read(`(()=>{const c=document.querySelector('.yc-mode-chip'),i=c.querySelector('.yc-mode-chip__mode-icon'),b=c.querySelector('button'),s=getComputedStyle(c),r=e=>{const x=e.getBoundingClientRect();return{x:x.x,y:x.y,width:x.width,height:x.height}};return{chip:r(c),icon:r(i),button:b?r(b):null,background:s.backgroundColor,radius:s.borderRadius,color:s.color,expectedColor:s.getPropertyValue('--cr-text-secondary').trim(),font:s.fontSize,weight:s.fontWeight,line:s.lineHeight,padding:s.paddingLeft,iconOpacity:getComputedStyle(i).opacity,clearOpacity:b?getComputedStyle(b).opacity:null}})()`) + await pause() + for (const theme of ['light', 'dark']) for (const mode of ['plan', 'ask']) { + await read(`document.documentElement.dataset.theme='${theme}'; document.querySelector('.chat-pane').dataset.crTheme='${theme}'; qa.setMode('${mode}');qa.setDisabled(false);document.querySelector('#before').focus()`) + win.webContents.sendInputEvent({ type: 'mouseMove', x: 1, y: 1 }); await pause() + const normal = await sample(); samples.push({ theme, mode, state: 'normal', ...normal }) + check('transparent', normal.background, 'rgba(0, 0, 0, 0)'); check('pill', parseFloat(normal.radius) >= normal.chip.height / 2) + check('height', normal.chip.height, 32); check('font', normal.font, '13px'); check('weight', normal.weight, '500'); check('line', normal.line, '20px'); check('padding', normal.padding, '8px') + check('same slot', normal.icon, normal.button); check('icon width', normal.icon.width, 16); check('default icon', normal.iconOpacity, '1'); check('default close', normal.clearOpacity, '0') + check('secondary color', await read(`(()=>{const c=document.querySelector('.yc-mode-chip'),p=document.createElement('span');p.style.color='var(--cr-text-secondary)';c.append(p);const ok=getComputedStyle(p).color===getComputedStyle(c).color;p.remove();return ok})()`)) + win.webContents.sendInputEvent({ type: 'mouseMove', x: Math.round(normal.chip.x + normal.chip.width / 2), y: Math.round(normal.chip.y + normal.chip.height / 2) }); await pause() + const hover = await sample(); samples.push({ theme, mode, state: 'hover', ...hover }); check('hover icon hidden', hover.iconOpacity, '0'); check('hover X', hover.clearOpacity, '1'); check('no hover layout shift', hover.chip, normal.chip) + win.webContents.sendInputEvent({ type: 'mouseMove', x: 1, y: 1 }); await read(`document.querySelector('.yc-mode-chip').focus()`); await pause() + const focus = await sample(); check('focus icon hidden', focus.iconOpacity, '0'); check('focus X', focus.clearOpacity, '1'); check('no focus layout shift', focus.chip, normal.chip) + await fs.promises.writeFile(path.join(output, `${theme}-${mode}-focus.png`), (await win.webContents.capturePage()).toPNG()) + await key('Tab'); check('Tab reaches native clear', await read(`document.activeElement.matches('.yc-mode-chip__clear')`)) + const before = await read('qa.clears'); await key(mode === 'plan' ? 'Enter' : 'Space'); check('native keyboard exit', await read('qa.clears'), before + 1); check('craft hidden', await read(`!document.querySelector('.yc-mode-chip')`)) + await read(`qa.setMode('${mode}');qa.setDisabled(true)`); await pause(); check('disabled has no clear', await read(`!document.querySelector('.yc-mode-chip button')`)); check('disabled not tabbable', await read(`document.querySelector('.yc-mode-chip').tabIndex`), -1) + } + win.setSize(320, 300); await read(`qa.setMode('ask');qa.setDisabled(false)`); await pause(); const narrow = await sample(); check('narrow slot preserved', narrow.icon, narrow.button); check('narrow no overflow', narrow.chip.x + narrow.chip.width <= 320) + await fs.promises.writeFile(path.join(output, 'narrow.png'), (await win.webContents.capturePage()).toPNG()); check('no renderer errors', errors, []) + fs.writeFileSync(path.join(output, 'report.json'), JSON.stringify({ checks, samples, errors, sourceSha256: createHash('sha256').update(fs.readFileSync(file)).digest('hex'), scope: 'Own-YCode isolated component browser test, not full app/store integration or original-app pixel acceptance' }, null, 2)); app.exit(0) + } catch (error) { fs.writeFileSync(path.join(output, 'failure.txt'), String(error.stack || error)); console.error(error); app.exit(1) } + +})().catch(error=>{console.error(error);electronModule.app.exit(1)}); +} diff --git a/docs/协作/evidence/B01-review-02/mode-cjs-runner.txt b/docs/协作/evidence/B01-review-02/mode-cjs-runner.txt new file mode 100644 index 0000000..a4e4698 --- /dev/null +++ b/docs/协作/evidence/B01-review-02/mode-cjs-runner.txt @@ -0,0 +1,2 @@ + +{"exitCode":0,"signal":null} diff --git a/docs/协作/evidence/B01-review-02/mode-host-probe.cjs b/docs/协作/evidence/B01-review-02/mode-host-probe.cjs new file mode 100644 index 0000000..6c001f3 --- /dev/null +++ b/docs/协作/evidence/B01-review-02/mode-host-probe.cjs @@ -0,0 +1,84 @@ +const fs = require('node:fs/promises') +const path = require('node:path') +const { pathToFileURL } = require('node:url') + +if (!process.versions.electron) { + ;(async () => { + const dir = await fs.mkdtemp(path.resolve('.tmp/alignment-window-')) + const data = path.join(dir, 'data'), home = path.join(dir, 'home'), cwd = path.join(dir, 'workspace') + for (const folder of [data, home, cwd]) await fs.mkdir(folder) + const now = Date.now() + const model = { id:'audit-model', name:'Audit Model', providerId:'custom', model:'fixture', baseUrl:'http://127.0.0.1:1', authMode:'none', protocol:'anthropic', supportsToolCall:true } + await fs.writeFile(path.join(data,'models.json'), JSON.stringify({version:1, models:[model], selectedModelId:model.id})) + await fs.writeFile(path.join(data,'workspaces.json'),JSON.stringify({selectedWorkspaceId:'audit-space',workspaces:[{id:'audit-space',name:'Audit Workspace',root:cwd,createdAt:now}]})) + const question = { id:'q1', question:'Which target should be inspected?', answers:['Local fixture'] } + const messages = [ + {id:'u1',role:'user',content:'Inspect the local fixture.',createdAt:now-10000,status:'done'}, + {id:'a1',role:'assistant',content:'The local fixture is ready.',createdAt:now-9000,status:'done',turnStartedAt:now-10000,turnFinishedAt:now,turnDurationMs:10000, + tools:[{id:'q-tool',name:'AskUserQuestion',args:{questions:[question]},argsRaw:'{}',status:'ok',output:'ANSWER_RAW_SENTINEL',metadata:{questionAnswer:{questions:[question]}}}], + parts:[{type:'reasoning',id:'r1',text:'I need the target.',finished:true},{type:'tool',toolId:'q-tool'},{type:'reasoning',id:'r2',text:'The target is selected.',finished:true},{type:'text',text:'The local fixture is ready.'}]} + ] + const session = (id,agentMode,ms) => ({id,title:`Audit ${agentMode}`,cwd,workspaceId:'audit-space',modelId:model.id,agentMode,permissionMode:'full-access',createdAt:ms,updatedAt:ms,messages}) + await fs.writeFile(path.join(data,'sessions.json'),JSON.stringify({sessions:[session('audit-plan','plan',now+1),session('audit-ask','ask',now)]})) + const env={...process.env,YCODE_USER_DATA_DIR:data,YCODE_QA_DIRECTORY:dir,YCODE_QA_OFFSCREEN:'1',YCODE_DISABLE_GPU:'1',YCODE_DISABLE_SYSTEM_INTEGRATION:'1',AUDIT_WINDOW_DIR:dir} + 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']}) + let log='';child.stdout.on('data',x=>{log+=x});child.stderr.on('data',x=>{log+=x}) + const timeout=setTimeout(()=>child.kill(),90000) + child.on('exit',async code=>{clearTimeout(timeout);await fs.writeFile(path.join(dir,'process.log'),log);console.log(JSON.stringify({directory:dir,exitCode:code}));if(code)console.error(log.slice(-7000));process.exitCode=code??1}) + })().catch(e=>{console.error(e);process.exitCode=1}) +} else { + const {app,BrowserWindow,ipcMain}=require('electron') + const dir=process.env.AUDIT_WINDOW_DIR + app.disableHardwareAcceleration();app.setPath('home',path.join(dir,'home')) + const originalHandle=ipcMain.handle.bind(ipcMain) + ipcMain.handle=(channel,listener)=>originalHandle(channel,async(...args)=>{if(channel==='session:messages')await new Promise(r=>setTimeout(r,1200));return listener(...args)}) + let win + const pause=ms=>new Promise(r=>setTimeout(r,ms)) + const read=code=>win.webContents.executeJavaScript(code) + async function wait(code){for(let i=0;i<250;i++){const x=await read(code);if(x)return x;await pause(40)}throw new Error('Timeout '+code)} + async function shot(name){await read('document.fonts.ready');await pause(80);await fs.writeFile(path.join(dir,name+'.png'),(await win.webContents.capturePage()).toPNG())} + const styleProbe=`(selector)=>{const e=document.querySelector(selector);if(!e)return null;const c=getComputedStyle(e),r=e.getBoundingClientRect();return {selector,text:e.textContent,width:r.width,height:r.height,fontSize:c.fontSize,fontWeight:c.fontWeight,lineHeight:c.lineHeight,padding:c.padding,borderRadius:c.borderRadius,background:c.backgroundColor,color:c.color,display:c.display,opacity:c.opacity}}` + const styles=selectors=>read(`(()=>{const p=${styleProbe};return ${JSON.stringify(selectors)}.map(p)})()`) + ;(async()=>{ + await import(pathToFileURL(path.resolve('out/main/index.mjs')).href);await app.whenReady();win=BrowserWindow.getAllWindows()[0];win.setSize(1336,902);win.showInactive() + const errors=[];win.webContents.on('console-message',(_e,level,message)=>{if(level>=3)errors.push(message)}) + await wait('!!document.querySelector(".yc-session-skeleton")') + const skeleton=await styles(['.yc-session-skeleton','.yc-session-skeleton__avatar','.yc-session-skeleton__name','.yc-session-skeleton__user','.yc-session-skeleton__line','.yc-session-skeleton__line--short']) + await shot('loading') + await wait('!!document.querySelector(".yc-mode-chip") && !!document.querySelector(".msg--assistant")') + await pause(350) + const mode=await styles(['.yc-mode-chip','.yc-mode-chip__mode-icon','.yc-mode-chip__clear']) + await shot('plan') + await read('document.querySelector(".yc-mode-chip").focus()') + const focusedMode=await styles(['.yc-mode-chip','.yc-mode-chip__mode-icon','.yc-mode-chip__clear']) + await shot('plan-focus') + + const checks=[]; + for(const agentMode of ['plan','ask']){ + const sessionId='audit-'+agentMode; + if(agentMode==='ask'){ + await read('document.querySelector("[data-session-id=\\"audit-ask\\"]").click()'); + await wait('!!document.querySelector(".yc-mode-chip") && !document.querySelector(".yc-session-skeleton") && document.querySelector(".yc-mode-chip").textContent.includes("仅问答")'); + } + await read('document.querySelector(".wb-composer textarea").focus()'); + await win.webContents.insertText('KEEP_'+agentMode+'_DRAFT'); + await wait('document.querySelector(".wb-composer textarea").value.includes("KEEP_'+agentMode+'_DRAFT")'); + const before=await read('({draft:document.querySelector(".wb-composer textarea").value,permissionDisabled:document.querySelector(".yc-source-permission-trigger > button").disabled})'); + const metadataBefore=await read('window.ycode.session.list().then(list=>list.find(item=>item.id==='+JSON.stringify(sessionId)+'))'); + await read('document.querySelector(".yc-mode-chip__clear").focus()'); + win.focus();win.webContents.focus();await pause(100); + win.webContents.sendInputEvent({type:'keyDown',keyCode:'Enter'}); + win.webContents.sendInputEvent({type:'char',keyCode:'\r'}); + win.webContents.sendInputEvent({type:'keyUp',keyCode:'Enter'}); + await wait('!document.querySelector(".yc-mode-chip")'); + const after=await read('({draft:document.querySelector(".wb-composer textarea").value,permissionDisabled:document.querySelector(".yc-source-permission-trigger > button").disabled})'); + const metadataAfter=await read('window.ycode.session.list().then(list=>list.find(item=>item.id==='+JSON.stringify(sessionId)+'))'); + if(before.draft!==after.draft||!before.permissionDisabled||after.permissionDisabled||metadataBefore.permissionMode!=='full-access'||metadataAfter.permissionMode!=='full-access'||metadataAfter.agentMode!=='craft')throw Error('Mode host state mismatch '+agentMode); + checks.push({agentMode,before,after,savedPermissionBefore:metadataBefore.permissionMode,savedPermissionAfter:metadataAfter.permissionMode,savedModeAfter:metadataAfter.agentMode}); + await shot(agentMode+'-craft-draft-kept'); + } + await fs.writeFile(path.join(dir,'report.json'),JSON.stringify({codeSha:'1ed71b63b5af9a98b942ff47c66df5799d4d2c8a',scope:'Actual isolated app; native keyboard exits plan/ask with draft and saved permission retained; no model requests',checks,errors},null,2)); + if(errors.length)throw Error('Renderer errors');app.exit(0); + })().catch(async e=>{console.error(e);if(win)await shot('failure').catch(()=>{});await fs.writeFile(path.join(dir,'failure.txt'),String(e));app.exit(1)}) +} diff --git a/docs/协作/evidence/B01-review-02/mode-host-report.json b/docs/协作/evidence/B01-review-02/mode-host-report.json new file mode 100644 index 0000000..701c591 --- /dev/null +++ b/docs/协作/evidence/B01-review-02/mode-host-report.json @@ -0,0 +1,35 @@ +{ + "codeSha": "1ed71b63b5af9a98b942ff47c66df5799d4d2c8a", + "scope": "Actual isolated app; native keyboard exits plan/ask with draft and saved permission retained; no model requests", + "checks": [ + { + "agentMode": "plan", + "before": { + "draft": "KEEP_plan_DRAFT", + "permissionDisabled": true + }, + "after": { + "draft": "KEEP_plan_DRAFT", + "permissionDisabled": false + }, + "savedPermissionBefore": "full-access", + "savedPermissionAfter": "full-access", + "savedModeAfter": "craft" + }, + { + "agentMode": "ask", + "before": { + "draft": "KEEP_ask_DRAFT", + "permissionDisabled": true + }, + "after": { + "draft": "KEEP_ask_DRAFT", + "permissionDisabled": false + }, + "savedPermissionBefore": "full-access", + "savedPermissionAfter": "full-access", + "savedModeAfter": "craft" + } + ], + "errors": [] +} \ No newline at end of file diff --git a/docs/协作/evidence/B01-review-02/mode-plan-focus.png b/docs/协作/evidence/B01-review-02/mode-plan-focus.png new file mode 100644 index 0000000000000000000000000000000000000000..82a5e12167ecb8c85d89a5615a8ae9f5a54da5c3 GIT binary patch literal 3418 zcmeHK={wtr7XFpGx>(xLj#f>zPX|q{tx|*-RaeE5);hJ0QDP6ZwnWguv|4nU+9Oky zY8qlM2@*q5X=5)!g0WOX6D6{ckgNA^xS!^^=fioZx$07N+3EhI)mf*TiP}d~WMg!=Tu4U7+!-ZEhN-E;cR$KKfNvqy zm6*v&*L46hxqo#VhK$EEnx;0G@-o)C(tt zn|u&!$Fvuj&o>S!TQhCd)lC$SD0gOE>BgK)kes1WWySY*-`Y#*6<~|7eOh%;%+Yfe z+pWh!VrU0V&bU1^XR!mXmGMU7N@XjT`dRhnF?#xd9d*!YPEpo(c~U5RG^_e zmF1kC)sX(nQ#i^ZKkLAj+jAM#D&JG|DYe^Dh;1M25ZY^D2ekn}siu3l8~{4&oelQ^ z`}eB=KmGJiD|TigB`w+hA*OTv!sW+BDZ&zyZa=Xff3a=iOA@lbg(3`IU8aZf+jU-3 z+O~I!E&$OtGT6R9cWj?wG$e4Q1hZi?jRDSd)p9Rhf{2$GxgF#>5mgIG`N*1OmAGs# z>A);E#|Yq2Zf|d|^zN$RCq+QL{KZMfLFUgs4YO&kQAuVRj}X;Z5jaHM_6{JbrU|bfxiY2|ZgyVSrh_S(xGgTWN!rfo75rkfh_SJTz<)8|$X0)07w z^GdD|W8IQnCLI3AV9e$31Ndk+Pt)sR)!0eY=MO%G+6Ew&uo9%#@!CJMbfLW~r$yH% z&M&mT?rdJ9OWpm1n;pIo}TbV#@_sU8+6vgp`E|nS+CB_`Tj#k6I=_2hFty} zD7SOZSQWcH+%*ALgw(XY?`c%kzn3(;Xk>)3G9&*Q%{Y|@!}2zW^Yb=M3vDCl0*E-z zb%1K9xVN*M!{yWEu*h-Vf~T|iS}1=*(rbWT^KL?qO!df4S4Rf!ybZ89-6qY-)zs7! z>VaicWYZSj-JA*Vx)k{CkCPyro5{wh=HvJyma+PhQGQ@**&Z=O+mxVMf6w(HvOD96 z2E!1(T5VlChA!|BmX5J|-AOB_GiSM;3YKjNA4RU0K)9w~{raXJlepsSXO?wr!f`xE z594P3CTi@cY5dC2bDQM>%whlE?!#8bIlomzfpCtLX_BfxDhdk1tqmp%9{6HOf~kh_ zb4K_?tTNGG>Q7~CEo9P{TBNtuHmAtlm@sH4eCMf^hOhDYrzNyL1tugms9Qvv!F%5= z<*P&RAD=My;MNvda&S%yZSZf{5tAr4a?mtAS!ZT|ZZ6X(leX}F54M^yr^iRX@cmLS zvVmOJQ4e2DEWgW+RjK7ZaiLZExsTcrMG4c>H1I0cXOu6XcHEm~j}$KiD>HY$(sndh z2nPOwLYt%u?Q#KnjuO{*D&9dU@hP52)GwubxPObFMh2No?v|wMnO9PF22)o_cGT9d zq`y?E&^tabW3k4kIuJM^ep_q5dOJr4-Rfm;a6K{ zL%xJN*Ai#qx*pC_{&;9EAXT2lte0!=1Nx|ennfj}1j3cukTRF5JcZLk3xj*tBhoo* z;~$53j{>GqNu7%8j+EKrwMjJlZf{+~6L(I^2G^I-8WUKW?C|W_Gdi8lh)C#6+s8rO z(8n@1=IDVr&ZJKoTuY8@_K8u^_C(d7U!lvgGsfHmr^-FW8>LFd-BqMN8dqshmdy}e z2~yCx)8fB&kDphMflyP%|9oge899rI_ptBB%^XkmIeBwe5UqeQ1sd`o1VWM~AXbAPgY;4CQ94 z<=bP-6FElwbW-;{Tnah1YpOJOh8!z;mX|PCiR1MKd18{f5Lu5nJR-d9#qJw90z@cE zZ^?z~XswAh^x~;WyOQ}?i0*%d!pB}P097yA_0>?=c0GD_#X;vZz%FfZKy(>xk(clt z08GVJtM~5%)Eobi-r}F?nf{OKfA53mqyXoKm5STHc!%u$On|+u^EKktUo!p!YQ=@6 literal 0 HcmV?d00001 diff --git a/docs/协作/evidence/B01-review-02/mode-report.json b/docs/协作/evidence/B01-review-02/mode-report.json new file mode 100644 index 0000000..d21d803 --- /dev/null +++ b/docs/协作/evidence/B01-review-02/mode-report.json @@ -0,0 +1,368 @@ +{ + "checks": [ + "transparent", + "pill", + "height", + "font", + "weight", + "line", + "padding", + "same slot", + "icon width", + "default icon", + "default close", + "secondary color", + "hover icon hidden", + "hover X", + "no hover layout shift", + "focus icon hidden", + "focus X", + "no focus layout shift", + "Tab reaches native clear", + "native keyboard exit", + "craft hidden", + "disabled has no clear", + "disabled not tabbable", + "transparent", + "pill", + "height", + "font", + "weight", + "line", + "padding", + "same slot", + "icon width", + "default icon", + "default close", + "secondary color", + "hover icon hidden", + "hover X", + "no hover layout shift", + "focus icon hidden", + "focus X", + "no focus layout shift", + "Tab reaches native clear", + "native keyboard exit", + "craft hidden", + "disabled has no clear", + "disabled not tabbable", + "transparent", + "pill", + "height", + "font", + "weight", + "line", + "padding", + "same slot", + "icon width", + "default icon", + "default close", + "secondary color", + "hover icon hidden", + "hover X", + "no hover layout shift", + "focus icon hidden", + "focus X", + "no focus layout shift", + "Tab reaches native clear", + "native keyboard exit", + "craft hidden", + "disabled has no clear", + "disabled not tabbable", + "transparent", + "pill", + "height", + "font", + "weight", + "line", + "padding", + "same slot", + "icon width", + "default icon", + "default close", + "secondary color", + "hover icon hidden", + "hover X", + "no hover layout shift", + "focus icon hidden", + "focus X", + "no focus layout shift", + "Tab reaches native clear", + "native keyboard exit", + "craft hidden", + "disabled has no clear", + "disabled not tabbable", + "narrow slot preserved", + "narrow no overflow", + "no renderer errors" + ], + "samples": [ + { + "theme": "light", + "mode": "plan", + "state": "normal", + "chip": { + "x": 88.125, + "y": 40, + "width": 62, + "height": 32 + }, + "icon": { + "x": 96.125, + "y": 48, + "width": 16, + "height": 16 + }, + "button": { + "x": 96.125, + "y": 48, + "width": 16, + "height": 16 + }, + "background": "rgba(0, 0, 0, 0)", + "radius": "9999px", + "color": "rgba(0, 0, 0, 0.7)", + "expectedColor": "#000000b3", + "font": "13px", + "weight": "500", + "line": "20px", + "padding": "8px", + "iconOpacity": "1", + "clearOpacity": "0" + }, + { + "theme": "light", + "mode": "plan", + "state": "hover", + "chip": { + "x": 88.125, + "y": 40, + "width": 62, + "height": 32 + }, + "icon": { + "x": 96.125, + "y": 48, + "width": 16, + "height": 16 + }, + "button": { + "x": 96.125, + "y": 48, + "width": 16, + "height": 16 + }, + "background": "rgba(0, 0, 0, 0)", + "radius": "9999px", + "color": "rgba(0, 0, 0, 0.7)", + "expectedColor": "#000000b3", + "font": "13px", + "weight": "500", + "line": "20px", + "padding": "8px", + "iconOpacity": "0", + "clearOpacity": "1" + }, + { + "theme": "light", + "mode": "ask", + "state": "normal", + "chip": { + "x": 88.125, + "y": 40, + "width": 75, + "height": 32 + }, + "icon": { + "x": 96.125, + "y": 48, + "width": 16, + "height": 16 + }, + "button": { + "x": 96.125, + "y": 48, + "width": 16, + "height": 16 + }, + "background": "rgba(0, 0, 0, 0)", + "radius": "9999px", + "color": "rgba(0, 0, 0, 0.7)", + "expectedColor": "#000000b3", + "font": "13px", + "weight": "500", + "line": "20px", + "padding": "8px", + "iconOpacity": "1", + "clearOpacity": "0" + }, + { + "theme": "light", + "mode": "ask", + "state": "hover", + "chip": { + "x": 88.125, + "y": 40, + "width": 75, + "height": 32 + }, + "icon": { + "x": 96.125, + "y": 48, + "width": 16, + "height": 16 + }, + "button": { + "x": 96.125, + "y": 48, + "width": 16, + "height": 16 + }, + "background": "rgba(0, 0, 0, 0)", + "radius": "9999px", + "color": "rgba(0, 0, 0, 0.7)", + "expectedColor": "#000000b3", + "font": "13px", + "weight": "500", + "line": "20px", + "padding": "8px", + "iconOpacity": "0", + "clearOpacity": "1" + }, + { + "theme": "dark", + "mode": "plan", + "state": "normal", + "chip": { + "x": 88.125, + "y": 40, + "width": 62, + "height": 32 + }, + "icon": { + "x": 96.125, + "y": 48, + "width": 16, + "height": 16 + }, + "button": { + "x": 96.125, + "y": 48, + "width": 16, + "height": 16 + }, + "background": "rgba(0, 0, 0, 0)", + "radius": "9999px", + "color": "rgba(255, 255, 255, 0.65)", + "expectedColor": "#ffffffa6", + "font": "13px", + "weight": "500", + "line": "20px", + "padding": "8px", + "iconOpacity": "1", + "clearOpacity": "0" + }, + { + "theme": "dark", + "mode": "plan", + "state": "hover", + "chip": { + "x": 88.125, + "y": 40, + "width": 62, + "height": 32 + }, + "icon": { + "x": 96.125, + "y": 48, + "width": 16, + "height": 16 + }, + "button": { + "x": 96.125, + "y": 48, + "width": 16, + "height": 16 + }, + "background": "rgba(0, 0, 0, 0)", + "radius": "9999px", + "color": "rgba(255, 255, 255, 0.65)", + "expectedColor": "#ffffffa6", + "font": "13px", + "weight": "500", + "line": "20px", + "padding": "8px", + "iconOpacity": "0", + "clearOpacity": "1" + }, + { + "theme": "dark", + "mode": "ask", + "state": "normal", + "chip": { + "x": 88.125, + "y": 40, + "width": 75, + "height": 32 + }, + "icon": { + "x": 96.125, + "y": 48, + "width": 16, + "height": 16 + }, + "button": { + "x": 96.125, + "y": 48, + "width": 16, + "height": 16 + }, + "background": "rgba(0, 0, 0, 0)", + "radius": "9999px", + "color": "rgba(255, 255, 255, 0.65)", + "expectedColor": "#ffffffa6", + "font": "13px", + "weight": "500", + "line": "20px", + "padding": "8px", + "iconOpacity": "1", + "clearOpacity": "0" + }, + { + "theme": "dark", + "mode": "ask", + "state": "hover", + "chip": { + "x": 88.125, + "y": 40, + "width": 75, + "height": 32 + }, + "icon": { + "x": 96.125, + "y": 48, + "width": 16, + "height": 16 + }, + "button": { + "x": 96.125, + "y": 48, + "width": 16, + "height": 16 + }, + "background": "rgba(0, 0, 0, 0)", + "radius": "9999px", + "color": "rgba(255, 255, 255, 0.65)", + "expectedColor": "#ffffffa6", + "font": "13px", + "weight": "500", + "line": "20px", + "padding": "8px", + "iconOpacity": "0", + "clearOpacity": "1" + } + ], + "errors": [], + "sourceSha256": "805cb1c06baf00480f2cbfad8e432d0c984a3b2cce2e12683a9db2defbbe6110", + "scope": "Own-YCode isolated component browser test, not full app/store integration or original-app pixel acceptance" +} \ No newline at end of file diff --git a/docs/协作/evidence/B01-review-02/original-mode-runner.txt b/docs/协作/evidence/B01-review-02/original-mode-runner.txt new file mode 100644 index 0000000..904181b --- /dev/null +++ b/docs/协作/evidence/B01-review-02/original-mode-runner.txt @@ -0,0 +1,2 @@ + +{"output":"C:\\Users\\Administrator\\.codex\\worktrees\\b01-accept-01\\YCode\\.tmp\\mode-chip-native-iW7Uhk","exitCode":null} diff --git a/docs/协作/evidence/B01-review-02/popconfirm-browser-report.json b/docs/协作/evidence/B01-review-02/popconfirm-browser-report.json new file mode 100644 index 0000000..d38accf --- /dev/null +++ b/docs/协作/evidence/B01-review-02/popconfirm-browser-report.json @@ -0,0 +1,817 @@ +{ + "pass": true, + "results": [ + { + "label": "light/archive/false geometry", + "actual": [ + "66px", + "19px", + "19px", + "28px", + "6px", + "12px" + ], + "expected": [ + "66px", + "19px", + "19px", + "28px", + "6px", + "12px" + ] + }, + { + "label": "light/archive/false geometry", + "actual": [ + "66px", + "19px", + "19px", + "28px", + "6px", + "12px" + ], + "expected": [ + "66px", + "19px", + "19px", + "28px", + "6px", + "12px" + ] + }, + { + "label": "light/archive/false primary/danger colors", + "actual": [ + "rgba(0, 0, 0, 0.9)", + "rgb(255, 255, 255)" + ], + "expected": [ + "rgba(0, 0, 0, 0.9)", + "rgb(255, 255, 255)" + ] + }, + { + "label": "light/archive/false secondary colors/border", + "actual": [ + "rgb(255, 255, 255)", + "1px", + "solid", + "rgb(222, 222, 222)" + ], + "expected": [ + "rgb(255, 255, 255)", + "1px", + "solid", + "rgb(222, 222, 222)" + ] + }, + { + "label": "light/archive/false shell", + "actual": [ + "240px", + "16px", + "600" + ], + "expected": [ + "240px", + "16px", + "600" + ] + }, + { + "label": "light/archive/false shell background", + "actual": "rgb(255, 255, 255)", + "expected": "rgb(255, 255, 255)" + }, + { + "label": "light/archive/false initial focus", + "actual": true, + "expected": true + }, + { + "label": "light/archive/false busy prevents duplicates", + "actual": [ + 1, + true, + true, + "处理中…" + ], + "expected": [ + 1, + true, + true, + "处理中…" + ] + }, + { + "label": "light/archive/false busy cannot dismiss", + "actual": 0, + "expected": 0 + }, + { + "label": "light/archive/false failure retained", + "actual": "fixture failure", + "expected": "fixture failure" + }, + { + "label": "light/archive/false retry enabled", + "actual": false, + "expected": false + }, + { + "label": "light/archive/false retry success", + "actual": [ + 2, + 1, + false + ], + "expected": [ + 2, + 1, + false + ] + }, + { + "label": "light/delete/false geometry", + "actual": [ + "66px", + "19px", + "19px", + "28px", + "6px", + "12px" + ], + "expected": [ + "66px", + "19px", + "19px", + "28px", + "6px", + "12px" + ] + }, + { + "label": "light/delete/false geometry", + "actual": [ + "66px", + "19px", + "19px", + "28px", + "6px", + "12px" + ], + "expected": [ + "66px", + "19px", + "19px", + "28px", + "6px", + "12px" + ] + }, + { + "label": "light/delete/false primary/danger colors", + "actual": [ + "rgb(232, 92, 92)", + "rgb(255, 255, 255)" + ], + "expected": [ + "rgb(232, 92, 92)", + "rgb(255, 255, 255)" + ] + }, + { + "label": "light/delete/false secondary colors/border", + "actual": [ + "rgb(255, 255, 255)", + "1px", + "solid", + "rgb(222, 222, 222)" + ], + "expected": [ + "rgb(255, 255, 255)", + "1px", + "solid", + "rgb(222, 222, 222)" + ] + }, + { + "label": "light/delete/false shell", + "actual": [ + "240px", + "16px", + "600" + ], + "expected": [ + "240px", + "16px", + "600" + ] + }, + { + "label": "light/delete/false shell background", + "actual": "rgb(255, 255, 255)", + "expected": "rgb(255, 255, 255)" + }, + { + "label": "light/delete/false initial focus", + "actual": true, + "expected": true + }, + { + "label": "light/delete/false busy prevents duplicates", + "actual": [ + 1, + true, + true, + "处理中…" + ], + "expected": [ + 1, + true, + true, + "处理中…" + ] + }, + { + "label": "light/delete/false busy cannot dismiss", + "actual": 0, + "expected": 0 + }, + { + "label": "light/delete/false danger busy background", + "actual": "rgb(245, 185, 185)", + "expected": "rgb(245, 185, 185)" + }, + { + "label": "light/delete/false failure retained", + "actual": "fixture failure", + "expected": "fixture failure" + }, + { + "label": "light/delete/false retry enabled", + "actual": false, + "expected": false + }, + { + "label": "light/delete/false retry success", + "actual": [ + 2, + 1, + false + ], + "expected": [ + 2, + 1, + false + ] + }, + { + "label": "light/delete/true geometry", + "actual": [ + "66px", + "19px", + "19px", + "28px", + "6px", + "12px" + ], + "expected": [ + "66px", + "19px", + "19px", + "28px", + "6px", + "12px" + ] + }, + { + "label": "light/delete/true geometry", + "actual": [ + "66px", + "19px", + "19px", + "28px", + "6px", + "12px" + ], + "expected": [ + "66px", + "19px", + "19px", + "28px", + "6px", + "12px" + ] + }, + { + "label": "light/delete/true primary/danger colors", + "actual": [ + "rgb(232, 92, 92)", + "rgb(255, 255, 255)" + ], + "expected": [ + "rgb(232, 92, 92)", + "rgb(255, 255, 255)" + ] + }, + { + "label": "light/delete/true secondary colors/border", + "actual": [ + "rgb(255, 255, 255)", + "1px", + "solid", + "rgb(222, 222, 222)" + ], + "expected": [ + "rgb(255, 255, 255)", + "1px", + "solid", + "rgb(222, 222, 222)" + ] + }, + { + "label": "light/delete/true shell", + "actual": [ + "240px", + "16px", + "600" + ], + "expected": [ + "240px", + "16px", + "600" + ] + }, + { + "label": "light/delete/true shell background", + "actual": "rgb(255, 255, 255)", + "expected": "rgb(255, 255, 255)" + }, + { + "label": "light/delete/true initial focus", + "actual": true, + "expected": true + }, + { + "label": "light/delete/true running delete semantic", + "actual": "停止并删除", + "expected": "停止并删除" + }, + { + "label": "light/delete/true busy prevents duplicates", + "actual": [ + 1, + true, + true, + "处理中…" + ], + "expected": [ + 1, + true, + true, + "处理中…" + ] + }, + { + "label": "light/delete/true busy cannot dismiss", + "actual": 0, + "expected": 0 + }, + { + "label": "light/delete/true danger busy background", + "actual": "rgb(245, 185, 185)", + "expected": "rgb(245, 185, 185)" + }, + { + "label": "light/delete/true failure retained", + "actual": "fixture failure", + "expected": "fixture failure" + }, + { + "label": "light/delete/true retry enabled", + "actual": false, + "expected": false + }, + { + "label": "light/delete/true retry success", + "actual": [ + 2, + 1, + false + ], + "expected": [ + 2, + 1, + false + ] + }, + { + "label": "dark/archive/false geometry", + "actual": [ + "66px", + "19px", + "19px", + "28px", + "6px", + "12px" + ], + "expected": [ + "66px", + "19px", + "19px", + "28px", + "6px", + "12px" + ] + }, + { + "label": "dark/archive/false geometry", + "actual": [ + "66px", + "19px", + "19px", + "28px", + "6px", + "12px" + ], + "expected": [ + "66px", + "19px", + "19px", + "28px", + "6px", + "12px" + ] + }, + { + "label": "dark/archive/false primary/danger colors", + "actual": [ + "rgba(255, 255, 255, 0.9)", + "rgba(0, 0, 0, 0.9)" + ], + "expected": [ + "rgba(255, 255, 255, 0.9)", + "rgba(0, 0, 0, 0.9)" + ] + }, + { + "label": "dark/archive/false secondary colors/border", + "actual": [ + "rgb(38, 38, 38)", + "1px", + "solid", + "rgb(61, 61, 61)" + ], + "expected": [ + "rgb(38, 38, 38)", + "1px", + "solid", + "rgb(61, 61, 61)" + ] + }, + { + "label": "dark/archive/false shell", + "actual": [ + "240px", + "16px", + "600" + ], + "expected": [ + "240px", + "16px", + "600" + ] + }, + { + "label": "dark/archive/false shell background", + "actual": "rgb(36, 36, 36)", + "expected": "rgb(36, 36, 36)" + }, + { + "label": "dark/archive/false initial focus", + "actual": true, + "expected": true + }, + { + "label": "dark/archive/false busy prevents duplicates", + "actual": [ + 1, + true, + true, + "处理中…" + ], + "expected": [ + 1, + true, + true, + "处理中…" + ] + }, + { + "label": "dark/archive/false busy cannot dismiss", + "actual": 0, + "expected": 0 + }, + { + "label": "dark/archive/false failure retained", + "actual": "fixture failure", + "expected": "fixture failure" + }, + { + "label": "dark/archive/false retry enabled", + "actual": false, + "expected": false + }, + { + "label": "dark/archive/false retry success", + "actual": [ + 2, + 1, + false + ], + "expected": [ + 2, + 1, + false + ] + }, + { + "label": "dark/delete/false geometry", + "actual": [ + "66px", + "19px", + "19px", + "28px", + "6px", + "12px" + ], + "expected": [ + "66px", + "19px", + "19px", + "28px", + "6px", + "12px" + ] + }, + { + "label": "dark/delete/false geometry", + "actual": [ + "66px", + "19px", + "19px", + "28px", + "6px", + "12px" + ], + "expected": [ + "66px", + "19px", + "19px", + "28px", + "6px", + "12px" + ] + }, + { + "label": "dark/delete/false primary/danger colors", + "actual": [ + "rgb(175, 25, 26)", + "rgb(255, 255, 255)" + ], + "expected": [ + "rgb(175, 25, 26)", + "rgb(255, 255, 255)" + ] + }, + { + "label": "dark/delete/false secondary colors/border", + "actual": [ + "rgb(38, 38, 38)", + "1px", + "solid", + "rgb(61, 61, 61)" + ], + "expected": [ + "rgb(38, 38, 38)", + "1px", + "solid", + "rgb(61, 61, 61)" + ] + }, + { + "label": "dark/delete/false shell", + "actual": [ + "240px", + "16px", + "600" + ], + "expected": [ + "240px", + "16px", + "600" + ] + }, + { + "label": "dark/delete/false shell background", + "actual": "rgb(36, 36, 36)", + "expected": "rgb(36, 36, 36)" + }, + { + "label": "dark/delete/false initial focus", + "actual": true, + "expected": true + }, + { + "label": "dark/delete/false busy prevents duplicates", + "actual": [ + 1, + true, + true, + "处理中…" + ], + "expected": [ + 1, + true, + true, + "处理中…" + ] + }, + { + "label": "dark/delete/false busy cannot dismiss", + "actual": 0, + "expected": 0 + }, + { + "label": "dark/delete/false danger busy background", + "actual": "rgb(128, 56, 56)", + "expected": "rgb(128, 56, 56)" + }, + { + "label": "dark/delete/false failure retained", + "actual": "fixture failure", + "expected": "fixture failure" + }, + { + "label": "dark/delete/false retry enabled", + "actual": false, + "expected": false + }, + { + "label": "dark/delete/false retry success", + "actual": [ + 2, + 1, + false + ], + "expected": [ + 2, + 1, + false + ] + }, + { + "label": "dark/delete/true geometry", + "actual": [ + "66px", + "19px", + "19px", + "28px", + "6px", + "12px" + ], + "expected": [ + "66px", + "19px", + "19px", + "28px", + "6px", + "12px" + ] + }, + { + "label": "dark/delete/true geometry", + "actual": [ + "66px", + "19px", + "19px", + "28px", + "6px", + "12px" + ], + "expected": [ + "66px", + "19px", + "19px", + "28px", + "6px", + "12px" + ] + }, + { + "label": "dark/delete/true primary/danger colors", + "actual": [ + "rgb(175, 25, 26)", + "rgb(255, 255, 255)" + ], + "expected": [ + "rgb(175, 25, 26)", + "rgb(255, 255, 255)" + ] + }, + { + "label": "dark/delete/true secondary colors/border", + "actual": [ + "rgb(38, 38, 38)", + "1px", + "solid", + "rgb(61, 61, 61)" + ], + "expected": [ + "rgb(38, 38, 38)", + "1px", + "solid", + "rgb(61, 61, 61)" + ] + }, + { + "label": "dark/delete/true shell", + "actual": [ + "240px", + "16px", + "600" + ], + "expected": [ + "240px", + "16px", + "600" + ] + }, + { + "label": "dark/delete/true shell background", + "actual": "rgb(36, 36, 36)", + "expected": "rgb(36, 36, 36)" + }, + { + "label": "dark/delete/true initial focus", + "actual": true, + "expected": true + }, + { + "label": "dark/delete/true running delete semantic", + "actual": "停止并删除", + "expected": "停止并删除" + }, + { + "label": "dark/delete/true busy prevents duplicates", + "actual": [ + 1, + true, + true, + "处理中…" + ], + "expected": [ + 1, + true, + true, + "处理中…" + ] + }, + { + "label": "dark/delete/true busy cannot dismiss", + "actual": 0, + "expected": 0 + }, + { + "label": "dark/delete/true danger busy background", + "actual": "rgb(128, 56, 56)", + "expected": "rgb(128, 56, 56)" + }, + { + "label": "dark/delete/true failure retained", + "actual": "fixture failure", + "expected": "fixture failure" + }, + { + "label": "dark/delete/true retry enabled", + "actual": false, + "expected": false + }, + { + "label": "dark/delete/true retry success", + "actual": [ + 2, + 1, + false + ], + "expected": [ + 2, + 1, + false + ] + } + ], + "rendererErrors": [], + "scope": "Actual Electron Chromium component fixture; isolated callbacks, no IPC/model/session execution" +} \ No newline at end of file diff --git a/docs/协作/evidence/B01-review-02/popconfirm-cjs-runner.cjs b/docs/协作/evidence/B01-review-02/popconfirm-cjs-runner.cjs new file mode 100644 index 0000000..ca011ef --- /dev/null +++ b/docs/协作/evidence/B01-review-02/popconfirm-cjs-runner.cjs @@ -0,0 +1,44 @@ +// Acceptance-only Electron runner for the unchanged supplied Chromium HTML fixture. +const fs = require('fs') +const path = require('path') +const assert = require('assert/strict') +const electron = require('electron') +const directory = path.resolve(process.argv.at(-1)) +assert.ok(path.dirname(directory) === path.resolve('.tmp') && path.basename(directory).startsWith('task-popconfirm-browser-')) +if (!process.versions.electron) { + const env = { ...process.env } + delete env.ELECTRON_RUN_AS_NODE + delete env.ELECTRON_RENDERER_URL + const child = require('child_process').spawn(electron, [__filename, directory], { env, windowsHide: true, stdio: 'inherit' }) + const timer = setTimeout(() => child.kill(), 60000) + child.once('exit', (code, signal) => { + clearTimeout(timer) + console.log(JSON.stringify({ directory, exitCode: code, signal })) + process.exitCode = code === 0 ? 0 : 1 + }) +} else { + const { app, BrowserWindow } = electron + const data = path.join(directory, 'electron-profile') + fs.mkdirSync(data, { recursive: true }) + app.setPath('userData', data) + app.disableHardwareAcceleration() + app.whenReady().then(async () => { + const win = new BrowserWindow({ width: 1000, height: 700, show: false, webPreferences: { contextIsolation: true, nodeIntegration: false, backgroundThrottling: false } }) + const errors = [] + win.webContents.on('console-message', event => { if (event.level === 'error' || event.level >= 3) errors.push(event.message) }) + await win.loadFile(path.join(directory, 'index.html')) + win.showInactive() + for (let i = 0; i < 300; i++) { + const result = await win.webContents.executeJavaScript('document.querySelector("#result")?.textContent') + if (result) { + const report = JSON.parse(result) + fs.writeFileSync(path.join(directory, 'electron-report.json'), JSON.stringify({ ...report, rendererErrors: errors, scope: 'Actual Electron Chromium component fixture; isolated callbacks, no IPC/model/session execution' }, null, 2)) + console.log(JSON.stringify({ pass: report.pass, checks: report.results.length, error: report.error, rendererErrors: errors })) + app.exit(report.pass && errors.length === 0 ? 0 : 1) + return + } + await new Promise(resolve => setTimeout(resolve, 80)) + } + throw Error('Fixture result timed out') + }).catch(error => { console.error(error); app.exit(1) }) +} diff --git a/docs/协作/evidence/B01-review-02/question-report.json b/docs/协作/evidence/B01-review-02/question-report.json new file mode 100644 index 0000000..a1a91ee --- /dev/null +++ b/docs/协作/evidence/B01-review-02/question-report.json @@ -0,0 +1,362 @@ +{ + "codeSha": "1ed71b63b5af9a98b942ff47c66df5799d4d2c8a", + "scope": "Real isolated Windows Electron main/preload/renderer; synthetic persisted messages, no model/SDK or original app access.", + "light": { + "theme": "light", + "titleOutsideContent": true, + "cardCount": 1, + "rawAnswerVisible": false, + "horizontalOverflow": false, + "styles": [ + { + "selector": ".ask-user-question--completed", + "fontSize": "13px", + "fontWeight": "400", + "lineHeight": "19px", + "background": "rgba(0, 0, 0, 0)", + "padding": "2px 0px", + "borderRadius": "0px", + "border": "0px none rgb(51, 51, 51)", + "overflow": "visible", + "maxHeight": "none", + "width": 752, + "height": 117.5, + "scrollHeight": 118, + "clientHeight": 118 + }, + { + "selector": ".ask-user-question__header", + "fontSize": "14px", + "fontWeight": "400", + "lineHeight": "24.5px", + "background": "rgba(0, 0, 0, 0)", + "padding": "0px", + "borderRadius": "0px", + "border": "0px none rgba(0, 0, 0, 0.5)", + "overflow": "visible", + "maxHeight": "none", + "width": 752, + "height": 24.5, + "scrollHeight": 25, + "clientHeight": 25 + }, + { + "selector": ".ask-user-question__content", + "fontSize": "13px", + "fontWeight": "400", + "lineHeight": "19px", + "background": "rgb(242, 242, 242)", + "padding": "12px 16px", + "borderRadius": "16px", + "border": "0px none rgb(51, 51, 51)", + "overflow": "auto", + "maxHeight": "300px", + "width": 752, + "height": 77, + "scrollHeight": 77, + "clientHeight": 77 + }, + { + "selector": ".question-answer-transcript__question", + "fontSize": "14px", + "fontWeight": "400", + "lineHeight": "24.5px", + "background": "rgba(0, 0, 0, 0)", + "padding": "0px", + "borderRadius": "0px", + "border": "0px none rgb(128, 128, 128)", + "overflow": "visible", + "maxHeight": "none", + "width": 720, + "height": 24.5, + "scrollHeight": 25, + "clientHeight": 25 + }, + { + "selector": ".question-answer-transcript__answer", + "fontSize": "14px", + "fontWeight": "400", + "lineHeight": "24.5px", + "background": "rgba(0, 0, 0, 0)", + "padding": "0px", + "borderRadius": "0px", + "border": "0px none rgb(51, 51, 51)", + "overflow": "visible", + "maxHeight": "none", + "width": 720, + "height": 24.5, + "scrollHeight": 25, + "clientHeight": 25 + } + ] + }, + "dark": { + "theme": "dark", + "titleOutsideContent": true, + "cardCount": 1, + "rawAnswerVisible": false, + "horizontalOverflow": false, + "styles": [ + { + "selector": ".ask-user-question--completed", + "fontSize": "13px", + "fontWeight": "400", + "lineHeight": "19px", + "background": "rgba(0, 0, 0, 0)", + "padding": "2px 0px", + "borderRadius": "0px", + "border": "0px none rgb(210, 211, 224)", + "overflow": "visible", + "maxHeight": "none", + "width": 752, + "height": 117.5, + "scrollHeight": 118, + "clientHeight": 118 + }, + { + "selector": ".ask-user-question__header", + "fontSize": "14px", + "fontWeight": "400", + "lineHeight": "24.5px", + "background": "rgba(0, 0, 0, 0)", + "padding": "0px", + "borderRadius": "0px", + "border": "0px none rgba(255, 255, 255, 0.45)", + "overflow": "visible", + "maxHeight": "none", + "width": 752, + "height": 24.5, + "scrollHeight": 25, + "clientHeight": 25 + }, + { + "selector": ".ask-user-question__content", + "fontSize": "13px", + "fontWeight": "400", + "lineHeight": "19px", + "background": "rgb(42, 44, 49)", + "padding": "12px 16px", + "borderRadius": "16px", + "border": "0px none rgb(210, 211, 224)", + "overflow": "auto", + "maxHeight": "300px", + "width": 752, + "height": 77, + "scrollHeight": 77, + "clientHeight": 77 + }, + { + "selector": ".question-answer-transcript__question", + "fontSize": "14px", + "fontWeight": "400", + "lineHeight": "24.5px", + "background": "rgba(0, 0, 0, 0)", + "padding": "0px", + "borderRadius": "0px", + "border": "0px none rgb(160, 160, 160)", + "overflow": "visible", + "maxHeight": "none", + "width": 720, + "height": 24.5, + "scrollHeight": 25, + "clientHeight": 25 + }, + { + "selector": ".question-answer-transcript__answer", + "fontSize": "14px", + "fontWeight": "400", + "lineHeight": "24.5px", + "background": "rgba(0, 0, 0, 0)", + "padding": "0px", + "borderRadius": "0px", + "border": "0px none rgb(210, 211, 224)", + "overflow": "visible", + "maxHeight": "none", + "width": 720, + "height": 24.5, + "scrollHeight": 25, + "clientHeight": 25 + } + ] + }, + "narrow": { + "theme": "light", + "titleOutsideContent": true, + "cardCount": 1, + "rawAnswerVisible": false, + "horizontalOverflow": false, + "styles": [ + { + "selector": ".ask-user-question--completed", + "fontSize": "13px", + "fontWeight": "400", + "lineHeight": "19px", + "background": "rgba(0, 0, 0, 0)", + "padding": "2px 0px", + "borderRadius": "0px", + "border": "0px none rgb(51, 51, 51)", + "overflow": "visible", + "maxHeight": "none", + "width": 446, + "height": 117.5, + "scrollHeight": 118, + "clientHeight": 118 + }, + { + "selector": ".ask-user-question__header", + "fontSize": "14px", + "fontWeight": "400", + "lineHeight": "24.5px", + "background": "rgba(0, 0, 0, 0)", + "padding": "0px", + "borderRadius": "0px", + "border": "0px none rgba(0, 0, 0, 0.5)", + "overflow": "visible", + "maxHeight": "none", + "width": 446, + "height": 24.5, + "scrollHeight": 25, + "clientHeight": 25 + }, + { + "selector": ".ask-user-question__content", + "fontSize": "13px", + "fontWeight": "400", + "lineHeight": "19px", + "background": "rgb(242, 242, 242)", + "padding": "12px 16px", + "borderRadius": "16px", + "border": "0px none rgb(51, 51, 51)", + "overflow": "auto", + "maxHeight": "300px", + "width": 446, + "height": 77, + "scrollHeight": 77, + "clientHeight": 77 + }, + { + "selector": ".question-answer-transcript__question", + "fontSize": "14px", + "fontWeight": "400", + "lineHeight": "24.5px", + "background": "rgba(0, 0, 0, 0)", + "padding": "0px", + "borderRadius": "0px", + "border": "0px none rgb(128, 128, 128)", + "overflow": "visible", + "maxHeight": "none", + "width": 414, + "height": 24.5, + "scrollHeight": 25, + "clientHeight": 25 + }, + { + "selector": ".question-answer-transcript__answer", + "fontSize": "14px", + "fontWeight": "400", + "lineHeight": "24.5px", + "background": "rgba(0, 0, 0, 0)", + "padding": "0px", + "borderRadius": "0px", + "border": "0px none rgb(51, 51, 51)", + "overflow": "visible", + "maxHeight": "none", + "width": 414, + "height": 24.5, + "scrollHeight": 25, + "clientHeight": 25 + } + ] + }, + "long": { + "theme": "light", + "titleOutsideContent": true, + "cardCount": 1, + "rawAnswerVisible": false, + "horizontalOverflow": false, + "styles": [ + { + "selector": ".ask-user-question--completed", + "fontSize": "13px", + "fontWeight": "400", + "lineHeight": "19px", + "background": "rgba(0, 0, 0, 0)", + "padding": "2px 0px", + "borderRadius": "0px", + "border": "0px none rgb(51, 51, 51)", + "overflow": "visible", + "maxHeight": "none", + "width": 446, + "height": 340.5, + "scrollHeight": 341, + "clientHeight": 341 + }, + { + "selector": ".ask-user-question__header", + "fontSize": "14px", + "fontWeight": "400", + "lineHeight": "24.5px", + "background": "rgba(0, 0, 0, 0)", + "padding": "0px", + "borderRadius": "0px", + "border": "0px none rgba(0, 0, 0, 0.5)", + "overflow": "visible", + "maxHeight": "none", + "width": 446, + "height": 24.5, + "scrollHeight": 25, + "clientHeight": 25 + }, + { + "selector": ".ask-user-question__content", + "fontSize": "13px", + "fontWeight": "400", + "lineHeight": "19px", + "background": "rgb(242, 242, 242)", + "padding": "12px 16px", + "borderRadius": "16px", + "border": "0px none rgb(51, 51, 51)", + "overflow": "auto", + "maxHeight": "300px", + "width": 446, + "height": 300, + "scrollHeight": 5688, + "clientHeight": 300 + }, + { + "selector": ".question-answer-transcript__question", + "fontSize": "14px", + "fontWeight": "400", + "lineHeight": "24.5px", + "background": "rgba(0, 0, 0, 0)", + "padding": "0px", + "borderRadius": "0px", + "border": "0px none rgb(128, 128, 128)", + "overflow": "visible", + "maxHeight": "none", + "width": 404, + "height": 98, + "scrollHeight": 98, + "clientHeight": 98 + }, + { + "selector": ".question-answer-transcript__answer", + "fontSize": "14px", + "fontWeight": "400", + "lineHeight": "24.5px", + "background": "rgba(0, 0, 0, 0)", + "padding": "0px", + "borderRadius": "0px", + "border": "0px none rgb(51, 51, 51)", + "overflow": "visible", + "maxHeight": "none", + "width": 404, + "height": 122.5, + "scrollHeight": 123, + "clientHeight": 123 + } + ] + }, + "innerQuestionPreserved": "true", + "rendererErrors": [] +} \ No newline at end of file diff --git a/docs/协作/evidence/B01-review-02/regressions.json b/docs/协作/evidence/B01-review-02/regressions.json new file mode 100644 index 0000000..1f08a13 --- /dev/null +++ b/docs/协作/evidence/B01-review-02/regressions.json @@ -0,0 +1,27 @@ +[ + { + "Command": "npm run test:conversation", + "ExitCode": 0, + "Log": ".tmp/b01-acceptance/test-conversation-02.log" + }, + { + "Command": "npm run test:workbuddy-import", + "ExitCode": 0, + "Log": ".tmp/b01-acceptance/test-workbuddy-import-02.log" + }, + { + "Command": "npm run test:artifacts", + "ExitCode": 0, + "Log": ".tmp/b01-acceptance/test-artifacts-02.log" + }, + { + "Command": "npm run test:fold-summary", + "ExitCode": 1, + "Log": ".tmp/b01-acceptance/test-fold-summary-02.log" + }, + { + "Command": "npm run check:tokens", + "ExitCode": 1, + "Log": ".tmp/b01-acceptance/check-tokens-02.log" + } +] diff --git a/docs/协作/evidence/B01-review-02/typed-part-repro.mjs b/docs/协作/evidence/B01-review-02/typed-part-repro.mjs new file mode 100644 index 0000000..d304a58 --- /dev/null +++ b/docs/协作/evidence/B01-review-02/typed-part-repro.mjs @@ -0,0 +1,96 @@ +/** Independent read-only acceptance probe. Writes only .tmp output; no SDK/Electron/services. */ +import { build } from 'esbuild' +import { spawnSync, execFileSync } from 'node:child_process' +import { writeFileSync, mkdirSync } from 'node:fs' +import path from 'node:path' +const baseline = process.argv.includes('--baseline') +mkdirSync('.tmp/b01-readonly-review', {recursive:true}) +const baselineModulesLoaded = [] +const checkoutRevision = execFileSync('git', ['rev-parse', 'HEAD'], {encoding:'utf8'}).trim() +if (checkoutRevision !== '1ed71b63b5af9a98b942ff47c66df5799d4d2c8a') throw new Error('Run in the fixed 1ed71b6 acceptance checkout') +const revision = baseline ? '37ddb2ce24c23d1fab7d0609a62901cc666d4975' : '1ed71b63b5af9a98b942ff47c66df5799d4d2c8a' +const baselinePaths = new Set([ + 'src/renderer/src/components/MessageBubble.tsx', + 'src/renderer/src/workbuddy/conversation/CompletedFold.tsx', + 'src/renderer/src/workbuddy/conversation/SpecializedBlocks.tsx', + 'src/renderer/src/workbuddy/conversation/SourceToolHeader.tsx', + 'src/renderer/src/workbuddy/conversation/ToolCall.tsx', + 'src/renderer/src/workbuddy/conversation/ToolCallRenderer.tsx', + 'src/renderer/src/workbuddy/conversation/AskUserQuestion.tsx' +]) +const source=String.raw` +import assert from 'node:assert/strict' +import {createRequire} from 'node:module' +const domModule=process.env.YCODE_TEST_DOM_MODULE||process.cwd()+'/.tmp/b01-dom/node_modules/jsdom' +const {JSDOM}=createRequire(process.cwd()+'/package.json')(domModule) +const dom=new JSDOM('
',{pretendToBeVisual:true,url:'http://localhost/'}) +for(const key of ['window','document','Node','Element','HTMLElement','MouseEvent','KeyboardEvent','Event'])Object.defineProperty(globalThis,key,{value:dom.window[key],configurable:true}) +Object.defineProperty(globalThis,'navigator',{value:dom.window.navigator,configurable:true}) +Object.assign(globalThis,{IS_REACT_ACT_ENVIRONMENT:true}) +const {act}=require('react') as typeof import('react') +const {createRoot}=require('react-dom/client') as typeof import('react-dom/client') +const MessageBubble=require('./src/renderer/src/components/MessageBubble').default +const {applyAssistantEvent}=require('./src/shared/message-parts') +const root=createRoot(document.querySelector('#root')!) +const selectors={plan:'.cb-plan-header-left',task:'.cb-task-result-item-title'} +const get=(selector:string)=>{const node=document.querySelector(selector);assert.ok(node,selector);return node} +const state=()=>Object.fromEntries(Object.entries(selectors).map(([kind,selector])=>[kind,get(selector).getAttribute('aria-expanded')])) +async function render(message:any){await act(async()=>root.render())} +async function click(selector:string){await act(async()=>get(selector).dispatchEvent(new MouseEvent('click',{bubbles:true})))} +async function main(){ + let message:any={id:'b01-typed-part-repro',role:'assistant',createdAt:1,content:'',status:'streaming',parts:[]} + const streamingEvents=[ + {type:'text',delta:'Draft one'}, + {type:'part',part:{type:'reasoning',id:'r',text:'Thought',finished:true}}, + {type:'text',delta:'Draft two'}, + {type:'part',part:{type:'plan',plan:{id:'p',title:'Plan',steps:[]}}}, + {type:'part',part:{type:'task',task:{id:'x',title:'Task',status:'success',summary:'Task result'}}} + ] + for(const event of streamingEvents)message=applyAssistantEvent(message,event) + const input=JSON.parse(JSON.stringify(message)) + await render(message) + const initially=state() + await click(selectors.plan);await click(selectors.task) + const selected=state() + assert.deepEqual(selected,{plan:'false',task:'false'}) + const terminalEvent={type:'done',content:'Corrected final prose',tools:[],turnDurationMs:1000} + const finished=applyAssistantEvent(message,terminalEvent) + await render(finished) + const after=state() + const result={ + testedRevision:process.env.B01_PROBE_REVISION, + runtime:{node:process.version,platform:process.platform,react:require('react/package.json').version,jsdom:createRequire(process.cwd()+'/package.json')(domModule+'/package.json').version}, + input,terminalEvent,outputParts:finished.parts, + ariaExpanded:{initially,afterUserCollapse:selected,afterTerminalCorrection:after}, + expectedAfterTerminalCorrection:selected, + retainsUserChoices:JSON.stringify(selected)===JSON.stringify(after) + } + console.log(JSON.stringify(result,null,2)) + await act(async()=>root.unmount());dom.window.close() +} +main().then(()=>process.exit(0)).catch(error=>{console.error(error);dom.window.close();process.exit(1)}) +` +const outfile=`.tmp/b01-readonly-review/typed-part-repro-${baseline?'baseline':'1ed71b6'}.cjs` +await build({ + stdin:{contents:source,sourcefile:'b01-typed-part-repro.tsx',loader:'tsx',resolveDir:process.cwd()}, + outfile,bundle:true,platform:'node',format:'cjs',jsx:'automatic',loader:{'.css':'empty'},logLevel:'warning', + plugins:baseline?[{name:'read-baseline-product-modules',setup(build){build.onLoad({filter:/\.tsx$/},args=>{ + const relative=path.relative(process.cwd(),args.path).split(path.sep).join('/') + if(!baselinePaths.has(relative))return + baselineModulesLoaded.push(relative) + return {contents:execFileSync('git',['show',`${revision}:${relative}`],{encoding:'utf8'}),loader:'tsx',resolveDir:path.dirname(args.path)} + })}}]:[] +}) +const result=spawnSync(process.execPath,[outfile],{encoding:'utf8',timeout:120000,env:{...process.env,B01_PROBE_REVISION:revision}}) +const output=`.tmp/b01-readonly-review/typed-part-repro-${baseline?'baseline':'1ed71b6'}.json` +if(result.stderr)process.stderr.write(result.stderr) +if(result.status!==0){process.stderr.write(result.stdout);throw result.error||new Error(`probe exited ${result.status}`)} +if(baseline && baselineModulesLoaded.length !== baselinePaths.size) throw new Error('Baseline override did not load every changed React module') +const parsed=JSON.parse(result.stdout) +parsed.verificationMethod = baseline ? 'Bundled every changed React module from git show 37ddb2c; remaining product code equals tested checkout for this path' : 'Bundled fixed 1ed71b6 checkout product modules' +parsed.baselineModulesLoaded=baselineModulesLoaded +writeFileSync(output,JSON.stringify(parsed,null,2)+'\n') +console.log(JSON.stringify({evidence:output,testedRevision:revision,ariaExpanded:parsed.ariaExpanded,inputParts:parsed.input.parts.map(part=>part.type),outputParts:parsed.outputParts.map(part=>part.type),retainsUserChoices:parsed.retainsUserChoices},null,2)) + + +if(process.argv.includes('--assert') && !parsed.retainsUserChoices) process.exitCode=1 diff --git a/docs/协作/evidence/B01-review-02/typed-part-result.json b/docs/协作/evidence/B01-review-02/typed-part-result.json new file mode 100644 index 0000000..cf8805d --- /dev/null +++ b/docs/协作/evidence/B01-review-02/typed-part-result.json @@ -0,0 +1,105 @@ +{ + "testedRevision": "1ed71b63b5af9a98b942ff47c66df5799d4d2c8a", + "runtime": { + "node": "v24.21.0", + "platform": "win32", + "react": "19.3.0", + "jsdom": "30.1.3" + }, + "input": { + "id": "b01-typed-part-repro", + "role": "assistant", + "createdAt": 1, + "content": "Draft oneDraft two", + "status": "streaming", + "parts": [ + { + "type": "text", + "text": "Draft one" + }, + { + "type": "reasoning", + "id": "r", + "text": "Thought", + "finished": true + }, + { + "type": "text", + "text": "Draft two" + }, + { + "type": "plan", + "plan": { + "id": "p", + "title": "Plan", + "steps": [] + } + }, + { + "type": "task", + "task": { + "id": "x", + "title": "Task", + "status": "success", + "summary": "Task result" + } + } + ] + }, + "terminalEvent": { + "type": "done", + "content": "Corrected final prose", + "tools": [], + "turnDurationMs": 1000 + }, + "outputParts": [ + { + "type": "text", + "text": "Corrected final prose" + }, + { + "type": "reasoning", + "id": "r", + "text": "Thought", + "finished": true + }, + { + "type": "plan", + "plan": { + "id": "p", + "title": "Plan", + "steps": [] + } + }, + { + "type": "task", + "task": { + "id": "x", + "title": "Task", + "status": "success", + "summary": "Task result" + } + } + ], + "ariaExpanded": { + "initially": { + "plan": "true", + "task": "true" + }, + "afterUserCollapse": { + "plan": "false", + "task": "false" + }, + "afterTerminalCorrection": { + "plan": "false", + "task": "false" + } + }, + "expectedAfterTerminalCorrection": { + "plan": "false", + "task": "false" + }, + "retainsUserChoices": true, + "verificationMethod": "Bundled fixed 51531dc checkout product modules", + "baselineModulesLoaded": [] +} diff --git a/docs/协作/evidence/B02-review-01/alignment.txt b/docs/协作/evidence/B02-review-01/alignment.txt new file mode 100644 index 0000000..7b4fbde --- /dev/null +++ b/docs/协作/evidence/B02-review-01/alignment.txt @@ -0,0 +1,25 @@ + +> ycode@0.0.7 test:alignment +> node scripts/run-alignment-regression.mjs + +PASS model alignment: fresh/legacy migration, new/edit/default/delete/reload, valid selection (offline host fixtures) +PASS model settings: deferred owner switch, rename mapping, addition selection, empty deletion, immutable history +PASS session factory: first-send preference, mode preservation, invalid permission rejection (isolated ports) +{"historyMessages":10000,"bytes":747781,"parseMs":4.274399999999986,"storeHydrationMs":0.18410000000000082,"note":"Node parsing/store benchmark only, not browser rendering or Windows IPC performance"} +session-composer-alignment: loading/cache/retry/races/model/permissions/modes/SSR passed +alignment-conversation: local groups, original expanded order, question projection and truthful status passed +A01 native MessageBubble identity aliases, immutable inputs and ordinary raw output passed +A01 imported native card, linked dedup and unknown-position compatibility passed +question-answer-shell: structural and recovered CSS contracts passed +question-answer-shell: DOM hierarchy, controls linkage, click, Enter, Space and inert contracts passed +Runtime progress, session-grant scope and approval lifecycle regressions passed +Permission intercept static rendering passed; interactive keyboard/focus remains UI acceptance +Claude host approval policy unit checks passed (no SDK process/application/matching verification) +Mock SDK replay lifecycle passed: fail closed, retry, session isolation, independent mode guard +task popconfirm DOM regression: 34 checks passed (jsdom, not pixel validation) +question-interaction: 24 DOM behavioral checks passed +question-identity: 30 A01 DOM checks passed (not Electron/pixel/SDK acceptance) +completed-fold-nested: real question/tool/thinking/local-summary remount, event, keyboard and identity contracts passed +completed-fold-native-identity: real reducer done correction, native IDs, insertion/reorder, repeated outer toggles, message isolation and legacy fallback passed +Permission intercept DOM: 14 checks passed (not pixel/SDK verification) +{"checks":37,"passed":true,"scope":"Isolated React DOM and CSS contracts; no native keyboard/layout/pixel acceptance"} diff --git a/docs/协作/evidence/B02-review-01/build.txt b/docs/协作/evidence/B02-review-01/build.txt new file mode 100644 index 0000000..a440889 --- /dev/null +++ b/docs/协作/evidence/B02-review-01/build.txt @@ -0,0 +1,660 @@ + +> ycode@0.0.7 build +> npm run typecheck && electron-vite build + + +> ycode@0.0.7 typecheck +> tsc --noEmit -p tsconfig.node.json && tsc --noEmit -p tsconfig.web.json + +vite v8.3.4 building ssr environment for production... +transforming... +✓ 444 modules transformed. +rendering chunks... +out/main/index.mjs 1,596.10 kB + +✓ built in 205ms +vite v8.3.4 building ssr environment for production... +transforming... +✓ 2 modules transformed. +rendering chunks... +out/preload/index.cjs 15.89 kB + +✓ built in 13ms +vite v8.3.4 building client environment for production... +transforming... +✓ 3039 modules transformed. +rendering chunks... +out/renderer/settings.html 1.57 kB +out/renderer/index.html 1.75 kB +out/renderer/assets/KaTeX_Size3-Regular-CTq5MqoE.woff 4.42 kB +out/renderer/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 4.92 kB +out/renderer/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 5.20 kB +out/renderer/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 5.46 kB +out/renderer/assets/KaTeX_Size4-Regular-BF-4gkZK.woff 5.98 kB +out/renderer/assets/KaTeX_Size2-Regular-oD1tc_U0.woff 6.18 kB +out/renderer/assets/KaTeX_Size1-Regular-C195tn64.woff 6.49 kB +out/renderer/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 6.90 kB +out/renderer/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 6.91 kB +out/renderer/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf 7.58 kB +out/renderer/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff 7.65 kB +out/renderer/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff 7.71 kB +out/renderer/assets/archify-owner-avatar-BdE-HOjX.jpg 9.46 kB +out/renderer/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 9.64 kB +out/renderer/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 10.34 kB +out/renderer/assets/KaTeX_Size4-Regular-DWFBv043.ttf 10.36 kB +out/renderer/assets/KaTeX_Script-Regular-D5yQViql.woff 10.58 kB +out/renderer/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 11.31 kB +out/renderer/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 11.34 kB +out/renderer/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf 11.50 kB +out/renderer/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 12.02 kB +out/renderer/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 12.21 kB +out/renderer/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf 12.22 kB +out/renderer/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff 12.31 kB +out/renderer/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf 12.34 kB +out/renderer/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf 12.36 kB +out/renderer/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff 13.20 kB +out/renderer/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff 13.29 kB +out/renderer/assets/workbuddy-buddy-thumbnail-2713ed5b-CUhW0EYr.png 13.42 kB +out/renderer/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 13.56 kB +out/renderer/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff 14.11 kB +out/renderer/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff 14.40 kB +out/renderer/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff 16.02 kB +out/renderer/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 16.40 kB +out/renderer/assets/KaTeX_Math-Italic-t53AETM-.woff2 16.44 kB +out/renderer/assets/KaTeX_Script-Regular-C5JkGWo-.ttf 16.64 kB +out/renderer/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 16.78 kB +out/renderer/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 16.98 kB +out/renderer/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff 18.66 kB +out/renderer/assets/KaTeX_Math-Italic-DA0__PXp.woff 18.74 kB +out/renderer/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff 19.41 kB +out/renderer/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf 19.43 kB +out/renderer/assets/KaTeX_Fraktur-Regular-CB_wures.ttf 19.57 kB +out/renderer/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf 19.58 kB +out/renderer/assets/KaTeX_Main-Italic-BMLOBm91.woff 19.67 kB +out/renderer/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf 22.36 kB +out/renderer/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf 24.50 kB +out/renderer/assets/KaTeX_Main-Bold-Cx986IdX.woff2 25.32 kB +out/renderer/assets/KaTeX_Main-Regular-B22Nviop.woff2 26.27 kB +out/renderer/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf 27.55 kB +out/renderer/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 28.07 kB +out/renderer/assets/KaTeX_Main-Bold-Jm3AIy58.woff 29.91 kB +out/renderer/assets/KaTeX_Main-Regular-Dr94JaBh.woff 30.77 kB +out/renderer/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf 31.19 kB +out/renderer/assets/KaTeX_Math-Italic-flOr_0UB.ttf 31.30 kB +out/renderer/assets/design-case-3-DaIvrslH.png 32.76 kB +out/renderer/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf 32.96 kB +out/renderer/assets/KaTeX_AMS-Regular-DMm9YOAa.woff 33.51 kB +out/renderer/assets/KaTeX_Main-Italic-3WenGoN9.ttf 33.58 kB +out/renderer/assets/design-case-4-0hVdAJQR.png 45.16 kB +out/renderer/assets/design-case-2-BH_iQ5r3.png 45.56 kB +out/renderer/assets/KaTeX_Main-Bold-waoOVXN0.ttf 51.33 kB +out/renderer/assets/design-case-1-DOYiafVz.png 52.97 kB +out/renderer/assets/KaTeX_Main-Regular-ypZvNtVU.ttf 53.58 kB +out/renderer/assets/KaTeX_AMS-Regular-DRggAlZN.ttf 63.63 kB +out/renderer/assets/workbuddy-appearance-dark-CXQX3TZX.png 109.34 kB +out/renderer/assets/workbuddy-appearance-light-BbpPCukh.png 113.02 kB +out/renderer/assets/codicon-ngg6Pgfi-ngg6Pgfi.ttf 121.97 kB +out/renderer/assets/kimi-DiLyRSiJ.svg 129.22 kB +out/renderer/assets/json.worker-DEWrzUkU-FVRG9O7E.js 438.21 kB +out/renderer/assets/worker-portable-D1lwTqsk-Dg0RNmO0.js 456.22 kB +out/renderer/assets/landing-hero-B6659kdy.png 629.28 kB +out/renderer/assets/html.worker-BC4B-9NY-BDdNc3ca.js 756.63 kB +out/renderer/assets/css.worker-D7wyZb8r-YRw1jg-F.js 1,086.92 kB +out/renderer/assets/ts.worker-BsXRl7a--BbqraoNr.js 8,187.30 kB +out/renderer/assets/ArtifactPierreDiff-CNAfnhAF.css 1.16 kB +out/renderer/assets/GeneralSettingsPanel-CntDyB52.css 1.25 kB +out/renderer/assets/AgentsSettingsPanel-R0teGDyD.css 2.56 kB +out/renderer/assets/AboutHelpSettingsPanel-ksqGLObi.css 5.72 kB +out/renderer/assets/updates-ui-COSnOGKS.css 6.84 kB +out/renderer/assets/AppearanceSettingsPanel-DcaRECSa.css 8.03 kB +out/renderer/assets/ShortcutsSettingsPanel-Bu_5_488.css 18.05 kB +out/renderer/assets/MemorySettingsPanel-C3dtDAif.css 32.49 kB +out/renderer/assets/ModelSettingsPanel-BjNmxQAH.css 88.98 kB +out/renderer/assets/PersonalizationSettingsPanel-DnAyzaM6.css 98.77 kB +out/renderer/assets/app-DH7L1ZF2.css 259.93 kB +out/renderer/assets/index-33QIcM1B.css 2,684.72 kB +out/renderer/assets/pie-WAS4IAKB-1a9lbjhh.js 0.11 kB +out/renderer/assets/info-A6RAGUB7-Dsq8pPGK.js 0.11 kB +out/renderer/assets/radar-RG4KPBEZ-BwNT2qWb.js 0.11 kB +out/renderer/assets/packet-AYTQ26CC-C-iOIVQo.js 0.11 kB +out/renderer/assets/cynefin-OW5HDTMX-CTYbUR58.js 0.11 kB +out/renderer/assets/treemap-WGGIJYW6-CWek0LQD.js 0.11 kB +out/renderer/assets/wardley-WFR3VGLG-BnrEXTnU.js 0.11 kB +out/renderer/assets/gitGraph-4MIJSDKK-NHpEvzKf.js 0.12 kB +out/renderer/assets/railroad-74A4TZTK-CyYHr3KR.js 0.12 kB +out/renderer/assets/treeView-Q6P3EWNA-CzdWA6Mh.js 0.12 kB +out/renderer/assets/railroad-peg-WCYAUIDC-DyA9P8dX.js 0.12 kB +out/renderer/assets/architecture-7GRP2DOG-VyF0wzFW.js 0.12 kB +out/renderer/assets/railroad-abnf-HS5TGJTU-DWOH6PDU.js 0.12 kB +out/renderer/assets/railroad-ebnf-LZEXJU2U-B8jXqV-T.js 0.12 kB +out/renderer/assets/eventmodeling-NTZA5JFV-Dmu4IHsI.js 0.12 kB +out/renderer/assets/array-75Ih5Qg4.js 0.16 kB +out/renderer/assets/channel-DHarOYgZ.js 0.25 kB +out/renderer/assets/init-DHdG6DHP.js 0.27 kB +out/renderer/assets/chunk-Y2CYZVJY-CrOJDJJy.js 0.38 kB +out/renderer/assets/chunk-JWPE2WC7-BWmaSNkB.js 0.42 kB +out/renderer/assets/chunk-2Q5K7J3B-BBOGhvIe.js 0.44 kB +out/renderer/assets/prism-tsx-BJWEHjlk.js 0.48 kB +out/renderer/assets/chunk-5VM5RSS4-D50WUAUX.js 0.52 kB +out/renderer/assets/chunk-XXDRQBXY-BsO966Nz.js 0.58 kB +out/renderer/assets/flowDiagram-HODETNUW-DS2cT8EG.js 0.59 kB +out/renderer/assets/prism-json-DxLGXN1o.js 0.62 kB +out/renderer/assets/codeowners-C7Y3CTAA-BmB2_gvY.js 0.75 kB +out/renderer/assets/prism-clike-BcH_eOfE.js 0.89 kB +out/renderer/assets/tsv-DVa1_Ovr-BeS2kE5e.js 0.94 kB +out/renderer/assets/shellsession-C0HwRpr0-B630Ulnl.js 0.96 kB +out/renderer/assets/javascript-DGySzfUB-CQaVVFGk.js 0.99 kB +out/renderer/assets/settings-CauUETdq.js 1.01 kB +out/renderer/assets/infoDiagram-27XIBGKW-BxQCd_Wi.js 1.09 kB +out/renderer/assets/swimlanesDiagram-VR7AAH4N-CDntzTUl.js 1.09 kB +out/renderer/assets/html-derivative-D3Jld805-D0QQ5MTi.js 1.10 kB +out/renderer/assets/prism-go-Cw8Jg9YT.js 1.11 kB +out/renderer/assets/classDiagram-ZZMXUADV-B1CifpN6.js 1.16 kB +out/renderer/assets/classDiagram-v2-VYDZK3BY-CUL8warN.js 1.16 kB +out/renderer/assets/stateDiagram-v2-MP3YSRHH-Cd_OI8Qg.js 1.16 kB +out/renderer/assets/qmldir-DIq06gp2-CFVtueeV.js 1.20 kB +out/renderer/assets/git-rebase-CgwCWTNR-Cpss9r90.js 1.23 kB +out/renderer/assets/chunk-POPQ4Y6H-DJbU6j1e.js 1.23 kB +out/renderer/assets/azcli-Bsxmaz-H-Dgh56k5-.js 1.26 kB +out/renderer/assets/personalization-prefs-DASR3vwn.js 1.28 kB +out/renderer/assets/csv-BRhERoQG-DKrQczXm.js 1.36 kB +out/renderer/assets/prism-latex-CHSuA_Lo.js 1.38 kB +out/renderer/assets/jsx-runtime-C48wkPcG.js 1.41 kB +out/renderer/assets/git-commit-DGtBy1vY-s2uHofP2.js 1.47 kB +out/renderer/assets/AgentsSettingsPanel-CMYBwUKH.js 1.56 kB +out/renderer/assets/xsl-DV28r3Jw-B8bWzO_h.js 1.59 kB +out/renderer/assets/dotenv-DXc2fSbR-CUbEjgJq.js 1.62 kB +out/renderer/assets/general-settings-icons-DOmPIusw.js 1.64 kB +out/renderer/assets/prism-scala-CRTYzCpy.js 1.65 kB +out/renderer/assets/ini-D4-1Iswn-DaNDgFS8.js 1.65 kB +out/renderer/assets/prism-typescript-D-7ZUUQ-.js 1.65 kB +out/renderer/assets/sizeCapture-INFHLROL-CCEMv_MJ.js 1.68 kB +out/renderer/assets/csp-Bsbijh2H-033SDyRW.js 1.69 kB +out/renderer/assets/sparql-Mj-YIaDH-DAUou2oc.js 1.71 kB +out/renderer/assets/prism-css-Cmyw76Xa.js 1.73 kB +out/renderer/assets/ini-DMSv7OY2-xgSkktY4.js 1.74 kB +out/renderer/assets/rolldown-runtime-BJCASTsb-DKQFAHUF.js 1.78 kB +out/renderer/assets/line-BFbLTOFm.js 1.89 kB +out/renderer/assets/fortran-fixed-form-D91DiZLE-NxoUlVkB.js 1.91 kB +out/renderer/assets/docker-B7J3eHK7-C3FNXPS_.js 1.96 kB +out/renderer/assets/hxml-938TheZ7-pE5ojWPT.js 1.97 kB +out/renderer/assets/desktop-BwI-o01e-Da9rFJOd.js 2.03 kB +out/renderer/assets/ordinal-CmpyCcm_.js 2.22 kB +out/renderer/assets/prism-c-B7tsC1jE.js 2.23 kB +out/renderer/assets/rolldown-runtime-EITvVbkG.js 2.32 kB +out/renderer/assets/erb-BgMB3Uiw-CLkRQ9Hf.js 2.40 kB +out/renderer/assets/prism-kotlin-Bc2NQYRR.js 2.43 kB +out/renderer/assets/jssm-CIisorE2-ggX0kbSA.js 2.44 kB +out/renderer/assets/prism-python-CTkfasgb.js 2.48 kB +out/renderer/assets/reg-mzCtpvUf-BHC3bGU6.js 2.54 kB +out/renderer/assets/bat-2PwuskcT-BbFmQdFU.js 2.55 kB +out/renderer/assets/prism-mermaid-DSoNsh6-.js 2.56 kB +out/renderer/assets/pla-HAHcX3CH-DHyEyFew.js 2.57 kB +out/renderer/assets/sb-O6mPt74--_nMcDiF8.js 2.60 kB +out/renderer/assets/chunk-GVQU2GXP-CCUOPT_c.js 2.61 kB +out/renderer/assets/edge-DcEd3r9D-ZJX3cnY_.js 2.62 kB +out/renderer/assets/scheme-C-yCXfo--BHhgh59u.js 2.66 kB +out/renderer/assets/flow9-z3HgHIql-qOic_Sv2.js 2.72 kB +out/renderer/assets/prism-yaml-cmjQ_1eD.js 2.77 kB +out/renderer/assets/gleam-DEEAoY6G-DgJJp7nh.js 2.78 kB +out/renderer/assets/railroadDiagram-O6MQD6OU-CrE_AuZP.js 2.78 kB +out/renderer/assets/diff-lAxbRYdS--5gtlmD4.js 2.79 kB +out/renderer/assets/hy-BKymZdC0-4uNvYh3y.js 2.86 kB +out/renderer/assets/dockerfile-CnkhFuxG-CfXHMZr-.js 3.01 kB +out/renderer/assets/openscad-BRTETpP_-BThzc9qL.js 3.03 kB +out/renderer/assets/pascaligo-DI1dd1Zd-D23AoFdQ.js 3.03 kB +out/renderer/assets/log-Cn1ZE6kb-BE4srnlV.js 3.05 kB +out/renderer/assets/objective-c-gNYZndaF-4hkcNMcE.js 3.06 kB +out/renderer/assets/sparql-DxWbGozt-B7qTmycl.js 3.08 kB +out/renderer/assets/prism-markup-templating-D4pSJIpH.js 3.11 kB +out/renderer/assets/prism-cpp-CEgmwlDT.js 3.11 kB +out/renderer/assets/cameligo-B6LDhzzR-DSNRk43W.js 3.12 kB +out/renderer/assets/wenyan-BVgiL1tD-C7ph_xMt.js 3.12 kB +out/renderer/assets/cairo-D_LzMZ4I-C21twps2.js 3.17 kB +out/renderer/assets/prism-rust-Du0Qa8GC.js 3.18 kB +out/renderer/assets/lua-CJt09SGy-3O0VAMVx.js 3.19 kB +out/renderer/assets/graphql-C0cKWTiE-BQOKksLE.js 3.20 kB +out/renderer/assets/berry-DTcSbIs7-DsDdtWdB.js 3.20 kB +out/renderer/assets/jsonl-Cn_fzNA8-cIG9lf61.js 3.21 kB +out/renderer/assets/json-CKKhFIOr-DuiQFrCF.js 3.29 kB +out/renderer/assets/mips-Df5bwPtM-DJn7b529.js 3.29 kB +out/renderer/assets/jsonc-Bf3Xcgeq-BGBJ2TDY.js 3.31 kB +out/renderer/assets/logo-BxqPaaID-DK9gUnx4.js 3.33 kB +out/renderer/assets/abnfDiagram-VCTEODGH-BEqo0QPU.js 3.36 kB +out/renderer/assets/go-BejFoqvR-BnGoIlsY.js 3.42 kB +out/renderer/assets/po-DI6EG-tz-DIkePE8T.js 3.44 kB +out/renderer/assets/lexon-5NyrCfQ6-B1bdOCGH.js 3.45 kB +out/renderer/assets/prism-sql-BggiY1Ht.js 3.45 kB +out/renderer/assets/json5-BlijqrwT-Ci88mndw.js 3.45 kB +out/renderer/assets/mipsasm-U3SQfJCQ-kat_Vj1M.js 3.46 kB +out/renderer/assets/sophia-foSZ3xPI-DGYIHURw.js 3.47 kB +out/renderer/assets/tasl-C74Cvwdf-se1Ptgso.js 3.49 kB +out/renderer/assets/genie-CjS3m_gh-DHydh9_z.js 3.56 kB +out/renderer/assets/prism-swift-xplGsQ1n.js 3.56 kB +out/renderer/assets/vala-DMgevQbf-ByJQiTkp.js 3.57 kB +out/renderer/assets/pegDiagram-XKGWAZYB-CmGvFb7R.js 3.59 kB +out/renderer/assets/rel-D6dNeDZv-CUAJzmkw.js 3.60 kB +out/renderer/assets/prism-java-6uFEGwWz.js 3.63 kB +out/renderer/assets/fsharp-Ba-cvOiG-BoxQhS9v.js 3.64 kB +out/renderer/assets/chunk-P2QGCYS3-B9n3RDRx.js 3.65 kB +out/renderer/assets/ebnfDiagram-PWID7BFC-DlFL4szh.js 3.66 kB +out/renderer/assets/qsharp-78iLGMHs-Dbh3PRIx.js 3.68 kB +out/renderer/assets/m3-Bu81_nWr-4t51Qx0i.js 3.69 kB +out/renderer/assets/chunk-F27PBJKO-DsTJ-19K.js 3.70 kB +out/renderer/assets/pascal-DyPgZbsX-Ba58YM7a.js 3.71 kB +out/renderer/assets/path-CSWwviF2.js 3.79 kB +out/renderer/assets/fluent-BSSEgVQa-BCOQigl1.js 3.81 kB +out/renderer/assets/splunk-BdqSfgpd-BtOEh0Mo.js 3.81 kB +out/renderer/assets/jsonnet-Bn71vRY8-QjPNMWdY.js 3.82 kB +out/renderer/assets/ssh-config-BO51LXox-DkFt_ueS.js 3.82 kB +out/renderer/assets/bicep-DujF3y-4-DHww3ZLF.js 3.87 kB +out/renderer/assets/narrat-DdgkgBr0-CSyxDqta.js 3.87 kB +out/renderer/assets/redis-Bo427DT4-DBDF4ZWx.js 3.88 kB +out/renderer/assets/turtle-DAmmiOda-C48PN72o.js 3.92 kB +out/renderer/assets/dist-CE9GMTNb.js 3.97 kB +out/renderer/assets/prism-jsx-BO0yI1A3.js 3.97 kB +out/renderer/assets/xml-BBFzlEmT-CqLnJtYa.js 3.99 kB +out/renderer/assets/java-Z7anYNQ6-DdC7WVZS.js 4.01 kB +out/renderer/assets/r-Xh-gXEK4-DKEPC8dA.js 4.02 kB +out/renderer/assets/ron-CdysqNkW-BG7UwPdX.js 4.11 kB +out/renderer/assets/zenscript-XbBI4c9W-C-aTQo6e.js 4.12 kB +out/renderer/assets/glsl-CZF-bvQV-UaBdSZy0.js 4.14 kB +out/renderer/assets/shell-DGp7WuK3-X00pamiI.js 4.15 kB +out/renderer/assets/gn-DJxfXStl-BD_k0CWf.js 4.20 kB +out/renderer/assets/kotlin-C61BvWgT-B7MkJpdU.js 4.20 kB +out/renderer/assets/typespec-B704GmX3-f1l-QmOw.js 4.26 kB +out/renderer/assets/kdl-YTd72GVl-DLkP_pAB.js 4.27 kB +out/renderer/assets/AppearanceSettingsPanel-B_352Jrg.js 4.28 kB +out/renderer/assets/hurl-CDXCvJNd-Xd5k76nE.js 4.28 kB +out/renderer/assets/cypher-CjfQI0Y9-9gjOyi6P.js 4.33 kB +out/renderer/assets/pascal-CLPA94yO-C11lM2uy.js 4.35 kB +out/renderer/assets/powershell-CaPzBwIT-C9KgMPOP.js 4.50 kB +out/renderer/assets/tcl-D-NiFh9X-CYwv4uzi.js 4.63 kB +out/renderer/assets/apex-BE-040ts-wdfiR7V6.js 4.65 kB +out/renderer/assets/tcl-DowxIvU4-Bbhzqrsw.js 4.65 kB +out/renderer/assets/rosmsg-DDyuMVTo-DSHWRdSZ.js 4.72 kB +out/renderer/assets/nextflow-DVTlkzu9-Cis-JUmb.js 4.75 kB +out/renderer/assets/http-DhxVjYFh-CjwVOaui.js 4.76 kB +out/renderer/assets/hcl-CbjaVS9i-DCS43mBd.js 4.79 kB +out/renderer/assets/rust-Ij2gfGoT-DLzaBWYs.js 4.83 kB +out/renderer/assets/polar-CwTxzzWE-DygHL4ZA.js 4.87 kB +out/renderer/assets/prism-ruby-PgHh3fQm.js 4.91 kB +out/renderer/assets/fennel-COJTUo2O-DYh8-dep.js 4.97 kB +out/renderer/assets/bibtex-yEKRWsaj-xHthw1sC.js 5.00 kB +out/renderer/assets/coffee-CcgZJF1B-DkN4xoBX.js 5.04 kB +out/renderer/assets/llvm-DiFwU398-BQjCVu39.js 5.25 kB +out/renderer/assets/less-CXux59mP-BM7SkPLH.js 5.27 kB +out/renderer/assets/msdax-DEyWhkWP-CwdIr_-P.js 5.29 kB +out/renderer/assets/prism-javascript-B6zosBCV.js 5.31 kB +out/renderer/assets/wgsl-Ds7VVNHP-yP3bMkfO.js 5.34 kB +out/renderer/assets/markdown-CBag5COD-B_1rbk64.js 5.36 kB +out/renderer/assets/dart-DK8_VUW5-Bnb_Tn57.js 5.39 kB +out/renderer/assets/zig-BBWfbOQ5-B8x_JL1P.js 5.54 kB +out/renderer/assets/restructuredtext-D2p7PcFG-DDHAm_JI.js 5.55 kB +out/renderer/assets/dax-CmrIxjmL-CDTyHmZ_.js 5.56 kB +out/renderer/assets/gdresource-4lq4eh4q-CjhvlVte.js 5.56 kB +out/renderer/assets/qml-D6gd64uC-_ykXVPoZ.js 5.57 kB +out/renderer/assets/bicep-wTwvD1CI-C568hcwN.js 5.58 kB +out/renderer/assets/cssMode-Z-o80aSY-BvzV-1yi.js 5.59 kB +out/renderer/assets/awk-DTjcVAOD-BmfaVU4m.js 5.66 kB +out/renderer/assets/liquid-Dv-zz5BA-D9ukCDuL.js 5.71 kB +out/renderer/assets/csharp-DpS7Vfy9-CbQzv1ql.js 5.76 kB +out/renderer/assets/coq-BFytDJOI-C5vNmx0q.js 5.81 kB +out/renderer/assets/swift-C3A42nmX-BBVToPkN.js 5.83 kB +out/renderer/assets/xml-bIkPj5aH-Bx1v5u6-.js 5.89 kB +out/renderer/assets/ecl-CYzojQ6a-C8m0_osY.js 5.91 kB +out/renderer/assets/jinja-Dl-Ji_JA-BBL5sTd0.js 5.92 kB +out/renderer/assets/lean-Cu10prRO-BUTVAAdc.js 6.03 kB +out/renderer/assets/yaml-GEMDST6R-D-0AGe4F.js 6.09 kB +out/renderer/assets/moonbit-B8-g2u5v-CGBFUznC.js 6.10 kB +out/renderer/assets/powerquery-tKWDTKOo-CejxekA_.js 6.11 kB +out/renderer/assets/SourceCodePreview-rs88mqRs.js 6.11 kB +out/renderer/assets/python-CHafhQyI-DmJIfgbV.js 6.14 kB +out/renderer/assets/shaderlab-Df7nOKvI-0G488FSx.js 6.16 kB +out/renderer/assets/css-sG8ozMHf-pZGexMoj.js 6.17 kB +out/renderer/assets/cpp-CipCPBaT-7uQRIwsC.js 6.17 kB +out/renderer/assets/vb-BKV3Sgm5-D5ytx6Ln.js 6.29 kB +out/renderer/assets/htmlMode-BDZbYlMj-CRoXjFoW.js 6.40 kB +out/renderer/assets/red-CYaKK_PD-iiAMl8iL.js 6.45 kB +out/renderer/assets/min-dark-DGPfDRqJ-gZu6HtcU.js 6.48 kB +out/renderer/assets/pug-EKWpNZSi-oQ708bsr.js 6.51 kB +out/renderer/assets/prisma-CdZyz3OC-ChFCtYaa.js 6.53 kB +out/renderer/assets/gdshader-ryZhEIxg-DpcQqwXn.js 6.55 kB +out/renderer/assets/ara-_lrJyEFe-qigo-wGx.js 6.56 kB +out/renderer/assets/clojure-WSq30mUj-Bswhoa1y.js 6.61 kB +out/renderer/assets/toml-DPP887_3-aOuHoLTy.js 6.62 kB +out/renderer/assets/postcss-CcIp2ENG-DpmxBCXW.js 6.64 kB +out/renderer/assets/verilog-bragEGMk-CemzLugw.js 6.64 kB +out/renderer/assets/solarized-light-BIMszn7B-vPMkTTwP.js 6.68 kB +out/renderer/assets/cypher-COYrq2Yy-BtVrfsLp.js 6.75 kB +out/renderer/assets/arc-LpCwTDer.js 6.75 kB +out/renderer/assets/proto-CQIfhs_g-Deqofbl3.js 6.77 kB +out/renderer/assets/smalltalk-BLGdLDJX-BKGgemER.js 6.79 kB +out/renderer/assets/vb-D1Cw85Ss-BSz-V9M4.js 6.86 kB +out/renderer/assets/talonscript-DA9pg7Tj-CPXKQ95R.js 6.96 kB +out/renderer/assets/r-Bb2Mu7Fo-Dq0URONw.js 7.00 kB +out/renderer/assets/solarized-dark-D_I-4EGa-BZbeAUhW.js 7.04 kB +out/renderer/assets/diagram-Z3DM3KII-Dq9cpJHo.js 7.08 kB +out/renderer/assets/riscv-CQHqXr1Z-BFlZFId-.js 7.11 kB +out/renderer/assets/soy-DybHqX1A-DOhErZPj.js 7.15 kB +out/renderer/assets/min-light-BF0EjVgr-DvViuJW_.js 7.16 kB +out/renderer/assets/scheme-Dn0tgEWN-BK64z0tZ.js 7.37 kB +out/renderer/assets/prism-bash-B2ETaHUm.js 7.43 kB +out/renderer/assets/typescript-sfPIqb8J-DtIl1kXb.js 7.44 kB +out/renderer/assets/hlsl-CAmjcFpk-B3FZWMVz.js 7.48 kB +out/renderer/assets/mdx-Bdu4uO-C-BrzgNjCw.js 7.58 kB +out/renderer/assets/qss-DkzwWM0J-04JPp7d-.js 7.67 kB +out/renderer/assets/html-DKbmsqz6-Cnkf6ew3.js 7.69 kB +out/renderer/assets/systemd-CS6mVasZ-HbzlQlDs.js 8.07 kB +out/renderer/assets/monokai-CYqILLdj-CEXuJ8HO.js 8.08 kB +out/renderer/assets/twig-r8vgPZrm-D2l24YwI.js 8.18 kB +out/renderer/assets/updates-ui-BoiWSsup.js 8.22 kB +out/renderer/assets/wgsl-D_5Qxf6T-D508aVGZ.js 8.27 kB +out/renderer/assets/sdbl-BXfz6d3_-C4Qk7OPN.js 8.42 kB +out/renderer/assets/regexp-Dv0OUts_-BqK6b4KR.js 8.46 kB +out/renderer/assets/prism-php-dzcOOH50.js 8.49 kB +out/renderer/assets/systemverilog-BreNGkRs-RIXr4hNf.js 8.65 kB +out/renderer/assets/plsql-C-xpsZfV-frBdohcC.js 8.71 kB +out/renderer/assets/vue-html-DvuHo2mm-b7I-opwf.js 8.71 kB +out/renderer/assets/haml-CIYwkycC-3fSMp7m2.js 8.81 kB +out/renderer/assets/scss-CLoW-2dr-BBC_GO_6.js 8.86 kB +out/renderer/assets/dart-CBkkDIWs-ezKLFP5s.js 8.94 kB +out/renderer/assets/horizon-CELVL8Ba-x0NmpRb6.js 8.97 kB +out/renderer/assets/horizon-bright-DBDyMeUQ-Bhh-QDk3.js 8.98 kB +out/renderer/assets/julia-DvNkK6LK-Bi3Rlfah.js 9.04 kB +out/renderer/assets/clojure-886L7m2N-BhGJsUM7.js 9.14 kB +out/renderer/assets/make-CsAfL-jc-DaQVAww0.js 9.18 kB +out/renderer/assets/andromeeda--j5Bq-48-DxyWS_fJ.js 9.21 kB +out/renderer/assets/dark-plus-FAPM6M6c-DKexDF--.js 9.29 kB +out/renderer/assets/sas-BQIEUTPQ-Bwx-ZPYU.js 9.31 kB +out/renderer/assets/slack-dark-nDxLkSCC-C5pzIEPN.js 9.31 kB +out/renderer/assets/perl-Bec3eWyr-CDmSu3_s.js 9.32 kB +out/renderer/assets/plastic-DY_h9Vzh-CZzPFkTC.js 9.49 kB +out/renderer/assets/sass-Ysv8HTNa-CHNQIGaT.js 9.49 kB +out/renderer/assets/st-BrgXZ-Ag-BUs-RRgp.js 9.58 kB +out/renderer/assets/typst-Co5rZla4-COemceoz.js 9.61 kB +out/renderer/assets/slack-ochin-7zJWY-K--C7KFpXik.js 9.63 kB +out/renderer/assets/defaultLocale-QNqK0iCN.js 9.84 kB +out/renderer/assets/handlebars-CIJAyfa9-6toBlNYk.js 9.94 kB +out/renderer/assets/jison-Cbw0l5It-BNek_9Kq.js 9.95 kB +out/renderer/assets/sql-DviNlDJO-CwV6bDIP.js 9.97 kB +out/renderer/assets/kotlin-DIw6ua6F-CdVnL0aF.js 10.01 kB +out/renderer/assets/cmake-CyNDuJo8-2Hk4zQCd.js 10.07 kB +out/renderer/assets/light-plus-DkScKIB5-e8Q5AKjf.js 10.14 kB +out/renderer/assets/hcl-DoJdlYjN-DdpM5wFm.js 10.25 kB +out/renderer/assets/scala-Dj45wWzI-CAMCqIXS.js 10.40 kB +out/renderer/assets/postiats-SaHD9Qcv-FPvOr1pn.js 10.45 kB +out/renderer/assets/beancount-CyZf3Huc-C4n-y8pc.js 10.58 kB +out/renderer/assets/tex-gcnXexI3-BUpeblVA.js 10.60 kB +out/renderer/assets/php-Bn8AF0uj-CBbpr2vs.js 10.62 kB +out/renderer/assets/nextflow-groovy-D4ZyOBoZ-C7jziUwg.js 10.63 kB +out/renderer/assets/dream-maker-5oXa1Z51-CLRrQkBL.js 10.67 kB +out/renderer/assets/ts-tags-xeTAUNHG-CG_gr3En.js 10.70 kB +out/renderer/assets/raku-Bfr41qeN-C7t9XlCj.js 10.72 kB +out/renderer/assets/mysql-CZJtil0v-CP4gK9vT.js 10.73 kB +out/renderer/assets/task-menu-icons-BRdNqJF0.js 10.78 kB +out/renderer/assets/prism-csharp-D9xOwbIN.js 10.91 kB +out/renderer/assets/yaml-CsitfczK-Cu7vbJZs.js 10.97 kB +out/renderer/assets/diagram-UQ7AKVKN-B1EaevB-.js 11.05 kB +out/renderer/assets/elm-Dl1XrIiD-CwXBAFKd.js 11.18 kB +out/renderer/assets/just-He7qscmV-Bkq-0zku.js 11.19 kB +out/renderer/assets/redshift-Djb4PK3z-9Ar4PFWD.js 11.35 kB +out/renderer/assets/github-light-B_J7N1HZ-DWSXFnsf.js 11.38 kB +out/renderer/assets/ruby-CxOCB7_P-BzsjPJ6Z.js 11.48 kB +out/renderer/assets/prolog-DAqMMM08-BFKdnH0S.js 11.56 kB +out/renderer/assets/terraform-BW8B2WXV-zeRjs0zr.js 11.59 kB +out/renderer/assets/github-dark-BgqEY2WG-C9QbkZU3.js 11.60 kB +out/renderer/assets/puppet-CaR8DEdW-Biai9WKX.js 11.65 kB +out/renderer/assets/pkl-DrXR3Dxy-Bno7kqPT.js 11.67 kB +out/renderer/assets/laserwave-Clkc4Pj8-DOjuqF9n.js 11.69 kB +out/renderer/assets/pieDiagram-E7YTZNPT-BwiXBDwO.js 11.95 kB +out/renderer/assets/rst-BJFdabDk-Cv-fSo2B.js 12.04 kB +out/renderer/assets/linear-WS155L0r.js 12.11 kB +out/renderer/assets/wasm-DYwNZ-r4-BrA6oOvM.js 12.21 kB +out/renderer/assets/hjson-CmvCiVhY-BdH9CbZ2.js 12.25 kB +out/renderer/assets/razor-D5kquflS-CWY5AfCS.js 12.39 kB +out/renderer/assets/abap-BJyKdrbp-hWIyERPx.js 12.52 kB +out/renderer/assets/handlebars-B1z64YSt-MC-VEvxc.js 12.52 kB +out/renderer/assets/apache-BUbWdjM2-2Zu7IlVl.js 12.66 kB +out/renderer/assets/vesper-B5lCMuIY-CXGQHRuW.js 12.88 kB +out/renderer/assets/pgsql-BYm17UA1-Cvj1smQI.js 12.93 kB +out/renderer/assets/protobuf-BOGxqb2m-yTWn-oM_.js 12.98 kB +out/renderer/assets/bat-D2y8Uewi-CEJzP2ue.js 13.09 kB +out/renderer/assets/fish-CaZR_ofm-BcO_q5kQ.js 13.24 kB +out/renderer/assets/elixir-Lipcswxh-DnZCznfr.js 13.27 kB +out/renderer/assets/v-wnWoBHkK-CzCOTyIp.js 13.41 kB +out/renderer/assets/AboutHelpSettingsPanel-Ui_VOvh7.js 13.48 kB +out/renderer/assets/vitesse-light-DQXFiRFx-Ct7fN8pJ.js 13.81 kB +out/renderer/assets/aurora-x-9vUYYjHV-CImifmUW.js 13.85 kB +out/renderer/assets/vitesse-black-cwK5rWgD-BGrq81WC.js 13.87 kB +out/renderer/assets/vitesse-dark-CsfgW0oH-Dx8cqxrm.js 13.96 kB +out/renderer/assets/ShortcutsSettingsPanel-KgJeI7QZ.js 14.15 kB +out/renderer/assets/pug-D0UckVoV-BTWU19Nk.js 14.16 kB +out/renderer/assets/synthwave-84-LX1B8mRG-yuUErnSx.js 14.23 kB +out/renderer/assets/github-light-default-BRmIzqWc-B3gMi7zW.js 14.36 kB +out/renderer/assets/clarity-AxkJPY5c-DfVHSVIk.js 14.48 kB +out/renderer/assets/github-light-high-contrast-BUKIZOxn-DL0r2b0z.js 14.49 kB +out/renderer/assets/github-dark-dimmed-DoIdqTey-CDc6YqEM.js 14.64 kB +out/renderer/assets/github-dark-default-CwWjzI40-_0bgyJYv.js 14.64 kB +out/renderer/assets/chunk-PWAF6VOD-DUCy2J9a.js 14.76 kB +out/renderer/assets/github-dark-high-contrast-bFLNMLvK-BUp3HmXY.js 14.80 kB +out/renderer/assets/diagram-S7CK7UJ4-DZ0Sug9N.js 14.98 kB +out/renderer/assets/gnuplot-Dw3FRha5-D6o75ylb.js 14.98 kB +out/renderer/assets/rust-C0Ih6nmc-Bm01RMLz.js 15.27 kB +out/renderer/assets/actionscript-3-O8jnLcvn-C7OtofMN.js 15.41 kB +out/renderer/assets/luau-BzxGbjcn-aQpsBeQB.js 15.64 kB +out/renderer/assets/nix-zl191KBb-CxSq6jsB.js 15.85 kB +out/renderer/assets/lua-BwTLfNCK-IuSxl8fO.js 16.04 kB +out/renderer/assets/abap-FvPUHv8B-BVQp86jh.js 16.05 kB +out/renderer/assets/solidity-96fhzG-Q-CZEni-ZB.js 16.28 kB +out/renderer/assets/matlab-8ZQqHKQX-g_ODc8QU.js 16.29 kB +out/renderer/assets/cue-eHSfcyUV-BO0bCEDm.js 16.40 kB +out/renderer/assets/kusto-D8vBBISG-C0y2Wtyy.js 16.45 kB +out/renderer/assets/powerquery-B7BjLMcF-BkVSWPtX.js 16.49 kB +out/renderer/assets/elixir-B1NaQxrO-Ba6X-FuW.js 16.50 kB +out/renderer/assets/react-DrereneL.js 16.50 kB +out/renderer/assets/odin-B-YqhW9I-B-ZI05Ll.js 16.71 kB +out/renderer/assets/solidity-Dpt2BLAA-BD_YSA0r.js 16.98 kB +out/renderer/assets/bird2-BMkLvc4r-CyoW3El7.js 17.17 kB +out/renderer/assets/kanagawa-wave-CM_o6oKV-VzWuxPSA.js 17.32 kB +out/renderer/assets/kanagawa-lotus-Cj3XDpoG-cmeMwVaD.js 17.32 kB +out/renderer/assets/kanagawa-dragon-D_NPnIy_-Cyd8MANv.js 17.33 kB +out/renderer/assets/cynefinDiagram-5FMLGOSQ-DUo_T9ft.js 17.61 kB +out/renderer/assets/stateDiagram-D77RDMKH-BbeuRtup.js 18.11 kB +out/renderer/assets/chunk-L3NEJ4N5-BZPl6K5u.js 18.16 kB +out/renderer/assets/liquid-D_7zu7XR-BZ3z6-Mj.js 18.46 kB +out/renderer/assets/svelte-DUGqPubT-CAfIEh4G.js 18.60 kB +out/renderer/assets/graphql-ObxcfEHH-9pUo2yjR.js 18.65 kB +out/renderer/assets/jsonMode-DdQpkp6D-CRQw31fq.js 18.79 kB +out/renderer/assets/material-theme-q28j4V_0-s4HtqlFv.js 18.81 kB +out/renderer/assets/material-theme-ocean-DAvlEnSm-Cyw7qD-l.js 18.83 kB +out/renderer/assets/material-theme-darker-CHEuMVX9-D-hz3EEt.js 18.83 kB +out/renderer/assets/material-theme-lighter-DY4T1_JG-C0HwKluR.js 18.84 kB +out/renderer/assets/material-theme-palenight-CqDFvQ-v-RoTowTME.js 18.84 kB +out/renderer/assets/gherkin-BcjDDslM-BdnbjalD.js 19.20 kB +out/renderer/assets/gdscript-CekKc1U_-DVmAmHvE.js 19.21 kB +out/renderer/assets/groovy-DH3arekX-StnUgJL0.js 19.38 kB +out/renderer/assets/mdc-D-U85KZE-DPbAVRTg.js 19.85 kB +out/renderer/assets/diagram-VSXAHHWV-CbmzU86w.js 20.01 kB +out/renderer/assets/move-CmExnPjU-DPj_eIaE.js 20.22 kB +out/renderer/assets/ayu-dark-BeByMiYw-CS3MEELg.js 20.27 kB +out/renderer/assets/ayu-mirage-C1jJ6Jfs-CnA8kJ7r.js 20.28 kB +out/renderer/assets/ayu-light-DmTZeN54-CDULCKqM.js 20.35 kB +out/renderer/assets/glimmer-js-D9ZnrcNN-BS431Ogg.js 20.44 kB +out/renderer/assets/glimmer-ts-DuhFj6qR-CsFesiaT.js 20.44 kB +out/renderer/assets/viml-DPVJ_KYe-De3CdqgJ.js 20.56 kB +out/renderer/assets/nushell-Cd8Dwa1M-Dhf9XkYz.js 20.62 kB +out/renderer/assets/snazzy-light-B8znOqT6-B1FX3-IF.js 20.97 kB +out/renderer/assets/dagre-GXQ25YYZ-_SHLHEAK.js 21.01 kB +out/renderer/assets/dracula-DeMffiYO-Bl4juROY.js 21.26 kB +out/renderer/assets/dracula-soft-BnfvpcDv-CYsUeSum.js 21.27 kB +out/renderer/assets/twig-7zjsCqYg-CMujKsZl.js 21.44 kB +out/renderer/assets/freemarker2-enkimFXA-0bWMkoTL.js 21.73 kB +out/renderer/assets/PersonalizationSettingsPanel-B06BA6F_.js 21.87 kB +out/renderer/assets/rose-pine-CEVQiaW0-DaA_4NNK.js 21.94 kB +out/renderer/assets/rose-pine-moon-B9bum7Ik-B6_AhIsD.js 21.96 kB +out/renderer/assets/rose-pine-dawn-2Q5fMoJp-DxMkAwKM.js 21.96 kB +out/renderer/assets/powershell-ycAdP1r9-B7r4Hnhz.js 22.11 kB +out/renderer/assets/common-lisp-DcFHcTKh-CWH5diwh.js 22.81 kB +out/renderer/assets/gruvbox-dark-hard-gOzMLqif-DDlcfu4q.js 22.83 kB +out/renderer/assets/gruvbox-dark-soft-CKvURktN-C6MJezBg.js 22.83 kB +out/renderer/assets/gruvbox-light-hard-CMa_c48J-BUQ67Msp.js 22.84 kB +out/renderer/assets/gruvbox-light-soft-yfAGJYsX-DNM2qqWB.js 22.84 kB +out/renderer/assets/gruvbox-dark-medium-BQSVGwWb-qh8C4DPZ.js 22.84 kB +out/renderer/assets/gruvbox-light-medium-B9S5UNr1-DZxV_o-P.js 22.84 kB +out/renderer/assets/nim-CD961Jl3-CuyTrDpQ.js 22.91 kB +out/renderer/assets/cadence-C2JmJjDr-B-b63Epg.js 23.87 kB +out/renderer/assets/sql-C_oMiPb0-CRnSOxMo.js 23.87 kB +out/renderer/assets/wit-CXpQol8Q-D2NEDOhy.js 24.11 kB +out/renderer/assets/templ-gFcHJbF7-BqIwRUQe.js 24.38 kB +out/renderer/assets/astro-kV3HjkbP-CH6o6jKA.js 24.46 kB +out/renderer/assets/vhdl-Ci4REirV-D-qSzcJD.js 24.46 kB +out/renderer/assets/purescript-DCsDAdnX-DsynrkKe.js 24.97 kB +out/renderer/assets/vue-Cuk7Vimg-CFbFXIr8.js 25.25 kB +out/renderer/assets/surrealql-GFjNBdcm-Vm68TOTE.js 25.34 kB +out/renderer/assets/one-light-CMfGrl_P-B-1jUQM9.js 25.49 kB +out/renderer/assets/night-owl-light-CAEa42tO-TPCLv7z5.js 26.10 kB +out/renderer/assets/system-verilog-D_bVVpLE-C_dvOlr3.js 26.41 kB +out/renderer/assets/angular-html-BrLPO2Fv-DJgz5E5d.js 26.48 kB +out/renderer/assets/typespec-D5WYs8C4-AaOHagqW.js 26.72 kB +out/renderer/assets/nord-DlCAGdjr-Div2jUYm.js 26.91 kB +out/renderer/assets/codeql-DidIlXer-D6RBJOzg.js 27.08 kB +out/renderer/assets/scss-BhK8Ovpn-DfDLQi2C.js 27.52 kB +out/renderer/assets/coffee-DrMWXxy6-BoavQsuh.js 27.68 kB +out/renderer/assets/java-DaupjRFz-zQd9RZAc.js 27.69 kB +out/renderer/assets/razor-B2hRAVmz-Dj7TOgY5.js 27.72 kB +out/renderer/assets/apl-C42PBett-BNW4FTmO.js 27.87 kB +out/renderer/assets/chunk-SVP7TREG-BJrMMBGT.js 28.38 kB +out/renderer/assets/fsharp-BHFgIxsY-CvR6tsY8.js 28.48 kB +out/renderer/assets/marko-DXKHPFnH-C0z2-ucz.js 28.74 kB +out/renderer/assets/GeneralSettingsPanel-CA6yOnsk.js 29.10 kB +out/renderer/assets/night-owl-DegwdXaM-6ZGfBB7K.js 29.11 kB +out/renderer/assets/c3-BOs4FlGA-BuhFXrRY.js 29.17 kB +out/renderer/assets/MemorySettingsPanel-cqwWfj-O.js 29.75 kB +out/renderer/assets/crystal-DlzoxO28-BWa_t1Io.js 29.84 kB +out/renderer/assets/applescript-ij24h7OO-_xHQcvud.js 29.87 kB +out/renderer/assets/tsMode-SiG-Sp2b-DB8xZUGJ.js 30.55 kB +out/renderer/assets/pierre-dark-Daa2n9wr-D7rla9B_.js 30.74 kB +out/renderer/assets/pierre-light-D_hZXvUj-DJnIOKLO.js 30.75 kB +out/renderer/assets/pierre-dark-soft-BhNM3pgh-Dp_VeHWv.js 30.76 kB +out/renderer/assets/pierre-light-soft-BVrSv6ZG-C6Na39F-.js 30.76 kB +out/renderer/assets/ishikawaDiagram-5VMMS53U-D5VU_Gfi.js 30.78 kB +out/renderer/assets/pierre-dark-tritanopia-CGKuoAZi-C0HpbU3l.js 30.78 kB +out/renderer/assets/pierre-light-tritanopia-BiDEaWaH-wWduIsi3.js 30.78 kB +out/renderer/assets/pierre-dark-protanopia-deuteranopia-Cs1lz9lE-enlgPsHw.js 30.82 kB +out/renderer/assets/pierre-light-protanopia-deuteranopia-BM0RLBB_-Dz5iBHkO.js 30.82 kB +out/renderer/assets/stylus-ZCryC73G-urFW3_yk.js 31.29 kB +out/renderer/assets/diagram-VX7I27RA-uopNEQPp.js 31.44 kB +out/renderer/assets/scala-BBsC3Oz3-VCjyobQG.js 31.48 kB +out/renderer/assets/mermaid-D6CQfUGU-C6DHNxVz.js 33.37 kB +out/renderer/assets/poimandres-EIt_jotH-DHKFQj5Q.js 33.69 kB +out/renderer/assets/kanban-definition-UXKFOSKX-DFn9PSNU.js 33.91 kB +out/renderer/assets/one-dark-pro-DR9QpZM3-BA4d4lw2.js 33.98 kB +out/renderer/assets/mermaid-parser.core-CstzWfPU.js 34.66 kB +out/renderer/assets/haxe-BWT5wSyZ-BuUsQb-h.js 35.38 kB +out/renderer/assets/nginx-DhtViCEk-C18zABFg.js 35.58 kB +out/renderer/assets/houston-BdS5A_yD-NUige_z1.js 35.61 kB +out/renderer/assets/tokyo-night-BS1_DFu7-CYsPn2J-.js 35.86 kB +out/renderer/assets/erlang-Dd62d0xZ-DHVWwcKa.js 37.71 kB +out/renderer/assets/rough.esm-BX5QqLti.js 38.33 kB +out/renderer/assets/mindmap-definition-YA3MSWOX-Beo2z6Zl.js 38.59 kB +out/renderer/assets/cobol-D7RZfOK--CEk2iYO9.js 39.37 kB +out/renderer/assets/journeyDiagram-3NMN7TZE-D1O_nld8.js 40.13 kB +out/renderer/assets/julia-ZzkUXm0W-BIm_zTAN.js 40.32 kB +out/renderer/assets/lspLanguageFeatures-DK9zifhE-DeEqLmGO.js 40.76 kB +out/renderer/assets/asm-DYVIzeEk-Byg5xzam.js 40.91 kB +out/renderer/assets/haskell-Ba6HbLj8-D0OYaIy8.js 41.78 kB +out/renderer/assets/sankeyDiagram-P5KCCOFB-8RQXHBl8.js 41.83 kB +out/renderer/assets/shellscript-B69gKcss-49Zm6IyC.js 41.97 kB +out/renderer/assets/wardleyDiagram-VM6X3IG4-BulU0_1W.js 42.40 kB +out/renderer/assets/perl-Dv6Cq_FS-DIORmO5G.js 43.55 kB +out/renderer/assets/pierre-dark-vibrant-BMsyYliQ-84Eeh-Uj.js 44.96 kB +out/renderer/assets/pierre-light-vibrant-CWzM4Pa_-QZvTkTJe.js 44.97 kB +out/renderer/assets/ruby-DWcdJvcx-q0K84ieK.js 46.50 kB +out/renderer/assets/go-BOpYl7fu-BiT4MB-v.js 47.02 kB +out/renderer/assets/apex-B48ZHHzN-BBt8sSNQ.js 47.18 kB +out/renderer/assets/catppuccin-mocha-cPsH7Lup-SVLZehhk.js 47.46 kB +out/renderer/assets/catppuccin-latte-DcEecI7n-jo2cPJyK.js 47.46 kB +out/renderer/assets/catppuccin-frappe-BdOW2tdI-BI0Hc9cS.js 47.46 kB +out/renderer/assets/catppuccin-macchiato-Bvz_yAZY-DWewRa4S.js 47.47 kB +out/renderer/assets/ada-BT0j8ine-CLTLBE8n.js 48.28 kB +out/renderer/assets/d-B1HbH29p-Bi6t8Ck6.js 49.10 kB +out/renderer/assets/css-NFwnoVns-BvwuZkcY.js 49.49 kB +out/renderer/assets/imba-C-oGt11l-CqKI0OVw.js 50.13 kB +out/renderer/assets/requirementDiagram-BXWQKSXE-BW3eBKn6.js 51.39 kB +out/renderer/assets/erDiagram-RLTQ6QDP-CRW8KnKL.js 52.41 kB +out/renderer/assets/browserify-C9uP_nIr.js 52.80 kB +out/renderer/assets/gitGraphDiagram-WWUBYQGX-SNvwtaLo.js 53.82 kB +out/renderer/assets/everforest-dark-gCM8XhEI-DzRrg06U.js 53.94 kB +out/renderer/assets/everforest-light-DhK35DkL-BEDtvHw1.js 53.95 kB +out/renderer/assets/timeline-definition-24CTP7MA-DHkWKYwu.js 54.31 kB +out/renderer/assets/wikitext-CQNrXTmv-DJ18wIlO.js 56.09 kB +out/renderer/assets/stata-BUONSdsT-BPnapjPC.js 57.23 kB +out/renderer/assets/quadrantDiagram-AXDQQJYC-DF0YuDtz.js 58.21 kB +out/renderer/assets/html-Dq1ixqYb-okJOhOmu.js 58.25 kB +out/renderer/assets/chunk-OSK3NFVY-B3NvnB1z.js 58.56 kB +out/renderer/assets/ocaml-CUdGm1iq-BKX30YEX.js 62.65 kB +out/renderer/assets/model-settings-source-JYisGYmM.js 63.03 kB +out/renderer/assets/ballerina-CpYcPBJI-D9ac3462.js 64.89 kB +out/renderer/assets/markdown-BSrOIEaF-BFwOzGIM.js 65.52 kB +out/renderer/assets/chunk-IMKFNOWR-BIe7x3W7.js 67.22 kB +out/renderer/assets/mojo-BNaitZ-7-E_psDM2x.js 70.00 kB +out/renderer/assets/python-Cld0Iwtn-tcCJ5L_g.js 70.17 kB +out/renderer/assets/blockDiagram-I7D4REHJ-CyHqCc1n.js 71.01 kB +out/renderer/assets/bsl-CtP8370o-Pi14XlIU.js 71.07 kB +out/renderer/assets/c-B4augMcT-B5ncIjy5.js 72.57 kB +out/renderer/assets/chunk-75Z2AOVW-BnN-mv3P.js 72.67 kB +out/renderer/assets/latex-g2Pus_l2-CP0G7LTN.js 72.85 kB +out/renderer/assets/vyper-C1nscAY5-BTAKd5p2.js 74.85 kB +out/renderer/assets/ModelSettingsPanel-Bq69xf7M.js 76.64 kB +out/renderer/assets/xychartDiagram-S5SC5T6Z-B0HnmiNK.js 76.79 kB +out/renderer/assets/chunk-GMAD6QVW-B_AU-1G2.js 77.76 kB +out/renderer/assets/hack-B1ag3l4X-CEYIfPfg.js 80.58 kB +out/renderer/assets/src-DsgKm1PY.js 83.16 kB +out/renderer/assets/chunk-TICWLB2K-HMkllssg.js 83.88 kB +out/renderer/assets/fortran-free-form-CsgtTAg3-Dm0PhuY8.js 89.20 kB +out/renderer/assets/vennDiagram-4TSXK5OY-4fpVJ9Np.js 89.26 kB +out/renderer/assets/csharp-YOPVljXo-CBjcozlW.js 89.91 kB +out/renderer/assets/racket--xYIV9-n-NDM2V4Sc.js 92.62 kB +out/renderer/assets/swift-CgzYrGBX-CaMD6i-j.js 94.14 kB +out/renderer/assets/less-BGhX8xko-CbSvNyvq.js 99.00 kB +out/renderer/assets/chunk-SHT3W25Y-2hntSx1_.js 104.10 kB +out/renderer/assets/objective-c-CmcWiAft-DY5tZuMk.js 105.62 kB +out/renderer/assets/blade-Bq8WPf0E-BehdttJf.js 105.98 kB +out/renderer/assets/c4Diagram-7LVT6UL2-BUPZp1Fb.js 107.96 kB +out/renderer/assets/php-X15vsN4N-ChBJUzAp.js 111.49 kB +out/renderer/assets/dagre-CzI-C3sx.js 122.98 kB +out/renderer/assets/ganttDiagram-EL5Y4UJY-3y2lEktC.js 123.77 kB +out/renderer/assets/graphlib-CoAzpIqe.js 127.44 kB +out/renderer/assets/asciidoc-DJWalVNM-Daa-Gl9r.js 146.30 kB +out/renderer/assets/mdx-C_Ato9sK-CDV72_N0.js 146.49 kB +out/renderer/assets/editor.main-POO0Vbhx-D31yi93c.js 161.32 kB +out/renderer/assets/cose-bilkent-JH36ORCC-CA60tZpq.js 165.63 kB +out/renderer/assets/objective-cpp-BggTCHV8-BRaaCyEF.js 172.18 kB +out/renderer/assets/javascript-AfZCJ9Uc-C_GZREFb.js 175.31 kB +out/renderer/assets/tsx-BOlKGefW-D7XVyutE.js 176.00 kB +out/renderer/assets/jsx-CPd9p36x-D5Ck2u9I.js 178.26 kB +out/renderer/assets/sequenceDiagram-WJ2MYXX4-D7FeprQ0.js 190.05 kB +out/renderer/assets/typescript-4sRsPriL-Ce01imBq.js 191.16 kB +out/renderer/assets/mermaid.core-_tuT8V40.js 191.57 kB +out/renderer/assets/angular-ts-YduEkmVa-936ueej5.js 193.82 kB +out/renderer/assets/vue-vine-DXhYlaTf-C8MW7tnI.js 201.27 kB +out/renderer/assets/SourceSelect-Dd7kI5iL.js 203.20 kB +out/renderer/assets/chunk-4HAMMTFA-BusRJl4_.js 210.32 kB +out/renderer/assets/swimlanes-42K2YHIH-7v_MGc-X.js 265.51 kB +out/renderer/assets/wolfram-BVoTES0L-W3A5YqXk.js 267.14 kB +out/renderer/assets/chunk-DU6HZSFF-ev5NGQFs.js 271.07 kB +out/renderer/assets/architectureDiagram-5GKGNRK7-BLwHQNCJ.js 318.23 kB +out/renderer/assets/katex-Y9ra-ykP.js 497.35 kB +out/renderer/assets/texmath-Bkeg3ZLn.js 594.25 kB +out/renderer/assets/wasm-CVjZL0jK-DcJkdGs4.js 622.62 kB +out/renderer/assets/cpp-9jHBA231-DB3feGjZ.js 626.73 kB +out/renderer/assets/app-4914IQSi.js 675.57 kB +out/renderer/assets/emacs-lisp-DjtOxg4j-CzQ0CKOn.js 780.06 kB +out/renderer/assets/cytoscape.esm-bVGYt-iW.js 869.69 kB +out/renderer/assets/ArtifactPierreDiff-DpqRTCz8.js 1,119.58 kB +out/renderer/assets/chunk-FOHPRMQF-BCllzKJD.js 1,154.18 kB +out/renderer/assets/index-Bk2r1j2x.js 3,761.37 kB +out/renderer/assets/editor.api2-dPwET-7w-BYIQ9bT3.js 4,889.23 kB + +✓ built in 2.31s diff --git a/docs/协作/evidence/B02-review-01/dom-report.json b/docs/协作/evidence/B02-review-01/dom-report.json new file mode 100644 index 0000000..7ae01cb --- /dev/null +++ b/docs/协作/evidence/B02-review-01/dom-report.json @@ -0,0 +1,70 @@ +{ + "result": "PASS", + "checks": [ + "uninstalled uses add slot", + "normal footer removed from DOM", + "current uses installed CardFrame", + "current removes Plus/add DOM", + "current use occupies status slot exactly once", + "use invokes one draft callback without installation", + "use does not open install detail", + "top nav count reflects installed list", + "reopen retains current state", + "enable failure prevents draft invocation", + "disabled skill enabled before callback", + "non-invocable current cannot use or reinstall", + "outdated installed identity distinction", + "outdated not represented as first add", + "outdated requires explicit confirmation", + "modified installed identity distinction", + "modified not represented as first add", + "modified requires explicit confirmation", + "broken installed identity distinction", + "broken not represented as first add", + "broken requires explicit confirmation", + "same-name local installed identity distinction", + "same-name local not represented as first add", + "same-name local requires explicit confirmation", + "broken same-name local installed identity distinction", + "broken same-name local not represented as first add", + "broken same-name local requires explicit confirmation", + "different source installed identity distinction", + "different source not represented as first add", + "different source requires explicit confirmation", + "workspace is not treated as managed current", + "external current while confirming prevents duplicate installation", + "first install confirms provenance and scripts", + "duplicate confirmation issues only one request", + "real host progress rendered", + "install success automatically switches action DOM", + "external uninstall restores add", + "external install blocks new add", + "external terminal progress clears block", + "unavailable has no duplicate installed entry", + "catalog retry recovers in place", + "empty catalog has no footer", + "SkillHub has only top installed navigation", + "套件 has only top installed navigation", + "no uncaught renderer errors" + ], + "calls": [ + [ + "enable", + "user:rec" + ], + [ + "enable", + "user:rec" + ], + [ + "install", + "archify", + { + "operationId": "c4b39eb6-c00b-423a-8c37-8446f6c787bd", + "overwrite": false + } + ] + ], + "errors": [], + "limits": "Real React in offline jsdom; callback boundary tested, not production composer dispatch. No native Chromium, computed layout, screenshot, theme/hover/focus pixels, model SDK, actual install or network." +} \ No newline at end of file diff --git a/docs/协作/evidence/B02-review-01/dom.txt b/docs/协作/evidence/B02-review-01/dom.txt new file mode 100644 index 0000000..d44545f --- /dev/null +++ b/docs/协作/evidence/B02-review-01/dom.txt @@ -0,0 +1,5 @@ + +> ycode@0.0.7 test:recommended-skills:dom +> node scripts/test-recommended-skills-dom.mjs + +{"result":"PASS","checks":45,"output":"C:\\Users\\Administrator\\.codex\\worktrees\\b02-accept-01\\YCode\\.tmp\\recommended-skills-dom-lBbu5l"} diff --git a/docs/协作/evidence/B02-review-01/hover-control.json b/docs/协作/evidence/B02-review-01/hover-control.json new file mode 100644 index 0000000..6213352 --- /dev/null +++ b/docs/协作/evidence/B02-review-01/hover-control.json @@ -0,0 +1,6 @@ +{ + "matches": false, + "background": "rgb(50, 60, 70)", + "hit": "qa-hover-control", + "hovered": 0 +} \ No newline at end of file diff --git a/docs/协作/evidence/B02-review-01/hover-diagnostics.json b/docs/协作/evidence/B02-review-01/hover-diagnostics.json new file mode 100644 index 0000000..89e97eb --- /dev/null +++ b/docs/协作/evidence/B02-review-01/hover-diagnostics.json @@ -0,0 +1,36 @@ +{ + "theme": "light", + "normal": { + "width": "24px", + "height": "24px", + "background": "rgba(0, 0, 0, 0)", + "color": "rgb(0, 0, 0)", + "outline": "rgb(0, 0, 0) none 0px", + "focused": false, + "hover": false + }, + "hover": { + "width": "24px", + "height": "24px", + "background": "rgb(230, 230, 230)", + "color": "rgb(0, 0, 0)", + "outline": "rgb(0, 0, 0) none 0px", + "focused": false, + "hover": false + }, + "probe": { + "button": "", + "buttonStyle": { + "pointerEvents": "auto", + "display": "flex", + "visibility": "visible" + }, + "point": { + "x": 315, + "y": 157 + }, + "hit": "2X*2hT3N$Y$ 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 Z?tQYtEiR?6SGVg7IcX(O+569a{{sN6eG32p literal 0 HcmV?d00001 diff --git a/docs/协作/evidence/B02-review-01/installed-narrow.png b/docs/协作/evidence/B02-review-01/installed-narrow.png new file mode 100644 index 0000000000000000000000000000000000000000..a3d7920e7b6de98b5c193dd27718a9dbb9eb7705 GIT binary patch literal 36050 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%0Dd<7W?Ute$Y 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 literal 0 HcmV?d00001 diff --git a/docs/协作/evidence/B02-review-01/native-report.json b/docs/协作/evidence/B02-review-01/native-report.json new file mode 100644 index 0000000..bd39fa7 --- /dev/null +++ b/docs/协作/evidence/B02-review-01/native-report.json @@ -0,0 +1,453 @@ +{ + "result": "PASS", + "checks": [ + "the recommendation card renders from the host catalog", + "the card exposes its install state for the host test", + "the card shows the author supplied description", + "no maintenance placeholder is shown", + "the remote catalog tabs still report no connection", + "the confirm dialog names the source repository", + "the confirm dialog states that no install script runs", + "the confirm dialog warns that the skill contains scripts", + "reverse Tab reaches the collapsible source information", + "Tab wraps inside the modal rather than entering the sidebar", + "the install progress is reported by the host", + "the host received the recommendation id", + "the host received a fresh operation id", + "a first install is not an overwrite", + "the card reports the recommendation as installed", + "the installed skill has no add button", + "the installed skill uses the recovered installed card", + "the installed action uses the original action slot", + "no duplicate under-card use action remains", + "the duplicate footer is absent", + "the detail remains the same DOM instance throughout installation", + "the detail offers use after installation", + "the success notification also offers use", + "there is no permanent list footer progress panel", + "installed action uses recovered 24px slot and 16px icon", + "light use action default background is transparent", + "light trusted native pointer enters use action", + "light hover has a distinct background", + "light use action remains focusable with stable 24px slot", + "the installed skill appears in the installed list", + "a same-name local skill requires an explicit replacement", + "the replacement notice mentions the local modification", + "an explicit replacement is sent to the host as an overwrite", + "a failed install shows the host error", + "a failed install can be retried from the same card", + "the download phase can be cancelled", + "the cancellation is sent to the host", + "closing a running detail restores the background", + "reopening detail keeps the same install operation", + "the commit phase disables cancellation in place", + "the success notification invokes the same use callback", + "disabled recommendation is enabled before use", + "an empty catalog is reported as unavailable, not as a maintenance page", + "the unavailable state keeps top installed navigation", + "the unavailable state has no duplicate installed entry", + "an install from another window is reported", + "a new install is blocked while another window is installing", + "the blocked state is explained on the card", + "the foreign block clears when that operation finishes", + "the settled install recorded its operation id", + "a stale frame does not regress the settled install", + "the dark theme reaches the real page", + "the dark card uses a dark surface", + "the dark layout keeps the recommendation card inside the viewport", + "the dark layout does not overflow the document", + "dark use action default background is transparent", + "dark trusted native pointer enters use action", + "dark hover has a distinct background", + "dark use action remains focusable with stable 24px slot", + "the recommendation card stays inside the narrow viewport", + "the narrow recommendation card causes no document overflow", + "no renderer errors" + ], + "calls": [ + [ + "recommendations" + ], + [ + "installState" + ], + [ + "list", + null + ], + [ + "installRecommended", + "archify", + { + "operationId": "3622ed5d-7679-409d-8bf1-cb9cc033060d", + "overwrite": false + } + ], + [ + "list", + null + ], + [ + "list", + null + ], + [ + "list", + null + ], + [ + "recommendations" + ], + [ + "installState" + ], + [ + "list", + null + ], + [ + "qaSetInstalled", + [ + { + "id": "user:local", + "name": "Archify", + "description": "本地导入的同名技能", + "version": "1.0.0", + "path": "C:/local/archify", + "scope": "user", + "enabled": true, + "userInvocable": true, + "disableModelInvocation": false, + "source": "imported", + "userModified": true + } + ] + ], + [ + "list", + null + ], + [ + "installRecommended", + "archify", + { + "operationId": "20fbd460-9f54-481b-802a-936c6dcced48", + "overwrite": true + } + ], + [ + "list", + null + ], + [ + "list", + null + ], + [ + "list", + null + ], + [ + "qaSetInstalled", + [] + ], + [ + "list", + null + ], + [ + "qaFailNext" + ], + [ + "installRecommended", + "archify", + { + "operationId": "8639b492-61ea-4e4d-a0a5-b3e5b05b65b5", + "overwrite": false + } + ], + [ + "installState" + ], + [ + "qaDelay", + 400 + ], + [ + "installRecommended", + "archify", + { + "operationId": "d6e1b302-5010-4e78-b1a0-fe648def3e27", + "overwrite": false + } + ], + [ + "cancelInstall", + "d6e1b302-5010-4e78-b1a0-fe648def3e27" + ], + [ + "installState" + ], + [ + "installState" + ], + [ + "qaDelay", + 0 + ], + [ + "qaDelay", + 250 + ], + [ + "installRecommended", + "archify", + { + "operationId": "080fabc8-19e7-4b4b-b72d-270fceb1b54d", + "overwrite": false + } + ], + [ + "list", + null + ], + [ + "list", + null + ], + [ + "list", + null + ], + [ + "qaSetInstalled", + [ + { + "id": "user:rec", + "name": "Archify", + "description": "生成可交互的架构图、流程图和一页式说明", + "version": "3.2.0", + "path": "C:/managed/archify", + "scope": "user", + "enabled": false, + "userInvocable": true, + "disableModelInvocation": false, + "source": "imported", + "userModified": false, + "origin": { + "recommendationId": "archify", + "repository": "tt-a1i/archify", + "commit": "25cf37080fc8b1dbe758a4efc3935b55f3327083", + "packagePath": "archify.zip", + "archiveSha256": "70e210265c59f24dcbdf2a502ff671104b5454e7ee7d3554aecd86bad32384f5", + "version": "3.2.0", + "installedAt": 1 + } + } + ] + ], + [ + "list", + null + ], + [ + "setEnabled", + "user:rec", + true, + null + ], + [ + "list", + null + ], + [ + "list", + null + ], + [ + "list", + null + ], + [ + "qaDelay", + 0 + ], + [ + "qaSetInstalled", + [] + ], + [ + "list", + null + ], + [ + "qaFailRecommendations", + true + ], + [ + "recommendations" + ], + [ + "installState" + ], + [ + "list", + null + ], + [ + "list", + null + ], + [ + "qaFailRecommendations", + false + ], + [ + "recommendations" + ], + [ + "qaEmitForeign", + "downloading", + "11111111-2222-4333-8444-555555555555" + ], + [ + "qaEmitForeign", + "installed", + "11111111-2222-4333-8444-555555555555" + ], + [ + "list", + null + ], + [ + "qaSetInstalled", + [] + ], + [ + "list", + null + ], + [ + "qaDelay", + 0 + ], + [ + "installRecommended", + "archify", + { + "operationId": "6c63fba3-ad6a-4fbb-8d11-02d213172e2b", + "overwrite": false + } + ], + [ + "list", + null + ], + [ + "list", + null + ], + [ + "list", + null + ], + [ + "qaEmitStale", + "downloading", + "6c63fba3-ad6a-4fbb-8d11-02d213172e2b", + 1 + ] + ], + "screenshots": [ + "recommendation-card.png", + "install-confirm.png", + "installed-detail.png", + "installed-recommendation-light.png", + "installed-use-light-hover.png", + "installed-use-light-focus.png", + "foreign-install.png", + "recommendation-dark.png", + "installed-use-dark-hover.png", + "installed-use-dark-focus.png", + "recommendation-narrow.png" + ], + "actionStyles": [ + { + "theme": "light", + "pointerEntry": { + "trusted": true, + "type": "mouse" + }, + "selectorHover": false + }, + { + "theme": "light", + "normal": { + "width": "24px", + "height": "24px", + "background": "rgba(0, 0, 0, 0)", + "color": "rgb(0, 0, 0)", + "outline": "rgb(0, 0, 0) none 0px", + "focused": false, + "hover": false + }, + "hover": { + "width": "24px", + "height": "24px", + "background": "rgb(230, 230, 230)", + "color": "rgb(0, 0, 0)", + "outline": "rgb(0, 0, 0) none 0px", + "focused": false, + "hover": false + }, + "focus": { + "width": "24px", + "height": "24px", + "background": "rgba(0, 0, 0, 0)", + "color": "rgb(0, 0, 0)", + "outline": "rgb(0, 0, 0) none 0px", + "focused": true, + "hover": false + } + }, + { + "theme": "dark", + "pointerEntry": { + "trusted": true, + "type": "mouse" + }, + "selectorHover": false + }, + { + "theme": "dark", + "normal": { + "width": "24px", + "height": "24px", + "background": "rgba(0, 0, 0, 0)", + "color": "rgb(255, 255, 255)", + "outline": "rgb(255, 255, 255) none 0px", + "focused": false, + "hover": false + }, + "hover": { + "width": "24px", + "height": "24px", + "background": "color(srgb 1 1 1 / 0.08)", + "color": "rgb(255, 255, 255)", + "outline": "rgb(255, 255, 255) none 0px", + "focused": false, + "hover": false + }, + "focus": { + "width": "24px", + "height": "24px", + "background": "rgba(0, 0, 0, 0)", + "color": "rgb(255, 255, 255)", + "outline": "rgb(255, 255, 255) none 0px", + "focused": true, + "hover": false + } + } + ], + "limits": "Controlled host in isolated Electron; the shipped page and styles are used. No network, no real skill storage, no real install." +} \ No newline at end of file diff --git a/docs/协作/evidence/B02-review-01/original-ui-runner.txt b/docs/协作/evidence/B02-review-01/original-ui-runner.txt new file mode 100644 index 0000000..a2b1e22 --- /dev/null +++ b/docs/协作/evidence/B02-review-01/original-ui-runner.txt @@ -0,0 +1,17 @@ + +> ycode@0.0.7 test:recommended-skills:ui +> node scripts/test-recommended-skills-ui.mjs + + +(electron) 'console-message' arguments are deprecated and will be removed. Please use Event object instead. +AssertionError [ERR_ASSERTION]: light pointer enters use action: false + at check (file:///C:/Users/Administrator/.codex/worktrees/b02-accept-01/YCode/scripts/test-recommended-skills-ui.mjs:180:14) + at verifyCurrentActionStyles (file:///C:/Users/Administrator/.codex/worktrees/b02-accept-01/YCode/scripts/test-recommended-skills-ui.mjs:210:7) + at async file:///C:/Users/Administrator/.codex/worktrees/b02-accept-01/YCode/scripts/test-recommended-skills-ui.mjs:270:7 { + generatedMessage: false, + code: 'ERR_ASSERTION', + actual: false, + expected: true, + operator: '==', + diff: 'simple' +} diff --git a/docs/协作/evidence/B02-review-01/pointer-ui-probe.mjs b/docs/协作/evidence/B02-review-01/pointer-ui-probe.mjs new file mode 100644 index 0000000..ce84adc --- /dev/null +++ b/docs/协作/evidence/B02-review-01/pointer-ui-probe.mjs @@ -0,0 +1,417 @@ +/** Isolated Electron fixture for the recommended-skill page. + * The host is fully controlled: no network, no real skill storage, no user data. */ +import fs from 'node:fs' +import path from 'node:path' +import assert from 'node:assert/strict' +import { createRequire } from 'node:module' +import { spawn } from 'node:child_process' + +const require = createRequire(import.meta.url) +const electronModule = require('electron') +const electron = typeof electronModule === 'object' && electronModule.app ? electronModule : null +const repository = path.resolve('.'), base = path.join(repository, '.tmp') + +if (!electron) { + fs.mkdirSync(base, { recursive: true }) + const output = fs.mkdtempSync(path.join(base, 'recommended-skills-ui-')) + const env = { ...process.env } + delete env.ELECTRON_RUN_AS_NODE + delete env.ELECTRON_RENDERER_URL + const child = spawn(electronModule, [path.resolve('.tmp/b02-acceptance/recommended-skills-ui-pointer.mjs'), output], { stdio: 'inherit', windowsHide: true, env }) + const timer = setTimeout(() => child.kill(), 120000) + process.exitCode = await new Promise(resolve => child.on('exit', code => { clearTimeout(timer); resolve(code ?? 1) })) +} else { + void (async () => { + const { app, BrowserWindow, ipcMain } = electron + const output = path.resolve(process.argv.at(-1)), relative = path.relative(base, output) + assert.ok(relative.startsWith('recommended-skills-ui-') && !relative.includes('..') && !path.isAbsolute(relative)) + const userData = path.join(output, 'data') + fs.mkdirSync(userData, { recursive: true }) + app.setPath('userData', userData) + const checks = [], errors = [], calls = [], screenshots = [], actionStyles = [] + + const recommendation = { + id: 'archify', + name: 'Archify', + description: '生成可交互的架构图、流程图和一页式说明', + author: 'tt-a1i', + license: 'MIT', + repository: 'tt-a1i/archify', + version: '3.2.0', + commit: '25cf37080fc8b1dbe758a4efc3935b55f3327083', + packagePath: 'archify.zip', + sha256: '70e210265c59f24dcbdf2a502ff671104b5454e7ee7d3554aecd86bad32384f5', + expectedBytes: 5271959, + containsScripts: true + } + const localSkill = { + id: 'user:local', name: 'Archify', description: '本地导入的同名技能', version: '1.0.0', + path: 'C:/local/archify', scope: 'user', enabled: true, userInvocable: true, + disableModelInvocation: false, source: 'imported', userModified: true + } + const installedRecommendation = { + id: 'user:rec', name: 'Archify', description: recommendation.description, version: '3.2.0', + path: 'C:/managed/archify', scope: 'user', enabled: true, userInvocable: true, + disableModelInvocation: false, source: 'imported', userModified: false, + origin: { + recommendationId: 'archify', repository: recommendation.repository, commit: recommendation.commit, + packagePath: recommendation.packagePath, archiveSha256: recommendation.sha256, version: '3.2.0', installedAt: 1 + } + } + + let installed = [], progress = null, failNext = false, cancelRequested = false, delay = 0, recommendationOverride = null, recommendationFails = false + let clock = 0 + const listeners = new Set(), changedListeners = new Set() + const emit = state => { + // The host stamps a monotonic time; a strict comparison rejects a stale frame. + const stamped = { ...state, updatedAt: ++clock } + progress = stamped + for (const listener of listeners) listener(stamped) + for (const win of BrowserWindow.getAllWindows()) if (!win.isDestroyed()) win.webContents.send('skills:install-progress', stamped) + } + const changed = () => { + for (const listener of changedListeners) listener() + for (const win of BrowserWindow.getAllWindows()) if (!win.isDestroyed()) win.webContents.send('skills:changed') + } + + ipcMain.handle('skills-qa', async (_event, method, args) => { + calls.push([method, ...args]) + if (method === 'recommendations') { + if (recommendationFails) throw Error('推荐目录服务不可用') + return recommendationOverride ?? [recommendation] + } + if (method === 'list') return installed + if (method === 'setEnabled') { installed = installed.map(skill => skill.id === args[0] ? { ...skill, enabled: args[1] } : skill); changed(); return } + if (method === 'installState') return progress + // The host only accepts the cancel request; the terminal frame still comes from the install flow. + if (method === 'cancelInstall') { cancelRequested = true; return { cancelled: true } } + if (method === 'installRecommended') { + const [id, options] = args + if (id !== recommendation.id) throw Error('未知推荐技能') + if (failNext) { + failNext = false + emit({ operationId: options.operationId, recommendationId: id, phase: 'failed', receivedBytes: 0, error: '下载失败:网络错误', updatedAt: Date.now() }) + throw Error('下载失败:网络错误') + } + emit({ operationId: options.operationId, recommendationId: id, phase: 'downloading', receivedBytes: 0, totalBytes: recommendation.expectedBytes, updatedAt: Date.now() }) + await new Promise(resolve => setTimeout(resolve, delay)) + if (cancelRequested) { cancelRequested = false; emit({ operationId: options.operationId, recommendationId: id, phase: 'cancelled', receivedBytes: 0, updatedAt: Date.now() }); throw Object.assign(Error('推荐技能安装已取消'), { name: 'AbortError' }) } + emit({ operationId: options.operationId, recommendationId: id, phase: 'validating', receivedBytes: recommendation.expectedBytes, totalBytes: recommendation.expectedBytes, updatedAt: Date.now() }) + await new Promise(resolve => setTimeout(resolve, delay)) + if (cancelRequested) { cancelRequested = false; emit({ operationId: options.operationId, recommendationId: id, phase: 'cancelled', receivedBytes: recommendation.expectedBytes, updatedAt: Date.now() }); throw Object.assign(Error('推荐技能安装已取消'), { name: 'AbortError' }) } + emit({ operationId: options.operationId, recommendationId: id, phase: 'installing', receivedBytes: recommendation.expectedBytes, totalBytes: recommendation.expectedBytes, updatedAt: Date.now() }) + await new Promise(resolve => setTimeout(resolve, delay)) + installed = [installedRecommendation] + emit({ operationId: options.operationId, recommendationId: id, phase: 'installed', receivedBytes: recommendation.expectedBytes, totalBytes: recommendation.expectedBytes, updatedAt: Date.now() }) + changed() + return installedRecommendation + } + if (method === 'qaSetInstalled') { installed = args[0]; changed(); return installed } + if (method === 'qaFailNext') { failNext = true; return true } + if (method === 'qaDelay') { delay = args[0]; return true } + if (method === 'qaSetRecommendations') { recommendationOverride = args[0]; return true } + if (method === 'qaFailRecommendations') { recommendationFails = args[0] === true; return true } + // Simulate an operation owned by another window. + if (method === 'qaEmitForeign') { + const [phase, operationId] = args + emit({ operationId, recommendationId: recommendation.id, phase, receivedBytes: 0, totalBytes: recommendation.expectedBytes, updatedAt: Date.now() }) + return true + } + // Replay a frame with an older timestamp to prove the terminal state never regresses. + if (method === 'qaEmitStale') { + const [phase, operationId, updatedAt] = args + const stamped = { operationId, recommendationId: recommendation.id, phase, receivedBytes: 0, totalBytes: recommendation.expectedBytes, updatedAt } + progress = stamped + for (const listener of listeners) listener(stamped) + for (const win of BrowserWindow.getAllWindows()) if (!win.isDestroyed()) win.webContents.send('skills:install-progress', stamped) + return true + } + if (method === 'qaSubscribe') { listeners.add(args[0]); return true } + if (method === 'qaSubscribeChanged') { changedListeners.add(args[0]); return true } + throw Error('Unknown QA method ' + method) + }) + + fs.writeFileSync(path.join(output, 'preload.cjs'), `const{contextBridge,ipcRenderer}=require('electron'); +const invoke=(method,...args)=>ipcRenderer.invoke('skills-qa',method,args); +contextBridge.exposeInMainWorld('ycode',{skills:{ + list:(cwd)=>invoke('list',cwd), + recommendations:()=>invoke('recommendations'), + installRecommended:(id,options)=>invoke('installRecommended',id,options), + cancelInstall:(operationId)=>invoke('cancelInstall',operationId), + installState:()=>invoke('installState'), + onInstallProgress:(listener)=>{const wrapped=(_event,state)=>listener(state);ipcRenderer.on('skills:install-progress',wrapped);return()=>ipcRenderer.removeListener('skills:install-progress',wrapped)}, + onChanged:(listener)=>{const wrapped=()=>listener();ipcRenderer.on('skills:changed',wrapped);return()=>ipcRenderer.removeListener('skills:changed',wrapped)}, + read:async()=>({skill:{},content:'',files:[]}), + setEnabled:(...args)=>invoke('setEnabled',...args), remove:async()=>{}, export:async()=>null, importPath:async()=>null + ,qaSetInstalled:(v)=>invoke('qaSetInstalled',v), + qaFailNext:()=>invoke('qaFailNext'), + qaDelay:(v)=>invoke('qaDelay',v), + qaSetRecommendations:(v)=>invoke('qaSetRecommendations',v), + qaFailRecommendations:(v)=>invoke('qaFailRecommendations',v), + qaEmitForeign:(phase,operationId)=>invoke('qaEmitForeign',phase,operationId), + qaEmitStale:(phase,operationId,updatedAt)=>invoke('qaEmitStale',phase,operationId,updatedAt) +},resources:{openExternal:async()=>undefined}});`) + + const location = file => JSON.stringify(path.join(repository, file).replaceAll('\\', '/')) + fs.writeFileSync(path.join(output, 'fixture.tsx'), `import React from 'react'; +import{createRoot}from'react-dom/client'; +import Center from ${location('src/renderer/src/capabilities/CapabilityCenter')}; +import${location('src/renderer/src/styles/tokens.css')}; +import${location('src/renderer/src/styles/app.css')}; +window.__qa={uses:[],created:0,find:0}; +createRoot(document.getElementById('root')).render( +
+
{}} onUseSkill={skill=>window.__qa.uses.push(skill)} onCreateSkill={()=>window.__qa.created++} onFindSkill={()=>window.__qa.find++}/> +
);`) + await require('esbuild').build({ + entryPoints: [path.join(output, 'fixture.tsx')], bundle: true, platform: 'browser', format: 'esm', jsx: 'automatic', + outfile: path.join(output, 'fixture.js'), loader: { '.svg': 'file', '.png': 'file', '.jpg': 'file', '.woff': 'file', '.woff2': 'file', '.ttf': 'file' }, logLevel: 'warning' + }) + fs.writeFileSync(path.join(output, 'index.html'), '
') + + const win = new BrowserWindow({ + width: 1052, height: 901, useContentSize: true, frame: false, show: false, + webPreferences: { preload: path.join(output, 'preload.cjs'), contextIsolation: true, nodeIntegration: false, backgroundThrottling: false } + }) + win.webContents.on('console-message', (_event, level, message) => { if (level === 3) errors.push(message) }) + const read = code => win.webContents.executeJavaScript(code) + const check = (label, actual, expected) => { + const pass = typeof expected === 'function' ? expected(actual) : JSON.stringify(actual) === JSON.stringify(expected) + assert.ok(pass, `${label}: ${JSON.stringify(actual)}`) + checks.push(label) + } + const pause = ms => new Promise(resolve => setTimeout(resolve, ms)) + const wait = async code => { for (let index = 0; index < 200; index++) { if (await read(code)) return; await pause(50) } throw Error('Timeout ' + code) } + const click = async selector => { + await read(`(()=>{const e=document.querySelector(${JSON.stringify(selector)});if(!e)throw Error('Missing '+${JSON.stringify(selector)});e.click();return true})()`) + await pause(140) + } + const capture = async name => { + win.webContents.invalidate() + await pause(120) + // A hidden window can capture the previous frame; warm the compositor first. + await win.webContents.capturePage() + await pause(200) + const image = await win.webContents.capturePage() + fs.writeFileSync(path.join(output, name + '.png'), image.toPNG()) + screenshots.push(name + '.png') + } + + const verifyCurrentActionStyles = async theme => { + const selector = '[data-recommendation-id=archify] .sm-use-btn' + const inspect = () => read(`(()=>{const b=document.querySelector(${JSON.stringify(selector)});const s=getComputedStyle(b);return{width:s.width,height:s.height,background:s.backgroundColor,color:s.color,outline:s.outline,focused:document.activeElement===b,hover:b.matches(':hover')}})()`) + win.webContents.sendInputEvent({type:'mouseMove',x:1,y:1}) + await read(`document.activeElement?.blur()`); await pause(200) + const normal = await inspect() + check(theme + ' use action default background is transparent', normal.background, value => value === 'rgba(0, 0, 0, 0)' || value === 'transparent') + const point = await read(`(()=>{const r=document.querySelector(${JSON.stringify(selector)}).getBoundingClientRect();return{x:Math.round(r.x+r.width/2),y:Math.round(r.y+r.height/2)}})()`) + await read('(()=>{window.__qaPointerEntry=null;document.querySelector(".sm-use-btn").addEventListener("pointerenter",event=>{window.__qaPointerEntry={trusted:event.isTrusted,type:event.pointerType}},{once:true})})()'); + win.webContents.sendInputEvent({type:'mouseMove',...point});await pause(200) + const hover = await inspect() + const pointerEntry=await read('window.__qaPointerEntry'); check(theme + ' trusted native pointer enters use action', pointerEntry?.trusted === true && pointerEntry?.type === 'mouse', true); actionStyles.push({theme,pointerEntry,selectorHover: hover.hover}); + check(theme + ' hover has a distinct background', hover.background !== normal.background, true) + await capture('installed-use-' + theme + '-hover') + win.webContents.sendInputEvent({type:'mouseMove',x:1,y:1}) + win.webContents.sendInputEvent({type:'keyDown',keyCode:'Tab'});win.webContents.sendInputEvent({type:'keyUp',keyCode:'Tab'}) + await read(`document.querySelector(${JSON.stringify(selector)}).focus()`);await pause(200) + const focus = await inspect() + check(theme + ' use action remains focusable with stable 24px slot', focus.focused && focus.width === '24px' && focus.height === '24px', true) + await capture('installed-use-' + theme + '-focus') + actionStyles.push({theme,normal,hover,focus}) + await read(`document.activeElement?.blur()`) + } + + try { + await win.loadFile(path.join(output, 'index.html'));win.showInactive();await pause(200) + await wait('!!document.querySelector(".yc-skills-page")') + await wait('!!document.querySelector("[data-recommendation-id=archify]")') + + check('the recommendation card renders from the host catalog', await read('document.querySelector("[data-recommendation-id=archify] .sm-card-name")?.textContent'), 'Archify') + check('the card exposes its install state for the host test', await read('document.querySelector("[data-recommendation-id=archify]").dataset.recommendationState'), 'none') + check('the card shows the author supplied description', await read('document.querySelector("[data-recommendation-id=archify] .sm-card-desc")?.textContent'), recommendation.description) + check('no maintenance placeholder is shown', await read('!!document.querySelector("[data-capability-maintenance]")'), false) + check('the remote catalog tabs still report no connection', await read('!!document.querySelector(".yc-skill-market-unavailable")'), false) + await capture('recommendation-card') + + // First install asks for an explicit confirmation. + await click('[aria-label="安装 Archify"]') + await wait('!!document.querySelector(".yc-skill-detail-shell")') + check('the confirm dialog names the source repository', await read('document.querySelector(".yc-skill-detail-shell").textContent.includes("tt-a1i/archify")'), true) + check('the confirm dialog states that no install script runs', await read('document.querySelector(".yc-skill-detail-shell").textContent.includes("不会执行仓库中的任何安装命令")'), true) + check('the confirm dialog warns that the skill contains scripts', await read('document.querySelector(".yc-skill-detail-shell").textContent.includes("包含脚本") || document.querySelector(".yc-skill-detail-shell").textContent.includes("脚本")'), true) + await capture('install-confirm') + await read('(()=>{const first=document.querySelector("[role=dialog] .sm-skill-detail-close");first.focus();first.dispatchEvent(new KeyboardEvent("keydown",{key:"Tab",shiftKey:true,bubbles:true,cancelable:true}))})()') + check('reverse Tab reaches the collapsible source information', await read('document.activeElement.tagName'), 'SUMMARY') + await read('document.activeElement.dispatchEvent(new KeyboardEvent("keydown",{key:"Tab",bubbles:true,cancelable:true}))') + check('Tab wraps inside the modal rather than entering the sidebar', await read('document.activeElement.getAttribute("aria-label")'), '关闭技能详情') + await read('window.__detailBeforeInstall=document.querySelector("[role=dialog]")') + await click('[aria-label="确认安装推荐技能"]') + await wait('document.querySelector(".yc-skill-inline-install")?.dataset.installPhase==="installed"') + check('the install progress is reported by the host', await read('document.querySelector(".yc-skill-inline-install").dataset.installPhase'), 'installed') + check('the host received the recommendation id', await read(`JSON.stringify(${JSON.stringify(calls)}.filter(c=>c[0]==='installRecommended').map(c=>c[1]))`), '["archify"]') + check('the host received a fresh operation id', await read(`(${JSON.stringify(calls)}.filter(c=>c[0]==='installRecommended').every(c=>typeof c[2]?.operationId==='string'&&c[2].operationId.length>8))`), true) + check('a first install is not an overwrite', await read(`(${JSON.stringify(calls)}.filter(c=>c[0]==='installRecommended').every(c=>c[2]?.overwrite!==true))`), true) + await wait('document.querySelector("[data-recommendation-id=archify]").dataset.recommendationState==="current"') + check('the card reports the recommendation as installed', await read('document.querySelector("[data-recommendation-id=archify]").dataset.recommendationState'), 'current') + check('the installed skill has no add button', await read('!!document.querySelector("[data-recommendation-id=archify] .sm-add-btn")'), false) + check('the installed skill uses the recovered installed card', await read('!!document.querySelector("[data-recommendation-id=archify] .sm-card--installed")'), true) + check('the installed action uses the original action slot', await read('!!document.querySelector("[data-recommendation-id=archify] .sm-status .sm-use-btn")'), true) + check('no duplicate under-card use action remains', await read('!!document.querySelector(".yc-skill-recommendation-meta button")'), false) + check('the duplicate footer is absent', await read('!!document.querySelector(".yc-skill-recommendation-footer")'), false) + check('the detail remains the same DOM instance throughout installation', await read('window.__detailBeforeInstall===document.querySelector("[role=dialog]")'), true) + check('the detail offers use after installation', await read('document.querySelector("[role=dialog] .sm-skill-detail-action-row")?.textContent.includes("去使用")'), true) + check('the success notification also offers use', await read('document.querySelector(".yc-skill-install-success")?.textContent.includes("去使用")'), true) + check('there is no permanent list footer progress panel', await read('!!document.querySelector(".yc-skills-scroll > .yc-skill-inline-install")'), false) + await capture('installed-detail') + await click('[role=dialog] .sm-skill-detail-close') + + const installedActionStyle = await read(`(()=>{const b=document.querySelector('[data-recommendation-id=archify] .sm-use-btn');const s=getComputedStyle(b);const svg=b.querySelector('svg');return {width:s.width,height:s.height,svgWidth:getComputedStyle(svg).width,svgHeight:getComputedStyle(svg).height}})()`) + check('installed action uses recovered 24px slot and 16px icon', installedActionStyle, {width:'24px',height:'24px',svgWidth:'16px',svgHeight:'16px'}) + await capture('installed-recommendation-light') + await verifyCurrentActionStyles('light') + + // The installed list stays reachable and the skill can be used. + await click('[aria-label="已安装技能"]') + await wait('document.querySelectorAll(".sm-card").length===1') + check('the installed skill appears in the installed list', await read('document.querySelector(".sm-card-name")?.textContent'), 'Archify') + await click('[aria-label="返回专家中心"]') + await wait('!!document.querySelector("[data-recommendation-id=archify]")') + + // A local skill with the same name requires an explicit overwrite. + await read(`window.ycode.skills.qaSetInstalled(${JSON.stringify([localSkill])})`) + await wait('document.querySelector("[data-recommendation-id=archify]").dataset.recommendationState==="conflict"') + await click('[aria-label="替换 Archify"]') + await wait('!!document.querySelector(".yc-skill-detail-shell")') + check('a same-name local skill requires an explicit replacement', await read('document.querySelector(".yc-skill-detail-shell").textContent.includes("替换")'), true) + check('the replacement notice mentions the local modification', await read('document.querySelector(".yc-skill-detail-shell").textContent.includes("本地内容已被修改")'), true) + await click('[aria-label="确认安装推荐技能"]') + await wait('document.querySelector("[data-recommendation-id=archify]").dataset.recommendationState==="current"') + check('an explicit replacement is sent to the host as an overwrite', await read(`(${JSON.stringify(calls)}.filter(c=>c[0]==='installRecommended').at(-1)[2]?.overwrite)===true`), true) + await click('[role=dialog] .sm-skill-detail-close') + + // A failing download reports the real host error and allows a retry. + await read(`window.ycode.skills.qaSetInstalled(${JSON.stringify([])})`) + await wait('document.querySelector("[data-recommendation-id=archify]").dataset.recommendationState==="none"') + await read(`window.ycode.skills.qaFailNext()`) + await click('[aria-label="安装 Archify"]') + await click('[aria-label="确认安装推荐技能"]') + await wait('document.querySelector(".yc-skill-inline-install")?.dataset.installPhase==="failed"') + check('a failed install shows the host error', await read('document.querySelector(".yc-skill-inline-install").textContent.includes("网络错误")'), true) + check('a failed install can be retried from the same card', await read('document.querySelector("[data-recommendation-id=archify] .sm-add-btn")?.disabled'), false) + await click('[role=dialog] .sm-skill-detail-close') + + // Cancellation is allowed before the atomic commit phase. + await read(`window.ycode.skills.qaDelay(400)`) + await click('[aria-label="安装 Archify"]') + await click('[aria-label="确认安装推荐技能"]') + await wait('document.querySelector(".yc-skill-inline-install")?.dataset.installPhase==="downloading"') + check('the download phase can be cancelled', await read('[...document.querySelectorAll("[role=dialog] button")].some(e=>e.textContent==="取消安装"&&!e.disabled)'), true) + await read('document.querySelector("[role=dialog]").querySelectorAll("button").forEach(e=>{if(e.textContent==="取消安装")e.click()})') + await wait('document.querySelector(".yc-skill-inline-install")?.dataset.installPhase==="cancelled"') + check('the cancellation is sent to the host', await read(`${JSON.stringify(calls)}.some(c=>c[0]==='cancelInstall')`), true) + await click('[role=dialog] .sm-skill-detail-close') + await read(`window.ycode.skills.qaDelay(0)`) + + // Closing the detail never aborts an accepted install; reopening resumes it. + await read('window.ycode.skills.qaDelay(250)') + await click('[aria-label="安装 Archify"]'); await click('[aria-label="确认安装推荐技能"]') + await wait('document.querySelector(".yc-skill-inline-install")?.dataset.installPhase==="downloading"') + const continuingId = await read('document.querySelector(".yc-skill-inline-install").dataset.operationId') + await click('[role=dialog] .sm-skill-detail-close') + check('closing a running detail restores the background', await read('document.getElementById("root").inert'), false) + await click('[data-recommendation-id=archify] .sm-card') + check('reopening detail keeps the same install operation', await read('document.querySelector(".yc-skill-inline-install").dataset.operationId'), continuingId) + await wait('document.querySelector(".yc-skill-inline-install")?.dataset.installPhase==="installing"') + check('the commit phase disables cancellation in place', await read('[...document.querySelectorAll("[role=dialog] button")].find(e=>e.textContent==="取消安装")?.disabled'), true) + await wait('document.querySelector(".yc-skill-inline-install")?.dataset.installPhase==="installed"') + await click('[role=dialog] .sm-skill-detail-close') + await click('.yc-skill-install-success [aria-label="使用推荐技能 Archify"]') + check('the success notification invokes the same use callback', await read('window.__qa.uses.length'), 1) + await read(`window.ycode.skills.qaSetInstalled(${JSON.stringify([{ ...installedRecommendation, enabled: false }])})`) + await wait('document.querySelector("[data-recommendation-id=archify] .sm-use-btn")?.title.includes("启用")') + await click('[data-recommendation-id=archify] .sm-use-btn') + await wait('window.__qa.uses.length===2') + check('disabled recommendation is enabled before use', await read('window.__qa.uses.at(-1).enabled'), true) + await read('window.ycode.skills.qaDelay(0)'); await read('window.ycode.skills.qaSetInstalled([])') + await wait('document.querySelector("[data-recommendation-id=archify]").dataset.recommendationState==="none"') + + // A failing catalog is reported as unavailable, not as a maintenance page. + // The page loads its catalog once, so the failure is proven on a fresh mount. + await read(`window.ycode.skills.qaFailRecommendations(true)`) + await read(`location.reload()`) + await wait('!!document.querySelector(".yc-skill-recommendation-unavailable")') + check('an empty catalog is reported as unavailable, not as a maintenance page', await read('!!document.querySelector("[data-capability-maintenance]")'), false) + check('the unavailable state keeps top installed navigation', await read('!!document.querySelector("[aria-label=已安装技能]")'), true) + check('the unavailable state has no duplicate installed entry', await read('[...document.querySelectorAll(".yc-skill-recommendation-unavailable button")].some(e=>e.textContent.includes("查看已安装技能"))'), false) + await read(`window.ycode.skills.qaFailRecommendations(false)`) + await click('.yc-skill-recommendation-unavailable button') + await wait('!!document.querySelector("[data-recommendation-id=archify]")') + + // An install owned by another window blocks a new install here. + const foreignOperation = '11111111-2222-4333-8444-555555555555' + await read(`window.ycode.skills.qaEmitForeign('downloading', ${JSON.stringify(foreignOperation)})`) + await wait('!!document.querySelector("[data-foreign-install=true]")') + check('an install from another window is reported', await read('document.querySelector("[data-foreign-install=true]").textContent.includes("其他窗口正在安装推荐技能")'), true) + check('a new install is blocked while another window is installing', await read('document.querySelector("[data-recommendation-id=archify] .sm-add-btn")?.disabled'), true) + check('the blocked state is explained on the card', await read('!!document.querySelector(".yc-skill-recommendation-busy")'), true) + await capture('foreign-install') + await read(`window.ycode.skills.qaEmitForeign('installed', ${JSON.stringify(foreignOperation)})`) + await wait('!document.querySelector("[data-foreign-install=true]")') + check('the foreign block clears when that operation finishes', await read('document.querySelector("[data-recommendation-id=archify] .sm-add-btn")?.disabled'), false) + + // A stale frame must not move a settled operation back into a running phase. + await read(`window.ycode.skills.qaSetInstalled(${JSON.stringify([])})`) + await wait('document.querySelector("[data-recommendation-id=archify]").dataset.recommendationState==="none"') + await read(`window.ycode.skills.qaDelay(0)`) + await click('[aria-label="安装 Archify"]') + await click('[aria-label="确认安装推荐技能"]') + await wait('document.querySelector(".yc-skill-inline-install")?.dataset.installPhase==="installed"') + const settledOperation = await read(`(${JSON.stringify(calls)}.filter(c=>c[0]==='installRecommended').at(-1)[2]?.operationId)`) + check('the settled install recorded its operation id', typeof settledOperation === 'string' && settledOperation.length > 8, true) + await read(`window.ycode.skills.qaEmitStale('downloading', ${JSON.stringify(settledOperation)}, 1)`) + await pause(250) + check('a stale frame does not regress the settled install', await read('document.querySelector(".yc-skill-inline-install")?.dataset.installPhase'), 'installed') + await click('[role=dialog] .sm-skill-detail-close') + + // Dark and narrow captures of the real page. + // This fixture mounts only the capability center, so the theme attribute is set directly. + // The dark token switch is proven here only; the production app harness covers the light flow. + await read(`(()=>{localStorage.setItem('ycode:theme','dark');document.documentElement.dataset.theme='dark';return true})()`) + await wait('document.documentElement.dataset.theme==="dark"') + await wait('!!document.querySelector(".yc-capability-center .expert-center-dark")') + check('the dark theme reaches the real page', await read('!!document.querySelector(".yc-capability-center .expert-center-dark")'), true) + // The card transitions its background, so the dark surface only settles after the animation. + await wait(`(()=>{const card=document.querySelector('[data-recommendation-id=archify] .sm-card');if(!card)return false;const m=/rgba?\\((\\d+)/.exec(getComputedStyle(card).backgroundColor);return !!m&&Number(m[1])<90})()`) + const darkColors = await read(`(()=>{const card=document.querySelector('[data-recommendation-id=archify] .sm-card');const page=document.querySelector('.yc-capability-center .expert-center-page');return{card:card?getComputedStyle(card).backgroundColor:null,page:page?getComputedStyle(page).backgroundColor:null}})()`) + check('the dark card uses a dark surface', darkColors.card, value => typeof value === 'string' && /rgba?\((\d+), (\d+), (\d+)/.test(value) && Number(value.match(/rgba?\((\d+)/)[1]) < 90) + const overflow = await read(`(()=>{const wide=[...document.querySelectorAll('*')].filter(e=>e.getBoundingClientRect().right>innerWidth+1).map(e=>e.className||e.tagName).slice(0,4);return{scrollWidth:document.documentElement.scrollWidth,innerWidth,wide}})()`) + check('the dark layout keeps the recommendation card inside the viewport', await read(`(()=>{const c=document.querySelector('[data-recommendation-id=archify] .sm-card');if(!c)return false;const r=c.getBoundingClientRect();return r.left>=0&&r.right<=innerWidth+1})()`), true) + check('the dark layout does not overflow the document', overflow.scrollWidth <= overflow.innerWidth + 1, true) + await capture('recommendation-dark') + await verifyCurrentActionStyles('dark') + win.setSize(720, 900) + await pause(400) + check('the recommendation card stays inside the narrow viewport', await read('(()=>{const c=document.querySelector("[data-recommendation-id=archify] .sm-card");if(!c)return false;const r=c.getBoundingClientRect();return r.left>=0&&r.right<=innerWidth+1})()'), true) + const narrowOverflow = await read(`(()=>{const wide=[...document.querySelectorAll('*')].filter(e=>e.getBoundingClientRect().right>innerWidth+1).map(e=>String(e.className||e.tagName)).slice(0,5);return{scrollWidth:document.documentElement.scrollWidth,innerWidth,wide}})()`) + check('the narrow recommendation card causes no document overflow', narrowOverflow.scrollWidth <= narrowOverflow.innerWidth + 1, true) + await capture('recommendation-narrow') + win.setSize(1052, 901) + await pause(250) + + check('no renderer errors', errors, []) + fs.writeFileSync(path.join(output, 'report.json'), JSON.stringify({ + result: 'PASS', checks, calls, screenshots, actionStyles, + limits: 'Controlled host in isolated Electron; the shipped page and styles are used. No network, no real skill storage, no real install.' + }, null, 2)) + console.log(JSON.stringify({ result: 'PASS', checks: checks.length, output })) + win.destroy() + app.exit(0) + } catch (error) { + await capture('failure') + fs.writeFileSync(path.join(output, 'failure.json'), JSON.stringify({ error: String(error), stack: error?.stack, checks, errors, calls, html: await read('document.body.innerHTML') }, null, 2)) + console.error(error) + win.destroy() + app.exit(1) + } + })().catch(error => { console.error(error); electron.app.exit(1) }) +} diff --git a/docs/协作/evidence/B02-review-01/pointer-ui-runner.txt b/docs/协作/evidence/B02-review-01/pointer-ui-runner.txt new file mode 100644 index 0000000..131b4b6 --- /dev/null +++ b/docs/协作/evidence/B02-review-01/pointer-ui-runner.txt @@ -0,0 +1,14 @@ + +(electron) 'console-message' arguments are deprecated and will be removed. Please use Event object instead. +Error occurred in handler for 'skills-qa': Error: 下载失败:网络错误 + at file:///C:/Users/Administrator/.codex/worktrees/b02-accept-01/YCode/.tmp/b02-acceptance/recommended-skills-ui-pointer.mjs:94:17 + at Session. (node:electron/js2c/browser_init:2:107269) + at Session.emit (node:events:519:28) +Error occurred in handler for 'skills-qa': Error [AbortError]: 推荐技能安装已取消 + at file:///C:/Users/Administrator/.codex/worktrees/b02-accept-01/YCode/.tmp/b02-acceptance/recommended-skills-ui-pointer.mjs:98:204 + at async Session. (node:electron/js2c/browser_init:2:107253) +Error occurred in handler for 'skills-qa': Error: 推荐目录服务不可用 + at file:///C:/Users/Administrator/.codex/worktrees/b02-accept-01/YCode/.tmp/b02-acceptance/recommended-skills-ui-pointer.mjs:80:40 + at Session. (node:electron/js2c/browser_init:2:107269) + at Session.emit (node:events:519:28) +{"result":"PASS","checks":62,"output":"C:\\Users\\Administrator\\.codex\\worktrees\\b02-accept-01\\YCode\\.tmp\\recommended-skills-ui-yKVyWZ"} diff --git a/docs/协作/evidence/B02-review-01/recommended-backend.txt b/docs/协作/evidence/B02-review-01/recommended-backend.txt new file mode 100644 index 0000000..e0bc43a --- /dev/null +++ b/docs/协作/evidence/B02-review-01/recommended-backend.txt @@ -0,0 +1,7 @@ + +> ycode@0.0.7 test:recommended-skills +> esbuild scripts/recommended-skills-backend-regression.ts --bundle --platform=node --format=esm --external:esbuild --outfile=.tmp/recommended-skills-backend-regression.mjs --log-level=warning && node .tmp/recommended-skills-backend-regression.mjs + +{"result":"PASS","checks":50,"phase":"archive"} +{"result":"SKIP","phase":"real-package","reason":"published package not present in .tmp"} +{"result":"PASS","checks":60,"phase":"real-package"} diff --git a/docs/协作/evidence/B02-review-01/test-results.json b/docs/协作/evidence/B02-review-01/test-results.json new file mode 100644 index 0000000..b849999 --- /dev/null +++ b/docs/协作/evidence/B02-review-01/test-results.json @@ -0,0 +1,22 @@ +[ + { + "Command": "npm run test:recommended-skills", + "ExitCode": 0, + "Log": ".tmp/b02-acceptance/test-recommended-skills.log" + }, + { + "Command": "npm run test:composer-capabilities", + "ExitCode": 0, + "Log": ".tmp/b02-acceptance/test-composer-capabilities.log" + }, + { + "Command": "npm run check:tokens", + "ExitCode": 1, + "Log": ".tmp/b02-acceptance/check-tokens.log" + }, + { + "Command": "npm run test:fold-summary", + "ExitCode": 1, + "Log": ".tmp/b02-acceptance/test-fold-summary.log" + } +] diff --git a/docs/协作/evidence/B02-review-01/token-check.txt b/docs/协作/evidence/B02-review-01/token-check.txt new file mode 100644 index 0000000..bbc9f10 --- /dev/null +++ b/docs/协作/evidence/B02-review-01/token-check.txt @@ -0,0 +1,29 @@ + +> ycode@0.0.7 check:tokens +> node scripts/check-design-tokens.mjs + +设计 token 漂移检查(静态) + 扫描:src/renderer/src 共 367 个文件(用时 96 ms) + baseline:scripts/design-token-baseline.json(334 个文件) + 门禁分类:adapter 8 | core 6 | local 279(合计 293 个文件) + 合计:裸 hex=611 裸 px=2680 !important=6 --wb-* 定义=525 var(--yc-*) 使用=1650 var(--wb-*) 使用=1209 + 非门禁分类:vendor 2 | recovered 22 | source 47 | tokenSource 3(合计 74 个文件,仅记录不阻塞) + 合计:裸 hex=10642 裸 px=13642 !important=920 --wb-* 定义=17966 var(--yc-*) 使用=77 var(--wb-*) 使用=19638 + 非门禁相对 baseline:文件 +0;裸 hex +78 裸 px +64 !important +0 --wb-* 定义 +0 var(--yc-*) 使用 +22 var(--wb-*) 使用 -120 + +结果:失败,共 6 项: + [新增门禁文件] src/renderer/src/capabilities/recommended-flow.css(local):裸 px=21 + [新增门禁文件] src/renderer/src/capabilities/skill-detail-shell.css(local):裸 px=21 + [回归] src/renderer/src/capabilities/skills-host.css(local):裸 px 25 → 45(+20) + [新增门禁文件] src/renderer/src/workbuddy/composer/capability-picker.css(local):裸 hex=26,裸 px=48 + [回归] src/renderer/src/workbuddy/composer/composer.css(local):裸 hex 23 → 38(+15);裸 px 83 → 139(+56) + [新增门禁文件] src/renderer/src/workbuddy/composer/prompt-queue.css(local):裸 hex=8,裸 px=35 + +提示:确认变更符合预期后运行 `node scripts/check-design-tokens.mjs --update-baseline` 刷新 baseline; + 否则请改用 --yc-* token、复用现有值,或去掉重复的 --wb-* 定义。 +提示(不失败,仅记录):3 个门禁文件 token 使用数上升: + src/renderer/src/capabilities/skills-host.css(local):var(--wb-*) 使用 12 → 19(+7) + src/renderer/src/workbuddy/composer/composer.css(local):var(--yc-*) 使用 35 → 47(+12);var(--wb-*) 使用 0 → 1(+1) + src/renderer/src/workbuddy/conversation/conversation.css(local):var(--yc-*) 使用 0 → 4(+4) +提示(不失败):baseline 中 8 个文件已不存在:src/renderer/src/components/ReportedRunUsage.tsx;src/renderer/src/workbuddy/subagents/SourceMemberIcon.tsx;src/renderer/src/workbuddy/subagents/SubagentCollaboration.tsx;src/renderer/src/workbuddy/subagents/SubagentDetailPanel.tsx;src/renderer/src/workbuddy/subagents/adapters.css;src/renderer/src/workbuddy/subagents/member-view.ts;src/renderer/src/workbuddy/subagents/source.css;src/renderer/src/workbuddy/subagents/theme.css +提示:新增门禁文件 36 个且无受控计数(允许):src/renderer/src/capabilities/CapabilityMaintenance.tsx(local);src/renderer/src/capabilities/RecommendedSkills.tsx(local);src/renderer/src/capabilities/SkillAvatar.tsx(local);src/renderer/src/capabilities/SkillDetailShell.tsx(local);src/renderer/src/capabilities/SkillModalPortal.tsx(local);src/renderer/src/capabilities/skill-modal-focus.ts(local);src/renderer/src/components/SessionLoading.tsx(local);src/renderer/src/components/TaskPopconfirm.tsx(local);src/renderer/src/components/session-loading.css(local);src/renderer/src/components/task-popconfirm.css(local);src/renderer/src/components/updates/UpdateSidebarCard.tsx(local);src/renderer/src/components/updates/update-ui-model.ts(local);src/renderer/src/components/updates/update-ui-store.ts(local);src/renderer/src/components/updates/updates-ui.css(local);src/renderer/src/ui/Button.tsx(local);src/renderer/src/ui/IconButton.tsx(local);src/renderer/src/ui/Input.tsx(local);src/renderer/src/ui/Popover.tsx(local);src/renderer/src/ui/Select.tsx(local);src/renderer/src/ui/Switch.tsx(local);…(还有 16 项,详见 --json) From 8f4aa0d6b577a425fb87ca528cbb57bbcbfc9d9a Mon Sep 17 00:00:00 2001 From: "xiaohan.yuan" Date: Wed, 21 Oct 2026 14:01:57 +0800 Subject: [PATCH 2/2] docs(B04): trace Base64 flash when expanding conversation details --- docs/协作/B04-需求.md | 51 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 docs/协作/B04-需求.md diff --git a/docs/协作/B04-需求.md b/docs/协作/B04-需求.md new file mode 100644 index 0000000..ab426cc --- /dev/null +++ b/docs/协作/B04-需求.md @@ -0,0 +1,51 @@ +# B04:展开历史详情时图片地址闪现 + +日期:2026-10-21。状态:待开发。任务:YC-008,优先级 P1。 + +## 用户现象与定位 + +用户反馈 `hello`、`使用浏览器打开baidu.com,输入框中输入t…` 的详情似乎打不开,进一步明确为:展开时有大片文字一闪而过。 + +调查代码:`0fbc1616e5b6f262e75df5c7411562d3a5031096`。两条会话的保存数据可解析,正文可加载;隔离 Electron 使用当前 dev renderer,展开过程中没有捕获 renderer 异常。该结果是定向诊断,不是独立安装构建验收。 + +已确认根因在 `src/renderer/src/workbuddy/images/MarkdownImage.tsx`: + +1. 第 32 行 `resolvedUrl` 首次渲染为 undefined。 +2. 安全图片 URL 也要等第 35 行的 effect 才设置 resolvedUrl。 +3. 第 62–69 行在此期间进入 fallback,空 alt 时显示 `src`。 +4. 对浏览器截图,src 是完整的 data URI/Base64,于是首帧将其显示为大量文本,随后才换成图片。 +5. `CompletedFold.tsx:192` 的展开分支会切换详情树,重新挂载图片,使该现象在展开时再次触发;不能仅检查首次打开会话。 + +## 已采集的帧证据 + +百度会话一次实际展开,requestAnimationFrame 采样: + +| 时间 | 外层详情高度 | 图片 Markdown 块高度 | 块内文本字符数 | 图片节点 | +| --- | ---: | ---: | ---: | --- | +| 点击前 | 0px | 不适用 | 不适用 | 原树图片已就绪 | +| 点击后约 28ms | 5704px | 5468px | 18076 | 重挂载处尚无图片节点 | +| 点击后约 43ms | 636px | 400px | 1 | 图片就绪 | + +另一轮采样同样出现 5704px → 636px。文字长度与约 18075 字符的截图 data URI 对应;未将真实会话内容、图片、用户配置或完整 URL 写入交接文件。 + +本机原始诊断产物保留在 dev 工作树 `.tmp/session-detail-review/`,其中 `native-SZ8eKi/report.json` 为上述帧数据,`native-vsZP6s/report.json` 为另一轮采样。表格和代码定位为可移交的脱敏证据;本机临时路径不是开发端唯一复现依据。 + +## 开发要求 + +- 安全且不需要宿主解析的图片地址,在第一次渲染即可使用;避免先进入地址文本占位再在 effect 中切换。 +- 异步解析中的图片使用稳定、简短的占位状态。空 alt 的 data/blob 等地址不得将完整 URI 显示为文字。 +- 失败态也不得显示完整 Base64。可以使用 alt 或简短的图片加载失败提示。 +- src 改变时不能继续展示上一个 src 的图片;保留异步请求取消、过期结果隔离和已有 URL 安全校验。 +- 详情展开导致的重挂载必须覆盖回归;是否进一步稳定详情 DOM 由开发端评估,但不能以更换折叠动画掩盖图片首帧问题。 +- 不修改、清理或迁移用户历史消息来绕过问题。 + +## 验收标准 + +1. 使用合成的长 Base64 图片、空 alt,冷挂载首帧到稳定态均不显示 URI 文本。 +2. 在已完成回复中放置图片,连续展开/收起、切换会话后再展开均无大片文字闪现。 +3. 采集展开前后连续帧,图片区域不因完整地址占位瞬间增高数千像素;不能只提交动画结束截图。 +4. 图片加载失败、宿主解析失败、无效地址均显示简短且稳定的失败态。 +5. 快速切换 src、展开/收起时无旧图串入、过期请求覆盖或 renderer 异常。 +6. 图片预览、下载、URL 安全策略和正常 Markdown 图片功能保持可用。 + +验收端本轮只读产品代码,未修改产品源码和正式用户数据,未重启用户窗口。本需求按用户授权提交至 Gitea 协作主线;开发端按 YC-008 实现后提交交付记录,由验收端复测连续帧。