Commit graph

14575 commits

Author SHA1 Message Date
imccyu
8b4b815e7e Merge pull request #3384 from deepseek-harness/worktree-connerr
fix(connection): avoid disconnecting during host stalls
2026-08-31 22:43:12 +08:00
imccyu
8372c3e188 Merge pull request #3383 from deepseek-harness/worktree-shikiperf
perf(ui-primitives): defer offscreen syntax highlighting
2026-08-31 22:41:45 +08:00
imccyu
ddecdf6b33 test(web): wait for settled background job 2026-08-31 22:30:51 +08:00
imccyu
49bf26a794 fix(connection): tolerate stalled hosts 2026-08-31 22:17:39 +08:00
imccyu
07be260245 test(ui-primitives): cover lazy viewport highlighting 2026-08-31 22:11:39 +08:00
imccyu
faa61ada74 perf(ui-primitives): defer offscreen syntax highlighting 2026-08-31 21:58:22 +08:00
imccyu
94bbfb95e8 Merge pull request #3379 from deepseek-harness/schedule-catalog-left-alignment
fix(web): align Schedule catalog within viewport
2026-08-31 20:53:40 +08:00
imccyu
76557f4899 Merge pull request #3328 from deepseek-harness/worktree/navbar-pagination-interaction-24d006
feat(web): navigate every session turn from the chat rail
2026-08-31 20:45:45 +08:00
imccyu
9ba9a35c72 test(session-projection): cover view transition matrix 2026-08-31 20:30:43 +08:00
imccyu
6f0daff1dd fix(session-projection): compare observed live views 2026-08-31 19:59:54 +08:00
Yichen Jiang
12bef3b577 perf(session-projection): memoize raw views by state identity
Review follow-up: the per-step gate recomputed view(previous) on every
changed apply — a property read for identity-stable views, but a fresh
throwaway object per change for computing views. The registry now keeps a
WeakMap from state object to raw view: the previous state's view was
cached when that state was current, so each distinct state's view computes
exactly once (gate and snapshot share the memo) and the quiet path
allocates nothing. Unlike the earlier lastView record, an entry is keyed
by the state itself — the view of that exact state by the pure-view
contract — so no stamping discipline exists to get wrong. Primitive
states bypass the WeakMap and compute directly.
2026-08-31 19:46:56 +08:00
Yichen Jiang
a2437db180 revert(session-projection): drop the viewKey token, keep the per-step raw-view gate
Review consensus: for the only declaring unit the token function was
literally the view function, so the extra wire member bought nothing —
default raw-view comparison produces the identical Object.is on
state.turns at the identical cost (one property read per side). The
per-step gate stays: it holds the no-stored-baseline property, and its
measured overhead (~ns per changed state) is four orders of magnitude
below the push path it guards.
2026-08-31 19:46:56 +08:00
Yichen Jiang
f2e4078d8c docs(session-projection): carry viewKey through the subsystem type fences 2026-08-31 19:46:56 +08:00
Yichen Jiang
9836fdbbd7 docs(session-projection): describe the change feed by its viewKey token 2026-08-31 19:46:56 +08:00
Yichen Jiang
acc23f6d9c feat(session-projection): unit-declared viewKey change token
Review follow-up (imccyu): comparing view(previous) recomputes the view on
every quiet change. The wire block now takes an optional viewKey(state)
declaring the cheap comparison token; the drive compares tokens across the
previous and next states and calls view only for an actual push. Default
stays the raw view output. turnOutline declares viewKey: state => state.turns,
making the identity-stable-turns convention an explicit contract; the
registration erasure forwards viewKey (dropping it silently reverted the
gate to the fallback, caught by the new view-call-counting test).
2026-08-31 19:46:55 +08:00
Yichen Jiang
9069a8b6f8 refactor(session-projection): compare per-step views instead of storing a dedup baseline
Review suggestion (imccyu): the drive holds both the previous and next
state, so the identity gate can compute view(previous) and view(next) in
the driving step and compare them directly. The stored lastView cell field
and its stamp-on-every-change rule are deleted; with no dedup memory,
nothing can go stale across listener generations by construction, and a
rebuilt cell no longer pushes an unchanged view on its first live event.
Costs one extra pure view() call per changed state.
2026-08-31 19:46:55 +08:00
Yichen Jiang
e71db15d1a chore(release): align session-turn-outline with root 0.1.2-alpha.2, mark mirrored preview clone
The dsh 0.1.2-alpha.2 release bumped every workspace after this branch
forked, so the new package failed the workspace version constraint in the
merge tree. The bounded preview() also grew identical enough to its
deliberate host/client mirror to trip clone detection; the client copy now
carries a jscpd ignore region naming the wire-boundary rationale.
2026-08-31 19:46:55 +08:00
Yichen Jiang
b7053eba79 refactor(session-turn-outline): bound oversized preview blocks, degrade malformed previews
preview() now slices a single text block to limit * 2 before joining and
normalizing, so one multi-megabyte block no longer pays a full-string pass;
the host projection and the client turn-navigation helper stay mirrored.
outlineEntry keeps dropping entries with damaged turn/seq (marks cannot
exist or jump without them) but degrades malformed prompt/response
previews to empty strings so the turn stays navigable.
2026-08-31 19:46:55 +08:00
Yichen Jiang
8322f804cb fix(session-projection): advance the view dedup baseline on every change
The change feed stamped lastView only when a listener was subscribed, so a
value change during a listener-free window (HMR swap) froze the baseline
and a later transition back to the old value was silently deduplicated.
The baseline now advances on every changed state, heard or not; broadcast
still only happens with listeners. Docs, catalog, and the feature note
follow the corrected semantics.
2026-08-31 19:46:55 +08:00
Yichen Jiang
39b90961c7 fix(ui-chat): hold jumps while a plain pull owns the pager
A jump clicked while the Load-earlier pull was in flight fell through the
settle effect's nearest-turn fallback and landed on the wrong row. The
effect now keeps the pending jump (busy pulse stays) while loadingOlder is
true and a retry tick re-issues loadThrough when the pull settles.

