2nd dokployH
Find a file
creatixchu 2143361195 fix(web): reserve one scrollbar gutter across the composer's text layers
Second review round escalated the wrap-width divergence from a separate
concern to a defect in this fix's own premise, and it is right.

Only .input scrolls, so only .input loses content width to a scrollbar that
consumes layout space — what Windows and Firefox draw, and what the theme's
global `::-webkit-scrollbar` width makes chromium treat as occupying space.
A narrower .input wraps a long soft-wrapped draft onto more lines, so it
grows taller, its scroll maximum exceeds the backdrop's, and the mirrored
offset clamps below the caret. That is the same failure the trailing-line
sentinel fixes, in the same direction, so deferring it would have shipped a
fix that does not hold where users run a classic scrollbar.

My first attempt to reproduce it found nothing and was wrong: the probe
content was not wrap-sensitive. With varied-length words the effect is
plain — the same draft laid out at 8px-apart widths differs by 2 to 5
lines, while at equal widths a textarea and a div agree exactly.

The three layers now reserve the gutter together, in the shared metrics
block that already exists to keep them symmetric. `overflow: hidden` is
still a scroll container, so the non-scrolling layers honour it: 8px is
reserved on each, measured. The cost is a text column 8px narrower on every
platform, which is the price of one geometry rather than a per-platform one.

The browser scenario asserts the premise directly — equal wrap widths, and a
reserved band greater than zero on each layer. The band is what stops the
assertion being vacuous: the widths would also match with no reservation at
all on this engine's overlay scrollbar, and it is the reservation, not the
match, that carries the guarantee to a platform whose scrollbar takes real
width. Removing the declaration fails it with `expected 0 to be greater
than 0`, and fails the golden with it.

Also from the same round, three comment corrections: the e2e file header no
longer describes the deleted layout effect, the measurement guard no longer
claims the backdrop holds exactly one text node (the sentinel makes a
second), and the sentinel comment now carries the one-sidedness argument
that also settles the ghost hint — the mirror only fails when the backdrop
is SHORTER, and the hint can only add content, never remove a line box.
2026-07-31 12:39:52 +08:00
.agents fix(web): reserve one scrollbar gutter across the composer's text layers 2026-07-31 12:39:52 +08:00
.claude docs: accuracy sweep, architecture restructure, two ADRs, review skill 2026-06-13 22:05:34 +08:00
.github ci: disable session telemetry in all GitHub workflows 2026-07-31 01:34:41 +08:00
apps fix(web): reserve one scrollbar gutter across the composer's text layers 2026-07-31 12:39:52 +08:00
assets docs: make the top-level README product-first 2026-07-23 00:15:44 +08:00
bin feat(cli): launch dsh source through the tsx ESM hook 2026-07-29 13:15:24 +08:00
docs Merge pull request #1005 from deepseek-harness/codex/new-task 2026-07-31 11:12:26 +08:00
examples Merge branch 'master' into fix/nodeboot-dep 2026-07-31 10:34:07 +08:00
native docs(i18n): record proofread README pairs 2026-07-29 15:30:44 +08:00
packages fix(web): reserve one scrollbar gutter across the composer's text layers 2026-07-31 12:39:52 +08:00
patches fix(build): validate packaged spawn helpers 2026-07-29 21:49:21 +08:00
python Merge branch 'worktree-llm-dynamic-config' into worktree-llm-web-config 2026-07-30 20:15:40 +08:00
scripts Merge pull request #711 from deepseek-harness/codex/basic-session-search 2026-07-31 10:33:53 +08:00
skills refactor(llm-deepseek)!: rename the provider route to deepseek-official 2026-07-29 16:36:07 +08:00
vendor fix(app-boot): preserve published loader composition 2026-07-31 03:20:20 +08:00
website docs: bilingual credentials/settings-consumer documentation, catalogs, and gates 2026-07-29 14:20:06 +08:00
.editorconfig Declare LF and final-newline conventions in .editorconfig 2026-07-15 16:09:12 +08:00
.gitattributes Pin LF working trees via .gitattributes 2026-07-15 16:09:12 +08:00
.gitignore Merge commit 'refs/codex/pr885/master-20260730' into worktree/retarget-pr885-20260729 2026-07-30 01:18:28 +08:00
.gitlab-ci.yml python: derive release version from repository 2026-07-13 17:49:01 +08:00
.jscpd.json chore(lint): bring .tsx files into the eslint, lefthook, and jscpd lanes 2026-07-27 21:42:08 +08:00
.oxlintrc.json Merge commit 'refs/codex/pr885/master-20260730' into worktree/retarget-pr885-20260729 2026-07-30 01:18:28 +08:00
AGENTS.md Merge branch 'worktree-config-settings-seam' into worktree-llm-dynamic-config 2026-07-30 14:33:36 +08:00
CLAUDE.md Initialize repo with README, AGENTS.md, and CLAUDE.md symlink 2026-06-10 22:58:56 +08:00
eslint.format.config.mjs Merge commit 'refs/codex/pr885/master-20260730' into worktree/retarget-pr885-20260729 2026-07-30 01:18:28 +08:00
knip.json Merge branch 'master' into feature/shared-cli-config-foundation 2026-07-30 17:08:42 +08:00
lefthook.yml refactor: centralize Oxlint worker bounds 2026-07-29 23:39:49 +08:00
LICENSE Initialize repo with README, AGENTS.md, and CLAUDE.md symlink 2026-06-10 22:58:56 +08:00
package.json ci: run web replay on master linux 2026-07-30 11:16:37 +08:00
pnpm-lock.yaml Merge pull request #1005 from deepseek-harness/codex/new-task 2026-07-31 11:12:26 +08:00
pnpm-workspace.yaml fix(build): stage platform-specific PTY artifacts 2026-07-29 22:44:19 +08:00
pytest.ini Merge remote-tracking branch 'origin/master' into codex/trim-ai-prose 2026-07-14 00:40:36 +08:00
README.i18n.yaml feat(install): consolidate checkouts under ~/.dsh/source and route PATH through a stable current symlink 2026-07-27 19:08:26 +08:00
README.md feat(install): consolidate checkouts under ~/.dsh/source and route PATH through a stable current symlink 2026-07-27 19:08:26 +08:00
README.zh.md feat(install): consolidate checkouts under ~/.dsh/source and route PATH through a stable current symlink 2026-07-27 19:08:26 +08:00
tsconfig.base.client.json refactor(tsconfig): single root solution graph over host/client aggregates 2026-07-23 03:59:05 +08:00
tsconfig.base.json Merge worktree-llm-dynamic-config (884, with latest master) into worktree-llm-web-config 2026-07-30 23:57:01 +08:00
tsconfig.client.json Merge branch 'worktree-llm-dynamic-config' into worktree-llm-web-config 2026-07-30 15:18:26 +08:00
tsconfig.host.json fix(web): scroll the composer's glyph layer with its textarea 2026-07-31 11:53:04 +08:00
tsconfig.json refactor(tsconfig): single root solution graph over host/client aggregates 2026-07-23 03:59:05 +08:00
tsdown.config.ts refactor(tsconfig): single root solution graph over host/client aggregates 2026-07-23 03:59:05 +08:00
vitest.config.ts Merge remote-tracking branch 'origin/master' into fix/node26-vitest-webstorage 2026-07-31 10:26:05 +08:00
vitest.e2e.config.ts fix(test): isolate jsdom storage on Node 26 2026-07-30 21:49:33 +08:00
vitest.shared.ts fix(test): isolate jsdom storage on Node 26 2026-07-30 21:49:33 +08:00
vitest.snapshot.config.ts fix(test): isolate jsdom storage on Node 26 2026-07-30 21:49:33 +08:00
vitest.web.config.ts fix(test): isolate jsdom storage on Node 26 2026-07-30 21:49:33 +08:00

