@xrn1997/dsh-session-delete 0.1.0 → 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/README.md CHANGED
@@ -65,7 +65,7 @@ dsh plugin --profile <profile> remove @xrn1997/dsh-session-delete
65
65
 
66
66
  - 清单按项目分组,每条两行——标题 / 「刚刚删除 · 24KB」或「删除于 7分钟前 · 350KB」;「恢复」与「彻底删除…」在行右侧(前者描边、后者安静的红),点行本身是选中并在右边看详情
67
67
  - 头部是条数与合计占用(「2 个会话 · 共 49KB」);页脚是「清空回收站…」——**整页唯一一块实心红**
68
- - 头部下面那一排(不随清单滚走)从左到右:**全部折叠 / 全部展开**、**多选**,最右是**刷新**(图标,悬停给说明)
68
+ - 头部下面那一排(不随清单滚走):**全部折叠 / 全部展开**、**多选**(「刷新」已删——每次读清单都会先与回收站目录对账,不再需要手动刷)
69
69
  - 组头可以单独折叠(也可以一键全部折叠),折叠起来的组条目直接收掉、计数还留在组头上;多选态下组头多出一颗**三态**勾选框——点它就是把这个项目的**全部**会话选上(包括折叠起来看不见的),只勾了几条时显示半选
70
70
  - 两栏之间那根线可以左右拖(也能聚焦后用 ←→ 调,Home 回默认 420):最窄 330(再窄「删除于 … · 大小」那一行就被截断了),最右拖到「详情还读得开」为止
71
71
  - 多选态下:行右侧两颗按钮退场、标题左侧出勾选框,点行就是切换勾选;页脚那颗换成「彻底删除 N 条」(一条没勾时置灰并说明原因),确认后按清单顺序逐条执行,失败的那条把原文留在自己身上。退出多选即清空勾选,不留看不见的勾选
