@takboo/dsh-session-bin 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +122 -2
- package/cordis.patch.yml +4 -0
- package/dist/client-model.js +1673 -0
- package/dist/client.js +17043 -0
- package/dist/client.js.map +1 -0
- package/dist/host/archive.d.ts +766 -0
- package/dist/host/lease.d.ts +4 -0
- package/dist/host/module.d.ts +705 -0
- package/dist/host/native-jsonl-files.d.ts +198 -0
- package/dist/host/native-retirement-admission.d.ts +33 -0
- package/dist/host/native-retirement-metadata.d.ts +116 -0
- package/dist/host/native-retirement-owner.d.ts +305 -0
- package/dist/host/native-retirement-persistence.d.ts +24 -0
- package/dist/host/native-retirement-sdk.d.ts +80 -0
- package/dist/host/native.d.ts +12 -0
- package/dist/host/platform-files.d.ts +19 -0
- package/dist/host/remote.d.ts +32 -0
- package/dist/host/retirement-owner-store.d.ts +124 -0
- package/dist/host/retirement-owner.d.ts +124 -0
- package/dist/host/retirement-store.d.ts +311 -0
- package/dist/host/retirement.d.ts +76 -0
- package/dist/host/store.d.ts +215 -0
- package/dist/index.d.ts +912 -0
- package/dist/index.js +5008 -0
- package/dist/index.js.map +7 -0
- package/dist/operations/archive.d.ts +82 -0
- package/dist/operations/index.d.ts +2 -0
- package/dist/operations/retirement-owner.d.ts +129 -0
- package/dist/operations/retirement.d.ts +821 -0
- package/dist/operations/schema.d.ts +115 -0
- package/dist/operations.js +130 -0
- package/dist/operations.js.map +7 -0
- package/dist/remote/contracts.d.ts +891 -0
- package/dist/remote.js +442 -0
- package/dist/remote.js.map +7 -0
- package/dist/types/client/components.d.ts +17 -0
- package/dist/types/client/index.d.ts +10 -0
- package/dist/types/client/locales.d.ts +116 -0
- package/dist/types/client/model.d.ts +137 -0
- package/dist/types/client/purge-batch.d.ts +45 -0
- package/dist/types/client/retirement-digest.d.ts +3 -0
- package/dist/types/operations/archive.d.ts +82 -0
- package/dist/types/operations/retirement.d.ts +821 -0
- package/dist/types/operations/schema.d.ts +115 -0
- package/dist/types/remote/contracts.d.ts +891 -0
- package/docs/client-interface.md +79 -0
- package/docs/host-lifecycle.md +160 -0
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +163 -4
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# 客户端与 Remote 接口
|
|
2
|
+
|
|
3
|
+
本文说明客户端交互、严格 Remote 合约和插件生命周期。实际验证结果见[客户端验证](verification/client-interface.md),实现状态见 [README](../README.md)。
|
|
4
|
+
|
|
5
|
+
`0.1.0` 的 bundle、客户端 Module Loader、样式归属及 Typert contribution 使用 npm 身份 `@takboo/dsh-session-bin`。面板、存储域和 pending 缓存保持原有稳定身份;scoped 包安装前先卸载未加 scope 的开发包。
|
|
6
|
+
|
|
7
|
+
## 原生归档管理
|
|
8
|
+
|
|
9
|
+
Harness 原生 Archive 是唯一归档入口。插件不注册会话菜单中的“移入回收站”,也不提供第二个归档 Undo;归档活动保护、停止确认及撤销由宿主原生交互负责。
|
|
10
|
+
|
|
11
|
+
侧栏入口与根 `main` 槽位共用 `dsh-session-bin.panel` 身份。面板直接展示原生已归档集合,包括插件安装前或由其他原生界面归档的会话。名称来自原生 Session 摘要,工作区按当前 `WorkspaceView.sessionIds` 匹配;不为列表激活或 retain 冷会话,也不读取日志。支持名称及工作区元数据搜索、工作区筛选、单项取消归档和固定选择的批量取消归档。
|
|
12
|
+
|
|
13
|
+
选中对象使用 Host 的观察 `entryId`。请求再次核对准备结果中的身份,批量在开始时固定对象集合;后来归档的会话不加入。成功项取消选择,失败项保留并显示逐项原因,已经退出集合的对象退出选择。取消归档始终移除原生归档标记,不沿用旧 Bin 的 `wasArchived`。原生集合没有归档时间;列表不显示旧移入时间、首次观察时间或“原先已归档”标签。观察身份也不是宿主生命周期或原生归档代际,不能保证识别未观察的取消归档再归档。
|
|
14
|
+
|
|
15
|
+
界面使用宿主 Button、Checkbox、Input、Toast 和图标;布局使用 CSS Modules 与宿主语义 token。字典在独立 `dshSessionBin` namespace 注册完整中英文。原生插件管理元数据由 [English metadata](../locale/en.json) 与[中文 metadata](../locale/zh.json)提供。语言切换更新面板、侧栏及辅助标签,保留选择和搜索草稿;用户会话及工作区名称保持原值。搜索在 composition 期间保留草稿,结束后应用筛选;Escape 不截断组合输入。浅深色由宿主主题解析。
|
|
16
|
+
|
|
17
|
+
## 单项永久删除
|
|
18
|
+
|
|
19
|
+
每个归档行提供单项永久删除。客户端先准备并固定同一观察 entryId,准备结果不能静默换成后来对象。原生 Modal 展示不可逆语义、实际 blockers,以及共享附件/独立 fork/外部副本保留范围;初始焦点为取消,须勾选确认才能执行同一私有快照计划。取消、关闭和 preparation 不执行删除。仅支持 Host 经过独立版本/资源检查的冷会话组合,加载、活动或未排空引用会明确阻止;固定批量与清空复用相同的单项资格,规则见下一节。
|
|
20
|
+
|
|
21
|
+
严格执行只接受 v2 purge;旧 v1 仅历史查询。删除与取消归档分别保存 journal/pending,永久删除成功只认 owner done 的完整固定请求/资源/nonce 回执。pending-recovery/partial-failure 持续保护对象,客户端可检查或明确继续同一个已保存操作;未曾观察 admission 的 missing 必须重新准备与确认,若旧观察已更换可明确放弃缺失的本地请求再选择新行,不能把旧请求改绑新对象。已观察的授权或无法恢复的观察见证继续保持未知保护,规则见下文连接恢复。
|
|
22
|
+
|
|
23
|
+
## 固定批量永久删除与清空
|
|
24
|
+
|
|
25
|
+
固定选择使用当前选中的观察 entryId;“清空全部归档(N)”始终从 Model 的完整 `entries` 冻结点击时全部对象,搜索或工作区筛选只改变列表显示,不改变范围和计数。期间新增归档、同 SID 的新观察不加入;旧对象变化由准备/执行复核并逐项阻止。选定编排见 [ADR 0009](decisions/0009-fixed-purge-batches.md)。
|
|
26
|
+
|
|
27
|
+
页面级批次先串行准备每项独立 lifecycle 与冻结清单,全部准备结束后展示固定总数、可执行数、阻止数、逐项原因及清除/引用释放/共享与协调记录保留范围。准备 blocker 不伪造 Host 回执,零可执行项不得开始。原生 Modal 默认聚焦取消,勾选不可逆确认后才发送私有冻结计划;公开快照或调用方对象的改动不扩展范围。
|
|
28
|
+
|
|
29
|
+
执行串行复用既有单项 Remote/journal,最多一条未终结发送项。success/rejected/conflict 可继续下一项;pending/partial、断线未知或 missing 都立即暂停后续对象。当前项由既有查询、同操作续办或未观察 admission 时的 fresh prepare + 再确认处理;确认当前结果后仍需明确继续剩余项。停止只取消尚未发送项,不 abort 或改绑已发送项;已接受准备也须排空后才可开始新批次。批次内 missing 不提供放弃保护旁路。
|
|
30
|
+
|
|
31
|
+
停止或重载后,已发送项保留批次来源标记,仍禁止放弃保护;未观察 admission、Host journal 确认缺失且观察身份仍匹配时,可独立重新准备并再次确认。取消新确认保留旧 pending;明确执行新确认后才替换旧计划。已停止批次的剩余项保持取消,重载作废的未发送队列不重建。连接失败或执行期间更换 baseline 时,排空当前已发送项并暂停下一项;即使新 baseline 先于当前回复到达,也须明确继续。
|
|
32
|
+
|
|
33
|
+
重载只查询已发送单项,不恢复未发送内存队列,不自动删除。没有额外 Host batch journal 或跨会话事务;每项结果仍由完整 owner done 回执决定。单个批次可含超过 64 个终态目标,但 pending/grant/observation 原始缓存超过容量时不截断、不迁移、不重写,只核对现有结果并禁止新删除。成功项退出选择,失败、阻止和未知项保留并逐项显示。
|
|
34
|
+
|
|
35
|
+
## 严格 Remote 边界
|
|
36
|
+
|
|
37
|
+
[Remote 合约](../src/remote/contracts.ts)使用公开手工 `TypertContribution` 和 `InvocationDescriptor`,与 Host DTO schema 共用声明。Host Service 是 `sessionBinRemote`,wire namespace 是 `sessionBin`;[适配器](../src/host/remote.ts)通过公开 `TypertRemoteService` 绑定 Host Interface,不增加自定义 HTTP 路由。
|
|
38
|
+
|
|
39
|
+
| 客户端调用 | 结果 |
|
|
40
|
+
| --- | --- |
|
|
41
|
+
| `prepare({ action: 'unarchive', sessionId, operationId? }, signal?)` | `RemoteResult<ArchivePlan>`,只准备并复核状态。 |
|
|
42
|
+
| `execute(plan, signal?)` | `RemoteResult<ArchiveResult>`,复核固定观察对象与当前原生归档状态,保存回执。 |
|
|
43
|
+
| `list(signal?)` | `RemoteResult<ArchiveEntry[]>`,完整原生归档管理集合。 |
|
|
44
|
+
| `getOperation(operationId, signal?)` | `RemoteResult<ArchiveOperation \| BinOperation \| null>`,保留旧 v1 回执查询。 |
|
|
45
|
+
| `preparePurge({ sessionId, operationId? }, signal?)` | `RemoteResult<PurgePlan>`,固定 v2 对象与资源清单,只准备。 |
|
|
46
|
+
| `executePurge(plan, signal?)` | `RemoteResult<PurgeResult>`,只接受 v2,同计划授权/执行;包括 pending/partial。 |
|
|
47
|
+
| `getPurgeOperation(operationId, signal?)` | `RemoteResult<PurgeOperation \| null>`,查询 v1/v2 历史及中断状态。 |
|
|
48
|
+
| `purgeOperations(signal?)` | 只读查询 Host 删除 journal,新页面也能发现未完成的 v2 guard。 |
|
|
49
|
+
| `follow(signal?)` | 每代完整 `{schemaVersion:2, entries}`,后续合并通知并替换快照。 |
|
|
50
|
+
|
|
51
|
+
新条目和计划使用 v2 合约;旧 Bin domain 的 v1 合约留作兼容,不作为成员来源。新 Remote 不接受旧 `bin/restore` 变更。输入由 Gateway 检查 exact args 和严格 schema;输出提供显式 encode/decode 校验,流端由 Host 和 Client 各校验完整快照。业务 `rejected/conflict` 与 Transport/Host 的 `RemoteResult.ok:false` 分开处理。已经进入 Host 队列的请求完成持久化,客户端取消回复不会撤销已开始的操作。
|
|
52
|
+
|
|
53
|
+
浏览器先调用 `ctx.remote.$mount`,再建立声明 `remote.sessionBin` 的动态消费 fiber,按“挂载 → 动态依赖 → UI”的顺序执行。React、React JSX runtime、Cordis 和原生 primitives 复用平台身份。
|
|
54
|
+
|
|
55
|
+
## 连接恢复与卸载
|
|
56
|
+
|
|
57
|
+
[客户端模型](../src/client/model.ts)消费 Gateway 重连 stream。新代校验完整集合后接受 baseline,取消旧代不发布状态。连接失败显示重试入口并限制新变更。
|
|
58
|
+
|
|
59
|
+
删除 pending 使用独立 `dsh-session-bin.purge.pending.v2` 缓存;其中版本化 envelope 原子保存固定计划、授权见证与 observation-attempt marker,旧数组和独立 grant 缓存只读迁移。首次接受 owner nonce 前先可靠记录观察尝试,再保存完整 nonce;marker 有记录而 nonce 缺失、读取失败或旧缓存无法提供可靠见证时进入未知保护,不把另一个 nonce 当作首次基线、不宣告完成,也不能通过 missing 后重新准备或放弃本地请求解除可能已 admission 的保护。真正丢失回复、尚未观察 nonce 的请求仍可在重载后只查询匹配 journal 并确认结果。连接/重载自动流程不 execute 或 recover;Host journal 查询可发现没有浏览器副本的未完成 v2 操作,v1 不续办。显式继续须先查到匹配已保存的同一请求;未观察 admission 的 missing 删除需 fresh prepare + confirmation。已观察的 grant 变更、撤回或 journal 缺失,以及 entry/lifecycle/manifest/digest 变化,都不释放 guard。浏览器完全不提供缓存时只保证本页内存保护,不能把它写作持久化见证。
|
|
60
|
+
|
|
61
|
+
执行前保存完整计划及操作身份。浏览器 sessionStorage 可用时在同一页面会话中保留,重载先查询回执。连接基线只查询未知结果,不自动重发变更。显式“检查并重试”仅能在缺少回执时重新提交同一个新版计划;Host 仍复核状态并保证幂等。旧 v1 缓存迁移为只查询回执的记录,缺少旧回执也不能重放 `bin/restore`。旧成功结果不能被误报成新版取消归档成功。浏览器禁止存储时保留内存记录,跨页面能力受限。
|
|
62
|
+
|
|
63
|
+
Host follow 订阅原生 Workspace 与插件元数据变化,先订阅后取 baseline,合并重复通知;流不是持久化 journal。取消、return、卸载唤醒等待并移除监听。所有槽位、locale、样式和模型订阅绑定动态消费者;父插件卸载撤销 Remote namespace 并释放子插件。样式具有 Module Loader 的 `data-plugin` 所有权标记。
|
|
64
|
+
|
|
65
|
+
鉴权沿用宿主 Connection 的浏览器 session、Host/Origin 检查与 operator scope。逻辑 carrier 测试处于已准入边界;真实 CLI/profile 浏览器检查单独记录。
|
|
66
|
+
|
|
67
|
+
## 构建和检查
|
|
68
|
+
|
|
69
|
+
`./client` 导出预编译 DSH lazy CommonJS factory。特有 CSS Modules 嵌入工厂并由 fiber 管理;`./remote` 是浏览器安全合约,Host 入口不进入客户端依赖图。两个 TypeScript face 分开检查,配置与命令分别在 [mise.toml](../mise.toml) 和 [package.json](../package.json)。
|
|
70
|
+
|
|
71
|
+
- `mise run verify`:两端类型检查、构建、Host/Remote/模型及文案测试、tarball 检查。
|
|
72
|
+
- `mise run verify:gui`:顺序验收中文与 English,独立临时 DSH_HOME 中用公开 CLI 安装 tarball、启动真正 `dsh web`,检查原生 Archive/Undo、已有归档、取消归档、固定选择批量操作、语言切换、浅深色、窄屏和卸载。
|
|
73
|
+
- `DSH_GUI_LOCALE=zh-CN` 或 `en-US` 与 `mise run verify:gui:locale`:单语诊断。
|
|
74
|
+
|
|
75
|
+
GUI 检查先运行 `mise run install` 安装项目锁定依赖;新 Web profile 的安装使用 `--prefer-offline` 复用缓存并补齐独立解析的依赖,需要 npm registry 网络访问。需要可用 Chrome,可由 `DSH_GUI_BROWSER_EXECUTABLE` 指定 Chromium。脚本的 Host 使用系统空闲端口;只连接自己的独立测试宿主,不使用当前 GUI/profile。Linux 浏览器使用独立的 `/tmp/dsh-gui-*` 短临时目录,避免较长 CI 工作区路径超过 Chromium Unix socket 长度限制,关闭后清理并在报告中记录。卸载后的新 Web 启动使用新的浏览器数据目录,避免恢复连接旧测试端口的标签页。失败报告保留经脱敏的 stdout、stderr 和插件管理器日志;数据与截图保留在忽略的 `.local/gui/`。
|
|
76
|
+
|
|
77
|
+
## 当前边界
|
|
78
|
+
|
|
79
|
+
单 Host 部署、精确 SDK 版本、POSIX lease 及原生归档观察限制见[Host 生命周期](host-lifecycle.md)。本切片支持声明组合的冷会话单项、固定选择批量永久删除及点击时完整归档集合的手动清空,没有日志预览、自动定期清空、跨设备同步或多 Host 原生存储协调。原生删除、可逆集合管理和资源保留范围分别验证;SDK 未提供公共删除 API,实际由版本绑定插件 Adapter 执行。
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# Host 回收站生命周期
|
|
2
|
+
|
|
3
|
+
本文说明归档型回收站的 Host 操作协议、持久化规则和并发边界。对应传输与界面见[客户端接口](client-interface.md),运行证据见[Host 验证](verification/host-lifecycle.md)和[客户端验证](verification/client-interface.md);实现状态集中在 [README](../README.md)。
|
|
4
|
+
|
|
5
|
+
## 原生归档公共接口
|
|
6
|
+
|
|
7
|
+
生产 `ctx.sessionBin` 以原生 `archivedSessionIds` 为成员来源,包含插件安装前或其他原生界面建立的归档。读取公开 Workspace domain 已提交 global 快照并使用 `workspaceDomainState` 校验:锁定 SDK 的 `domain/changed` 先于 Registry 内存投影更新,不能在该帧处理中依赖仍可能过期的 getter。插件不写原生 domain,所有归档变更仍通过 Registry 的公开方法完成。插件不提供新的 `bin` 入口;Archive、活动检查、停止确认和 Undo 由宿主原生交互负责。选定架构见 [ADR 0005](decisions/0005-native-archive-collection.md)。
|
|
8
|
+
|
|
9
|
+
| 方法 | 行为 |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| `prepare({ action: 'unarchive', sessionId, operationId? })` | 返回 v2 固定观察身份、当前归档状态和 blockers,不修改原生状态。 |
|
|
12
|
+
| `execute(plan)` | 重新核对当前成员、观察身份、存在性与 pending deletion guard;新版成功始终调用原生取消归档。 |
|
|
13
|
+
| `list()` | 返回原生归档集合的 v2 `ArchiveEntry` 快照,旧 Bin 条目不影响成员。 |
|
|
14
|
+
| `getOperation(operationId)` | 返回新版回执或旧 v1 历史操作;同 operationId 不得跨协议复用。 |
|
|
15
|
+
| `operations()` | 列出新版取消归档 journal;旧记录通过 `getOperation` 按身份查询。 |
|
|
16
|
+
| `reconcile()` | 保守补齐已确认元数据,未确认意图结束为中断冲突;不补偿、重放归档或取消归档。 |
|
|
17
|
+
|
|
18
|
+
独立 `session_archive` sidecar 保存观察记录和新版取消归档 journal;原 `session_bin` 及 `session_bin_purge` 保持原有 schema,兼容对账不改变原生状态。观察记录的 UUID 是插件看到的集合成员身份,不是 native archive generation、创建时间或 exact lifecycle。列表不显示推测的归档时间。每次写入先校验并快照,继续遵守 domain 无跨表事务和 pinned SDK 写入校验差异。
|
|
19
|
+
|
|
20
|
+
取消归档顺序为复核 → 持久化 intent → 再复核固定对象与原生状态 → 调用公开 unarchive → 持久化 applied → 完成回执。旧条目的 `wasArchived` 不参与新动作。会话已缺失时明确拒绝;原生 unarchive 的幂等返回不被当成日志存在证明。工作区成员及位置、取消归档不恢复置顶的语义由原生接口保持。
|
|
21
|
+
|
|
22
|
+
原生归档帧立即捕获成员退出,避免取消归档与再归档两帧在队列等待期间被最后一个集合覆盖;已观察的重新归档获得新的观察身份,旧计划冲突。原生集合没有持久化代际,无法可靠识别插件停用、进程死亡或观察尚未持久化期间的 ABA。固定选择和历史幂等不意味着弥补这个宿主缺口。
|
|
23
|
+
|
|
24
|
+
旧 v1 execute 兼容路径只查询或完成已有日志的保守对账,不能开始新的旧归档/恢复。新严格 Remote 仅接受 v2 `unarchive`;浏览器旧 pending 缓存只查询历史回执,不重发未知旧请求。所有请求由 Host 排队并在卸载时 drain;新旧 journal 共用 operationId 和 pending deletion guard,不能通过新取消归档绕过已开始的 retirement。
|
|
25
|
+
|
|
26
|
+
生产组合按已审计 SDK 指纹和实际资源提供方检查启用版本绑定的冷 JSONL 单项永久删除;未知组合或 `permanentDeletion: false` 继续拒绝。归档观察不调用删除绑定 capture,也不按当前 Session ID 给旧条目自动补 exact lifecycle。显式准备、执行与同操作恢复遵守下述授权合约;真实 Adapter 接入见 [ADR 0007](decisions/0007-native-jsonl-deletion-adapter.md)。
|
|
27
|
+
|
|
28
|
+
## 原生归档单项删除准备与授权
|
|
29
|
+
|
|
30
|
+
`ArchiveModule` 在自身队列、未知故障暂停和 lifetime lease 下复用删除消费者及 owner 协调器。生产 `ctx.sessionBin.preparePurge` 创建 **v2 原生归档目标计划**,支持组合返回 exact lifecycle 与冻结资源清单;未准入组合返回 `permanent-deletion-unsupported`,非成员返回 `not-archived`。单项删除已向严格 Remote/UI 开放,旧 v1 仅保留历史查询与对应 Host 兼容恢复。绑定方式见 [ADR 0006](decisions/0006-native-archive-retirement-binding.md),实际 Adapter 见 [ADR 0007](decisions/0007-native-jsonl-deletion-adapter.md)。
|
|
31
|
+
|
|
32
|
+
显式 `preparePurge` 是获取新原生生命周期见证的唯一入口:先固定当前观察条目,复核成员、已观察失效与 pending guard,再由独立获准 owner 提供 exact `{storeId, sessionId, lifecycleId}` 和 descriptor,保存不可替换的 v2 binding。binding 明确标记 `target: 'native-archive'`、`entryVersion: 2`;owner request 的 `bin` 字段保留兼容字段名,但 v2 必须另有 `kind: 'native-archive'`。旧 v1 binding 和 request 形状不变,不能以观察 UUID 套用旧删除授权。
|
|
33
|
+
|
|
34
|
+
准备返回完整冻结资源清单,并在 owner inventory 的等待后再检查固定观察与 lifecycle。执行重新检查持久化 binding、原生成员、活动、owner/参与者 descriptor 和清单摘要;owner 在自己的联合 admission scope 内调用一次性 Host callback,再复核这些条件后才取得 grant。客户端删改 blockers 不能绕过检查。准备没有资源清除效果,绑定本身也不是可以脱离固定计划执行的授权。
|
|
35
|
+
|
|
36
|
+
观察 UUID 仍只代表插件观察身份。相同观察的 lifecycle binding 不自动替换;owner 身份或生命周期改变会拒绝旧计划,也不按当前 SID 补写旧见证。显式重新准备可冻结新的资源清单,但不得替换已绑定的 lifecycle。成员已被观察到退出后再归档才得到新的观察身份;未观察 ABA 的原有限制不变。
|
|
37
|
+
|
|
38
|
+
原生接入仍须由 Host composition 提供独立 `verifiedNativeArchive` 准入,旧 Bin `verified` 或 owner 自报不能启用新目标。生产 composition 只为本插件成功构造、通过版本/源码/实例检查的 `NativeRetirementOwner` 提供资格;Host 配置 `permanentDeletion: false` 可关闭,设置 true 不绕过检查。默认 SDK 没有公共 retirement API,本插件通过明确版本绑定实例 Adapter 补齐支持范围内的准入、排空、文件清除与元数据收敛。旧 test-only owner 只清临时 domain,其历史验证不扩大真实 Adapter 资格。
|
|
39
|
+
|
|
40
|
+
`session_bin_purge` domain 的 storage version 保持 1,schema 严格接受原封不动的旧 v1 记录和明确标记的新 v2 记录;不执行数据迁移、补绑定或原生归档变更。journal、plan、entry、binding 和 owner request 的目标版本必须一致;未完成记录只能交给对应目标消费者恢复。已完成历史回执只返回原结果,owner done 后只清理匹配的 exact 观察条目,不触碰同 SID 的后来条目。
|
|
41
|
+
|
|
42
|
+
新旧 pending journal 都阻止新版取消归档和同 SID 的新删除。原生 pending 持有原观察元数据,观察到退出时列表仍按当前原生成员隐藏它,重新归档也不能替换受保护对象。旧 pending 只施加动作 guard,仍允许生成惰性的新版观察行,保持原生成员完整。普通列表、准备和帧对账不调用 owner recover;显式 `reconcile/reconcilePurge` 和启动只续已保存的可信同操作。组合在同一已接受请求寿命内恢复新旧 journal,并排空两个消费者后统一关闭共享 retirement domain,最后释放 lease。
|
|
43
|
+
|
|
44
|
+
## 真实冷 JSONL 单项删除 Adapter
|
|
45
|
+
|
|
46
|
+
`NativeRetirementOwner` 自行拥有被明确 adoption 的会话记录删除生命周期。当前默认生产资格限已实际验收的 DSH `0.2.0-rc.2`、Node `24.18.1` / libuv `1.52.1`、Windows x64、macOS ARM64/Intel、Linux ARM64/x64、单 Host,以及独立验证通过的 JSONL raw/zstd、已知 Workspace/JSON domain、已启用 SQLite 查询与投影 cache 组合;确认没有相应 optional provider 的最小组合也可使用。未验收的平台/架构(包括 Windows ARM64)不因 Adapter 存在或 Host 配置 true 自动获得生产资格。正在初始化的 provider 会先等待,unknown/disabled/path 或实例漂移不伪称不存在。SDK 所有参与包版本与源码 SHA-256 固定于 `native-retirement-sdk`;变更组合需独立验收。支持的是会话日志和声明的会话元数据/派生索引,共享附件、外部工具副本和独立 fork 保留,不做全局 GC 或安全擦除。
|
|
47
|
+
|
|
48
|
+
显式删除准备先在目标准入围栏内释放 API Session 自己激活的空闲 Agent:仅使用在匹配 `resumeObserved/createOrAdopt` 调用内取得的原始 `AgentHandle.dispose`,复核原生归档、活动提供方、真实 idle phase(不包含 maintenance)和空 inbox;不通过裸 Agent 或未识别的生命周期强行卸载。等待日志句柄关闭、目标已跟踪 history follower 结束和 cache 写入排空后,重新发布持久化冷摘要,取消删除仍保留标题、归档和日志。没有明确 disposal capability 的安装前/其他所有者生命周期继续拒绝。该释放只发生于显式准备及执行复核,不在启动、列举或归档观察时自动发生。
|
|
49
|
+
|
|
50
|
+
准入只接受原生归档的冷目标,拒绝 live Session/Agent、turn/job/subagent/schedule、尚未释放的 SessionHandle、query lease、history follower、cache dirty 和迁移准备。不能识别目标的安装前 follower 保守拒绝;不隐式停止其他会话。实例 guard 保留 Cordis caller shadow context,覆盖原生 Workspace 队列执行与写入前复核、SessionStore 准入、JSONL create/open/低层读写、cache 实际 put、完整 query/SQLite queue。全局 header/historical-corpus 读帧在执行前排空,新普通扫描等待 scope 释放,防止跨 SID 历史读取与删除相互等待;其他 SID 的既有 current writer 不被本次删除停止。
|
|
51
|
+
|
|
52
|
+
`session_bin_jsonl_resources` 保存 durable store/root/fingerprint 和 exact lifecycle nonce、最低既存 canonical anchor、完整文件 identity/digest、metadata medium/memory/location 快照。这个 nonce 是本插件 Adapter 提供的逻辑生命周期,不能描述为原生格式字段。显式准备固定这些证据;已退役 SID namespace 不重用,历史请求只处理原 token。`session_bin_jsonl_retirement_owner` 保存协调器 journal,恢复不从当前 SID 重建新目标。
|
|
53
|
+
|
|
54
|
+
`NativeJsonlFiles` 对每个待清文件确认规范布局、真实根/目录身份、常规文件 inode/birthtime、size/timestamps 和全 bytes SHA-256;ino 或 birthtime 无有效值时拒绝,不能用零值猜测 incarnation。清单覆盖 canonical V0–V4 及可识别的 materialization/migration staging。POSIX 只使用已存在的空常规 `session.lock` 取得同 inode 排他权,不 open writer 迁移、不新建/替换锁;Windows 清单明确保存 SDK 的路径派生 semaphore 名字,不要求或创建锁文件,路径别名不能令 SDK 与插件取得不同名字的锁。额外 hard link 以实际 fstat 复核,symlink/junction、重复 SID、多编码、未来代、flat layout、未知目录/文件或不完整 header 均明确拒绝。POSIX 文件动作只 unlink 冻结的直接 child basename 并 fsync 目录;Windows 对同一独占已确认文件先 truncate(0) + FD sync、关闭 FD,再 unlink 和确认缺失,只有已保存 admission 的同操作维护 scope 能续办同一空文件。release join 已接受动作后才释放内核租约,目录、协调身份和共享存储不删除。假设可信稳定祖先、协作单 Host 和 Windows 同登录会话,不提供恶意 namespace 替换或其他 Host 的完整排他保证。
|
|
55
|
+
|
|
56
|
+
metadata participant 在文件清除后定点移除冻结 Workspace account 和原生 archive/pin/header 观察,保留其他当前字段。cache 的支持边界为已知 `session_projcache` v7 / PerRecordJsonUnit / KvTableImpl:检查实际受控 JSON 文档、真实 FD 硬链接数与内存摘要,不能从 memory 缺行推断物理缺失。POSIX 在原写链内删除目标文档并同步目录;Windows 按原 exact request/lifecycle/冻结快照派生专属非 JSON stage,先进行无 replace/copy 的同卷 write-through rename,再核对原 inode/birthtime 与摘要、清零并同步、关闭 FD、删除并确认 stage 和原名都缺失,最后才清内存和发布普通通知。陌生 stage、身份/内容漂移、旧 whole-unit bootstrap 源明确拒绝。SQLite 使用其自身公开 search 的对账事务清除目标派生行,不直接编辑私有 SQL 索引。资源 effect 确认先于 erased 回执,全部参与者、生命周期 finalize、owner done 完成后才提交 Host 成功;原生 `api-session/removed` 只是最后展示通知。
|
|
57
|
+
|
|
58
|
+
维护权限使用可撤销 token。Domain/API 通知与普通 activity callbacks 没有维护权限,不能通过同步/迟到 observer 重新创建已退役数据。直接 owner 控制面观察、临时 FD、已接受读写与协调器维护都由 close join;关闭开始后拒绝新 target/global 请求,等待 scope 的请求在醒来后再复核 closing,已接受完整 frame 的嵌套读写仍须排空,frame 结束后其权限立即失效。已知拒绝不暂停,未知 I/O 暂停 owner/Module并保护受影响目标,需完整重开对账。卸载保留 pending/done 的窄 SID 围栏;同 SDK 实例重启插件时,只允许匹配 durable store/root/fingerprint 的已关闭 owner 被接管,旧 callable aliases 撤销,原实例方法同步替换为新 guard。未 admission 的旧失败候选由可信新 epoch 保守释放,不能永久遮蔽正常日志。
|
|
59
|
+
|
|
60
|
+
## 旧 v1 Bin 合约与日志兼容
|
|
61
|
+
|
|
62
|
+
下列独立目录、`bin/restore` 及 `wasArchived` 描述的是保留的旧 core、日志格式和测试资源 owner 协议。生产入口已切换到上面的原生归档模型;这些旧规则不决定新面板成员,也不开放新的旧归档操作。
|
|
63
|
+
|
|
64
|
+
### 旧公共接口
|
|
65
|
+
|
|
66
|
+
旧切片的 `SessionBinModule` 暴露以下 v1 方法;生产 `ctx.sessionBin` 使用上面的原生归档接口。所有对象都是独立快照;会话身份不会变成客户端提供的文件路径。
|
|
67
|
+
|
|
68
|
+
| 方法 | 行为 |
|
|
69
|
+
| --- | --- |
|
|
70
|
+
| `prepare({ action, sessionId, operationId? })` | `action` 为 `bin` 或 `restore`;返回归档状态、条目身份和阻止原因。默认生成新的操作身份,不执行原生变更。 |
|
|
71
|
+
| `execute(plan)` | 重新检查原生状态、会话存在性、活动与所有权,再执行准备的对象;返回 `success`、`rejected` 或 `conflict`。 |
|
|
72
|
+
| `list()` | 对账后仅返回本插件仍拥有的回收站条目,普通原生归档不计入。 |
|
|
73
|
+
| `getOperation(operationId)` | 查询已保存的操作阶段与结果,适合断线后确认完成状态。 |
|
|
74
|
+
| `operations()` | 查询保存的操作记录,发现中断结果;记录包含原始计划和条目快照。 |
|
|
75
|
+
| `reconcile()` | 归档部分只修复插件元数据;删除部分仅恢复已保存且匹配的 owner admission 操作,规则见下节。 |
|
|
76
|
+
|
|
77
|
+
同一个操作身份绑定同一动作、会话和准备时状态;不同参数使用旧身份会被拒绝。已完成结果是历史回执:旧移入请求在恢复后再次提交只返回旧结果,不会再次移入。拒绝结果也保留;状态变化后应重新 `prepare` 并使用新身份。计划中的阻止原因仅供展示,执行会重新检查,不依赖调用方提交的判断。
|
|
78
|
+
|
|
79
|
+
## 持久化协议
|
|
80
|
+
|
|
81
|
+
`session_bin` domain 的 `entries` 表保存插件自有条目,`operations` 表保存日志与回执。通过公开 `storageDomain` 写入;每次写入入口用 Zod 校验并生成快照。两张表与原生归档之间没有事务。
|
|
82
|
+
|
|
83
|
+
正常移入顺序:检查 → 保存 `intent` 和原状态 → 使用原生归档(不请求停止工作)→ 保存 `applied` → 提交条目 → 保存 `done` 回执。已归档对象仍单独检查活动和存在性,因为原生幂等归档会跳过这些检查。原归档状态保存在 `wasArchived`;恢复只为插件新归档的对象调用取消归档,原先已归档的对象只退出插件目录。工作区位置由原生接口保留;置顶不自动恢复。
|
|
84
|
+
|
|
85
|
+
启动及原生归档帧触发的对账不执行归档或取消归档:
|
|
86
|
+
|
|
87
|
+
- `intent` 尚未持久化确认原生成功,一律结束为 `conflict/interrupted`,保留回执。即使当前布尔状态与执行前相同,也可能是用户已经撤销;重试需新的显式计划。
|
|
88
|
+
- `applied` 已持久化确认,在会话存在且原生状态仍符合目标时补完条目提交或退出;不符合则报告冲突,不修改原生状态。
|
|
89
|
+
- 观察到取消归档,持久化 `ownershipInvalidated` 后释放对应 `entryId` 的条目。后来重新归档不会重新取得所有权。重启也读取已完成日志的失效标记,补完中断的条目清理。
|
|
90
|
+
- 意外存储或原生 I/O 错误会暂停该 Module 的后续请求。原子替换可能已写入文件但返回失败,因此不能继续相信内存快照;需要关闭并重开服务,对账后再决定新请求。
|
|
91
|
+
|
|
92
|
+
活动默认拒绝移入,包含宿主提供方报告的 turn、subagent、job、schedule;普通操作不会停止它们。取消归档成功不能证明日志存在,恢复前另做存在性检查。活动检查和原生队列仍不与新工作启动形成原子事务,遵守原生接口的保护范围。
|
|
93
|
+
|
|
94
|
+
## Host 单项删除协议消费者
|
|
95
|
+
|
|
96
|
+
[删除合约](../src/operations/retirement.ts)与[协调器](../src/host/retirement.ts)继续提供新旧目标消费者。生产组合的真实冷 JSONL 支持、配置与严格 Remote 已在上节说明;以下保留 v1 Bin 和通用 owner 协议,不以旧默认无 owner 的历史状态覆盖现状。owner 自报不能获得资格,legacy `bin/restore` DTO 不变,生产归档观察不产生删除绑定。
|
|
97
|
+
|
|
98
|
+
| Host 方法 | 行为 |
|
|
99
|
+
| --- | --- |
|
|
100
|
+
| `preparePurge({ sessionId, operationId? })` | 旧 `SessionBinModule` 返回 v1 exact Bin/lifecycle/owner/资源清单计划;普通原生归档返回 `not-in-bin`。生产 `ctx.sessionBin` 创建上文 v2 原生计划;支持组合可执行,未准入或显式关闭组合返回 `permanent-deletion-unsupported`。 |
|
|
101
|
+
| `executePurge(plan)` | 重查持久化条目、生命周期、资源范围和活动,在可信 owner 的准入围栏内提供一次性授权;回执区分 `success/rejected/conflict/pending-recovery/partial-failure`。 |
|
|
102
|
+
| `getPurgeOperation(operationId)` / `purgeOperations()` | 读取删除 journal 的独立快照;既有 `getOperation/operations` 继续只返回归档操作。 |
|
|
103
|
+
| `reconcilePurge()` | 查询相同已保存操作,恢复可信且匹配的 owner 已 admission 工作,再收敛插件元数据。 |
|
|
104
|
+
|
|
105
|
+
原 `session_bin` domain、条目和历史操作保持 v1;公开 SDK 无 domain 数据迁移,未直接提升版本。`session_bin_purge` storage version 1 保存 `bindings` 和 `operations`,兼容 v1 与 v2 record。旧 core 的生命周期见证仍只在有获准 owner 的新移入过程中捕获,按不可重用的 `entryId` 绑定,并在条目提交前复核;旧条目不按当前 Session ID 自动补见证。原生 v2 的显式准备绑定遵守上节独立规则。两种记录各自不可替换,日志暂不裁剪。
|
|
106
|
+
|
|
107
|
+
`operationId` 在两个 journal 间统一认领;同一 ID 改动作、entry、生命周期、owner 或资源清单会拒绝。清单使用稳定 SHA-256 摘要,资源 key 唯一且只能来自声明的参与者;done 必须逐资源确认与 disposition 一致。共享保留须列出其他存活生命周期见证和原因,协调身份须明确保留,不能把缺失的资源回执或 failed 当作整体成功。返回类型校验仅验证协议,资源归属真实性仍依赖 owner 的独立资格及验收。
|
|
108
|
+
|
|
109
|
+
Host 阶段为 `intent → authorizing → owner-pending → done`。`authorizing` 保存随机 grant nonce,是授权尝试而非 owner admission:请求本身不包含 nonce,最终复核通过后 callback 才将 grant 返回 owner。admitted owner 回执须包含同一 nonce、原始请求及资源清单;拒绝回执的 nonce 为 null。callback 只能使用一次,owner 调用结束后撤销新调用并等待已开始 callback 排空,避免迟到写入覆盖回执或在 lease 释放后继续访问 domain。
|
|
110
|
+
|
|
111
|
+
owner 的 `fenced/quiesced/erasing/converging/done` 和逐资源回执由资源所有者持久化。Host 观察到可信 admission 后,**先保存见证再调用 recover**,防止后续 I/O 错误丢掉保护。owner done 也先保存,再只删除仍匹配的插件 entry,最后提交 Host 成功回执;此处不要求原生日志仍存在或归档仍为 true。完整已保存 owner done 在 owner 不可用时也能只补插件元数据,旧回执不会操作后来相同 Session ID 的新条目。
|
|
112
|
+
|
|
113
|
+
未完成删除的 journal 是持久化 guard,阻止普通恢复、新移入及其他同会话删除。原生归档帧继续即时捕获失效;guard 存在时普通归属对账不提前清理 exact entry。owner 缺席、变更、查询故障、回执不匹配或阶段/资源确认回退不能释放 guard;只有同一可信 owner 明确返回 null 且 Host 尚未观察过 admission,才结束为中断冲突。未知 owner/sidecar/元数据 I/O 错误会暂停整个 Module,即使外部将错误包装为业务错误类,也必须重开处理。
|
|
114
|
+
|
|
115
|
+
普通 prepare/list 与归档帧仅查询进度和补已确认元数据,不调用 owner recover 清除资源。启动、显式 reconcile/reconcilePurge 及同计划显式重试只恢复已保存的相同 owner 操作,不从插件 intent 新发删除,也不重新选择目标。
|
|
116
|
+
|
|
117
|
+
### 可复用资源 owner 协调
|
|
118
|
+
|
|
119
|
+
[Owner 协调器](../src/host/retirement-owner.ts)将阶段推进从测试 helper 提炼为正式实现,[owner journal](../src/host/retirement-owner-store.ts)在独立 `session_bin_retirement_owner` v1 domain 中原子保存 public state、逐参与者 fence/quiesce/converge 确认、生命周期排空/完成确认和阻止原因。能力 descriptor 与参与者集合、版本绑定后不可切换;回执、成功资源确认和阶段不允许倒退。
|
|
120
|
+
|
|
121
|
+
它通过公开定义的生命周期 port 与资源 participant 调用实际资源所有者;这些是本项目的接入契约,不是当前 SDK 已提供的 native Service。default Service 仍不挂载 owner。接入组合必须独立证明这些端口覆盖实际 create/resume/read/write/visibility、writer/读取引用、持久化资源及派生存储;实例化协调器或声明 capability 不构成资格。
|
|
122
|
+
|
|
123
|
+
| 端口 | 契约 |
|
|
124
|
+
| --- | --- |
|
|
125
|
+
| `lifecycle.inspect/acquire` | inspect 只读;普通 scope 排他地复核当前生命周期及活动,维护 scope 绑定已保存 exact operation,可在日志已消失或 finalize 确认丢失后恢复,不能重建旧 Session;每次恢复须重新取得所有参与者当前 runtime 排他权/租约,过去的 quiesce 确认不能替代它。 |
|
|
126
|
+
| `bindGuards` | 对正常新请求、保留引用和晚到缓存写入安装同一持久化保护;返回的 disposer 必须禁用其路由/引用,不能使它们变成无 guard。初始化完成前不开放请求。 |
|
|
127
|
+
| `participant.manifest/fence/quiesce/applyResource/converge` | 每个参与者只报告自己的资源,所有参与者确认 fence 和排空后才能清除;资源动作、收敛和 scope finalize 按同一 operation/lifecycle/resource/revision 幂等。 |
|
|
128
|
+
| barrier boolean | `true` 表示已确认完成,`false` 为已知等待并保留阶段/guard,抛错为未知结果并暂停。没有资源行的参与者也不能省略其屏障。 |
|
|
129
|
+
| `canAdvance` | 每个持久化确认后检查预算;暂停返回已保存进度,不撤销 durable fence。只有明确恢复推进后续动作。 |
|
|
130
|
+
|
|
131
|
+
Host 将完整冻结清单作为可选第三参传给 `retire`;已有二参 owner 可忽略它。新协调器对新操作要求完整清单,在任何 grant/fence 前复核请求摘要、生命周期和 descriptor。准备后的范围、生命周期或活动变化用旧冻结清单记录拒绝,grant 为 null、资源回执为空。排空可能发布既有缓冲写入或新代际;排空后清单变化会保留 quiesced fence 和 `blockedReason`,不自动扩大删除范围,需要资源所有者维护处理。
|
|
132
|
+
|
|
133
|
+
顺序为 owner fence 落盘 → 全部 participant fence 确认 → 生命周期及全部 participant 排空确认 → 逐资源效果与回执 → 全部 participant 收敛确认 → 生命周期 finalize 确认 → owner done。effect 成功但 acknowledgement 未落盘时,只能在已保存冻结操作的维护 scope 中幂等续办。初始化、prepare、inspect、getOperation 及历史 done 不隐式推进资源清除。
|
|
134
|
+
|
|
135
|
+
guard 除了查询 journal,还检查 initializing、closing 和 sticky failure;任何未知 I/O,包括 falsy rejection,都立即拒绝旧引用和新 generation,不能从可能过期的 memory 推断没有 fence。进行中的 admitted phase 阻止同 SID 新代际;done 对 exact 旧 token 保留永久 tombstone,新 token 可创建;rejected/conflict 不永久封住 SID。每个等待结束及下一动作前重新检查故障和参与者版本。
|
|
136
|
+
|
|
137
|
+
维护队列使用私有异步上下文,已入队授权观察可完成 close-drain;外部正常路由继续拒绝 closing。独立 control-plane inspect 不重入队列,但关闭会等待其完成。scope/disposer 成功返回后先接管 cleanup,再做健康复核;任何未知错误先暂停,再释放 scope,release 失败与原错误聚合。最终排空初始化、维护请求与观察,禁用所有 guard 路由,再关闭 owner journal。
|
|
138
|
+
|
|
139
|
+
[参考 owner](../tests/helpers/retirement-owner.mjs)现在仅实现独立测试资源的端口,实际调用该协调器,不再自行推进 phase。它不删除 native JSONL、Workspace、索引、锁或附件;运行证据与仍缺的原生能力见[Host 验证](verification/host-lifecycle.md)。
|
|
140
|
+
|
|
141
|
+
## 并发与部署边界
|
|
142
|
+
|
|
143
|
+
Module 串行处理一个 Host 的请求,包括多个窗口发出的重复操作;首个切片用单并发执行队列。插件在打开 domain 之前取得 lifetime lease:POSIX 使用公开 `@deepseek-ai/node-addon-system/flock`,Windows 使用独立路径派生内核信号量。协调目录和既有空常规 marker 会在排他取得后复核身份,不删除或替换 marker,不按 PID/过期抢占。卸载停止接收新请求、继续捕获归档帧、等待已接受的完整原生与元数据请求结束,关闭 domain,最后释放内核租约及 FD。
|
|
144
|
+
|
|
145
|
+
`coordinationDirectory` 是 Host 配置中的绝对目录,默认使用公开 `resolveDshHome()` 下的 `session-bin`。**共享同一 Bin backend 的组合必须使用同一规范化协调目录。** SDK 没有公开实际 backend root 的查询能力,不能自动证明该约定;不同 DSH_HOME 共享自定义 backend 时必须显式配置同一目录。平台或 native addon 不支持 flock 时加载失败。
|
|
146
|
+
|
|
147
|
+
支持部署模型是一个 Host 拥有原生 Workspace 存储,该 Host 可连接多个窗口。lease 拒绝第二个遵守相同目录约定的插件进程,但其他 Host 的原生 Registry 不持有这把锁;不支持多个 Host 同时写同一原生 Workspace 存储。默认删除资格按已实际验收组合开放;candidate 与生产支持状态分别记录,不从底层 API 或代码存在推导已支持。Windows 信号量限定同登录会话,与 WSL/Cygwin、不同登录会话或其他提供方的协调不在声明范围。正式发布要求三类主要 OS 全部通过对应验收,见[分发与发布](release.md)。
|
|
148
|
+
|
|
149
|
+
原生归档只有 ID 集合,没有操作身份、actor 或每个会话的版本。新版运行时捕获的取消归档再归档会更换观察身份;旧 core 对相同变化使所有权失效;**插件停用期间、进程死亡期间或观察尚未持久化时的取消归档再归档无法被可靠识别。** `applied` 只能证明某次调用已确认,不能证明当前归档仍属于它。此切片不承诺精确恢复这类未观察变化的归属,也不会用恢复日志自动补偿原生操作。操作日志暂无自动裁剪,规模与保留策略留给后续切片。
|
|
150
|
+
|
|
151
|
+
## 开发与验证
|
|
152
|
+
|
|
153
|
+
工具配置在仓库的 [mise.toml](../mise.toml),实际命令集中于 [package.json](../package.json)。安装依赖使用固定 pnpm、frozen lockfile 和 `--ignore-scripts`;本地可按既有兼容性报告设置 `.local/` 下的 mise 与 pnpm cache。
|
|
154
|
+
|
|
155
|
+
- `mise run check`:正式源代码对固定 SDK 的严格类型检查。
|
|
156
|
+
- `mise run test`:先构建,再运行临时数据上的行为、真实进程中断和锁竞争检查。
|
|
157
|
+
- `mise run verify:package`:先构建,离线打包、解包,使用真实 Cordis Loader 激活、卸载并重新激活。
|
|
158
|
+
- `mise run verify`:按顺序执行类型检查、构建、行为测试与打包检查。
|
|
159
|
+
|
|
160
|
+
测试目录由 `.local/lifecycle/` 下随机目录产生,显式配置临时 DSH_HOME、JSON storage root、JSONL root 和协调目录。所有测试会话与故障样本留在这里供检查;测试不连接当前 GUI。打包检查使用仓库锁定的 SDK 依赖作为测试宿主,不等于干净 profile/CLI 安装。实际执行结果与未覆盖范围在[实现验证](verification/host-lifecycle.md)记录。
|
package/locale/en.json
ADDED
package/locale/zh.json
ADDED
package/package.json
CHANGED
|
@@ -1,6 +1,165 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@takboo/dsh-session-bin",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"description": "
|
|
6
|
-
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Manage native archives with search, filters, unarchive, and explicit permanent deletion.",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"packageManager": "pnpm@11.23.0",
|
|
8
|
+
"engines": {
|
|
9
|
+
"node": "24.18.1",
|
|
10
|
+
"dsh": "0.2.0-rc.2"
|
|
11
|
+
},
|
|
12
|
+
"main": "./dist/index.js",
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"default": "./dist/index.js"
|
|
18
|
+
},
|
|
19
|
+
"./operations": {
|
|
20
|
+
"types": "./dist/operations/index.d.ts",
|
|
21
|
+
"default": "./dist/operations.js"
|
|
22
|
+
},
|
|
23
|
+
"./remote": {
|
|
24
|
+
"types": "./dist/remote/contracts.d.ts",
|
|
25
|
+
"default": "./dist/remote.js"
|
|
26
|
+
},
|
|
27
|
+
"./client": {
|
|
28
|
+
"types": "./dist/types/client/index.d.ts",
|
|
29
|
+
"default": "./dist/client.js"
|
|
30
|
+
},
|
|
31
|
+
"./locale/*.json": "./locale/*.json",
|
|
32
|
+
"./package.json": "./package.json"
|
|
33
|
+
},
|
|
34
|
+
"files": [
|
|
35
|
+
"dist/",
|
|
36
|
+
"locale/",
|
|
37
|
+
"cordis.patch.yml",
|
|
38
|
+
"LICENSE",
|
|
39
|
+
"docs/host-lifecycle.md",
|
|
40
|
+
"docs/client-interface.md"
|
|
41
|
+
],
|
|
42
|
+
"dsh": {
|
|
43
|
+
"manifestVersion": 1,
|
|
44
|
+
"bundle": {
|
|
45
|
+
"patch": "./cordis.patch.yml"
|
|
46
|
+
},
|
|
47
|
+
"client": {
|
|
48
|
+
"platform": "web"
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
"scripts": {
|
|
52
|
+
"check": "tsc --noEmit && tsc --project tsconfig.client.json --noEmit",
|
|
53
|
+
"build": "tsc --emitDeclarationOnly && tsc --project tsconfig.client.json --emitDeclarationOnly && node scripts/build.mjs",
|
|
54
|
+
"test": "node --test --test-concurrency=1 tests/*.test.mjs",
|
|
55
|
+
"verify:package": "node scripts/verify-package.mjs",
|
|
56
|
+
"verify:gui:browser": "playwright-core install --with-deps chromium",
|
|
57
|
+
"verify:gui": "node scripts/verify-gui-locales.mjs",
|
|
58
|
+
"verify:gui:locale": "node scripts/verify-gui.mjs",
|
|
59
|
+
"verify:linux": "node scripts/verify-linux.mjs",
|
|
60
|
+
"verify:platform": "node scripts/verify-platform.mjs",
|
|
61
|
+
"verify": "pnpm run check && pnpm run build && pnpm run test && pnpm run verify:package"
|
|
62
|
+
},
|
|
63
|
+
"peerDependencies": {
|
|
64
|
+
"@deepseek-ai/cordis": "4.0.4",
|
|
65
|
+
"@deepseek-ai/dsh": "0.2.0-rc.2",
|
|
66
|
+
"@deepseek-ai/dsh-api-gateway": "0.2.0-rc.2",
|
|
67
|
+
"@deepseek-ai/dsh-session": "0.2.0-rc.2",
|
|
68
|
+
"@deepseek-ai/dsh-session-persistence": "0.2.0-rc.2",
|
|
69
|
+
"@deepseek-ai/dsh-session-persistence-jsonl": "0.2.0-rc.2",
|
|
70
|
+
"@deepseek-ai/dsh-storage-domain": "0.2.0-rc.2",
|
|
71
|
+
"@deepseek-ai/dsh-typert-registry": "0.2.0-rc.2",
|
|
72
|
+
"@deepseek-ai/dsh-workspace": "0.2.0-rc.2"
|
|
73
|
+
},
|
|
74
|
+
"dependencies": {
|
|
75
|
+
"@deepseek-ai/dsh-home-paths": "0.2.0-rc.2",
|
|
76
|
+
"@deepseek-ai/dsh-session-format-catalog": "0.2.0-rc.2",
|
|
77
|
+
"@deepseek-ai/dsh-typert-protocol": "0.2.0-rc.2",
|
|
78
|
+
"@deepseek-ai/node-addon-system": "0.1.2",
|
|
79
|
+
"@deepseek-ai/schemastery": "3.18.4",
|
|
80
|
+
"koffi": "3.1.1",
|
|
81
|
+
"zod": "4.4.3"
|
|
82
|
+
},
|
|
83
|
+
"devDependencies": {
|
|
84
|
+
"@deepseek-ai/cordis": "4.0.4",
|
|
85
|
+
"@deepseek-ai/cordis-plugin-loader": "1.0.5",
|
|
86
|
+
"@deepseek-ai/dsh": "0.2.0-rc.2",
|
|
87
|
+
"@deepseek-ai/dsh-api-gateway": "0.2.0-rc.2",
|
|
88
|
+
"@deepseek-ai/dsh-api-remotes": "0.2.0-rc.2",
|
|
89
|
+
"@deepseek-ai/dsh-api-session-controller": "0.2.0-rc.2",
|
|
90
|
+
"@deepseek-ai/dsh-api-workspace-controller": "0.2.0-rc.2",
|
|
91
|
+
"@deepseek-ai/dsh-client-connection": "0.2.0-rc.2",
|
|
92
|
+
"@deepseek-ai/dsh-client-locale": "0.2.0-rc.2",
|
|
93
|
+
"@deepseek-ai/dsh-client-modules": "0.2.0-rc.2",
|
|
94
|
+
"@deepseek-ai/dsh-client-store": "0.2.0-rc.2",
|
|
95
|
+
"@deepseek-ai/dsh-client-ui-layout": "0.2.0-rc.2",
|
|
96
|
+
"@deepseek-ai/dsh-client-ui-primitives": "0.2.0-rc.2",
|
|
97
|
+
"@deepseek-ai/dsh-client-ui-renderer": "0.2.0-rc.2",
|
|
98
|
+
"@deepseek-ai/dsh-client-ui-session": "0.2.0-rc.2",
|
|
99
|
+
"@deepseek-ai/dsh-client-ui-sidebar": "0.2.0-rc.2",
|
|
100
|
+
"@deepseek-ai/dsh-client-ui-slots": "0.2.0-rc.2",
|
|
101
|
+
"@deepseek-ai/dsh-client-ui-workspace": "0.2.0-rc.2",
|
|
102
|
+
"@deepseek-ai/dsh-invariants": "0.2.0-rc.2",
|
|
103
|
+
"@deepseek-ai/dsh-session": "0.2.0-rc.2",
|
|
104
|
+
"@deepseek-ai/dsh-session-persistence": "0.2.0-rc.2",
|
|
105
|
+
"@deepseek-ai/dsh-session-persistence-jsonl": "0.2.0-rc.2",
|
|
106
|
+
"@deepseek-ai/dsh-storage": "0.2.0-rc.2",
|
|
107
|
+
"@deepseek-ai/dsh-storage-domain": "0.2.0-rc.2",
|
|
108
|
+
"@deepseek-ai/dsh-storage-json": "0.2.0-rc.2",
|
|
109
|
+
"@deepseek-ai/dsh-typert-protocol": "0.2.0-rc.2",
|
|
110
|
+
"@deepseek-ai/dsh-typert-registry": "0.2.0-rc.2",
|
|
111
|
+
"@deepseek-ai/dsh-util-code-language": "0.2.0-rc.2",
|
|
112
|
+
"@deepseek-ai/dsh-util-workspace-path": "0.2.0-rc.2",
|
|
113
|
+
"@deepseek-ai/dsh-workspace": "0.2.0-rc.2",
|
|
114
|
+
"@shikijs/langs": "4.5.0",
|
|
115
|
+
"@types/node": "24.7.0",
|
|
116
|
+
"@types/react": "18.3.1",
|
|
117
|
+
"@types/react-dom": "18.3.0",
|
|
118
|
+
"anser": "2.3.5",
|
|
119
|
+
"clsx": "2.1.1",
|
|
120
|
+
"diff": "9.0.0",
|
|
121
|
+
"esbuild": "0.25.10",
|
|
122
|
+
"immer": "10.1.1",
|
|
123
|
+
"jsdom": "26.1.0",
|
|
124
|
+
"katex": "0.16.47",
|
|
125
|
+
"mdast-util-from-markdown": "2.1.0",
|
|
126
|
+
"mdast-util-gfm": "3.1.0",
|
|
127
|
+
"mdast-util-math": "3.0.0",
|
|
128
|
+
"micromark-core-commonmark": "2.0.3",
|
|
129
|
+
"micromark-extension-gfm": "3.0.0",
|
|
130
|
+
"micromark-extension-math": "3.1.0",
|
|
131
|
+
"micromark-factory-space": "2.0.1",
|
|
132
|
+
"micromark-util-character": "2.1.1",
|
|
133
|
+
"micromark-util-classify-character": "2.0.1",
|
|
134
|
+
"micromark-util-sanitize-uri": "2.0.1",
|
|
135
|
+
"micromark-util-symbol": "2.0.1",
|
|
136
|
+
"playwright-core": "1.56.0",
|
|
137
|
+
"react": "18.2.0",
|
|
138
|
+
"react-dom": "18.2.0",
|
|
139
|
+
"shiki": "4.5.0",
|
|
140
|
+
"simple-icons": "16.31.0",
|
|
141
|
+
"typescript": "5.9.3",
|
|
142
|
+
"yaml": "2.8.1",
|
|
143
|
+
"zustand": "4.4.7"
|
|
144
|
+
},
|
|
145
|
+
"author": "takboo",
|
|
146
|
+
"repository": {
|
|
147
|
+
"type": "git",
|
|
148
|
+
"url": "git+https://github.com/takboo/dsh-session-bin.git"
|
|
149
|
+
},
|
|
150
|
+
"homepage": "https://github.com/takboo/dsh-session-bin#readme",
|
|
151
|
+
"bugs": {
|
|
152
|
+
"url": "https://github.com/takboo/dsh-session-bin/issues"
|
|
153
|
+
},
|
|
154
|
+
"keywords": [
|
|
155
|
+
"dsh",
|
|
156
|
+
"dsh-plugin",
|
|
157
|
+
"deepseek-harness",
|
|
158
|
+
"session",
|
|
159
|
+
"archive"
|
|
160
|
+
],
|
|
161
|
+
"publishConfig": {
|
|
162
|
+
"access": "public",
|
|
163
|
+
"registry": "https://registry.npmjs.org"
|
|
164
|
+
}
|
|
165
|
+
}
|