DeepSeek Harness

English | 中文

DeepSeek Harness (dsh) is an open-source coding agent built on the DeepSeek Harness SDK.

It uses an architecture where everything is a plugin.

Install

Install dsh with one command:

curl -fsSL https://raw.githubusercontent.com/deepseek-harness/deepseek-harness/master/scripts/install.sh | sh

The installer requires git and Node ^22.19 || >=24, offers to install pnpm when it is missing, and prompts for a DeepSeek API key.

The installer keeps every checkout under ~/.dsh/source: the master clone at ~/.dsh/source/master and each install's staging checkout as a git worktree ~/.dsh/source/staging-<timestamp>. The stable symlink ~/.dsh/source/current points at the active staging worktree, and dsh in ~/.local/bin links to current/bin/dsh, so an upgrade repoints one symlink and the dsh on PATH never moves. Re-running the command adds a fresh staging worktree from an updated master and repoints current at it. See scripts/install.sh for alternate install locations and other options.

Use DeepSeek Harness

Web UI

For the recommended local interface, build the frontend after installation and after each update, then start the Web UI. Resolve the running checkout from the dsh launcher so the command holds regardless of which staging worktree is current (the launcher resolves through the stable current symlink):

dsh_bin=$(cd "$(dirname "$(command -v dsh)")" && pwd -P)/$(basename "$(command -v dsh)")
while [ -L "$dsh_bin" ]; do
  link=$(readlink "$dsh_bin")
  case $link in /*) dsh_bin=$link ;; *) dsh_bin=$(cd "$(dirname "$dsh_bin")" && cd "$(dirname "$link")" && pwd -P)/$(basename "$link") ;; esac
done
dsh_dir=$(cd "$(dirname "$dsh_bin")/.." && pwd -P)
pnpm --dir "$dsh_dir" run build && pnpm --dir "$dsh_dir" run build:web
dsh web

The Web UI is served at http://127.0.0.1:3080 by default.

TUI

Start the full-screen terminal interface:

dsh

Headless

Run one task, print the final answer, and exit:

dsh -p "summarize this workspace"

Why DeepSeek Harness

Built-in capabilities cover file reading, editing, and search; shell execution; reusable skills; task tracking; subagents and workflows; persistent sessions; and context compaction. The TUI also includes Plan Mode.

  • Everything is a plugin. Models, tools, policies, storage, context management, and interfaces are composable Cordis plugins, so deployments can extend or replace behavior without forking the agent loop. See the architecture for the underlying design.
  • Code Mode (opt-in). It exposes a run_code tool and a generated TypeScript SDK; only program output re-enters model context. See Code Mode.
  • Self-referential Cordis tools are opt-in. They let the agent inspect its live runtime and mount or unmount plugins while it runs. See the Cordis tools.

Community

Follow DeepSeek Harness on Twitter for project updates.

Development

pnpm install
pnpm run test:coverage

Start with the development guide and read the architecture before changing packages.

For agents, follow AGENTS.md.

DeepSeek Harness is currently pre-release.

License

BSD 3-Clause