@sparkelf/dsh-group-chat 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -80,6 +80,33 @@ the session id because `SessionHeader` carries no free-form metadata field. An
80
80
  ordinary session never matches that prefix, which is the second half of how this
81
81
  plugin stays out of the way.
82
82
 
83
+ Opening a room is a **resolve-or-create**: the plugin resolves the persisted session
84
+ first and only calls the controller's create path when the session does not exist. A
85
+ create call is not a create-or-reuse call — once the named session has run a turn the
86
+ controller mints a fresh `session-<uuid>` instead — so calling it on every host restart
87
+ would leave a throwaway session directory behind. Older builds did exactly that; a
88
+ room could grow to thousands of directories and slow the shell's `session/list`.
89
+
90
+ A workspace upgraded from such a build can report or remove the leftovers for one room:
91
+
92
+ ```bash
93
+ # Report (default; no writes)
94
+ curl -sS -X POST http://127.0.0.1:3080/dsh-group-chat/api/rooms/<roomId>/sessions/cleanup \
95
+ -H 'content-type: application/json' -d '{}'
96
+
97
+ # Archive: mark them hidden from grouping surfaces, keep the files
98
+ curl -sS -X POST .../rooms/<roomId>/sessions/cleanup \
99
+ -H 'content-type: application/json' -d '{"dryRun":false}'
100
+
101
+ # Purge: delete the throwaway directories (canonical room session and subagent children are kept)
102
+ curl -sS -X POST .../rooms/<roomId>/sessions/cleanup \
103
+ -H 'content-type: application/json' -d '{"dryRun":false,"purge":true,"confirm":"<roomId>"}'
104
+ ```
105
+
106
+ The canonical `group-room-<roomId>` session is never a cleanup candidate, so the
107
+ room's history stays openable. If a room has already been dissolved and is no longer
108
+ listed by the backend, pass its project directory explicitly with `"directory": "..."`.
109
+
83
110
  ## Known limits
84
111
 
85
112
  - **Display names are not authentication.** The backend verifies *who* a caller is
