Overview
dsh-session-actions
README / EN
Package documentation
Registry summary
dsh.pub verifies the pinned bundle contract, runtime facts, and distribution semantics. The complete README remains in the source repository.
Read the full README on GitHubLIMITATIONS
Known limitations
- **正在运行的会话不能删。** 判定用的是 DSH 自己的 `agent/status`:只要该会话的 Agent 正在跑一个回合(`ctx.agents.get(id).status === 'running'`),插件就拒绝删除,因为那一轮还在往日志里追加内容,删掉等于同时丢掉问题和答案。**只是打开着、但没在跑的会话可以正常删除**:文件会被清掉,列表行也会随之消失。 - 代价要说清楚:已被本进程装载(attached)的会话,其内存对象由创建它的 fiber 持有,插件没有处置它的权限(`AgentHandle.dispose()` 只给创建者)。所以删除一个"打开着的空闲会话"之后,进程内还会留着它的副本,直到你**重启 DSH** 才彻底释放。磁盘和列表都已经干净,重启前也不会再产生新的日志内容。 - **工作区记录的摘除可能被回滚。** 插件是直接改 `workspace.json`,而 Workspace registry 在内存里另有一份状态,它下次写入(归档、排序等)会整份覆盖。回滚后的残留是一个指向"已不存在的会话"的 ID,任何分组视图都不会渲染它。宿主的会话索引本身有对账逻辑(`session-query-sqlite` 每次读都会与磁盘比对),所以列表不会残留幽灵行。 - **依赖渲染后的 DOM。** 会话行菜单没有任何插件扩展点(`SessionNodeItem` 内联构造 `Menu` 的 items),因此浏览器半边是在菜单渲染出来之后往上贴两行;右键也是**按下该行自己渲染的那个 `⋯` 按钮**来开菜单,而不是另建一个菜单。贴完两行后会按菜单的**真实高度**重新定位一次:下方放不下就翻到触发按钮上方,四周保留 12px 边距(与 DSH 自己的定位规则一致),滚动/缩放时再补一次——否则窗口较矮时,追加的两行会落到窗口下沿之外。会话 ID 不是从 DOM 文本猜的,而是沿 React fiber 读回该行自己的 props(`node` / `onRename` / `onArchive`);这些属性名在打包产物中未被混淆。若将来 DSH 改变行组件的 props 命名,插件会退化成"什么都不加",而不是删错会话。 - 只对 Web 界面生效。无头 profile 下宿主半边加载为空操作。
