Commit Graph

3980 Commits

Author SHA1 Message Date
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
imccyu
d4ba2ecd63 Merge origin/master: goal domain lands beside plan
Union resolutions throughout — the fixture serves both the goal and plan
projection units (catalog gains /goal beside /plan; the retired
goal-fixture sample command yields to the real goal mirror), the mux
baseline spec expects all four unit frames, and the tsconfig paths /
Model Experience allowlist carry both domains' outlets.
2026-07-29 02:27:16 +08:00
creatixchu
f654f55eca Merge remote-tracking branch 'origin/feat/directory-picker' into feat/workspace-directory-browser 2026-07-29 02:25:06 +08:00
creatixchu
3f23347d10 fix(host): the native flow discards chooser settlements after unmount
An HMR replacement left the old instance's pick promise able to adopt a
second path through the shared owner callbacks; settlements now check a
component-lifetime ref (an injected-face identity change alone keeps the
pending settlement — the host-side dialog is unchanged, and the wire has no
per-request abort). Both settlement arms covered (ds-review-bot).
2026-07-29 02:24:27 +08:00
creatixchu
b5a809d38e fix(host): opening the path editor supersedes a pending listing
A navigation settling between the Edit-Path click and the first keystroke
executed navigate's draft reset and closed the editor underneath the user;
the click now bumps the request sequence like draft edits do
(ds-review-bot).
2026-07-29 02:08:33 +08:00
imccyu
baf8238462 Merge remote-tracking branch 'origin/master' into goal-ui-merge-master 2026-07-29 01:56:44 +08:00
imccyu
d34629d1aa fix: lint 2026-07-29 01:56:32 +08:00
creatixchu
15a4b512e9 Merge remote-tracking branch 'origin/feat/directory-picker' into feat/workspace-directory-browser 2026-07-29 01:50:30 +08:00
creatixchu
663ac4b50b fix(client): deferRegistration rolls its subscription back when construction throws
The immediate registration attempt runs after the subscription is
installed; a synchronous failure (declared slot already occupied) escaped
the constructor without returning a handle, leaving a subscription owned by
nothing — later ledger flushes would fire it against a failed fiber.
Construction failure now unsubscribes before rethrowing, with a dedicated
deferred.spec covering both arms (ds-review-bot on the flow registrations;
the effect-level rollback in the flow packages keeps covering earlier
successfully-constructed deferrals).
2026-07-29 01:49:58 +08:00
imccyu
a40e0978da style: fix fixture indentation from the master merge 2026-07-29 01:41:44 +08:00
imccyu
0477f33079 feat(fixture): mirror the goal domain — /goal command, six verbs, projection unit
The keyless fixture now carries the goal chain end to end, mirroring the
host: /goal enters the command catalog and its execute path brackets a
goal/change create with the command lifecycle pair; the six mutation verbs
CAS-check the projected current goal and append whole-value changes (the
shared append path broadcasts the session event and the goal projection
frame); the tail-page projections block and the mux-open baseline always
carry the goal key (null before create / after clear). Connection specs
follow: the lifecycle round-trip replaces the not-implemented stubs, and
the mux baseline expects the third unit frame.

