Commit Graph
4218 Commits
Author SHA1 Message Date
Yif 20720ef238 fix(gui): polish sidebar layout, wordmark, tooltip, and fonts to figma
Fixed sidebar width (never concedes), figma session-row rail (16px twist +
status slots, triangle arrows, mount fade), exact brand wordmark svg with
tooltip'd rail controls, form controls inheriting the app font stack, and
inlined the twist button reset since the tsdown CSS pipeline drops composes.
2026-07-23 17:08:47 +08:00
Tianyi Cui 9c01696a7e Merge pull request #523 from deepseek-harness/worktree/fix-collapsed-sidebar-rail
fix(gui): keep sidebar controls when collapsed
2026-07-23 13:47:13 +08:00
imccyu d430744dd8 Merge branch 'master' into worktree/fix-collapsed-sidebar-rail 2026-07-23 13:45:14 +08:00
imccyu dd7d198c0d Revert "fix(gui): keep the label fade and pin the rail icons to one axis"
This reverts commit a4ae2f6c21c1eeed2495481a55a39762f4e64ccb.
2026-07-23 13:37:54 +08:00
imccyu f062ba8fcd fix(gui): keep the label fade and pin the rail icons to one axis
Two polish defects from the headless verification pass:

- .newSessionLabel/.footLabel declared their own transition shorthand,
  which replaced .wide's opacity fade entirely (shorthands do not merge) —
  the labels vanished instantly while everything else faded. The fade is
  restated alongside max-width.
- The rail icons drifted off a common vertical axis: the 56px track holds
  a 55px content box (1px column border), and the capsule rows kept their
  1px border-width in the collapsed state, shaving their content to 23px
  and pushing the search icon 2px right. Collapsed capsules now zero the
  border-width (transitioning border, not border-color), the root gives
  back the border pixel via asymmetric padding, and every surviving row
  centers its icon — five glyphs on the track's 28px center.
2026-07-23 13:30:07 +08:00
Tianyi Cui 0401fd52b9 Merge pull request #543 from deepseek-harness/worktree/comprehensive-pre-push
chore: run primary CI before push
2026-07-23 13:21:44 +08:00
imccyu 23e942029a Merge remote-tracking branch 'origin/master' into worktree/fix-collapsed-sidebar-rail 2026-07-23 13:16:48 +08:00
Tianyi Cui 1f8d0cf853 Merge remote-tracking branch 'origin/master' into worktree/comprehensive-pre-push 2026-07-23 13:11:49 +08:00
Tianyi Cui 75755c466d Merge pull request #313 from deepseek-harness/readme
docs: make the top-level README product-first
2026-07-23 13:11:20 +08:00
Tianyi Cui 00d5b69882 chore: run primary CI before push 2026-07-23 13:09:52 +08:00
imccyu 698f46b0c9 feat(gui): morph the sidebar collapse instead of swapping renders
The collapse read as a hard cut: only the track width animated while the
panel content swapped instantly and the rail icons bore no relation to the
expanded layout. Now the four control rows persist across the transition —
collapse toggle, new session, new workspace, search, the same top-down
order as their expanded rows — and morph their geometry (row heights,
paddings, margins, capsule borders) on the deepsuite curve, so each rail
icon is its expanded control converging onto the 56px axis. Wide-only
content (brand, labels, input, session tree) cross-fades over 200ms, stays
mounted while the collapse animates, and unmounts at the 300ms settle,
still dropping the sessions subscription. The search query moves up to the
root and survives the round trip; rail search focuses the surviving input
after expand instead of remount-autofocus.
2026-07-23 13:03:32 +08:00
Tianyi Cui b96b48d5aa Merge branch 'master' into readme 2026-07-23 12:47:33 +08:00
Tianyi Cui d1a5593407 docs: separate plugin architecture tagline 2026-07-23 12:15:56 +08:00
Tianyi Cui 3e3ea47296 Merge pull request #535 from deepseek-harness/worktree-webts
refactor(tsconfig): single root solution graph over host/client aggregates
2026-07-23 12:03:11 +08:00
imccyu e4d3f6fd53 Merge branch 'master' into worktree-webts 2026-07-23 11:50:08 +08:00
Tianyi Cui 2848f0827d Merge pull request #538 from deepseek-harness/worktree-webslot2
refactor(gui): slot system standard & store migration
2026-07-23 11:48:08 +08:00
imccyu 5da8e3b787 feat(gui): animate sidebar collapse and grow the rail control set
The collapsed rail becomes a 56px icon column (24px controls between 16px
paddings) carrying expand, new session, search, and new workspace — each
aligned with its expanded counterpart; rail search expands the sidebar and
focuses the search box. Collapse/expand now animates: the frame transitions
grid-template-columns (and the surviving handle its left) on the deepsuite
sider curve — --ds-ease-in-out over --ds-transition-duration-slow, supplied
by ui-theme's base sheet. Transitions pause during drags (data-dragging on
the frame, set for the whole gesture) and under prefers-reduced-motion.
2026-07-23 11:45:54 +08:00
Tianyi Cui c240f326c4 Merge branch 'master' into worktree-webslot2 2026-07-23 11:08:36 +08:00
Tianyi Cui d723839b73 Merge pull request #511 from deepseek-harness/docs/cordis-tutorial
docs: add hands-on Cordis tutorial
2026-07-23 11:04:23 +08:00
imccyu a6649fb545 test(web): drop the stale fail-loud boot smoke case
Since the store engine moved into the client runtime, the ui-layout bundle
externalizes @deepseek-ai/dsh-client-runtime/client. This case's two-row
manifest (ui-layout + a deliberately absent probe) no longer boots ui-layout
at all: the unseeded runtime specifier fails it first, serial loading stops,
and the probe never reaches the failure list, so the assertion times out on
a premise the engine migration retired.
2026-07-23 10:52:46 +08:00
imccyu 7e6f0128b5 fix(gui): keep sidebar controls when collapsed
A closed sidebar previously resolved to a zero-width grid track, clipping
the only toggle and the settings entry with no visible recovery; the closed
preference persisted across reloads, locking the sidebar shut.

