English | 中文
Human-facing /feedback capture. The plugin registers one global command through ctx.commands, so every composed command adapter discovers it; the shipped TUI executes it without a model turn.
| Input | Result |
|---|---|
/feedback <text> |
Acknowledge with Feedback recorded. The registry's command/run record carries the verbatim text. |
/feedback |
Return a direct usage error. Whitespace-only input is treated as empty. |
Feedback text is never parsed: no truncation, case folding, or control words. Text that looks like another command, such as /feedback /plan felt slow, is feedback content. Repeated commands each produce their own record; nothing is replaced or merged.
The command records a remark and does nothing else. It appends no session event of its own, starts no model work, and no plugin in this repository reads its records.
The record is the command registry's own command/run / command/done pairing, which dsh-commands appends for every dispatched command. Those appends start persistence's ordinary eager drain; neither the registry nor this command forces a session/flush, so the acknowledgement means the entry is in the log, not that it has already reached disk. command/run carries the command name, the verbatim unparsed suffix, and the invocation source; the paired command/done carries the outcome. Both are log-only and are absent from the ordered surface, from deriveMessages(), and from every model request. A rejected empty input still leaves that pairing, settled as kind: 'error', so no entry can be mistaken for accepted feedback.
A dedicated session/feedback event was considered and rejected: it would duplicate a record the registry already writes, and a consumer can select feedback by the command name it already stores.
The producer injects only commands. A custom app mounts the registry plus this plugin:
- id: commands
name: '@deepseek-ai/dsh-commands'
- id: command-feedback
name: '@deepseek-ai/dsh-command-feedback'
The TUI app mounts this command unconditionally; it has no configuration and no dependency on the persisted-goal stack. The headless CLI, ACP automation, and JSON-RPC adapters do not consume ctx.commands, so they do not expose it.
/feedback captureNothing. The slash input, the recorded text, and the acknowledgement are all absent from model requests. The registry's command/run and command/done records are log-only and carry no surfaceOp, so they never reach the ordered surface, deriveMessages(), or a system prompt. Recording feedback during a turn does not change that turn's remaining requests.
Zero direct token effect. Neither an accepted entry nor a usage error adds model tokens, in the recording turn or any later one.
Independent of the model request path. Recording appends to the session log only, leaving an already-reusable request prefix untouched. Nothing this package contributes can invalidate cache reuse.
command/run records by command name.command/run stores the raw suffix, including its leading separator whitespace, so a consumer trims at read time.ctx.sessions.flush(session).ctx.commands, so /feedback is unavailable there.