> This repository has moved into one monorepo.
>
> The BornCode plugins — agent customization, desktop control, auto-continue,
> auto-shutdown, browser use, session instructions, session sync, and the side
> chat — now live in
> borncode-app/dsh-borncode,
> one repository with one Plugins entry.
>
> | this repo | new home |
> |---|---|
> | dsh-agent-customizer | packages/dsh-agent-customizer |
> | dsh-agent-desktop | packages/dsh-agent-desktop |
> | dsh-auto-continue | packages/dsh-auto-continue |
> | dsh-auto-shutdown | packages/dsh-auto-shutdown |
> | dsh-browser-use | packages/dsh-browser-use |
> | dsh-session-instructions | packages/dsh-session-instructions |
> | dsh-session-sync | packages/dsh-session-sync |
> | dsh-side-chat | packages/dsh-side-chat |
>
> The code and its history are unchanged; only the repository is shared. Install
> dsh-borncode instead of the individual bundles. This repository stays open
> so the old links keep working.
dsh-session-sync
Brings your Claude Code and MiniMax Code conversations into DeepSeek Harness — in the right workspace.
What it does
You have conversations in Claude Code (~/.claude/projects/**/*.jsonl) and in MiniMax Code
(~/.minimax/v2/sqlite/runtime-state.sqlite plus its dated session directory). The Harness knows nothing about
them, so the work you did there is invisible here.
This plugin imports those conversations as ordinary persisted DSH sessions, filed under the workspace whose
folder matches the session's own working directory — and marks every one of them with the logo of the app it
came from.
The plugin follows one rule: a workspace is keyed by its folder path. A session recorded in
C:\Users\you\Documents\portfolio is imported into the DSH workspace for exactly that folder; a workspace is
created when the folder does not have one yet. The workspace's existing title is kept.
What gets imported
| Source | Read from | Notes |
|---|---|---|
| Claude Code | ~/.claude/projects/*/*.jsonl |
Main-thread user and assistant text; sidechains, tool traffic, and injected ` context are skipped. The transcript'scustom-title/agent-namebecomes the DSH title; a mid-sessionrelocated` record wins as the working directory. |
| MiniMax Code | ~/.minimax/v2/sqlite/runtime-state.sqlite |
The display message rows (user/assistant) of each row in local_runtime_sessions; greeting and tool-result rows are skipped. The MiniMax title and workspace_dir are preserved. |
| DSH | Existing persisted sessions | Not copied. They are accounted as source dsh; a row with no map entry shows the DSH logo. |
Imported sessions are ordinary persisted DSH sessions: they appear in the sidebar, open in the Conversation view,
carry the origin logo, and can be archived or deleted like any other session. A session is never imported twice:
the state file maps every external session to a deterministic DSH session id.
Flags (the row logo)
Each Session row shows a 14 px logo in its leading cell:
- orange starburst — Claude Code
- violet M — MiniMax Code
- blue D — a DSH session
The logo is drawn as inline SVG, so it matches the interface in every theme and costs one small component per idle
row. The source map is fetched once from the Host status route; a late answer re-renders every mounted row through
one shared store. A row that shows a status dot keeps that dot in the same cell (the cell is reserved for the row's
primary state), so the logo appears on idle rows.
Control route (Host + one client slot)
The Host answers a JSON route at /plugins/session-sync:
GET— counts per origin, the last run, both source paths.POST {"action":"sync"}— scan and import now.POST {"action":"warm"}— rebuild the projection cache for imported sessions (the sidebar reads historical
titles from that cache).POST {"action":"verify","sessionId":"…"}— replay-validate one imported log.POST {"action":"regroup","dryRun":true}— plan the MiniMax regroup (below).POST {"action":"regroup"}— run it.POST {"action":"rename-sandboxes"}— give the remaining MiniMax sandbox workspaces their conversation's title.
Automatic sync runs 3.5 seconds after startup and then every 15 minutes. It only parses sessions whose external
fingerprint changed, so a quiet run is cheap.
MiniMax sandboxes and the regroup
MiniMax Code stores each session's working directory as its own sandbox (~/.minimax/sessions//workspace), not
the folder the user was working in. The real folder only appears in the prompt — usually inside …
or as an absolute Windows path.
regroup reads the prompt, resolves the first path that is an existing project folder, imports the conversation
into that folder's workspace, and archives the sandbox copy. A path that runs into the surrounding sentence
(C:\FO3TH`, and deliver …) still resolves, because candidates are shortened from the right until one exists.
Refused as project folders: the home directory, hidden folders directly under it (~/.ssh),
AppData\Local\Temp, Windows, node_modules, .git, and anything inside another MiniMax sandbox. Only an
explicit `` tag may name a hidden folder.
A regroup run moves conversations like this:
| Session | From the sandbox to |
|---|---|
| เลืà¸à¸ GitHub repo ที่เหมาะทำ portfolio | C:\Users\you\Documents\portfolio |
| à¹à¸à¹‰à¸‚้à¸à¸„วามบนภาพเป็น à¸à¸£à¸¸à¸‡à¹€à¸—พใต้ | C:\Users\you\Documents\presenton |
| ย้à¸à¸™à¸§à¸´à¸¨à¸§à¸à¸£à¸£à¸¡ C:/FO3TH เป็นà¹à¸à¸› Android | C:\FO3TH |
| 查找å¯ç”¨ skills | C:\FO3TH |
The remaining MiniMax sessions name no folder in their prompt, so they stay in their sandbox workspace — which
rename-sandboxes renames to Mavis · instead of mvs_ workspace.
Requirements
| DeepSeek Harness | 0.2.x (Web GUI) |
| Runtime | Node 24, supplied by the Harness runtime |
| Optional | Claude Code (~/.claude) and/or MiniMax Code (~/.minimax) — import whichever exist |
| Note | MiniMax Code must expose node:sqlite (DatabaseSync); without it the plugin reports sqlite-unavailable instead of failing the run |
Install
git clone https://github.com/borncode-app/dsh-session-sync.git dsh-session-sync
Then in DSH: Plugins → install the bundle from that directory, or:
plugin_manager install_bundle target=C:\path\to\dsh-session-sync
Restart once. The first import happens a few seconds after startup.
Configuration
| field | default | meaning |
|---|---|---|
endpoint |
/plugins/session-sync |
Route the Client half reads and posts to |
autoSync |
true |
Scan after startup and on an interval |
intervalMinutes |
15 |
Minimum gap between automatic runs |
maxTextChars |
20000 |
Per-message character budget; longer bodies are truncated visibly |
claudeRoot |
~/.claude/projects |
Claude Code transcript root |
minimaxDatabase |
~/.minimax/v2/sqlite/runtime-state.sqlite |
MiniMax Code runtime database |
Files
| file | role |
|---|---|
index.js |
Host row: scanning, conversion, persistence, workspace accounting, status route |
lib/convert.mjs |
Pure transcript → DSH event conversion and title/id helpers |
lib/sources.mjs |
Claude JSONL and MiniMax sqlite readers, project-folder inference |
client.js |
The row logo component and its one-shot source-map store |
cordis.patch.yml |
Bundle patch |
state.json |
Import map and last-run report (written at runtime, not tracked) |
scripts/repair-titles.mjs |
Repair tool for the first build's session/title source |
scripts/reframe-sessions.mjs |
Rebuild the two-frame Zstandard layout of a log |
scripts/flag-titles.mjs |
Add the [Claude Code] / [MiniMax Code] title prefix (superseded by the logo) |
scripts/strip-prefixes.mjs |
Remove those prefixes from the logs |
scripts/reappend-titles.mjs |
Append a fresh title event so the projection cache picks up a corrected title |
locale/{en,th,zh}.json |
Plugin title and description |
icon.svg |
Plugin icon |
test/convert.test.mjs |
Conversion smoke test (no Harness required) |
test/sources.test.mjs |
Project-folder inference tests |
Run the tests with npm test (plain node --test, no Harness needed).
Limitations
- The import is a snapshot of the text conversation. Tool calls, tool results, reasoning blocks, and attachments are
not replayed, so a first run stays fast and the imported log stays readable. - An external session that receives more messages after it was imported is left at its imported revision; only new
sessions are added by later runs. Deletingstate.jsonand the imported DSH sessions re-imports afresh. - Imported logs are replay-validated with the persistence reader; the plugin exposes
POST {action:"verify"}on
its route for the same check. - A session whose recorded folder no longer exists is skipped and reported in the last-run issues instead of
inventing a workspace path. - MiniMax Code must expose
node:sqlite(DatabaseSync) to the Host; the plugin reportssqlite-unavailable
instead of failing the whole run when it does not.
ภาษาไทย
Plugin นี้ ดึงบทสนทนาที่คุณเคยคุยใน Claude Code à¹à¸¥à¸° MiniMax Code เข้ามาใน DSH โดยจัดเà¸à¹‡à¸šà¹€à¸‚้า workspace
ที่ตรงà¸à¸±à¸šà¹‚ฟลเดà¸à¸£à¹Œà¸—ี่ session นั้นทำงานà¸à¸¢à¸¹à¹ˆ — à¹à¸¥à¸°à¸•ิดป้ายโลโà¸à¹‰à¸à¸³à¸à¸±à¸šà¸§à¹ˆà¸²à¸¡à¸²à¸ˆà¸²à¸à¹à¸à¸›à¹„หน
| à¹à¸«à¸¥à¹ˆà¸‡à¸—ี่มา | à¸à¹ˆà¸²à¸™à¸ˆà¸²à¸ |
|---|---|
| Claude Code | ~/.claude/projects/*/*.jsonl (ข้าม sidechain, tool traffic à¹à¸¥à¸° ``) |
| MiniMax Code | ~/.minimax/v2/sqlite/runtime-state.sqlite (เà¸à¸²à¹à¸–วข้à¸à¸„วาม user/assistant เท่านั้น) |
- session ที่ import à¹à¸¥à¹‰à¸§à¹€à¸›à¹‡à¸™ session ปà¸à¸•ิขà¸à¸‡ DSH — เห็นใน sidebar, เปิดà¸à¹ˆà¸²à¸™à¹„ด้, archive/delete ได้ตามปà¸à¸•ิ
- import ซ้ำไม่ได้:
state.jsonเà¸à¹‡à¸š map ขà¸à¸‡ session ภายนà¸à¸ → id ขà¸à¸‡ session ใน DSH - โลโà¸à¹‰à¹ƒà¸™à¹à¸–ว: â ส้ม = Claude Code, M ม่วง = MiniMax Code, D น้ำเงิน = DSH
- regroup ช่วยà¸à¸£à¸“ี MiniMax เà¸à¹‡à¸š session ไว้ใน sandbox ขà¸à¸‡à¸•ัวเà¸à¸‡ — มันà¸à¹ˆà¸²à¸™ prompt หา path ที่เป็นโฟลเดà¸à¸£à¹Œà¹‚ปรเจà¸à¸•์จริง
à¹à¸¥à¹‰à¸§à¸¢à¹‰à¸²à¸¢à¹„ปเข้า workspace ขà¸à¸‡à¹‚ฟลเดà¸à¸£à¹Œà¸™à¸±à¹‰à¸™ (ปà¸à¸´à¹€à¸ªà¸˜à¸žà¸²à¸˜à¹€à¸ªà¸µà¹ˆà¸¢à¸‡ เช่น home dir,Windows,node_modules,.git) - sync à¸à¸±à¸•โนมัติหลังเปิดà¹à¸à¸› ~3.5 วินาที à¹à¸¥à¹‰à¸§à¸—ุภ15 นาที (ข้ามไฟล์ที่ไม่เปลี่ยน)
- ข้à¸à¸ˆà¸³à¸à¸±à¸”: import เฉพาะข้à¸à¸„วาม ไม่ดึง tool call / tool result / reasoning / ไฟล์à¹à¸™à¸š, à¹à¸¥à¸° session ที่ถูภimport ไปà¹à¸¥à¹‰à¸§
จะไม่à¸à¸±à¸›à¹€à¸”ตตามที่คุยต่à¸à¹ƒà¸™à¹à¸à¸›à¸•้นทาง (ลบstate.json+ session ที่ import à¹à¸¥à¹‰à¸§à¹€à¸žà¸·à¹ˆà¸ import ใหม่)
ติดตั้ง: git clone à¹à¸¥à¹‰à¸§ plugin_manager install_bundle target= ใน DSH รีสตาร์ทหนึ่งครั้ง
License
MIT © 2026 BornCode