dsh-web-search-ddg
aooyoo
Zero-token DuckDuckGo search provider for the DeepSeek Harness (DSH) web seam — local headless browser, no API key, no m…
PROJECT TOPICS
PROJECT README
English | 中文
A recoverable conversation-deletion plugin for DeepSeek Harness. It contributes Delete conversation to each Session row menu and also registers /delete-conversation. After explicit confirmation, the selected Session lifecycle is queued and immediately hidden through the Workspace's durable archive projection; on the next DSH start its JSONL directory is atomically moved into recovery trash before the Web Workspace builds its index.
DSH currently defines Session persistence as append-only and exposes no deletion method. A live Agent's teardown handle also belongs only to its creator. Moving a log underneath a live writer would be unsafe, so the plugin separates intent from execution: the running process persists a request, and the next process performs the move before any Session is resumed.
This package is a self-contained DSH bundle with cordis.patch.yml. It does not patch or rebuild the DeepSeek Harness source tree. Install it into a Web profile with the built Harness CLI:
node /path/to/DSH/apps/cli/lib/bin.js plugin --profile web add /path/to/dsh-essential
Restart DSH after installation. The bundle mounts the plugin, stores state under the DSH home conversation-trash directory, and makes the Web Workspace wait for deletion recovery before indexing persisted Sessions.
For a direct cordis.yml composition, stateDir is required and absolute:
- id: essential-conversation-delete
name: '@deepseek-ai/dsh-essential'
config:
stateDir: /absolute/path/to/conversation-trash
Open a Session row's … menu and choose Delete conversation. The Web UI opens an in-page card titled Delete this conversation? with Cancel / Delete conversation actions; it no longer uses native browser dialogs. Confirming addresses the clicked Session through the plugin's root Remote (which also works for historical Sessions without a live Agent), then archives the Session so it disappears immediately from every Session grouping surface. Cancelling sends no request.
Until Harness exposes a public Session-menu slot, the plugin observes semantic Session tree rows and portals its React action into the menu DOM from a stable document-level controller. The controller survives Host menu auto-close, so the confirmation card cannot disappear with the menu subtree. A pointer-boundary bridge keeps cross-root movement onto Delete conversation inside the Host menu; entering the action also explicitly cancels Host pointer grace when a browser omits relatedTarget, while normal pointer-leave dismissal outside it remains intact. Exact identity comes from the row's React owner; a unique visible-title match is the fail-safe fallback. Ambiguous rows are left untouched rather than risking deletion of the wrong Session.
While deletion is pending, the card pins itself open, disables both actions, changes the primary button to Deleting…, and shows progress. Failures and queued-but-not-hidden partial outcomes render inside the card. On full success, the disappearing row is the result feedback; no second success popup interrupts the flow.
Immediate hiding changes only the Workspace list projection; it never moves or deletes an active log. The next cold start still validates the exact lifecycle before moving the log into recovery trash. If queueing succeeds but the archive request fails, the plugin reports that deletion is queued but the row could not yet be hidden instead of misreporting the deletion as rejected.
The human command remains available. Delete the current conversation:
/delete-conversation CONFIRM
Delete another conversation by Session id:
/delete-conversation <session-id> CONFIRM
After the command succeeds, restart DSH. The next boot moves the log to <stateDir>/trash/<session-lifecycle-key>/. Its deletion.json records the original directory. To restore, stop DSH, remove deletion.json, and move the directory back to originalDirectory.
| Field | Type | Default | Meaning |
|---|---|---|---|
stateDir |
string | required | Absolute pending-request and recovery-trash directory, outside Session artifact directories. |
commandName |
string | delete-conversation |
Optional human-command alias without /; the menu always uses stable /delete-conversation. |
CONFIRM is mandatory.sessionId, createdAt, and cwd, preventing a reused id from deleting a newer lifecycle.See docs/design.md for the transaction design.
pnpm install
pnpm run verify:self-contained
pnpm run typecheck
pnpm test
pnpm run build
pnpm run prepare
No direct model input. The command layer handles /delete-conversation without sending it to the model. The command framework records log-only command/run and command/done events, which do not enter the conversation surface.
Zero direct request tokens and no model call.
The command neither replaces an existing model-request prefix nor creates an independent request. Once the entire Session is removed, it produces no future requests.
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。