Also: GoalBar inline errors use ASCII parens around the code (review
feedback on #842).
2026-07-29 01:40:23 +08:00
creatixchu
761ceb79f3 fix(host,client): roll back partial flow registrations; cover the widened double
- The browse client half mirrors -native's rollback: a pair construction
  that throws halfway (declared-but-occupied second hole) disposes the
  earlier deferral before rethrowing, so no orphaned slot subscription
  outlives the failed fiber (ds-review-bot).
- The TestWorkspaces browse methods gain the coverage CI's per-file gate
  requires (defaults + stub overrides, recorded like their siblings).
2026-07-29 01:33:16 +08:00
imccyu
250d90d481 docs: regenerate cordis catalogs after the master merge
The merge auto-combined both sides' generated text, landing the catalogs
behind the open-turn set() JSDoc; regenerated from the merged sources.
2026-07-29 01:30:58 +08:00
creatixchu
38b5cb9b25 Merge remote-tracking branch 'origin/feat/directory-picker' into feat/workspace-directory-browser 2026-07-29 01:29:47 +08:00
creatixchu
b6762d20a2 fix(host): roll back the surviving deferral when flow-registration setup fails halfway
A declared-but-occupied second hole registers synchronously, so the pair
construction can throw after the first deferral installed its subscription;
that orphan then fires against the failed fiber's inactive context. The
effect now disposes already-created deferrals before rethrowing
(ds-review-bot on the browse twin; same shape here).
2026-07-29 01:29:08 +08:00
imccyu
532b2b9107 Merge origin/master (regenerate the event producer-consumer graph) 2026-07-29 01:21:29 +08:00
creatixchu
431d7340fa fix(client): teach the IWorkspaces face and its test double the browse calls
master's new ctx.workspaces contract face (IWorkspaces + TestWorkspaces
double) predates this stack's listDirectory/createDirectory; widening the
face is the explicit act of letting the browse flow drive them, and the
double records/stubs them like its siblings.
2026-07-29 01:16:36 +08:00
creatixchu
da71e1eef2 Merge remote-tracking branch 'origin/feat/directory-picker' into feat/workspace-directory-browser 2026-07-29 01:10:33 +08:00
creatixchu
6a78bf4dd0 Merge remote-tracking branch 'origin/doc/host-client-group-readmes' into feat/directory-picker 2026-07-29 01:09:33 +08:00
creatixchu
40807f7573 Merge remote-tracking branch 'origin/master' into doc/host-client-group-readmes 2026-07-29 01:08:37 +08:00
creatixchu
51b70f5864 Merge remote-tracking branch 'origin/master' into doc/host-client-group-readmes
# Conflicts:
#	apps/cli/README.i18n.yaml
2026-07-29 01:08:17 +08:00
imccyu
b0fc3b971b Merge remote-tracking branch 'origin/master' into goal-ui-merge-master 2026-07-29 01:08:09 +08:00
Tianyi Cui
9161d9bf32 Merge branch 'master' into worktree/fix-test-mock-server-bin 2026-07-29 01:08:07 +08:00
imccyu
f42d9653c1 Merge origin/master (session ISession face) and adapt the goal ref read
The runtime's new outward session contract exposes projections as a
ProjectionsFace (faceOf only); the ui-goal verb closure reads the current
value through faceOf('goal').getSnapshot() instead of the store-level get.
Catalogs regenerated after the merge.
2026-07-29 00:56:50 +08:00
imccyu
20dd8e8d05 Merge remote-tracking branch 'origin/master' into goal-ui-merge-master 2026-07-29 00:52:03 +08:00
creatixchu
cbf54196fa fix(host): review round 8 — unmount invalidation, unreadable selections clear
- HMR/unmount bumps both request generations, so a listing or creation
  settling after disposal neither updates dead state nor issues the
  post-create relist.
- A selection whose preview listing fails clears back to the single pane:
  the breadcrumb names the level, so the level must be the committing
  target (reverses the earlier keep-marked behavior with its test).
2026-07-29 00:50:49 +08:00
Tianyi Cui
8f867cc709 Merge branch 'master' into feature/subagent-policy-inheritance 2026-07-29 00:49:35 +08:00
imccyu
37f34af15f fix(plan): gate the immediate commit on the open-turn fold, not agent status
The TUI keyless smoke exposed the wrong idle signal: /plan submitted while
the driver is between turns still saw status running (checkpointing), so
the selection queued and the immediate copy never appeared. The commit
gate is now the log's own open-turn fold — plan/mode commits at once
whenever no turn is open, and queues only inside one. Specs drive the
distinction through explicit turn/start / turn/end events instead of a
fake status; the keyless smoke pins the new idle copy on both /plan and
/plan off; regenerated cordis/service catalogs ride along.
2026-07-29 00:46:56 +08:00
imccyu
2eae1955d3 refactor(client): hoist IconSparkle16 into ui-primitives
The sparkle glyph gained a second consumer (GoalBar beside the Others
tool-row variant), which the duplication gate correctly flags as a clone —
the package-local-until-shared rule its comment recorded has run its
course. Both copies collapse into the shared ic_ds_* family; the icon-set
count test grows to 57.
2026-07-29 00:41:36 +08:00
Tianyi Cui
be23e5b2ac Merge latest master into subagent policy inheritance 2026-07-29 00:40:25 +08:00
Tianyi Cui
739647afc0 fix(subagent): publish inherited policy facts to telemetry
Inherited sandbox and approval events were part of the constructor seed. Session.firstLiveSeq classifies every constructor event as replayed history, so telemetry adoption skipped these child-only creation facts even though no parent or prior process had exported them.

Capture the parent overrides at the same synchronous delegation boundary, but append the events during the child factory setup while the session is still unpublished. They remain ordered after fork history, persist with the first child batch, and retain last-event-wins behavior while landing on the live side of the telemetry boundary. This uses the existing setup and session append contracts instead of adding another seed category or telemetry special case.

