Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
119 commits
Select commit Hold shift + click to select a range
ce87d26
feat(web): align tool activity presentation with Codex
testikun Oct 8, 2026
5bff112
docs(web): preserve Codex activity references and checked UI build
testikun Oct 8, 2026
bb7ef02
fix(web): polish compact activity summaries and disclosures
testikun Oct 8, 2026
3e9d7b4
docs(web): record activity detail and Claude source comparison
testikun Oct 8, 2026
1ca63f1
fix(web): separate reply folding from tool activity disclosures
testikun Oct 8, 2026
8e73cf7
Improve native Skills and Plugins settings
testikun Oct 8, 2026
f9b4474
docs(web): record native reply disclosure acceptance
testikun Oct 8, 2026
6a3bf4e
Rebuild resource settings with locked local dependencies
testikun Oct 8, 2026
eb22b2f
Match configured package fixture paths across platforms
testikun Oct 8, 2026
a32bcf6
fix(web): align completed process folding and visit indicators
testikun Oct 9, 2026
eac5066
docs(web): record visited completion and native folding acceptance
testikun Oct 9, 2026
0a018d0
feat(web): polish running activity and saved thinking disclosure
testikun Oct 9, 2026
c1d8536
docs(web): record Pi browser tool compatibility probe
testikun Oct 9, 2026
cb8f817
docs(web): record running activity and thinking acceptance
testikun Oct 9, 2026
51d191b
Merge remote-tracking branch 'upstream/main' into codex/web-execution…
testikun Oct 9, 2026
017b17f
fix(web): retain native execution folding across steering
testikun Oct 9, 2026
8bbb022
feat(browser): adapt pi-computer-use to embedded OpenPI pages
testikun Oct 9, 2026
32ee977
Merge remote-tracking branch 'upstream/main' into codex/browser-tools…
testikun Oct 9, 2026
307296c
test(web): record native steering and installed folding acceptance
testikun Oct 9, 2026
4163abb
fix(browser): confine resolved elements to the selected document
testikun Oct 9, 2026
2782e77
docs(browser): record embedded adapter validation and boundaries
testikun Oct 9, 2026
05a2274
docs(browser): link embedded adaptation pull request
testikun Oct 9, 2026
4ca29b3
fix(web): show native reconnect and compaction activity
testikun Oct 9, 2026
a10bf06
Merge remote-tracking branch 'upstream/main' into codex/web-execution…
testikun Oct 9, 2026
d999cd8
fix(web): keep completed tools settled during native retries
testikun Oct 9, 2026
9f14dd0
docs: record native retry and real context compaction acceptance
testikun Oct 9, 2026
0996ab4
Improve glanceable Web session usage
testikun Oct 9, 2026
21dd16e
fix(web): polish tool labels and show native Code Mode calls
testikun Oct 9, 2026
e4763f4
Await popup focus in usage checks and clarify validation
testikun Oct 9, 2026
e53c4ac
fix(web): keep tool display unified
testikun Oct 9, 2026
79d1be9
docs(web): record accepted tool styling and Code Mode boundary
testikun Oct 9, 2026
bd66a9e
Soften browser chrome with rounded themed controls
testikun Oct 9, 2026
cc7b941
Merge accepted execution activity UI into PR #711
testikun Oct 9, 2026
bc35453
docs(web): link execution activity acceptance to PR #711
testikun Oct 9, 2026
7dd27c2
fix(web): preserve chronological activity and manual reading
testikun Oct 9, 2026
b976ed2
fix(web): align activity typography and documented behavior
testikun Oct 9, 2026
87959c5
Polish side conversation layout and composer
testikun Oct 9, 2026
978a1c4
Merge commit 'bc3545385df27ffa08c1b78ae9276f17ec86b86e' into codex/se…
testikun Oct 9, 2026
24b59ce
Record side conversation validation and layout ownership
testikun Oct 9, 2026
7282f68
Merge commit 'b976ed23b9674bbd26e5a776cbc6437bda8a9784' into codex/se…
testikun Oct 9, 2026
34b9651
Record combined side conversation delivery evidence
testikun Oct 9, 2026
57311c5
fix(web): retain native reading positions and honest activity state
testikun Oct 9, 2026
61831ee
Merge remote-tracking branch 'refs/remotes/upstream/codex/settings-re…
testikun Oct 9, 2026
4c737fc
build(web): validate and bundle combined reading refinements
testikun Oct 9, 2026
74dc87e
fix(web): keep latest keyboard navigation near the native answer
testikun Oct 9, 2026
b92f992
docs(web): record installed reading continuity acceptance
testikun Oct 9, 2026
a2d86c0
Refine Files, Terminal and Changes workbar interactions
testikun Oct 9, 2026
8eb0808
Keep workbar tool menus readable in narrow layouts
testikun Oct 9, 2026
0af87f3
feat(browser): add opt-in browser setup and native profile selection
testikun Oct 9, 2026
cc74702
docs(browser): record frozen live provider acceptance
testikun Oct 9, 2026
7685f38
Fit descriptive workbar menus within the viewport
testikun Oct 9, 2026
5dbbe93
Document workbar tool design and native acceptance
testikun Oct 9, 2026
5e0a3cb
Link archived sidebar acceptance evidence
testikun Oct 9, 2026
f19f044
fix(browser): gate idle transport and isolate native browser fixture
testikun Oct 9, 2026
97d04d2
test(browser): verify cancellation after its native receipt
testikun Oct 9, 2026
c2a2a32
Match side conversation composer to main chat
testikun Oct 10, 2026
4d63f5d
Merge branch 'codex/settings-resources' of https://github.com/openpi-…
testikun Oct 10, 2026
6168bdf
feat(browser): guide OpenPI extension setup one step at a time
testikun Oct 10, 2026
5ed9fb8
Add Pi-native account login to Web model settings
testikun Oct 10, 2026
314ba38
Explain file toolbar icons on hover and keyboard focus
testikun Oct 10, 2026
20d3628
Dismiss file tooltips before their containing panels
testikun Oct 10, 2026
2c59d44
Add account entry and provider icons to model settings
testikun Oct 10, 2026
785571e
Document model connection design and validation
testikun Oct 10, 2026
87aa161
Record file toolbar tooltip and Escape acceptance
testikun Oct 10, 2026
79bc81c
Merge concurrent model settings and side conversation updates
testikun Oct 10, 2026
fbd070b
feat(browser): add Safari and Firefox control with floating setup guide
testikun Oct 10, 2026
1e00c0b
Record integrated file toolbar delivery
testikun Oct 10, 2026
60ff981
Clarify integrated model and side composer documentation
testikun Oct 10, 2026
2c07c0f
Connect model selection to native Pi defaults
testikun Oct 10, 2026
4c82bf4
Keep model label regression independent of provider marks
testikun Oct 10, 2026
7ac6607
Record native model defaults and connection design acceptance
testikun Oct 10, 2026
6636085
Use a consistent icon for custom model connections
testikun Oct 10, 2026
b9be9c1
Merge browser setup and control into settings workbench
testikun Oct 10, 2026
de3f03e
Record consistent custom connection icon acceptance
testikun Oct 10, 2026
7e56612
Merge latest native model settings into browser integration
testikun Oct 10, 2026
92a722c
Preserve custom connection icon update in browser integration
testikun Oct 10, 2026
29f5671
fix(web): reconcile session usage and persisted image prompts
testikun Oct 10, 2026
e8c0be0
docs(web): record session display recovery acceptance
testikun Oct 10, 2026
0bed790
feat(web): add optional Pi web search setup
testikun Oct 10, 2026
a13741a
Fix optional web search review in Web sessions
testikun Oct 10, 2026
52e6fb8
feat(web): add optional current-model native search
testikun Oct 10, 2026
c11d8ab
fix(web): render native searches in existing tool groups
testikun Oct 10, 2026
fde2ffb
fix(web): reveal activity details on hover and link native tools
testikun Oct 12, 2026
5c8e0dd
docs(web): record quiet activity disclosure acceptance
testikun Oct 12, 2026
d526ec8
Polish thinking marks and trajectory browsing
testikun Oct 12, 2026
ad069f8
Align compaction and reconnect status presentation
testikun Oct 13, 2026
41cc796
Add Pi-native Configuration settings tab
testikun Oct 13, 2026
85dfc17
Record Configuration integration validation for PR 711
testikun Oct 13, 2026
e2379b8
Add Codex-style settings shell, appearance and archived chats
testikun Oct 13, 2026
9900506
Align subagent activity and inspection with Codex
testikun Oct 13, 2026
184ecb3
Align Configuration settings with traced Codex menus and shared layout
testikun Oct 13, 2026
bb980a6
Merge latest PR 711 subagent updates into settings parity
testikun Oct 13, 2026
5d98bd4
Record integrated settings validation and refresh recovery
testikun Oct 13, 2026
ecc8023
Link settings acceptance record to its tracking issue
testikun Oct 13, 2026
437213d
feat(web): add native sidebar actions and conversation forks
testikun Oct 13, 2026
1414323
Merge latest PR settings and validate sidebar parity
testikun Oct 13, 2026
b7ca76a
fix(web): verify settings persistence and recovery end to end
testikun Oct 13, 2026
3dad861
Merge remote-tracking branch 'refs/remotes/codex-audit/pr711' into co…
testikun Oct 13, 2026
2510e8c
fix(web): preserve native dragging and composer bottom following
testikun Oct 13, 2026
e9cd565
test(web): model upward reading before resize assertions
testikun Oct 13, 2026
7ad5394
test(web): keep model connection event stream open
testikun Oct 13, 2026
c0c1762
docs(web): record settings usability and backend audit
testikun Oct 13, 2026
f5d02b2
test(web): make worktree fixtures portable on Windows
testikun Oct 13, 2026
b603940
fix(web): keep historical results from becoming unread on upgrade
testikun Oct 13, 2026
0d34dac
test(web): normalize Windows paths and budget session cache coverage
testikun Oct 13, 2026
6e3f2cd
test(web): keep settings fixture event stream connected
testikun Oct 13, 2026
cfc5537
Enable native Code Mode by default in CLI and Web
testikun Oct 13, 2026
f628467
fix: resolve managed Web peers and support Pi 1.2.0
testikun Oct 13, 2026
b31a3dd
fix(web): use an explicit Codex default font
testikun Oct 13, 2026
444cdd2
Polish tool activity and render native Code Mode calls
testikun Oct 13, 2026
4a2f5af
fix(web): preserve turn continuity and resume viewed conversations
testikun Oct 13, 2026
bafef51
Merge PR 711 tool presentation updates with conversation fixes
testikun Oct 13, 2026
ee5561c
Fix tool evidence contrast and CI lifecycle regressions
testikun Oct 14, 2026
3e2f97e
fix(web): align Plan draft checks and refine file name cues
testikun Oct 14, 2026
625d4aa
fix(web): align Codex chat typography and responsive spacing
testikun Oct 14, 2026
7daee1e
docs: compare harness latency ownership across Pi and references
testikun Oct 14, 2026
e0a4379
feat(web): adopt DeepSeek-style execution trajectory
testikun Oct 14, 2026
0be5c94
docs: link trajectory implementation PR
testikun Oct 14, 2026
8ad2f9a
Merge main into trajectory PR and retain the scoped feature changes
testikun Oct 16, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions THIRD_PARTY_NOTICES.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,14 @@ it does not install or activate the package's desktop helper.