Also repins the long-interactions e2e rail block to the outline-rail
semantics (fixed mark pitch, load-and-jump labels) and covers the
loadThrough forwarding paths in apply-inject and the client-runtime stub.
2026-08-31 19:46:55 +08:00
Yichen Jiang
db5417ff6f fix(session-controller): keep refused jumps from parking a stale target
loadThrough now assigns its low-water target only when it owns the loop
(retargeting stays inside the running-jump branch): a call refused while
a plain load-earlier pull holds the pager no longer leaves jumpTargetSeq
behind to drag a later jump all the way to the head. The loop also
carries the doOpen stale-pass guard so a mid-flight resync stops it
instead of paging the new stream generation toward the old target.
2026-08-31 19:46:55 +08:00
Yichen Jiang
7c58a95ebb test(session-turn-outline): cover fold edges and deflake settle assertion
Edge-branch coverage for the preview reading bound, repeated and empty
drafts, draftless turn ends, orphan-draft clearing, and same-response
recommits (the CI per-file gate exercises them); the jump-settle spec
now asserts only the busy lifecycle after settlement — jsdom's zero
geometry made the rAF active-turn resync timing-dependent under
coverage instrumentation, and the landing position contract lives in
the browser e2e.
2026-08-31 19:46:55 +08:00
Yichen Jiang
0e63841189 feat(session-turn-outline): settled-response previews at card budgets
Outline entries gain the turn's final text-bearing assistant preview:
each assistant message overwrites a state draft and turn/end commits
the survivor, matching the loaded rail's findLast semantic; the bare-
array wire keeps its identity across draft changes, so pushes stay at
three per turn. Preview budgets shrink to the rail card's clamps — one
50-character prompt line, up to three 120-character response lines,
ellipsis on clip — on loaded and unloaded turns alike (stateVersion 2
discards v1 cache rows).
2026-08-31 19:46:55 +08:00
Yichen Jiang
ceadd90e71 feat(session-projection): identity-gated change feed
The feed previously fired on every changed state reference of a
client-visible unit; it now also compares the raw view output against
the last delivered one and stays quiet when Object.is-identical, so a
unit can buffer working fields in state behind an identity-stable
projection. Units whose views build fresh objects per call are
unaffected.
2026-08-31 19:46:54 +08:00
Yichen Jiang
62f707bb1d fix(ui-chat): release bottom ownership when a jump starts
Clicking an unloaded rail mark from the pinned tail raced the pinned
scroll snap: the first prepend's compensation fires a non-reader scroll
delivery, the snap called toBottom, and toBottom cancels a pending jump
— so the jump silently stayed at the tail while history loaded. The
click now drops atBottom itself (jumping into history is leaving the
live tail), pinned by a jsdom regression and re-verified live: a
118-turn session lands on turn 1 in ~250ms from click.
2026-08-31 19:46:54 +08:00
Yichen Jiang
422b603874 docs: turn outline rail contracts and agent note
READMEs record the rail's outline merge and the loadThrough paging
verb in both languages; the feature Agent Note owns the decision,
alternatives (sparse windows, minSeq wire bound, outline RPC, height
estimation), and coverage map. Regenerates the client/API catalogs the
widened faces feed.
2026-08-31 19:46:54 +08:00
Yichen Jiang
3a834fe6c9 feat(ui-chat): settle jump landings after paging completes
A mid-paging landing keeps the jump armed with the target row as its
paging anchor, so later chunks and the load-earlier button's unmount
cannot drift the landing; the loader's completion runs one final
correction unless the reader already scrolled off the target. Adds the
browser contract: full outline ladder, keyboard jump on an unloaded
mark, landing geometry, and rail fades.
2026-08-31 19:46:53 +08:00
Yichen Jiang
6af1ee49b1 feat(ui-chat): scrollable fixed-pitch turn rail
Marks keep a fixed 10px pitch instead of compressing into the frame:
overflow scrolls inside a hidden-scrollbar scroller with gradient fades
over each still-scrollable end, the preview compensates the rail scroll,
and the active mark keeps itself centred while the pointer is off the
rail. Pointer-to-mark mapping now works in ladder coordinates.
2026-08-31 19:46:53 +08:00
Yichen Jiang
b3064cca77 feat(ui-chat): full-session turn rail with load-and-jump
The rail now merges the turnOutline projection with loaded-window items
(view-layer only; loaded wins, outline fills mid-turn prompt previews),
renders unloaded turns as dimmer marks, and clicking one holds the
reader's place, pages history through the turn's seq, and lands on its
row after the commit — no height estimation. Settlement repages once
per head movement, then falls back to the nearest rendered turn.
2026-08-31 19:46:53 +08:00
Yichen Jiang
218bb7f645 feat(session-controller): loadThrough deep history paging
Session.loadThrough(seq) loops the existing prepend pager (200-message
pages) until the window covers the target seq, with a shared low-water
retarget for repeated calls, a no-progress guard against empty pages
still claiming history, and loadOlder's fail-soft error posture. Busy
state rides the existing loadingOlder snapshot bit.
2026-08-31 19:46:53 +08:00
Yichen Jiang
7e2eacb1fe feat(session-turn-outline): whole-log turn outline projection
New turnOutline projection unit serving every started turn's number,
turn/start seq, and bounded first-prompt preview through the
session-projection seam, mounted in the web-app bundle for the chat
turn rail. Entries stay strictly increasing; previews mirror the rail's
loaded-turn preview budget.
2026-08-31 19:46:53 +08:00
pku-xht
faa977fb29 fix(web): align Schedule catalog within viewport 2026-08-31 18:59:28 +08:00
imccyu
eca3bda903 Merge pull request #3374 from deepseek-harness/hl-perf
fix(web): make streaming code fences incremental
2026-08-31 18:49:03 +08:00
07akioni
d8e2ac5052 fix(web): retain completed streaming fence lines 2026-08-31 18:11:32 +08:00
Ziya
2480bdf27a feat(web): clarify Workspace Write Chinese label (#3345)
Co-authored-by: ZiyaZhang <199893125+ZiyaZhang@users.noreply.github.com>
2026-08-31 09:42:16 +00:00
07akioni
1dd3e60f50 fix(web): make streaming code fences incremental 2026-08-31 17:26:04 +08:00
Turtle
713ae6c29b Merge pull request #3360 from deepseek-harness/turtle/pr-open-start-date
feat(issue-management): initialize Issue start dates on PR open
2026-08-31 16:48:47 +08:00
imccyu
60a46b9f5d Merge pull request #3331 from deepseek-harness/worktree-chatctxmemory
perf(web): reduce retained conversation state
2026-08-31 16:41:11 +08:00
Chinesezjc
8fb9bc29e9 Merge branch 'master' into turtle/pr-open-start-date 2026-08-31 16:27:41 +08:00
Chinesezjc
c5a94f11df Merge pull request #3354 from deepseek-harness/fix/windows-coverage-flaky-test-budgets
test: stabilize the Windows coverage lane against timing flakes
2026-08-31 16:11:55 +08:00
Chinesezjc
8ace43a8b1 Merge pull request #3364 from deepseek-harness/fix/notices-serial-windows-timeout
fix(ci): serial-windows notices timeout and generator store-scan cost
2026-08-31 16:10:47 +08:00
Chinesezjc
4f877cdab1 Merge branch 'master' into fix/notices-serial-windows-timeout 2026-08-31 15:55:59 +08:00
imccyu
d7abd0a01e fix(web): activate selected view for blank sessions
fix(web): activate selected views before blank gating
2026-08-31 15:45:26 +08:00
Chinesezjc
a00c9a062c Merge branch 'master' into fix/windows-coverage-flaky-test-budgets 2026-08-31 15:45:19 +08:00
imccyu
4b21065dbe refactor(client): share conversation context initialization 2026-08-31 15:44:23 +08:00
imccyu
4203317e18 perf(client): materialize conversation targets on demand 2026-08-31 15:44:23 +08:00
imccyu
354bf44923 fix: ci 2026-08-31 15:44:23 +08:00
imccyu
b4527bedc7 fix(client): pin inbox claim semantics 2026-08-31 15:44:22 +08:00
imccyu
61da6fbbe5 perf(web): defer tool body formatting until expansion 2026-08-31 15:44:22 +08:00
imccyu
8478de9b0e perf(client): linearize inbox projection state 2026-08-31 15:44:22 +08:00