插件信息
| 包名 | @deepseek-ai/dsh-workspace |
|---|---|
| 分组 | G50 · 工作区 |
| 拓扑层 | Layer 3(层次遍历:被依赖方先于依赖方) |
| 源码路径 | packages/workspace/workspace |
| 来源层 | L2 web-app bundle(base 之上装配) |
① 实现逻辑
以 Cordis Service 类 WorkspaceRegistry(static inject=['storageDomain','sessionPersistence'],src/index.ts:170-194)实现工作区实体注册表,启动时用 ctx.storageDomain.open 打开 name=workspace、version=2 的域规格,取得 workspaces 表与全局态(src/index.ts:198-202,src/spec.ts:76-84)。初始化先做 pendingMutation 恢复与 stored state 一致性校验,再按 initialized 标记决定是否用 sessionPersistence 的历史 header 一次性 bootstrap 出工作区记录与顺序(src/index.ts:204-218、src/index.ts:634-740、src/index.ts:748-783)。所有写操作串行挂在单条 operationTail 队列上(src/index.ts:886-895),每条记录由私有 WorkspaceEntity 承载,其 sessionIds 是把持久账户按「id 在账户中且 header 的 canonical cwd 等于工作区 path」同步过滤后的投影(src/entity.ts:101-103),写路径统一走 mutate→table.update 并盖章 updatedAt(src/entity.ts:202-220)。除 CRUD/排序/默认工作区外还维护注册表级归档集与置顶集,归档前以 waterfall 事件 workspace/session-activity 询问各 provider 会话是否活跃,拒绝则报 WorkspaceActiveSessionError(src/index.ts:363-385),带 stopActivity 时归档落盘后再 parallel 触发 workspace/session-stop 请求停止(src/index.ts:479-491)。路径唯一性由 realpathNormalize 统一规范化(src/paths.ts:52-57),另有 ./invariant 伴生插件订阅 domain/changed 断言实体缓存与持久表不漂移(src/invariant.ts:27-49)。
② 注册/提供(provides)
- ctx.workspaceRegistry (持久化工作区实体注册表:工作区记录增删改查、稳定显示顺序、默认工作区初始化、会话归档/置顶集合、按 canonical cwd 校验的会话归属与顺序)
- 事件 workspace/session-activity (waterfall;归档前询问各 provider 该会话是否仍活跃,决定归档准入)
- 事件 workspace/session-stop (parallel;归档落盘后要求各 provider 停止该会话运行中的工作)
- storage 域规格 workspace v2 (workspaces 表 + bootstrap/顺序全局态,经 ctx.storageDomain 打开)