Commit Graph

6465 Commits

Author SHA1 Message Date
imccyu
75b32f7d76 Merge pull request #821 from deepseek-harness/feat/workspace-directory-browser
feat(host,client): ship the in-app directory browser as the browse package's client half
2026-07-29 10:58:12 +08:00
imccyu
540639672d Merge branch 'master' into feat/workspace-directory-browser 2026-07-29 10:54:08 +08:00
imccyu
a51c9510f1 Merge branch 'feat/directory-picker' into feat/workspace-directory-browser 2026-07-29 10:51:31 +08:00
imccyu
e8dcc888d5 Merge pull request #817 from deepseek-harness/feat/directory-picker
feat(host,client): directory-picker capability seam with dual-face native backend
2026-07-29 10:51:21 +08:00
imccyu
ffe65dd3b2 Merge branch 'master' into feat/directory-picker 2026-07-29 10:47:48 +08:00
imccyu
19a9cfe035 Merge pull request #814 from deepseek-harness/doc/host-client-group-readmes
fix(connection): browser-trust fence for /api + host/client group docs
2026-07-29 10:46:17 +08:00
imccyu
8d0249d392 Merge branch 'feat/directory-picker' into feat/workspace-directory-browser 2026-07-29 10:42:19 +08:00
imccyu
ecc447daf5 Merge branch 'doc/host-client-group-readmes' into feat/directory-picker 2026-07-29 10:42:13 +08:00
imccyu
fa64ad39cb Merge branch 'master' into doc/host-client-group-readmes 2026-07-29 10:42:00 +08:00
Tianyi Cui
92e310a6ff Merge pull request #871 from deepseek-harness/feature/tui-improvements-standalone
feat(tui)!: consolidate terminal UI improvements
2026-07-29 10:40:24 +08:00
Turtle
7a3295e0bf docs: consolidate TUI Agent Notes 2026-07-29 10:30:27 +08:00
Turtle
c7e6cb5753 fix(tui): complete launcher integration and rationale 2026-07-29 10:25:07 +08:00
Turtle
efb67365d3 test(tui): update assembled terminal snapshots 2026-07-29 10:03:38 +08:00
Turtle
d0548e0ac9 docs: regenerate TUI catalogs 2026-07-29 10:01:39 +08:00
Turtle
31cb340c36 feat(tui)!: consolidate terminal UI improvements 2026-07-29 10:00:29 +08:00
creatixchu
9a5fe52678 Merge remote-tracking branch 'origin/feat/directory-picker' into feat/workspace-directory-browser 2026-07-29 06:45:12 +08:00
creatixchu
c5ae7dd65e Merge remote-tracking branch 'origin/doc/host-client-group-readmes' into feat/directory-picker
# Conflicts:
#	packages/host/apiproxy/package.json
#	pnpm-lock.yaml
2026-07-29 06:43:09 +08:00
creatixchu
1779488c99 Merge remote-tracking branch 'origin/master' into doc/host-client-group-readmes 2026-07-29 06:40:26 +08:00
creatixchu
d80fca0db8 fix(client): forward the abort signal through the workspaces test double
TestWorkspaces.listDirectory now records the signal and passes it to the
installed stub, mirroring the production face, so cancellation
integration tests can observe or reject on a superseded scan instead of
the harness silently dropping it.
2026-07-29 06:31:18 +08:00
creatixchu
53240f4664 fix(host,client): abort superseded listings on the wire; keep the native swap resolvable
Supersession (newer navigation, path editing, closing, unmount) now
aborts the in-flight listing's request instead of only discarding its
result: the browser mints an AbortController per listing, the signal
rides the workspace face (IWorkspaces.listDirectory gains an optional
signal) onto the fetch carrier, and the Host scan stops with it (817's
cancellation chain). apps/cli keeps both picker packages as dependencies
so the documented one-row cordis.yml swap to the native backend resolves
at boot.
2026-07-29 06:19:18 +08:00
creatixchu
463893947b fix(host): create folders with the entered name untrimmed
Same contract as the path editor: trim only rejects an all-whitespace
draft, and the Host receives the original spelling — the backend accepts
any non-blank single segment verbatim, so trimming here would create and
select a different sibling.
2026-07-29 05:59:51 +08:00
creatixchu
723bb9057c fix(host): pass the entered path to the Host untrimmed
Trim now only detects a blank draft; the original text navigates — a
real directory name may end in whitespace, and trimming would list its
sibling or adopt the wrong workspace.
2026-07-29 05:49:18 +08:00
creatixchu
fd7f081ff1 Merge remote-tracking branch 'origin/feat/directory-picker' into feat/workspace-directory-browser
# Conflicts:
#	.agents/notes/implemented/architecture/2026-07-28-directory-picker-capability-seam.i18n.yaml
2026-07-29 05:32:53 +08:00
creatixchu
7d07ab0c9d fix(host): abandon close behind a stalled read; race symlink probes; observe cleanup failures
The aborted exit no longer awaits close (Node queues it behind any
in-flight read, chaining the departed caller back onto the very stall
the abort escaped) — the abandoned close's failure is swallowed, it has
no consumer. Symlink stat probes race the signal too, with a
per-candidate abort check between probes, so a stalled probe target
cannot keep a departed request alive. The deferred handle cleanup after
a lost opendir race now consumes its own close failure instead of
leaking it as an unhandled rejection.
2026-07-29 05:32:12 +08:00
creatixchu
e89ae129d7 fix(host): wrap the dialog footer on narrow viewports
The confirm/cancel pair wraps onto its own row when the viewport-clamped
card is too narrow for the whole footer, so Open stays visible instead
of clipping past the card's hidden overflow.
2026-07-29 05:16:11 +08:00
creatixchu
c920b68f90 Merge remote-tracking branch 'origin/feat/directory-picker' into feat/workspace-directory-browser 2026-07-29 05:06:01 +08:00
creatixchu
baaa535235 fix(host): race directory reads against the caller's signal; report aborts as cancelled
Every filesystem await in the browse scan (opendir and each read) now
races the signal through raceAbort, so a stalled network open/read stops
with a departed caller and an already-aborted request rejects even for
an empty level; the abandoned settlement is swallowed and an abandoned
open that still mints a handle is closed, never leaked. apiproxy maps an
aborted listing to the cancelled wire code, matching pickDirectory and
command.execute, instead of reporting a false internal failure. The
fixture spec call sites gain the wire signal argument the previous
commit's static lane flagged.
2026-07-29 05:05:36 +08:00
creatixchu
1a9b84b19e fix(host): restart home on early-edit cancel; clamp the dialog to short viewports
Escape canceling a path edit opened before any level listed relaunches
the home listing instead of stranding a blank picker (the editor had
superseded the initial request while parent was still null). The card's
height clamps to the viewport (min(420px, 100dvh - 32px)); header and
footer are flex-none and the columns scroll, so Open/Cancel stay
reachable on landscape phones and short embedded windows.
2026-07-29 04:46:49 +08:00
creatixchu
48141b0007 Merge remote-tracking branch 'origin/feat/directory-picker' into feat/workspace-directory-browser
# Conflicts:
#	.agents/notes/implemented/architecture/2026-07-28-directory-picker-capability-seam.i18n.yaml
#	packages/host/directory-picker-browse/README.i18n.yaml
2026-07-29 04:42:57 +08:00
creatixchu
7503390590 fix(host): cancellable listing scans and O(log window) insertion
capability.list gains an optional AbortSignal threaded from the RPC
carrier's request signal (the pickDirectory pattern): a disconnected or
timed-out caller stops the opendir loop instead of the scan outliving
its caller, and the abort surfaces as its own reason rather than a
directory-unreadable dressing. boundedInsert rejects a full window's
at-or-beyond-tail candidate on one comparison and binary-inserts
retained candidates, so an oversized level no longer pays a window scan
per dirent.
2026-07-29 04:42:13 +08:00
creatixchu
deb37b8edf Merge remote-tracking branch 'origin/feat/directory-picker' into feat/workspace-directory-browser
# Conflicts:
#	.agents/notes/implemented/architecture/2026-07-28-directory-picker-capability-seam.i18n.yaml
#	packages/host/directory-picker-browse/README.i18n.yaml
#	packages/host/directory-picker-browse/package.json
#	pnpm-lock.yaml
2026-07-29 04:12:44 +08:00
creatixchu
da970ea269 fix(host,client): stream bounded listings, declare schemastery, guard Choose again
The browse level now streams through opendir into a name-sorted window of
maxEntries + 1 candidates (boundedInsert), so memory stays O(maxEntries)
no matter how many children a directory holds and enterability probing
touches only windowed candidates; a windowed broken symlink is not
backfilled since the eviction already marks the level truncated.
schemastery joins the package's runtime dependencies (the source launcher
and isolated installs failed to resolve the value import). The
folder-error dialog's Choose again goes inert while the flow hole is
empty, and the withdrawal effect also keys on the open transition, so a
flow can never open over a hole nobody serves.
2026-07-29 04:11:41 +08:00
creatixchu
7b80b8ce60 fix(host): keep the child pane reachable on narrow viewports; surface truncated levels
The Miller row now scrolls horizontally with the child pane pinned into
view when its preview lands, so descent stays reachable when the dialog
is narrower than two fixed panes. The dialog also says when a visible
level was cut at the backend's complete-result bound (817's maxEntries)
instead of letting the tail of a huge directory go silently missing.
2026-07-29 03:53:48 +08:00
creatixchu
02c142e536 Merge remote-tracking branch 'origin/feat/directory-picker' into feat/workspace-directory-browser
# Conflicts:
#	.agents/notes/implemented/architecture/2026-07-28-directory-picker-capability-seam.i18n.yaml
#	packages/host/directory-picker-browse/README.i18n.yaml
2026-07-29 03:46:15 +08:00
creatixchu
5245182db2 fix(host): bound listDirectory levels at a configurable maxEntries
One list call now materializes at most maxEntries child rows (config,
default 1000 - GitHub's web-UI directory-listing bound). Candidates sort
before probing so a cut level keeps the name-sorted head and symlink
probing stops with the bound, and DirectoryListing carries a required
truncated flag on the seam and the wire so clients can state
incompleteness instead of silently missing tail entries.
2026-07-29 03:45:26 +08:00
imccyu
1f242753ec Merge pull request #590 from deepseek-harness/codex/web-plan-mode
feat(web): add plan mode controls
2026-07-29 03:27:28 +08:00
creatixchu
905b4555a3 fix(host): escape cancels a launched navigation; browse joins deferGroupRegistration
- Escape in the path editor now supersedes a navigation the editor already
  launched (request-sequence bump + loading reset), so a late success cannot
  jump to the cancelled path; the single-pane fallback keeps covering a
  superseded selection preview (ds-review-bot).
- The browse flow's pair registration rides ui-slots' new
  deferGroupRegistration (one occupant, both holes, as a unit — construction
  or late rival conflicts roll back wholesale and fail loud), mirroring
  -native and deleting the would-be clone.
2026-07-29 03:20:24 +08:00
creatixchu
4208676278 Merge remote-tracking branch 'origin/feat/directory-picker' into feat/workspace-directory-browser 2026-07-29 03:17:30 +08:00
creatixchu
f56b9149e6 refactor(client): deferGroupRegistration owns the multi-hole flow semantics
The construction-rollback + late-conflict-rollback + loud-rethrow block was
about to be a verbatim clone across the two flow packages; ui-slots now owns
it as deferGroupRegistration (one occupant, several holes, as a unit), with
direct specs for all three arms, and the native flow consumes it.
2026-07-29 03:17:01 +08:00
creatixchu
f57f871a50 Merge remote-tracking branch 'origin/feat/directory-picker' into feat/workspace-directory-browser 2026-07-29 03:09:27 +08:00
creatixchu
62db16f81a test(host): cover the non-Error late-conflict wrap 2026-07-29 03:08:40 +08:00
imccyu
a447e26272 fix: test 2026-07-29 03:07:06 +08:00
creatixchu
9f37ca2709 fix(client,host): late duplicate-provider conflicts roll back wholesale and fail loud
Holes declared after two flow providers activated left the loser throwing
out of the slot flush with partial occupancy. deferRegistration gains an
onFailure channel (late failures unsubscribe, then hand over instead of
throwing through the flush); the native flow's pair rolls back wholesale
and re-raises on the global channel the boot's fail-loud handler owns.
Duplicate rows of the SAME package stay silently idempotent (the component
identity guard skips an occupied hole).
2026-07-29 03:06:34 +08:00
imccyu
64742d3d30 fix: remove machine busy loading test 2026-07-29 03:01:34 +08:00
creatixchu
d68a58f6a4 refactor(host): browse flow off the ./client surface (export discipline)
BrowseDirectoryFlow and its injected face move to the package-internal
src/client/flow.ts, mirroring -native: ./client exports only the Loader
surface and the same-package spec imports the internal module directly.
2026-07-29 02:56:38 +08:00
creatixchu
882e16fdf0 Merge remote-tracking branch 'origin/feat/directory-picker' into feat/workspace-directory-browser
# Conflicts:
#	apps/cli/cordis.yml
2026-07-29 02:53:19 +08:00
creatixchu
a9b8fa2585 fix(client,host): review round — hooks-compartment occupancy, StrictMode re-arm, internal flow module, honest swap comment
- Directory-flow occupancy moves onto the inject face's reserved hooks
  compartment: apply publishes a stable observable per surface and the
  renderer binds useDirectoryFlow — no hand-rolled component subscriptions
  (the client contract's channel for registrant-private reactive facts).
- The native flow's alive guard re-arms in effect setup: StrictMode's
  development replay ran the cleanup once and every later outcome was
  discarded.
- NativeDirectoryFlow moves to a package-internal module; ./client exports
  only the Loader surface, tests import the internal module directly.
- The composition swap comment no longer advertises -browse as a complete
  swap before its dialog lands (stacked follow-up).
2026-07-29 02:50:45 +08:00
imccyu
9f7919d894 fix: remove machine busy loading 2026-07-29 02:40:29 +08:00
creatixchu
7425a87025 Merge remote-tracking branch 'origin/feat/directory-picker' into feat/workspace-directory-browser 2026-07-29 02:36:47 +08:00
creatixchu
7114cc7475 fix(client): flow occupancy is a subscribed source; an unloading occupant withdraws the open flow
hasDirectoryFlow was a plain per-render read: a flow plugin unloading (HMR)
while its dialog was open left flowOpen stuck with nobody to cancel,
permanently disabling the workspace actions. Occupancy now rides
useSyncExternalStore over the hole's registration subscription, and an
empty hole withdraws an active flow; the menu entry also reacts to
activation without a reopen (ds-review-bot).
2026-07-29 02:36:08 +08:00