## Project origins and acknowledgments

The Web execution trajectory adapts the compact ledger, three-lane overview,
range selection, and record inspector of DeepSeek Harness at revision
`d743267388641bc76f17c45ce8b4c231aed1d32c`, from
[`@deepseek-ai/dsh-client-ui-trajectory`](https://github.com/deepseek-ai/deepseek-harness/tree/d743267388641bc76f17c45ce8b4c231aed1d32c/packages/client/ui-trajectory).
OpenPI keeps Pi's Session records and bounded Web projections; it does not embed
Cordis or the DeepSeek agent runtime. The MIT notice is reproduced in
[`web/ui/src/features/trajectory/LICENSE.dsh`](web/ui/src/features/trajectory/LICENSE.dsh).

The Web model settings page adapts the provider cards, inline editors and model
selection interactions of `@deepseek-ai/dsh-client-ui-settings-models` version
`0.1.7-rc.2`, from [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness).
Expand Down
2 changes: 2 additions & 0 deletions docs/design/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# Design archive

- [`WEB_TRAJECTORY_DEEPSEEK_2026-10-14.md`](WEB_TRAJECTORY_DEEPSEEK_2026-10-14.md) — DeepSeek 风格轨迹列表、三轨总览、详情与 Pi 原生证据适配,跟踪 #785。

- [`WEB_CODEX_SIDEBAR.md`](WEB_CODEX_SIDEBAR.md) — Codex App Server and shipped-UI evidence, mixed pins, Activity/search, Web menus and Pi-owned reading revisions for #597 / #711.
- [`WEB_CODEX_SETTINGS.md`](WEB_CODEX_SETTINGS.md) — draft Codex settings surface, appearance and archived-chat state comparison with bounded REA/App Server evidence for #597 / #711.

Expand Down
51 changes: 51 additions & 0 deletions docs/design/WEB_TRAJECTORY_DEEPSEEK_2026-10-14.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# DeepSeek 风格执行轨迹

- 状态:`validated`,限定于下述源码投影、组件与固定数据浏览器验收;不代表模型性能结论或正式发布。
- 创建与最近核查:2026-10-14。
- 适用范围:以 OpenPI `7daee1eb818e60d3bf52e79edb1b3ef1cfecd9a1` 为基线的独立轨迹改动;Pi `1.2.0`。
- 跟踪与认领:[#785](https://github.com/openpi-dev/openpi/issues/785),由 `@testikun` 认领。依赖现有 Web [#711](https://github.com/openpi-dev/openpi/pull/711),不修改其分支。
- 实现 PR:[#789](https://github.com/openpi-dev/openpi/pull/789),独立叠放于 #711。
- 来源:DeepSeek Harness [`d743267388641bc76f17c45ce8b4c231aed1d32c`](https://github.com/deepseek-ai/deepseek-harness/tree/d743267388641bc76f17c45ce8b4c231aed1d32c/packages/client/ui-trajectory),MIT。移植许可位于 `web/ui/src/features/trajectory/LICENSE.dsh`。
- 替代关系:无;既有轨迹研究的历史验证保持原边界。

## 问题与结果

原轨迹以消息卡片为主,长回合中很难定位模型响应、Code Mode 的内部调用及某次工具耗时。本次采用 DeepSeek 的紧凑执行列表、上下文/模型/工具三轨总览和右侧详情结构,把已存在的 Pi 事实显示出来。

用户可以通过总览点击或键盘选择记录,通过拖动选区突出对应记录;列表支持搜索、按回合折叠、整体折叠工具与历史读取。Code Mode 子调用在父调用后缩进排列,状态、原生 duration 和结果缺失提示分别保留。详情提供输入、结果、时间与模型响应的用量,代码和结果可以复制原文、切换换行;Code Mode 源码使用有界、清理后的高亮。

## 数据所有者

Pi Session 仍是消息与结果的来源。`projectMessage()` 只补充 provider 原生的单次 input、output、cacheRead、cacheWrite 与模型身份;未报告的字段不补零,失败/取消的全零占位用量不作为用量证据,非零的原生计数仍保留。当前会话的原生 live tool 结果可补充临时详情;其他会话不复用该 live ledger。

`buildTrajectory()` 保持调用配对规则;浏览器投影补上没有正文的 assistant 响应,并使用现有 `codemodeChildren()` 读取父子调用。重复外层调用身份不建立 live 子调用关系。不解析脚本文本来推测调用,不从 ID 前缀建立父子关系,不把脚本输出当作子工具结果。

持久 Code Mode 子调用摘要可能只有调用、状态和 duration,没有子工具返回体。刷新后保留这个限制,明确提示结果正文未保存。外层工具返回成功和后续模型失败可以同时显示。Pi 原生证据能够区分执行中、取消或超时时,详情保留相应状态;摘要只记录 error 而无法细分时保持该证据边界。

## 时间与用量口径

总览本轮采用等宽记录序列,明确标注宽度不表示耗时。当前保存时间不是工具开始时间,子调用的 duration 也没有提供其绝对开始位置,不能将这些字段拼成真实并行时间线。时间详情只显示已有原生 duration;首段输出等待、生成时间、吞吐未采集时显示“未记录”。最近回合耗时来自已有的 `openpi-web-turn-timing` 记录,单独标明为最近已记录回合。

单次模型用量与已加载响应/调用数量分别展示。数量只覆盖有界读取窗口,不宣称覆盖整个 Session。真正的逐次 provider 阶段、精确 HTTP attempt、网关内部重试和异常 SSE 原字节仍是后续观测工作,不能用本次 UI 验收代替。

## 阅读与生命周期

历史读取复用 `useSessionHistory()` 的分支身份、分页、取消和验证机制。初始展示最近 50 条轨迹记录,用户可显式增加已加载记录的展示范围;选中较早记录时维持当前窗口,提供回到最新记录。当前投影仍受 Session 数量与字节上限约束,不提供全量请求或无限日志端点。

新记录追加保留选中身份和详情 tab。向上滚动暂停自动滚入;显式选中记录恢复定位。分页前后的高度补偿保留阅读位置。总览选区仅应用于选择时的确切记录窗口;搜索或窗口变化不会把旧坐标应用到不同记录。窄面板上下排列执行列表与详情,沿用现有主题、翻译和键盘交互。

## 验证与消融

专项测试覆盖原生调用配对、工具专用响应、Code Mode 子调用及缺失结果、已记录耗时、模型错误、单次用量和键盘选中。浏览器用例覆盖桌面/手机、明暗主题、原生结果搜索、代码文本安全、无横向溢出与可访问性。

本轮消融移除了总览里重复的 click 选中处理,只保留 pointer settlement 与键盘激活;移除了将 Code Mode 源码包装成 Markdown 的中间路径,改为保留精确文本并按需高亮;移除了选区重置 Effect,改为记录身份匹配后才投影选区。分别由真实浏览器点击/拖动、原始参数/精确复制、搜索后选区用例验证。没有引入通用 span 框架、第二套 Session 存储、provider 栈或自动重试。

验收结果(2026-10-14):

- `bun run check` 通过:配置/文档合同、构建、格式、lint、类型检查;生成的 `web/dist` 随实现提交。
- 空的 `PI_CODING_AGENT_DIR` 下运行 `bun run test`:Node 2519 通过、9 跳过,Vitest 95 文件/1460 用例通过。首次读取本机个人 TUI 配置时有 6 项渲染测试失败,隔离配置后消失。
- Playwright 轨迹专项 3/3 通过:桌面/手机、明暗主题、总览点击与拖动、选区身份、嵌套调用、时间/用量、输入/结果、键盘 tab、无横向溢出与 Axe。
- 浏览器通过真实本地测试 Host 加载当前 checkout 的构建;测试启动器先执行 `scripts/provenance.mjs`,验证 `pi list` 的唯一 OpenPI 来源与 checkout 一致。使用固定消息与 SSE fixture,不调用真实模型。
- 本地证据身份:`openpi-trajectory-deepseek-20261014`,收据及日志/截图保存在仓库外的 `~/.local/state/openpi-web/evidence/trajectory-deepseek-20261014/`。源文件、构建和证据文件的 SHA-256 在收据中记录。

真实用户 Session 的手工 smoke 尚未验证;现有 `57161` 常驻运行副本未随本 PR 更新。测试仅证明这批投影和 UI 的行为,不证明运行更快;本次没有新的模型速度 Benchmark。
59 changes: 55 additions & 4 deletions tests/web/openpi-web.e2e.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3203,7 +3203,7 @@ test("trajectory inspects bounded prompt and tool evidence on desktop and mobile
);
await expect(view.getByText(/省略 4 条记录/)).toBeVisible();
await view.getByRole("button", { name: /显示更早记录/ }).click();
await expect(view.locator(".trajectory-record")).toHaveCount(57);
await expect(view.locator(".trajectory-record")).toHaveCount(58);
await view.locator(".trajectory-record").filter({ hasText: "bash" }).click();
await expect(view.locator(".trajectory-inspector")).toContainText(
"printf hello",
Expand Down Expand Up @@ -3290,6 +3290,9 @@ for (const theme of ["light", "dark"] as const) {
message: {
role: "assistant",
content: "",
provider: "fixture",
model: "fixture-model",
usage: { input: 120, cacheRead: 900, cacheWrite: 0, output: 50 },
parts: [
{ type: "thinking", text: "先读取配置,再核对检查结果。" },
{
Expand Down Expand Up @@ -3325,8 +3328,9 @@ for (const theme of ["light", "dark"] as const) {
{
type: "toolCall",
id: "run-checks",
name: "bash",
arguments: '{"command":"bun run check"}',
name: "codemode",
arguments:
'{"code":"text(await tools.bash({command: \'bun run check\'}));"}',
},
],
},
Expand All @@ -3338,10 +3342,25 @@ for (const theme of ["light", "dark"] as const) {
message: {
role: "toolResult",
toolCallId: "run-checks",
toolName: "bash",
toolName: "codemode",
content: "配置与类型检查通过。",
isError: false,
details: { exitCode: 0 },
nestedCalls: {
complete: true,
calls: [
{
call: {
type: "toolCall",
id: "run-checks/1",
name: "bash",
arguments: '{"command":"bun run check"}',
},
status: "ok",
durationMs: 1234,
},
],
},
},
},
{
Expand Down Expand Up @@ -3371,6 +3390,38 @@ for (const theme of ["light", "dark"] as const) {
exact: true,
});
const changes = view.locator(".trajectory-event-group details");
await view.locator('[data-record-key="inspect"]').click();
await inspector.getByRole("tab", { name: "用量", exact: true }).click();
await expect(inspector.getByRole("tabpanel")).toContainText("900");
await expect(inspector.getByRole("tabpanel")).toContainText(
"fixture-model",
);
await view.locator('li[data-nested="true"] .trajectory-record').click();
await expect(inspector.getByRole("tabpanel")).toContainText(
"未保存其结果正文",
);
await inspector.getByRole("tab", { name: "时间", exact: true }).click();
await expect(inspector.getByRole("tabpanel")).toContainText("1.23 s");
await expect(inspector.getByRole("tabpanel")).toContainText("未记录");
const overview = view.locator(".trajectory-overview svg");
const bounds = (await overview.boundingBox())!;
await page.mouse.move(
bounds.x + bounds.width * 0.35,
bounds.y + bounds.height / 2,
);
await page.mouse.down();
await page.mouse.move(
bounds.x + bounds.width * 0.7,
bounds.y + bounds.height / 2,
);
await page.mouse.up();
await expect(view.getByRole("button", { name: "清除选区" })).toBeVisible();
await expect(
view.locator('li[data-outside-range="true"] > .trajectory-record.user'),
).toBeVisible();
await view.getByRole("searchbox", { name: "搜索已加载记录" }).fill("read");
await expect(view.getByRole("button", { name: "清除选区" })).toHaveCount(0);
await view.getByRole("searchbox", { name: "搜索已加载记录" }).fill("");
await expect(changes).toHaveJSProperty("open", false);
await changes.locator("summary").click();
await view.getByRole("button", { name: /切换模型/ }).click();
Expand Down
Loading
Loading