2nd dokployH
Find a file
imccyu bbde18caff refactor(gui): dissolve the tool ring into per-view keyed slots
Four rounds of structural rework on the conversation surface, converging
on one registration model for the whole client:

- Review fixes: open() leaves the inject factory (SessionsService owns
  the semantic); ConversationService mounts via ctx.plugin(); the
  bespoke view registry retires into the 'conversation.view' list slot.
- Ring alignment: createChatView factory retired (components get
  everything through checkable shares at the register call site); the
  hand-rolled t/i18n threading is deleted wholesale — a future
  framework-level i18n will supply t as a standard prop keyed by slot
  name, so no interim manual channel.
- Toolview dissolution: ToolViewRegistry / ToolViewResolver /
  ToolViewOutlet / ctx.toolviews retire. Tool rows are entries of the
  'conversation.chat.toolview' keyed slot (scope: session) declared by
  the chat entry; ToolRowOwnerProps is the unified owner payload;
  GenericToolCard becomes the call-site fallback; registrants are plain
  plugins (inject ['slots','conversation'] as the load-order seam);
  session-dimension dispatch moves into components (useSessions reads
  parentId); trajectory/waterfall gain same-shape slots the day they
  render tool rows (RendersCheck rejects empty declarations). Slot
  names mirror the composition path (<domain>.<entry>.<hole>).
- Staging follows current: cell()/binding() are pure resolution
  (render-safe); the constructor subscribes to the list store and
  followCurrent opens the event window when the current session
  changes — staging IS the open signal, business verbs are the timing,
  React render/commit is decoupled from window lifecycle. A masked
  current (projection gap) keeps the stage untouched so deferred
  teardown semantics survive reconnects.

Agent Note: .agents/notes/implemented/architecture/
2026-07-23-toolview-dissolution.md (bilingual pair) records the
decision, the four rejected alternatives, and the accepted semantic
changes; the web client architecture note and packages/client/AGENTS.md
carry the current-state narrative.

Verified: typecheck 0, duplication 0 clones (478 files), full coverage
run 6190 passed with zero threshold errors, knip 0, doc-sync 24/24,
client aggregate tsc 0, render-count checks (one commit per chunk, zero
row re-renders under streaming) green.
2026-07-23 17:49:47 +08:00
.agents refactor(gui): dissolve the tool ring into per-view keyed slots 2026-07-23 17:49:47 +08:00
.claude docs: accuracy sweep, architecture restructure, two ADRs, review skill 2026-06-13 22:05:34 +08:00
.github Use enterprise 32-core runners for complete CI 2026-07-23 15:06:23 +08:00
apps Merge remote-tracking branch 'origin/master' into codex/gui-context-polish 2026-07-23 15:03:26 +08:00
assets docs: make the top-level README product-first 2026-07-23 00:15:44 +08:00
bin feat(cli): dsh CLI with personal config overlays from ~/.config/dsh 2026-07-22 14:29:28 +08:00
docs Revert "chore: run primary CI before push" 2026-07-23 14:02:58 +08:00
examples test(acp): require a real sandbox denial 2026-07-23 16:39:02 +08:00
native docs(landlock-run): align source and release guidance 2026-07-20 12:25:43 +08:00
packages refactor(gui): dissolve the tool ring into per-view keyed slots 2026-07-23 17:49:47 +08:00
python Merge remote-tracking branch 'origin/master' into worktree/pr468-retarget-latest-master 2026-07-22 22:38:17 +08:00
scripts Revert "chore: run primary CI before push" 2026-07-23 14:02:58 +08:00
skills/create-dsh-sdk-project Remove the stdio agent 2026-07-20 19:26:04 +08:00
vendor fix(vendor/include): keep config reloads resilient 2026-07-22 17:50:45 +08:00
website Merge commit 'refs/codex-unblock/2026-07-23/base-511' into HEAD 2026-07-23 10:14: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 feat(gui): step1 skeleton — dsc web serves built web UI over booted harness host 2026-07-22 16:24:44 +08:00
.gitlab-ci.yml python: derive release version from repository 2026-07-13 17:49:01 +08:00
.jscpd.json chore: tighten TypeScript duplication lint 2026-07-14 00:24:04 +08:00
AGENTS.md Revert "chore: run primary CI before push" 2026-07-23 14:02:58 +08:00
CLAUDE.md Initialize repo with README, AGENTS.md, and CLAUDE.md symlink 2026-06-10 22:58:56 +08:00
eslint.config.mjs refactor(vitest): resolve every lane through the tsconfig.base.json facade 2026-07-23 03:59:06 +08:00
knip.json ci: fix jsdoc & coverage 2026-07-23 03:55:32 +08:00
lefthook.yml Revert "chore: run primary CI before push" 2026-07-23 14:02:58 +08:00
LICENSE Initialize repo with README, AGENTS.md, and CLAUDE.md symlink 2026-06-10 22:58:56 +08:00
package.json Revert "chore: run primary CI before push" 2026-07-23 14:02:58 +08:00
pnpm-lock.yaml refactor(gui): dissolve the tool ring into per-view keyed slots 2026-07-23 17:49:47 +08:00
pnpm-workspace.yaml Merge latest master through rfc/pty into feature/persistent-pty-sessions 2026-07-22 21:21:58 +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 docs: separate plugin architecture tagline 2026-07-23 12:15:56 +08:00
README.md docs: separate plugin architecture tagline 2026-07-23 12:15:56 +08:00
README.zh.md docs: separate plugin architecture tagline 2026-07-23 12:15:56 +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 refactor(vitest): resolve every lane through the tsconfig.base.json facade 2026-07-23 03:59:06 +08:00
tsconfig.client.json refactor(tsconfig): single root solution graph over host/client aggregates 2026-07-23 03:59:05 +08:00
tsconfig.host.json refactor(tsconfig): single root solution graph over host/client aggregates 2026-07-23 03:59:05 +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 refactor(vitest): resolve every lane through the tsconfig.base.json facade 2026-07-23 03:59:06 +08:00
vitest.e2e.config.ts refactor(vitest): resolve every lane through the tsconfig.base.json facade 2026-07-23 03:59:06 +08:00
vitest.snapshot.config.ts refactor(vitest): resolve every lane through the tsconfig.base.json facade 2026-07-23 03:59:06 +08:00
vitest.web.config.ts refactor(vitest): resolve every lane through the tsconfig.base.json facade 2026-07-23 03:59:06 +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 clones DeepSeek Harness to ~/.dsh/source, links dsh into ~/.local/bin, and launches it. Re-running the command updates the checkout. 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:

pnpm --dir ~/.dsh/source 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