DSH Plugins Marketplace

DSH Plugins

Plugins

/

caveman-plugin-dsh

f

caveman-plugin-dsh

Manifest valid

Caveman voice for DSH (terminal and web): terse replies via bundled skills, a /caveman toggle and a TUI badge. Plugin-only, no dependencies.

hasBundlePatch

caveman-plugin-dsh

Caveman voice for DSH (dsh-TUI) — terminal and web. Why use many token when few token do trick.

A dsh plugin that makes the agent answer terse: fragments over sentences, fluff gone, every technical fact kept. It ships the caveman voice skills, an always-on system-prompt section, a /caveman toggle and a TUI badge.

  • Plugin-only. No dsh core change, no patch, no fork. Plain Cordis services.
  • Host-agnostic. Loads in the tui profile and the web profile.
  • Subagent-safe. Delegated children keep full prose; only the root agent gets the voice.
  • Zero dependencies. Plain ESM, no build step, no npm install, no network.
/caveman on        # terse from now on
/caveman off       # normal prose
/caveman status    # current mode

Install

Requires dsh 0.17+ (plugin manifest v0.15). Clone, then add it to the profile(s) you use:

git clone https://github.com/farchanjo/caveman-plugin-dsh.git
dsh plugin --profile tui add ./caveman-plugin-dsh   # terminal UI
dsh plugin --profile web add ./caveman-plugin-dsh   # web UI

Restart dsh afterwards. Remove with dsh plugin --profile <p> remove caveman-plugin-dsh.

The manifest is validated by the host's own validatePlugin; it declares the commands.dsh/v1alpha1#Command contract and the commands.invoke permission. No grants file is needed: no mediated capability and no storage are used.

Usage

/caveman (or /caveman help) opens a text wizard in the footer:

1on 2off 3st 4cav 5ultra 6mega · 7jev+ 8jev- 9key- 10ls 11url 12key+ q

Type the number; the footer repaints with the new state and nothing is sent to the model. q closes, any other text closes the menu and goes through as a normal message. Prompts (key, model pick) consume the next line and stay open on a bad value, showing the reason inline; c cancels the prompt. The menu expires after 120 s.

PickActionPickAction
1voice on7jev on
2voice off8jev off
3status9clear key
4 / 5 / 6level caveman / ultracave / megacave10list models
10 / 11provider typesafe / openrouter12set key

Direct verbs still work without the menu: /caveman on, /caveman off, /caveman status, /caveman caveman|ultracave|megacave, /caveman jev on|off|<provider>, /caveman key <k>|clear, /caveman model [list|<id>].

Spoken phrases work too and never need a slash: "stop caveman", "normal mode", "talk like caveman", "be brief". A loose phrase ("pode voltar ao modo normal?") is disambiguated by the decision model before it is acted on.

Every change is persisted to the state file, so the mode, level and jev switch survive a restart.

Decision model (optional)

Off until you turn it on: /caveman jev on. When on, loose phrasing is classified by Jev, a decision model that returns typed choices with a confidence — no text generation and no auxiliary LLM.

Two providers, same wire protocol:

ProviderEndpointModels
typesafe (default)https://api.typesafe.ai/v1/systemoneJev only (jev-latest)
openrouterhttps://openrouter.ai/api/v1/systemoneany of the 30 decision models (/caveman model list)

main is a third option: the session's own model, via the kernel LLM service, no key needed. It is the only path that uses an LLM.

/caveman jev on            # use the current provider
/caveman jev off           # heuristics only
/caveman jev typesafe      # switch provider (persisted)
/caveman jev openrouter
/caveman jev main          # session model, no key

Keys and thresholds

Keys live in the state file, never in the environment:

/caveman key typesafe <key>      # save (masked echo)
/caveman key openrouter <key>
/caveman key                     # show both, masked
/caveman key clear typesafe      # drop one

Confidence gates are per provider: 0.70 for TypeSafe, 0.35 for OpenRouter — the scales are not comparable across providers or models, so re-tune when you switch model. Below the gate the classifier stays silent and heuristics apply.

Every call is capped at 1.5 s (4 s for main) and every failure is swallowed: offline, 401, 429, timeout or junk JSON never blocks the turn.

Privacy: the candidate message and the on/off state go to the selected provider; nothing else. typesafe/openrouter hit TypeSafe's API (directly or through OpenRouter); main reuses the session provider.

