From f3d032c0e8d7a6f7fa4bf8da5622dc686863e898 Mon Sep 17 00:00:00 2001 From: Qiyuanqiii <267806965+Qiyuanqiii@users.noreply.github.com> Date: Wed, 21 Oct 2026 21:56:52 +0800 Subject: [PATCH 1/4] docs: align current guidance with implemented capabilities --- CONTRIBUTING.md | 4 +- README.en.md | 7 +-- README.md | 6 +-- docs/architecture.md | 7 ++- docs/architecture/bounded-project-tests.md | 24 ++++++---- .../evidence/markdown-current-state/after.png | Bin 0 -> 71379 bytes .../markdown-current-state/before.png | Bin 0 -> 77181 bytes docs/extensions.md | 9 ++-- docs/releases/v1.0.0.md | 7 ++- docs/sandbox-environments.md | 4 +- docs/schema-baseline.md | 22 +++++---- docs/technical-reference.en.md | 2 +- docs/usage.md | 45 +++++++++--------- web/README.md | 21 ++++---- 14 files changed, 89 insertions(+), 69 deletions(-) create mode 100644 docs/evidence/markdown-current-state/after.png create mode 100644 docs/evidence/markdown-current-state/before.png diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4faa0e49f..69ea0880c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -175,7 +175,7 @@ cd .. - **React 前端** 负责用户交互呈现与视觉效果,不私自推导或伪造未经后端确认的状态。 3. **纯 CSS 现代性能标准**: - 界面视觉效果优先使用现代纯 CSS 属性(如 `backdrop-filter`、多层 `box-shadow` 内阴影、`linear-gradient`)。 - - 避免引入高开销的 SVG 位移滤镜(如 `feTurbulence`)或全屏 WebGL Canvas,确保在展示大量代码和日志输出时保持 120fps 丝滑滚动。 + - 涉及滚动和视觉效果的改动应在实际页面验证;性能结论应记录测量环境与结果。 4. **统一规范的产品命名**: - 所有面向用户的标题、文案、关于页面与文档中,产品官方名称一律统一为 **`Universal-Code`**。 @@ -190,7 +190,7 @@ cd .. git checkout -b feat/support-deepseek-r1 ``` 2. 保持 Commit 粒度清晰,提交信息简明扼要。 -3. 在本地完整运行并通过 `npm test` 和 `go test`。 +3. 运行覆盖本次改动的相关测试和必需检查,在 PR 中记录验证范围与结果。 4. 在 GitHub 上发起 Pull Request,简要说明: - **改动背景**:解决了什么问题或增加了什么特性。 - **关键设计**:采用了什么样的架构思路。 diff --git a/README.en.md b/README.en.md index 992312379..ed48f2c6d 100644 --- a/README.en.md +++ b/README.en.md @@ -16,7 +16,7 @@ Platform Go Node - React + React PRs Welcome

@@ -31,10 +31,10 @@ ## Highlights - **Built for Local Repositories**: Read, inspect, and edit local codebases with built-in line-by-line diff inspection and auditable checkpoints (Rewind). -- **Transparent Permission Control**: Choose between read-only analysis, approval-gated runs, and automated Full Access. High-risk actions (file deletion, unlisted commands) always require manual confirmation. +- **Transparent Permission Control**: Ask / Auto / Full authorization allows, requests approval for, or denies operations according to current permissions, verified effects, and safety policy. Full requires explicit activation in the current process. - **Ready for Any Model**: Native support for OpenAI, Anthropic Claude, DeepSeek, Kimi, local Ollama models, and custom OpenAI-compatible endpoints with on-the-fly model switching. Also supports quick browser-based ChatGPT account sign-in. - **Traceable Web Research**: Prioritizes provider-hosted native search, fetches GitHub Issues/PRs, Hacker News, and RSS/Atom feeds, and keeps source snapshots and citations. -- **Modern Liquid Glass Aesthetic**: Crafted with pure CSS optical refraction (macOS / VisionOS acrylic style), supporting Dark, Light, and Mist frosted themes at a responsive 120fps. +- **Switchable Interface Themes**: Dark, Light, and Mist themes use CSS blur, translucent backgrounds, gradients, and edge shadows for a glass-like appearance. --- @@ -110,6 +110,7 @@ Switch between **System, Light, Dark, and Mist** under **Settings → Appearance | :--- | :--- | :--- | | **User Guide** | [Usage Guide](docs/usage.md) | Client walkthrough, CLI commands, and typical workflows | | **Web Research** | [Search & Citations](docs/web-evidence.md) | Search setup, snapshot storage, URL provenance, and diagnostics | +| **Chat Resources** | [Links, Files & Clipboard](docs/chat-resource-interactions.md) | Link previews, resource context menus, and file/image copy and paste | | **Code Auditing** | [Workspace Checkpoints](docs/workspace-checkpoints.md) | Line-by-line diff review, snapshots, and safe Rewind | | **Extensions** | [Extensions & MCP](docs/extensions.md) | Integrating Model Context Protocol (MCP) and custom skills | | **Code Intelligence** | [LSP Support](docs/code-intelligence.md) | Symbol jump, type inference, and repository index | diff --git a/README.md b/README.md index 6c05fa64e..f4ed4e7ab 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Platform Go Node - React + React PRs Welcome

@@ -31,10 +31,10 @@ ## 核心特性 - **深度聚焦本地项目**:直接阅读、分析与修改本地代码库,内置 Diff 逐行审阅与可信撤销(Rewind / Checkpoints)能力。 -- **透明可控的安全策略**:支持只读分析、交互审批(Approval Mode)与全自动(Full Access)权限分级,高危操作(文件删除、非白名单命令)严格阻断并要求人工确认。 +- **透明可控的安全策略**:采用 Ask / Auto / Full 分级授权;操作按当前权限、实际影响和安全策略自动执行、请求审批或拒绝,Full 须在当前进程显式激活。 - **主流模型即开即用**:原生接入 OpenAI、Anthropic Claude、DeepSeek、Kimi、Ollama 本地模型与任何兼容 OpenAI 的第三方 API,支持单会话内即时热切,并支持通过系统浏览器快速完成 ChatGPT 账户授权登录。 - **真实来源的网络检索**:优先调用供应商原生搜索,支持直接抓取 GitHub PR/Issue、Hacker News 与 RSS/Atom 资讯,自动附带快照存证与引用出处。 -- **现代苹果液态玻璃美学**:采用纯 CSS 物理折射模型(macOS / VisionOS 亚克力液态玻璃风格),提供深色、浅色与雾透磨砂质感,兼具 120fps 极速渲染。 +- **可切换的界面主题**:提供深色、浅色与雾透主题,使用 CSS 模糊、半透明背景、渐变和边缘阴影呈现玻璃质感。 --- diff --git a/docs/architecture.md b/docs/architecture.md index 4c442b8f0..5344b3917 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -157,7 +157,7 @@ The production React bundle is built by Vite but hosted only when Go receives an ## Core Domain -`Run` is a domain aggregate, not a programming language, operating-system process, or replacement for Go/TypeScript/Rust. Go creates and owns Run lifecycle state; TypeScript may display and control it through Go APIs. Rust never owns a Run. The current analyzer fixture has no Run field or product bridge; a future Go adapter may bind a validated analyzer operation to a Run outside the Rust wire contract. +`Run` is a domain aggregate, not a programming language, operating-system process, or replacement for Go/TypeScript/Rust. Go creates and owns Run lifecycle state; TypeScript may display and control it through Go APIs. Rust never owns a Run. Go application services bind the fixed embedded digest analyzer to a Run and commit its execution evidence. The Rust wire contract remains free of Run identity and authority. See the [Analyzer README](../analyzers/README.md) for the current execution boundary. Budget, events, sandbox sessions, and reports are Run-scoped rather than embedded into one large object. Their modules remain independent and persist references by `run_id`; `AgentRunner` coordinates their lifecycle. @@ -1041,7 +1041,7 @@ internal/store/ SQLite stores and migrations internal/session/ Compatibility conversation service internal/tui/ Bubble Tea adapter internal/httpapi/ Loopback-only read/control API, OpenAPI contract, and bounded Run-event SSE -internal/analyzer/ Go-owned analyzer protocol, validation, and future bridge boundary +internal/analyzer/ Go-owned analyzer protocol, validation, and embedded WASI execution boundary ``` Packages split when a concrete implementation establishes different ownership. New tools and integrations reuse these services and add focused behavior tests for their contracts. @@ -1334,6 +1334,9 @@ records these bounds. ## Go-Owned Analyzer Protocol And Rust Fixture +The following P10-A/B sections record the initial implementation stages. For the +current product execution path, see the [Analyzer README](../analyzers/README.md). + P10-A1 establishes `internal/analyzer` as a pure Go protocol owner rather than a process launcher. `analyzer_protocol.v1` accepts one canonical inline Base64 payload plus explicit limits and four capability declarations that must all be false. Strict decoding rejects diff --git a/docs/architecture/bounded-project-tests.md b/docs/architecture/bounded-project-tests.md index 552623f96..70c434581 100644 --- a/docs/architecture/bounded-project-tests.md +++ b/docs/architecture/bounded-project-tests.md @@ -1,11 +1,18 @@ # Bounded project tests -`run_tests` is the root Supervisor's project test entry point in Code Plan and -Deliver. Review is a workflow state, not an execution phase: the domain has +`run_tests` is the project test entry point in Code Plan and Deliver for the root +Supervisor and recorded `specialist_runner` workers with matching WorkerAuthority. +Review is a workflow state, not an execution phase: the domain has only `plan` and `deliver` phases. -The request contains `version: "run-tests.v1"`, a relative directory `target`, -and `timeout_milliseconds` from 1 through 25000. The host resolves the pinned +The request contains `version: "run-tests.v1"`. `action: "run"` (the default when +omitted) takes a relative directory `target` and `timeout_milliseconds` from 1 +through 25000. Longer tests use `action: "start"` with a timeout up to 1800000 ms, +then `action: "wait"` with the original `job_id`, returned `cursor`, `max_bytes` +(4–32768), and `wait_milliseconds` (1–5000). Wait observes the existing Job without +a new target or timeout; repeating start is not a polling operation. + +The host resolves the pinned project test ID or detects a supported project through the existing project action registry. It chooses the executable, literal arguments, environment, closed stdin, disabled network intent, output bounds and empty credentials. @@ -21,10 +28,11 @@ fall back to the host. Dependency installation retains its sandbox-only gate. The prepared command is pinned in the durable tool authority and regenerated before approval and dispatch. The existing command authorizer, Run lease, root attempt, gateway tool budget, command budget, timeout, cancellation and -Job/output receipts remain authoritative. A test runs as one synchronous Job; -failed or timed-out Jobs are returned as test evidence. A completed call is -replayed without starting another Job. Specialist calls retain their existing -bounded validation tools and child budget; `run_tests` grants no child access. +Job/output receipts remain authoritative. Each run/start creates one Job; wait +returns bounded output and status for that Job, retaining its original actor and +authority. Failed or timed-out Jobs are returned as test evidence. A completed +call is replayed without starting another Job. Worker execution retains its +recorded assignment, WorkerAuthority, and child budget checks. General `command_runtime` remains Deliver-only. Plan Job insertion additionally requires a pending `run_tests` call with matching actor, command fingerprint, diff --git a/docs/evidence/markdown-current-state/after.png b/docs/evidence/markdown-current-state/after.png new file mode 100644 index 0000000000000000000000000000000000000000..728e4730caa90a07b5740ddfbd35a03323e99ded GIT binary patch literal 71379 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%0A$i>+woQYppMmr7wr;!_t?=W%r)9!w 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 本页保留首版整合时的范围与验证记录。当前预览包见 +> [v1.0.0-preview.20261020](https://github.com/CWNU-Open-Source-Community/Universal-Code/releases/tag/v1.0.0-preview.20261020); +> 安装与启动说明见 [Windows](../windows-release.md) / [macOS](../macos-release.md)。 +> 预览包不等同于正式 `v1.0.0` 发布。 + +## 首版整合时的下载与验证状态(2026-09-21) - 首版源码 [PR #203](https://github.com/CWNU-Open-Source-Community/Traverse-Board/pull/203) 已合并;尚未公开 `v1.0.0` GitHub Release。现有 [Releases](https://github.com/CWNU-Open-Source-Community/Traverse-Board/releases) 是历史预览,不能据此判断是否包含最新源码功能。 - Mac 双架构候选与发布接线 [PR #204](https://github.com/CWNU-Open-Source-Community/Traverse-Board/pull/204) 已合并,下载和启动步骤见 [Mac 说明](../macos-release.md)。Windows 下载与签名/Store 状态见 [Windows 说明](../windows-release.md)。 diff --git a/docs/sandbox-environments.md b/docs/sandbox-environments.md index 4921ae2eb..5dddc8423 100644 --- a/docs/sandbox-environments.md +++ b/docs/sandbox-environments.md @@ -28,8 +28,8 @@ ## 准备项目依赖 -开始编码后,在「审阅改动 → 检查与交付 → 准备项目」检测 npm 或 Go -项目,核对锁文件和命令,选择本次允许下载的包源,再在所选沙箱中 +开始编码后,在「审阅改动 → 检查与交付 → 准备项目」检测受支持的 +项目(当前范围见[准备项目依赖](project-preparation.md)),核对锁文件和命令,选择本次允许下载的包源,再在所选沙箱中 离线安装。依赖下载与任务的网页搜索分别授权,npm 安装脚本另行选择。 工具链应提前安装在本机环境、固定镜像或模板中。 diff --git a/docs/schema-baseline.md b/docs/schema-baseline.md index 81dfedcb7..73c503f1c 100644 --- a/docs/schema-baseline.md +++ b/docs/schema-baseline.md @@ -1,6 +1,6 @@ # SQLite clean-install baseline / SQLite 全新安装基线 -Traverse Board keeps two database initialization paths: +Universal-Code keeps two database initialization paths: - a generated consolidated schema baseline for a database that is proven empty; and - the complete, append-only migration history for every existing or uncertain database. @@ -40,13 +40,15 @@ transaction commit identifies completion. A statement error, cancellation, disk- condition, or process exit therefore leaves either the complete latest database or no baseline schema; it cannot leave a partial baseline marked as current. -The current v136 artifact contains 360 tables, 245 explicit indexes, 912 triggers, -and 2 views. Clean install has no application seed rows; the 136 canonical migration -ledger rows are the only generated data. +The current version and fingerprints are recorded in +[`clean_install_baseline_generated.go`](../internal/store/clean_install_baseline_generated.go) +and checked against `LatestSchemaVersion` in +[`migrations.go`](../internal/store/migrations.go). Clean install has no application +seed rows; the canonical migration ledger rows are the only generated data. ## Backup and restore / 备份与恢复 -Before launching a newer binary against a non-empty profile, stop all Traverse Board +Before launching a newer binary against a non-empty profile, stop all Universal-Code Desktop, CLI, and API processes and make an offline copy of `cyberagent.db`. Keep any remaining SQLite journal/WAL sidecar files with the diagnostic copy. A filesystem copy while a writer is active is not a supported backup. @@ -58,9 +60,9 @@ that selects safe readers and migrations. ## Binary rollback boundary / 旧二进制回滚边界 -A baseline-created v136 database has the same schema objects and canonical migration -ledger as a v1-to-v136 historical creation. A pre-baseline binary that already knows -the identical v1-to-v136 plan can therefore open it. A binary whose +A baseline-created database has the same schema objects and canonical migration +ledger as historical creation through the same version. A binary that knows +the identical migration plan can therefore open it. A binary whose `LatestSchemaVersion` is below the database version cannot open it and is not made safe by this baseline. Use the offline pre-upgrade backup for that downgrade; do not delete newer ledger rows. @@ -75,8 +77,8 @@ install safely returns to historical replay. 2. Fix the underlying storage condition (free space, permissions, device health), then restart. A rolled-back empty database is eligible for a fresh atomic attempt. 3. If a deterministic baseline defect affects a genuinely empty new profile, use the - last known-good binary that already supports schema v136. That binary retains the - historical creation path and produces the same latest schema. + known-good binary that supports the target schema and retains the historical + creation path. It must produce the same target schema. 4. If the database contains any user object or durable data, do not try to make it appear empty. Diagnose the historical migration error or restore the offline backup. 5. Preserve the failing copy for diagnosis. Unknown migration history intentionally diff --git a/docs/technical-reference.en.md b/docs/technical-reference.en.md index f603575cd..d902c29fe 100644 --- a/docs/technical-reference.en.md +++ b/docs/technical-reference.en.md @@ -62,7 +62,7 @@ Schema v115 introduces `agent-code-tools.v1`, allowing the root Supervisor to co | Mode | Available tools | |---|---| -| Code / Plan / root | `workspace_list`, `workspace_read`, `workspace_glob`, and `workspace_grep` | +| Code / Plan / root | `workspace_list`, `workspace_read`, `workspace_glob`, and `workspace_grep`; `github_review_evidence_list/read` when current-Run GitHub evidence is available | | Code / Deliver / root with Code or Script Profile | The read tools plus `workspace_change`, `workspace_apply`, and `workspace_delete` | | Code / Deliver / root with Review or Learn Profile | Read tools only | | Cyber Surface or Specialist | No `agent-code-tools.v1` tools are advertised; the capability snapshot records the refusal reason | diff --git a/docs/usage.md b/docs/usage.md index 583465a6c..d420e70ae 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -636,26 +636,26 @@ cyberagent skill candidate reject --candidate-fingerprint --candidate-fingerprint --operation-key --confirm-untrusted-skill ``` -The embedded read-only `skill.v1` Registry exposes twelve bounded workflows: the `code`, `review`, `learn`, `script`, and `plan-delivery` foundations plus `doctor`, `debug`, `run-verify`, `focused-checks`, `simplify`, `security-review`, and `run-skill-generator`. Each current manifest declares a compatibility tuple: `profiles` identifies the work intent (`code|review|learn|script`), `surfaces` the product execution surface (`code|cyber`), `phases` the active Run phase (`plan|deliver`), and `roles` the receiving Agent (`root|specialist`). All four dimensions must match before content is delivered. - -Invocation policy is separate from delivery compatibility. `user_invocable` permits an operator-origin selection; `model_invocable` permits a future controlled model-origin selector to propose the Skill but does not itself auto-select anything; `explicit_only` requires the operator to name and pin the Skill and therefore requires `user_invocable=true` and `model_invocable=false`. These fields never grant tools, network, files, processes, Provider access, or a new model-selection capability. The current product selection path remains operator-only. - -| Built-in | Version | Profiles | Surfaces | Phases | Roles | Invocation | -| --- | --- | --- | --- | --- | --- | --- | -| `code` | 1.2.0 | code | code | plan, deliver | root, specialist | user + model eligible | -| `review` | 1.5.0 | code, review | code | plan, deliver | root, specialist | user + model eligible | -| `learn` | 1.2.0 | learn | code | plan, deliver | root, specialist | user + model eligible | -| `script` | 1.2.0 | script | code, cyber | plan, deliver | root, specialist | user + model eligible | -| `plan-delivery` | 1.2.0 | all | code, cyber | plan, deliver | root | explicit user only | -| `doctor` | 1.0.0 | all | code, cyber | plan | root | user + model eligible | -| `debug` | 1.0.0 | all | code, cyber | plan, deliver | root | user + model eligible | -| `run-verify` | 1.1.0 | code, script | code, cyber | deliver | root | user + model eligible | -| `focused-checks` | 1.1.0 | code, review, script | code, cyber | deliver | root | user + model eligible | -| `simplify` | 1.0.0 | code | code | deliver | root | user + model eligible | -| `security-review` | 1.0.0 | code, review, script | code, cyber | plan, deliver | root | user + model eligible | -| `run-skill-generator` | 1.0.0 | code | code | deliver | root | explicit user only | - -`doctor` reports provider, harness, workspace, sandbox, network-scope, tool, and Skill compatibility without repairing it. `debug` builds a bounded evidence timeline and permits repair only in Deliver. `run-verify@1.1.0` requires an exact `ui-evidence.v1` source/recipe/runtime binding, real interaction assertions, content-addressed artifact inventory, cleanup receipt, focused-check mapping, and a PR-ready verification receipt; `not_run` and missing matrix cells must remain explicit non-passes. It does not grant browser, process, network, Profile, or credential authority, and on Cyber remains restricted by guidance to an admitted local sandbox. `review@1.5.0` and `focused-checks@1.2.0` consume current `code-intel-lsp.v1` plus GitHub PR/CI evidence when available, preserve source and freshness bindings, and keep partial, stale, unavailable, or not-run evidence explicit instead of treating it as proof. `simplify` requires call-site evidence before deletion, and `security-review` remains read-only unless a separate Deliver authorization exists. +The embedded read-only `skill.v1` Registry currently exposes fourteen workflows. +The maintained catalog and invocation rules are in [Built-in skills](builtin-skills.md); +exact current versions are defined by the [embedded manifests](../internal/skills/builtins/). +Each manifest declares compatible `profiles`, `surfaces`, `phases`, and receiving +`roles`. All four dimensions must match before content is delivered. + +Invocation policy is separate from delivery compatibility. `user_invocable` permits +operator selection; `model_invocable` permits compatible model-origin reads through +`skill_read`. `explicit_only` requires operator selection, with `user_invocable=true` +and `model_invocable=false`. The three explicit workflows are `plan-delivery`, +`loop-monitor`, and `run-skill-generator`. Existing operator-pinned versions take +precedence. Reading a skill does not grant tools, network, files, processes, Provider +access, or approval authority. + +`doctor` provides read-only Plan diagnostics. `debug` diagnoses reproducible faults +and permits repair only in Deliver; +`run-verify` verifies actual program behavior, and `focused-checks` selects tests by +change and risk. `run-verify` treats `ui-evidence.v1` as an optional operator workflow, +not a requirement for every task. `simplify` requires call-site evidence before +deletion, and `security-review` remains read-only unless separate Deliver authorization exists. `run-skill-generator` does not create a trusted Skill. When it is explicitly selected and actually delivered to a Code/Deliver root turn, Go exposes `skill_candidate_propose`; otherwise the tool is omitted and forged calls are rejected. A successful call stores at most 4096 bytes of validated, secret-screened Markdown as an inert `proposed` candidate bound to the real tool invocation, Run/Session/Workspace/root, deterministic package, and exact fingerprints. The ordinary tool result and candidate list never expose the body; `skill candidate show --show-content` uses explicit untrusted-content delimiters for human inspection. @@ -1940,8 +1940,9 @@ These test actions do not install packages or enable network access. Missing tools or dependencies produce an unavailable action or the actual failed Job. The current SBX template does not support these Python/Rust presets. -The same panel can detect npm and Go tests from project files when no test action -is pinned. Use **Prepare project** first to review the lockfile, authorize exact +The same panel can detect supported project tests when no test action is pinned; +see the current support table in [Project preparation](project-preparation.md). +Use **Prepare project** first to review the lockfile, authorize exact package sources, and install dependencies offline in the selected sandbox. Downloads, install scripts, cache reuse, cancellation, and interrupted requests are described in [Prepare project dependencies](project-preparation.md). diff --git a/web/README.md b/web/README.md index e92b939ac..59f92a93f 100644 --- a/web/README.md +++ b/web/README.md @@ -1,12 +1,12 @@ # Universal-Code Web Console -本目录包含 **Universal-Code** 的前端桌面与 Web 用户界面,基于 React 18、TypeScript 与 Vite 构建。 +本目录包含 **Universal-Code** 的前端桌面与 Web 用户界面,基于 React 19、TypeScript 与 Vite 构建。 --- ## 技术栈 (Tech Stack) -- **核心框架**:React 18 + TypeScript + Vite +- **核心框架**:React 19 + TypeScript + Vite - **代码与 Diff 编辑器**:Monaco Editor (本地离线打包,支持按需加载与 Proposal 恢复) - **视觉与样式系统**:纯 CSS 苹果液态玻璃(Apple Liquid Glass Acrylic)+ Tailwind CSS 工具类 - **测试框架**:Vitest + React Testing Library @@ -46,7 +46,7 @@ cd .. go run ./cmd/cyberagent api serve --listen 127.0.0.1:8765 --ui-dir web/dist ``` -访问 `http://127.0.0.1:8765` 即可使用。如配置了 API Token,需在首次加载时输入对应凭证。 +访问 `http://127.0.0.1:8765`,首次连接时输入后端打印的临时只读 token,或 `CYBERAGENT_API_TOKEN` 配置的 token。控制操作还需 control token 与对应 capability,见 [HTTP API](../docs/http-api.md)。 --- @@ -57,9 +57,9 @@ go run ./cmd/cyberagent api serve --listen 127.0.0.1:8765 --ui-dir web/dist | **会话舞台 (Stage)** | `src/v2/components/conversation.tsx` | 连续任务对话流、消息卡片、工具调用状态呈现与响应流式打字机。 | | **伴侣停靠坞 (Companion Dock)** | `src/v2/styles.css` (`.v2-companion-dock`) | 智能对齐右侧的工作流面板,支持检查点、代码审查与工具箱原生平移停靠。 | | **任务输入舱 (Composer)** | `src/v2/components/composer.tsx` | 任务指令输入、文件/图片附件上传、模型选择器与权限档位切换。 | -| **代码 Diff 与编辑** | `src/components/unified-diff.tsx` / `monaco/` | 逐行差异对比、待审提案(Proposal)接受/驳回与本地 Monaco 编辑。 | -| **网络检索存证** | `src/components/safe-markdown.tsx` / `evidence/` | 网页快照渲染、GitHub/HN/RSS 来源标注与点击溯源。 | -| **系统设置与外观** | `src/v2/components/provider-settings.tsx` | 多模型凭据配置、系统/浅色/深色/雾透磨砂玻璃外观实时切换。 | +| **代码 Diff 与编辑** | `src/components/unified-diff.ts` / `src/lib/monaco-local.ts` | 逐行差异对比、待审提案(Proposal)接受/驳回与本地 Monaco 编辑。 | +| **网页证据来源** | `src/components/thread-transcript.tsx` / `src/v2/components/activity-detail.tsx` | 展示网页来源、URL、获取时间、摘要标识以及可引用、部分内容和过期状态。 | +| **系统设置与外观** | `src/v2/components/settings.tsx` / `src/v2/components/provider-settings.tsx` | 多模型凭据配置、系统/浅色/深色/雾透磨砂玻璃外观实时切换。 | --- @@ -99,15 +99,14 @@ web/ ## 纯 CSS 视觉与设计规范 (Design Language) -- **纯 CSS 物理光学折射**:采用由 GreyD097 纯 CSS 方案启发的双向对角内阴影 (`inset 1.5px -1.5px` 与 `inset -1.5px 1.5px`),在按钮和面板边缘模拟凸透镜全反射效果。 -- **环境底光网格**:注入多点离散光场 (`--prayu-ambient-radial`) 搭配 `backdrop-filter: blur(34px) saturate(190%) contrast(102%)`,确保在深色模式下呈现透亮亚克力质感,杜绝普通黑底导致的色彩发灰坍塌。 -- **极致渲染性能**:绝不使用高开销的 SVG 滤镜(`feTurbulence`)或全屏 WebGL Canvas,确保承载数千行代码与终端滚动输出时维持 120fps 丝滑帧率。 +- **主题样式**:使用 CSS 渐变、半透明背景、`backdrop-filter` 和边缘阴影呈现各主题的视觉效果,修改应限定在对应主题内。 +- **实际页面验证**:检查文字清晰度、长内容滚动、窄屏布局和交互状态;性能结论应记录测量环境与结果。 --- ## English Overview -Universal-Code Web Console is the desktop and web operator interface for Universal-Code, built with **React 18**, **TypeScript**, and **Vite**. +Universal-Code Web Console is the desktop and web operator interface for Universal-Code, built with **React 19**, **TypeScript**, and **Vite**. ### Quick Start 1. Run backend: `go run ./cmd/cyberagent api serve --listen 127.0.0.1:8765` @@ -117,4 +116,4 @@ Universal-Code Web Console is the desktop and web operator interface for Univers ### Key Features - **Fluid Companion Dock**: A docked assistant panel alongside the main conversation stage without overlapping content. - **Monaco Diff Viewer**: Line-by-line inspection and auditable rollback. -- **Pure CSS Apple Liquid Glass**: Acrylic blur and specular rim sheen with zero WebGL/SVG performance overhead. +- **CSS Themes**: Translucent surfaces, backdrop blur, gradients, and edge shadows. From 6d9b337a20654926aec66a747499fe16fcf003fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A5=88=E6=84=BFQiii=E7=9A=84review=20bot?= Date: Wed, 21 Oct 2026 14:27:39 +0800 Subject: [PATCH 2/4] fix(ci): update Go security patch and verify retryable browser cleanup (cherry picked from commit db8fdfb8837cbccc6ce6c6f4991aa16f755703a9) --- CONTRIBUTING.md | 4 +- README.en.md | 2 +- README.md | 2 +- docs/ci.md | 4 +- docs/macos-release.md | 2 +- docs/windows-release.md | 2 +- go.mod | 2 +- .../agent_browser_cleanup_test.go | 74 ++++++++++++++++++- .../agent_browser_runtime_test.go | 13 ++++ packaging/macos/LOCAL-TEST-GUIDE.txt | 4 +- 10 files changed, 97 insertions(+), 12 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 69ea0880c..7489d9a9a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -12,8 +12,8 @@ | 工具 | 推荐版本 | 来源与用途 | | :--- | :--- | :--- | -| **Go** | 1.26+ | 核心控制平面、CLI、TUI、HTTP API 与 SQLite 状态机 | -| **Node.js** | 24+ | 前端管理界面(`web/` 目录下的 React 18 + Vite) | +| **Go** | 遵循 [go.mod](go.mod),当前 1.26.10 | 核心控制平面、CLI、TUI、HTTP API 与 SQLite 状态机 | +| **Node.js** | 24+ | 前端管理界面(`web/` 目录下的 React 19 + Vite) | | **Git** | 2.41+ | 源码版本管理 | | **Rust** *(可选)* | 1.97.1+ | 仅在修改或验证 `analyzers/` 目录下的 WASI 代码分析器时需要 | diff --git a/README.en.md b/README.en.md index ed48f2c6d..e545557d3 100644 --- a/README.en.md +++ b/README.en.md @@ -52,7 +52,7 @@ Packages retain their historical filenames; the product name shown in the applic ### Option 2: Build from Source -Install **Go as pinned in [go.mod](go.mod), currently 1.26.9**, and **Node.js 24** (CI uses 24.16.0), then clone the repository: +Install **Go as pinned in [go.mod](go.mod), currently 1.26.10**, and **Node.js 24** (CI uses 24.16.0), then clone the repository: ```bash git clone https://github.com/CWNU-Open-Source-Community/Universal-Code.git diff --git a/README.md b/README.md index f4ed4e7ab..82d903ecf 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ ### 方式二:从源码构建运行 -安装 **Go(版本遵循 [go.mod](go.mod),当前为 1.26.9)** 与 **Node.js 24**(CI 使用 24.16.0),然后克隆仓库: +安装 **Go(版本遵循 [go.mod](go.mod),当前为 1.26.10)** 与 **Node.js 24**(CI 使用 24.16.0),然后克隆仓库: ```bash git clone https://github.com/CWNU-Open-Source-Community/Universal-Code.git diff --git a/docs/ci.md b/docs/ci.md index de71f87c4..1ecb8b46d 100644 --- a/docs/ci.md +++ b/docs/ci.md @@ -30,11 +30,11 @@ successful aggregate result. Unclassified build inputs select full checks. ## Go security baseline -The supported build toolchain is Go **1.26.9**, pinned by `go.mod`. Both central +The supported build toolchain is Go **1.26.10**, pinned by `go.mod`. Both central CI and release builders read that exact version with `go-version-file`. This avoids selecting an older patch while the setup-go version catalog lags behind a new Go security release. Local desktop builders require the same -version; set `GOTOOLCHAIN=go1.26.9` when another Go toolchain is installed. +version; set `GOTOOLCHAIN=go1.26.10` when another Go toolchain is installed. The module's minimum version alone cannot exclude vulnerable newer release branches, such as Go 1.27.0 and 1.27.1; a larger version is not security evidence. The Windows fixed-toolchain fixture must match the exact version selected by diff --git a/docs/macos-release.md b/docs/macos-release.md index 8fe7d5567..b55f2519f 100644 --- a/docs/macos-release.md +++ b/docs/macos-release.md @@ -37,7 +37,7 @@ Extract the Actions transport ZIP, then the product ZIP inside it, and open `Tra ## 构建与核验 -本机源码构建需要 Xcode Command Line Tools、[go.mod](../go.mod) 固定的 Go(当前 1.26.9)、Node.js 24(CI 为 24.16.0)和 CGO。在仓库根目录运行: +本机源码构建需要 Xcode Command Line Tools、[go.mod](../go.mod) 固定的 Go(当前 1.26.10)、Node.js 24(CI 为 24.16.0)和 CGO。在仓库根目录运行: ```sh CGO_ENABLED=1 bash scripts/build-desktop-darwin.sh -Version v1.0.0-dev diff --git a/docs/windows-release.md b/docs/windows-release.md index 7baf7e161..21eae82d1 100644 --- a/docs/windows-release.md +++ b/docs/windows-release.md @@ -30,7 +30,7 @@ If this artifact has expired, select a newer successful [Desktop release run](ht ### 从源码构建与启动 / Build and launch from source -在仓库根目录使用 PowerShell、[go.mod](../go.mod) 固定的 Go(当前 1.26.9)与 Node.js 24(CI 为 24.16.0): +在仓库根目录使用 PowerShell、[go.mod](../go.mod) 固定的 Go(当前 1.26.10)与 Node.js 24(CI 为 24.16.0): ```powershell .\scripts\build-desktop.ps1 -Version v1.0.0-dev diff --git a/go.mod b/go.mod index d12646dbf..b4c37fbb6 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module cyberagent-workbench -go 1.26.9 +go 1.26.10 require ( github.com/Microsoft/go-winio v0.6.2 diff --git a/internal/browserruntime/agent_browser_cleanup_test.go b/internal/browserruntime/agent_browser_cleanup_test.go index 03a702edb..2ccfa71fc 100644 --- a/internal/browserruntime/agent_browser_cleanup_test.go +++ b/internal/browserruntime/agent_browser_cleanup_test.go @@ -1,6 +1,78 @@ package browserruntime -import "testing" +import ( + "context" + "errors" + "os" + "testing" + "time" +) + +// Model a native process observation that cannot prove cleanup on its first +// attempt, then verifies the owned process scope on the explicit retry. +type retryableAgentBrowserTestProcess struct { + attempts int + done chan struct{} + exit BrowserProcessExit +} + +func (p *retryableAgentBrowserTestProcess) PID() int { return 1 } +func (p *retryableAgentBrowserTestProcess) Done() <-chan struct{} { return p.done } +func (p *retryableAgentBrowserTestProcess) Exit() (BrowserProcessExit, bool) { + return p.exit, true +} +func (p *retryableAgentBrowserTestProcess) Stop(context.Context) error { + p.attempts++ + if p.attempts == 1 { + close(p.done) + return errors.New("process observation unavailable") + } + p.exit.ProcessScopeVerified = true + return nil +} + +func TestAgentBrowserDoneAllowsExplicitCleanupRetry(t *testing.T) { + profile, err := prepareAgentBrowserProfile(t.TempDir(), AgentBrowserAuthority{SessionID: "retry"}) + if err != nil { + t.Fatal(err) + } + life, cancel := context.WithCancel(t.Context()) + defer cancel() + process := &retryableAgentBrowserTestProcess{ + done: make(chan struct{}), exit: BrowserProcessExit{ProcessScope: DarwinAgentBrowserProcessScope}, + } + r := &AgentBrowserRuntime{ + request: AgentBrowserStartRequest{Authority: AgentBrowserAuthority{SessionID: "retry"}}, + profile: profile, process: process, life: life, cancel: cancel, + done: make(chan struct{}), state: "ready", + } + go r.reapOnInvalidation() + r.Cancel() + select { + case <-r.Done(): + case <-time.After(2 * time.Second): + t.Fatal("first cleanup attempt did not finish") + } + if status := r.Status(); status.State != "cleanup_pending" { + t.Fatalf("unverified cleanup reported as complete: %+v", status) + } + if _, err := os.Stat(profile.path); err != nil { + t.Fatalf("profile removed before process cleanup was verified: %v", err) + } + if _, err := r.Snapshot(t.Context()); !errors.Is(err, ErrAgentBrowserClosed) { + t.Fatalf("pending cleanup allowed another action: %v", err) + } + result, err := r.Close(t.Context()) + if err != nil || !result.ProcessesStopped() || !result.ProfileRemoved || result.CleanupPending { + t.Fatalf("explicit cleanup retry: %+v %v", result, err) + } + if status := r.Status(); status.State != "closed" || process.attempts != 2 { + t.Fatalf("cleanup retry did not complete: status=%+v attempts=%d", status, process.attempts) + } + if _, err := os.Stat(profile.path); !errors.Is(err, os.ErrNotExist) { + t.Fatalf("profile survived verified cleanup: %v", err) + } +} func TestAgentBrowserCleanupRequiresItsActualProcessScope(t *testing.T) { cases := []struct { diff --git a/internal/browserruntime/agent_browser_runtime_test.go b/internal/browserruntime/agent_browser_runtime_test.go index 03349ef7a..0b7687947 100644 --- a/internal/browserruntime/agent_browser_runtime_test.go +++ b/internal/browserruntime/agent_browser_runtime_test.go @@ -307,9 +307,22 @@ func TestAgentBrowserRealCancelDoesNotWaitForAuthorityLookup(t *testing.T) { case <-time.After(10 * time.Second): t.Fatal("Cancel waited behind authority callback") } + // Done ends the first cleanup attempt; a transient native process + // observation failure can leave cleanup retryable. Verify completion while + // the authority callback is still blocked, before releasing it on return. + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + if _, err := r.Snapshot(ctx); !errors.Is(err, ErrAgentBrowserClosed) { + t.Fatalf("cancelled session accepted action: %v", err) + } + result, err := r.Close(ctx) + if err != nil || !result.ProcessesStopped() || !result.ProfileRemoved || result.CleanupPending { + t.Fatalf("cleanup while authority callback blocked: %+v %v", result, err) + } if status := r.Status(); status.State != "closed" { t.Fatalf("cleanup incomplete: %+v", status) } + t.Logf("owned cleanup while authority callback blocked: %+v", result) } func agentBrowserWaitSnapshot(t *testing.T, r *AgentBrowserRuntime, predicate func(AgentBrowserSnapshot) bool) AgentBrowserSnapshot { diff --git a/packaging/macos/LOCAL-TEST-GUIDE.txt b/packaging/macos/LOCAL-TEST-GUIDE.txt index 8a850081f..d55eb89af 100644 --- a/packaging/macos/LOCAL-TEST-GUIDE.txt +++ b/packaging/macos/LOCAL-TEST-GUIDE.txt @@ -30,7 +30,7 @@ Start-Prayu-Operator-Preview.command 只是同一默认入口的兼容快捷方 Node 版本不符时脚本会在前端检查前明确报错;如果 web/dist 已经构建好, 也可以用 -SkipFrontend 跳过前端步骤。构建还需要 Xcode 命令行工具 -(codesign)和 Go 1.26.9。 +(codesign)和 Go 1.26.10。 首次接入真实模型 ---------------- @@ -127,7 +127,7 @@ then run: A mismatched Node version fails fast before the frontend checks; use -SkipFrontend when web/dist is already built. Building also requires the -Xcode command line tools (codesign) and Go 1.26.9. +Xcode command line tools (codesign) and Go 1.26.10. Connect a real model -------------------- From 9d536e8bb8e299e990d57f660429b5fd2add9418 Mon Sep 17 00:00:00 2001 From: Qiyuanqiii <267806965+Qiyuanqiii@users.noreply.github.com> Date: Wed, 21 Oct 2026 22:40:27 +0800 Subject: [PATCH 3/4] fix(browser): honor macOS startup deadline through CDP connection (cherry picked from commit d862628c31458c1941c0b13077fb10eaaa96d19e) --- .../agent_browser_platform_darwin.go | 5 +- .../browserruntime/agent_browser_start.go | 6 +-- .../agent_browser_start_deadline_test.go | 49 +++++++++++++++++++ web/e2e/agent-browser.spec.ts | 3 +- 4 files changed, 58 insertions(+), 5 deletions(-) create mode 100644 internal/browserruntime/agent_browser_start_deadline_test.go diff --git a/internal/browserruntime/agent_browser_platform_darwin.go b/internal/browserruntime/agent_browser_platform_darwin.go index a339e6f58..1da77f12f 100644 --- a/internal/browserruntime/agent_browser_platform_darwin.go +++ b/internal/browserruntime/agent_browser_platform_darwin.go @@ -181,7 +181,10 @@ func LaunchAgentBrowser(ctx context.Context, request AgentBrowserStartRequest) ( return nil, err } go owned.monitor() - if err := r.connect(ctx, filepath.Join(profile.path, "Data")); err != nil { + // Native Chrome startup can exceed the Windows 30s connection budget on + // macOS. Keep the supervisor's 3m launch bound; a shorter caller deadline + // or runtime cancellation still stops endpoint discovery immediately. + if err := r.connect(ctx, filepath.Join(profile.path, "Data"), 3*time.Minute); err != nil { return nil, err } handlers, err := darwinChromeCrashpad(profile.path) diff --git a/internal/browserruntime/agent_browser_start.go b/internal/browserruntime/agent_browser_start.go index bcf890ba4..b6d7ef9ca 100644 --- a/internal/browserruntime/agent_browser_start.go +++ b/internal/browserruntime/agent_browser_start.go @@ -153,14 +153,14 @@ func launchPEAgentBrowser(ctx context.Context, request AgentBrowserStartRequest) return nil, err } r.process = &BrowserProcess{spec: spec, platform: platform} - if err := r.connect(ctx, profile.path); err != nil { + if err := r.connect(ctx, profile.path, 30*time.Second); err != nil { return nil, err } return r, nil } -func (r *AgentBrowserRuntime) connect(ctx context.Context, profilePath string) error { - startCtx, startCancel := context.WithTimeout(ctx, 30*time.Second) +func (r *AgentBrowserRuntime) connect(ctx context.Context, profilePath string, startupTimeout time.Duration) error { + startCtx, startCancel := context.WithTimeout(ctx, startupTimeout) defer startCancel() stopLife := context.AfterFunc(r.life, startCancel) defer stopLife() diff --git a/internal/browserruntime/agent_browser_start_deadline_test.go b/internal/browserruntime/agent_browser_start_deadline_test.go new file mode 100644 index 000000000..5e12e914a --- /dev/null +++ b/internal/browserruntime/agent_browser_start_deadline_test.go @@ -0,0 +1,49 @@ +package browserruntime + +import ( + "context" + "errors" + "testing" + "testing/synctest" + "time" +) + +func TestAgentBrowserConnectStartupDeadlineAndCancellation(t *testing.T) { + for _, tc := range []struct { + name string + budget time.Duration + parent time.Duration + cancelLife time.Duration + want time.Duration + wantErr error + }{ + {"windows_budget", 30 * time.Second, 5 * time.Minute, 0, 30 * time.Second, context.DeadlineExceeded}, + {"macos_budget", 3 * time.Minute, 5 * time.Minute, 0, 3 * time.Minute, context.DeadlineExceeded}, + {"shorter_parent", 3 * time.Minute, 45 * time.Second, 0, 45 * time.Second, context.DeadlineExceeded}, + {"runtime_cancel", 3 * time.Minute, 5 * time.Minute, 2 * time.Second, 2 * time.Second, context.Canceled}, + } { + t.Run(tc.name, func(t *testing.T) { + // No endpoint is published: exercise the real discovery wait with + // virtual time rather than sleeping for the native startup budget. + profile := t.TempDir() + synctest.Test(t, func(t *testing.T) { + ctx, cancel := context.WithTimeout(t.Context(), tc.parent) + defer cancel() + life, cancelLife := context.WithCancel(t.Context()) + defer cancelLife() + if tc.cancelLife > 0 { + time.AfterFunc(tc.cancelLife, cancelLife) + } + r := &AgentBrowserRuntime{ + life: life, + process: &retryableAgentBrowserTestProcess{done: make(chan struct{})}, + } + started := time.Now() + err := r.connect(ctx, profile, tc.budget) + if !errors.Is(err, tc.wantErr) || time.Since(started) != tc.want { + t.Fatalf("endpoint discovery ended after %s with %v; want %s and %v", time.Since(started), err, tc.want, tc.wantErr) + } + }) + }) + } +} diff --git a/web/e2e/agent-browser.spec.ts b/web/e2e/agent-browser.spec.ts index cee845ef8..f376964b0 100644 --- a/web/e2e/agent-browser.spec.ts +++ b/web/e2e/agent-browser.spec.ts @@ -55,7 +55,8 @@ test("native Agent Browser uses the production API and visible workbench", async } else { await expect.poll(async () => { const status = await readStatus(); - return status.state === "failed" || status.last_action === "browser_screenshot"; + return status.state === "failed" || status.unavailable_code === "run_unavailable" + || status.last_action === "browser_screenshot"; }, { timeout: nativeMac ? 240_000 : 60_000 }).toBe(true); expect(await readStatus(), "browser journey must reach screenshot capture") .toMatchObject({ last_action: "browser_screenshot" }); From fc0935d6fc03ca7abccbd148ce52d26c2bc154f8 Mon Sep 17 00:00:00 2001 From: Qiyuanqiii <267806965+Qiyuanqiii@users.noreply.github.com> Date: Thu, 22 Oct 2026 01:12:21 +0800 Subject: [PATCH 4/4] fix(ci): handle busy DMG creation and bounded browser handshakes (cherry picked from commit 5dc0c9af932e72c267cd80d5248b6281c150f773) --- .../restricted_cdp_handshake_test.go | 89 +++++++++++++++++++ .../restricted_cdp_transport.go | 29 +++++- scripts/package-desktop-dmg.py | 30 ++++++- scripts/test_macos_dmg.py | 45 ++++++++++ 4 files changed, 187 insertions(+), 6 deletions(-) create mode 100644 internal/browserruntime/restricted_cdp_handshake_test.go diff --git a/internal/browserruntime/restricted_cdp_handshake_test.go b/internal/browserruntime/restricted_cdp_handshake_test.go new file mode 100644 index 000000000..3edfc3475 --- /dev/null +++ b/internal/browserruntime/restricted_cdp_handshake_test.go @@ -0,0 +1,89 @@ +package browserruntime + +import ( + "context" + "errors" + "net" + "net/http" + "net/http/httptest" + "net/url" + "strings" + "testing" + "time" + + "github.com/gorilla/websocket" +) + +func TestRestrictedCDPHandshakeUsesRemainingStartupBudget(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + select { + case <-time.After(RestrictedCDPOperationTimeout + 200*time.Millisecond): + case <-r.Context().Done(): + return + } + upgrader := websocket.Upgrader{} + connection, err := upgrader.Upgrade(w, r, nil) + if err != nil { + return + } + defer connection.Close() + _, _, _ = connection.ReadMessage() + })) + defer server.Close() + endpoint, _ := url.Parse("ws" + strings.TrimPrefix(server.URL, "http") + "/devtools/browser/owned") + ctx, cancel := context.WithTimeout(t.Context(), 10*time.Second) + defer cancel() + connection, err := dialRestrictedCDP(ctx, endpoint) + if err != nil { + t.Fatalf("handshake inside startup deadline was rejected: %v", err) + } + defer connection.Close() + // Canceling the completed handshake must not close the live CDP session. + cancel() + if err := connection.WriteMessage(websocket.TextMessage, []byte("ready")); err != nil { + t.Fatalf("completed handshake retained cancellation hook: %v", err) + } +} + +func TestRestrictedCDPHandshakeStopsOnCancellationOrDeadline(t *testing.T) { + for _, earlyCancel := range []bool{false, true} { + t.Run(map[bool]string{false: "deadline", true: "cancellation"}[earlyCancel], func(t *testing.T) { + entered := make(chan struct{}) + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + close(entered) + <-r.Context().Done() + })) + defer server.Close() + endpoint, _ := url.Parse("ws" + strings.TrimPrefix(server.URL, "http") + "/devtools/browser/owned") + budget := 100 * time.Millisecond + if earlyCancel { + budget = time.Minute + } + ctx, cancel := context.WithTimeout(t.Context(), budget) + defer cancel() + if earlyCancel { + go func() { + select { + case <-entered: + cancel() + case <-ctx.Done(): + } + }() + } + started := time.Now() + connection, err := dialRestrictedCDP(ctx, endpoint) + if connection != nil { + connection.Close() + t.Fatal("unfinished handshake returned a connection") + } + var timeout net.Error + if earlyCancel && !errors.Is(err, context.Canceled) || + !earlyCancel && !errors.Is(err, context.DeadlineExceeded) && !(errors.As(err, &timeout) && timeout.Timeout()) { + t.Fatalf("handshake lost its cancellation/timeout cause: %v", err) + } + if time.Since(started) > 3*time.Second { + t.Fatal("canceled handshake waited for startup budget") + } + }) + } +} diff --git a/internal/browserruntime/restricted_cdp_transport.go b/internal/browserruntime/restricted_cdp_transport.go index 12c4784e3..1a5811ee6 100644 --- a/internal/browserruntime/restricted_cdp_transport.go +++ b/internal/browserruntime/restricted_cdp_transport.go @@ -911,23 +911,46 @@ func dialRestrictedCDP(ctx context.Context, endpoint *url.URL) (*websocket.Conn, return nil, ErrBrowserRuntimeBoundary } expectedAddress := endpoint.Host + // Production callers already bound startup to the session/authority + // deadline. Do not shorten a cold browser's handshake to the operation + // budget; callers without a deadline still get the usual five-second cap. + if _, bounded := ctx.Deadline(); !bounded { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, RestrictedCDPOperationTimeout) + defer cancel() + } + var stopHandshakeCancel func() bool dialer := websocket.Dialer{ - HandshakeTimeout: RestrictedCDPOperationTimeout, NetDialContext: func(ctx context.Context, network string, address string, ) (net.Conn, error) { if network != "tcp" || address != expectedAddress { return nil, ErrBrowserRuntimeBoundary } - return (&net.Dialer{}).DialContext(ctx, network, address) + connection, err := (&net.Dialer{}).DialContext(ctx, network, address) + if err == nil { + // Gorilla applies the deadline to the HTTP upgrade, but context + // cancellation alone does not interrupt that socket read. + stopHandshakeCancel = context.AfterFunc(ctx, func() { _ = connection.Close() }) + } + return connection, err }, } connection, response, err := dialer.DialContext(ctx, endpoint.String(), nil) + if stopHandshakeCancel != nil { + stopHandshakeCancel() + } + if ctx.Err() != nil { + if connection != nil { + _ = connection.Close() + } + err = ctx.Err() + } if err != nil { if response != nil && response.Body != nil { _ = response.Body.Close() } - return nil, errors.New("connect to restricted chromium DevTools endpoint failed") + return nil, fmt.Errorf("connect to restricted chromium DevTools endpoint failed: %w", err) } remote, ok := connection.UnderlyingConn().RemoteAddr().(*net.TCPAddr) if !ok || remote == nil || !remote.IP.IsLoopback() || diff --git a/scripts/package-desktop-dmg.py b/scripts/package-desktop-dmg.py index 623d9ea72..36cb7c103 100644 --- a/scripts/package-desktop-dmg.py +++ b/scripts/package-desktop-dmg.py @@ -14,6 +14,7 @@ import subprocess import sys import tempfile +import time # Importing the ZIP verifier must not add scripts/__pycache__ to an otherwise @@ -60,6 +61,31 @@ def detach(mountpoint): release.require(result.returncode == 0, "could not detach the temporary DMG mount") +def create_image(stage, image, volume): + command = [HDIUTIL, "create", "-srcfolder", str(stage), "-volname", volume, + "-fs", "HFS+", "-format", "UDZO", str(image)] + for attempt in range(3): + # hdiutil create reports EBUSY as exit 1, shared with permanent errors. + # Keep its diagnostic and retry only the explicit transient failure. + # Use a file, not a pipe inherited by diskimages-helper. + with tempfile.TemporaryFile(mode="w+t", encoding="utf-8") as log: + result = subprocess.run(command, stdout=log, stderr=subprocess.STDOUT, + env=dict(os.environ, LC_ALL="C"), timeout=600) + log.seek(0) + diagnostic = log.read() + print(diagnostic, end="", flush=True) + if result.returncode == 0: + return + if result.returncode != 1 or "Resource busy" not in diagnostic or attempt == 2: + result.check_returncode() + # This image is inside this invocation's private staging directory; + # a failed attempt may leave a partial file that cannot be reused. + image.unlink(missing_ok=True) + delay = 2 ** (attempt + 1) + print("macos_dmg: resource busy; retrying creation in %ss" % delay, flush=True) + time.sleep(delay) + + def package(version, revision, arch, source, output): release.require(sys.platform == "darwin", "DMG packaging requires macOS") source = source.resolve() @@ -90,9 +116,7 @@ def package(version, revision, arch, source, output): subprocess.run(["/usr/bin/ditto", "-x", "-k", str(source / archive_name), str(stage)], check=True) verify_payload(stage, manifest["files"], exact=True) (stage / "Applications").symlink_to("/Applications") - subprocess.run([HDIUTIL, "create", "-srcfolder", str(stage), "-volname", - "Universal-Code " + version + " " + arch, "-fs", "HFS+", - "-format", "UDZO", str(temporary_image)], check=True, timeout=600) + create_image(stage, temporary_image, "Universal-Code " + version + " " + arch) subprocess.run([HDIUTIL, "verify", str(temporary_image)], check=True, timeout=120) attached = subprocess.run([HDIUTIL, "attach", "-readonly", "-nobrowse", "-noautoopen", "-mountpoint", str(mountpoint), "-plist", str(temporary_image)], diff --git a/scripts/test_macos_dmg.py b/scripts/test_macos_dmg.py index 0c416e1ba..46dff3449 100644 --- a/scripts/test_macos_dmg.py +++ b/scripts/test_macos_dmg.py @@ -137,6 +137,51 @@ def test_detach_retries_owned_mount_on_failure_or_timeout(self): self.assertEqual(run.call_args_list[1].args[0], [dmg.HDIUTIL, "detach", "-force", str(self.root / "mounted")]) + def test_busy_create_retries_after_removing_partial_image(self): + calls = 0 + image = self.root / "private.dmg" + + def busy_once(command, **kwargs): + nonlocal calls + calls += 1 + self.assertEqual(command[:2], [dmg.HDIUTIL, "create"]) + self.assertFalse(image.exists()) + if calls == 1: + image.write_bytes(b"incomplete") + kwargs["stdout"].write("hdiutil: create failed - Resource busy\n") + return subprocess.CompletedProcess(command, 1) + image.write_bytes(b"disk-image-fixture") + return subprocess.CompletedProcess(command, 0) + + with mock.patch.object(dmg.time, "sleep") as sleep, \ + mock.patch.object(dmg.subprocess, "run", side_effect=busy_once): + dmg.create_image(self.payload, image, "Preview") + self.assertEqual(calls, 2) + sleep.assert_called_once_with(2) + self.assertEqual(image.read_bytes(), b"disk-image-fixture") + + def test_create_stops_on_permanent_error_or_exhausted_busy_retries(self): + for diagnostic, expected_attempts in (("Permission denied", 1), ("Resource busy", 3)): + with self.subTest(diagnostic=diagnostic): + def fail_create(command, **kwargs): + kwargs["stdout"].write("hdiutil: create failed - " + diagnostic + "\n") + return subprocess.CompletedProcess(command, 1) + + with mock.patch.object(dmg.time, "sleep") as sleep, \ + mock.patch.object(dmg.subprocess, "run", side_effect=fail_create) as run: + with self.assertRaises(subprocess.CalledProcessError): + dmg.create_image(self.payload, self.root / "private.dmg", "Preview") + self.assertEqual(run.call_count, expected_attempts) + self.assertEqual(sleep.call_count, expected_attempts - 1) + + def test_timed_out_create_is_not_retried(self): + with mock.patch.object(dmg.time, "sleep") as sleep, \ + mock.patch.object(dmg.subprocess, "run", side_effect=subprocess.TimeoutExpired([], 600)) as run: + with self.assertRaises(subprocess.TimeoutExpired): + dmg.create_image(self.payload, self.root / "private.dmg", "Preview") + sleep.assert_not_called() + self.assertEqual(run.call_count, 1) + if __name__ == "__main__": unittest.main()