- columns.ts maps the closed preference (width 0) to a fixed 60px
  SIDEBAR_COLLAPSED rail through every step of the concession solve;
  closed details still resolve to zero width.
- AppFrame derives data-sidebar-collapsed and the sidebar slot's collapsed
  owner prop from the persisted preference instead of the resolved track
  width, and drops the resize handle while collapsed.
- SidebarRoot reads the owner collapsed prop; the expanded-only body is a
  separate component that unmounts while collapsed (dropping its sessions
  subscription), leaving the expand toggle and Settings in the rail.
- The keyless web smoke gains the ui-sidebar bundle (six real bundles) and
  pins the 60px rail collapse/expand round through the assembled client.
2026-07-23 10:51:57 +08:00
imccyu c271cad32d docs(i18n): re-record the adding-a-package pair after the zh wording tweak 2026-07-23 10:40:25 +08:00
imccyu 3785e10754 refactor(client-runtime): home the snapshot-store engine in contract/
The store migration (#538) parked the engine in a store/ sibling domain;
loader and sessions imported it directly, tripping verify-client-domain-graph
(cross-domain shared surface must route through contract/). The engine is
layer-0 shared infrastructure by definition, so it moves to contract/store.ts
verbatim; the four importers and the spec follow mechanically.
2026-07-23 10:37:15 +08:00
imccyu 2e2ad49f97 chore 2026-07-23 10:27:18 +08:00
Tianyi Cui 08cc034128 Merge commit 'refs/codex-unblock/2026-07-23/base-511' into HEAD 2026-07-23 10:14:06 +08:00
imccyu 59a2fc408b Merge remote-tracking branch 'origin/worktree-webslot2' into worktree/fix-collapsed-sidebar-rail
# Conflicts:
#	apps/web/tests/smoke-fixture.e2e.ts
#	packages/client/ui-layout/src/client/AppFrame.tsx
#	packages/client/ui-layout/src/client/columns.ts
#	packages/client/ui-layout/src/client/index.ts
#	packages/client/ui-layout/tests/app-frame.spec.tsx
#	packages/client/ui-layout/tests/columns.spec.ts
#	packages/client/ui-sidebar/README.md
#	packages/client/ui-sidebar/src/client/SidebarRoot.tsx
#	packages/client/ui-sidebar/src/client/contract/slots.ts
#	packages/client/ui-sidebar/src/client/index.ts
#	packages/client/ui-sidebar/tests/apply.spec.tsx
#	packages/client/ui-sidebar/tests/sidebar-root.spec.tsx
2026-07-23 04:25:01 +08:00
imccyu 90b05c7a2b docs(i18n): re-record the web-client architecture pair after stacking on #538 2026-07-23 04:01:06 +08:00
imccyu de5c68eb1a docs(notes): retire current-state references to the deleted build graph
Three notes stated tsconfig.build.json as present-tense fact; the
aggregates (tsconfig.host.json / tsconfig.client.json) now own the
explicit reference lists and the root solution owns the emit graph.
Historical narration in dated notes is left untouched.
2026-07-23 03:59:35 +08:00
imccyu 933fa96775 docs(i18n): re-record the two cookbook pairs after the zh link fix
The zh-side link retarget (e43438f39) changed the zh blobs without
re-recording; verify-translation-pairing --write refreshed both records.
2026-07-23 03:59:35 +08:00
imccyu 21287abd78 docs(ts): bilingual pair for the solution-root Agent Note 2026-07-23 03:59:35 +08:00
imccyu 28d753391f docs(ts): point zh cookbook layout links at the canonical anchor 2026-07-23 03:59:35 +08:00
imccyu 62125c0dcb docs(ts): document the solution-root TypeScript project layout
New authoritative section docs/development.md#typescript-project-layout
(five files, three roles, the program-vs-resolution principle and its two
disciplines), two repo conventions in AGENTS.md, package tsconfig shape in
packages/AGENTS.md, cookbook touch-lists updated for the two aggregates,
test source-plane rule in docs/testing.md. Decision record: new Agent Note
2026-07-22-tsconfig-solution-root-two-aggregates; ts-build-config note
updated in place (tsc-first pipeline unchanged); the two GUI RFCs now name
tsconfig.host.json. All bilingual pairs re-recorded. Doc budget ceilings
raised: AGENTS.md 1680, docs/testing.md 1020, packages/AGENTS.md 660 (two
new one-line conventions and one new section on already-near-ceiling docs).
Mission spec for the code-side migration: missions/tsconfig-single-graph-migration.md.
2026-07-23 03:59:35 +08:00
imccyu e1cb3da755 refactor(vitest): resolve every lane through the tsconfig.base.json facade
tsconfig.vitest.json is deleted; its job (a paths map applying to all
test files) is inherent in tsconfig.base.json having no include —
vite-tsconfig-paths treats that as match-all. All four vitest configs
now pin the same facade: the unit config gains a shared pathsPlugin()
helper, the web lane drops its handwritten webserver alias (apps/web
tests are covered by match-all), and the snapshot lane leaves the root
solution (which no longer carries paths) and stops resolving client
imports through package exports. tsconfig.base.json documents the
facade role and bans include/files; the CI eslint cache key hashes the
four graph tsconfigs; the eslint tests-block comment states resolution
via the solution to tsconfig.host.json.

Per missions/tsconfig-single-graph-migration.md §3.
2026-07-23 03:59:06 +08:00
imccyu 19e6f7d907 refactor(tsconfig): single root solution graph over host/client aggregates
Root tsconfig.json becomes a pure solution (files:[] + two references);
the former root host aggregate moves verbatim to tsconfig.host.json.
New tsconfig.base.client.json carries the shared client compiler shape
(jsx/DOM lib/types:[]), and tsconfig.client.json plus the 12
packages/client tsconfigs extend it instead of restating the trio.
tsconfig.build.json is deleted: the solution covers the full emit graph,
absorbing the command-goal typecheck/build drift.

Consumers migrate to the single graph: typecheck/build scripts and the
lefthook pre-push hook run bare `tsc -b` (pre-push now covers the client
side); the run-gates build gate needs typecheck so two concurrent tsc -b
runs cannot race the same tsbuildinfo; ts-project.ts and the standalone
doc-typecheck mode seed tsconfig.host.json explicitly (never the root
solution — flattening host+client into one program collides the cordis
Context merges); verify-cordis-config BFS seeds the root solution alone.

Per missions/tsconfig-single-graph-migration.md §2–§3.
2026-07-23 03:59:05 +08:00
imccyu 9cf5a384e9 ci: fix jsdoc & coverage 2026-07-23 03:55:32 +08:00
imccyu 8b3d1ac943 refactor(gui): move the snapshot-store engine into the client runtime
The data layer no longer depends on the React glue package, and business
plugins no longer depend on web-react at all:

- The store engine (zustand vanilla + immer + persist + dev freeze),
  defineStore, and shallowEqual move to @deepseek-ai/dsh-client-runtime,
  exported from the ./client main entry — no ./store subpath survives on
  either package (the web-react one is deleted, none is opened on runtime).
- Store products are bare snapshot sources: useSelector leaves
  SnapshotStore/StoreInstance and Session; every hook is composed at the
  binding site in web-react's renderer (per-source cached uSES binding).
  The SlotRendererHost sessions face carries bare observables only.
- SessionProvider becomes a standard-kit seat: an entry whose children
  declare a session-scope slot receives the framework component as a prop,
  retiring the last value import of web-react from plugin packages.
  UseSession and the session-area types now live in ui-slots.
- web-react shrinks to the shell-only React glue (renderer, providers,
  uSES bridge); zustand/immer belong to runtime alone; the module-table
  seed and tsdown externals drop the web-react/store seat.
- NODE_ENV replacement is defined once in the shared tsdown client preset
  (browser bundles inline the engine and lost vite's define); the 3-line
  process.env typecheck shim moves to runtime with the engine.
- Stray tsc artifacts (.js/.d.ts/.d.ts.map beside sources under src/)
  swept repo-wide; they shadow real sources under vitest resolution.

Verified: both aggregate typecheck programs at zero; 604 client tests
green; repo-wide grep for web-react/store at zero; real-host playwright
run 7/7 including persist round-trip.

ci: fix test/docs
2026-07-23 03:30:06 +08:00
imccyu 004a988168 fix: slot 2026-07-23 03:25:11 +08:00
imccyu 1b0ea07bce refactor(gui): slot system standard — single register, four props shares, framework store seat
The definitive slot model for the web client, replacing the first-generation
define/register two-step, ScopedSlots whitelist faces, and binding handles:

- 'root' is the only a-priori slot (SlotsService built-in); the shell renders
  exactly ctx.slots.renderSlot('root', {}).
- register is the single API: children = slot declaration + render
  authorization + runtime spec in one options object; misconfiguration fails
  loud at load (duplicate declaration, undeclared contribution, one store
  handle under two scopes).
- Component props arrive in four auto-derived shares: PropsRuntime<K>
  (owner params + session/global standard kits via declare-merge),
  PropsRenderSlots<S>, PropsStore<H>, and the inject business face.
  sessionId is framework-supplied; hooks are framework-made only.
- Framework store seat: defineStore factories declare schema/actions/persist;
  read = useStore, write = baked actions only; store scope derives from the
  mounting entry; per-session persist keys and clearPersisted lifecycle.
- inject factories read the apply closure's own ctx (binding handles retired;
  root-ctx back door closed); SessionProvider is self-wired render-prop.
- Rendering sits behind the SlotRenderer install seam; runtime stays
  React-free; ownership ledger keyed to the single entry axis closes the
  stale-authority window (StaleAuthorizationError probes).

Docs: the slot type-chain note is refreshed in place as the slot system
standard RFC (bilingual pair re-recorded); the web client architecture RFC
defers its slot sections there; packages/client/AGENTS.md gains the slot and
props discipline; gui-testing/web-styling notes drop missions/ references.

Tests: suites rewritten to the standard (props fed directly, real store
engines via createXXXStore().create(), no render machinery); load-time
negative samples for declaration/authorization/store conflicts; verified by
real-host playwright run (three columns, empty state, collapse, keyed session
remount, cross-slot selection sharing).

docs(ui-sidebar): point contract reference at the committed slot standard RFC

missions/ is workspace-local and never committed; the README must not cite it.
2026-07-23 03:25:11 +08:00
imccyu efa4326ff4 refactor: client no export
docs: AGENTS.md

refactor: client no export 2
2026-07-23 03:25:10 +08:00
Tianyi Cui b59f6ff3fa docs: link the WeChat community QR destination 2026-07-23 00:48:50 +08:00
Tianyi Cui 2be046dcf2 docs: refine README product copy 2026-07-23 00:37:30 +08:00
Tianyi Cui ef325b02fa docs: make the top-level README product-first 2026-07-23 00:15:44 +08:00
Tianyi Cui 30a1ea7cec Merge branch 'master' into readme
# Conflicts:
#	README.i18n.yaml
#	README.md
#	README.zh.md
2026-07-23 00:01:24 +08:00
Tianyi Cui 690c53dc03 Merge pull request #468 from deepseek-harness/worktree/session-reference
feat(session): add cross-session references
2026-07-22 23:22:07 +08:00
Tianyi Cui d5d6960184 Merge remote-tracking branch 'origin/master' into worktree/pr468-retarget-latest-master
# Conflicts:
#	docs/architecture.i18n.yaml
#	docs/module-graph.md
2026-07-22 23:17:02 +08:00
Tianyi Cui e3981109b3 Merge pull request #467 from deepseek-harness/feature/persistent-pty-sessions
feat: add persistent PTY sessions
2026-07-22 23:02:42 +08:00
Tianyi Cui 995362c7e1 Merge remote-tracking branch 'origin/master' into worktree/pr468-retarget-latest-master 2026-07-22 23:01:30 +08:00
Tianyi Cui b65afd320a Merge remote-tracking branch 'origin/master' into worktree/pr468-retarget-latest-master
# Conflicts:
#	docs/cordis-catalog/events.md
#	docs/cordis-catalog/services.md
#	docs/event-producer-consumer.md
2026-07-22 23:00:05 +08:00
Tianyi Cui c9566d18bf Merge remote-tracking branch 'origin/master' into worktree/pr467-retarget-latest-master 2026-07-22 22:58:33 +08:00
Tianyi Cui 72e1640959 Merge pull request #433 from deepseek-harness/rfc/pty
docs(agent-note): propose persistent PTY sessions
2026-07-22 22:57:42 +08:00