Commit Graph

640 Commits

Author SHA1 Message Date
Chinesezjc
e98f458852 perf(web-read-card): lazy-load read grammars and guard empty-window copy
Only TypeScript, shell, and JSON grammars load at Web boot; the read card's
wider langFromPath extension set loads through dynamic imports on first use,
so a session that never opens a read card in one of those languages avoids
~1.6 MB of grammar modules and their synchronous init. ReadBlock/CodeBlock
re-render on grammar-load via useSyncExternalStore, picking up highlighting
once the grammar registers. ReadBlock hides the copy control on an empty
window (a successful read of an empty file settles to lines: [] with
card:'read'), matching TerminalBlock so it cannot wipe the clipboard.
2026-07-30 21:28:38 +08:00
Chinesezjc
43583c75d2 Merge remote-tracking branch 'origin/master' into feat/web-read-card 2026-07-30 20:22:51 +08:00
Chinesezjc
69a84e1403 fix(web-read-card): align highlight grammars with read hints, fix fixture schema, restore running sweep
Register the full grammar set the read tool's langFromPath emits (python,
go, rust, yaml, markdown, html, and the rest) so a read card highlights the
same extensions the backend recognizes instead of returning undefined for
them. Rewrite highlightLines' terminator-line check to the explicit
last !== undefined form to keep a single branch for per-file coverage.

Add the running-state sweep animation to ReadRow, matching BashRow/ToolRow,
so a running read row shows executing feedback.

Use file_path (the real read tool schema field) in the turn 66 read fixture
sample, its presentCall branch, and the turn 64 run_code read sub-dispatches,
so the built-boot snapshot replays a production-shaped call and the details
panel shows the correct Input JSON.

Document why ReadBlock omits TerminalBlock's empty-window copy guard, and
correct the read-card-model {@link} and the turn 66 fixture comment.
2026-07-30 19:56:06 +08:00
imccyu
a1f1f9c29a Merge branch 'master' into codex/figma-context-injection-row 2026-07-30 19:20:21 +08:00
Chinesezjc
d34211d781 Merge remote-tracking branch 'origin/feat/read-presenter' into feat/web-read-card
# Conflicts:
#	packages/client/ui-conversation/tests/chat-apply.spec.tsx
2026-07-30 19:09:40 +08:00
kingwl
1f5d09c2d7 Merge origin/master into codex/figma-context-injection-row
# Conflicts:
#	packages/client/ui-conversation/README.i18n.yaml
2026-07-30 18:27:49 +08:00
Chinesezjc
7a60a236bc feat(web): render read tool output as a line-numbered code card
Consume the card:'read' result view (path, numbered lines, totalLines, lang)
the read backend PR added. ReadBlock (ui-primitives) draws a per-line gutter
with each line's own file number, shiki highlighting via a new highlightLines
returning per-line token arrays, a 显示 X / Y 行 window note, a height cap
matching TerminalBlock, and a copy control. read-card-model is the single
resultView derivation; a keyed ReadRow registers under read with the card
resident under its path-link summary. The generic fallback and the details
panel are read-aware. Fixture gains a windowed read turn for the built-boot
snapshot.
2026-07-30 18:15:38 +08:00
Tianyi Cui
53ff5c6ef2 Merge branch 'master' into feature/shared-cli-config-foundation 2026-07-30 18:02:07 +08:00
Tianyi Cui
66e182b516 Merge branch 'master' into feature/shared-cli-config-foundation 2026-07-30 17:35:47 +08:00
kingwl
3d6cacc59b Merge remote-tracking branch 'origin/master' into codex/composer-dock-stacking
# Conflicts:
#	packages/client/ui-conversation/README.i18n.yaml
2026-07-30 17:35:22 +08:00
kingwl
0f0564b3d0 Merge origin/master into codex/figma-context-injection-row 2026-07-30 17:35:04 +08:00
kingwl
f5228e7c71 Merge origin/master into codex/figma-context-injection-row
# Conflicts:
#	packages/client/ui-conversation/README.i18n.yaml
#	packages/client/ui-conversation/src/client/chat/ToolRow.module.css
#	packages/client/ui-conversation/src/client/chat/ToolRow.tsx
2026-07-30 17:34:14 +08:00
kingwl
abf498b8dc fix(web): align composer context stack 2026-07-30 17:26:44 +08:00
imccyu
4cd5745b94 Merge branch 'master' into codex/details-default-closed 2026-07-30 17:14:51 +08:00
Tianyi Cui
abd7d57358 Merge branch 'master' into feature/shared-cli-config-foundation 2026-07-30 17:08:42 +08:00
imccyu
34c124585a fix: test 2026-07-30 16:46:50 +08:00
kingwl
d7641ec028 Merge origin/master into codex/figma-context-injection-row 2026-07-30 16:20:47 +08:00
kingwl
17893c503e feat(web): match context injection disclosure design 2026-07-30 16:20:34 +08:00
imccyu
17fea637d5 Merge branch 'master' into codex/details-default-closed 2026-07-30 15:40:36 +08:00
imccyu
e184b9561a Merge branch 'master' into feat/ask-question-gui 2026-07-30 15:36:22 +08:00
imccyu
925cb0b315 feat(web): plan chip as an always-visible pressed-state toggle
fix: plan button add label
2026-07-30 15:33:45 +08:00
Turtle
da5f1878c0 Merge remote-tracking branch 'origin/master' into feature/shared-cli-config-foundation 2026-07-30 15:29:47 +08:00
imccyu
245aeb414c feat(web): workspace header hover card with cwd and creation time 2026-07-30 15:29:12 +08:00
imccyu
4c33ca8bec fix: hero layout when no-workspace 2026-07-30 15:25:50 +08:00
imccyu
6ea1238714 docs(web): the composer bar is one session-maybe slot, not a swapped pair
fix(web): keep one composer bar DOM across the no-workspace transition