State file

~/.config/caveman-plugin-dsh/config.json — created on first run, directory 0700, file 0600, atomic writes. It holds keys, provider, models, gates, jev on/off, and the voice mode/level, so everything survives a restart.

{
  "version": 2,
  "mode": "on",
  "level": "caveman",
  "decision": false,
  "provider": "typesafe",
  "models": { "typesafe": "jev-latest", "openrouter": "~typesafe/jev-latest" },
  "keys": { "typesafe": "", "openrouter": "" },
  "minConfidence": { "typesafe": 0.7, "openrouter": 0.35 }
}

A corrupt file is moved to config.json.bak-<ts> and regenerated; a file looser than 0600 warns. A version-1 file is migrated (its apiKey becomes keys.openrouter, decision resets to false).

Why a provider factory?

lib/decision.js keeps both providers in one table (base URL, default model, gate) and returns a client. The caller never branches; adding a backend is one row. main stays outside the factory because it has a different transport and no real confidence.

Configuration

Optional keys in the profile row's config:

KeyDefaultMeaning
alwaysOntrueinitial voice mode when the file is first created
decision.timeoutMs1500hard cap per classification
decision.apiKey–inline OpenRouter key for CI, wins over the file
commandstrueregister the /caveman command
statustrueshow the TUI badge
- id: caveman-plugin-dsh
  config:
    alwaysOn: false

CAVE_DEBUG=1 appends scope/classify decisions to $TMPDIR/caveman-plugin-dsh.log.

Compatibility

HostStatus
dsh tui 0.17works — voice, command, badge
dsh webworks — voice, command; no badge (the web has no tuiStatus)
subagentsexcluded by design; their reports stay in full prose

Scope of the port: this is the voice half of caveman. The input-compression proxy ("read less") has no dsh plugin seam today, so it is not included.

Layout

lib/index.js                   # the whole plugin (~270 lines, ESM, no build)
skills/caveman/SKILL.md        # verbatim upstream skills
skills/ultracave/SKILL.md
skills/megacave/SKILL.md
rules/caveman-activate.md      # verbatim upstream activation rule
dsh-plugin.json                # manifest v0.15
cordis.patch.yml               # profile-row insert

License

Plugin code: MIT (LICENSE). Skills and activation rule: Apache-2.0 © Julius Brussee — see NOTICE and LICENSE-Apache. The combined work is MIT AND Apache-2.0.

Comments

Loading…

Similar plugins

dsh-voice

by zhuiyueya

Voice for DeepSeek Harness(dsh) — speech-to-text input + read-aloud TTS for text-only DeepSeek, zero API key.

Manifest valid

★ 4

↓ 1.5k/wk

MIT

JavaScript

Aug 15, 2026

dsh plugin --profile web add dsh-voice

by JimLuan

Terminal UI plugin for the DeepSeek Harness dsh CLI: an interactive in-process host surface over dsh-base (sessions, streaming conversation, tool cards, approvals, questions, jobs, subagents, goals, p

Manifest valid

★ 0

TypeScript

Aug 16, 2026

dsh plugin --profile web add dsh-tui-plugin

by mohith-das

Minimal, English-only voice input plugin for DeepSeek Harness Web UI — a mic button in the composer using the browser's native SpeechRecognition API. Zero dependencies, no subprocess, no tracking.

Manifest valid

★ 0

MIT

JavaScript

Sep 1, 2026

dsh plugin --profile web add dsh-voice-input-en

by 1624318455

Edge TTS voice plugin for DeepSeek Harness: read assistant replies aloud, auto-read toggle, voice settings panel (free, no API key)

UI & ExperienceManifest valid

★ 48

MIT

JavaScript

Oct 13, 2026

dsh plugin --profile web add @dsh-external/dsh-plugin-tts

by wangcd1313

DSH(DeepSeek Harness)回答语音朗读插件:把回复念出来,切窗口/切会话立即停止,设置页可调

Manifest valid

★ 0

MIT

JavaScript

Oct 20, 2026

dsh plugin --profile web add dsh-plugin-speak

by adrianleb

A persistent, responsive tmux control-mode cockpit for DeepSeek Harness Web.

UI & ExperienceDevelopment & InfrastructureManifest valid

★ 0

MIT

TypeScript

Oct 20, 2026

dsh plugin --profile web add dsh-tmux-cc