dsh-sessions-manager 3.6.0 → 3.6.2
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.en.md +4 -4
- package/README.md +4 -4
- package/lib/client.js +100 -28
- package/lib/client.js.map +2 -2
- package/lib/index.js +323 -169
- package/lib/index.js.map +2 -2
- package/package.json +1 -1
- package/src/client/index.jsx +104 -28
- package/src/client/logic.js +29 -0
- package/src/index.js +409 -190
- package/src/session-meta-cache.js +18 -0
- package/src/title-persist-index.js +13 -3
package/lib/client.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/client/index.jsx", "../src/client/logic.js"],
|
|
4
|
-
"sourcesContent": ["/**\n * dsh-sessions-manager \u2014 browser half: renders a single \"\u4F1A\u8BDD\u7BA1\u7406\" settings\n * section (settings.section list slot) that unifies archived-session\n * management and cross-workspace moving. It talks to the host half's\n * /archived-sessions/* JSON routes by fetch, showing every conversation with\n * its archive state and offering archive / restore / delete / move (and batch)\n * actions. All DOM/runtime wiring failures are logged, never thrown \u2014 a thrown\n * plugin apply takes down the whole web-shell boot.\n *\n * @module dsh-sessions-manager/client\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react'\nimport { authoritativeTitleForFirstPaint, canDropOnWorkspace, dotStateFor, foldSubagents, openSubagentToast, sessionForNodes, shortId, starredOf, toastDurationFor, workspaceForNodes } from './logic.js'\n\nexport const inject = ['slots']\n\nconst PANEL_PREFS_KEY = 'dsm-panel-prefs-v1'\nfunction loadPanelPrefs() {\n try { return JSON.parse(localStorage.getItem(PANEL_PREFS_KEY) || '{}') || {} } catch (e) { return {} }\n}\n\nconst CSS = `\n.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}\n.archv-head{display:flex;align-items:center;gap:10px;margin:0 0 2px}\n.archv-title{font-size:16px;font-weight:650;color:var(--dsw-alias-label-primary);letter-spacing:-0.01em;margin:0}\n.archv-stamp{font-size:11px;font-weight:500;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-fill-secondary);border:1px solid var(--dsw-alias-border-l1);border-radius:999px;padding:2px 8px;white-space:nowrap;cursor:default}\n.archv-count{font-size:11px;font-weight:600;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-fill-subtle);border:1px solid var(--dsw-alias-border-l2);border-radius:999px;padding:1px 8px;flex:none}\n.archv-sub{font-size:12px;line-height:1.55;color:var(--dsw-alias-label-tertiary);margin:0 0 12px;max-width:64ch}\n.archv-err{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:9px 12px;border:1px solid color-mix(in srgb,var(--dsw-alias-state-error-primary) 40%,transparent);background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 8%,transparent);border-radius:var(--dsm-radius-sheet);color:var(--dsw-alias-state-error-primary);font-size:12px;margin-bottom:10px}\n.archv-errretry{appearance:none;border:1px solid color-mix(in srgb,var(--dsw-alias-state-error-primary) 45%,transparent);background:transparent;color:inherit;border-radius:8px;padding:4px 10px;font-size:11px;cursor:pointer;flex:none}\n.sess-fwrap{margin:0 0 12px}\n.sess-filter{display:flex;align-items:center;gap:6px}\n/* \u4F4E\u9891\u5206\u7C7B\uFF08\u5DF2\u6536\u85CF/\u7A7A\u767D/\u56DE\u6536\u7AD9\uFF09\u6A2A\u5411\u6536\u7EB3\uFF1A\u9ED8\u8BA4 max-width:0 \u9690\u85CF\uFF0C\u70B9\u6309\u7BAD\u5934\n \uFF08sess-fmore-open\uFF09\u6216\u4F4E\u9891\u5206\u7C7B\u5904\u4E8E\u9009\u4E2D\u6001\uFF08sess-fsec-on\uFF09\u65F6\u5411\u53F3\u5C55\u5F00\uFF1B\n max-width \u8FC7\u6E21\u505A\u6A2A\u5411\u6ED1\u51FA\u52A8\u753B\uFF0Coverflow \u88C1\u526A\u56DE\u7F29\u8FC7\u7A0B\u3002 */\n.sess-fmore{display:inline-flex;align-items:center;gap:6px;max-width:0;opacity:0;overflow:hidden;white-space:nowrap;transform:translateX(-8px);visibility:hidden;transition:max-width .22s ease,opacity .18s ease,transform .22s ease,visibility 0s .22s}\n.sess-fwrap.sess-fmore-open .sess-fmore,.sess-fwrap.sess-fsec-on .sess-fmore{max-width:30em;opacity:1;transform:none;visibility:visible;transition:max-width .22s ease,opacity .18s ease,transform .22s ease}\n.sess-farrow{appearance:none;display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border:none;background:transparent;color:var(--dsw-alias-label-secondary);cursor:pointer;flex:none;padding:0;opacity:0;pointer-events:none;transition:opacity .18s ease,color .18s ease}\n/* \u7BAD\u5934\u9ED8\u8BA4\u7D27\u8DDF\u4E09\u4E2A\u4E3B tab \u53F3\u8FB9\uFF08\u60AC\u505C\u7B5B\u9009\u884C\u624D\u6D6E\u73B0\uFF09\uFF1B\u5C55\u5F00\u7EC4\u6491\u5F00\u540E\u628A\u5B83\u63A8\u5230\n \u884C\u5C3E\u3002\u65E0\u5916\u5708\u5E95\u8272\uFF0C\u53EA\u6E32\u67D3 svg \u672C\u4F53\u3002\u9690\u85CF\u6001\u7528 pointer-events:none \u6321\u4F4F\n \u8BEF\u70B9\uFF1B\u5C55\u5F00\u6001\uFF08\u542B\u9009\u4E2D\u4F4E\u9891\u5206\u7C7B\u7684\u515C\u5E95\uFF09\u5E38\u9A7B\u2014\u2014\u6536\u8D77\u5165\u53E3\u4E0D\u80FD\u6D88\u5931\u3002 */\n.sess-fwrap:hover .sess-farrow,.sess-fwrap.sess-fmore-open .sess-farrow,.sess-fwrap.sess-fsec-on .sess-farrow{opacity:1;pointer-events:auto}\n.sess-farrow:hover{color:var(--dsw-alias-label-primary)}\n.sess-farrow svg{display:block;transition:transform .22s ease}\n.sess-fwrap.sess-fmore-open .sess-farrow svg,.sess-fwrap.sess-fsec-on .sess-farrow svg{transform:rotate(180deg)}\n.sess-fbtn{appearance:none;min-height:30px;padding:0 12px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-fill-subtle);color:var(--dsw-alias-label-secondary);border-radius:999px;font-size:12px;font-weight:500;cursor:pointer}\n.sess-fbtn:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}\n.sess-fbtn-on{background:var(--dsw-alias-interactive-bg-active);color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-border-l3)}\n.sess-tools{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:8px;margin:0 0 8px}\n.sess-tools-4{grid-template-columns:repeat(auto-fit,minmax(132px,1fr))}\n.dsm-kids{display:flex;flex-direction:column;gap:6px;margin:10px 0 2px;margin-left:43px;padding-left:10px;border-left:2px solid var(--dsw-alias-border-l3)}\n.dsm-kid .dsm-kids{margin-left:8px;margin-top:6px}\n.dsm-kids-toggle{appearance:none;min-height:22px;padding:0 9px;border:1px solid color-mix(in srgb,var(--dsw-alias-state-business-primary) 40%,transparent);background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 10%,transparent);color:var(--dsw-alias-state-business-primary);border-radius:var(--dsm-radius-tag);font:inherit;font-size:11px;font-weight:500;cursor:pointer;flex:none;white-space:nowrap}\n.dsm-kids-toggle:hover{background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 18%,transparent)}\n.dsm-kid{display:flex;flex-direction:column;gap:6px;min-width:0}\n.dsm-kid-row{display:flex;align-items:center;gap:8px;min-width:0}\n.dsm-kid-name{flex:1 1 auto;min-width:0;font-size:12px;color:var(--dsw-alias-label-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.dsm-kid-meta{font-size:11px;color:var(--dsw-alias-label-tertiary);flex:none;white-space:nowrap}\n.dsm-kid-acts{display:flex;align-items:center;gap:6px;flex:none;margin-left:auto}\n.dsm-kid-acts .archv-btn{min-height:26px;padding:0 9px;font-size:11px}\n.sess-field{display:flex;flex-direction:column;gap:5px;min-width:0}\n.sess-field label{font-size:11px;font-weight:600;color:var(--dsw-alias-label-secondary)}\n.sess-field input,.sess-field select{box-sizing:border-box;width:100%;min-height:36px;padding:0 10px;border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsm-radius-ctl);background:var(--dsw-alias-fill-elevated);color:var(--dsw-alias-label-primary);font:inherit;font-size:12px}\n.sess-results{display:flex;flex-direction:column;gap:1px;font-size:11px;color:var(--dsw-alias-label-tertiary);margin:0 0 4px}\n.archv button:focus-visible,.archv input:focus-visible,.archv select:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}\n.sess-batch{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:8px 2px 4px;margin-bottom:4px}\n/* issue #7\uFF1A\u52FE\u9009\u540E\u6279\u91CF\u64CD\u4F5C\u680F\u5438\u9876\u2014\u2014\u5217\u8868\u518D\u957F\uFF0C\u64CD\u4F5C\u6309\u94AE\u4E5F\u4E00\u76F4\u5728\u624B\u8FB9\u3002 */\n.sess-batch-pin{position:sticky;top:0;z-index:30;margin:0 -2px 4px;padding:8px 4px 6px;background:var(--dsw-alias-bg-layer-1);border-bottom:1px solid var(--dsw-alias-border-l2);box-shadow:0 6px 14px rgb(0 0 0/.08)}\n.sess-btntext{font-size:12px;color:var(--dsw-alias-label-tertiary);flex:none}\n.archv-list{display:flex;flex-direction:column;gap:8px}\n.archv-card{display:flex;flex-direction:column;align-items:stretch;gap:0;padding:12px 14px;border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsm-radius-card);background:var(--dsw-alias-fill-elevated);transition:border-color .15s ease,background-color .15s ease}\n.archv-card:hover{border-color:var(--dsw-alias-border-l4)}\n.archv-card-exp{border-color:var(--dsw-alias-border-l4);background:var(--dsw-alias-bg-layer-1)}\n.archv-row{display:flex;align-items:center;gap:14px;width:100%;min-width:0}\n.archv-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:5px}\n.archv-titlerow{display:flex;align-items:center;gap:8px;min-width:0}\n.archv-name{font-size:13px;font-weight:550;color:var(--dsw-alias-label-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;flex:0 1 auto}\n.archv-meta{display:flex;align-items:center;gap:7px;flex-wrap:nowrap;min-width:0;overflow:hidden}\n.archv-wtag{display:inline-flex;align-items:center;gap:4px;min-width:0;flex:0 1 auto;font-size:11px;font-weight:500;line-height:1;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-fill-subtle);border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsm-radius-tag);padding:3px 8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.archv-wgone{border-style:dashed;color:var(--dsw-alias-state-error-primary);border-color:color-mix(in srgb,var(--dsw-alias-state-error-primary) 55%,transparent);background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 7%,transparent)}\n.archv-active{color:var(--dsw-alias-state-success-primary);border-color:color-mix(in srgb,var(--dsw-alias-state-success-primary) 45%,transparent);background:color-mix(in srgb,var(--dsw-alias-state-success-primary) 8%,transparent)}\n.archv-date{font-size:11px;color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none}\n.dsm-branch-chip{display:inline-flex;align-items:center;flex:none;min-height:22px;padding:0 9px;border:1px solid color-mix(in srgb,var(--dsw-alias-state-success-primary) 45%,transparent);border-radius:var(--dsm-radius-tag);background:color-mix(in srgb,var(--dsw-alias-state-success-primary) 10%,transparent);color:var(--dsw-alias-state-success-primary);font-size:11px;font-weight:500;line-height:1;white-space:nowrap}\n.dsm-empty-chip{display:inline-flex;align-items:center;flex:none;min-height:22px;padding:0 9px;border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsm-radius-tag);background:var(--dsw-alias-fill-subtle);color:var(--dsw-alias-label-tertiary);font-size:11px;font-weight:500;line-height:1;white-space:nowrap}\n.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}\n.archv-dot{color:var(--dsw-alias-border-l3);flex:none}\n.archv-check{width:15px;height:15px;accent-color:var(--dsw-alias-state-business-primary);flex:none;cursor:pointer}\n.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}\n.archv-star:hover{background:0 0;color:var(--dsw-alias-label-secondary);transform:scale(1.12)}\n.archv-star:active{transform:scale(.92)}\n.archv-star svg{fill:none;stroke:currentColor;stroke-width:1.5;stroke-linejoin:round;stroke-linecap:round;display:block}\n.archv-star-on,.archv-star-on:hover{color:var(--dsw-alias-state-business-primary)}\n.archv-star-on svg{fill:currentColor}\n.archv-body{flex:1;min-width:0;display:flex;align-items:center;gap:12px}\n.archv-actions{display:flex;gap:8px;flex:none;flex-wrap:nowrap;justify-content:flex-end}\n.archv-btn{appearance:none;min-height:32px;padding:0 12px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-fill-subtle);color:var(--dsw-alias-label-secondary);border-radius:var(--dsm-radius-ctl);font-size:12px;font-weight:500;cursor:pointer;white-space:nowrap;display:inline-flex;align-items:center;justify-content:center;gap:6px;text-align:center;transition:background-color .15s ease,border-color .15s ease,color .15s ease}\n.archv-btn:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}\n.archv-btn:disabled{opacity:.5;cursor:default}\n.archv-del{color:var(--dsw-alias-state-error-primary);border-color:color-mix(in srgb,var(--dsw-alias-state-error-primary) 45%,transparent)}\n.archv-del:hover:not(:disabled){background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 10%,transparent);color:var(--dsw-alias-state-error-primary)}\n.archv-go{color:var(--dsw-alias-state-business-primary);border-color:color-mix(in srgb,var(--dsw-alias-state-business-primary) 45%,transparent)}\n.archv-go:hover:not(:disabled){background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 10%,transparent);color:var(--dsw-alias-state-business-primary)}\n.archv-empty{display:flex;align-items:center;gap:10px;padding:20px 14px;border:1px dashed var(--dsw-alias-border-l3);border-radius:var(--dsm-radius-card);color:var(--dsw-alias-label-tertiary);font-size:13px;line-height:1.5}\n.archv-skel{display:flex;flex-direction:column;gap:8px}\n.archv-skel-card{height:58px;border-radius:var(--dsm-radius-card);background:var(--dsw-alias-fill-subtle);position:relative;overflow:hidden}\n.archv-skel-card::after{content:'';position:absolute;inset:0;transform:translateX(-100%);background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--dsw-alias-fill-elevated) 75%,transparent),transparent);animation:archv-shimmer 1.4s infinite}\n.archv-status{position:fixed;bottom:20px;left:50%;transform:translateX(-50%);z-index:2147483601;background:linear-gradient(var(--dsw-alias-fill-elevated),var(--dsw-alias-fill-elevated)),var(--dsw-alias-bg-layer-1,Canvas);border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);padding:9px 16px;border-radius:999px;font-size:12px;line-height:1.5;text-align:center;box-shadow:0 8px 24px rgb(0 0 0/.25);display:flex;align-items:center;gap:8px;animation:archv-pop .18s ease-out;max-width:min(92vw,480px);cursor:pointer}\n.archv-status-long{border-radius:14px;text-align:left}\n.archv-spin{width:12px;height:12px;border:2px solid color-mix(in srgb,var(--dsw-alias-label-secondary) 35%,transparent);border-top-color:var(--dsw-alias-label-secondary);border-radius:50%;animation:archv-rot .8s linear infinite;flex:none}\n@keyframes archv-shimmer{100%{transform:translateX(100%)}}\n@keyframes archv-rot{to{transform:rotate(360deg)}}\n@keyframes archv-pop{from{opacity:0;transform:translateX(-50%) translateY(10px)}}\n/* \u5931\u8D25\u63D0\u793A\u7528\u8B66\u793A\u8272 + \u52A0\u7C97\uFF0C\u5E76\u505C\u7559\u66F4\u4E45\uFF08\u9700\u8981\u7528\u6237\u8BFB\u5B8C\u53BB\u505A\u4E0B\u4E00\u6B65\u64CD\u4F5C\uFF09\u3002 */\n.archv-status-err{border-color:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-state-error-primary);font-weight:500}\n@media (prefers-reduced-motion:reduce){.archv-skel-card::after{animation:none}.archv-card,.archv-btn,.archv-star{transition:none}.archv-star:hover,.archv-star:active{transform:none}.archv-status,.archv-spin{animation:none}}\n@media (max-width:640px){.archv-card{flex-direction:column;align-items:stretch;gap:10px}.archv-actions{justify-content:flex-end}.sess-tools,.sess-tools-4{grid-template-columns:1fr}.sess-fbtn,.archv-btn{min-height:40px}.archv-star{width:30px;height:30px}.archv-star svg{width:22px;height:22px}.dsm-kids{margin-left:10px}.archv-titlerow{flex-wrap:wrap}.dsm-kid-row{flex-wrap:wrap}.dsm-kid-acts{margin-left:0}}\n.mv-sheet{width:100%;box-sizing:border-box;display:flex;flex-direction:column;gap:12px;margin-top:12px;padding:14px;border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsm-radius-sheet);background:var(--dsw-alias-fill-subtle)}\n.mv-sheet-head{display:flex;align-items:center;justify-content:space-between;gap:10px}\n.mv-sheet-title{font-size:13px;font-weight:600;color:var(--dsw-alias-label-primary);margin:0}\n.mv-sheet-close{appearance:none;width:26px;height:26px;color:var(--dsw-alias-label-secondary);background:0 0;border:none;border-radius:7px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;font-size:16px;line-height:1}\n.mv-sheet-close:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}\n.mv-seg{display:flex;gap:2px;padding:2px;background:var(--dsw-alias-fill-elevated);border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsm-radius-sheet);width:100%}\n.mv-segbtn{appearance:none;flex:1;min-height:30px;padding:0 12px;border:none;background:transparent;color:var(--dsw-alias-label-secondary);border-radius:8px;font-size:12px;font-weight:500;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;gap:6px}\n.mv-segbtn:hover:not(:disabled){color:var(--dsw-alias-label-primary)}\n.mv-segbtn-on{background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);box-shadow:0 1px 2px rgb(0 0 0/.08)}\n.mv-field{display:flex;flex-direction:column;gap:6px}\n.mv-field label.mv-field-label{font-size:12px;font-weight:500;color:var(--dsw-alias-label-secondary)}\n.mv-field select,.mv-field input[type=text]{box-sizing:border-box;appearance:none;width:100%;min-height:34px;padding:0 10px;border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsm-radius-ctl);background:var(--dsw-alias-fill-elevated);color:var(--dsw-alias-label-primary);font-size:12px;font-family:inherit}\n.mv-field select:focus-visible,.mv-field input[type=text]:focus-visible,.mv-sheet-close:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:1px}\n.mv-browse-row{display:flex;align-items:center;gap:8px}\n.mv-browse-row input[type=text]{flex:1;min-width:0}\n.mv-foot{display:flex;justify-content:flex-end;align-items:center;gap:8px;margin-top:2px}\n@media (max-width:640px){.archv-row{flex-wrap:wrap}.mv-sheet{padding:12px}}\n.dtl-sheet{margin-top:12px;padding:14px;border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsm-radius-sheet);background:var(--dsw-alias-fill-subtle)}\n.dtl-sheet-head{display:flex;align-items:center;justify-content:space-between;gap:10px}\n.dtl-sheet-title{font-size:13px;font-weight:600;color:var(--dsw-alias-label-primary);margin:0}\n.dtl-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(130px,1fr));gap:8px;margin-top:10px}\n.dtl-cell{display:flex;flex-direction:column;gap:2px;padding:8px 10px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-fill-elevated);min-width:0}\n.dtl-k{font-size:11px;color:var(--dsw-alias-label-tertiary)}\n.dtl-v{font-size:12px;color:var(--dsw-alias-label-primary);word-break:break-all}\n.dtl-sec{margin-top:12px}\n.dtl-export{display:flex;align-items:center;gap:8px;flex-wrap:wrap}\n.dtl-export .archv-btn{text-decoration:none}\n.dtl-note{margin-top:8px;font-size:11px;color:var(--dsw-alias-label-tertiary);line-height:1.5}\n.dtl-sec-t{font-size:11px;font-weight:600;color:var(--dsw-alias-label-secondary);text-transform:uppercase;letter-spacing:.03em;margin-bottom:6px}\n.dtl-tags{display:flex;flex-wrap:wrap;gap:6px}\n.dtl-tag{display:inline-flex;font-size:11px;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-fill-elevated);border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsm-radius-tag);padding:2px 8px}\n.dtl-list{margin:0;padding-left:18px;display:flex;flex-direction:column;gap:3px;font-size:11.5px;color:var(--dsw-alias-label-secondary)}\n.dtl-list code,.dtl-paths code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;color:var(--dsw-alias-label-primary);word-break:break-all}\n.dtl-filetool{color:var(--dsw-alias-label-tertiary)}\n.dtl-paths{display:flex;flex-direction:column;gap:4px;font-size:11.5px;color:var(--dsw-alias-label-secondary);word-break:break-all}\n.more-wrap{position:relative;flex:none}\n.more-btn{appearance:none;width:28px;height:28px;border:none;border-radius:8px;background:transparent;color:var(--dsw-alias-label-secondary);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;line-height:1}\n.more-btn:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}\n.more-menu{position:absolute;top:calc(100% + 4px);right:0;z-index:60;min-width:160px;padding:5px;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l3);border-radius:var(--dsm-radius-sheet);box-shadow:0 10px 32px rgb(0 0 0/.24);display:flex;flex-direction:column;gap:1px}\n.more-item{appearance:none;display:flex;align-items:center;gap:8px;width:100%;padding:7px 10px;border:none;background:transparent;color:var(--dsw-alias-label-primary);border-radius:7px;font-size:12.5px;cursor:pointer;white-space:nowrap;text-align:left}\n.more-item:hover{background:var(--dsw-alias-interactive-bg-hover)}\n.more-item-danger{color:var(--dsw-alias-state-error-primary)}\n.more-item-danger:hover{background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 10%,transparent);color:var(--dsw-alias-state-error-primary)}\n.dlg-backdrop{position:fixed;inset:0;z-index:80;background:rgba(0,0,0,.45);display:flex;align-items:center;justify-content:center;padding:16px}\n.dlg{width:min(420px,92vw);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l3);border-radius:14px;padding:18px;box-shadow:0 16px 48px rgb(0 0 0/.28);display:flex;flex-direction:column;gap:12px}\n.dlg-title{font-size:15px;font-weight:650;color:var(--dsw-alias-label-primary);margin:0}\n.dlg-text{font-size:13px;line-height:1.6;color:var(--dsw-alias-label-secondary);margin:0;word-break:break-all}\n.dlg-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:2px}\n`\n\nfunction fmtDate(iso) {\n if (!iso) return null\n const d = new Date(iso)\n if (isNaN(d.getTime())) return null\n try {\n return new Intl.DateTimeFormat('zh-CN', { year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }).format(d)\n } catch {\n return String(iso)\n }\n}\n\nfunction fmtBytes(n) {\n if (!n && n !== 0) return null\n if (n < 1024) return `${n} B`\n const units = ['KB', 'MB', 'GB', 'TB']\n let v = n\n let u = -1\n do { v /= 1024; u++ } while (v >= 1024 && u < units.length - 1)\n return `${v >= 100 ? v.toFixed(0) : v.toFixed(1)} ${units[u]}`\n}\n\nfunction pathName(p) {\n if (!p) return null\n const parts = String(p).replace(/\\\\+$/, '').split(/[/\\\\]/)\n return parts[parts.length - 1] || p\n}\n\n// \u670D\u52A1\u7AEF 409 \u9519\u8BEF\u7801\uFF1A\u4F1A\u8BDD\u6B63\u88AB DSH \u5360\u7528\u5199\u6743\u9650\uFF080.1.3 \u5355\u5199\u8005\u673A\u5236\uFF09\u3002\u5207\u8D70\u4F1A\u8BDD\u540E\n// \u539F\u5730\u91CD\u8BD5\u5373\u53EF\uFF0C\u6240\u4EE5\u8FD9\u7C7B\u5931\u8D25\u8981\u7ED9\u7528\u6237\u4E00\u4E2A\u300C\u91CD\u8BD5\u300D\u5165\u53E3\u3002\nconst BUSY_CODE = 'DSM_SESSION_BUSY'\n\nasync function postJSON(path, body) {\n const res = await fetch(path, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify(body || {}),\n })\n const data = await res.json().catch(() => null)\n if (!res.ok || !data) {\n // \u4FDD\u7559\u670D\u52A1\u7AEF\u9519\u8BEF\u7801\uFF1AUI \u9700\u8981\u636E\u6B64\u533A\u5206\u300C\u53EF\u91CD\u8BD5\u300D\u7684\u5931\u8D25\uFF08\u5982 DSM_SESSION_BUSY\n // \u2014\u2014 \u4F1A\u8BDD\u6B63\u88AB DSH \u5360\u7528\u5199\u6743\u9650\uFF0C\u5207\u8D70\u4F1A\u8BDD\u540E\u539F\u5730\u91CD\u8BD5\u5373\u53EF\uFF09\u4E0E\u91CD\u8BD5\u4E5F\u65E0\u7528\u7684\u9519\u8BEF\u3002\n const error = new Error((data && (data.error || data.message)) || `request failed (${res.status})`)\n if (data && data.code) error.code = data.code\n throw error\n }\n return data\n}\n\n// \u6253\u5F00\u4E00\u4E2A\u4F1A\u8BDD\uFF08\u5C24\u5176\u662F\u4FA7\u680F\u4E0D\u6E32\u67D3\u7684\u5B50\u4EE3\u7406\u4F1A\u8BDD\uFF09\u3002\n//\n// \u53EA\u8D70\u5B98\u65B9\u516C\u5F00\u5951\u7EA6\uFF08runtime \u7684 client api-catalog\uFF09\uFF1A\n// sessions.open(id) \u2014\u2014 \u9009\u4E2D\u4F1A\u8BDD\u4E3A\u5F53\u524D\n// sessions.refreshSubagents(parent) \u2014\u2014 \u5237\u65B0\u67D0\u7236\u4F1A\u8BDD\u7684\u76F4\u63A5\u5B50\u4EE3\u7406\u76EE\u5F55\n// sessions.openSubagent(address) \u2014\u2014 \u7528\u300C\u76F4\u63A5\u7236 + \u5B50\u300D\u5730\u5740\u6253\u5F00\u76EE\u5F55\u91CC\u7684\u5B50\u4EE3\u7406\n// \u62FF\u4E0D\u5230 sessions \u670D\u52A1\uFF08\u8001 runtime\uFF09\u65F6\u8FD4\u56DE false\uFF0C\u7531\u8C03\u7528\u65B9\u7ED9\u51FA\u964D\u7EA7\u63D0\u793A\uFF0C\u7EDD\u4E0D\n// \u89E6\u78B0\u4EFB\u4F55\u79C1\u6709\u5185\u90E8\u72B6\u6001\u3002\nlet dsmClientCtx = null\nfunction dsmSessionsService() {\n try { return dsmClientCtx && typeof dsmClientCtx.get === 'function' ? dsmClientCtx.get('sessions') : null } catch (e) { return null }\n}\nfunction dsmCurrentSessionId(svc) {\n try {\n const snap = svc && svc.list && typeof svc.list.getSnapshot === 'function' ? svc.list.getSnapshot() : null\n return snap && snap.current != null ? String(snap.current) : null\n } catch (e) { return null }\n}\n// \u8FD4\u56DE Promise<'ok' | 'no-service' | 'failed'>\uFF1A\u53EA\u56DE true/false \u7684\u8BDD\uFF0C\u8C03\u7528\u65B9\n// \u53EA\u80FD\u7ED9\u51FA\u4E00\u53E5\u300C\u6253\u4E0D\u5F00\u300D\u7684\u7B3C\u7EDF\u63D0\u793A\u2014\u2014\u7528\u6237\u65E2\u4E0D\u77E5\u9053\u4E3A\u4EC0\u4E48\uFF0C\u4E5F\u4E0D\u77E5\u9053\u4E0B\u4E00\u6B65\u8BE5\n// \u600E\u4E48\u529E\u3002\u533A\u5206\u539F\u56E0\u540E\u63D0\u793A\u624D\u80FD\u8BF4\u6E05\u300C\u53BB\u54EA\u513F\u3001\u505A\u4EC0\u4E48\u300D\u3002\nasync function dsmOpenSessionById(childId, directParentId) {\n const sid = String(childId || '')\n if (!sid) return 'failed'\n const svc = dsmSessionsService()\n if (!svc) return 'no-service'\n const parent = directParentId ? String(directParentId) : null\n // 1) \u76F4\u63A5\u9009\u4E2D\uFF08\u5BF9\u4ECD\u5728\u4F1A\u8BDD\u5217\u8868\u91CC\u7684\u5B50\u4EE3\u7406\u6700\u7701\u4E8B\uFF09\u3002\n if (typeof svc.open === 'function') {\n try {\n svc.open(sid)\n await new Promise((r) => setTimeout(r, 350))\n if (dsmCurrentSessionId(svc) === sid) return 'ok'\n } catch (e) { /* \u843D\u5230\u76EE\u5F55\u5730\u5740\u8DEF\u5F84 */ }\n }\n // 2) \u5B98\u65B9\u5B50\u4EE3\u7406\u76EE\u5F55\u8DEF\u5F84\uFF1A\u7236\u4F1A\u8BDD\u5934\u90E8\u7684\u76EE\u5F55\u662F DSH \u4E3A\u5B50\u4EE3\u7406\u51C6\u5907\u7684\u5BFC\u822A\u5165\u53E3\uFF0C\n // \u8FD9\u91CC\u590D\u7528\u540C\u4E00\u4E2A\u5730\u5740\u5951\u7EA6\uFF08parentSessionId \u5FC5\u987B\u662F\u300C\u76F4\u63A5\u7236\u300D\uFF0C\u5B59\u4EE3\u4E5F\u4E00\u6837\uFF09\u3002\n if (parent && typeof svc.openSubagent === 'function') {\n try {\n if (typeof svc.refreshSubagents === 'function') await svc.refreshSubagents(parent)\n svc.openSubagent({ parentSessionId: parent, childSessionId: sid, mode: 'continuable' })\n await new Promise((r) => setTimeout(r, 350))\n if (dsmCurrentSessionId(svc) === sid) return 'ok'\n // openSubagent \u662F\u540C\u6B65 void\uFF0C\u65E0\u6CD5\u4ECE\u8FD4\u56DE\u503C\u5224\u65AD\u6210\u8D25\uFF1A\u5730\u5740\u5DF2\u63D0\u4EA4\u3001\u5F53\u524D\u4F1A\u8BDD\n // \u53EF\u80FD\u56E0\u7236\u4F1A\u8BDD\u4E0A\u4E0B\u6587\u5C1A\u672A\u5C31\u7EEA\u800C\u7A0D\u540E\u624D\u5207\u6362\uFF0C\u8FD9\u91CC\u6309\u6210\u529F\u5904\u7406\u907F\u514D\u91CD\u590D\u89E6\u53D1\u3002\n return 'ok'\n } catch (e) { /* \u843D\u5230\u5931\u8D25\u63D0\u793A */ }\n }\n return 'failed'\n}\n\n// Left-nav icon swap: DSH's settings shell renders a shared fallback gear for\n// every custom section and settings.section has no per-section icon field.\n// Like dsh-better-sidebar, we mark our own row by matching its visible label\n// text, then CSS swaps the gear for an archive-box glyph. The marker owns no\n// shell structure and is removed on fiber disposal (HMR-safe, ships with the\n// plugin).\nconst NAV_CSS = `\n[data-dsh-nav-sessions] > svg:first-child { display: none; }\n[data-dsh-nav-sessions]::before {\n content: ''; flex: none; width: 16px; height: 16px; background: currentColor;\n -webkit-mask: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D'http://www.w3.org/2000/svg'%20width%3D'24'%20height%3D'24'%20viewBox%3D'0%200%2024%2024'%20fill%3D'none'%20stroke%3D'black'%20stroke-width%3D'2'%20stroke-linecap%3D'round'%20stroke-linejoin%3D'round'%3E%3Cpath%20d%3D'M21%208v13H3V8'/%3E%3Cpath%20d%3D'M1%203h22v5H1z'/%3E%3Cpath%20d%3D'M10%2012h4'/%3E%3C/svg%3E\") center / contain no-repeat;\n mask: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D'http://www.w3.org/2000/svg'%20width%3D'24'%20height%3D'24'%20viewBox%3D'0%200%2024%2024'%20fill%3D'none'%20stroke%3D'black'%20stroke-width%3D'2'%20stroke-linecap%3D'round'%20stroke-linejoin%3D'round'%3E%3Cpath%20d%3D'M21%208v13H3V8'/%3E%3Cpath%20d%3D'M1%203h22v5H1z'/%3E%3Cpath%20d%3D'M10%2012h4'/%3E%3C/svg%3E\") center / contain no-repeat;\n}\n`\n\nfunction markSettingsNav() {\n const LABEL = '\u4F1A\u8BDD\u7BA1\u7406'\n let disposed = false\n let frame = 0\n const run = () => {\n frame = 0\n if (disposed) return\n // \u5EC9\u4EF7\u65E9\u9000\uFF1A\u8BBE\u7F6E\u9762\u677F\u6CA1\u6253\u5F00\u65F6\u6574\u9875\u53EA\u6709\u4E00\u4E2A dialog \u67E5\u8BE2\u7684\u5F00\u9500\uFF0C\u4E0D\u904D\u5386\u6309\u94AE\u3002\n if (!document.querySelector('[role=\"dialog\"]')) return\n const buttons = document.querySelectorAll('[role=\"dialog\"] nav button')\n for (const b of buttons) {\n const t = (b.textContent || '').trim()\n if (t === LABEL) b.setAttribute('data-dsh-nav-sessions', '')\n else b.removeAttribute('data-dsh-nav-sessions')\n }\n }\n // rAF \u5408\u5E76\uFF1A\u6574\u9875 MutationObserver \u5728\u4E00\u4E2A\u6E32\u67D3\u5E27\u91CC\u53EF\u80FD\u89E6\u53D1\u6210\u767E\u4E0A\u5343\u6B21\u56DE\u8C03\uFF0C\n // \u6BCF\u5E27\u6700\u591A\u771F\u6B63\u540C\u6B65\u4E00\u6B21\u3002\n const sync = () => { if (!frame && !disposed) frame = requestAnimationFrame(run) }\n run()\n // \u523B\u610F**\u4E0D**\u76D1\u542C characterData\uFF1A\u6D41\u5F0F\u56DE\u590D\u9010 token \u6539\u6587\u672C\uFF0C\u4F1A\u628A\u6574\u9875\u89C2\u5BDF\u5668\u6253\u6210\n // \u9AD8\u9891\u56DE\u8C03\uFF1B\u5BFC\u822A\u6309\u94AE\u7684\u6807\u7B7E\u53EA\u5728 childList\uFF08\u9762\u677F\u91CD\u6E32\u67D3\uFF09\u65F6\u53D8\u5316\uFF0C\u591F\u7528\u3002\n const obs = new MutationObserver(sync)\n obs.observe(document.body, { childList: true, subtree: true })\n return () => {\n disposed = true\n if (frame) cancelAnimationFrame(frame)\n frame = 0\n obs.disconnect()\n document.querySelectorAll('[data-dsh-nav-sessions]').forEach((e) => e.removeAttribute('data-dsh-nav-sessions'))\n }\n}\n\nfunction installSettingsNavIcons(ctx) {\n const styleEl = document.createElement('style')\n styleEl.textContent = NAV_CSS\n document.head.appendChild(styleEl)\n const dispose = markSettingsNav()\n ctx.effect(() => () => {\n dispose()\n if (styleEl.parentNode) styleEl.parentNode.removeChild(styleEl)\n })\n}\n\nfunction SessionPanel({ workspacesSvc }) {\n const [sessions, setSessions] = useState(null)\n const [workspaces, setWorkspaces] = useState([])\n const [capabilities, setCapabilities] = useState(null)\n const initialPrefs = useRef(loadPanelPrefs()).current\n // \u6CE8\u610F\uFF1A'storage' \u5DF2\u4ECE\u53EF\u6301\u4E45\u5316\u53D6\u503C\u4E2D\u79FB\u9664\uFF08\u5B83\u4E0D\u518D\u662F\u89C6\u56FE\uFF09\uFF0C\u65E7\u7248\u6B8B\u7559\u7684\n // filter='storage' \u4F1A\u81EA\u52A8\u56DE\u843D\u5230 'all'\uFF0C\u907F\u514D\u843D\u5230\u4E00\u4E2A\u5DF2\u4E0D\u5B58\u5728\u7684\u754C\u9762\u3002\n const [filter, setFilter] = useState(() => ['all', 'active', 'archived', 'starred', 'empty', 'trash'].includes(initialPrefs.filter) ? initialPrefs.filter : 'all')\n // \u4F4E\u9891\u5206\u7C7B\u6298\u53E0\u533A\uFF1A\u6302\u8F7D\u65F6\u82E5\u9009\u4E2D\u7684\u5C31\u662F\u4F4E\u9891\u5206\u7C7B\uFF08\u504F\u597D\u6062\u590D/\u4E0A\u6B21\u505C\u7559\uFF09\u5219\u5C55\u5F00\uFF0C\n // \u4FDD\u8BC1\u6FC0\u6D3B tab \u59CB\u7EC8\u53EF\u89C1\uFF1B\u5E73\u65F6\u7531\u7BAD\u5934 hover/\u70B9\u6309\u63A7\u5236\u3002\n const [moreOpen, setMoreOpen] = useState(() => ['starred', 'empty', 'trash'].includes(initialPrefs.filter))\n const [query, setQuery] = useState('')\n const [workspaceFilter, setWorkspaceFilter] = useState(() => initialPrefs.workspaceFilter || 'all')\n const [sortBy, setSortBy] = useState(() => ['newest', 'oldest', 'title'].includes(initialPrefs.sortBy) ? initialPrefs.sortBy : 'newest')\n const [selected, setSelected] = useState({})\n const [delTarget, setDelTarget] = useState(null)\n const [confirmBatch, setConfirmBatch] = useState(false)\n const [batchMoveOpen, setBatchMoveOpen] = useState(false)\n const [busy, setBusy] = useState(null)\n const [openMove, setOpenMove] = useState(null)\n const [moveMode, setMoveMode] = useState('existing')\n const [targetWs, setTargetWs] = useState('')\n const [newPath, setNewPath] = useState('')\n const [error, setError] = useState(null)\n // \u53EF\u91CD\u8BD5\u7684\u5931\u8D25\uFF1A{ run } \u2014\u2014 run \u662F\u300C\u628A\u521A\u624D\u90A3\u4E00\u6B65\u539F\u6837\u518D\u505A\u4E00\u6B21\u300D\u7684\u95ED\u5305\u3002\u5B58\u5BF9\u8C61\n // \u800C\u975E\u88F8\u51FD\u6570\uFF0C\u907F\u514D\u88AB useState \u5F53\u6210\u66F4\u65B0\u51FD\u6570\u5403\u6389\u3002\u6CA1\u6709\u5B83\u65F6\u9519\u8BEF\u6761\u7684\u300C\u91CD\u8BD5\u300D\u9000\u56DE\n // \u5237\u65B0\u5217\u8868\uFF08refresh\uFF09\u3002\n const [retry, setRetry] = useState(null)\n const [toast, setToast] = useState(null)\n const [picking, setPicking] = useState(false)\n const [trash, setTrash] = useState([])\n const [trashBusy, setTrashBusy] = useState(null)\n const [trashSettings, setTrashSettings] = useState({ retentionDays: 0 })\n const [trashCheck, setTrashCheck] = useState(null)\n const [purgeTarget, setPurgeTarget] = useState(null)\n const [details, setDetails] = useState({})\n const [openDetails, setOpenDetails] = useState(null)\n const [detailsLoading, setDetailsLoading] = useState(null)\n const [mdBusy, setMdBusy] = useState(null)\n const [zipOk, setZipOk] = useState(true)\n const [storage, setStorage] = useState(null)\n const [storageBusy, setStorageBusy] = useState(false)\n // \u5B58\u50A8\u7EDF\u8BA1\u8981 stat \u6BCF\u6761\u4F1A\u8BDD\u65E5\u5FD7\uFF0C\u5F00\u9500\u4E0D\u5C0F\uFF1A\u9762\u677F\u9ED8\u8BA4\u6536\u8D77\u3001\u6309\u9700\u52A0\u8F7D\uFF0C\n // \u4E14\u5C55\u5F00\u72B6\u6001\u523B\u610F\u4E0D\u6301\u4E45\u5316\u2014\u2014\u5426\u5219\u6BCF\u6B21\u6253\u5F00\u8BBE\u7F6E\u9762\u677F\u90FD\u4F1A\u89E6\u53D1\u4E00\u6B21\u5168\u91CF\u626B\u63CF\u3002\n const [storageOpen, setStorageOpen] = useState(false)\n const [storageError, setStorageError] = useState(null)\n const [aa, setAa] = useState({ settings: { inactiveDays: 0, skipStarred: true }, lastRunAt: null, lastArchivedCount: 0 })\n const [aaOpen, setAaOpen] = useState(false)\n const [aaBusy, setAaBusy] = useState(false)\n const zipChecked = useRef(false)\n const [openMenu, setOpenMenu] = useState(null)\n const timer = useRef(null)\n // \u5B58\u50A8\u9762\u677F\u5173\u7740\u65F6\u4F1A\u8BDD\u96C6\u5408\u82E5\u53D1\u751F\u53D8\u5316\uFF0C\u6807\u810F\uFF1B\u4E0B\u6B21\u5C55\u5F00\u65F6\u518D\u5237\u65B0\uFF0C\n // \u65E2\u4E0D\u4F1A\u663E\u793A\u8FC7\u671F\u6570\u5B57\uFF0C\u4E5F\u907F\u514D\u6BCF\u6B21 refresh \u90FD\u767D\u626B\u4E00\u904D\u5168\u91CF\u65E5\u5FD7\u3002\n const storageDirty = useRef(false)\n const menuRef = useRef(null)\n const dialogRef = useRef(null)\n\n // \u8840\u7F18\u5206\u7EC4\uFF08issue #6\uFF09\uFF1A\u5B50\u4EE3\u7406\u6298\u53E0\u5728\u7236\u4F1A\u8BDD\u4E0B\u3002DSH \u4FA7\u680F\u6309\u8BBE\u8BA1\u4E0D\u6E32\u67D3\u5B50\u4EE3\u7406\n // \u884C\uFF08ui-subagent \u660E\u6587 \"omitted from the ordinary sidebar\"\uFF09\uFF0C\u672C\u9762\u677F\u662F\u552F\u4E00\n // \u80FD\u5B8C\u6574\u770B\u5230\u5B83\u4EEC\u7684\u5730\u65B9\uFF0C\u6240\u4EE5\u540C\u4E00\u5957\u300C\u7236 \u2014 \u5B50\u300D\u6A21\u578B\u5728\u8FD9\u91CC\u843D\u5730\uFF1A\u5206\u7EC4\u5F00\u542F\u65F6\n // \u5B50\u4EE3\u7406\u4E0D\u518D\u4F5C\u4E3A\u72EC\u7ACB\u9876\u5C42\u5361\u7247\uFF0C\u800C\u662F\u6298\u53E0\u5728\u7236\u4F1A\u8BDD\u5361\u7247\u4E0B\u65B9\u3002\u6570\u636E\u6765\u81EA\n // sidebar-state \u7684\u5B98\u65B9 header \u8840\u7F18\u5B57\u6BB5\uFF08parentSession / origin\uFF09\uFF0C\u96F6\u89E3\u7801\u3002\n const [lineage, setLineage] = useState({})\n const [openKids, setOpenKids] = useState({})\n const [groupByLineage, setGroupByLineage] = useState(() => initialPrefs.groupByLineage !== false)\n\n const loadLineage = () => postJSON('/archived-sessions/sidebar-state', {})\n .then((r) => setLineage((r && r.lineage) || {}))\n .catch(() => {})\n\n // kind: 'ok'\uFF08\u9ED8\u8BA4\uFF09| 'err'\u3002\u505C\u7559\u65F6\u957F\u6309**\u5B57\u6570**\u7ED9\uFF08logic.toastDurationFor\uFF09\uFF1A\n // \u56FA\u5B9A 2.4s \u5BF9\"\u6392\u961F/\u5931\u8D25\"\u8FD9\u7C7B\u51E0\u5341\u5B57\u7684\u6587\u6848\u6839\u672C\u8BFB\u4E0D\u5B8C\uFF08\u7528\u6237 2026-09-10 \u53CD\u9988\uFF09\uFF1B\n // \u5931\u8D25\u7C7B\u518D +2s \u5E76\u7528\u8B66\u793A\u8272\u3002\u4EFB\u4F55\u63D0\u793A\u90FD\u53EF\u4EE5**\u70B9\u51FB\u7ACB\u5373\u5173\u95ED**\uFF0C\u4E0D\u5FC5\u5E72\u7B49\u3002\n const showToast = (msg, kind) => {\n if (timer.current) clearTimeout(timer.current)\n setToast({ msg, kind: kind === 'err' ? 'err' : 'ok' })\n timer.current = setTimeout(() => setToast(null), toastDurationFor(msg, kind))\n }\n\n const refresh = () => {\n setError(null)\n Promise.all([\n postJSON('/archived-sessions/sessions', {}),\n postJSON('/archived-sessions/workspaces', {}),\n postJSON('/archived-sessions/capabilities', {}),\n ])\n .then(([s, works, caps]) => {\n // Permanently-purged sessions must never re-appear here, even if DSH's\n // in-memory session index still lists them after the file was unlinked.\n const purged = dsmLoadPurged()\n const visible = (s.items || []).filter((x) => !purged.has(String(x.sessionId)))\n setSessions(visible)\n setWorkspaces(works.items || [])\n setCapabilities(caps || null)\n // \u6784\u5EFA\u6307\u7EB9\u6253\u5230\u63A7\u5236\u53F0\uFF1A\u9762\u677F\u884C\u4E3A\u4E0E\u6E90\u7801\u4E0D\u4E00\u81F4\u65F6\uFF0C\u7B2C\u4E00\u4EF6\u4E8B\u5C31\u662F\u6838\u5BF9\u8FD9\u884C\u2014\u2014\n // host \u7AEF\u53EA\u5728\u5BBF\u4E3B\u542F\u52A8\u65F6\u52A0\u8F7D\u4E00\u6B21\uFF0C\u4E0D\u91CD\u542F\u5BBF\u4E3B\u770B\u5230\u7684\u6C38\u8FDC\u662F\u65E7\u4EE3\u7801\u3002\n if (caps && caps.buildStamp) console.info('[dsh-sessions-manager] host build:', caps.buildStamp)\n setSelected({})\n setDelTarget(null)\n setConfirmBatch(false)\n loadLineage()\n if (!targetWs && works.items && works.items.length) setTargetWs(works.items[0].workspaceId)\n loadTrash()\n // \u4F1A\u8BDD\u96C6\u5408\u53D8\u4E86\uFF1A\u9762\u677F\u5F00\u7740\u5C31\u540C\u6B65\u5237\u65B0\uFF1B\u5173\u7740\u5219\u53EA\u6807\u810F\uFF0C\u7B49\u5C55\u5F00\u65F6\u518D\u5237\u3002\n if (storageOpen) loadStorage()\n else storageDirty.current = true\n })\n .catch((e) => setError(String((e && e.message) || e)))\n }\n\n useEffect(() => {\n refresh()\n return () => { if (timer.current) clearTimeout(timer.current) }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n useEffect(() => {\n try { localStorage.setItem(PANEL_PREFS_KEY, JSON.stringify({ filter, workspaceFilter, sortBy, groupByLineage })) } catch (e) {}\n }, [filter, workspaceFilter, sortBy, groupByLineage])\n\n // \u81EA\u52A8\u5F52\u6863\u8BBE\u7F6E\u968F\u9762\u677F\u52A0\u8F7D\u4E00\u6B21\uFF08host \u4FA7\u8BFB\u53D6\u5373\u89E6\u53D1\u6BCF\u65E5\u68C0\u67E5\uFF09\u3002\n // \u5B58\u50A8\u7EDF\u8BA1\u523B\u610F\u4E0D\u5728\u8FD9\u91CC\u9884\u53D6\uFF1A\u5B83\u8981 stat \u6BCF\u6761\u65E5\u5FD7\uFF0C\u53EA\u5728\u7528\u6237\u5C55\u5F00\u9762\u677F\u65F6\u624D\u7B97\u3002\n useEffect(() => {\n loadAutoArchive()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n // \u6536\u85CF\u5207\u6362\uFF1A\u4E50\u89C2\u66F4\u65B0 + \u5931\u8D25\u56DE\u6EDA\uFF08star \u662F\u9AD8\u9891\u8F7B\u64CD\u4F5C\uFF0C\u4E0D\u7B49\u7F51\u7EDC\u5F80\u8FD4\uFF09\u3002\n const toggleStar = async (it) => {\n const next = !it.starred\n setSessions((s) => s && s.map((x) => (x.sessionId === it.sessionId ? { ...x, starred: next } : x)))\n try {\n await postJSON('/archived-sessions/star/set', { sessionId: it.sessionId, starred: next })\n } catch (e) {\n setSessions((s) => s && s.map((x) => (x.sessionId === it.sessionId ? { ...x, starred: !next } : x)))\n showToast('\u6536\u85CF\u5931\u8D25\uFF1A' + String((e && e.message) || e))\n }\n }\n\n // Markdown \u5BFC\u51FA\uFF1A\u81EA\u6709\u8DEF\u7531\uFF08/archived-sessions/export-md\uFF09\uFF0Cblob \u89E6\u53D1\u4E0B\u8F7D\u3002\n const exportMarkdown = async (it) => {\n if (mdBusy) return\n setMdBusy(it.sessionId)\n try {\n const res = await fetch('/archived-sessions/export-md?sessionId=' + encodeURIComponent(it.sessionId))\n if (!res.ok) throw new Error('HTTP ' + res.status)\n const blob = await res.blob()\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = 'dsh-session-' + it.sessionId + '.md'\n document.body.appendChild(a)\n a.click()\n a.remove()\n URL.revokeObjectURL(url)\n showToast('\u5DF2\u5BFC\u51FA Markdown')\n } catch (e) {\n showToast('\u5BFC\u51FA\u5931\u8D25\uFF1A' + String((e && e.message) || e))\n } finally {\n setMdBusy(null)\n }\n }\n\n // \u5B98\u65B9 ZIP \u5BFC\u51FA\u9884\u68C0\uFF08\u4E00\u6B21\u6027\uFF09\uFF1A\u540E\u7AEF\u4E0D\u652F\u6301 raw artifacts \u65F6\u8FD4\u56DE 501\uFF0C\n // \u6B64\u65F6\u9690\u85CF ZIP \u5165\u53E3\u53EA\u7559 Markdown\uFF08\u5168\u5C40\u7F13\u5B58\uFF0C\u540E\u7AEF\u80FD\u529B\u4E0D\u4F1A\u4E2D\u9014\u53D8\uFF09\u3002\n // \u63A2\u9488\u7528\u975E\u6CD5 id \u8D70 HEAD\uFF1A\u547D\u4E2D 501 = \u4E0D\u652F\u6301\uFF1B404/400 = \u8DEF\u7531\u6D3B\u7740\u4E14\u652F\u6301\u3002\n useEffect(() => {\n if (openDetails === null || zipChecked.current) return\n zipChecked.current = true\n fetch('/api/session.export?sessionId=probe&includeDescendants=false', { method: 'HEAD' })\n .then((res) => setZipOk(res.status !== 501))\n .catch(() => setZipOk(true))\n }, [openDetails])\n\n // Close the \u22EF menu on outside click / Escape (no full-screen backdrop).\n useEffect(() => {\n if (openMenu === null) return\n const onDown = (e) => {\n if (menuRef.current && !menuRef.current.contains(e.target)) setOpenMenu(null)\n }\n const onKey = (e) => { if (e.key === 'Escape') setOpenMenu(null) }\n document.addEventListener('mousedown', onDown)\n document.addEventListener('keydown', onKey)\n return () => {\n document.removeEventListener('mousedown', onDown)\n document.removeEventListener('keydown', onKey)\n }\n }, [openMenu])\n\n useEffect(() => {\n if (!delTarget && !purgeTarget) return\n const previous = document.activeElement\n const onKey = (e) => {\n if (e.key === 'Escape') { setDelTarget(null); setPurgeTarget(null) }\n }\n document.addEventListener('keydown', onKey)\n requestAnimationFrame(() => dialogRef.current && dialogRef.current.querySelector('button')?.focus())\n return () => {\n document.removeEventListener('keydown', onKey)\n if (previous && typeof previous.focus === 'function') previous.focus()\n }\n }, [delTarget, purgeTarget])\n\n const wsPath = (id) => {\n const w = workspaces.find((x) => x.workspaceId === id)\n return w ? w.path : ''\n }\n // \u80FD\u529B\u8BFB\u53D6\uFF1A\u4F18\u5148 v3.5.2 \u89C4\u8303\u952E\u540D\uFF0C\u56DE\u9000\u65E7\u952E\u540D\uFF08\u65E7 host / \u7F13\u5B58\u54CD\u5E94\u517C\u5BB9\uFF09\u3002\n const actionCapability = (name, legacy) => {\n const source = capabilities && capabilities.actions\n return (source && (source[name] || (legacy && source[legacy]))) || { available: false, reason: '\u6B63\u5728\u68C0\u67E5\u5F53\u524D DSH \u7684\u517C\u5BB9\u80FD\u529B\u2026' }\n }\n const canPurge = actionCapability('physicalPurge', 'purge')\n const canMove = actionCapability('relocateSession', 'move')\n const canRestoreTrash = actionCapability('restoreIndexedSession', 'restoreTrash')\n\n const archivedList = sessions ? sessions.filter((x) => x.archived) : []\n const activeList = sessions ? sessions.filter((x) => !x.archived) : []\n const starredList = starredOf(sessions)\n // issue #6 \u4E4B\u4E09\uFF1A\u7A7A\u767D\u4F1A\u8BDD\u5355\u5206\u4E00\u7C7B\u3002\u7A7A\u767D\u5224\u5B9A\u6765\u81EA\u5BBF\u4E3B\u8840\u7F18\u5FEB\u7167\uFF08sizeBytes \u9608\u503C\n // \u5B9E\u6D4B\u6821\u51C6\uFF09\uFF0C\u4E0E\u4FA7\u680F\u300C\u7A7A\u767D\u300D\u6807\u8BB0\u540C\u6E90\u2014\u2014\u4E24\u5904\u6C38\u8FDC\u4E0D\u4F1A\u5404\u8BF4\u5404\u8BDD\u3002\n const emptyList = useMemo(() => {\n if (!sessions) return []\n return sessions.filter((x) => { const li = lineage[String(x.sessionId)]; return !!(li && li.empty) })\n }, [sessions, lineage])\n const list = useMemo(() => {\n if (filter === 'trash') return []\n const base = filter === 'archived' ? archivedList : filter === 'active' ? activeList : filter === 'starred' ? starredList : filter === 'empty' ? emptyList : sessions || []\n const needle = query.trim().toLocaleLowerCase()\n const filtered = base.filter((item) => {\n if (workspaceFilter !== 'all' && (item.workspacePath || '') !== workspaceFilter) return false\n if (!needle) return true\n return [item.title, item.sessionId, item.workspaceTitle, item.workspacePath].some((value) => String(value || '').toLocaleLowerCase().includes(needle))\n })\n return [...filtered].sort((a, b) => {\n if (sortBy === 'oldest') return Number(a.createdAt || 0) - Number(b.createdAt || 0)\n if (sortBy === 'title') return String(a.title || '').localeCompare(String(b.title || ''), 'zh-CN')\n return Number(b.createdAt || 0) - Number(a.createdAt || 0)\n })\n }, [sessions, filter, query, workspaceFilter, sortBy, emptyList, starredList])\n const selIds = Object.keys(selected).filter((k) => selected[k])\n // \u300C\u56DE\u6536\u7AD9\u300D\u662F\u72EC\u7ACB\u89C6\u56FE\uFF0C\u4E0D\u5171\u7528\u4F1A\u8BDD\u5217\u8868\u3002\n const showSessionList = filter !== 'trash'\n\n // \u8840\u7F18\u5206\u7EC4\uFF1A\u628A origin === 'subagent' \u7684\u4F1A\u8BDD\u6302\u5230\u7236\u4F1A\u8BDD\u5361\u7247\u4E0B\uFF08\u53EF\u5D4C\u5957\u5230\u5B59\n // \u4EE3\uFF09\u3002\u7236\u4F1A\u8BDD\u4E0D\u5728\u5F53\u524D\u5217\u8868\u91CC\uFF08\u88AB\u7B5B\u9009\u6389 / \u5DF2\u5220\u9664 / \u8DE8\u7EC4\uFF09\u65F6\u5B50\u4F1A\u8BDD\u4FDD\u6301\u9876\u5C42\uFF0C\n // \u4FDD\u8BC1\u300C\u641C\u5F97\u5230\u5C31\u4E00\u5B9A\u770B\u5F97\u89C1\u300D\uFF0C\u4E0D\u4F1A\u56E0\u4E3A\u6298\u53E0\u800C\u6D88\u5931\u3002\n const { topList, kidsOf, foldedCount } = useMemo(() => {\n if (!groupByLineage) return { topList: list, kidsOf: new Map(), foldedCount: 0 }\n return foldSubagents(list, lineage)\n }, [list, lineage, groupByLineage])\n\n // \u5B50\u4EE3\u7406\u6298\u53E0\u5206\u4E24\u4E2A\u90E8\u4EF6\uFF0C\u5404\u81EA\u8D34\u5728\u5B83\u8BE5\u5728\u7684\u4F4D\u7F6E\uFF1A\n // kidsBadge \u2014\u2014 \u6807\u9898\u884C\u5185\uFF0C\u7D27\u8DDF\u4F1A\u8BDD\u6807\u9898\uFF0C\u662F\u300C\u8FD9\u4E2A\u4F1A\u8BDD\u6709 N \u4E2A\u5B50\u4EE3\u7406\u300D\u7684\u8EAB\u4EFD\n // \u6807\u8BB0\uFF08\u8D34\u5728\u5361\u7247\u5E95\u90E8\u4F1A\u663E\u5F97\u50CF\u591A\u51FA\u7684\u4E00\u5757\uFF0C\u6CA1\u6709\u5F52\u5C5E\uFF09\uFF1B\n // renderKids \u2014\u2014 \u5C55\u5F00\u65F6\u7684\u5B50\u5217\u8868\uFF0C\u7528\u7AD6\u7EBF\u6302\u5728\u7236\u5361\u7247\u5185\u5BB9\u5DE6\u8FB9\u7F18\u4E0B\u65B9\u3002\n const kidsBadge = (sessionId) => {\n if (!groupByLineage) return null\n const kids = kidsOf.get(String(sessionId)) || []\n if (!kids.length) return null\n const open = !!openKids[sessionId]\n return (\n <button\n type=\"button\"\n className=\"dsm-kids-toggle\"\n aria-expanded={open}\n title={(open ? '\u6536\u8D77' : '\u5C55\u5F00') + ' ' + kids.length + ' \u4E2A\u5B50\u4EE3\u7406\u4F1A\u8BDD'}\n onClick={() => setOpenKids((s) => ({ ...s, [sessionId]: !s[sessionId] }))}\n >\n {open ? '\u25BE' : '\u25B8'} {kids.length} \u5B50\u4EE3\u7406\n </button>\n )\n }\n\n // issue #6 \u4E4B\u4E8C/\u4E4B\u4E09\uFF1A\u9762\u677F\u4FA7\u7684\u5206\u652F\u4E0E\u7A7A\u767D\u89C6\u89C9\u4FE1\u53F7\uFF08\u4FA7\u680F\u5DF2\u6709\u540C\u6E90 chip/tag\uFF09\u3002\n // \u5206\u652F\u6807\u8BB0 hover \u8BF4\u660E\u6765\u6E90\uFF1B\u7A7A\u767D\u6807\u8BB0\u63D0\u793A\u53BB\u300C\u7A7A\u767D\u300D\u5206\u7C7B\u6E05\u7406\u3002\n // \u7236\u4F1A\u8BDD\u6807\u9898\u67E5\u627E\u8D70\u4E00\u6B21\u6027 Map\uFF08sessions \u4F1A\u5230\u51E0\u767E\u6761\uFF0C\u6BCF\u5361\u7247 find \u662F O(n\u00B2)\uFF09\u3002\n const sessionsById = useMemo(() => new Map((sessions || []).map((x) => [String(x.sessionId), x])), [sessions])\n const branchBadge = (sessionId) => {\n const li = lineage[String(sessionId)]\n if (!li || li.origin === 'subagent' || !li.parentSession) return null\n const parent = sessionsById.get(String(li.parentSession))\n const label = parent && parent.title ? `\u5206\u652F\u4E8E\uFF1A${parent.title}` : `\u5206\u652F\u4F1A\u8BDD\uFF08\u6765\u6E90\uFF1A${shortId(li.parentSession)}\uFF09`\n return <span className=\"dsm-branch-chip\" title={label}>\u2442 \u5206\u652F</span>\n }\n const emptyBadge = (sessionId) => {\n const li = lineage[String(sessionId)]\n if (!li || !li.empty) return null\n return <span className=\"dsm-empty-chip\" title=\"\u65E0\u5185\u5BB9\u7684\u7A7A\u767D\u4F1A\u8BDD\">\u7A7A\u767D</span>\n }\n\n const renderKids = (parentId, depth) => {\n const kids = kidsOf.get(String(parentId)) || []\n if (!kids.length || !openKids[parentId]) return null\n return (\n <div className=\"dsm-kids\">\n {kids.map((k) => (\n <div className=\"dsm-kid\" key={k.sessionId}>\n <div className=\"dsm-kid-row\">\n <span className=\"dsm-kid-name\" title={k.title || k.sessionId}>{k.title || '(\u65E0\u6807\u9898)'}</span>\n <span className=\"dsm-kid-meta\">{k.archived ? '\u5DF2\u5F52\u6863' : '\u6D3B\u52A8'}{fmtDate(k.createdAt) ? ` \u00B7 ${fmtDate(k.createdAt)}` : ''}</span>\n <span className=\"dsm-kid-acts\">\n <button type=\"button\" className=\"archv-btn\" disabled={busy !== null} title=\"\u5207\u6362\u5230\u8FD9\u4E2A\u5B50\u4EE3\u7406\u4F1A\u8BDD\uFF08\u8BBE\u7F6E\u9762\u677F\u6321\u7740\u4F1A\u8BDD\u533A\uFF0C\u5173\u6389\u5373\u53EF\u770B\u5230\uFF09\" onClick={async () => {\n const name = k.title || (String(k.sessionId).slice(0, 8) + '\u2026')\n const res = await dsmOpenSessionById(k.sessionId, parentId)\n const msg = openSubagentToast(res, name, 'panel')\n showToast(msg.text, msg.kind)\n }}>\u6253\u5F00</button>\n <button type=\"button\" className=\"archv-btn\" disabled={busy !== null} onClick={() => act(k.archived ? 'restore' : 'archive', k)}>{k.archived ? '\u6062\u590D' : '\u5F52\u6863'}</button>\n <button type=\"button\" className=\"archv-btn archv-del\" disabled={busy !== null} title=\"\u79FB\u5165\u56DE\u6536\u7AD9\uFF0C\u53EF\u5728\u56DE\u6536\u7AD9\u6062\u590D\" onClick={() => setDelTarget(k)}>\u5220\u9664</button>\n </span>\n </div>\n {(depth || 0) < 4 && renderKids(k.sessionId, (depth || 0) + 1)}\n </div>\n ))}\n </div>\n )\n }\n\n const toggle = (id) => setSelected((s) => ({ ...s, [id]: !s[id] }))\n const clearSel = () => setSelected({})\n const selectAll = () => {\n const o = {}\n list.forEach((x) => { o[x.sessionId] = true })\n setSelected(o)\n }\n\n const act = (action, it) => {\n if (busy) return\n setBusy(it.sessionId)\n postJSON('/archived-sessions/' + action, { sessionId: it.sessionId })\n .then(() => {\n setBusy(null)\n const n = it.title || it.sessionId\n showToast(action === 'archive' ? `\u5DF2\u5F52\u6863\u300C${n}\u300D` : `\u5DF2\u6062\u590D\u300C${n}\u300D`)\n // \u5355\u6761\u5F52\u6863/\u6062\u590D\u53EA\u662F\u6210\u5458\u6807\u8BB0\u7FFB\u8F6C\uFF1A\u672C\u5730\u66F4\u65B0\u5373\u53EF\uFF0C\u4E0D\u8D70\u6574\u8868 refresh\n //\uFF08refresh \u4F1A\u6E05\u7A7A\u591A\u9009\u72B6\u6001\uFF1Bhost \u4FA7\u7F13\u5B58\u5DF2\u628A\u5217\u8868\u6210\u672C\u538B\u5230 stat \u7EA7\u522B\uFF09\u3002\n setSessions((s) => s && s.map((x) => (x.sessionId === it.sessionId ? { ...x, archived: action === 'archive' } : x)))\n })\n .catch((e) => { setBusy(null); setError(String((e && e.message) || e)) })\n }\n\n const doDeleteConfirmed = () => {\n if (!delTarget || busy) return\n setBusy(delTarget.sessionId)\n postJSON('/archived-sessions/delete', { sessionId: delTarget.sessionId })\n .then(() => {\n setBusy(null)\n const n = delTarget.title || delTarget.sessionId\n showToast(`\u5DF2\u5220\u9664 ${n}\uFF08\u5DF2\u79FB\u5165\u56DE\u6536\u7AD9\uFF09`)\n const sid = String(delTarget.sessionId)\n setDelTarget(null)\n // \u5220\u9664\u8FDB\u5165\u56DE\u6536\u7AD9\uFF1A\u672C\u5730\u79FB\u9664\u8BE5\u884C + \u5355\u5237\u56DE\u6536\u7AD9\uFF0C\u4E0D\u6574\u8868 refresh\u3002\n setSessions((s) => s && s.filter((x) => String(x.sessionId) !== sid))\n loadTrash()\n dsmLoadTrashIds()\n })\n .catch((e) => { setBusy(null); setDelTarget(null); setError(String((e && e.message) || e)) })\n }\n\n const loadTrash = () => {\n postJSON('/archived-sessions/trash/list', {})\n .then((r) => { setTrash(r.items || []); setTrashSettings(r.settings || { retentionDays: 0 }) })\n .catch(() => {})\n }\n\n const updateRetention = (days) => {\n setTrashBusy('__settings')\n postJSON('/archived-sessions/trash/settings', { retentionDays: Number(days) })\n .then((r) => { setTrashBusy(null); setTrashSettings(r.settings); showToast('\u5DF2\u66F4\u65B0\u81EA\u52A8\u6E05\u7406\u7B56\u7565') })\n .catch((e) => { setTrashBusy(null); setError(String((e && e.message) || e)) })\n }\n\n const verifyTrash = () => {\n setTrashBusy('__verify')\n postJSON('/archived-sessions/trash/verify', {})\n .then((r) => {\n setTrashBusy(null); setTrashCheck(r)\n if (r.missing) showToast(`\u53D1\u73B0 ${r.missing} \u6761\u65E5\u5FD7\u7F3A\u5931`)\n else if (r.unverified) showToast(`${r.unverified} \u6761\u65E5\u5FD7\u4F4D\u7F6E\u7531\u5F53\u524D Runtime \u7BA1\u7406\uFF0C\u65E0\u6CD5\u76F4\u63A5\u6838\u9A8C`)\n else showToast('\u56DE\u6536\u7AD9\u6821\u9A8C\u901A\u8FC7')\n })\n .catch((e) => { setTrashBusy(null); setError(String((e && e.message) || e)) })\n }\n\n // \u5B58\u50A8\u5360\u7528\u5206\u6790\uFF1A\u53EA\u8BFB\u805A\u5408\uFF08\u6309\u5DE5\u4F5C\u533A\u6392\u884C + \u6700\u5927\u7684\u4F1A\u8BDD\uFF09\u3002\u6309\u9700\u8C03\u7528\uFF0C\u4E0D\u5728\u9762\u677F\u52A0\u8F7D\u65F6\u9884\u53D6\u3002\n const loadStorage = () => {\n setStorageBusy(true)\n setStorageError(null)\n postJSON('/archived-sessions/storage', { topN: 10 })\n .then((r) => { setStorageBusy(false); setStorage(r); storageDirty.current = false })\n // \u9519\u8BEF\u7559\u5728\u9762\u677F\u5185\u81EA\u884C\u91CD\u8BD5\uFF0C\u4E0D\u5192\u6CE1\u6210\u6574\u4E2A\u8BBE\u7F6E\u9762\u677F\u7684\u9519\u8BEF\u6761\u3002\n .catch((e) => { setStorageBusy(false); setStorageError(String((e && e.message) || e)) })\n }\n\n // \u81EA\u52A8\u5F52\u6863\u8BBE\u7F6E\u3002\u4E00\u6B21\u7EAF\u8BFB\u53D6\u4F1A\u987A\u5E26\u8BA9 host \u8DD1\u4E00\u904D\u6BCF\u65E5\u68C0\u67E5\uFF08host \u4FA7\u6309\u5929\u8282\u6D41\uFF09\u3002\n const applyAa = (r) => setAa({ settings: r.settings || { inactiveDays: 0, skipStarred: true }, lastRunAt: r.lastRunAt ?? null, lastArchivedCount: r.lastArchivedCount || 0 })\n\n const loadAutoArchive = () => {\n postJSON('/archived-sessions/auto-archive/settings', {})\n .then(applyAa)\n .catch(() => {})\n }\n\n const updateAutoArchive = (patch) => {\n if (aaBusy) return\n setAaBusy(true)\n postJSON('/archived-sessions/auto-archive/settings', patch)\n .then((r) => { setAaBusy(false); applyAa(r); showToast('\u5DF2\u66F4\u65B0\u81EA\u52A8\u5F52\u6863\u7B56\u7565') })\n .catch((e) => { setAaBusy(false); setError(String((e && e.message) || e)) })\n }\n\n const runAutoArchive = () => {\n if (aaBusy) return\n setAaBusy(true)\n postJSON('/archived-sessions/auto-archive/run', {})\n .then((r) => {\n setAaBusy(false)\n applyAa(r)\n const n = r.archived || 0\n if (r.skipped === 'disabled') showToast('\u81EA\u52A8\u5F52\u6863\u672A\u542F\u7528')\n else { showToast(`\u5DF2\u81EA\u52A8\u5F52\u6863 ${n} \u4E2A\u4F1A\u8BDD`); if (n > 0) refresh() }\n })\n .catch((e) => { setAaBusy(false); setError(String((e && e.message) || e)) })\n }\n\n const restoreTrash = (sid) => {\n if (trashBusy) return\n setTrashBusy(sid)\n postJSON('/archived-sessions/trash/restore', { sessionId: sid })\n .then((r) => {\n setTrashBusy(null)\n showToast(r && r.workspaceGone ? '\u5DF2\u6062\u590D\u4F1A\u8BDD\uFF08\u539F\u5DE5\u4F5C\u533A\u5DF2\u5220\u9664\uFF0C\u4F1A\u8BDD\u6682\u5F52\u300C\u672A\u5206\u7EC4\u300D\uFF09' : '\u5DF2\u6062\u590D\u4F1A\u8BDD')\n loadTrash()\n refresh()\n })\n .catch((e) => { setTrashBusy(null); setError(String((e && e.message) || e)) })\n }\n const purgeTrash = (sid) => {\n if (trashBusy) return\n setTrashBusy(sid)\n postJSON('/archived-sessions/trash/purge', { sessionId: sid })\n .then(() => { setTrashBusy(null); showToast('\u5DF2\u5F7B\u5E95\u5220\u9664'); dsmMarkPurged([sid]); dsmLoadTrashIds(); loadTrash() })\n .catch((e) => { setTrashBusy(null); setError(String((e && e.message) || e)) })\n }\n const purgeAllTrash = () => {\n if (trashBusy || !trash.length) return\n setTrashBusy('__all')\n const all = trash.map((t) => t.sessionId)\n postJSON('/archived-sessions/trash/purge-many', { sessionIds: all })\n .then((result) => {\n setTrashBusy(null)\n const rows = result.results || []\n const succeeded = rows.filter((item) => item.ok).map((item) => item.sessionId)\n const failed = rows.filter((item) => !item.ok)\n if (succeeded.length) dsmMarkPurged(succeeded)\n dsmLoadTrashIds()\n loadTrash()\n if (failed.length) {\n const first = failed[0]\n setError(`\u6E05\u7406\u5B8C\u6210 ${succeeded.length} \u6761\uFF0C\u5931\u8D25 ${failed.length} \u6761\uFF1A${first.error || first.sessionId}`)\n } else showToast('\u5DF2\u6E05\u7A7A\u56DE\u6536\u7AD9')\n })\n .catch((e) => { setTrashBusy(null); setError(String((e && e.message) || e)) })\n }\n\n const doMove = (it) => {\n if (!canMove.available) { setError(canMove.reason || '\u5F53\u524D\u73AF\u5883\u4E0D\u652F\u6301\u8DE8\u5DE5\u4F5C\u533A\u79FB\u52A8'); return }\n const targetPath = moveMode === 'new' ? newPath.trim() : wsPath(targetWs)\n if (!targetPath) { setError('\u8BF7\u9009\u62E9\u5DF2\u6709\u5DE5\u4F5C\u533A\u6216\u8F93\u5165\u65B0\u7684\u76EE\u6807\u76EE\u5F55\u8DEF\u5F84'); return }\n setBusy(it.sessionId)\n setError(null)\n postJSON('/archived-sessions/move', { sessionId: it.sessionId, targetPath })\n .then((r) => {\n setBusy(null)\n setOpenMove(null)\n setMoveMode('existing')\n setNewPath('')\n // \u4F1A\u8BDD\u88AB DSH \u5360\u7528\uFF08\u6D3B\u8DC3\u4F1A\u8BDD / \u672A\u5173\u95ED\u7684\u4F1A\u8BDD\uFF09\uFF1A\u670D\u52A1\u7AEF\u5DF2\u767B\u8BB0\u6392\u961F\uFF0C\u7B49\u5B83\n // \u91CA\u653E\uFF08session/disposed\uFF09\u6216\u4E0B\u6B21\u542F\u52A8\u65F6\u81EA\u52A8\u5B8C\u6210\u3002\u4E0D\u8981\u8C0E\u62A5\"\u5DF2\u79FB\u52A8\"\u3002\n if (r && r.queued) {\n showToast(r.notes && r.notes.length ? r.notes.join(' ') : '\u4F1A\u8BDD\u6B63\u88AB DSH \u6253\u5F00\uFF0C\u5DF2\u6392\u961F\u5F85\u79FB\u52A8\u3002', 'err')\n setRetry(null)\n refresh()\n return\n }\n showToast(`\u5DF2\u628A\u300C${it.title || it.sessionId}\u300D\u79FB\u5230 ${r.workspaceTitle || targetPath}`)\n // \u975E\u81F4\u547D\u63D0\u793A\uFF08\u5982\u6E90\u76EE\u5F55\u4ECD\u6709\u65E7\u4EE3\u65E5\u5FD7\u672A\u81EA\u52A8\u6E05\u7406\uFF09\uFF1A\u9519\u8BEF\u6837\u5F0F + \u505C\u7559\u66F4\u4E45\uFF0C\n // \u8BA9\u7528\u6237\u6765\u5F97\u53CA\u8BFB\u5B8C\u518D\u53BB\u51B3\u5B9A\u600E\u4E48\u5904\u7406\u3002\n if (Array.isArray(r.notes) && r.notes.length > 0) showToast(r.notes.join(' '), 'err')\n // \u79FB\u52A8\u53EA\u6539 workspacePath/workspaceTitle\uFF1A\u672C\u5730\u66FF\u6362\u8BE5\u884C\uFF0C\u4E0D\u6574\u8868 refresh\u3002\n setSessions((s) => s && s.map((x) => (x.sessionId === it.sessionId\n ? { ...x, workspacePath: r.workspacePath || targetPath, workspaceTitle: r.workspaceTitle || targetPath }\n : x)))\n setRetry(null)\n })\n .catch((e) => {\n setBusy(null)\n setError(String((e && e.message) || e))\n // \u4F1A\u8BDD\u88AB DSH \u5360\u7528\u5199\u6743\u9650\uFF1A\u5207\u8D70\u4F1A\u8BDD\u540E\u539F\u5730\u91CD\u8BD5\u5373\u53EF\uFF0C\u4E0D\u5FC5\u91CD\u65B0\u9009\u76EE\u6807\u3002\n setRetry(e && e.code === BUSY_CODE ? { run: () => doMove(it) } : null)\n })\n }\n\n const doBatch = (action) => {\n if (!selIds.length || busy) return\n if (action === 'delete-many') {\n if (!confirmBatch) { setConfirmBatch(true); return }\n setConfirmBatch(false)\n }\n setBusy('__batch__')\n postJSON('/archived-sessions/' + action, { sessionIds: selIds })\n .then((r) => {\n setBusy(null)\n const n = (r && (r.archived || r.restored || r.deleted)) || selIds.length\n showToast(`\u5DF2\u5904\u7406 ${n} \u4E2A\u4F1A\u8BDD`)\n refresh()\n })\n .catch((e) => { setBusy(null); setConfirmBatch(false); setError(String((e && e.message) || e)) })\n }\n\n // issue #7\uFF1A\u6279\u91CF\u79FB\u52A8\u5230\u540C\u4E00\u4E2A\u76EE\u6807\u5DE5\u4F5C\u533A\u3002\u5931\u8D25\u9010\u6761\u56DE\u62A5\uFF0C\u4E0D\u4E2D\u65AD\u5176\u4F59\u4F1A\u8BDD\u3002\n // \u4F20\u5165 ids \u65F6\u53EA\u642C\u8FD9\u4E9B\uFF08\u7528\u4E8E\u300C\u91CD\u8BD5\u5931\u8D25\u7684\u4F1A\u8BDD\u300D\uFF09\uFF0C\u5426\u5219\u642C\u5F53\u524D\u9009\u4E2D\u3002\n const doBatchMove = (retryIds) => {\n const ids = (Array.isArray(retryIds) && retryIds.length) ? retryIds : selIds\n if (!ids.length || busy) return\n if (!canMove.available) { setError(canMove.reason || '\u5F53\u524D\u73AF\u5883\u4E0D\u652F\u6301\u8DE8\u5DE5\u4F5C\u533A\u79FB\u52A8'); return }\n const targetPath = moveMode === 'new' ? newPath.trim() : wsPath(targetWs)\n if (!targetPath) { setError('\u8BF7\u9009\u62E9\u5DF2\u6709\u5DE5\u4F5C\u533A\u6216\u8F93\u5165\u65B0\u7684\u76EE\u6807\u76EE\u5F55\u8DEF\u5F84'); return }\n setBusy('__batch__')\n setError(null)\n setRetry(null)\n postJSON('/archived-sessions/move-many', { sessionIds: ids, targetPath })\n .then((r) => {\n setBusy(null)\n setBatchMoveOpen(false)\n setMoveMode('existing')\n setNewPath('')\n const moved = (r && r.moved) || 0\n const failed = (r && Array.isArray(r.failed)) ? r.failed : []\n const queued = (r && Array.isArray(r.queued)) ? r.queued : []\n if (queued.length) {\n // \u6D3B\u8DC3/\u88AB\u5360\u7528\u7684\u4F1A\u8BDD\uFF1A\u670D\u52A1\u7AEF\u5DF2\u6392\u961F\uFF0C\u4E0B\u6B21\u91CD\u542F DSH \u65F6\u81EA\u52A8\u5B8C\u6210\u3002\n showToast(`${queued.length} \u4E2A\u4F1A\u8BDD\u5DF2\u6392\u961F\uFF08\u6B63\u88AB DSH \u6253\u5F00\uFF09\uFF0C\u91CD\u542F DSH \u540E\u81EA\u52A8\u5B8C\u6210\uFF1B\u8BF7\u5148\u522B\u6253\u5F00\u5B83\u4EEC\u3002`, 'err')\n }\n if (failed.length) {\n // \u77ED ID \u5217\u8868 + \u9996\u4E2A\u5931\u8D25\u539F\u56E0\uFF1A\u957F UUID \u5168\u5217\u51FA\u6765\u4E0D\u53EF\u8BFB\uFF0C\u539F\u56E0\u53EA\u7ED9\u7B2C\u4E00\u6761\n // \uFF08\u901A\u5E38\u540C\u6279\u5931\u8D25\u540C\u56E0\uFF09\uFF0C\u5B8C\u6574\u539F\u56E0\u4ECD\u53EF\u5728\u63A7\u5236\u53F0\u7F51\u7EDC\u9762\u677F\u67E5\u5230\u3002\n const firstReason = failed[0] && failed[0].error ? `\uFF0C\u9996\u4E2A\u539F\u56E0\uFF1A${failed[0].error.split('\\n')[0]}` : ''\n setError(`\u5DF2\u79FB\u52A8 ${moved} \u4E2A\u4F1A\u8BDD\uFF0C${failed.length} \u4E2A\u5931\u8D25\uFF08${failed.map((f) => shortId(f.sessionId)).join('\u3001')}\uFF09${firstReason}`)\n // \u88AB DSH \u5360\u7528\u5199\u6743\u9650\u7684\u90A3\u51E0\u4E2A\uFF1A\u5207\u8D70\u4F1A\u8BDD\u540E\u91CD\u8BD5\u4ECD\u6709\u620F\uFF0C\u53EA\u91CD\u6295\u8FD9\u51E0\u6761\u3002\n const busyIds = failed.filter((f) => f.code === BUSY_CODE).map((f) => f.sessionId)\n setRetry(busyIds.length ? { run: () => doBatchMove(busyIds) } : null)\n } else if (moved > 0) {\n showToast(`\u5DF2\u628A ${moved} \u4E2A\u4F1A\u8BDD\u79FB\u5230 ${targetPath}`)\n setRetry(null)\n } else {\n setRetry(null)\n }\n clearSel()\n refresh()\n })\n .catch((e) => {\n setBusy(null)\n setError(String((e && e.message) || e))\n setRetry(e && e.code === BUSY_CODE ? { run: () => doBatchMove(ids) } : null)\n })\n }\n\n const openMoveFor = (it) => {\n if (!canMove.available) { setError(canMove.reason || '\u5F53\u524D\u73AF\u5883\u4E0D\u652F\u6301\u8DE8\u5DE5\u4F5C\u533A\u79FB\u52A8'); return }\n if (openMove === it.sessionId) { setOpenMove(null); return }\n setTargetWs(workspaces.length ? (targetWs || workspaces[0].workspaceId) : '')\n setMoveMode('existing')\n setNewPath('')\n setOpenMove(it.sessionId)\n }\n\n const pickDirectory = async () => {\n if (!workspacesSvc || picking) return\n setPicking(true)\n try {\n const p = await workspacesSvc.pickDirectory()\n if (p) { setNewPath(p); setMoveMode('new') }\n } catch (e) {\n setError(String((e && e.message) || e))\n } finally {\n setPicking(false)\n }\n }\n\n const toggleDetails = (it) => {\n if (openDetails === it.sessionId) { setOpenDetails(null); return }\n if (details[it.sessionId]) { setOpenDetails(it.sessionId); return }\n setDetailsLoading(it.sessionId)\n postJSON('/archived-sessions/details', { sessionId: it.sessionId })\n .then((d) => {\n setDetails((m) => ({ ...m, [it.sessionId]: d }))\n setDetailsLoading(null)\n setOpenDetails(it.sessionId)\n })\n .catch((e) => { setDetailsLoading(null); setError(String((e && e.message) || e)) })\n }\n\n const workspaceTag = (it) => {\n if (it.hasWorkspace && it.workspaceGone) {\n return <span className=\"archv-wtag archv-wgone\" title={(it.workspacePath || '') + '\uFF08\u539F\u5DE5\u4F5C\u533A\u5DF2\u5220\u9664\uFF09'}>\u5DE5\u4F5C\u533A\u5DF2\u5220 \u00B7 {pathName(it.workspacePath) || '?'}</span>\n }\n const wName = it.workspaceTitle || pathName(it.workspacePath)\n if (wName) return <span className=\"archv-wtag\" title={it.workspacePath || ''}>{wName}</span>\n return <span className=\"archv-wtag\">\u672A\u5206\u7EC4</span>\n }\n\n const runMenu = (id, it) => {\n setOpenMenu(null)\n if (id === 'restore') act('restore', it)\n else if (id === 'archive') act('archive', it)\n else if (id === 'delete') setDelTarget(it)\n else if (id === 'move') openMoveFor(it)\n else if (id === 'details') toggleDetails(it)\n }\n\n const rowMenu = (it) => {\n const items = it.archived\n ? [\n ['restore', '\u6062\u590D'],\n ['move', openMove === it.sessionId ? '\u6536\u8D77\u79FB\u52A8' : '\u79FB\u52A8'],\n ['details', openDetails === it.sessionId ? '\u6536\u8D77\u8BE6\u60C5' : '\u8BE6\u60C5'],\n ['delete', '\u5220\u9664'],\n ]\n : [['archive', '\u5F52\u6863'], ['move', '\u79FB\u52A8'], ['details', '\u8BE6\u60C5'], ['delete', '\u5220\u9664']]\n return (\n <div ref={openMenu === it.sessionId ? menuRef : null} className=\"more-wrap\">\n <button\n type=\"button\"\n className=\"more-btn\"\n aria-label=\"\u66F4\u591A\u64CD\u4F5C\"\n aria-haspopup=\"true\"\n aria-expanded={openMenu === it.sessionId}\n onClick={(e) => { e.stopPropagation(); setOpenMenu(openMenu === it.sessionId ? null : it.sessionId) }}\n >\u22EF</button>\n {openMenu === it.sessionId && (\n <div className=\"more-menu\" role=\"menu\">\n {items.map(([id, label]) => {\n const blocked = id === 'move' && !canMove.available\n return (\n <button\n key={id}\n type=\"button\"\n role=\"menuitem\"\n className={'more-item' + (id === 'delete' ? ' more-item-danger' : '')}\n disabled={blocked}\n title={blocked ? canMove.reason : undefined}\n onClick={() => runMenu(id, it)}\n >{label}</button>\n )\n })}\n </div>\n )}\n </div>\n )\n }\n\n return (\n <div className=\"archv\" role=\"region\" aria-label=\"\u4F1A\u8BDD\u7BA1\u7406\">\n <style>{CSS}</style>\n <div className=\"archv-head\">\n <h2 className=\"archv-title\">\u4F1A\u8BDD\u7BA1\u7406</h2>\n {capabilities && capabilities.buildStamp\n ? <span className=\"archv-stamp\" title={capabilities.buildStamp} onClick={() => navigator.clipboard && navigator.clipboard.writeText(capabilities.buildStamp).catch(() => {})}>{capabilities.buildStamp}</span>\n : null}\n {sessions !== null && <span className=\"archv-count\" aria-label={`${sessions.length} \u4E2A\u4F1A\u8BDD`}>{sessions.length}</span>}\n </div>\n <p className=\"archv-sub\">\n \u7EDF\u4E00\u7BA1\u7406\u5168\u90E8\u4F1A\u8BDD\uFF1A\u5F52\u6863 / \u6062\u590D / \u79FB\u52A8\u5230\u5176\u4ED6\u5DE5\u4F5C\u533A / \u4F1A\u8BDD\u8BE6\u60C5 / \u6279\u91CF\u64CD\u4F5C\uFF0C\u5220\u9664\u4F1A\u5148\u8FDB\u5165\u56DE\u6536\u7AD9\uFF0C\u53EF\u5728\u56DE\u6536\u7AD9\u5185\u6062\u590D\u6216\u5F7B\u5E95\u6E05\u7406\u3002\n </p>\n {error && (\n <div className=\"archv-err\" role=\"alert\">\n <span>{error}</span>\n <button\n type=\"button\"\n className=\"archv-errretry\"\n title={retry ? '\u628A\u521A\u624D\u5931\u8D25\u7684\u64CD\u4F5C\u539F\u6837\u518D\u505A\u4E00\u6B21\uFF08\u4F8B\u5982\u5148\u5207\u8D70\u88AB\u5360\u7528\u7684\u4F1A\u8BDD\u540E\u91CD\u8BD5\uFF09' : '\u91CD\u65B0\u52A0\u8F7D\u4F1A\u8BDD\u5217\u8868'}\n onClick={() => {\n const run = retry && retry.run\n setRetry(null)\n if (run) run(); else refresh()\n }}\n >\u91CD\u8BD5</button>\n </div>\n )}\n {sessions === null ? (\n <div className=\"archv-skel\" aria-label=\"\u52A0\u8F7D\u4E2D\">\n {[0, 1, 2].map((i) => <div key={i} className=\"archv-skel-card\" />)}\n </div>\n ) : (\n <>\n <div className={'sess-fwrap' + (moreOpen ? ' sess-fmore-open' : '') + (filter === 'starred' || filter === 'empty' || filter === 'trash' ? ' sess-fsec-on' : '')}>\n <div className=\"sess-filter\" role=\"tablist\" aria-label=\"\u4F1A\u8BDD\u7B5B\u9009\">\n <button type=\"button\" role=\"tab\" aria-selected={filter === 'all'} className={'sess-fbtn' + (filter === 'all' ? ' sess-fbtn-on' : '')} onClick={() => { setFilter('all'); clearSel(); setConfirmBatch(false) }}>\u5168\u90E8 ({sessions.length})</button>\n <button type=\"button\" role=\"tab\" aria-selected={filter === 'active'} className={'sess-fbtn' + (filter === 'active' ? ' sess-fbtn-on' : '')} onClick={() => { setFilter('active'); clearSel(); setConfirmBatch(false) }}>\u6D3B\u52A8 ({activeList.length})</button>\n <button type=\"button\" role=\"tab\" aria-selected={filter === 'archived'} className={'sess-fbtn' + (filter === 'archived' ? ' sess-fbtn-on' : '')} onClick={() => { setFilter('archived'); clearSel(); setConfirmBatch(false) }}>\u5DF2\u5F52\u6863 ({archivedList.length})</button>\n <span className=\"sess-fmore\" role=\"tablist\" aria-label=\"\u66F4\u591A\u4F1A\u8BDD\u7B5B\u9009\">\n <button type=\"button\" role=\"tab\" aria-selected={filter === 'starred'} className={'sess-fbtn' + (filter === 'starred' ? ' sess-fbtn-on' : '')} onClick={() => { setFilter('starred'); clearSel(); setConfirmBatch(false) }}>\u5DF2\u6536\u85CF ({starredList.length})</button>\n <button type=\"button\" role=\"tab\" aria-selected={filter === 'empty'} className={'sess-fbtn' + (filter === 'empty' ? ' sess-fbtn-on' : '')} onClick={() => { setFilter('empty'); clearSel(); setConfirmBatch(false) }}>\u7A7A\u767D ({emptyList.length})</button>\n <button type=\"button\" role=\"tab\" aria-selected={filter === 'trash'} className={'sess-fbtn' + (filter === 'trash' ? ' sess-fbtn-on' : '')} onClick={() => { setFilter('trash'); clearSel(); setConfirmBatch(false) }}>\u56DE\u6536\u7AD9 ({trash.length})</button>\n </span>\n <button type=\"button\" className=\"sess-farrow\" aria-expanded={moreOpen} aria-label={moreOpen ? '\u6536\u8D77\u66F4\u591A\u7B5B\u9009' : '\u5C55\u5F00\u66F4\u591A\u7B5B\u9009'} title={moreOpen ? '\u6536\u8D77\u66F4\u591A\u7B5B\u9009' : '\u5C55\u5F00\u66F4\u591A\u7B5B\u9009\uFF08\u5DF2\u6536\u85CF / \u7A7A\u767D / \u56DE\u6536\u7AD9\uFF09'} onClick={() => setMoreOpen(!moreOpen)}>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" aria-hidden=\"true\"><path d=\"M4 2l4 4-4 4\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>\n </button>\n </div>\n </div>\n\n {/* \u7EF4\u62A4\u680F\u662F\u9762\u677F\u7EA7\u5DE5\u5177\uFF0C\u4E0E\u5F53\u524D\u67E5\u770B\u54EA\u4E00\u7EC4\u4F1A\u8BDD\u65E0\u5173\uFF0C\u6545\u6240\u6709\u89C6\u56FE\u90FD\u663E\u793A\u3002 */}\n <div className=\"maint-bar\">\n <button type=\"button\" className=\"archv-btn\" aria-expanded={storageOpen} onClick={() => { const next = !storageOpen; setStorageOpen(next); if (next && (!storage || storageDirty.current) && !storageBusy) loadStorage() }}>\n \u5B58\u50A8\u5360\u7528{storage ? ` \u00B7 ${fmtBytes(storage.totalBytes) || '0 B'}` : ''}\n </button>\n <button type=\"button\" className={'archv-btn' + (aa.settings.inactiveDays ? ' archv-go' : '')} aria-expanded={aaOpen} onClick={() => setAaOpen(!aaOpen)}>\n \u81EA\u52A8\u5F52\u6863{aa.settings.inactiveDays ? `\uFF1A${aa.settings.inactiveDays} \u5929\u672A\u6D3B\u8DC3` : '\uFF1A\u672A\u542F\u7528'}\n </button>\n {aa.lastRunAt ? <span className=\"maint-note\">\u4E0A\u6B21\u68C0\u67E5 {fmtDate(aa.lastRunAt)}\uFF0C\u5F52\u6863 {aa.lastArchivedCount} \u4E2A</span> : <span className=\"maint-note\">\u5C1A\u672A\u68C0\u67E5</span>}\n </div>\n {aaOpen && (\n <div className=\"mv-sheet\" aria-label=\"\u81EA\u52A8\u5F52\u6863\u8BBE\u7F6E\">\n <div className=\"mv-sheet-head\">\n <h3 className=\"mv-sheet-title\">\u81EA\u52A8\u5F52\u6863</h3>\n <button type=\"button\" className=\"mv-sheet-close\" aria-label=\"\u5173\u95ED\" onClick={() => setAaOpen(false)}>\u00D7</button>\n </div>\n <div className=\"mv-field\">\n <label className=\"mv-field-label\" htmlFor=\"dsm-aa-days\">\u5C06\u591A\u4E45\u672A\u6D3B\u8DC3\u7684\u4F1A\u8BDD\u81EA\u52A8\u5F52\u6863</label>\n <select id=\"dsm-aa-days\" value={aa.settings.inactiveDays} disabled={aaBusy} onChange={(e) => updateAutoArchive({ inactiveDays: Number(e.target.value) })}>\n <option value=\"0\">\u4E0D\u81EA\u52A8\u5F52\u6863</option>\n <option value=\"30\">30 \u5929\u672A\u6D3B\u8DC3</option>\n <option value=\"60\">60 \u5929\u672A\u6D3B\u8DC3</option>\n <option value=\"90\">90 \u5929\u672A\u6D3B\u8DC3</option>\n </select>\n </div>\n <label className=\"aa-check\">\n <input type=\"checkbox\" checked={aa.settings.skipStarred !== false} disabled={aaBusy} onChange={(e) => updateAutoArchive({ skipStarred: e.target.checked })} />\n \u8DF3\u8FC7\u5DF2\u6536\u85CF\u7684\u4F1A\u8BDD\n </label>\n <div className=\"mv-foot\">\n <button type=\"button\" className=\"archv-btn\" disabled={aaBusy || !aa.settings.inactiveDays} onClick={runAutoArchive}>{aaBusy ? '\u68C0\u67E5\u4E2D\u2026' : '\u7ACB\u5373\u68C0\u67E5'}</button>\n </div>\n <div className=\"dtl-note\">\n \u81EA\u52A8\u5F52\u6863\u53EA\u662F\u628A\u4F1A\u8BDD\u6536\u8FDB\u300C\u5DF2\u5F52\u6863\u300D\uFF0C\u4E0D\u5220\u9664\u4EFB\u4F55\u6570\u636E\uFF0C\u968F\u65F6\u53EF\u6062\u590D\u3002\u5F53\u524D\u6B63\u5728\u4F7F\u7528\u7684\u4F1A\u8BDD\u6C38\u8FDC\u4E0D\u4F1A\u88AB\u81EA\u52A8\u5F52\u6863\u3002\u68C0\u67E5\u5728\u6253\u5F00\u672C\u9762\u677F\u65F6\u89E6\u53D1\uFF0C\u6BCF\u5929\u6700\u591A\u4E00\u6B21\u3002\n </div>\n </div>\n )}\n {storageOpen && (\n <div className=\"mv-sheet\" aria-label=\"\u5B58\u50A8\u5360\u7528\">\n <div className=\"mv-sheet-head\">\n <h3 className=\"mv-sheet-title\">\u5B58\u50A8\u5360\u7528</h3>\n <div className=\"mv-sheet-actions\">\n <button type=\"button\" className=\"archv-btn\" disabled={storageBusy} onClick={loadStorage}>{storageBusy ? '\u7EDF\u8BA1\u4E2D\u2026' : '\u91CD\u65B0\u7EDF\u8BA1'}</button>\n <button type=\"button\" className=\"mv-sheet-close\" aria-label=\"\u5173\u95ED\" onClick={() => setStorageOpen(false)}>\u00D7</button>\n </div>\n </div>\n {storageError ? (\n <div className=\"archv-err\" role=\"alert\">\n <span>{storageError}</span>\n <button type=\"button\" className=\"archv-errretry\" onClick={loadStorage}>\u91CD\u8BD5</button>\n </div>\n ) : !storage ? (\n <div className=\"archv-empty\">\u7EDF\u8BA1\u4E2D\u2026</div>\n ) : storage.sessionCount === 0 ? (\n <div className=\"archv-empty\">\u6682\u65E0\u4F1A\u8BDD\uFF0C\u6CA1\u6709\u53EF\u7EDF\u8BA1\u7684\u5B58\u50A8\u5360\u7528\u3002</div>\n ) : (\n <>\n <div className=\"dsm-storage-sum\">\n \u5171 {fmtBytes(storage.totalBytes) || '0 B'} \u00B7 {storage.sessionCount} \u4E2A\u4F1A\u8BDD{storage.unknownSessions ? ` \u00B7 ${storage.unknownSessions} \u4E2A\u5927\u5C0F\u672A\u77E5` : ''}\n </div>\n <div className=\"dsm-storage-list\">\n {storage.workspaces.map((w) => (\n <div className=\"dsm-storage-row\" key={w.key}>\n <span className=\"dsm-storage-name\" title={w.path || '\u672A\u5206\u7EC4'}>{w.title || (w.path ? pathName(w.path) : '\u672A\u5206\u7EC4')}</span>\n <span className=\"dsm-storage-bar\" aria-hidden=\"true\"><span className=\"dsm-storage-fill\" style={{ width: `${Math.round((w.share || 0) * 100)}%` }} /></span>\n <span className=\"dsm-storage-size\">{fmtBytes(w.bytes) || '\u2014'}</span>\n <span className=\"dsm-storage-count\">{w.sessions} \u4E2A</span>\n </div>\n ))}\n </div>\n {storage.top.length > 0 && (\n <div className=\"dtl-sec\">\n <div className=\"dtl-sec-t\">\u5360\u7528\u6700\u5927\u7684\u4F1A\u8BDD</div>\n <div className=\"dsm-storage-list\">\n {storage.top.map((s) => (\n <div className=\"dsm-storage-row\" key={s.sessionId}>\n <span className=\"dsm-storage-name\" title={s.sessionId}>{s.title || s.sessionId}</span>\n <span className=\"dsm-storage-size\">{fmtBytes(s.sizeBytes) || '\u2014'}</span>\n <span className=\"dsm-storage-count\">{s.workspaceTitle || (s.workspacePath ? pathName(s.workspacePath) : '\u672A\u5206\u7EC4')}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n <div className=\"dtl-note\">\u7EDF\u8BA1\u7684\u662F\u4F1A\u8BDD\u65E5\u5FD7\u6587\u4EF6\u7684\u78C1\u76D8\u5360\u7528\uFF08\u538B\u7F29\u540E\u7684\u5B9E\u9645\u5927\u5C0F\uFF09\uFF0C\u53EA\u8BFB\uFF0C\u4E0D\u4FEE\u6539\u4EFB\u4F55\u6570\u636E\u3002</div>\n </>\n )}\n </div>\n )}\n {showSessionList && (\n <>\n <div className=\"sess-tools sess-tools-4\" aria-label=\"\u67E5\u627E\u548C\u6574\u7406\u4F1A\u8BDD\">\n <div className=\"sess-field\">\n <label htmlFor=\"dsm-search\">\u641C\u7D22\u4F1A\u8BDD</label>\n <input id=\"dsm-search\" type=\"search\" value={query} onChange={(e) => setQuery(e.target.value)} placeholder=\"\u6807\u9898\u3001\u4F1A\u8BDD ID \u6216\u5DE5\u4F5C\u533A\" />\n </div>\n <div className=\"sess-field\">\n <label htmlFor=\"dsm-workspace-filter\">\u5DE5\u4F5C\u533A</label>\n <select id=\"dsm-workspace-filter\" value={workspaceFilter} onChange={(e) => setWorkspaceFilter(e.target.value)}>\n <option value=\"all\">\u5168\u90E8\u5DE5\u4F5C\u533A</option>\n {workspaces.map((w) => <option key={w.workspaceId} value={w.path}>{w.title}</option>)}\n </select>\n </div>\n <div className=\"sess-field\">\n <label htmlFor=\"dsm-sort\">\u6392\u5E8F</label>\n <select id=\"dsm-sort\" value={sortBy} onChange={(e) => setSortBy(e.target.value)}>\n <option value=\"newest\">\u6700\u65B0\u521B\u5EFA</option><option value=\"oldest\">\u6700\u65E9\u521B\u5EFA</option><option value=\"title\">\u6807\u9898 A\u2013Z</option>\n </select>\n </div>\n <div className=\"sess-field\">\n <label htmlFor=\"dsm-group\">\u5206\u7EC4</label>\n <select id=\"dsm-group\" value={groupByLineage ? 'lineage' : 'flat'} onChange={(e) => setGroupByLineage(e.target.value === 'lineage')} title=\"\u8840\u7F18\u5206\u7EC4\uFF1A\u5B50\u4EE3\u7406\u6298\u53E0\u5728\u7236\u4F1A\u8BDD\u4E0B\uFF1B\u5E73\u94FA\uFF1A\u4E0E DSH \u539F\u751F\u4E00\u81F4\uFF0C\u5168\u90E8\u5E76\u5217\">\n <option value=\"lineage\">\u8840\u7F18\uFF08\u5B50\u4EE3\u7406\u6298\u53E0\uFF09</option>\n <option value=\"flat\">\u5E73\u94FA\uFF08\u5168\u90E8\u5E76\u5217\uFF09</option>\n </select>\n </div>\n </div>\n <div className=\"sess-results\" role=\"status\">\n {/* \u4E00\u53E5\u8BDD\u8BF4\u6E05\u73B0\u72B6\uFF1A\u6709\u5B50\u4EE3\u7406\u6298\u53E0\u65F6\uFF0C\u6298\u53E0\u6570\u53D6\u4EE3\u300C\u5171 X \u4E2A\u300D\u5C3E\u5DF4\n \u51FA\u73B0\u5728\u540C\u4E00\u53E5\u91CC\uFF1B\u6CA1\u6709\u6298\u53E0\u65F6\u7EF4\u6301\u300C\u663E\u793A N \u4E2A\uFF0C\u5171 M \u4E2A\u300D\u3002 */}\n <span className=\"sess-results-main\">\n \u663E\u793A {topList.length} \u4E2A\u4F1A\u8BDD\n {foldedCount\n ? `\uFF0C\u53E6\u6709 ${foldedCount} \u4E2A\u5B50\u4EE3\u7406\u6298\u53E0\u5728\u7236\u4F1A\u8BDD\u4E0B`\n : query || workspaceFilter !== 'all'\n ? `\uFF0C\u5171 ${filter === 'archived' ? archivedList.length : filter === 'active' ? activeList.length : filter === 'starred' ? starredList.length : filter === 'empty' ? emptyList.length : sessions.length} \u4E2A`\n : (topList.length !== list.length ? `\uFF0C\u5171 ${list.length} \u4E2A` : '')}\n </span>\n </div>\n </>\n )}\n\n {showSessionList && list.length > 0 && (\n <div className={'sess-batch' + (selIds.length > 0 ? ' sess-batch-pin' : '')}>\n <span className=\"sess-btntext\">{selIds.length ? `\u5DF2\u9009 ${selIds.length} \u9879` : (filter === 'archived' ? `\u5171 ${archivedList.length} \u4E2A\u5F52\u6863\u4F1A\u8BDD` : filter === 'starred' ? `\u5171 ${starredList.length} \u4E2A\u6536\u85CF\u4F1A\u8BDD` : `\u5171 ${sessions.length} \u4E2A\u4F1A\u8BDD\uFF08\u6D3B\u52A8 ${activeList.length} / \u5DF2\u5F52\u6863 ${archivedList.length}\uFF09`)}</span>\n <button type=\"button\" className=\"archv-btn\" disabled={list.length === 0} onClick={selectAll}>\u5168\u9009</button>\n {selIds.length > 0 && (\n <>\n {filter === 'archived' && (\n <>\n <button type=\"button\" className=\"archv-btn\" disabled={busy !== null} onClick={() => doBatch('restore-many')}>\u6062\u590D\u6240\u9009</button>\n <button type=\"button\" className=\"archv-btn archv-del\" disabled={busy !== null} onClick={() => doBatch('delete-many')}>{confirmBatch ? '\u786E\u8BA4\u5220\u9664\u6240\u9009?' : '\u5220\u9664\u6240\u9009'}</button>\n </>\n )}\n {filter !== 'archived' && (\n <button type=\"button\" className=\"archv-btn\" disabled={busy !== null} onClick={() => doBatch('archive-many')}>\u5F52\u6863\u6240\u9009</button>\n )}\n {canMove.available && (\n <button\n type=\"button\"\n className=\"archv-btn\"\n disabled={busy !== null}\n aria-expanded={batchMoveOpen}\n onClick={() => setBatchMoveOpen(!batchMoveOpen)}\n >\n \u79FB\u52A8\u6240\u9009\u2026\n </button>\n )}\n <button type=\"button\" className=\"archv-btn\" onClick={clearSel}>\u53D6\u6D88\u9009\u62E9</button>\n </>\n )}\n {selIds.length > 0 && batchMoveOpen && canMove.available && (\n <div className=\"mv-sheet\" role=\"region\" aria-label=\"\u6279\u91CF\u79FB\u52A8\u5230\u5DE5\u4F5C\u533A\">\n <div className=\"mv-sheet-head\">\n <h3 className=\"mv-sheet-title\">\u6279\u91CF\u79FB\u52A8 {selIds.length} \u4E2A\u4F1A\u8BDD</h3>\n <button type=\"button\" className=\"mv-sheet-close\" aria-label=\"\u5173\u95ED\" onClick={() => setBatchMoveOpen(false)}>\u00D7</button>\n </div>\n <div className=\"mv-seg\" role=\"tablist\">\n <button type=\"button\" role=\"tab\" aria-selected={moveMode === 'existing'} className={'mv-segbtn' + (moveMode === 'existing' ? ' mv-segbtn-on' : '')} onClick={() => setMoveMode('existing')}>\u5DF2\u6709\u5DE5\u4F5C\u533A</button>\n <button type=\"button\" role=\"tab\" aria-selected={moveMode === 'new'} className={'mv-segbtn' + (moveMode === 'new' ? ' mv-segbtn-on' : '')} onClick={() => setMoveMode('new')}>\u65B0\u5EFA\u76EE\u5F55</button>\n </div>\n {moveMode === 'existing' ? (\n <div className=\"mv-field\">\n <label className=\"mv-field-label\" htmlFor=\"mv-batch-ws\">\u76EE\u6807\u5DE5\u4F5C\u533A</label>\n <select id=\"mv-batch-ws\" value={targetWs} onChange={(e) => setTargetWs(e.target.value)}>\n {workspaces.length === 0 && <option value=\"\">\uFF08\u6682\u65E0\u5DE5\u4F5C\u533A\uFF09</option>}\n {workspaces.map((w) => (\n <option key={w.workspaceId} value={w.workspaceId}>{w.title} \u00B7 {w.path}</option>\n ))}\n </select>\n </div>\n ) : (\n <div className=\"mv-field\">\n <label className=\"mv-field-label\" htmlFor=\"mv-batch-path\">\u65B0\u5DE5\u4F5C\u533A\u76EE\u5F55\u8DEF\u5F84</label>\n <div className=\"mv-browse-row\">\n <input\n id=\"mv-batch-path\"\n type=\"text\"\n value={newPath}\n onChange={(e) => setNewPath(e.target.value)}\n placeholder=\"\u4F8B\u5982 /Users/you/Projects/demo \u6216 ~/demo\"\n />\n <button\n type=\"button\"\n className=\"archv-btn\"\n onClick={pickDirectory}\n disabled={busy !== null || picking || !workspacesSvc}\n title={!workspacesSvc ? '\u5F53\u524D\u8FD0\u884C\u73AF\u5883\u4E0D\u652F\u6301\u7CFB\u7EDF\u76EE\u5F55\u9009\u62E9' : '\u6253\u5F00\u7CFB\u7EDF\u76EE\u5F55\u9009\u62E9\u7A97\u53E3'}\n >\n {picking ? '\u9009\u62E9\u4E2D\u2026' : '\u6D4F\u89C8\u2026'}\n </button>\n </div>\n </div>\n )}\n <div className=\"mv-foot\">\n <button type=\"button\" className=\"archv-btn\" onClick={() => setBatchMoveOpen(false)}>\u53D6\u6D88</button>\n <button type=\"button\" className=\"archv-btn archv-go\" disabled={busy !== null} onClick={() => doBatchMove()}>\n {busy === '__batch__' && <span className=\"archv-spin\" aria-hidden=\"true\" />}\u786E\u8BA4\u79FB\u52A8\n </button>\n </div>\n </div>\n )}\n </div>\n )}\n\n {showSessionList && list.length === 0 ? (\n <div className=\"archv-empty\">{query || workspaceFilter !== 'all' ? '\u6CA1\u6709\u5339\u914D\u7684\u4F1A\u8BDD\u3002\u8BF7\u8C03\u6574\u641C\u7D22\u8BCD\u6216\u5DE5\u4F5C\u533A\u7B5B\u9009\u3002' : filter === 'archived' ? '\u76EE\u524D\u6CA1\u6709\u5F52\u6863\u4F1A\u8BDD\u3002\u5728\u201C\u5168\u90E8\u201D\u91CC\u9009\u4E2D\u4F1A\u8BDD\u70B9\u201C\u5F52\u6863\u201D\u5373\u53EF\u6536\u7EB3\u8FDB\u6765\u3002' : filter === 'active' ? '\u76EE\u524D\u6CA1\u6709\u6D3B\u52A8\u4F1A\u8BDD\u3002' : filter === 'starred' ? '\u8FD8\u6CA1\u6709\u6536\u85CF\u7684\u4F1A\u8BDD\u3002\u70B9\u51FB\u4F1A\u8BDD\u5DE6\u4FA7\u7684\u661F\u6807\u5373\u53EF\u6536\u85CF\u3002' : filter === 'empty' ? '\u6CA1\u6709\u7A7A\u767D\u4F1A\u8BDD\u3002\u65B0\u5F00\u4F1A\u8BDD\u8FD8\u6CA1\u4EA7\u751F\u5185\u5BB9\u65F6\u4F1A\u5F52\u5230\u8FD9\u91CC\uFF0C\u53EF\u5728\u4FA7\u680F\u7528\u300C\u7EAF\u51C0\u89C6\u56FE\u300D\u628A\u5B83\u4EEC\u4E00\u5E76\u6298\u53E0\u3002' : '\u6682\u65E0\u53EF\u7BA1\u7406\u7684\u4F1A\u8BDD\u3002'}</div>\n ) : showSessionList ? (\n <div className=\"archv-list\" role=\"list\">\n {topList.map((it) => {\n const date = fmtDate(it.createdAt)\n const expanded = openMove === it.sessionId\n return (\n <div key={it.sessionId} className={'archv-card' + (expanded ? ' archv-card-exp' : '')} role=\"listitem\">\n <div className=\"archv-row\">\n <input\n type=\"checkbox\"\n className=\"archv-check\"\n checked={!!selected[it.sessionId]}\n onChange={() => toggle(it.sessionId)}\n aria-label={'\u9009\u62E9 ' + (it.title || it.sessionId)}\n />\n <button\n type=\"button\"\n className={'archv-star' + (it.starred ? ' archv-star-on' : '')}\n aria-pressed={!!it.starred}\n aria-label={(it.starred ? '\u53D6\u6D88\u6536\u85CF ' : '\u6536\u85CF ') + (it.title || it.sessionId)}\n title={it.starred ? '\u53D6\u6D88\u6536\u85CF' : '\u6536\u85CF'}\n onClick={(e) => { e.stopPropagation(); toggleStar(it) }}\n >\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12 2.5l2.9 5.9 6.6.9-4.8 4.6 1.2 6.5-5.9-3.1-5.9 3.1 1.2-6.5L2.5 9.3l6.6-.9z\" /></svg>\n </button>\n <div className=\"archv-body\">\n <div className=\"archv-main\">\n <div className=\"archv-titlerow\">\n <span className=\"archv-name\" title={it.title || ''}>{it.title || '(\u65E0\u6807\u9898)'}</span>\n {branchBadge(it.sessionId)}\n {emptyBadge(it.sessionId)}\n {kidsBadge(it.sessionId)}\n <span className=\"archv-id\" title={it.sessionId}>{shortId(it.sessionId)}</span>\n </div>\n <div className=\"archv-meta\">\n {it.archived ? <span className=\"archv-wtag archv-wgone\">\u5DF2\u5F52\u6863</span> : <span className=\"archv-wtag archv-active\">\u6D3B\u52A8</span>}\n {workspaceTag(it)}\n {date && <><span className=\"archv-dot\">\u00B7</span><span className=\"archv-date\">{date}</span></>}\n </div>\n </div>\n {rowMenu(it)}\n </div>\n </div>\n {groupByLineage && renderKids(it.sessionId, 0)}\n {expanded && (\n <div className=\"mv-sheet\" role=\"region\" aria-label=\"\u79FB\u52A8\u5230\u5DE5\u4F5C\u533A\">\n <div className=\"mv-sheet-head\">\n <h3 className=\"mv-sheet-title\">\u79FB\u52A8\u5230\u5DE5\u4F5C\u533A</h3>\n <button type=\"button\" className=\"mv-sheet-close\" aria-label=\"\u5173\u95ED\" onClick={() => setOpenMove(null)}>\u00D7</button>\n </div>\n <div className=\"mv-seg\" role=\"tablist\">\n <button type=\"button\" role=\"tab\" aria-selected={moveMode === 'existing'} className={'mv-segbtn' + (moveMode === 'existing' ? ' mv-segbtn-on' : '')} onClick={() => setMoveMode('existing')}>\u5DF2\u6709\u5DE5\u4F5C\u533A</button>\n <button type=\"button\" role=\"tab\" aria-selected={moveMode === 'new'} className={'mv-segbtn' + (moveMode === 'new' ? ' mv-segbtn-on' : '')} onClick={() => setMoveMode('new')}>\u65B0\u5EFA\u76EE\u5F55</button>\n </div>\n {moveMode === 'existing' ? (\n <div className=\"mv-field\">\n <label className=\"mv-field-label\" htmlFor=\"mv-target-ws\">\u76EE\u6807\u5DE5\u4F5C\u533A</label>\n <select id=\"mv-target-ws\" value={targetWs} onChange={(e) => setTargetWs(e.target.value)}>\n {workspaces.length === 0 && <option value=\"\">\uFF08\u6682\u65E0\u5DE5\u4F5C\u533A\uFF09</option>}\n {workspaces.map((w) => (\n <option key={w.workspaceId} value={w.workspaceId}>{w.title} \u00B7 {w.path}</option>\n ))}\n </select>\n </div>\n ) : (\n <div className=\"mv-field\">\n <label className=\"mv-field-label\" htmlFor=\"mv-new-path\">\u65B0\u5DE5\u4F5C\u533A\u76EE\u5F55\u8DEF\u5F84</label>\n <div className=\"mv-browse-row\">\n <input\n id=\"mv-new-path\"\n type=\"text\"\n value={newPath}\n onChange={(e) => setNewPath(e.target.value)}\n placeholder=\"\u4F8B\u5982 /Users/you/Projects/demo \u6216 ~/demo\"\n />\n <button\n type=\"button\"\n className=\"archv-btn\"\n onClick={pickDirectory}\n disabled={busy !== null || picking || !workspacesSvc}\n title={!workspacesSvc ? '\u5F53\u524D\u8FD0\u884C\u73AF\u5883\u4E0D\u652F\u6301\u7CFB\u7EDF\u76EE\u5F55\u9009\u62E9' : '\u6253\u5F00\u7CFB\u7EDF\u76EE\u5F55\u9009\u62E9\u7A97\u53E3'}\n >\n {picking ? '\u9009\u62E9\u4E2D\u2026' : '\u6D4F\u89C8\u2026'}\n </button>\n </div>\n </div>\n )}\n <div className=\"mv-foot\">\n <button type=\"button\" className=\"archv-btn\" onClick={() => setOpenMove(null)}>\u53D6\u6D88</button>\n <button type=\"button\" className=\"archv-btn archv-go\" disabled={busy !== null} onClick={() => doMove(it)}>\n {busy === it.sessionId && <span className=\"archv-spin\" aria-hidden=\"true\" />}\u786E\u8BA4\u79FB\u52A8\n </button>\n </div>\n </div>\n )}\n {openDetails === it.sessionId && (\n <div className=\"dtl-sheet\" role=\"region\" aria-label=\"\u4F1A\u8BDD\u8BE6\u60C5\">\n <div className=\"dtl-sheet-head\">\n <h3 className=\"dtl-sheet-title\">\u4F1A\u8BDD\u8BE6\u60C5</h3>\n <button type=\"button\" className=\"mv-sheet-close\" aria-label=\"\u5173\u95ED\u8BE6\u60C5\" onClick={() => setOpenDetails(null)}>\u00D7</button>\n </div>\n {detailsLoading === it.sessionId ? (\n <div className=\"archv-skel\" aria-label=\"\u52A0\u8F7D\u4E2D\">{[0, 1].map((i) => <div key={i} className=\"archv-skel-card\" />)}</div>\n ) : (() => {\n const d = details[it.sessionId]\n if (!d) return <div className=\"dtl-paths\">\u6682\u65E0\u8BE6\u60C5</div>\n const st = d.stats || {}\n const tools = st.toolCounts ? Object.entries(st.toolCounts).sort((a, b) => b[1] - a[1]).slice(0, 10) : []\n return (\n <div>\n <div className=\"dtl-grid\">\n <div className=\"dtl-cell\"><span className=\"dtl-k\">\u78C1\u76D8\u5360\u7528</span><span className=\"dtl-v\">{fmtBytes(d.sizeBytes) || '\u2014'}</span></div>\n <div className=\"dtl-cell\"><span className=\"dtl-k\">\u8F6E\u6B21 / \u6B65\u9AA4</span><span className=\"dtl-v\">{st.turns ?? 0} / {st.steps ?? 0}</span></div>\n <div className=\"dtl-cell\"><span className=\"dtl-k\">\u7528\u6237 / \u52A9\u624B</span><span className=\"dtl-v\">{st.userMessages ?? 0} / {st.assistantMessages ?? 0}</span></div>\n <div className=\"dtl-cell\"><span className=\"dtl-k\">\u5DE5\u5177\u8C03\u7528</span><span className=\"dtl-v\">{st.toolCalls ?? 0}</span></div>\n <div className=\"dtl-cell\"><span className=\"dtl-k\">\u56FE\u7247\u9644\u4EF6</span><span className=\"dtl-v\">{st.attachments ?? 0}</span></div>\n <div className=\"dtl-cell\"><span className=\"dtl-k\">\u521B\u5EFA / \u66F4\u65B0</span><span className=\"dtl-v\">{fmtDate(d.createdAt) || '\u2014'} \u00B7 {fmtDate(d.updatedAt) || '\u2014'}</span></div>\n </div>\n {tools.length > 0 && (\n <div className=\"dtl-sec\"><div className=\"dtl-sec-t\">\u5DE5\u5177\u4F7F\u7528</div>\n <div className=\"dtl-tags\">{tools.map(([t, c]) => <span className=\"dtl-tag\" key={t}>{t} \u00D7{c}</span>)}</div>\n </div>\n )}\n {st.fetches && st.fetches.length > 0 && (\n <div className=\"dtl-sec\"><div className=\"dtl-sec-t\">\u641C\u7D22 / \u6293\u53D6</div>\n <ul className=\"dtl-list\">{st.fetches.map((f, i) => <li key={i}>{f.tool}{f.query ? ` \u300C${f.query}\u300D` : ''}</li>)}</ul>\n </div>\n )}\n {d.files && d.files.length > 0 && (\n <div className=\"dtl-sec\"><div className=\"dtl-sec-t\">\u5199\u8FC7\u7684\u6587\u4EF6\uFF08{d.files.length}\uFF09</div>\n <ul className=\"dtl-list\">{d.files.map((f, i) => <li key={i}><code>{f.path}</code> <span className=\"dtl-filetool\">({f.tool})</span></li>)}</ul>\n </div>\n )}\n {d.lineage && (d.lineage.parentSessionId || (d.lineage.children && d.lineage.children.length > 0) || (d.lineage.subagents && d.lineage.subagents.length > 0)) && (\n <div className=\"dtl-sec\"><div className=\"dtl-sec-t\">\u8840\u7EDF</div>\n <div className=\"dtl-paths\">\n {d.lineage.parentSessionId && <div>\u7236\u4F1A\u8BDD: <code>{d.lineage.parentSessionId}</code></div>}\n {d.lineage.children && d.lineage.children.length > 0 && <div>\u5B50\u4F1A\u8BDD ({d.lineage.children.length}): <code>{d.lineage.children.join(', ')}</code></div>}\n {d.lineage.subagents && d.lineage.subagents.length > 0 && <div>\u5B50\u4EE3\u7406 ({d.lineage.subagents.length}): <code>{d.lineage.subagents.join(', ')}</code></div>}\n </div>\n </div>\n )}\n <div className=\"dtl-sec\">\n <div className=\"dtl-sec-t\">\u5BFC\u51FA</div>\n <div className=\"dtl-export\">\n <a\n className=\"archv-btn\"\n href={`/api/session.export?sessionId=${encodeURIComponent(it.sessionId)}&includeDescendants=true`}\n onClick={(e) => e.stopPropagation()}\n style={zipOk ? undefined : { pointerEvents: 'none', opacity: 0.45 }}\n title={zipOk ? '\u542B\u5B50\u4F1A\u8BDD\u4E0E\u9644\u4EF6\uFF0C\u7531 DSH \u63D0\u4F9B' : '\u5F53\u524D\u6301\u4E45\u5316\u540E\u7AEF\u4E0D\u652F\u6301\u539F\u59CB\u65E5\u5FD7\u5BFC\u51FA'}\n >\u4E0B\u8F7D\u539F\u59CB\u65E5\u5FD7 (ZIP)</a>\n <button type=\"button\" className=\"archv-btn\" disabled={mdBusy === it.sessionId} onClick={() => exportMarkdown(it)}>{mdBusy === it.sessionId ? '\u751F\u6210\u4E2D\u2026' : '\u5BFC\u51FA Markdown'}</button>\n </div>\n <div className=\"dtl-note\">ZIP \u542B\u5B50\u4F1A\u8BDD\u4E0E\u9644\u4EF6\uFF0C\u7531 DSH \u63D0\u4F9B \u00B7 Markdown \u4E3A\u672C\u63D2\u4EF6\u751F\u6210\u7684\u53EF\u8BFB\u5BF9\u8BDD\u8BB0\u5F55</div>\n </div>\n </div>\n )\n })()}\n </div>\n )}\n </div>\n )\n })}\n </div>\n ) : null}\n </>\n )}\n {toast && <div className={'archv-status' + (toast.kind === 'err' ? ' archv-status-err' : '') + (String(toast.msg).length > 28 ? ' archv-status-long' : '')} role=\"status\" title=\"\u70B9\u51FB\u5173\u95ED\" onClick={() => setToast(null)}>{toast.msg}</div>}\n {delTarget && (\n <div className=\"dlg-backdrop\" onClick={() => setDelTarget(null)}>\n <div ref={dialogRef} className=\"dlg\" role=\"alertdialog\" aria-modal=\"true\" aria-label=\"\u5220\u9664\u4F1A\u8BDD\" onClick={(e) => e.stopPropagation()}>\n <h3 className=\"dlg-title\">\u5220\u9664\u4F1A\u8BDD</h3>\n <p className=\"dlg-text\">\u786E\u8BA4\u5220\u9664\u300C{delTarget.title || delTarget.sessionId}\u300D\uFF1F\u5C06\u79FB\u5165\u56DE\u6536\u7AD9\uFF0C\u53EF\u5728\u672C\u9875\u5E95\u90E8\u300C\u56DE\u6536\u7AD9\u300D\u4E2D\u6062\u590D\u6216\u5F7B\u5E95\u5220\u9664\u3002</p>\n <div className=\"dlg-actions\">\n <button type=\"button\" className=\"archv-btn\" disabled={busy !== null} onClick={() => setDelTarget(null)}>\u53D6\u6D88</button>\n <button type=\"button\" className=\"archv-btn archv-del\" disabled={busy !== null} onClick={doDeleteConfirmed}>\u79FB\u5165\u56DE\u6536\u7AD9</button>\n </div>\n </div>\n </div>\n )}\n {filter === 'trash' && <section className=\"dsm-trash\" aria-label=\"\u56DE\u6536\u7AD9\">\n <div className=\"dsm-trash-h\">\n <h3>\u56DE\u6536\u7AD9</h3>\n <span className=\"dsm-trash-count\">{trash.length ? `\uFF08${trash.length} \u4E2A\u5F85\u6E05\u7406\uFF09` : '\uFF08\u7A7A\uFF09'}</span>\n </div>\n <div className=\"sess-tools\">\n <div className=\"sess-field\">\n <label htmlFor=\"dsm-retention\">\u81EA\u52A8\u6E05\u7406</label>\n <select id=\"dsm-retention\" value={trashSettings.retentionDays || 0} disabled={trashBusy !== null} onChange={(e) => updateRetention(e.target.value)}>\n <option value=\"0\">\u4E0D\u81EA\u52A8\u6E05\u7406</option><option value=\"7\">\u4FDD\u7559 7 \u5929</option><option value=\"30\">\u4FDD\u7559 30 \u5929</option><option value=\"90\">\u4FDD\u7559 90 \u5929</option>\n </select>\n </div>\n <div className=\"sess-field\"><label>\u6570\u636E\u68C0\u67E5</label><button type=\"button\" className=\"archv-btn\" disabled={trashBusy !== null} onClick={verifyTrash}>{trashBusy === '__verify' ? '\u6821\u9A8C\u4E2D\u2026' : '\u6821\u9A8C\u65E5\u5FD7\u5B8C\u6574\u6027'}</button></div>\n <div className=\"sess-field\"><label>\u6C38\u4E45\u6E05\u7406</label><button type=\"button\" className=\"archv-btn archv-del\" disabled={trashBusy !== null || !trash.length || !canPurge.available} aria-disabled={!canPurge.available} title={!canPurge.available ? canPurge.reason : '\u7269\u7406\u5220\u9664\u8FD9\u4E9B\u65E5\u5FD7\uFF0C\u91CA\u653E\u78C1\u76D8\u7A7A\u95F4'} onClick={() => setPurgeTarget('__all')}>\u6E05\u7A7A\u56DE\u6536\u7AD9</button></div>\n </div>\n {!canPurge.available && (\n <div className=\"archv-empty\" role=\"status\">\n {canPurge.reason}\u3002\u56DE\u6536\u7AD9\u6761\u76EE\u4F1A\u4E00\u76F4\u4FDD\u7559\uFF0C\u53EF\u968F\u65F6\u6062\u590D\uFF1B\u5F53\u524D DSH \u7248\u672C\u4E0B\u79FB\u5165\u56DE\u6536\u7AD9<b>\u4E0D\u4F1A\u91CA\u653E\u78C1\u76D8\u7A7A\u95F4</b>\uFF0C\u4F1A\u8BDD\u65E5\u5FD7\u4ECD\u5B8C\u6574\u4FDD\u7559\u5728\u539F\u5DE5\u4F5C\u533A\u76EE\u5F55\u3002\n </div>\n )}\n <div className=\"dtl-note\">\u56DE\u6536\u7AD9\u662F\u8F6F\u5220\u9664\uFF1A\u65E5\u5FD7\u4ECD\u7559\u5728\u539F\u5DE5\u4F5C\u533A\u76EE\u5F55\uFF0C\u300C\u5F7B\u5E95\u5220\u9664\u300D\u624D\u662F\u771F\u6B63\u91CA\u653E\u78C1\u76D8\u7A7A\u95F4\u7684\u4E00\u6B65\uFF08\u5F53\u524D\u7248\u672C\u672A\u652F\u6301\u65F6\u4F1A\u4FDD\u6301\u7981\u7528\uFF09\u3002</div>\n {trashCheck && <div className={trashCheck.missing ? 'archv-err' : 'archv-empty'} role=\"status\">\u6821\u9A8C\u5B8C\u6210\uFF1A{trashCheck.healthy} \u6761\u6B63\u5E38\uFF0C{trashCheck.missing} \u6761\u65E5\u5FD7\u7F3A\u5931\uFF0C{trashCheck.unverified || 0} \u6761\u65E0\u6CD5\u76F4\u63A5\u6838\u9A8C\u3002</div>}\n {trash.length === 0 ? (\n <div className=\"dsm-trash-empty\">\u56DE\u6536\u7AD9\u4E3A\u7A7A\u3002\u5220\u9664\u7684\u4F1A\u8BDD\u4F1A\u5148\u8FDB\u5165\u8FD9\u91CC\uFF0C\u53EF\u6062\u590D\u6216\u5F7B\u5E95\u5220\u9664\u3002</div>\n ) : (\n <div className=\"dsm-trash-list\">\n {trash.map((t) => (\n <div key={t.sessionId} className=\"dsm-trash-row\">\n <span className=\"dsm-trash-name\" title={t.sessionId}>{t.title || t.sessionId}</span>\n <span className=\"dsm-trash-date\">{fmtDate(t.deletedAt)}</span>\n <span className=\"dsm-trash-actions\">\n <button type=\"button\" className=\"archv-btn\" disabled={trashBusy !== null || !canRestoreTrash.available} title={!canRestoreTrash.available ? canRestoreTrash.reason : '\u6062\u590D\u5230\u5220\u9664\u524D\u7684\u4F4D\u7F6E\u4E0E\u5F52\u6863\u72B6\u6001'} onClick={() => restoreTrash(t.sessionId)}>\u6062\u590D</button>\n <button type=\"button\" className=\"archv-btn archv-del\" disabled={trashBusy !== null || !canPurge.available} title={!canPurge.available ? canPurge.reason : undefined} onClick={() => setPurgeTarget(t.sessionId)}>\u5F7B\u5E95\u5220\u9664</button>\n </span>\n </div>\n ))}\n </div>\n )}\n </section>}\n {purgeTarget && (\n <div className=\"dlg-backdrop\" onClick={() => setPurgeTarget(null)}>\n <div ref={dialogRef} className=\"dlg\" role=\"alertdialog\" aria-modal=\"true\" aria-labelledby=\"dsm-purge-title\" onClick={(e) => e.stopPropagation()}>\n <h3 id=\"dsm-purge-title\" className=\"dlg-title\">\u6C38\u4E45\u5220\u9664{purgeTarget === '__all' ? '\u5168\u90E8\u56DE\u6536\u7AD9\u4F1A\u8BDD' : '\u8FD9\u4E2A\u4F1A\u8BDD'}\uFF1F</h3>\n <p className=\"dlg-text\">\u6B64\u64CD\u4F5C\u4F1A\u7269\u7406\u5220\u9664\u65E5\u5FD7\u5E76\u91CA\u653E\u78C1\u76D8\u7A7A\u95F4\uFF0C\u65E0\u6CD5\u6062\u590D\u3002\u5F52\u6863\u3001\u7B5B\u9009\u548C\u91CD\u65B0\u5B89\u88C5\u63D2\u4EF6\u90FD\u4E0D\u80FD\u627E\u56DE\u8FD9\u4E9B\u6570\u636E\u3002</p>\n <div className=\"dlg-actions\">\n <button type=\"button\" className=\"archv-btn\" onClick={() => setPurgeTarget(null)}>\u53D6\u6D88</button>\n <button type=\"button\" className=\"archv-btn archv-del\" onClick={() => { const target = purgeTarget; setPurgeTarget(null); target === '__all' ? purgeAllTrash() : purgeTrash(target) }}>\u786E\u8BA4\u6C38\u4E45\u5220\u9664</button>\n </div>\n </div>\n </div>\n )}\n </div>\n )\n}\n\n// ---- Main-page sidebar session \"\u22EF\" menu augmentation (DOM shim) -----------\n// DSH core renders the sidebar session list (dsh-client-ui-workspace) with a\n// per-row \"\u22EF\" Menu whose items (rename / fork / archive) are hardcoded \u2014 there\n// is NO plugin slot for adding per-session menu items, and the row DOM carries\n// no sessionId. To honor the request we augment the already-opened portalled\n// menu via DOM: we watch for a [role=\"menu\"] portalled to document.body whose\n// React fiber chain reaches a SessionNodeItem (i.e. it is a session menu), read\n// the session id (and current cwd) off that fiber, then clone an existing menu\n// item to append \"\u79FB\u52A8\u4F1A\u8BDD\" / \"\u5220\u9664\u4F1A\u8BDD\". This is intentionally a DOM shim and is\n// fragile against DSH UI updates (class names / fiber shape / menu markup).\nconst SIDEBAR_AUG_CSS = `\n.dsm-backdrop{position:fixed;inset:0;z-index:2147483600;background:rgba(0,0,0,.45);display:flex;align-items:center;justify-content:center;padding:16px}\n.dsm-dlg{width:min(420px,92vw);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l3);border-radius:14px;padding:18px;box-shadow:0 16px 48px rgb(0 0 0/.28);display:flex;flex-direction:column;gap:12px}\n.dsm-title{font-size:15px;font-weight:650;color:var(--dsw-alias-label-primary);margin:0}\n.dsm-text{font-size:13px;line-height:1.6;color:var(--dsw-alias-label-secondary);margin:0;word-break:break-all}\n.dsm-body{display:flex;flex-direction:column;gap:4px;max-height:280px;overflow:auto}\n.dsm-loading,.dsm-empty{font-size:12px;color:var(--dsw-alias-label-tertiary);padding:4px 2px}\n.dsm-err{font-size:12px;color:var(--dsw-alias-state-error-primary);padding:4px 2px}\n.dsm-opt{appearance:none;display:flex;align-items:center;justify-content:space-between;gap:10px;width:100%;padding:9px 11px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-fill-elevated);color:var(--dsw-alias-label-primary);border-radius:9px;font-size:12.5px;cursor:pointer;text-align:left}\n.dsm-opt:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);border-color:var(--dsw-alias-border-l4)}\n.dsm-opt:disabled{opacity:.55;cursor:default}\n.dsm-opt-cur{border-color:color-mix(in srgb,var(--dsw-alias-state-business-primary) 45%,transparent);color:var(--dsw-alias-state-business-primary)}\n.dsm-opt-name{font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1;min-width:0}\n.dsm-opt-sub{font-size:11px;color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;margin-left:8px}\n.dsm-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:2px}\n.dsm-btn{appearance:none;min-height:32px;padding:0 12px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-fill-subtle);color:var(--dsw-alias-label-secondary);border-radius:9px;font-size:12px;font-weight:500;cursor:pointer}\n.dsm-btn:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}\n.dsm-del{color:var(--dsw-alias-state-error-primary);border-color:color-mix(in srgb,var(--dsw-alias-state-error-primary) 45%,transparent)}\n.dsm-del:hover{background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 10%,transparent);color:var(--dsw-alias-state-error-primary)}\n.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}\n.dsm-toast-long{border-radius:14px;text-align:left;line-height:18px}\n.dsm-toast-err{background:#4A1D1D;color:#FFD9D9;border:1px solid var(--dsw-alias-state-error-primary)}\n.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)}\n.dsm-sub-loading,.dsm-sub-empty{font-size:12px;color:var(--dsw-alias-label-tertiary);padding:6px 10px}\n.dsm-sub-err{font-size:12px;color:var(--dsw-alias-state-error-primary);padding:6px 10px}\n.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}\n.dsm-sub-item:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}\n.dsm-sub-item:disabled{opacity:.5;cursor:default}\n.dsm-sub-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.dsm-sub-cur{font-size:11px;color:var(--dsw-alias-state-business-primary);flex:none;margin-left:8px}\n.dsm-dot{position:absolute;left:6px;top:50%;transform:translateY(-50%);width:8px;height:8px;border-radius:50%;box-sizing:border-box;cursor:pointer;pointer-events:auto;z-index:1}\n.dsm-dot-unread-manual{background:var(--dsw-alias-state-business-primary)}\n.dsm-dot-waiting{background:var(--dsw-alias-state-warn-primary,#F59E0B)}\n.dsm-dot-unread{background:var(--dsw-alias-state-success-primary)}\n.dsm-drag-source{opacity:.48}\n.dsm-drop-target{position:relative;background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 10%,transparent)!important;outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-2px;border-radius:8px}\n.dsm-drop-target::after{content:'\u79FB\u52A8\u5230\u8FD9\u91CC';position:absolute;right:8px;top:50%;transform:translateY(-50%);padding:1px 6px;border-radius:4px;background:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-label-inverted);font-size:10px;font-weight:600;line-height:16px;pointer-events:none}\n.dsm-drag-busy{cursor:progress!important}\n.dsm-trash{margin-top:18px;border-top:1px solid var(--dsw-alias-border-l2);padding-top:14px}\n.dsm-trash-h{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:8px}\n.dsm-trash-h h3{font-size:13px;font-weight:600;color:var(--dsw-alias-label-primary);margin:0}\n.dsm-trash-count{font-size:11px;color:var(--dsw-alias-label-tertiary)}\n.dsm-trash-list{display:flex;flex-direction:column;gap:6px;max-height:260px;overflow:auto}\n.dsm-trash-row{display:flex;align-items:center;gap:8px;padding:8px 10px;border:1px solid var(--dsw-alias-border-l2);border-radius:9px;background:var(--dsw-alias-fill-elevated)}\n.dsm-trash-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;color:var(--dsw-alias-label-primary)}\n.dsm-trash-date{font-size:11px;color:var(--dsw-alias-label-tertiary);flex:none;white-space:nowrap}\n.dsm-trash-actions{display:flex;gap:6px;flex:none}.dsm-trash-actions .archv-btn{min-width:72px}\n.dsm-trash-empty{font-size:12px;color:var(--dsw-alias-label-tertiary);padding:6px 2px}\n.dsm-storage-sum{font-size:12px;color:var(--dsw-alias-label-secondary);margin-bottom:10px}\n.dsm-storage-list{display:flex;flex-direction:column;gap:6px}\n.dsm-storage-row{display:flex;align-items:center;gap:10px;padding:8px 10px;border:1px solid var(--dsw-alias-border-l2);border-radius:9px;background:var(--dsw-alias-fill-elevated)}\n.dsm-storage-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;color:var(--dsw-alias-label-primary)}\n.dsm-storage-bar{flex:0 0 96px;height:6px;border-radius:999px;background:var(--dsw-alias-fill-subtle);overflow:hidden}\n.dsm-storage-fill{display:block;height:100%;border-radius:999px;background:var(--dsw-alias-state-business-primary)}\n.dsm-storage-size{font-size:12px;color:var(--dsw-alias-label-secondary);flex:none;white-space:nowrap}\n.dsm-storage-count{font-size:11px;color:var(--dsw-alias-label-tertiary);flex:none;white-space:nowrap;max-width:32%;overflow:hidden;text-overflow:ellipsis}\n.maint-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 8px}\n.maint-note{font-size:11px;color:var(--dsw-alias-label-tertiary)}\n.mv-sheet-actions{display:flex;align-items:center;gap:6px}\n.aa-check{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--dsw-alias-label-secondary);cursor:pointer}\n.aa-check input{width:15px;height:15px;accent-color:var(--dsw-alias-state-business-primary);cursor:pointer;flex:none}\n/* ---- \u8840\u7F18\u5206\u5C42\u62AB\u9732\uFF08issue #6\uFF09\uFF1A\u884C\u5185\u5FBD\u6807 ---- */\n.dsm-lineage-pick{display:flex;flex-direction:column;gap:6px;margin:8px 0}\n.dsm-lineage-pick-btn{display:flex;justify-content:space-between;align-items:center;gap:8px;padding:8px 10px;border:1px solid var(--dsw-alias-border-l2,rgba(127,127,127,.3));border-radius:8px;background:transparent;color:inherit;cursor:pointer;font-size:12px;text-align:left}\n.dsm-lineage-pick-btn:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(127,127,127,.08))}\n.dsm-lineage-sum{font-size:12px;opacity:.75;margin:6px 0;display:flex;align-items:center;gap:6px;overflow:hidden}\n.dsm-lineage-tree{display:flex;flex-direction:column;gap:2px;margin:8px 0;max-height:340px;overflow:auto}\n.dsm-lineage-row{display:flex;align-items:center;gap:8px;padding:5px 8px;border-radius:8px;font-size:12px;min-height:28px}\n.dsm-lineage-row:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(127,127,127,.08))}\n.dsm-lineage-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.dsm-lineage-kids,.dsm-lineage-size{font-size:11px;opacity:.65;white-space:nowrap}\n.dsm-lineage-livechip{font-size:10px;padding:1px 6px;border-radius:999px;background:rgba(234,179,8,.18);color:#A16207;white-space:nowrap}\n.dsm-lineage-acts{display:flex;gap:4px}\n.dsm-kids-badge{appearance:none;display:inline-flex;align-items:center;gap:3px;margin-left:auto;padding:1px 7px;border:none;border-radius:999px;background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 10%,transparent);color:var(--dsw-alias-state-business-primary);font-size:10px;font-weight:600;line-height:15px;cursor:pointer;flex:none;pointer-events:auto}\n.dsm-subs{display:flex;flex-direction:column;gap:2px;padding:2px 0 6px 26px;pointer-events:auto}\n.dsm-sub-row{display:flex;align-items:center;gap:8px;min-height:24px;padding-right:6px;border-radius:7px;font-size:11.5px;color:var(--dsw-alias-label-secondary);position:relative}\n.dsm-sub-row::before{content:'';position:absolute;left:0;top:0;bottom:0;width:1px;background:var(--dsw-alias-border-l2)}\n.dsm-sub-row:hover{background:var(--dsw-alias-interactive-bg-hover);cursor:pointer}\n.dsm-sub-row:hover .dsm-sub-name{color:var(--dsw-alias-label-primary)}\n.dsm-sub-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.dsm-sub-meta{flex:none;font-size:10.5px;opacity:.8}\n.dsm-sub-live .dsm-sub-meta{color:var(--dsw-alias-state-warning-primary);opacity:1;font-weight:600}\n.dsm-sub-acts{display:none;align-items:center;gap:4px;flex:none}\n.dsm-sub-row:hover .dsm-sub-acts,.dsm-sub-row:focus-within .dsm-sub-acts{display:inline-flex}\n.dsm-sub-btn{appearance:none;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-fill-elevated);color:var(--dsw-alias-label-secondary);border-radius:6px;padding:1px 6px;font:inherit;font-size:10.5px;line-height:16px;cursor:pointer}\n.dsm-sub-btn:hover{color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-border-l3)}\n.dsm-sub-btn-danger{color:var(--dsw-alias-state-error-primary);border-color:color-mix(in srgb,var(--dsw-alias-state-error-primary) 40%,transparent)}\n.dsm-sub-note{font-size:11px;color:var(--dsw-alias-label-tertiary);padding:2px 0}\n.dsm-kids-badge:hover{background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 18%,transparent)}\n.dsm-row-sub{transform:translateX(calc(10px + var(--dsm-indent,0px)));transition:transform .15s ease}\n.dsm-row-sub::before{content:'';position:absolute;left:calc(-6px - var(--dsm-indent,0px));top:0;bottom:0;width:2px;border-radius:1px;background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 30%,transparent);pointer-events:none}\n.dsm-tag{display:inline-flex;align-items:center;margin-left:auto;padding:1px 7px;border-radius:999px;background:var(--dsw-alias-fill-subtle);color:var(--dsw-alias-label-tertiary);font-size:10px;font-weight:500;line-height:15px;flex:none;pointer-events:auto;border:none;cursor:default}\n.dsm-tag-fork{cursor:pointer;background:color-mix(in srgb,var(--dsw-alias-state-success-primary) 12%,transparent);color:var(--dsw-alias-state-success-primary);font-weight:600}\n.dsm-tag-fork:hover{background:color-mix(in srgb,var(--dsw-alias-state-success-primary) 20%,transparent)}\n.dsm-row-flash{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-2px;border-radius:8px;transition:outline-color .6s ease}\n/* \u5FBD\u6807/\u6807\u7B7E\u7EDF\u4E00\u663E\u9690\uFF08\u5BF9\u9F50\u300C\u5B50\u4EE3\u7406\u6298\u53E0\u300D\u7684\u8282\u594F\uFF09\uFF1A\u9ED8\u8BA4\u4E00\u5F8B\u9690\u85CF\uFF0C\u7EF4\u6301 DSH\n \u539F\u751F\u884C\u5916\u89C2\uFF1B\u884C\u88AB\u9009\u4E2D\uFF08dsm-row-active\uFF0Cpaint \u6309 activeId \u5237\u65B0\uFF09\u3001\u9F20\u6807\u60AC\n \u505C\u3001\u952E\u76D8\u805A\u7126\u6216\u5DF2\u5C55\u5F00\u5B50\u4EE3\u7406\u5217\u8868\uFF08dsm-row-open\uFF09\u65F6\u624D\u51FA\u73B0\u3002display \u5207\u6362\n \u4E0D\u5360\u4F4D\uFF1A\u9690\u85CF\u65F6\u6807\u9898\u62FF\u5168\u5BBD\uFF0C\u60AC\u505C\u65F6\u624D\u8BA9\u4F4D\u7ED9\u5FBD\u6807\u3002 */\n[role=\"treeitem\"]>.dsm-kids-badge,[role=\"treeitem\"]>.dsm-tag{display:none}\n[role=\"treeitem\"]:hover>.dsm-kids-badge,[role=\"treeitem\"]:hover>.dsm-tag,\n[role=\"treeitem\"].dsm-row-active>.dsm-kids-badge,[role=\"treeitem\"].dsm-row-active>.dsm-tag,\n[role=\"treeitem\"].dsm-row-open>.dsm-kids-badge,\n[role=\"treeitem\"]:focus-within>.dsm-kids-badge,[role=\"treeitem\"]:focus-within>.dsm-tag{display:inline-flex}\n@media (prefers-reduced-motion:reduce){.dsm-row-sub{transition:none}.dsm-row-flash{transition:none}}\n@media (max-width:640px){.dsm-storage-bar{display:none}.dsm-storage-count{max-width:40%}}\n`\n\n// Shared status-dot state so the \u22EF-menu \"\u6807\u8BB0\u672A\u8BFB\" action can toggle the\n// manual flag and trigger a repaint without coupling the two installers.\nconst DSM_KEY_MANUAL = 'dsm-manual-unread-v1'\nlet dsmManualUnread = null\nlet dsmRepaintDots = null\nfunction dsmLoadManual() {\n if (dsmManualUnread) return dsmManualUnread\n try { dsmManualUnread = new Set(JSON.parse(localStorage.getItem(DSM_KEY_MANUAL) || '[]')) } catch (e) { dsmManualUnread = new Set() }\n return dsmManualUnread\n}\nfunction dsmSaveManual() { try { localStorage.setItem(DSM_KEY_MANUAL, JSON.stringify([...dsmLoadManual()])) } catch (e) {} }\nfunction dsmToggleManual(id) {\n const s = dsmLoadManual()\n if (s.has(id)) s.delete(id); else s.add(id)\n dsmSaveManual()\n if (dsmRepaintDots) dsmRepaintDots()\n}\n\n// Recycle-bin membership (session ids currently in \u56DE\u6536\u7AD9). The sidebar\n// status-dot installer uses this to hide trashed sessions so they don't show\n// up under DSH's \"\u672A\u5206\u7EC4\" group. Loaded from the backend on a throttle and\n// updated optimistically when our own \u22EF-menu deletes a session.\nlet dsmTrashIds = null\nlet dsmServerPurgedIds = new Set()\nlet dsmAuthoritativeTitles = new Map()\nlet dsmTrashTick = 0\nlet dsmCapabilities = null\n// \u8840\u7F18\u5206\u5C42\u62AB\u9732\uFF08issue #6\uFF09\uFF1A\u670D\u52A1\u7AEF\u8840\u7F18\u5206\u7C7B + \u672C\u5730\u89C6\u56FE\u72B6\u6001\u3002\n// dsmLineage: id \u2192 { origin, parentSession, delegationDepth, empty }\nconst dsmLineage = new Map()\n// \u7A7A\u767D\u4F1A\u8BDD\u4E00\u5F8B\u9690\u85CF\uFF08\u539F\u300C\u7EAF\u51C0\u89C6\u56FE\u300D\u7684\u9ED8\u8BA4\u884C\u4E3A\u56FA\u5316\u4E3A\u552F\u4E00\u884C\u4E3A\uFF0C\u5F00\u5173\u5DF2\u4E8E\n// 0.1.3 \u79FB\u9664\uFF1A\u4E0A\u6E38\u672C\u5C31\u4E0D\u628A\u7A7A\u767D\u4F1A\u8BDD\u6E32\u67D3\u8FDB\u4FA7\u680F\uFF0C\u5F00\u5173\u6CA1\u6709\u53EF\u670D\u52A1\u7684\u573A\u666F\uFF09\u3002\n// \u53EA\u9690\u85CF\uFF0C\u6C38\u4E0D\u5220\u9664\uFF1B\u5B50\u4EE3\u7406\u884C\u6309 DSH \u8BBE\u8BA1\u4E0D\u8FDB\u4FA7\u680F\uFF08ui-subagent README \u660E\u6587\n// \"omitted from the ordinary sidebar\"\uFF09\uFF0C\u6536\u7EB3\u7531\u4E0A\u6E38\u5B8C\u6210\uFF0C\u63D2\u4EF6\u4FA7\u4E0D\u505A\u3002\nasync function dsmLoadCapabilities() {\n try { dsmCapabilities = await postJSON('/archived-sessions/capabilities', {}) } catch (e) { /* unknown stays safely unavailable */ }\n return dsmCapabilities\n}\nfunction dsmActionCapability(name, legacy) {\n const source = dsmCapabilities && dsmCapabilities.actions\n return source ? (source[name] || (legacy && source[legacy]) || null) : null\n}\nasync function dsmLoadTrashIds() {\n try {\n const r = await postJSON('/archived-sessions/sidebar-state', {})\n dsmTrashIds = new Set(((r && r.trashedSessionIds) || []).map(String))\n dsmServerPurgedIds = new Set(((r && r.purgedSessionIds) || []).map(String))\n // \u670D\u52A1\u5668\u5DF2\u786E\u8BA4\u7684\u4E50\u89C2\u6807\u8BB0\u968F\u5373\u6E05\u9664\uFF1B\u672A\u88AB\u786E\u8BA4\u7684\u6807\u8BB0\u6700\u591A\u5B58\u6D3B\u5230\u4E0B\u6B21\u5237\u65B0\uFF0C\n // \u7EDD\u4E0D\u6C38\u4E45\u538B\u4F4F\u540E\u6765\u540C id \u7684\u65B0\u4F1A\u8BDD\u3002\n for (const id of [...dsmPendingPurged]) {\n if (dsmServerPurgedIds.has(id)) dsmPendingPurged.delete(id)\n }\n dsmAuthoritativeTitles = new Map(Object.entries((r && r.titles) || {}).map(([id, title]) => [String(id), String(title)]))\n dsmLineage.clear()\n for (const [id, info] of Object.entries((r && r.lineage) || {})) {\n if (info && typeof info === 'object') dsmLineage.set(String(id), info)\n }\n if (dsmRepaintDots) dsmRepaintDots()\n } catch (e) { /* keep last known set */ }\n return dsmTrashIds\n}\n\n// Permanently-hidden set: sessions the user hard-purged from the \u56DE\u6536\u7AD9. The\n// SERVER is the single source of truth: sidebar-state only reports tombstones\n// whose ids are NOT currently present, so a same-id session recreated later is\n// unhidden automatically (the tombstone must never permanently suppress a new\n// session). dsmPendingPurged only carries this tab's optimistic marks until\n// the next server fetch acks them \u2014 no localStorage persistence, so a stale\n// tombstone can never outlive its server record. (dsmServerPurgedIds is\n// declared with the trash-state group above.)\nconst dsmPendingPurged = new Set()\nfunction dsmLoadPurged() {\n return new Set([...dsmServerPurgedIds, ...dsmPendingPurged])\n}\nfunction dsmMarkPurged(ids) {\n ids.forEach((id) => dsmPendingPurged.add(String(id)))\n if (dsmRepaintDots) dsmRepaintDots()\n}\n\n// ---- Sidebar injection adapter (versioned, safe-degrading) ----------------\n// \u6BCF\u4E00\u5904\u8106\u5F31\u7684 DOM / React fiber \u8BC6\u522B\u90FD\u6536\u655B\u5230\u8FD9\u4E2A adapter\uFF1A\u8BC6\u522B\u89C4\u5219\u96C6\u4E2D\u3001\n// \u53EF\u7248\u672C\u5316\uFF08\u4E0A\u6E38\u6539\u7248\u65F6 bump version \u5E76\u53EA\u6539\u8FD9\u91CC\uFF09\uFF0C\u5E76\u4E14**\u53EF\u5B89\u5168\u964D\u7EA7**\u2014\u2014\n// \u8BC6\u522B\u8FDE\u7EED\u843D\u7A7A\u8BF4\u660E\u4E0A\u6E38\u5185\u90E8\u7ED3\u6784\u53D8\u4E86\uFF0C\u6B64\u65F6 adapter \u81EA\u52A8\u505C\u7528\u5168\u90E8\u6CE8\u5165\uFF0C\n// \u7EDD\u4E0D\u628A\u534A\u6B8B\u884C\u4E3A\u5F3A\u52A0\u5230\u5B98\u65B9\u4FA7\u680F\u4E0A\uFF08\u62D6\u62FD / \u6807\u9898\u540C\u6B65 / \u72B6\u6001\u5706\u70B9\u4E00\u5E76\u505C\u7528\uFF09\u3002\nconst SIDEBAR_ADAPTER_VERSION = 3\nconst SIDEBAR_ADAPTER_MAX_MISSES = 200\n\n// \u4FA7\u680F\u6CE8\u5165\u7684\u6574\u573A\u6E05\u9000\uFF1A\u79FB\u9664\u6211\u4EEC\u52A0\u5230 DSH \u4FA7\u680F DOM \u91CC\u7684\u6240\u6709\u8282\u70B9\uFF08\u72B6\u6001\u5706\u70B9 /\n// \u5B50\u4EE3\u7406\u5FBD\u6807 / \u5C31\u5730\u5B50\u5217\u8868 / fork\u00B7\u7A7A\u767D tag\uFF09\uFF0C\u5E76\u8FD8\u539F\u88AB\u9690\u85CF\u7684\u7A7A\u5206\u7EC4\u3002\n// \u4E24\u4E2A\u8C03\u7528\u65F6\u673A\uFF1Aadapter \u56E0\u4E0A\u6E38\u7ED3\u6784\u8FDE\u7EED\u672A\u8BC6\u522B\u800C\u505C\u7528\uFF08\u6B64\u523B\u6B8B\u7559\u7684\u662F\u300C\u534A\u6B8B\u300D\n// \u8282\u70B9\uFF0C\u5FC5\u987B\u6574\u4F53\u64A4\u4E0B\u800C\u4E0D\u662F\u7559\u5728\u5B98\u65B9\u4FA7\u680F\u4E0A\u9519\u4F4D\u663E\u793A\uFF09\uFF0C\u4EE5\u53CA\u63D2\u4EF6 effect \u5378\u8F7D\u3002\n// \u53EA\u6309\u81EA\u5DF1\u7684 data-dsm-* \u6807\u8BB0\u5220\u9664\uFF0C\u7EDD\u4E0D\u78B0 DSH \u81EA\u5DF1\u7684\u8282\u70B9\u3002\nfunction dsmTeardownSidebarAug() {\n if (typeof document === 'undefined') return\n const selectors = ['[data-dsm-dot]', '[data-dsm-kids]', '[data-dsm-subs]', '[data-dsm-tag]']\n for (const sel of selectors) {\n try { document.querySelectorAll(sel).forEach((el) => el.remove()) } catch (e) { /* best-effort */ }\n }\n try {\n document.querySelectorAll('[data-dsm-group-hidden]').forEach((owner) => {\n owner.style.display = owner.dataset.dsmPrevDisplay || ''\n owner.removeAttribute('data-dsm-group-hidden')\n delete owner.dataset.dsmPrevDisplay\n })\n } catch (e) { /* best-effort */ }\n}\n\nfunction createSidebarAdapter() {\n let disabled = false\n let misses = 0\n const findFiber = (el) => {\n const k = Object.keys(el).find((kk) => kk.startsWith('__reactFiber') || kk.startsWith('__reactInternalInstance'))\n return k ? el[k] : null\n }\n // \u8BC6\u522B\u4E00\u884C\u4FA7\u680F\u6811\u8282\u70B9\uFF1A\u8FD4\u56DE { node, group }\uFF08\u4F1A\u8BDD\u884C / \u5DE5\u4F5C\u533A\u6807\u9898\u884C\uFF09\u3002\n // \u4E24\u79CD\u90FD\u6CA1\u6709 = \u8BC6\u522B\u843D\u7A7A\uFF0C\u7D2F\u8BA1\u5230\u9608\u503C\u5373\u6574\u4F53\u505C\u7528\u3002\n const recognize = (row) => {\n const out = { node: null, group: null }\n if (disabled || !row || typeof row !== 'object') return out\n let f = findFiber(row)\n let guard = 0\n while (f && guard++ < 300) {\n const props = f.memoizedProps\n if (props && props.node && typeof props.node === 'object') out.node = props.node\n // DSH \u7684\u4F1A\u8BDD\u884C\u63A5\u6536 `node`\uFF0C\u5DE5\u4F5C\u533A\u6807\u9898\u884C\uFF08ProjectRowItem\uFF09\u63A5\u6536 `group`\u3002\n if (props && props.group && typeof props.group === 'object') out.group = props.group\n f = f.return\n }\n if (!out.node && !out.group) {\n if (++misses >= SIDEBAR_ADAPTER_MAX_MISSES && !disabled) {\n disabled = true\n // \u505C\u7528 = \u627F\u8BA4\u5BF9\u4E0A\u6E38\u7ED3\u6784\u5931\u53BB\u8BA4\u77E5\uFF1A\u6B64\u523B\u4FA7\u680F\u4E0A\u6B8B\u7559\u7684\u6CE8\u5165\u8282\u70B9\u5DF2\u7ECF\u5931\u53BB\n // \u5E42\u7B49\u7EF4\u62A4\uFF08paint \u4E0D\u518D\u8DD1\uFF09\uFF0C\u5FC5\u987B\u6574\u4F53\u64A4\u4E0B\uFF0C\u7EDD\u4E0D\u80FD\u628A\u534A\u6B8B\u884C\u4E3A\u7559\u5728\n // \u5B98\u65B9 UI \u4E0A\u3002\n dsmTeardownSidebarAug()\n try { console.warn('[dsh-sessions-manager] \u4FA7\u680F\u6CE8\u5165 adapter v' + SIDEBAR_ADAPTER_VERSION + ' \u5DF2\u505C\u7528\uFF1A\u672A\u8BC6\u522B\u5230\u5DF2\u77E5\u7684 DSH \u4FA7\u680F\u8282\u70B9\u7ED3\u6784\uFF08\u4E0A\u6E38\u53EF\u80FD\u5DF2\u6539\u7248\uFF09') } catch (e) {}\n }\n } else if (misses > 0) {\n misses = 0\n }\n return out\n }\n return {\n version: SIDEBAR_ADAPTER_VERSION,\n get disabled() { return disabled },\n findFiber,\n recognize,\n }\n}\nconst sidebarAdapter = createSidebarAdapter()\n\n// apply(ctx) \u53EF\u80FD\u88AB\u518D\u6B21\u8C03\u7528\uFF08HMR / profile \u91CD\u8F7D\uFF09\uFF1A\u7528\u6A21\u5757\u7EA7\u5B88\u536B\u4FDD\u8BC1\u89C2\u5BDF\u5668\u3001\n// \u5B9A\u65F6\u5668\u4E0E document \u7EA7\u76D1\u542C\u5668\u53EA\u88C5\u4E00\u4EFD\uFF0C\u7EDD\u4E0D\u53E0\u52A0\uFF08\u53E0\u52A0\u4F1A\u9020\u6210\u91CD\u590D\u63D0\u793A\u4E0E\u540E\u53F0 CPU \u589E\u957F\uFF09\u3002\nlet sidebarMenuAugInstalled = false\nfunction installSidebarSessionMenuAug() {\n if (typeof document === 'undefined') return\n if (sidebarMenuAugInstalled) return\n sidebarMenuAugInstalled = true\n const AUG = 'data-dsm-aug'\n let styleInjected = false\n let activeSubClose = null\n let hoverTimer = null\n\n // Walk the React fiber chain from the portalled menu element up to the\n // SessionNodeItem component, which carries `node.id` (the session id).\n // Portalled menus are one-off surfaces: fiber walking here does NOT count\n // toward the row adapter's miss budget (a non-session menu is normal, not a\n // sign of upstream drift).\n const sessionInfoFromMenu = (menuEl) => {\n let f = sidebarAdapter.findFiber(menuEl)\n let guard = 0\n while (f && guard++ < 300) {\n const p = f.memoizedProps\n if (p && p.node && typeof p.node.id === 'string' && p.node.id) {\n return { id: p.node.id, cwd: p.node.cwd || p.node.workspacePath || null }\n }\n f = f.return\n }\n return null\n }\n const closeMenu = () => {\n try { document.dispatchEvent(new MouseEvent('mousedown', { bubbles: true })) } catch (e) {}\n try { document.dispatchEvent(new PointerEvent('pointerdown', { bubbles: true })) } catch (e) {}\n }\n const escapeHtml = (s) => {\n const d = document.createElement('div')\n d.textContent = s == null ? '' : String(s)\n return d.innerHTML\n }\n const toast = (msg) => {\n const t = document.createElement('div')\n const text = String(msg == null ? '' : msg)\n t.className = 'dsm-toast' + (text.length > 28 ? ' dsm-toast-long' : '')\n t.textContent = text\n t.title = '\u70B9\u51FB\u5173\u95ED'\n t.setAttribute('role', 'status')\n document.body.appendChild(t)\n // \u505C\u7559\u65F6\u957F\u6309\u5B57\u6570\u7ED9\uFF08\u56FA\u5B9A 2.6s \u8BFB\u4E0D\u5B8C\u6392\u961F/\u5931\u8D25\u7C7B\u6587\u6848\uFF09\uFF0C\u5E76\u5141\u8BB8\u70B9\u51FB\u63D0\u524D\u5173\u95ED\u3002\n let killTimer = null\n const kill = () => { if (killTimer) clearTimeout(killTimer); t.remove() }\n killTimer = setTimeout(kill, toastDurationFor(text))\n t.addEventListener('click', kill)\n }\n const ensureStyle = () => {\n if (styleInjected) return\n const s = document.createElement('style')\n s.dataset.dsm = 'aug'\n s.textContent = SIDEBAR_AUG_CSS\n document.head.appendChild(s)\n styleInjected = true\n }\n const closeMoveSubmenu = () => {\n if (activeSubClose) { const f = activeSubClose; activeSubClose = null; f() }\n }\n const openMoveSubmenu = (moveBtn, info) => {\n ensureStyle()\n closeMoveSubmenu()\n const sub = document.createElement('div')\n sub.className = 'dsm-sub'\n sub.setAttribute('role', 'menu')\n sub.setAttribute('data-dsm-sub', '')\n sub.innerHTML = '<div class=\"dsm-sub-loading\">\u52A0\u8F7D\u5DE5\u4F5C\u533A\u2026</div>'\n const r = moveBtn.getBoundingClientRect()\n // Fixed-position card: once the async content renders it can be tall or\n // wide enough to hang past the viewport edges, so re-clamp both anchors\n // against the rendered size.\n const placeSub = () => {\n sub.style.top = Math.max(8, Math.min(Math.round(r.top - 4), window.innerHeight - sub.offsetHeight - 8)) + 'px'\n sub.style.left = Math.max(8, Math.min(Math.round(r.right + 10), window.innerWidth - sub.offsetWidth - 8)) + 'px'\n }\n document.body.appendChild(sub)\n placeSub()\n const closeSub = () => {\n activeSubClose = null\n if (sub.parentNode) sub.remove()\n document.removeEventListener('mousedown', onDocDown, true)\n window.removeEventListener('blur', closeSub)\n }\n const onDocDown = (e) => {\n if (sub.contains(e.target) || moveBtn.contains(e.target)) return\n closeSub()\n }\n // Keep DSH's own outside-click handler from closing the parent menu while\n // the pointer is over our submenu (it lives outside the portalled card).\n sub.addEventListener('mousedown', (e) => e.stopPropagation())\n // Hover bridging: moving from the trigger button across the 10px gap to\n // the submenu must not dismiss it; entering the submenu cancels the\n // pending close timer set on the button's mouseleave.\n sub.addEventListener('mouseenter', () => { if (hoverTimer) { clearTimeout(hoverTimer); hoverTimer = null } })\n sub.addEventListener('mouseleave', () => { hoverTimer = setTimeout(() => closeSub(), 160) })\n setTimeout(() => document.addEventListener('mousedown', onDocDown, true), 0)\n window.addEventListener('blur', closeSub)\n activeSubClose = closeSub\n Promise.all([\n postJSON('/archived-sessions/workspaces', {}),\n postJSON('/archived-sessions/sessions', {}),\n ]).then(([ws, sess]) => {\n const items = ws.items || []\n const cur = (sess.items || []).find((x) => x.sessionId === info.id)\n const curPath = cur ? cur.workspacePath : (info.cwd || null)\n if (!items.length) { sub.innerHTML = '<div class=\"dsm-sub-empty\">\uFF08\u6682\u65E0\u53EF\u7528\u5DE5\u4F5C\u533A\uFF09</div>'; placeSub(); return }\n sub.innerHTML = ''\n items.forEach((w) => {\n const isCur = !!curPath && w.path === curPath\n const b = document.createElement('button')\n b.type = 'button'\n b.className = 'dsm-sub-item'\n b.setAttribute('role', 'menuitem')\n b.disabled = isCur\n const name = document.createElement('span')\n name.className = 'dsm-sub-name'\n name.textContent = w.title || pathName(w.path) || w.workspaceId\n b.appendChild(name)\n if (isCur) {\n const c = document.createElement('span')\n c.className = 'dsm-sub-cur'\n c.textContent = '\u5F53\u524D'\n b.appendChild(c)\n }\n b.addEventListener('click', (e) => {\n e.stopPropagation()\n e.preventDefault()\n closeSub()\n closeMenu()\n postJSON('/archived-sessions/move', { sessionId: info.id, targetPath: w.path })\n .then((r) => {\n // \u4F1A\u8BDD\u88AB DSH \u6253\u5F00\uFF08\u6D3B\u8DC3/\u672A\u5173\u95ED\uFF09\u65F6\u670D\u52A1\u7AEF\u53EA\u767B\u8BB0\u6392\u961F\uFF1A\u78C1\u76D8\u4E0E\u5DE5\u4F5C\u533A\u5206\u7EC4\u90FD\u6CA1\u52A8\u3002\n // \u8FD9\u6761\u8DEF\u5F84\u539F\u5148\u65E0\u6761\u4EF6\u62A5\u300C\u79FB\u52A8\u6210\u529F\u300D\u2014\u20142026-09-10 \u7528\u6237\u62A5\u7684\u300C\u8BF4\u79FB\u52A8\u6210\u529F\u4F46\u8FD8\u5728\n // \u539F\u5DE5\u4F5C\u533A\u300D\u5C31\u662F\u8FD9\u4E2A\u3002\u5FC5\u987B\u6309\u670D\u52A1\u7AEF\u7ED3\u679C\u5982\u5B9E\u8BF4\u660E\u3002\n const label = w.title || pathName(w.path) || '\u76EE\u6807\u5DE5\u4F5C\u533A'\n if (r && r.queued) {\n toast(r.notes && r.notes.length ? r.notes.join(' ') : '\u4F1A\u8BDD\u6B63\u88AB DSH \u6253\u5F00\uFF0C\u5DF2\u6392\u961F\u5F85\u79FB\u52A8\uFF1B\u91CD\u542F DSH \u540E\u4F1A\u81EA\u52A8\u5B8C\u6210\uFF08\u8BF7\u5148\u522B\u6253\u5F00\u5B83\uFF09\u3002')\n return\n }\n toast(r && r.already ? `\u5DF2\u5728\u300C${label}\u300D` : `\u5DF2\u79FB\u5230\u300C${label}\u300D`)\n })\n .catch((ee) => toast('\u79FB\u52A8\u5931\u8D25\uFF1A' + String((ee && ee.message) || ee)))\n })\n sub.appendChild(b)\n })\n placeSub()\n }).catch((e) => {\n sub.innerHTML = '<div class=\"dsm-sub-err\">' + escapeHtml(String((e && e.message) || e)) + '</div>'\n placeSub()\n })\n }\n const openDeleteConfirm = (id) => {\n ensureStyle()\n const backdrop = document.createElement('div')\n backdrop.className = 'dsm-backdrop'\n const dlg = document.createElement('div')\n dlg.className = 'dsm-dlg'\n dlg.innerHTML = '<h3 class=\"dsm-title\">\u5220\u9664\u4F1A\u8BDD</h3><p class=\"dsm-text\">\u786E\u8BA4\u5C06\u8BE5\u4F1A\u8BDD\u79FB\u5165\u56DE\u6536\u7AD9\uFF1F\u53EF\u5728\u300C\u8BBE\u7F6E \u2192 \u4F1A\u8BDD\u7BA1\u7406 \u2192 \u56DE\u6536\u7AD9\u300D\u4E2D\u6062\u590D\u6216\u5F7B\u5E95\u5220\u9664\u3002</p><div class=\"dsm-actions\"><button type=\"button\" class=\"dsm-btn\" data-role=\"cancel\">\u53D6\u6D88</button><button type=\"button\" class=\"dsm-btn dsm-del\" data-role=\"ok\">\u79FB\u5165\u56DE\u6536\u7AD9</button></div>'\n backdrop.appendChild(dlg)\n document.body.appendChild(backdrop)\n const close = () => backdrop.remove()\n backdrop.addEventListener('click', (e) => { if (e.target === backdrop) close() })\n dlg.querySelector('[data-role=cancel]').addEventListener('click', close)\n dlg.querySelector('[data-role=ok]').addEventListener('click', () => {\n close()\n postJSON('/archived-sessions/delete', { sessionId: id })\n .then(() => {\n if (dsmTrashIds) dsmTrashIds.add(String(id))\n if (dsmRepaintDots) dsmRepaintDots()\n toast('\u5DF2\u79FB\u5165\u56DE\u6536\u7AD9')\n })\n .catch((e) => toast('\u5220\u9664\u5931\u8D25\uFF1A' + String((e && e.message) || e)))\n })\n }\n const augmentMenu = (menuEl, info) => {\n if (menuEl.querySelector('[' + AUG + ']')) return\n const viewport = menuEl.querySelector('[role=\"presentation\"]') || menuEl.firstElementChild\n if (!viewport) return\n const proto = menuEl.querySelector('[role=\"menuitem\"]')\n if (!proto) return\n const protoWrap = proto.parentElement\n const protoCls = proto.className\n const protoWrapCls = protoWrap ? protoWrap.className : ''\n const ICON_MOVE = '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\"/><path d=\"M12 11v4\"/><path d=\"M10 13l2 2 2-2\"/></svg>'\n const ICON_DEL = '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 7h16\"/><path d=\"M10 11v6\"/><path d=\"M14 11v6\"/><path d=\"M6 7l1 13a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1l1-13\"/><path d=\"M9 7V4h6v3\"/></svg>'\n const ICON_UNREAD = '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"8\"/><circle cx=\"12\" cy=\"12\" r=\"3\" fill=\"currentColor\" stroke=\"none\"/></svg>'\n const mk = (label, svg, danger) => {\n const wrap = protoWrap ? protoWrap.cloneNode(false) : document.createElement('div')\n if (protoWrapCls) wrap.className = protoWrapCls\n const btn = document.createElement('button')\n btn.type = 'button'\n btn.setAttribute('role', 'menuitem')\n btn.className = protoCls // same `.item` class DSH uses \u2192 identical layout/alignment\n const icon = document.createElement('span')\n icon.style.cssText = 'display:inline-flex;flex:none;width:16px;height:16px;align-items:center;justify-content:center;color:' + (danger ? 'var(--dsw-alias-state-error-primary)' : 'var(--dsw-alias-label-tertiary)')\n icon.innerHTML = svg\n const lab = document.createElement('span')\n lab.style.cssText = 'flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap'\n lab.textContent = label\n btn.appendChild(icon)\n btn.appendChild(lab)\n if (danger) btn.style.color = 'var(--dsw-alias-state-error-primary)'\n btn.setAttribute(AUG, '')\n wrap.appendChild(btn)\n return { wrap, btn }\n }\n const move = mk('\u79FB\u52A8\u4F1A\u8BDD', ICON_MOVE, false)\n const del = mk('\u5220\u9664\u4F1A\u8BDD', ICON_DEL, true)\n const mark = mk(dsmLoadManual().has(info.id) ? '\u6807\u8BB0\u5DF2\u8BFB' : '\u6807\u8BB0\u672A\u8BFB', ICON_UNREAD, false)\n const moveCapability = dsmActionCapability('relocateSession') || dsmActionCapability('move')\n if (!moveCapability || !moveCapability.available) {\n move.btn.disabled = true\n move.btn.title = (moveCapability && moveCapability.reason) || '\u6B63\u5728\u68C0\u67E5\u5F53\u524D\u7248\u672C\u7684\u79FB\u52A8\u80FD\u529B'\n }\n if (mark.btn.firstChild) mark.btn.firstChild.style.color = 'var(--dsw-alias-state-business-primary)'\n const chev = document.createElement('span')\n chev.style.cssText = 'margin-left:auto;flex:none;color:var(--dsw-alias-label-tertiary);font-size:14px;line-height:1'\n chev.textContent = '\u203A'\n move.btn.appendChild(chev)\n move.btn.addEventListener('mouseenter', () => {\n if (!document.querySelector('[data-dsm-sub]')) openMoveSubmenu(move.btn, info)\n })\n move.btn.addEventListener('mouseleave', () => {\n hoverTimer = setTimeout(() => closeMoveSubmenu(), 160)\n })\n move.btn.addEventListener('click', (e) => { e.stopPropagation(); e.preventDefault() })\n del.btn.addEventListener('click', (e) => {\n e.stopPropagation()\n e.preventDefault()\n closeMoveSubmenu()\n openDeleteConfirm(info.id)\n })\n mark.btn.addEventListener('click', (e) => {\n e.stopPropagation()\n e.preventDefault()\n closeMoveSubmenu()\n dsmToggleManual(info.id)\n closeMenu()\n })\n viewport.appendChild(move.wrap)\n viewport.appendChild(del.wrap)\n // \u6807\u8BB0\u672A\u8BFB goes to the very top of the menu (above DSH's native items).\n viewport.insertBefore(mark.wrap, viewport.firstElementChild)\n // DSH's portalled Menu clamped its position using the height it measured\n // before this shim injected rows, so the grown card can hang past the\n // viewport bottom and cover the sidebar foot. Reuse the host's own\n // placement by firing the resize event it listens for while open.\n window.dispatchEvent(new Event('resize'))\n }\n\n const seen = new WeakSet()\n const obs = new MutationObserver(() => {\n if (sidebarAdapter.disabled) return\n const menus = document.querySelectorAll('body > [role=\"menu\"]')\n menus.forEach((menuEl) => {\n if (seen.has(menuEl)) return\n const info = sessionInfoFromMenu(menuEl)\n if (!info) return // not a session menu (e.g. settings / header dropdown)\n seen.add(menuEl)\n try { augmentMenu(menuEl, info) } catch (e) { /* best-effort DOM shim */ }\n })\n })\n obs.observe(document.body, { childList: true, subtree: false })\n}\n\n// Left-side per-session status dot (DOM shim). The color is driven by DSH's\n// REAL session status, read from the row's own StateDot ([data-state]):\n// \u624B\u52A8\u6807\u8BB0\u672A\u8BFB\uFF08\u84DD\uFF09 = \u7528\u6237\u5728 \u22EF \u83DC\u5355\u6216\u70B9\u51FB\u5706\u70B9\u624B\u52A8\u6807\u8BB0\uFF0ClocalStorage \u6301\u4E45\u5316\uFF08\u6700\u9AD8\u4F18\u5148\u7EA7\uFF09\n// \u5DE5\u4F5C\u4E2D\uFF08\u9EC4\uFF09 = DSH state 'ongoing'\uFF08\u65E7\u7248\u517C\u5BB9 'running'\uFF09\n// \u9700\u7528\u6237\u53CD\u9988\uFF08\u7425\u73C0\uFF09 = DSH state 'warning'\uFF08\u6709\u8FFD\u95EE\u9700\u7528\u6237\u53CD\u9988\uFF09\n// \u5B8C\u6210\u540E\u672A\u8BFB\uFF08\u7EFF\uFF09 = DSH state 'done' \u4E14\u7528\u6237\u5C1A\u672A\u8BFB\u8FC7\uFF08read \u96C6\u5408\uFF09\n// \u5B8C\u6210\u5DF2\u8BFB\uFF08\u4E0D\u663E\u793A\uFF09 = DSH state 'done' \u4E14\u5DF2\u8BFB\u8FC7\uFF08read \u96C6\u5408\u6301\u4E45\u5316\uFF09\n// \u624B\u52A8\u672A\u8BFB\u96C6\u5408 + read \u96C6\u5408\u5747\u6301\u4E45\u5316\u4E8E localStorage\uFF1B\u6253\u5F00\u8FC7\u5373\u8BB0\u5165 read\uFF0C\u7EFF\u70B9\u4E0D\u518D\u51FA\u73B0\u3002\n// \u53E6\u5916\uFF1A\u8FDB\u5165\u56DE\u6536\u7AD9\u7684\u4F1A\u8BDD\u4F1A\u6574\u884C\u9690\u85CF\uFF08\u4E0D\u51FA\u73B0\u5728\u300C\u672A\u5206\u7EC4\u300D\u91CC\uFF09\u3002\nfunction installSidebarStatusDots() {\n if (typeof document === 'undefined') return\n const DOT = 'data-dsm-dot'\n if (!document.querySelector('style[data-dsm=aug]')) {\n const s = document.createElement('style')\n s.dataset.dsm = 'aug'\n s.textContent = SIDEBAR_AUG_CSS\n document.head.appendChild(s)\n }\n const rowNode = (row) => sidebarAdapter.recognize(row).node\n const rowId = (row) => { const node = rowNode(row); return node ? node.id : null }\n let curActive = null\n const activeRowId = () => {\n const sel = document.querySelector('[role=\"treeitem\"][aria-selected=\"true\"]')\n return sel ? rowId(sel) : null\n }\n // Dot colors per the user's scheme. We read DSH's REAL session status from the\n // row's own StateDot (its [data-state] attr) and recolor it:\n // ongoing/running \u2192 \u9EC4 \u5DE5\u4F5C\u4E2D\n // warning \u2192 \u7425\u73C0 \u6709\u8FFD\u95EE\u9700\u7528\u6237\u53CD\u9988\n // done \u2192 \u7EFF \u5B8C\u6210\u540E\u672A\u8BFB\uFF08\u8BFB\u8FC7\u5219\u4E0D\u518D\u663E\u793A\uFF09\n // error \u2192 \u7EA2 \u51FA\u9519/\u9700\u5173\u6CE8\uFF08\u4E0E DSH \u81EA\u5E26 StateDot \u4E00\u81F4\uFF09\n // (manual \u2192 \u84DD \u624B\u52A8\u6807\u8BB0\u672A\u8BFB\uFF0C\u6700\u9AD8\u4F18\u5148\u7EA7)\n const COLOR = {\n manual: 'var(--dsw-alias-state-business-primary)', // \u84DD \u624B\u52A8\u6807\u8BB0\u672A\u8BFB\n running: '#EAB308', // \u9EC4 \u5DE5\u4F5C\u4E2D (DSH running)\n feedback: 'var(--dsw-alias-state-warn-primary, #F59E0B)', // \u7425\u73C0 \u9700\u7528\u6237\u53CD\u9988 (DSH warning)\n done: 'var(--dsw-alias-state-success-primary)', // \u7EFF \u5B8C\u6210\u540E\u672A\u8BFB (DSH done)\n error: 'var(--dsw-alias-state-error-primary)', // \u7EA2 \u51FA\u9519/\u9700\u5173\u6CE8 (DSH error)\n }\n const manualUnread = dsmLoadManual()\n const titleInitializedRows = new WeakSet()\n // \u7A7A\u5206\u7EC4\u515C\u5E95\uFF1ADSH \u4F1A\u628A\u300C\u65E5\u5FD7\u5DF2\u4E0D\u5728\u539F\u5904\u300D\u7684\u4F1A\u8BDD\u91CD\u65B0\u5F52\u5230\u300C\u672A\u5206\u7EC4\u300D\u7EC4\u91CC\uFF08\u5220\n // \u9664\u540E\u6700\u660E\u663E\uFF09\u3002\u6211\u4EEC\u628A\u884C\u9690\u85CF\u4E86\uFF0C\u4F46\u7A7A\u7EC4\u6807\u9898\u4F1A\u7559\u4E0B\u6765\u2014\u2014\u6240\u4EE5\u7EC4\u5185\u6240\u6709\u884C\u90FD\u88AB\n // \u9690\u85CF\u65F6\uFF0C\u628A\u6574\u4E2A\u5206\u7EC4\uFF08\u542B\u5B83\u7684\u6807\u9898\u884C\uFF09\u4E00\u8D77\u9690\u85CF\uFF1B\u7EC4\u5185\u91CD\u65B0\u51FA\u73B0\u53EF\u89C1\u884C\u65F6\u81EA\u52A8\n // \u8FD8\u539F\u3002\u53EA\u5728\u300C\u7EC4\u5185\u786E\u5B9E\u6709\u884C\u300D\u65F6\u624D\u5224\u5B9A\uFF0C\u907F\u514D\u628A\u6B63\u5728\u52A0\u8F7D\u7684\u7A7A\u7EC4\u8BEF\u85CF\u3002\n // \u539F display \u8BB0\u5728 owner \u7684 dataset \u4E0A\uFF08\u89C1\u4E0B\u65B9 dsmSyncEmptyGroups\uFF09\u3002\n function dsmSyncEmptyGroups() {\n let groups = null\n try { groups = document.querySelectorAll('[role=\"group\"]') } catch (e) { return }\n if (!groups || !groups.length) return\n groups.forEach((g) => {\n const items = g.querySelectorAll('[role=\"treeitem\"]')\n if (!items.length) return\n let visible = 0\n items.forEach((it) => { if (it.style.display !== 'none') visible++ })\n // ARIA tree\uFF1Agroup \u901A\u5E38\u5D4C\u5728\u5B83\u7684\u6807\u9898 treeitem \u91CC\uFF0C\u85CF\u6807\u9898\u5373\u85CF\u6574\u7EC4\u3002\n // \u539F display \u5B58\u8FDB dataset\uFF08\u800C\u975E WeakMap\uFF09\uFF1A\u6E05\u573A/\u8FD8\u539F\u51FD\u6570\u65E0\u6CD5\u904D\u5386\n // WeakMap\uFF0Cdataset \u8BA9\u300C\u8C01\u88AB\u6211\u4EEC\u85CF\u8FC7\u3001\u539F\u6765\u662F\u4EC0\u4E48\u300D\u968F\u65F6\u53EF\u67E5\u53EF\u8FD8\u539F\u3002\n const owner = g.closest('[role=\"treeitem\"]') || g\n if (visible === 0) {\n if (!owner.hasAttribute('data-dsm-group-hidden')) {\n owner.dataset.dsmPrevDisplay = owner.style.display || ''\n owner.setAttribute('data-dsm-group-hidden', '')\n }\n if (owner.style.display !== 'none') owner.style.display = 'none'\n } else if (owner.hasAttribute('data-dsm-group-hidden')) {\n const prev = owner.dataset.dsmPrevDisplay || ''\n if (owner.style.display !== prev) owner.style.display = prev\n owner.removeAttribute('data-dsm-group-hidden')\n delete owner.dataset.dsmPrevDisplay\n }\n })\n }\n const paint = () => {\n if (sidebarAdapter.disabled) return\n // Recompute the active session on every paint so the active row is never\n // shown from a stale `curActive` (the click that changes aria-selected\n // mutates the DOM and triggers paint immediately, before the tick()\n // would have run \u2014 without this, the clicked session flashed green).\n const activeId = activeRowId()\n // Clicking into a manually-marked session auto-clears the manual unread\n // flag (it becomes read on open) \u2014 only on the active transition, so a\n // flag set while already viewing it isn't wiped until you re-enter it.\n if (activeId !== curActive && activeId && manualUnread.has(activeId)) {\n manualUnread.delete(activeId)\n dsmSaveManual()\n }\n curActive = activeId\n // \u6BCF\u6B21 paint \u53EA\u805A\u5408\u4E00\u6B21\uFF1A\u7236\u4F1A\u8BDD id \u2192 \u5B50\u4EE3\u7406\u6570\uFF08O(n)\uFF0C\u907F\u514D\u6BCF\u884C\u91CD\u7B97\uFF09\u3002\n const purgedNow = dsmLoadPurged()\n const kidsByParent = (() => {\n const m = new Map()\n for (const [id, info] of dsmLineage.entries()) {\n if (info.origin !== 'subagent' || !info.parentSession) continue\n // \u5DF2\u8FDB\u56DE\u6536\u7AD9 / \u5DF2\u5F7B\u5E95\u5220\u9664\u7684\u5B50\u4EE3\u7406\u4E0D\u8BA1\u6570\uFF1A\u5426\u5219\u5220\u6389\u4E86\u5FBD\u6807\u6570\u5B57\u8FD8\u6302\u7740\u3002\n if ((dsmTrashIds && dsmTrashIds.has(id)) || purgedNow.has(id)) continue\n m.set(info.parentSession, (m.get(info.parentSession) || 0) + 1)\n }\n return m\n })()\n const rows = document.querySelectorAll('[role=\"treeitem\"]')\n // \u515C\u5E95\u6E05\u7406\uFF1A\u7236\u884C\u88AB React \u79FB\u9664 / \u590D\u7528\u540E\u6B8B\u7559\u7684\u5B50\u4EE3\u7406\u5BB9\u5668\u7ACB\u523B\u6458\u6389\uFF0C\n // \u907F\u514D\u5B64\u513F\u5BB9\u5668\u8D8A\u5806\u8D8A\u591A\u3002\n document.querySelectorAll('[data-dsm-subs]').forEach((box) => {\n const pid = box.getAttribute('data-dsm-subs')\n const prev = box.previousElementSibling\n if (!prev || rowId(prev) !== pid) box.remove()\n })\n rows.forEach((row) => {\n const id = rowId(row)\n if (!id) return\n // Trashed sessions belong in \u56DE\u6536\u7AD9, not the sidebar (DSH would group\n // them under \"\u672A\u5206\u7EC4\"). Hide the row entirely and skip its dot. So do\n // hard-purged sessions \u2014 they're gone for good and must never resurface\n // (otherwise DSH re-renders the orphan under a \"\u672A\u5206\u7EC4\" group).\n const purged = purgedNow\n if ((dsmTrashIds && dsmTrashIds.has(id)) || purged.has(id)) {\n if (row.style.display !== 'none') row.style.display = 'none'\n const d = row.querySelector('[' + DOT + ']'); if (d) d.remove()\n dsmDropSubList(row, id)\n return\n }\n // ---- \u8840\u7F18\u5206\u5C42\u62AB\u9732\uFF08issue #6\uFF09--------------------------------------\n // \u4F18\u5148\u7EA7\uFF1A\u56DE\u6536\u7AD9/\u5893\u7891\u9690\u85CF > \u7EAF\u51C0\u89C6\u56FE\u9690\u85CF\uFF08\u4EC5\u7A7A\u767D\u884C\uFF09 > \u539F\u751F\u663E\u793A\u3002\n // \u5B50\u4EE3\u7406\u884C\u6309 DSH \u8BBE\u8BA1\u4E0D\u8FDB\u4FA7\u680F\uFF08ui-subagent README \u660E\u6587\uFF09\uFF1B\u4E07\u4E00\u4E0A\u6E38\n // \u6539\u56DE\u6E32\u67D3\uFF0C\u8FD9\u91CC\u53EA\u505A\u7F29\u8FDB\u89C6\u89C9\u3001\u7EDD\u4E0D\u9690\u85CF\u2014\u2014\u4FA7\u680F\u6CA1\u6709\u5C55\u5F00\u5165\u53E3\uFF0C\u85CF\u4E86\n // \u5C31\u518D\u4E5F\u627E\u4E0D\u56DE\u6765\u3002\n const li = dsmLineage.get(id)\n const isSub = !!(li && li.origin === 'subagent')\n const isEmpty = !!(li && li.empty)\n // React \u4F1A\u590D\u7528\u884C DOM\uFF1A\u6BCF\u6B21\u5148\u6309\u5F53\u524D id \u91CD\u7F6E\u8840\u7F18\u89C6\u89C9\uFF0C\u518D\u6309\u9700\u52A0\u56DE\u3002\n // classList \u7684 add/remove \u5BF9\u5DF2\u5904\u4E8E\u76EE\u6807\u72B6\u6001\u7684\u884C\u662F\u65E0\u64CD\u4F5C\uFF08\u4E0D\u89E6\u53D1\n // MutationObserver\uFF09\uFF0C\u5FBD\u6807\u8282\u70B9\u53EA\u5141\u8BB8\u300C\u7F3A\u5931\u624D\u521B\u5EFA\u300D\u3002\n row.classList.remove('dsm-row-sub')\n // \u9009\u4E2D\u884C\u6807\u8BB0\uFF1A\u5FBD\u6807/\u6807\u7B7E\u7684\u300C\u9009\u4E2D\u624D\u663E\u793A\u300D\u9760\u5B83\u9A71\u52A8\uFF08CSS \u4FA7\uFF09\u3002\n // toggle \u540C\u503C\u65F6\u4E0D\u52A8 DOM \u5C5E\u6027\uFF0C\u4E0D\u4F1A\u89E6\u53D1 MutationObserver\u3002\n row.classList.toggle('dsm-row-active', id === activeId)\n row.style.removeProperty('--dsm-indent')\n let hideLineage = false\n if (li && isSub) {\n row.classList.add('dsm-row-sub')\n if (getComputedStyle(row).position === 'static') row.style.position = 'relative'\n const depth = Math.max(0, (li.delegationDepth || 1) - 1)\n if (depth > 0) row.style.setProperty('--dsm-indent', String(depth * 10) + 'px')\n } else if (li && isEmpty) {\n // \u7A7A\u767D\u884C\u4E00\u5F8B\u9690\u85CF\uFF08\u539F\u7EAF\u51C0\u89C6\u56FE\u884C\u4E3A\u56FA\u5316\uFF0C\u89C1 dsmLineage \u6CE8\u91CA\uFF09\u3002\n hideLineage = true\n }\n if (hideLineage) {\n if (row.style.display !== 'none') row.style.display = 'none'\n const d = row.querySelector('[' + DOT + ']'); if (d) d.remove()\n dsmDropSubList(row, id)\n return\n }\n if (row.style.display === 'none') row.style.display = ''\n if (!isEmpty && li && li.parentSession && li.origin !== 'subagent') {\n // fork \u5206\u652F\u884C\uFF1A\u7EFF\u300C\u2442 \u5206\u652F\u300Dchip\uFF0C\u70B9\u51FB\u6EDA\u52A8\u5E76\u9AD8\u4EAE\u7236\u4F1A\u8BDD\u884C\u3002\n if (!row.querySelector('[data-dsm-tag=\"fork\"]')) {\n const fork = document.createElement('button')\n fork.type = 'button'\n fork.dataset.dsmTag = 'fork'\n fork.className = 'dsm-tag dsm-tag-fork'\n const parentTitle = dsmAuthoritativeTitles.get(li.parentSession)\n fork.textContent = '\u2442 \u5206\u652F'\n fork.title = parentTitle ? '\u5206\u652F\u4E8E\uFF1A' + parentTitle : '\u5206\u652F\u4F1A\u8BDD\uFF08\u70B9\u51FB\u67E5\u770B\u6765\u6E90\u4F1A\u8BDD\uFF09'\n fork.setAttribute('aria-label', fork.title)\n fork.addEventListener('click', (e) => {\n e.stopPropagation(); e.preventDefault()\n const rows = document.querySelectorAll('[role=\"treeitem\"]')\n for (const other of rows) {\n if (rowId(other) === li.parentSession) {\n other.scrollIntoView({ block: 'center', behavior: 'smooth' })\n other.classList.add('dsm-row-flash')\n setTimeout(() => other.classList.remove('dsm-row-flash'), 1200)\n break\n }\n }\n })\n row.appendChild(fork)\n }\n } else {\n const staleFork = row.querySelector('[data-dsm-tag=\"fork\"]')\n if (staleFork) staleFork.remove()\n }\n if (!isEmpty && !isSub) {\n const kids = kidsByParent.get(id)\n const existingKids = row.querySelector('[data-dsm-kids]')\n const open = dsmSubsOpen.has(id)\n // \u5FBD\u6807 DOM \u968F\u8840\u7F18\u5E38\u9A7B\uFF0C\u663E\u9690\u4EA4\u7ED9 CSS\uFF08\u9009\u4E2D / \u60AC\u505C / \u952E\u76D8\u805A\u7126\uFF09\u3002\u5DF2\n // \u5C55\u5F00\u7684\u7236\u884C\u52A0 dsm-row-open \u8BA9\u5FBD\u6807\u5E38\u9A7B\u53EF\u89C1\u2014\u2014\u5426\u5219\u5207\u8D70\u4E4B\u540E\u5C31\u518D\u4E5F\n // \u6536\u4E0D\u56DE\u6765\u4E86\u3002\u9690\u85CF\u72B6\u6001\u4E0D\u5360\u4F4D\uFF1A\u6807\u9898\u62FF\u5168\u5BBD\uFF0C\u60AC\u505C\u624D\u8BA9\u4F4D\u7ED9\u5FBD\u6807\u3002\n row.classList.toggle('dsm-row-open', open)\n if (kids) {\n const text = (open ? '\u25BE ' : '\u25B8 ') + kids + ' \u5B50\u4EE3\u7406'\n let badge = existingKids\n if (!badge) {\n badge = document.createElement('button')\n badge.type = 'button'\n badge.dataset.dsmKids = ''\n badge.className = 'dsm-kids-badge'\n badge.addEventListener('click', (e) => {\n e.stopPropagation(); e.preventDefault()\n dsmToggleSubs(badge)\n })\n row.appendChild(badge)\n }\n // \u7236\u4F1A\u8BDD id \u5B58 dataset\u3001\u6BCF\u6B21 paint \u5237\u65B0\uFF1AReact \u590D\u7528\u884C DOM \u65F6\u65E7\u95ED\u5305\n // \u91CC\u7684 id \u53EF\u80FD\u5DF2\u8FC7\u671F\uFF0C\u70B9\u51FB\u65F6\u8BFB dataset \u624D\u4E0D\u4F1A\u5207\u9519\u7236\u4F1A\u8BDD\u3002\n if (badge.dataset.dsmParentId !== id) badge.dataset.dsmParentId = id\n // \u540C\u503C\u8D4B\u503C\u4F1A\u66FF\u6362\u6587\u672C\u8282\u70B9\u3001\u89E6\u53D1 observer\u2014\u2014\u53EA\u5728\u53D8\u5316\u65F6\u5199\u3002\n if (badge.textContent !== text) badge.textContent = text\n const label = (open ? '\u6536\u8D77' : '\u5C55\u5F00') + '\u8BE5\u4F1A\u8BDD\u7684 ' + kids + ' \u4E2A\u5B50\u4EE3\u7406'\n if (badge.getAttribute('aria-label') !== label) {\n badge.setAttribute('aria-label', label)\n badge.title = label\n }\n if (badge.getAttribute('aria-expanded') !== String(open)) badge.setAttribute('aria-expanded', String(open))\n if (open) dsmSyncSubList(row, id)\n else dsmDropSubList(row, id)\n } else {\n // \u6CA1\u6709\u5B50\u4EE3\u7406\uFF1A\u5FBD\u6807\u4E0E\u53EF\u80FD\u6B8B\u7559\u7684\u5B50\u4EE3\u7406\u5BB9\u5668\u4E00\u5E76\u6458\u6389\u3002\n if (existingKids) existingKids.remove()\n dsmDropSubList(row, id)\n }\n } else {\n row.classList.remove('dsm-row-open')\n const staleKids = row.querySelector('[data-dsm-kids]')\n if (staleKids) staleKids.remove()\n }\n // DSH's cold list baseline can expose a stale header title until the\n // Session is opened. Paint the latest log-folded title from the host\n // authority without materializing the Session or changing its log.\n const authoritativeTitle = dsmAuthoritativeTitles.get(id)\n if (!titleInitializedRows.has(row)) {\n const node = rowNode(row) || {}\n const expected = new Set([node.title, node.displayTitle, node.name].filter((value) => typeof value === 'string'))\n const spans = [...row.children].filter((el) => el.tagName === 'SPAN' && !el.querySelector('[data-state]') && (el.textContent || '').trim())\n const titleEl = spans.find((el) => expected.has((el.textContent || '').trim())) || spans[0]\n if (titleEl) {\n const correction = authoritativeTitleForFirstPaint({\n firstPaint: true,\n rendered: titleEl.textContent || '',\n authoritative: authoritativeTitle || '',\n })\n if (correction) titleEl.textContent = correction\n titleInitializedRows.add(row)\n }\n }\n // Read DSH's REAL session status from the row's own StateDot and recolor\n // it with the user's scheme (we also hide DSH's dot so only ours shows).\n const sd = row.querySelector('[data-state]')\n if (sd) sd.style.display = 'none'\n let dot = row.querySelector('[' + DOT + ']')\n const state = dotStateFor({ manualUnread: manualUnread.has(id), dataState: sd ? sd.getAttribute('data-state') : '', isActive: activeId === id })\n const color = state ? COLOR[state] : null\n if (!color) { if (dot) dot.remove(); return }\n if (!dot) {\n dot = document.createElement('span')\n dot.setAttribute(DOT, '')\n dot.className = 'dsm-dot'\n if (!row.hasAttribute('data-dsm-pos')) {\n if (getComputedStyle(row).position === 'static') row.style.position = 'relative'\n row.setAttribute('data-dsm-pos', '')\n }\n dot.addEventListener('click', (e) => {\n e.stopPropagation(); e.preventDefault()\n dsmToggleManual(id)\n })\n row.insertBefore(dot, row.firstChild)\n }\n dot.style.background = color\n })\n dsmSyncEmptyGroups()\n }\n dsmRepaintDots = paint\n const paintToast = (msg, kind) => {\n const t = document.createElement('div')\n t.className = 'dsm-toast' + (kind === 'err' ? ' dsm-toast-err' : '')\n t.textContent = msg\n t.style.cssText = 'position:fixed;left:50%;bottom:24px;transform:translateX(-50%);max-width:80%;padding:8px 14px;border-radius:8px;background:#2C2C2A;color:#F1EFE8;font-size:12px;line-height:1.5;z-index:9999'\n document.body.appendChild(t)\n setTimeout(() => t.remove(), 4200)\n }\n // ---- \u4FA7\u680F\u5C31\u5730\u5C55\u5F00\u5B50\u4EE3\u7406\uFF08issue #6\uFF09------------------------------------\n // DSH \u6309\u8BBE\u8BA1\u4E0D\u6E32\u67D3\u5B50\u4EE3\u7406\u884C\uFF08ui-subagent \u660E\u6587 \"omitted from the ordinary\n // sidebar\"\uFF09\uFF0C\u6240\u4EE5\u63D2\u4EF6\u81EA\u5DF1\u628A\u5B83\u4EEC\u5728\u7236\u884C\u4E0B\u65B9\u8865\u6E32\u67D3\u51FA\u6765\uFF1A\u70B9\u51FB\u5FBD\u6807\u5C31\u5730\u5C55\u5F00\uFF0C\n // \u4E0D\u9700\u8981\u8DF3\u8F6C\u5230\u4EFB\u4F55\u522B\u5904\u3002\u6570\u636E\u6765\u81EA lineage-tree\uFF08\u5B98\u65B9 header \u8840\u7F18 + live\n // \u6807\u8BB0\uFF09\uFF0C\u5E26\u77ED\u671F\u7F13\u5B58\uFF1B\u5220\u9664\u540E\u6574\u8868\u5931\u6548\u91CD\u53D6\u3002\n const DSM_KEY_SUBS = 'dsm-subs-open-v1'\n const dsmSubsOpen = new Set()\n try { for (const id of JSON.parse(localStorage.getItem(DSM_KEY_SUBS) || '[]')) if (typeof id === 'string') dsmSubsOpen.add(id) } catch (e) {}\n const dsmSaveSubsOpen = () => { try { localStorage.setItem(DSM_KEY_SUBS, JSON.stringify([...dsmSubsOpen])) } catch (e) {} }\n const dsmSubTrees = new Map()\n const SUB_TTL_MS = 15000\n async function dsmFetchSubTree(pid) {\n const cached = dsmSubTrees.get(pid)\n if (cached && Date.now() - cached.ts < SUB_TTL_MS) return cached\n dsmSubTrees.set(pid, { ts: Date.now(), status: 'loading', nodes: (cached && cached.nodes) || [] })\n try {\n const r = await postJSON('/archived-sessions/lineage-tree', { sessionId: pid })\n dsmSubTrees.set(pid, { ts: Date.now(), status: 'ready', nodes: (r && r.nodes) || [] })\n } catch (e) {\n dsmSubTrees.set(pid, { ts: Date.now(), status: 'error', nodes: [], error: String((e && e.message) || e) })\n }\n if (dsmRepaintDots) dsmRepaintDots()\n return dsmSubTrees.get(pid)\n }\n async function dsmSubAction(sid, kind) {\n try {\n await postJSON('/archived-sessions/delete', { sessionId: sid })\n if (kind === 'purge') {\n await postJSON('/archived-sessions/trash/purge', { sessionId: sid })\n dsmMarkPurged([sid])\n paintToast('\u5DF2\u5F7B\u5E95\u5220\u9664\u8BE5\u5B50\u4EE3\u7406')\n } else {\n paintToast('\u5DF2\u79FB\u5165\u56DE\u6536\u7AD9')\n }\n // \u4E50\u89C2\u5254\u9664\uFF1A\u670D\u52A1\u7AEF\u91CD\u53D6\u662F\u5F02\u6B65\u7684\uFF08\u4E14 DSH \u7684\u5185\u5B58\u4F1A\u8BDD\u5217\u8868\u53EF\u80FD\u8FD8\u6302\u7740\u521A\u5220\u6389\n // \u7684\u5B50\u4EE3\u7406\uFF09\uFF0C\u5148\u628A\u8FD9\u4E2A id \u4ECE\u6240\u6709\u5DF2\u7F13\u5B58\u7684\u6811\u91CC\u6458\u6389\uFF0C\u7ACB\u523B\u91CD\u7ED8\uFF0C\u4E0D\u7B49\u7F51\u7EDC\u3002\n dsmDropSubagentFromTrees(sid)\n // \u540E\u53F0\u91CD\u53D6\uFF1Aloading \u671F\u95F4\u6CBF\u7528\u4E0A\u4E00\u6B65\u7684\u4E50\u89C2\u7ED3\u679C\uFF08dsmFetchSubTree \u4FDD\u7559\u65E7\n // nodes\uFF09\uFF0C\u65B0\u6570\u636E\u5230\u8FBE\u540E\u518D\u5237\u65B0\u4E00\u6B21\uFF0C\u4E0D\u4F1A\u95EA\u56DE\u300C\u52A0\u8F7D\u4E2D\u300D\u3002\n for (const pid of [...dsmSubTrees.keys()]) dsmFetchSubTree(pid)\n dsmLoadTrashIds()\n if (dsmRepaintDots) dsmRepaintDots()\n } catch (e) { paintToast('\u64CD\u4F5C\u5931\u8D25\uFF1A' + String((e && e.message) || e)) }\n }\n // \u4ECE\u6240\u6709\u7F13\u5B58\u7684\u5B50\u4EE3\u7406\u6811\u91CC\u9012\u5F52\u6458\u6389\u4E00\u4E2A id\uFF08\u542B\u5B83\u7684\u6574\u68F5\u5B50\u6811\uFF09\u3002\n function dsmDropSubagentFromTrees(sid) {\n const target = String(sid)\n const prune = (nodes) => (nodes || []).filter((n) => String(n.sessionId) !== target).map((n) => ({ ...n, children: prune(n.children) }))\n for (const [pid, rec] of dsmSubTrees) {\n if (!rec || !Array.isArray(rec.nodes)) continue\n dsmSubTrees.set(pid, { ...rec, nodes: prune(rec.nodes) })\n }\n }\n function dsmToggleSubs(badge) {\n const pid = badge && badge.dataset ? badge.dataset.dsmParentId : null\n if (!pid) return\n if (sidebarAdapter.disabled) {\n paintToast('\u4FA7\u680F\u9002\u914D\u5668\u5DF2\u505C\u7528\uFF08\u4E0A\u6E38\u7ED3\u6784\u53D8\u5316\uFF09\uFF0C\u8BF7\u6539\u4ECE \u8BBE\u7F6E \u2192 \u4F1A\u8BDD\u7BA1\u7406 \u67E5\u770B\u5B50\u4EE3\u7406')\n return\n }\n if (dsmSubsOpen.has(pid)) { dsmSubsOpen.delete(pid); dsmSubTrees.delete(pid) } else { dsmSubsOpen.add(pid) }\n dsmSaveSubsOpen()\n if (dsmRepaintDots) dsmRepaintDots()\n }\n function dsmDropSubList(row, pid) {\n const parent = row.parentNode\n if (!parent) return\n for (const el of parent.children) {\n if (el.getAttribute && el.getAttribute('data-dsm-subs') === pid) { el.remove(); break }\n }\n }\n // \u628A\u67D0\u7236\u4F1A\u8BDD\u7684\u5B50\u4EE3\u7406\u6811\u540C\u6B65\u5230\u5B83\u4E0B\u65B9\u3002\u5168\u7A0B\u5E42\u7B49\uFF1A\u5BB9\u5668\u53EA\u5728\u7F3A\u5931\u65F6\u521B\u5EFA\uFF0C\u5185\u5BB9\n // \u53EA\u5728\u7B7E\u540D\u53D8\u5316\u65F6\u91CD\u5199\u2014\u2014\u5426\u5219\u81EA\u5DF1\u7684\u5199\u5165\u4F1A\u518D\u6B21\u89E6\u53D1 MutationObserver \u6B7B\u5FAA\u73AF\u3002\n function dsmSyncSubList(row, pid) {\n const parent = row.parentNode\n if (!parent) return\n const open = dsmSubsOpen.has(pid)\n let box = null\n for (const el of parent.children) {\n if (el.getAttribute && el.getAttribute('data-dsm-subs') === pid) { box = el; break }\n }\n if (!open) { if (box) box.remove(); return }\n const rec = dsmSubTrees.get(pid)\n if (!rec) { dsmFetchSubTree(pid); return }\n if (!box) {\n box = document.createElement('div')\n box.setAttribute('data-dsm-subs', pid)\n box.className = 'dsm-subs'\n parent.insertBefore(box, row.nextSibling)\n } else if (box.nextElementSibling !== row.nextSibling && box.previousElementSibling !== row) {\n // React \u91CD\u6392\u540E\u5BB9\u5668\u53EF\u80FD\u4E0D\u5728\u539F\u4F4D\uFF1A\u642C\u56DE\u7236\u884C\u4E0B\u65B9\u3002\n parent.insertBefore(box, row.nextSibling)\n }\n const flat = []\n const walk = (nodes, depth) => { for (const n of nodes || []) { flat.push([n, depth]); if (depth < 4) walk(n.children, depth + 1) } }\n walk(rec.nodes, 0)\n const sig = rec.status + '|' + flat.map(([n, d]) => [n.sessionId, n.title, n.live ? 1 : 0, n.sizeBytes, d].join(':')).join(';')\n if (box.dataset.dsmSig === sig) return\n box.dataset.dsmSig = sig\n box.textContent = ''\n if (rec.status === 'loading' && !flat.length) {\n const p = document.createElement('div'); p.className = 'dsm-sub-note'; p.textContent = '\u52A0\u8F7D\u5B50\u4EE3\u7406\u2026'; box.appendChild(p); return\n }\n if (rec.status === 'error') {\n const p = document.createElement('div'); p.className = 'dsm-sub-note'; p.textContent = '\u5B50\u4EE3\u7406\u52A0\u8F7D\u5931\u8D25\uFF1A' + (rec.error || '\u672A\u77E5\u9519\u8BEF'); box.appendChild(p); return\n }\n if (!flat.length) {\n const p = document.createElement('div'); p.className = 'dsm-sub-note'; p.textContent = '\u8BE5\u4F1A\u8BDD\u6CA1\u6709\u5B50\u4EE3\u7406'; box.appendChild(p); return\n }\n const canPurgeSub = dsmActionCapability('physicalPurge', 'purge')\n for (const [n, depth] of flat) {\n const r = document.createElement('div')\n r.className = 'dsm-sub-row' + (n.live ? ' dsm-sub-live' : '')\n r.style.paddingLeft = String(14 + depth * 12) + 'px'\n // \u6574\u884C\u53EF\u70B9\uFF1A\u8D70\u5B98\u65B9 sessions.open / openSubagent \u6253\u5F00\u8FD9\u4E2A\u5B50\u4EE3\u7406\u4F1A\u8BDD\u3002\n // \u884C\u5185\u6309\u94AE\u81EA\u5DF1 stopPropagation\uFF0C\u4E0D\u4F1A\u8BEF\u89E6\u53D1\u3002\n r.title = '\u6253\u5F00\u8FD9\u4E2A\u5B50\u4EE3\u7406\u4F1A\u8BDD'\n r.addEventListener('click', async () => {\n const res = await dsmOpenSessionById(n.sessionId, n.parentSession || pid)\n if (res === 'ok') return\n const msg = openSubagentToast(res, n.title, 'sidebar')\n paintToast(msg.text, msg.kind)\n })\n const name = document.createElement('span')\n name.className = 'dsm-sub-name'\n name.textContent = n.title || (String(n.sessionId).slice(0, 8) + '\u2026')\n name.title = n.sessionId\n r.appendChild(name)\n const meta = document.createElement('span')\n meta.className = 'dsm-sub-meta'\n meta.textContent = n.live ? '\u8FD0\u884C\u4E2D' : (fmtBytes(n.sizeBytes) || '\u5DF2\u7ED3\u675F')\n r.appendChild(meta)\n const acts = document.createElement('span')\n acts.className = 'dsm-sub-acts'\n const del = document.createElement('button')\n del.type = 'button'\n del.className = 'dsm-sub-btn'\n del.textContent = '\u5220\u9664'\n del.title = '\u79FB\u5165\u56DE\u6536\u7AD9\uFF0C\u53EF\u5728\u56DE\u6536\u7AD9\u6062\u590D'\n del.addEventListener('click', (e) => { e.stopPropagation(); e.preventDefault(); dsmSubAction(n.sessionId, 'delete') })\n acts.appendChild(del)\n // \u5F7B\u5E95\u5220\u9664\u662F\u7834\u574F\u6027\u64CD\u4F5C\uFF0C\u53EA\u653E\u5728\u4F1A\u8BDD\u7BA1\u7406\u9762\u677F\u91CC\uFF08\u90A3\u91CC\u6709\u4E8C\u6B21\u786E\u8BA4\u3001\u56DE\u6536\u7AD9\n // \u4E0E\u5893\u7891\u4E00\u6574\u5957\u5B89\u5168\u7F51\uFF09\u3002\u4FA7\u680F\u53EA\u63D0\u4F9B\u300C\u5220\u9664\u300D\uFF08\u8FDB\u56DE\u6536\u7AD9\uFF0C\u53EF\u6062\u590D\uFF09\u3002\n r.appendChild(acts)\n box.appendChild(r)\n }\n }\n // MutationObserver \u589E\u91CF\u9A71\u52A8\u4E3A\u4E3B\uFF08childList + \u5C5E\u6027 + \u6587\u672C\uFF09\uFF0C\u5F7B\u5E95\u66FF\u4EE3\u9AD8\u9891\u7387\n // \u5168\u8868\u5B9A\u65F6\u626B\u63CF\uFF1B\u4FDD\u7559\u4E00\u4E2A\u4F4E\u9891\u515C\u5E95 tick \u5904\u7406\u65E0 DOM \u53D8\u5316\u7684\u72B6\u6001\u8FC1\u79FB\uFF0C\u4E14\u540E\u53F0\n // \u6807\u7B7E\u9875\u5B8C\u5168\u4E0D\u8DD1\u3002\u56DE\u6536\u7AD9/\u5893\u7891\u96C6\u5408\u7684\u5237\u65B0\u4E5F\u6302\u5728\u8FD9\u4E2A\u515C\u5E95\u4E0A\uFF08\u6BCF 8 \u62CD \u2248 32s\uFF09\u3002\n let raf = 0\n const schedulePaint = () => { if (raf) return; raf = requestAnimationFrame(() => { raf = 0; paint() }) }\n const FALLBACK_TICK_MS = 4000\n const tick = () => {\n if (typeof document !== 'undefined' && document.hidden) return\n if (++dsmTrashTick % 8 === 0) dsmLoadTrashIds()\n paint()\n }\n tick()\n dsmLoadTrashIds()\n paint()\n const obs = new MutationObserver(schedulePaint)\n obs.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['data-state', 'aria-selected', 'class', 'style'],\n characterData: true,\n })\n const tickTimer = setInterval(tick, FALLBACK_TICK_MS)\n // \u63D2\u4EF6\u5378\u8F7D\uFF08HMR / \u505C\u7528\uFF09\u65F6\u6574\u573A\u6E05\u9000\uFF1A\u6CA1\u6709\u8FD9\u4E00\u6B65\uFF0Cinterval \u548C observer \u4F1A\n // \u8DDF\u7740\u65E7\u95ED\u5305\u6D3B\u5230\u9875\u9762\u5173\u95ED\uFF0C\u6CE8\u5165\u8282\u70B9\u4E5F\u4F1A\u7559\u5728\u4FA7\u680F\u4E0A\u3002\n return () => {\n clearInterval(tickTimer)\n obs.disconnect()\n dsmTeardownSidebarAug()\n }\n}\n\n// Cross-workspace drag/drop for the native DSH sidebar. DSH does not expose a\n// sidebar-row plugin slot, so the adapter discovers session/workspace rows from\n// their React fiber nodes, while the actual move remains entirely host-owned.\n// The existing \u201C\u79FB\u52A8\u4F1A\u8BDD\u201D menu is also the keyboard-accessible fallback.\n// \u540C\u4E0A\uFF1A\u62D6\u62FD\u589E\u5F3A\u7684\u89C2\u5BDF\u5668 / interval / document \u7EA7 pointerdown|drag* \u76D1\u542C\u5668\u53EA\u88C5\u4E00\u4EFD\u3002\nlet sidebarDragInstalled = false\nfunction installSidebarWorkspaceDrag() {\n if (typeof document === 'undefined') return\n if (sidebarDragInstalled) return\n sidebarDragInstalled = true\n let sessions = new Map()\n let dragging = null\n let moving = false\n\n // \u8BC6\u522B\u7EDF\u4E00\u8D70 sidebarAdapter\uFF08\u53EF\u7248\u672C\u5316\u3001\u53EF\u6574\u4F53\u964D\u7EA7\uFF09\uFF1Badapter \u505C\u7528\u540E\u62D6\u62FD\n // \u884C\u4E3A\u6574\u4F53\u9000\u51FA\uFF0C\u4E0D\u6B8B\u7559\u5728\u5B98\u65B9\u4FA7\u680F\u4E0A\u3002\n const sessionForRow = (row) => {\n const { node, group } = sidebarAdapter.recognize(row)\n return sessionForNodes(group ? [node, group].filter(Boolean) : [node], sessions)\n }\n const workspaceForRow = (row) => {\n // A session row's fiber chain also contains its parent workspace node.\n // Reject it explicitly so only the visible workspace header is a drop zone.\n if (sessionForRow(row)) return null\n const { group } = sidebarAdapter.recognize(row)\n return group ? workspaceForNodes([group]) : null\n }\n const eventRow = (event) => {\n for (const item of event.composedPath ? event.composedPath() : []) {\n if (item instanceof Element && item.getAttribute('role') === 'treeitem') return item\n }\n return event.target instanceof Element ? event.target.closest('[role=\"treeitem\"]') : null\n }\n const toast = (message) => {\n const el = document.createElement('div')\n el.className = 'dsm-toast'\n el.setAttribute('role', 'status')\n el.textContent = message\n document.body.appendChild(el)\n setTimeout(() => el.remove(), 2600)\n }\n const clearVisuals = () => {\n document.querySelectorAll('.dsm-drag-source,.dsm-drop-target').forEach((el) => el.classList.remove('dsm-drag-source', 'dsm-drop-target'))\n }\n const decorateRows = () => {\n if (sidebarAdapter.disabled) return\n document.querySelectorAll('[role=\"treeitem\"]').forEach((row) => {\n const session = sessionForRow(row)\n const ws = workspaceForRow(row)\n if (session) {\n row.setAttribute('aria-description', '\u53EF\u62D6\u52A8\u5230\u5176\u4ED6\u5DE5\u4F5C\u533A\uFF1B\u952E\u76D8\u7528\u6237\u53EF\u901A\u8FC7\u66F4\u591A\u83DC\u5355\u4E2D\u7684\u79FB\u52A8\u4F1A\u8BDD\u64CD\u4F5C')\n }\n if (ws) row.setAttribute('data-dsm-workspace-drop', '')\n })\n }\n const refresh = async () => {\n try {\n const sessionResult = await postJSON('/archived-sessions/sessions', {})\n sessions = new Map((sessionResult.items || []).map((item) => [String(item.sessionId), item]))\n decorateRows()\n } catch (e) { /* sidebar enhancement remains optional */ }\n }\n\n // Capture before DSH's delegated React handlers. DSH reserves the same\n // native drag gesture for reordering sessions inside one group; only a real\n // workspace-heading target is intercepted here, so same-group sorting keeps\n // its official behavior.\n // \u6307\u9488\u6309\u4E0B\u5148\u4E8E dragstart \u6570\u5341\u5230\u6570\u767E\u6BEB\u79D2\uFF0C\u6B63\u597D\u7528\u6765\u7ED9\u300CMap \u91CC\u8FD8\u6CA1\u6709\u7684\u884C\u300D\u9884\u70ED\uFF1A\n // replace the 5s poll with a just-in-time fetch, so a brand-new session is\n // draggable on the first gesture without a background poll.\n document.addEventListener('pointerdown', (event) => {\n if (moving) return\n const row = eventRow(event)\n if (!row || sessionForRow(row)) return\n maybeRefresh()\n }, true)\n\n document.addEventListener('dragstart', (event) => {\n if (sidebarAdapter.disabled) return\n const moveCapability = dsmActionCapability('relocateSession') || dsmActionCapability('move')\n if (!moveCapability || !moveCapability.available) return\n const row = eventRow(event)\n const item = row && sessionForRow(row)\n if (!item || moving) return\n dragging = item\n row.classList.add('dsm-drag-source')\n }, true)\n document.addEventListener('dragover', (event) => {\n const row = eventRow(event)\n const target = row && workspaceForRow(row)\n if (!dragging || !target || moving) return\n if (!canDropOnWorkspace(dragging, target)) return\n event.preventDefault()\n event.stopPropagation()\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'move'\n document.querySelectorAll('.dsm-drop-target').forEach((el) => { if (el !== row) el.classList.remove('dsm-drop-target') })\n row.classList.add('dsm-drop-target')\n }, true)\n document.addEventListener('drop', async (event) => {\n const row = eventRow(event)\n const item = dragging\n const target = row && workspaceForRow(row)\n if (!item || !target || moving || !canDropOnWorkspace(item, target)) return\n event.preventDefault()\n event.stopPropagation()\n moving = true\n clearVisuals()\n row.classList.add('dsm-drag-busy')\n try {\n const result = await postJSON('/archived-sessions/move', { sessionId: item.sessionId, targetPath: target.path })\n // \u4F1A\u8BDD\u88AB DSH \u6253\u5F00\u65F6\u670D\u52A1\u7AEF\u53EA\u767B\u8BB0\u6392\u961F\uFF1A\u78C1\u76D8\u4E0E\u5DE5\u4F5C\u533A\u5206\u7EC4\u90FD\u6CA1\u52A8\u3002\u8FD9\u6761\u8DEF\u5F84\u7EDD\u4E0D\u80FD\n // \u672C\u5730\u6539\u884C + \u62A5\u6210\u529F\u2014\u2014\u90A3\u4F1A\u8BA9\u7528\u6237\u4EE5\u4E3A\u79FB\u52A8\u5DF2\u5B8C\u6210\uFF0C\u800C\u4FA7\u680F\u5237\u65B0\u540E\u8BE5\u884C\u53C8\u8DF3\u56DE\u539F\u5DE5\u4F5C\u533A\n //\uFF08\u7528\u6237 2026-09-10 \u62A5\u7684\u300C\u8BF4\u79FB\u52A8\u6210\u529F\u4F46\u8FD8\u5728\u539F\u5DE5\u4F5C\u533A\u300D\u5C31\u662F\u8FD9\u4E2A\uFF09\u3002\u6392\u961F\u65F6\u53EA\u5982\u5B9E\u8BF4\u660E\u3002\n if (result && result.queued) {\n await dsmLoadTrashIds()\n toast(result.notes && result.notes.length ? result.notes.join(' ') : '\u4F1A\u8BDD\u6B63\u88AB DSH \u6253\u5F00\uFF0C\u5DF2\u6392\u961F\u5F85\u79FB\u52A8\uFF1B\u91CD\u542F DSH \u540E\u4F1A\u81EA\u52A8\u5B8C\u6210\uFF08\u8BF7\u5148\u522B\u6253\u5F00\u5B83\uFF09\u3002')\n return\n }\n sessions.set(item.sessionId, { ...item, workspacePath: result.workspacePath || target.path, workspaceTitle: result.workspaceTitle || target.title })\n await dsmLoadTrashIds()\n toast(result && result.already\n ? `\u5DF2\u5728\u300C${result.workspaceTitle || target.title}\u300D`\n : `\u5DF2\u79FB\u5230\u300C${result.workspaceTitle || target.title}\u300D`)\n } catch (error) {\n toast('\u79FB\u52A8\u5931\u8D25\uFF1A' + String((error && error.message) || error))\n } finally {\n moving = false\n dragging = null\n row.classList.remove('dsm-drag-busy')\n decorateRows()\n }\n }, true)\n document.addEventListener('dragend', () => {\n dragging = null\n clearVisuals()\n }, true)\n\n let decorateTimer = null\n const scheduleDecorate = () => {\n if (decorateTimer) return\n decorateTimer = requestAnimationFrame(() => { decorateTimer = null; decorateRows() })\n }\n refresh()\n const observer = new MutationObserver(scheduleDecorate)\n observer.observe(document.body, { childList: true, subtree: true })\n // \u539F\u5148\u8FD9\u91CC\u6BCF 5s \u65E0\u8111\u5168\u8868\u5237\u65B0\u4E00\u6B21\u3002\u8BE5\u63A5\u53E3\u5728 host \u4FA7\u8981\u904D\u5386\u5168\u90E8\u4F1A\u8BDD\uFF0C\n // \u5927\u5E93\uFF08issue #1: 49 \u4F1A\u8BDD / 14 \u4E07\u5E27\uFF09\u4E0A\u6BCF\u6B21\u90FD\u662F\u4E00\u6B21\u91CD\u6D3B\uFF0C\u9875\u9762\u6302\u7740\u5C31\u4E00\u76F4\u5360\u5BBF\u4E3B CPU\uFF0C\n // \u8FDE\u7D2F session.history \u4E4B\u7C7B RPC \u8D85\u65F6\u3002\u62D6\u62FD\u5143\u6570\u636E\u6839\u672C\u4E0D\u9700\u8981 5s \u7CBE\u5EA6\uFF1A\n // - \u80CC\u666F\u6807\u7B7E\u9875\u5B8C\u5168\u4E0D\u5237\u65B0\n // - \u524D\u53F0\u6BCF 60s \u515C\u5E95\u4E00\u6B21\n // - \u6807\u7B7E\u9875\u91CD\u65B0\u53EF\u89C1\u3001\u6216\u771F\u6B63\u5F00\u59CB\u62D6\u62FD\u800C Map \u91CC\u6CA1\u6709\u8BE5\u884C\u65F6\uFF0C\u6309\u9700\u5237\u65B0\n let lastRefreshAt = Date.now()\n const maybeRefresh = () => {\n if (typeof document !== 'undefined' && document.hidden) return\n lastRefreshAt = Date.now()\n return refresh()\n }\n const REFRESH_MS = 60000\n setInterval(() => {\n if (typeof document !== 'undefined' && document.hidden) return\n if (Date.now() - lastRefreshAt < REFRESH_MS) return\n maybeRefresh()\n }, REFRESH_MS)\n if (typeof document !== 'undefined' && document.addEventListener) {\n document.addEventListener('visibilitychange', () => {\n if (document.hidden) return\n if (Date.now() - lastRefreshAt < 30000) return\n maybeRefresh()\n })\n }\n}\n\nexport function apply(ctx) {\n dsmClientCtx = ctx\n dsmLoadCapabilities()\n installSettingsNavIcons(ctx)\n installSidebarSessionMenuAug()\n // \u4FA7\u680F\u589E\u5F3A\u7684\u5378\u8F7D\u6E05\u9000\u6302\u5230 cordis effect\uFF1A\u63D2\u4EF6\u505C\u7528/HMR \u65F6 interval\u3001\n // MutationObserver \u4E0E\u5168\u90E8\u6CE8\u5165 DOM \u4E00\u5E76\u56DE\u6536\uFF08\u5426\u5219\u6CC4\u6F0F\u5230\u9875\u9762\u5173\u95ED\uFF09\u3002\n const disposeSidebarDots = installSidebarStatusDots()\n if (disposeSidebarDots) ctx.effect(() => disposeSidebarDots)\n installSidebarWorkspaceDrag()\n const workspacesSvc = ctx.get('workspaces')\n ctx.slots.inject('settings.section', () =>\n ctx.slots.register(\n { name: 'settings.section', id: 'session-manager', order: 90, label: '\u4F1A\u8BDD\u7BA1\u7406' },\n (props) => <SessionPanel {...props} workspacesSvc={workspacesSvc} />,\n ),\n )\n}\n", "// dsh-sessions-manager \u2014 client \u7EAF\u5224\u5B9A\u903B\u8F91\u3002\n//\n// \u4FA7\u680F\u589E\u5F3A\u91CC\u6700\u5BB9\u6613\u968F DSH \u4E0A\u6E38\u53D8\u5316\u51FA\u56DE\u5F52\u7684\u4E09\u5757\u5224\u5B9A\u62BD\u5230\u8FD9\u91CC\uFF1A\n// \u72B6\u6001\u70B9\u8BED\u4E49\u3001\u62D6\u62FD\u53EF\u653E\u7F6E\u6821\u9A8C\u3001fiber node \u2192 \u4F1A\u8BDD/\u5DE5\u4F5C\u533A\u8BC6\u522B\u3002\n// \u672C\u6A21\u5757\u4E0D\u78B0 DOM\uFF0Cnode --test \u76F4\u63A5\u53EF\u6D4B\uFF08tests/client-logic.test.js\uFF09\u3002\n\n// \u72B6\u6001\u70B9\u8BED\u4E49\uFF1Amanual \u672A\u8BFB\u6700\u9AD8\u4F18\u5148\uFF1Bdone \u5728\u5F53\u524D\u67E5\u770B\u7684\u884C\u4E0A\u4E0D\u4EAE\u7EFF\n// \uFF08\u8BFB\u8FC7\u5373\u89C6\u4E3A\u5DF2\u8BFB\uFF09\u3002\u8FD4\u56DE\u903B\u8F91\u6001\u540D\uFF0C\u989C\u8272\u6620\u5C04\u7559\u5728 UI \u5C42\u3002\n// \u5386\u53F2\u56DE\u5F52\uFF1ADSH \u66FE\u628A running \u62A5\u4E3A ongoing\uFF089766476\uFF09\uFF0C\u4E0A\u6E38\u679A\u4E3E\u53D8\u5316\u8981\u76EF\u8FD9\u91CC\u3002\n// issue #4\uFF1A\u4E0A\u6E38\u8FD8\u5B58\u5728 waiting / needs-attention \u7B49\u540C\u4E49\u8BCD\uFF0C\u8FD9\u91CC\u6536\u655B\u5230\u540C\u4E00\n// \u903B\u8F91\u6001\uFF0C\u989C\u8272\u6620\u5C04\u4ECD\u7531 UI \u5C42\u7EDF\u4E00\u5904\u7406\uFF08issue \u4FDD\u6301 open \u76F4\u5230\u4E0A\u6E38\u786E\u8BA4\uFF09\u3002\nexport function dotStateFor({ manualUnread = false, dataState = '', isActive = false } = {}) {\n if (manualUnread) return 'manual'\n switch (dataState) {\n case 'ongoing':\n case 'running': return 'running'\n case 'warning':\n case 'waiting':\n case 'needs-attention': return 'feedback'\n case 'error': return 'error'\n case 'done': return isActive ? null : 'done'\n default: return null\n }\n}\n\n// \u6743\u5A01\u6807\u9898\u53EA\u4FEE\u6B63\u65B0\u51FA\u73B0 DOM \u884C\u7684\u51B7\u6001\u6807\u9898\u3002\u884C\u4E00\u65E6\u5B8C\u6210\u9996\u6B21 paint\uFF0C\u540E\u7EED\u6587\u672C\n// \u53D8\u5316\u5C5E\u4E8E DSH Core \u7684\u5B9E\u65F6\u66F4\u65B0\uFF08\u4F8B\u5982\u91CD\u547D\u540D\uFF09\uFF0C\u63D2\u4EF6\u4E0D\u5F97\u518D\u7528\u8F6E\u8BE2\u5FEB\u7167\u8986\u76D6\u3002\nexport function authoritativeTitleForFirstPaint({ firstPaint = false, rendered = '', authoritative = '' } = {}) {\n if (!firstPaint || !authoritative || rendered === authoritative) return null\n return authoritative\n}\n\n// \u62D6\u62FD\u8FC1\u79FB\u524D\u7F6E\u6821\u9A8C\uFF1A\u540C\u5DE5\u4F5C\u533A\u62E6\u622A\uFF08workspacePath \u76F8\u7B49\u5373\u62D2\u7EDD\uFF09\u3002\n// \u65E0 workspacePath \u7684\u4F1A\u8BDD\uFF08\u5982\u4FA7\u680F live \u884C\u5C1A\u672A\u540C\u6B65\uFF09\u653E\u884C\uFF0C\u7531 host \u6700\u7EC8\u88C1\u51B3\u3002\nexport function canDropOnWorkspace(item, target) {\n if (!item || !target) return false\n if (item.workspacePath && target.path === item.workspacePath) return false\n return true\n}\n\n// \u4ECE React fiber \u94FE\u6536\u96C6\u5230\u7684 node \u6570\u7EC4\u8BC6\u522B\u4F1A\u8BDD\u884C\u3002knownSessions \u662F\n// host /archived-sessions/sessions \u7684\u6743\u5A01\u8868\uFF1Blive \u884C\uFF08\u8FD8\u6CA1\u540C\u6B65\u5230\u6743\u5A01\u8868\uFF09\n// \u7528\u542F\u53D1\u5F0F\u515C\u5E95\uFF1A\u6709 id\u3001\u4E0D\u662F\u5DE5\u4F5C\u533A\u5206\u7EC4\uFF08\u65E0 workspaceId\uFF09\u3001\u4E14\u5E26\u6807\u9898/\u65F6\u95F4\u3002\nexport function sessionForNodes(nodes, knownSessions) {\n for (const node of nodes || []) {\n const id = node && node.id != null ? String(node.id) : ''\n if (knownSessions.has(id)) return knownSessions.get(id)\n // DSH \u7684\u884C\u8282\u70B9\u6709 id\uFF1B\u5DE5\u4F5C\u533A\u5206\u7EC4\u7528 workspaceId\u3001\u4ECE\u4E0D\u7528\u88F8 id\u3002\n if (id && node.workspaceId == null && (node.title != null || node.updatedAt != null || node.blank != null)) {\n return { sessionId: id, title: node.title || '', workspacePath: null }\n }\n }\n return null\n}\n\n// \u4ECE fiber node \u6570\u7EC4\u8BC6\u522B\u53EF\u89C1\u7684\u5DE5\u4F5C\u533A\u6807\u9898\u884C\uFF08\u53EF\u653E\u7F6E\u76EE\u6807\uFF09\u3002\n// \u4F1A\u8BDD\u884C\u7684 fiber \u94FE\u4E5F\u4F1A\u5E26\u51FA\u7236\u5DE5\u4F5C\u533A\u8282\u70B9\uFF0C\u8C03\u7528\u65B9\u987B\u5148\u7528 sessionForNodes \u62E6\u622A\u3002\nexport function workspaceForNodes(nodes) {\n for (const group of nodes || []) {\n if (group && group.workspaceId != null && typeof group.cwd === 'string' && group.cwd) {\n return { workspaceId: String(group.workspaceId), path: group.cwd, title: group.label || group.cwd }\n }\n }\n return null\n}\n\n// \u6536\u85CF\u8FC7\u6EE4\uFF1A\u8FD4\u56DE\u5DF2\u6536\u85CF\u5B50\u96C6\u3002star \u662F\u7528\u6237\u6807\u8BB0\uFF0C\u4E0E DSH \u7684\u6D3B\u52A8/\u5F52\u6863\u72B6\u6001\u6B63\u4EA4\n// \uFF08\u53EF\u53E0\u52A0\uFF09\uFF0C\u6240\u4EE5\u8FD9\u91CC\u4E0D\u505A\u4EFB\u4F55\u72B6\u6001\u8054\u5408\u5224\u65AD\uFF0C\u53EA\u8BA4 starred \u5B57\u6BB5\u3002\nexport function starredOf(items) {\n return (items || []).filter((item) => item && item.starred)\n}\n\n// \u8840\u7F18\u6298\u53E0\uFF1A\u628A origin === 'subagent' \u7684\u4F1A\u8BDD\u6302\u5230\u7236\u4F1A\u8BDD\u4E0B\uFF0C\u8FD4\u56DE\u9876\u5C42\u5217\u8868 + \u7236\u5B50\n// \u6620\u5C04 + \u6298\u53E0\u6570\u91CF\u3002\n//\n// \u5173\u952E\u7EA6\u675F\uFF1A\u4ECE\u9876\u5C42\u79FB\u9664\u7684\u662F\u300C\u5B50\u4EE3\u7406\u81EA\u5DF1\u300D\uFF0C\u7236\u4F1A\u8BDD\u5FC5\u987B\u4FDD\u7559\u5728\u9876\u5C42\u2014\u2014\u6298\u53E0\u6309\u94AE\u5C31\n// \u6E32\u67D3\u5728\u7236\u4F1A\u8BDD\u5361\u7247\u91CC\uFF0C\u7236\u4E00\u65E6\u88AB\u4E00\u8D77\u8FC7\u6EE4\u6389\uFF0C\u754C\u9762\u4E0A\u5C31\u53EA\u5269\u5E73\u94FA\u7684\u5B50\u4EE3\u7406\uFF0C\u770B\u8D77\u6765\n// \u50CF\u300C\u6298\u53E0\u5B8C\u5168\u6CA1\u751F\u6548\u300D\u3002\n// \u7236\u4F1A\u8BDD\u4E0D\u5728\u5F53\u524D\u5217\u8868\uFF08\u88AB\u7B5B\u9009\u6389 / \u5DF2\u5220\u9664\uFF09\u65F6\u5B50\u4EE3\u7406\u4FDD\u6301\u5728\u9876\u5C42\uFF0C\u4FDD\u8BC1\u641C\u5F97\u5230\u5C31\n// \u770B\u5F97\u89C1\u3002\nexport function foldSubagents(items, lineage) {\n const list = items || []\n const table = lineage || {}\n const kidsOf = new Map()\n const foldedIds = new Set()\n const byId = new Map()\n for (const item of list) byId.set(String(item.sessionId), item)\n for (const item of list) {\n const id = String(item.sessionId)\n const info = table[id]\n const parentId = info && info.origin === 'subagent' && info.parentSession ? String(info.parentSession) : null\n if (!parentId || parentId === id || !byId.has(parentId)) continue\n if (!kidsOf.has(parentId)) kidsOf.set(parentId, [])\n kidsOf.get(parentId).push(item)\n foldedIds.add(id)\n }\n return {\n topList: foldedIds.size ? list.filter((item) => !foldedIds.has(String(item.sessionId))) : list,\n kidsOf,\n foldedCount: foldedIds.size,\n }\n}\n\n// \u5217\u8868\u91CC\u53EA\u663E\u793A\u4F1A\u8BDD ID \u7684\u77ED\u7247\u6BB5\u3002\u5B8C\u6574 UUID \u6709 36 \u4E2A\u5B57\u7B26\uFF0C\u585E\u8FDB meta \u884C\u4F1A\u628A\u6574\n// \u884C\u6491\u5230\u6362\u884C\u3001\u5361\u7247\u9AD8\u5EA6\u8DDF\u7740\u6D6E\u52A8\u2014\u2014\u77ED ID \u662F\u300C\u5217\u8868\u5B9A\u9AD8\u300D\u7684\u524D\u63D0\u4E4B\u4E00\u3002\u5B8C\u6574\u503C\u4FDD\u7559\n// \u5728 title \u5C5E\u6027\u4E0E\u8BE6\u60C5\u9762\u677F\u91CC\uFF0C\u4FE1\u606F\u4E0D\u4E22\u3002\nexport function shortId(id) {\n const raw = String(id == null ? '' : id)\n const tail = raw.startsWith('session-') ? raw.slice(8) : raw\n if (!tail) return ''\n return tail.length <= 10 ? tail : tail.slice(0, 8) + '\u2026'\n}\n\n// \u6253\u5F00\u5B50\u4EE3\u7406\u4E4B\u540E\u7684\u63D0\u793A\u6587\u6848\u3002\u4E09\u79CD\u7ED3\u679C\u8981\u4F20\u8FBE\u4E09\u4EF6\u4E0D\u540C\u7684\u4E8B\uFF0C\u6DF7\u6210\u4E00\u53E5\u300C\u6253\u4E0D\u5F00\u300D\n// \u4F1A\u8BA9\u4EBA\u65E2\u4E0D\u77E5\u9053\u539F\u56E0\u3001\u4E5F\u4E0D\u77E5\u9053\u4E0B\u4E00\u6B65\uFF1A\n// ok \u2192 \u5DF2\u7ECF\u5207\u8FC7\u53BB\u4E86\uFF1B\u5728\u8BBE\u7F6E\u9762\u677F\u91CC\u4F1A\u8BDD\u533A\u88AB\u6321\u7740\uFF0C\u5F97\u63D0\u9192\u5173\u6389\u624D\u770B\u5F97\u5230\n// no-service \u2192 \u8FD9\u4E2A runtime \u6CA1\u5F00\u653E\u4F1A\u8BDD\u5207\u6362\u63A5\u53E3\uFF0C\u53EA\u80FD\u624B\u52A8\u5207\n// failed \u2192 \u81EA\u52A8\u5207\u6362\u6CA1\u6210\u529F\uFF0C\u7ED9\u51FA\u786E\u5B9A\u53EF\u8D70\u7684\u66FF\u4EE3\u8DEF\u5F84\uFF08\u4FA7\u680F\u7236\u4F1A\u8BDD\u5934\u90E8\u7684\n// \u300C/ N\u300D\u5B98\u65B9\u5B50\u4EE3\u7406\u76EE\u5F55\uFF09\n// where: 'panel'\uFF08\u8BBE\u7F6E\u9762\u677F\u5185\uFF09| 'sidebar'\uFF08\u4FA7\u680F\u6CE8\u5165\u884C\uFF09\nexport function openSubagentToast(result, name, where) {\n const label = name || '\u5B50\u4EE3\u7406'\n if (result === 'ok') {\n return {\n kind: 'ok',\n text: where === 'sidebar' ? `\u5DF2\u6253\u5F00\u300C${label}\u300D` : `\u5DF2\u6253\u5F00\u300C${label}\u300D\u2014 \u5173\u6389\u8BBE\u7F6E\u5373\u53EF\u770B\u5230`,\n }\n }\n if (result === 'no-service') {\n return { kind: 'err', text: '\u8FD9\u4E2A DSH \u7248\u672C\u6CA1\u6709\u5F00\u653E\u4F1A\u8BDD\u5207\u6362\u63A5\u53E3\uFF0C\u8BF7\u5728\u4FA7\u8FB9\u680F\u624B\u52A8\u5207\u6362' }\n }\n return {\n kind: 'err',\n text: where === 'sidebar'\n ? '\u6253\u4E0D\u5F00\u8FD9\u4E2A\u5B50\u4EE3\u7406\uFF1A\u8BF7\u9009\u4E2D\u5B83\u7684\u7236\u4F1A\u8BDD\uFF0C\u70B9\u6807\u9898\u680F\u7684\u300C/ N\u300D\u5B50\u4EE3\u7406\u76EE\u5F55'\n : '\u6253\u4E0D\u5F00\uFF1A\u8BF7\u5728\u4FA7\u8FB9\u680F\u9009\u4E2D\u5B83\u7684\u7236\u4F1A\u8BDD\uFF0C\u70B9\u6807\u9898\u680F\u7684\u300C/ N\u300D\u5B50\u4EE3\u7406\u76EE\u5F55',\n }\n}\n\n// \u63D0\u793A\uFF08toast\uFF09\u505C\u7559\u65F6\u957F\uFF1A\u6309**\u53EF\u8BFB\u5B57\u6570**\u7ED9\uFF0C\u800C\u4E0D\u662F\u56FA\u5B9A 2.4s / 2.6s\u3002\n// \u4E2D\u6587\u8212\u9002\u9605\u8BFB\u7EA6 6 \u5B57/\u79D2\uFF0C\u7559 40% \u4F59\u91CF\u540E\u5939\u5728 [2.6s, 11s]\uFF1B\u5931\u8D25\u7C7B\u518D \u00D71.25\uFF08\u540C\u6837\u53D7\u4E0A\u9650\u7EA6\u675F\uFF09\u3002\n// \u80CC\u666F\uFF082026-09-10 \u7528\u6237\u53CD\u9988\uFF09\uFF1A\u6392\u961F/\u5931\u8D25\u7C7B\u6587\u6848\u52A8\u8F84 40~100 \u5B57\uFF0C\"\u8FD8\u6CA1\u8BFB\u5B8C\u63D0\u793A\u5C31\u4E0D\u89C1\u4E86\"\u3002\nexport const TOAST_MIN_MS = 2600\nexport const TOAST_MAX_MS = 11000\nexport function toastDurationFor(text, kind) {\n const chars = String(text == null ? '' : text).length\n const readingMs = Math.round((chars / 6) * 1000 * 1.4)\n const scaled = kind === 'err' ? Math.round(readingMs * 1.25) : readingMs\n return Math.min(TOAST_MAX_MS, Math.max(TOAST_MIN_MS, scaled))\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/**\n * dsh-sessions-manager \u2014 browser half: renders a single \"\u4F1A\u8BDD\u7BA1\u7406\" settings\n * section (settings.section list slot) that unifies archived-session\n * management and cross-workspace moving. It talks to the host half's\n * /archived-sessions/* JSON routes by fetch, showing every conversation with\n * its archive state and offering archive / restore / delete / move (and batch)\n * actions. All DOM/runtime wiring failures are logged, never thrown \u2014 a thrown\n * plugin apply takes down the whole web-shell boot.\n *\n * @module dsh-sessions-manager/client\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react'\nimport { canDropOnWorkspace, dotStateFor, effectiveTitleOf, foldSubagents, openSubagentToast, sessionForNodes, shortId, starredOf, titleBackfillDecision, toastDurationFor, workspaceForNodes } from './logic.js'\n\nexport const inject = ['slots']\n\nconst PANEL_PREFS_KEY = 'dsm-panel-prefs-v1'\nfunction loadPanelPrefs() {\n try { return JSON.parse(localStorage.getItem(PANEL_PREFS_KEY) || '{}') || {} } catch (e) { return {} }\n}\n\nconst CSS = `\n.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}\n.archv-head{display:flex;align-items:center;gap:10px;margin:0 0 2px}\n.archv-title{font-size:16px;font-weight:650;color:var(--dsw-alias-label-primary);letter-spacing:-0.01em;margin:0}\n.archv-stamp{font-size:11px;font-weight:500;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-fill-secondary);border:1px solid var(--dsw-alias-border-l1);border-radius:999px;padding:2px 8px;white-space:nowrap;cursor:default}\n.archv-count{font-size:11px;font-weight:600;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-fill-subtle);border:1px solid var(--dsw-alias-border-l2);border-radius:999px;padding:1px 8px;flex:none}\n.archv-sub{font-size:12px;line-height:1.55;color:var(--dsw-alias-label-tertiary);margin:0 0 12px;max-width:64ch}\n.archv-err{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:9px 12px;border:1px solid color-mix(in srgb,var(--dsw-alias-state-error-primary) 40%,transparent);background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 8%,transparent);border-radius:var(--dsm-radius-sheet);color:var(--dsw-alias-state-error-primary);font-size:12px;margin-bottom:10px}\n.archv-errretry{appearance:none;border:1px solid color-mix(in srgb,var(--dsw-alias-state-error-primary) 45%,transparent);background:transparent;color:inherit;border-radius:8px;padding:4px 10px;font-size:11px;cursor:pointer;flex:none}\n.sess-fwrap{margin:0 0 12px}\n.sess-filter{display:flex;align-items:center;gap:6px}\n/* \u4F4E\u9891\u5206\u7C7B\uFF08\u5DF2\u6536\u85CF/\u7A7A\u767D/\u56DE\u6536\u7AD9\uFF09\u6A2A\u5411\u6536\u7EB3\uFF1A\u9ED8\u8BA4 max-width:0 \u9690\u85CF\uFF0C\u70B9\u6309\u7BAD\u5934\n \uFF08sess-fmore-open\uFF09\u6216\u4F4E\u9891\u5206\u7C7B\u5904\u4E8E\u9009\u4E2D\u6001\uFF08sess-fsec-on\uFF09\u65F6\u5411\u53F3\u5C55\u5F00\uFF1B\n max-width \u8FC7\u6E21\u505A\u6A2A\u5411\u6ED1\u51FA\u52A8\u753B\uFF0Coverflow \u88C1\u526A\u56DE\u7F29\u8FC7\u7A0B\u3002 */\n.sess-fmore{display:inline-flex;align-items:center;gap:6px;max-width:0;opacity:0;overflow:hidden;white-space:nowrap;transform:translateX(-8px);visibility:hidden;transition:max-width .22s ease,opacity .18s ease,transform .22s ease,visibility 0s .22s}\n.sess-fwrap.sess-fmore-open .sess-fmore,.sess-fwrap.sess-fsec-on .sess-fmore{max-width:30em;opacity:1;transform:none;visibility:visible;transition:max-width .22s ease,opacity .18s ease,transform .22s ease}\n.sess-farrow{appearance:none;display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border:none;background:transparent;color:var(--dsw-alias-label-secondary);cursor:pointer;flex:none;padding:0;opacity:0;pointer-events:none;transition:opacity .18s ease,color .18s ease}\n/* \u7BAD\u5934\u9ED8\u8BA4\u7D27\u8DDF\u4E09\u4E2A\u4E3B tab \u53F3\u8FB9\uFF08\u60AC\u505C\u7B5B\u9009\u884C\u624D\u6D6E\u73B0\uFF09\uFF1B\u5C55\u5F00\u7EC4\u6491\u5F00\u540E\u628A\u5B83\u63A8\u5230\n \u884C\u5C3E\u3002\u65E0\u5916\u5708\u5E95\u8272\uFF0C\u53EA\u6E32\u67D3 svg \u672C\u4F53\u3002\u9690\u85CF\u6001\u7528 pointer-events:none \u6321\u4F4F\n \u8BEF\u70B9\uFF1B\u5C55\u5F00\u6001\uFF08\u542B\u9009\u4E2D\u4F4E\u9891\u5206\u7C7B\u7684\u515C\u5E95\uFF09\u5E38\u9A7B\u2014\u2014\u6536\u8D77\u5165\u53E3\u4E0D\u80FD\u6D88\u5931\u3002 */\n.sess-fwrap:hover .sess-farrow,.sess-fwrap.sess-fmore-open .sess-farrow,.sess-fwrap.sess-fsec-on .sess-farrow{opacity:1;pointer-events:auto}\n.sess-farrow:hover{color:var(--dsw-alias-label-primary)}\n.sess-farrow svg{display:block;transition:transform .22s ease}\n.sess-fwrap.sess-fmore-open .sess-farrow svg,.sess-fwrap.sess-fsec-on .sess-farrow svg{transform:rotate(180deg)}\n.sess-fbtn{appearance:none;min-height:30px;padding:0 12px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-fill-subtle);color:var(--dsw-alias-label-secondary);border-radius:999px;font-size:12px;font-weight:500;cursor:pointer}\n.sess-fbtn:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}\n.sess-fbtn-on{background:var(--dsw-alias-interactive-bg-active);color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-border-l3)}\n.sess-tools{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:8px;margin:0 0 8px}\n.sess-tools-4{grid-template-columns:repeat(auto-fit,minmax(132px,1fr))}\n.dsm-kids{display:flex;flex-direction:column;gap:6px;margin:10px 0 2px;margin-left:43px;padding-left:10px;border-left:2px solid var(--dsw-alias-border-l3)}\n.dsm-kid .dsm-kids{margin-left:8px;margin-top:6px}\n.dsm-kids-toggle{appearance:none;min-height:22px;padding:0 9px;border:1px solid color-mix(in srgb,var(--dsw-alias-state-business-primary) 40%,transparent);background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 10%,transparent);color:var(--dsw-alias-state-business-primary);border-radius:var(--dsm-radius-tag);font:inherit;font-size:11px;font-weight:500;cursor:pointer;flex:none;white-space:nowrap}\n.dsm-kids-toggle:hover{background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 18%,transparent)}\n.dsm-kid{display:flex;flex-direction:column;gap:6px;min-width:0}\n.dsm-kid-row{display:flex;align-items:center;gap:8px;min-width:0}\n.dsm-kid-name{flex:1 1 auto;min-width:0;font-size:12px;color:var(--dsw-alias-label-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.dsm-kid-meta{font-size:11px;color:var(--dsw-alias-label-tertiary);flex:none;white-space:nowrap}\n.dsm-kid-acts{display:flex;align-items:center;gap:6px;flex:none;margin-left:auto}\n.dsm-kid-acts .archv-btn{min-height:26px;padding:0 9px;font-size:11px}\n.sess-field{display:flex;flex-direction:column;gap:5px;min-width:0}\n.sess-field label{font-size:11px;font-weight:600;color:var(--dsw-alias-label-secondary)}\n.sess-field input,.sess-field select{box-sizing:border-box;width:100%;min-height:36px;padding:0 10px;border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsm-radius-ctl);background:var(--dsw-alias-fill-elevated);color:var(--dsw-alias-label-primary);font:inherit;font-size:12px}\n.sess-results{display:flex;flex-direction:column;gap:1px;font-size:11px;color:var(--dsw-alias-label-tertiary);margin:0 0 4px}\n.archv button:focus-visible,.archv input:focus-visible,.archv select:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}\n.sess-batch{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:8px 2px 4px;margin-bottom:4px}\n/* issue #7\uFF1A\u52FE\u9009\u540E\u6279\u91CF\u64CD\u4F5C\u680F\u5438\u9876\u2014\u2014\u5217\u8868\u518D\u957F\uFF0C\u64CD\u4F5C\u6309\u94AE\u4E5F\u4E00\u76F4\u5728\u624B\u8FB9\u3002 */\n.sess-batch-pin{position:sticky;top:0;z-index:30;margin:0 -2px 4px;padding:8px 4px 6px;background:var(--dsw-alias-bg-layer-1);border-bottom:1px solid var(--dsw-alias-border-l2);box-shadow:0 6px 14px rgb(0 0 0/.08)}\n.sess-btntext{font-size:12px;color:var(--dsw-alias-label-tertiary);flex:none}\n.archv-list{display:flex;flex-direction:column;gap:8px}\n.archv-card{display:flex;flex-direction:column;align-items:stretch;gap:0;padding:12px 14px;border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsm-radius-card);background:var(--dsw-alias-fill-elevated);transition:border-color .15s ease,background-color .15s ease}\n.archv-card:hover{border-color:var(--dsw-alias-border-l4)}\n.archv-card-exp{border-color:var(--dsw-alias-border-l4);background:var(--dsw-alias-bg-layer-1)}\n.archv-row{display:flex;align-items:center;gap:14px;width:100%;min-width:0}\n.archv-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:5px}\n.archv-titlerow{display:flex;align-items:center;gap:8px;min-width:0}\n.archv-name{font-size:13px;font-weight:550;color:var(--dsw-alias-label-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;flex:0 1 auto}\n.archv-meta{display:flex;align-items:center;gap:7px;flex-wrap:nowrap;min-width:0;overflow:hidden}\n.archv-wtag{display:inline-flex;align-items:center;gap:4px;min-width:0;flex:0 1 auto;font-size:11px;font-weight:500;line-height:1;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-fill-subtle);border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsm-radius-tag);padding:3px 8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.archv-wgone{border-style:dashed;color:var(--dsw-alias-state-error-primary);border-color:color-mix(in srgb,var(--dsw-alias-state-error-primary) 55%,transparent);background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 7%,transparent)}\n.archv-active{color:var(--dsw-alias-state-success-primary);border-color:color-mix(in srgb,var(--dsw-alias-state-success-primary) 45%,transparent);background:color-mix(in srgb,var(--dsw-alias-state-success-primary) 8%,transparent)}\n.archv-date{font-size:11px;color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none}\n.dsm-branch-chip{display:inline-flex;align-items:center;flex:none;min-height:22px;padding:0 9px;border:1px solid color-mix(in srgb,var(--dsw-alias-state-success-primary) 45%,transparent);border-radius:var(--dsm-radius-tag);background:color-mix(in srgb,var(--dsw-alias-state-success-primary) 10%,transparent);color:var(--dsw-alias-state-success-primary);font-size:11px;font-weight:500;line-height:1;white-space:nowrap}\n.dsm-empty-chip{display:inline-flex;align-items:center;flex:none;min-height:22px;padding:0 9px;border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsm-radius-tag);background:var(--dsw-alias-fill-subtle);color:var(--dsw-alias-label-tertiary);font-size:11px;font-weight:500;line-height:1;white-space:nowrap}\n.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}\n.archv-dot{color:var(--dsw-alias-border-l3);flex:none}\n.archv-check{width:15px;height:15px;accent-color:var(--dsw-alias-state-business-primary);flex:none;cursor:pointer}\n.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}\n.archv-star:hover{background:0 0;color:var(--dsw-alias-label-secondary);transform:scale(1.12)}\n.archv-star:active{transform:scale(.92)}\n.archv-star svg{fill:none;stroke:currentColor;stroke-width:1.5;stroke-linejoin:round;stroke-linecap:round;display:block}\n.archv-star-on,.archv-star-on:hover{color:var(--dsw-alias-state-business-primary)}\n.archv-star-on svg{fill:currentColor}\n.archv-body{flex:1;min-width:0;display:flex;align-items:center;gap:12px}\n.archv-actions{display:flex;gap:8px;flex:none;flex-wrap:nowrap;justify-content:flex-end}\n.archv-btn{appearance:none;min-height:32px;padding:0 12px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-fill-subtle);color:var(--dsw-alias-label-secondary);border-radius:var(--dsm-radius-ctl);font-size:12px;font-weight:500;cursor:pointer;white-space:nowrap;display:inline-flex;align-items:center;justify-content:center;gap:6px;text-align:center;transition:background-color .15s ease,border-color .15s ease,color .15s ease}\n.archv-btn:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}\n.archv-btn:disabled{opacity:.5;cursor:default}\n.archv-del{color:var(--dsw-alias-state-error-primary);border-color:color-mix(in srgb,var(--dsw-alias-state-error-primary) 45%,transparent)}\n.archv-del:hover:not(:disabled){background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 10%,transparent);color:var(--dsw-alias-state-error-primary)}\n.archv-go{color:var(--dsw-alias-state-business-primary);border-color:color-mix(in srgb,var(--dsw-alias-state-business-primary) 45%,transparent)}\n.archv-go:hover:not(:disabled){background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 10%,transparent);color:var(--dsw-alias-state-business-primary)}\n.archv-empty{display:flex;align-items:center;gap:10px;padding:20px 14px;border:1px dashed var(--dsw-alias-border-l3);border-radius:var(--dsm-radius-card);color:var(--dsw-alias-label-tertiary);font-size:13px;line-height:1.5}\n.archv-skel{display:flex;flex-direction:column;gap:8px}\n.archv-skel-card{height:58px;border-radius:var(--dsm-radius-card);background:var(--dsw-alias-fill-subtle);position:relative;overflow:hidden}\n.archv-skel-card::after{content:'';position:absolute;inset:0;transform:translateX(-100%);background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--dsw-alias-fill-elevated) 75%,transparent),transparent);animation:archv-shimmer 1.4s infinite}\n.archv-status{position:fixed;bottom:20px;left:50%;transform:translateX(-50%);z-index:2147483601;background:linear-gradient(var(--dsw-alias-fill-elevated),var(--dsw-alias-fill-elevated)),var(--dsw-alias-bg-layer-1,Canvas);border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);padding:9px 16px;border-radius:999px;font-size:12px;line-height:1.5;text-align:center;box-shadow:0 8px 24px rgb(0 0 0/.25);display:flex;align-items:center;gap:8px;animation:archv-pop .18s ease-out;max-width:min(92vw,480px);cursor:pointer}\n.archv-status-long{border-radius:14px;text-align:left}\n.archv-spin{width:12px;height:12px;border:2px solid color-mix(in srgb,var(--dsw-alias-label-secondary) 35%,transparent);border-top-color:var(--dsw-alias-label-secondary);border-radius:50%;animation:archv-rot .8s linear infinite;flex:none}\n@keyframes archv-shimmer{100%{transform:translateX(100%)}}\n@keyframes archv-rot{to{transform:rotate(360deg)}}\n@keyframes archv-pop{from{opacity:0;transform:translateX(-50%) translateY(10px)}}\n/* \u5931\u8D25\u63D0\u793A\u7528\u8B66\u793A\u8272 + \u52A0\u7C97\uFF0C\u5E76\u505C\u7559\u66F4\u4E45\uFF08\u9700\u8981\u7528\u6237\u8BFB\u5B8C\u53BB\u505A\u4E0B\u4E00\u6B65\u64CD\u4F5C\uFF09\u3002 */\n.archv-status-err{border-color:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-state-error-primary);font-weight:500}\n@media (prefers-reduced-motion:reduce){.archv-skel-card::after{animation:none}.archv-card,.archv-btn,.archv-star{transition:none}.archv-star:hover,.archv-star:active{transform:none}.archv-status,.archv-spin{animation:none}}\n@media (max-width:640px){.archv-card{flex-direction:column;align-items:stretch;gap:10px}.archv-actions{justify-content:flex-end}.sess-tools,.sess-tools-4{grid-template-columns:1fr}.sess-fbtn,.archv-btn{min-height:40px}.archv-star{width:30px;height:30px}.archv-star svg{width:22px;height:22px}.dsm-kids{margin-left:10px}.archv-titlerow{flex-wrap:wrap}.dsm-kid-row{flex-wrap:wrap}.dsm-kid-acts{margin-left:0}}\n.mv-sheet{width:100%;box-sizing:border-box;display:flex;flex-direction:column;gap:12px;margin-top:12px;padding:14px;border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsm-radius-sheet);background:var(--dsw-alias-fill-subtle)}\n.mv-sheet-head{display:flex;align-items:center;justify-content:space-between;gap:10px}\n.mv-sheet-title{font-size:13px;font-weight:600;color:var(--dsw-alias-label-primary);margin:0}\n.mv-sheet-close{appearance:none;width:26px;height:26px;color:var(--dsw-alias-label-secondary);background:0 0;border:none;border-radius:7px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;font-size:16px;line-height:1}\n.mv-sheet-close:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}\n.mv-seg{display:flex;gap:2px;padding:2px;background:var(--dsw-alias-fill-elevated);border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsm-radius-sheet);width:100%}\n.mv-segbtn{appearance:none;flex:1;min-height:30px;padding:0 12px;border:none;background:transparent;color:var(--dsw-alias-label-secondary);border-radius:8px;font-size:12px;font-weight:500;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;gap:6px}\n.mv-segbtn:hover:not(:disabled){color:var(--dsw-alias-label-primary)}\n.mv-segbtn-on{background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);box-shadow:0 1px 2px rgb(0 0 0/.08)}\n.mv-field{display:flex;flex-direction:column;gap:6px}\n.mv-field label.mv-field-label{font-size:12px;font-weight:500;color:var(--dsw-alias-label-secondary)}\n.mv-field select,.mv-field input[type=text]{box-sizing:border-box;appearance:none;width:100%;min-height:34px;padding:0 10px;border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsm-radius-ctl);background:var(--dsw-alias-fill-elevated);color:var(--dsw-alias-label-primary);font-size:12px;font-family:inherit}\n.mv-field select:focus-visible,.mv-field input[type=text]:focus-visible,.mv-sheet-close:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:1px}\n.mv-browse-row{display:flex;align-items:center;gap:8px}\n.mv-browse-row input[type=text]{flex:1;min-width:0}\n.mv-foot{display:flex;justify-content:flex-end;align-items:center;gap:8px;margin-top:2px}\n@media (max-width:640px){.archv-row{flex-wrap:wrap}.mv-sheet{padding:12px}}\n.dtl-sheet{margin-top:12px;padding:14px;border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsm-radius-sheet);background:var(--dsw-alias-fill-subtle)}\n.dtl-sheet-head{display:flex;align-items:center;justify-content:space-between;gap:10px}\n.dtl-sheet-title{font-size:13px;font-weight:600;color:var(--dsw-alias-label-primary);margin:0}\n.dtl-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(130px,1fr));gap:8px;margin-top:10px}\n.dtl-cell{display:flex;flex-direction:column;gap:2px;padding:8px 10px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-fill-elevated);min-width:0}\n.dtl-k{font-size:11px;color:var(--dsw-alias-label-tertiary)}\n.dtl-v{font-size:12px;color:var(--dsw-alias-label-primary);word-break:break-all}\n.dtl-sec{margin-top:12px}\n.dtl-export{display:flex;align-items:center;gap:8px;flex-wrap:wrap}\n.dtl-export .archv-btn{text-decoration:none}\n.dtl-note{margin-top:8px;font-size:11px;color:var(--dsw-alias-label-tertiary);line-height:1.5}\n.dtl-sec-t{font-size:11px;font-weight:600;color:var(--dsw-alias-label-secondary);text-transform:uppercase;letter-spacing:.03em;margin-bottom:6px}\n.dtl-tags{display:flex;flex-wrap:wrap;gap:6px}\n.dtl-tag{display:inline-flex;font-size:11px;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-fill-elevated);border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsm-radius-tag);padding:2px 8px}\n.dtl-list{margin:0;padding-left:18px;display:flex;flex-direction:column;gap:3px;font-size:11.5px;color:var(--dsw-alias-label-secondary)}\n.dtl-list code,.dtl-paths code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;color:var(--dsw-alias-label-primary);word-break:break-all}\n.dtl-filetool{color:var(--dsw-alias-label-tertiary)}\n.dtl-paths{display:flex;flex-direction:column;gap:4px;font-size:11.5px;color:var(--dsw-alias-label-secondary);word-break:break-all}\n.more-wrap{position:relative;flex:none}\n.more-btn{appearance:none;width:28px;height:28px;border:none;border-radius:8px;background:transparent;color:var(--dsw-alias-label-secondary);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;line-height:1}\n.more-btn:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}\n.more-menu{position:absolute;top:calc(100% + 4px);right:0;z-index:60;min-width:160px;padding:5px;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l3);border-radius:var(--dsm-radius-sheet);box-shadow:0 10px 32px rgb(0 0 0/.24);display:flex;flex-direction:column;gap:1px}\n.more-item{appearance:none;display:flex;align-items:center;gap:8px;width:100%;padding:7px 10px;border:none;background:transparent;color:var(--dsw-alias-label-primary);border-radius:7px;font-size:12.5px;cursor:pointer;white-space:nowrap;text-align:left}\n.more-item:hover{background:var(--dsw-alias-interactive-bg-hover)}\n.more-item-danger{color:var(--dsw-alias-state-error-primary)}\n.more-item-danger:hover{background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 10%,transparent);color:var(--dsw-alias-state-error-primary)}\n.dlg-backdrop{position:fixed;inset:0;z-index:80;background:rgba(0,0,0,.45);display:flex;align-items:center;justify-content:center;padding:16px}\n.dlg{width:min(420px,92vw);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l3);border-radius:14px;padding:18px;box-shadow:0 16px 48px rgb(0 0 0/.28);display:flex;flex-direction:column;gap:12px}\n.dlg-title{font-size:15px;font-weight:650;color:var(--dsw-alias-label-primary);margin:0}\n.dlg-text{font-size:13px;line-height:1.6;color:var(--dsw-alias-label-secondary);margin:0;word-break:break-all}\n.dlg-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:2px}\n`\n\nfunction fmtDate(iso) {\n if (!iso) return null\n const d = new Date(iso)\n if (isNaN(d.getTime())) return null\n try {\n return new Intl.DateTimeFormat('zh-CN', { year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }).format(d)\n } catch {\n return String(iso)\n }\n}\n\nfunction fmtBytes(n) {\n if (!n && n !== 0) return null\n if (n < 1024) return `${n} B`\n const units = ['KB', 'MB', 'GB', 'TB']\n let v = n\n let u = -1\n do { v /= 1024; u++ } while (v >= 1024 && u < units.length - 1)\n return `${v >= 100 ? v.toFixed(0) : v.toFixed(1)} ${units[u]}`\n}\n\nfunction pathName(p) {\n if (!p) return null\n const parts = String(p).replace(/\\\\+$/, '').split(/[/\\\\]/)\n return parts[parts.length - 1] || p\n}\n\n// \u670D\u52A1\u7AEF 409 \u9519\u8BEF\u7801\uFF1A\u4F1A\u8BDD\u6B63\u88AB DSH \u5360\u7528\u5199\u6743\u9650\uFF080.1.3 \u5355\u5199\u8005\u673A\u5236\uFF09\u3002\u5207\u8D70\u4F1A\u8BDD\u540E\n// \u539F\u5730\u91CD\u8BD5\u5373\u53EF\uFF0C\u6240\u4EE5\u8FD9\u7C7B\u5931\u8D25\u8981\u7ED9\u7528\u6237\u4E00\u4E2A\u300C\u91CD\u8BD5\u300D\u5165\u53E3\u3002\nconst BUSY_CODE = 'DSM_SESSION_BUSY'\n\nasync function postJSON(path, body) {\n const res = await fetch(path, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify(body || {}),\n })\n const data = await res.json().catch(() => null)\n if (!res.ok || !data) {\n // \u4FDD\u7559\u670D\u52A1\u7AEF\u9519\u8BEF\u7801\uFF1AUI \u9700\u8981\u636E\u6B64\u533A\u5206\u300C\u53EF\u91CD\u8BD5\u300D\u7684\u5931\u8D25\uFF08\u5982 DSM_SESSION_BUSY\n // \u2014\u2014 \u4F1A\u8BDD\u6B63\u88AB DSH \u5360\u7528\u5199\u6743\u9650\uFF0C\u5207\u8D70\u4F1A\u8BDD\u540E\u539F\u5730\u91CD\u8BD5\u5373\u53EF\uFF09\u4E0E\u91CD\u8BD5\u4E5F\u65E0\u7528\u7684\u9519\u8BEF\u3002\n const error = new Error((data && (data.error || data.message)) || `request failed (${res.status})`)\n if (data && data.code) error.code = data.code\n throw error\n }\n return data\n}\n\n// \u6253\u5F00\u4E00\u4E2A\u4F1A\u8BDD\uFF08\u5C24\u5176\u662F\u4FA7\u680F\u4E0D\u6E32\u67D3\u7684\u5B50\u4EE3\u7406\u4F1A\u8BDD\uFF09\u3002\n//\n// \u53EA\u8D70\u5B98\u65B9\u516C\u5F00\u5951\u7EA6\uFF08runtime \u7684 client api-catalog\uFF09\uFF1A\n// sessions.open(id) \u2014\u2014 \u9009\u4E2D\u4F1A\u8BDD\u4E3A\u5F53\u524D\n// sessions.refreshSubagents(parent) \u2014\u2014 \u5237\u65B0\u67D0\u7236\u4F1A\u8BDD\u7684\u76F4\u63A5\u5B50\u4EE3\u7406\u76EE\u5F55\n// sessions.openSubagent(address) \u2014\u2014 \u7528\u300C\u76F4\u63A5\u7236 + \u5B50\u300D\u5730\u5740\u6253\u5F00\u76EE\u5F55\u91CC\u7684\u5B50\u4EE3\u7406\n// \u62FF\u4E0D\u5230 sessions \u670D\u52A1\uFF08\u8001 runtime\uFF09\u65F6\u8FD4\u56DE false\uFF0C\u7531\u8C03\u7528\u65B9\u7ED9\u51FA\u964D\u7EA7\u63D0\u793A\uFF0C\u7EDD\u4E0D\n// \u89E6\u78B0\u4EFB\u4F55\u79C1\u6709\u5185\u90E8\u72B6\u6001\u3002\nlet dsmClientCtx = null\nfunction dsmSessionsService() {\n try { return dsmClientCtx && typeof dsmClientCtx.get === 'function' ? dsmClientCtx.get('sessions') : null } catch (e) { return null }\n}\nfunction dsmCurrentSessionId(svc) {\n try {\n const snap = svc && svc.list && typeof svc.list.getSnapshot === 'function' ? svc.list.getSnapshot() : null\n return snap && snap.current != null ? String(snap.current) : null\n } catch (e) { return null }\n}\n// \u8FD4\u56DE Promise<'ok' | 'no-service' | 'failed'>\uFF1A\u53EA\u56DE true/false \u7684\u8BDD\uFF0C\u8C03\u7528\u65B9\n// \u53EA\u80FD\u7ED9\u51FA\u4E00\u53E5\u300C\u6253\u4E0D\u5F00\u300D\u7684\u7B3C\u7EDF\u63D0\u793A\u2014\u2014\u7528\u6237\u65E2\u4E0D\u77E5\u9053\u4E3A\u4EC0\u4E48\uFF0C\u4E5F\u4E0D\u77E5\u9053\u4E0B\u4E00\u6B65\u8BE5\n// \u600E\u4E48\u529E\u3002\u533A\u5206\u539F\u56E0\u540E\u63D0\u793A\u624D\u80FD\u8BF4\u6E05\u300C\u53BB\u54EA\u513F\u3001\u505A\u4EC0\u4E48\u300D\u3002\nasync function dsmOpenSessionById(childId, directParentId) {\n const sid = String(childId || '')\n if (!sid) return 'failed'\n const svc = dsmSessionsService()\n if (!svc) return 'no-service'\n const parent = directParentId ? String(directParentId) : null\n // 1) \u76F4\u63A5\u9009\u4E2D\uFF08\u5BF9\u4ECD\u5728\u4F1A\u8BDD\u5217\u8868\u91CC\u7684\u5B50\u4EE3\u7406\u6700\u7701\u4E8B\uFF09\u3002\n if (typeof svc.open === 'function') {\n try {\n svc.open(sid)\n await new Promise((r) => setTimeout(r, 350))\n if (dsmCurrentSessionId(svc) === sid) return 'ok'\n } catch (e) { /* \u843D\u5230\u76EE\u5F55\u5730\u5740\u8DEF\u5F84 */ }\n }\n // 2) \u5B98\u65B9\u5B50\u4EE3\u7406\u76EE\u5F55\u8DEF\u5F84\uFF1A\u7236\u4F1A\u8BDD\u5934\u90E8\u7684\u76EE\u5F55\u662F DSH \u4E3A\u5B50\u4EE3\u7406\u51C6\u5907\u7684\u5BFC\u822A\u5165\u53E3\uFF0C\n // \u8FD9\u91CC\u590D\u7528\u540C\u4E00\u4E2A\u5730\u5740\u5951\u7EA6\uFF08parentSessionId \u5FC5\u987B\u662F\u300C\u76F4\u63A5\u7236\u300D\uFF0C\u5B59\u4EE3\u4E5F\u4E00\u6837\uFF09\u3002\n if (parent && typeof svc.openSubagent === 'function') {\n try {\n if (typeof svc.refreshSubagents === 'function') await svc.refreshSubagents(parent)\n svc.openSubagent({ parentSessionId: parent, childSessionId: sid, mode: 'continuable' })\n await new Promise((r) => setTimeout(r, 350))\n if (dsmCurrentSessionId(svc) === sid) return 'ok'\n // openSubagent \u662F\u540C\u6B65 void\uFF0C\u65E0\u6CD5\u4ECE\u8FD4\u56DE\u503C\u5224\u65AD\u6210\u8D25\uFF1A\u5730\u5740\u5DF2\u63D0\u4EA4\u3001\u5F53\u524D\u4F1A\u8BDD\n // \u53EF\u80FD\u56E0\u7236\u4F1A\u8BDD\u4E0A\u4E0B\u6587\u5C1A\u672A\u5C31\u7EEA\u800C\u7A0D\u540E\u624D\u5207\u6362\uFF0C\u8FD9\u91CC\u6309\u6210\u529F\u5904\u7406\u907F\u514D\u91CD\u590D\u89E6\u53D1\u3002\n return 'ok'\n } catch (e) { /* \u843D\u5230\u5931\u8D25\u63D0\u793A */ }\n }\n return 'failed'\n}\n\n// Left-nav icon swap: DSH's settings shell renders a shared fallback gear for\n// every custom section and settings.section has no per-section icon field.\n// Like dsh-better-sidebar, we mark our own row by matching its visible label\n// text, then CSS swaps the gear for an archive-box glyph. The marker owns no\n// shell structure and is removed on fiber disposal (HMR-safe, ships with the\n// plugin).\nconst NAV_CSS = `\n[data-dsh-nav-sessions] > svg:first-child { display: none; }\n[data-dsh-nav-sessions]::before {\n content: ''; flex: none; width: 16px; height: 16px; background: currentColor;\n -webkit-mask: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D'http://www.w3.org/2000/svg'%20width%3D'24'%20height%3D'24'%20viewBox%3D'0%200%2024%2024'%20fill%3D'none'%20stroke%3D'black'%20stroke-width%3D'2'%20stroke-linecap%3D'round'%20stroke-linejoin%3D'round'%3E%3Cpath%20d%3D'M21%208v13H3V8'/%3E%3Cpath%20d%3D'M1%203h22v5H1z'/%3E%3Cpath%20d%3D'M10%2012h4'/%3E%3C/svg%3E\") center / contain no-repeat;\n mask: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D'http://www.w3.org/2000/svg'%20width%3D'24'%20height%3D'24'%20viewBox%3D'0%200%2024%2024'%20fill%3D'none'%20stroke%3D'black'%20stroke-width%3D'2'%20stroke-linecap%3D'round'%20stroke-linejoin%3D'round'%3E%3Cpath%20d%3D'M21%208v13H3V8'/%3E%3Cpath%20d%3D'M1%203h22v5H1z'/%3E%3Cpath%20d%3D'M10%2012h4'/%3E%3C/svg%3E\") center / contain no-repeat;\n}\n`\n\nfunction markSettingsNav() {\n const LABEL = '\u4F1A\u8BDD\u7BA1\u7406'\n let disposed = false\n let frame = 0\n const run = () => {\n frame = 0\n if (disposed) return\n // \u5EC9\u4EF7\u65E9\u9000\uFF1A\u8BBE\u7F6E\u9762\u677F\u6CA1\u6253\u5F00\u65F6\u6574\u9875\u53EA\u6709\u4E00\u4E2A dialog \u67E5\u8BE2\u7684\u5F00\u9500\uFF0C\u4E0D\u904D\u5386\u6309\u94AE\u3002\n if (!document.querySelector('[role=\"dialog\"]')) return\n const buttons = document.querySelectorAll('[role=\"dialog\"] nav button')\n for (const b of buttons) {\n const t = (b.textContent || '').trim()\n if (t === LABEL) b.setAttribute('data-dsh-nav-sessions', '')\n else b.removeAttribute('data-dsh-nav-sessions')\n }\n }\n // rAF \u5408\u5E76\uFF1A\u6574\u9875 MutationObserver \u5728\u4E00\u4E2A\u6E32\u67D3\u5E27\u91CC\u53EF\u80FD\u89E6\u53D1\u6210\u767E\u4E0A\u5343\u6B21\u56DE\u8C03\uFF0C\n // \u6BCF\u5E27\u6700\u591A\u771F\u6B63\u540C\u6B65\u4E00\u6B21\u3002\n const sync = () => { if (!frame && !disposed) frame = requestAnimationFrame(run) }\n run()\n // \u523B\u610F**\u4E0D**\u76D1\u542C characterData\uFF1A\u6D41\u5F0F\u56DE\u590D\u9010 token \u6539\u6587\u672C\uFF0C\u4F1A\u628A\u6574\u9875\u89C2\u5BDF\u5668\u6253\u6210\n // \u9AD8\u9891\u56DE\u8C03\uFF1B\u5BFC\u822A\u6309\u94AE\u7684\u6807\u7B7E\u53EA\u5728 childList\uFF08\u9762\u677F\u91CD\u6E32\u67D3\uFF09\u65F6\u53D8\u5316\uFF0C\u591F\u7528\u3002\n const obs = new MutationObserver(sync)\n obs.observe(document.body, { childList: true, subtree: true })\n return () => {\n disposed = true\n if (frame) cancelAnimationFrame(frame)\n frame = 0\n obs.disconnect()\n document.querySelectorAll('[data-dsh-nav-sessions]').forEach((e) => e.removeAttribute('data-dsh-nav-sessions'))\n }\n}\n\nfunction installSettingsNavIcons(ctx) {\n const styleEl = document.createElement('style')\n styleEl.textContent = NAV_CSS\n document.head.appendChild(styleEl)\n const dispose = markSettingsNav()\n ctx.effect(() => () => {\n dispose()\n if (styleEl.parentNode) styleEl.parentNode.removeChild(styleEl)\n })\n}\n\nfunction SessionPanel({ workspacesSvc }) {\n const [sessions, setSessions] = useState(null)\n const [workspaces, setWorkspaces] = useState([])\n const [capabilities, setCapabilities] = useState(null)\n const initialPrefs = useRef(loadPanelPrefs()).current\n // \u6CE8\u610F\uFF1A'storage' \u5DF2\u4ECE\u53EF\u6301\u4E45\u5316\u53D6\u503C\u4E2D\u79FB\u9664\uFF08\u5B83\u4E0D\u518D\u662F\u89C6\u56FE\uFF09\uFF0C\u65E7\u7248\u6B8B\u7559\u7684\n // filter='storage' \u4F1A\u81EA\u52A8\u56DE\u843D\u5230 'all'\uFF0C\u907F\u514D\u843D\u5230\u4E00\u4E2A\u5DF2\u4E0D\u5B58\u5728\u7684\u754C\u9762\u3002\n const [filter, setFilter] = useState(() => ['all', 'active', 'archived', 'starred', 'empty', 'trash'].includes(initialPrefs.filter) ? initialPrefs.filter : 'all')\n // \u4F4E\u9891\u5206\u7C7B\u6298\u53E0\u533A\uFF1A\u6302\u8F7D\u65F6\u82E5\u9009\u4E2D\u7684\u5C31\u662F\u4F4E\u9891\u5206\u7C7B\uFF08\u504F\u597D\u6062\u590D/\u4E0A\u6B21\u505C\u7559\uFF09\u5219\u5C55\u5F00\uFF0C\n // \u4FDD\u8BC1\u6FC0\u6D3B tab \u59CB\u7EC8\u53EF\u89C1\uFF1B\u5E73\u65F6\u7531\u7BAD\u5934 hover/\u70B9\u6309\u63A7\u5236\u3002\n const [moreOpen, setMoreOpen] = useState(() => ['starred', 'empty', 'trash'].includes(initialPrefs.filter))\n const [query, setQuery] = useState('')\n const [workspaceFilter, setWorkspaceFilter] = useState(() => initialPrefs.workspaceFilter || 'all')\n const [sortBy, setSortBy] = useState(() => ['newest', 'oldest', 'title'].includes(initialPrefs.sortBy) ? initialPrefs.sortBy : 'newest')\n const [selected, setSelected] = useState({})\n const [delTarget, setDelTarget] = useState(null)\n const [confirmBatch, setConfirmBatch] = useState(false)\n const [batchMoveOpen, setBatchMoveOpen] = useState(false)\n const [busy, setBusy] = useState(null)\n const [openMove, setOpenMove] = useState(null)\n const [moveMode, setMoveMode] = useState('existing')\n const [targetWs, setTargetWs] = useState('')\n const [newPath, setNewPath] = useState('')\n const [error, setError] = useState(null)\n // \u53EF\u91CD\u8BD5\u7684\u5931\u8D25\uFF1A{ run } \u2014\u2014 run \u662F\u300C\u628A\u521A\u624D\u90A3\u4E00\u6B65\u539F\u6837\u518D\u505A\u4E00\u6B21\u300D\u7684\u95ED\u5305\u3002\u5B58\u5BF9\u8C61\n // \u800C\u975E\u88F8\u51FD\u6570\uFF0C\u907F\u514D\u88AB useState \u5F53\u6210\u66F4\u65B0\u51FD\u6570\u5403\u6389\u3002\u6CA1\u6709\u5B83\u65F6\u9519\u8BEF\u6761\u7684\u300C\u91CD\u8BD5\u300D\u9000\u56DE\n // \u5237\u65B0\u5217\u8868\uFF08refresh\uFF09\u3002\n const [retry, setRetry] = useState(null)\n const [toast, setToast] = useState(null)\n const [picking, setPicking] = useState(false)\n const [trash, setTrash] = useState([])\n const [trashBusy, setTrashBusy] = useState(null)\n const [trashSettings, setTrashSettings] = useState({ retentionDays: 0 })\n const [trashCheck, setTrashCheck] = useState(null)\n const [purgeTarget, setPurgeTarget] = useState(null)\n const [details, setDetails] = useState({})\n const detailsAt = useRef({})\n const [openDetails, setOpenDetails] = useState(null)\n const [detailsLoading, setDetailsLoading] = useState(null)\n const [mdBusy, setMdBusy] = useState(null)\n const [zipOk, setZipOk] = useState(true)\n const [storage, setStorage] = useState(null)\n const [storageBusy, setStorageBusy] = useState(false)\n // \u5B58\u50A8\u7EDF\u8BA1\u8981 stat \u6BCF\u6761\u4F1A\u8BDD\u65E5\u5FD7\uFF0C\u5F00\u9500\u4E0D\u5C0F\uFF1A\u9762\u677F\u9ED8\u8BA4\u6536\u8D77\u3001\u6309\u9700\u52A0\u8F7D\uFF0C\n // \u4E14\u5C55\u5F00\u72B6\u6001\u523B\u610F\u4E0D\u6301\u4E45\u5316\u2014\u2014\u5426\u5219\u6BCF\u6B21\u6253\u5F00\u8BBE\u7F6E\u9762\u677F\u90FD\u4F1A\u89E6\u53D1\u4E00\u6B21\u5168\u91CF\u626B\u63CF\u3002\n const [storageOpen, setStorageOpen] = useState(false)\n const [storageError, setStorageError] = useState(null)\n const [aa, setAa] = useState({ settings: { inactiveDays: 0, skipStarred: true }, lastRunAt: null, lastArchivedCount: 0 })\n const [aaOpen, setAaOpen] = useState(false)\n const [aaBusy, setAaBusy] = useState(false)\n const zipChecked = useRef(false)\n const [openMenu, setOpenMenu] = useState(null)\n const timer = useRef(null)\n // \u5B58\u50A8\u9762\u677F\u5173\u7740\u65F6\u4F1A\u8BDD\u96C6\u5408\u82E5\u53D1\u751F\u53D8\u5316\uFF0C\u6807\u810F\uFF1B\u4E0B\u6B21\u5C55\u5F00\u65F6\u518D\u5237\u65B0\uFF0C\n // \u65E2\u4E0D\u4F1A\u663E\u793A\u8FC7\u671F\u6570\u5B57\uFF0C\u4E5F\u907F\u514D\u6BCF\u6B21 refresh \u90FD\u767D\u626B\u4E00\u904D\u5168\u91CF\u65E5\u5FD7\u3002\n const storageDirty = useRef(false)\n const menuRef = useRef(null)\n const dialogRef = useRef(null)\n\n // \u8840\u7F18\u5206\u7EC4\uFF08issue #6\uFF09\uFF1A\u5B50\u4EE3\u7406\u6298\u53E0\u5728\u7236\u4F1A\u8BDD\u4E0B\u3002DSH \u4FA7\u680F\u6309\u8BBE\u8BA1\u4E0D\u6E32\u67D3\u5B50\u4EE3\u7406\n // \u884C\uFF08ui-subagent \u660E\u6587 \"omitted from the ordinary sidebar\"\uFF09\uFF0C\u672C\u9762\u677F\u662F\u552F\u4E00\n // \u80FD\u5B8C\u6574\u770B\u5230\u5B83\u4EEC\u7684\u5730\u65B9\uFF0C\u6240\u4EE5\u540C\u4E00\u5957\u300C\u7236 \u2014 \u5B50\u300D\u6A21\u578B\u5728\u8FD9\u91CC\u843D\u5730\uFF1A\u5206\u7EC4\u5F00\u542F\u65F6\n // \u5B50\u4EE3\u7406\u4E0D\u518D\u4F5C\u4E3A\u72EC\u7ACB\u9876\u5C42\u5361\u7247\uFF0C\u800C\u662F\u6298\u53E0\u5728\u7236\u4F1A\u8BDD\u5361\u7247\u4E0B\u65B9\u3002\u6570\u636E\u6765\u81EA\n // sidebar-state \u7684\u5B98\u65B9 header \u8840\u7F18\u5B57\u6BB5\uFF08parentSession / origin\uFF09\uFF0C\u96F6\u89E3\u7801\u3002\n const [lineage, setLineage] = useState({})\n const [openKids, setOpenKids] = useState({})\n const [groupByLineage, setGroupByLineage] = useState(() => initialPrefs.groupByLineage !== false)\n\n const loadLineage = () => postJSON('/archived-sessions/sidebar-state', {})\n .then((r) => setLineage((r && r.lineage) || {}))\n .catch(() => {})\n\n // kind: 'ok'\uFF08\u9ED8\u8BA4\uFF09| 'err'\u3002\u505C\u7559\u65F6\u957F\u6309**\u5B57\u6570**\u7ED9\uFF08logic.toastDurationFor\uFF09\uFF1A\n // \u56FA\u5B9A 2.4s \u5BF9\"\u6392\u961F/\u5931\u8D25\"\u8FD9\u7C7B\u51E0\u5341\u5B57\u7684\u6587\u6848\u6839\u672C\u8BFB\u4E0D\u5B8C\uFF08\u7528\u6237 2026-09-10 \u53CD\u9988\uFF09\uFF1B\n // \u5931\u8D25\u7C7B\u518D +2s \u5E76\u7528\u8B66\u793A\u8272\u3002\u4EFB\u4F55\u63D0\u793A\u90FD\u53EF\u4EE5**\u70B9\u51FB\u7ACB\u5373\u5173\u95ED**\uFF0C\u4E0D\u5FC5\u5E72\u7B49\u3002\n const showToast = (msg, kind) => {\n if (timer.current) clearTimeout(timer.current)\n setToast({ msg, kind: kind === 'err' ? 'err' : 'ok' })\n timer.current = setTimeout(() => setToast(null), toastDurationFor(msg, kind))\n }\n\n const refresh = () => {\n setError(null)\n Promise.all([\n postJSON('/archived-sessions/sessions', {}),\n postJSON('/archived-sessions/workspaces', {}),\n postJSON('/archived-sessions/capabilities', {}),\n ])\n .then(([s, works, caps]) => {\n // Permanently-purged sessions must never re-appear here, even if DSH's\n // in-memory session index still lists them after the file was unlinked.\n const purged = dsmLoadPurged()\n const visible = (s.items || []).filter((x) => !purged.has(String(x.sessionId)))\n setSessions(visible)\n setWorkspaces(works.items || [])\n setCapabilities(caps || null)\n // \u6784\u5EFA\u6307\u7EB9\u6253\u5230\u63A7\u5236\u53F0\uFF1A\u9762\u677F\u884C\u4E3A\u4E0E\u6E90\u7801\u4E0D\u4E00\u81F4\u65F6\uFF0C\u7B2C\u4E00\u4EF6\u4E8B\u5C31\u662F\u6838\u5BF9\u8FD9\u884C\u2014\u2014\n // host \u7AEF\u53EA\u5728\u5BBF\u4E3B\u542F\u52A8\u65F6\u52A0\u8F7D\u4E00\u6B21\uFF0C\u4E0D\u91CD\u542F\u5BBF\u4E3B\u770B\u5230\u7684\u6C38\u8FDC\u662F\u65E7\u4EE3\u7801\u3002\n if (caps && caps.buildStamp) console.info('[dsh-sessions-manager] host build:', caps.buildStamp)\n setSelected({})\n setDelTarget(null)\n setConfirmBatch(false)\n loadLineage()\n if (!targetWs && works.items && works.items.length) setTargetWs(works.items[0].workspaceId)\n loadTrash()\n // \u4F1A\u8BDD\u96C6\u5408\u53D8\u4E86\uFF1A\u9762\u677F\u5F00\u7740\u5C31\u540C\u6B65\u5237\u65B0\uFF1B\u5173\u7740\u5219\u53EA\u6807\u810F\uFF0C\u7B49\u5C55\u5F00\u65F6\u518D\u5237\u3002\n if (storageOpen) loadStorage()\n else storageDirty.current = true\n })\n .catch((e) => setError(String((e && e.message) || e)))\n }\n\n useEffect(() => {\n refresh()\n return () => { if (timer.current) clearTimeout(timer.current) }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n // v3.6.2 #5\uFF1A\u9762\u677F\u53EA\u5728 mount \u62C9\u4E00\u6B21\uFF0C\u9884\u70ED\u7A97\u53E3\u5185\u6253\u5F00 = \u6574\u5217\u5360\u4F4D\u51BB\u7ED3\u5230\u624B\u70B9\n // \u300C\u91CD\u65B0\u52A0\u8F7D\u300D\u3002\u8FD9\u91CC\u6302\u4E00\u4E2A warm-done \u94A9\u5B50\uFF1Ahost \u9884\u70ED\u4ECE\u300C\u5728\u9014\u300D\u7FFB\u5230\u300C\u5B8C\u6210\u300D\n // \u7684\u77AC\u95F4\u81EA\u52A8\u8865\u4E00\u6B21\u5237\u65B0\uFF08\u6807\u9898/\u8840\u7F18/\u7A7A\u767D\u5206\u7C7B\u4E00\u8D77\u6D6E\u73B0\uFF09\u3002\u7A7A\u95F2\u65F6\u8BE5\u8F6C\u6362\u4E0D\u53D1\u751F\uFF0C\n // \u4E0D\u5F15\u5165\u4EFB\u4F55\u5468\u671F\u6027\u5237\u65B0\u3002\n const refreshRef = useRef(null)\n refreshRef.current = refresh\n useEffect(() => dsmOnWarmDone(() => { if (refreshRef.current) refreshRef.current() }), [])\n\n useEffect(() => {\n try { localStorage.setItem(PANEL_PREFS_KEY, JSON.stringify({ filter, workspaceFilter, sortBy, groupByLineage })) } catch (e) {}\n }, [filter, workspaceFilter, sortBy, groupByLineage])\n\n // \u81EA\u52A8\u5F52\u6863\u8BBE\u7F6E\u968F\u9762\u677F\u52A0\u8F7D\u4E00\u6B21\uFF08host \u4FA7\u8BFB\u53D6\u5373\u89E6\u53D1\u6BCF\u65E5\u68C0\u67E5\uFF09\u3002\n // \u5B58\u50A8\u7EDF\u8BA1\u523B\u610F\u4E0D\u5728\u8FD9\u91CC\u9884\u53D6\uFF1A\u5B83\u8981 stat \u6BCF\u6761\u65E5\u5FD7\uFF0C\u53EA\u5728\u7528\u6237\u5C55\u5F00\u9762\u677F\u65F6\u624D\u7B97\u3002\n useEffect(() => {\n loadAutoArchive()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n // \u6536\u85CF\u5207\u6362\uFF1A\u4E50\u89C2\u66F4\u65B0 + \u5931\u8D25\u56DE\u6EDA\uFF08star \u662F\u9AD8\u9891\u8F7B\u64CD\u4F5C\uFF0C\u4E0D\u7B49\u7F51\u7EDC\u5F80\u8FD4\uFF09\u3002\n const toggleStar = async (it) => {\n const next = !it.starred\n setSessions((s) => s && s.map((x) => (x.sessionId === it.sessionId ? { ...x, starred: next } : x)))\n try {\n await postJSON('/archived-sessions/star/set', { sessionId: it.sessionId, starred: next })\n } catch (e) {\n setSessions((s) => s && s.map((x) => (x.sessionId === it.sessionId ? { ...x, starred: !next } : x)))\n showToast('\u6536\u85CF\u5931\u8D25\uFF1A' + String((e && e.message) || e))\n }\n }\n\n // Markdown \u5BFC\u51FA\uFF1A\u81EA\u6709\u8DEF\u7531\uFF08/archived-sessions/export-md\uFF09\uFF0Cblob \u89E6\u53D1\u4E0B\u8F7D\u3002\n const exportMarkdown = async (it) => {\n if (mdBusy) return\n setMdBusy(it.sessionId)\n try {\n const res = await fetch('/archived-sessions/export-md?sessionId=' + encodeURIComponent(it.sessionId))\n if (!res.ok) throw new Error('HTTP ' + res.status)\n const blob = await res.blob()\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = 'dsh-session-' + it.sessionId + '.md'\n document.body.appendChild(a)\n a.click()\n a.remove()\n URL.revokeObjectURL(url)\n showToast('\u5DF2\u5BFC\u51FA Markdown')\n } catch (e) {\n showToast('\u5BFC\u51FA\u5931\u8D25\uFF1A' + String((e && e.message) || e))\n } finally {\n setMdBusy(null)\n }\n }\n\n // \u5B98\u65B9 ZIP \u5BFC\u51FA\u9884\u68C0\uFF08\u4E00\u6B21\u6027\uFF09\uFF1A\u540E\u7AEF\u4E0D\u652F\u6301 raw artifacts \u65F6\u8FD4\u56DE 501\uFF0C\n // \u6B64\u65F6\u9690\u85CF ZIP \u5165\u53E3\u53EA\u7559 Markdown\uFF08\u5168\u5C40\u7F13\u5B58\uFF0C\u540E\u7AEF\u80FD\u529B\u4E0D\u4F1A\u4E2D\u9014\u53D8\uFF09\u3002\n // \u63A2\u9488\u7528\u975E\u6CD5 id \u8D70 HEAD\uFF1A\u547D\u4E2D 501 = \u4E0D\u652F\u6301\uFF1B404/400 = \u8DEF\u7531\u6D3B\u7740\u4E14\u652F\u6301\u3002\n useEffect(() => {\n if (openDetails === null || zipChecked.current) return\n zipChecked.current = true\n fetch('/api/session.export?sessionId=probe&includeDescendants=false', { method: 'HEAD' })\n .then((res) => setZipOk(res.status !== 501))\n .catch(() => setZipOk(true))\n }, [openDetails])\n\n // Close the \u22EF menu on outside click / Escape (no full-screen backdrop).\n useEffect(() => {\n if (openMenu === null) return\n const onDown = (e) => {\n if (menuRef.current && !menuRef.current.contains(e.target)) setOpenMenu(null)\n }\n const onKey = (e) => { if (e.key === 'Escape') setOpenMenu(null) }\n document.addEventListener('mousedown', onDown)\n document.addEventListener('keydown', onKey)\n return () => {\n document.removeEventListener('mousedown', onDown)\n document.removeEventListener('keydown', onKey)\n }\n }, [openMenu])\n\n useEffect(() => {\n if (!delTarget && !purgeTarget) return\n const previous = document.activeElement\n const onKey = (e) => {\n if (e.key === 'Escape') { setDelTarget(null); setPurgeTarget(null) }\n }\n document.addEventListener('keydown', onKey)\n requestAnimationFrame(() => dialogRef.current && dialogRef.current.querySelector('button')?.focus())\n return () => {\n document.removeEventListener('keydown', onKey)\n if (previous && typeof previous.focus === 'function') previous.focus()\n }\n }, [delTarget, purgeTarget])\n\n const wsPath = (id) => {\n const w = workspaces.find((x) => x.workspaceId === id)\n return w ? w.path : ''\n }\n // \u80FD\u529B\u8BFB\u53D6\uFF1A\u4F18\u5148 v3.5.2 \u89C4\u8303\u952E\u540D\uFF0C\u56DE\u9000\u65E7\u952E\u540D\uFF08\u65E7 host / \u7F13\u5B58\u54CD\u5E94\u517C\u5BB9\uFF09\u3002\n const actionCapability = (name, legacy) => {\n const source = capabilities && capabilities.actions\n return (source && (source[name] || (legacy && source[legacy]))) || { available: false, reason: '\u6B63\u5728\u68C0\u67E5\u5F53\u524D DSH \u7684\u517C\u5BB9\u80FD\u529B\u2026' }\n }\n const canPurge = actionCapability('physicalPurge', 'purge')\n const canMove = actionCapability('relocateSession', 'move')\n const canRestoreTrash = actionCapability('restoreIndexedSession', 'restoreTrash')\n\n const archivedList = sessions ? sessions.filter((x) => x.archived) : []\n const activeList = sessions ? sessions.filter((x) => !x.archived) : []\n const starredList = starredOf(sessions)\n // issue #6 \u4E4B\u4E09\uFF1A\u7A7A\u767D\u4F1A\u8BDD\u5355\u5206\u4E00\u7C7B\u3002\u7A7A\u767D\u5224\u5B9A\u6765\u81EA\u5BBF\u4E3B\u8840\u7F18\u5FEB\u7167\uFF08sizeBytes \u9608\u503C\n // \u5B9E\u6D4B\u6821\u51C6\uFF09\uFF0C\u4E0E\u4FA7\u680F\u300C\u7A7A\u767D\u300D\u6807\u8BB0\u540C\u6E90\u2014\u2014\u4E24\u5904\u6C38\u8FDC\u4E0D\u4F1A\u5404\u8BF4\u5404\u8BDD\u3002\n const emptyList = useMemo(() => {\n if (!sessions) return []\n return sessions.filter((x) => { const li = lineage[String(x.sessionId)]; return !!(li && li.empty) })\n }, [sessions, lineage])\n const list = useMemo(() => {\n if (filter === 'trash') return []\n const base = filter === 'archived' ? archivedList : filter === 'active' ? activeList : filter === 'starred' ? starredList : filter === 'empty' ? emptyList : sessions || []\n const needle = query.trim().toLocaleLowerCase()\n const filtered = base.filter((item) => {\n if (workspaceFilter !== 'all' && (item.workspacePath || '') !== workspaceFilter) return false\n if (!needle) return true\n // v3.6.2 #6\uFF1A\u5360\u4F4D\u6807\u9898\u7684\u4F1A\u8BDD\u6309\u300C\u6709\u6548\u6807\u9898\u300D\uFF08\u5217\u8868\u503C \u2192 \u4FA7\u680F\u6743\u5A01\u56DE\u843D\uFF09\u5339\u914D\uFF0C\n // \u9884\u70ED\u8865\u9F50\u4F46\u9762\u677F\u672A\u5237\u65B0\u65F6\u4E5F\u80FD\u6309\u5173\u952E\u8BCD\u641C\u5230\u3002\n return [effectiveTitleOf(item, dsmAuthoritativeTitles), item.sessionId, item.workspaceTitle, item.workspacePath].some((value) => String(value || '').toLocaleLowerCase().includes(needle))\n })\n return [...filtered].sort((a, b) => {\n if (sortBy === 'oldest') return Number(a.createdAt || 0) - Number(b.createdAt || 0)\n if (sortBy === 'title') return effectiveTitleOf(a, dsmAuthoritativeTitles).localeCompare(effectiveTitleOf(b, dsmAuthoritativeTitles), 'zh-CN')\n return Number(b.createdAt || 0) - Number(a.createdAt || 0)\n })\n }, [sessions, filter, query, workspaceFilter, sortBy, emptyList, starredList])\n const selIds = Object.keys(selected).filter((k) => selected[k])\n // \u300C\u56DE\u6536\u7AD9\u300D\u662F\u72EC\u7ACB\u89C6\u56FE\uFF0C\u4E0D\u5171\u7528\u4F1A\u8BDD\u5217\u8868\u3002\n const showSessionList = filter !== 'trash'\n\n // \u8840\u7F18\u5206\u7EC4\uFF1A\u628A origin === 'subagent' \u7684\u4F1A\u8BDD\u6302\u5230\u7236\u4F1A\u8BDD\u5361\u7247\u4E0B\uFF08\u53EF\u5D4C\u5957\u5230\u5B59\n // \u4EE3\uFF09\u3002\u7236\u4F1A\u8BDD\u4E0D\u5728\u5F53\u524D\u5217\u8868\u91CC\uFF08\u88AB\u7B5B\u9009\u6389 / \u5DF2\u5220\u9664 / \u8DE8\u7EC4\uFF09\u65F6\u5B50\u4F1A\u8BDD\u4FDD\u6301\u9876\u5C42\uFF0C\n // \u4FDD\u8BC1\u300C\u641C\u5F97\u5230\u5C31\u4E00\u5B9A\u770B\u5F97\u89C1\u300D\uFF0C\u4E0D\u4F1A\u56E0\u4E3A\u6298\u53E0\u800C\u6D88\u5931\u3002\n const { topList, kidsOf, foldedCount } = useMemo(() => {\n if (!groupByLineage) return { topList: list, kidsOf: new Map(), foldedCount: 0 }\n return foldSubagents(list, lineage)\n }, [list, lineage, groupByLineage])\n\n // \u5B50\u4EE3\u7406\u6298\u53E0\u5206\u4E24\u4E2A\u90E8\u4EF6\uFF0C\u5404\u81EA\u8D34\u5728\u5B83\u8BE5\u5728\u7684\u4F4D\u7F6E\uFF1A\n // kidsBadge \u2014\u2014 \u6807\u9898\u884C\u5185\uFF0C\u7D27\u8DDF\u4F1A\u8BDD\u6807\u9898\uFF0C\u662F\u300C\u8FD9\u4E2A\u4F1A\u8BDD\u6709 N \u4E2A\u5B50\u4EE3\u7406\u300D\u7684\u8EAB\u4EFD\n // \u6807\u8BB0\uFF08\u8D34\u5728\u5361\u7247\u5E95\u90E8\u4F1A\u663E\u5F97\u50CF\u591A\u51FA\u7684\u4E00\u5757\uFF0C\u6CA1\u6709\u5F52\u5C5E\uFF09\uFF1B\n // renderKids \u2014\u2014 \u5C55\u5F00\u65F6\u7684\u5B50\u5217\u8868\uFF0C\u7528\u7AD6\u7EBF\u6302\u5728\u7236\u5361\u7247\u5185\u5BB9\u5DE6\u8FB9\u7F18\u4E0B\u65B9\u3002\n const kidsBadge = (sessionId) => {\n if (!groupByLineage) return null\n const kids = kidsOf.get(String(sessionId)) || []\n if (!kids.length) return null\n const open = !!openKids[sessionId]\n return (\n <button\n type=\"button\"\n className=\"dsm-kids-toggle\"\n aria-expanded={open}\n title={(open ? '\u6536\u8D77' : '\u5C55\u5F00') + ' ' + kids.length + ' \u4E2A\u5B50\u4EE3\u7406\u4F1A\u8BDD'}\n onClick={() => setOpenKids((s) => ({ ...s, [sessionId]: !s[sessionId] }))}\n >\n {open ? '\u25BE' : '\u25B8'} {kids.length} \u5B50\u4EE3\u7406\n </button>\n )\n }\n\n // issue #6 \u4E4B\u4E8C/\u4E4B\u4E09\uFF1A\u9762\u677F\u4FA7\u7684\u5206\u652F\u4E0E\u7A7A\u767D\u89C6\u89C9\u4FE1\u53F7\uFF08\u4FA7\u680F\u5DF2\u6709\u540C\u6E90 chip/tag\uFF09\u3002\n // \u5206\u652F\u6807\u8BB0 hover \u8BF4\u660E\u6765\u6E90\uFF1B\u7A7A\u767D\u6807\u8BB0\u63D0\u793A\u53BB\u300C\u7A7A\u767D\u300D\u5206\u7C7B\u6E05\u7406\u3002\n // \u7236\u4F1A\u8BDD\u6807\u9898\u67E5\u627E\u8D70\u4E00\u6B21\u6027 Map\uFF08sessions \u4F1A\u5230\u51E0\u767E\u6761\uFF0C\u6BCF\u5361\u7247 find \u662F O(n\u00B2)\uFF09\u3002\n const sessionsById = useMemo(() => new Map((sessions || []).map((x) => [String(x.sessionId), x])), [sessions])\n const branchBadge = (sessionId) => {\n const li = lineage[String(sessionId)]\n if (!li || li.origin === 'subagent' || !li.parentSession) return null\n const parent = sessionsById.get(String(li.parentSession))\n const label = parent && parent.title ? `\u5206\u652F\u4E8E\uFF1A${parent.title}` : `\u5206\u652F\u4F1A\u8BDD\uFF08\u6765\u6E90\uFF1A${shortId(li.parentSession)}\uFF09`\n return <span className=\"dsm-branch-chip\" title={label}>\u2442 \u5206\u652F</span>\n }\n const emptyBadge = (sessionId) => {\n const li = lineage[String(sessionId)]\n if (!li || !li.empty) return null\n return <span className=\"dsm-empty-chip\" title=\"\u65E0\u5185\u5BB9\u7684\u7A7A\u767D\u4F1A\u8BDD\">\u7A7A\u767D</span>\n }\n\n const renderKids = (parentId, depth) => {\n const kids = kidsOf.get(String(parentId)) || []\n if (!kids.length || !openKids[parentId]) return null\n return (\n <div className=\"dsm-kids\">\n {kids.map((k) => (\n <div className=\"dsm-kid\" key={k.sessionId}>\n <div className=\"dsm-kid-row\">\n <span className=\"dsm-kid-name\" title={k.title || k.sessionId}>{k.title || '(\u65E0\u6807\u9898)'}</span>\n <span className=\"dsm-kid-meta\">{k.archived ? '\u5DF2\u5F52\u6863' : '\u6D3B\u52A8'}{fmtDate(k.createdAt) ? ` \u00B7 ${fmtDate(k.createdAt)}` : ''}</span>\n <span className=\"dsm-kid-acts\">\n <button type=\"button\" className=\"archv-btn\" disabled={busy !== null} title=\"\u5207\u6362\u5230\u8FD9\u4E2A\u5B50\u4EE3\u7406\u4F1A\u8BDD\uFF08\u8BBE\u7F6E\u9762\u677F\u6321\u7740\u4F1A\u8BDD\u533A\uFF0C\u5173\u6389\u5373\u53EF\u770B\u5230\uFF09\" onClick={async () => {\n const name = k.title || (String(k.sessionId).slice(0, 8) + '\u2026')\n const res = await dsmOpenSessionById(k.sessionId, parentId)\n const msg = openSubagentToast(res, name, 'panel')\n showToast(msg.text, msg.kind)\n }}>\u6253\u5F00</button>\n <button type=\"button\" className=\"archv-btn\" disabled={busy !== null} onClick={() => act(k.archived ? 'restore' : 'archive', k)}>{k.archived ? '\u6062\u590D' : '\u5F52\u6863'}</button>\n <button type=\"button\" className=\"archv-btn archv-del\" disabled={busy !== null} title=\"\u79FB\u5165\u56DE\u6536\u7AD9\uFF0C\u53EF\u5728\u56DE\u6536\u7AD9\u6062\u590D\" onClick={() => setDelTarget(k)}>\u5220\u9664</button>\n </span>\n </div>\n {(depth || 0) < 4 && renderKids(k.sessionId, (depth || 0) + 1)}\n </div>\n ))}\n </div>\n )\n }\n\n const toggle = (id) => setSelected((s) => ({ ...s, [id]: !s[id] }))\n const clearSel = () => setSelected({})\n const selectAll = () => {\n const o = {}\n list.forEach((x) => { o[x.sessionId] = true })\n setSelected(o)\n }\n\n const act = (action, it) => {\n if (busy) return\n setBusy(it.sessionId)\n postJSON('/archived-sessions/' + action, { sessionId: it.sessionId })\n .then(() => {\n setBusy(null)\n const n = it.title || it.sessionId\n showToast(action === 'archive' ? `\u5DF2\u5F52\u6863\u300C${n}\u300D` : `\u5DF2\u6062\u590D\u300C${n}\u300D`)\n // \u5355\u6761\u5F52\u6863/\u6062\u590D\u53EA\u662F\u6210\u5458\u6807\u8BB0\u7FFB\u8F6C\uFF1A\u672C\u5730\u66F4\u65B0\u5373\u53EF\uFF0C\u4E0D\u8D70\u6574\u8868 refresh\n //\uFF08refresh \u4F1A\u6E05\u7A7A\u591A\u9009\u72B6\u6001\uFF1Bhost \u4FA7\u7F13\u5B58\u5DF2\u628A\u5217\u8868\u6210\u672C\u538B\u5230 stat \u7EA7\u522B\uFF09\u3002\n setSessions((s) => s && s.map((x) => (x.sessionId === it.sessionId ? { ...x, archived: action === 'archive' } : x)))\n })\n .catch((e) => { setBusy(null); setError(String((e && e.message) || e)) })\n }\n\n const doDeleteConfirmed = () => {\n if (!delTarget || busy) return\n setBusy(delTarget.sessionId)\n postJSON('/archived-sessions/delete', { sessionId: delTarget.sessionId })\n .then(() => {\n setBusy(null)\n const n = delTarget.title || delTarget.sessionId\n showToast(`\u5DF2\u5220\u9664 ${n}\uFF08\u5DF2\u79FB\u5165\u56DE\u6536\u7AD9\uFF09`)\n const sid = String(delTarget.sessionId)\n setDelTarget(null)\n // \u5220\u9664\u8FDB\u5165\u56DE\u6536\u7AD9\uFF1A\u672C\u5730\u79FB\u9664\u8BE5\u884C + \u5355\u5237\u56DE\u6536\u7AD9\uFF0C\u4E0D\u6574\u8868 refresh\u3002\n setSessions((s) => s && s.filter((x) => String(x.sessionId) !== sid))\n loadTrash()\n dsmLoadTrashIds()\n })\n .catch((e) => { setBusy(null); setDelTarget(null); setError(String((e && e.message) || e)) })\n }\n\n const loadTrash = () => {\n postJSON('/archived-sessions/trash/list', {})\n .then((r) => { setTrash(r.items || []); setTrashSettings(r.settings || { retentionDays: 0 }) })\n .catch(() => {})\n }\n\n const updateRetention = (days) => {\n setTrashBusy('__settings')\n postJSON('/archived-sessions/trash/settings', { retentionDays: Number(days) })\n .then((r) => { setTrashBusy(null); setTrashSettings(r.settings); showToast('\u5DF2\u66F4\u65B0\u81EA\u52A8\u6E05\u7406\u7B56\u7565') })\n .catch((e) => { setTrashBusy(null); setError(String((e && e.message) || e)) })\n }\n\n const verifyTrash = () => {\n setTrashBusy('__verify')\n postJSON('/archived-sessions/trash/verify', {})\n .then((r) => {\n setTrashBusy(null); setTrashCheck(r)\n if (r.missing) showToast(`\u53D1\u73B0 ${r.missing} \u6761\u65E5\u5FD7\u7F3A\u5931`)\n else if (r.unverified) showToast(`${r.unverified} \u6761\u65E5\u5FD7\u4F4D\u7F6E\u7531\u5F53\u524D Runtime \u7BA1\u7406\uFF0C\u65E0\u6CD5\u76F4\u63A5\u6838\u9A8C`)\n else showToast('\u56DE\u6536\u7AD9\u6821\u9A8C\u901A\u8FC7')\n })\n .catch((e) => { setTrashBusy(null); setError(String((e && e.message) || e)) })\n }\n\n // \u5B58\u50A8\u5360\u7528\u5206\u6790\uFF1A\u53EA\u8BFB\u805A\u5408\uFF08\u6309\u5DE5\u4F5C\u533A\u6392\u884C + \u6700\u5927\u7684\u4F1A\u8BDD\uFF09\u3002\u6309\u9700\u8C03\u7528\uFF0C\u4E0D\u5728\u9762\u677F\u52A0\u8F7D\u65F6\u9884\u53D6\u3002\n const loadStorage = () => {\n setStorageBusy(true)\n setStorageError(null)\n postJSON('/archived-sessions/storage', { topN: 10 })\n .then((r) => { setStorageBusy(false); setStorage(r); storageDirty.current = false })\n // \u9519\u8BEF\u7559\u5728\u9762\u677F\u5185\u81EA\u884C\u91CD\u8BD5\uFF0C\u4E0D\u5192\u6CE1\u6210\u6574\u4E2A\u8BBE\u7F6E\u9762\u677F\u7684\u9519\u8BEF\u6761\u3002\n .catch((e) => { setStorageBusy(false); setStorageError(String((e && e.message) || e)) })\n }\n\n // \u81EA\u52A8\u5F52\u6863\u8BBE\u7F6E\u3002\u4E00\u6B21\u7EAF\u8BFB\u53D6\u4F1A\u987A\u5E26\u8BA9 host \u8DD1\u4E00\u904D\u6BCF\u65E5\u68C0\u67E5\uFF08host \u4FA7\u6309\u5929\u8282\u6D41\uFF09\u3002\n const applyAa = (r) => setAa({ settings: r.settings || { inactiveDays: 0, skipStarred: true }, lastRunAt: r.lastRunAt ?? null, lastArchivedCount: r.lastArchivedCount || 0 })\n\n const loadAutoArchive = () => {\n postJSON('/archived-sessions/auto-archive/settings', {})\n .then(applyAa)\n .catch(() => {})\n }\n\n const updateAutoArchive = (patch) => {\n if (aaBusy) return\n setAaBusy(true)\n postJSON('/archived-sessions/auto-archive/settings', patch)\n .then((r) => { setAaBusy(false); applyAa(r); showToast('\u5DF2\u66F4\u65B0\u81EA\u52A8\u5F52\u6863\u7B56\u7565') })\n .catch((e) => { setAaBusy(false); setError(String((e && e.message) || e)) })\n }\n\n const runAutoArchive = () => {\n if (aaBusy) return\n setAaBusy(true)\n postJSON('/archived-sessions/auto-archive/run', {})\n .then((r) => {\n setAaBusy(false)\n applyAa(r)\n const n = r.archived || 0\n if (r.skipped === 'disabled') showToast('\u81EA\u52A8\u5F52\u6863\u672A\u542F\u7528')\n else { showToast(`\u5DF2\u81EA\u52A8\u5F52\u6863 ${n} \u4E2A\u4F1A\u8BDD`); if (n > 0) refresh() }\n })\n .catch((e) => { setAaBusy(false); setError(String((e && e.message) || e)) })\n }\n\n const restoreTrash = (sid) => {\n if (trashBusy) return\n setTrashBusy(sid)\n postJSON('/archived-sessions/trash/restore', { sessionId: sid })\n .then((r) => {\n setTrashBusy(null)\n showToast(r && r.workspaceGone ? '\u5DF2\u6062\u590D\u4F1A\u8BDD\uFF08\u539F\u5DE5\u4F5C\u533A\u5DF2\u5220\u9664\uFF0C\u4F1A\u8BDD\u6682\u5F52\u300C\u672A\u5206\u7EC4\u300D\uFF09' : '\u5DF2\u6062\u590D\u4F1A\u8BDD')\n loadTrash()\n refresh()\n })\n .catch((e) => { setTrashBusy(null); setError(String((e && e.message) || e)) })\n }\n const purgeTrash = (sid) => {\n if (trashBusy) return\n setTrashBusy(sid)\n postJSON('/archived-sessions/trash/purge', { sessionId: sid })\n .then(() => { setTrashBusy(null); showToast('\u5DF2\u5F7B\u5E95\u5220\u9664'); dsmMarkPurged([sid]); dsmLoadTrashIds(); loadTrash() })\n .catch((e) => { setTrashBusy(null); setError(String((e && e.message) || e)) })\n }\n const purgeAllTrash = () => {\n if (trashBusy || !trash.length) return\n setTrashBusy('__all')\n const all = trash.map((t) => t.sessionId)\n postJSON('/archived-sessions/trash/purge-many', { sessionIds: all })\n .then((result) => {\n setTrashBusy(null)\n const rows = result.results || []\n const succeeded = rows.filter((item) => item.ok).map((item) => item.sessionId)\n const failed = rows.filter((item) => !item.ok)\n if (succeeded.length) dsmMarkPurged(succeeded)\n dsmLoadTrashIds()\n loadTrash()\n if (failed.length) {\n const first = failed[0]\n setError(`\u6E05\u7406\u5B8C\u6210 ${succeeded.length} \u6761\uFF0C\u5931\u8D25 ${failed.length} \u6761\uFF1A${first.error || first.sessionId}`)\n } else showToast('\u5DF2\u6E05\u7A7A\u56DE\u6536\u7AD9')\n })\n .catch((e) => { setTrashBusy(null); setError(String((e && e.message) || e)) })\n }\n\n const doMove = (it) => {\n if (!canMove.available) { setError(canMove.reason || '\u5F53\u524D\u73AF\u5883\u4E0D\u652F\u6301\u8DE8\u5DE5\u4F5C\u533A\u79FB\u52A8'); return }\n const targetPath = moveMode === 'new' ? newPath.trim() : wsPath(targetWs)\n if (!targetPath) { setError('\u8BF7\u9009\u62E9\u5DF2\u6709\u5DE5\u4F5C\u533A\u6216\u8F93\u5165\u65B0\u7684\u76EE\u6807\u76EE\u5F55\u8DEF\u5F84'); return }\n setBusy(it.sessionId)\n setError(null)\n postJSON('/archived-sessions/move', { sessionId: it.sessionId, targetPath })\n .then((r) => {\n setBusy(null)\n setOpenMove(null)\n setMoveMode('existing')\n setNewPath('')\n // \u4F1A\u8BDD\u88AB DSH \u5360\u7528\uFF08\u6D3B\u8DC3\u4F1A\u8BDD / \u672A\u5173\u95ED\u7684\u4F1A\u8BDD\uFF09\uFF1A\u670D\u52A1\u7AEF\u5DF2\u767B\u8BB0\u6392\u961F\uFF0C\u7B49\u5B83\n // \u91CA\u653E\uFF08session/disposed\uFF09\u6216\u4E0B\u6B21\u542F\u52A8\u65F6\u81EA\u52A8\u5B8C\u6210\u3002\u4E0D\u8981\u8C0E\u62A5\"\u5DF2\u79FB\u52A8\"\u3002\n if (r && r.queued) {\n showToast(r.notes && r.notes.length ? r.notes.join(' ') : '\u4F1A\u8BDD\u6B63\u88AB DSH \u6253\u5F00\uFF0C\u5DF2\u6392\u961F\u5F85\u79FB\u52A8\u3002', 'err')\n setRetry(null)\n refresh()\n return\n }\n showToast(`\u5DF2\u628A\u300C${it.title || it.sessionId}\u300D\u79FB\u5230 ${r.workspaceTitle || targetPath}`)\n // \u975E\u81F4\u547D\u63D0\u793A\uFF08\u5982\u6E90\u76EE\u5F55\u4ECD\u6709\u65E7\u4EE3\u65E5\u5FD7\u672A\u81EA\u52A8\u6E05\u7406\uFF09\uFF1A\u9519\u8BEF\u6837\u5F0F + \u505C\u7559\u66F4\u4E45\uFF0C\n // \u8BA9\u7528\u6237\u6765\u5F97\u53CA\u8BFB\u5B8C\u518D\u53BB\u51B3\u5B9A\u600E\u4E48\u5904\u7406\u3002\n if (Array.isArray(r.notes) && r.notes.length > 0) showToast(r.notes.join(' '), 'err')\n // \u79FB\u52A8\u53EA\u6539 workspacePath/workspaceTitle\uFF1A\u672C\u5730\u66FF\u6362\u8BE5\u884C\uFF0C\u4E0D\u6574\u8868 refresh\u3002\n setSessions((s) => s && s.map((x) => (x.sessionId === it.sessionId\n ? { ...x, workspacePath: r.workspacePath || targetPath, workspaceTitle: r.workspaceTitle || targetPath }\n : x)))\n setRetry(null)\n })\n .catch((e) => {\n setBusy(null)\n setError(String((e && e.message) || e))\n // \u4F1A\u8BDD\u88AB DSH \u5360\u7528\u5199\u6743\u9650\uFF1A\u5207\u8D70\u4F1A\u8BDD\u540E\u539F\u5730\u91CD\u8BD5\u5373\u53EF\uFF0C\u4E0D\u5FC5\u91CD\u65B0\u9009\u76EE\u6807\u3002\n setRetry(e && e.code === BUSY_CODE ? { run: () => doMove(it) } : null)\n })\n }\n\n const doBatch = (action) => {\n if (!selIds.length || busy) return\n if (action === 'delete-many') {\n if (!confirmBatch) { setConfirmBatch(true); return }\n setConfirmBatch(false)\n }\n setBusy('__batch__')\n postJSON('/archived-sessions/' + action, { sessionIds: selIds })\n .then((r) => {\n setBusy(null)\n const n = (r && (r.archived || r.restored || r.deleted)) || selIds.length\n showToast(`\u5DF2\u5904\u7406 ${n} \u4E2A\u4F1A\u8BDD`)\n refresh()\n })\n .catch((e) => { setBusy(null); setConfirmBatch(false); setError(String((e && e.message) || e)) })\n }\n\n // issue #7\uFF1A\u6279\u91CF\u79FB\u52A8\u5230\u540C\u4E00\u4E2A\u76EE\u6807\u5DE5\u4F5C\u533A\u3002\u5931\u8D25\u9010\u6761\u56DE\u62A5\uFF0C\u4E0D\u4E2D\u65AD\u5176\u4F59\u4F1A\u8BDD\u3002\n // \u4F20\u5165 ids \u65F6\u53EA\u642C\u8FD9\u4E9B\uFF08\u7528\u4E8E\u300C\u91CD\u8BD5\u5931\u8D25\u7684\u4F1A\u8BDD\u300D\uFF09\uFF0C\u5426\u5219\u642C\u5F53\u524D\u9009\u4E2D\u3002\n const doBatchMove = (retryIds) => {\n const ids = (Array.isArray(retryIds) && retryIds.length) ? retryIds : selIds\n if (!ids.length || busy) return\n if (!canMove.available) { setError(canMove.reason || '\u5F53\u524D\u73AF\u5883\u4E0D\u652F\u6301\u8DE8\u5DE5\u4F5C\u533A\u79FB\u52A8'); return }\n const targetPath = moveMode === 'new' ? newPath.trim() : wsPath(targetWs)\n if (!targetPath) { setError('\u8BF7\u9009\u62E9\u5DF2\u6709\u5DE5\u4F5C\u533A\u6216\u8F93\u5165\u65B0\u7684\u76EE\u6807\u76EE\u5F55\u8DEF\u5F84'); return }\n setBusy('__batch__')\n setError(null)\n setRetry(null)\n postJSON('/archived-sessions/move-many', { sessionIds: ids, targetPath })\n .then((r) => {\n setBusy(null)\n setBatchMoveOpen(false)\n setMoveMode('existing')\n setNewPath('')\n const moved = (r && r.moved) || 0\n const failed = (r && Array.isArray(r.failed)) ? r.failed : []\n const queued = (r && Array.isArray(r.queued)) ? r.queued : []\n if (queued.length) {\n // \u6D3B\u8DC3/\u88AB\u5360\u7528\u7684\u4F1A\u8BDD\uFF1A\u670D\u52A1\u7AEF\u5DF2\u6392\u961F\uFF0C\u4E0B\u6B21\u91CD\u542F DSH \u65F6\u81EA\u52A8\u5B8C\u6210\u3002\n showToast(`${queued.length} \u4E2A\u4F1A\u8BDD\u5DF2\u6392\u961F\uFF08\u6B63\u88AB DSH \u6253\u5F00\uFF09\uFF0C\u91CD\u542F DSH \u540E\u81EA\u52A8\u5B8C\u6210\uFF1B\u8BF7\u5148\u522B\u6253\u5F00\u5B83\u4EEC\u3002`, 'err')\n }\n if (failed.length) {\n // \u77ED ID \u5217\u8868 + \u9996\u4E2A\u5931\u8D25\u539F\u56E0\uFF1A\u957F UUID \u5168\u5217\u51FA\u6765\u4E0D\u53EF\u8BFB\uFF0C\u539F\u56E0\u53EA\u7ED9\u7B2C\u4E00\u6761\n // \uFF08\u901A\u5E38\u540C\u6279\u5931\u8D25\u540C\u56E0\uFF09\uFF0C\u5B8C\u6574\u539F\u56E0\u4ECD\u53EF\u5728\u63A7\u5236\u53F0\u7F51\u7EDC\u9762\u677F\u67E5\u5230\u3002\n const firstReason = failed[0] && failed[0].error ? `\uFF0C\u9996\u4E2A\u539F\u56E0\uFF1A${failed[0].error.split('\\n')[0]}` : ''\n setError(`\u5DF2\u79FB\u52A8 ${moved} \u4E2A\u4F1A\u8BDD\uFF0C${failed.length} \u4E2A\u5931\u8D25\uFF08${failed.map((f) => shortId(f.sessionId)).join('\u3001')}\uFF09${firstReason}`)\n // \u88AB DSH \u5360\u7528\u5199\u6743\u9650\u7684\u90A3\u51E0\u4E2A\uFF1A\u5207\u8D70\u4F1A\u8BDD\u540E\u91CD\u8BD5\u4ECD\u6709\u620F\uFF0C\u53EA\u91CD\u6295\u8FD9\u51E0\u6761\u3002\n const busyIds = failed.filter((f) => f.code === BUSY_CODE).map((f) => f.sessionId)\n setRetry(busyIds.length ? { run: () => doBatchMove(busyIds) } : null)\n } else if (moved > 0) {\n showToast(`\u5DF2\u628A ${moved} \u4E2A\u4F1A\u8BDD\u79FB\u5230 ${targetPath}`)\n setRetry(null)\n } else {\n setRetry(null)\n }\n clearSel()\n refresh()\n })\n .catch((e) => {\n setBusy(null)\n setError(String((e && e.message) || e))\n setRetry(e && e.code === BUSY_CODE ? { run: () => doBatchMove(ids) } : null)\n })\n }\n\n const openMoveFor = (it) => {\n if (!canMove.available) { setError(canMove.reason || '\u5F53\u524D\u73AF\u5883\u4E0D\u652F\u6301\u8DE8\u5DE5\u4F5C\u533A\u79FB\u52A8'); return }\n if (openMove === it.sessionId) { setOpenMove(null); return }\n setTargetWs(workspaces.length ? (targetWs || workspaces[0].workspaceId) : '')\n setMoveMode('existing')\n setNewPath('')\n setOpenMove(it.sessionId)\n }\n\n const pickDirectory = async () => {\n if (!workspacesSvc || picking) return\n setPicking(true)\n try {\n const p = await workspacesSvc.pickDirectory()\n if (p) { setNewPath(p); setMoveMode('new') }\n } catch (e) {\n setError(String((e && e.message) || e))\n } finally {\n setPicking(false)\n }\n }\n\n const toggleDetails = (it) => {\n if (openDetails === it.sessionId) { setOpenDetails(null); return }\n if (details[it.sessionId]) {\n // v3.6.2 #11\uFF1A\u8BE6\u60C5\u662F\u540C\u751F\u547D\u5468\u671F\u5185\u6C38\u4E0D\u5931\u6548\u7684\u5FEB\u7167\uFF0C\u91CD\u5F00\u6C38\u8FDC\u663E\u793A\u65E7\u6570\u3002\n // \u52A0 30s TTL\uFF1A\u8FC7\u671F\u5373\u540E\u53F0\u91CD\u53D6\uFF08\u5148\u5C55\u793A\u65E7\u6570\u636E\u4E0D\u95EA\u7A7A\uFF0C\u56DE\u6765\u518D\u66FF\u6362\uFF09\u3002\n setOpenDetails(it.sessionId)\n const at = detailsAt.current[it.sessionId] || 0\n if (Date.now() - at > 30000) {\n postJSON('/archived-sessions/details', { sessionId: it.sessionId })\n .then((d) => { detailsAt.current[it.sessionId] = Date.now(); setDetails((m) => ({ ...m, [it.sessionId]: d })) })\n .catch(() => {})\n }\n return\n }\n setDetailsLoading(it.sessionId)\n postJSON('/archived-sessions/details', { sessionId: it.sessionId })\n .then((d) => {\n detailsAt.current[it.sessionId] = Date.now()\n setDetails((m) => ({ ...m, [it.sessionId]: d }))\n setDetailsLoading(null)\n setOpenDetails(it.sessionId)\n })\n .catch((e) => { setDetailsLoading(null); setError(String((e && e.message) || e)) })\n }\n\n const workspaceTag = (it) => {\n if (it.hasWorkspace && it.workspaceGone) {\n return <span className=\"archv-wtag archv-wgone\" title={(it.workspacePath || '') + '\uFF08\u539F\u5DE5\u4F5C\u533A\u5DF2\u5220\u9664\uFF09'}>\u5DE5\u4F5C\u533A\u5DF2\u5220 \u00B7 {pathName(it.workspacePath) || '?'}</span>\n }\n const wName = it.workspaceTitle || pathName(it.workspacePath)\n if (wName) return <span className=\"archv-wtag\" title={it.workspacePath || ''}>{wName}</span>\n return <span className=\"archv-wtag\">\u672A\u5206\u7EC4</span>\n }\n\n const runMenu = (id, it) => {\n setOpenMenu(null)\n if (id === 'restore') act('restore', it)\n else if (id === 'archive') act('archive', it)\n else if (id === 'delete') setDelTarget(it)\n else if (id === 'move') openMoveFor(it)\n else if (id === 'details') toggleDetails(it)\n }\n\n const rowMenu = (it) => {\n const items = it.archived\n ? [\n ['restore', '\u6062\u590D'],\n ['move', openMove === it.sessionId ? '\u6536\u8D77\u79FB\u52A8' : '\u79FB\u52A8'],\n ['details', openDetails === it.sessionId ? '\u6536\u8D77\u8BE6\u60C5' : '\u8BE6\u60C5'],\n ['delete', '\u5220\u9664'],\n ]\n : [['archive', '\u5F52\u6863'], ['move', '\u79FB\u52A8'], ['details', '\u8BE6\u60C5'], ['delete', '\u5220\u9664']]\n return (\n <div ref={openMenu === it.sessionId ? menuRef : null} className=\"more-wrap\">\n <button\n type=\"button\"\n className=\"more-btn\"\n aria-label=\"\u66F4\u591A\u64CD\u4F5C\"\n aria-haspopup=\"true\"\n aria-expanded={openMenu === it.sessionId}\n onClick={(e) => { e.stopPropagation(); setOpenMenu(openMenu === it.sessionId ? null : it.sessionId) }}\n >\u22EF</button>\n {openMenu === it.sessionId && (\n <div className=\"more-menu\" role=\"menu\">\n {items.map(([id, label]) => {\n const blocked = id === 'move' && !canMove.available\n return (\n <button\n key={id}\n type=\"button\"\n role=\"menuitem\"\n className={'more-item' + (id === 'delete' ? ' more-item-danger' : '')}\n disabled={blocked}\n title={blocked ? canMove.reason : undefined}\n onClick={() => runMenu(id, it)}\n >{label}</button>\n )\n })}\n </div>\n )}\n </div>\n )\n }\n\n return (\n <div className=\"archv\" role=\"region\" aria-label=\"\u4F1A\u8BDD\u7BA1\u7406\">\n <style>{CSS}</style>\n <div className=\"archv-head\">\n <h2 className=\"archv-title\">\u4F1A\u8BDD\u7BA1\u7406</h2>\n {capabilities && capabilities.buildStamp\n ? <span className=\"archv-stamp\" title={capabilities.buildStamp} onClick={() => navigator.clipboard && navigator.clipboard.writeText(capabilities.buildStamp).catch(() => {})}>{capabilities.buildStamp}</span>\n : null}\n {sessions !== null && <span className=\"archv-count\" aria-label={`${sessions.length} \u4E2A\u4F1A\u8BDD`}>{sessions.length}</span>}\n </div>\n <p className=\"archv-sub\">\n \u7EDF\u4E00\u7BA1\u7406\u5168\u90E8\u4F1A\u8BDD\uFF1A\u5F52\u6863 / \u6062\u590D / \u79FB\u52A8\u5230\u5176\u4ED6\u5DE5\u4F5C\u533A / \u4F1A\u8BDD\u8BE6\u60C5 / \u6279\u91CF\u64CD\u4F5C\uFF0C\u5220\u9664\u4F1A\u5148\u8FDB\u5165\u56DE\u6536\u7AD9\uFF0C\u53EF\u5728\u56DE\u6536\u7AD9\u5185\u6062\u590D\u6216\u5F7B\u5E95\u6E05\u7406\u3002\n </p>\n {error && (\n <div className=\"archv-err\" role=\"alert\">\n <span>{error}</span>\n <button\n type=\"button\"\n className=\"archv-errretry\"\n title={retry ? '\u628A\u521A\u624D\u5931\u8D25\u7684\u64CD\u4F5C\u539F\u6837\u518D\u505A\u4E00\u6B21\uFF08\u4F8B\u5982\u5148\u5207\u8D70\u88AB\u5360\u7528\u7684\u4F1A\u8BDD\u540E\u91CD\u8BD5\uFF09' : '\u91CD\u65B0\u52A0\u8F7D\u4F1A\u8BDD\u5217\u8868'}\n onClick={() => {\n const run = retry && retry.run\n setRetry(null)\n if (run) run(); else refresh()\n }}\n >\u91CD\u8BD5</button>\n </div>\n )}\n {sessions === null ? (\n <div className=\"archv-skel\" aria-label=\"\u52A0\u8F7D\u4E2D\">\n {[0, 1, 2].map((i) => <div key={i} className=\"archv-skel-card\" />)}\n </div>\n ) : (\n <>\n <div className={'sess-fwrap' + (moreOpen ? ' sess-fmore-open' : '') + (filter === 'starred' || filter === 'empty' || filter === 'trash' ? ' sess-fsec-on' : '')}>\n <div className=\"sess-filter\" role=\"tablist\" aria-label=\"\u4F1A\u8BDD\u7B5B\u9009\">\n <button type=\"button\" role=\"tab\" aria-selected={filter === 'all'} className={'sess-fbtn' + (filter === 'all' ? ' sess-fbtn-on' : '')} onClick={() => { setFilter('all'); clearSel(); setConfirmBatch(false) }}>\u5168\u90E8 ({sessions.length})</button>\n <button type=\"button\" role=\"tab\" aria-selected={filter === 'active'} className={'sess-fbtn' + (filter === 'active' ? ' sess-fbtn-on' : '')} onClick={() => { setFilter('active'); clearSel(); setConfirmBatch(false) }}>\u6D3B\u52A8 ({activeList.length})</button>\n <button type=\"button\" role=\"tab\" aria-selected={filter === 'archived'} className={'sess-fbtn' + (filter === 'archived' ? ' sess-fbtn-on' : '')} onClick={() => { setFilter('archived'); clearSel(); setConfirmBatch(false) }}>\u5DF2\u5F52\u6863 ({archivedList.length})</button>\n <span className=\"sess-fmore\" role=\"tablist\" aria-label=\"\u66F4\u591A\u4F1A\u8BDD\u7B5B\u9009\">\n <button type=\"button\" role=\"tab\" aria-selected={filter === 'starred'} className={'sess-fbtn' + (filter === 'starred' ? ' sess-fbtn-on' : '')} onClick={() => { setFilter('starred'); clearSel(); setConfirmBatch(false) }}>\u5DF2\u6536\u85CF ({starredList.length})</button>\n <button type=\"button\" role=\"tab\" aria-selected={filter === 'empty'} className={'sess-fbtn' + (filter === 'empty' ? ' sess-fbtn-on' : '')} onClick={() => { setFilter('empty'); clearSel(); setConfirmBatch(false) }}>\u7A7A\u767D ({emptyList.length})</button>\n <button type=\"button\" role=\"tab\" aria-selected={filter === 'trash'} className={'sess-fbtn' + (filter === 'trash' ? ' sess-fbtn-on' : '')} onClick={() => { setFilter('trash'); clearSel(); setConfirmBatch(false) }}>\u56DE\u6536\u7AD9 ({trash.length})</button>\n </span>\n <button type=\"button\" className=\"sess-farrow\" aria-expanded={moreOpen} aria-label={moreOpen ? '\u6536\u8D77\u66F4\u591A\u7B5B\u9009' : '\u5C55\u5F00\u66F4\u591A\u7B5B\u9009'} title={moreOpen ? '\u6536\u8D77\u66F4\u591A\u7B5B\u9009' : '\u5C55\u5F00\u66F4\u591A\u7B5B\u9009\uFF08\u5DF2\u6536\u85CF / \u7A7A\u767D / \u56DE\u6536\u7AD9\uFF09'} onClick={() => setMoreOpen(!moreOpen)}>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" aria-hidden=\"true\"><path d=\"M4 2l4 4-4 4\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>\n </button>\n </div>\n </div>\n\n {/* \u7EF4\u62A4\u680F\u662F\u9762\u677F\u7EA7\u5DE5\u5177\uFF0C\u4E0E\u5F53\u524D\u67E5\u770B\u54EA\u4E00\u7EC4\u4F1A\u8BDD\u65E0\u5173\uFF0C\u6545\u6240\u6709\u89C6\u56FE\u90FD\u663E\u793A\u3002 */}\n <div className=\"maint-bar\">\n <button type=\"button\" className=\"archv-btn\" aria-expanded={storageOpen} onClick={() => { const next = !storageOpen; setStorageOpen(next); if (next && (!storage || storageDirty.current) && !storageBusy) loadStorage() }}>\n \u5B58\u50A8\u5360\u7528{storage ? ` \u00B7 ${fmtBytes(storage.totalBytes) || '0 B'}` : ''}\n </button>\n <button type=\"button\" className={'archv-btn' + (aa.settings.inactiveDays ? ' archv-go' : '')} aria-expanded={aaOpen} onClick={() => setAaOpen(!aaOpen)}>\n \u81EA\u52A8\u5F52\u6863{aa.settings.inactiveDays ? `\uFF1A${aa.settings.inactiveDays} \u5929\u672A\u6D3B\u8DC3` : '\uFF1A\u672A\u542F\u7528'}\n </button>\n {aa.lastRunAt ? <span className=\"maint-note\">\u4E0A\u6B21\u68C0\u67E5 {fmtDate(aa.lastRunAt)}\uFF0C\u5F52\u6863 {aa.lastArchivedCount} \u4E2A</span> : <span className=\"maint-note\">\u5C1A\u672A\u68C0\u67E5</span>}\n </div>\n {aaOpen && (\n <div className=\"mv-sheet\" aria-label=\"\u81EA\u52A8\u5F52\u6863\u8BBE\u7F6E\">\n <div className=\"mv-sheet-head\">\n <h3 className=\"mv-sheet-title\">\u81EA\u52A8\u5F52\u6863</h3>\n <button type=\"button\" className=\"mv-sheet-close\" aria-label=\"\u5173\u95ED\" onClick={() => setAaOpen(false)}>\u00D7</button>\n </div>\n <div className=\"mv-field\">\n <label className=\"mv-field-label\" htmlFor=\"dsm-aa-days\">\u5C06\u591A\u4E45\u672A\u6D3B\u8DC3\u7684\u4F1A\u8BDD\u81EA\u52A8\u5F52\u6863</label>\n <select id=\"dsm-aa-days\" value={aa.settings.inactiveDays} disabled={aaBusy} onChange={(e) => updateAutoArchive({ inactiveDays: Number(e.target.value) })}>\n <option value=\"0\">\u4E0D\u81EA\u52A8\u5F52\u6863</option>\n <option value=\"30\">30 \u5929\u672A\u6D3B\u8DC3</option>\n <option value=\"60\">60 \u5929\u672A\u6D3B\u8DC3</option>\n <option value=\"90\">90 \u5929\u672A\u6D3B\u8DC3</option>\n </select>\n </div>\n <label className=\"aa-check\">\n <input type=\"checkbox\" checked={aa.settings.skipStarred !== false} disabled={aaBusy} onChange={(e) => updateAutoArchive({ skipStarred: e.target.checked })} />\n \u8DF3\u8FC7\u5DF2\u6536\u85CF\u7684\u4F1A\u8BDD\n </label>\n <div className=\"mv-foot\">\n <button type=\"button\" className=\"archv-btn\" disabled={aaBusy || !aa.settings.inactiveDays} onClick={runAutoArchive}>{aaBusy ? '\u68C0\u67E5\u4E2D\u2026' : '\u7ACB\u5373\u68C0\u67E5'}</button>\n </div>\n <div className=\"dtl-note\">\n \u81EA\u52A8\u5F52\u6863\u53EA\u662F\u628A\u4F1A\u8BDD\u6536\u8FDB\u300C\u5DF2\u5F52\u6863\u300D\uFF0C\u4E0D\u5220\u9664\u4EFB\u4F55\u6570\u636E\uFF0C\u968F\u65F6\u53EF\u6062\u590D\u3002\u5F53\u524D\u6B63\u5728\u4F7F\u7528\u7684\u4F1A\u8BDD\u6C38\u8FDC\u4E0D\u4F1A\u88AB\u81EA\u52A8\u5F52\u6863\u3002\u68C0\u67E5\u5728\u6253\u5F00\u672C\u9762\u677F\u65F6\u89E6\u53D1\uFF0C\u6BCF\u5929\u6700\u591A\u4E00\u6B21\u3002\n </div>\n </div>\n )}\n {storageOpen && (\n <div className=\"mv-sheet\" aria-label=\"\u5B58\u50A8\u5360\u7528\">\n <div className=\"mv-sheet-head\">\n <h3 className=\"mv-sheet-title\">\u5B58\u50A8\u5360\u7528</h3>\n <div className=\"mv-sheet-actions\">\n <button type=\"button\" className=\"archv-btn\" disabled={storageBusy} onClick={loadStorage}>{storageBusy ? '\u7EDF\u8BA1\u4E2D\u2026' : '\u91CD\u65B0\u7EDF\u8BA1'}</button>\n <button type=\"button\" className=\"mv-sheet-close\" aria-label=\"\u5173\u95ED\" onClick={() => setStorageOpen(false)}>\u00D7</button>\n </div>\n </div>\n {storageError ? (\n <div className=\"archv-err\" role=\"alert\">\n <span>{storageError}</span>\n <button type=\"button\" className=\"archv-errretry\" onClick={loadStorage}>\u91CD\u8BD5</button>\n </div>\n ) : !storage ? (\n <div className=\"archv-empty\">\u7EDF\u8BA1\u4E2D\u2026</div>\n ) : storage.sessionCount === 0 ? (\n <div className=\"archv-empty\">\u6682\u65E0\u4F1A\u8BDD\uFF0C\u6CA1\u6709\u53EF\u7EDF\u8BA1\u7684\u5B58\u50A8\u5360\u7528\u3002</div>\n ) : (\n <>\n <div className=\"dsm-storage-sum\">\n \u5171 {fmtBytes(storage.totalBytes) || '0 B'} \u00B7 {storage.sessionCount} \u4E2A\u4F1A\u8BDD{storage.unknownSessions ? ` \u00B7 ${storage.unknownSessions} \u4E2A\u5927\u5C0F\u672A\u77E5` : ''}\n </div>\n <div className=\"dsm-storage-list\">\n {storage.workspaces.map((w) => (\n <div className=\"dsm-storage-row\" key={w.key}>\n <span className=\"dsm-storage-name\" title={w.path || '\u672A\u5206\u7EC4'}>{w.title || (w.path ? pathName(w.path) : '\u672A\u5206\u7EC4')}</span>\n <span className=\"dsm-storage-bar\" aria-hidden=\"true\"><span className=\"dsm-storage-fill\" style={{ width: `${Math.round((w.share || 0) * 100)}%` }} /></span>\n <span className=\"dsm-storage-size\">{fmtBytes(w.bytes) || '\u2014'}</span>\n <span className=\"dsm-storage-count\">{w.sessions} \u4E2A</span>\n </div>\n ))}\n </div>\n {storage.top.length > 0 && (\n <div className=\"dtl-sec\">\n <div className=\"dtl-sec-t\">\u5360\u7528\u6700\u5927\u7684\u4F1A\u8BDD</div>\n <div className=\"dsm-storage-list\">\n {storage.top.map((s) => (\n <div className=\"dsm-storage-row\" key={s.sessionId}>\n <span className=\"dsm-storage-name\" title={s.sessionId}>{s.title || s.sessionId}</span>\n <span className=\"dsm-storage-size\">{fmtBytes(s.sizeBytes) || '\u2014'}</span>\n <span className=\"dsm-storage-count\">{s.workspaceTitle || (s.workspacePath ? pathName(s.workspacePath) : '\u672A\u5206\u7EC4')}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n <div className=\"dtl-note\">\u7EDF\u8BA1\u7684\u662F\u4F1A\u8BDD\u65E5\u5FD7\u6587\u4EF6\u7684\u78C1\u76D8\u5360\u7528\uFF08\u538B\u7F29\u540E\u7684\u5B9E\u9645\u5927\u5C0F\uFF09\uFF0C\u53EA\u8BFB\uFF0C\u4E0D\u4FEE\u6539\u4EFB\u4F55\u6570\u636E\u3002</div>\n </>\n )}\n </div>\n )}\n {showSessionList && (\n <>\n <div className=\"sess-tools sess-tools-4\" aria-label=\"\u67E5\u627E\u548C\u6574\u7406\u4F1A\u8BDD\">\n <div className=\"sess-field\">\n <label htmlFor=\"dsm-search\">\u641C\u7D22\u4F1A\u8BDD</label>\n <input id=\"dsm-search\" type=\"search\" value={query} onChange={(e) => setQuery(e.target.value)} placeholder=\"\u6807\u9898\u3001\u4F1A\u8BDD ID \u6216\u5DE5\u4F5C\u533A\" />\n </div>\n <div className=\"sess-field\">\n <label htmlFor=\"dsm-workspace-filter\">\u5DE5\u4F5C\u533A</label>\n <select id=\"dsm-workspace-filter\" value={workspaceFilter} onChange={(e) => setWorkspaceFilter(e.target.value)}>\n <option value=\"all\">\u5168\u90E8\u5DE5\u4F5C\u533A</option>\n {workspaces.map((w) => <option key={w.workspaceId} value={w.path}>{w.title}</option>)}\n </select>\n </div>\n <div className=\"sess-field\">\n <label htmlFor=\"dsm-sort\">\u6392\u5E8F</label>\n <select id=\"dsm-sort\" value={sortBy} onChange={(e) => setSortBy(e.target.value)}>\n <option value=\"newest\">\u6700\u65B0\u521B\u5EFA</option><option value=\"oldest\">\u6700\u65E9\u521B\u5EFA</option><option value=\"title\">\u6807\u9898 A\u2013Z</option>\n </select>\n </div>\n <div className=\"sess-field\">\n <label htmlFor=\"dsm-group\">\u5206\u7EC4</label>\n <select id=\"dsm-group\" value={groupByLineage ? 'lineage' : 'flat'} onChange={(e) => setGroupByLineage(e.target.value === 'lineage')} title=\"\u8840\u7F18\u5206\u7EC4\uFF1A\u5B50\u4EE3\u7406\u6298\u53E0\u5728\u7236\u4F1A\u8BDD\u4E0B\uFF1B\u5E73\u94FA\uFF1A\u4E0E DSH \u539F\u751F\u4E00\u81F4\uFF0C\u5168\u90E8\u5E76\u5217\">\n <option value=\"lineage\">\u8840\u7F18\uFF08\u5B50\u4EE3\u7406\u6298\u53E0\uFF09</option>\n <option value=\"flat\">\u5E73\u94FA\uFF08\u5168\u90E8\u5E76\u5217\uFF09</option>\n </select>\n </div>\n </div>\n <div className=\"sess-results\" role=\"status\">\n {/* \u4E00\u53E5\u8BDD\u8BF4\u6E05\u73B0\u72B6\uFF1A\u6709\u5B50\u4EE3\u7406\u6298\u53E0\u65F6\uFF0C\u6298\u53E0\u6570\u53D6\u4EE3\u300C\u5171 X \u4E2A\u300D\u5C3E\u5DF4\n \u51FA\u73B0\u5728\u540C\u4E00\u53E5\u91CC\uFF1B\u6CA1\u6709\u6298\u53E0\u65F6\u7EF4\u6301\u300C\u663E\u793A N \u4E2A\uFF0C\u5171 M \u4E2A\u300D\u3002 */}\n <span className=\"sess-results-main\">\n \u663E\u793A {topList.length} \u4E2A\u4F1A\u8BDD\n {foldedCount\n ? `\uFF0C\u53E6\u6709 ${foldedCount} \u4E2A\u5B50\u4EE3\u7406\u6298\u53E0\u5728\u7236\u4F1A\u8BDD\u4E0B`\n : query || workspaceFilter !== 'all'\n ? `\uFF0C\u5171 ${filter === 'archived' ? archivedList.length : filter === 'active' ? activeList.length : filter === 'starred' ? starredList.length : filter === 'empty' ? emptyList.length : sessions.length} \u4E2A`\n : (topList.length !== list.length ? `\uFF0C\u5171 ${list.length} \u4E2A` : '')}\n </span>\n </div>\n </>\n )}\n\n {showSessionList && list.length > 0 && (\n <div className={'sess-batch' + (selIds.length > 0 ? ' sess-batch-pin' : '')}>\n <span className=\"sess-btntext\">{selIds.length ? `\u5DF2\u9009 ${selIds.length} \u9879` : (filter === 'archived' ? `\u5171 ${archivedList.length} \u4E2A\u5F52\u6863\u4F1A\u8BDD` : filter === 'starred' ? `\u5171 ${starredList.length} \u4E2A\u6536\u85CF\u4F1A\u8BDD` : `\u5171 ${sessions.length} \u4E2A\u4F1A\u8BDD\uFF08\u6D3B\u52A8 ${activeList.length} / \u5DF2\u5F52\u6863 ${archivedList.length}\uFF09`)}</span>\n <button type=\"button\" className=\"archv-btn\" disabled={list.length === 0} onClick={selectAll}>\u5168\u9009</button>\n {selIds.length > 0 && (\n <>\n {filter === 'archived' && (\n <>\n <button type=\"button\" className=\"archv-btn\" disabled={busy !== null} onClick={() => doBatch('restore-many')}>\u6062\u590D\u6240\u9009</button>\n <button type=\"button\" className=\"archv-btn archv-del\" disabled={busy !== null} onClick={() => doBatch('delete-many')}>{confirmBatch ? '\u786E\u8BA4\u5220\u9664\u6240\u9009?' : '\u5220\u9664\u6240\u9009'}</button>\n </>\n )}\n {filter !== 'archived' && (\n <button type=\"button\" className=\"archv-btn\" disabled={busy !== null} onClick={() => doBatch('archive-many')}>\u5F52\u6863\u6240\u9009</button>\n )}\n {canMove.available && (\n <button\n type=\"button\"\n className=\"archv-btn\"\n disabled={busy !== null}\n aria-expanded={batchMoveOpen}\n onClick={() => setBatchMoveOpen(!batchMoveOpen)}\n >\n \u79FB\u52A8\u6240\u9009\u2026\n </button>\n )}\n <button type=\"button\" className=\"archv-btn\" onClick={clearSel}>\u53D6\u6D88\u9009\u62E9</button>\n </>\n )}\n {selIds.length > 0 && batchMoveOpen && canMove.available && (\n <div className=\"mv-sheet\" role=\"region\" aria-label=\"\u6279\u91CF\u79FB\u52A8\u5230\u5DE5\u4F5C\u533A\">\n <div className=\"mv-sheet-head\">\n <h3 className=\"mv-sheet-title\">\u6279\u91CF\u79FB\u52A8 {selIds.length} \u4E2A\u4F1A\u8BDD</h3>\n <button type=\"button\" className=\"mv-sheet-close\" aria-label=\"\u5173\u95ED\" onClick={() => setBatchMoveOpen(false)}>\u00D7</button>\n </div>\n <div className=\"mv-seg\" role=\"tablist\">\n <button type=\"button\" role=\"tab\" aria-selected={moveMode === 'existing'} className={'mv-segbtn' + (moveMode === 'existing' ? ' mv-segbtn-on' : '')} onClick={() => setMoveMode('existing')}>\u5DF2\u6709\u5DE5\u4F5C\u533A</button>\n <button type=\"button\" role=\"tab\" aria-selected={moveMode === 'new'} className={'mv-segbtn' + (moveMode === 'new' ? ' mv-segbtn-on' : '')} onClick={() => setMoveMode('new')}>\u65B0\u5EFA\u76EE\u5F55</button>\n </div>\n {moveMode === 'existing' ? (\n <div className=\"mv-field\">\n <label className=\"mv-field-label\" htmlFor=\"mv-batch-ws\">\u76EE\u6807\u5DE5\u4F5C\u533A</label>\n <select id=\"mv-batch-ws\" value={targetWs} onChange={(e) => setTargetWs(e.target.value)}>\n {workspaces.length === 0 && <option value=\"\">\uFF08\u6682\u65E0\u5DE5\u4F5C\u533A\uFF09</option>}\n {workspaces.map((w) => (\n <option key={w.workspaceId} value={w.workspaceId}>{w.title} \u00B7 {w.path}</option>\n ))}\n </select>\n </div>\n ) : (\n <div className=\"mv-field\">\n <label className=\"mv-field-label\" htmlFor=\"mv-batch-path\">\u65B0\u5DE5\u4F5C\u533A\u76EE\u5F55\u8DEF\u5F84</label>\n <div className=\"mv-browse-row\">\n <input\n id=\"mv-batch-path\"\n type=\"text\"\n value={newPath}\n onChange={(e) => setNewPath(e.target.value)}\n placeholder=\"\u4F8B\u5982 /Users/you/Projects/demo \u6216 ~/demo\"\n />\n <button\n type=\"button\"\n className=\"archv-btn\"\n onClick={pickDirectory}\n disabled={busy !== null || picking || !workspacesSvc}\n title={!workspacesSvc ? '\u5F53\u524D\u8FD0\u884C\u73AF\u5883\u4E0D\u652F\u6301\u7CFB\u7EDF\u76EE\u5F55\u9009\u62E9' : '\u6253\u5F00\u7CFB\u7EDF\u76EE\u5F55\u9009\u62E9\u7A97\u53E3'}\n >\n {picking ? '\u9009\u62E9\u4E2D\u2026' : '\u6D4F\u89C8\u2026'}\n </button>\n </div>\n </div>\n )}\n <div className=\"mv-foot\">\n <button type=\"button\" className=\"archv-btn\" onClick={() => setBatchMoveOpen(false)}>\u53D6\u6D88</button>\n <button type=\"button\" className=\"archv-btn archv-go\" disabled={busy !== null} onClick={() => doBatchMove()}>\n {busy === '__batch__' && <span className=\"archv-spin\" aria-hidden=\"true\" />}\u786E\u8BA4\u79FB\u52A8\n </button>\n </div>\n </div>\n )}\n </div>\n )}\n\n {showSessionList && list.length === 0 ? (\n <div className=\"archv-empty\">{query || workspaceFilter !== 'all' ? '\u6CA1\u6709\u5339\u914D\u7684\u4F1A\u8BDD\u3002\u8BF7\u8C03\u6574\u641C\u7D22\u8BCD\u6216\u5DE5\u4F5C\u533A\u7B5B\u9009\u3002' : filter === 'archived' ? '\u76EE\u524D\u6CA1\u6709\u5F52\u6863\u4F1A\u8BDD\u3002\u5728\u201C\u5168\u90E8\u201D\u91CC\u9009\u4E2D\u4F1A\u8BDD\u70B9\u201C\u5F52\u6863\u201D\u5373\u53EF\u6536\u7EB3\u8FDB\u6765\u3002' : filter === 'active' ? '\u76EE\u524D\u6CA1\u6709\u6D3B\u52A8\u4F1A\u8BDD\u3002' : filter === 'starred' ? '\u8FD8\u6CA1\u6709\u6536\u85CF\u7684\u4F1A\u8BDD\u3002\u70B9\u51FB\u4F1A\u8BDD\u5DE6\u4FA7\u7684\u661F\u6807\u5373\u53EF\u6536\u85CF\u3002' : filter === 'empty' ? '\u6CA1\u6709\u7A7A\u767D\u4F1A\u8BDD\u3002\u65B0\u5F00\u4F1A\u8BDD\u8FD8\u6CA1\u4EA7\u751F\u5185\u5BB9\u65F6\u4F1A\u5F52\u5230\u8FD9\u91CC\uFF0C\u53EF\u5728\u4FA7\u680F\u7528\u300C\u7EAF\u51C0\u89C6\u56FE\u300D\u628A\u5B83\u4EEC\u4E00\u5E76\u6298\u53E0\u3002' : '\u6682\u65E0\u53EF\u7BA1\u7406\u7684\u4F1A\u8BDD\u3002'}</div>\n ) : showSessionList ? (\n <div className=\"archv-list\" role=\"list\">\n {topList.map((it) => {\n const date = fmtDate(it.createdAt)\n const expanded = openMove === it.sessionId\n return (\n <div key={it.sessionId} className={'archv-card' + (expanded ? ' archv-card-exp' : '')} role=\"listitem\">\n <div className=\"archv-row\">\n <input\n type=\"checkbox\"\n className=\"archv-check\"\n checked={!!selected[it.sessionId]}\n onChange={() => toggle(it.sessionId)}\n aria-label={'\u9009\u62E9 ' + (it.title || it.sessionId)}\n />\n <button\n type=\"button\"\n className={'archv-star' + (it.starred ? ' archv-star-on' : '')}\n aria-pressed={!!it.starred}\n aria-label={(it.starred ? '\u53D6\u6D88\u6536\u85CF ' : '\u6536\u85CF ') + (it.title || it.sessionId)}\n title={it.starred ? '\u53D6\u6D88\u6536\u85CF' : '\u6536\u85CF'}\n onClick={(e) => { e.stopPropagation(); toggleStar(it) }}\n >\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12 2.5l2.9 5.9 6.6.9-4.8 4.6 1.2 6.5-5.9-3.1-5.9 3.1 1.2-6.5L2.5 9.3l6.6-.9z\" /></svg>\n </button>\n <div className=\"archv-body\">\n <div className=\"archv-main\">\n <div className=\"archv-titlerow\">\n <span className=\"archv-name\" title={it.title || ''}>{it.title || '(\u65E0\u6807\u9898)'}</span>\n {branchBadge(it.sessionId)}\n {emptyBadge(it.sessionId)}\n {kidsBadge(it.sessionId)}\n <span className=\"archv-id\" title={it.sessionId}>{shortId(it.sessionId)}</span>\n </div>\n <div className=\"archv-meta\">\n {it.archived ? <span className=\"archv-wtag archv-wgone\">\u5DF2\u5F52\u6863</span> : <span className=\"archv-wtag archv-active\">\u6D3B\u52A8</span>}\n {workspaceTag(it)}\n {date && <><span className=\"archv-dot\">\u00B7</span><span className=\"archv-date\">{date}</span></>}\n </div>\n </div>\n {rowMenu(it)}\n </div>\n </div>\n {groupByLineage && renderKids(it.sessionId, 0)}\n {expanded && (\n <div className=\"mv-sheet\" role=\"region\" aria-label=\"\u79FB\u52A8\u5230\u5DE5\u4F5C\u533A\">\n <div className=\"mv-sheet-head\">\n <h3 className=\"mv-sheet-title\">\u79FB\u52A8\u5230\u5DE5\u4F5C\u533A</h3>\n <button type=\"button\" className=\"mv-sheet-close\" aria-label=\"\u5173\u95ED\" onClick={() => setOpenMove(null)}>\u00D7</button>\n </div>\n <div className=\"mv-seg\" role=\"tablist\">\n <button type=\"button\" role=\"tab\" aria-selected={moveMode === 'existing'} className={'mv-segbtn' + (moveMode === 'existing' ? ' mv-segbtn-on' : '')} onClick={() => setMoveMode('existing')}>\u5DF2\u6709\u5DE5\u4F5C\u533A</button>\n <button type=\"button\" role=\"tab\" aria-selected={moveMode === 'new'} className={'mv-segbtn' + (moveMode === 'new' ? ' mv-segbtn-on' : '')} onClick={() => setMoveMode('new')}>\u65B0\u5EFA\u76EE\u5F55</button>\n </div>\n {moveMode === 'existing' ? (\n <div className=\"mv-field\">\n <label className=\"mv-field-label\" htmlFor=\"mv-target-ws\">\u76EE\u6807\u5DE5\u4F5C\u533A</label>\n <select id=\"mv-target-ws\" value={targetWs} onChange={(e) => setTargetWs(e.target.value)}>\n {workspaces.length === 0 && <option value=\"\">\uFF08\u6682\u65E0\u5DE5\u4F5C\u533A\uFF09</option>}\n {workspaces.map((w) => (\n <option key={w.workspaceId} value={w.workspaceId}>{w.title} \u00B7 {w.path}</option>\n ))}\n </select>\n </div>\n ) : (\n <div className=\"mv-field\">\n <label className=\"mv-field-label\" htmlFor=\"mv-new-path\">\u65B0\u5DE5\u4F5C\u533A\u76EE\u5F55\u8DEF\u5F84</label>\n <div className=\"mv-browse-row\">\n <input\n id=\"mv-new-path\"\n type=\"text\"\n value={newPath}\n onChange={(e) => setNewPath(e.target.value)}\n placeholder=\"\u4F8B\u5982 /Users/you/Projects/demo \u6216 ~/demo\"\n />\n <button\n type=\"button\"\n className=\"archv-btn\"\n onClick={pickDirectory}\n disabled={busy !== null || picking || !workspacesSvc}\n title={!workspacesSvc ? '\u5F53\u524D\u8FD0\u884C\u73AF\u5883\u4E0D\u652F\u6301\u7CFB\u7EDF\u76EE\u5F55\u9009\u62E9' : '\u6253\u5F00\u7CFB\u7EDF\u76EE\u5F55\u9009\u62E9\u7A97\u53E3'}\n >\n {picking ? '\u9009\u62E9\u4E2D\u2026' : '\u6D4F\u89C8\u2026'}\n </button>\n </div>\n </div>\n )}\n <div className=\"mv-foot\">\n <button type=\"button\" className=\"archv-btn\" onClick={() => setOpenMove(null)}>\u53D6\u6D88</button>\n <button type=\"button\" className=\"archv-btn archv-go\" disabled={busy !== null} onClick={() => doMove(it)}>\n {busy === it.sessionId && <span className=\"archv-spin\" aria-hidden=\"true\" />}\u786E\u8BA4\u79FB\u52A8\n </button>\n </div>\n </div>\n )}\n {openDetails === it.sessionId && (\n <div className=\"dtl-sheet\" role=\"region\" aria-label=\"\u4F1A\u8BDD\u8BE6\u60C5\">\n <div className=\"dtl-sheet-head\">\n <h3 className=\"dtl-sheet-title\">\u4F1A\u8BDD\u8BE6\u60C5</h3>\n <button type=\"button\" className=\"mv-sheet-close\" aria-label=\"\u5173\u95ED\u8BE6\u60C5\" onClick={() => setOpenDetails(null)}>\u00D7</button>\n </div>\n {detailsLoading === it.sessionId ? (\n <div className=\"archv-skel\" aria-label=\"\u52A0\u8F7D\u4E2D\">{[0, 1].map((i) => <div key={i} className=\"archv-skel-card\" />)}</div>\n ) : (() => {\n const d = details[it.sessionId]\n if (!d) return <div className=\"dtl-paths\">\u6682\u65E0\u8BE6\u60C5</div>\n const st = d.stats || {}\n const tools = st.toolCounts ? Object.entries(st.toolCounts).sort((a, b) => b[1] - a[1]).slice(0, 10) : []\n return (\n <div>\n <div className=\"dtl-grid\">\n <div className=\"dtl-cell\"><span className=\"dtl-k\">\u78C1\u76D8\u5360\u7528</span><span className=\"dtl-v\">{fmtBytes(d.sizeBytes) || '\u2014'}</span></div>\n <div className=\"dtl-cell\"><span className=\"dtl-k\">\u8F6E\u6B21 / \u6B65\u9AA4</span><span className=\"dtl-v\">{st.turns ?? 0} / {st.steps ?? 0}</span></div>\n <div className=\"dtl-cell\"><span className=\"dtl-k\">\u7528\u6237 / \u52A9\u624B</span><span className=\"dtl-v\">{st.userMessages ?? 0} / {st.assistantMessages ?? 0}</span></div>\n <div className=\"dtl-cell\"><span className=\"dtl-k\">\u5DE5\u5177\u8C03\u7528</span><span className=\"dtl-v\">{st.toolCalls ?? 0}</span></div>\n <div className=\"dtl-cell\"><span className=\"dtl-k\">\u56FE\u7247\u9644\u4EF6</span><span className=\"dtl-v\">{st.attachments ?? 0}</span></div>\n <div className=\"dtl-cell\"><span className=\"dtl-k\">\u521B\u5EFA / \u66F4\u65B0</span><span className=\"dtl-v\">{fmtDate(d.createdAt) || '\u2014'} \u00B7 {fmtDate(d.updatedAt) || '\u2014'}</span></div>\n </div>\n {tools.length > 0 && (\n <div className=\"dtl-sec\"><div className=\"dtl-sec-t\">\u5DE5\u5177\u4F7F\u7528</div>\n <div className=\"dtl-tags\">{tools.map(([t, c]) => <span className=\"dtl-tag\" key={t}>{t} \u00D7{c}</span>)}</div>\n </div>\n )}\n {st.fetches && st.fetches.length > 0 && (\n <div className=\"dtl-sec\"><div className=\"dtl-sec-t\">\u641C\u7D22 / \u6293\u53D6</div>\n <ul className=\"dtl-list\">{st.fetches.map((f, i) => <li key={i}>{f.tool}{f.query ? ` \u300C${f.query}\u300D` : ''}</li>)}</ul>\n </div>\n )}\n {d.files && d.files.length > 0 && (\n <div className=\"dtl-sec\"><div className=\"dtl-sec-t\">\u5199\u8FC7\u7684\u6587\u4EF6\uFF08{d.files.length}\uFF09</div>\n <ul className=\"dtl-list\">{d.files.map((f, i) => <li key={i}><code>{f.path}</code> <span className=\"dtl-filetool\">({f.tool})</span></li>)}</ul>\n </div>\n )}\n {d.lineage && (d.lineage.parentSessionId || (d.lineage.children && d.lineage.children.length > 0) || (d.lineage.subagents && d.lineage.subagents.length > 0)) && (\n <div className=\"dtl-sec\"><div className=\"dtl-sec-t\">\u8840\u7EDF</div>\n <div className=\"dtl-paths\">\n {d.lineage.parentSessionId && <div>\u7236\u4F1A\u8BDD: <code>{d.lineage.parentSessionId}</code></div>}\n {d.lineage.children && d.lineage.children.length > 0 && <div>\u5B50\u4F1A\u8BDD ({d.lineage.children.length}): <code>{d.lineage.children.join(', ')}</code></div>}\n {d.lineage.subagents && d.lineage.subagents.length > 0 && <div>\u5B50\u4EE3\u7406 ({d.lineage.subagents.length}): <code>{d.lineage.subagents.join(', ')}</code></div>}\n </div>\n </div>\n )}\n <div className=\"dtl-sec\">\n <div className=\"dtl-sec-t\">\u5BFC\u51FA</div>\n <div className=\"dtl-export\">\n <a\n className=\"archv-btn\"\n href={`/api/session.export?sessionId=${encodeURIComponent(it.sessionId)}&includeDescendants=true`}\n onClick={(e) => e.stopPropagation()}\n style={zipOk ? undefined : { pointerEvents: 'none', opacity: 0.45 }}\n title={zipOk ? '\u542B\u5B50\u4F1A\u8BDD\u4E0E\u9644\u4EF6\uFF0C\u7531 DSH \u63D0\u4F9B' : '\u5F53\u524D\u6301\u4E45\u5316\u540E\u7AEF\u4E0D\u652F\u6301\u539F\u59CB\u65E5\u5FD7\u5BFC\u51FA'}\n >\u4E0B\u8F7D\u539F\u59CB\u65E5\u5FD7 (ZIP)</a>\n <button type=\"button\" className=\"archv-btn\" disabled={mdBusy === it.sessionId} onClick={() => exportMarkdown(it)}>{mdBusy === it.sessionId ? '\u751F\u6210\u4E2D\u2026' : '\u5BFC\u51FA Markdown'}</button>\n </div>\n <div className=\"dtl-note\">ZIP \u542B\u5B50\u4F1A\u8BDD\u4E0E\u9644\u4EF6\uFF0C\u7531 DSH \u63D0\u4F9B \u00B7 Markdown \u4E3A\u672C\u63D2\u4EF6\u751F\u6210\u7684\u53EF\u8BFB\u5BF9\u8BDD\u8BB0\u5F55</div>\n </div>\n </div>\n )\n })()}\n </div>\n )}\n </div>\n )\n })}\n </div>\n ) : null}\n </>\n )}\n {toast && <div className={'archv-status' + (toast.kind === 'err' ? ' archv-status-err' : '') + (String(toast.msg).length > 28 ? ' archv-status-long' : '')} role=\"status\" title=\"\u70B9\u51FB\u5173\u95ED\" onClick={() => setToast(null)}>{toast.msg}</div>}\n {delTarget && (\n <div className=\"dlg-backdrop\" onClick={() => setDelTarget(null)}>\n <div ref={dialogRef} className=\"dlg\" role=\"alertdialog\" aria-modal=\"true\" aria-label=\"\u5220\u9664\u4F1A\u8BDD\" onClick={(e) => e.stopPropagation()}>\n <h3 className=\"dlg-title\">\u5220\u9664\u4F1A\u8BDD</h3>\n <p className=\"dlg-text\">\u786E\u8BA4\u5220\u9664\u300C{delTarget.title || delTarget.sessionId}\u300D\uFF1F\u5C06\u79FB\u5165\u56DE\u6536\u7AD9\uFF0C\u53EF\u5728\u672C\u9875\u5E95\u90E8\u300C\u56DE\u6536\u7AD9\u300D\u4E2D\u6062\u590D\u6216\u5F7B\u5E95\u5220\u9664\u3002</p>\n <div className=\"dlg-actions\">\n <button type=\"button\" className=\"archv-btn\" disabled={busy !== null} onClick={() => setDelTarget(null)}>\u53D6\u6D88</button>\n <button type=\"button\" className=\"archv-btn archv-del\" disabled={busy !== null} onClick={doDeleteConfirmed}>\u79FB\u5165\u56DE\u6536\u7AD9</button>\n </div>\n </div>\n </div>\n )}\n {filter === 'trash' && <section className=\"dsm-trash\" aria-label=\"\u56DE\u6536\u7AD9\">\n <div className=\"dsm-trash-h\">\n <h3>\u56DE\u6536\u7AD9</h3>\n <span className=\"dsm-trash-count\">{trash.length ? `\uFF08${trash.length} \u4E2A\u5F85\u6E05\u7406\uFF09` : '\uFF08\u7A7A\uFF09'}</span>\n </div>\n <div className=\"sess-tools\">\n <div className=\"sess-field\">\n <label htmlFor=\"dsm-retention\">\u81EA\u52A8\u6E05\u7406</label>\n <select id=\"dsm-retention\" value={trashSettings.retentionDays || 0} disabled={trashBusy !== null} onChange={(e) => updateRetention(e.target.value)}>\n <option value=\"0\">\u4E0D\u81EA\u52A8\u6E05\u7406</option><option value=\"7\">\u4FDD\u7559 7 \u5929</option><option value=\"30\">\u4FDD\u7559 30 \u5929</option><option value=\"90\">\u4FDD\u7559 90 \u5929</option>\n </select>\n </div>\n <div className=\"sess-field\"><label>\u6570\u636E\u68C0\u67E5</label><button type=\"button\" className=\"archv-btn\" disabled={trashBusy !== null} onClick={verifyTrash}>{trashBusy === '__verify' ? '\u6821\u9A8C\u4E2D\u2026' : '\u6821\u9A8C\u65E5\u5FD7\u5B8C\u6574\u6027'}</button></div>\n <div className=\"sess-field\"><label>\u6C38\u4E45\u6E05\u7406</label><button type=\"button\" className=\"archv-btn archv-del\" disabled={trashBusy !== null || !trash.length || !canPurge.available} aria-disabled={!canPurge.available} title={!canPurge.available ? canPurge.reason : '\u7269\u7406\u5220\u9664\u8FD9\u4E9B\u65E5\u5FD7\uFF0C\u91CA\u653E\u78C1\u76D8\u7A7A\u95F4'} onClick={() => setPurgeTarget('__all')}>\u6E05\u7A7A\u56DE\u6536\u7AD9</button></div>\n </div>\n {!canPurge.available && (\n <div className=\"archv-empty\" role=\"status\">\n {canPurge.reason}\u3002\u56DE\u6536\u7AD9\u6761\u76EE\u4F1A\u4E00\u76F4\u4FDD\u7559\uFF0C\u53EF\u968F\u65F6\u6062\u590D\uFF1B\u5F53\u524D DSH \u7248\u672C\u4E0B\u79FB\u5165\u56DE\u6536\u7AD9<b>\u4E0D\u4F1A\u91CA\u653E\u78C1\u76D8\u7A7A\u95F4</b>\uFF0C\u4F1A\u8BDD\u65E5\u5FD7\u4ECD\u5B8C\u6574\u4FDD\u7559\u5728\u539F\u5DE5\u4F5C\u533A\u76EE\u5F55\u3002\n </div>\n )}\n <div className=\"dtl-note\">\u56DE\u6536\u7AD9\u662F\u8F6F\u5220\u9664\uFF1A\u65E5\u5FD7\u4ECD\u7559\u5728\u539F\u5DE5\u4F5C\u533A\u76EE\u5F55\uFF0C\u300C\u5F7B\u5E95\u5220\u9664\u300D\u624D\u662F\u771F\u6B63\u91CA\u653E\u78C1\u76D8\u7A7A\u95F4\u7684\u4E00\u6B65\uFF08\u5F53\u524D\u7248\u672C\u672A\u652F\u6301\u65F6\u4F1A\u4FDD\u6301\u7981\u7528\uFF09\u3002</div>\n {trashCheck && <div className={trashCheck.missing ? 'archv-err' : 'archv-empty'} role=\"status\">\u6821\u9A8C\u5B8C\u6210\uFF1A{trashCheck.healthy} \u6761\u6B63\u5E38\uFF0C{trashCheck.missing} \u6761\u65E5\u5FD7\u7F3A\u5931\uFF0C{trashCheck.unverified || 0} \u6761\u65E0\u6CD5\u76F4\u63A5\u6838\u9A8C\u3002</div>}\n {trash.length === 0 ? (\n <div className=\"dsm-trash-empty\">\u56DE\u6536\u7AD9\u4E3A\u7A7A\u3002\u5220\u9664\u7684\u4F1A\u8BDD\u4F1A\u5148\u8FDB\u5165\u8FD9\u91CC\uFF0C\u53EF\u6062\u590D\u6216\u5F7B\u5E95\u5220\u9664\u3002</div>\n ) : (\n <div className=\"dsm-trash-list\">\n {trash.map((t) => (\n <div key={t.sessionId} className=\"dsm-trash-row\">\n <span className=\"dsm-trash-name\" title={t.sessionId}>{t.title || t.sessionId}</span>\n <span className=\"dsm-trash-date\">{fmtDate(t.deletedAt)}</span>\n <span className=\"dsm-trash-actions\">\n <button type=\"button\" className=\"archv-btn\" disabled={trashBusy !== null || !canRestoreTrash.available} title={!canRestoreTrash.available ? canRestoreTrash.reason : '\u6062\u590D\u5230\u5220\u9664\u524D\u7684\u4F4D\u7F6E\u4E0E\u5F52\u6863\u72B6\u6001'} onClick={() => restoreTrash(t.sessionId)}>\u6062\u590D</button>\n <button type=\"button\" className=\"archv-btn archv-del\" disabled={trashBusy !== null || !canPurge.available} title={!canPurge.available ? canPurge.reason : undefined} onClick={() => setPurgeTarget(t.sessionId)}>\u5F7B\u5E95\u5220\u9664</button>\n </span>\n </div>\n ))}\n </div>\n )}\n </section>}\n {purgeTarget && (\n <div className=\"dlg-backdrop\" onClick={() => setPurgeTarget(null)}>\n <div ref={dialogRef} className=\"dlg\" role=\"alertdialog\" aria-modal=\"true\" aria-labelledby=\"dsm-purge-title\" onClick={(e) => e.stopPropagation()}>\n <h3 id=\"dsm-purge-title\" className=\"dlg-title\">\u6C38\u4E45\u5220\u9664{purgeTarget === '__all' ? '\u5168\u90E8\u56DE\u6536\u7AD9\u4F1A\u8BDD' : '\u8FD9\u4E2A\u4F1A\u8BDD'}\uFF1F</h3>\n <p className=\"dlg-text\">\u6B64\u64CD\u4F5C\u4F1A\u7269\u7406\u5220\u9664\u65E5\u5FD7\u5E76\u91CA\u653E\u78C1\u76D8\u7A7A\u95F4\uFF0C\u65E0\u6CD5\u6062\u590D\u3002\u5F52\u6863\u3001\u7B5B\u9009\u548C\u91CD\u65B0\u5B89\u88C5\u63D2\u4EF6\u90FD\u4E0D\u80FD\u627E\u56DE\u8FD9\u4E9B\u6570\u636E\u3002</p>\n <div className=\"dlg-actions\">\n <button type=\"button\" className=\"archv-btn\" onClick={() => setPurgeTarget(null)}>\u53D6\u6D88</button>\n <button type=\"button\" className=\"archv-btn archv-del\" onClick={() => { const target = purgeTarget; setPurgeTarget(null); target === '__all' ? purgeAllTrash() : purgeTrash(target) }}>\u786E\u8BA4\u6C38\u4E45\u5220\u9664</button>\n </div>\n </div>\n </div>\n )}\n </div>\n )\n}\n\n// ---- Main-page sidebar session \"\u22EF\" menu augmentation (DOM shim) -----------\n// DSH core renders the sidebar session list (dsh-client-ui-workspace) with a\n// per-row \"\u22EF\" Menu whose items (rename / fork / archive) are hardcoded \u2014 there\n// is NO plugin slot for adding per-session menu items, and the row DOM carries\n// no sessionId. To honor the request we augment the already-opened portalled\n// menu via DOM: we watch for a [role=\"menu\"] portalled to document.body whose\n// React fiber chain reaches a SessionNodeItem (i.e. it is a session menu), read\n// the session id (and current cwd) off that fiber, then clone an existing menu\n// item to append \"\u79FB\u52A8\u4F1A\u8BDD\" / \"\u5220\u9664\u4F1A\u8BDD\". This is intentionally a DOM shim and is\n// fragile against DSH UI updates (class names / fiber shape / menu markup).\nconst SIDEBAR_AUG_CSS = `\n.dsm-backdrop{position:fixed;inset:0;z-index:2147483600;background:rgba(0,0,0,.45);display:flex;align-items:center;justify-content:center;padding:16px}\n.dsm-dlg{width:min(420px,92vw);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l3);border-radius:14px;padding:18px;box-shadow:0 16px 48px rgb(0 0 0/.28);display:flex;flex-direction:column;gap:12px}\n.dsm-title{font-size:15px;font-weight:650;color:var(--dsw-alias-label-primary);margin:0}\n.dsm-text{font-size:13px;line-height:1.6;color:var(--dsw-alias-label-secondary);margin:0;word-break:break-all}\n.dsm-body{display:flex;flex-direction:column;gap:4px;max-height:280px;overflow:auto}\n.dsm-loading,.dsm-empty{font-size:12px;color:var(--dsw-alias-label-tertiary);padding:4px 2px}\n.dsm-err{font-size:12px;color:var(--dsw-alias-state-error-primary);padding:4px 2px}\n.dsm-opt{appearance:none;display:flex;align-items:center;justify-content:space-between;gap:10px;width:100%;padding:9px 11px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-fill-elevated);color:var(--dsw-alias-label-primary);border-radius:9px;font-size:12.5px;cursor:pointer;text-align:left}\n.dsm-opt:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);border-color:var(--dsw-alias-border-l4)}\n.dsm-opt:disabled{opacity:.55;cursor:default}\n.dsm-opt-cur{border-color:color-mix(in srgb,var(--dsw-alias-state-business-primary) 45%,transparent);color:var(--dsw-alias-state-business-primary)}\n.dsm-opt-name{font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1;min-width:0}\n.dsm-opt-sub{font-size:11px;color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;margin-left:8px}\n.dsm-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:2px}\n.dsm-btn{appearance:none;min-height:32px;padding:0 12px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-fill-subtle);color:var(--dsw-alias-label-secondary);border-radius:9px;font-size:12px;font-weight:500;cursor:pointer}\n.dsm-btn:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}\n.dsm-del{color:var(--dsw-alias-state-error-primary);border-color:color-mix(in srgb,var(--dsw-alias-state-error-primary) 45%,transparent)}\n.dsm-del:hover{background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 10%,transparent);color:var(--dsw-alias-state-error-primary)}\n.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}\n.dsm-toast-long{border-radius:14px;text-align:left;line-height:18px}\n.dsm-toast-err{background:#4A1D1D;color:#FFD9D9;border:1px solid var(--dsw-alias-state-error-primary)}\n.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)}\n.dsm-sub-loading,.dsm-sub-empty{font-size:12px;color:var(--dsw-alias-label-tertiary);padding:6px 10px}\n.dsm-sub-err{font-size:12px;color:var(--dsw-alias-state-error-primary);padding:6px 10px}\n.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}\n.dsm-sub-item:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}\n.dsm-sub-item:disabled{opacity:.5;cursor:default}\n.dsm-sub-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.dsm-sub-cur{font-size:11px;color:var(--dsw-alias-state-business-primary);flex:none;margin-left:8px}\n.dsm-dot{position:absolute;left:6px;top:50%;transform:translateY(-50%);width:8px;height:8px;border-radius:50%;box-sizing:border-box;cursor:pointer;pointer-events:auto;z-index:1}\n.dsm-dot-unread-manual{background:var(--dsw-alias-state-business-primary)}\n.dsm-dot-waiting{background:var(--dsw-alias-state-warn-primary,#F59E0B)}\n.dsm-dot-unread{background:var(--dsw-alias-state-success-primary)}\n.dsm-drag-source{opacity:.48}\n.dsm-drop-target{position:relative;background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 10%,transparent)!important;outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-2px;border-radius:8px}\n.dsm-drop-target::after{content:'\u79FB\u52A8\u5230\u8FD9\u91CC';position:absolute;right:8px;top:50%;transform:translateY(-50%);padding:1px 6px;border-radius:4px;background:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-label-inverted);font-size:10px;font-weight:600;line-height:16px;pointer-events:none}\n.dsm-drag-busy{cursor:progress!important}\n.dsm-trash{margin-top:18px;border-top:1px solid var(--dsw-alias-border-l2);padding-top:14px}\n.dsm-trash-h{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:8px}\n.dsm-trash-h h3{font-size:13px;font-weight:600;color:var(--dsw-alias-label-primary);margin:0}\n.dsm-trash-count{font-size:11px;color:var(--dsw-alias-label-tertiary)}\n.dsm-trash-list{display:flex;flex-direction:column;gap:6px;max-height:260px;overflow:auto}\n.dsm-trash-row{display:flex;align-items:center;gap:8px;padding:8px 10px;border:1px solid var(--dsw-alias-border-l2);border-radius:9px;background:var(--dsw-alias-fill-elevated)}\n.dsm-trash-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;color:var(--dsw-alias-label-primary)}\n.dsm-trash-date{font-size:11px;color:var(--dsw-alias-label-tertiary);flex:none;white-space:nowrap}\n.dsm-trash-actions{display:flex;gap:6px;flex:none}.dsm-trash-actions .archv-btn{min-width:72px}\n.dsm-trash-empty{font-size:12px;color:var(--dsw-alias-label-tertiary);padding:6px 2px}\n.dsm-storage-sum{font-size:12px;color:var(--dsw-alias-label-secondary);margin-bottom:10px}\n.dsm-storage-list{display:flex;flex-direction:column;gap:6px}\n.dsm-storage-row{display:flex;align-items:center;gap:10px;padding:8px 10px;border:1px solid var(--dsw-alias-border-l2);border-radius:9px;background:var(--dsw-alias-fill-elevated)}\n.dsm-storage-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;color:var(--dsw-alias-label-primary)}\n.dsm-storage-bar{flex:0 0 96px;height:6px;border-radius:999px;background:var(--dsw-alias-fill-subtle);overflow:hidden}\n.dsm-storage-fill{display:block;height:100%;border-radius:999px;background:var(--dsw-alias-state-business-primary)}\n.dsm-storage-size{font-size:12px;color:var(--dsw-alias-label-secondary);flex:none;white-space:nowrap}\n.dsm-storage-count{font-size:11px;color:var(--dsw-alias-label-tertiary);flex:none;white-space:nowrap;max-width:32%;overflow:hidden;text-overflow:ellipsis}\n.maint-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 8px}\n.maint-note{font-size:11px;color:var(--dsw-alias-label-tertiary)}\n.mv-sheet-actions{display:flex;align-items:center;gap:6px}\n.aa-check{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--dsw-alias-label-secondary);cursor:pointer}\n.aa-check input{width:15px;height:15px;accent-color:var(--dsw-alias-state-business-primary);cursor:pointer;flex:none}\n/* ---- \u8840\u7F18\u5206\u5C42\u62AB\u9732\uFF08issue #6\uFF09\uFF1A\u884C\u5185\u5FBD\u6807 ---- */\n.dsm-lineage-pick{display:flex;flex-direction:column;gap:6px;margin:8px 0}\n.dsm-lineage-pick-btn{display:flex;justify-content:space-between;align-items:center;gap:8px;padding:8px 10px;border:1px solid var(--dsw-alias-border-l2,rgba(127,127,127,.3));border-radius:8px;background:transparent;color:inherit;cursor:pointer;font-size:12px;text-align:left}\n.dsm-lineage-pick-btn:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(127,127,127,.08))}\n.dsm-lineage-sum{font-size:12px;opacity:.75;margin:6px 0;display:flex;align-items:center;gap:6px;overflow:hidden}\n.dsm-lineage-tree{display:flex;flex-direction:column;gap:2px;margin:8px 0;max-height:340px;overflow:auto}\n.dsm-lineage-row{display:flex;align-items:center;gap:8px;padding:5px 8px;border-radius:8px;font-size:12px;min-height:28px}\n.dsm-lineage-row:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(127,127,127,.08))}\n.dsm-lineage-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.dsm-lineage-kids,.dsm-lineage-size{font-size:11px;opacity:.65;white-space:nowrap}\n.dsm-lineage-livechip{font-size:10px;padding:1px 6px;border-radius:999px;background:rgba(234,179,8,.18);color:#A16207;white-space:nowrap}\n.dsm-lineage-acts{display:flex;gap:4px}\n.dsm-kids-badge{appearance:none;display:inline-flex;align-items:center;gap:3px;margin-left:auto;padding:1px 7px;border:none;border-radius:999px;background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 10%,transparent);color:var(--dsw-alias-state-business-primary);font-size:10px;font-weight:600;line-height:15px;cursor:pointer;flex:none;pointer-events:auto}\n.dsm-subs{display:flex;flex-direction:column;gap:2px;padding:2px 0 6px 26px;pointer-events:auto}\n.dsm-sub-row{display:flex;align-items:center;gap:8px;min-height:24px;padding-right:6px;border-radius:7px;font-size:11.5px;color:var(--dsw-alias-label-secondary);position:relative}\n.dsm-sub-row::before{content:'';position:absolute;left:0;top:0;bottom:0;width:1px;background:var(--dsw-alias-border-l2)}\n.dsm-sub-row:hover{background:var(--dsw-alias-interactive-bg-hover);cursor:pointer}\n.dsm-sub-row:hover .dsm-sub-name{color:var(--dsw-alias-label-primary)}\n.dsm-sub-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.dsm-sub-meta{flex:none;font-size:10.5px;opacity:.8}\n.dsm-sub-live .dsm-sub-meta{color:var(--dsw-alias-state-warning-primary);opacity:1;font-weight:600}\n.dsm-sub-acts{display:none;align-items:center;gap:4px;flex:none}\n.dsm-sub-row:hover .dsm-sub-acts,.dsm-sub-row:focus-within .dsm-sub-acts{display:inline-flex}\n.dsm-sub-btn{appearance:none;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-fill-elevated);color:var(--dsw-alias-label-secondary);border-radius:6px;padding:1px 6px;font:inherit;font-size:10.5px;line-height:16px;cursor:pointer}\n.dsm-sub-btn:hover{color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-border-l3)}\n.dsm-sub-btn-danger{color:var(--dsw-alias-state-error-primary);border-color:color-mix(in srgb,var(--dsw-alias-state-error-primary) 40%,transparent)}\n.dsm-sub-note{font-size:11px;color:var(--dsw-alias-label-tertiary);padding:2px 0}\n.dsm-kids-badge:hover{background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 18%,transparent)}\n.dsm-row-sub{transform:translateX(calc(10px + var(--dsm-indent,0px)));transition:transform .15s ease}\n.dsm-row-sub::before{content:'';position:absolute;left:calc(-6px - var(--dsm-indent,0px));top:0;bottom:0;width:2px;border-radius:1px;background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 30%,transparent);pointer-events:none}\n.dsm-tag{display:inline-flex;align-items:center;margin-left:auto;padding:1px 7px;border-radius:999px;background:var(--dsw-alias-fill-subtle);color:var(--dsw-alias-label-tertiary);font-size:10px;font-weight:500;line-height:15px;flex:none;pointer-events:auto;border:none;cursor:default}\n.dsm-tag-fork{cursor:pointer;background:color-mix(in srgb,var(--dsw-alias-state-success-primary) 12%,transparent);color:var(--dsw-alias-state-success-primary);font-weight:600}\n.dsm-tag-fork:hover{background:color-mix(in srgb,var(--dsw-alias-state-success-primary) 20%,transparent)}\n.dsm-row-flash{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-2px;border-radius:8px;transition:outline-color .6s ease}\n/* \u5FBD\u6807/\u6807\u7B7E\u7EDF\u4E00\u663E\u9690\uFF08\u5BF9\u9F50\u300C\u5B50\u4EE3\u7406\u6298\u53E0\u300D\u7684\u8282\u594F\uFF09\uFF1A\u9ED8\u8BA4\u4E00\u5F8B\u9690\u85CF\uFF0C\u7EF4\u6301 DSH\n \u539F\u751F\u884C\u5916\u89C2\uFF1B\u884C\u88AB\u9009\u4E2D\uFF08dsm-row-active\uFF0Cpaint \u6309 activeId \u5237\u65B0\uFF09\u3001\u9F20\u6807\u60AC\n \u505C\u3001\u952E\u76D8\u805A\u7126\u6216\u5DF2\u5C55\u5F00\u5B50\u4EE3\u7406\u5217\u8868\uFF08dsm-row-open\uFF09\u65F6\u624D\u51FA\u73B0\u3002display \u5207\u6362\n \u4E0D\u5360\u4F4D\uFF1A\u9690\u85CF\u65F6\u6807\u9898\u62FF\u5168\u5BBD\uFF0C\u60AC\u505C\u65F6\u624D\u8BA9\u4F4D\u7ED9\u5FBD\u6807\u3002 */\n[role=\"treeitem\"]>.dsm-kids-badge,[role=\"treeitem\"]>.dsm-tag{display:none}\n[role=\"treeitem\"]:hover>.dsm-kids-badge,[role=\"treeitem\"]:hover>.dsm-tag,\n[role=\"treeitem\"].dsm-row-active>.dsm-kids-badge,[role=\"treeitem\"].dsm-row-active>.dsm-tag,\n[role=\"treeitem\"].dsm-row-open>.dsm-kids-badge,\n[role=\"treeitem\"]:focus-within>.dsm-kids-badge,[role=\"treeitem\"]:focus-within>.dsm-tag{display:inline-flex}\n@media (prefers-reduced-motion:reduce){.dsm-row-sub{transition:none}.dsm-row-flash{transition:none}}\n@media (max-width:640px){.dsm-storage-bar{display:none}.dsm-storage-count{max-width:40%}}\n`\n\n// Shared status-dot state so the \u22EF-menu \"\u6807\u8BB0\u672A\u8BFB\" action can toggle the\n// manual flag and trigger a repaint without coupling the two installers.\nconst DSM_KEY_MANUAL = 'dsm-manual-unread-v1'\nlet dsmManualUnread = null\nlet dsmRepaintDots = null\nfunction dsmLoadManual() {\n if (dsmManualUnread) return dsmManualUnread\n try { dsmManualUnread = new Set(JSON.parse(localStorage.getItem(DSM_KEY_MANUAL) || '[]')) } catch (e) { dsmManualUnread = new Set() }\n return dsmManualUnread\n}\nfunction dsmSaveManual() { try { localStorage.setItem(DSM_KEY_MANUAL, JSON.stringify([...dsmLoadManual()])) } catch (e) {} }\nfunction dsmToggleManual(id) {\n const s = dsmLoadManual()\n if (s.has(id)) s.delete(id); else s.add(id)\n dsmSaveManual()\n if (dsmRepaintDots) dsmRepaintDots()\n}\n\n// Recycle-bin membership (session ids currently in \u56DE\u6536\u7AD9). The sidebar\n// status-dot installer uses this to hide trashed sessions so they don't show\n// up under DSH's \"\u672A\u5206\u7EC4\" group. Loaded from the backend on a throttle and\n// updated optimistically when our own \u22EF-menu deletes a session.\nlet dsmTrashIds = null\nlet dsmServerPurgedIds = new Set()\nlet dsmAuthoritativeTitles = new Map()\nlet dsmTrashTick = 0\nlet dsmCapabilities = null\n// \u8840\u7F18\u5206\u5C42\u62AB\u9732\uFF08issue #6\uFF09\uFF1A\u670D\u52A1\u7AEF\u8840\u7F18\u5206\u7C7B + \u672C\u5730\u89C6\u56FE\u72B6\u6001\u3002\n// dsmLineage: id \u2192 { origin, parentSession, delegationDepth, empty }\nconst dsmLineage = new Map()\n// v3.6.2\uFF1Ahost \u9884\u70ED\u662F\u5426\u8FD8\u5728\u9014\uFF08sidebar-state/sessions \u7684 warmPending \u65D7\u6807\uFF09\u3002\n// \u5728\u9014 \u2192 \u4FA7\u680F\u8F6E\u8BE2\u4ECE 32s \u53F0\u9636\u6536\u7D27\u5230\u6BCF\u62CD\uFF084s\uFF09\uFF0C\u6807\u9898/\u8840\u7F18\u4E00\u8865\u9F50\u5C31\u6D6E\u73B0\uFF1B\n// \u5B8C\u6210\u77AC\u95F4\uFF08true\u2192false\uFF09\u89E6\u53D1\u4E00\u6B21\u6027\u56DE\u8C03\uFF08\u9762\u677F\u81EA\u52A8\u8865\u5237\u65B0\uFF0C\u89C1 dsmOnWarmDone\uFF09\u3002\nlet dsmWarmPending = false\nlet dsmTrashRetryTimer = null\nconst dsmWarmDoneHooks = new Set()\nfunction dsmOnWarmDone(fn) {\n dsmWarmDoneHooks.add(fn)\n return () => dsmWarmDoneHooks.delete(fn)\n}\n// \u7A7A\u767D\u4F1A\u8BDD\u4E00\u5F8B\u9690\u85CF\uFF08\u539F\u300C\u7EAF\u51C0\u89C6\u56FE\u300D\u7684\u9ED8\u8BA4\u884C\u4E3A\u56FA\u5316\u4E3A\u552F\u4E00\u884C\u4E3A\uFF0C\u5F00\u5173\u5DF2\u4E8E\n// 0.1.3 \u79FB\u9664\uFF1A\u4E0A\u6E38\u672C\u5C31\u4E0D\u628A\u7A7A\u767D\u4F1A\u8BDD\u6E32\u67D3\u8FDB\u4FA7\u680F\uFF0C\u5F00\u5173\u6CA1\u6709\u53EF\u670D\u52A1\u7684\u573A\u666F\uFF09\u3002\n// \u53EA\u9690\u85CF\uFF0C\u6C38\u4E0D\u5220\u9664\uFF1B\u5B50\u4EE3\u7406\u884C\u6309 DSH \u8BBE\u8BA1\u4E0D\u8FDB\u4FA7\u680F\uFF08ui-subagent README \u660E\u6587\n// \"omitted from the ordinary sidebar\"\uFF09\uFF0C\u6536\u7EB3\u7531\u4E0A\u6E38\u5B8C\u6210\uFF0C\u63D2\u4EF6\u4FA7\u4E0D\u505A\u3002\nasync function dsmLoadCapabilities() {\n try { dsmCapabilities = await postJSON('/archived-sessions/capabilities', {}) } catch (e) { /* unknown stays safely unavailable */ }\n return dsmCapabilities\n}\nfunction dsmActionCapability(name, legacy) {\n const source = dsmCapabilities && dsmCapabilities.actions\n return source ? (source[name] || (legacy && source[legacy]) || null) : null\n}\nasync function dsmLoadTrashIds() {\n try {\n const r = await postJSON('/archived-sessions/sidebar-state', {})\n dsmTrashIds = new Set(((r && r.trashedSessionIds) || []).map(String))\n dsmServerPurgedIds = new Set(((r && r.purgedSessionIds) || []).map(String))\n // \u670D\u52A1\u5668\u5DF2\u786E\u8BA4\u7684\u4E50\u89C2\u6807\u8BB0\u968F\u5373\u6E05\u9664\uFF1B\u672A\u88AB\u786E\u8BA4\u7684\u6807\u8BB0\u6700\u591A\u5B58\u6D3B\u5230\u4E0B\u6B21\u5237\u65B0\uFF0C\n // \u7EDD\u4E0D\u6C38\u4E45\u538B\u4F4F\u540E\u6765\u540C id \u7684\u65B0\u4F1A\u8BDD\u3002\n for (const id of [...dsmPendingPurged]) {\n if (dsmServerPurgedIds.has(id)) dsmPendingPurged.delete(id)\n }\n dsmAuthoritativeTitles = new Map(Object.entries((r && r.titles) || {}).map(([id, title]) => [String(id), String(title)]))\n dsmLineage.clear()\n for (const [id, info] of Object.entries((r && r.lineage) || {})) {\n if (info && typeof info === 'object') dsmLineage.set(String(id), info)\n }\n // v3.6.2\uFF1A\u9884\u70ED\u5B8C\u6210\u7684\u77AC\u95F4\u5E7F\u64AD\u4E00\u6B21\uFF08\u9762\u677F\u6302\u81EA\u52A8\u8865\u5237\u65B0\uFF1B\u4FA7\u680F\u9760\u8282\u62CD\u6062\u590D 32s\uFF09\u3002\n const wasPending = dsmWarmPending\n dsmWarmPending = !!(r && r.warmPending)\n if (wasPending && !dsmWarmPending) { try { for (const fn of dsmWarmDoneHooks) fn() } catch (e) { /* hook \u51FA\u9519\u4E0D\u65AD\u4E3B\u6D41\u7A0B */ } }\n if (dsmRepaintDots) dsmRepaintDots()\n } catch (e) {\n /* keep last known set */\n // v3.6.2 C\uFF1A\u5931\u8D25\u4E0D\u518D\u7B49\u4E0B\u4E00\u4E2A 32s \u53F0\u9636\u2014\u20142s \u540E\u5FEB\u901F\u91CD\u8BD5\u4E00\u6B21\uFF08\u5DF2\u6709\u5F85\u91CD\u8BD5\u5219\u8DF3\u8FC7\uFF09\u3002\n if (dsmTrashRetryTimer == null) {\n dsmTrashRetryTimer = setTimeout(() => { dsmTrashRetryTimer = null; dsmLoadTrashIds() }, 2000)\n if (typeof dsmTrashRetryTimer.unref === 'function') dsmTrashRetryTimer.unref()\n }\n }\n return dsmTrashIds\n}\n\n// Permanently-hidden set: sessions the user hard-purged from the \u56DE\u6536\u7AD9. The\n// SERVER is the single source of truth: sidebar-state only reports tombstones\n// whose ids are NOT currently present, so a same-id session recreated later is\n// unhidden automatically (the tombstone must never permanently suppress a new\n// session). dsmPendingPurged only carries this tab's optimistic marks until\n// the next server fetch acks them \u2014 no localStorage persistence, so a stale\n// tombstone can never outlive its server record. (dsmServerPurgedIds is\n// declared with the trash-state group above.)\nconst dsmPendingPurged = new Set()\nfunction dsmLoadPurged() {\n return new Set([...dsmServerPurgedIds, ...dsmPendingPurged])\n}\nfunction dsmMarkPurged(ids) {\n ids.forEach((id) => dsmPendingPurged.add(String(id)))\n if (dsmRepaintDots) dsmRepaintDots()\n}\n\n// ---- Sidebar injection adapter (versioned, safe-degrading) ----------------\n// \u6BCF\u4E00\u5904\u8106\u5F31\u7684 DOM / React fiber \u8BC6\u522B\u90FD\u6536\u655B\u5230\u8FD9\u4E2A adapter\uFF1A\u8BC6\u522B\u89C4\u5219\u96C6\u4E2D\u3001\n// \u53EF\u7248\u672C\u5316\uFF08\u4E0A\u6E38\u6539\u7248\u65F6 bump version \u5E76\u53EA\u6539\u8FD9\u91CC\uFF09\uFF0C\u5E76\u4E14**\u53EF\u5B89\u5168\u964D\u7EA7**\u2014\u2014\n// \u8BC6\u522B\u8FDE\u7EED\u843D\u7A7A\u8BF4\u660E\u4E0A\u6E38\u5185\u90E8\u7ED3\u6784\u53D8\u4E86\uFF0C\u6B64\u65F6 adapter \u81EA\u52A8\u505C\u7528\u5168\u90E8\u6CE8\u5165\uFF0C\n// \u7EDD\u4E0D\u628A\u534A\u6B8B\u884C\u4E3A\u5F3A\u52A0\u5230\u5B98\u65B9\u4FA7\u680F\u4E0A\uFF08\u62D6\u62FD / \u6807\u9898\u540C\u6B65 / \u72B6\u6001\u5706\u70B9\u4E00\u5E76\u505C\u7528\uFF09\u3002\nconst SIDEBAR_ADAPTER_VERSION = 3\nconst SIDEBAR_ADAPTER_MAX_MISSES = 200\n\n// \u4FA7\u680F\u6CE8\u5165\u7684\u6574\u573A\u6E05\u9000\uFF1A\u79FB\u9664\u6211\u4EEC\u52A0\u5230 DSH \u4FA7\u680F DOM \u91CC\u7684\u6240\u6709\u8282\u70B9\uFF08\u72B6\u6001\u5706\u70B9 /\n// \u5B50\u4EE3\u7406\u5FBD\u6807 / \u5C31\u5730\u5B50\u5217\u8868 / fork\u00B7\u7A7A\u767D tag\uFF09\uFF0C\u5E76\u8FD8\u539F\u88AB\u9690\u85CF\u7684\u7A7A\u5206\u7EC4\u3002\n// \u4E24\u4E2A\u8C03\u7528\u65F6\u673A\uFF1Aadapter \u56E0\u4E0A\u6E38\u7ED3\u6784\u8FDE\u7EED\u672A\u8BC6\u522B\u800C\u505C\u7528\uFF08\u6B64\u523B\u6B8B\u7559\u7684\u662F\u300C\u534A\u6B8B\u300D\n// \u8282\u70B9\uFF0C\u5FC5\u987B\u6574\u4F53\u64A4\u4E0B\u800C\u4E0D\u662F\u7559\u5728\u5B98\u65B9\u4FA7\u680F\u4E0A\u9519\u4F4D\u663E\u793A\uFF09\uFF0C\u4EE5\u53CA\u63D2\u4EF6 effect \u5378\u8F7D\u3002\n// \u53EA\u6309\u81EA\u5DF1\u7684 data-dsm-* \u6807\u8BB0\u5220\u9664\uFF0C\u7EDD\u4E0D\u78B0 DSH \u81EA\u5DF1\u7684\u8282\u70B9\u3002\nfunction dsmTeardownSidebarAug() {\n if (typeof document === 'undefined') return\n const selectors = ['[data-dsm-dot]', '[data-dsm-kids]', '[data-dsm-subs]', '[data-dsm-tag]']\n for (const sel of selectors) {\n try { document.querySelectorAll(sel).forEach((el) => el.remove()) } catch (e) { /* best-effort */ }\n }\n try {\n document.querySelectorAll('[data-dsm-group-hidden]').forEach((owner) => {\n owner.style.display = owner.dataset.dsmPrevDisplay || ''\n owner.removeAttribute('data-dsm-group-hidden')\n delete owner.dataset.dsmPrevDisplay\n })\n } catch (e) { /* best-effort */ }\n}\n\nfunction createSidebarAdapter() {\n let disabled = false\n let misses = 0\n const findFiber = (el) => {\n const k = Object.keys(el).find((kk) => kk.startsWith('__reactFiber') || kk.startsWith('__reactInternalInstance'))\n return k ? el[k] : null\n }\n // \u8BC6\u522B\u4E00\u884C\u4FA7\u680F\u6811\u8282\u70B9\uFF1A\u8FD4\u56DE { node, group }\uFF08\u4F1A\u8BDD\u884C / \u5DE5\u4F5C\u533A\u6807\u9898\u884C\uFF09\u3002\n // \u4E24\u79CD\u90FD\u6CA1\u6709 = \u8BC6\u522B\u843D\u7A7A\uFF0C\u7D2F\u8BA1\u5230\u9608\u503C\u5373\u6574\u4F53\u505C\u7528\u3002\n const recognize = (row) => {\n const out = { node: null, group: null }\n if (disabled || !row || typeof row !== 'object') return out\n let f = findFiber(row)\n let guard = 0\n while (f && guard++ < 300) {\n const props = f.memoizedProps\n if (props && props.node && typeof props.node === 'object') out.node = props.node\n // DSH \u7684\u4F1A\u8BDD\u884C\u63A5\u6536 `node`\uFF0C\u5DE5\u4F5C\u533A\u6807\u9898\u884C\uFF08ProjectRowItem\uFF09\u63A5\u6536 `group`\u3002\n if (props && props.group && typeof props.group === 'object') out.group = props.group\n f = f.return\n }\n if (!out.node && !out.group) {\n if (++misses >= SIDEBAR_ADAPTER_MAX_MISSES && !disabled) {\n disabled = true\n // \u505C\u7528 = \u627F\u8BA4\u5BF9\u4E0A\u6E38\u7ED3\u6784\u5931\u53BB\u8BA4\u77E5\uFF1A\u6B64\u523B\u4FA7\u680F\u4E0A\u6B8B\u7559\u7684\u6CE8\u5165\u8282\u70B9\u5DF2\u7ECF\u5931\u53BB\n // \u5E42\u7B49\u7EF4\u62A4\uFF08paint \u4E0D\u518D\u8DD1\uFF09\uFF0C\u5FC5\u987B\u6574\u4F53\u64A4\u4E0B\uFF0C\u7EDD\u4E0D\u80FD\u628A\u534A\u6B8B\u884C\u4E3A\u7559\u5728\n // \u5B98\u65B9 UI \u4E0A\u3002\n dsmTeardownSidebarAug()\n try { console.warn('[dsh-sessions-manager] \u4FA7\u680F\u6CE8\u5165 adapter v' + SIDEBAR_ADAPTER_VERSION + ' \u5DF2\u505C\u7528\uFF1A\u672A\u8BC6\u522B\u5230\u5DF2\u77E5\u7684 DSH \u4FA7\u680F\u8282\u70B9\u7ED3\u6784\uFF08\u4E0A\u6E38\u53EF\u80FD\u5DF2\u6539\u7248\uFF09') } catch (e) {}\n }\n } else if (misses > 0) {\n misses = 0\n }\n return out\n }\n return {\n version: SIDEBAR_ADAPTER_VERSION,\n get disabled() { return disabled },\n findFiber,\n recognize,\n }\n}\nconst sidebarAdapter = createSidebarAdapter()\n\n// apply(ctx) \u53EF\u80FD\u88AB\u518D\u6B21\u8C03\u7528\uFF08HMR / profile \u91CD\u8F7D\uFF09\uFF1A\u7528\u6A21\u5757\u7EA7\u5B88\u536B\u4FDD\u8BC1\u89C2\u5BDF\u5668\u3001\n// \u5B9A\u65F6\u5668\u4E0E document \u7EA7\u76D1\u542C\u5668\u53EA\u88C5\u4E00\u4EFD\uFF0C\u7EDD\u4E0D\u53E0\u52A0\uFF08\u53E0\u52A0\u4F1A\u9020\u6210\u91CD\u590D\u63D0\u793A\u4E0E\u540E\u53F0 CPU \u589E\u957F\uFF09\u3002\nlet sidebarMenuAugInstalled = false\nfunction installSidebarSessionMenuAug() {\n if (typeof document === 'undefined') return\n if (sidebarMenuAugInstalled) return\n sidebarMenuAugInstalled = true\n const AUG = 'data-dsm-aug'\n let styleInjected = false\n let activeSubClose = null\n let hoverTimer = null\n\n // Walk the React fiber chain from the portalled menu element up to the\n // SessionNodeItem component, which carries `node.id` (the session id).\n // Portalled menus are one-off surfaces: fiber walking here does NOT count\n // toward the row adapter's miss budget (a non-session menu is normal, not a\n // sign of upstream drift).\n const sessionInfoFromMenu = (menuEl) => {\n let f = sidebarAdapter.findFiber(menuEl)\n let guard = 0\n while (f && guard++ < 300) {\n const p = f.memoizedProps\n if (p && p.node && typeof p.node.id === 'string' && p.node.id) {\n return { id: p.node.id, cwd: p.node.cwd || p.node.workspacePath || null }\n }\n f = f.return\n }\n return null\n }\n const closeMenu = () => {\n try { document.dispatchEvent(new MouseEvent('mousedown', { bubbles: true })) } catch (e) {}\n try { document.dispatchEvent(new PointerEvent('pointerdown', { bubbles: true })) } catch (e) {}\n }\n const escapeHtml = (s) => {\n const d = document.createElement('div')\n d.textContent = s == null ? '' : String(s)\n return d.innerHTML\n }\n const toast = (msg) => {\n const t = document.createElement('div')\n const text = String(msg == null ? '' : msg)\n t.className = 'dsm-toast' + (text.length > 28 ? ' dsm-toast-long' : '')\n t.textContent = text\n t.title = '\u70B9\u51FB\u5173\u95ED'\n t.setAttribute('role', 'status')\n document.body.appendChild(t)\n // \u505C\u7559\u65F6\u957F\u6309\u5B57\u6570\u7ED9\uFF08\u56FA\u5B9A 2.6s \u8BFB\u4E0D\u5B8C\u6392\u961F/\u5931\u8D25\u7C7B\u6587\u6848\uFF09\uFF0C\u5E76\u5141\u8BB8\u70B9\u51FB\u63D0\u524D\u5173\u95ED\u3002\n let killTimer = null\n const kill = () => { if (killTimer) clearTimeout(killTimer); t.remove() }\n killTimer = setTimeout(kill, toastDurationFor(text))\n t.addEventListener('click', kill)\n }\n const ensureStyle = () => {\n if (styleInjected) return\n const s = document.createElement('style')\n s.dataset.dsm = 'aug'\n s.textContent = SIDEBAR_AUG_CSS\n document.head.appendChild(s)\n styleInjected = true\n }\n const closeMoveSubmenu = () => {\n if (activeSubClose) { const f = activeSubClose; activeSubClose = null; f() }\n }\n const openMoveSubmenu = (moveBtn, info) => {\n ensureStyle()\n closeMoveSubmenu()\n const sub = document.createElement('div')\n sub.className = 'dsm-sub'\n sub.setAttribute('role', 'menu')\n sub.setAttribute('data-dsm-sub', '')\n sub.innerHTML = '<div class=\"dsm-sub-loading\">\u52A0\u8F7D\u5DE5\u4F5C\u533A\u2026</div>'\n const r = moveBtn.getBoundingClientRect()\n // Fixed-position card: once the async content renders it can be tall or\n // wide enough to hang past the viewport edges, so re-clamp both anchors\n // against the rendered size.\n const placeSub = () => {\n sub.style.top = Math.max(8, Math.min(Math.round(r.top - 4), window.innerHeight - sub.offsetHeight - 8)) + 'px'\n sub.style.left = Math.max(8, Math.min(Math.round(r.right + 10), window.innerWidth - sub.offsetWidth - 8)) + 'px'\n }\n document.body.appendChild(sub)\n placeSub()\n const closeSub = () => {\n activeSubClose = null\n if (sub.parentNode) sub.remove()\n document.removeEventListener('mousedown', onDocDown, true)\n window.removeEventListener('blur', closeSub)\n }\n const onDocDown = (e) => {\n if (sub.contains(e.target) || moveBtn.contains(e.target)) return\n closeSub()\n }\n // Keep DSH's own outside-click handler from closing the parent menu while\n // the pointer is over our submenu (it lives outside the portalled card).\n sub.addEventListener('mousedown', (e) => e.stopPropagation())\n // Hover bridging: moving from the trigger button across the 10px gap to\n // the submenu must not dismiss it; entering the submenu cancels the\n // pending close timer set on the button's mouseleave.\n sub.addEventListener('mouseenter', () => { if (hoverTimer) { clearTimeout(hoverTimer); hoverTimer = null } })\n sub.addEventListener('mouseleave', () => { hoverTimer = setTimeout(() => closeSub(), 160) })\n setTimeout(() => document.addEventListener('mousedown', onDocDown, true), 0)\n window.addEventListener('blur', closeSub)\n activeSubClose = closeSub\n Promise.all([\n postJSON('/archived-sessions/workspaces', {}),\n postJSON('/archived-sessions/sessions', {}),\n ]).then(([ws, sess]) => {\n const items = ws.items || []\n const cur = (sess.items || []).find((x) => x.sessionId === info.id)\n const curPath = cur ? cur.workspacePath : (info.cwd || null)\n if (!items.length) { sub.innerHTML = '<div class=\"dsm-sub-empty\">\uFF08\u6682\u65E0\u53EF\u7528\u5DE5\u4F5C\u533A\uFF09</div>'; placeSub(); return }\n sub.innerHTML = ''\n items.forEach((w) => {\n const isCur = !!curPath && w.path === curPath\n const b = document.createElement('button')\n b.type = 'button'\n b.className = 'dsm-sub-item'\n b.setAttribute('role', 'menuitem')\n b.disabled = isCur\n const name = document.createElement('span')\n name.className = 'dsm-sub-name'\n name.textContent = w.title || pathName(w.path) || w.workspaceId\n b.appendChild(name)\n if (isCur) {\n const c = document.createElement('span')\n c.className = 'dsm-sub-cur'\n c.textContent = '\u5F53\u524D'\n b.appendChild(c)\n }\n b.addEventListener('click', (e) => {\n e.stopPropagation()\n e.preventDefault()\n closeSub()\n closeMenu()\n postJSON('/archived-sessions/move', { sessionId: info.id, targetPath: w.path })\n .then((r) => {\n // \u4F1A\u8BDD\u88AB DSH \u6253\u5F00\uFF08\u6D3B\u8DC3/\u672A\u5173\u95ED\uFF09\u65F6\u670D\u52A1\u7AEF\u53EA\u767B\u8BB0\u6392\u961F\uFF1A\u78C1\u76D8\u4E0E\u5DE5\u4F5C\u533A\u5206\u7EC4\u90FD\u6CA1\u52A8\u3002\n // \u8FD9\u6761\u8DEF\u5F84\u539F\u5148\u65E0\u6761\u4EF6\u62A5\u300C\u79FB\u52A8\u6210\u529F\u300D\u2014\u20142026-09-10 \u7528\u6237\u62A5\u7684\u300C\u8BF4\u79FB\u52A8\u6210\u529F\u4F46\u8FD8\u5728\n // \u539F\u5DE5\u4F5C\u533A\u300D\u5C31\u662F\u8FD9\u4E2A\u3002\u5FC5\u987B\u6309\u670D\u52A1\u7AEF\u7ED3\u679C\u5982\u5B9E\u8BF4\u660E\u3002\n const label = w.title || pathName(w.path) || '\u76EE\u6807\u5DE5\u4F5C\u533A'\n if (r && r.queued) {\n toast(r.notes && r.notes.length ? r.notes.join(' ') : '\u4F1A\u8BDD\u6B63\u88AB DSH \u6253\u5F00\uFF0C\u5DF2\u6392\u961F\u5F85\u79FB\u52A8\uFF1B\u91CD\u542F DSH \u540E\u4F1A\u81EA\u52A8\u5B8C\u6210\uFF08\u8BF7\u5148\u522B\u6253\u5F00\u5B83\uFF09\u3002')\n return\n }\n toast(r && r.already ? `\u5DF2\u5728\u300C${label}\u300D` : `\u5DF2\u79FB\u5230\u300C${label}\u300D`)\n })\n .catch((ee) => toast('\u79FB\u52A8\u5931\u8D25\uFF1A' + String((ee && ee.message) || ee)))\n })\n sub.appendChild(b)\n })\n placeSub()\n }).catch((e) => {\n sub.innerHTML = '<div class=\"dsm-sub-err\">' + escapeHtml(String((e && e.message) || e)) + '</div>'\n placeSub()\n })\n }\n const openDeleteConfirm = (id) => {\n ensureStyle()\n const backdrop = document.createElement('div')\n backdrop.className = 'dsm-backdrop'\n const dlg = document.createElement('div')\n dlg.className = 'dsm-dlg'\n dlg.innerHTML = '<h3 class=\"dsm-title\">\u5220\u9664\u4F1A\u8BDD</h3><p class=\"dsm-text\">\u786E\u8BA4\u5C06\u8BE5\u4F1A\u8BDD\u79FB\u5165\u56DE\u6536\u7AD9\uFF1F\u53EF\u5728\u300C\u8BBE\u7F6E \u2192 \u4F1A\u8BDD\u7BA1\u7406 \u2192 \u56DE\u6536\u7AD9\u300D\u4E2D\u6062\u590D\u6216\u5F7B\u5E95\u5220\u9664\u3002</p><div class=\"dsm-actions\"><button type=\"button\" class=\"dsm-btn\" data-role=\"cancel\">\u53D6\u6D88</button><button type=\"button\" class=\"dsm-btn dsm-del\" data-role=\"ok\">\u79FB\u5165\u56DE\u6536\u7AD9</button></div>'\n backdrop.appendChild(dlg)\n document.body.appendChild(backdrop)\n const close = () => backdrop.remove()\n backdrop.addEventListener('click', (e) => { if (e.target === backdrop) close() })\n dlg.querySelector('[data-role=cancel]').addEventListener('click', close)\n dlg.querySelector('[data-role=ok]').addEventListener('click', () => {\n close()\n postJSON('/archived-sessions/delete', { sessionId: id })\n .then(() => {\n if (dsmTrashIds) dsmTrashIds.add(String(id))\n if (dsmRepaintDots) dsmRepaintDots()\n toast('\u5DF2\u79FB\u5165\u56DE\u6536\u7AD9')\n })\n .catch((e) => toast('\u5220\u9664\u5931\u8D25\uFF1A' + String((e && e.message) || e)))\n })\n }\n const augmentMenu = (menuEl, info) => {\n if (menuEl.querySelector('[' + AUG + ']')) return\n const viewport = menuEl.querySelector('[role=\"presentation\"]') || menuEl.firstElementChild\n if (!viewport) return\n const proto = menuEl.querySelector('[role=\"menuitem\"]')\n if (!proto) return\n const protoWrap = proto.parentElement\n const protoCls = proto.className\n const protoWrapCls = protoWrap ? protoWrap.className : ''\n const ICON_MOVE = '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\"/><path d=\"M12 11v4\"/><path d=\"M10 13l2 2 2-2\"/></svg>'\n const ICON_DEL = '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 7h16\"/><path d=\"M10 11v6\"/><path d=\"M14 11v6\"/><path d=\"M6 7l1 13a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1l1-13\"/><path d=\"M9 7V4h6v3\"/></svg>'\n const ICON_UNREAD = '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"8\"/><circle cx=\"12\" cy=\"12\" r=\"3\" fill=\"currentColor\" stroke=\"none\"/></svg>'\n const mk = (label, svg, danger) => {\n const wrap = protoWrap ? protoWrap.cloneNode(false) : document.createElement('div')\n if (protoWrapCls) wrap.className = protoWrapCls\n const btn = document.createElement('button')\n btn.type = 'button'\n btn.setAttribute('role', 'menuitem')\n btn.className = protoCls // same `.item` class DSH uses \u2192 identical layout/alignment\n const icon = document.createElement('span')\n icon.style.cssText = 'display:inline-flex;flex:none;width:16px;height:16px;align-items:center;justify-content:center;color:' + (danger ? 'var(--dsw-alias-state-error-primary)' : 'var(--dsw-alias-label-tertiary)')\n icon.innerHTML = svg\n const lab = document.createElement('span')\n lab.style.cssText = 'flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap'\n lab.textContent = label\n btn.appendChild(icon)\n btn.appendChild(lab)\n if (danger) btn.style.color = 'var(--dsw-alias-state-error-primary)'\n btn.setAttribute(AUG, '')\n wrap.appendChild(btn)\n return { wrap, btn }\n }\n const move = mk('\u79FB\u52A8\u4F1A\u8BDD', ICON_MOVE, false)\n const del = mk('\u5220\u9664\u4F1A\u8BDD', ICON_DEL, true)\n const mark = mk(dsmLoadManual().has(info.id) ? '\u6807\u8BB0\u5DF2\u8BFB' : '\u6807\u8BB0\u672A\u8BFB', ICON_UNREAD, false)\n const moveCapability = dsmActionCapability('relocateSession') || dsmActionCapability('move')\n if (!moveCapability || !moveCapability.available) {\n move.btn.disabled = true\n move.btn.title = (moveCapability && moveCapability.reason) || '\u6B63\u5728\u68C0\u67E5\u5F53\u524D\u7248\u672C\u7684\u79FB\u52A8\u80FD\u529B'\n }\n if (mark.btn.firstChild) mark.btn.firstChild.style.color = 'var(--dsw-alias-state-business-primary)'\n const chev = document.createElement('span')\n chev.style.cssText = 'margin-left:auto;flex:none;color:var(--dsw-alias-label-tertiary);font-size:14px;line-height:1'\n chev.textContent = '\u203A'\n move.btn.appendChild(chev)\n move.btn.addEventListener('mouseenter', () => {\n if (!document.querySelector('[data-dsm-sub]')) openMoveSubmenu(move.btn, info)\n })\n move.btn.addEventListener('mouseleave', () => {\n hoverTimer = setTimeout(() => closeMoveSubmenu(), 160)\n })\n move.btn.addEventListener('click', (e) => { e.stopPropagation(); e.preventDefault() })\n del.btn.addEventListener('click', (e) => {\n e.stopPropagation()\n e.preventDefault()\n closeMoveSubmenu()\n openDeleteConfirm(info.id)\n })\n mark.btn.addEventListener('click', (e) => {\n e.stopPropagation()\n e.preventDefault()\n closeMoveSubmenu()\n dsmToggleManual(info.id)\n closeMenu()\n })\n viewport.appendChild(move.wrap)\n viewport.appendChild(del.wrap)\n // \u6807\u8BB0\u672A\u8BFB goes to the very top of the menu (above DSH's native items).\n viewport.insertBefore(mark.wrap, viewport.firstElementChild)\n // DSH's portalled Menu clamped its position using the height it measured\n // before this shim injected rows, so the grown card can hang past the\n // viewport bottom and cover the sidebar foot. Reuse the host's own\n // placement by firing the resize event it listens for while open.\n window.dispatchEvent(new Event('resize'))\n }\n\n const seen = new WeakSet()\n const obs = new MutationObserver(() => {\n if (sidebarAdapter.disabled) return\n const menus = document.querySelectorAll('body > [role=\"menu\"]')\n menus.forEach((menuEl) => {\n if (seen.has(menuEl)) return\n const info = sessionInfoFromMenu(menuEl)\n if (!info) return // not a session menu (e.g. settings / header dropdown)\n seen.add(menuEl)\n try { augmentMenu(menuEl, info) } catch (e) { /* best-effort DOM shim */ }\n })\n })\n obs.observe(document.body, { childList: true, subtree: false })\n}\n\n// Left-side per-session status dot (DOM shim). The color is driven by DSH's\n// REAL session status, read from the row's own StateDot ([data-state]):\n// \u624B\u52A8\u6807\u8BB0\u672A\u8BFB\uFF08\u84DD\uFF09 = \u7528\u6237\u5728 \u22EF \u83DC\u5355\u6216\u70B9\u51FB\u5706\u70B9\u624B\u52A8\u6807\u8BB0\uFF0ClocalStorage \u6301\u4E45\u5316\uFF08\u6700\u9AD8\u4F18\u5148\u7EA7\uFF09\n// \u5DE5\u4F5C\u4E2D\uFF08\u9EC4\uFF09 = DSH state 'ongoing'\uFF08\u65E7\u7248\u517C\u5BB9 'running'\uFF09\n// \u9700\u7528\u6237\u53CD\u9988\uFF08\u7425\u73C0\uFF09 = DSH state 'warning'\uFF08\u6709\u8FFD\u95EE\u9700\u7528\u6237\u53CD\u9988\uFF09\n// \u5B8C\u6210\u540E\u672A\u8BFB\uFF08\u7EFF\uFF09 = DSH state 'done' \u4E14\u7528\u6237\u5C1A\u672A\u8BFB\u8FC7\uFF08read \u96C6\u5408\uFF09\n// \u5B8C\u6210\u5DF2\u8BFB\uFF08\u4E0D\u663E\u793A\uFF09 = DSH state 'done' \u4E14\u5DF2\u8BFB\u8FC7\uFF08read \u96C6\u5408\u6301\u4E45\u5316\uFF09\n// \u624B\u52A8\u672A\u8BFB\u96C6\u5408 + read \u96C6\u5408\u5747\u6301\u4E45\u5316\u4E8E localStorage\uFF1B\u6253\u5F00\u8FC7\u5373\u8BB0\u5165 read\uFF0C\u7EFF\u70B9\u4E0D\u518D\u51FA\u73B0\u3002\n// \u53E6\u5916\uFF1A\u8FDB\u5165\u56DE\u6536\u7AD9\u7684\u4F1A\u8BDD\u4F1A\u6574\u884C\u9690\u85CF\uFF08\u4E0D\u51FA\u73B0\u5728\u300C\u672A\u5206\u7EC4\u300D\u91CC\uFF09\u3002\nfunction installSidebarStatusDots() {\n if (typeof document === 'undefined') return\n const DOT = 'data-dsm-dot'\n if (!document.querySelector('style[data-dsm=aug]')) {\n const s = document.createElement('style')\n s.dataset.dsm = 'aug'\n s.textContent = SIDEBAR_AUG_CSS\n document.head.appendChild(s)\n }\n const rowNode = (row) => sidebarAdapter.recognize(row).node\n const rowId = (row) => { const node = rowNode(row); return node ? node.id : null }\n let curActive = null\n const activeRowId = () => {\n const sel = document.querySelector('[role=\"treeitem\"][aria-selected=\"true\"]')\n return sel ? rowId(sel) : null\n }\n // Dot colors per the user's scheme. We read DSH's REAL session status from the\n // row's own StateDot (its [data-state] attr) and recolor it:\n // ongoing/running \u2192 \u9EC4 \u5DE5\u4F5C\u4E2D\n // warning \u2192 \u7425\u73C0 \u6709\u8FFD\u95EE\u9700\u7528\u6237\u53CD\u9988\n // done \u2192 \u7EFF \u5B8C\u6210\u540E\u672A\u8BFB\uFF08\u8BFB\u8FC7\u5219\u4E0D\u518D\u663E\u793A\uFF09\n // error \u2192 \u7EA2 \u51FA\u9519/\u9700\u5173\u6CE8\uFF08\u4E0E DSH \u81EA\u5E26 StateDot \u4E00\u81F4\uFF09\n // (manual \u2192 \u84DD \u624B\u52A8\u6807\u8BB0\u672A\u8BFB\uFF0C\u6700\u9AD8\u4F18\u5148\u7EA7)\n const COLOR = {\n manual: 'var(--dsw-alias-state-business-primary)', // \u84DD \u624B\u52A8\u6807\u8BB0\u672A\u8BFB\n running: '#EAB308', // \u9EC4 \u5DE5\u4F5C\u4E2D (DSH running)\n feedback: 'var(--dsw-alias-state-warn-primary, #F59E0B)', // \u7425\u73C0 \u9700\u7528\u6237\u53CD\u9988 (DSH warning)\n done: 'var(--dsw-alias-state-success-primary)', // \u7EFF \u5B8C\u6210\u540E\u672A\u8BFB (DSH done)\n error: 'var(--dsw-alias-state-error-primary)', // \u7EA2 \u51FA\u9519/\u9700\u5173\u6CE8 (DSH error)\n }\n const manualUnread = dsmLoadManual()\n // v3.6.2 #2\uFF1A\u539F WeakSet\u300C\u9996\u7ED8\u4E00\u6B21\u5373\u7EC8\u8EAB\u514D\u6539\u300D\u5347\u7EA7\u4E3A WeakMap \u6240\u6709\u6743\u8BB0\u5F55\n // row \u2192 { id, text, authoritative }\u3002\u6743\u5A01\u6807\u9898**\u540E\u5230**\u65F6\u56DE\u586B\u4ECD\u7531\u6211\u4EEC\u6301\u6709\u6587\u672C\u7684\n // \u884C\uFF1B\u5B98\u65B9\uFF08\u91CD\u547D\u540D\u7B49\uFF09\u6539\u5199\u6587\u672C\u540E\u6240\u6709\u6743\u79FB\u4EA4\uFF0C\u7EDD\u4E0D\u8986\u76D6 DSH Core \u7684\u5B9E\u65F6\u66F4\u65B0\u3002\n const titleBaselines = new WeakMap()\n // \u7A7A\u5206\u7EC4\u515C\u5E95\uFF1ADSH \u4F1A\u628A\u300C\u65E5\u5FD7\u5DF2\u4E0D\u5728\u539F\u5904\u300D\u7684\u4F1A\u8BDD\u91CD\u65B0\u5F52\u5230\u300C\u672A\u5206\u7EC4\u300D\u7EC4\u91CC\uFF08\u5220\n // \u9664\u540E\u6700\u660E\u663E\uFF09\u3002\u6211\u4EEC\u628A\u884C\u9690\u85CF\u4E86\uFF0C\u4F46\u7A7A\u7EC4\u6807\u9898\u4F1A\u7559\u4E0B\u6765\u2014\u2014\u6240\u4EE5\u7EC4\u5185\u6240\u6709\u884C\u90FD\u88AB\n // \u9690\u85CF\u65F6\uFF0C\u628A\u6574\u4E2A\u5206\u7EC4\uFF08\u542B\u5B83\u7684\u6807\u9898\u884C\uFF09\u4E00\u8D77\u9690\u85CF\uFF1B\u7EC4\u5185\u91CD\u65B0\u51FA\u73B0\u53EF\u89C1\u884C\u65F6\u81EA\u52A8\n // \u8FD8\u539F\u3002\u53EA\u5728\u300C\u7EC4\u5185\u786E\u5B9E\u6709\u884C\u300D\u65F6\u624D\u5224\u5B9A\uFF0C\u907F\u514D\u628A\u6B63\u5728\u52A0\u8F7D\u7684\u7A7A\u7EC4\u8BEF\u85CF\u3002\n // \u539F display \u8BB0\u5728 owner \u7684 dataset \u4E0A\uFF08\u89C1\u4E0B\u65B9 dsmSyncEmptyGroups\uFF09\u3002\n function dsmSyncEmptyGroups() {\n let groups = null\n try { groups = document.querySelectorAll('[role=\"group\"]') } catch (e) { return }\n if (!groups || !groups.length) return\n groups.forEach((g) => {\n const items = g.querySelectorAll('[role=\"treeitem\"]')\n if (!items.length) return\n let visible = 0\n items.forEach((it) => { if (it.style.display !== 'none') visible++ })\n // ARIA tree\uFF1Agroup \u901A\u5E38\u5D4C\u5728\u5B83\u7684\u6807\u9898 treeitem \u91CC\uFF0C\u85CF\u6807\u9898\u5373\u85CF\u6574\u7EC4\u3002\n // \u539F display \u5B58\u8FDB dataset\uFF08\u800C\u975E WeakMap\uFF09\uFF1A\u6E05\u573A/\u8FD8\u539F\u51FD\u6570\u65E0\u6CD5\u904D\u5386\n // WeakMap\uFF0Cdataset \u8BA9\u300C\u8C01\u88AB\u6211\u4EEC\u85CF\u8FC7\u3001\u539F\u6765\u662F\u4EC0\u4E48\u300D\u968F\u65F6\u53EF\u67E5\u53EF\u8FD8\u539F\u3002\n const owner = g.closest('[role=\"treeitem\"]') || g\n if (visible === 0) {\n if (!owner.hasAttribute('data-dsm-group-hidden')) {\n owner.dataset.dsmPrevDisplay = owner.style.display || ''\n owner.setAttribute('data-dsm-group-hidden', '')\n }\n if (owner.style.display !== 'none') owner.style.display = 'none'\n } else if (owner.hasAttribute('data-dsm-group-hidden')) {\n const prev = owner.dataset.dsmPrevDisplay || ''\n if (owner.style.display !== prev) owner.style.display = prev\n owner.removeAttribute('data-dsm-group-hidden')\n delete owner.dataset.dsmPrevDisplay\n }\n })\n }\n const paint = () => {\n if (sidebarAdapter.disabled) return\n // Recompute the active session on every paint so the active row is never\n // shown from a stale `curActive` (the click that changes aria-selected\n // mutates the DOM and triggers paint immediately, before the tick()\n // would have run \u2014 without this, the clicked session flashed green).\n const activeId = activeRowId()\n // Clicking into a manually-marked session auto-clears the manual unread\n // flag (it becomes read on open) \u2014 only on the active transition, so a\n // flag set while already viewing it isn't wiped until you re-enter it.\n if (activeId !== curActive && activeId && manualUnread.has(activeId)) {\n manualUnread.delete(activeId)\n dsmSaveManual()\n }\n curActive = activeId\n // \u6BCF\u6B21 paint \u53EA\u805A\u5408\u4E00\u6B21\uFF1A\u7236\u4F1A\u8BDD id \u2192 \u5B50\u4EE3\u7406\u6570\uFF08O(n)\uFF0C\u907F\u514D\u6BCF\u884C\u91CD\u7B97\uFF09\u3002\n const purgedNow = dsmLoadPurged()\n const kidsByParent = (() => {\n const m = new Map()\n for (const [id, info] of dsmLineage.entries()) {\n if (info.origin !== 'subagent' || !info.parentSession) continue\n // \u5DF2\u8FDB\u56DE\u6536\u7AD9 / \u5DF2\u5F7B\u5E95\u5220\u9664\u7684\u5B50\u4EE3\u7406\u4E0D\u8BA1\u6570\uFF1A\u5426\u5219\u5220\u6389\u4E86\u5FBD\u6807\u6570\u5B57\u8FD8\u6302\u7740\u3002\n if ((dsmTrashIds && dsmTrashIds.has(id)) || purgedNow.has(id)) continue\n m.set(info.parentSession, (m.get(info.parentSession) || 0) + 1)\n }\n return m\n })()\n const rows = document.querySelectorAll('[role=\"treeitem\"]')\n // \u515C\u5E95\u6E05\u7406\uFF1A\u7236\u884C\u88AB React \u79FB\u9664 / \u590D\u7528\u540E\u6B8B\u7559\u7684\u5B50\u4EE3\u7406\u5BB9\u5668\u7ACB\u523B\u6458\u6389\uFF0C\n // \u907F\u514D\u5B64\u513F\u5BB9\u5668\u8D8A\u5806\u8D8A\u591A\u3002\n document.querySelectorAll('[data-dsm-subs]').forEach((box) => {\n const pid = box.getAttribute('data-dsm-subs')\n const prev = box.previousElementSibling\n if (!prev || rowId(prev) !== pid) box.remove()\n })\n rows.forEach((row) => {\n const id = rowId(row)\n if (!id) return\n // Trashed sessions belong in \u56DE\u6536\u7AD9, not the sidebar (DSH would group\n // them under \"\u672A\u5206\u7EC4\"). Hide the row entirely and skip its dot. So do\n // hard-purged sessions \u2014 they're gone for good and must never resurface\n // (otherwise DSH re-renders the orphan under a \"\u672A\u5206\u7EC4\" group).\n const purged = purgedNow\n if ((dsmTrashIds && dsmTrashIds.has(id)) || purged.has(id)) {\n if (row.style.display !== 'none') row.style.display = 'none'\n const d = row.querySelector('[' + DOT + ']'); if (d) d.remove()\n dsmDropSubList(row, id)\n return\n }\n // ---- \u8840\u7F18\u5206\u5C42\u62AB\u9732\uFF08issue #6\uFF09--------------------------------------\n // \u4F18\u5148\u7EA7\uFF1A\u56DE\u6536\u7AD9/\u5893\u7891\u9690\u85CF > \u7EAF\u51C0\u89C6\u56FE\u9690\u85CF\uFF08\u4EC5\u7A7A\u767D\u884C\uFF09 > \u539F\u751F\u663E\u793A\u3002\n // \u5B50\u4EE3\u7406\u884C\u6309 DSH \u8BBE\u8BA1\u4E0D\u8FDB\u4FA7\u680F\uFF08ui-subagent README \u660E\u6587\uFF09\uFF1B\u4E07\u4E00\u4E0A\u6E38\n // \u6539\u56DE\u6E32\u67D3\uFF0C\u8FD9\u91CC\u53EA\u505A\u7F29\u8FDB\u89C6\u89C9\u3001\u7EDD\u4E0D\u9690\u85CF\u2014\u2014\u4FA7\u680F\u6CA1\u6709\u5C55\u5F00\u5165\u53E3\uFF0C\u85CF\u4E86\n // \u5C31\u518D\u4E5F\u627E\u4E0D\u56DE\u6765\u3002\n const li = dsmLineage.get(id)\n const isSub = !!(li && li.origin === 'subagent')\n const isEmpty = !!(li && li.empty)\n // React \u4F1A\u590D\u7528\u884C DOM\uFF1A\u6BCF\u6B21\u5148\u6309\u5F53\u524D id \u91CD\u7F6E\u8840\u7F18\u89C6\u89C9\uFF0C\u518D\u6309\u9700\u52A0\u56DE\u3002\n // classList \u7684 add/remove \u5BF9\u5DF2\u5904\u4E8E\u76EE\u6807\u72B6\u6001\u7684\u884C\u662F\u65E0\u64CD\u4F5C\uFF08\u4E0D\u89E6\u53D1\n // MutationObserver\uFF09\uFF0C\u5FBD\u6807\u8282\u70B9\u53EA\u5141\u8BB8\u300C\u7F3A\u5931\u624D\u521B\u5EFA\u300D\u3002\n row.classList.remove('dsm-row-sub')\n // \u9009\u4E2D\u884C\u6807\u8BB0\uFF1A\u5FBD\u6807/\u6807\u7B7E\u7684\u300C\u9009\u4E2D\u624D\u663E\u793A\u300D\u9760\u5B83\u9A71\u52A8\uFF08CSS \u4FA7\uFF09\u3002\n // toggle \u540C\u503C\u65F6\u4E0D\u52A8 DOM \u5C5E\u6027\uFF0C\u4E0D\u4F1A\u89E6\u53D1 MutationObserver\u3002\n row.classList.toggle('dsm-row-active', id === activeId)\n row.style.removeProperty('--dsm-indent')\n let hideLineage = false\n if (li && isSub) {\n row.classList.add('dsm-row-sub')\n if (getComputedStyle(row).position === 'static') row.style.position = 'relative'\n const depth = Math.max(0, (li.delegationDepth || 1) - 1)\n if (depth > 0) row.style.setProperty('--dsm-indent', String(depth * 10) + 'px')\n } else if (li && isEmpty) {\n // \u7A7A\u767D\u884C\u4E00\u5F8B\u9690\u85CF\uFF08\u539F\u7EAF\u51C0\u89C6\u56FE\u884C\u4E3A\u56FA\u5316\uFF0C\u89C1 dsmLineage \u6CE8\u91CA\uFF09\u3002\n hideLineage = true\n }\n if (hideLineage) {\n if (row.style.display !== 'none') row.style.display = 'none'\n const d = row.querySelector('[' + DOT + ']'); if (d) d.remove()\n dsmDropSubList(row, id)\n return\n }\n if (row.style.display === 'none') row.style.display = ''\n if (!isEmpty && li && li.parentSession && li.origin !== 'subagent') {\n // fork \u5206\u652F\u884C\uFF1A\u7EFF\u300C\u2442 \u5206\u652F\u300Dchip\uFF0C\u70B9\u51FB\u6EDA\u52A8\u5E76\u9AD8\u4EAE\u7236\u4F1A\u8BDD\u884C\u3002\n // v3.6.2 #3\uFF1Achip \u6BCF\u6B21 paint \u5E42\u7B49\u540C\u6B65\uFF08\u5B58\u5728\u624D\u4E0D\u5EFA\uFF0C\u4F46 tooltip/\u7236 id\n // \u968F\u6700\u65B0\u6743\u5A01\u6570\u636E\u5237\u65B0\uFF09\u2014\u2014\u65E7\u5B9E\u73B0\u300C\u521B\u5EFA\u5373\u5B9A\u683C\u300D\uFF0C\u7236\u6807\u9898\u540E\u5230\u65F6 tooltip\n // \u6C38\u8FDC\u505C\u5728\u964D\u7EA7\u6587\u6848\uFF1B\u70B9\u51FB\u6539\u8BFB dataset\uFF0CReact \u590D\u7528\u884C DOM \u4E5F\u4E0D\u4F1A\u5207\u9519\u7236\u3002\n const parentTitle = dsmAuthoritativeTitles.get(li.parentSession)\n const tip = parentTitle ? '\u5206\u652F\u4E8E\uFF1A' + parentTitle : '\u5206\u652F\u4F1A\u8BDD\uFF08\u70B9\u51FB\u67E5\u770B\u6765\u6E90\u4F1A\u8BDD\uFF09'\n let fork = row.querySelector('[data-dsm-tag=\"fork\"]')\n if (!fork) {\n fork = document.createElement('button')\n fork.type = 'button'\n fork.dataset.dsmTag = 'fork'\n fork.className = 'dsm-tag dsm-tag-fork'\n fork.textContent = '\u2442 \u5206\u652F'\n fork.addEventListener('click', (e) => {\n e.stopPropagation(); e.preventDefault()\n const target = e.currentTarget.dataset.dsmForkParent || ''\n const rows = document.querySelectorAll('[role=\"treeitem\"]')\n for (const other of rows) {\n if (rowId(other) === target) {\n other.scrollIntoView({ block: 'center', behavior: 'smooth' })\n other.classList.add('dsm-row-flash')\n setTimeout(() => other.classList.remove('dsm-row-flash'), 1200)\n break\n }\n }\n })\n row.appendChild(fork)\n }\n if (fork.dataset.dsmForkParent !== li.parentSession) fork.dataset.dsmForkParent = String(li.parentSession)\n if (fork.title !== tip) { fork.title = tip; fork.setAttribute('aria-label', tip) }\n } else {\n const staleFork = row.querySelector('[data-dsm-tag=\"fork\"]')\n if (staleFork) staleFork.remove()\n }\n if (!isEmpty && !isSub) {\n const kids = kidsByParent.get(id)\n const existingKids = row.querySelector('[data-dsm-kids]')\n const open = dsmSubsOpen.has(id)\n // \u5FBD\u6807 DOM \u968F\u8840\u7F18\u5E38\u9A7B\uFF0C\u663E\u9690\u4EA4\u7ED9 CSS\uFF08\u9009\u4E2D / \u60AC\u505C / \u952E\u76D8\u805A\u7126\uFF09\u3002\u5DF2\n // \u5C55\u5F00\u7684\u7236\u884C\u52A0 dsm-row-open \u8BA9\u5FBD\u6807\u5E38\u9A7B\u53EF\u89C1\u2014\u2014\u5426\u5219\u5207\u8D70\u4E4B\u540E\u5C31\u518D\u4E5F\n // \u6536\u4E0D\u56DE\u6765\u4E86\u3002\u9690\u85CF\u72B6\u6001\u4E0D\u5360\u4F4D\uFF1A\u6807\u9898\u62FF\u5168\u5BBD\uFF0C\u60AC\u505C\u624D\u8BA9\u4F4D\u7ED9\u5FBD\u6807\u3002\n row.classList.toggle('dsm-row-open', open)\n if (kids) {\n const text = (open ? '\u25BE ' : '\u25B8 ') + kids + ' \u5B50\u4EE3\u7406'\n let badge = existingKids\n if (!badge) {\n badge = document.createElement('button')\n badge.type = 'button'\n badge.dataset.dsmKids = ''\n badge.className = 'dsm-kids-badge'\n badge.addEventListener('click', (e) => {\n e.stopPropagation(); e.preventDefault()\n dsmToggleSubs(badge)\n })\n row.appendChild(badge)\n }\n // \u7236\u4F1A\u8BDD id \u5B58 dataset\u3001\u6BCF\u6B21 paint \u5237\u65B0\uFF1AReact \u590D\u7528\u884C DOM \u65F6\u65E7\u95ED\u5305\n // \u91CC\u7684 id \u53EF\u80FD\u5DF2\u8FC7\u671F\uFF0C\u70B9\u51FB\u65F6\u8BFB dataset \u624D\u4E0D\u4F1A\u5207\u9519\u7236\u4F1A\u8BDD\u3002\n if (badge.dataset.dsmParentId !== id) badge.dataset.dsmParentId = id\n // \u540C\u503C\u8D4B\u503C\u4F1A\u66FF\u6362\u6587\u672C\u8282\u70B9\u3001\u89E6\u53D1 observer\u2014\u2014\u53EA\u5728\u53D8\u5316\u65F6\u5199\u3002\n if (badge.textContent !== text) badge.textContent = text\n const label = (open ? '\u6536\u8D77' : '\u5C55\u5F00') + '\u8BE5\u4F1A\u8BDD\u7684 ' + kids + ' \u4E2A\u5B50\u4EE3\u7406'\n if (badge.getAttribute('aria-label') !== label) {\n badge.setAttribute('aria-label', label)\n badge.title = label\n }\n if (badge.getAttribute('aria-expanded') !== String(open)) badge.setAttribute('aria-expanded', String(open))\n if (open) dsmSyncSubList(row, id)\n else dsmDropSubList(row, id)\n } else {\n // \u6CA1\u6709\u5B50\u4EE3\u7406\uFF1A\u5FBD\u6807\u4E0E\u53EF\u80FD\u6B8B\u7559\u7684\u5B50\u4EE3\u7406\u5BB9\u5668\u4E00\u5E76\u6458\u6389\u3002\n if (existingKids) existingKids.remove()\n dsmDropSubList(row, id)\n }\n } else {\n row.classList.remove('dsm-row-open')\n const staleKids = row.querySelector('[data-dsm-kids]')\n if (staleKids) staleKids.remove()\n }\n // DSH's cold list baseline can expose a stale header title until the\n // Session is opened. Paint the latest log-folded title from the host\n // authority without materializing the Session or changing its log.\n const authoritativeTitle = dsmAuthoritativeTitles.get(id)\n {\n const base = titleBaselines.get(row)\n // \u96F6\u6210\u672C\u5FEB\u8DEF\u5F84\uFF1A\u5DF2\u5B9A\u578B\u4E14\u6743\u5A01\u6CA1\u66F4\u65B0 \u2192 \u4E0D\u67E5 DOM \u4E0D\u6BD4\u8F83\u3002\n if (!base || base.id !== id || (authoritativeTitle && authoritativeTitle !== base.authoritative)) {\n const node = rowNode(row) || {}\n const expected = new Set([node.title, node.displayTitle, node.name].filter((value) => typeof value === 'string'))\n const spans = [...row.children].filter((el) => el.tagName === 'SPAN' && !el.querySelector('[data-state]') && (el.textContent || '').trim())\n let titleEl = null\n if (base && base.id === id) {\n // \u56DE\u586B\u8DEF\u5F84\uFF1A\u53EA\u8BA4\u6211\u4EEC\u4E0A\u6B21\u5199\u5165/\u8BB0\u5F55\u7684\u90A3\u6BB5\u6587\u672C\uFF0C\u7EDD\u4E0D\u731C\u522B\u7684 span\u3002\n titleEl = spans.find((el) => (el.textContent || '') === base.text) || spans.find((el) => expected.has((el.textContent || '').trim())) || null\n } else {\n titleEl = spans.find((el) => expected.has((el.textContent || '').trim())) || spans[0] || null\n }\n if (titleEl) {\n const d = titleBackfillDecision({\n rendered: titleEl.textContent || '',\n baseline: base && base.id === id ? { text: base.text, authoritative: base.authoritative } : null,\n authoritative: authoritativeTitle || '',\n })\n if (d) {\n if (d.changed && titleEl.textContent !== d.text) titleEl.textContent = d.text\n titleBaselines.set(row, { id, text: d.nextBaseline.text, authoritative: d.nextBaseline.authoritative })\n }\n }\n }\n }\n // Read DSH's REAL session status from the row's own StateDot and recolor\n // it with the user's scheme (we also hide DSH's dot so only ours shows).\n const sd = row.querySelector('[data-state]')\n if (sd) sd.style.display = 'none'\n let dot = row.querySelector('[' + DOT + ']')\n const state = dotStateFor({ manualUnread: manualUnread.has(id), dataState: sd ? sd.getAttribute('data-state') : '', isActive: activeId === id })\n const color = state ? COLOR[state] : null\n if (!color) { if (dot) dot.remove(); return }\n if (!dot) {\n dot = document.createElement('span')\n dot.setAttribute(DOT, '')\n dot.className = 'dsm-dot'\n if (!row.hasAttribute('data-dsm-pos')) {\n if (getComputedStyle(row).position === 'static') row.style.position = 'relative'\n row.setAttribute('data-dsm-pos', '')\n }\n dot.addEventListener('click', (e) => {\n e.stopPropagation(); e.preventDefault()\n dsmToggleManual(id)\n })\n row.insertBefore(dot, row.firstChild)\n }\n dot.style.background = color\n })\n dsmSyncEmptyGroups()\n }\n dsmRepaintDots = paint\n const paintToast = (msg, kind) => {\n const t = document.createElement('div')\n t.className = 'dsm-toast' + (kind === 'err' ? ' dsm-toast-err' : '')\n t.textContent = msg\n t.style.cssText = 'position:fixed;left:50%;bottom:24px;transform:translateX(-50%);max-width:80%;padding:8px 14px;border-radius:8px;background:#2C2C2A;color:#F1EFE8;font-size:12px;line-height:1.5;z-index:9999'\n document.body.appendChild(t)\n setTimeout(() => t.remove(), 4200)\n }\n // ---- \u4FA7\u680F\u5C31\u5730\u5C55\u5F00\u5B50\u4EE3\u7406\uFF08issue #6\uFF09------------------------------------\n // DSH \u6309\u8BBE\u8BA1\u4E0D\u6E32\u67D3\u5B50\u4EE3\u7406\u884C\uFF08ui-subagent \u660E\u6587 \"omitted from the ordinary\n // sidebar\"\uFF09\uFF0C\u6240\u4EE5\u63D2\u4EF6\u81EA\u5DF1\u628A\u5B83\u4EEC\u5728\u7236\u884C\u4E0B\u65B9\u8865\u6E32\u67D3\u51FA\u6765\uFF1A\u70B9\u51FB\u5FBD\u6807\u5C31\u5730\u5C55\u5F00\uFF0C\n // \u4E0D\u9700\u8981\u8DF3\u8F6C\u5230\u4EFB\u4F55\u522B\u5904\u3002\u6570\u636E\u6765\u81EA lineage-tree\uFF08\u5B98\u65B9 header \u8840\u7F18 + live\n // \u6807\u8BB0\uFF09\uFF0C\u5E26\u77ED\u671F\u7F13\u5B58\uFF1B\u5220\u9664\u540E\u6574\u8868\u5931\u6548\u91CD\u53D6\u3002\n const DSM_KEY_SUBS = 'dsm-subs-open-v1'\n const dsmSubsOpen = new Set()\n try { for (const id of JSON.parse(localStorage.getItem(DSM_KEY_SUBS) || '[]')) if (typeof id === 'string') dsmSubsOpen.add(id) } catch (e) {}\n const dsmSaveSubsOpen = () => { try { localStorage.setItem(DSM_KEY_SUBS, JSON.stringify([...dsmSubsOpen])) } catch (e) {} }\n const dsmSubTrees = new Map()\n const SUB_TTL_MS = 15000\n async function dsmFetchSubTree(pid) {\n const cached = dsmSubTrees.get(pid)\n if (cached && Date.now() - cached.ts < SUB_TTL_MS) return cached\n dsmSubTrees.set(pid, { ts: Date.now(), status: 'loading', nodes: (cached && cached.nodes) || [] })\n try {\n const r = await postJSON('/archived-sessions/lineage-tree', { sessionId: pid })\n dsmSubTrees.set(pid, { ts: Date.now(), status: 'ready', nodes: (r && r.nodes) || [] })\n } catch (e) {\n dsmSubTrees.set(pid, { ts: Date.now(), status: 'error', nodes: [], error: String((e && e.message) || e) })\n }\n if (dsmRepaintDots) dsmRepaintDots()\n return dsmSubTrees.get(pid)\n }\n async function dsmSubAction(sid, kind) {\n try {\n await postJSON('/archived-sessions/delete', { sessionId: sid })\n if (kind === 'purge') {\n await postJSON('/archived-sessions/trash/purge', { sessionId: sid })\n dsmMarkPurged([sid])\n paintToast('\u5DF2\u5F7B\u5E95\u5220\u9664\u8BE5\u5B50\u4EE3\u7406')\n } else {\n paintToast('\u5DF2\u79FB\u5165\u56DE\u6536\u7AD9')\n }\n // \u4E50\u89C2\u5254\u9664\uFF1A\u670D\u52A1\u7AEF\u91CD\u53D6\u662F\u5F02\u6B65\u7684\uFF08\u4E14 DSH \u7684\u5185\u5B58\u4F1A\u8BDD\u5217\u8868\u53EF\u80FD\u8FD8\u6302\u7740\u521A\u5220\u6389\n // \u7684\u5B50\u4EE3\u7406\uFF09\uFF0C\u5148\u628A\u8FD9\u4E2A id \u4ECE\u6240\u6709\u5DF2\u7F13\u5B58\u7684\u6811\u91CC\u6458\u6389\uFF0C\u7ACB\u523B\u91CD\u7ED8\uFF0C\u4E0D\u7B49\u7F51\u7EDC\u3002\n dsmDropSubagentFromTrees(sid)\n // \u540E\u53F0\u91CD\u53D6\uFF1Aloading \u671F\u95F4\u6CBF\u7528\u4E0A\u4E00\u6B65\u7684\u4E50\u89C2\u7ED3\u679C\uFF08dsmFetchSubTree \u4FDD\u7559\u65E7\n // nodes\uFF09\uFF0C\u65B0\u6570\u636E\u5230\u8FBE\u540E\u518D\u5237\u65B0\u4E00\u6B21\uFF0C\u4E0D\u4F1A\u95EA\u56DE\u300C\u52A0\u8F7D\u4E2D\u300D\u3002\n for (const pid of [...dsmSubTrees.keys()]) dsmFetchSubTree(pid)\n dsmLoadTrashIds()\n if (dsmRepaintDots) dsmRepaintDots()\n } catch (e) { paintToast('\u64CD\u4F5C\u5931\u8D25\uFF1A' + String((e && e.message) || e)) }\n }\n // \u4ECE\u6240\u6709\u7F13\u5B58\u7684\u5B50\u4EE3\u7406\u6811\u91CC\u9012\u5F52\u6458\u6389\u4E00\u4E2A id\uFF08\u542B\u5B83\u7684\u6574\u68F5\u5B50\u6811\uFF09\u3002\n function dsmDropSubagentFromTrees(sid) {\n const target = String(sid)\n const prune = (nodes) => (nodes || []).filter((n) => String(n.sessionId) !== target).map((n) => ({ ...n, children: prune(n.children) }))\n for (const [pid, rec] of dsmSubTrees) {\n if (!rec || !Array.isArray(rec.nodes)) continue\n dsmSubTrees.set(pid, { ...rec, nodes: prune(rec.nodes) })\n }\n }\n function dsmToggleSubs(badge) {\n const pid = badge && badge.dataset ? badge.dataset.dsmParentId : null\n if (!pid) return\n if (sidebarAdapter.disabled) {\n paintToast('\u4FA7\u680F\u9002\u914D\u5668\u5DF2\u505C\u7528\uFF08\u4E0A\u6E38\u7ED3\u6784\u53D8\u5316\uFF09\uFF0C\u8BF7\u6539\u4ECE \u8BBE\u7F6E \u2192 \u4F1A\u8BDD\u7BA1\u7406 \u67E5\u770B\u5B50\u4EE3\u7406')\n return\n }\n if (dsmSubsOpen.has(pid)) { dsmSubsOpen.delete(pid); dsmSubTrees.delete(pid) } else { dsmSubsOpen.add(pid) }\n dsmSaveSubsOpen()\n if (dsmRepaintDots) dsmRepaintDots()\n }\n function dsmDropSubList(row, pid) {\n const parent = row.parentNode\n if (!parent) return\n for (const el of parent.children) {\n if (el.getAttribute && el.getAttribute('data-dsm-subs') === pid) { el.remove(); break }\n }\n }\n // \u628A\u67D0\u7236\u4F1A\u8BDD\u7684\u5B50\u4EE3\u7406\u6811\u540C\u6B65\u5230\u5B83\u4E0B\u65B9\u3002\u5168\u7A0B\u5E42\u7B49\uFF1A\u5BB9\u5668\u53EA\u5728\u7F3A\u5931\u65F6\u521B\u5EFA\uFF0C\u5185\u5BB9\n // \u53EA\u5728\u7B7E\u540D\u53D8\u5316\u65F6\u91CD\u5199\u2014\u2014\u5426\u5219\u81EA\u5DF1\u7684\u5199\u5165\u4F1A\u518D\u6B21\u89E6\u53D1 MutationObserver \u6B7B\u5FAA\u73AF\u3002\n function dsmSyncSubList(row, pid) {\n const parent = row.parentNode\n if (!parent) return\n const open = dsmSubsOpen.has(pid)\n let box = null\n for (const el of parent.children) {\n if (el.getAttribute && el.getAttribute('data-dsm-subs') === pid) { box = el; break }\n }\n if (!open) { if (box) box.remove(); return }\n const rec = dsmSubTrees.get(pid)\n if (!rec) { dsmFetchSubTree(pid); return }\n if (!box) {\n box = document.createElement('div')\n box.setAttribute('data-dsm-subs', pid)\n box.className = 'dsm-subs'\n parent.insertBefore(box, row.nextSibling)\n } else if (box.nextElementSibling !== row.nextSibling && box.previousElementSibling !== row) {\n // React \u91CD\u6392\u540E\u5BB9\u5668\u53EF\u80FD\u4E0D\u5728\u539F\u4F4D\uFF1A\u642C\u56DE\u7236\u884C\u4E0B\u65B9\u3002\n parent.insertBefore(box, row.nextSibling)\n }\n const flat = []\n const walk = (nodes, depth) => { for (const n of nodes || []) { flat.push([n, depth]); if (depth < 4) walk(n.children, depth + 1) } }\n walk(rec.nodes, 0)\n // v3.6.2 #8\uFF1A\u6811\u91CC title \u4E3A null\uFF08\u672A\u6696/\u5931\u8D25\uFF09\u7684\u5B50\u8282\u70B9\u7528\u4FA7\u680F\u6743\u5A01\u6807\u9898\u56DE\u843D\n // \u53C2\u4E0E\u7B7E\u540D\u4E0E\u6E32\u67D3\u2014\u2014\u6743\u5A01\u540E\u5230\u65F6\u7B7E\u540D\u53D8\u5316\uFF0C\u5C55\u5F00\u6001\u5C31\u5730\u8865\u5199\uFF0C\u4E0D\u518D\u5B9A\u683C\u77ED id\u3002\n const effTitle = (n) => n.title || dsmAuthoritativeTitles.get(String(n.sessionId)) || ''\n const sig = rec.status + '|' + flat.map(([n, d]) => [n.sessionId, effTitle(n), n.live ? 1 : 0, n.sizeBytes, d].join(':')).join(';')\n if (box.dataset.dsmSig === sig) return\n box.dataset.dsmSig = sig\n box.textContent = ''\n if (rec.status === 'loading' && !flat.length) {\n const p = document.createElement('div'); p.className = 'dsm-sub-note'; p.textContent = '\u52A0\u8F7D\u5B50\u4EE3\u7406\u2026'; box.appendChild(p); return\n }\n if (rec.status === 'error') {\n const p = document.createElement('div'); p.className = 'dsm-sub-note'; p.textContent = '\u5B50\u4EE3\u7406\u52A0\u8F7D\u5931\u8D25\uFF1A' + (rec.error || '\u672A\u77E5\u9519\u8BEF'); box.appendChild(p); return\n }\n if (!flat.length) {\n const p = document.createElement('div'); p.className = 'dsm-sub-note'; p.textContent = '\u8BE5\u4F1A\u8BDD\u6CA1\u6709\u5B50\u4EE3\u7406'; box.appendChild(p); return\n }\n const canPurgeSub = dsmActionCapability('physicalPurge', 'purge')\n for (const [n, depth] of flat) {\n const r = document.createElement('div')\n r.className = 'dsm-sub-row' + (n.live ? ' dsm-sub-live' : '')\n r.style.paddingLeft = String(14 + depth * 12) + 'px'\n // \u6574\u884C\u53EF\u70B9\uFF1A\u8D70\u5B98\u65B9 sessions.open / openSubagent \u6253\u5F00\u8FD9\u4E2A\u5B50\u4EE3\u7406\u4F1A\u8BDD\u3002\n // \u884C\u5185\u6309\u94AE\u81EA\u5DF1 stopPropagation\uFF0C\u4E0D\u4F1A\u8BEF\u89E6\u53D1\u3002\n r.title = '\u6253\u5F00\u8FD9\u4E2A\u5B50\u4EE3\u7406\u4F1A\u8BDD'\n r.addEventListener('click', async () => {\n const res = await dsmOpenSessionById(n.sessionId, n.parentSession || pid)\n if (res === 'ok') return\n const msg = openSubagentToast(res, n.title, 'sidebar')\n paintToast(msg.text, msg.kind)\n })\n const name = document.createElement('span')\n name.className = 'dsm-sub-name'\n name.textContent = effTitle(n) || (String(n.sessionId).slice(0, 8) + '\u2026')\n name.title = n.sessionId\n r.appendChild(name)\n const meta = document.createElement('span')\n meta.className = 'dsm-sub-meta'\n meta.textContent = n.live ? '\u8FD0\u884C\u4E2D' : (fmtBytes(n.sizeBytes) || '\u5DF2\u7ED3\u675F')\n r.appendChild(meta)\n const acts = document.createElement('span')\n acts.className = 'dsm-sub-acts'\n const del = document.createElement('button')\n del.type = 'button'\n del.className = 'dsm-sub-btn'\n del.textContent = '\u5220\u9664'\n del.title = '\u79FB\u5165\u56DE\u6536\u7AD9\uFF0C\u53EF\u5728\u56DE\u6536\u7AD9\u6062\u590D'\n del.addEventListener('click', (e) => { e.stopPropagation(); e.preventDefault(); dsmSubAction(n.sessionId, 'delete') })\n acts.appendChild(del)\n // \u5F7B\u5E95\u5220\u9664\u662F\u7834\u574F\u6027\u64CD\u4F5C\uFF0C\u53EA\u653E\u5728\u4F1A\u8BDD\u7BA1\u7406\u9762\u677F\u91CC\uFF08\u90A3\u91CC\u6709\u4E8C\u6B21\u786E\u8BA4\u3001\u56DE\u6536\u7AD9\n // \u4E0E\u5893\u7891\u4E00\u6574\u5957\u5B89\u5168\u7F51\uFF09\u3002\u4FA7\u680F\u53EA\u63D0\u4F9B\u300C\u5220\u9664\u300D\uFF08\u8FDB\u56DE\u6536\u7AD9\uFF0C\u53EF\u6062\u590D\uFF09\u3002\n r.appendChild(acts)\n box.appendChild(r)\n }\n }\n // MutationObserver \u589E\u91CF\u9A71\u52A8\u4E3A\u4E3B\uFF08childList + \u5C5E\u6027 + \u6587\u672C\uFF09\uFF0C\u5F7B\u5E95\u66FF\u4EE3\u9AD8\u9891\u7387\n // \u5168\u8868\u5B9A\u65F6\u626B\u63CF\uFF1B\u4FDD\u7559\u4E00\u4E2A\u4F4E\u9891\u515C\u5E95 tick \u5904\u7406\u65E0 DOM \u53D8\u5316\u7684\u72B6\u6001\u8FC1\u79FB\uFF0C\u4E14\u540E\u53F0\n // \u6807\u7B7E\u9875\u5B8C\u5168\u4E0D\u8DD1\u3002\u56DE\u6536\u7AD9/\u5893\u7891\u96C6\u5408\u7684\u5237\u65B0\u4E5F\u6302\u5728\u8FD9\u4E2A\u515C\u5E95\u4E0A\uFF08\u6BCF 8 \u62CD \u2248 32s\uFF09\u3002\n let raf = 0\n const schedulePaint = () => { if (raf) return; raf = requestAnimationFrame(() => { raf = 0; paint() }) }\n const FALLBACK_TICK_MS = 4000\n const tick = () => {\n if (typeof document !== 'undefined' && document.hidden) return\n // v3.6.2 C\uFF1A\u9884\u70ED\u5728\u9014\u65F6\u6BCF\u62CD\uFF084s\uFF09\u90FD\u62C9 sidebar-state\uFF0C\u8865\u9F50\u7ED3\u679C\u7ACB\u523B\u6D6E\u73B0\uFF1B\n // \u7A7A\u95F2\u65F6\u7EF4\u6301\u4F4E\u9891 32s\uFF083.4.1 \u79FB\u9664\u5168\u8868\u8F6E\u8BE2\u7684\u6027\u80FD\u51B3\u7B56\u4E0D\u56DE\u9000\u2014\u2014\u8FD9\u91CC\u8F6E\u8BE2\u7684\n // \u662F\u8F7B\u91CF authority \u8DEF\u7531\uFF0C\u4E14\u4EC5\u5728\u6709\u6D3B\u53EF\u8865\u7684\u7A97\u53E3\u671F\u52A0\u901F\uFF09\u3002\n const cadence = dsmWarmPending ? 1 : 8\n if (++dsmTrashTick % cadence === 0) dsmLoadTrashIds()\n paint()\n }\n tick()\n dsmLoadTrashIds()\n // v3.6.2 C\uFF1A\u51B7\u542F\u52A8\u5FEB\u901F\u4E8C\u62CD\u2014\u2014\u9996\u62C9\u54CD\u5E94\u53EF\u80FD\u4ECD\u88AB\u7A7A\u767D\u7CBE\u5224/\u9884\u70ED\u6392\u961F\u538B\u7740\uFF0C\n // 1.5s \u540E\u518D\u62C9\u4E00\u6B21\uFF0C\u628A\u300C\u2442 \u5206\u652F\u300D\u7B49\u540E\u5230\u4FE1\u606F\u7684\u53F0\u9636\u4ECE 32s \u7F29\u5230\u79D2\u7EA7\u3002\n const coldSecondBeat = setTimeout(() => dsmLoadTrashIds(), 1500)\n paint()\n const obs = new MutationObserver(schedulePaint)\n obs.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['data-state', 'aria-selected', 'class', 'style'],\n characterData: true,\n })\n const tickTimer = setInterval(tick, FALLBACK_TICK_MS)\n // \u63D2\u4EF6\u5378\u8F7D\uFF08HMR / \u505C\u7528\uFF09\u65F6\u6574\u573A\u6E05\u9000\uFF1A\u6CA1\u6709\u8FD9\u4E00\u6B65\uFF0Cinterval \u548C observer \u4F1A\n // \u8DDF\u7740\u65E7\u95ED\u5305\u6D3B\u5230\u9875\u9762\u5173\u95ED\uFF0C\u6CE8\u5165\u8282\u70B9\u4E5F\u4F1A\u7559\u5728\u4FA7\u680F\u4E0A\u3002\n return () => {\n clearInterval(tickTimer)\n clearTimeout(coldSecondBeat)\n obs.disconnect()\n dsmTeardownSidebarAug()\n }\n}\n\n// Cross-workspace drag/drop for the native DSH sidebar. DSH does not expose a\n// sidebar-row plugin slot, so the adapter discovers session/workspace rows from\n// their React fiber nodes, while the actual move remains entirely host-owned.\n// The existing \u201C\u79FB\u52A8\u4F1A\u8BDD\u201D menu is also the keyboard-accessible fallback.\n// \u540C\u4E0A\uFF1A\u62D6\u62FD\u589E\u5F3A\u7684\u89C2\u5BDF\u5668 / interval / document \u7EA7 pointerdown|drag* \u76D1\u542C\u5668\u53EA\u88C5\u4E00\u4EFD\u3002\nlet sidebarDragInstalled = false\nfunction installSidebarWorkspaceDrag() {\n if (typeof document === 'undefined') return\n if (sidebarDragInstalled) return\n sidebarDragInstalled = true\n let sessions = new Map()\n let dragging = null\n let moving = false\n\n // \u8BC6\u522B\u7EDF\u4E00\u8D70 sidebarAdapter\uFF08\u53EF\u7248\u672C\u5316\u3001\u53EF\u6574\u4F53\u964D\u7EA7\uFF09\uFF1Badapter \u505C\u7528\u540E\u62D6\u62FD\n // \u884C\u4E3A\u6574\u4F53\u9000\u51FA\uFF0C\u4E0D\u6B8B\u7559\u5728\u5B98\u65B9\u4FA7\u680F\u4E0A\u3002\n const sessionForRow = (row) => {\n const { node, group } = sidebarAdapter.recognize(row)\n return sessionForNodes(group ? [node, group].filter(Boolean) : [node], sessions)\n }\n const workspaceForRow = (row) => {\n // A session row's fiber chain also contains its parent workspace node.\n // Reject it explicitly so only the visible workspace header is a drop zone.\n if (sessionForRow(row)) return null\n const { group } = sidebarAdapter.recognize(row)\n return group ? workspaceForNodes([group]) : null\n }\n const eventRow = (event) => {\n for (const item of event.composedPath ? event.composedPath() : []) {\n if (item instanceof Element && item.getAttribute('role') === 'treeitem') return item\n }\n return event.target instanceof Element ? event.target.closest('[role=\"treeitem\"]') : null\n }\n const toast = (message) => {\n const el = document.createElement('div')\n el.className = 'dsm-toast'\n el.setAttribute('role', 'status')\n el.textContent = message\n document.body.appendChild(el)\n setTimeout(() => el.remove(), 2600)\n }\n const clearVisuals = () => {\n document.querySelectorAll('.dsm-drag-source,.dsm-drop-target').forEach((el) => el.classList.remove('dsm-drag-source', 'dsm-drop-target'))\n }\n const decorateRows = () => {\n if (sidebarAdapter.disabled) return\n document.querySelectorAll('[role=\"treeitem\"]').forEach((row) => {\n const session = sessionForRow(row)\n const ws = workspaceForRow(row)\n if (session) {\n row.setAttribute('aria-description', '\u53EF\u62D6\u52A8\u5230\u5176\u4ED6\u5DE5\u4F5C\u533A\uFF1B\u952E\u76D8\u7528\u6237\u53EF\u901A\u8FC7\u66F4\u591A\u83DC\u5355\u4E2D\u7684\u79FB\u52A8\u4F1A\u8BDD\u64CD\u4F5C')\n }\n if (ws) row.setAttribute('data-dsm-workspace-drop', '')\n })\n }\n const refresh = async () => {\n try {\n const sessionResult = await postJSON('/archived-sessions/sessions', {})\n sessions = new Map((sessionResult.items || []).map((item) => [String(item.sessionId), item]))\n decorateRows()\n } catch (e) { /* sidebar enhancement remains optional */ }\n }\n\n // Capture before DSH's delegated React handlers. DSH reserves the same\n // native drag gesture for reordering sessions inside one group; only a real\n // workspace-heading target is intercepted here, so same-group sorting keeps\n // its official behavior.\n // \u6307\u9488\u6309\u4E0B\u5148\u4E8E dragstart \u6570\u5341\u5230\u6570\u767E\u6BEB\u79D2\uFF0C\u6B63\u597D\u7528\u6765\u7ED9\u300CMap \u91CC\u8FD8\u6CA1\u6709\u7684\u884C\u300D\u9884\u70ED\uFF1A\n // replace the 5s poll with a just-in-time fetch, so a brand-new session is\n // draggable on the first gesture without a background poll.\n document.addEventListener('pointerdown', (event) => {\n if (moving) return\n const row = eventRow(event)\n if (!row || sessionForRow(row)) return\n maybeRefresh()\n }, true)\n\n document.addEventListener('dragstart', (event) => {\n if (sidebarAdapter.disabled) return\n const moveCapability = dsmActionCapability('relocateSession') || dsmActionCapability('move')\n if (!moveCapability || !moveCapability.available) return\n const row = eventRow(event)\n const item = row && sessionForRow(row)\n if (!item || moving) return\n dragging = item\n row.classList.add('dsm-drag-source')\n }, true)\n document.addEventListener('dragover', (event) => {\n const row = eventRow(event)\n const target = row && workspaceForRow(row)\n if (!dragging || !target || moving) return\n if (!canDropOnWorkspace(dragging, target)) return\n event.preventDefault()\n event.stopPropagation()\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'move'\n document.querySelectorAll('.dsm-drop-target').forEach((el) => { if (el !== row) el.classList.remove('dsm-drop-target') })\n row.classList.add('dsm-drop-target')\n }, true)\n document.addEventListener('drop', async (event) => {\n const row = eventRow(event)\n const item = dragging\n const target = row && workspaceForRow(row)\n if (!item || !target || moving || !canDropOnWorkspace(item, target)) return\n event.preventDefault()\n event.stopPropagation()\n moving = true\n clearVisuals()\n row.classList.add('dsm-drag-busy')\n try {\n const result = await postJSON('/archived-sessions/move', { sessionId: item.sessionId, targetPath: target.path })\n // \u4F1A\u8BDD\u88AB DSH \u6253\u5F00\u65F6\u670D\u52A1\u7AEF\u53EA\u767B\u8BB0\u6392\u961F\uFF1A\u78C1\u76D8\u4E0E\u5DE5\u4F5C\u533A\u5206\u7EC4\u90FD\u6CA1\u52A8\u3002\u8FD9\u6761\u8DEF\u5F84\u7EDD\u4E0D\u80FD\n // \u672C\u5730\u6539\u884C + \u62A5\u6210\u529F\u2014\u2014\u90A3\u4F1A\u8BA9\u7528\u6237\u4EE5\u4E3A\u79FB\u52A8\u5DF2\u5B8C\u6210\uFF0C\u800C\u4FA7\u680F\u5237\u65B0\u540E\u8BE5\u884C\u53C8\u8DF3\u56DE\u539F\u5DE5\u4F5C\u533A\n //\uFF08\u7528\u6237 2026-09-10 \u62A5\u7684\u300C\u8BF4\u79FB\u52A8\u6210\u529F\u4F46\u8FD8\u5728\u539F\u5DE5\u4F5C\u533A\u300D\u5C31\u662F\u8FD9\u4E2A\uFF09\u3002\u6392\u961F\u65F6\u53EA\u5982\u5B9E\u8BF4\u660E\u3002\n if (result && result.queued) {\n await dsmLoadTrashIds()\n toast(result.notes && result.notes.length ? result.notes.join(' ') : '\u4F1A\u8BDD\u6B63\u88AB DSH \u6253\u5F00\uFF0C\u5DF2\u6392\u961F\u5F85\u79FB\u52A8\uFF1B\u91CD\u542F DSH \u540E\u4F1A\u81EA\u52A8\u5B8C\u6210\uFF08\u8BF7\u5148\u522B\u6253\u5F00\u5B83\uFF09\u3002')\n return\n }\n sessions.set(item.sessionId, { ...item, workspacePath: result.workspacePath || target.path, workspaceTitle: result.workspaceTitle || target.title })\n await dsmLoadTrashIds()\n toast(result && result.already\n ? `\u5DF2\u5728\u300C${result.workspaceTitle || target.title}\u300D`\n : `\u5DF2\u79FB\u5230\u300C${result.workspaceTitle || target.title}\u300D`)\n } catch (error) {\n toast('\u79FB\u52A8\u5931\u8D25\uFF1A' + String((error && error.message) || error))\n } finally {\n moving = false\n dragging = null\n row.classList.remove('dsm-drag-busy')\n decorateRows()\n }\n }, true)\n document.addEventListener('dragend', () => {\n dragging = null\n clearVisuals()\n }, true)\n\n let decorateTimer = null\n const scheduleDecorate = () => {\n if (decorateTimer) return\n decorateTimer = requestAnimationFrame(() => { decorateTimer = null; decorateRows() })\n }\n refresh()\n const observer = new MutationObserver(scheduleDecorate)\n observer.observe(document.body, { childList: true, subtree: true })\n // \u539F\u5148\u8FD9\u91CC\u6BCF 5s \u65E0\u8111\u5168\u8868\u5237\u65B0\u4E00\u6B21\u3002\u8BE5\u63A5\u53E3\u5728 host \u4FA7\u8981\u904D\u5386\u5168\u90E8\u4F1A\u8BDD\uFF0C\n // \u5927\u5E93\uFF08issue #1: 49 \u4F1A\u8BDD / 14 \u4E07\u5E27\uFF09\u4E0A\u6BCF\u6B21\u90FD\u662F\u4E00\u6B21\u91CD\u6D3B\uFF0C\u9875\u9762\u6302\u7740\u5C31\u4E00\u76F4\u5360\u5BBF\u4E3B CPU\uFF0C\n // \u8FDE\u7D2F session.history \u4E4B\u7C7B RPC \u8D85\u65F6\u3002\u62D6\u62FD\u5143\u6570\u636E\u6839\u672C\u4E0D\u9700\u8981 5s \u7CBE\u5EA6\uFF1A\n // - \u80CC\u666F\u6807\u7B7E\u9875\u5B8C\u5168\u4E0D\u5237\u65B0\n // - \u524D\u53F0\u6BCF 60s \u515C\u5E95\u4E00\u6B21\n // - \u6807\u7B7E\u9875\u91CD\u65B0\u53EF\u89C1\u3001\u6216\u771F\u6B63\u5F00\u59CB\u62D6\u62FD\u800C Map \u91CC\u6CA1\u6709\u8BE5\u884C\u65F6\uFF0C\u6309\u9700\u5237\u65B0\n let lastRefreshAt = Date.now()\n const maybeRefresh = () => {\n if (typeof document !== 'undefined' && document.hidden) return\n lastRefreshAt = Date.now()\n return refresh()\n }\n const REFRESH_MS = 60000\n setInterval(() => {\n if (typeof document !== 'undefined' && document.hidden) return\n if (Date.now() - lastRefreshAt < REFRESH_MS) return\n maybeRefresh()\n }, REFRESH_MS)\n if (typeof document !== 'undefined' && document.addEventListener) {\n document.addEventListener('visibilitychange', () => {\n if (document.hidden) return\n if (Date.now() - lastRefreshAt < 30000) return\n maybeRefresh()\n })\n }\n}\n\nexport function apply(ctx) {\n dsmClientCtx = ctx\n dsmLoadCapabilities()\n installSettingsNavIcons(ctx)\n installSidebarSessionMenuAug()\n // \u4FA7\u680F\u589E\u5F3A\u7684\u5378\u8F7D\u6E05\u9000\u6302\u5230 cordis effect\uFF1A\u63D2\u4EF6\u505C\u7528/HMR \u65F6 interval\u3001\n // MutationObserver \u4E0E\u5168\u90E8\u6CE8\u5165 DOM \u4E00\u5E76\u56DE\u6536\uFF08\u5426\u5219\u6CC4\u6F0F\u5230\u9875\u9762\u5173\u95ED\uFF09\u3002\n const disposeSidebarDots = installSidebarStatusDots()\n if (disposeSidebarDots) ctx.effect(() => disposeSidebarDots)\n installSidebarWorkspaceDrag()\n const workspacesSvc = ctx.get('workspaces')\n ctx.slots.inject('settings.section', () =>\n ctx.slots.register(\n { name: 'settings.section', id: 'session-manager', order: 90, label: '\u4F1A\u8BDD\u7BA1\u7406' },\n (props) => <SessionPanel {...props} workspacesSvc={workspacesSvc} />,\n ),\n )\n}\n", "// dsh-sessions-manager \u2014 client \u7EAF\u5224\u5B9A\u903B\u8F91\u3002\n//\n// \u4FA7\u680F\u589E\u5F3A\u91CC\u6700\u5BB9\u6613\u968F DSH \u4E0A\u6E38\u53D8\u5316\u51FA\u56DE\u5F52\u7684\u4E09\u5757\u5224\u5B9A\u62BD\u5230\u8FD9\u91CC\uFF1A\n// \u72B6\u6001\u70B9\u8BED\u4E49\u3001\u62D6\u62FD\u53EF\u653E\u7F6E\u6821\u9A8C\u3001fiber node \u2192 \u4F1A\u8BDD/\u5DE5\u4F5C\u533A\u8BC6\u522B\u3002\n// \u672C\u6A21\u5757\u4E0D\u78B0 DOM\uFF0Cnode --test \u76F4\u63A5\u53EF\u6D4B\uFF08tests/client-logic.test.js\uFF09\u3002\n\n// \u72B6\u6001\u70B9\u8BED\u4E49\uFF1Amanual \u672A\u8BFB\u6700\u9AD8\u4F18\u5148\uFF1Bdone \u5728\u5F53\u524D\u67E5\u770B\u7684\u884C\u4E0A\u4E0D\u4EAE\u7EFF\n// \uFF08\u8BFB\u8FC7\u5373\u89C6\u4E3A\u5DF2\u8BFB\uFF09\u3002\u8FD4\u56DE\u903B\u8F91\u6001\u540D\uFF0C\u989C\u8272\u6620\u5C04\u7559\u5728 UI \u5C42\u3002\n// \u5386\u53F2\u56DE\u5F52\uFF1ADSH \u66FE\u628A running \u62A5\u4E3A ongoing\uFF089766476\uFF09\uFF0C\u4E0A\u6E38\u679A\u4E3E\u53D8\u5316\u8981\u76EF\u8FD9\u91CC\u3002\n// issue #4\uFF1A\u4E0A\u6E38\u8FD8\u5B58\u5728 waiting / needs-attention \u7B49\u540C\u4E49\u8BCD\uFF0C\u8FD9\u91CC\u6536\u655B\u5230\u540C\u4E00\n// \u903B\u8F91\u6001\uFF0C\u989C\u8272\u6620\u5C04\u4ECD\u7531 UI \u5C42\u7EDF\u4E00\u5904\u7406\uFF08issue \u4FDD\u6301 open \u76F4\u5230\u4E0A\u6E38\u786E\u8BA4\uFF09\u3002\nexport function dotStateFor({ manualUnread = false, dataState = '', isActive = false } = {}) {\n if (manualUnread) return 'manual'\n switch (dataState) {\n case 'ongoing':\n case 'running': return 'running'\n case 'warning':\n case 'waiting':\n case 'needs-attention': return 'feedback'\n case 'error': return 'error'\n case 'done': return isActive ? null : 'done'\n default: return null\n }\n}\n\n// \u6743\u5A01\u6807\u9898\u53EA\u4FEE\u6B63\u65B0\u51FA\u73B0 DOM \u884C\u7684\u51B7\u6001\u6807\u9898\u3002\u884C\u4E00\u65E6\u5B8C\u6210\u9996\u6B21 paint\uFF0C\u540E\u7EED\u6587\u672C\n// \u53D8\u5316\u5C5E\u4E8E DSH Core \u7684\u5B9E\u65F6\u66F4\u65B0\uFF08\u4F8B\u5982\u91CD\u547D\u540D\uFF09\uFF0C\u63D2\u4EF6\u4E0D\u5F97\u518D\u7528\u8F6E\u8BE2\u5FEB\u7167\u8986\u76D6\u3002\nexport function authoritativeTitleForFirstPaint({ firstPaint = false, rendered = '', authoritative = '' } = {}) {\n if (!firstPaint || !authoritative || rendered === authoritative) return null\n return authoritative\n}\n\n// v3.6.2 #2\uFF1A\u5360\u4F4D/\u51B7\u6807\u9898\u7684\u884C\u5728\u6743\u5A01\u6807\u9898**\u540E\u5230**\u65F6\u56DE\u586B\u3002\u8FD4\u56DE null \u8868\u793A\u4E0D\u52A8 DOM\u3002\n// \u6240\u6709\u6743\u89C4\u5219\uFF08\u4E0E\u9996\u7ED8\u4E00\u81F4\uFF0C\u7EDD\u4E0D\u8986\u76D6 DSH Core \u7684\u5B9E\u65F6\u66F4\u65B0\uFF09\uFF1A\n// - \u9996\u6B21\u89C1\u5230\u8BE5\u884C \u2192 \u6709\u6743\u5A01\u5C31\u7528\u6743\u5A01\uFF08changed \u4EC5\u5728\u6743\u5A01\u2260\u5F53\u524D\u6587\u672C\u65F6\u4E3A true\uFF09\uFF1B\n// - \u4E4B\u540E\uFF1A\u5F53\u524D\u6587\u672C\u4ECD\u7B49\u4E8E\u6211\u4EEC\u4E0A\u6B21\u8BB0\u5F55/\u5199\u5165\u7684\u503C\uFF08baseline.text\uFF09\u4E14\u6743\u5A01\u66F4\u65B0 \u2192\n// \u56DE\u586B\u65B0\u6743\u5A01\uFF1B\u5F53\u524D\u6587\u672C\u88AB\u5B98\u65B9\u6539\u8FC7 \u2192 \u53EA\u91CD\u65B0\u8BB0\u5F55\u6240\u6709\u6743\uFF0C\u7EDD\u4E0D\u5199\u3002\nexport function titleBackfillDecision({ rendered = '', baseline = null, authoritative = '' } = {}) {\n const auth = authoritative || ''\n if (!baseline) {\n const next = auth || rendered\n return { text: next, changed: !!auth && auth !== rendered, nextBaseline: { text: next, authoritative: auth || null } }\n }\n if (rendered !== baseline.text) {\n // \u6587\u672C\u5DF2\u88AB\uFF08\u5B98\u65B9\u6E32\u67D3\u6216\u7528\u6237\u91CD\u547D\u540D\uFF09\u6539\u52A8\uFF1A\u6240\u6709\u6743\u79FB\u4EA4\uFF0C\u4EC5\u91CD\u65B0\u8BB0\u5F55\u3002\n return { changed: false, nextBaseline: { text: rendered, authoritative: baseline.authoritative || null } }\n }\n if (!auth || auth === baseline.authoritative) return null\n return { text: auth, changed: true, nextBaseline: { text: auth, authoritative: auth } }\n}\n\n// v3.6.2 #6\uFF1A\u5217\u8868\u641C\u7D22/\u6807\u9898\u6392\u5E8F\u7684\u300C\u6709\u6548\u6807\u9898\u300D= \u5217\u8868\u9879\u6807\u9898\uFF0C\u7F3A\u65F6\u56DE\u843D\u5230\u4FA7\u680F\n// \u6743\u5A01\u6807\u9898\u7F13\u5B58\uFF08\u9884\u70ED\u8865\u9F50\u540E\u5373\u4F7F\u9762\u677F\u8FD8\u6CA1\u5237\u65B0\uFF0C\u641C\u7D22/\u6392\u5E8F\u4E5F\u6309\u771F\u6807\u9898\u5DE5\u4F5C\uFF09\u3002\nexport function effectiveTitleOf(item, authoritativeTitles) {\n if (!item) return ''\n if (item.title) return String(item.title)\n const id = String(item.sessionId)\n const auth = authoritativeTitles && authoritativeTitles.get(id)\n return auth ? String(auth) : ''\n}\n\n// \u62D6\u62FD\u8FC1\u79FB\u524D\u7F6E\u6821\u9A8C\uFF1A\u540C\u5DE5\u4F5C\u533A\u62E6\u622A\uFF08workspacePath \u76F8\u7B49\u5373\u62D2\u7EDD\uFF09\u3002\n// \u65E0 workspacePath \u7684\u4F1A\u8BDD\uFF08\u5982\u4FA7\u680F live \u884C\u5C1A\u672A\u540C\u6B65\uFF09\u653E\u884C\uFF0C\u7531 host \u6700\u7EC8\u88C1\u51B3\u3002\nexport function canDropOnWorkspace(item, target) {\n if (!item || !target) return false\n if (item.workspacePath && target.path === item.workspacePath) return false\n return true\n}\n\n// \u4ECE React fiber \u94FE\u6536\u96C6\u5230\u7684 node \u6570\u7EC4\u8BC6\u522B\u4F1A\u8BDD\u884C\u3002knownSessions \u662F\n// host /archived-sessions/sessions \u7684\u6743\u5A01\u8868\uFF1Blive \u884C\uFF08\u8FD8\u6CA1\u540C\u6B65\u5230\u6743\u5A01\u8868\uFF09\n// \u7528\u542F\u53D1\u5F0F\u515C\u5E95\uFF1A\u6709 id\u3001\u4E0D\u662F\u5DE5\u4F5C\u533A\u5206\u7EC4\uFF08\u65E0 workspaceId\uFF09\u3001\u4E14\u5E26\u6807\u9898/\u65F6\u95F4\u3002\nexport function sessionForNodes(nodes, knownSessions) {\n for (const node of nodes || []) {\n const id = node && node.id != null ? String(node.id) : ''\n if (knownSessions.has(id)) return knownSessions.get(id)\n // DSH \u7684\u884C\u8282\u70B9\u6709 id\uFF1B\u5DE5\u4F5C\u533A\u5206\u7EC4\u7528 workspaceId\u3001\u4ECE\u4E0D\u7528\u88F8 id\u3002\n if (id && node.workspaceId == null && (node.title != null || node.updatedAt != null || node.blank != null)) {\n return { sessionId: id, title: node.title || '', workspacePath: null }\n }\n }\n return null\n}\n\n// \u4ECE fiber node \u6570\u7EC4\u8BC6\u522B\u53EF\u89C1\u7684\u5DE5\u4F5C\u533A\u6807\u9898\u884C\uFF08\u53EF\u653E\u7F6E\u76EE\u6807\uFF09\u3002\n// \u4F1A\u8BDD\u884C\u7684 fiber \u94FE\u4E5F\u4F1A\u5E26\u51FA\u7236\u5DE5\u4F5C\u533A\u8282\u70B9\uFF0C\u8C03\u7528\u65B9\u987B\u5148\u7528 sessionForNodes \u62E6\u622A\u3002\nexport function workspaceForNodes(nodes) {\n for (const group of nodes || []) {\n if (group && group.workspaceId != null && typeof group.cwd === 'string' && group.cwd) {\n return { workspaceId: String(group.workspaceId), path: group.cwd, title: group.label || group.cwd }\n }\n }\n return null\n}\n\n// \u6536\u85CF\u8FC7\u6EE4\uFF1A\u8FD4\u56DE\u5DF2\u6536\u85CF\u5B50\u96C6\u3002star \u662F\u7528\u6237\u6807\u8BB0\uFF0C\u4E0E DSH \u7684\u6D3B\u52A8/\u5F52\u6863\u72B6\u6001\u6B63\u4EA4\n// \uFF08\u53EF\u53E0\u52A0\uFF09\uFF0C\u6240\u4EE5\u8FD9\u91CC\u4E0D\u505A\u4EFB\u4F55\u72B6\u6001\u8054\u5408\u5224\u65AD\uFF0C\u53EA\u8BA4 starred \u5B57\u6BB5\u3002\nexport function starredOf(items) {\n return (items || []).filter((item) => item && item.starred)\n}\n\n// \u8840\u7F18\u6298\u53E0\uFF1A\u628A origin === 'subagent' \u7684\u4F1A\u8BDD\u6302\u5230\u7236\u4F1A\u8BDD\u4E0B\uFF0C\u8FD4\u56DE\u9876\u5C42\u5217\u8868 + \u7236\u5B50\n// \u6620\u5C04 + \u6298\u53E0\u6570\u91CF\u3002\n//\n// \u5173\u952E\u7EA6\u675F\uFF1A\u4ECE\u9876\u5C42\u79FB\u9664\u7684\u662F\u300C\u5B50\u4EE3\u7406\u81EA\u5DF1\u300D\uFF0C\u7236\u4F1A\u8BDD\u5FC5\u987B\u4FDD\u7559\u5728\u9876\u5C42\u2014\u2014\u6298\u53E0\u6309\u94AE\u5C31\n// \u6E32\u67D3\u5728\u7236\u4F1A\u8BDD\u5361\u7247\u91CC\uFF0C\u7236\u4E00\u65E6\u88AB\u4E00\u8D77\u8FC7\u6EE4\u6389\uFF0C\u754C\u9762\u4E0A\u5C31\u53EA\u5269\u5E73\u94FA\u7684\u5B50\u4EE3\u7406\uFF0C\u770B\u8D77\u6765\n// \u50CF\u300C\u6298\u53E0\u5B8C\u5168\u6CA1\u751F\u6548\u300D\u3002\n// \u7236\u4F1A\u8BDD\u4E0D\u5728\u5F53\u524D\u5217\u8868\uFF08\u88AB\u7B5B\u9009\u6389 / \u5DF2\u5220\u9664\uFF09\u65F6\u5B50\u4EE3\u7406\u4FDD\u6301\u5728\u9876\u5C42\uFF0C\u4FDD\u8BC1\u641C\u5F97\u5230\u5C31\n// \u770B\u5F97\u89C1\u3002\nexport function foldSubagents(items, lineage) {\n const list = items || []\n const table = lineage || {}\n const kidsOf = new Map()\n const foldedIds = new Set()\n const byId = new Map()\n for (const item of list) byId.set(String(item.sessionId), item)\n for (const item of list) {\n const id = String(item.sessionId)\n const info = table[id]\n const parentId = info && info.origin === 'subagent' && info.parentSession ? String(info.parentSession) : null\n if (!parentId || parentId === id || !byId.has(parentId)) continue\n if (!kidsOf.has(parentId)) kidsOf.set(parentId, [])\n kidsOf.get(parentId).push(item)\n foldedIds.add(id)\n }\n return {\n topList: foldedIds.size ? list.filter((item) => !foldedIds.has(String(item.sessionId))) : list,\n kidsOf,\n foldedCount: foldedIds.size,\n }\n}\n\n// \u5217\u8868\u91CC\u53EA\u663E\u793A\u4F1A\u8BDD ID \u7684\u77ED\u7247\u6BB5\u3002\u5B8C\u6574 UUID \u6709 36 \u4E2A\u5B57\u7B26\uFF0C\u585E\u8FDB meta \u884C\u4F1A\u628A\u6574\n// \u884C\u6491\u5230\u6362\u884C\u3001\u5361\u7247\u9AD8\u5EA6\u8DDF\u7740\u6D6E\u52A8\u2014\u2014\u77ED ID \u662F\u300C\u5217\u8868\u5B9A\u9AD8\u300D\u7684\u524D\u63D0\u4E4B\u4E00\u3002\u5B8C\u6574\u503C\u4FDD\u7559\n// \u5728 title \u5C5E\u6027\u4E0E\u8BE6\u60C5\u9762\u677F\u91CC\uFF0C\u4FE1\u606F\u4E0D\u4E22\u3002\nexport function shortId(id) {\n const raw = String(id == null ? '' : id)\n const tail = raw.startsWith('session-') ? raw.slice(8) : raw\n if (!tail) return ''\n return tail.length <= 10 ? tail : tail.slice(0, 8) + '\u2026'\n}\n\n// \u6253\u5F00\u5B50\u4EE3\u7406\u4E4B\u540E\u7684\u63D0\u793A\u6587\u6848\u3002\u4E09\u79CD\u7ED3\u679C\u8981\u4F20\u8FBE\u4E09\u4EF6\u4E0D\u540C\u7684\u4E8B\uFF0C\u6DF7\u6210\u4E00\u53E5\u300C\u6253\u4E0D\u5F00\u300D\n// \u4F1A\u8BA9\u4EBA\u65E2\u4E0D\u77E5\u9053\u539F\u56E0\u3001\u4E5F\u4E0D\u77E5\u9053\u4E0B\u4E00\u6B65\uFF1A\n// ok \u2192 \u5DF2\u7ECF\u5207\u8FC7\u53BB\u4E86\uFF1B\u5728\u8BBE\u7F6E\u9762\u677F\u91CC\u4F1A\u8BDD\u533A\u88AB\u6321\u7740\uFF0C\u5F97\u63D0\u9192\u5173\u6389\u624D\u770B\u5F97\u5230\n// no-service \u2192 \u8FD9\u4E2A runtime \u6CA1\u5F00\u653E\u4F1A\u8BDD\u5207\u6362\u63A5\u53E3\uFF0C\u53EA\u80FD\u624B\u52A8\u5207\n// failed \u2192 \u81EA\u52A8\u5207\u6362\u6CA1\u6210\u529F\uFF0C\u7ED9\u51FA\u786E\u5B9A\u53EF\u8D70\u7684\u66FF\u4EE3\u8DEF\u5F84\uFF08\u4FA7\u680F\u7236\u4F1A\u8BDD\u5934\u90E8\u7684\n// \u300C/ N\u300D\u5B98\u65B9\u5B50\u4EE3\u7406\u76EE\u5F55\uFF09\n// where: 'panel'\uFF08\u8BBE\u7F6E\u9762\u677F\u5185\uFF09| 'sidebar'\uFF08\u4FA7\u680F\u6CE8\u5165\u884C\uFF09\nexport function openSubagentToast(result, name, where) {\n const label = name || '\u5B50\u4EE3\u7406'\n if (result === 'ok') {\n return {\n kind: 'ok',\n text: where === 'sidebar' ? `\u5DF2\u6253\u5F00\u300C${label}\u300D` : `\u5DF2\u6253\u5F00\u300C${label}\u300D\u2014 \u5173\u6389\u8BBE\u7F6E\u5373\u53EF\u770B\u5230`,\n }\n }\n if (result === 'no-service') {\n return { kind: 'err', text: '\u8FD9\u4E2A DSH \u7248\u672C\u6CA1\u6709\u5F00\u653E\u4F1A\u8BDD\u5207\u6362\u63A5\u53E3\uFF0C\u8BF7\u5728\u4FA7\u8FB9\u680F\u624B\u52A8\u5207\u6362' }\n }\n return {\n kind: 'err',\n text: where === 'sidebar'\n ? '\u6253\u4E0D\u5F00\u8FD9\u4E2A\u5B50\u4EE3\u7406\uFF1A\u8BF7\u9009\u4E2D\u5B83\u7684\u7236\u4F1A\u8BDD\uFF0C\u70B9\u6807\u9898\u680F\u7684\u300C/ N\u300D\u5B50\u4EE3\u7406\u76EE\u5F55'\n : '\u6253\u4E0D\u5F00\uFF1A\u8BF7\u5728\u4FA7\u8FB9\u680F\u9009\u4E2D\u5B83\u7684\u7236\u4F1A\u8BDD\uFF0C\u70B9\u6807\u9898\u680F\u7684\u300C/ N\u300D\u5B50\u4EE3\u7406\u76EE\u5F55',\n }\n}\n\n// \u63D0\u793A\uFF08toast\uFF09\u505C\u7559\u65F6\u957F\uFF1A\u6309**\u53EF\u8BFB\u5B57\u6570**\u7ED9\uFF0C\u800C\u4E0D\u662F\u56FA\u5B9A 2.4s / 2.6s\u3002\n// \u4E2D\u6587\u8212\u9002\u9605\u8BFB\u7EA6 6 \u5B57/\u79D2\uFF0C\u7559 40% \u4F59\u91CF\u540E\u5939\u5728 [2.6s, 11s]\uFF1B\u5931\u8D25\u7C7B\u518D \u00D71.25\uFF08\u540C\u6837\u53D7\u4E0A\u9650\u7EA6\u675F\uFF09\u3002\n// \u80CC\u666F\uFF082026-09-10 \u7528\u6237\u53CD\u9988\uFF09\uFF1A\u6392\u961F/\u5931\u8D25\u7C7B\u6587\u6848\u52A8\u8F84 40~100 \u5B57\uFF0C\"\u8FD8\u6CA1\u8BFB\u5B8C\u63D0\u793A\u5C31\u4E0D\u89C1\u4E86\"\u3002\nexport const TOAST_MIN_MS = 2600\nexport const TOAST_MAX_MS = 11000\nexport function toastDurationFor(text, kind) {\n const chars = String(text == null ? '' : text).length\n const readingMs = Math.round((chars / 6) * 1000 * 1.4)\n const scaled = kind === 'err' ? Math.round(readingMs * 1.25) : readingMs\n return Math.min(TOAST_MAX_MS, Math.max(TOAST_MIN_MS, scaled))\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["r", "rows"]
|
|
7
7
|
}
|