Skip to content

Releases: Lzcdebear/better-dsh-session-deletetool

v0.5.3

Choose a tag to compare

@Lzcdebear Lzcdebear released this 14 Oct 12:34

Both delete glyphs match the row they sit in, and stay crisp on scaled screens

  • The bulk control beside the workspace search now inherits the section header's colour, so the trash and the “工作区” label always resolve to the same computed colour; hover only adds the shared hover background, the way the shipped icon buttons behave.
  • Both glyphs are drawn as single stroked contours with shape-rendering: geometricPrecision instead of closed filled bands, whose hairline double edges went soft — and read as washed-out colour — on fractional-DPI (4K-scaled) screens.
  • The menu row's trash gained a centre bar, a wider lower half and two pixels of size (14px → 17px); the bulk glyph is 18px.

兼容 dsh-claude-style(Nwflower)主题:删除图标颜色与“工作区”三字同源,4K 缩放下更清晰;菜单桶新增中竖线并加宽桶底。

npm: npm install better-dsh-session-deletetool@0.5.3

v0.5.2

Choose a tag to compare

@Lzcdebear Lzcdebear released this 14 Oct 05:55

The bulk entry survives themed search styles

  • The bulk-delete control now mounts as the workspace search slot's previous sibling instead of inside it, so it stays visible under all three dsh-claude-style (Nwflower) search styles: 覆盖品牌 / 独立 / 图标.
  • It takes over the slot's margin-left:auto and pins the collapsed slot back to its 28px cell, so the header row reads as one evenly spaced icon cluster at the row's own 4px gaps; the expanded search input is untouched.
  • The icon's rest colour moved to --dsw-alias-label-tertiary, matching the icons it sits beside in themed builds.

兼容 dsh-claude-style(Nwflower)主题:删除图标在“搜索框样式”三档下都常驻,自动与相邻图标对齐、同色;工作区标题行四个图标等距排列。

npm: npm install better-dsh-session-deletetool@0.5.2

v0.4.1

Choose a tag to compare

@Lzcdebear Lzcdebear released this 04 Oct 16:31

Install from npm: npm install better-dsh-session-deletetool. That route is now the first section of both READMEs, ahead of the GitHub, local-copy and tarball routes (each moved down one number), and DSH's own plugin manager takes the same registry name for its install entry.

Nothing about the plugin's behaviour changed in 0.4.1. It is 0.4.0's code with the npm install route written down.


中文摘要:多了一条也是最省事的装法,npm install better-dsh-session-deletetool,或者把这个包名直接粘到 DSH 的插件安装入口。两个 README 的安装章节现在把 npm 排在第一条,GitHub、本地副本、tarball 依次顺延。0.4.1 没有改插件行为,就是 0.4.0 的代码加上 npm 安装说明。

v0.4.0

Choose a tag to compare

@Lzcdebear Lzcdebear released this 04 Oct 16:10

The npm package and the GitHub repository are better-dsh-session-deletetool now. The old spelling dsh-session-delete was already taken on npm by another author, so the name moved before the first publish. Every identifier that pointed at it moved in one pass:

  • the four Host routes: /better-dsh-session-deletetool/inspect, /delete, /catalog and /delete-batch;
  • the client module id, the locale namespace, the sidebar menu row, both shell.overlay seats and the bulk anchor's registration ids, the data-dsh-plugin marker, and the React display name;
  • the Host loader row in cordis.patch.yml — both the row id and the module name the profile imports;
  • the [better-dsh-session-deletetool] log prefix and the effect labels;
  • the repository / homepage / bugs URLs and every install target in the READMEs.

A profile that had the old name linked has to link the new one: the bundle key in dsh.profile.bundles and the dependency key in the profile's own package.json both change.

The family view is written down now. The dialog has drawn a conversation's subagents and derived conversations as one tree for several releases, but neither README said so out loud. Both now open that section by saying that the sidebar cannot show the relation and the dialog is the one place it is drawn, and the npm description says it too.

Everything else is 0.3.9: both dialogs drawing the same tree, per-subtree checkboxes, bulk delete, and the running-work gate. The changelog carries that history.


中文摘要:包名和仓库名都换成了 better-dsh-session-deletetool(旧的 dsh-session-delete 在 npm 上已经被别人占用,所以在首次发布前先改名)。四条宿主路由、客户端模块 id、locale 命名空间、侧边栏菜单项与两个 overlay 槽位、批量锚点、data-dsh-plugin 标记、cordis.patch.yml 里的加载行、日志前缀,以及 README 里所有安装地址,都一起改了。装过旧名字的 profile 需要把 dsh.profile.bundles 和依赖键换成新名。

README 和 npm 描述这次也明确写出了那个一直存在的能力:删除确认框是 DSH 里唯一能把一个会话的整个家族(子智能体、派生对话以及它们带出的下一层)按层级画出来的地方,删之前先看得见。

v0.3.9

Choose a tag to compare

@Lzcdebear Lzcdebear released this 04 Oct 14:37

Both delete dialogs are the same family tree now, and bulk delete arrives with them.

A trash control beside the search icon deletes many conversations at once. It opens one dialog over
every conversation the Host knows, sectioned by the Workspace that owns it in the registry's own order,
with one 未归类 section for conversations no Workspace owns.

