Skip to content

DSH Mac v0.2.0

Latest

Choose a tag to compare

@gnubyte gnubyte released this 21 Aug 02:01

DSH is now the harness. It runs the agent loop itself and talks straight to any OpenAI-compatible model server, so there is no dsh web process to install or keep running. Point it at a model and open a folder.

Download

  • DeepHarness.dmg — recommended. Open it and drag DSH into Applications.
  • DSH-macos.zip — the bare app bundle.

Note: builds are ad-hoc-signed for Apple Silicon (arm64), macOS 14+. Gatekeeper will prompt on first launch — right-click the app and choose Open, or run:

xattr -d com.apple.quarantine /Applications/DSH.app

What's new

Setup wizard. Runs on first launch, re-runnable from Settings or Help. Seven steps: pick a backend, enter its address, prove the connection works, choose a model, pin a permission preset, open a project. There is a first-class path for a DGX Spark on your LAN — host plus port 8002 — and Test Connection calls /v1/models and, when it fails, names the usual cause (a server bound to 127.0.0.1 is invisible from another machine). Ollama, LM Studio, OpenAI, and OpenRouter are the other options. API keys go to your login keychain.

Qwen Code tool parity. read_file, read_many_files, write_file, edit, list_directory, glob, grep, run_shell_command, web_fetch, todo_write, exit_plan_mode, and agent — matching names, so prompts and skills from that ecosystem carry over. Models without function calling still work: tool calls emitted as XML in plain text are recovered and executed.

Code mode (⌘2). A VS Code-shaped workspace with the agent in the panel:

  • FSEvents-backed project tree — the agent's writes and build output appear without a refresh
  • Tabbed editor with a line-number gutter, syntax highlighting, soft tabs, and a find bar
  • Live reload: a clean buffer follows the agent's rewrite; a buffer with unsaved edits is never overwritten, and offers Reload from Disk or Keep Mine
  • A real login shell on a pty (forkpty, so job control and Ctrl-C work) with a VT100/xterm-subset emulator — colour including truecolor, scroll regions, the alternate screen. ⌃` toggles it.
  • Open tabs, terminal panel, and project are remembered per project

Plugins. A JSON manifest declares extra tools backed by shell commands — no compilation, no process protocol. Arguments are shell-quoted, approval is on by default, and a plugin tool cannot shadow a built-in.

Memory and skills (⇧⌘M). AGENTS.md, QWEN.md, CLAUDE.md, DSH.md, MEMORY.md, and today's daily log are read and injected directly — no mirroring into a managed marker block, because this app owns the prompt. A System prompt tab shows exactly what gets sent. Skills are discovered from four roots in precedence order.

Chat. The transcript keeps one ordered timeline, so a tool call renders where it happened rather than after every message. Markdown gains tables and task lists.

Fixes

  • API keys were stored in the keychain by array position and never read back, so a configured key was silently unused. They are now keyed by provider identity and actually applied.
  • Plan mode described itself as read-only but still allowed writes inside the project without asking. It now gates writes as well as commands.

Removed

DSHKit, the /api transport, and dshprobe. Image attachments went with them and have not been replaced yet.

Verification

114 tests (swift test) — engine loop, permission containment, XML tool-call fallback, glob, markdown, plugin quoting, prompt assembly, editor conflict resolution, 34 over the terminal emulator, and 8 that spawn a real shell on a real pty and assert on what lands on the screen.