Introduction¶
DSH agents live only within a single session by default. Once a session ends, information regarding user preferences, project conventions, and previous progress is completely lost, and the next session has to ask everything from scratch again. Common solutions involve setting up a vector database for retrieval or stuffing logs into a JSON file. However, the former is operationally heavy, while the latter often degenerates into a mess—trying to keep everything and ending up with nothing useful.
dsh-journal takes a third path: instead of pursuing similarity-based retrieval, it assigns a graded level to each piece of memory, keeping important items around longer and letting unimportant ones fade out naturally. Below is an introduction to this plugin.
What is it?¶
dsh-journal is a DeepSeek Harness plugin maintained by Ghill-0131, classified under “Memory,” currently with 0 stars. It wraps a plain text JSONL file into a first-class journal tool within the host. Its core capability is graded long-term memory: each record comes with a level, an expiration time, and a review date, allowing long-running agents to keep the right things for the right amount of time, leaving the rest to time naturally.
One-sentence positioning: It is a small, human-reviewable, manually curated log, closer to a notepad than a database.
Grading Model¶
The plugin’s logic is: when writing, you shouldn’t ask “Is this important?”, but rather “Is this a skeleton or a file?” The level directly determines the lifecycle:
| Level | Meaning | Lifecycle |
|---|---|---|
S |
Relationships, emotions, shared experiences, commitments | Never auto-delete, pinned |
A |
Persistent facts, preferences, key decisions | 365 days |
B |
Project context, task progress | 60 days |
C |
Temporary details, one-time operations | 7 days |
The rules are simple but practical: how you talk to people belongs to S, the port number you troubleshooted yesterday belongs to B, and the handover notes left for the next session belong to A (because it only needs to live until it is read once).
Expiration does not result in physical deletion. prune is a soft delete, moving expired rows into archive/; pinned rows are exempt.
Core Features¶
The plugin exposes one tool and eight actions:
| Action | Purpose |
|---|---|
add |
Write a record (level, title, text are required) |
list |
List records, filterable by level / status |
search |
Substring search in title, body, and tags |
digest |
Output S + A summary, the content a new session should read first |
stats |
Counts by level, file size, number of expired but not cleaned |
review |
Push the expiration date of a specific record further out |
prune |
Soft delete all expired records |
render |
Rewrite JOURNAL.md, generating a readable summary |
Storage consists of a single file: <root>/journal.jsonl, one JSON object per line. Writes go through a temporary file and then rename; crashes mid-process won’t corrupt the storage. Reads skip the last line if it is a partial/truncated line instead of failing the call. The record structure is as follows:
{
"id": "j-20261104-140902-479d",
"ts": "2026-11-04T14:09:02+00:00",
"level": "B",
"kind": "fact",
"title": "short one-line title",
"text": "the body; facts, not reflections",
"tags": ["..."],
"pinned": false,
"status": "active",
"expires_at": "2027-01-03T14:09:02+00:00",
"reviewed_at": null,
"source": ""
}
The format is deliberately kept simple: any script that can read JSONL can read it, and any script that can write a line can append to it.
Installation and Usage¶
This plugin’s installation method differs from standard npm dependencies and requires special attention. DSH plugins only get the host package (@deepseek-ai/*) when installed as a link; regular npm dependencies fail to import and are silently skipped. The installation steps provided in the README are as follows.
-
First, put the code in a stable location, not in the profile directory, for example
D:\DSH-Plugins\dsh-journal\0.1.0\. -
Use real junctions to create the link. Cross-drive symlinks might become broken links without error, so junctions must be used here:
New-Item -ItemType Junction `
-Path "$env:USERPROFILE\.dsh\profiles\desktop\node_modules\dsh-journal" `
-Target "D:\DSH-Plugins\dsh-journal\0.1.0"
- Add it to both lists in the profile’s
package.json:
// dependencies
"dsh-journal": "link:D:/DSH-Plugins/dsh-journal/0.1.0"
// dsh.profile.bundles
"dsh-journal"
Here, let Node handle the file changes rather than doing a pure text replace: an extra comma will cause the profile to fail parsing, and the harness won’t start.
- Restart the harness.
Configuration is written in the bundle layer’s cordis.patch.yml:
# key / default value / meaning
# root: D:/dsh-data/journal (Windows) or /dsh-data/journal
# —— directory where journal.jsonl is located
# toolName: journal
# —— the name of this tool in the model's toolset
Additionally, the JOURNAL_ROOT environment variable can override root.
Typical Usage¶
Below are typical calls within an agent loop, directly from the README:
journal action=digest # Run once at the start of a new session
journal action=add level=S title="..." text="..."
journal action=search query=备考
journal action=prune dryRun=true # First see what will expire, make no changes
The daily rhythm is: read digest at the start of a session to get what needs to be known; write the continuously generated information into the journal according to level; before ending, run prune dryRun=true to confirm nothing needs to be reviewed early; if needed, review it, otherwise let expired items archive naturally.
Use Cases and Considerations¶
Suitable for DSH developers who need context continuity across sessions but do not want to introduce a vector database and retrieval chains. Its bet is: an agent that writes a few hundred key lines and forgets the rest in time is better than an agent that tries to save everything and has to search for it later.
Keep a few points in mind:
- This is a plugin, running with the permissions of the current dsh process; you should check the source code and license (MIT) before installing.
- It is not a vector database, does not perform similarity search, and cannot replace semantic recall.
- The
journaltool will appear in the model’s toolset. Whether the level division is reasonable and whether the expiration times are appropriate needs to be tuned based on actual tasks. - Depends on Node >= 22.13.
Conclusion¶
The value of dsh-journal lies not in storage volume, but in giving the agent a set of clear rules on “what to remember and for how long,” and the entire storage is pure JSONL, readable by humans and scriptable. If you are using DSH to build a long-running assistant, it is worth trying it as the first memory layer.
- Directory: https://www.skillhub.cn/plugins/Ghill-0131/dsh-journal
- GitHub: https://github.com/Ghill-0131/dsh-journal