Skip to content
dsh.fish
Bundle

dsh-composer-enter-invert

DSH Web Composer Enter/Shift+Enter keybinding switcher.

Source
XiaoYuOvO
License
MIT
Updated
Updated 6 days ago

Readme

# dsh-composer-enter-invert

A DSH Web bundle plugin that changes Composer keyboard semantics only while the focused element is the conversation textarea.

## Behavior

- `default` (the durable default): Enter sends; Shift+Enter inserts a newline.
- `inverted`: Enter inserts a newline; Shift+Enter sends.
- IME composition (`isComposing` or key code 229) is never intercepted.
- Other inputs, command controls, approval controls, and global shortcuts are not intercepted.

Open **Settings -> General -> Composer send keys** and choose the desired mode. Changes take effect immediately in the current Web page.

## Design

The plugin does not replace the Composer or call the conversation transport itself.

In inverted mode, it installs one native capture-phase `keydown` listener and limits it to an enabled, writable textarea inside `[data-composer-card]` that is the active element.

- Plain Enter is prevented and inserts text with `document.execCommand("insertText", false, "\n")`. A `setRangeText` plus bubbling `input` fallback is used only when the browser rejects `execCommand`, so React's existing `onChange` continues to update the official draft machine and undo stack.
- Shift+Enter is prevented, then replayed to the textarea as an Enter event with only `shiftKey` removed. The replay is guarded with a `WeakSet`, letting the shipped Composer `onKeyDown` execute unchanged. That path still calls its `keyboard.arbitrate("enter", composing)` and `keyboard.submit(resolveSubmitMode(...))` logic.

Consequently, command-menu Enter arbitration, empty-draft protection, attachment-only sends, draft commit/restore, busy queue/steer policy, accelerated Ctrl/Cmd behavior, and image attachment handling stay in the shipped state machine. `ui-conversation.busyEnter` remains the authority for Queue versus Steer whenever a send is accepted during a running conversation.

If the setting is `default`, or this Client half is stopped/uninstalled, no event is intercepted and the shipped key behavior is untouched.

## Persistence and portability

The selected mode is stored in browser `localStorage` under `dsh-composer-enter-invert.v1`. This keeps the setting self-contained, so a GitHub install does not require a matching Host settings namespace or a patch to `dsh-host-apiproxy`. The setting is browser-local rather than shared through `settings.yaml`; each browser profile can choose its own mode.

## Build

The browser loader artifact is intentionally committed in `lib/client.js`; Git/local installs do not need a bundler during installation.

```powershell
pnpm run build
pnpm run check
pnpm run test
```

## Install into the web profile

The package includes the generated `lib/` artifacts and can be installed directly from a public Git repository. Replace `<owner>/<repo>` with the repository containing this directory:

```powershell
node "G:\Deepseek Harness Desktop\dependencies\dsh\node_modules\@deepseek-ai\dsh\lib\bin.js" plugin --profile web add "https://github.com/<owner>/<repo>.git"
node "G:\Deepseek Harness Desktop\dependencies\dsh\node_modules\@deepseek-ai\dsh\lib\bin.js" --profile web --dump-config
```

A tagged or commit-pinned source is preferable for repeatable installs, for example `https://github.com/<owner>/<repo>.git#v0.2.0`. The install command writes only to the selected `web` profile. Restart the existing DSH Web process after installation, then refresh `http://127.0.0.1:3080`. No global npm install, Host whitelist edit, or extra dependency installation is required.

## Manual verification

1. Select `Inverted` under Settings -> General -> Composer send keys.
2. In the focused Composer, press Enter and verify a newline appears.
3. Type non-empty text and press Shift+Enter; verify the existing Composer sends it.
4. With an empty Composer and no attachments, press Shift+Enter; verify no empty message is sent.
5. While a primary agent is running, verify Shift+Enter follows the existing `busyEnter` Queue/Steer choice.
6. Switch back to `Default` and verify shipped Enter/Shift+Enter behavior resumes immediately.

Install

dsh plugin --profile web add github:XiaoYuOvO/dsh-composer-enter-invert

Profile: web

  • This package builds from source on install. pnpm will ask you to allow its build script — that is permission to run the package’s code on your machine, outside the agent sandbox. Only allow sources you trust.
  • This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.
Source