dsh-sessions-manager 3.7.5 → 3.7.6

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/lib/index.js CHANGED
@@ -2039,7 +2039,7 @@ function emptyScanCandidate(sizeBytes) {
2039
2039
  }
2040
2040
 
2041
2041
  // src/index.js
2042
- var BUILD_STAMP = true ? "3.7.5+23dc7e59" : "dev";
2042
+ var BUILD_STAMP = true ? "3.7.6+68c2ab69" : "dev";
2043
2043
  var name = "dsh-sessions-manager";
2044
2044
  var inject = ["webServer", "workspaceRegistry", "sessionPersistence", "sessionQuery", "storageDomain"];
2045
2045
  var MAX_TITLE = 80;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "dsh-sessions-manager",
3
3
  "description": "DSH 设置面板会话管理器:归档 / 恢复 / 彻底删除 / 移动到其他工作区,带工作区标签与会话日期;统一「会话管理」面板。Session manager for the DeepSeek Harness settings panel — archive / restore / permanently delete / move sessions across workspaces, with workspace tags & session dates in one unified panel.",
4
- "version": "3.7.5",
4
+ "version": "3.7.6",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
7
7
  "exports": {
@@ -21,6 +21,21 @@ function loadPanelPrefs() {
21
21
  }
22
22
 
23
23
  const CSS = `
24
+ /* 兼容 shim(2026-09-30 对 0.2.0-rc.2 实测):当前 runtime 的设计令牌不再提供
25
+ fill-elevated / fill-subtle / fill-secondary / label-inverted / state-warning-primary
26
+ 这几个 alias,缺位会让输入框、下拉框、卡片、徽标整体回退成透明。这里把它们重映射
27
+ 到 runtime 现有 token(官方 Input/Pill 分别用 bg-layer-1 / bg-layer-2)。选择器用
28
+ :where(:root)(零特异性):runtime 将来恢复官方定义时自动胜出,shim 只在缺位时兜底。
29
+ state-warning-primary 是旧名,现名为 state-warn-primary。 */
30
+ :where(:root){--dsw-alias-fill-elevated:var(--dsw-alias-bg-layer-2);--dsw-alias-fill-subtle:var(--dsw-alias-bg-layer-1);--dsw-alias-fill-secondary:var(--dsw-alias-bg-layer-2);--dsw-alias-label-inverted:var(--dsw-alias-label-primary-foreground);--dsw-alias-state-warning-primary:var(--dsw-alias-state-warn-primary)}
31
+ /* 原生 <select> 的弹出列表由 Chromium 按 color-scheme 绘制,不声明时暗色主题下
32
+ 仍是白底,叠加未适配的文字色导致不可读;跟随 DSH 的暗色主题标记切换。 */
33
+ .archv{color-scheme:light}
34
+ body[data-ds-dark-theme] .archv{color-scheme:dark}
35
+ /* 兜底:原生弹层行的配色直接写在 option 上(Chromium 按 option 自身的
36
+ background/color 绘制弹层),即使 color-scheme 判定被扩展或环境干扰,
37
+ 暗色下也不会出现白底配浅色文字的不可读组合。 */
38
+ .archv option{background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary)}
24
39
  .archv{--dsm-radius-tag:9px;--dsm-radius-ctl:9px;--dsm-radius-sheet:10px;--dsm-radius-card:12px;display:flex;flex-direction:column;gap:4px;max-width:800px;padding:8px 2px 28px}
25
40
  .archv-head{display:flex;align-items:center;gap:10px;margin:0 0 2px}
26
41
  .archv-title{font-size:16px;font-weight:650;color:var(--dsw-alias-label-primary);letter-spacing:-0.01em;margin:0}
@@ -97,7 +112,9 @@ const CSS = `
97
112
  分支(绿)/空白(灰),名字超长省略号;+N 计数 chip 中性色。 */
98
113
  .dsm-tagchip{display:inline-flex;align-items:center;flex:none;max-width:9em;min-height:22px;padding:0 8px;border:1px solid color-mix(in srgb,var(--dsw-alias-state-warn-primary,#EAB308) 45%,transparent);border-radius:var(--dsm-radius-tag);background:color-mix(in srgb,var(--dsw-alias-state-warn-primary,#EAB308) 10%,transparent);color:var(--dsw-alias-label-secondary);font-size:11px;font-weight:500;line-height:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
99
114
  .dsm-tagchip-more{max-width:none;color:var(--dsw-alias-label-tertiary);border-color:var(--dsw-alias-border-l2);background:var(--dsw-alias-fill-subtle)}
100
- .archv-id{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:10.5px;color:var(--dsw-alias-label-tertiary);flex:none;margin-left:auto;white-space:nowrap}
115
+ .archv-id{appearance:none;border:none;background:none;padding:0;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:10.5px;color:var(--dsw-alias-label-tertiary);flex:none;margin-left:auto;white-space:nowrap;cursor:pointer;transition:color .12s ease}
116
+ .archv-id:hover{color:var(--dsw-alias-label-secondary)}
117
+ .archv-id-copied{color:var(--dsw-alias-state-business-primary)}
101
118
  .archv-dot{color:var(--dsw-alias-border-l3);flex:none}
102
119
  .archv-check{width:15px;height:15px;accent-color:var(--dsw-alias-state-business-primary);flex:none;cursor:pointer}
103
120
  .archv-star{appearance:none;width:22px;height:22px;flex:none;display:inline-flex;align-items:center;justify-content:center;border:none;background:0 0;padding:0;line-height:0;color:var(--dsw-alias-label-tertiary);cursor:pointer;border-radius:50%;transition:color .15s ease,transform .12s ease}
@@ -921,6 +938,37 @@ function SessionPanel({ workspacesSvc }) {
921
938
  }
922
939
  }
923
940
 
941
+ // 点击行尾短 ID 复制完整会话 ID。clipboard API 优先(desktop/web 的页面都来自
942
+ // localhost,属安全上下文),失败回退 execCommand;成功把短 ID 短暂换成「已复制」
943
+ // 作就近反馈,两条路径全失败时把完整 ID 亮进 toast 供手抄(与上方徽章的失败终点
944
+ // 同一思路)。
945
+ const copiedTimer = useRef(null)
946
+ const [copiedId, setCopiedId] = useState(null)
947
+ const copySessionId = (id) => {
948
+ const markCopied = () => {
949
+ setCopiedId(id)
950
+ if (copiedTimer.current) clearTimeout(copiedTimer.current)
951
+ copiedTimer.current = setTimeout(() => setCopiedId(null), 1400)
952
+ }
953
+ const viaExecCommand = () => {
954
+ try {
955
+ const ta = document.createElement('textarea')
956
+ ta.value = id
957
+ ta.setAttribute('readonly', '')
958
+ ta.style.cssText = 'position:fixed;left:-9999px;top:0;opacity:0'
959
+ document.body.appendChild(ta)
960
+ ta.select()
961
+ const ok = document.execCommand('copy')
962
+ ta.remove()
963
+ if (ok) markCopied()
964
+ else showToast('复制失败,完整 ID:' + id, 'err')
965
+ } catch (e) { showToast('复制失败,完整 ID:' + id, 'err') }
966
+ }
967
+ if (navigator.clipboard && navigator.clipboard.writeText) {
968
+ navigator.clipboard.writeText(id).then(markCopied).catch(viaExecCommand)
969
+ } else viaExecCommand()
970
+ }
971
+
924
972
  const refresh = () => {
925
973
  setError(null)
926
974
  Promise.all([
@@ -2147,7 +2195,7 @@ function SessionPanel({ workspacesSvc }) {
2147
2195
  {tagChips(it.sessionId)}
2148
2196
  {kidsBadge(it.sessionId)}
2149
2197
  {branchGroupBadge(it.sessionId)}
2150
- <span className="archv-id" title={it.sessionId}>{shortId(it.sessionId)}</span>
2198
+ <button type="button" className={'archv-id' + (copiedId === it.sessionId ? ' archv-id-copied' : '')} title={it.sessionId + '(点击复制完整 ID)'} aria-label={'复制会话 ID ' + it.sessionId} onClick={(e) => { e.stopPropagation(); copySessionId(it.sessionId) }}>{copiedId === it.sessionId ? '已复制' : shortId(it.sessionId)}</button>
2151
2199
  </div>
2152
2200
  <div className="archv-meta">
2153
2201
  {it.archived ? <span className="archv-wtag archv-wgone">已归档</span> : <span className="archv-wtag archv-active">活动</span>}
@@ -2431,7 +2479,7 @@ const SIDEBAR_AUG_CSS = `
2431
2479
  .dsm-toast{position:fixed;bottom:20px;left:50%;transform:translateX(-50%);z-index:2147483601;background:Canvas;color:CanvasText;border:1px solid color-mix(in srgb,CanvasText 25%,transparent);padding:9px 16px;border-radius:999px;font-size:12px;box-shadow:0 8px 24px rgb(0 0 0/.25);max-width:min(92vw,460px);cursor:pointer}
2432
2480
  .dsm-toast-long{border-radius:14px;text-align:left;line-height:18px}
2433
2481
  .dsm-toast-err{background:#4A1D1D;color:#FFD9D9;border:1px solid var(--dsw-alias-state-error-primary)}
2434
- .dsm-sub{position:fixed;z-index:1100;box-sizing:border-box;min-width:190px;max-width:320px;padding:4px;display:flex;flex-direction:column;gap:0;background:var(--dsw-specific-menu);border:1px solid var(--dsw-alias-border-inverted);border-radius:12px;box-shadow:var(--dsw-shadow-lv3)}
2482
+ .dsm-sub{position:fixed;z-index:1100;box-sizing:border-box;min-width:190px;max-width:320px;padding:4px;display:flex;flex-direction:column;gap:0;background:var(--dsw-specific-menu);backdrop-filter:var(--dsw-menu-backdrop-filter,blur(40px) saturate(150%));border:1px solid var(--dsw-alias-border-inverted);border-radius:12px;box-shadow:var(--dsw-shadow-lv3)}
2435
2483
  .dsm-sub-loading,.dsm-sub-empty{font-size:12px;color:var(--dsw-alias-label-tertiary);padding:6px 10px}
2436
2484
  .dsm-sub-err{font-size:12px;color:var(--dsw-alias-state-error-primary);padding:6px 10px}
2437
2485
  .dsm-sub-item{display:flex;align-items:center;gap:8px;width:100%;min-height:36px;padding:6px 10px;border:none;border-radius:8px;background:transparent;cursor:pointer;font-size:13px;line-height:18px;color:var(--dsw-alias-label-primary);text-align:left}