Add regression coverage for exporting an unpublished suffix without re-exporting constructor history, assert the spawn and fork firstLiveSeq boundaries, and restore the public seed documentation to replay/fork history only.
2026-07-29 00:39:56 +08:00
creatixchu
8ba0647c2c test(host): cover the cancel path that keeps an intact preview 2026-07-29 00:39:07 +08:00
creatixchu
b0d120efa8 fix(host): cancelling a superseded path edit falls back to the single-pane level
A draft edit can invalidate the selection's preview request; Escape then
left selected set with no child and nothing loading — a half-empty
two-pane view. Cancel now clears the selection when no preview exists
(ds-review-bot round 7).
2026-07-29 00:38:37 +08:00
Tianyi Cui
ea62a61307 Merge branch 'master' into worktree/normalize-snapshot-tmpdir 2026-07-29 00:35:42 +08:00
creatixchu
36be9f26db fix(host): a newer path edit supersedes a pending navigation
Editing the draft bumps the request sequence, so a slow lookup that settles
afterwards can neither clear the newer text nor repopulate the view with
the older path (ds-review-bot round 6).
2026-07-29 00:29:17 +08:00
Tianyi Cui
9365650371 fix(snapshot): preserve cwd boundary normalization 2026-07-29 00:24:02 +08:00
creatixchu
99a8795aa4 refactor(host): share the composition guard between the browser's two inputs
The path editor and the folder-name input carried identical inline IME
handlers — the cross-file clone jscpd flagged against WorkspacePicker; one
component-level guard object serves both.
2026-07-29 00:22:32 +08:00
imccyu
2f6b9843b4 Merge origin/master (session-projection cache column) into goal-ui-merge-master 2026-07-29 00:17:39 +08:00
creatixchu
f8cd2bf749 fix(host): review round 5 — draft-pending action gating, in-flow errors, IME guards
- Open and New folder disable while a path draft is uncommitted: targetPath
  still names the previous selection/listing, and committing against it
  while a different path shows in the header adopts the wrong directory.
- The Miller columns keep their own row so a status/error line renders below
  them inside the card instead of competing as a third flex item the dialog
  clips off-screen.
- Both text inputs (path editor, folder name) carry the IME composition
  guard the workspace-name inputs already had: a composing Enter confirms
  the candidate, never submits.
2026-07-29 00:15:30 +08:00
imccyu
9d9cdd640e style(test-runtime): drop a trailing space 2026-07-29 00:09:40 +08:00
creatixchu
d2b16380d1 fix(host): keep path entry available when the home listing fails
With no listed level (an unreadable or missing home directory), the
path-edit zone previously disabled forever, stranding the operator on the
alert with only Cancel; it now opens with an empty draft so an absolute
path remains the way forward. Covered by a recovery test.
2026-07-29 00:04:38 +08:00
Tianyi Cui
7f11b721e9 Merge branch 'master' into worktree/normalize-snapshot-tmpdir 2026-07-29 00:03:17 +08:00
Tianyi Cui
48518ea850 Merge branch 'master' into worktree-fe-docs 2026-07-29 00:00:38 +08:00
imccyu
3e6a7fea43 test(ui-sidebar): pin the shell chrome with local DOM snapshots
First consumer of the runtime's single-slot mounting: the real apply mounts
on its own fiber, renderSlot('sidebar', ...) captures exactly the sidebar
slot's output, and update() re-renders the collapsed rail in place. The
.snap files carry semantic class names and svg fingerprints only.
2026-07-28 23:54:14 +08:00
imccyu
a3f9a4d3ee test(client): migrate the ui-conversation and web benches onto SlotTestRuntime
The five ui-conversation machinery specs (apply-inject, chat-apply,
chat-toolview-slot, service-orchestration, selection-survival — now .tsx)
and the web app/app-shell specs assemble through the runtime instead of
hand-built Context + SlotsService + fake-session scaffolding per suite.
Session behavior mocks are typed against ISession, so incomplete fakes
fail at compile time.
2026-07-28 23:54:14 +08:00
imccyu
3f7a8c6f8e feat(client): add the dsh-client-test-runtime package
A jsdom slot test runtime for feature specs: a real Cordis Context, the
production SlotsService and web-react renderer, and typed session/workspace
doubles (TestSessions implements ISessions with FixtureSession sessions;
TestWorkspaces implements IWorkspaces), so the compiler flags fixture drift
when a production face changes. Fixtures feed plain data: list rows,
conversation snapshots, and ISession-typed behavior stubs; provide-bundle
materialization runs the shared SessionProvideChannel.

DOM snapshot support: declare()/renderSlot() mount a single slot inside a
data-slot wrapper for local .snap capture, and a snapshot serializer folds
CSS-module class hashes to their semantic locals and collapses svg internals
to a content fingerprint. The typed provide() constrains declared-service
fakes to Partial of the service's outward face.
2026-07-28 23:54:13 +08:00
creatixchu
af049cceaf fix(host): native button semantics for rows; path editor inert under the create dialog
Rows keep their NATIVE button role inside a listitem seat (role overrides
exposed selectable folders as passive list items to assistive technology),
the crumb trail becomes a navigation landmark, and the path-edit input joins
the parentInert derivation so the nested create dialog cannot be undercut
through it.
2026-07-28 23:50:05 +08:00
imccyu
cb8968c80e test(plan): cover the final-state tails and refresh the TUI golden
The idle /plan and /plan off command paths pin the immediate-commit copy;
the chip's dead leaving/locked guard is deleted (both states disable the
button, so no click reaches the handler); the multi-turn TUI golden is
re-recorded keyless over the idle-commit wording and the standalone
plan/mode narration ordering.
2026-07-28 23:49:38 +08:00