背景
deepseek-harness(dsh,array2d/byteseek 的 reference)底层是 Cordis 插件框架。ctx.storage 是「非会话存储 hub」这一可换实现 seam,已有 storage-json、storage-sqlite 两个 backend。一个 backend 要实现三接口:
StorageBackend { kv?: KvFacet; close() }
KvFacet { open(descriptor): Promise<KvUnit> }
KvUnit { loadAll / putRecord / deleteRecord / setGlobal / close }
方案
把 kvspace-durable 做成 dsh 的 storage backend 插件 @deepseek-ai/dsh-storage-kvspace:实现 StorageBackend 的 kv facet,靠 DSN 白拿 redis/fs/s3 三种持久化后端,覆盖 json/sqlite 做不到的多进程共享 + 远程持久化。
KvUnit ↔ kvspace* ABI 映射
| KvUnit 接口 |
kvspace ABI |
key 布局 |
| open(descriptor) |
kvspaceConnect(dsn) |
单元名 → 前缀 /dsh// |
| loadAll() |
kvspaceList + kvspaceGetBatch |
前缀扫描 + 批量读 |
| putRecord(t,k,v) |
kvspaceSet |
/dsh///,value 存 JSON 串
| deleteRecord(t,k) |
kvspaceDel |
同上 |
| setGlobal(v) |
kvspaceSet |
/dsh//__global |
| close() |
kvspaceClose |
— |
挑战
- FFI 桥:dsh 是 Node/TS,kvspace-durable 是 Rust cdylib。用 napi-rs(编译进 .node)或 koffi(运行时 dlopen)包装 25 个 kvspace* 符号。
- JSON 序列化:putRecord 前 stringify、loadAll 里 parse;大 value/NUL 走 kvspaceSet 显式长度路径。
- 快照一致性:loadAll 是多 key 读,kvspace 无跨 key 事务,只能单 key 原子(KvUnit 契约允许,写排序归调用方)。
参考
- dsh
docs/capability-seams.md
- dsh
packages/storage/storage/src/backend.ts(backend 契约)
- dsh
packages/storage/storage-json/src/index.ts(backend 实现范例)
|
背景
deepseek-harness(dsh,array2d/byteseek 的 reference)底层是 Cordis 插件框架。
ctx.storage是「非会话存储 hub」这一可换实现 seam,已有storage-json、storage-sqlite两个 backend。一个 backend 要实现三接口:StorageBackend { kv?: KvFacet; close() }KvFacet { open(descriptor): Promise<KvUnit> }KvUnit { loadAll / putRecord / deleteRecord / setGlobal / close }方案
把 kvspace-durable 做成 dsh 的 storage backend 插件
@deepseek-ai/dsh-storage-kvspace:实现StorageBackend的kvfacet,靠 DSN 白拿 redis/fs/s3 三种持久化后端,覆盖 json/sqlite 做不到的多进程共享 + 远程持久化。KvUnit ↔ kvspace* ABI 映射
挑战
参考
docs/capability-seams.mdpackages/storage/storage/src/backend.ts(backend 契约)packages/storage/storage-json/src/index.ts(backend 实现范例)