The composer.bar slot moves from session to session-maybe scope: with no
current session the entry still mounts, the machine faces (keyboard, stop,
command) arrive undefined, and the bar renders its normal DOM inert via the
disabled owner prop. DisabledInputBar and its parallel tree are gone, so the
textarea node survives the cold-start workspace pick instead of flashing
through a remount. A blank session whose workspace was deleted takes the
same inert path through owner props.

test(web): add the composer DOM-continuity acceptance probe

Drives a real dsh web server with headless chromium through the cold-start
-> pick-workspace -> type flow and asserts the composer textarea is the
same DOM node throughout (a marker property must survive). Rerun
prerequisites are in the header comment.

docs(web): session-maybe identity is adoption, not hold-forever

fix(web): session-maybe entries adopt the first session, then remount like strict entries

A session-maybe entry used to keep one React instance across every
transition, so component-local state leaked between sessions once the
composer bar moved to that scope (PermissionSelect's optimistic pick, the
IME composition guard). Identity is now adoption: an incarnation born
session-less holds through the arrival of the first session (the blank
shell's DOM survives the workspace pick), and afterwards behaves exactly
like a strict session entry — a switch or a drop to no-session remounts,
clearing local state by construction. The child key is an incarnation
counter kept in the stable outlet wrapper via render-phase setState.

chore: knip knows the root acceptance probe's playwright dependency

scripts/hero-composer-dom-continuity.mjs resolves playwright through
apps/web's devDependency tree (createRequire), which knip cannot follow;
ignore it at the root workspace.
2026-07-30 15:18:06 +08:00
imccyu
6c7520c652 Merge remote-tracking branch 'origin/master' into mergebot/pr883
# Conflicts:
#	apps/web/tests/snapshots/question-composer/answered.expected.md
#	apps/web/tests/snapshots/question-composer/ui.expected.md
2026-07-30 15:04:59 +08:00
imccyu
03936cb320 Merge remote-tracking branch 'origin/master' into mergebot/pr883
# Conflicts:
#	packages/client/ui-question/package.json
#	packages/client/ui-question/src/client/QuestionComposer.tsx
#	packages/client/ui-question/src/client/contract/slots.ts
#	packages/client/ui-question/src/client/index.ts
#	packages/client/ui-question/src/client/locales.ts
#	packages/client/ui-question/tests/browser-plugin.spec.ts
#	packages/client/ui-question/tests/question-composer.spec.tsx
2026-07-30 15:01:10 +08:00
Turtle
39efc3dd73 Merge remote-tracking branch 'origin/master' into feature/shared-cli-config-foundation
# Conflicts:
#	.agents/notes/implemented/testing/2026-07-24-web-gui-browser-e2e-lane.i18n.yaml
#	docs/testing.i18n.yaml
2026-07-30 15:00:42 +08:00
Turtle
36f6d8fd05 Merge remote-tracking branch 'origin/master' into feature/shared-cli-config-foundation
# Conflicts:
#	packages/ui/tui/README.i18n.yaml
2026-07-30 14:58:10 +08:00
imccyu
5c2fc03d8f Merge branch 'master' into codex/details-default-closed 2026-07-30 14:50:50 +08:00
_Kerman
df25ca41dc Merge remote-tracking branch 'github/master' into xtr/fix-trajectory-scroll-layering 2026-07-30 14:45:16 +08:00
_Kerman
c0b8fea4c8 fix(ui): contain trajectory scrolling and overlays 2026-07-30 14:45:07 +08:00
kingwl
4ef3e60d57 fix(web): keep details closed by default 2026-07-30 14:42:39 +08:00
imccyu
ac37caa1ee Merge branch 'master' into worktree-fetest 2026-07-30 14:31:44 +08:00
imccyu
4869e0bbfc Merge branch 'master' into worktree-fetest 2026-07-30 13:09:53 +08:00
imccyu
1b84126f70 Merge branch 'master' into worktree/short-default-labels 2026-07-30 13:08:34 +08:00
imccyu
432a64ef2f Merge branch 'master' into worktree/short-default-labels 2026-07-30 12:56:11 +08:00
Turtle
5a490553bc Merge remote-tracking branch 'origin/master' into feature/shared-cli-config-foundation
# Conflicts:
#	docs/event-producer-consumer.md
#	packages/host/apiproxy/README.i18n.yaml
#	tsconfig.base.json
2026-07-30 12:00:15 +08:00
imccyu
6e99027917 Merge remote-tracking branch 'origin/master' into mergebot/pr937
# Conflicts:
#	packages/client/ui-conversation/README.i18n.yaml
#	packages/client/ui-conversation/src/client/queue/QueueDock.module.css
2026-07-30 11:59:59 +08:00
imccyu
b523a04af8 Merge remote-tracking branch 'origin/master' into worktree-fetest 2026-07-30 11:51:09 +08:00
imccyu
02a9d4113e Merge remote-tracking branch 'origin/master' into worktree-fetest 2026-07-30 11:40:34 +08:00
kingwl
ad1bb84425 Merge remote-tracking branch 'origin/master' into codex/web-queue-actions
# Conflicts:
#	packages/client/ui-conversation/README.i18n.yaml
2026-07-30 11:38:54 +08:00
imccyu
aae1b48535 Merge remote-tracking branch 'origin/master' into worktree-fetest 2026-07-30 11:17:03 +08:00
imccyu
6303b22487 ci: run web replay on master linux 2026-07-30 11:16:37 +08:00
07akioni
b92c6bcc66 Merge branch 'master' into fix/ui-action-display 2026-07-30 11:15:35 +08:00
imccyu
60620ec36c Green the jsdom lane for the composer-seat ResizeObserver and new StatsLine format
The seat's height publisher needs a ResizeObserver stub in every spec that
renders ConversationRoot (jsdom has none), and the two branch-tail StatsLine
assertions move to the grouped detail-row output.
2026-07-30 11:09:03 +08:00
imccyu
b94df7348f Merge branch 'master' into codex/web-queue-actions 2026-07-30 10:50:34 +08:00
Yichen Jiang
fb4b8f3973 Merge remote-tracking branch 'origin/master' into worktree/short-default-labels
# Conflicts:
#	packages/client/ui-model/src/client/ModelSelect.tsx
#	packages/client/ui-model/tests/model-select.spec.tsx
2026-07-30 10:47:35 +08:00
imccyu
4b4f7752c1 ci: gate web browser snapshots 2026-07-30 10:23:05 +08:00
Yif
04f6dfdc29 Web composer stats detail row and input-zone polish
Stats line moves into the InputBar's new footer slot (sharing the card's
width column) and expands to the design's grouped detail row: turns/steps,
LLM and tool wall time, cache hit, and input/output token split, all
derived client-side from the snapshot. The composer stack owns one 8px
rhythm, the seat fades the transcript through a fixed 36px gradient band,
back-to-bottom follows a live --dsh-composer-height, and goal/todo strips
share one 752px tip-fill column.
2026-07-30 10:22:44 +08:00