DAG总览 / 组目录 / G50 工作区

dsh-workspace · @deepseek-ai/dsh-workspace

Layer 3G50L2 web-app
目录:ACP 协议API 网关与控制器附件启动与插件管理客户端运行时客户端 UI 包上下文压缩上下文注入核心运行时凭据与授权交付物文档处理实验特性宿主扩展反馈通道文件系统目标与计划工具守卫Hooks 扩展宿主服务交互命令作业调度LLM 适配LSP 集成MCP 协议规划模式Agent 预设代码执行运行时运行时诊断沙箱定时调度SDK 与协议会话核心会话检索设置Shell 执行技能溢出存储SSH 远程执行存储子代理子进程终端待办类型契约框架 vendorWeb 访问Webhook工作流工作区
依赖链 · 上游(该插件依赖的前驱):
依赖链 · 下游(依赖该插件的节点):
同一拓扑层(Layer 3,层次遍历层序):
↑ Layer 2(11 插件)Layer 3↓ Layer 4(13 插件)

插件信息

包名@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)。

内部结构动态 DAG(深色主题:橙色=上游依赖 · 绿色=下游依赖 · 棕色=外部seam · 蓝=本插件)
本插件 上游依赖 下游依赖 外部 seam

② 注册/提供(provides)

③ 依赖(depends_on · 上游前驱)

dsh-invariantsE1+E2
./invariant 伴生插件需向 runtime 不变量服务注册『实体缓存 ↔ 持久表』一致性断言
src/invariant.ts:7 import;src/invariant.ts:16 export const inject=['invariants'] + src/invariant.ts:57 ctx.invariants.register(PACKAGE_NAME, install)
dsh-sessionE1+E2
复用 SessionId/SessionHeader 类型与可选 sessions 服务,做会话存在性判定与 attach 时的 cwd 归属校验
src/entity.ts:12 + src/index.ts:11 + src/spec.ts:10 + src/types.ts:9 import;src/index.ts:473 ctx.get('sessions')
dsh-storageE1
声明工作区域数据形态所在存储服务 seam 的 peer(源码无直接 import,随 dsh-storage-domain 一起装配)
package.json:44 peerDependencies @deepseek-ai/dsh-storage
dsh-storage-domainE1+E2
提供域数据形态(defineDomain/domainTable/KvTable/DomainGlobal),工作区记录与顺序全局态持久化在其之上
src/entity.ts:13 + src/spec.ts:11 import;src/index.ts:171 static inject=['storageDomain','sessionPersistence'] + src/index.ts:198 ctx.storageDomain.open(workspaceDomainSpec)

④ 被依赖(dependents · 下游消费者)

dsh-agent
回答 workspace/session-activity 的 turn 家族,并在 workspace/session-stop 时取消运行中的 agent
src/archive-admission.ts:12 import type + src/archive-admission.ts:27,34 事件订阅
dsh-api-session-controller
工作区注册表与归档会话门控
src/archived-session-gate.ts:13 import + src/index.ts:111 inject 'workspaceRegistry'
dsh-api-workspace-controller
工作区注册表 seam(全部命令与状态源)
src/commands.ts:4 import + src/index.ts:52 static inject 'workspaceRegistry'
dsh-client-ui-conversation
工作区实体类型
src/client/contract/slots.ts:17 + src/client/skeleton/ConversationContent.tsx:3
dsh-schedule
以 SessionActivity 类型参与工作区归档准入与停止判定
src/index.ts:9 type import + src/types.ts:11 import
dsh-subagent
响应工作区归档准入与活动上报
src/archive-admission.ts:13 (import type SessionActivity, SessionActivityItem) + src/archive-admission.ts:23 (ctx.on('workspace/session-activity')) + src/archive-admission.ts:30 (ctx.on('workspace/session-stop'))