@sparkelf/dsh-group-chat 0.5.2 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/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",
517
- "avatar": "Ohch6W_avatar",
518
516
  "md": "Ohch6W_md",
519
- "sm": "Ohch6W_sm",
520
- "over": "Ohch6W_over"
517
+ "avatar": "Ohch6W_avatar",
518
+ "stack": "Ohch6W_stack",
519
+ "over": "Ohch6W_over",
520
+ "sm": "Ohch6W_sm"
521
521
  };
522
522
  //#endregion
523
523
  //#region src/client/Avatar.tsx
@@ -557,13 +557,13 @@ window.__ModuleLoader__.load({
557
557
  document.head.appendChild(tag);
558
558
  }
559
559
  var Picker_module_css_default = {
560
+ "secondary": "sKjJ-a_secondary",
561
+ "row": "sKjJ-a_row",
560
562
  "rowActive": "sKjJ-a_rowActive",
561
- "box": "sKjJ-a_box",
562
563
  "label": "sKjJ-a_label",
563
- "secondary": "sKjJ-a_secondary",
564
+ "box": "sKjJ-a_box",
564
565
  "list": "sKjJ-a_list",
565
- "note": "sKjJ-a_note",
566
- "row": "sKjJ-a_row"
566
+ "note": "sKjJ-a_note"
567
567
  };
568
568
  //#endregion
569
569
  //#region src/client/Picker.tsx
@@ -736,11 +736,11 @@ window.__ModuleLoader__.load({
736
736
  document.head.appendChild(tag);
737
737
  }
738
738
  var PresetSelect_module_css_default = {
739
- "trigger": "xjnmxG_trigger",
740
739
  "name": "xjnmxG_name",
741
- "description": "xjnmxG_description",
740
+ "trigger": "xjnmxG_trigger",
742
741
  "row": "xjnmxG_row",
743
- "triggerLabel": "xjnmxG_triggerLabel"
742
+ "triggerLabel": "xjnmxG_triggerLabel",
743
+ "description": "xjnmxG_description"
744
744
  };
745
745
  //#endregion
746
746
  //#region src/client/PresetSelect.tsx
@@ -1005,23 +1005,23 @@ window.__ModuleLoader__.load({
1005
1005
  document.head.appendChild(tag);
1006
1006
  }
1007
1007
  var CreateRoomDialog_module_css_default = {
1008
- "field": "Z3w8WW_field",
1009
- "footer": "Z3w8WW_footer",
1010
- "triggerExtra": "Z3w8WW_triggerExtra",
1011
- "policyRow": "Z3w8WW_policyRow",
1012
- "pillActive": "Z3w8WW_pillActive",
1013
- "memberRow": "Z3w8WW_memberRow",
1014
- "memberList": "Z3w8WW_memberList",
1015
1008
  "warn": "Z3w8WW_warn",
1016
- "notice": "Z3w8WW_notice",
1017
- "pill": "Z3w8WW_pill",
1018
- "error": "Z3w8WW_error",
1019
- "label": "Z3w8WW_label",
1020
1009
  "body": "Z3w8WW_body",
1021
- "switches": "Z3w8WW_switches",
1010
+ "pill": "Z3w8WW_pill",
1022
1011
  "hint": "Z3w8WW_hint",
1012
+ "memberRow": "Z3w8WW_memberRow",
1013
+ "label": "Z3w8WW_label",
1014
+ "notice": "Z3w8WW_notice",
1015
+ "memberBadge": "Z3w8WW_memberBadge",
1016
+ "memberList": "Z3w8WW_memberList",
1017
+ "field": "Z3w8WW_field",
1018
+ "error": "Z3w8WW_error",
1019
+ "pillActive": "Z3w8WW_pillActive",
1020
+ "footer": "Z3w8WW_footer",
1023
1021
  "memberName": "Z3w8WW_memberName",
1024
- "memberBadge": "Z3w8WW_memberBadge"
1022
+ "switches": "Z3w8WW_switches",
1023
+ "triggerExtra": "Z3w8WW_triggerExtra",
1024
+ "policyRow": "Z3w8WW_policyRow"
1025
1025
  };
1026
1026
  //#endregion
1027
1027
  //#region src/client/CreateRoomDialog.tsx
@@ -1288,28 +1288,28 @@ window.__ModuleLoader__.load({
1288
1288
  document.head.appendChild(tag);
1289
1289
  }
1290
1290
  var InviteDialog_module_css_default = {
1291
- "chip": "r4uCba_chip",
1292
1291
  "rowHandle": "r4uCba_rowHandle",
1293
- "searchRow": "r4uCba_searchRow",
1294
- "chipName": "r4uCba_chipName",
1295
- "row": "r4uCba_row",
1296
- "field": "r4uCba_field",
1297
- "chips": "r4uCba_chips",
1292
+ "content": "r4uCba_content",
1298
1293
  "note": "r4uCba_note",
1294
+ "errorRow": "r4uCba_errorRow",
1299
1295
  "error": "r4uCba_error",
1300
- "check": "r4uCba_check",
1301
- "inviteSpin": "r4uCba_inviteSpin",
1302
- "content": "r4uCba_content",
1303
- "search": "r4uCba_search",
1304
- "visuallyHidden": "r4uCba_visuallyHidden",
1305
- "spinner": "r4uCba_spinner",
1306
- "dialog": "r4uCba_dialog",
1307
1296
  "checkHidden": "r4uCba_checkHidden",
1308
- "errorRow": "r4uCba_errorRow",
1297
+ "chipName": "r4uCba_chipName",
1309
1298
  "chipRemove": "r4uCba_chipRemove",
1299
+ "list": "r4uCba_list",
1300
+ "searchRow": "r4uCba_searchRow",
1301
+ "dialog": "r4uCba_dialog",
1302
+ "visuallyHidden": "r4uCba_visuallyHidden",
1303
+ "inviteSpin": "r4uCba_inviteSpin",
1304
+ "field": "r4uCba_field",
1310
1305
  "rowName": "r4uCba_rowName",
1306
+ "check": "r4uCba_check",
1307
+ "row": "r4uCba_row",
1311
1308
  "rowSelected": "r4uCba_rowSelected",
1312
- "list": "r4uCba_list"
1309
+ "chip": "r4uCba_chip",
1310
+ "spinner": "r4uCba_spinner",
1311
+ "search": "r4uCba_search",
1312
+ "chips": "r4uCba_chips"
1313
1313
  };
1314
1314
  //#endregion
1315
1315
  //#region src/client/RoomDialogs.tsx
@@ -1926,66 +1926,66 @@ window.__ModuleLoader__.load({
1926
1926
  document.head.appendChild(tag);
1927
1927
  }
1928
1928
  var SidebarRooms_module_css_default = {
1929
- "discoverMeta": "s0QgKq_discoverMeta",
1930
- "root": "s0QgKq_root",
1931
- "joinButton": "s0QgKq_joinButton",
1929
+ "hitHead": "s0QgKq_hitHead",
1932
1930
  "sectionHeader": "s0QgKq_sectionHeader",
1933
- "menuHeading": "s0QgKq_menuHeading",
1934
- "discoverHeading": "s0QgKq_discoverHeading",
1935
- "railButton": "s0QgKq_railButton",
1936
- "searchButton": "s0QgKq_searchButton",
1937
- "searchExpanded": "s0QgKq_searchExpanded",
1938
- "check": "s0QgKq_check",
1939
1931
  "rowWrap": "s0QgKq_rowWrap",
1932
+ "searchSlotExpanded": "s0QgKq_searchSlotExpanded",
1933
+ "clearButton": "s0QgKq_clearButton",
1934
+ "searchButton": "s0QgKq_searchButton",
1935
+ "visuallyHidden": "s0QgKq_visuallyHidden",
1936
+ "unreadMentioned": "s0QgKq_unreadMentioned",
1937
+ "searchSlot": "s0QgKq_searchSlot",
1938
+ "fade": "s0QgKq_fade",
1939
+ "leaveBody": "s0QgKq_leaveBody",
1940
+ "time": "s0QgKq_time",
1941
+ "root": "s0QgKq_root",
1940
1942
  "leaveConfirmDanger": "s0QgKq_leaveConfirmDanger",
1941
- "menu": "s0QgKq_menu",
1942
1943
  "hit": "s0QgKq_hit",
1943
- "discoverName": "s0QgKq_discoverName",
1944
- "fade": "s0QgKq_fade",
1945
- "flatList": "s0QgKq_flatList",
1946
- "searchSlotExpanded": "s0QgKq_searchSlotExpanded",
1944
+ "hitText": "s0QgKq_hitText",
1945
+ "menu": "s0QgKq_menu",
1946
+ "leaveCopy": "s0QgKq_leaveCopy",
1947
1947
  "hitAuthor": "s0QgKq_hitAuthor",
1948
- "menuItem": "s0QgKq_menuItem",
1949
- "time": "s0QgKq_time",
1948
+ "discoverSection": "s0QgKq_discoverSection",
1949
+ "searchInput": "s0QgKq_searchInput",
1950
+ "sessionRow": "s0QgKq_sessionRow",
1951
+ "leaveError": "s0QgKq_leaveError",
1950
1952
  "unread": "s0QgKq_unread",
1953
+ "search": "s0QgKq_search",
1954
+ "sectionLabel": "s0QgKq_sectionLabel",
1955
+ "menuHeading": "s0QgKq_menuHeading",
1956
+ "hitRoom": "s0QgKq_hitRoom",
1957
+ "discoverRow": "s0QgKq_discoverRow",
1958
+ "menuInline": "s0QgKq_menuInline",
1959
+ "hitHint": "s0QgKq_hitHint",
1960
+ "searchExpanded": "s0QgKq_searchExpanded",
1961
+ "menuItem": "s0QgKq_menuItem",
1962
+ "emptyState": "s0QgKq_emptyState",
1963
+ "resizer": "s0QgKq_resizer",
1964
+ "check": "s0QgKq_check",
1965
+ "menuCancel": "s0QgKq_menuCancel",
1966
+ "menuInput": "s0QgKq_menuInput",
1967
+ "menuRename": "s0QgKq_menuRename",
1968
+ "hitList": "s0QgKq_hitList",
1951
1969
  "viewWrap": "s0QgKq_viewWrap",
1952
- "list": "s0QgKq_list",
1970
+ "title": "s0QgKq_title",
1971
+ "listArea": "s0QgKq_listArea",
1972
+ "sessionRowSelected": "s0QgKq_sessionRowSelected",
1973
+ "menuActions": "s0QgKq_menuActions",
1953
1974
  "menuLayer": "s0QgKq_menuLayer",
1954
- "menuConfirm": "s0QgKq_menuConfirm",
1975
+ "iconButton": "s0QgKq_iconButton",
1955
1976
  "headerActions": "s0QgKq_headerActions",
1956
- "visuallyHidden": "s0QgKq_visuallyHidden",
1957
- "unreadMentioned": "s0QgKq_unreadMentioned",
1958
1977
  "leaveRoomName": "s0QgKq_leaveRoomName",
1959
- "iconButton": "s0QgKq_iconButton",
1978
+ "list": "s0QgKq_list",
1979
+ "menuConfirm": "s0QgKq_menuConfirm",
1980
+ "discoverName": "s0QgKq_discoverName",
1960
1981
  "mark": "s0QgKq_mark",
1961
- "sessionRowSelected": "s0QgKq_sessionRowSelected",
1962
- "discoverSection": "s0QgKq_discoverSection",
1963
- "clearButton": "s0QgKq_clearButton",
1964
- "menuCancel": "s0QgKq_menuCancel",
1982
+ "railButton": "s0QgKq_railButton",
1965
1983
  "footer": "s0QgKq_footer",
1984
+ "discoverMeta": "s0QgKq_discoverMeta",
1985
+ "joinButton": "s0QgKq_joinButton",
1986
+ "flatList": "s0QgKq_flatList",
1966
1987
  "rowIcon": "s0QgKq_rowIcon",
1967
- "emptyState": "s0QgKq_emptyState",
1968
- "leaveError": "s0QgKq_leaveError",
1969
- "title": "s0QgKq_title",
1970
- "hitRoom": "s0QgKq_hitRoom",
1971
- "resizer": "s0QgKq_resizer",
1972
- "sectionLabel": "s0QgKq_sectionLabel",
1973
- "menuRename": "s0QgKq_menuRename",
1974
- "sessionRow": "s0QgKq_sessionRow",
1975
- "searchSlot": "s0QgKq_searchSlot",
1976
- "menuInput": "s0QgKq_menuInput",
1977
- "searchInput": "s0QgKq_searchInput",
1978
- "hitText": "s0QgKq_hitText",
1979
- "menuInline": "s0QgKq_menuInline",
1980
- "hitList": "s0QgKq_hitList",
1981
- "menuActions": "s0QgKq_menuActions",
1982
- "leaveCopy": "s0QgKq_leaveCopy",
1983
- "listArea": "s0QgKq_listArea",
1984
- "hitHead": "s0QgKq_hitHead",
1985
- "search": "s0QgKq_search",
1986
- "discoverRow": "s0QgKq_discoverRow",
1987
- "leaveBody": "s0QgKq_leaveBody",
1988
- "hitHint": "s0QgKq_hitHint",
1988
+ "discoverHeading": "s0QgKq_discoverHeading",
1989
1989
  "empty": "s0QgKq_empty"
1990
1990
  };
1991
1991
  //#endregion
@@ -3079,20 +3079,20 @@ window.__ModuleLoader__.load({
3079
3079
  document.head.appendChild(tag);
3080
3080
  }
3081
3081
  var MessageSide_module_css_default = {
3082
- "rowActionsSelf": "KXabfq_rowActionsSelf",
3083
- "quoteBody": "KXabfq_quoteBody",
3084
- "author": "KXabfq_author",
3085
- "otherRow": "KXabfq_otherRow",
3086
3082
  "selfRow": "KXabfq_selfRow",
3087
- "rowBody": "KXabfq_rowBody",
3088
3083
  "quoteBar": "KXabfq_quoteBar",
3089
- "rowActions": "KXabfq_rowActions",
3090
- "replyButton": "KXabfq_replyButton",
3091
3084
  "selfBody": "KXabfq_selfBody",
3092
3085
  "authorName": "KXabfq_authorName",
3086
+ "rowActionsSelf": "KXabfq_rowActionsSelf",
3087
+ "quoteBody": "KXabfq_quoteBody",
3093
3088
  "quoteText": "KXabfq_quoteText",
3089
+ "rowActions": "KXabfq_rowActions",
3090
+ "author": "KXabfq_author",
3091
+ "quoteMark": "KXabfq_quoteMark",
3092
+ "rowBody": "KXabfq_rowBody",
3093
+ "replyButton": "KXabfq_replyButton",
3094
3094
  "quoteAuthor": "KXabfq_quoteAuthor",
3095
- "quoteMark": "KXabfq_quoteMark"
3095
+ "otherRow": "KXabfq_otherRow"
3096
3096
  };
3097
3097
  //#endregion
3098
3098
  //#region src/client/MessageSide.tsx
@@ -3383,46 +3383,46 @@ window.__ModuleLoader__.load({
3383
3383
  document.head.appendChild(tag);
3384
3384
  }
3385
3385
  var MembersPanel_module_css_default = {
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",
3393
- "editor": "VeQVAa_editor",
3394
- "sectionToggle": "VeQVAa_sectionToggle",
3386
+ "linkButton": "VeQVAa_linkButton",
3387
+ "fileIcon": "VeQVAa_fileIcon",
3395
3388
  "name": "VeQVAa_name",
3396
- "sectionLabel": "VeQVAa_sectionLabel",
3397
- "caret": "VeQVAa_caret",
3398
- "notice": "VeQVAa_notice",
3399
- "row": "VeQVAa_row",
3389
+ "hint": "VeQVAa_hint",
3390
+ "crumb": "VeQVAa_crumb",
3391
+ "crumbSep": "VeQVAa_crumbSep",
3392
+ "fileSize": "VeQVAa_fileSize",
3393
+ "editorFooter": "VeQVAa_editorFooter",
3394
+ "sectionHeader": "VeQVAa_sectionHeader",
3395
+ "count": "VeQVAa_count",
3400
3396
  "refresh": "VeQVAa_refresh",
3401
- "preview": "VeQVAa_preview",
3397
+ "section": "VeQVAa_section",
3398
+ "row": "VeQVAa_row",
3399
+ "list": "VeQVAa_list",
3402
3400
  "previewTitle": "VeQVAa_previewTitle",
3403
- "fileSize": "VeQVAa_fileSize",
3404
- "search": "VeQVAa_search",
3405
- "crumbGroup": "VeQVAa_crumbGroup",
3406
- "unavailable": "VeQVAa_unavailable",
3407
- "fileIcon": "VeQVAa_fileIcon",
3401
+ "previewClose": "VeQVAa_previewClose",
3402
+ "sectionLabel": "VeQVAa_sectionLabel",
3408
3403
  "previewImage": "VeQVAa_previewImage",
3409
- "list": "VeQVAa_list",
3410
- "filePicker": "VeQVAa_filePicker",
3411
- "hint": "VeQVAa_hint",
3412
- "count": "VeQVAa_count",
3413
3404
  "selfTag": "VeQVAa_selfTag",
3414
- "section": "VeQVAa_section",
3415
- "previewBody": "VeQVAa_previewBody",
3416
- "crumbSep": "VeQVAa_crumbSep",
3417
3405
  "root": "VeQVAa_root",
3418
- "sectionHeader": "VeQVAa_sectionHeader",
3419
- "editorFooter": "VeQVAa_editorFooter",
3420
- "linkButton": "VeQVAa_linkButton",
3421
- "crumbs": "VeQVAa_crumbs",
3406
+ "searchToggle": "VeQVAa_searchToggle",
3407
+ "editor": "VeQVAa_editor",
3408
+ "ownerTag": "VeQVAa_ownerTag",
3409
+ "search": "VeQVAa_search",
3410
+ "announcementText": "VeQVAa_announcementText",
3422
3411
  "fileButton": "VeQVAa_fileButton",
3423
- "remove": "VeQVAa_remove",
3424
3412
  "sectionBody": "VeQVAa_sectionBody",
3425
- "ownerTag": "VeQVAa_ownerTag"
3413
+ "previewHeader": "VeQVAa_previewHeader",
3414
+ "sectionToggle": "VeQVAa_sectionToggle",
3415
+ "remove": "VeQVAa_remove",
3416
+ "previewBody": "VeQVAa_previewBody",
3417
+ "notice": "VeQVAa_notice",
3418
+ "crumbGroup": "VeQVAa_crumbGroup",
3419
+ "error": "VeQVAa_error",
3420
+ "textarea": "VeQVAa_textarea",
3421
+ "caret": "VeQVAa_caret",
3422
+ "unavailable": "VeQVAa_unavailable",
3423
+ "filePicker": "VeQVAa_filePicker",
3424
+ "preview": "VeQVAa_preview",
3425
+ "crumbs": "VeQVAa_crumbs"
3426
3426
  };
3427
3427
  //#endregion
3428
3428
  //#region src/client/MembersPanel.tsx
@@ -4045,10 +4045,10 @@ window.__ModuleLoader__.load({
4045
4045
  document.head.appendChild(tag);
4046
4046
  }
4047
4047
  var GuideEntry_module_css_default = {
4048
- "title": "_0Vnsuq_title",
4049
- "text": "_0Vnsuq_text",
4050
4048
  "icon": "_0Vnsuq_icon",
4049
+ "text": "_0Vnsuq_text",
4051
4050
  "entry": "_0Vnsuq_entry",
4051
+ "title": "_0Vnsuq_title",
4052
4052
  "description": "_0Vnsuq_description"
4053
4053
  };
4054
4054
  //#endregion
@@ -4116,13 +4116,13 @@ window.__ModuleLoader__.load({
4116
4116
  document.head.appendChild(tag);
4117
4117
  }
4118
4118
  var QuoteComposer_module_css_default = {
4119
- "author": "AK6KxW_author",
4120
- "bar": "AK6KxW_bar",
4121
- "text": "AK6KxW_text",
4122
- "body": "AK6KxW_body",
4123
4119
  "dismiss": "AK6KxW_dismiss",
4120
+ "button": "AK6KxW_button",
4121
+ "body": "AK6KxW_body",
4122
+ "author": "AK6KxW_author",
4124
4123
  "mark": "AK6KxW_mark",
4125
- "button": "AK6KxW_button"
4124
+ "text": "AK6KxW_text",
4125
+ "bar": "AK6KxW_bar"
4126
4126
  };
4127
4127
  //#endregion
4128
4128
  //#region src/client/QuoteComposer.tsx
@@ -4197,9 +4197,9 @@ window.__ModuleLoader__.load({
4197
4197
  * @module @sparkelf/dsh-group-chat/client/messageReference
4198
4198
  */
4199
4199
  /** Unique source name; duplicate `(trigger, name)` pairs throw at registration. */
4200
- const SOURCE_NAME = "@sparkelf/dsh-group-chat/message";
4200
+ const SOURCE_NAME$1 = "@sparkelf/dsh-group-chat/message";
4201
4201
  /** How many messages the menu offers at once. */
4202
- const MAX_CANDIDATES = 20;
4202
+ const MAX_CANDIDATES$1 = 20;
4203
4203
  /** How much of a message the menu row and the chip label show. */
4204
4204
  const LABEL_CHARS = 28;
4205
4205
  /**
@@ -4255,7 +4255,7 @@ window.__ModuleLoader__.load({
4255
4255
  const registerMessageSource = (inputTriggers, store) => {
4256
4256
  const source = {
4257
4257
  trigger: "@",
4258
- name: SOURCE_NAME,
4258
+ name: SOURCE_NAME$1,
4259
4259
  order: 30,
4260
4260
  showGroupTitle: true,
4261
4261
  async candidates(_session, request) {
@@ -4277,7 +4277,7 @@ window.__ModuleLoader__.load({
4277
4277
  icon: "session",
4278
4278
  value: row.ref
4279
4279
  });
4280
- if (out.length >= MAX_CANDIDATES) break;
4280
+ if (out.length >= MAX_CANDIDATES$1) break;
4281
4281
  }
4282
4282
  return out;
4283
4283
  },
@@ -4287,7 +4287,7 @@ window.__ModuleLoader__.load({
4287
4287
  const found = resolved.get(ref);
4288
4288
  if (found === void 0) return void 0;
4289
4289
  return { insert: {
4290
- source: SOURCE_NAME,
4290
+ source: SOURCE_NAME$1,
4291
4291
  ref,
4292
4292
  label: found.label,
4293
4293
  appearance: "session",
@@ -4310,6 +4310,115 @@ window.__ModuleLoader__.load({
4310
4310
  return inputTriggers.registerSource(source);
4311
4311
  };
4312
4312
  //#endregion
4313
+ //#region src/reference-ids.ts
4314
+ /**
4315
+ * Trigger-source identities shared by both halves of the package.
4316
+ *
4317
+ * The composer declares a mention with the source that produced the chip, and the Host routes
4318
+ * only the ids that source owns, so the string is a contract rather than a label. It lives here
4319
+ * so the client bundle and the host bundle cannot drift apart.
4320
+ *
4321
+ * @module @sparkelf/dsh-group-chat/reference-ids
4322
+ */
4323
+ /** The `@` source whose picks are roster members. */
4324
+ const MEMBER_MENTION_SOURCE = "@sparkelf/dsh-group-chat/member";
4325
+ //#endregion
4326
+ //#region src/client/mentionSource.ts
4327
+ /**
4328
+ * Build the member source for one room.
4329
+ * @param members - the room roster.
4330
+ * @param selfId - the caller's account id, excluded because mentioning yourself is not a way
4331
+ * to notify anyone; the host's self-mention route handles waking the agent separately.
4332
+ * @returns id/name/avatar rows in roster order.
4333
+ */
4334
+ function mentionSourceOf(members, selfId) {
4335
+ return members.filter((member) => member.userId !== selfId).map((member) => ({
4336
+ id: member.userId,
4337
+ displayName: member.displayName.trim() === "" ? member.userId : member.displayName,
4338
+ ...member.avatarUrl === void 0 || member.avatarUrl === null || member.avatarUrl === "" ? {} : { avatarUrl: member.avatarUrl }
4339
+ }));
4340
+ }
4341
+ //#endregion
4342
+ //#region src/client/memberReference.ts
4343
+ /**
4344
+ * Room members as `@` mentions in the composer.
4345
+ *
4346
+ * The `@` menu is a multi-source pipeline: every source owns one group, and a pick becomes an
4347
+ * official inline chip. A member is picked the same way a room message is, but the chip declares
4348
+ * itself with `appearance: 'mention'`, which is what makes the composer hand the picked ids to the
4349
+ * Host as `prompt.mentions` instead of leaving them to be re-parsed out of the prompt text. The
4350
+ * Host's routing reads ids by design ("never parsed out of message text"): text parsing would
4351
+ * misread a code sample containing `@` and would let any message smuggle itself into an execution
4352
+ * path.
4353
+ *
4354
+ * The group appears only in a room: `candidates` answers an empty list everywhere else, and an
4355
+ * empty group closes itself, so a normal session's `@` menu is unchanged.
4356
+ *
4357
+ * @module @sparkelf/dsh-group-chat/client/memberReference
4358
+ */
4359
+ /** Unique source name; duplicate `(trigger, name)` pairs throw at registration. */
4360
+ const SOURCE_NAME = MEMBER_MENTION_SOURCE;
4361
+ /** How many members the menu offers at once. */
4362
+ const MAX_CANDIDATES = 20;
4363
+ /** Reference id → the display name the chip and the clipboard need. */
4364
+ const names = /* @__PURE__ */ new Map();
4365
+ /**
4366
+ * Registers the room-member mention source.
4367
+ *
4368
+ * @param inputTriggers - the trigger pipeline service (`ctx.get('inputTriggers')`).
4369
+ * @param store - room store, read for the room the composer is writing into.
4370
+ * @returns the disposer.
4371
+ */
4372
+ const registerMemberSource = (inputTriggers, store) => {
4373
+ const source = {
4374
+ trigger: "@",
4375
+ name: SOURCE_NAME,
4376
+ order: 20,
4377
+ showGroupTitle: true,
4378
+ async candidates(_session, request) {
4379
+ const roomId = store.getState().activeRoomId;
4380
+ if (roomId === void 0) return [];
4381
+ const members = await listMembers(roomId);
4382
+ const roster = mentionSourceOf(members);
4383
+ const owners = new Set(members.filter((member) => member.owner).map((member) => member.userId));
4384
+ const needle = request.query.trim().toLowerCase();
4385
+ const out = [];
4386
+ for (const member of roster) {
4387
+ if (request.signal.aborted) break;
4388
+ if (needle.length > 0 && !member.displayName.toLowerCase().includes(needle)) continue;
4389
+ names.set(member.id, member.displayName);
4390
+ out.push({
4391
+ name: member.displayName,
4392
+ ...owners.has(member.id) ? { description: "群主" } : {},
4393
+ icon: "mention",
4394
+ value: member.id
4395
+ });
4396
+ if (out.length >= MAX_CANDIDATES) break;
4397
+ }
4398
+ return out;
4399
+ },
4400
+ onPick(pick) {
4401
+ const memberId = pick.candidate.value;
4402
+ if (memberId === void 0) return void 0;
4403
+ const name = names.get(memberId) ?? pick.candidate.name;
4404
+ return { insert: {
4405
+ source: SOURCE_NAME,
4406
+ ref: memberId,
4407
+ label: name,
4408
+ appearance: "mention",
4409
+ clipboardText: `@${name}`
4410
+ } };
4411
+ },
4412
+ codec: {
4413
+ /** What lands in the draft and the clipboard: the human-facing mention. */
4414
+ clipboardText: (ref) => `@${names.get(ref) ?? ref}`,
4415
+ /** What the model reads in place of the chip. The id rides the prompt's `mentions`. */
4416
+ serialize: (ref) => Promise.resolve(`@${names.get(ref) ?? ref}`)
4417
+ }
4418
+ };
4419
+ return inputTriggers.registerSource(source);
4420
+ };
4421
+ //#endregion
4313
4422
  //#region src/client/locales.ts
4314
4423
  /**
4315
4424
  * Group-chat copy, in the shape every locale-backed DSH client plugin uses: one
@@ -4992,7 +5101,10 @@ window.__ModuleLoader__.load({
4992
5101
  };
4993
5102
  });
4994
5103
  const inputTriggers = ctx.get("inputTriggers");
4995
- if (inputTriggers !== void 0) ctx.effect(() => registerMessageSource(inputTriggers, store));
5104
+ if (inputTriggers !== void 0) {
5105
+ ctx.effect(() => registerMessageSource(inputTriggers, store));
5106
+ ctx.effect(() => registerMemberSource(inputTriggers, store));
5107
+ }
4996
5108
  ctx.effect(() => ctx.slots.inject("conversation.input.dock", () => ctx.slots.register({
4997
5109
  name: "conversation.input.dock",
4998
5110
  id: QUOTE_DOCK_ID,