package/lib/client.js CHANGED
@@ -164,7 +164,6 @@ window.__ModuleLoader__.load({
164
164
  "trash.toolbar.collapseAll": "全部折叠",
165
165
  "trash.toolbar.expandAll": "全部展开",
166
166
  "trash.divider.label": "调整左右分栏宽度",
167
- "trash.toolbar.refresh": "重新读一遍回收站",
168
167
  "trash.select.group": "勾选「{project}」这 {count} 条会话",
169
168
  "trash.toolbar.select": "多选",
170
169
  "trash.toolbar.selectExit": "退出多选",
@@ -248,7 +247,6 @@ window.__ModuleLoader__.load({
248
247
  "trash.toolbar.collapseAll": "Collapse all",
249
248
  "trash.toolbar.expandAll": "Expand all",
250
249
  "trash.divider.label": "Adjust the width of the list column",
251
- "trash.toolbar.refresh": "Re-read the trash",
252
250
  "trash.select.group": "Select all {count} sessions under “{project}”",
253
251
  "trash.toolbar.select": "Select",
254
252
  "trash.toolbar.selectExit": "Done selecting",
@@ -394,7 +392,8 @@ window.__ModuleLoader__.load({
394
392
  * 撞了就是整棵插件树 boot 失败——所以这条路径是与生态的硬边界,不是显示好不好看的问题。
395
393
  */
396
394
  const SESSION_DELETE_API_PREFIX = "/dsh-session-delete-api";
397
- /** 五个端点的段名(相对前缀;`GET list` 读清单,其余四个 `POST` 按 id 取数或写)。 */
395
+ /** 五个端点的段名(相对前缀;`GET list` **对账并读**清单——`session-trash/` 里的目录是准,其余四个
396
+ * `POST` 按 id 取数或写)。 */
398
397
  const ROUTES = {
399
398
  list: "/list",
400
399
  delete: "/delete",
@@ -726,7 +725,7 @@ window.__ModuleLoader__.load({
726
725
  });
727
726
  //#endregion
728
727
  //#region src/client/ui/icons.tsx
729
- /** 六个图标共用的外框(官方每个 artwork 函数里逐字重复的那一段)。 */
728
+ /** 各图标共用的外框(官方每个 artwork 函数里逐字重复的那一段)。 */
730
729
  function IconFrame({ size = 16, children }) {
731
730
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
732
731
  width: size,
@@ -785,18 +784,6 @@ window.__ModuleLoader__.load({
785
784
  ]
786
785
  });
787
786
  }
788
- function IconRefreshOutlineRegular({ size }) {
789
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(IconFrame, {
790
- size,
791
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
792
- d: "M14.5001 8C14.5 9.28552 14.1188 10.5422 13.4045 11.611C12.6903 12.6799 11.6752 13.5129 10.4875 14.0049C9.29982 14.4968 7.99295 14.6255 6.73212 14.3747C5.4713 14.124 4.31314 13.505 3.4041 12.596C2.49514 11.687 1.87614 10.5288 1.62537 9.26798C1.37459 8.00716 1.50331 6.70028 1.99525 5.51261C2.48719 4.32494 3.32025 3.30981 4.3891 2.59557C5.45795 1.88134 6.71458 1.50008 8.0001 1.5C9.9001 1.5 11.7001 2.3 13.0001 3.6L14.5001 5.1",
793
- stroke: "currentColor"
794
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
795
- d: "M14.4999 1.5V5.1H10.8999",
796
- stroke: "currentColor"
797
- })]
798
- });
799
- }
800
787
  function IconFolderOpenOutlineRegular({ size }) {
801
788
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(IconFrame, {
802
789
  size,
@@ -24008,7 +23995,7 @@ window.__ModuleLoader__.load({
24008
23995
  /**
24009
23996
  * 回收站清单面板(设计稿 §7 状态 ④⑤ + 2026-10-15 §2 的两栏形态)——**中央面板的本体**(`main` 槽的占用者)。
24010
23997
  *
24011
- * 面板自带页面骨架(标题 / 条数与合计 / 刷新 / 内容区 / 页脚),因为宿主给中央列的那个盒子
23998
+ * 面板自带页面骨架(标题 / 条数与合计 / 工具排 / 内容区 / 页脚),因为宿主给中央列的那个盒子
24012
23999
  * (`AppFrame` 的 `.centerCol`)只有背景与圆角,**没有 padding、也不是滚动容器**——asar 里那条
24013
24000
  * `.BynINW_centerCol{background:var(--dsw-alias-bg-base);border-radius:…;corner-shape:round}` 逐字
24014
24001
  * 如此。回收站可以很长(本机 125 个会话合计 85M),不自己收滚动就会把整列顶长。
@@ -24125,9 +24112,9 @@ window.__ModuleLoader__.load({
24125
24112
  minWidth: 0
24126
24113
  };
24127
24114
  /**
24128
- * 清单那一栏的**外壳**(宽与 `flex` 不在这里——那是可拖的量,由 `useColumnResize` 每次渲染现给)。
24129
- * 两栏不成立时(窄档,或宽档但清单为空/读不到)同一个配方直接铺满:**不再限宽 760 居中**,
24130
- * 那条关心得只适用于正文(见 `DETAIL_TEXT_MAX_WIDTH`)。
24115
+ * 清单那一栏的**外壳**(宽与 `flex` 不在这里——由调用点在渲染时现给:两栏时是可拖的定宽,
24116
+ * 单列时 `flex:'1 1 auto'` 铺满)。两栏不成立时(窄档,或宽档但清单为空/读不到)同一个配方
24117
+ * 直接铺满:**不再限宽 760 居中**,那条关心得只适用于正文(见 `DETAIL_TEXT_MAX_WIDTH`)。
24131
24118
  *
24132
24119
  * **滚动条不用注入任何 CSS 就已经是宿主的**:宿主在 `body` 上给出一组量(`--dsh-scrollbar-width:5px`
24133
24120
  * 等),再用全局 `::-webkit-scrollbar*` 规则消费它们(asar @45064180 起)⇒ 这里一个 `overflow:auto`
@@ -24164,9 +24151,10 @@ window.__ModuleLoader__.load({
24164
24151
  width: "100%"
24165
24152
  };
24166
24153
  /**
24167
- * 那一排视图开关(全部折叠 / 全部展开、多选、刷新)。它**住在面板体顶端、不在清单列里**:原先在
24168
- * 滚动容器内,长清单滚到底会把开关滚走(2026-10-15 真机反馈后搬出来的理由,与已经删掉的「整条左栏
24169
- * 收起」无关)。宽度上限由用它的地方现给——两栏时跟着可拖的清单列宽,单列时不设上限。
24154
+ * 那一排视图开关(全部折叠 / 全部展开、多选;「刷新」图标 2026-10-16 已删,见 `toolbar` 那处注释)。
24155
+ * 它**住在面板体顶端、不在清单列里**:原先在滚动容器内,长清单滚到底会把开关滚走(2026-10-15
24156
+ * 真机反馈后搬出来的理由,与已经删掉的「整条左栏收起」无关)。宽度上限由用它的地方现给——两栏时
24157
+ * 跟着可拖的清单列宽,单列时不设上限。
24170
24158
  */
24171
24159
  const TOOLBAR = {
24172
24160
  display: "flex",
@@ -24535,6 +24523,12 @@ window.__ModuleLoader__.load({
24535
24523
  loadingId,
24536
24524
  detailFailure
24537
24525
  ]);
24526
+ /**
24527
+ * 清单容器(roving tabindex 那个唯一的 tab 巢)。`flex:'1 1 auto'` 是**空态居中链**的一节:
24528
+ * 空态块自己有 `flex:1` + `justifyContent:center`,但要有**有高度的**父链才居得起来——本层是
24529
+ * 两栏改造(2026-10-15)新插进来的 div,缺这条 flex 就把链断在"内容高"上、空态图标贴左上角
24530
+ * (2026-10-16 真机反馈)。长清单不受影响:`min-height:auto` 把它钉在内容高,滚动照旧归外层。
24531
+ */
24538
24532
  const list = /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
24539
24533
  ref: listRef,
24540
24534
  "data-dsh-session-delete": "trash-list",
@@ -24548,6 +24542,7 @@ window.__ModuleLoader__.load({
24548
24542
  display: "flex",
24549
24543
  flexDirection: "column",
24550
24544
  gap: 16,
24545
+ flex: "1 1 auto",
24551
24546
  minWidth: 0
24552
24547
  },
24553
24548
  children: listFailure !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
@@ -24860,6 +24855,10 @@ window.__ModuleLoader__.load({
24860
24855
  /**
24861
24856
  * 那一排**常驻面板体顶端**,不住清单列里:它原先在滚动容器内,长清单滚到底会把开关滚走。
24862
24857
  * 宽度上限跟着清单列走,所以它在视觉上仍然"属于清单"。
24858
+ *
24859
+ * 这里曾有一颗「刷新」图标(2026-10-15 第三批收进那一排、第四批降级成图标,**2026-10-16
24860
+ * 按用户裁定删除**):清单现在是"每次读都对账"(见 `reconcile.ts`),开面板、切走再切回、
24861
+ * 重启——任何一次读都会先同步,那颗按钮不再承担别人替代不了的活。
24863
24862
  */
24864
24863
  const toolbar = /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
24865
24864
  style: {
@@ -24867,44 +24866,23 @@ window.__ModuleLoader__.load({
24867
24866
  maxWidth: split ? resize.listWidth : "none"
24868
24867
  },
24869
24868
  "data-dsh-session-delete": "trash-toolbar",
24870
- children: [
24871
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Button, {
24872
- variant: "ghost",
24873
- size: "sm",
24874
- onClick: toggleAllGroups,
24875
- disabled: !hasEntries,
24876
- children: allCollapsed ? t("trash.toolbar.expandAll") : t("trash.toolbar.collapseAll")
24877
- }),
24878
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Button, {
24879
- variant: "ghost",
24880
- size: "sm",
24881
- disabled: !hasEntries,
24882
- "aria-pressed": selectMode,
24883
- onClick: () => {
24884
- if (selectMode) exitSelect();
24885
- else setSelectMode(true);
24886
- },
24887
- children: selectMode ? t("trash.toolbar.selectExit") : t("trash.toolbar.select")
24888
- }),
24889
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
24890
- style: {
24891
- marginLeft: "auto",
24892
- flex: "none"
24893
- },
24894
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Tooltip, {
24895
- label: t("trash.toolbar.refresh"),
24896
- side: "bottom",
24897
- portal: true,
24898
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Button, {
24899
- variant: "ghost",
24900
- size: "sm",
24901
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconRefreshOutlineRegular, { size: 14 }),
24902
- "aria-label": t("trash.toolbar.refresh"),
24903
- onClick: () => void reload()
24904
- }) })
24905
- })
24906
- })
24907
- ]
24869
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(Button, {
24870
+ variant: "ghost",
24871
+ size: "sm",
24872
+ onClick: toggleAllGroups,
24873
+ disabled: !hasEntries,
24874
+ children: allCollapsed ? t("trash.toolbar.expandAll") : t("trash.toolbar.collapseAll")
24875
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Button, {
24876
+ variant: "ghost",
24877
+ size: "sm",
24878
+ disabled: !hasEntries,
24879
+ "aria-pressed": selectMode,
24880
+ onClick: () => {
24881
+ if (selectMode) exitSelect();
24882
+ else setSelectMode(true);
24883
+ },
24884
+ children: selectMode ? t("trash.toolbar.selectExit") : t("trash.toolbar.select")
24885
+ })]
24908
24886
  });
24909
24887
  /** 清单列:宽档定宽(可拖)、窄档铺满。 */
24910
24888
  const listPane = (style) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
@@ -24970,7 +24948,10 @@ window.__ModuleLoader__.load({
24970
24948
  ...resize.handleProps
24971
24949
  }),
24972
24950
  detailPane
24973
- ] }) : drilled && selected !== null ? detailPane : listPane(LIST_COLUMN)
24951
+ ] }) : drilled && selected !== null ? detailPane : listPane({
24952
+ ...LIST_COLUMN,
24953
+ flex: "1 1 auto"
24954
+ })
24974
24955
  }),
24975
24956
  hasEntries ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
24976
24957
  style: {