package/lib/client.js CHANGED
@@ -514,10 +514,10 @@ window.__ModuleLoader__.load({
514
514
  }
515
515
  var Avatar_module_css_default = {
516
516
  "stack": "Ohch6W_stack",
517
- "over": "Ohch6W_over",
518
517
  "md": "Ohch6W_md",
519
- "sm": "Ohch6W_sm",
520
- "avatar": "Ohch6W_avatar"
518
+ "over": "Ohch6W_over",
519
+ "avatar": "Ohch6W_avatar",
520
+ "sm": "Ohch6W_sm"
521
521
  };
522
522
  //#endregion
523
523
  //#region src/client/Avatar.tsx
@@ -557,12 +557,12 @@ window.__ModuleLoader__.load({
557
557
  document.head.appendChild(tag);
558
558
  }
559
559
  var Picker_module_css_default = {
560
- "rowActive": "sKjJ-a_rowActive",
560
+ "label": "sKjJ-a_label",
561
561
  "secondary": "sKjJ-a_secondary",
562
- "note": "sKjJ-a_note",
563
562
  "box": "sKjJ-a_box",
563
+ "rowActive": "sKjJ-a_rowActive",
564
564
  "list": "sKjJ-a_list",
565
- "label": "sKjJ-a_label",
565
+ "note": "sKjJ-a_note",
566
566
  "row": "sKjJ-a_row"
567
567
  };
568
568
  //#endregion
@@ -736,10 +736,10 @@ window.__ModuleLoader__.load({
736
736
  document.head.appendChild(tag);
737
737
  }
738
738
  var PresetSelect_module_css_default = {
739
- "triggerLabel": "xjnmxG_triggerLabel",
740
739
  "description": "xjnmxG_description",
741
740
  "trigger": "xjnmxG_trigger",
742
741
  "name": "xjnmxG_name",
742
+ "triggerLabel": "xjnmxG_triggerLabel",
743
743
  "row": "xjnmxG_row"
744
744
  };
745
745
  //#endregion
@@ -998,23 +998,23 @@ window.__ModuleLoader__.load({
998
998
  document.head.appendChild(tag);
999
999
  }
1000
1000
  var CreateRoomDialog_module_css_default = {
1001
- "footer": "Z3w8WW_footer",
1001
+ "pill": "Z3w8WW_pill",
1002
+ "hint": "Z3w8WW_hint",
1003
+ "field": "Z3w8WW_field",
1004
+ "label": "Z3w8WW_label",
1005
+ "triggerExtra": "Z3w8WW_triggerExtra",
1006
+ "pillActive": "Z3w8WW_pillActive",
1002
1007
  "body": "Z3w8WW_body",
1008
+ "notice": "Z3w8WW_notice",
1009
+ "footer": "Z3w8WW_footer",
1010
+ "error": "Z3w8WW_error",
1011
+ "policyRow": "Z3w8WW_policyRow",
1003
1012
  "switches": "Z3w8WW_switches",
1004
1013
  "memberName": "Z3w8WW_memberName",
1005
1014
  "memberBadge": "Z3w8WW_memberBadge",
1006
- "policyRow": "Z3w8WW_policyRow",
1007
- "notice": "Z3w8WW_notice",
1008
- "warn": "Z3w8WW_warn",
1009
- "field": "Z3w8WW_field",
1010
- "error": "Z3w8WW_error",
1011
- "pill": "Z3w8WW_pill",
1012
- "memberList": "Z3w8WW_memberList",
1013
- "label": "Z3w8WW_label",
1014
- "triggerExtra": "Z3w8WW_triggerExtra",
1015
1015
  "memberRow": "Z3w8WW_memberRow",
1016
- "hint": "Z3w8WW_hint",
1017
- "pillActive": "Z3w8WW_pillActive"
1016
+ "memberList": "Z3w8WW_memberList",
1017
+ "warn": "Z3w8WW_warn"
1018
1018
  };
1019
1019
  //#endregion
1020
1020
  //#region src/client/CreateRoomDialog.tsx
@@ -1281,28 +1281,28 @@ window.__ModuleLoader__.load({
1281
1281
  document.head.appendChild(tag);
1282
1282
  }
1283
1283
  var InviteDialog_module_css_default = {
1284
+ "content": "r4uCba_content",
1285
+ "rowSelected": "r4uCba_rowSelected",
1284
1286
  "search": "r4uCba_search",
1285
- "searchRow": "r4uCba_searchRow",
1286
- "chip": "r4uCba_chip",
1287
1287
  "chipRemove": "r4uCba_chipRemove",
1288
- "rowHandle": "r4uCba_rowHandle",
1289
- "note": "r4uCba_note",
1290
- "rowSelected": "r4uCba_rowSelected",
1291
- "inviteSpin": "r4uCba_inviteSpin",
1288
+ "rowName": "r4uCba_rowName",
1289
+ "searchRow": "r4uCba_searchRow",
1292
1290
  "chipName": "r4uCba_chipName",
1291
+ "row": "r4uCba_row",
1292
+ "chips": "r4uCba_chips",
1293
1293
  "visuallyHidden": "r4uCba_visuallyHidden",
1294
+ "rowHandle": "r4uCba_rowHandle",
1295
+ "errorRow": "r4uCba_errorRow",
1296
+ "dialog": "r4uCba_dialog",
1294
1297
  "list": "r4uCba_list",
1295
- "checkHidden": "r4uCba_checkHidden",
1296
- "content": "r4uCba_content",
1297
- "field": "r4uCba_field",
1298
- "chips": "r4uCba_chips",
1298
+ "inviteSpin": "r4uCba_inviteSpin",
1299
1299
  "check": "r4uCba_check",
1300
+ "chip": "r4uCba_chip",
1301
+ "note": "r4uCba_note",
1302
+ "checkHidden": "r4uCba_checkHidden",
1300
1303
  "error": "r4uCba_error",
1301
- "rowName": "r4uCba_rowName",
1302
- "row": "r4uCba_row",
1303
- "spinner": "r4uCba_spinner",
1304
- "dialog": "r4uCba_dialog",
1305
- "errorRow": "r4uCba_errorRow"
1304
+ "field": "r4uCba_field",
1305
+ "spinner": "r4uCba_spinner"
1306
1306
  };
1307
1307
  //#endregion
1308
1308
  //#region src/client/RoomDialogs.tsx
@@ -1909,7 +1909,7 @@ window.__ModuleLoader__.load({
1909
1909
  }
1910
1910
  //#endregion
1911
1911
  //#region \0dsh-css:/root/projects/dsh-plugins-plus/packages/group-chat/src/client/SidebarRooms.module.css.mjs
1912
- const css$4 = ".s0QgKq_root{--dsh-session-list-edge-inset:var(--dsh-sidebar-inline-padding,12px);--dsh-session-list-scrollbar-width:5px;--dsh-session-list-scrollbar-offset:2px;box-sizing:border-box;flex-direction:column;flex:auto;width:100%;min-width:0;min-height:0;max-height:20vh;display:flex;position:relative}.s0QgKq_resizer{z-index:1;cursor:row-resize;touch-action:none;background:0 0;height:6px;position:absolute;top:-3px;left:0;right:0}.s0QgKq_resizer:after{content:\"\";background:var(--dsw-alias-border-l1,var(--dsw-alias-separator-primary));opacity:0;border-radius:1px;height:1px;transition:opacity .12s;position:absolute;top:3px;left:8px;right:8px}.s0QgKq_root:hover .s0QgKq_resizer:after,.s0QgKq_resizer:focus-visible:after{opacity:1}.s0QgKq_resizer:focus-visible{outline:none}.s0QgKq_resizer:focus-visible:after{background:var(--dsw-alias-brand-primary,var(--dsw-alias-label-primary));height:2px}.s0QgKq_sectionHeader{box-sizing:border-box;border-radius:var(--dsw-radius-md);height:36px;color:var(--dsw-alias-label-tertiary);flex:none;justify-content:flex-end;align-items:center;gap:4px;margin-bottom:4px;margin-right:-4px;padding-left:4px;display:flex;overflow:hidden}.s0QgKq_sectionLabel{white-space:nowrap;flex:none;min-width:0;max-width:45%;line-height:20px;overflow:hidden}.s0QgKq_searchSlot{box-sizing:border-box;flex:1;align-items:center;min-width:0;max-width:28px;margin-left:auto;padding-left:0;display:flex}.s0QgKq_searchSlotExpanded{box-sizing:border-box;flex:1;align-items:center;min-width:0;max-width:100%;margin-left:auto;padding-right:4px;display:flex}.s0QgKq_search,.s0QgKq_searchExpanded{box-sizing:border-box;border-radius:var(--dsw-radius-sm);width:100%;height:28px;color:var(--dsw-alias-label-secondary);cursor:text;background:0 0;border:none;flex:none;align-items:center;margin:0;padding:0;display:flex;overflow:hidden}.s0QgKq_searchExpanded{border:.5px solid var(--dsw-alias-border-l4);border-radius:var(--dsw-radius-md);width:100%;height:30px;color:var(--dsw-alias-label-caption);margin-inline:0;padding:0 4px 0 0}.s0QgKq_iconButton{border-radius:var(--dsw-radius-sm);width:28px;height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.s0QgKq_iconButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.s0QgKq_iconButton:focus-visible,.s0QgKq_searchButton:focus-visible,.s0QgKq_clearButton:focus-visible{outline:var(--dsw-focus-ring-width,2px) solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:-2px}.s0QgKq_searchButton{border-radius:var(--dsw-radius-sm);width:28px;height:28px;color:inherit;cursor:pointer;background:0 0;border:none;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.s0QgKq_searchExpanded .s0QgKq_searchButton{width:28px;height:30px}.s0QgKq_searchButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.s0QgKq_searchExpanded .s0QgKq_searchButton:hover{background:0 0}.s0QgKq_searchInput{width:0;min-width:0;color:var(--dsw-alias-label-primary);opacity:0;pointer-events:none;transition:opacity .12s var(--ds-ease-in-out);background:0 0;border:none;outline:none;flex:1;padding:0;font-size:13px;line-height:18px}.s0QgKq_searchExpanded .s0QgKq_searchInput{opacity:1;pointer-events:auto;margin-left:-2px}.s0QgKq_searchInput::placeholder{color:var(--dsw-alias-label-tertiary)}.s0QgKq_clearButton{border-radius:var(--dsw-radius-sm);width:24px;height:24px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.s0QgKq_clearButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.s0QgKq_headerActions{flex:none;align-items:center;gap:4px;display:flex}.s0QgKq_viewWrap{display:flex;position:relative}.s0QgKq_listArea{min-height:0;margin-left:-4px;margin-right:calc(-1 * var(--dsh-session-list-edge-inset));flex-direction:column;flex:1;padding-left:4px;display:flex;position:relative}.s0QgKq_list{min-height:0;max-height:100%;margin-left:-4px;margin-right:var(--dsh-session-list-scrollbar-offset);padding-left:4px;padding-right:calc(var(--dsh-session-list-edge-inset) - var(--dsh-session-list-scrollbar-width) - var(--dsh-session-list-scrollbar-offset));scrollbar-gutter:stable;padding-bottom:8px;overflow-y:auto}.s0QgKq_flatList{margin:0;padding:0;list-style:none}.s0QgKq_flatList>*+*{margin-top:2px}.s0QgKq_sessionRow,.s0QgKq_sessionRowSelected{box-sizing:border-box;border-radius:var(--dsw-radius-sm);width:100%;height:32px;color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;background:0 0;border:none;align-items:center;gap:8px;padding:0 8px;font-size:14px;display:flex}.s0QgKq_sessionRow:hover,.s0QgKq_sessionRowSelected{background:var(--dsw-alias-interactive-bg-hover)}.s0QgKq_rowIcon{width:16px;color:var(--dsw-alias-label-secondary);flex:none;justify-content:center;align-items:center;display:flex}.s0QgKq_title{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.s0QgKq_time{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;flex:none;font-size:12px;line-height:17px}.s0QgKq_unread{background:var(--dsw-alias-bg-layer-3,var(--dsw-alias-interactive-bg-hover));min-width:18px;color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;text-align:center;border-radius:9px;flex:none;padding:0 5px;font-size:11px;font-weight:600;line-height:17px}.s0QgKq_unreadMentioned{background:var(--dsw-alias-state-business-primary);min-width:18px;color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;text-align:center;border-radius:9px;flex:none;padding:0 5px;font-size:11px;font-weight:600;line-height:17px}.s0QgKq_empty{color:var(--dsw-alias-label-tertiary);margin:0;padding:16px 12px;font-size:13px}.s0QgKq_emptyState{color:var(--dsw-alias-label-tertiary);text-align:center;flex-direction:column;align-items:center;gap:8px;margin-top:80px;padding:0 12px;font-size:13px;line-height:20px;display:flex}.s0QgKq_emptyState>svg{color:var(--dsw-alias-label-caption);margin-bottom:4px}.s0QgKq_fade{left:0;right:var(--dsh-session-list-edge-inset);background:linear-gradient(to bottom, transparent, var(--dsw-specific-sidebar-fill));pointer-events:none;height:24px;position:absolute;bottom:0}.s0QgKq_menuLayer{z-index:60;max-height:calc(100vh - 16px);position:fixed;overflow-y:auto}.s0QgKq_menuInline{z-index:30;position:absolute;top:32px;right:0}.s0QgKq_menu{border:1px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-layer-1,var(--dsw-specific-sidebar-fill));min-width:200px;padding:4px;position:relative;box-shadow:0 6px 20px #0000002e}.s0QgKq_menuHeading{color:var(--dsw-alias-label-tertiary);padding:4px 8px 2px;font-size:11px;line-height:16px;display:block}.s0QgKq_menuItem{border-radius:var(--dsw-radius-sm);width:100%;color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;background:0 0;border:none;align-items:center;gap:8px;padding:6px 8px;font-size:13px;display:flex}.s0QgKq_menuItem:hover{background:var(--dsw-alias-interactive-bg-hover)}.s0QgKq_check{color:var(--dsw-alias-state-business-primary);margin-left:auto}.s0QgKq_visuallyHidden{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.s0QgKq_rowWrap{position:relative}.s0QgKq_menuRename{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-layer-1,var(--dsw-specific-sidebar-fill));min-width:240px;padding:8px;box-shadow:0 6px 20px #0000002e}.s0QgKq_menuRename .s0QgKq_menuHeading{padding:0 0 6px}.s0QgKq_menuInput{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l4);border-radius:var(--dsw-radius-sm);appearance:none;background:var(--dsw-alias-bg-base);width:100%;color:var(--dsw-alias-label-primary);font:inherit;outline:none;margin:2px 0 6px;padding:6px 8px;font-size:13px;line-height:20px}.s0QgKq_menuInput:focus-visible{border-color:var(--dsw-alias-state-business-primary)}.s0QgKq_menuInput::placeholder{color:var(--dsw-alias-label-tertiary)}.s0QgKq_menuActions{justify-content:flex-end;gap:6px;padding-top:2px;display:flex}.s0QgKq_menuConfirm{box-sizing:border-box;border-radius:var(--dsw-radius-sm);background:var(--dsw-alias-button-primary-fill);color:var(--dsw-alias-label-primary-foreground);font:inherit;cursor:pointer;border:1px solid #0000;padding:5px 12px;font-size:12px;line-height:18px}.s0QgKq_menuConfirm:hover:not(:disabled){filter:brightness(1.06)}.s0QgKq_menuConfirm:disabled{opacity:.5;cursor:default}.s0QgKq_menuCancel{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-sm);color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;padding:5px 12px;font-size:12px;line-height:18px}.s0QgKq_menuCancel:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.s0QgKq_menuItem:disabled{opacity:.5;cursor:default}.s0QgKq_discoverSection{border-top:1px solid var(--dsw-alias-border-l3);margin-top:8px;padding-top:8px}.s0QgKq_discoverHeading{color:var(--dsw-alias-label-tertiary);margin:0 0 4px;padding:0 12px;font-size:11px;line-height:16px}.s0QgKq_discoverRow{border-radius:var(--dsw-radius-sm);color:var(--dsw-alias-label-primary);align-items:center;gap:8px;padding:4px 12px;font-size:13px;line-height:18px;display:flex}.s0QgKq_discoverRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.s0QgKq_discoverName{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}.s0QgKq_discoverMeta{color:var(--dsw-alias-label-tertiary);flex:none;font-size:11px}.s0QgKq_joinButton{border:1px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-sm);color:var(--dsw-alias-state-business-primary);font:inherit;cursor:pointer;background:0 0;flex:none;padding:2px 10px;font-size:12px}.s0QgKq_joinButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.s0QgKq_joinButton:disabled{opacity:.5;cursor:default}.s0QgKq_leaveBody{flex-direction:column;gap:8px;min-width:0;display:flex}.s0QgKq_leaveCopy{color:var(--dsw-alias-label-primary);margin:0;font-size:14px;line-height:22px}.s0QgKq_leaveRoomName{color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;margin:0;font-size:14px;line-height:22px}.s0QgKq_leaveRoomName strong{font-weight:600}.s0QgKq_leaveError{color:var(--dsw-alias-state-error-primary,#f85149);margin:0;font-size:12px;line-height:17px}.s0QgKq_footer{justify-content:flex-end;gap:8px;display:flex}.s0QgKq_leaveConfirmDanger{background:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-label-primary)}.s0QgKq_leaveConfirmDanger.s0QgKq_leaveConfirmDanger{color:var(--dsw-alias-label-primary)}.s0QgKq_leaveConfirmDanger:hover:not(:disabled){background:var(--dsw-alias-state-error-primary);filter:brightness(1.08)}.s0QgKq_leaveConfirmDanger:disabled{opacity:.5}.s0QgKq_hitList{flex-direction:column;flex:none;gap:2px;max-height:45%;margin-bottom:4px;display:flex;overflow-y:auto}.s0QgKq_hitHint{color:var(--dsw-alias-label-tertiary);margin:2px 8px;font-size:12px;line-height:16px}.s0QgKq_hit{border-radius:var(--dsw-radius-sm);width:100%;color:inherit;text-align:left;cursor:pointer;background:0 0;border:none;flex-direction:column;gap:1px;padding:5px 8px;display:flex}.s0QgKq_hit:hover,.s0QgKq_hit:focus-visible{background:var(--dsw-alias-interactive-bg-hover);outline:none}.s0QgKq_hitHead{min-width:0;color:var(--dsw-alias-label-tertiary);align-items:baseline;gap:6px;font-size:11px;line-height:14px;display:flex}.s0QgKq_hitRoom{flex:none;font-weight:500}.s0QgKq_hitAuthor{text-overflow:ellipsis;white-space:nowrap;opacity:.8;min-width:0;overflow:hidden}.s0QgKq_hitText{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:12px;line-height:16px;display:block;overflow:hidden}.s0QgKq_mark{background:var(--dsw-alias-bg-brand-weak,#ffd66659);color:inherit;border-radius:2px;padding:0;font-weight:600}";
1912
+ const css$4 = ".s0QgKq_root{--dsh-session-list-edge-inset:var(--dsh-sidebar-inline-padding,12px);--dsh-session-list-scrollbar-width:5px;--dsh-session-list-scrollbar-offset:2px;box-sizing:border-box;flex-direction:column;flex:auto;width:100%;min-width:0;min-height:0;max-height:20vh;display:flex;position:relative}.s0QgKq_resizer{z-index:1;cursor:row-resize;touch-action:none;background:0 0;height:6px;position:absolute;top:-3px;left:0;right:0}.s0QgKq_resizer:after{content:\"\";background:var(--dsw-alias-border-l1,var(--dsw-alias-separator-primary));opacity:0;border-radius:1px;height:1px;transition:opacity .12s;position:absolute;top:3px;left:8px;right:8px}.s0QgKq_root:hover .s0QgKq_resizer:after,.s0QgKq_resizer:focus-visible:after{opacity:1}.s0QgKq_resizer:focus-visible{outline:none}.s0QgKq_resizer:focus-visible:after{background:var(--dsw-alias-brand-primary,var(--dsw-alias-label-primary));height:2px}.s0QgKq_sectionHeader{box-sizing:border-box;border-radius:var(--dsw-radius-md);height:36px;color:var(--dsw-alias-label-tertiary);flex:none;justify-content:flex-end;align-items:center;gap:4px;margin-bottom:4px;margin-right:-4px;padding-left:4px;display:flex;overflow:hidden}.s0QgKq_sectionLabel{white-space:nowrap;flex:none;min-width:0;max-width:45%;line-height:20px;overflow:hidden}.s0QgKq_searchSlot{box-sizing:border-box;flex:1;align-items:center;min-width:0;max-width:28px;margin-left:auto;padding-left:0;display:flex}.s0QgKq_searchSlotExpanded{box-sizing:border-box;flex:1;align-items:center;min-width:0;max-width:100%;margin-left:auto;padding-right:4px;display:flex}.s0QgKq_search,.s0QgKq_searchExpanded{box-sizing:border-box;border-radius:var(--dsw-radius-sm);width:100%;height:28px;color:var(--dsw-alias-label-secondary);cursor:text;background:0 0;border:none;flex:none;align-items:center;margin:0;padding:0;display:flex;overflow:hidden}.s0QgKq_searchExpanded{border:.5px solid var(--dsw-alias-border-l4);border-radius:var(--dsw-radius-md);width:100%;height:30px;color:var(--dsw-alias-label-caption);margin-inline:0;padding:0 4px 0 0}.s0QgKq_iconButton{border-radius:var(--dsw-radius-sm);width:28px;height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.s0QgKq_iconButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.s0QgKq_iconButton:focus-visible,.s0QgKq_searchButton:focus-visible,.s0QgKq_clearButton:focus-visible{outline:var(--dsw-focus-ring-width,2px) solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:-2px}.s0QgKq_searchButton{border-radius:var(--dsw-radius-sm);width:28px;height:28px;color:inherit;cursor:pointer;background:0 0;border:none;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.s0QgKq_searchExpanded .s0QgKq_searchButton{width:28px;height:30px}.s0QgKq_searchButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.s0QgKq_searchExpanded .s0QgKq_searchButton:hover{background:0 0}.s0QgKq_searchInput{width:0;min-width:0;color:var(--dsw-alias-label-primary);opacity:0;pointer-events:none;transition:opacity .12s var(--ds-ease-in-out);background:0 0;border:none;outline:none;flex:1;padding:0;font-size:13px;line-height:18px}.s0QgKq_searchExpanded .s0QgKq_searchInput{opacity:1;pointer-events:auto;margin-left:-2px}.s0QgKq_searchInput::placeholder{color:var(--dsw-alias-label-tertiary)}.s0QgKq_clearButton{border-radius:var(--dsw-radius-sm);width:24px;height:24px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.s0QgKq_clearButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.s0QgKq_headerActions{flex:none;align-items:center;gap:4px;display:flex}.s0QgKq_viewWrap{display:flex;position:relative}.s0QgKq_listArea{min-height:0;margin-left:-4px;margin-right:calc(-1 * var(--dsh-session-list-edge-inset));flex-direction:column;flex:1;padding-left:4px;display:flex;position:relative}.s0QgKq_list{min-height:0;max-height:100%;margin-left:-4px;margin-right:var(--dsh-session-list-scrollbar-offset);padding-left:4px;padding-right:calc(var(--dsh-session-list-edge-inset) - var(--dsh-session-list-scrollbar-width) - var(--dsh-session-list-scrollbar-offset));scrollbar-gutter:stable;padding-bottom:8px;overflow-y:auto}.s0QgKq_flatList{margin:0;padding:0;list-style:none}.s0QgKq_flatList>*+*{margin-top:2px}.s0QgKq_sessionRow,.s0QgKq_sessionRowSelected{box-sizing:border-box;border-radius:var(--dsw-radius-sm);width:100%;height:32px;color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;background:0 0;border:none;align-items:center;gap:8px;padding:0 8px;font-size:14px;display:flex}.s0QgKq_sessionRow:hover,.s0QgKq_sessionRowSelected{background:var(--dsw-alias-interactive-bg-hover)}.s0QgKq_rowIcon{width:16px;color:var(--dsw-alias-label-secondary);flex:none;justify-content:center;align-items:center;display:flex}.s0QgKq_title{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.s0QgKq_time{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;flex:none;font-size:12px;line-height:17px}.s0QgKq_unread{background:var(--dsw-alias-bg-layer-3,var(--dsw-alias-interactive-bg-hover));min-width:18px;color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;text-align:center;border-radius:9px;flex:none;padding:0 5px;font-size:11px;font-weight:600;line-height:17px}.s0QgKq_unreadMentioned{background:var(--dsw-alias-state-business-primary);min-width:18px;color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;text-align:center;border-radius:9px;flex:none;padding:0 5px;font-size:11px;font-weight:600;line-height:17px}.s0QgKq_empty{color:var(--dsw-alias-label-tertiary);margin:0;padding:16px 12px;font-size:13px}.s0QgKq_emptyState{color:var(--dsw-alias-label-tertiary);text-align:center;flex-direction:column;align-items:center;gap:8px;margin-top:80px;padding:0 12px;font-size:13px;line-height:20px;display:flex}.s0QgKq_emptyState>svg{color:var(--dsw-alias-label-caption);margin-bottom:4px}.s0QgKq_fade{left:0;right:var(--dsh-session-list-edge-inset);background:linear-gradient(to bottom, transparent, var(--dsw-specific-sidebar-fill));pointer-events:none;height:24px;position:absolute;bottom:0}.s0QgKq_menuLayer{z-index:60;max-height:calc(100vh - 16px);position:fixed;overflow-y:auto}.s0QgKq_menuInline{z-index:30;position:absolute;top:32px;right:0}.s0QgKq_menu{border:1px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-layer-1,var(--dsw-specific-sidebar-fill));min-width:200px;padding:4px;position:relative;box-shadow:0 6px 20px #0000002e}.s0QgKq_menuHeading{color:var(--dsw-alias-label-tertiary);padding:4px 8px 2px;font-size:11px;line-height:16px;display:block}.s0QgKq_menuItem{border-radius:var(--dsw-radius-sm);width:100%;color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;background:0 0;border:none;align-items:center;gap:8px;padding:6px 8px;font-size:13px;display:flex}.s0QgKq_menuItem:hover{background:var(--dsw-alias-interactive-bg-hover)}.s0QgKq_check{color:var(--dsw-alias-state-business-primary);margin-left:auto}.s0QgKq_visuallyHidden{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.s0QgKq_rowWrap{position:relative}.s0QgKq_menuRename{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-layer-1,var(--dsw-specific-sidebar-fill));min-width:240px;padding:8px;box-shadow:0 6px 20px #0000002e}.s0QgKq_menuRename .s0QgKq_menuHeading{padding:0 0 6px}.s0QgKq_menuInput{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l4);border-radius:var(--dsw-radius-sm);appearance:none;background:var(--dsw-alias-bg-base);width:100%;color:var(--dsw-alias-label-primary);font:inherit;outline:none;margin:2px 0 6px;padding:6px 8px;font-size:13px;line-height:20px}.s0QgKq_menuInput:focus-visible{border-color:var(--dsw-alias-state-business-primary)}.s0QgKq_menuInput::placeholder{color:var(--dsw-alias-label-tertiary)}.s0QgKq_menuActions{justify-content:flex-end;gap:6px;padding-top:2px;display:flex}.s0QgKq_menuConfirm{box-sizing:border-box;border-radius:var(--dsw-radius-sm);background:var(--dsw-alias-button-primary-fill);color:var(--dsw-alias-label-primary-foreground);font:inherit;cursor:pointer;border:1px solid #0000;padding:5px 12px;font-size:12px;line-height:18px}.s0QgKq_menuConfirm:hover:not(:disabled){filter:brightness(1.06)}.s0QgKq_menuConfirm:disabled{opacity:.5;cursor:default}.s0QgKq_menuCancel{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-sm);color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;padding:5px 12px;font-size:12px;line-height:18px}.s0QgKq_menuCancel:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.s0QgKq_menuItem:disabled{opacity:.5;cursor:default}.s0QgKq_discoverSection{border-top:1px solid var(--dsw-alias-border-l3);margin-top:8px;padding-top:8px}.s0QgKq_discoverHeading{color:var(--dsw-alias-label-tertiary);margin:0 0 4px;padding:0 12px;font-size:11px;line-height:16px}.s0QgKq_discoverRow{border-radius:var(--dsw-radius-sm);color:var(--dsw-alias-label-primary);align-items:center;gap:8px;padding:4px 12px;font-size:13px;line-height:18px;display:flex}.s0QgKq_discoverRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.s0QgKq_discoverName{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}.s0QgKq_discoverMeta{color:var(--dsw-alias-label-tertiary);flex:none;font-size:11px}.s0QgKq_joinButton{border:1px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-sm);color:var(--dsw-alias-state-business-primary);font:inherit;cursor:pointer;background:0 0;flex:none;padding:2px 10px;font-size:12px}.s0QgKq_joinButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.s0QgKq_joinButton:disabled{opacity:.5;cursor:default}.s0QgKq_leaveBody{flex-direction:column;gap:8px;min-width:0;display:flex}.s0QgKq_leaveCopy{color:var(--dsw-alias-label-primary);margin:0;font-size:14px;line-height:22px}.s0QgKq_leaveRoomName{color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;margin:0;font-size:14px;line-height:22px}.s0QgKq_leaveRoomName strong{font-weight:600}.s0QgKq_leaveError{color:var(--dsw-alias-state-error-primary,#f85149);margin:0;font-size:12px;line-height:17px}.s0QgKq_footer{justify-content:flex-end;gap:8px;display:flex}.s0QgKq_leaveConfirmDanger{background:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-label-primary)}.s0QgKq_leaveConfirmDanger.s0QgKq_leaveConfirmDanger{color:var(--dsw-alias-label-primary)}.s0QgKq_leaveConfirmDanger:hover:not(:disabled){background:var(--dsw-alias-state-error-primary);filter:brightness(1.08)}.s0QgKq_leaveConfirmDanger:disabled{opacity:.5}.s0QgKq_hitList{flex-direction:column;flex:none;gap:2px;max-height:45%;margin-bottom:4px;display:flex;overflow-y:auto}.s0QgKq_hitHint{color:var(--dsw-alias-label-tertiary);margin:2px 8px;font-size:12px;line-height:16px}.s0QgKq_hit{border-radius:var(--dsw-radius-sm);width:100%;color:inherit;text-align:left;cursor:pointer;background:0 0;border:none;flex-direction:column;gap:1px;padding:5px 8px;display:flex}.s0QgKq_hit:hover,.s0QgKq_hit:focus-visible{background:var(--dsw-alias-interactive-bg-hover);outline:none}.s0QgKq_hitHead{min-width:0;color:var(--dsw-alias-label-tertiary);align-items:baseline;gap:6px;font-size:11px;line-height:14px;display:flex}.s0QgKq_hitRoom{flex:none;font-weight:500}.s0QgKq_hitAuthor{text-overflow:ellipsis;white-space:nowrap;opacity:.8;min-width:0;overflow:hidden}.s0QgKq_hitText{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:12px;line-height:16px;display:block;overflow:hidden}.s0QgKq_mark{background:var(--dsw-alias-bg-brand-weak,#ffd66659);color:inherit;border-radius:2px;padding:0;font-weight:600}.s0QgKq_railButton{border-radius:var(--dsw-radius-sm);width:28px;height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;justify-content:center;align-items:center;margin:4px auto;padding:0;display:flex}.s0QgKq_railButton:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.s0QgKq_railButton:focus-visible{outline:1px solid var(--dsw-alias-brand-primary);outline-offset:-2px}";
1913
1913
  const tagId$4 = "@sparkelf/dsh-group-chat/SidebarRooms.module.css";
1914
1914
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$4) + "]") === null) {
1915
1915
  const tag = document.createElement("style");
@@ -1919,66 +1919,67 @@ window.__ModuleLoader__.load({
1919
1919
  document.head.appendChild(tag);
1920
1920
  }
1921
1921
  var SidebarRooms_module_css_default = {
1922
- "rowWrap": "s0QgKq_rowWrap",
1923
- "discoverMeta": "s0QgKq_discoverMeta",
1924
- "hitHead": "s0QgKq_hitHead",
1925
- "menuInput": "s0QgKq_menuInput",
1926
- "menuActions": "s0QgKq_menuActions",
1927
- "headerActions": "s0QgKq_headerActions",
1928
- "discoverSection": "s0QgKq_discoverSection",
1929
- "searchExpanded": "s0QgKq_searchExpanded",
1930
- "hitHint": "s0QgKq_hitHint",
1922
+ "leaveCopy": "s0QgKq_leaveCopy",
1923
+ "leaveRoomName": "s0QgKq_leaveRoomName",
1931
1924
  "hit": "s0QgKq_hit",
1925
+ "searchButton": "s0QgKq_searchButton",
1926
+ "unread": "s0QgKq_unread",
1927
+ "listArea": "s0QgKq_listArea",
1932
1928
  "time": "s0QgKq_time",
1933
- "rowIcon": "s0QgKq_rowIcon",
1934
- "viewWrap": "s0QgKq_viewWrap",
1929
+ "menuInput": "s0QgKq_menuInput",
1930
+ "clearButton": "s0QgKq_clearButton",
1931
+ "empty": "s0QgKq_empty",
1932
+ "sectionHeader": "s0QgKq_sectionHeader",
1933
+ "iconButton": "s0QgKq_iconButton",
1934
+ "discoverRow": "s0QgKq_discoverRow",
1935
1935
  "menuHeading": "s0QgKq_menuHeading",
1936
- "hitList": "s0QgKq_hitList",
1937
- "list": "s0QgKq_list",
1938
- "root": "s0QgKq_root",
1936
+ "menuActions": "s0QgKq_menuActions",
1939
1937
  "flatList": "s0QgKq_flatList",
1940
- "leaveCopy": "s0QgKq_leaveCopy",
1941
- "leaveError": "s0QgKq_leaveError",
1938
+ "hitHead": "s0QgKq_hitHead",
1939
+ "searchExpanded": "s0QgKq_searchExpanded",
1940
+ "footer": "s0QgKq_footer",
1942
1941
  "searchInput": "s0QgKq_searchInput",
1943
- "empty": "s0QgKq_empty",
1944
- "iconButton": "s0QgKq_iconButton",
1945
- "check": "s0QgKq_check",
1946
- "searchSlotExpanded": "s0QgKq_searchSlotExpanded",
1942
+ "rowWrap": "s0QgKq_rowWrap",
1943
+ "rowIcon": "s0QgKq_rowIcon",
1944
+ "unreadMentioned": "s0QgKq_unreadMentioned",
1945
+ "menu": "s0QgKq_menu",
1946
+ "hitAuthor": "s0QgKq_hitAuthor",
1947
+ "hitList": "s0QgKq_hitList",
1948
+ "resizer": "s0QgKq_resizer",
1949
+ "headerActions": "s0QgKq_headerActions",
1950
+ "menuItem": "s0QgKq_menuItem",
1951
+ "hitText": "s0QgKq_hitText",
1947
1952
  "leaveConfirmDanger": "s0QgKq_leaveConfirmDanger",
1948
- "visuallyHidden": "s0QgKq_visuallyHidden",
1949
- "title": "s0QgKq_title",
1950
1953
  "joinButton": "s0QgKq_joinButton",
1954
+ "discoverMeta": "s0QgKq_discoverMeta",
1955
+ "mark": "s0QgKq_mark",
1956
+ "searchSlotExpanded": "s0QgKq_searchSlotExpanded",
1957
+ "list": "s0QgKq_list",
1958
+ "title": "s0QgKq_title",
1959
+ "leaveError": "s0QgKq_leaveError",
1951
1960
  "hitRoom": "s0QgKq_hitRoom",
1952
- "menu": "s0QgKq_menu",
1953
- "footer": "s0QgKq_footer",
1954
- "discoverRow": "s0QgKq_discoverRow",
1955
- "hitAuthor": "s0QgKq_hitAuthor",
1961
+ "searchSlot": "s0QgKq_searchSlot",
1962
+ "search": "s0QgKq_search",
1963
+ "root": "s0QgKq_root",
1956
1964
  "discoverHeading": "s0QgKq_discoverHeading",
1965
+ "menuCancel": "s0QgKq_menuCancel",
1957
1966
  "menuLayer": "s0QgKq_menuLayer",
1958
- "menuItem": "s0QgKq_menuItem",
1959
- "menuConfirm": "s0QgKq_menuConfirm",
1960
- "hitText": "s0QgKq_hitText",
1961
1967
  "menuRename": "s0QgKq_menuRename",
1962
- "listArea": "s0QgKq_listArea",
1968
+ "visuallyHidden": "s0QgKq_visuallyHidden",
1969
+ "emptyState": "s0QgKq_emptyState",
1970
+ "menuConfirm": "s0QgKq_menuConfirm",
1971
+ "railButton": "s0QgKq_railButton",
1963
1972
  "discoverName": "s0QgKq_discoverName",
1973
+ "leaveBody": "s0QgKq_leaveBody",
1974
+ "viewWrap": "s0QgKq_viewWrap",
1964
1975
  "fade": "s0QgKq_fade",
1965
- "leaveRoomName": "s0QgKq_leaveRoomName",
1966
- "searchSlot": "s0QgKq_searchSlot",
1967
- "unreadMentioned": "s0QgKq_unreadMentioned",
1976
+ "sessionRowSelected": "s0QgKq_sessionRowSelected",
1968
1977
  "menuInline": "s0QgKq_menuInline",
1969
- "emptyState": "s0QgKq_emptyState",
1970
- "leaveBody": "s0QgKq_leaveBody",
1971
- "resizer": "s0QgKq_resizer",
1972
- "search": "s0QgKq_search",
1973
- "sessionRow": "s0QgKq_sessionRow",
1974
- "sectionHeader": "s0QgKq_sectionHeader",
1975
- "unread": "s0QgKq_unread",
1978
+ "check": "s0QgKq_check",
1976
1979
  "sectionLabel": "s0QgKq_sectionLabel",
1977
- "clearButton": "s0QgKq_clearButton",
1978
- "searchButton": "s0QgKq_searchButton",
1979
- "mark": "s0QgKq_mark",
1980
- "menuCancel": "s0QgKq_menuCancel",
1981
- "sessionRowSelected": "s0QgKq_sessionRowSelected"
1980
+ "hitHint": "s0QgKq_hitHint",
1981
+ "sessionRow": "s0QgKq_sessionRow",
1982
+ "discoverSection": "s0QgKq_discoverSection"
1982
1983
  };
1983
1984
  //#endregion
1984
1985
  //#region src/client/SidebarRooms.tsx
@@ -2001,12 +2002,12 @@ window.__ModuleLoader__.load({
2001
2002
  /**
2002
2003
  * Height bounds for the region, in pixels.
2003
2004
  *
2004
- * The floor keeps a room row and the header visible; the ceiling keeps the region from
2005
- * crowding out the workspace list above it, which is the same reason the stylesheet capped it
2006
- * at `46vh` before this was adjustable. The host clamps to the same pair, so a stored value
2005
+ * The floor is one room row plus the header; the ceiling keeps the region from crowding
2006
+ * out the workspace list above it, which is the same reason the stylesheet capped it at
2007
+ * `46vh` before this was adjustable. The host clamps to the same pair, so a stored value
2007
2008
  * cannot arrive outside the range the region can draw.
2008
2009
  */
2009
- const HEIGHT_MIN = 120;
2010
+ const HEIGHT_MIN = 80;
2010
2011
  const HEIGHT_MAX = 1200;
2011
2012
  /** Clamps a requested height into the range the region can draw. */
2012
2013
  const clampHeight = (value) => Math.min(HEIGHT_MAX, Math.max(HEIGHT_MIN, Math.round(value)));
@@ -2045,8 +2046,39 @@ window.__ModuleLoader__.load({
2045
2046
  if (from < text.length) parts.push(text.slice(from));
2046
2047
  return parts;
2047
2048
  };
2049
+ /**
2050
+ * The collapsed rail's stand-in for this region: one icon, no rows.
2051
+ *
2052
+ * `onSelect` is the same "open the group chat" action the room list header offers, so the
2053
+ * collapsed rail is not a dead end — clicking it gets the reader to the rooms.
2054
+ * @param props - the realm's injected copy resolver and the open action.
2055
+ * @returns The compact control.
2056
+ */
2057
+ function SidebarRoomsCollapsed(props) {
2058
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
2059
+ label: props.t("title"),
2060
+ side: "right",
2061
+ delayMs: 400,
2062
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
2063
+ type: "button",
2064
+ className: SidebarRooms_module_css_default["railButton"],
2065
+ "aria-label": props.t("title"),
2066
+ onClick: props.onOpen,
2067
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconQueueOutlineRegular, { size: 18 })
2068
+ })
2069
+ });
2070
+ }
2048
2071
  function SidebarRooms(props) {
2049
2072
  const { t, tPreset, store } = props;
2073
+ if (props.wide === false) {
2074
+ const firstRoom = store.getState().rooms?.[0];
2075
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SidebarRoomsCollapsed, {
2076
+ t,
2077
+ onOpen: () => {
2078
+ if (firstRoom !== void 0) store.open(firstRoom.id);
2079
+ }
2080
+ });
2081
+ }
2050
2082
  const { rooms, activeRoomId, failure, searchQuery, discoverable } = (0, react.useSyncExternalStore)(store.subscribe, store.getState, store.getState);
2051
2083
  const [searchExpanded, setSearchExpanded] = (0, react.useState)(false);
2052
2084
  const [viewOpen, setViewOpen] = (0, react.useState)(false);
@@ -3040,20 +3072,20 @@ window.__ModuleLoader__.load({
3040
3072
  document.head.appendChild(tag);
3041
3073
  }
3042
3074
  var MessageSide_module_css_default = {
3043
- "quoteMark": "KXabfq_quoteMark",
3044
- "quoteBody": "KXabfq_quoteBody",
3045
- "rowBody": "KXabfq_rowBody",
3046
- "otherRow": "KXabfq_otherRow",
3047
3075
  "replyButton": "KXabfq_replyButton",
3048
- "selfBody": "KXabfq_selfBody",
3049
- "rowActions": "KXabfq_rowActions",
3050
- "rowActionsSelf": "KXabfq_rowActionsSelf",
3076
+ "quoteAuthor": "KXabfq_quoteAuthor",
3051
3077
  "quoteText": "KXabfq_quoteText",
3078
+ "quoteMark": "KXabfq_quoteMark",
3079
+ "rowActions": "KXabfq_rowActions",
3080
+ "quoteBody": "KXabfq_quoteBody",
3081
+ "quoteBar": "KXabfq_quoteBar",
3052
3082
  "authorName": "KXabfq_authorName",
3083
+ "selfBody": "KXabfq_selfBody",
3053
3084
  "author": "KXabfq_author",
3085
+ "rowActionsSelf": "KXabfq_rowActionsSelf",
3054
3086
  "selfRow": "KXabfq_selfRow",
3055
- "quoteAuthor": "KXabfq_quoteAuthor",
3056
- "quoteBar": "KXabfq_quoteBar"
3087
+ "rowBody": "KXabfq_rowBody",
3088
+ "otherRow": "KXabfq_otherRow"
3057
3089
  };
3058
3090
  //#endregion
3059
3091
  //#region src/client/MessageSide.tsx
@@ -3344,46 +3376,46 @@ window.__ModuleLoader__.load({
3344
3376
  document.head.appendChild(tag);
3345
3377
  }
3346
3378
  var MembersPanel_module_css_default = {
3347
- "notice": "VeQVAa_notice",
3348
- "root": "VeQVAa_root",
3379
+ "fileButton": "VeQVAa_fileButton",
3380
+ "previewTitle": "VeQVAa_previewTitle",
3381
+ "search": "VeQVAa_search",
3382
+ "linkButton": "VeQVAa_linkButton",
3383
+ "name": "VeQVAa_name",
3349
3384
  "editorFooter": "VeQVAa_editorFooter",
3350
- "ownerTag": "VeQVAa_ownerTag",
3385
+ "row": "VeQVAa_row",
3351
3386
  "editor": "VeQVAa_editor",
3352
- "unavailable": "VeQVAa_unavailable",
3353
- "search": "VeQVAa_search",
3354
- "count": "VeQVAa_count",
3355
- "crumbGroup": "VeQVAa_crumbGroup",
3356
- "crumb": "VeQVAa_crumb",
3357
- "list": "VeQVAa_list",
3358
- "section": "VeQVAa_section",
3387
+ "refresh": "VeQVAa_refresh",
3388
+ "searchToggle": "VeQVAa_searchToggle",
3389
+ "root": "VeQVAa_root",
3390
+ "crumbs": "VeQVAa_crumbs",
3391
+ "caret": "VeQVAa_caret",
3392
+ "fileIcon": "VeQVAa_fileIcon",
3359
3393
  "fileSize": "VeQVAa_fileSize",
3394
+ "sectionBody": "VeQVAa_sectionBody",
3360
3395
  "sectionHeader": "VeQVAa_sectionHeader",
3361
- "filePicker": "VeQVAa_filePicker",
3396
+ "selfTag": "VeQVAa_selfTag",
3397
+ "previewClose": "VeQVAa_previewClose",
3362
3398
  "sectionLabel": "VeQVAa_sectionLabel",
3363
- "row": "VeQVAa_row",
3364
- "caret": "VeQVAa_caret",
3365
3399
  "hint": "VeQVAa_hint",
3366
- "name": "VeQVAa_name",
3367
- "fileButton": "VeQVAa_fileButton",
3368
3400
  "error": "VeQVAa_error",
3369
- "sectionBody": "VeQVAa_sectionBody",
3370
- "textarea": "VeQVAa_textarea",
3371
- "searchToggle": "VeQVAa_searchToggle",
3372
- "previewHeader": "VeQVAa_previewHeader",
3401
+ "crumb": "VeQVAa_crumb",
3373
3402
  "announcementText": "VeQVAa_announcementText",
3374
- "previewClose": "VeQVAa_previewClose",
3375
- "selfTag": "VeQVAa_selfTag",
3376
- "crumbSep": "VeQVAa_crumbSep",
3377
- "linkButton": "VeQVAa_linkButton",
3403
+ "previewHeader": "VeQVAa_previewHeader",
3404
+ "textarea": "VeQVAa_textarea",
3405
+ "notice": "VeQVAa_notice",
3378
3406
  "previewBody": "VeQVAa_previewBody",
3379
- "crumbs": "VeQVAa_crumbs",
3407
+ "section": "VeQVAa_section",
3408
+ "remove": "VeQVAa_remove",
3380
3409
  "sectionToggle": "VeQVAa_sectionToggle",
3381
- "refresh": "VeQVAa_refresh",
3410
+ "ownerTag": "VeQVAa_ownerTag",
3411
+ "unavailable": "VeQVAa_unavailable",
3412
+ "crumbGroup": "VeQVAa_crumbGroup",
3413
+ "crumbSep": "VeQVAa_crumbSep",
3414
+ "previewImage": "VeQVAa_previewImage",
3382
3415
  "preview": "VeQVAa_preview",
3383
- "fileIcon": "VeQVAa_fileIcon",
3384
- "previewTitle": "VeQVAa_previewTitle",
3385
- "remove": "VeQVAa_remove",
3386
- "previewImage": "VeQVAa_previewImage"
3416
+ "count": "VeQVAa_count",
3417
+ "filePicker": "VeQVAa_filePicker",
3418
+ "list": "VeQVAa_list"
3387
3419
  };
3388
3420
  //#endregion
3389
3421
  //#region src/client/MembersPanel.tsx
@@ -4006,11 +4038,11 @@ window.__ModuleLoader__.load({
4006
4038
  document.head.appendChild(tag);
4007
4039
  }
4008
4040
  var GuideEntry_module_css_default = {
4041
+ "icon": "_0Vnsuq_icon",
4009
4042
  "title": "_0Vnsuq_title",
4010
4043
  "description": "_0Vnsuq_description",
4011
4044
  "text": "_0Vnsuq_text",
4012
- "entry": "_0Vnsuq_entry",
4013
- "icon": "_0Vnsuq_icon"
4045
+ "entry": "_0Vnsuq_entry"
4014
4046
  };
4015
4047
  //#endregion
4016
4048
  //#region src/client/GuideEntry.tsx
@@ -4077,13 +4109,13 @@ window.__ModuleLoader__.load({
4077
4109
  document.head.appendChild(tag);
4078
4110
  }
4079
4111
  var QuoteComposer_module_css_default = {
4080
- "author": "AK6KxW_author",
4081
- "dismiss": "AK6KxW_dismiss",
4082
- "button": "AK6KxW_button",
4112
+ "text": "AK6KxW_text",
4113
+ "body": "AK6KxW_body",
4083
4114
  "bar": "AK6KxW_bar",
4084
4115
  "mark": "AK6KxW_mark",
4085
- "body": "AK6KxW_body",
4086
- "text": "AK6KxW_text"
4116
+ "author": "AK6KxW_author",
4117
+ "dismiss": "AK6KxW_dismiss",
4118
+ "button": "AK6KxW_button"
4087
4119
  };
4088
4120
  //#endregion
4089
4121
  //#region src/client/QuoteComposer.tsx
@@ -4658,6 +4690,27 @@ window.__ModuleLoader__.load({
4658
4690
  * @param ctx - DSH client context with locale and slot registries.
4659
4691
  */
4660
4692
  function apply(ctx) {
4693
+ const context = ctx;
4694
+ const sidebarRight = context.sidebarRight ?? context.get?.("sidebarRight");
4695
+ const openRoomFile = (attachment, roomId) => {
4696
+ const query = "attachmentId=" + encodeURIComponent(attachment.attachmentId) + "&name=" + encodeURIComponent(attachment.name) + "&bytes=" + encodeURIComponent(String(attachment.bytes));
4697
+ (async () => {
4698
+ const materialized = await fetch("/dsh-group-chat/api/attachment-materialize?" + query);
4699
+ if (!materialized.ok) throw new Error("附件预览准备失败");
4700
+ const target = await materialized.json();
4701
+ if (typeof target.path !== "string") throw new Error("附件预览路径缺失");
4702
+ const sessionId = "group-room-" + roomId;
4703
+ const address = "dsh-resource://file/session/" + encodeURIComponent(sessionId) + "/" + target.path.split("/").map((part) => encodeURIComponent(part)).join("/");
4704
+ if (sidebarRight !== void 0 && sidebarRight.openResource !== void 0) {
4705
+ sidebarRight.openResource(address);
4706
+ return;
4707
+ }
4708
+ const fallback = new URL("/dsh-group-chat/api/attachment-preview?" + query, window.location.origin).toString();
4709
+ window.open(fallback, "_blank", "noopener,noreferrer");
4710
+ })().catch((error) => {
4711
+ console.error("[group-chat] file preview failed", error);
4712
+ });
4713
+ };
4661
4714
  ctx.effect(() => ctx.locale.register(NS, {
4662
4715
  zh,
4663
4716
  en
@@ -4838,6 +4891,56 @@ window.__ModuleLoader__.load({
4838
4891
  }
4839
4892
  }))
4840
4893
  }, MembersGuideEntry)), "group-chat: members guide box");
4894
+ ctx.effect(() => {
4895
+ const onFileClick = (event) => {
4896
+ const target = event.target;
4897
+ if (!(target instanceof Element)) return;
4898
+ const card = target.closest("[data-message-attachments] > *");
4899
+ const roomId = store.getState().activeRoomId;
4900
+ if (!(card instanceof HTMLElement) || roomId === void 0) return;
4901
+ const name = (card.getAttribute("title") ?? card.innerText.split("\n")[0] ?? "").trim();
4902
+ if (name === "") return;
4903
+ (async () => {
4904
+ try {
4905
+ let cursor = null;
4906
+ let found;
4907
+ for (let page = 0; page < 20 && found === void 0; page += 1) {
4908
+ const suffix = cursor === null ? "" : "?cursor=" + encodeURIComponent(cursor);
4909
+ const response = await fetch("/dsh-group-chat/api/rooms/" + encodeURIComponent(roomId) + "/events" + suffix);
4910
+ if (!response.ok) return;
4911
+ const payload = await response.json();
4912
+ for (const record of payload.events ?? []) {
4913
+ const content = (record.event?.data)?.content;
4914
+ if (!Array.isArray(content)) continue;
4915
+ for (const block of content) {
4916
+ if (block === null || typeof block !== "object") continue;
4917
+ const item = block;
4918
+ const attachment = item.attachment;
4919
+ if (item.type === "file" && attachment?.name === name && typeof attachment.attachmentId === "string" && typeof attachment.bytes === "number") {
4920
+ found = {
4921
+ attachmentId: attachment.attachmentId,
4922
+ name,
4923
+ bytes: attachment.bytes
4924
+ };
4925
+ break;
4926
+ }
4927
+ }
4928
+ if (found !== void 0) break;
4929
+ }
4930
+ if (payload.hasMore !== true || payload.nextCursor === null || payload.nextCursor === void 0) break;
4931
+ cursor = payload.nextCursor;
4932
+ }
4933
+ if (found !== void 0) openRoomFile(found, roomId);
4934
+ } catch (error) {
4935
+ console.error("[group-chat] file preview lookup failed", error);
4936
+ }
4937
+ })();
4938
+ };
4939
+ document.addEventListener("click", onFileClick, true);
4940
+ return () => {
4941
+ document.removeEventListener("click", onFileClick, true);
4942
+ };
4943
+ }, "group-chat: file preview delegation");
4841
4944
  ctx.slots.inject("conversation.chat.node", () => {
4842
4945
  let claims = [];
4843
4946
  const release = () => {