@sparkelf/dsh-group-chat 0.5.0 → 0.5.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.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",
517
+ "avatar": "Ohch6W_avatar",
518
518
  "md": "Ohch6W_md",
519
519
  "sm": "Ohch6W_sm",
520
- "avatar": "Ohch6W_avatar"
520
+ "over": "Ohch6W_over"
521
521
  };
522
522
  //#endregion
523
523
  //#region src/client/Avatar.tsx
@@ -558,11 +558,11 @@ window.__ModuleLoader__.load({
558
558
  }
559
559
  var Picker_module_css_default = {
560
560
  "rowActive": "sKjJ-a_rowActive",
561
- "secondary": "sKjJ-a_secondary",
562
- "note": "sKjJ-a_note",
563
561
  "box": "sKjJ-a_box",
564
- "list": "sKjJ-a_list",
565
562
  "label": "sKjJ-a_label",
563
+ "secondary": "sKjJ-a_secondary",
564
+ "list": "sKjJ-a_list",
565
+ "note": "sKjJ-a_note",
566
566
  "row": "sKjJ-a_row"
567
567
  };
568
568
  //#endregion
@@ -736,11 +736,11 @@ window.__ModuleLoader__.load({
736
736
  document.head.appendChild(tag);
737
737
  }
738
738
  var PresetSelect_module_css_default = {
739
- "triggerLabel": "xjnmxG_triggerLabel",
740
- "description": "xjnmxG_description",
741
739
  "trigger": "xjnmxG_trigger",
742
740
  "name": "xjnmxG_name",
743
- "row": "xjnmxG_row"
741
+ "description": "xjnmxG_description",
742
+ "row": "xjnmxG_row",
743
+ "triggerLabel": "xjnmxG_triggerLabel"
744
744
  };
745
745
  //#endregion
746
746
  //#region src/client/PresetSelect.tsx
@@ -916,7 +916,14 @@ window.__ModuleLoader__.load({
916
916
  }
917
917
  },
918
918
  open: (roomId) => {
919
- set({ activeRoomId: roomId });
919
+ set({
920
+ activeRoomId: roomId,
921
+ ...state.rooms === void 0 ? {} : { rooms: state.rooms.map((room) => room.id === roomId ? {
922
+ ...room,
923
+ unreadCount: 0,
924
+ mentionCount: 0
925
+ } : room) }
926
+ });
920
927
  loadMembersInto(roomId);
921
928
  },
922
929
  discover: async (query) => {
@@ -998,23 +1005,23 @@ window.__ModuleLoader__.load({
998
1005
  document.head.appendChild(tag);
999
1006
  }
1000
1007
  var CreateRoomDialog_module_css_default = {
1008
+ "field": "Z3w8WW_field",
1001
1009
  "footer": "Z3w8WW_footer",
1002
- "body": "Z3w8WW_body",
1003
- "switches": "Z3w8WW_switches",
1004
- "memberName": "Z3w8WW_memberName",
1005
- "memberBadge": "Z3w8WW_memberBadge",
1010
+ "triggerExtra": "Z3w8WW_triggerExtra",
1006
1011
  "policyRow": "Z3w8WW_policyRow",
1007
- "notice": "Z3w8WW_notice",
1012
+ "pillActive": "Z3w8WW_pillActive",
1013
+ "memberRow": "Z3w8WW_memberRow",
1014
+ "memberList": "Z3w8WW_memberList",
1008
1015
  "warn": "Z3w8WW_warn",
1009
- "field": "Z3w8WW_field",
1010
- "error": "Z3w8WW_error",
1016
+ "notice": "Z3w8WW_notice",
1011
1017
  "pill": "Z3w8WW_pill",
1012
- "memberList": "Z3w8WW_memberList",
1018
+ "error": "Z3w8WW_error",
1013
1019
  "label": "Z3w8WW_label",
1014
- "triggerExtra": "Z3w8WW_triggerExtra",
1015
- "memberRow": "Z3w8WW_memberRow",
1020
+ "body": "Z3w8WW_body",
1021
+ "switches": "Z3w8WW_switches",
1016
1022
  "hint": "Z3w8WW_hint",
1017
- "pillActive": "Z3w8WW_pillActive"
1023
+ "memberName": "Z3w8WW_memberName",
1024
+ "memberBadge": "Z3w8WW_memberBadge"
1018
1025
  };
1019
1026
  //#endregion
1020
1027
  //#region src/client/CreateRoomDialog.tsx
@@ -1281,28 +1288,28 @@ window.__ModuleLoader__.load({
1281
1288
  document.head.appendChild(tag);
1282
1289
  }
1283
1290
  var InviteDialog_module_css_default = {
1284
- "search": "r4uCba_search",
1285
- "searchRow": "r4uCba_searchRow",
1286
1291
  "chip": "r4uCba_chip",
1287
- "chipRemove": "r4uCba_chipRemove",
1288
1292
  "rowHandle": "r4uCba_rowHandle",
1289
- "note": "r4uCba_note",
1290
- "rowSelected": "r4uCba_rowSelected",
1291
- "inviteSpin": "r4uCba_inviteSpin",
1293
+ "searchRow": "r4uCba_searchRow",
1292
1294
  "chipName": "r4uCba_chipName",
1293
- "visuallyHidden": "r4uCba_visuallyHidden",
1294
- "list": "r4uCba_list",
1295
- "checkHidden": "r4uCba_checkHidden",
1296
- "content": "r4uCba_content",
1295
+ "row": "r4uCba_row",
1297
1296
  "field": "r4uCba_field",
1298
1297
  "chips": "r4uCba_chips",
1299
- "check": "r4uCba_check",
1298
+ "note": "r4uCba_note",
1300
1299
  "error": "r4uCba_error",
1301
- "rowName": "r4uCba_rowName",
1302
- "row": "r4uCba_row",
1300
+ "check": "r4uCba_check",
1301
+ "inviteSpin": "r4uCba_inviteSpin",
1302
+ "content": "r4uCba_content",
1303
+ "search": "r4uCba_search",
1304
+ "visuallyHidden": "r4uCba_visuallyHidden",
1303
1305
  "spinner": "r4uCba_spinner",
1304
1306
  "dialog": "r4uCba_dialog",
1305
- "errorRow": "r4uCba_errorRow"
1307
+ "checkHidden": "r4uCba_checkHidden",
1308
+ "errorRow": "r4uCba_errorRow",
1309
+ "chipRemove": "r4uCba_chipRemove",
1310
+ "rowName": "r4uCba_rowName",
1311
+ "rowSelected": "r4uCba_rowSelected",
1312
+ "list": "r4uCba_list"
1306
1313
  };
1307
1314
  //#endregion
1308
1315
  //#region src/client/RoomDialogs.tsx
@@ -1909,7 +1916,7 @@ window.__ModuleLoader__.load({
1909
1916
  }
1910
1917
  //#endregion
1911
1918
  //#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}";
1919
+ 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
1920
  const tagId$4 = "@sparkelf/dsh-group-chat/SidebarRooms.module.css";
1914
1921
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$4) + "]") === null) {
1915
1922
  const tag = document.createElement("style");
@@ -1919,66 +1926,67 @@ window.__ModuleLoader__.load({
1919
1926
  document.head.appendChild(tag);
1920
1927
  }
1921
1928
  var SidebarRooms_module_css_default = {
1922
- "rowWrap": "s0QgKq_rowWrap",
1923
1929
  "discoverMeta": "s0QgKq_discoverMeta",
1924
- "hitHead": "s0QgKq_hitHead",
1925
- "menuInput": "s0QgKq_menuInput",
1926
- "menuActions": "s0QgKq_menuActions",
1927
- "headerActions": "s0QgKq_headerActions",
1928
- "discoverSection": "s0QgKq_discoverSection",
1930
+ "root": "s0QgKq_root",
1931
+ "joinButton": "s0QgKq_joinButton",
1932
+ "sectionHeader": "s0QgKq_sectionHeader",
1933
+ "menuHeading": "s0QgKq_menuHeading",
1934
+ "discoverHeading": "s0QgKq_discoverHeading",
1935
+ "railButton": "s0QgKq_railButton",
1936
+ "searchButton": "s0QgKq_searchButton",
1929
1937
  "searchExpanded": "s0QgKq_searchExpanded",
1930
- "hitHint": "s0QgKq_hitHint",
1938
+ "check": "s0QgKq_check",
1939
+ "rowWrap": "s0QgKq_rowWrap",
1940
+ "leaveConfirmDanger": "s0QgKq_leaveConfirmDanger",
1941
+ "menu": "s0QgKq_menu",
1931
1942
  "hit": "s0QgKq_hit",
1943
+ "discoverName": "s0QgKq_discoverName",
1944
+ "fade": "s0QgKq_fade",
1945
+ "flatList": "s0QgKq_flatList",
1946
+ "searchSlotExpanded": "s0QgKq_searchSlotExpanded",
1947
+ "hitAuthor": "s0QgKq_hitAuthor",
1948
+ "menuItem": "s0QgKq_menuItem",
1932
1949
  "time": "s0QgKq_time",
1933
- "rowIcon": "s0QgKq_rowIcon",
1950
+ "unread": "s0QgKq_unread",
1934
1951
  "viewWrap": "s0QgKq_viewWrap",
1935
- "menuHeading": "s0QgKq_menuHeading",
1936
- "hitList": "s0QgKq_hitList",
1937
1952
  "list": "s0QgKq_list",
1938
- "root": "s0QgKq_root",
1939
- "flatList": "s0QgKq_flatList",
1940
- "leaveCopy": "s0QgKq_leaveCopy",
1941
- "leaveError": "s0QgKq_leaveError",
1942
- "searchInput": "s0QgKq_searchInput",
1943
- "empty": "s0QgKq_empty",
1944
- "iconButton": "s0QgKq_iconButton",
1945
- "check": "s0QgKq_check",
1946
- "searchSlotExpanded": "s0QgKq_searchSlotExpanded",
1947
- "leaveConfirmDanger": "s0QgKq_leaveConfirmDanger",
1953
+ "menuLayer": "s0QgKq_menuLayer",
1954
+ "menuConfirm": "s0QgKq_menuConfirm",
1955
+ "headerActions": "s0QgKq_headerActions",
1948
1956
  "visuallyHidden": "s0QgKq_visuallyHidden",
1957
+ "unreadMentioned": "s0QgKq_unreadMentioned",
1958
+ "leaveRoomName": "s0QgKq_leaveRoomName",
1959
+ "iconButton": "s0QgKq_iconButton",
1960
+ "mark": "s0QgKq_mark",
1961
+ "sessionRowSelected": "s0QgKq_sessionRowSelected",
1962
+ "discoverSection": "s0QgKq_discoverSection",
1963
+ "clearButton": "s0QgKq_clearButton",
1964
+ "menuCancel": "s0QgKq_menuCancel",
1965
+ "footer": "s0QgKq_footer",
1966
+ "rowIcon": "s0QgKq_rowIcon",
1967
+ "emptyState": "s0QgKq_emptyState",
1968
+ "leaveError": "s0QgKq_leaveError",
1949
1969
  "title": "s0QgKq_title",
1950
- "joinButton": "s0QgKq_joinButton",
1951
1970
  "hitRoom": "s0QgKq_hitRoom",
1952
- "menu": "s0QgKq_menu",
1953
- "footer": "s0QgKq_footer",
1954
- "discoverRow": "s0QgKq_discoverRow",
1955
- "hitAuthor": "s0QgKq_hitAuthor",
1956
- "discoverHeading": "s0QgKq_discoverHeading",
1957
- "menuLayer": "s0QgKq_menuLayer",
1958
- "menuItem": "s0QgKq_menuItem",
1959
- "menuConfirm": "s0QgKq_menuConfirm",
1960
- "hitText": "s0QgKq_hitText",
1971
+ "resizer": "s0QgKq_resizer",
1972
+ "sectionLabel": "s0QgKq_sectionLabel",
1961
1973
  "menuRename": "s0QgKq_menuRename",
1962
- "listArea": "s0QgKq_listArea",
1963
- "discoverName": "s0QgKq_discoverName",
1964
- "fade": "s0QgKq_fade",
1965
- "leaveRoomName": "s0QgKq_leaveRoomName",
1974
+ "sessionRow": "s0QgKq_sessionRow",
1966
1975
  "searchSlot": "s0QgKq_searchSlot",
1967
- "unreadMentioned": "s0QgKq_unreadMentioned",
1976
+ "menuInput": "s0QgKq_menuInput",
1977
+ "searchInput": "s0QgKq_searchInput",
1978
+ "hitText": "s0QgKq_hitText",
1968
1979
  "menuInline": "s0QgKq_menuInline",
1969
- "emptyState": "s0QgKq_emptyState",
1970
- "leaveBody": "s0QgKq_leaveBody",
1971
- "resizer": "s0QgKq_resizer",
1980
+ "hitList": "s0QgKq_hitList",
1981
+ "menuActions": "s0QgKq_menuActions",
1982
+ "leaveCopy": "s0QgKq_leaveCopy",
1983
+ "listArea": "s0QgKq_listArea",
1984
+ "hitHead": "s0QgKq_hitHead",
1972
1985
  "search": "s0QgKq_search",
1973
- "sessionRow": "s0QgKq_sessionRow",
1974
- "sectionHeader": "s0QgKq_sectionHeader",
1975
- "unread": "s0QgKq_unread",
1976
- "sectionLabel": "s0QgKq_sectionLabel",
1977
- "clearButton": "s0QgKq_clearButton",
1978
- "searchButton": "s0QgKq_searchButton",
1979
- "mark": "s0QgKq_mark",
1980
- "menuCancel": "s0QgKq_menuCancel",
1981
- "sessionRowSelected": "s0QgKq_sessionRowSelected"
1986
+ "discoverRow": "s0QgKq_discoverRow",
1987
+ "leaveBody": "s0QgKq_leaveBody",
1988
+ "hitHint": "s0QgKq_hitHint",
1989
+ "empty": "s0QgKq_empty"
1982
1990
  };
1983
1991
  //#endregion
1984
1992
  //#region src/client/SidebarRooms.tsx
@@ -2001,12 +2009,12 @@ window.__ModuleLoader__.load({
2001
2009
  /**
2002
2010
  * Height bounds for the region, in pixels.
2003
2011
  *
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
2012
+ * The floor is one room row plus the header; the ceiling keeps the region from crowding
2013
+ * out the workspace list above it, which is the same reason the stylesheet capped it at
2014
+ * `46vh` before this was adjustable. The host clamps to the same pair, so a stored value
2007
2015
  * cannot arrive outside the range the region can draw.
2008
2016
  */
2009
- const HEIGHT_MIN = 120;
2017
+ const HEIGHT_MIN = 80;
2010
2018
  const HEIGHT_MAX = 1200;
2011
2019
  /** Clamps a requested height into the range the region can draw. */
2012
2020
  const clampHeight = (value) => Math.min(HEIGHT_MAX, Math.max(HEIGHT_MIN, Math.round(value)));
@@ -2045,8 +2053,39 @@ window.__ModuleLoader__.load({
2045
2053
  if (from < text.length) parts.push(text.slice(from));
2046
2054
  return parts;
2047
2055
  };
2056
+ /**
2057
+ * The collapsed rail's stand-in for this region: one icon, no rows.
2058
+ *
2059
+ * `onSelect` is the same "open the group chat" action the room list header offers, so the
2060
+ * collapsed rail is not a dead end — clicking it gets the reader to the rooms.
2061
+ * @param props - the realm's injected copy resolver and the open action.
2062
+ * @returns The compact control.
2063
+ */
2064
+ function SidebarRoomsCollapsed(props) {
2065
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
2066
+ label: props.t("title"),
2067
+ side: "right",
2068
+ delayMs: 400,
2069
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
2070
+ type: "button",
2071
+ className: SidebarRooms_module_css_default["railButton"],
2072
+ "aria-label": props.t("title"),
2073
+ onClick: props.onOpen,
2074
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconQueueOutlineRegular, { size: 18 })
2075
+ })
2076
+ });
2077
+ }
2048
2078
  function SidebarRooms(props) {
2049
2079
  const { t, tPreset, store } = props;
2080
+ if (props.wide === false) {
2081
+ const firstRoom = store.getState().rooms?.[0];
2082
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SidebarRoomsCollapsed, {
2083
+ t,
2084
+ onOpen: () => {
2085
+ if (firstRoom !== void 0) store.open(firstRoom.id);
2086
+ }
2087
+ });
2088
+ }
2050
2089
  const { rooms, activeRoomId, failure, searchQuery, discoverable } = (0, react.useSyncExternalStore)(store.subscribe, store.getState, store.getState);
2051
2090
  const [searchExpanded, setSearchExpanded] = (0, react.useState)(false);
2052
2091
  const [viewOpen, setViewOpen] = (0, react.useState)(false);
@@ -3040,20 +3079,20 @@ window.__ModuleLoader__.load({
3040
3079
  document.head.appendChild(tag);
3041
3080
  }
3042
3081
  var MessageSide_module_css_default = {
3043
- "quoteMark": "KXabfq_quoteMark",
3082
+ "rowActionsSelf": "KXabfq_rowActionsSelf",
3044
3083
  "quoteBody": "KXabfq_quoteBody",
3045
- "rowBody": "KXabfq_rowBody",
3084
+ "author": "KXabfq_author",
3046
3085
  "otherRow": "KXabfq_otherRow",
3086
+ "selfRow": "KXabfq_selfRow",
3087
+ "rowBody": "KXabfq_rowBody",
3088
+ "quoteBar": "KXabfq_quoteBar",
3089
+ "rowActions": "KXabfq_rowActions",
3047
3090
  "replyButton": "KXabfq_replyButton",
3048
3091
  "selfBody": "KXabfq_selfBody",
3049
- "rowActions": "KXabfq_rowActions",
3050
- "rowActionsSelf": "KXabfq_rowActionsSelf",
3051
- "quoteText": "KXabfq_quoteText",
3052
3092
  "authorName": "KXabfq_authorName",
3053
- "author": "KXabfq_author",
3054
- "selfRow": "KXabfq_selfRow",
3093
+ "quoteText": "KXabfq_quoteText",
3055
3094
  "quoteAuthor": "KXabfq_quoteAuthor",
3056
- "quoteBar": "KXabfq_quoteBar"
3095
+ "quoteMark": "KXabfq_quoteMark"
3057
3096
  };
3058
3097
  //#endregion
3059
3098
  //#region src/client/MessageSide.tsx
@@ -3344,46 +3383,46 @@ window.__ModuleLoader__.load({
3344
3383
  document.head.appendChild(tag);
3345
3384
  }
3346
3385
  var MembersPanel_module_css_default = {
3347
- "notice": "VeQVAa_notice",
3348
- "root": "VeQVAa_root",
3349
- "editorFooter": "VeQVAa_editorFooter",
3350
- "ownerTag": "VeQVAa_ownerTag",
3386
+ "textarea": "VeQVAa_textarea",
3387
+ "previewHeader": "VeQVAa_previewHeader",
3388
+ "error": "VeQVAa_error",
3389
+ "previewClose": "VeQVAa_previewClose",
3390
+ "announcementText": "VeQVAa_announcementText",
3391
+ "crumb": "VeQVAa_crumb",
3392
+ "searchToggle": "VeQVAa_searchToggle",
3351
3393
  "editor": "VeQVAa_editor",
3352
- "unavailable": "VeQVAa_unavailable",
3394
+ "sectionToggle": "VeQVAa_sectionToggle",
3395
+ "name": "VeQVAa_name",
3396
+ "sectionLabel": "VeQVAa_sectionLabel",
3397
+ "caret": "VeQVAa_caret",
3398
+ "notice": "VeQVAa_notice",
3399
+ "row": "VeQVAa_row",
3400
+ "refresh": "VeQVAa_refresh",
3401
+ "preview": "VeQVAa_preview",
3402
+ "previewTitle": "VeQVAa_previewTitle",
3403
+ "fileSize": "VeQVAa_fileSize",
3353
3404
  "search": "VeQVAa_search",
3354
- "count": "VeQVAa_count",
3355
3405
  "crumbGroup": "VeQVAa_crumbGroup",
3356
- "crumb": "VeQVAa_crumb",
3406
+ "unavailable": "VeQVAa_unavailable",
3407
+ "fileIcon": "VeQVAa_fileIcon",
3408
+ "previewImage": "VeQVAa_previewImage",
3357
3409
  "list": "VeQVAa_list",
3358
- "section": "VeQVAa_section",
3359
- "fileSize": "VeQVAa_fileSize",
3360
- "sectionHeader": "VeQVAa_sectionHeader",
3361
3410
  "filePicker": "VeQVAa_filePicker",
3362
- "sectionLabel": "VeQVAa_sectionLabel",
3363
- "row": "VeQVAa_row",
3364
- "caret": "VeQVAa_caret",
3365
3411
  "hint": "VeQVAa_hint",
3366
- "name": "VeQVAa_name",
3367
- "fileButton": "VeQVAa_fileButton",
3368
- "error": "VeQVAa_error",
3369
- "sectionBody": "VeQVAa_sectionBody",
3370
- "textarea": "VeQVAa_textarea",
3371
- "searchToggle": "VeQVAa_searchToggle",
3372
- "previewHeader": "VeQVAa_previewHeader",
3373
- "announcementText": "VeQVAa_announcementText",
3374
- "previewClose": "VeQVAa_previewClose",
3412
+ "count": "VeQVAa_count",
3375
3413
  "selfTag": "VeQVAa_selfTag",
3414
+ "section": "VeQVAa_section",
3415
+ "previewBody": "VeQVAa_previewBody",
3376
3416
  "crumbSep": "VeQVAa_crumbSep",
3417
+ "root": "VeQVAa_root",
3418
+ "sectionHeader": "VeQVAa_sectionHeader",
3419
+ "editorFooter": "VeQVAa_editorFooter",
3377
3420
  "linkButton": "VeQVAa_linkButton",
3378
- "previewBody": "VeQVAa_previewBody",
3379
3421
  "crumbs": "VeQVAa_crumbs",
3380
- "sectionToggle": "VeQVAa_sectionToggle",
3381
- "refresh": "VeQVAa_refresh",
3382
- "preview": "VeQVAa_preview",
3383
- "fileIcon": "VeQVAa_fileIcon",
3384
- "previewTitle": "VeQVAa_previewTitle",
3422
+ "fileButton": "VeQVAa_fileButton",
3385
3423
  "remove": "VeQVAa_remove",
3386
- "previewImage": "VeQVAa_previewImage"
3424
+ "sectionBody": "VeQVAa_sectionBody",
3425
+ "ownerTag": "VeQVAa_ownerTag"
3387
3426
  };
3388
3427
  //#endregion
3389
3428
  //#region src/client/MembersPanel.tsx
@@ -4007,10 +4046,10 @@ window.__ModuleLoader__.load({
4007
4046
  }
4008
4047
  var GuideEntry_module_css_default = {
4009
4048
  "title": "_0Vnsuq_title",
4010
- "description": "_0Vnsuq_description",
4011
4049
  "text": "_0Vnsuq_text",
4050
+ "icon": "_0Vnsuq_icon",
4012
4051
  "entry": "_0Vnsuq_entry",
4013
- "icon": "_0Vnsuq_icon"
4052
+ "description": "_0Vnsuq_description"
4014
4053
  };
4015
4054
  //#endregion
4016
4055
  //#region src/client/GuideEntry.tsx
@@ -4078,12 +4117,12 @@ window.__ModuleLoader__.load({
4078
4117
  }
4079
4118
  var QuoteComposer_module_css_default = {
4080
4119
  "author": "AK6KxW_author",
4081
- "dismiss": "AK6KxW_dismiss",
4082
- "button": "AK6KxW_button",
4083
4120
  "bar": "AK6KxW_bar",
4084
- "mark": "AK6KxW_mark",
4121
+ "text": "AK6KxW_text",
4085
4122
  "body": "AK6KxW_body",
4086
- "text": "AK6KxW_text"
4123
+ "dismiss": "AK6KxW_dismiss",
4124
+ "mark": "AK6KxW_mark",
4125
+ "button": "AK6KxW_button"
4087
4126
  };
4088
4127
  //#endregion
4089
4128
  //#region src/client/QuoteComposer.tsx
@@ -4658,6 +4697,27 @@ window.__ModuleLoader__.load({
4658
4697
  * @param ctx - DSH client context with locale and slot registries.
4659
4698
  */
4660
4699
  function apply(ctx) {
4700
+ const context = ctx;
4701
+ const sidebarRight = context.sidebarRight ?? context.get?.("sidebarRight");
4702
+ const openRoomFile = (attachment, roomId) => {
4703
+ const query = "attachmentId=" + encodeURIComponent(attachment.attachmentId) + "&name=" + encodeURIComponent(attachment.name) + "&bytes=" + encodeURIComponent(String(attachment.bytes));
4704
+ (async () => {
4705
+ const materialized = await fetch("/dsh-group-chat/api/attachment-materialize?" + query);
4706
+ if (!materialized.ok) throw new Error("附件预览准备失败");
4707
+ const target = await materialized.json();
4708
+ if (typeof target.path !== "string") throw new Error("附件预览路径缺失");
4709
+ const sessionId = "group-room-" + roomId;
4710
+ const address = "dsh-resource://file/session/" + encodeURIComponent(sessionId) + "/" + target.path.split("/").map((part) => encodeURIComponent(part)).join("/");
4711
+ if (sidebarRight !== void 0 && sidebarRight.openResource !== void 0) {
4712
+ sidebarRight.openResource(address);
4713
+ return;
4714
+ }
4715
+ const fallback = new URL("/dsh-group-chat/api/attachment-preview?" + query, window.location.origin).toString();
4716
+ window.open(fallback, "_blank", "noopener,noreferrer");
4717
+ })().catch((error) => {
4718
+ console.error("[group-chat] file preview failed", error);
4719
+ });
4720
+ };
4661
4721
  ctx.effect(() => ctx.locale.register(NS, {
4662
4722
  zh,
4663
4723
  en
@@ -4838,6 +4898,56 @@ window.__ModuleLoader__.load({
4838
4898
  }
4839
4899
  }))
4840
4900
  }, MembersGuideEntry)), "group-chat: members guide box");
4901
+ ctx.effect(() => {
4902
+ const onFileClick = (event) => {
4903
+ const target = event.target;
4904
+ if (!(target instanceof Element)) return;
4905
+ const card = target.closest("[data-message-attachments] > *");
4906
+ const roomId = store.getState().activeRoomId;
4907
+ if (!(card instanceof HTMLElement) || roomId === void 0) return;
4908
+ const name = (card.getAttribute("title") ?? card.innerText.split("\n")[0] ?? "").trim();
4909
+ if (name === "") return;
4910
+ (async () => {
4911
+ try {
4912
+ let cursor = null;
4913
+ let found;
4914
+ for (let page = 0; page < 20 && found === void 0; page += 1) {
4915
+ const suffix = cursor === null ? "" : "?cursor=" + encodeURIComponent(cursor);
4916
+ const response = await fetch("/dsh-group-chat/api/rooms/" + encodeURIComponent(roomId) + "/events" + suffix);
4917
+ if (!response.ok) return;
4918
+ const payload = await response.json();
4919
+ for (const record of payload.events ?? []) {
4920
+ const content = (record.event?.data)?.content;
4921
+ if (!Array.isArray(content)) continue;
4922
+ for (const block of content) {
4923
+ if (block === null || typeof block !== "object") continue;
4924
+ const item = block;
4925
+ const attachment = item.attachment;
4926
+ if (item.type === "file" && attachment?.name === name && typeof attachment.attachmentId === "string" && typeof attachment.bytes === "number") {
4927
+ found = {
4928
+ attachmentId: attachment.attachmentId,
4929
+ name,
4930
+ bytes: attachment.bytes
4931
+ };
4932
+ break;
4933
+ }
4934
+ }
4935
+ if (found !== void 0) break;
4936
+ }
4937
+ if (payload.hasMore !== true || payload.nextCursor === null || payload.nextCursor === void 0) break;
4938
+ cursor = payload.nextCursor;
4939
+ }
4940
+ if (found !== void 0) openRoomFile(found, roomId);
4941
+ } catch (error) {
4942
+ console.error("[group-chat] file preview lookup failed", error);
4943
+ }
4944
+ })();
4945
+ };
4946
+ document.addEventListener("click", onFileClick, true);
4947
+ return () => {
4948
+ document.removeEventListener("click", onFileClick, true);
4949
+ };
4950
+ }, "group-chat: file preview delegation");
4841
4951
  ctx.slots.inject("conversation.chat.node", () => {
4842
4952
  let claims = [];
4843
4953
  const release = () => {