@sparkelf/dsh-group-chat 0.4.2 → 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
@@ -513,11 +513,11 @@ window.__ModuleLoader__.load({
513
513
  document.head.appendChild(tag);
514
514
  }
515
515
  var Avatar_module_css_default = {
516
+ "stack": "Ohch6W_stack",
516
517
  "md": "Ohch6W_md",
518
+ "over": "Ohch6W_over",
517
519
  "avatar": "Ohch6W_avatar",
518
- "stack": "Ohch6W_stack",
519
- "sm": "Ohch6W_sm",
520
- "over": "Ohch6W_over"
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
+ "label": "sKjJ-a_label",
561
+ "secondary": "sKjJ-a_secondary",
560
562
  "box": "sKjJ-a_box",
563
+ "rowActive": "sKjJ-a_rowActive",
561
564
  "list": "sKjJ-a_list",
562
565
  "note": "sKjJ-a_note",
563
- "label": "sKjJ-a_label",
564
- "rowActive": "sKjJ-a_rowActive",
565
- "secondary": "sKjJ-a_secondary",
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
+ "description": "xjnmxG_description",
739
740
  "trigger": "xjnmxG_trigger",
740
741
  "name": "xjnmxG_name",
741
- "description": "xjnmxG_description",
742
- "row": "xjnmxG_row",
743
- "triggerLabel": "xjnmxG_triggerLabel"
742
+ "triggerLabel": "xjnmxG_triggerLabel",
743
+ "row": "xjnmxG_row"
744
744
  };
745
745
  //#endregion
746
746
  //#region src/client/PresetSelect.tsx
@@ -998,23 +998,23 @@ window.__ModuleLoader__.load({
998
998
  document.head.appendChild(tag);
999
999
  }
1000
1000
  var CreateRoomDialog_module_css_default = {
1001
- "field": "Z3w8WW_field",
1002
1001
  "pill": "Z3w8WW_pill",
1002
+ "hint": "Z3w8WW_hint",
1003
+ "field": "Z3w8WW_field",
1003
1004
  "label": "Z3w8WW_label",
1004
- "memberName": "Z3w8WW_memberName",
1005
+ "triggerExtra": "Z3w8WW_triggerExtra",
1006
+ "pillActive": "Z3w8WW_pillActive",
1007
+ "body": "Z3w8WW_body",
1008
+ "notice": "Z3w8WW_notice",
1005
1009
  "footer": "Z3w8WW_footer",
1010
+ "error": "Z3w8WW_error",
1006
1011
  "policyRow": "Z3w8WW_policyRow",
1007
- "memberRow": "Z3w8WW_memberRow",
1008
1012
  "switches": "Z3w8WW_switches",
1009
- "error": "Z3w8WW_error",
1010
- "hint": "Z3w8WW_hint",
1011
- "pillActive": "Z3w8WW_pillActive",
1012
- "body": "Z3w8WW_body",
1013
+ "memberName": "Z3w8WW_memberName",
1013
1014
  "memberBadge": "Z3w8WW_memberBadge",
1014
- "warn": "Z3w8WW_warn",
1015
- "notice": "Z3w8WW_notice",
1016
- "triggerExtra": "Z3w8WW_triggerExtra",
1017
- "memberList": "Z3w8WW_memberList"
1015
+ "memberRow": "Z3w8WW_memberRow",
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
- "check": "r4uCba_check",
1285
- "inviteSpin": "r4uCba_inviteSpin",
1286
- "chip": "r4uCba_chip",
1287
- "checkHidden": "r4uCba_checkHidden",
1288
- "chips": "r4uCba_chips",
1289
- "error": "r4uCba_error",
1290
- "field": "r4uCba_field",
1291
- "row": "r4uCba_row",
1292
- "visuallyHidden": "r4uCba_visuallyHidden",
1284
+ "content": "r4uCba_content",
1293
1285
  "rowSelected": "r4uCba_rowSelected",
1294
- "searchRow": "r4uCba_searchRow",
1295
- "rowName": "r4uCba_rowName",
1296
- "errorRow": "r4uCba_errorRow",
1286
+ "search": "r4uCba_search",
1297
1287
  "chipRemove": "r4uCba_chipRemove",
1288
+ "rowName": "r4uCba_rowName",
1289
+ "searchRow": "r4uCba_searchRow",
1298
1290
  "chipName": "r4uCba_chipName",
1291
+ "row": "r4uCba_row",
1292
+ "chips": "r4uCba_chips",
1293
+ "visuallyHidden": "r4uCba_visuallyHidden",
1299
1294
  "rowHandle": "r4uCba_rowHandle",
1300
- "note": "r4uCba_note",
1301
- "content": "r4uCba_content",
1302
- "spinner": "r4uCba_spinner",
1303
- "list": "r4uCba_list",
1295
+ "errorRow": "r4uCba_errorRow",
1304
1296
  "dialog": "r4uCba_dialog",
1305
- "search": "r4uCba_search"
1297
+ "list": "r4uCba_list",
1298
+ "inviteSpin": "r4uCba_inviteSpin",
1299
+ "check": "r4uCba_check",
1300
+ "chip": "r4uCba_chip",
1301
+ "note": "r4uCba_note",
1302
+ "checkHidden": "r4uCba_checkHidden",
1303
+ "error": "r4uCba_error",
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
+ "leaveCopy": "s0QgKq_leaveCopy",
1923
+ "leaveRoomName": "s0QgKq_leaveRoomName",
1924
+ "hit": "s0QgKq_hit",
1925
+ "searchButton": "s0QgKq_searchButton",
1926
+ "unread": "s0QgKq_unread",
1922
1927
  "listArea": "s0QgKq_listArea",
1923
- "hitHead": "s0QgKq_hitHead",
1924
- "hitHint": "s0QgKq_hitHint",
1925
- "searchSlotExpanded": "s0QgKq_searchSlotExpanded",
1926
- "leaveError": "s0QgKq_leaveError",
1927
- "menuInline": "s0QgKq_menuInline",
1928
- "flatList": "s0QgKq_flatList",
1929
- "discoverMeta": "s0QgKq_discoverMeta",
1930
- "discoverSection": "s0QgKq_discoverSection",
1931
- "unreadMentioned": "s0QgKq_unreadMentioned",
1928
+ "time": "s0QgKq_time",
1932
1929
  "menuInput": "s0QgKq_menuInput",
1933
- "menuConfirm": "s0QgKq_menuConfirm",
1934
1930
  "clearButton": "s0QgKq_clearButton",
1935
- "menu": "s0QgKq_menu",
1936
- "discoverHeading": "s0QgKq_discoverHeading",
1937
- "menuCancel": "s0QgKq_menuCancel",
1938
- "visuallyHidden": "s0QgKq_visuallyHidden",
1939
- "sessionRow": "s0QgKq_sessionRow",
1940
- "hitList": "s0QgKq_hitList",
1931
+ "empty": "s0QgKq_empty",
1932
+ "sectionHeader": "s0QgKq_sectionHeader",
1941
1933
  "iconButton": "s0QgKq_iconButton",
1942
- "list": "s0QgKq_list",
1943
- "sessionRowSelected": "s0QgKq_sessionRowSelected",
1944
- "search": "s0QgKq_search",
1934
+ "discoverRow": "s0QgKq_discoverRow",
1945
1935
  "menuHeading": "s0QgKq_menuHeading",
1936
+ "menuActions": "s0QgKq_menuActions",
1937
+ "flatList": "s0QgKq_flatList",
1938
+ "hitHead": "s0QgKq_hitHead",
1939
+ "searchExpanded": "s0QgKq_searchExpanded",
1940
+ "footer": "s0QgKq_footer",
1941
+ "searchInput": "s0QgKq_searchInput",
1946
1942
  "rowWrap": "s0QgKq_rowWrap",
1947
- "discoverRow": "s0QgKq_discoverRow",
1948
- "hit": "s0QgKq_hit",
1949
- "discoverName": "s0QgKq_discoverName",
1950
- "leaveConfirmDanger": "s0QgKq_leaveConfirmDanger",
1943
+ "rowIcon": "s0QgKq_rowIcon",
1944
+ "unreadMentioned": "s0QgKq_unreadMentioned",
1945
+ "menu": "s0QgKq_menu",
1951
1946
  "hitAuthor": "s0QgKq_hitAuthor",
1947
+ "hitList": "s0QgKq_hitList",
1948
+ "resizer": "s0QgKq_resizer",
1949
+ "headerActions": "s0QgKq_headerActions",
1950
+ "menuItem": "s0QgKq_menuItem",
1951
+ "hitText": "s0QgKq_hitText",
1952
+ "leaveConfirmDanger": "s0QgKq_leaveConfirmDanger",
1953
+ "joinButton": "s0QgKq_joinButton",
1954
+ "discoverMeta": "s0QgKq_discoverMeta",
1952
1955
  "mark": "s0QgKq_mark",
1953
- "emptyState": "s0QgKq_emptyState",
1954
- "searchExpanded": "s0QgKq_searchExpanded",
1956
+ "searchSlotExpanded": "s0QgKq_searchSlotExpanded",
1957
+ "list": "s0QgKq_list",
1955
1958
  "title": "s0QgKq_title",
1956
- "fade": "s0QgKq_fade",
1957
- "check": "s0QgKq_check",
1958
- "menuActions": "s0QgKq_menuActions",
1959
- "searchSlot": "s0QgKq_searchSlot",
1960
- "footer": "s0QgKq_footer",
1959
+ "leaveError": "s0QgKq_leaveError",
1961
1960
  "hitRoom": "s0QgKq_hitRoom",
1962
- "hitText": "s0QgKq_hitText",
1963
- "leaveRoomName": "s0QgKq_leaveRoomName",
1964
- "menuRename": "s0QgKq_menuRename",
1965
- "rowIcon": "s0QgKq_rowIcon",
1966
- "sectionHeader": "s0QgKq_sectionHeader",
1967
- "searchButton": "s0QgKq_searchButton",
1968
- "menuItem": "s0QgKq_menuItem",
1969
- "headerActions": "s0QgKq_headerActions",
1970
- "menuLayer": "s0QgKq_menuLayer",
1961
+ "searchSlot": "s0QgKq_searchSlot",
1962
+ "search": "s0QgKq_search",
1971
1963
  "root": "s0QgKq_root",
1972
- "sectionLabel": "s0QgKq_sectionLabel",
1973
- "unread": "s0QgKq_unread",
1974
- "leaveCopy": "s0QgKq_leaveCopy",
1975
- "resizer": "s0QgKq_resizer",
1976
- "time": "s0QgKq_time",
1964
+ "discoverHeading": "s0QgKq_discoverHeading",
1965
+ "menuCancel": "s0QgKq_menuCancel",
1966
+ "menuLayer": "s0QgKq_menuLayer",
1967
+ "menuRename": "s0QgKq_menuRename",
1968
+ "visuallyHidden": "s0QgKq_visuallyHidden",
1969
+ "emptyState": "s0QgKq_emptyState",
1970
+ "menuConfirm": "s0QgKq_menuConfirm",
1971
+ "railButton": "s0QgKq_railButton",
1972
+ "discoverName": "s0QgKq_discoverName",
1977
1973
  "leaveBody": "s0QgKq_leaveBody",
1978
- "empty": "s0QgKq_empty",
1979
- "joinButton": "s0QgKq_joinButton",
1980
- "searchInput": "s0QgKq_searchInput",
1981
- "viewWrap": "s0QgKq_viewWrap"
1974
+ "viewWrap": "s0QgKq_viewWrap",
1975
+ "fade": "s0QgKq_fade",
1976
+ "sessionRowSelected": "s0QgKq_sessionRowSelected",
1977
+ "menuInline": "s0QgKq_menuInline",
1978
+ "check": "s0QgKq_check",
1979
+ "sectionLabel": "s0QgKq_sectionLabel",
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);
@@ -3042,18 +3074,18 @@ window.__ModuleLoader__.load({
3042
3074
  var MessageSide_module_css_default = {
3043
3075
  "replyButton": "KXabfq_replyButton",
3044
3076
  "quoteAuthor": "KXabfq_quoteAuthor",
3077
+ "quoteText": "KXabfq_quoteText",
3045
3078
  "quoteMark": "KXabfq_quoteMark",
3046
- "selfBody": "KXabfq_selfBody",
3047
- "rowActionsSelf": "KXabfq_rowActionsSelf",
3048
- "quoteBar": "KXabfq_quoteBar",
3079
+ "rowActions": "KXabfq_rowActions",
3049
3080
  "quoteBody": "KXabfq_quoteBody",
3050
- "otherRow": "KXabfq_otherRow",
3051
- "quoteText": "KXabfq_quoteText",
3081
+ "quoteBar": "KXabfq_quoteBar",
3052
3082
  "authorName": "KXabfq_authorName",
3083
+ "selfBody": "KXabfq_selfBody",
3084
+ "author": "KXabfq_author",
3085
+ "rowActionsSelf": "KXabfq_rowActionsSelf",
3053
3086
  "selfRow": "KXabfq_selfRow",
3054
3087
  "rowBody": "KXabfq_rowBody",
3055
- "author": "KXabfq_author",
3056
- "rowActions": "KXabfq_rowActions"
3088
+ "otherRow": "KXabfq_otherRow"
3057
3089
  };
3058
3090
  //#endregion
3059
3091
  //#region src/client/MessageSide.tsx
@@ -3196,6 +3228,8 @@ window.__ModuleLoader__.load({
3196
3228
  * @param props - the message it replies to, and the store the pick lands in.
3197
3229
  * @returns the button, or `null` when the message cannot be replied to.
3198
3230
  */
3231
+ /** Source kind of the model-only quoted-message context; it must never be drawn as a message. */
3232
+ const QUOTE_CONTEXT_KIND = "group-chat-quote";
3199
3233
  const ReplyControl = (props) => {
3200
3234
  const { roomId, messageId, authorName, preview, quotes, t } = props;
3201
3235
  if (preview.length === 0) return null;
@@ -3233,6 +3267,7 @@ window.__ModuleLoader__.load({
3233
3267
  if (typeof Official !== "function" && typeof Official !== "object") return null;
3234
3268
  const view = (0, react.createElement)(Official, props);
3235
3269
  const message = node?.data;
3270
+ if (message?.source?.kind === QUOTE_CONTEXT_KIND) return null;
3236
3271
  const side = sided ? messageSide(message, selfId) : void 0;
3237
3272
  const quote = quoteOf(message);
3238
3273
  const roomId = message?.source?.roomId;
@@ -3341,46 +3376,46 @@ window.__ModuleLoader__.load({
3341
3376
  document.head.appendChild(tag);
3342
3377
  }
3343
3378
  var MembersPanel_module_css_default = {
3344
- "crumb": "VeQVAa_crumb",
3379
+ "fileButton": "VeQVAa_fileButton",
3380
+ "previewTitle": "VeQVAa_previewTitle",
3381
+ "search": "VeQVAa_search",
3382
+ "linkButton": "VeQVAa_linkButton",
3383
+ "name": "VeQVAa_name",
3345
3384
  "editorFooter": "VeQVAa_editorFooter",
3385
+ "row": "VeQVAa_row",
3386
+ "editor": "VeQVAa_editor",
3346
3387
  "refresh": "VeQVAa_refresh",
3347
- "search": "VeQVAa_search",
3348
- "caret": "VeQVAa_caret",
3349
- "previewImage": "VeQVAa_previewImage",
3350
- "previewBody": "VeQVAa_previewBody",
3351
- "sectionBody": "VeQVAa_sectionBody",
3352
- "fileSize": "VeQVAa_fileSize",
3353
- "count": "VeQVAa_count",
3354
3388
  "searchToggle": "VeQVAa_searchToggle",
3355
- "preview": "VeQVAa_preview",
3389
+ "root": "VeQVAa_root",
3390
+ "crumbs": "VeQVAa_crumbs",
3391
+ "caret": "VeQVAa_caret",
3356
3392
  "fileIcon": "VeQVAa_fileIcon",
3357
- "editor": "VeQVAa_editor",
3358
- "fileButton": "VeQVAa_fileButton",
3393
+ "fileSize": "VeQVAa_fileSize",
3394
+ "sectionBody": "VeQVAa_sectionBody",
3359
3395
  "sectionHeader": "VeQVAa_sectionHeader",
3360
- "section": "VeQVAa_section",
3396
+ "selfTag": "VeQVAa_selfTag",
3361
3397
  "previewClose": "VeQVAa_previewClose",
3398
+ "sectionLabel": "VeQVAa_sectionLabel",
3399
+ "hint": "VeQVAa_hint",
3400
+ "error": "VeQVAa_error",
3401
+ "crumb": "VeQVAa_crumb",
3402
+ "announcementText": "VeQVAa_announcementText",
3362
3403
  "previewHeader": "VeQVAa_previewHeader",
3363
- "previewTitle": "VeQVAa_previewTitle",
3404
+ "textarea": "VeQVAa_textarea",
3364
3405
  "notice": "VeQVAa_notice",
3406
+ "previewBody": "VeQVAa_previewBody",
3407
+ "section": "VeQVAa_section",
3365
3408
  "remove": "VeQVAa_remove",
3366
- "root": "VeQVAa_root",
3367
- "announcementText": "VeQVAa_announcementText",
3368
- "error": "VeQVAa_error",
3369
- "row": "VeQVAa_row",
3370
- "crumbs": "VeQVAa_crumbs",
3371
- "sectionLabel": "VeQVAa_sectionLabel",
3372
- "name": "VeQVAa_name",
3373
- "hint": "VeQVAa_hint",
3374
3409
  "sectionToggle": "VeQVAa_sectionToggle",
3375
- "crumbGroup": "VeQVAa_crumbGroup",
3376
- "textarea": "VeQVAa_textarea",
3410
+ "ownerTag": "VeQVAa_ownerTag",
3377
3411
  "unavailable": "VeQVAa_unavailable",
3378
- "filePicker": "VeQVAa_filePicker",
3412
+ "crumbGroup": "VeQVAa_crumbGroup",
3379
3413
  "crumbSep": "VeQVAa_crumbSep",
3380
- "selfTag": "VeQVAa_selfTag",
3381
- "linkButton": "VeQVAa_linkButton",
3382
- "list": "VeQVAa_list",
3383
- "ownerTag": "VeQVAa_ownerTag"
3414
+ "previewImage": "VeQVAa_previewImage",
3415
+ "preview": "VeQVAa_preview",
3416
+ "count": "VeQVAa_count",
3417
+ "filePicker": "VeQVAa_filePicker",
3418
+ "list": "VeQVAa_list"
3384
3419
  };
3385
3420
  //#endregion
3386
3421
  //#region src/client/MembersPanel.tsx
@@ -4003,10 +4038,10 @@ window.__ModuleLoader__.load({
4003
4038
  document.head.appendChild(tag);
4004
4039
  }
4005
4040
  var GuideEntry_module_css_default = {
4006
- "text": "_0Vnsuq_text",
4007
4041
  "icon": "_0Vnsuq_icon",
4008
- "description": "_0Vnsuq_description",
4009
4042
  "title": "_0Vnsuq_title",
4043
+ "description": "_0Vnsuq_description",
4044
+ "text": "_0Vnsuq_text",
4010
4045
  "entry": "_0Vnsuq_entry"
4011
4046
  };
4012
4047
  //#endregion
@@ -4074,13 +4109,13 @@ window.__ModuleLoader__.load({
4074
4109
  document.head.appendChild(tag);
4075
4110
  }
4076
4111
  var QuoteComposer_module_css_default = {
4077
- "author": "AK6KxW_author",
4078
4112
  "text": "AK6KxW_text",
4079
- "dismiss": "AK6KxW_dismiss",
4080
- "button": "AK6KxW_button",
4113
+ "body": "AK6KxW_body",
4081
4114
  "bar": "AK6KxW_bar",
4082
4115
  "mark": "AK6KxW_mark",
4083
- "body": "AK6KxW_body"
4116
+ "author": "AK6KxW_author",
4117
+ "dismiss": "AK6KxW_dismiss",
4118
+ "button": "AK6KxW_button"
4084
4119
  };
4085
4120
  //#endregion
4086
4121
  //#region src/client/QuoteComposer.tsx
@@ -4655,6 +4690,27 @@ window.__ModuleLoader__.load({
4655
4690
  * @param ctx - DSH client context with locale and slot registries.
4656
4691
  */
4657
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
+ };
4658
4714
  ctx.effect(() => ctx.locale.register(NS, {
4659
4715
  zh,
4660
4716
  en
@@ -4835,6 +4891,56 @@ window.__ModuleLoader__.load({
4835
4891
  }
4836
4892
  }))
4837
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");
4838
4944
  ctx.slots.inject("conversation.chat.node", () => {
4839
4945
  let claims = [];
4840
4946
  const release = () => {