One family tree, drawn by both dialogs. A row per Session, and under every row a collapsible
子智能体 (n) block followed by a collapsible 派生对话 (n) block holding that row's own direct
children. A derived conversation keeps its own subagents and its own derived conversations inside its
own block, one step further in, so a fork of a fork is nested where it belongs instead of appearing in
a second list that only shares a heading with its parent. The nesting is the indentation alone: no
connectors, no guide lines.

Every row carries its kind's glyph — a document for a conversation, a robot head for the 子智能体
block and a person for a subagent, a chain for the 派生对话 block and a chat bubble for a derived
conversation.

Every row's checkbox means its own subtree. A row is ticked when everything below it is ticked and
mixed when only part of it is; pressing it takes or clears that whole subtree, and a block's checkbox
covers the rows the block lists. In the bulk dialog a ticked child whose parent is not ticked is sent
as a delete root of its own, so one subagent can be deleted without its parent.

The family is read from both durable relations, and a read failure is reported. Subagents come from
each parent's own subagentCatalog projection, walked downwards, merged with
subagents.listDescendants and the header lineage (SessionHeader.parentSession) — so a subagent a
child conversation spawned is listed under that child, and neither source is a single point of
failure. What could not be read is printed above the list instead of quietly costing rows.

Names follow the sidebar's own rule — the durable title, else the final segment of the project
directory, else the id — so nothing reads as untitled.

Only running work blocks a delete; being open does not. The gate is asked once per Session in the
delete set, the refusal names each busy one, and the same "stop unfinished work first" switch the
archive uses dispatches workspace/session-stop before the removal. A deleted Session's own terminals
are closed with it.

API. GET /inspect answers descendants: { count, subagents, derived, truncated, maxDeletable, items[] }; POST /delete takes { sessionId, stop?, descendants? }; GET /catalog answers
{ ok, workspaces[], totals } with each row carrying id, kind (root / subagent /
derived), depth, parentId, title, cwd, open, running and activity;
POST /delete-batch takes { roots: [{ sessionId, descendants? }], stop? } and answers
{ ok, roots, removed[], failed[] }, one entry per root.


中文摘要:这个版本补上了「批量删除」,并把单会话和多会话两个确认框统一成同一棵家族树:一行一个会话,行下面是它自己的「子智能体(n)」和「派生对话(n)」两个可折叠分组,派生对话再把自己那一层接在自己的块里面。层级只靠缩进表达,没有连接线;每行的勾选框管它自己那棵子树,批量对话框里只勾某个子智能体就只删它、母会话不动。

会话名跟着侧边栏的规则走(日志里的名字,没有就用工程目录末段,再没有才用 id),读不到的分支会写在列表上方而不是静默少几行。删除的门槛仍然只有「还有工作在跑」,确认后会先停掉这些工作再删,被删会话自己的终端也一并关掉。

v0.2.1

Choose a tag to compare

@Lzcdebear Lzcdebear released this 02 Oct 03:55

Deleting a conversation is a choice now, not a take-it-all.

Pick what goes with it. The confirmation dialog lists the session's whole family and lets you choose:

  • one delete all checkbox, with an indeterminate state when the selection is partial;
  • one collapsible group per relation — subagent conversations and forked conversations;
  • one checkbox per descendant, indented by lineage depth, labelled with its title and the tail of its id, and badged when it is open or still has work running.

Confirming posts exactly the ticked ids, and the button states how many conversations will go. Unticked descendants survive as conversation roots.

The family is complete and the selection is validated. Descendants come from the header lineage every Session carries (SessionHeader.parentSession) — which covers subagent sessions, forked conversations, and the child Sessions Agent Teams provisions — unioned with the durable subagentCatalog projection for children whose own header no longer reads. The Host validates the client's selection against its own walk, so a request can only ever name Sessions in that lineage (400 unknown-descendant otherwise). Omitting the field still means "all of them".

A gate bug, fixed. Running work was only checked for the target Session, but DSH's archive admission answers per Session: a descendant's running turn or background job was invisible, so a child could be deleted mid-run. Every Session in the delete set is now asked, the refusal names each busy Session, and stop: true dispatches workspace/session-stop for all of them.

Shells no longer outlive their conversation. Terminals belong to no admission family, and the service only reaps them when the Agent is released — which can be long after the log is gone. Each deleted Session's terminals are now closed, reported as terminalsKilled.

API. GET /inspect answers with descendants: { count, subagents, derived, truncated, maxDeletable, items[] }, each item carrying id, kind, depth, parentId, title, open, agent, running and its own activity. POST /delete takes { sessionId, stop?, descendants? } and answers with kept, terminalsKilled and warnings beside the per-Session reports. The request-body ceiling is 64 KiB so a few hundred ids fit, and the 200-per-request cap applies to the selection rather than to the whole family.

Audited, deliberately unchanged. Attachment blobs stay (content-addressed and shared; the service has no reference counting), and the derived search index keeps reconciling itself.


中文摘要:删除会话时,确认框会把整个家族列出来让你勾选——一个"删除全部"勾选框(部分选中时显示半选)、每种关系一个可折叠分组(子智能体会话 / 派生对话)、每个子会话一个勾选框(带标题、id 尾号和状态标记)。没勾的子会话会作为独立会话留下来。同时修掉两处遗漏:子会话自己在跑的回合或后台任务此前不会被拦(现在对删除集合里每个会话各问一次),以及会话被删后它的终端还留着(现在一并关掉)。