@khorsheed/dsh-room 0.2.4 → 0.2.5

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.
Files changed (45) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/lib/client.js +2256 -1074
  3. package/lib/index.js +548 -36
  4. package/lib/typert.host.js +249 -65
  5. package/lib/typert.remote-client.d.ts +4 -1
  6. package/lib/typert.remote-client.js +208 -53
  7. package/lib/types/client/InviteDialog.js +11 -4
  8. package/lib/types/client/RoomAttachments.d.ts +20 -0
  9. package/lib/types/client/RoomAttachments.js +36 -0
  10. package/lib/types/client/RoomComposer.d.ts +6 -12
  11. package/lib/types/client/RoomComposer.js +116 -12
  12. package/lib/types/client/RoomQuestionView.d.ts +10 -2
  13. package/lib/types/client/RoomQuestionView.js +18 -5
  14. package/lib/types/client/RoomRunView.d.ts +1 -1
  15. package/lib/types/client/RoomRunView.js +15 -5
  16. package/lib/types/client/RoomSpeechView.d.ts +24 -1
  17. package/lib/types/client/RoomSpeechView.js +39 -3
  18. package/lib/types/client/RoomStatsLine.d.ts +3 -1
  19. package/lib/types/client/RoomStatsLine.js +3 -1
  20. package/lib/types/client/RoomTaskCapsule.d.ts +6 -1
  21. package/lib/types/client/RoomTaskCapsule.js +2 -2
  22. package/lib/types/client/TasksView.js +1 -1
  23. package/lib/types/client/TeamView.js +1 -1
  24. package/lib/types/client/icons.d.ts +2 -1
  25. package/lib/types/client/icons.js +1 -0
  26. package/lib/types/client/index.js +94 -15
  27. package/lib/types/client/locales.d.ts +44 -0
  28. package/lib/types/client/locales.js +44 -0
  29. package/lib/types/client/nodes.d.ts +22 -3
  30. package/lib/types/client/nodes.js +28 -5
  31. package/lib/types/client/path-mentions.d.ts +34 -0
  32. package/lib/types/client/path-mentions.js +39 -0
  33. package/lib/types/client/slots.d.ts +51 -1
  34. package/lib/types/dispatch.d.ts +50 -0
  35. package/lib/types/dispatch.js +115 -1
  36. package/lib/types/index.d.ts +69 -1
  37. package/lib/types/index.js +362 -20
  38. package/lib/types/jobs.js +7 -3
  39. package/lib/types/journal.d.ts +1 -1
  40. package/lib/types/journal.js +18 -2
  41. package/lib/types/types.d.ts +77 -0
  42. package/package.json +10 -6
  43. package/lib/journal-B4FOGO6S.js +0 -482
  44. package/lib/journal-BWL3-i0s.js +0 -462
  45. package/lib/journal-Rid9AAnD.js +0 -485
package/lib/client.js CHANGED
@@ -18846,7 +18846,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18846
18846
  xor: () => xor
18847
18847
  });
18848
18848
  //#endregion
18849
- //#region ../../node_modules/.pnpm/@deepseek-ai+dsh-typert-protocol@0.2.1-rc.1_@deepseek-ai+cordis@4.0.4/node_modules/@deepseek-ai/dsh-typert-protocol/lib/types/remote-info.js
18849
+ //#region ../../node_modules/.pnpm/@deepseek-ai+dsh-typert-protocol@0.2.1-rc.3_@deepseek-ai+cordis@4.0.4/node_modules/@deepseek-ai/dsh-typert-protocol/lib/types/remote-info.js
18850
18850
  /** Lazy assembly of generated Remote definitions using caller-supplied Zod; no runtime imports. */
18851
18851
  /**
18852
18852
  * Retain one generated definition per endpoint without constructing parsers or projections.
@@ -19043,6 +19043,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
19043
19043
  object({ "code": literal("empty-provider").readonly() }),
19044
19044
  object({ "code": literal("member-not-found").readonly() }),
19045
19045
  object({ "code": literal("empty-text").readonly() }),
19046
+ object({
19047
+ "code": literal("attachment-invalid").readonly(),
19048
+ "message": string$1().readonly()
19049
+ }),
19046
19050
  object({ "code": literal("role-too-long").readonly() }),
19047
19051
  object({ "code": literal("invalid-settings").readonly() }),
19048
19052
  object({ "code": literal("self-message").readonly() }),
@@ -19111,6 +19115,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
19111
19115
  object({ "code": literal("empty-provider").readonly() }),
19112
19116
  object({ "code": literal("member-not-found").readonly() }),
19113
19117
  object({ "code": literal("empty-text").readonly() }),
19118
+ object({
19119
+ "code": literal("attachment-invalid").readonly(),
19120
+ "message": string$1().readonly()
19121
+ }),
19114
19122
  object({ "code": literal("role-too-long").readonly() }),
19115
19123
  object({ "code": literal("invalid-settings").readonly() }),
19116
19124
  object({ "code": literal("self-message").readonly() }),
@@ -19179,6 +19187,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
19179
19187
  object({ "code": literal("empty-provider").readonly() }),
19180
19188
  object({ "code": literal("member-not-found").readonly() }),
19181
19189
  object({ "code": literal("empty-text").readonly() }),
19190
+ object({
19191
+ "code": literal("attachment-invalid").readonly(),
19192
+ "message": string$1().readonly()
19193
+ }),
19182
19194
  object({ "code": literal("role-too-long").readonly() }),
19183
19195
  object({ "code": literal("invalid-settings").readonly() }),
19184
19196
  object({ "code": literal("self-message").readonly() }),
@@ -19245,6 +19257,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
19245
19257
  object({ "code": literal("empty-provider").readonly() }),
19246
19258
  object({ "code": literal("member-not-found").readonly() }),
19247
19259
  object({ "code": literal("empty-text").readonly() }),
19260
+ object({
19261
+ "code": literal("attachment-invalid").readonly(),
19262
+ "message": string$1().readonly()
19263
+ }),
19248
19264
  object({ "code": literal("role-too-long").readonly() }),
19249
19265
  object({ "code": literal("invalid-settings").readonly() }),
19250
19266
  object({ "code": literal("self-message").readonly() }),
@@ -19311,6 +19327,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
19311
19327
  object({ "code": literal("empty-provider").readonly() }),
19312
19328
  object({ "code": literal("member-not-found").readonly() }),
19313
19329
  object({ "code": literal("empty-text").readonly() }),
19330
+ object({
19331
+ "code": literal("attachment-invalid").readonly(),
19332
+ "message": string$1().readonly()
19333
+ }),
19314
19334
  object({ "code": literal("role-too-long").readonly() }),
19315
19335
  object({ "code": literal("invalid-settings").readonly() }),
19316
19336
  object({ "code": literal("self-message").readonly() }),
@@ -19375,6 +19395,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
19375
19395
  object({ "code": literal("empty-provider").readonly() }),
19376
19396
  object({ "code": literal("member-not-found").readonly() }),
19377
19397
  object({ "code": literal("empty-text").readonly() }),
19398
+ object({
19399
+ "code": literal("attachment-invalid").readonly(),
19400
+ "message": string$1().readonly()
19401
+ }),
19378
19402
  object({ "code": literal("role-too-long").readonly() }),
19379
19403
  object({ "code": literal("invalid-settings").readonly() }),
19380
19404
  object({ "code": literal("self-message").readonly() }),
@@ -19441,6 +19465,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
19441
19465
  object({ "code": literal("empty-provider").readonly() }),
19442
19466
  object({ "code": literal("member-not-found").readonly() }),
19443
19467
  object({ "code": literal("empty-text").readonly() }),
19468
+ object({
19469
+ "code": literal("attachment-invalid").readonly(),
19470
+ "message": string$1().readonly()
19471
+ }),
19444
19472
  object({ "code": literal("role-too-long").readonly() }),
19445
19473
  object({ "code": literal("invalid-settings").readonly() }),
19446
19474
  object({ "code": literal("self-message").readonly() }),
@@ -19481,6 +19509,34 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
19481
19509
  const _khorsheed_dsh_room_room_getState_result$schema = () => _khorsheed_dsh_room_room_getState_result$schema$value ??= union([object({
19482
19510
  "ok": literal(true).readonly(),
19483
19511
  "value": object({
19512
+ "askLog": array(object({
19513
+ "id": string$1().readonly(),
19514
+ "member": string$1().readonly(),
19515
+ "questions": array(object({
19516
+ "id": string$1().readonly(),
19517
+ "question": string$1().readonly(),
19518
+ "header": string$1().readonly().optional(),
19519
+ "options": array(object({
19520
+ "label": string$1().readonly(),
19521
+ "description": string$1().readonly().optional()
19522
+ })).readonly().optional(),
19523
+ "multiSelect": boolean$1().readonly().optional()
19524
+ })).readonly(),
19525
+ "state": union([
19526
+ literal("cancelled"),
19527
+ literal("pending"),
19528
+ literal("answered")
19529
+ ]).readonly(),
19530
+ "answers": array(object({
19531
+ "id": string$1().readonly(),
19532
+ "selected": array(string$1()).readonly(),
19533
+ "custom": string$1().readonly().optional()
19534
+ })).readonly().optional(),
19535
+ "late": literal(true).readonly().optional(),
19536
+ "consent": literal(true).readonly().optional(),
19537
+ "runId": string$1().readonly().optional(),
19538
+ "time": number$1().readonly()
19539
+ })).readonly().optional().describe("All question cards with their outcomes (inline blocks in run cards and replies)."),
19484
19540
  "executions": array(object({
19485
19541
  "id": string$1().readonly(),
19486
19542
  "memberId": string$1().readonly().optional(),
@@ -19782,13 +19838,14 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
19782
19838
  "id": string$1().readonly(),
19783
19839
  "time": number$1().readonly(),
19784
19840
  "text": string$1().readonly(),
19841
+ "from": string$1().readonly().optional(),
19785
19842
  "by": union([
19786
19843
  literal("model"),
19787
19844
  literal("human"),
19788
19845
  literal("coordinator")
19789
19846
  ]).readonly().optional(),
19790
19847
  "probability": number$1().readonly().optional()
19791
- })).readonly(),
19848
+ })).readonly().describe("`from`: the member id a member/coordinator dispatch came from; absent = the human."),
19792
19849
  "status": union([
19793
19850
  literal("running"),
19794
19851
  literal("stopped"),
@@ -19865,6 +19922,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
19865
19922
  object({ "code": literal("empty-provider").readonly() }),
19866
19923
  object({ "code": literal("member-not-found").readonly() }),
19867
19924
  object({ "code": literal("empty-text").readonly() }),
19925
+ object({
19926
+ "code": literal("attachment-invalid").readonly(),
19927
+ "message": string$1().readonly()
19928
+ }),
19868
19929
  object({ "code": literal("role-too-long").readonly() }),
19869
19930
  object({ "code": literal("invalid-settings").readonly() }),
19870
19931
  object({ "code": literal("self-message").readonly() }),
@@ -19946,6 +20007,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
19946
20007
  object({ "code": literal("empty-provider").readonly() }),
19947
20008
  object({ "code": literal("member-not-found").readonly() }),
19948
20009
  object({ "code": literal("empty-text").readonly() }),
20010
+ object({
20011
+ "code": literal("attachment-invalid").readonly(),
20012
+ "message": string$1().readonly()
20013
+ }),
19949
20014
  object({ "code": literal("role-too-long").readonly() }),
19950
20015
  object({ "code": literal("invalid-settings").readonly() }),
19951
20016
  object({ "code": literal("self-message").readonly() }),
@@ -20014,6 +20079,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
20014
20079
  object({ "code": literal("empty-provider").readonly() }),
20015
20080
  object({ "code": literal("member-not-found").readonly() }),
20016
20081
  object({ "code": literal("empty-text").readonly() }),
20082
+ object({
20083
+ "code": literal("attachment-invalid").readonly(),
20084
+ "message": string$1().readonly()
20085
+ }),
20017
20086
  object({ "code": literal("role-too-long").readonly() }),
20018
20087
  object({ "code": literal("invalid-settings").readonly() }),
20019
20088
  object({ "code": literal("self-message").readonly() }),
@@ -20068,6 +20137,14 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
20068
20137
  })).readonly().optional().describe("The host's agent presets a native DSH member may compose; absent when the composition mounts no preset registry (native members then run the plain composition)."),
20069
20138
  "sessionPreset": string$1().readonly().optional().describe("The requested session's own mode (preset id), when known: the dialog's default mode.")
20070
20139
  });
20140
+ let _khorsheed_dsh_room_room_pendingCards_parameter_0$schema$value;
20141
+ const _khorsheed_dsh_room_room_pendingCards_parameter_0$schema = () => _khorsheed_dsh_room_room_pendingCards_parameter_0$schema$value ??= object({ "sessionId": string$1().readonly().optional() });
20142
+ let _khorsheed_dsh_room_room_pendingCards_result$schema$value;
20143
+ const _khorsheed_dsh_room_room_pendingCards_result$schema = () => _khorsheed_dsh_room_room_pendingCards_result$schema$value ??= array(object({
20144
+ "sessionId": string$1().readonly(),
20145
+ "id": string$1().readonly(),
20146
+ "kind": union([literal("approval"), literal("question")]).readonly()
20147
+ }));
20071
20148
  let _khorsheed_dsh_room_room_planCommand_parameter_0$schema$value;
20072
20149
  const _khorsheed_dsh_room_room_planCommand_parameter_0$schema = () => _khorsheed_dsh_room_room_planCommand_parameter_0$schema$value ??= object({
20073
20150
  "sessionId": string$1(),
@@ -20084,7 +20161,16 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
20084
20161
  "sessionId": string$1().readonly().describe("Room session."),
20085
20162
  "text": string$1().readonly().describe("Raw composer text: leading `@name` tokens address members."),
20086
20163
  "targets": array(string$1()).readonly().optional().describe("Menu-picked addressees (the room composer's mention menu records a pick as explicit addressing even when the `@name` sits mid-sentence). Unioned with the parsed leading tokens and validated against the roster the same way; the text itself is dispatched verbatim either way."),
20087
- "task": string$1().readonly().optional().describe("The composer's task tag: `new` or a task root id (see RoomSetTaskHintRequest).")
20164
+ "task": string$1().readonly().optional().describe("The composer's task tag: `new` or a task root id (see RoomSetTaskHintRequest)."),
20165
+ "attachments": array(union([object({
20166
+ "type": literal("image").readonly(),
20167
+ "data": string$1().readonly(),
20168
+ "mediaType": string$1().readonly(),
20169
+ "name": string$1().readonly().optional()
20170
+ }), object({
20171
+ "type": literal("file").readonly(),
20172
+ "receiptId": string$1().readonly()
20173
+ })])).readonly().optional().describe("Draft attachments in the official composer's wire form: an image's base64 bytes, or a file's upload receipt (uploaded to this room session on pick). The host admits them into the human message; members get them by local path.")
20088
20174
  });
20089
20175
  let _khorsheed_dsh_room_room_postMessage_result$schema$value;
20090
20176
  const _khorsheed_dsh_room_room_postMessage_result$schema = () => _khorsheed_dsh_room_room_postMessage_result$schema$value ??= union([object({
@@ -20119,6 +20205,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
20119
20205
  object({ "code": literal("empty-provider").readonly() }),
20120
20206
  object({ "code": literal("member-not-found").readonly() }),
20121
20207
  object({ "code": literal("empty-text").readonly() }),
20208
+ object({
20209
+ "code": literal("attachment-invalid").readonly(),
20210
+ "message": string$1().readonly()
20211
+ }),
20122
20212
  object({ "code": literal("role-too-long").readonly() }),
20123
20213
  object({ "code": literal("invalid-settings").readonly() }),
20124
20214
  object({ "code": literal("self-message").readonly() }),
@@ -20185,6 +20275,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
20185
20275
  object({ "code": literal("empty-provider").readonly() }),
20186
20276
  object({ "code": literal("member-not-found").readonly() }),
20187
20277
  object({ "code": literal("empty-text").readonly() }),
20278
+ object({
20279
+ "code": literal("attachment-invalid").readonly(),
20280
+ "message": string$1().readonly()
20281
+ }),
20188
20282
  object({ "code": literal("role-too-long").readonly() }),
20189
20283
  object({ "code": literal("invalid-settings").readonly() }),
20190
20284
  object({ "code": literal("self-message").readonly() }),
@@ -20250,6 +20344,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
20250
20344
  object({ "code": literal("empty-provider").readonly() }),
20251
20345
  object({ "code": literal("member-not-found").readonly() }),
20252
20346
  object({ "code": literal("empty-text").readonly() }),
20347
+ object({
20348
+ "code": literal("attachment-invalid").readonly(),
20349
+ "message": string$1().readonly()
20350
+ }),
20253
20351
  object({ "code": literal("role-too-long").readonly() }),
20254
20352
  object({ "code": literal("invalid-settings").readonly() }),
20255
20353
  object({ "code": literal("self-message").readonly() }),
@@ -20316,6 +20414,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
20316
20414
  object({ "code": literal("empty-provider").readonly() }),
20317
20415
  object({ "code": literal("member-not-found").readonly() }),
20318
20416
  object({ "code": literal("empty-text").readonly() }),
20417
+ object({
20418
+ "code": literal("attachment-invalid").readonly(),
20419
+ "message": string$1().readonly()
20420
+ }),
20319
20421
  object({ "code": literal("role-too-long").readonly() }),
20320
20422
  object({ "code": literal("invalid-settings").readonly() }),
20321
20423
  object({ "code": literal("self-message").readonly() }),
@@ -20387,6 +20489,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
20387
20489
  object({ "code": literal("empty-provider").readonly() }),
20388
20490
  object({ "code": literal("member-not-found").readonly() }),
20389
20491
  object({ "code": literal("empty-text").readonly() }),
20492
+ object({
20493
+ "code": literal("attachment-invalid").readonly(),
20494
+ "message": string$1().readonly()
20495
+ }),
20390
20496
  object({ "code": literal("role-too-long").readonly() }),
20391
20497
  object({ "code": literal("invalid-settings").readonly() }),
20392
20498
  object({ "code": literal("self-message").readonly() }),
@@ -20453,6 +20559,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
20453
20559
  object({ "code": literal("empty-provider").readonly() }),
20454
20560
  object({ "code": literal("member-not-found").readonly() }),
20455
20561
  object({ "code": literal("empty-text").readonly() }),
20562
+ object({
20563
+ "code": literal("attachment-invalid").readonly(),
20564
+ "message": string$1().readonly()
20565
+ }),
20456
20566
  object({ "code": literal("role-too-long").readonly() }),
20457
20567
  object({ "code": literal("invalid-settings").readonly() }),
20458
20568
  object({ "code": literal("self-message").readonly() }),
@@ -20526,6 +20636,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
20526
20636
  object({ "code": literal("empty-provider").readonly() }),
20527
20637
  object({ "code": literal("member-not-found").readonly() }),
20528
20638
  object({ "code": literal("empty-text").readonly() }),
20639
+ object({
20640
+ "code": literal("attachment-invalid").readonly(),
20641
+ "message": string$1().readonly()
20642
+ }),
20529
20643
  object({ "code": literal("role-too-long").readonly() }),
20530
20644
  object({ "code": literal("invalid-settings").readonly() }),
20531
20645
  object({ "code": literal("self-message").readonly() }),
@@ -20592,6 +20706,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
20592
20706
  object({ "code": literal("empty-provider").readonly() }),
20593
20707
  object({ "code": literal("member-not-found").readonly() }),
20594
20708
  object({ "code": literal("empty-text").readonly() }),
20709
+ object({
20710
+ "code": literal("attachment-invalid").readonly(),
20711
+ "message": string$1().readonly()
20712
+ }),
20595
20713
  object({ "code": literal("role-too-long").readonly() }),
20596
20714
  object({ "code": literal("invalid-settings").readonly() }),
20597
20715
  object({ "code": literal("self-message").readonly() }),
@@ -20674,6 +20792,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
20674
20792
  object({ "code": literal("empty-provider").readonly() }),
20675
20793
  object({ "code": literal("member-not-found").readonly() }),
20676
20794
  object({ "code": literal("empty-text").readonly() }),
20795
+ object({
20796
+ "code": literal("attachment-invalid").readonly(),
20797
+ "message": string$1().readonly()
20798
+ }),
20677
20799
  object({ "code": literal("role-too-long").readonly() }),
20678
20800
  object({ "code": literal("invalid-settings").readonly() }),
20679
20801
  object({ "code": literal("self-message").readonly() }),
@@ -20747,6 +20869,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
20747
20869
  object({ "code": literal("empty-provider").readonly() }),
20748
20870
  object({ "code": literal("member-not-found").readonly() }),
20749
20871
  object({ "code": literal("empty-text").readonly() }),
20872
+ object({
20873
+ "code": literal("attachment-invalid").readonly(),
20874
+ "message": string$1().readonly()
20875
+ }),
20750
20876
  object({ "code": literal("role-too-long").readonly() }),
20751
20877
  object({ "code": literal("invalid-settings").readonly() }),
20752
20878
  object({ "code": literal("self-message").readonly() }),
@@ -20811,6 +20937,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
20811
20937
  object({ "code": literal("empty-provider").readonly() }),
20812
20938
  object({ "code": literal("member-not-found").readonly() }),
20813
20939
  object({ "code": literal("empty-text").readonly() }),
20940
+ object({
20941
+ "code": literal("attachment-invalid").readonly(),
20942
+ "message": string$1().readonly()
20943
+ }),
20814
20944
  object({ "code": literal("role-too-long").readonly() }),
20815
20945
  object({ "code": literal("invalid-settings").readonly() }),
20816
20946
  object({ "code": literal("self-message").readonly() }),
@@ -20883,6 +21013,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
20883
21013
  object({ "code": literal("empty-provider").readonly() }),
20884
21014
  object({ "code": literal("member-not-found").readonly() }),
20885
21015
  object({ "code": literal("empty-text").readonly() }),
21016
+ object({
21017
+ "code": literal("attachment-invalid").readonly(),
21018
+ "message": string$1().readonly()
21019
+ }),
20886
21020
  object({ "code": literal("role-too-long").readonly() }),
20887
21021
  object({ "code": literal("invalid-settings").readonly() }),
20888
21022
  object({ "code": literal("self-message").readonly() }),
@@ -20989,6 +21123,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
20989
21123
  });
20990
21124
  let _khorsheed_dsh_room_room_listProviders_parameter_0_strict$schema$value;
20991
21125
  const _khorsheed_dsh_room_room_listProviders_parameter_0_strict$schema = () => _khorsheed_dsh_room_room_listProviders_parameter_0_strict$schema$value ??= strictObject({ "sessionId": string$1().readonly().optional().describe("The session the invite is for: the result then carries its mode (`sessionPreset`).") });
21126
+ let _khorsheed_dsh_room_room_pendingCards_parameter_0_strict$schema$value;
21127
+ const _khorsheed_dsh_room_room_pendingCards_parameter_0_strict$schema = () => _khorsheed_dsh_room_room_pendingCards_parameter_0_strict$schema$value ??= strictObject({ "sessionId": string$1().readonly().optional() });
20992
21128
  let _khorsheed_dsh_room_room_planCommand_parameter_0_strict$schema$value;
20993
21129
  const _khorsheed_dsh_room_room_planCommand_parameter_0_strict$schema = () => _khorsheed_dsh_room_room_planCommand_parameter_0_strict$schema$value ??= strictObject({
20994
21130
  "sessionId": string$1(),
@@ -21000,7 +21136,16 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
21000
21136
  "sessionId": string$1().readonly().describe("Room session."),
21001
21137
  "text": string$1().readonly().describe("Raw composer text: leading `@name` tokens address members."),
21002
21138
  "targets": array(string$1()).readonly().optional().describe("Menu-picked addressees (the room composer's mention menu records a pick as explicit addressing even when the `@name` sits mid-sentence). Unioned with the parsed leading tokens and validated against the roster the same way; the text itself is dispatched verbatim either way."),
21003
- "task": string$1().readonly().optional().describe("The composer's task tag: `new` or a task root id (see RoomSetTaskHintRequest).")
21139
+ "task": string$1().readonly().optional().describe("The composer's task tag: `new` or a task root id (see RoomSetTaskHintRequest)."),
21140
+ "attachments": array(union([strictObject({
21141
+ "type": literal("image").readonly(),
21142
+ "data": string$1().readonly(),
21143
+ "mediaType": string$1().readonly(),
21144
+ "name": string$1().readonly().optional()
21145
+ }), strictObject({
21146
+ "type": literal("file").readonly(),
21147
+ "receiptId": string$1().readonly()
21148
+ })])).readonly().optional().describe("Draft attachments in the official composer's wire form: an image's base64 bytes, or a file's upload receipt (uploaded to this room session on pick). The host admits them into the human message; members get them by local path.")
21004
21149
  });
21005
21150
  let _khorsheed_dsh_room_room_prepareMember_parameter_0_strict$schema$value;
21006
21151
  const _khorsheed_dsh_room_room_prepareMember_parameter_0_strict$schema = () => _khorsheed_dsh_room_room_prepareMember_parameter_0_strict$schema$value ??= strictObject({
@@ -21315,6 +21460,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
21315
21460
  "required": ["code"],
21316
21461
  "additionalProperties": true
21317
21462
  },
21463
+ {
21464
+ "type": "object",
21465
+ "properties": {
21466
+ "code": {
21467
+ "type": "string",
21468
+ "const": "attachment-invalid"
21469
+ },
21470
+ "message": { "type": "string" }
21471
+ },
21472
+ "required": ["code", "message"],
21473
+ "additionalProperties": true
21474
+ },
21318
21475
  {
21319
21476
  "type": "object",
21320
21477
  "properties": { "code": {
@@ -21516,7 +21673,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
21516
21673
  },
21517
21674
  sourceLocation: {
21518
21675
  "file": "packages/room/src/index.ts",
21519
- "line": 1772,
21676
+ "line": 2004,
21520
21677
  "column": 9
21521
21678
  }
21522
21679
  },
@@ -21777,6 +21934,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
21777
21934
  "required": ["code"],
21778
21935
  "additionalProperties": true
21779
21936
  },
21937
+ {
21938
+ "type": "object",
21939
+ "properties": {
21940
+ "code": {
21941
+ "type": "string",
21942
+ "const": "attachment-invalid"
21943
+ },
21944
+ "message": { "type": "string" }
21945
+ },
21946
+ "required": ["code", "message"],
21947
+ "additionalProperties": true
21948
+ },
21780
21949
  {
21781
21950
  "type": "object",
21782
21951
  "properties": { "code": {
@@ -21978,7 +22147,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
21978
22147
  },
21979
22148
  sourceLocation: {
21980
22149
  "file": "packages/room/src/index.ts",
21981
- "line": 1826,
22150
+ "line": 2068,
21982
22151
  "column": 9
21983
22152
  }
21984
22153
  },
@@ -22232,6 +22401,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
22232
22401
  "required": ["code"],
22233
22402
  "additionalProperties": true
22234
22403
  },
22404
+ {
22405
+ "type": "object",
22406
+ "properties": {
22407
+ "code": {
22408
+ "type": "string",
22409
+ "const": "attachment-invalid"
22410
+ },
22411
+ "message": { "type": "string" }
22412
+ },
22413
+ "required": ["code", "message"],
22414
+ "additionalProperties": true
22415
+ },
22235
22416
  {
22236
22417
  "type": "object",
22237
22418
  "properties": { "code": {
@@ -22433,7 +22614,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
22433
22614
  },
22434
22615
  sourceLocation: {
22435
22616
  "file": "packages/room/src/index.ts",
22436
- "line": 2172,
22617
+ "line": 2450,
22437
22618
  "column": 9
22438
22619
  }
22439
22620
  },
@@ -22663,6 +22844,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
22663
22844
  "required": ["code"],
22664
22845
  "additionalProperties": true
22665
22846
  },
22847
+ {
22848
+ "type": "object",
22849
+ "properties": {
22850
+ "code": {
22851
+ "type": "string",
22852
+ "const": "attachment-invalid"
22853
+ },
22854
+ "message": { "type": "string" }
22855
+ },
22856
+ "required": ["code", "message"],
22857
+ "additionalProperties": true
22858
+ },
22666
22859
  {
22667
22860
  "type": "object",
22668
22861
  "properties": { "code": {
@@ -22864,7 +23057,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
22864
23057
  },
22865
23058
  sourceLocation: {
22866
23059
  "file": "packages/room/src/index.ts",
22867
- "line": 2207,
23060
+ "line": 2485,
22868
23061
  "column": 9
22869
23062
  }
22870
23063
  },
@@ -23105,6 +23298,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
23105
23298
  "required": ["code"],
23106
23299
  "additionalProperties": true
23107
23300
  },
23301
+ {
23302
+ "type": "object",
23303
+ "properties": {
23304
+ "code": {
23305
+ "type": "string",
23306
+ "const": "attachment-invalid"
23307
+ },
23308
+ "message": { "type": "string" }
23309
+ },
23310
+ "required": ["code", "message"],
23311
+ "additionalProperties": true
23312
+ },
23108
23313
  {
23109
23314
  "type": "object",
23110
23315
  "properties": { "code": {
@@ -23306,7 +23511,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
23306
23511
  },
23307
23512
  sourceLocation: {
23308
23513
  "file": "packages/room/src/index.ts",
23309
- "line": 1962,
23514
+ "line": 2240,
23310
23515
  "column": 9
23311
23516
  }
23312
23517
  },
@@ -23541,6 +23746,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
23541
23746
  "required": ["code"],
23542
23747
  "additionalProperties": true
23543
23748
  },
23749
+ {
23750
+ "type": "object",
23751
+ "properties": {
23752
+ "code": {
23753
+ "type": "string",
23754
+ "const": "attachment-invalid"
23755
+ },
23756
+ "message": { "type": "string" }
23757
+ },
23758
+ "required": ["code", "message"],
23759
+ "additionalProperties": true
23760
+ },
23544
23761
  {
23545
23762
  "type": "object",
23546
23763
  "properties": { "code": {
@@ -23742,7 +23959,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
23742
23959
  },
23743
23960
  sourceLocation: {
23744
23961
  "file": "packages/room/src/index.ts",
23745
- "line": 2109,
23962
+ "line": 2387,
23746
23963
  "column": 9
23747
23964
  }
23748
23965
  },
@@ -23983,6 +24200,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
23983
24200
  "required": ["code"],
23984
24201
  "additionalProperties": true
23985
24202
  },
24203
+ {
24204
+ "type": "object",
24205
+ "properties": {
24206
+ "code": {
24207
+ "type": "string",
24208
+ "const": "attachment-invalid"
24209
+ },
24210
+ "message": { "type": "string" }
24211
+ },
24212
+ "required": ["code", "message"],
24213
+ "additionalProperties": true
24214
+ },
23986
24215
  {
23987
24216
  "type": "object",
23988
24217
  "properties": { "code": {
@@ -24184,7 +24413,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
24184
24413
  },
24185
24414
  sourceLocation: {
24186
24415
  "file": "packages/room/src/index.ts",
24187
- "line": 2124,
24416
+ "line": 2402,
24188
24417
  "column": 9
24189
24418
  }
24190
24419
  },
@@ -24237,7 +24466,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
24237
24466
  },
24238
24467
  sourceLocation: {
24239
24468
  "file": "packages/room/src/index.ts",
24240
- "line": 767,
24469
+ "line": 927,
24241
24470
  "column": 9
24242
24471
  }
24243
24472
  },
@@ -24589,6 +24818,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
24589
24818
  "required": ["code"],
24590
24819
  "additionalProperties": true
24591
24820
  },
24821
+ {
24822
+ "type": "object",
24823
+ "properties": {
24824
+ "code": {
24825
+ "type": "string",
24826
+ "const": "attachment-invalid"
24827
+ },
24828
+ "message": { "type": "string" }
24829
+ },
24830
+ "required": ["code", "message"],
24831
+ "additionalProperties": true
24832
+ },
24592
24833
  {
24593
24834
  "type": "object",
24594
24835
  "properties": { "code": {
@@ -24790,17 +25031,15 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
24790
25031
  },
24791
25032
  sourceLocation: {
24792
25033
  "file": "packages/room/src/index.ts",
24793
- "line": 915,
25034
+ "line": 1075,
24794
25035
  "column": 3
24795
25036
  }
24796
25037
  },
24797
25038
  "room/isRoom": {
24798
25039
  service: "room",
24799
- description: "Probe whether a session is a room: replay its event log looking for the `room/created` marker. Side-effect-free: a cold session answers from a persistence inspection, so opening any session never resumes its agent.",
24800
25040
  invocation: { kind: "direct" },
24801
25041
  parameters: [{
24802
25042
  name: "request",
24803
- description: "session identity.",
24804
25043
  source: "json",
24805
25044
  codec: {
24806
25045
  mode: "strict",
@@ -24838,12 +25077,11 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
24838
25077
  typeSymbol: "@khorsheed/dsh-room#room/isRoom:result",
24839
25078
  create: _khorsheed_dsh_room_room_isRoom_result$schema,
24840
25079
  schema: _khorsheed_dsh_room_room_isRoom_result$schema(),
24841
- description: "true when the session carries the marker (false for unknown sessions too).",
24842
25080
  jsonSchema: { "type": "boolean" }
24843
25081
  },
24844
25082
  sourceLocation: {
24845
25083
  "file": "packages/room/src/index.ts",
24846
- "line": 444,
25084
+ "line": 587,
24847
25085
  "column": 9
24848
25086
  }
24849
25087
  },
@@ -25078,6 +25316,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
25078
25316
  "required": ["code"],
25079
25317
  "additionalProperties": true
25080
25318
  },
25319
+ {
25320
+ "type": "object",
25321
+ "properties": {
25322
+ "code": {
25323
+ "type": "string",
25324
+ "const": "attachment-invalid"
25325
+ },
25326
+ "message": { "type": "string" }
25327
+ },
25328
+ "required": ["code", "message"],
25329
+ "additionalProperties": true
25330
+ },
25081
25331
  {
25082
25332
  "type": "object",
25083
25333
  "properties": { "code": {
@@ -25279,7 +25529,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
25279
25529
  },
25280
25530
  sourceLocation: {
25281
25531
  "file": "packages/room/src/index.ts",
25282
- "line": 2075,
25532
+ "line": 2353,
25283
25533
  "column": 9
25284
25534
  }
25285
25535
  },
@@ -25391,7 +25641,73 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
25391
25641
  },
25392
25642
  sourceLocation: {
25393
25643
  "file": "packages/room/src/index.ts",
25394
- "line": 493,
25644
+ "line": 636,
25645
+ "column": 9
25646
+ }
25647
+ },
25648
+ "room/pendingCards": {
25649
+ service: "room",
25650
+ description: "The question/approval cards waiting for the human across live rooms — the browser publishes them as the session list's 等你处理 status.",
25651
+ invocation: { kind: "direct" },
25652
+ parameters: [{
25653
+ name: "request",
25654
+ description: "optionally one room only.",
25655
+ source: "json",
25656
+ codec: {
25657
+ mode: "strict",
25658
+ typeSymbol: "@khorsheed/dsh-room/types#RoomPendingCardsRequest",
25659
+ create: _khorsheed_dsh_room_room_pendingCards_parameter_0$schema,
25660
+ schema: _khorsheed_dsh_room_room_pendingCards_parameter_0$schema(),
25661
+ jsonSchema: {
25662
+ "type": "object",
25663
+ "properties": { "sessionId": { "type": "string" } },
25664
+ "required": [],
25665
+ "additionalProperties": true
25666
+ }
25667
+ },
25668
+ strictCodec: {
25669
+ mode: "strict",
25670
+ typeSymbol: "@khorsheed/dsh-room/types#RoomPendingCardsRequest",
25671
+ create: _khorsheed_dsh_room_room_pendingCards_parameter_0_strict$schema,
25672
+ schema: _khorsheed_dsh_room_room_pendingCards_parameter_0_strict$schema(),
25673
+ jsonSchema: {
25674
+ "type": "object",
25675
+ "properties": { "sessionId": { "type": "string" } },
25676
+ "required": [],
25677
+ "additionalProperties": false
25678
+ }
25679
+ }
25680
+ }],
25681
+ result: {
25682
+ mode: "strict",
25683
+ typeSymbol: "@khorsheed/dsh-room#room/pendingCards:result",
25684
+ create: _khorsheed_dsh_room_room_pendingCards_result$schema,
25685
+ schema: _khorsheed_dsh_room_room_pendingCards_result$schema(),
25686
+ description: "the waiting cards.",
25687
+ jsonSchema: {
25688
+ "type": "array",
25689
+ "items": {
25690
+ "type": "object",
25691
+ "properties": {
25692
+ "sessionId": { "type": "string" },
25693
+ "id": { "type": "string" },
25694
+ "kind": {
25695
+ "type": "string",
25696
+ "enum": ["approval", "question"]
25697
+ }
25698
+ },
25699
+ "required": [
25700
+ "sessionId",
25701
+ "id",
25702
+ "kind"
25703
+ ],
25704
+ "additionalProperties": true
25705
+ }
25706
+ }
25707
+ },
25708
+ sourceLocation: {
25709
+ "file": "packages/room/src/index.ts",
25710
+ "line": 581,
25395
25711
  "column": 9
25396
25712
  }
25397
25713
  },
@@ -25461,7 +25777,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
25461
25777
  },
25462
25778
  sourceLocation: {
25463
25779
  "file": "packages/room/src/index.ts",
25464
- "line": 1672,
25780
+ "line": 1904,
25465
25781
  "column": 9
25466
25782
  }
25467
25783
  },
@@ -25498,6 +25814,39 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
25498
25814
  "task": {
25499
25815
  "type": "string",
25500
25816
  "description": "The composer's task tag: `new` or a task root id (see RoomSetTaskHintRequest)."
25817
+ },
25818
+ "attachments": {
25819
+ "type": "array",
25820
+ "items": { "oneOf": [{
25821
+ "type": "object",
25822
+ "properties": {
25823
+ "type": {
25824
+ "type": "string",
25825
+ "const": "image"
25826
+ },
25827
+ "data": { "type": "string" },
25828
+ "mediaType": { "type": "string" },
25829
+ "name": { "type": "string" }
25830
+ },
25831
+ "required": [
25832
+ "type",
25833
+ "data",
25834
+ "mediaType"
25835
+ ],
25836
+ "additionalProperties": true
25837
+ }, {
25838
+ "type": "object",
25839
+ "properties": {
25840
+ "type": {
25841
+ "type": "string",
25842
+ "const": "file"
25843
+ },
25844
+ "receiptId": { "type": "string" }
25845
+ },
25846
+ "required": ["type", "receiptId"],
25847
+ "additionalProperties": true
25848
+ }] },
25849
+ "description": "Draft attachments in the official composer's wire form: an image's base64 bytes, or a file's upload receipt (uploaded to this room session on pick). The host admits them into the human message; members get them by local path."
25501
25850
  }
25502
25851
  },
25503
25852
  "required": ["sessionId", "text"],
@@ -25529,14 +25878,47 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
25529
25878
  "task": {
25530
25879
  "type": "string",
25531
25880
  "description": "The composer's task tag: `new` or a task root id (see RoomSetTaskHintRequest)."
25532
- }
25533
- },
25534
- "required": ["sessionId", "text"],
25535
- "additionalProperties": false
25536
- }
25537
- }
25538
- }],
25539
- result: {
25881
+ },
25882
+ "attachments": {
25883
+ "type": "array",
25884
+ "items": { "oneOf": [{
25885
+ "type": "object",
25886
+ "properties": {
25887
+ "type": {
25888
+ "type": "string",
25889
+ "const": "image"
25890
+ },
25891
+ "data": { "type": "string" },
25892
+ "mediaType": { "type": "string" },
25893
+ "name": { "type": "string" }
25894
+ },
25895
+ "required": [
25896
+ "type",
25897
+ "data",
25898
+ "mediaType"
25899
+ ],
25900
+ "additionalProperties": false
25901
+ }, {
25902
+ "type": "object",
25903
+ "properties": {
25904
+ "type": {
25905
+ "type": "string",
25906
+ "const": "file"
25907
+ },
25908
+ "receiptId": { "type": "string" }
25909
+ },
25910
+ "required": ["type", "receiptId"],
25911
+ "additionalProperties": false
25912
+ }] },
25913
+ "description": "Draft attachments in the official composer's wire form: an image's base64 bytes, or a file's upload receipt (uploaded to this room session on pick). The host admits them into the human message; members get them by local path."
25914
+ }
25915
+ },
25916
+ "required": ["sessionId", "text"],
25917
+ "additionalProperties": false
25918
+ }
25919
+ }
25920
+ }],
25921
+ result: {
25540
25922
  mode: "strict",
25541
25923
  typeSymbol: "@khorsheed/dsh-room/types#RoomPostMessageResult",
25542
25924
  create: _khorsheed_dsh_room_room_postMessage_result$schema,
@@ -25743,6 +26125,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
25743
26125
  "required": ["code"],
25744
26126
  "additionalProperties": true
25745
26127
  },
26128
+ {
26129
+ "type": "object",
26130
+ "properties": {
26131
+ "code": {
26132
+ "type": "string",
26133
+ "const": "attachment-invalid"
26134
+ },
26135
+ "message": { "type": "string" }
26136
+ },
26137
+ "required": ["code", "message"],
26138
+ "additionalProperties": true
26139
+ },
25746
26140
  {
25747
26141
  "type": "object",
25748
26142
  "properties": { "code": {
@@ -25944,7 +26338,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
25944
26338
  },
25945
26339
  sourceLocation: {
25946
26340
  "file": "packages/room/src/index.ts",
25947
- "line": 1193,
26341
+ "line": 1353,
25948
26342
  "column": 9
25949
26343
  }
25950
26344
  },
@@ -26171,6 +26565,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
26171
26565
  "required": ["code"],
26172
26566
  "additionalProperties": true
26173
26567
  },
26568
+ {
26569
+ "type": "object",
26570
+ "properties": {
26571
+ "code": {
26572
+ "type": "string",
26573
+ "const": "attachment-invalid"
26574
+ },
26575
+ "message": { "type": "string" }
26576
+ },
26577
+ "required": ["code", "message"],
26578
+ "additionalProperties": true
26579
+ },
26174
26580
  {
26175
26581
  "type": "object",
26176
26582
  "properties": { "code": {
@@ -26372,7 +26778,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
26372
26778
  },
26373
26779
  sourceLocation: {
26374
26780
  "file": "packages/room/src/index.ts",
26375
- "line": 993,
26781
+ "line": 1153,
26376
26782
  "column": 9
26377
26783
  }
26378
26784
  },
@@ -26611,6 +27017,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
26611
27017
  "required": ["code"],
26612
27018
  "additionalProperties": true
26613
27019
  },
27020
+ {
27021
+ "type": "object",
27022
+ "properties": {
27023
+ "code": {
27024
+ "type": "string",
27025
+ "const": "attachment-invalid"
27026
+ },
27027
+ "message": { "type": "string" }
27028
+ },
27029
+ "required": ["code", "message"],
27030
+ "additionalProperties": true
27031
+ },
26614
27032
  {
26615
27033
  "type": "object",
26616
27034
  "properties": { "code": {
@@ -26812,7 +27230,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
26812
27230
  },
26813
27231
  sourceLocation: {
26814
27232
  "file": "packages/room/src/index.ts",
26815
- "line": 1019,
27233
+ "line": 1179,
26816
27234
  "column": 9
26817
27235
  }
26818
27236
  },
@@ -27041,6 +27459,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
27041
27459
  "required": ["code"],
27042
27460
  "additionalProperties": true
27043
27461
  },
27462
+ {
27463
+ "type": "object",
27464
+ "properties": {
27465
+ "code": {
27466
+ "type": "string",
27467
+ "const": "attachment-invalid"
27468
+ },
27469
+ "message": { "type": "string" }
27470
+ },
27471
+ "required": ["code", "message"],
27472
+ "additionalProperties": true
27473
+ },
27044
27474
  {
27045
27475
  "type": "object",
27046
27476
  "properties": { "code": {
@@ -27242,7 +27672,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
27242
27672
  },
27243
27673
  sourceLocation: {
27244
27674
  "file": "packages/room/src/index.ts",
27245
- "line": 2007,
27675
+ "line": 2285,
27246
27676
  "column": 9
27247
27677
  }
27248
27678
  },
@@ -27503,6 +27933,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
27503
27933
  "required": ["code"],
27504
27934
  "additionalProperties": true
27505
27935
  },
27936
+ {
27937
+ "type": "object",
27938
+ "properties": {
27939
+ "code": {
27940
+ "type": "string",
27941
+ "const": "attachment-invalid"
27942
+ },
27943
+ "message": { "type": "string" }
27944
+ },
27945
+ "required": ["code", "message"],
27946
+ "additionalProperties": true
27947
+ },
27506
27948
  {
27507
27949
  "type": "object",
27508
27950
  "properties": { "code": {
@@ -27704,7 +28146,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
27704
28146
  },
27705
28147
  sourceLocation: {
27706
28148
  "file": "packages/room/src/index.ts",
27707
- "line": 1104,
28149
+ "line": 1264,
27708
28150
  "column": 9
27709
28151
  }
27710
28152
  },
@@ -27933,6 +28375,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
27933
28375
  "required": ["code"],
27934
28376
  "additionalProperties": true
27935
28377
  },
28378
+ {
28379
+ "type": "object",
28380
+ "properties": {
28381
+ "code": {
28382
+ "type": "string",
28383
+ "const": "attachment-invalid"
28384
+ },
28385
+ "message": { "type": "string" }
28386
+ },
28387
+ "required": ["code", "message"],
28388
+ "additionalProperties": true
28389
+ },
27936
28390
  {
27937
28391
  "type": "object",
27938
28392
  "properties": { "code": {
@@ -28134,7 +28588,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
28134
28588
  },
28135
28589
  sourceLocation: {
28136
28590
  "file": "packages/room/src/index.ts",
28137
- "line": 1143,
28591
+ "line": 1303,
28138
28592
  "column": 9
28139
28593
  }
28140
28594
  },
@@ -28386,6 +28840,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
28386
28840
  "required": ["code"],
28387
28841
  "additionalProperties": true
28388
28842
  },
28843
+ {
28844
+ "type": "object",
28845
+ "properties": {
28846
+ "code": {
28847
+ "type": "string",
28848
+ "const": "attachment-invalid"
28849
+ },
28850
+ "message": { "type": "string" }
28851
+ },
28852
+ "required": ["code", "message"],
28853
+ "additionalProperties": true
28854
+ },
28389
28855
  {
28390
28856
  "type": "object",
28391
28857
  "properties": { "code": {
@@ -28587,7 +29053,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
28587
29053
  },
28588
29054
  sourceLocation: {
28589
29055
  "file": "packages/room/src/index.ts",
28590
- "line": 1036,
29056
+ "line": 1196,
28591
29057
  "column": 9
28592
29058
  }
28593
29059
  },
@@ -28828,6 +29294,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
28828
29294
  "required": ["code"],
28829
29295
  "additionalProperties": true
28830
29296
  },
29297
+ {
29298
+ "type": "object",
29299
+ "properties": {
29300
+ "code": {
29301
+ "type": "string",
29302
+ "const": "attachment-invalid"
29303
+ },
29304
+ "message": { "type": "string" }
29305
+ },
29306
+ "required": ["code", "message"],
29307
+ "additionalProperties": true
29308
+ },
28831
29309
  {
28832
29310
  "type": "object",
28833
29311
  "properties": { "code": {
@@ -29029,7 +29507,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
29029
29507
  },
29030
29508
  sourceLocation: {
29031
29509
  "file": "packages/room/src/index.ts",
29032
- "line": 2153,
29510
+ "line": 2431,
29033
29511
  "column": 9
29034
29512
  }
29035
29513
  },
@@ -29320,6 +29798,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
29320
29798
  "required": ["code"],
29321
29799
  "additionalProperties": true
29322
29800
  },
29801
+ {
29802
+ "type": "object",
29803
+ "properties": {
29804
+ "code": {
29805
+ "type": "string",
29806
+ "const": "attachment-invalid"
29807
+ },
29808
+ "message": { "type": "string" }
29809
+ },
29810
+ "required": ["code", "message"],
29811
+ "additionalProperties": true
29812
+ },
29323
29813
  {
29324
29814
  "type": "object",
29325
29815
  "properties": { "code": {
@@ -29521,7 +30011,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
29521
30011
  },
29522
30012
  sourceLocation: {
29523
30013
  "file": "packages/room/src/index.ts",
29524
- "line": 2023,
30014
+ "line": 2301,
29525
30015
  "column": 9
29526
30016
  }
29527
30017
  },
@@ -29594,7 +30084,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
29594
30084
  },
29595
30085
  sourceLocation: {
29596
30086
  "file": "packages/room/src/index.ts",
29597
- "line": 599,
30087
+ "line": 742,
29598
30088
  "column": 9
29599
30089
  }
29600
30090
  },
@@ -29829,6 +30319,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
29829
30319
  "required": ["code"],
29830
30320
  "additionalProperties": true
29831
30321
  },
30322
+ {
30323
+ "type": "object",
30324
+ "properties": {
30325
+ "code": {
30326
+ "type": "string",
30327
+ "const": "attachment-invalid"
30328
+ },
30329
+ "message": { "type": "string" }
30330
+ },
30331
+ "required": ["code", "message"],
30332
+ "additionalProperties": true
30333
+ },
29832
30334
  {
29833
30335
  "type": "object",
29834
30336
  "properties": { "code": {
@@ -30030,7 +30532,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
30030
30532
  },
30031
30533
  sourceLocation: {
30032
30534
  "file": "packages/room/src/index.ts",
30033
- "line": 614,
30535
+ "line": 757,
30034
30536
  "column": 9
30035
30537
  }
30036
30538
  },
@@ -30265,6 +30767,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
30265
30767
  "required": ["code"],
30266
30768
  "additionalProperties": true
30267
30769
  },
30770
+ {
30771
+ "type": "object",
30772
+ "properties": {
30773
+ "code": {
30774
+ "type": "string",
30775
+ "const": "attachment-invalid"
30776
+ },
30777
+ "message": { "type": "string" }
30778
+ },
30779
+ "required": ["code", "message"],
30780
+ "additionalProperties": true
30781
+ },
30268
30782
  {
30269
30783
  "type": "object",
30270
30784
  "properties": { "code": {
@@ -30466,7 +30980,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
30466
30980
  },
30467
30981
  sourceLocation: {
30468
30982
  "file": "packages/room/src/index.ts",
30469
- "line": 2094,
30983
+ "line": 2372,
30470
30984
  "column": 9
30471
30985
  }
30472
30986
  },
@@ -30785,6 +31299,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
30785
31299
  "required": ["code"],
30786
31300
  "additionalProperties": true
30787
31301
  },
31302
+ {
31303
+ "type": "object",
31304
+ "properties": {
31305
+ "code": {
31306
+ "type": "string",
31307
+ "const": "attachment-invalid"
31308
+ },
31309
+ "message": { "type": "string" }
31310
+ },
31311
+ "required": ["code", "message"],
31312
+ "additionalProperties": true
31313
+ },
30788
31314
  {
30789
31315
  "type": "object",
30790
31316
  "properties": { "code": {
@@ -30986,14 +31512,14 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
30986
31512
  },
30987
31513
  sourceLocation: {
30988
31514
  "file": "packages/room/src/index.ts",
30989
- "line": 938,
31515
+ "line": 1098,
30990
31516
  "column": 9
30991
31517
  }
30992
31518
  }
30993
31519
  }
30994
31520
  }, external_exports);
30995
31521
  //#endregion
30996
- //#region ../../node_modules/.pnpm/@deepseek-ai+dsh-agent-preset-registry@0.2.1-rc.1_f634e48299eaa3e43c580bdbeabef67a/node_modules/@deepseek-ai/dsh-agent-preset-registry/lib/types/display.js
31522
+ //#region ../../node_modules/.pnpm/@deepseek-ai+dsh-agent-preset-registry@0.2.1-rc.3_f0b1e46d03a32439f6304e29d5883ea2/node_modules/@deepseek-ai/dsh-agent-preset-registry/lib/types/display.js
30997
31523
  /**
30998
31524
  * Display resolution for roster presets, shared by every surface that renders
30999
31525
  * preset names: shipped presets resolve through locale dictionary keys, and
@@ -31072,6 +31598,68 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
31072
31598
  }
31073
31599
  };
31074
31600
  //#endregion
31601
+ //#region ../../node_modules/.pnpm/@deepseek-ai+dsh-util-workspace-path@0.2.1-rc.3_@deepseek-ai+cordis@4.0.4/node_modules/@deepseek-ai/dsh-util-workspace-path/lib/index.js
31602
+ /**
31603
+ * The `dsh-resource://file/…` address grammar: how a file is named across the
31604
+ * Sidebar and the resource model, built and parsed without touching a
31605
+ * filesystem.
31606
+ * @module
31607
+ */
31608
+ /** The scheme and type every file address opens with. */
31609
+ const FILE_ADDRESS_PREFIX = "dsh-resource://file/";
31610
+ /** Component-encode one id or path segment, keeping `:` literal for drive letters. */
31611
+ function encodeSegment(segment) {
31612
+ return encodeURIComponent(segment).replace(/%3A/gi, ":");
31613
+ }
31614
+ /** Encode a `/`-separated path segment by segment. */
31615
+ function encodePath(path) {
31616
+ return path.split("/").map(encodeSegment).join("/");
31617
+ }
31618
+ /**
31619
+ * Build the address of a file read through one Session.
31620
+ * @param sessionId - the Session whose Host workspace resolves the path.
31621
+ * @param path - absolute or workspace-relative path; backslashes are normalized to `/`, and leading `./` prefixes are dropped.
31622
+ * @returns the `dsh-resource://file/session/<sessionId>/<path>` address.
31623
+ */
31624
+ function sessionFileAddress(sessionId, path) {
31625
+ const normalized = path.replace(/\\/g, "/").replace(/^(?:\.\/)+/, "");
31626
+ return `${FILE_ADDRESS_PREFIX}session/${encodeSegment(sessionId)}/${encodePath(normalized)}`;
31627
+ }
31628
+ /**
31629
+ * Browser-safe Workspace path and display helpers.
31630
+ * @module @deepseek-ai/dsh-util-workspace-path
31631
+ */
31632
+ /** Whether a path uses a Windows drive or UNC prefix. */
31633
+ function isWindowsStylePath(value) {
31634
+ return /^[A-Za-z]:[/\\]/.test(value) || value.startsWith("\\\\");
31635
+ }
31636
+ /**
31637
+ * Whether a path is absolute in either spelling the Host accepts: POSIX (`/a/b`) or Windows drive or UNC.
31638
+ * @param path - the path to classify.
31639
+ * @returns `true` for an absolute path; `false` for a Workspace-relative one.
31640
+ */
31641
+ function isAbsoluteWorkspacePath(path) {
31642
+ return path.startsWith("/") || isWindowsStylePath(path);
31643
+ }
31644
+ /**
31645
+ * The address for a path as a caller holds it: a relative path, or an absolute
31646
+ * path inside the Session's workspace, becomes a `session`-scoped address; an
31647
+ * absolute path outside it, or one whose workspace root is unknown, keeps its
31648
+ * absolute path in that Session's address.
31649
+ * @param sessionId - the Session the path is read in.
31650
+ * @param cwd - that Session's workspace root, when known.
31651
+ * @param path - absolute or workspace-relative path, in either separator spelling.
31652
+ * @returns the `dsh-resource://file/…` address.
31653
+ */
31654
+ function fileAddressFor(sessionId, cwd, path) {
31655
+ const normalized = path.replace(/\\/g, "/");
31656
+ if (!isAbsoluteWorkspacePath(normalized)) return sessionFileAddress(sessionId, normalized);
31657
+ const root = cwd === void 0 ? "" : cwd.replace(/\\/g, "/").replace(/\/+$/, "");
31658
+ if (root !== "" && normalized === root) return sessionFileAddress(sessionId, "");
31659
+ if (root !== "" && normalized.startsWith(`${root}/`)) return sessionFileAddress(sessionId, normalized.slice(root.length + 1));
31660
+ return sessionFileAddress(sessionId, normalized);
31661
+ }
31662
+ //#endregion
31075
31663
  //#region src/client/locales.ts
31076
31664
  /** `room` namespace dictionaries. */
31077
31665
  /** Simplified Chinese dictionary (the key-set source of truth). */
@@ -31169,6 +31757,20 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
31169
31757
  "composer.stop": "停止生成",
31170
31758
  "composer.error.unknownTargets": "未知成员:{names}",
31171
31759
  "composer.error.generic": "发送失败,请重试",
31760
+ "composer.interrupted": "{count} 位成员被重启打断:{names}",
31761
+ "composer.continueAll": "全部继续",
31762
+ "composer.continueText": "继续",
31763
+ "composer.error.attachment": "附件没能发送:{reason}",
31764
+ "attach.add": "添加图片或文件",
31765
+ "attach.remove": "移除 {name}",
31766
+ "attach.uploading": "上传中…",
31767
+ "attach.failed": "上传失败,点击重试",
31768
+ "attach.retry": "重新上传 {name}",
31769
+ "attach.open": "查看原图 {name}",
31770
+ "attach.preview": "原图预览",
31771
+ "attach.closePreview": "关闭原图预览",
31772
+ "attach.drop": "松开即可添加到消息",
31773
+ "attach.unsupported": "仅支持 PNG、JPG、WebP、GIF 格式的图片",
31172
31774
  "composer.model.picker": "DSH 模型",
31173
31775
  "composer.model.select": "选择模型",
31174
31776
  "composer.model.loading": "正在加载模型…",
@@ -31207,6 +31809,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
31207
31809
  "usage.output": "输出",
31208
31810
  "usage.duration": "耗时",
31209
31811
  "run.working": "{member} 正在工作…",
31812
+ "run.waiting": "{member} 在等你回答",
31210
31813
  "run.failed": "{member} 运行失败",
31211
31814
  "run.stop": "停止",
31212
31815
  "run.durationUnknown": "耗时未知",
@@ -31424,6 +32027,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
31424
32027
  "job.status.stopped": "已停止",
31425
32028
  "job.elapsed": "用时 {time}",
31426
32029
  "job.you": "你:",
32030
+ "job.from": "{name}:",
31427
32031
  "job.by.human": "你指定的",
31428
32032
  "job.by.coordinator": "协调者归入",
31429
32033
  "job.by.model": "决策模型归入 · {probability}",
@@ -31509,12 +32113,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
31509
32113
  "decision.rule.failure": "成员没有正常完成",
31510
32114
  "decision.rule.last": "最后一个结果",
31511
32115
  "question.title": "{member} 问你",
32116
+ "question.waiting": "{member} 在等你回答",
32117
+ "question.asked": "问你",
32118
+ "question.midRound": "提问于这一轮中途",
32119
+ "question.capsule": "{member} 等你回答 ↑",
31512
32120
  "question.other": "其他",
31513
32121
  "question.otherPlaceholder": "写下你的回答…",
31514
32122
  "question.submit": "提交回答",
31515
32123
  "question.multi": "可多选",
31516
32124
  "question.answered": "已回答",
31517
32125
  "question.cancelled": "已过期,未作答",
32126
+ "question.lateOpen": "已过期,仍可回答",
32127
+ "question.answeredLate": "已补答",
31518
32128
  "question.answer": "你的回答:{answer}",
31519
32129
  "question.expired": "这组问题已经结束了",
31520
32130
  "invite.modelLabel": "模型",
@@ -31615,6 +32225,20 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
31615
32225
  "composer.stop": "Stop generating",
31616
32226
  "composer.error.unknownTargets": "Unknown members: {names}",
31617
32227
  "composer.error.generic": "Could not send; please retry",
32228
+ "composer.interrupted": "{count} member(s) interrupted by a restart: {names}",
32229
+ "composer.continueAll": "Continue all",
32230
+ "composer.continueText": "Continue",
32231
+ "composer.error.attachment": "An attachment could not be sent: {reason}",
32232
+ "attach.add": "Add images or files",
32233
+ "attach.remove": "Remove {name}",
32234
+ "attach.uploading": "Uploading…",
32235
+ "attach.failed": "Upload failed — click to retry",
32236
+ "attach.retry": "Upload {name} again",
32237
+ "attach.open": "View the original of {name}",
32238
+ "attach.preview": "Original image",
32239
+ "attach.closePreview": "Close the original image",
32240
+ "attach.drop": "Drop to add to the message",
32241
+ "attach.unsupported": "Only PNG, JPG, WebP and GIF images are supported",
31618
32242
  "composer.model.picker": "Main agent model",
31619
32243
  "composer.model.select": "Select model",
31620
32244
  "composer.model.loading": "Loading models…",
@@ -31653,6 +32277,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
31653
32277
  "usage.output": "Output",
31654
32278
  "usage.duration": "Run time",
31655
32279
  "run.working": "{member} is working…",
32280
+ "run.waiting": "{member} is waiting for your answer",
31656
32281
  "run.failed": "{member}'s run failed",
31657
32282
  "run.stop": "Stop",
31658
32283
  "run.durationUnknown": "Duration unknown",
@@ -31870,6 +32495,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
31870
32495
  "job.status.stopped": "stopped",
31871
32496
  "job.elapsed": "took {time}",
31872
32497
  "job.you": "You: ",
32498
+ "job.from": "{name}: ",
31873
32499
  "job.by.human": "filed by you",
31874
32500
  "job.by.coordinator": "filed by the coordinator",
31875
32501
  "job.by.model": "filed by the decision model · {probability}",
@@ -31955,12 +32581,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
31955
32581
  "decision.rule.failure": "the member did not finish normally",
31956
32582
  "decision.rule.last": "the last result",
31957
32583
  "question.title": "{member} asks you",
32584
+ "question.waiting": "{member} is waiting for your answer",
32585
+ "question.asked": "Asked you",
32586
+ "question.midRound": "asked mid-round",
32587
+ "question.capsule": "{member} waits for your answer ↑",
31958
32588
  "question.other": "Other",
31959
32589
  "question.otherPlaceholder": "Type your answer…",
31960
32590
  "question.submit": "Submit answers",
31961
32591
  "question.multi": "Pick any",
31962
32592
  "question.answered": "Answered",
31963
32593
  "question.cancelled": "Expired without an answer",
32594
+ "question.lateOpen": "Expired — you can still answer",
32595
+ "question.answeredLate": "Answered late",
31964
32596
  "question.answer": "Your answer: {answer}",
31965
32597
  "question.expired": "These questions already ended",
31966
32598
  "invite.modelLabel": "Model",
@@ -32132,6 +32764,20 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
32132
32764
  stroke: "currentColor"
32133
32765
  })]
32134
32766
  });
32767
+ const IconPaperclipOutlineMedium = ({ size = 16, className }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
32768
+ width: size,
32769
+ height: size,
32770
+ className,
32771
+ viewBox: "0 0 16 16",
32772
+ fill: "none",
32773
+ xmlns: "http://www.w3.org/2000/svg",
32774
+ "aria-hidden": "true",
32775
+ strokeWidth: 1.3,
32776
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
32777
+ d: "M12.75 4.5V9.5C12.75 10.7598 12.2496 11.968 11.3588 12.8588C10.468 13.7496 9.25978 14.25 8 14.25C6.74022 14.25 5.53204 13.7496 4.64124 12.8588C3.75045 11.968 3.25 10.7598 3.25 9.5V5C3.25 4.13805 3.59241 3.3114 4.2019 2.7019C4.8114 2.09241 5.63805 1.75 6.5 1.75C7.36195 1.75 8.1886 2.09241 8.7981 2.7019C9.40759 3.3114 9.75 4.13805 9.75 5V9.5C9.75 9.96413 9.56563 10.4092 9.23744 10.7374C8.90925 11.0656 8.46413 11.25 8 11.25C7.53587 11.25 7.09075 11.0656 6.76256 10.7374C6.43437 10.4092 6.25 9.96413 6.25 9.5V5.5",
32778
+ stroke: "currentColor"
32779
+ })
32780
+ });
32135
32781
  const IconQueueOutlineMedium = ({ size = 14, className }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
32136
32782
  width: size,
32137
32783
  height: size,
@@ -32226,56 +32872,56 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
32226
32872
  }
32227
32873
  //#endregion
32228
32874
  //#region \0dsh-css:src/client/MembersView.module.css.mjs
32229
- const css$21 = ".QCtnxq_members{flex-direction:column;gap:8px;padding:12px 16px;display:flex}.QCtnxq_toolbar{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.QCtnxq_count{color:var(--dsw-alias-label-primary,#1f2329);font-size:13px;font-weight:600}.QCtnxq_teamButton{border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#00000029);color:var(--dsw-alias-label-primary,#1f2329);font:inherit;cursor:pointer;background:0 0;border-radius:8px;margin-left:auto;padding:3px 12px;font-size:12px}.QCtnxq_teamButton:hover{background:var(--dsw-alias-bg-layer-2,#0000000d)}.QCtnxq_grid{grid-template-columns:repeat(auto-fill,minmax(340px,1fr));gap:10px;display:grid}.QCtnxq_card{border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#0000001a);background:var(--dsw-alias-bg-layer-1,#fff);border-radius:12px;flex-direction:column;gap:8px;padding:12px;font-size:13px;line-height:18px;display:flex;position:relative}.QCtnxq_head{align-items:center;gap:10px;min-width:0;display:flex}.QCtnxq_avatarTile{background:color-mix(in srgb, var(--member-color,var(--dsw-alias-label-tertiary,#7f8287)) 85%, black);color:#fff;user-select:none;border-radius:10px;flex:none;place-items:center;width:40px;height:40px;font-size:16px;font-weight:600;display:grid}.QCtnxq_identity{flex-direction:column;gap:1px;min-width:0;display:flex}.QCtnxq_name{color:var(--dsw-alias-label-primary,#1f2329);text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:600;overflow:hidden}.QCtnxq_nameRow{align-items:center;gap:6px;min-width:0;display:flex}.QCtnxq_role{background:var(--dsw-alias-bg-layer-2,#0000000d);max-width:14em;color:var(--dsw-alias-label-secondary,#5a5a5ae6);text-overflow:ellipsis;white-space:nowrap;border-radius:5px;flex:none;padding:0 6px;font-size:11px;line-height:18px;overflow:hidden}.QCtnxq_hint{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);white-space:nowrap;font-size:12px}.QCtnxq_head>.QCtnxq_chipRunning,.QCtnxq_head>.QCtnxq_chipFailed,.QCtnxq_head>.QCtnxq_chipIdle{flex:none;margin-left:auto}.QCtnxq_instructionsBlock{flex-direction:column;gap:2px;min-height:0;display:flex}.QCtnxq_instructions{-webkit-line-clamp:2;color:var(--dsw-alias-label-secondary,#5a5a5ae6);-webkit-box-orient:vertical;margin:0;font-size:12px;line-height:18px;display:-webkit-box;overflow:hidden}.QCtnxq_instructionsExpanded{color:var(--dsw-alias-label-secondary,#5a5a5ae6);white-space:pre-wrap;overflow-wrap:anywhere;margin:0;font-size:12px;line-height:18px}.QCtnxq_instructionsEmpty{color:var(--dsw-alias-label-caption,#adb2b8);margin:0;font-size:12px;line-height:18px}.QCtnxq_expandToggle{color:var(--dsw-alias-state-business-primary,#4176e6);cursor:pointer;background:0 0;border:none;align-self:flex-start;padding:0;font-size:12px;line-height:18px}.QCtnxq_foot{flex-wrap:wrap;align-items:center;gap:6px;margin-top:auto;display:flex}.QCtnxq_chipRunning,.QCtnxq_chipFailed,.QCtnxq_chipIdle{white-space:nowrap;border:none;border-radius:999px;align-items:center;padding:1px 8px;font-size:12px;line-height:18px;display:inline-flex}.QCtnxq_chipRunning{background:color-mix(in srgb, var(--dsw-alias-state-business-primary,#4176e6) 14%, transparent);color:var(--dsw-alias-state-business-primary,#4176e6);cursor:pointer;animation:2.4s ease-in-out infinite QCtnxq_room-member-chip-breathe}.QCtnxq_chipRunning:hover:not(:disabled){background:color-mix(in srgb, var(--dsw-alias-state-business-primary,#4176e6) 22%, transparent)}.QCtnxq_chipRunning:disabled{opacity:.5;cursor:default;animation:none}@keyframes QCtnxq_room-member-chip-breathe{0%,to{opacity:1}50%{opacity:.62}}@media (prefers-reduced-motion:reduce){.QCtnxq_chipRunning{animation:none}}.QCtnxq_chipFailed{background:color-mix(in srgb, var(--dsw-alias-state-error-primary,#ec1313) 12%, transparent);color:var(--dsw-alias-state-error-primary,#ec1313)}.QCtnxq_chipIdle{background:var(--dsw-alias-fill-l1,#0000000f);color:var(--dsw-alias-label-tertiary,#7f7f7fcc)}.QCtnxq_actions{align-items:center;gap:2px;margin-left:auto;display:flex}.QCtnxq_action{white-space:nowrap;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);cursor:pointer;background:0 0;border:none;border-radius:6px;padding:2px 6px;font-size:12px;line-height:16px}.QCtnxq_action:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover,#7f7f7f24);color:var(--dsw-alias-label-primary,#1f2329)}.QCtnxq_action:disabled{opacity:.4;cursor:default}.QCtnxq_invite{border:1px dashed var(--dsw-alias-border-l2,#7f7f7f66);min-height:96px;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);cursor:pointer;background:0 0;border-radius:12px;place-items:center;font-size:13px;line-height:20px;display:grid}.QCtnxq_invite:hover{background:var(--dsw-alias-interactive-bg-hover,#7f7f7f24);color:var(--dsw-alias-label-primary,#1f2329)}.QCtnxq_chipRunning:focus:not(:focus-visible),.QCtnxq_expandToggle:focus:not(:focus-visible),.QCtnxq_action:focus:not(:focus-visible),.QCtnxq_invite:focus:not(:focus-visible){outline:none}.QCtnxq_linked{flex-direction:column;gap:4px;margin-top:14px;display:flex}.QCtnxq_linkedRow{border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#00000014);background:var(--dsw-alias-bg-layer-1,#fff);min-height:36px;font-size:var(--dsh-panel-body-size,13px);border-radius:10px;align-items:center;gap:8px;padding:4px 10px;display:flex}.QCtnxq_linkedAvatar{background:color-mix(in srgb, var(--member-color,var(--dsw-alias-label-tertiary,#7f8287)) 85%, black);width:22px;height:22px;color:var(--dsw-alias-label-inverse,#fff);border-radius:50%;flex:none;place-items:center;font-size:11px;font-weight:600;display:grid}.QCtnxq_linkedName{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-primary,#1f2329);font-weight:500;overflow:hidden}.QCtnxq_linkedTag{background:var(--dsw-alias-bg-layer-2,#0000000d);color:var(--dsw-alias-label-secondary,#5a5a5ae6);border-radius:5px;flex:none;padding:0 6px;font-size:11px;line-height:18px}.QCtnxq_linkedAction{color:var(--dsw-alias-label-secondary,#5a5a5ae6);cursor:pointer;background:0 0;border:none;border-radius:6px;flex:none;padding:2px 6px;font-size:12px}.QCtnxq_linkedAction:first-of-type{margin-left:auto}.QCtnxq_linkedAction:hover{background:var(--dsw-alias-fill-secondary,#7f7f7f1f)}.QCtnxq_undo{background:var(--dsw-alias-bg-layer-2,#0000000d);max-width:560px;color:var(--dsw-alias-label-secondary,#5a5a5ae6);border-radius:8px;align-items:center;gap:10px;padding:6px 12px;font-size:12px;line-height:18px;display:flex}.QCtnxq_undo>span{flex:1;min-width:0}.QCtnxq_undo>button{color:var(--dsw-alias-state-business-primary,#4176e6);font:inherit;cursor:pointer;background:0 0;border:none;flex:none;padding:0;font-weight:600}.QCtnxq_removeOpen{color:var(--dsw-alias-text-error,#d9363e)}.QCtnxq_notice{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);padding:4px 8px;font-size:12px;line-height:18px}.QCtnxq_error{color:var(--dsw-alias-text-error,#d9363e);padding:4px 8px;font-size:12px;line-height:18px}.QCtnxq_guide{text-align:center;flex-direction:column;justify-content:center;align-items:center;gap:10px;height:100%;min-height:280px;padding:24px;display:flex}.QCtnxq_guideIcon{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);margin-bottom:2px;display:inline-flex}.QCtnxq_guideTitle{color:var(--dsw-alias-label-primary,#1f2329);margin:0;font-size:15px;font-weight:500;line-height:22px}.QCtnxq_guideHint{max-width:420px;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);margin:0 0 6px;font-size:13px;line-height:20px}";
32230
- const tagId$21 = "@khorsheed/dsh-room/MembersView.module.css";
32231
- if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$21) + "]") === null) {
32875
+ const css$22 = ".QCtnxq_members{flex-direction:column;gap:8px;padding:12px 16px;display:flex}.QCtnxq_toolbar{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.QCtnxq_count{color:var(--dsw-alias-label-primary,#1f2329);font-size:13px;font-weight:600}.QCtnxq_teamButton{border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#00000029);color:var(--dsw-alias-label-primary,#1f2329);font:inherit;cursor:pointer;background:0 0;border-radius:8px;margin-left:auto;padding:3px 12px;font-size:12px}.QCtnxq_teamButton:hover{background:var(--dsw-alias-bg-layer-2,#0000000d)}.QCtnxq_grid{grid-template-columns:repeat(auto-fill,minmax(340px,1fr));gap:10px;display:grid}.QCtnxq_card{border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#0000001a);background:var(--dsw-alias-bg-layer-1,#fff);border-radius:12px;flex-direction:column;gap:8px;padding:12px;font-size:13px;line-height:18px;display:flex;position:relative}.QCtnxq_head{align-items:center;gap:10px;min-width:0;display:flex}.QCtnxq_avatarTile{background:color-mix(in srgb, var(--member-color,var(--dsw-alias-label-tertiary,#7f8287)) 85%, black);color:#fff;user-select:none;border-radius:10px;flex:none;place-items:center;width:40px;height:40px;font-size:16px;font-weight:600;display:grid}.QCtnxq_identity{flex-direction:column;gap:1px;min-width:0;display:flex}.QCtnxq_name{color:var(--dsw-alias-label-primary,#1f2329);text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:600;overflow:hidden}.QCtnxq_nameRow{align-items:center;gap:6px;min-width:0;display:flex}.QCtnxq_role{background:var(--dsw-alias-bg-layer-2,#0000000d);max-width:14em;color:var(--dsw-alias-label-secondary,#5a5a5ae6);text-overflow:ellipsis;white-space:nowrap;border-radius:5px;flex:none;padding:0 6px;font-size:11px;line-height:18px;overflow:hidden}.QCtnxq_hint{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);white-space:nowrap;font-size:12px}.QCtnxq_head>.QCtnxq_chipRunning,.QCtnxq_head>.QCtnxq_chipFailed,.QCtnxq_head>.QCtnxq_chipIdle{flex:none;margin-left:auto}.QCtnxq_instructionsBlock{flex-direction:column;gap:2px;min-height:0;display:flex}.QCtnxq_instructions{-webkit-line-clamp:2;color:var(--dsw-alias-label-secondary,#5a5a5ae6);-webkit-box-orient:vertical;margin:0;font-size:12px;line-height:18px;display:-webkit-box;overflow:hidden}.QCtnxq_instructionsExpanded{color:var(--dsw-alias-label-secondary,#5a5a5ae6);white-space:pre-wrap;overflow-wrap:anywhere;margin:0;font-size:12px;line-height:18px}.QCtnxq_instructionsEmpty{color:var(--dsw-alias-label-caption,#adb2b8);margin:0;font-size:12px;line-height:18px}.QCtnxq_expandToggle{color:var(--dsw-alias-state-business-primary,#4176e6);cursor:pointer;background:0 0;border:none;align-self:flex-start;padding:0;font-size:12px;line-height:18px}.QCtnxq_foot{flex-wrap:wrap;align-items:center;gap:6px;margin-top:auto;display:flex}.QCtnxq_chipRunning,.QCtnxq_chipFailed,.QCtnxq_chipIdle{white-space:nowrap;border:none;border-radius:999px;align-items:center;padding:1px 8px;font-size:12px;line-height:18px;display:inline-flex}.QCtnxq_chipRunning{background:color-mix(in srgb, var(--dsw-alias-state-business-primary,#4176e6) 14%, transparent);color:var(--dsw-alias-state-business-primary,#4176e6);cursor:pointer;animation:2.4s ease-in-out infinite QCtnxq_room-member-chip-breathe}.QCtnxq_chipRunning:hover:not(:disabled){background:color-mix(in srgb, var(--dsw-alias-state-business-primary,#4176e6) 22%, transparent)}.QCtnxq_chipRunning:disabled{opacity:.5;cursor:default;animation:none}@keyframes QCtnxq_room-member-chip-breathe{0%,to{opacity:1}50%{opacity:.62}}@media (prefers-reduced-motion:reduce){.QCtnxq_chipRunning{animation:none}}.QCtnxq_chipFailed{background:color-mix(in srgb, var(--dsw-alias-state-error-primary,#ec1313) 12%, transparent);color:var(--dsw-alias-state-error-primary,#ec1313)}.QCtnxq_chipIdle{background:var(--dsw-alias-fill-l1,#0000000f);color:var(--dsw-alias-label-tertiary,#7f7f7fcc)}.QCtnxq_actions{align-items:center;gap:2px;margin-left:auto;display:flex}.QCtnxq_action{white-space:nowrap;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);cursor:pointer;background:0 0;border:none;border-radius:6px;padding:2px 6px;font-size:12px;line-height:16px}.QCtnxq_action:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover,#7f7f7f24);color:var(--dsw-alias-label-primary,#1f2329)}.QCtnxq_action:disabled{opacity:.4;cursor:default}.QCtnxq_invite{border:1px dashed var(--dsw-alias-border-l2,#7f7f7f66);min-height:96px;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);cursor:pointer;background:0 0;border-radius:12px;place-items:center;font-size:13px;line-height:20px;display:grid}.QCtnxq_invite:hover{background:var(--dsw-alias-interactive-bg-hover,#7f7f7f24);color:var(--dsw-alias-label-primary,#1f2329)}.QCtnxq_chipRunning:focus:not(:focus-visible),.QCtnxq_expandToggle:focus:not(:focus-visible),.QCtnxq_action:focus:not(:focus-visible),.QCtnxq_invite:focus:not(:focus-visible){outline:none}.QCtnxq_linked{flex-direction:column;gap:4px;margin-top:14px;display:flex}.QCtnxq_linkedRow{border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#00000014);background:var(--dsw-alias-bg-layer-1,#fff);min-height:36px;font-size:var(--dsh-panel-body-size,13px);border-radius:10px;align-items:center;gap:8px;padding:4px 10px;display:flex}.QCtnxq_linkedAvatar{background:color-mix(in srgb, var(--member-color,var(--dsw-alias-label-tertiary,#7f8287)) 85%, black);width:22px;height:22px;color:var(--dsw-alias-label-inverse,#fff);border-radius:50%;flex:none;place-items:center;font-size:11px;font-weight:600;display:grid}.QCtnxq_linkedName{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-primary,#1f2329);font-weight:500;overflow:hidden}.QCtnxq_linkedTag{background:var(--dsw-alias-bg-layer-2,#0000000d);color:var(--dsw-alias-label-secondary,#5a5a5ae6);border-radius:5px;flex:none;padding:0 6px;font-size:11px;line-height:18px}.QCtnxq_linkedAction{color:var(--dsw-alias-label-secondary,#5a5a5ae6);cursor:pointer;background:0 0;border:none;border-radius:6px;flex:none;padding:2px 6px;font-size:12px}.QCtnxq_linkedAction:first-of-type{margin-left:auto}.QCtnxq_linkedAction:hover{background:var(--dsw-alias-fill-secondary,#7f7f7f1f)}.QCtnxq_undo{background:var(--dsw-alias-bg-layer-2,#0000000d);max-width:560px;color:var(--dsw-alias-label-secondary,#5a5a5ae6);border-radius:8px;align-items:center;gap:10px;padding:6px 12px;font-size:12px;line-height:18px;display:flex}.QCtnxq_undo>span{flex:1;min-width:0}.QCtnxq_undo>button{color:var(--dsw-alias-state-business-primary,#4176e6);font:inherit;cursor:pointer;background:0 0;border:none;flex:none;padding:0;font-weight:600}.QCtnxq_removeOpen{color:var(--dsw-alias-text-error,#d9363e)}.QCtnxq_notice{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);padding:4px 8px;font-size:12px;line-height:18px}.QCtnxq_error{color:var(--dsw-alias-text-error,#d9363e);padding:4px 8px;font-size:12px;line-height:18px}.QCtnxq_guide{text-align:center;flex-direction:column;justify-content:center;align-items:center;gap:10px;height:100%;min-height:280px;padding:24px;display:flex}.QCtnxq_guideIcon{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);margin-bottom:2px;display:inline-flex}.QCtnxq_guideTitle{color:var(--dsw-alias-label-primary,#1f2329);margin:0;font-size:15px;font-weight:500;line-height:22px}.QCtnxq_guideHint{max-width:420px;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);margin:0 0 6px;font-size:13px;line-height:20px}";
32876
+ const tagId$22 = "@khorsheed/dsh-room/MembersView.module.css";
32877
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$22) + "]") === null) {
32232
32878
  const tag = document.createElement("style");
32233
32879
  tag.dataset.plugin = "@khorsheed/dsh-room";
32234
- tag.dataset.pluginCss = tagId$21;
32235
- tag.textContent = css$21;
32880
+ tag.dataset.pluginCss = tagId$22;
32881
+ tag.textContent = css$22;
32236
32882
  document.head.appendChild(tag);
32237
32883
  }
32238
32884
  var MembersView_module_css_default = {
32239
- "role": "QCtnxq_role",
32240
- "guideIcon": "QCtnxq_guideIcon",
32241
- "identity": "QCtnxq_identity",
32242
- "chipFailed": "QCtnxq_chipFailed",
32243
32885
  "expandToggle": "QCtnxq_expandToggle",
32886
+ "linkedAvatar": "QCtnxq_linkedAvatar",
32244
32887
  "chipIdle": "QCtnxq_chipIdle",
32245
- "foot": "QCtnxq_foot",
32246
- "instructionsExpanded": "QCtnxq_instructionsExpanded",
32247
- "grid": "QCtnxq_grid",
32248
- "notice": "QCtnxq_notice",
32249
- "instructionsEmpty": "QCtnxq_instructionsEmpty",
32250
- "chipRunning": "QCtnxq_chipRunning",
32888
+ "members": "QCtnxq_members",
32889
+ "chipFailed": "QCtnxq_chipFailed",
32890
+ "teamButton": "QCtnxq_teamButton",
32251
32891
  "avatarTile": "QCtnxq_avatarTile",
32252
- "count": "QCtnxq_count",
32253
- "linkedRow": "QCtnxq_linkedRow",
32254
- "error": "QCtnxq_error",
32255
- "linkedName": "QCtnxq_linkedName",
32892
+ "guideIcon": "QCtnxq_guideIcon",
32256
32893
  "linkedAction": "QCtnxq_linkedAction",
32257
- "linkedTag": "QCtnxq_linkedTag",
32258
- "guideHint": "QCtnxq_guideHint",
32259
32894
  "toolbar": "QCtnxq_toolbar",
32895
+ "instructionsExpanded": "QCtnxq_instructionsExpanded",
32896
+ "head": "QCtnxq_head",
32897
+ "action": "QCtnxq_action",
32898
+ "undo": "QCtnxq_undo",
32899
+ "grid": "QCtnxq_grid",
32900
+ "identity": "QCtnxq_identity",
32260
32901
  "card": "QCtnxq_card",
32261
32902
  "instructions": "QCtnxq_instructions",
32262
- "guide": "QCtnxq_guide",
32263
- "linked": "QCtnxq_linked",
32903
+ "guideHint": "QCtnxq_guideHint",
32264
32904
  "name": "QCtnxq_name",
32905
+ "instructionsEmpty": "QCtnxq_instructionsEmpty",
32906
+ "linkedRow": "QCtnxq_linkedRow",
32907
+ "linkedTag": "QCtnxq_linkedTag",
32908
+ "removeOpen": "QCtnxq_removeOpen",
32909
+ "chipRunning": "QCtnxq_chipRunning",
32910
+ "instructionsBlock": "QCtnxq_instructionsBlock",
32911
+ "hint": "QCtnxq_hint",
32912
+ "notice": "QCtnxq_notice",
32913
+ "count": "QCtnxq_count",
32914
+ "role": "QCtnxq_role",
32915
+ "foot": "QCtnxq_foot",
32265
32916
  "room-member-chip-breathe": "QCtnxq_room-member-chip-breathe",
32266
- "teamButton": "QCtnxq_teamButton",
32267
32917
  "actions": "QCtnxq_actions",
32268
- "removeOpen": "QCtnxq_removeOpen",
32269
- "members": "QCtnxq_members",
32918
+ "linked": "QCtnxq_linked",
32270
32919
  "guideTitle": "QCtnxq_guideTitle",
32271
- "undo": "QCtnxq_undo",
32272
- "hint": "QCtnxq_hint",
32273
- "action": "QCtnxq_action",
32274
- "instructionsBlock": "QCtnxq_instructionsBlock",
32275
- "nameRow": "QCtnxq_nameRow",
32276
32920
  "invite": "QCtnxq_invite",
32277
- "head": "QCtnxq_head",
32278
- "linkedAvatar": "QCtnxq_linkedAvatar"
32921
+ "guide": "QCtnxq_guide",
32922
+ "nameRow": "QCtnxq_nameRow",
32923
+ "error": "QCtnxq_error",
32924
+ "linkedName": "QCtnxq_linkedName"
32279
32925
  };
32280
32926
  //#endregion
32281
32927
  //#region src/client/MemberCard.tsx
@@ -32506,55 +33152,57 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
32506
33152
  }
32507
33153
  //#endregion
32508
33154
  //#region \0dsh-css:src/client/InviteDialog.module.css.mjs
32509
- const css$20 = ".Oz5isq_overlay{z-index:100;text-align:left;background:0 0;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.Oz5isq_card{border:1px solid var(--dsw-alias-border-l1,#7f7f7f29);background:var(--dsw-alias-bg-layer-1,#fff);width:560px;max-width:calc(100vw - 48px);max-height:calc(100vh - 96px);box-shadow:var(--dsw-shadow-lv3,0 12px 40px #0000003d);border-radius:18px;flex-direction:column;gap:20px;padding:22px 24px;display:flex;overflow-y:auto}.Oz5isq_body{gap:20px;min-width:0;display:flex}.Oz5isq_form{flex-direction:column;flex:auto;gap:12px;min-width:0;display:flex}.Oz5isq_previewCol{flex-direction:column;flex:none;gap:6px;width:208px;display:flex}.Oz5isq_previewLabel{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);font-size:12px;line-height:18px}@media (width<=640px){.Oz5isq_body{flex-direction:column-reverse}.Oz5isq_previewCol{width:auto}}.Oz5isq_title{color:var(--dsw-alias-label-primary,#1f2329);font-size:16px;font-weight:500;line-height:24px}.Oz5isq_field{flex-direction:column;gap:4px;display:flex}.Oz5isq_fieldPair{grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:12px;display:grid}.Oz5isq_fieldPair .Oz5isq_select{min-width:0}.Oz5isq_label{color:var(--dsw-alias-label-secondary,#5a5a5ae6);font-size:12px;font-weight:500;line-height:18px}.Oz5isq_input,.Oz5isq_select,.Oz5isq_textarea{border:1px solid var(--dsw-alias-border-l2,#7f7f7f3d);font:inherit;color:var(--dsw-alias-label-primary,#1f2329);background:var(--dsw-alias-bg-layer-1,#fff);border-radius:8px;outline:none;padding:6px 10px;font-size:13px;line-height:20px}.Oz5isq_input::placeholder,.Oz5isq_textarea::placeholder{color:var(--dsw-alias-label-caption,#adb2b8)}.Oz5isq_textarea{resize:vertical}.Oz5isq_input:focus,.Oz5isq_select:focus,.Oz5isq_textarea:focus{border-color:var(--dsw-alias-border-l4,#7f7f7f66);box-shadow:0 0 0 1px var(--dsw-alias-border-l4,#7f7f7f66)}.Oz5isq_hint{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);font-size:12px;line-height:18px}.Oz5isq_modelField{border:1px solid var(--dsw-alias-border-l2,#7f7f7f3d);background:var(--dsw-alias-bg-layer-1,#fff);border-radius:8px;align-items:center;display:flex;position:relative}.Oz5isq_modelField:focus-within{border-color:var(--dsw-alias-border-l4,#7f7f7f66);box-shadow:0 0 0 1px var(--dsw-alias-border-l4,#7f7f7f66)}.Oz5isq_modelInput{min-width:0;font:inherit;color:var(--dsw-alias-label-primary,#1f2329);background:0 0;border:none;outline:none;flex:auto;padding:6px 10px;font-size:13px;line-height:20px}.Oz5isq_modelInput::placeholder{color:var(--dsw-alias-label-caption,#adb2b8)}.Oz5isq_modelMenuButton{width:24px;height:24px;color:var(--dsw-alias-label-caption,#adb2b8);cursor:pointer;background:0 0;border:none;border-radius:6px;flex:none;justify-content:center;align-items:center;margin-right:4px;display:flex}.Oz5isq_modelMenuButton:hover{background:var(--dsw-alias-interactive-bg-hover,#2631480f)}.Oz5isq_modelMenuChevron{transition:transform .16s}.Oz5isq_modelMenuChevronOpen{transform:rotate(180deg)}.Oz5isq_modelMenu{z-index:10;border:1px solid var(--dsw-alias-border-l2-darkmode-thin,var(--dsw-alias-border-l2,#7f7f7f3d));background:var(--dsw-specific-menu,var(--dsw-alias-bg-layer-2,var(--dsw-alias-bg-layer-1,#fff)));min-width:160px;max-height:240px;backdrop-filter:var(--dsw-menu-backdrop-filter,blur(20px));box-shadow:var(--dsw-elevation-prominent,var(--dsw-shadow-lv3,0 12px 40px #0000003d));border-radius:12px;flex-direction:column;padding:4px;display:flex;position:absolute;top:calc(100% + 6px);left:0;right:0;overflow-y:auto}.Oz5isq_modelItem,.Oz5isq_modelItemCurrent,.Oz5isq_modelItemDefault{color:var(--dsw-alias-label-primary,#1f2329);text-align:left;white-space:nowrap;cursor:pointer;background:0 0;border:none;border-radius:8px;align-items:center;gap:8px;padding:6px 10px;font-size:12px;line-height:18px;display:flex;overflow:hidden}.Oz5isq_modelItem:hover,.Oz5isq_modelItemCurrent:hover,.Oz5isq_modelItemDefault:hover{background:var(--dsw-alias-interactive-bg-hover,#2631480f)}.Oz5isq_modelItemCurrent{font-weight:560}.Oz5isq_modelItemLabel{text-overflow:ellipsis;flex:1;min-width:0;overflow:hidden}.Oz5isq_modelItemCheck{text-align:center;width:14px;color:var(--dsw-alias-label-secondary,#5a5a5ae6);flex:none}.Oz5isq_modelItemDefault{color:var(--dsw-alias-label-secondary,#5a5a5ae6);box-shadow:0 1px 0 var(--dsw-alias-border-l2,#7f7f7f3d);border-radius:8px 8px 0 0;margin-bottom:2px;padding-bottom:7px}.Oz5isq_nameRow{align-items:center;gap:6px;display:flex}.Oz5isq_nameRow .Oz5isq_input{flex:auto;min-width:0}.Oz5isq_dice{border:1px solid var(--dsw-alias-border-l2,#7f7f7f3d);cursor:pointer;background:0 0;border-radius:8px;flex:none;padding:5px 9px;font-size:13px;line-height:20px}.Oz5isq_dice:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover,#2631480f)}.Oz5isq_dice:focus:not(:focus-visible){outline:none}.Oz5isq_advanced{display:block}.Oz5isq_advancedSummary{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);cursor:pointer;user-select:none;font-size:12px;font-weight:500;line-height:18px}.Oz5isq_advancedSummary:hover{color:var(--dsw-alias-label-primary,#1f2329)}.Oz5isq_advancedBody{flex-direction:column;gap:12px;padding-top:10px;display:flex}.Oz5isq_cwdRow{align-items:center;gap:6px;display:flex}.Oz5isq_cwdRow .Oz5isq_input{cursor:default;flex:auto;min-width:0}.Oz5isq_browse{border:1px solid var(--dsw-alias-border-l2,#7f7f7f3d);color:var(--dsw-alias-label-secondary,#5a5a5ae6);cursor:pointer;background:0 0;border-radius:8px;flex:none;padding:5px 10px;font-size:13px;line-height:20px}.Oz5isq_browse:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover,#2631480f)}.Oz5isq_browse:disabled{opacity:.45;cursor:default}.Oz5isq_browse:focus:not(:focus-visible){outline:none}.Oz5isq_error{color:var(--dsw-alias-state-error-primary,#d9363e);font-size:12px;line-height:18px}.Oz5isq_buttons{justify-content:flex-end;gap:8px;display:flex}.Oz5isq_button,.Oz5isq_primary{cursor:pointer;border-radius:999px;justify-content:center;align-items:center;height:32px;padding:0 16px;font-size:13px;font-weight:500;line-height:20px;display:inline-flex}.Oz5isq_button{border:1px solid var(--dsw-alias-border-l3,#7f7f7f4d);color:var(--dsw-alias-label-primary,#1f2329);background:0 0}.Oz5isq_button:hover{background:var(--dsw-alias-interactive-bg-hover,#2631480f)}.Oz5isq_primary{color:var(--dsw-alias-label-primary-foreground,#fff);background:var(--dsw-alias-button-primary-fill,#1f2329);border:none}.Oz5isq_primary:hover:not(:disabled){background:var(--dsw-alias-button-primary-hover,#43454a)}.Oz5isq_primary:disabled{opacity:.4;cursor:default}.Oz5isq_button:focus-visible,.Oz5isq_primary:focus-visible{outline:2px solid var(--dsw-alias-button-primary-fill,#1f2329);outline-offset:2px}.Oz5isq_button:focus:not(:focus-visible),.Oz5isq_primary:focus:not(:focus-visible){outline:none}.Oz5isq_card[data-mode=edit]{width:460px}.Oz5isq_editHead{border-bottom:1px solid var(--dsw-alias-border-l2-darkmode-thin,#00000014);flex-direction:column;gap:8px;padding-bottom:12px;display:flex}.Oz5isq_locked{flex-wrap:wrap;align-items:baseline;gap:4px 16px;margin:0;font-size:12px;line-height:18px;display:flex}.Oz5isq_locked>div{gap:6px;display:inline-flex}.Oz5isq_locked dt{color:var(--dsw-alias-label-tertiary,#7f7f7fcc)}.Oz5isq_locked dd{color:var(--dsw-alias-label-secondary,#5a5a5ae6);margin:0}.Oz5isq_lockedNote{color:var(--dsw-alias-label-tertiary,#7f7f7fcc)}";
32510
- const tagId$20 = "@khorsheed/dsh-room/InviteDialog.module.css";
32511
- if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$20) + "]") === null) {
33155
+ const css$21 = ".Oz5isq_overlay{z-index:100;text-align:left;background:0 0;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.Oz5isq_card{border:1px solid var(--dsw-alias-border-l1,#7f7f7f29);background:var(--dsw-alias-bg-layer-1,#fff);width:560px;max-width:calc(100vw - 48px);max-height:calc(100vh - 96px);box-shadow:var(--dsw-shadow-lv3,0 12px 40px #0000003d);border-radius:18px;flex-direction:column;gap:20px;padding:22px 24px;display:flex;overflow-y:auto}.Oz5isq_body{gap:20px;min-width:0;display:flex}.Oz5isq_form{flex-direction:column;flex:auto;gap:12px;min-width:0;display:flex}.Oz5isq_previewCol{flex-direction:column;flex:none;gap:6px;width:208px;display:flex}.Oz5isq_previewLabel{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);font-size:12px;line-height:18px}@media (width<=640px){.Oz5isq_body{flex-direction:column-reverse}.Oz5isq_previewCol{width:auto}}.Oz5isq_title{color:var(--dsw-alias-label-primary,#1f2329);font-size:16px;font-weight:500;line-height:24px}.Oz5isq_field{flex-direction:column;gap:4px;display:flex}.Oz5isq_fieldPair{grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:12px;display:grid}.Oz5isq_fieldPair .Oz5isq_select{min-width:0}.Oz5isq_label{color:var(--dsw-alias-label-secondary,#5a5a5ae6);font-size:12px;font-weight:500;line-height:18px}.Oz5isq_input,.Oz5isq_select,.Oz5isq_textarea{border:1px solid var(--dsw-alias-border-l2,#7f7f7f3d);font:inherit;color:var(--dsw-alias-label-primary,#1f2329);background:var(--dsw-alias-bg-layer-1,#fff);border-radius:8px;outline:none;padding:6px 10px;font-size:13px;line-height:20px}.Oz5isq_select{appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath d='M3 4.5l3 3 3-3' fill='none' stroke='%238f959e' stroke-width='1.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\");background-position:right 12px center;background-repeat:no-repeat;background-size:12px 12px;padding-right:32px}.Oz5isq_input::placeholder,.Oz5isq_textarea::placeholder{color:var(--dsw-alias-label-caption,#adb2b8)}.Oz5isq_textarea{resize:vertical}.Oz5isq_input:focus,.Oz5isq_select:focus,.Oz5isq_textarea:focus{border-color:var(--dsw-alias-border-l4,#7f7f7f66);box-shadow:0 0 0 1px var(--dsw-alias-border-l4,#7f7f7f66)}.Oz5isq_hint{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);font-size:12px;line-height:18px}.Oz5isq_hintError{color:var(--dsw-alias-state-error-primary,#d9363e)}.Oz5isq_modelField{border:1px solid var(--dsw-alias-border-l2,#7f7f7f3d);background:var(--dsw-alias-bg-layer-1,#fff);border-radius:8px;align-items:center;display:flex;position:relative}.Oz5isq_modelField:focus-within{border-color:var(--dsw-alias-border-l4,#7f7f7f66);box-shadow:0 0 0 1px var(--dsw-alias-border-l4,#7f7f7f66)}.Oz5isq_modelInput{min-width:0;font:inherit;color:var(--dsw-alias-label-primary,#1f2329);background:0 0;border:none;outline:none;flex:auto;padding:6px 10px;font-size:13px;line-height:20px}.Oz5isq_modelInput::placeholder{color:var(--dsw-alias-label-caption,#adb2b8)}.Oz5isq_modelMenuButton{width:24px;height:24px;color:var(--dsw-alias-label-caption,#adb2b8);cursor:pointer;background:0 0;border:none;border-radius:6px;flex:none;justify-content:center;align-items:center;margin-right:4px;display:flex}.Oz5isq_modelMenuButton:hover{background:var(--dsw-alias-interactive-bg-hover,#2631480f)}.Oz5isq_modelMenuChevron{transition:transform .16s}.Oz5isq_modelMenuChevronOpen{transform:rotate(180deg)}.Oz5isq_modelMenu{z-index:10;border:1px solid var(--dsw-alias-border-l2-darkmode-thin,var(--dsw-alias-border-l2,#7f7f7f3d));background:var(--dsw-specific-menu,var(--dsw-alias-bg-layer-2,var(--dsw-alias-bg-layer-1,#fff)));min-width:160px;max-height:240px;backdrop-filter:var(--dsw-menu-backdrop-filter,blur(20px));box-shadow:var(--dsw-elevation-prominent,var(--dsw-shadow-lv3,0 12px 40px #0000003d));border-radius:12px;flex-direction:column;padding:4px;display:flex;position:absolute;top:calc(100% + 6px);left:0;right:0;overflow-y:auto}.Oz5isq_modelItem,.Oz5isq_modelItemCurrent,.Oz5isq_modelItemDefault{color:var(--dsw-alias-label-primary,#1f2329);text-align:left;white-space:nowrap;cursor:pointer;background:0 0;border:none;border-radius:8px;align-items:center;gap:8px;padding:6px 10px;font-size:12px;line-height:18px;display:flex;overflow:hidden}.Oz5isq_modelItem:hover,.Oz5isq_modelItemCurrent:hover,.Oz5isq_modelItemDefault:hover{background:var(--dsw-alias-interactive-bg-hover,#2631480f)}.Oz5isq_modelItemCurrent{font-weight:560}.Oz5isq_modelItemLabel{text-overflow:ellipsis;flex:1;min-width:0;overflow:hidden}.Oz5isq_modelItemCheck{text-align:center;width:14px;color:var(--dsw-alias-label-secondary,#5a5a5ae6);flex:none}.Oz5isq_modelItemDefault{color:var(--dsw-alias-label-secondary,#5a5a5ae6);box-shadow:0 1px 0 var(--dsw-alias-border-l2,#7f7f7f3d);border-radius:8px 8px 0 0;margin-bottom:2px;padding-bottom:7px}.Oz5isq_nameRow{align-items:center;gap:6px;display:flex}.Oz5isq_nameRow .Oz5isq_input{flex:auto;min-width:0}.Oz5isq_dice{border:1px solid var(--dsw-alias-border-l2,#7f7f7f3d);cursor:pointer;background:0 0;border-radius:8px;flex:none;padding:5px 9px;font-size:13px;line-height:20px}.Oz5isq_dice:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover,#2631480f)}.Oz5isq_dice:focus:not(:focus-visible){outline:none}.Oz5isq_advanced{display:block}.Oz5isq_advancedSummary{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);cursor:pointer;user-select:none;font-size:12px;font-weight:500;line-height:18px}.Oz5isq_advancedSummary:hover{color:var(--dsw-alias-label-primary,#1f2329)}.Oz5isq_advancedBody{flex-direction:column;gap:12px;padding-top:10px;display:flex}.Oz5isq_cwdRow{align-items:center;gap:6px;display:flex}.Oz5isq_cwdRow .Oz5isq_input{cursor:default;flex:auto;min-width:0}.Oz5isq_browse{border:1px solid var(--dsw-alias-border-l2,#7f7f7f3d);color:var(--dsw-alias-label-secondary,#5a5a5ae6);cursor:pointer;background:0 0;border-radius:8px;flex:none;padding:5px 10px;font-size:13px;line-height:20px}.Oz5isq_browse:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover,#2631480f)}.Oz5isq_browse:disabled{opacity:.45;cursor:default}.Oz5isq_browse:focus:not(:focus-visible){outline:none}.Oz5isq_error{color:var(--dsw-alias-state-error-primary,#d9363e);font-size:12px;line-height:18px}.Oz5isq_buttons{justify-content:flex-end;gap:8px;display:flex}.Oz5isq_button,.Oz5isq_primary{cursor:pointer;border-radius:999px;justify-content:center;align-items:center;height:32px;padding:0 16px;font-size:13px;font-weight:500;line-height:20px;display:inline-flex}.Oz5isq_button{border:1px solid var(--dsw-alias-border-l3,#7f7f7f4d);color:var(--dsw-alias-label-primary,#1f2329);background:0 0}.Oz5isq_button:hover{background:var(--dsw-alias-interactive-bg-hover,#2631480f)}.Oz5isq_primary{color:var(--dsw-alias-label-primary-foreground,#fff);background:var(--dsw-alias-button-primary-fill,#1f2329);border:none}.Oz5isq_primary:hover:not(:disabled){background:var(--dsw-alias-button-primary-hover,#43454a)}.Oz5isq_primary:disabled{opacity:.4;cursor:default}.Oz5isq_button:focus-visible,.Oz5isq_primary:focus-visible{outline:2px solid var(--dsw-alias-button-primary-fill,#1f2329);outline-offset:2px}.Oz5isq_button:focus:not(:focus-visible),.Oz5isq_primary:focus:not(:focus-visible){outline:none}.Oz5isq_card[data-mode=edit]{width:460px}.Oz5isq_editHead{border-bottom:1px solid var(--dsw-alias-border-l2-darkmode-thin,#00000014);flex-direction:column;gap:8px;padding-bottom:12px;display:flex}.Oz5isq_locked{flex-wrap:wrap;align-items:baseline;gap:4px 16px;margin:0;font-size:12px;line-height:18px;display:flex}.Oz5isq_locked>div{gap:6px;display:inline-flex}.Oz5isq_locked dt{color:var(--dsw-alias-label-tertiary,#7f7f7fcc)}.Oz5isq_locked dd{color:var(--dsw-alias-label-secondary,#5a5a5ae6);margin:0}.Oz5isq_lockedNote{color:var(--dsw-alias-label-tertiary,#7f7f7fcc)}.Oz5isq_memberConfiguration summary{border:1px solid var(--dsw-alias-border-l2,#7f7f7f3d);color:var(--dsw-alias-label-primary,#1f2329);background:var(--dsw-alias-bg-layer-1,#fff);cursor:pointer;border-radius:8px;justify-content:space-between;align-items:center;gap:8px;padding:6px 10px;font-size:13px;line-height:20px;list-style:none;display:flex}.Oz5isq_memberConfiguration summary::-webkit-details-marker{display:none}.Oz5isq_memberConfiguration summary:after{content:\"\";border-right:1.5px solid var(--dsw-alias-label-secondary,#1f2329b3);border-bottom:1.5px solid var(--dsw-alias-label-secondary,#1f2329b3);flex:none;width:7px;height:7px;margin:0 3px 3px 0;transform:rotate(45deg)}.Oz5isq_memberConfiguration summary:hover{border-color:var(--dsw-alias-border-l4,#7f7f7f66)}";
33156
+ const tagId$21 = "@khorsheed/dsh-room/InviteDialog.module.css";
33157
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$21) + "]") === null) {
32512
33158
  const tag = document.createElement("style");
32513
33159
  tag.dataset.plugin = "@khorsheed/dsh-room";
32514
- tag.dataset.pluginCss = tagId$20;
32515
- tag.textContent = css$20;
33160
+ tag.dataset.pluginCss = tagId$21;
33161
+ tag.textContent = css$21;
32516
33162
  document.head.appendChild(tag);
32517
33163
  }
32518
33164
  var InviteDialog_module_css_default = {
32519
- "lockedNote": "Oz5isq_lockedNote",
32520
- "title": "Oz5isq_title",
32521
33165
  "form": "Oz5isq_form",
33166
+ "textarea": "Oz5isq_textarea",
33167
+ "body": "Oz5isq_body",
33168
+ "hintError": "Oz5isq_hintError",
33169
+ "select": "Oz5isq_select",
33170
+ "input": "Oz5isq_input",
32522
33171
  "modelField": "Oz5isq_modelField",
32523
33172
  "modelInput": "Oz5isq_modelInput",
32524
- "modelItemCurrent": "Oz5isq_modelItemCurrent",
33173
+ "hint": "Oz5isq_hint",
33174
+ "modelItemDefault": "Oz5isq_modelItemDefault",
33175
+ "editHead": "Oz5isq_editHead",
33176
+ "locked": "Oz5isq_locked",
32525
33177
  "label": "Oz5isq_label",
32526
- "fieldPair": "Oz5isq_fieldPair",
32527
- "textarea": "Oz5isq_textarea",
32528
- "previewLabel": "Oz5isq_previewLabel",
32529
- "field": "Oz5isq_field",
33178
+ "modelItem": "Oz5isq_modelItem",
33179
+ "modelMenu": "Oz5isq_modelMenu",
33180
+ "dice": "Oz5isq_dice",
32530
33181
  "advanced": "Oz5isq_advanced",
32531
- "previewCol": "Oz5isq_previewCol",
32532
- "button": "Oz5isq_button",
33182
+ "lockedNote": "Oz5isq_lockedNote",
33183
+ "title": "Oz5isq_title",
33184
+ "previewLabel": "Oz5isq_previewLabel",
33185
+ "browse": "Oz5isq_browse",
33186
+ "memberConfiguration": "Oz5isq_memberConfiguration",
33187
+ "overlay": "Oz5isq_overlay",
32533
33188
  "modelItemLabel": "Oz5isq_modelItemLabel",
33189
+ "field": "Oz5isq_field",
33190
+ "primary": "Oz5isq_primary",
33191
+ "modelItemCurrent": "Oz5isq_modelItemCurrent",
32534
33192
  "modelMenuChevron": "Oz5isq_modelMenuChevron",
32535
- "advancedSummary": "Oz5isq_advancedSummary",
32536
- "overlay": "Oz5isq_overlay",
32537
- "browse": "Oz5isq_browse",
32538
- "advancedBody": "Oz5isq_advancedBody",
32539
- "modelMenuChevronOpen": "Oz5isq_modelMenuChevronOpen",
32540
- "card": "Oz5isq_card",
32541
- "input": "Oz5isq_input",
32542
33193
  "modelItemCheck": "Oz5isq_modelItemCheck",
32543
- "nameRow": "Oz5isq_nameRow",
32544
33194
  "modelMenuButton": "Oz5isq_modelMenuButton",
32545
- "modelMenu": "Oz5isq_modelMenu",
32546
- "buttons": "Oz5isq_buttons",
32547
- "editHead": "Oz5isq_editHead",
32548
- "body": "Oz5isq_body",
32549
- "dice": "Oz5isq_dice",
32550
- "primary": "Oz5isq_primary",
32551
33195
  "error": "Oz5isq_error",
32552
- "cwdRow": "Oz5isq_cwdRow",
32553
- "select": "Oz5isq_select",
32554
- "modelItem": "Oz5isq_modelItem",
32555
- "hint": "Oz5isq_hint",
32556
- "modelItemDefault": "Oz5isq_modelItemDefault",
32557
- "locked": "Oz5isq_locked"
33196
+ "advancedBody": "Oz5isq_advancedBody",
33197
+ "advancedSummary": "Oz5isq_advancedSummary",
33198
+ "buttons": "Oz5isq_buttons",
33199
+ "card": "Oz5isq_card",
33200
+ "modelMenuChevronOpen": "Oz5isq_modelMenuChevronOpen",
33201
+ "previewCol": "Oz5isq_previewCol",
33202
+ "button": "Oz5isq_button",
33203
+ "fieldPair": "Oz5isq_fieldPair",
33204
+ "nameRow": "Oz5isq_nameRow",
33205
+ "cwdRow": "Oz5isq_cwdRow"
32558
33206
  };
32559
33207
  //#endregion
32560
33208
  //#region src/client/InviteDialog.tsx
@@ -32709,7 +33357,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
32709
33357
  memberModel,
32710
33358
  editChild
32711
33359
  ]);
32712
- const canSubmit = mode === "edit" ? validName(name) : (native || localAgentAvailable) && chosen !== "" && validName(name);
33360
+ const canSubmit = mode === "edit" ? validName(name) && !(name !== member?.name && existingNames.includes(name)) : (native || localAgentAvailable) && chosen !== "" && validName(name) && !existingNames.includes(name);
32713
33361
  const modelChoices = surface?.choices ?? [];
32714
33362
  const surfaceDefault = surface?.effective ?? surface?.cliDefault;
32715
33363
  const modelPlaceholder = mode === "edit" ? t("invite.modelPlaceholderEdit") : surfaceDefault !== void 0 && surfaceDefault !== "" ? t("invite.modelPlaceholderDefault", { model: surfaceDefault }) : t("invite.modelPlaceholder");
@@ -32818,6 +33466,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
32818
33466
  ...instructions.trim() === "" ? {} : { instructions: instructions.trim() },
32819
33467
  ...role.trim() === "" ? {} : { role: role.trim() }
32820
33468
  };
33469
+ const nameProblem = name === "" ? void 0 : !validName(name) ? "invite.error.invalid" : name !== member?.name && existingNames.includes(name) ? "invite.error.duplicate" : void 0;
32821
33470
  const rollDice = () => {
32822
33471
  const rolled = rollName(existingNames, name);
32823
33472
  if (rolled !== void 0) setName(rolled);
@@ -32992,7 +33641,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
32992
33641
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
32993
33642
  className: InviteDialog_module_css_default.label,
32994
33643
  children: t("invite.modelLabel")
32995
- }), memberConfiguration]
33644
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
33645
+ className: InviteDialog_module_css_default.memberConfiguration,
33646
+ children: memberConfiguration
33647
+ })]
32996
33648
  }) : memberConfiguration ?? (mode === "invite" && chosenHarness !== void 0 && (modelSurface === void 0 || surface !== void 0) ? renderHarnessModelPicker?.(chosenHarness, {
32997
33649
  value: model,
32998
33650
  onChange: setModel,
@@ -33033,9 +33685,13 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
33033
33685
  children: "🎲"
33034
33686
  })]
33035
33687
  }),
33036
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
33688
+ nameProblem === void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
33037
33689
  className: InviteDialog_module_css_default.hint,
33038
33690
  children: t("invite.nameHint")
33691
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
33692
+ className: `${InviteDialog_module_css_default.hint} ${InviteDialog_module_css_default.hintError}`,
33693
+ role: "alert",
33694
+ children: t(nameProblem)
33039
33695
  })
33040
33696
  ]
33041
33697
  }),
@@ -33205,13 +33861,13 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
33205
33861
  }
33206
33862
  //#endregion
33207
33863
  //#region \0dsh-css:src/client/InviteAgentAction.module.css.mjs
33208
- const css$19 = ".FHgm9G_trigger{appearance:none;border:1px solid var(--dsw-alias-border-l2,#80808033);color:var(--dsw-alias-label-secondary,#61666b);cursor:pointer;white-space:nowrap;background:0 0;border-radius:999px;padding:1px 10px;font-size:12px;line-height:18px}.FHgm9G_trigger:hover{background:var(--dsw-alias-fill-light,#80808014);color:var(--dsw-alias-label-primary,#0f1115)}";
33209
- const tagId$19 = "@khorsheed/dsh-room/InviteAgentAction.module.css";
33210
- if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$19) + "]") === null) {
33864
+ const css$20 = ".FHgm9G_trigger{appearance:none;border:1px solid var(--dsw-alias-border-l2,#80808033);color:var(--dsw-alias-label-secondary,#61666b);cursor:pointer;white-space:nowrap;background:0 0;border-radius:999px;padding:1px 10px;font-size:12px;line-height:18px}.FHgm9G_trigger:hover{background:var(--dsw-alias-fill-light,#80808014);color:var(--dsw-alias-label-primary,#0f1115)}";
33865
+ const tagId$20 = "@khorsheed/dsh-room/InviteAgentAction.module.css";
33866
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$20) + "]") === null) {
33211
33867
  const tag = document.createElement("style");
33212
33868
  tag.dataset.plugin = "@khorsheed/dsh-room";
33213
- tag.dataset.pluginCss = tagId$19;
33214
- tag.textContent = css$19;
33869
+ tag.dataset.pluginCss = tagId$20;
33870
+ tag.textContent = css$20;
33215
33871
  document.head.appendChild(tag);
33216
33872
  }
33217
33873
  var InviteAgentAction_module_css_default = { "trigger": "FHgm9G_trigger" };
@@ -33264,27 +33920,27 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
33264
33920
  }
33265
33921
  //#endregion
33266
33922
  //#region \0dsh-css:src/client/RoomSettingsView.module.css.mjs
33267
- const css$18 = ".RNgrsG_settings{border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#0000001a);background:var(--dsw-alias-bg-layer-1,#fff);border-radius:10px;padding:2px 12px;font-size:12px;line-height:18px}.RNgrsG_values,.RNgrsG_valuesPaused{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);white-space:nowrap}.RNgrsG_valuesPaused{color:var(--dsw-alias-state-warning,#b7791f)}.RNgrsG_rows{padding:2px 0 8px}.RNgrsG_row{flex-wrap:wrap;align-items:center;gap:8px 12px;padding:8px 0;display:flex}.RNgrsG_row+.RNgrsG_row{border-top:1px solid var(--dsw-alias-border-l2-darkmode-thin,#00000014)}.RNgrsG_label{min-width:200px;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);flex-direction:column;flex:1;display:flex}.RNgrsG_label>b{color:var(--dsw-alias-label-primary,#1f2329);font-size:13px;font-weight:600}.RNgrsG_stepper{background:var(--dsw-alias-bg-layer-2,#0000000d);border-radius:8px;align-items:center;display:inline-flex}.RNgrsG_stepper>button{width:28px;height:26px;color:var(--dsw-alias-label-secondary,#5a5a5ae6);font:inherit;cursor:pointer;background:0 0;border:none}.RNgrsG_stepper>button:disabled{opacity:.4;cursor:default}.RNgrsG_stepper>b{text-align:center;font-variant-numeric:tabular-nums;min-width:26px}.RNgrsG_error{color:var(--dsw-alias-text-error,#d9363e);margin:4px 0 0}.RNgrsG_group{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);padding:10px 0 2px;font-size:12px;font-weight:600}.RNgrsG_group+.RNgrsG_row{border-top:none}.RNgrsG_subbox{border:1px solid var(--dsw-alias-border-l2,#7f7f7f3d);border-radius:10px;margin:0 -10px 6px;padding:0 9px}.RNgrsG_subrow{flex-wrap:wrap;align-items:center;gap:8px 12px;padding:8px 0;display:flex}.RNgrsG_subrow+.RNgrsG_subrow{border-top:1px solid var(--dsw-alias-border-l2-darkmode-thin,#00000014)}";
33268
- const tagId$18 = "@khorsheed/dsh-room/RoomSettingsView.module.css";
33269
- if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$18) + "]") === null) {
33923
+ const css$19 = ".RNgrsG_settings{border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#0000001a);background:var(--dsw-alias-bg-layer-1,#fff);border-radius:10px;padding:2px 12px;font-size:12px;line-height:18px}.RNgrsG_values,.RNgrsG_valuesPaused{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);white-space:nowrap}.RNgrsG_valuesPaused{color:var(--dsw-alias-state-warning,#b7791f)}.RNgrsG_rows{padding:2px 0 8px}.RNgrsG_row{flex-wrap:wrap;align-items:center;gap:8px 12px;padding:8px 0;display:flex}.RNgrsG_row+.RNgrsG_row{border-top:1px solid var(--dsw-alias-border-l2-darkmode-thin,#00000014)}.RNgrsG_label{min-width:200px;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);flex-direction:column;flex:1;display:flex}.RNgrsG_label>b{color:var(--dsw-alias-label-primary,#1f2329);font-size:13px;font-weight:600}.RNgrsG_stepper{background:var(--dsw-alias-bg-layer-2,#0000000d);border-radius:8px;align-items:center;display:inline-flex}.RNgrsG_stepper>button{width:28px;height:26px;color:var(--dsw-alias-label-secondary,#5a5a5ae6);font:inherit;cursor:pointer;background:0 0;border:none}.RNgrsG_stepper>button:disabled{opacity:.4;cursor:default}.RNgrsG_stepper>b{text-align:center;font-variant-numeric:tabular-nums;min-width:26px}.RNgrsG_error{color:var(--dsw-alias-text-error,#d9363e);margin:4px 0 0}.RNgrsG_group{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);padding:10px 0 2px;font-size:12px;font-weight:600}.RNgrsG_group+.RNgrsG_row{border-top:none}.RNgrsG_subbox{border:1px solid var(--dsw-alias-border-l2,#7f7f7f3d);border-radius:10px;margin:0 -10px 6px;padding:0 9px}.RNgrsG_subrow{flex-wrap:wrap;align-items:center;gap:8px 12px;padding:8px 0;display:flex}.RNgrsG_subrow+.RNgrsG_subrow{border-top:1px solid var(--dsw-alias-border-l2-darkmode-thin,#00000014)}";
33924
+ const tagId$19 = "@khorsheed/dsh-room/RoomSettingsView.module.css";
33925
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$19) + "]") === null) {
33270
33926
  const tag = document.createElement("style");
33271
33927
  tag.dataset.plugin = "@khorsheed/dsh-room";
33272
- tag.dataset.pluginCss = tagId$18;
33273
- tag.textContent = css$18;
33928
+ tag.dataset.pluginCss = tagId$19;
33929
+ tag.textContent = css$19;
33274
33930
  document.head.appendChild(tag);
33275
33931
  }
33276
33932
  var RoomSettingsView_module_css_default = {
33277
- "values": "RNgrsG_values",
33278
- "valuesPaused": "RNgrsG_valuesPaused",
33933
+ "group": "RNgrsG_group",
33934
+ "settings": "RNgrsG_settings",
33279
33935
  "label": "RNgrsG_label",
33936
+ "rows": "RNgrsG_rows",
33937
+ "stepper": "RNgrsG_stepper",
33280
33938
  "subbox": "RNgrsG_subbox",
33281
33939
  "subrow": "RNgrsG_subrow",
33940
+ "valuesPaused": "RNgrsG_valuesPaused",
33941
+ "values": "RNgrsG_values",
33282
33942
  "error": "RNgrsG_error",
33283
- "settings": "RNgrsG_settings",
33284
- "group": "RNgrsG_group",
33285
- "rows": "RNgrsG_rows",
33286
- "row": "RNgrsG_row",
33287
- "stepper": "RNgrsG_stepper"
33943
+ "row": "RNgrsG_row"
33288
33944
  };
33289
33945
  //#endregion
33290
33946
  //#region src/client/RoomSettingsView.tsx
@@ -33546,24 +34202,24 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
33546
34202
  }
33547
34203
  //#endregion
33548
34204
  //#region \0dsh-css:src/client/RemoveMemberConfirm.module.css.mjs
33549
- const css$17 = ".krAKRG_layer{z-index:5;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#7f7f7f33);background:var(--dsw-specific-menu,var(--dsw-alias-bg-layer-1,#fff));width:min(340px,100% - 16px);box-shadow:var(--dsw-shadow-lv2,0 4px 16px #00000014);border-radius:12px;padding:12px 14px;font-size:12px;line-height:18px;position:absolute;bottom:40px;right:8px}.krAKRG_title{color:var(--dsw-alias-label-primary,#1f2329);margin:0 0 6px;font-size:13px;font-weight:600}.krAKRG_body,.krAKRG_list{color:var(--dsw-alias-label-secondary,#5a5a5ae6);margin:0}.krAKRG_list{padding-left:16px}.krAKRG_list li+li{margin-top:2px}.krAKRG_note{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);margin:8px 0 0}.krAKRG_actions{justify-content:flex-end;gap:8px;margin-top:10px;display:flex}.krAKRG_secondary,.krAKRG_danger{font:inherit;cursor:pointer;border-radius:8px;padding:3px 12px}.krAKRG_secondary{border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#7f7f7f4d);color:var(--dsw-alias-label-primary,#1f2329);background:0 0}.krAKRG_danger{border:1px solid var(--dsw-alias-text-error,#d9363e);background:var(--dsw-alias-text-error,#d9363e);color:#fff}.krAKRG_danger:disabled{opacity:.6;cursor:default}";
33550
- const tagId$17 = "@khorsheed/dsh-room/RemoveMemberConfirm.module.css";
33551
- if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$17) + "]") === null) {
34205
+ const css$18 = ".krAKRG_layer{z-index:5;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#7f7f7f33);background:var(--dsw-specific-menu,var(--dsw-alias-bg-layer-1,#fff));width:min(340px,100% - 16px);box-shadow:var(--dsw-shadow-lv2,0 4px 16px #00000014);border-radius:12px;padding:12px 14px;font-size:12px;line-height:18px;position:absolute;bottom:40px;right:8px}.krAKRG_title{color:var(--dsw-alias-label-primary,#1f2329);margin:0 0 6px;font-size:13px;font-weight:600}.krAKRG_body,.krAKRG_list{color:var(--dsw-alias-label-secondary,#5a5a5ae6);margin:0}.krAKRG_list{padding-left:16px}.krAKRG_list li+li{margin-top:2px}.krAKRG_note{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);margin:8px 0 0}.krAKRG_actions{justify-content:flex-end;gap:8px;margin-top:10px;display:flex}.krAKRG_secondary,.krAKRG_danger{font:inherit;cursor:pointer;border-radius:8px;padding:3px 12px}.krAKRG_secondary{border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#7f7f7f4d);color:var(--dsw-alias-label-primary,#1f2329);background:0 0}.krAKRG_danger{border:1px solid var(--dsw-alias-text-error,#d9363e);background:var(--dsw-alias-text-error,#d9363e);color:#fff}.krAKRG_danger:disabled{opacity:.6;cursor:default}";
34206
+ const tagId$18 = "@khorsheed/dsh-room/RemoveMemberConfirm.module.css";
34207
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$18) + "]") === null) {
33552
34208
  const tag = document.createElement("style");
33553
34209
  tag.dataset.plugin = "@khorsheed/dsh-room";
33554
- tag.dataset.pluginCss = tagId$17;
33555
- tag.textContent = css$17;
34210
+ tag.dataset.pluginCss = tagId$18;
34211
+ tag.textContent = css$18;
33556
34212
  document.head.appendChild(tag);
33557
34213
  }
33558
34214
  var RemoveMemberConfirm_module_css_default = {
33559
- "body": "krAKRG_body",
33560
- "note": "krAKRG_note",
33561
34215
  "list": "krAKRG_list",
33562
- "secondary": "krAKRG_secondary",
34216
+ "note": "krAKRG_note",
33563
34217
  "actions": "krAKRG_actions",
34218
+ "body": "krAKRG_body",
33564
34219
  "layer": "krAKRG_layer",
34220
+ "danger": "krAKRG_danger",
33565
34221
  "title": "krAKRG_title",
33566
- "danger": "krAKRG_danger"
34222
+ "secondary": "krAKRG_secondary"
33567
34223
  };
33568
34224
  //#endregion
33569
34225
  //#region src/client/RemoveMemberConfirm.tsx
@@ -34291,23 +34947,23 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
34291
34947
  }
34292
34948
  //#endregion
34293
34949
  //#region \0dsh-css:src/client/RoomStatsLine.module.css.mjs
34294
- const css$16 = ".mlqOeW_root{text-align:center;max-width:var(--dsh-chat-content-width,780px);box-sizing:border-box;width:100%;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);white-space:nowrap;text-overflow:ellipsis;margin:0 auto;padding:4px 16px 0;font-size:12px;line-height:20px;display:block;overflow:hidden}.mlqOeW_sep{color:var(--dsw-alias-separator-primary,#7f7f7f66);margin:0 10px}.mlqOeW_withMembers{max-width:var(--dsh-chat-content-width,780px);box-sizing:border-box;width:100%;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);justify-content:center;align-items:baseline;margin:0 auto;padding:4px 16px 0;font-size:12px;line-height:20px;display:flex;position:relative}.mlqOeW_withMembers .mlqOeW_root{flex:0 auto;width:auto;min-width:0;margin:0;padding:0}.mlqOeW_membersChip{color:inherit;font:inherit;white-space:nowrap;cursor:pointer;background:0 0;border:none;border-radius:6px;flex:none;padding:0 4px}.mlqOeW_membersChip:hover,.mlqOeW_membersChip[aria-expanded=true]{color:var(--dsw-alias-label-secondary,#5a5a5ae6);background:var(--dsw-alias-interactive-bg-hover,#0000000a)}.mlqOeW_breakdown{z-index:10;border:1px solid var(--dsw-alias-border-l2-darkmode-thin,var(--dsw-alias-border-l2,#0000001a));background:var(--dsw-specific-menu,var(--dsw-alias-bg-layer-2,var(--dsw-alias-bg-layer-1,#fff)));min-width:min(420px,100vw - 32px);backdrop-filter:var(--dsw-menu-backdrop-filter,blur(20px));box-shadow:var(--dsw-elevation-prominent,0 12px 32px #0000001f);text-align:left;border-radius:12px;padding:6px 0;position:absolute;bottom:calc(100% + 6px);left:50%;transform:translate(-50%)}.mlqOeW_breakdown table{border-collapse:collapse;font-variant-numeric:tabular-nums;width:100%}.mlqOeW_breakdown th,.mlqOeW_breakdown td{white-space:nowrap;padding:3px 12px;font-weight:400}.mlqOeW_breakdown th{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);text-align:left}.mlqOeW_breakdown td{color:var(--dsw-alias-label-secondary,#5a5a5ae6)}.mlqOeW_breakdown td.mlqOeW_name{color:var(--dsw-alias-label-primary,#1f2329)}.mlqOeW_breakdown .mlqOeW_num{text-align:right}";
34295
- const tagId$16 = "@khorsheed/dsh-room/RoomStatsLine.module.css";
34296
- if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$16) + "]") === null) {
34950
+ const css$17 = ".mlqOeW_root{text-align:center;max-width:var(--dsh-chat-content-width,780px);box-sizing:border-box;width:100%;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);white-space:nowrap;text-overflow:ellipsis;margin:0 auto;padding:4px 16px 0;font-size:12px;line-height:20px;display:block;overflow:hidden}.mlqOeW_sep{color:var(--dsw-alias-separator-primary,#7f7f7f66);margin:0 10px}.mlqOeW_withMembers{max-width:var(--dsh-chat-content-width,780px);box-sizing:border-box;width:100%;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);justify-content:center;align-items:baseline;margin:0 auto;padding:4px 16px 0;font-size:12px;line-height:20px;display:flex;position:relative}.mlqOeW_withMembers .mlqOeW_root{flex:0 auto;width:auto;min-width:0;margin:0;padding:0}.mlqOeW_membersChip{color:inherit;font:inherit;white-space:nowrap;cursor:pointer;background:0 0;border:none;border-radius:6px;flex:none;padding:0 4px}.mlqOeW_membersChip:hover,.mlqOeW_membersChip[aria-expanded=true]{color:var(--dsw-alias-label-secondary,#5a5a5ae6);background:var(--dsw-alias-interactive-bg-hover,#0000000a)}.mlqOeW_breakdown{z-index:10;border:1px solid var(--dsw-alias-border-l2-darkmode-thin,var(--dsw-alias-border-l2,#0000001a));background:var(--dsw-specific-menu,var(--dsw-alias-bg-layer-2,var(--dsw-alias-bg-layer-1,#fff)));min-width:min(420px,100vw - 32px);backdrop-filter:var(--dsw-menu-backdrop-filter,blur(20px));box-shadow:var(--dsw-elevation-prominent,0 12px 32px #0000001f);text-align:left;border-radius:12px;padding:6px 0;position:absolute;bottom:calc(100% + 6px);left:50%;transform:translate(-50%)}.mlqOeW_breakdown table{border-collapse:collapse;font-variant-numeric:tabular-nums;width:100%}.mlqOeW_breakdown th,.mlqOeW_breakdown td{white-space:nowrap;padding:3px 12px;font-weight:400}.mlqOeW_breakdown th{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);text-align:left}.mlqOeW_breakdown td{color:var(--dsw-alias-label-secondary,#5a5a5ae6)}.mlqOeW_breakdown td.mlqOeW_name{color:var(--dsw-alias-label-primary,#1f2329)}.mlqOeW_breakdown .mlqOeW_num{text-align:right}";
34951
+ const tagId$17 = "@khorsheed/dsh-room/RoomStatsLine.module.css";
34952
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$17) + "]") === null) {
34297
34953
  const tag = document.createElement("style");
34298
34954
  tag.dataset.plugin = "@khorsheed/dsh-room";
34299
- tag.dataset.pluginCss = tagId$16;
34300
- tag.textContent = css$16;
34955
+ tag.dataset.pluginCss = tagId$17;
34956
+ tag.textContent = css$17;
34301
34957
  document.head.appendChild(tag);
34302
34958
  }
34303
34959
  var RoomStatsLine_module_css_default = {
34304
- "num": "mlqOeW_num",
34305
34960
  "root": "mlqOeW_root",
34306
34961
  "withMembers": "mlqOeW_withMembers",
34307
- "sep": "mlqOeW_sep",
34308
34962
  "membersChip": "mlqOeW_membersChip",
34309
34963
  "breakdown": "mlqOeW_breakdown",
34310
- "name": "mlqOeW_name"
34964
+ "name": "mlqOeW_name",
34965
+ "num": "mlqOeW_num",
34966
+ "sep": "mlqOeW_sep"
34311
34967
  };
34312
34968
  //#endregion
34313
34969
  //#region src/client/RoomStatsLine.tsx
@@ -34409,7 +35065,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
34409
35065
  const order = state.members.map((member) => member.name);
34410
35066
  return [...rows.values()].sort((a, b) => order.indexOf(a.member) - order.indexOf(b.member));
34411
35067
  }
34412
- const RoomStatsLine = (0, react.memo)(function RoomStatsLine({ useProjection, state, t }) {
35068
+ const RoomStatsLine = (0, react.memo)(function RoomStatsLine({ useProjection, state, membersOnly = false, t }) {
34413
35069
  const members = memberUsage(state);
34414
35070
  const [open, setOpen] = (0, react.useState)(false);
34415
35071
  const membersRef = (0, react.useRef)(null);
@@ -34450,6 +35106,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
34450
35106
  output: formatTokens$1(usage.outputTokens)
34451
35107
  }));
34452
35108
  }
35109
+ if (membersOnly) groups.length = 0;
34453
35110
  const line = groups.join(" | ");
34454
35111
  const rootRef = (0, react.useRef)(null);
34455
35112
  const [truncated, setTruncated] = (0, react.useState)(false);
@@ -34551,29 +35208,29 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
34551
35208
  });
34552
35209
  //#endregion
34553
35210
  //#region \0dsh-css:src/client/RoomPlanView.module.css.mjs
34554
- const css$15 = ".rlOoWW_root{color:var(--dsw-alias-label-primary,#333);border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#7f7f7f40);border-radius:10px;min-width:0;max-height:min(45vh,420px);margin:6px 0;padding:10px 12px;font-size:12px;overflow:auto}.rlOoWW_root summary{cursor:pointer;overflow-wrap:anywhere}.rlOoWW_root p{margin:8px 0}.rlOoWW_root button{font:inherit;color:inherit;border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#7f7f7f40);cursor:pointer;background:0 0;border-radius:6px;padding:5px 9px}.rlOoWW_root button:disabled{opacity:.45;cursor:default}.rlOoWW_root a{color:var(--dsw-alias-button-info-fill,#315ad5);overflow-wrap:anywhere}.rlOoWW_fields{gap:8px;margin-top:10px;display:grid}.rlOoWW_fields label{gap:4px;display:grid}.rlOoWW_fields textarea{box-sizing:border-box;resize:vertical;width:100%;min-height:52px;font:inherit;color:inherit;border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#7f7f7f40);background:0 0;border-radius:6px;padding:6px}.rlOoWW_budget{grid-template-columns:repeat(auto-fit,minmax(110px,1fr));gap:8px;margin:10px 0;display:grid}.rlOoWW_budget label{gap:4px;display:grid}.rlOoWW_budget input{box-sizing:border-box;width:100%;font:inherit;color:inherit;border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#7f7f7f40);background:0 0;border-radius:5px;padding:4px}.rlOoWW_actions{flex-wrap:wrap;gap:6px;margin:8px 0;display:flex}.rlOoWW_stage,.rlOoWW_task,.rlOoWW_childTask,.rlOoWW_attempt,.rlOoWW_review{border-top:1px solid var(--dsw-alias-border-l2-darkmode-thin,#7f7f7f40);margin-top:10px;padding-top:8px}.rlOoWW_childTask{margin-left:14px}.rlOoWW_attempt{padding-left:10px}.rlOoWW_text{white-space:pre-wrap;overflow-wrap:anywhere}.rlOoWW_reference{overflow-wrap:anywhere;font-family:monospace}.rlOoWW_dependency{margin-right:8px}.rlOoWW_expanded{border:0;max-height:none;margin:0;padding:16px;font-size:13px;overflow:visible}";
34555
- const tagId$15 = "@khorsheed/dsh-room/RoomPlanView.module.css";
34556
- if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$15) + "]") === null) {
35211
+ const css$16 = ".rlOoWW_root{color:var(--dsw-alias-label-primary,#333);border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#7f7f7f40);border-radius:10px;min-width:0;max-height:min(45vh,420px);margin:6px 0;padding:10px 12px;font-size:12px;overflow:auto}.rlOoWW_root summary{cursor:pointer;overflow-wrap:anywhere}.rlOoWW_root p{margin:8px 0}.rlOoWW_root button{font:inherit;color:inherit;border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#7f7f7f40);cursor:pointer;background:0 0;border-radius:6px;padding:5px 9px}.rlOoWW_root button:disabled{opacity:.45;cursor:default}.rlOoWW_root a{color:var(--dsw-alias-button-info-fill,#315ad5);overflow-wrap:anywhere}.rlOoWW_fields{gap:8px;margin-top:10px;display:grid}.rlOoWW_fields label{gap:4px;display:grid}.rlOoWW_fields textarea{box-sizing:border-box;resize:vertical;width:100%;min-height:52px;font:inherit;color:inherit;border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#7f7f7f40);background:0 0;border-radius:6px;padding:6px}.rlOoWW_budget{grid-template-columns:repeat(auto-fit,minmax(110px,1fr));gap:8px;margin:10px 0;display:grid}.rlOoWW_budget label{gap:4px;display:grid}.rlOoWW_budget input{box-sizing:border-box;width:100%;font:inherit;color:inherit;border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#7f7f7f40);background:0 0;border-radius:5px;padding:4px}.rlOoWW_actions{flex-wrap:wrap;gap:6px;margin:8px 0;display:flex}.rlOoWW_stage,.rlOoWW_task,.rlOoWW_childTask,.rlOoWW_attempt,.rlOoWW_review{border-top:1px solid var(--dsw-alias-border-l2-darkmode-thin,#7f7f7f40);margin-top:10px;padding-top:8px}.rlOoWW_childTask{margin-left:14px}.rlOoWW_attempt{padding-left:10px}.rlOoWW_text{white-space:pre-wrap;overflow-wrap:anywhere}.rlOoWW_reference{overflow-wrap:anywhere;font-family:monospace}.rlOoWW_dependency{margin-right:8px}.rlOoWW_expanded{border:0;max-height:none;margin:0;padding:16px;font-size:13px;overflow:visible}";
35212
+ const tagId$16 = "@khorsheed/dsh-room/RoomPlanView.module.css";
35213
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$16) + "]") === null) {
34557
35214
  const tag = document.createElement("style");
34558
35215
  tag.dataset.plugin = "@khorsheed/dsh-room";
34559
- tag.dataset.pluginCss = tagId$15;
34560
- tag.textContent = css$15;
35216
+ tag.dataset.pluginCss = tagId$16;
35217
+ tag.textContent = css$16;
34561
35218
  document.head.appendChild(tag);
34562
35219
  }
34563
35220
  var RoomPlanView_module_css_default = {
35221
+ "stage": "rlOoWW_stage",
35222
+ "text": "rlOoWW_text",
35223
+ "reference": "rlOoWW_reference",
35224
+ "fields": "rlOoWW_fields",
35225
+ "childTask": "rlOoWW_childTask",
35226
+ "attempt": "rlOoWW_attempt",
34564
35227
  "review": "rlOoWW_review",
34565
35228
  "dependency": "rlOoWW_dependency",
34566
35229
  "expanded": "rlOoWW_expanded",
35230
+ "actions": "rlOoWW_actions",
34567
35231
  "task": "rlOoWW_task",
34568
- "text": "rlOoWW_text",
34569
35232
  "root": "rlOoWW_root",
34570
- "stage": "rlOoWW_stage",
34571
- "reference": "rlOoWW_reference",
34572
- "fields": "rlOoWW_fields",
34573
- "budget": "rlOoWW_budget",
34574
- "actions": "rlOoWW_actions",
34575
- "childTask": "rlOoWW_childTask",
34576
- "attempt": "rlOoWW_attempt"
35233
+ "budget": "rlOoWW_budget"
34577
35234
  };
34578
35235
  //#endregion
34579
35236
  //#region src/client/RoomRecoveryView.tsx
@@ -34778,22 +35435,22 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
34778
35435
  }
34779
35436
  //#endregion
34780
35437
  //#region \0dsh-css:src/client/RoomTaskCapsule.module.css.mjs
34781
- const css$14 = "._17va5q_root{box-sizing:border-box;margin:0 auto var(--dsh-composer-stack-gap,6px);width:calc(100% - 4 * var(--dsh-composer-dock-inset,8px));max-width:calc(var(--dsh-composer-card-max-width,780px) - 4 * var(--dsh-composer-dock-inset,8px));flex-direction:column;flex:none;gap:6px;display:flex}._17va5q_capsules{align-items:center;gap:6px;min-width:0;display:flex}._17va5q_capsule{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#0000001a);min-width:0;max-width:60%;height:28px;color:var(--dsw-alias-label-secondary,#61666b);white-space:nowrap;cursor:pointer;background:0 0;border-radius:24px;align-items:center;gap:6px;padding:0 10px;font-size:13px;font-weight:500;line-height:20px;display:inline-flex;position:relative;overflow:hidden}._17va5q_capsule:hover{border-color:var(--dsw-alias-border-l3,#0000001f);background:var(--dsw-alias-interactive-bg-hover,#2631480f)}._17va5q_capsule[data-attention]{border-color:color-mix(in srgb, var(--dsw-alias-state-warning,#c08419) 35%, transparent);background:color-mix(in srgb, var(--dsw-alias-state-warning,#c08419) 12%, transparent);color:var(--dsw-alias-state-warning,#c08419)}._17va5q_dot{background:var(--dsw-alias-state-success,#1f9a55);border-radius:50%;flex:none;width:8px;height:8px}._17va5q_guide{color:var(--dsw-alias-label-tertiary,#81858c);flex:none}._17va5q_capsule[data-running]:after{content:\"\";background:linear-gradient(90deg, transparent 0%, color-mix(in srgb, var(--dsw-alias-bg-base,#fff) 60%, transparent) 55%, transparent 100%);pointer-events:none;width:120px;animation:2.6s ease-out infinite _17va5q_room-task-capsule-sweep;position:absolute;top:0;bottom:0;left:0}@keyframes _17va5q_room-task-capsule-sweep{0%{left:-120px}90%,to{left:100%}}@media (prefers-reduced-motion:reduce){._17va5q_capsule[data-running]:after{animation:none;display:none}}";
34782
- const tagId$14 = "@khorsheed/dsh-room/RoomTaskCapsule.module.css";
34783
- if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$14) + "]") === null) {
35438
+ const css$15 = "._17va5q_root{box-sizing:border-box;margin:0 auto var(--dsh-composer-stack-gap,6px);width:calc(100% - 4 * var(--dsh-composer-dock-inset,8px));max-width:calc(var(--dsh-composer-card-max-width,780px) - 4 * var(--dsh-composer-dock-inset,8px));flex-direction:column;flex:none;gap:6px;display:flex}._17va5q_capsules{align-items:center;gap:6px;min-width:0;display:flex}._17va5q_capsule{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#0000001a);min-width:0;max-width:60%;height:28px;color:var(--dsw-alias-label-secondary,#61666b);white-space:nowrap;cursor:pointer;background:0 0;border-radius:24px;align-items:center;gap:6px;padding:0 10px;font-size:13px;font-weight:500;line-height:20px;display:inline-flex;position:relative;overflow:hidden}._17va5q_capsule:hover{border-color:var(--dsw-alias-border-l3,#0000001f);background:var(--dsw-alias-interactive-bg-hover,#2631480f)}._17va5q_capsule[data-waiting] ._17va5q_dot{background:currentColor}._17va5q_capsule[data-attention]{border-color:color-mix(in srgb, var(--dsw-alias-state-warning,#c08419) 35%, transparent);background:color-mix(in srgb, var(--dsw-alias-state-warning,#c08419) 12%, transparent);color:var(--dsw-alias-state-warning,#c08419)}._17va5q_dot{background:var(--dsw-alias-state-success,#1f9a55);border-radius:50%;flex:none;width:8px;height:8px}._17va5q_guide{color:var(--dsw-alias-label-tertiary,#81858c);flex:none}._17va5q_capsule[data-running]:after{content:\"\";background:linear-gradient(90deg, transparent 0%, color-mix(in srgb, var(--dsw-alias-bg-base,#fff) 60%, transparent) 55%, transparent 100%);pointer-events:none;width:120px;animation:2.6s ease-out infinite _17va5q_room-task-capsule-sweep;position:absolute;top:0;bottom:0;left:0}@keyframes _17va5q_room-task-capsule-sweep{0%{left:-120px}90%,to{left:100%}}@media (prefers-reduced-motion:reduce){._17va5q_capsule[data-running]:after{animation:none;display:none}}";
35439
+ const tagId$15 = "@khorsheed/dsh-room/RoomTaskCapsule.module.css";
35440
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$15) + "]") === null) {
34784
35441
  const tag = document.createElement("style");
34785
35442
  tag.dataset.plugin = "@khorsheed/dsh-room";
34786
- tag.dataset.pluginCss = tagId$14;
34787
- tag.textContent = css$14;
35443
+ tag.dataset.pluginCss = tagId$15;
35444
+ tag.textContent = css$15;
34788
35445
  document.head.appendChild(tag);
34789
35446
  }
34790
35447
  var RoomTaskCapsule_module_css_default = {
34791
- "capsules": "_17va5q_capsules",
34792
- "dot": "_17va5q_dot",
34793
- "capsule": "_17va5q_capsule",
34794
35448
  "guide": "_17va5q_guide",
35449
+ "capsule": "_17va5q_capsule",
34795
35450
  "room-task-capsule-sweep": "_17va5q_room-task-capsule-sweep",
34796
- "root": "_17va5q_root"
35451
+ "capsules": "_17va5q_capsules",
35452
+ "root": "_17va5q_root",
35453
+ "dot": "_17va5q_dot"
34797
35454
  };
34798
35455
  //#endregion
34799
35456
  //#region src/client/RoomTaskCapsule.tsx
@@ -34807,7 +35464,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
34807
35464
  * outcomes fall back to the inline reconcile view.
34808
35465
  */
34809
35466
  /** The capsule row. */
34810
- function RoomTaskCapsule({ state, openTasks, reconcileDelivery, openPlanSession, invite, listProviders, roomCwd, browseDirectory, modelSurface, renderHarnessModelPicker, t }) {
35467
+ function RoomTaskCapsule({ state, openTasks, reconcileDelivery, openPlanSession, invite, listProviders, roomCwd, browseDirectory, modelSurface, renderHarnessModelPicker, waiting, t }) {
34811
35468
  const [inviteOpen, setInviteOpen] = (0, react.useState)(false);
34812
35469
  const [providers, setProviders] = (0, react.useState)(void 0);
34813
35470
  const jobs = state.jobs ?? [];
@@ -34863,57 +35520,71 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
34863
35520
  className: RoomTaskCapsule_module_css_default.root,
34864
35521
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
34865
35522
  className: RoomTaskCapsule_module_css_default.capsules,
34866
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
34867
- type: "button",
34868
- className: RoomTaskCapsule_module_css_default.capsule,
34869
- "data-testid": "room-task-capsule",
34870
- ...running > 0 ? { "data-running": "" } : {},
34871
- onClick: () => {
34872
- openTasks();
34873
- },
34874
- children: [running > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
34875
- className: RoomTaskCapsule_module_css_default.dot,
34876
- "aria-hidden": true
34877
- }), running > 0 ? t("job.capsule.running", { count: running }) : t("job.capsule.idle", { count: jobs.length })]
34878
- }), attention > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
34879
- type: "button",
34880
- className: RoomTaskCapsule_module_css_default.capsule,
34881
- "data-attention": "",
34882
- onClick: () => {
34883
- openTasks(firstAttention?.id);
34884
- },
34885
- children: t("job.capsule.attention", { count: attention })
34886
- })]
35523
+ children: [
35524
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
35525
+ type: "button",
35526
+ className: RoomTaskCapsule_module_css_default.capsule,
35527
+ "data-testid": "room-task-capsule",
35528
+ ...running > 0 ? { "data-running": "" } : {},
35529
+ onClick: () => {
35530
+ openTasks();
35531
+ },
35532
+ children: [running > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
35533
+ className: RoomTaskCapsule_module_css_default.dot,
35534
+ "aria-hidden": true
35535
+ }), running > 0 ? t("job.capsule.running", { count: running }) : t("job.capsule.idle", { count: jobs.length })]
35536
+ }),
35537
+ attention > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
35538
+ type: "button",
35539
+ className: RoomTaskCapsule_module_css_default.capsule,
35540
+ "data-attention": "",
35541
+ onClick: () => {
35542
+ openTasks(firstAttention?.id);
35543
+ },
35544
+ children: t("job.capsule.attention", { count: attention })
35545
+ }),
35546
+ waiting !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
35547
+ type: "button",
35548
+ className: RoomTaskCapsule_module_css_default.capsule,
35549
+ "data-attention": "",
35550
+ "data-waiting": "",
35551
+ onClick: waiting.jump,
35552
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
35553
+ className: RoomTaskCapsule_module_css_default.dot,
35554
+ "aria-hidden": true
35555
+ }), t("question.capsule", { member: waiting.member })]
35556
+ })
35557
+ ]
34887
35558
  })
34888
35559
  });
34889
35560
  }
34890
35561
  //#endregion
34891
35562
  //#region \0dsh-css:src/client/RoomTodoStrip.module.css.mjs
34892
- const css$13 = ".DjKAXq_root{box-sizing:border-box;margin:0 auto var(--dsh-composer-stack-gap,6px);width:calc(100% - 4 * var(--dsh-composer-dock-inset,8px));max-width:calc(var(--dsh-composer-card-max-width,780px) - 4 * var(--dsh-composer-dock-inset,8px));border:1px solid var(--dsw-alias-border-l1,#00000014);background:var(--dsw-specific-tip,var(--dsw-alias-bg-layer-1,#fff));--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2,#7f7f7f47);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2,#7f7f7f66);border-radius:12px;flex:none;overflow:hidden}.DjKAXq_body{flex-direction:column;gap:8px;padding:6px 12px;display:flex}.DjKAXq_header{text-align:left;cursor:pointer;background:0 0;border:none;align-items:center;gap:10px;width:100%;padding:0;display:flex}.DjKAXq_lead{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);flex:none;place-items:center;display:grid}.DjKAXq_title{color:var(--dsw-alias-label-primary,#1f2329);flex:none;font-size:13px;font-weight:500;line-height:24px}.DjKAXq_progress{min-width:0;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);text-overflow:ellipsis;white-space:nowrap;flex:auto;font-size:13px;font-weight:400;line-height:20px;overflow:hidden}.DjKAXq_chevron{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);flex:none;place-items:center;display:grid}.DjKAXq_list{flex-direction:column;gap:8px;max-height:180px;margin:0;padding:0;list-style:none;display:flex;overflow-y:auto}.DjKAXq_item{min-width:0;color:var(--dsw-alias-label-secondary,#1f2329bf);align-items:center;gap:10px;font-size:13px;line-height:20px;display:flex}.DjKAXq_glyph{flex:none;place-items:center;width:16px;height:16px;display:grid}.DjKAXq_glyphCompleted{color:var(--dsw-alias-state-success-primary,#34a853)}.DjKAXq_glyphPending{color:var(--dsw-alias-label-caption,#adb2b8)}.DjKAXq_glyphProgress{color:var(--dsw-alias-state-business-primary,#4176e6);animation:1s linear infinite DjKAXq_room-todo-progress-spin}@keyframes DjKAXq_room-todo-progress-spin{to{transform:rotate(360deg)}}.DjKAXq_content{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.DjKAXq_header:focus:not(:focus-visible){outline:none}";
34893
- const tagId$13 = "@khorsheed/dsh-room/RoomTodoStrip.module.css";
34894
- if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$13) + "]") === null) {
35563
+ const css$14 = ".DjKAXq_root{box-sizing:border-box;margin:0 auto var(--dsh-composer-stack-gap,6px);width:calc(100% - 4 * var(--dsh-composer-dock-inset,8px));max-width:calc(var(--dsh-composer-card-max-width,780px) - 4 * var(--dsh-composer-dock-inset,8px));border:1px solid var(--dsw-alias-border-l1,#00000014);background:var(--dsw-specific-tip,var(--dsw-alias-bg-layer-1,#fff));--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2,#7f7f7f47);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2,#7f7f7f66);border-radius:12px;flex:none;overflow:hidden}.DjKAXq_body{flex-direction:column;gap:8px;padding:6px 12px;display:flex}.DjKAXq_header{text-align:left;cursor:pointer;background:0 0;border:none;align-items:center;gap:10px;width:100%;padding:0;display:flex}.DjKAXq_lead{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);flex:none;place-items:center;display:grid}.DjKAXq_title{color:var(--dsw-alias-label-primary,#1f2329);flex:none;font-size:13px;font-weight:500;line-height:24px}.DjKAXq_progress{min-width:0;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);text-overflow:ellipsis;white-space:nowrap;flex:auto;font-size:13px;font-weight:400;line-height:20px;overflow:hidden}.DjKAXq_chevron{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);flex:none;place-items:center;display:grid}.DjKAXq_list{flex-direction:column;gap:8px;max-height:180px;margin:0;padding:0;list-style:none;display:flex;overflow-y:auto}.DjKAXq_item{min-width:0;color:var(--dsw-alias-label-secondary,#1f2329bf);align-items:center;gap:10px;font-size:13px;line-height:20px;display:flex}.DjKAXq_glyph{flex:none;place-items:center;width:16px;height:16px;display:grid}.DjKAXq_glyphCompleted{color:var(--dsw-alias-state-success-primary,#34a853)}.DjKAXq_glyphPending{color:var(--dsw-alias-label-caption,#adb2b8)}.DjKAXq_glyphProgress{color:var(--dsw-alias-state-business-primary,#4176e6);animation:1s linear infinite DjKAXq_room-todo-progress-spin}@keyframes DjKAXq_room-todo-progress-spin{to{transform:rotate(360deg)}}.DjKAXq_content{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.DjKAXq_header:focus:not(:focus-visible){outline:none}";
35564
+ const tagId$14 = "@khorsheed/dsh-room/RoomTodoStrip.module.css";
35565
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$14) + "]") === null) {
34895
35566
  const tag = document.createElement("style");
34896
35567
  tag.dataset.plugin = "@khorsheed/dsh-room";
34897
- tag.dataset.pluginCss = tagId$13;
34898
- tag.textContent = css$13;
35568
+ tag.dataset.pluginCss = tagId$14;
35569
+ tag.textContent = css$14;
34899
35570
  document.head.appendChild(tag);
34900
35571
  }
34901
35572
  var RoomTodoStrip_module_css_default = {
34902
- "header": "DjKAXq_header",
34903
- "lead": "DjKAXq_lead",
34904
- "glyph": "DjKAXq_glyph",
34905
- "progress": "DjKAXq_progress",
34906
- "content": "DjKAXq_content",
34907
- "body": "DjKAXq_body",
34908
35573
  "glyphProgress": "DjKAXq_glyphProgress",
34909
35574
  "list": "DjKAXq_list",
35575
+ "body": "DjKAXq_body",
34910
35576
  "glyphCompleted": "DjKAXq_glyphCompleted",
34911
- "glyphPending": "DjKAXq_glyphPending",
34912
- "root": "DjKAXq_root",
35577
+ "header": "DjKAXq_header",
35578
+ "chevron": "DjKAXq_chevron",
34913
35579
  "item": "DjKAXq_item",
34914
- "title": "DjKAXq_title",
35580
+ "progress": "DjKAXq_progress",
35581
+ "lead": "DjKAXq_lead",
34915
35582
  "room-todo-progress-spin": "DjKAXq_room-todo-progress-spin",
34916
- "chevron": "DjKAXq_chevron"
35583
+ "root": "DjKAXq_root",
35584
+ "glyph": "DjKAXq_glyph",
35585
+ "title": "DjKAXq_title",
35586
+ "glyphPending": "DjKAXq_glyphPending",
35587
+ "content": "DjKAXq_content"
34917
35588
  };
34918
35589
  //#endregion
34919
35590
  //#region src/client/RoomTodoStrip.tsx
@@ -35083,24 +35754,24 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
35083
35754
  }
35084
35755
  //#endregion
35085
35756
  //#region \0dsh-css:src/client/RoomQueueStrip.module.css.mjs
35086
- const css$12 = ".t5cYHq_root{box-sizing:border-box;margin:0 auto var(--dsh-composer-stack-gap,6px);width:calc(100% - 4 * var(--dsh-composer-dock-inset,8px));max-width:calc(var(--dsh-composer-card-max-width,780px) - 4 * var(--dsh-composer-dock-inset,8px));border:1px solid var(--dsw-alias-border-l1,#00000014);background:var(--dsw-specific-tip,var(--dsw-alias-bg-layer-1,#fff));border-radius:12px;flex:none;overflow:hidden}.t5cYHq_header{box-sizing:border-box;width:100%;min-height:36px;color:var(--dsw-alias-label-primary,#1f2329);text-align:left;cursor:pointer;background:0 0;border:none;align-items:center;gap:10px;padding:4px 12px;display:flex}.t5cYHq_lead{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);flex:none;place-items:center;display:grid}.t5cYHq_count{flex:auto;min-width:0;font-size:13px;font-weight:500;line-height:24px}.t5cYHq_chevron{width:14px;height:14px;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);flex:none;place-items:center;display:grid}.t5cYHq_list{--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2,#7f7f7f47);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2,#7f7f7f66);max-height:180px;margin:0;padding:0 12px 6px;list-style:none;overflow-y:auto}.t5cYHq_row{box-sizing:border-box;align-items:center;gap:10px;width:100%;min-height:28px;display:flex}.t5cYHq_preview{min-width:0;color:var(--dsw-alias-label-primary-dimmed,#1f23299e);text-overflow:ellipsis;white-space:nowrap;word-break:break-word;flex:auto;font-size:13px;line-height:20px;overflow:hidden}.t5cYHq_header:focus:not(:focus-visible){outline:none}";
35087
- const tagId$12 = "@khorsheed/dsh-room/RoomQueueStrip.module.css";
35088
- if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$12) + "]") === null) {
35757
+ const css$13 = ".t5cYHq_root{box-sizing:border-box;margin:0 auto var(--dsh-composer-stack-gap,6px);width:calc(100% - 4 * var(--dsh-composer-dock-inset,8px));max-width:calc(var(--dsh-composer-card-max-width,780px) - 4 * var(--dsh-composer-dock-inset,8px));border:1px solid var(--dsw-alias-border-l1,#00000014);background:var(--dsw-specific-tip,var(--dsw-alias-bg-layer-1,#fff));border-radius:12px;flex:none;overflow:hidden}.t5cYHq_header{box-sizing:border-box;width:100%;min-height:36px;color:var(--dsw-alias-label-primary,#1f2329);text-align:left;cursor:pointer;background:0 0;border:none;align-items:center;gap:10px;padding:4px 12px;display:flex}.t5cYHq_lead{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);flex:none;place-items:center;display:grid}.t5cYHq_count{flex:auto;min-width:0;font-size:13px;font-weight:500;line-height:24px}.t5cYHq_chevron{width:14px;height:14px;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);flex:none;place-items:center;display:grid}.t5cYHq_list{--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2,#7f7f7f47);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2,#7f7f7f66);max-height:180px;margin:0;padding:0 12px 6px;list-style:none;overflow-y:auto}.t5cYHq_row{box-sizing:border-box;align-items:center;gap:10px;width:100%;min-height:28px;display:flex}.t5cYHq_preview{min-width:0;color:var(--dsw-alias-label-primary-dimmed,#1f23299e);text-overflow:ellipsis;white-space:nowrap;word-break:break-word;flex:auto;font-size:13px;line-height:20px;overflow:hidden}.t5cYHq_header:focus:not(:focus-visible){outline:none}";
35758
+ const tagId$13 = "@khorsheed/dsh-room/RoomQueueStrip.module.css";
35759
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$13) + "]") === null) {
35089
35760
  const tag = document.createElement("style");
35090
35761
  tag.dataset.plugin = "@khorsheed/dsh-room";
35091
- tag.dataset.pluginCss = tagId$12;
35092
- tag.textContent = css$12;
35762
+ tag.dataset.pluginCss = tagId$13;
35763
+ tag.textContent = css$13;
35093
35764
  document.head.appendChild(tag);
35094
35765
  }
35095
35766
  var RoomQueueStrip_module_css_default = {
35096
- "preview": "t5cYHq_preview",
35097
35767
  "chevron": "t5cYHq_chevron",
35098
35768
  "header": "t5cYHq_header",
35099
- "root": "t5cYHq_root",
35100
- "row": "t5cYHq_row",
35101
35769
  "lead": "t5cYHq_lead",
35102
35770
  "count": "t5cYHq_count",
35103
- "list": "t5cYHq_list"
35771
+ "list": "t5cYHq_list",
35772
+ "root": "t5cYHq_root",
35773
+ "preview": "t5cYHq_preview",
35774
+ "row": "t5cYHq_row"
35104
35775
  };
35105
35776
  //#endregion
35106
35777
  //#region src/client/RoomQueueStrip.tsx
@@ -35178,34 +35849,34 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
35178
35849
  }
35179
35850
  //#endregion
35180
35851
  //#region \0dsh-css:src/client/RoomModelPicker.module.css.mjs
35181
- const css$11 = "._0nCswa_root{align-items:center;min-width:0;display:flex;position:relative}._0nCswa_trigger{min-width:0;max-width:220px;height:28px;color:var(--dsw-alias-label-secondary,#1f2329cc);cursor:pointer;background:0 0;border:none;border-radius:24px;outline:none;align-items:center;gap:4px;padding:0 4px 0 8px;font-size:13px;font-weight:500;line-height:20px;display:flex}._0nCswa_trigger:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover,#7f7f7f24)}._0nCswa_trigger:focus-visible{box-shadow:0 0 0 2px var(--dsw-alias-border-l3,#7f7f7f66)}._0nCswa_trigger:disabled{color:var(--dsw-alias-label-dimmed,#7f7f7f80);cursor:default}._0nCswa_triggerLabel{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}._0nCswa_triggerEffort{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-caption,#adb2b8);flex-shrink:1000;overflow:hidden}._0nCswa_chevron,._0nCswa_chevronOpen{color:var(--dsw-alias-label-caption,#adb2b8);flex:none;transition:transform .12s}._0nCswa_chevronOpen{transform:rotate(180deg)}._0nCswa_menu{z-index:10;background:var(--dsw-specific-menu,var(--dsw-alias-bg-layer-2,var(--dsw-alias-bg-layer-1,#fff)));width:max-content;min-width:min(240px,100vw - 32px);max-width:min(420px,100vw - 32px);max-height:min(360px,100vh - 96px);backdrop-filter:var(--dsw-menu-backdrop-filter,blur(20px));box-shadow:var(--dsw-elevation-prominent,var(--dsw-shadow-lv3,0 12px 32px 0 #00000014));color:var(--dsw-alias-label-primary,#1f2329);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2,#7f7f7f47);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2,#7f7f7f66);border:0;border-radius:20px;flex-direction:column;padding:4px;display:flex;position:absolute;bottom:calc(100% + 6px);right:0;overflow:hidden}._0nCswa_status{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);padding:10px;font-size:13px;line-height:20px}._0nCswa_groups{min-height:0;overflow-y:auto}._0nCswa_group+._0nCswa_group{margin-top:4px}._0nCswa_groupTitle{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);padding:5px 8px 3px;font-size:12px;font-weight:500;line-height:18px}._0nCswa_option{box-sizing:border-box;width:auto;min-width:100%;min-height:38px;color:inherit;text-align:left;cursor:pointer;background:0 0;border:none;border-radius:10px;outline:none;align-items:center;gap:8px;padding:6px 8px;display:flex}._0nCswa_option:hover:not(:disabled),._0nCswa_option:focus-visible{background:var(--dsw-alias-interactive-bg-hover,#7f7f7f24)}._0nCswa_option:disabled{color:var(--dsw-alias-label-dimmed,#7f7f7f80);cursor:default}._0nCswa_modelName{min-width:0;color:inherit;text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:14px;font-weight:500;line-height:20px;overflow:hidden}._0nCswa_check{color:var(--dsw-alias-label-primary,#1f2329);flex:0 0 18px;place-items:center;display:grid}._0nCswa_cell{box-sizing:border-box;width:auto;min-width:100%;height:40px;color:var(--dsw-alias-label-primary,#1f2329);cursor:pointer;text-align:left;background:0 0;border:none;border-radius:10px;align-items:center;gap:8px;padding:0 10px;font-size:14px;line-height:22px;display:flex}._0nCswa_cell:hover{background:var(--dsw-alias-interactive-bg-hover,#7f7f7f24)}._0nCswa_cellLabel{white-space:nowrap;flex:none}._0nCswa_cellValue{text-overflow:ellipsis;white-space:nowrap;text-align:right;min-width:0;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);flex:auto;overflow:hidden}._0nCswa_cellChevron{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);flex:none}";
35182
- const tagId$11 = "@khorsheed/dsh-room/RoomModelPicker.module.css";
35183
- if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$11) + "]") === null) {
35852
+ const css$12 = "._0nCswa_root{align-items:center;min-width:0;display:flex;position:relative}._0nCswa_trigger{min-width:0;max-width:220px;height:28px;color:var(--dsw-alias-label-secondary,#1f2329cc);cursor:pointer;background:0 0;border:none;border-radius:24px;outline:none;align-items:center;gap:4px;padding:0 4px 0 8px;font-size:13px;font-weight:500;line-height:20px;display:flex}._0nCswa_trigger:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover,#7f7f7f24)}._0nCswa_trigger:focus-visible{box-shadow:0 0 0 2px var(--dsw-alias-border-l3,#7f7f7f66)}._0nCswa_trigger:disabled{color:var(--dsw-alias-label-dimmed,#7f7f7f80);cursor:default}._0nCswa_triggerLabel{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}._0nCswa_triggerEffort{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-caption,#adb2b8);flex-shrink:1000;overflow:hidden}._0nCswa_chevron,._0nCswa_chevronOpen{color:var(--dsw-alias-label-caption,#adb2b8);flex:none;transition:transform .12s}._0nCswa_chevronOpen{transform:rotate(180deg)}._0nCswa_menu{z-index:10;background:var(--dsw-specific-menu,var(--dsw-alias-bg-layer-2,var(--dsw-alias-bg-layer-1,#fff)));width:max-content;min-width:min(240px,100vw - 32px);max-width:min(420px,100vw - 32px);max-height:min(360px,100vh - 96px);backdrop-filter:var(--dsw-menu-backdrop-filter,blur(20px));box-shadow:var(--dsw-elevation-prominent,var(--dsw-shadow-lv3,0 12px 32px 0 #00000014));color:var(--dsw-alias-label-primary,#1f2329);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2,#7f7f7f47);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2,#7f7f7f66);border:0;border-radius:20px;flex-direction:column;padding:4px;display:flex;position:absolute;bottom:calc(100% + 6px);right:0;overflow:hidden}._0nCswa_status{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);padding:10px;font-size:13px;line-height:20px}._0nCswa_groups{min-height:0;overflow-y:auto}._0nCswa_group+._0nCswa_group{margin-top:4px}._0nCswa_groupTitle{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);padding:5px 8px 3px;font-size:12px;font-weight:500;line-height:18px}._0nCswa_option{box-sizing:border-box;width:auto;min-width:100%;min-height:38px;color:inherit;text-align:left;cursor:pointer;background:0 0;border:none;border-radius:10px;outline:none;align-items:center;gap:8px;padding:6px 8px;display:flex}._0nCswa_option:hover:not(:disabled),._0nCswa_option:focus-visible{background:var(--dsw-alias-interactive-bg-hover,#7f7f7f24)}._0nCswa_option:disabled{color:var(--dsw-alias-label-dimmed,#7f7f7f80);cursor:default}._0nCswa_modelName{min-width:0;color:inherit;text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:14px;font-weight:500;line-height:20px;overflow:hidden}._0nCswa_check{color:var(--dsw-alias-label-primary,#1f2329);flex:0 0 18px;place-items:center;display:grid}._0nCswa_cell{box-sizing:border-box;width:auto;min-width:100%;height:40px;color:var(--dsw-alias-label-primary,#1f2329);cursor:pointer;text-align:left;background:0 0;border:none;border-radius:10px;align-items:center;gap:8px;padding:0 10px;font-size:14px;line-height:22px;display:flex}._0nCswa_cell:hover{background:var(--dsw-alias-interactive-bg-hover,#7f7f7f24)}._0nCswa_cellLabel{white-space:nowrap;flex:none}._0nCswa_cellValue{text-overflow:ellipsis;white-space:nowrap;text-align:right;min-width:0;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);flex:auto;overflow:hidden}._0nCswa_cellChevron{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);flex:none}";
35853
+ const tagId$12 = "@khorsheed/dsh-room/RoomModelPicker.module.css";
35854
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$12) + "]") === null) {
35184
35855
  const tag = document.createElement("style");
35185
35856
  tag.dataset.plugin = "@khorsheed/dsh-room";
35186
- tag.dataset.pluginCss = tagId$11;
35187
- tag.textContent = css$11;
35857
+ tag.dataset.pluginCss = tagId$12;
35858
+ tag.textContent = css$12;
35188
35859
  document.head.appendChild(tag);
35189
35860
  }
35190
35861
  var RoomModelPicker_module_css_default = {
35191
- "modelName": "_0nCswa_modelName",
35192
- "groupTitle": "_0nCswa_groupTitle",
35862
+ "groups": "_0nCswa_groups",
35193
35863
  "chevron": "_0nCswa_chevron",
35864
+ "check": "_0nCswa_check",
35865
+ "chevronOpen": "_0nCswa_chevronOpen",
35866
+ "modelName": "_0nCswa_modelName",
35194
35867
  "cell": "_0nCswa_cell",
35195
- "option": "_0nCswa_option",
35196
35868
  "triggerLabel": "_0nCswa_triggerLabel",
35197
- "groups": "_0nCswa_groups",
35869
+ "trigger": "_0nCswa_trigger",
35870
+ "menu": "_0nCswa_menu",
35198
35871
  "triggerEffort": "_0nCswa_triggerEffort",
35872
+ "root": "_0nCswa_root",
35873
+ "groupTitle": "_0nCswa_groupTitle",
35874
+ "option": "_0nCswa_option",
35875
+ "status": "_0nCswa_status",
35199
35876
  "cellLabel": "_0nCswa_cellLabel",
35200
35877
  "cellValue": "_0nCswa_cellValue",
35201
- "status": "_0nCswa_status",
35202
35878
  "group": "_0nCswa_group",
35203
- "trigger": "_0nCswa_trigger",
35204
- "cellChevron": "_0nCswa_cellChevron",
35205
- "root": "_0nCswa_root",
35206
- "chevronOpen": "_0nCswa_chevronOpen",
35207
- "menu": "_0nCswa_menu",
35208
- "check": "_0nCswa_check"
35879
+ "cellChevron": "_0nCswa_cellChevron"
35209
35880
  };
35210
35881
  //#endregion
35211
35882
  //#region src/client/RoomModelPicker.tsx
@@ -35451,8 +36122,142 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
35451
36122
  });
35452
36123
  }
35453
36124
  //#endregion
36125
+ //#region \0dsh-css:src/client/RoomAttachments.module.css.mjs
36126
+ const css$11 = ".z-QAkq_rail{scrollbar-width:none;align-items:stretch;gap:10px;min-width:0;padding:2px 2px 0;display:flex;overflow:auto hidden}.z-QAkq_rail::-webkit-scrollbar{display:none}.z-QAkq_imageItem{flex:none;width:64px;height:64px;position:relative}.z-QAkq_thumbnail{border:.5px solid var(--dsw-alias-border-l2-darkmode-thin,#00000014);border-radius:var(--dsw-radius-xl,12px);background:var(--dsw-alias-interactive-bg-hover,#0000000a);cursor:zoom-in;width:64px;height:64px;padding:0;overflow:hidden}.z-QAkq_thumbnail img{object-fit:cover;width:100%;height:100%;display:block}.z-QAkq_card{border:.5px solid var(--dsw-alias-border-l2,#0000001f);border-radius:var(--dsw-radius-lg,10px);background:var(--dsw-specific-input-major,transparent);box-sizing:border-box;text-align:left;flex:none;align-items:center;gap:10px;width:240px;height:64px;padding:0 12px;display:inline-flex;position:relative}.z-QAkq_failed{border-color:var(--dsw-alias-state-error-primary,#d54941)}.z-QAkq_icon{flex:none;justify-content:center;align-items:center;width:28px;height:28px;display:inline-flex}.z-QAkq_spinner{width:20px;height:20px;color:var(--dsw-alias-label-tertiary,#00000073);border:2px solid;border-top-color:#0000;border-radius:50%;animation:.8s linear infinite z-QAkq_room-attachment-spin}.z-QAkq_spinner[data-idle]{border-top-color:currentColor;animation:none}@keyframes z-QAkq_room-attachment-spin{to{transform:rotate(360deg)}}.z-QAkq_body{flex-direction:column;flex:1;min-width:0;padding:8px 0;display:flex}.z-QAkq_retry{color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;padding:0}.z-QAkq_name{white-space:nowrap;text-overflow:ellipsis;color:var(--dsw-alias-label-primary,#1f2329);font-size:var(--dsh-panel-body-size,14px);font-weight:500;line-height:22px;overflow:hidden}.z-QAkq_meta{white-space:nowrap;text-overflow:ellipsis;color:var(--dsw-alias-label-tertiary,#00000073);font-size:var(--dsh-panel-meta-size,12px);line-height:15px;overflow:hidden}.z-QAkq_metaFailed{color:var(--dsw-alias-state-error-primary,#d54941)}.z-QAkq_remove{z-index:1;background:var(--dsw-alias-button-contrast-fill,#000000b8);width:18px;height:18px;color:var(--dsw-alias-label-primary-inverted,#fff);cursor:pointer;opacity:0;border:none;border-radius:50%;place-items:center;padding:0;transition:opacity .2s ease-in-out;display:grid;position:absolute;top:4px;right:4px}.z-QAkq_imageItem:hover .z-QAkq_remove,.z-QAkq_card:hover .z-QAkq_remove,.z-QAkq_remove:focus-visible{opacity:1}@media (pointer:coarse){.z-QAkq_remove{opacity:1}}@media (prefers-reduced-motion:reduce){.z-QAkq_remove{transition:none}.z-QAkq_spinner{animation:none}}";
36127
+ const tagId$11 = "@khorsheed/dsh-room/RoomAttachments.module.css";
36128
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$11) + "]") === null) {
36129
+ const tag = document.createElement("style");
36130
+ tag.dataset.plugin = "@khorsheed/dsh-room";
36131
+ tag.dataset.pluginCss = tagId$11;
36132
+ tag.textContent = css$11;
36133
+ document.head.appendChild(tag);
36134
+ }
36135
+ var RoomAttachments_module_css_default = {
36136
+ "thumbnail": "z-QAkq_thumbnail",
36137
+ "room-attachment-spin": "z-QAkq_room-attachment-spin",
36138
+ "retry": "z-QAkq_retry",
36139
+ "meta": "z-QAkq_meta",
36140
+ "metaFailed": "z-QAkq_metaFailed",
36141
+ "remove": "z-QAkq_remove",
36142
+ "card": "z-QAkq_card",
36143
+ "icon": "z-QAkq_icon",
36144
+ "spinner": "z-QAkq_spinner",
36145
+ "name": "z-QAkq_name",
36146
+ "body": "z-QAkq_body",
36147
+ "rail": "z-QAkq_rail",
36148
+ "failed": "z-QAkq_failed",
36149
+ "imageItem": "z-QAkq_imageItem"
36150
+ };
36151
+ //#endregion
36152
+ //#region src/client/RoomAttachments.tsx
36153
+ /**
36154
+ * The room composer's draft-attachment rail: image thumbnails (click opens
36155
+ * the original in the primitives' lightbox) and file cards with their upload
36156
+ * state (uploading / failed → click to retry), each with a hover ✕ — the
36157
+ * official composer's rail (ui-attachment's ComposerAttachments + FileCard)
36158
+ * redrawn on the same tokens, because that package exposes no client
36159
+ * component a plugin bundle can import. The drafts themselves are the
36160
+ * official conversation service's (RoomAttachmentsFace).
36161
+ */
36162
+ /** The rail over the textarea; renders nothing without drafts. */
36163
+ function RoomAttachments({ attachments, face, onRemove, onRetry, t }) {
36164
+ const uploads = (0, react.useSyncExternalStore)(face.uploads.subscribe, face.uploads.getSnapshot);
36165
+ const [preview, setPreview] = (0, react.useState)(void 0);
36166
+ if (attachments.length === 0) return null;
36167
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
36168
+ className: RoomAttachments_module_css_default.rail,
36169
+ children: [attachments.map((attachment) => {
36170
+ const name = attachment.file.name;
36171
+ const remove = /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
36172
+ type: "button",
36173
+ className: RoomAttachments_module_css_default.remove,
36174
+ "aria-label": t("attach.remove", { name }),
36175
+ onMouseDown: (event) => {
36176
+ event.preventDefault();
36177
+ },
36178
+ onClick: () => {
36179
+ onRemove(attachment.id);
36180
+ },
36181
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
36182
+ viewBox: "0 0 12 12",
36183
+ width: "8",
36184
+ height: "8",
36185
+ "aria-hidden": true,
36186
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
36187
+ d: "M2 2l8 8M10 2l-8 8",
36188
+ stroke: "currentColor",
36189
+ strokeWidth: "1.6",
36190
+ strokeLinecap: "round"
36191
+ })
36192
+ })
36193
+ });
36194
+ if (attachment.kind === "image") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
36195
+ className: RoomAttachments_module_css_default.imageItem,
36196
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
36197
+ type: "button",
36198
+ className: RoomAttachments_module_css_default.thumbnail,
36199
+ "aria-label": t("attach.open", { name }),
36200
+ onClick: () => {
36201
+ setPreview(attachment);
36202
+ },
36203
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("img", {
36204
+ src: attachment.previewUrl,
36205
+ alt: name
36206
+ })
36207
+ }), remove]
36208
+ }, attachment.id);
36209
+ const state = uploads[attachment.id]?.status ?? "uploading";
36210
+ const meta = state === "uploading" ? t("attach.uploading") : state === "error" ? t("attach.failed") : typeof _deepseek_ai_dsh_client_ui_primitives.fileSizeText === "function" ? (0, _deepseek_ai_dsh_client_ui_primitives.fileSizeText)(attachment.file.size) : "";
36211
+ const body = /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
36212
+ className: RoomAttachments_module_css_default.name,
36213
+ children: name
36214
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
36215
+ className: state === "error" ? `${RoomAttachments_module_css_default.meta} ${RoomAttachments_module_css_default.metaFailed}` : RoomAttachments_module_css_default.meta,
36216
+ children: meta
36217
+ })] });
36218
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
36219
+ className: state === "error" ? `${RoomAttachments_module_css_default.card} ${RoomAttachments_module_css_default.failed}` : RoomAttachments_module_css_default.card,
36220
+ title: name,
36221
+ children: [
36222
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
36223
+ className: RoomAttachments_module_css_default.icon,
36224
+ "aria-hidden": true,
36225
+ children: state === "uploading" || typeof _deepseek_ai_dsh_client_ui_primitives.FileTypeIcon !== "function" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
36226
+ className: RoomAttachments_module_css_default.spinner,
36227
+ "data-idle": state === "uploading" ? void 0 : ""
36228
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.FileTypeIcon, { path: name })
36229
+ }),
36230
+ state === "error" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
36231
+ type: "button",
36232
+ className: `${RoomAttachments_module_css_default.body} ${RoomAttachments_module_css_default.retry}`,
36233
+ "aria-label": t("attach.retry", { name }),
36234
+ onClick: () => {
36235
+ onRetry(attachment.id);
36236
+ },
36237
+ children: body
36238
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
36239
+ className: RoomAttachments_module_css_default.body,
36240
+ children: body
36241
+ }),
36242
+ remove
36243
+ ]
36244
+ }, attachment.id);
36245
+ }), preview !== void 0 && typeof _deepseek_ai_dsh_client_ui_primitives.ImageLightbox === "function" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.ImageLightbox, {
36246
+ src: preview.previewUrl,
36247
+ alt: preview.file.name,
36248
+ labels: {
36249
+ dialog: t("attach.preview"),
36250
+ close: t("attach.closePreview")
36251
+ },
36252
+ onClose: () => {
36253
+ setPreview(void 0);
36254
+ }
36255
+ })]
36256
+ });
36257
+ }
36258
+ //#endregion
35454
36259
  //#region \0dsh-css:src/client/RoomComposer.module.css.mjs
35455
- const css$10 = ".UGGjQG_root{padding:0 var(--dsh-composer-side-clearance,16px) 8px;flex-direction:column;align-items:center;display:flex}.UGGjQG_error{width:100%;max-width:var(--dsh-composer-card-max-width,780px);background:var(--dsw-alias-interactive-bg-hover-danger,#ec13130d);color:var(--dsw-alias-state-error-primary,#ec1313);border-radius:8px;margin-bottom:6px;padding:4px 8px;font-size:12px;line-height:18px}.UGGjQG_dock{width:100%;max-width:var(--dsh-composer-card-max-width,780px)}.UGGjQG_card{box-sizing:border-box;width:100%;max-width:var(--dsh-composer-card-max-width,780px);--dsw-elevation-stroke-color:var(--dsw-alias-border-l2,#0000001a);border-radius:var(--dsw-radius-panel,22px);background:var(--dsw-specific-input-major,var(--dsw-alias-bg-layer-1,#fff));box-shadow:var(--dsw-elevation-soft,0 0 0 1px #0000001a, 0 4px 12px 0 #0000000a);font-size:var(--dsh-content-font-size,14px);line-height:calc(24px + var(--dsh-content-font-delta,0px));--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2,#7f7f7f47);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2,#7f7f7f66);border:0;flex-direction:column;gap:12px;padding-top:8px;display:flex;position:relative}.UGGjQG_input{box-sizing:border-box;resize:none;width:100%;font-family:var(--dsw-font-family,inherit);font-size:inherit;line-height:inherit;color:var(--dsw-alias-label-primary,#1f2329);caret-color:var(--dsw-alias-state-business-primary,#4176e6);background:0 0;border:none;outline:none;min-height:36px;max-height:160px;padding:4px 8px 0 14px;overflow-y:auto}.UGGjQG_input::placeholder{color:var(--dsw-alias-label-caption,#adb2b8);user-select:none}.UGGjQG_row{justify-content:flex-end;align-items:center;gap:4px;padding:0 8px 6px;display:flex}.UGGjQG_primary{background:var(--dsw-alias-button-info-fill,#4176e6);color:#fff;cursor:pointer;border:none;border-radius:999px;flex:none;place-items:center;width:34px;height:34px;transition:background-color .1s;display:grid}.UGGjQG_primary:hover:not(:disabled){background:var(--dsw-alias-button-info-hover,#679efe)}.UGGjQG_primary:disabled{opacity:.4;cursor:default}.UGGjQG_menu{box-sizing:border-box;border:1px solid var(--dsw-alias-border-inverted,#0000);background:var(--dsw-specific-menu,var(--dsw-alias-bg-layer-2,var(--dsw-alias-bg-layer-1,#fff)));min-width:218px;max-width:360px;max-height:340px;backdrop-filter:var(--dsw-menu-backdrop-filter,blur(20px));box-shadow:var(--dsw-shadow-lv3,0 0 1px 0 #0003, 0 0 4px 0 #00000005, 0 12px 32px 0 #00000014);z-index:1;--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2,#7f7f7f47);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2,#7f7f7f66);border-radius:12px;margin:0 0 6px;padding:4px;list-style:none;position:absolute;bottom:100%;left:8px;overflow-y:auto}.UGGjQG_item,.UGGjQG_itemActive{cursor:pointer;text-align:left;width:100%;min-height:34px;color:var(--dsw-alias-label-primary,#1f2329);background:0 0;border:none;border-radius:10px;align-items:center;gap:8px;padding:6px 10px;font-size:14px;line-height:22px;display:flex}.UGGjQG_item:hover,.UGGjQG_itemActive{background:var(--dsw-alias-interactive-bg-hover,#7f7f7f24)}.UGGjQG_dot{border-radius:50%;flex:none;width:8px;height:8px}.UGGjQG_itemText{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.UGGjQG_sessionMark{text-align:center;width:8px;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);flex:none;font-size:12px;line-height:18px}.UGGjQG_item[data-kid],.UGGjQG_itemActive[data-kid]{padding-left:28px}.UGGjQG_itemContext{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);font-size:12px}.UGGjQG_expand{width:24px;height:24px;color:var(--dsw-alias-label-secondary,#5a5a5ae6);border-radius:6px;flex:none;place-items:center;transition:transform .12s;display:inline-grid}.UGGjQG_expand:hover{background:var(--dsw-alias-fill-secondary,#7f7f7f1f)}.UGGjQG_expand[data-open]{transform:rotate(90deg)}.UGGjQG_menuGroup{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);padding:6px 10px 2px;font-size:11px;line-height:16px}.UGGjQG_menuMore{border-top:1px solid var(--dsw-alias-border-l2-darkmode-thin,#0000000f);color:var(--dsw-alias-label-tertiary,#7f7f7fcc);margin-top:2px;padding:6px 10px 4px;font-size:11.5px;line-height:16px}.UGGjQG_hint{white-space:nowrap;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);flex:none;margin-left:auto;font-size:12px;line-height:18px}.UGGjQG_primary:focus:not(:focus-visible),.UGGjQG_item:focus:not(:focus-visible),.UGGjQG_itemActive:focus:not(:focus-visible){outline:none}.UGGjQG_coordinator{color:var(--dsw-alias-label-tertiary,#81858c);align-self:flex-start;align-items:center;gap:6px;padding:0 14px;font-size:12px;line-height:18px;display:inline-flex}.UGGjQG_coordinatorDot{background:var(--member-color,var(--dsw-alias-label-tertiary,#81858c));border-radius:50%;width:8px;height:8px}.UGGjQG_coordinatorName{color:var(--dsw-alias-label-secondary,#5a5a5ae6);font-weight:600}.UGGjQG_tagRow{margin-bottom:-8px;padding:0 12px 0 16px;display:flex}.UGGjQG_tag{background:color-mix(in srgb, var(--dsw-alias-state-business-primary,#4176e6) 12%, transparent);color:var(--dsw-alias-state-business-primary,#4176e6);border-radius:6px;align-items:center;gap:4px;padding:0 4px 0 7px;font-size:12px;line-height:20px;display:inline-flex}.UGGjQG_tag[data-new]{background:color-mix(in srgb, var(--dsw-alias-state-success,#1f9a55) 12%, transparent);color:var(--dsw-alias-state-success,#1f9a55)}.UGGjQG_tagRemove{color:inherit;font:inherit;cursor:pointer;background:0 0;border:0;border-radius:4px;padding:0 3px;font-size:11px}.UGGjQG_tagRemove:hover{background:var(--dsw-alias-interactive-bg-hover,#2631480f)}.UGGjQG_chipRow{flex-wrap:wrap;gap:6px;margin-bottom:-8px;padding:0 12px 0 16px;display:flex}.UGGjQG_chip{background:color-mix(in srgb, var(--dsw-alias-state-business-primary,#4176e6) 12%, transparent);min-width:0;max-width:100%;color:var(--dsw-alias-state-business-primary,#4176e6);border-radius:6px;align-items:center;padding:0 4px 0 2px;font-size:12px;line-height:20px;display:inline-flex}.UGGjQG_chipLabel{min-width:0;color:inherit;font:inherit;cursor:pointer;background:0 0;border:0;border-radius:4px;align-items:center;gap:3px;padding:0 4px;display:inline-flex}.UGGjQG_chipLabel:hover{background:var(--dsw-alias-interactive-bg-hover,#2631480f)}.UGGjQG_chipAt{opacity:.8;flex:none}.UGGjQG_chipText{text-overflow:ellipsis;white-space:nowrap;min-width:0;max-width:min(280px,60vw);overflow:hidden}";
36260
+ const css$10 = ".UGGjQG_root{padding:0 var(--dsh-composer-side-clearance,16px) 8px;flex-direction:column;align-items:center;display:flex}.UGGjQG_error{width:100%;max-width:var(--dsh-composer-card-max-width,780px);background:var(--dsw-alias-interactive-bg-hover-danger,#ec13130d);color:var(--dsw-alias-state-error-primary,#ec1313);border-radius:8px;margin-bottom:6px;padding:4px 8px;font-size:12px;line-height:18px}.UGGjQG_dock{width:100%;max-width:var(--dsh-composer-card-max-width,780px)}.UGGjQG_card{box-sizing:border-box;width:100%;max-width:var(--dsh-composer-card-max-width,780px);--dsw-elevation-stroke-color:var(--dsw-alias-border-l2,#0000001a);border-radius:var(--dsw-radius-panel,22px);background:var(--dsw-specific-input-major,var(--dsw-alias-bg-layer-1,#fff));box-shadow:var(--dsw-elevation-soft,0 0 0 1px #0000001a, 0 4px 12px 0 #0000000a);font-size:var(--dsh-content-font-size,14px);line-height:calc(24px + var(--dsh-content-font-delta,0px));--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2,#7f7f7f47);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2,#7f7f7f66);border:0;flex-direction:column;gap:12px;padding-top:8px;display:flex;position:relative}.UGGjQG_input{box-sizing:border-box;resize:none;width:100%;font-family:var(--dsw-font-family,inherit);font-size:inherit;line-height:inherit;color:var(--dsw-alias-label-primary,#1f2329);caret-color:var(--dsw-alias-state-business-primary,#4176e6);background:0 0;border:none;outline:none;min-height:36px;max-height:160px;padding:4px 8px 0 14px;overflow-y:auto}.UGGjQG_input::placeholder{color:var(--dsw-alias-label-caption,#adb2b8);user-select:none}.UGGjQG_row{justify-content:flex-end;align-items:center;gap:4px;padding:0 8px 6px;display:flex}.UGGjQG_attach{width:28px;height:28px;color:var(--dsw-alias-label-secondary,#1f2329b3);cursor:pointer;background:0 0;border:none;border-radius:8px;place-items:center;margin-right:auto;padding:0;display:grid}.UGGjQG_attach:hover{background:var(--dsw-alias-interactive-bg-hover,#0000000a);color:var(--dsw-alias-label-primary,#1f2329)}.UGGjQG_primary{background:var(--dsw-alias-button-info-fill,#4176e6);color:#fff;cursor:pointer;border:none;border-radius:999px;flex:none;place-items:center;width:34px;height:34px;transition:background-color .1s;display:grid}.UGGjQG_primary:hover:not(:disabled){background:var(--dsw-alias-button-info-hover,#679efe)}.UGGjQG_primary:disabled{opacity:.4;cursor:default}.UGGjQG_menu{box-sizing:border-box;border:1px solid var(--dsw-alias-border-inverted,#0000);background:var(--dsw-specific-menu,var(--dsw-alias-bg-layer-2,var(--dsw-alias-bg-layer-1,#fff)));min-width:218px;max-width:360px;max-height:340px;backdrop-filter:var(--dsw-menu-backdrop-filter,blur(20px));box-shadow:var(--dsw-shadow-lv3,0 0 1px 0 #0003, 0 0 4px 0 #00000005, 0 12px 32px 0 #00000014);z-index:1;--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2,#7f7f7f47);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2,#7f7f7f66);border-radius:12px;margin:0 0 6px;padding:4px;list-style:none;position:absolute;bottom:100%;left:8px;overflow-y:auto}.UGGjQG_item,.UGGjQG_itemActive{cursor:pointer;text-align:left;width:100%;min-height:34px;color:var(--dsw-alias-label-primary,#1f2329);background:0 0;border:none;border-radius:10px;align-items:center;gap:8px;padding:6px 10px;font-size:14px;line-height:22px;display:flex}.UGGjQG_item:hover,.UGGjQG_itemActive{background:var(--dsw-alias-interactive-bg-hover,#7f7f7f24)}.UGGjQG_dot{border-radius:50%;flex:none;width:8px;height:8px}.UGGjQG_itemText{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.UGGjQG_sessionMark{text-align:center;width:8px;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);flex:none;font-size:12px;line-height:18px}.UGGjQG_item[data-kid],.UGGjQG_itemActive[data-kid]{padding-left:28px}.UGGjQG_itemContext{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);font-size:12px}.UGGjQG_expand{width:24px;height:24px;color:var(--dsw-alias-label-secondary,#5a5a5ae6);border-radius:6px;flex:none;place-items:center;transition:transform .12s;display:inline-grid}.UGGjQG_expand:hover{background:var(--dsw-alias-fill-secondary,#7f7f7f1f)}.UGGjQG_expand[data-open]{transform:rotate(90deg)}.UGGjQG_menuGroup{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);padding:6px 10px 2px;font-size:11px;line-height:16px}.UGGjQG_menuMore{border-top:1px solid var(--dsw-alias-border-l2-darkmode-thin,#0000000f);color:var(--dsw-alias-label-tertiary,#7f7f7fcc);margin-top:2px;padding:6px 10px 4px;font-size:11.5px;line-height:16px}.UGGjQG_hint{white-space:nowrap;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);flex:none;margin-left:auto;font-size:12px;line-height:18px}.UGGjQG_primary:focus:not(:focus-visible),.UGGjQG_item:focus:not(:focus-visible),.UGGjQG_itemActive:focus:not(:focus-visible){outline:none}.UGGjQG_coordinator{color:var(--dsw-alias-label-tertiary,#81858c);align-self:flex-start;align-items:center;gap:6px;padding:0 14px;font-size:12px;line-height:18px;display:inline-flex}.UGGjQG_coordinatorDot{background:var(--member-color,var(--dsw-alias-label-tertiary,#81858c));border-radius:50%;width:8px;height:8px}.UGGjQG_coordinatorName{color:var(--dsw-alias-label-secondary,#5a5a5ae6);font-weight:600}.UGGjQG_tagRow{margin-bottom:-8px;padding:0 12px 0 16px;display:flex}.UGGjQG_tag{background:color-mix(in srgb, var(--dsw-alias-state-business-primary,#4176e6) 12%, transparent);color:var(--dsw-alias-state-business-primary,#4176e6);border-radius:6px;align-items:center;gap:4px;padding:0 4px 0 7px;font-size:12px;line-height:20px;display:inline-flex}.UGGjQG_tag[data-new]{background:color-mix(in srgb, var(--dsw-alias-state-success,#1f9a55) 12%, transparent);color:var(--dsw-alias-state-success,#1f9a55)}.UGGjQG_tagRemove{color:inherit;font:inherit;cursor:pointer;background:0 0;border:0;border-radius:4px;padding:0 3px;font-size:11px}.UGGjQG_tagRemove:hover{background:var(--dsw-alias-interactive-bg-hover,#2631480f)}.UGGjQG_chipRow{flex-wrap:wrap;gap:6px;margin-bottom:-8px;padding:0 12px 0 16px;display:flex}.UGGjQG_chip{background:color-mix(in srgb, var(--dsw-alias-state-business-primary,#4176e6) 12%, transparent);min-width:0;max-width:100%;color:var(--dsw-alias-state-business-primary,#4176e6);border-radius:6px;align-items:center;padding:0 4px 0 2px;font-size:12px;line-height:20px;display:inline-flex}.UGGjQG_chipLabel{min-width:0;color:inherit;font:inherit;cursor:pointer;background:0 0;border:0;border-radius:4px;align-items:center;gap:3px;padding:0 4px;display:inline-flex}.UGGjQG_chipLabel:hover{background:var(--dsw-alias-interactive-bg-hover,#2631480f)}.UGGjQG_chipAt{opacity:.8;flex:none}.UGGjQG_chipText{text-overflow:ellipsis;white-space:nowrap;min-width:0;max-width:min(280px,60vw);overflow:hidden}.UGGjQG_resumeStrip{border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#00000014);background:var(--dsw-alias-bg-layer-1,#fff);font-size:var(--dsh-panel-meta-size,12px);color:var(--dsw-alias-label-secondary,#1f2329b3);border-radius:10px;align-items:center;gap:10px;padding:6px 12px;line-height:18px;display:flex}.UGGjQG_resumeText{white-space:nowrap;text-overflow:ellipsis;flex:1;min-width:0;overflow:hidden}.UGGjQG_resumeAction{background:var(--dsw-alias-info-fill,#3964fe);color:#fff;font:inherit;cursor:pointer;border:none;border-radius:6px;flex:none;padding:2px 10px}.UGGjQG_resumeAction:disabled{opacity:.5;cursor:default}";
35456
36261
  const tagId$10 = "@khorsheed/dsh-room/RoomComposer.module.css";
35457
36262
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$10) + "]") === null) {
35458
36263
  const tag = document.createElement("style");
@@ -35462,35 +36267,39 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
35462
36267
  document.head.appendChild(tag);
35463
36268
  }
35464
36269
  var RoomComposer_module_css_default = {
35465
- "error": "UGGjQG_error",
35466
- "itemText": "UGGjQG_itemText",
35467
- "coordinatorDot": "UGGjQG_coordinatorDot",
35468
- "primary": "UGGjQG_primary",
35469
- "root": "UGGjQG_root",
35470
- "coordinatorName": "UGGjQG_coordinatorName",
35471
- "chipLabel": "UGGjQG_chipLabel",
35472
36270
  "sessionMark": "UGGjQG_sessionMark",
35473
- "itemContext": "UGGjQG_itemContext",
36271
+ "primary": "UGGjQG_primary",
36272
+ "hint": "UGGjQG_hint",
36273
+ "menuMore": "UGGjQG_menuMore",
36274
+ "tagRow": "UGGjQG_tagRow",
35474
36275
  "tagRemove": "UGGjQG_tagRemove",
36276
+ "coordinatorName": "UGGjQG_coordinatorName",
36277
+ "resumeAction": "UGGjQG_resumeAction",
36278
+ "coordinator": "UGGjQG_coordinator",
36279
+ "dock": "UGGjQG_dock",
36280
+ "menu": "UGGjQG_menu",
35475
36281
  "expand": "UGGjQG_expand",
35476
- "tagRow": "UGGjQG_tagRow",
35477
- "dot": "UGGjQG_dot",
35478
- "menuMore": "UGGjQG_menuMore",
35479
- "hint": "UGGjQG_hint",
35480
- "dock": "UGGjQG_dock",
35481
- "coordinator": "UGGjQG_coordinator",
35482
- "input": "UGGjQG_input",
35483
- "itemActive": "UGGjQG_itemActive",
35484
- "card": "UGGjQG_card",
36282
+ "tag": "UGGjQG_tag",
35485
36283
  "chipAt": "UGGjQG_chipAt",
36284
+ "error": "UGGjQG_error",
36285
+ "card": "UGGjQG_card",
36286
+ "resumeText": "UGGjQG_resumeText",
35486
36287
  "row": "UGGjQG_row",
35487
- "chip": "UGGjQG_chip",
35488
- "menuGroup": "UGGjQG_menuGroup",
35489
- "tag": "UGGjQG_tag",
36288
+ "root": "UGGjQG_root",
36289
+ "itemText": "UGGjQG_itemText",
35490
36290
  "item": "UGGjQG_item",
35491
36291
  "chipRow": "UGGjQG_chipRow",
35492
36292
  "chipText": "UGGjQG_chipText",
35493
- "menu": "UGGjQG_menu"
36293
+ "itemActive": "UGGjQG_itemActive",
36294
+ "itemContext": "UGGjQG_itemContext",
36295
+ "menuGroup": "UGGjQG_menuGroup",
36296
+ "coordinatorDot": "UGGjQG_coordinatorDot",
36297
+ "attach": "UGGjQG_attach",
36298
+ "chipLabel": "UGGjQG_chipLabel",
36299
+ "dot": "UGGjQG_dot",
36300
+ "chip": "UGGjQG_chip",
36301
+ "input": "UGGjQG_input",
36302
+ "resumeStrip": "UGGjQG_resumeStrip"
35494
36303
  };
35495
36304
  //#endregion
35496
36305
  //#region src/client/RoomComposer.tsx
@@ -35587,14 +36396,33 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
35587
36396
  * must stay a pure function of the owner props plus stable state reads).
35588
36397
  * @returns the room match, or null to pass the election down the chain.
35589
36398
  */
36399
+ /** Key prefix of the room's own pending interactions (its question/approval cards). */
36400
+ const ROOM_INTERACTION_PREFIX = "room:";
36401
+ /**
36402
+ * The pending-interaction key a room card publishes under.
36403
+ * @param kind - question or approval.
36404
+ * @param id - the card id.
36405
+ * @returns the key (prefixed, so the composer selector can tell it apart).
36406
+ */
36407
+ function roomInteractionKey(kind, id) {
36408
+ return `${ROOM_INTERACTION_PREFIX}${kind}:${id}`;
36409
+ }
35590
36410
  function selectRoomComposer(owner, isRoomCached) {
35591
- if (owner.pendingInteraction !== void 0) return null;
36411
+ if (owner.pendingInteraction !== void 0 && owner.pendingInteraction.key?.startsWith(ROOM_INTERACTION_PREFIX) !== true) return null;
35592
36412
  const sessionId = owner.sessionId ?? owner.session?.sessionId;
35593
36413
  return sessionId !== void 0 && isRoomCached(sessionId) ? { room: true } : null;
35594
36414
  }
35595
36415
  const NO_CHIPS = [];
36416
+ const NO_IDS = [];
36417
+ /** The failed-run reason recovery journals for a round a host restart cut off (dispatch.ts). */
36418
+ const RESTART_INTERRUPTED = "Execution outcome is unknown after restart";
36419
+ const NO_UPLOADS = {};
36420
+ const NO_UPLOAD_STORE = {
36421
+ subscribe: () => () => {},
36422
+ getSnapshot: () => NO_UPLOADS
36423
+ };
35596
36424
  /** The room composer takeover component. */
35597
- function RoomComposer({ sessionId, roomStore, submit, stop, openTasks, taskTags, openPlanSession, reconcileDelivery, roomCwd, invite, listProviders, browseDirectory, modelSurface, renderHarnessModelPicker, modelDirectory, renderMemberConfiguration, renderMemberInbox, stopMember, openReference, listSessions, insertSessionReference, useSession, useProjection, useInput, inputActions, t }) {
36425
+ function RoomComposer({ sessionId, roomStore, submit, stop, openTasks, taskTags, openPlanSession, reconcileDelivery, roomCwd, invite, listProviders, browseDirectory, modelSurface, renderHarnessModelPicker, modelDirectory, renderMemberConfiguration, renderMemberInbox, stopMember, openReference, listSessions, insertSessionReference, useSession, useProjection, useInput, inputActions, t, attachments: attachmentFace }) {
35598
36426
  const state = (0, react.useSyncExternalStore)(roomStore.subscribe, () => roomStore.getCached(sessionId));
35599
36427
  const tag = (0, react.useSyncExternalStore)(taskTags?.subscribe ?? NO_TAGS, () => taskTags?.get(sessionId));
35600
36428
  const draft = useInput((input) => input.draft);
@@ -35604,6 +36432,13 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
35604
36432
  const chips = chipMode ? occurrences : NO_CHIPS;
35605
36433
  const value = chipMode ? freeText(draft, chips) : draft;
35606
36434
  const [busy, setBusy] = (0, react.useState)(false);
36435
+ const attachmentActions = inputActions;
36436
+ const attachable = attachmentFace !== void 0 && attachmentActions.addAttachments !== void 0;
36437
+ const attachmentIds = useInput((input) => input.attachmentIds) ?? NO_IDS;
36438
+ const drafts = attachable && attachmentIds.length > 0 ? attachmentFace.resolve(attachmentIds) : [];
36439
+ const uploads = (0, react.useSyncExternalStore)(attachmentFace?.uploads.subscribe ?? NO_UPLOAD_STORE.subscribe, attachmentFace?.uploads.getSnapshot ?? NO_UPLOAD_STORE.getSnapshot);
36440
+ const uploadsPending = drafts.some((draft) => draft.kind === "file" && uploads[draft.id]?.status !== "ready");
36441
+ const fileInputRef = (0, react.useRef)(null);
35607
36442
  const [error, setError] = (0, react.useState)(null);
35608
36443
  const [mention, setMention] = (0, react.useState)(null);
35609
36444
  /** Menu-picked addressees: a pick is explicit addressing wherever the
@@ -35762,17 +36597,61 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
35762
36597
  const restored = mention.start + name.length + 2;
35763
36598
  requestAnimationFrame(() => areaRef.current?.setSelectionRange(restored, restored));
35764
36599
  };
36600
+ /** Add picked, pasted, or dropped files as drafts on this session. */
36601
+ const addFiles = (files) => {
36602
+ if (!attachable || files.length === 0) return;
36603
+ try {
36604
+ const created = attachmentFace.create(sessionId, files);
36605
+ if (attachmentActions.addAttachments?.(created.map((entry) => entry.id)) !== true) {
36606
+ for (const entry of created) attachmentFace.release(entry.id);
36607
+ setError(t("composer.error.generic"));
36608
+ return;
36609
+ }
36610
+ setError(null);
36611
+ } catch (caught) {
36612
+ setError(caught instanceof Error && caught.name === "UnsupportedImageMediaTypeError" ? t("attach.unsupported") : caught instanceof Error ? caught.message : String(caught));
36613
+ }
36614
+ };
36615
+ const removeAttachment = (id) => {
36616
+ attachmentActions.removeAttachment?.(id);
36617
+ attachmentFace?.release(id);
36618
+ };
36619
+ const onPaste = (event) => {
36620
+ const files = [...event.clipboardData.files];
36621
+ if (!attachable || files.length === 0) return;
36622
+ event.preventDefault();
36623
+ addFiles(files);
36624
+ };
36625
+ const waitingAsk = state?.askLog?.find((ask) => ask.state === "pending" && ask.runId !== void 0);
36626
+ const interrupted = (state?.runs ?? []).filter((run) => run.state === "failed" && run.error?.startsWith(RESTART_INTERRUPTED) === true).map((run) => run.member).filter((name) => state?.members.some((member) => member.name === name) === true);
36627
+ const continueAll = async () => {
36628
+ if (busy || interrupted.length === 0) return;
36629
+ setBusy(true);
36630
+ setError(null);
36631
+ try {
36632
+ const outcome = await submit(sessionId, t("composer.continueText"), interrupted);
36633
+ if (!outcome.ok) setError(outcome.message);
36634
+ } finally {
36635
+ setBusy(false);
36636
+ }
36637
+ };
35765
36638
  const send = async () => {
35766
36639
  const text = draft.trim();
35767
- if (text === "" || busy) return;
36640
+ const ids = attachable ? attachmentIds : NO_IDS;
36641
+ if (text === "" && ids.length === 0 || busy || uploadsPending) return;
35768
36642
  setBusy(true);
35769
36643
  setError(null);
35770
36644
  try {
35771
- const outcome = tag !== void 0 ? await submit(sessionId, text, picked, tag.task) : picked.length > 0 ? await submit(sessionId, text, picked) : await submit(sessionId, text);
36645
+ const wire = ids.length === 0 ? void 0 : await attachmentFace.serialize(ids);
36646
+ const outcome = wire !== void 0 ? await submit(sessionId, text, picked, tag?.task, wire) : tag !== void 0 ? await submit(sessionId, text, picked, tag.task) : picked.length > 0 ? await submit(sessionId, text, picked) : await submit(sessionId, text);
35772
36647
  if (!outcome.ok) {
35773
36648
  setError(outcome.message);
35774
36649
  return;
35775
36650
  }
36651
+ if (ids.length > 0) {
36652
+ attachmentActions.pruneAttachments?.([]);
36653
+ for (const id of ids) attachmentFace.release(id);
36654
+ }
35776
36655
  inputActions.setDraft("");
35777
36656
  const flushDraft = inputActions.persistDraft;
35778
36657
  flushDraft?.();
@@ -35855,11 +36734,41 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
35855
36734
  browseDirectory,
35856
36735
  modelSurface,
35857
36736
  renderHarnessModelPicker,
36737
+ waiting: waitingAsk === void 0 ? void 0 : {
36738
+ member: waitingAsk.member,
36739
+ jump: () => {
36740
+ const target = document.querySelector(`[data-ask-id="${CSS.escape(waitingAsk.id)}"]`);
36741
+ target?.scrollIntoView({
36742
+ block: "center",
36743
+ behavior: "smooth"
36744
+ });
36745
+ target?.querySelector("input, button")?.focus({ preventScroll: true });
36746
+ }
36747
+ },
35858
36748
  t
35859
36749
  }),
35860
36750
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RoomQueueStrip, {
35861
36751
  items: [...external ? [] : queued, ...coordinatorQueue],
35862
36752
  t
36753
+ }),
36754
+ interrupted.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
36755
+ className: RoomComposer_module_css_default.resumeStrip,
36756
+ role: "status",
36757
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
36758
+ className: RoomComposer_module_css_default.resumeText,
36759
+ children: t("composer.interrupted", {
36760
+ count: interrupted.length,
36761
+ names: interrupted.join("、")
36762
+ })
36763
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
36764
+ type: "button",
36765
+ className: RoomComposer_module_css_default.resumeAction,
36766
+ disabled: busy,
36767
+ onClick: () => {
36768
+ continueAll();
36769
+ },
36770
+ children: t("composer.continueAll")
36771
+ })]
35863
36772
  })
35864
36773
  ]
35865
36774
  }),
@@ -36031,6 +36940,15 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
36031
36940
  })]
36032
36941
  }, chip.occurrenceId))
36033
36942
  }),
36943
+ attachable && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RoomAttachments, {
36944
+ attachments: drafts,
36945
+ face: attachmentFace,
36946
+ onRemove: removeAttachment,
36947
+ onRetry: (id) => {
36948
+ attachmentFace.retry(sessionId, id);
36949
+ },
36950
+ t
36951
+ }),
36034
36952
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("textarea", {
36035
36953
  ref: areaRef,
36036
36954
  className: RoomComposer_module_css_default.input,
@@ -36039,6 +36957,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
36039
36957
  placeholder: tag === void 0 ? t("composer.placeholder", { name: coordinator?.name ?? "dsh" }) : tag.task === "new" ? t("job.tagPlaceholderNew") : t("job.tagPlaceholder", { label: tag.label }),
36040
36958
  onChange,
36041
36959
  onKeyDown,
36960
+ onPaste,
36042
36961
  onCompositionStart: () => {
36043
36962
  composing.current = true;
36044
36963
  },
@@ -36057,6 +36976,28 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
36057
36976
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
36058
36977
  className: RoomComposer_module_css_default.row,
36059
36978
  children: [
36979
+ attachable && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
36980
+ type: "button",
36981
+ className: RoomComposer_module_css_default.attach,
36982
+ "aria-label": t("attach.add"),
36983
+ title: t("attach.add"),
36984
+ onMouseDown: (event) => {
36985
+ event.preventDefault();
36986
+ },
36987
+ onClick: () => {
36988
+ fileInputRef.current?.click();
36989
+ },
36990
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconPaperclipOutlineMedium, { size: 16 })
36991
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
36992
+ ref: fileInputRef,
36993
+ type: "file",
36994
+ multiple: true,
36995
+ hidden: true,
36996
+ onChange: (event) => {
36997
+ addFiles([...event.target.files ?? []]);
36998
+ event.target.value = "";
36999
+ }
37000
+ })] }),
36060
37001
  external && coordinator.childSessionId !== void 0 && renderMemberConfiguration?.(coordinator.childSessionId),
36061
37002
  !external && modelDirectory !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RoomModelPicker, {
36062
37003
  directory: modelDirectory,
@@ -36093,7 +37034,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
36093
37034
  type: "button",
36094
37035
  className: RoomComposer_module_css_default.primary,
36095
37036
  "aria-label": t("composer.send"),
36096
- disabled: busy || draft.trim() === "",
37037
+ disabled: busy || uploadsPending || draft.trim() === "" && (!attachable || attachmentIds.length === 0),
36097
37038
  onMouseDown: (event) => {
36098
37039
  event.preventDefault();
36099
37040
  },
@@ -36115,9 +37056,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
36115
37056
  })
36116
37057
  ]
36117
37058
  }),
36118
- !external && useProjection !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RoomStatsLine, {
37059
+ useProjection !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RoomStatsLine, {
36119
37060
  useProjection,
36120
37061
  state,
37062
+ membersOnly: external,
36121
37063
  t
36122
37064
  })
36123
37065
  ]
@@ -36654,56 +37596,56 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
36654
37596
  document.head.appendChild(tag);
36655
37597
  }
36656
37598
  var TasksView_module_css_default = {
36657
- "danger": "itiYXa_danger",
36658
37599
  "need": "itiYXa_need",
36659
- "messages": "itiYXa_messages",
36660
- "goalInput": "itiYXa_goalInput",
36661
- "bar": "itiYXa_bar",
36662
- "small": "itiYXa_small",
37600
+ "row": "itiYXa_row",
37601
+ "tree": "itiYXa_tree",
37602
+ "avatars": "itiYXa_avatars",
37603
+ "nodeText": "itiYXa_nodeText",
37604
+ "primary": "itiYXa_primary",
37605
+ "link": "itiYXa_link",
37606
+ "avatar": "itiYXa_avatar",
37607
+ "now": "itiYXa_now",
36663
37608
  "goal": "itiYXa_goal",
36664
- "error": "itiYXa_error",
36665
- "count": "itiYXa_count",
36666
- "goalKey": "itiYXa_goalKey",
37609
+ "actions": "itiYXa_actions",
36667
37610
  "newTask": "itiYXa_newTask",
36668
- "rowHead": "itiYXa_rowHead",
36669
- "rowMeta": "itiYXa_rowMeta",
36670
- "dot": "itiYXa_dot",
36671
- "now": "itiYXa_now",
36672
- "avatar": "itiYXa_avatar",
37611
+ "back": "itiYXa_back",
37612
+ "confirm": "itiYXa_confirm",
37613
+ "page": "itiYXa_page",
37614
+ "messages": "itiYXa_messages",
36673
37615
  "seg": "itiYXa_seg",
37616
+ "section": "itiYXa_section",
37617
+ "messageText": "itiYXa_messageText",
37618
+ "goalText": "itiYXa_goalText",
37619
+ "nodeState": "itiYXa_nodeState",
37620
+ "danger": "itiYXa_danger",
37621
+ "dot": "itiYXa_dot",
37622
+ "bar": "itiYXa_bar",
36674
37623
  "cardTitle": "itiYXa_cardTitle",
36675
- "rowTitle": "itiYXa_rowTitle",
36676
- "actions": "itiYXa_actions",
36677
- "muted": "itiYXa_muted",
36678
- "list": "itiYXa_list",
36679
- "primary": "itiYXa_primary",
36680
- "confirm": "itiYXa_confirm",
37624
+ "small": "itiYXa_small",
36681
37625
  "lane": "itiYXa_lane",
36682
37626
  "laneName": "itiYXa_laneName",
36683
- "page": "itiYXa_page",
36684
- "nodeError": "itiYXa_nodeError",
36685
- "row": "itiYXa_row",
36686
- "node": "itiYXa_node",
37627
+ "filter": "itiYXa_filter",
37628
+ "list": "itiYXa_list",
37629
+ "rowHead": "itiYXa_rowHead",
37630
+ "rowTitle": "itiYXa_rowTitle",
37631
+ "count": "itiYXa_count",
37632
+ "tag": "itiYXa_tag",
37633
+ "detail": "itiYXa_detail",
36687
37634
  "card": "itiYXa_card",
36688
37635
  "attr": "itiYXa_attr",
36689
- "legend": "itiYXa_legend",
36690
- "link": "itiYXa_link",
36691
- "timeline": "itiYXa_timeline",
37636
+ "nodeError": "itiYXa_nodeError",
36692
37637
  "axis": "itiYXa_axis",
36693
- "filters": "itiYXa_filters",
36694
- "detail": "itiYXa_detail",
36695
- "tag": "itiYXa_tag",
37638
+ "error": "itiYXa_error",
36696
37639
  "elapsed": "itiYXa_elapsed",
36697
- "back": "itiYXa_back",
36698
- "nodeState": "itiYXa_nodeState",
36699
- "tree": "itiYXa_tree",
36700
- "avatars": "itiYXa_avatars",
36701
- "filter": "itiYXa_filter",
36702
- "section": "itiYXa_section",
36703
- "nodeText": "itiYXa_nodeText",
36704
- "messageText": "itiYXa_messageText",
37640
+ "filters": "itiYXa_filters",
37641
+ "node": "itiYXa_node",
37642
+ "goalKey": "itiYXa_goalKey",
36705
37643
  "nodeName": "itiYXa_nodeName",
36706
- "goalText": "itiYXa_goalText"
37644
+ "muted": "itiYXa_muted",
37645
+ "rowMeta": "itiYXa_rowMeta",
37646
+ "timeline": "itiYXa_timeline",
37647
+ "legend": "itiYXa_legend",
37648
+ "goalInput": "itiYXa_goalInput"
36707
37649
  };
36708
37650
  //#endregion
36709
37651
  //#region src/client/TasksView.tsx
@@ -37096,7 +38038,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
37096
38038
  }),
37097
38039
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
37098
38040
  className: TasksView_module_css_default.messageText,
37099
- children: [t("job.you"), entry.text]
38041
+ children: [entry.from === void 0 ? t("job.you") : t("job.from", { name: memberOf(state, entry.from)?.name ?? entry.from }), entry.text]
37100
38042
  }),
37101
38043
  entry.by !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
37102
38044
  className: TasksView_module_css_default.attr,
@@ -37536,7 +38478,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
37536
38478
  }
37537
38479
  //#endregion
37538
38480
  //#region \0dsh-css:src/client/TeamView.module.css.mjs
37539
- const css$8 = ".x4xi8W_team{min-width:0;font-size:var(--dsh-panel-font-body,13px);color:var(--dsw-alias-label-primary,#1f2329);flex-direction:column;gap:6px;padding:10px 12px 16px;line-height:1.5;display:flex}.x4xi8W_summary,.x4xi8W_legend{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);font-size:var(--dsh-panel-font-caption,12px);margin:0}.x4xi8W_root{border:1px dashed var(--dsw-alias-border-l2-darkmode-thin,#00000029);color:var(--dsw-alias-label-secondary,#5a5a5ae6);border-radius:8px;align-self:flex-start;padding:3px 12px;font-weight:600}.x4xi8W_tree{margin:0;padding:0 0 0 16px;list-style:none;position:relative}.x4xi8W_tree:before{content:\"\";border-left:1.5px solid var(--dsw-alias-border-l2-darkmode-thin,#0000001f);position:absolute;top:0;bottom:18px;left:6px}.x4xi8W_tree>li{position:relative}.x4xi8W_tree>li:before{content:\"\";border-top:1.5px solid var(--dsw-alias-border-l2-darkmode-thin,#0000001f);width:10px;position:absolute;top:20px;left:-10px}.x4xi8W_node{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#0000001a);background:var(--dsw-alias-bg-layer-1,#fff);width:100%;color:inherit;font:inherit;text-align:left;cursor:pointer;border-radius:9px;flex-direction:column;gap:2px;margin:5px 0;padding:7px 9px;display:flex}.x4xi8W_node[data-external=helper]{border-style:dashed}.x4xi8W_node[data-done]{opacity:.6}.x4xi8W_chip[data-external]{color:var(--dsw-alias-label-secondary,#5a5a5ae6)}.x4xi8W_node[data-selected=true]{border-color:var(--dsw-alias-state-business-primary,#4176e6);box-shadow:0 0 0 2px color-mix(in srgb, var(--dsw-alias-state-business-primary,#4176e6) 18%, transparent)}.x4xi8W_nodeHead{align-items:center;gap:7px;min-width:0;display:flex}.x4xi8W_avatar{background:color-mix(in srgb, var(--member-color,var(--dsw-alias-label-tertiary,#7f8287)) 85%, black);color:#fff;border-radius:6px;flex:none;place-items:center;width:22px;height:22px;font-size:11px;font-weight:600;display:grid}.x4xi8W_nodeName{white-space:nowrap;font-weight:650}.x4xi8W_chip,.x4xi8W_role{background:var(--dsw-alias-bg-layer-2,#0000000d);color:var(--dsw-alias-label-secondary,#5a5a5ae6);white-space:nowrap;border-radius:5px;padding:0 6px;font-size:11px}.x4xi8W_role{text-overflow:ellipsis;min-width:0;overflow:hidden}.x4xi8W_status{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);flex:none;align-items:center;gap:4px;margin-left:auto;font-size:11px;display:inline-flex}.x4xi8W_status>i{background:currentColor;border-radius:50%;width:7px;height:7px}.x4xi8W_status[data-status=running]{color:var(--dsw-alias-state-success,#1f9a55)}.x4xi8W_status[data-status=failed]{color:var(--dsw-alias-text-error,#d9363e)}.x4xi8W_line{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);font-size:var(--dsh-panel-font-caption,12px);font-variant-numeric:tabular-nums;flex-wrap:wrap;gap:2px 8px;margin:0;display:flex}.x4xi8W_current{color:var(--dsw-alias-label-secondary,#5a5a5ae6);font-size:var(--dsh-panel-font-caption,12px);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.x4xi8W_expand{flex-direction:column;gap:4px;margin:0 0 6px 8px;display:flex}.x4xi8W_deliveries{border-left:2px solid var(--dsw-alias-border-l2-darkmode-thin,#0000001a);font-size:var(--dsh-panel-font-caption,12px);margin:0;padding:0 0 0 8px;list-style:none}.x4xi8W_deliveries>li{flex-wrap:wrap;align-items:baseline;gap:2px 6px;padding:3px 0;display:flex}.x4xi8W_msgId{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);font-family:var(--dsw-font-mono,ui-monospace, Menlo, monospace);font-size:11px}.x4xi8W_from{color:var(--dsw-alias-label-tertiary,#7f7f7fcc)}.x4xi8W_text{min-width:120px;color:var(--dsw-alias-label-secondary,#5a5a5ae6);text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.x4xi8W_outcome{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);white-space:nowrap;font-size:11px}.x4xi8W_outcome[data-status=done]{color:var(--dsw-alias-state-success,#1f9a55)}.x4xi8W_outcome[data-status=running]{color:var(--dsw-alias-state-business-primary,#4176e6)}.x4xi8W_outcome[data-status=failed],.x4xi8W_outcome[data-status=uncertain]{color:var(--dsw-alias-text-error,#d9363e)}.x4xi8W_open{border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#00000029);color:var(--dsw-alias-label-secondary,#5a5a5ae6);font:inherit;font-size:var(--dsh-panel-font-caption,12px);cursor:pointer;background:0 0;border-radius:7px;align-self:flex-start;padding:2px 10px}.x4xi8W_detail .x4xi8W_open{margin-left:8px}.x4xi8W_empty{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);font-size:var(--dsh-panel-font-caption,12px);margin:4px 0}.x4xi8W_graph{padding:8px 0 12px;position:relative}.x4xi8W_edges{pointer-events:none;width:100%;height:100%;position:absolute;inset:0;overflow:visible}.x4xi8W_edgeTask{fill:none;stroke:var(--dsw-alias-border-l2-darkmode-thin,#7f7f7f73);stroke-width:1.5px}.x4xi8W_arrow{fill:var(--dsw-alias-border-l2-darkmode-thin,#7f7f7f73)}.x4xi8W_level{z-index:1;justify-content:center;gap:16px;margin-bottom:40px;display:flex;position:relative}.x4xi8W_level:last-child{margin-bottom:0}.x4xi8W_level>.x4xi8W_node{width:210px;margin:0}.x4xi8W_level>.x4xi8W_root{align-self:center}.x4xi8W_detail{border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#0000001a);background:var(--dsw-alias-bg-layer-1,#fff);border-radius:10px;flex-direction:column;gap:4px;padding:10px 12px;display:flex}.x4xi8W_pill,.x4xi8W_pillFloat{border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#00000029);background:var(--dsw-alias-bg-layer-1,#fff);color:var(--dsw-alias-label-secondary,#5a5a5ae6);white-space:nowrap;font-variant-numeric:tabular-nums;border-radius:999px;gap:4px;padding:0 7px;font-size:10.5px;line-height:16px;display:inline-flex}.x4xi8W_pillFloat{position:absolute;top:-9px;left:50%;transform:translate(-50%)}.x4xi8W_pillReport{color:var(--dsw-alias-state-success,#1f9a55)}.x4xi8W_pillNotify{color:var(--dsw-alias-state-purple,#7a52c7)}.x4xi8W_level>.x4xi8W_node{position:relative}.x4xi8W_more{border:1px dashed var(--dsw-alias-border-l2-darkmode-thin,#0003);width:120px;color:var(--dsw-alias-label-secondary,#5a5a5ae6);font:inherit;font-size:var(--dsh-panel-font-caption,12px);cursor:pointer;background:0 0;border-radius:10px;padding:8px 10px}";
38481
+ const css$8 = ".x4xi8W_team{min-width:0;font-size:var(--dsh-panel-font-body,13px);color:var(--dsw-alias-label-primary,#1f2329);flex-direction:column;gap:6px;padding:10px 12px 16px;line-height:1.5;display:flex}.x4xi8W_summary,.x4xi8W_legend{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);font-size:var(--dsh-panel-font-caption,12px);margin:0}.x4xi8W_root{border:1px dashed var(--dsw-alias-border-l2-darkmode-thin,#00000029);color:var(--dsw-alias-label-secondary,#5a5a5ae6);border-radius:8px;align-self:flex-start;padding:3px 12px;font-weight:600}.x4xi8W_tree{margin:0;padding:0 0 0 16px;list-style:none;position:relative}.x4xi8W_tree:before{content:\"\";border-left:1.5px solid var(--dsw-alias-border-l2-darkmode-thin,#0000001f);position:absolute;top:0;bottom:18px;left:6px}.x4xi8W_tree>li{position:relative}.x4xi8W_tree>li:before{content:\"\";border-top:1.5px solid var(--dsw-alias-border-l2-darkmode-thin,#0000001f);width:10px;position:absolute;top:20px;left:-10px}.x4xi8W_node{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#0000001a);background:var(--dsw-alias-bg-layer-1,#fff);width:100%;color:inherit;font:inherit;text-align:left;cursor:pointer;border-radius:9px;flex-direction:column;gap:2px;margin:5px 0;padding:7px 9px;display:flex;container:team-node/inline-size}.x4xi8W_node[data-external=helper]{border-style:dashed}.x4xi8W_node[data-done]{opacity:.6}.x4xi8W_chip[data-external]{color:var(--dsw-alias-label-secondary,#5a5a5ae6)}.x4xi8W_node[data-selected=true]{border-color:var(--dsw-alias-state-business-primary,#4176e6);box-shadow:0 0 0 2px color-mix(in srgb, var(--dsw-alias-state-business-primary,#4176e6) 18%, transparent)}.x4xi8W_nodeHead{align-items:center;gap:7px;min-width:0;display:flex}.x4xi8W_avatar{background:color-mix(in srgb, var(--member-color,var(--dsw-alias-label-tertiary,#7f8287)) 85%, black);color:#fff;border-radius:6px;flex:none;place-items:center;width:22px;height:22px;font-size:11px;font-weight:600;display:grid}.x4xi8W_nodeName{white-space:nowrap;text-overflow:ellipsis;min-width:0;font-weight:650;overflow:hidden}.x4xi8W_chip{flex:none}@container team-node (width<=300px){.x4xi8W_status>span{display:none}}.x4xi8W_chip,.x4xi8W_role{background:var(--dsw-alias-bg-layer-2,#0000000d);color:var(--dsw-alias-label-secondary,#5a5a5ae6);white-space:nowrap;border-radius:5px;padding:0 6px;font-size:11px}.x4xi8W_role{text-overflow:ellipsis;min-width:0;overflow:hidden}.x4xi8W_status{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);flex:none;align-items:center;gap:4px;margin-left:auto;font-size:11px;display:inline-flex}.x4xi8W_status>i{background:currentColor;border-radius:50%;width:7px;height:7px}.x4xi8W_status[data-status=running]{color:var(--dsw-alias-state-success,#1f9a55)}.x4xi8W_status[data-status=failed]{color:var(--dsw-alias-text-error,#d9363e)}.x4xi8W_line{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);font-size:var(--dsh-panel-font-caption,12px);font-variant-numeric:tabular-nums;flex-wrap:wrap;gap:2px 8px;margin:0;display:flex}.x4xi8W_current{color:var(--dsw-alias-label-secondary,#5a5a5ae6);font-size:var(--dsh-panel-font-caption,12px);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.x4xi8W_expand{flex-direction:column;gap:4px;margin:0 0 6px 8px;display:flex}.x4xi8W_deliveries{border-left:2px solid var(--dsw-alias-border-l2-darkmode-thin,#0000001a);font-size:var(--dsh-panel-font-caption,12px);margin:0;padding:0 0 0 8px;list-style:none}.x4xi8W_deliveries>li{flex-wrap:wrap;align-items:baseline;gap:2px 6px;padding:3px 0;display:flex}.x4xi8W_msgId{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);font-family:var(--dsw-font-mono,ui-monospace, Menlo, monospace);font-size:11px}.x4xi8W_from{color:var(--dsw-alias-label-tertiary,#7f7f7fcc)}.x4xi8W_text{min-width:120px;color:var(--dsw-alias-label-secondary,#5a5a5ae6);text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.x4xi8W_outcome{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);white-space:nowrap;font-size:11px}.x4xi8W_outcome[data-status=done]{color:var(--dsw-alias-state-success,#1f9a55)}.x4xi8W_outcome[data-status=running]{color:var(--dsw-alias-state-business-primary,#4176e6)}.x4xi8W_outcome[data-status=failed],.x4xi8W_outcome[data-status=uncertain]{color:var(--dsw-alias-text-error,#d9363e)}.x4xi8W_open{border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#00000029);color:var(--dsw-alias-label-secondary,#5a5a5ae6);font:inherit;font-size:var(--dsh-panel-font-caption,12px);cursor:pointer;background:0 0;border-radius:7px;align-self:flex-start;padding:2px 10px}.x4xi8W_detail .x4xi8W_open{margin-left:8px}.x4xi8W_empty{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);font-size:var(--dsh-panel-font-caption,12px);margin:4px 0}.x4xi8W_graph{padding:8px 0 12px;position:relative}.x4xi8W_edges{pointer-events:none;width:100%;height:100%;position:absolute;inset:0;overflow:visible}.x4xi8W_edgeTask{fill:none;stroke:var(--dsw-alias-border-l2-darkmode-thin,#7f7f7f73);stroke-width:1.5px}.x4xi8W_arrow{fill:var(--dsw-alias-border-l2-darkmode-thin,#7f7f7f73)}.x4xi8W_level{z-index:1;justify-content:center;gap:16px;margin-bottom:40px;display:flex;position:relative}.x4xi8W_level:last-child{margin-bottom:0}.x4xi8W_level>.x4xi8W_node{width:210px;margin:0}.x4xi8W_level>.x4xi8W_root{align-self:center}.x4xi8W_detail{border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#0000001a);background:var(--dsw-alias-bg-layer-1,#fff);border-radius:10px;flex-direction:column;gap:4px;padding:10px 12px;display:flex}.x4xi8W_pill,.x4xi8W_pillFloat{border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#00000029);background:var(--dsw-alias-bg-layer-1,#fff);color:var(--dsw-alias-label-secondary,#5a5a5ae6);white-space:nowrap;font-variant-numeric:tabular-nums;border-radius:999px;gap:4px;padding:0 7px;font-size:10.5px;line-height:16px;display:inline-flex}.x4xi8W_pillFloat{position:absolute;top:-9px;left:50%;transform:translate(-50%)}.x4xi8W_pillReport{color:var(--dsw-alias-state-success,#1f9a55)}.x4xi8W_pillNotify{color:var(--dsw-alias-state-purple,#7a52c7)}.x4xi8W_level>.x4xi8W_node{position:relative}.x4xi8W_more{border:1px dashed var(--dsw-alias-border-l2-darkmode-thin,#0003);width:120px;color:var(--dsw-alias-label-secondary,#5a5a5ae6);font:inherit;font-size:var(--dsh-panel-font-caption,12px);cursor:pointer;background:0 0;border-radius:10px;padding:8px 10px}";
37540
38482
  const tagId$8 = "@khorsheed/dsh-room/TeamView.module.css";
37541
38483
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$8) + "]") === null) {
37542
38484
  const tag = document.createElement("style");
@@ -37546,39 +38488,39 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
37546
38488
  document.head.appendChild(tag);
37547
38489
  }
37548
38490
  var TeamView_module_css_default = {
37549
- "nodeName": "x4xi8W_nodeName",
37550
- "msgId": "x4xi8W_msgId",
37551
- "open": "x4xi8W_open",
37552
- "node": "x4xi8W_node",
37553
- "pill": "x4xi8W_pill",
38491
+ "role": "x4xi8W_role",
37554
38492
  "pillReport": "x4xi8W_pillReport",
37555
- "pillNotify": "x4xi8W_pillNotify",
37556
- "empty": "x4xi8W_empty",
37557
- "chip": "x4xi8W_chip",
37558
- "summary": "x4xi8W_summary",
37559
- "status": "x4xi8W_status",
37560
- "deliveries": "x4xi8W_deliveries",
37561
- "edges": "x4xi8W_edges",
37562
- "edgeTask": "x4xi8W_edgeTask",
37563
- "level": "x4xi8W_level",
37564
- "line": "x4xi8W_line",
37565
- "current": "x4xi8W_current",
37566
38493
  "arrow": "x4xi8W_arrow",
38494
+ "line": "x4xi8W_line",
38495
+ "legend": "x4xi8W_legend",
38496
+ "root": "x4xi8W_root",
37567
38497
  "tree": "x4xi8W_tree",
38498
+ "current": "x4xi8W_current",
38499
+ "empty": "x4xi8W_empty",
38500
+ "graph": "x4xi8W_graph",
38501
+ "edgeTask": "x4xi8W_edgeTask",
38502
+ "more": "x4xi8W_more",
38503
+ "avatar": "x4xi8W_avatar",
38504
+ "msgId": "x4xi8W_msgId",
37568
38505
  "nodeHead": "x4xi8W_nodeHead",
38506
+ "level": "x4xi8W_level",
38507
+ "pillNotify": "x4xi8W_pillNotify",
38508
+ "summary": "x4xi8W_summary",
38509
+ "edges": "x4xi8W_edges",
38510
+ "status": "x4xi8W_status",
37569
38511
  "expand": "x4xi8W_expand",
37570
- "from": "x4xi8W_from",
37571
38512
  "text": "x4xi8W_text",
37572
38513
  "team": "x4xi8W_team",
37573
38514
  "outcome": "x4xi8W_outcome",
37574
- "root": "x4xi8W_root",
37575
- "detail": "x4xi8W_detail",
37576
- "graph": "x4xi8W_graph",
37577
- "role": "x4xi8W_role",
38515
+ "chip": "x4xi8W_chip",
38516
+ "nodeName": "x4xi8W_nodeName",
38517
+ "deliveries": "x4xi8W_deliveries",
38518
+ "from": "x4xi8W_from",
38519
+ "node": "x4xi8W_node",
38520
+ "pill": "x4xi8W_pill",
37578
38521
  "pillFloat": "x4xi8W_pillFloat",
37579
- "legend": "x4xi8W_legend",
37580
- "avatar": "x4xi8W_avatar",
37581
- "more": "x4xi8W_more"
38522
+ "detail": "x4xi8W_detail",
38523
+ "open": "x4xi8W_open"
37582
38524
  };
37583
38525
  //#endregion
37584
38526
  //#region src/client/TeamView.tsx
@@ -37603,7 +38545,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
37603
38545
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
37604
38546
  className: TeamView_module_css_default.status,
37605
38547
  "data-status": node.status,
37606
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("i", { "aria-hidden": true }), label]
38548
+ title: label,
38549
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("i", { "aria-hidden": true }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: label })]
37607
38550
  });
37608
38551
  }
37609
38552
  function Avatar({ node }) {
@@ -38112,10 +39055,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
38112
39055
  document.head.appendChild(tag);
38113
39056
  }
38114
39057
  var TasksTab_module_css_default = {
38115
- "switch": "Uyidcq_switch",
38116
- "body": "Uyidcq_body",
38117
39058
  "switchTab": "Uyidcq_switchTab",
38118
- "page": "Uyidcq_page"
39059
+ "page": "Uyidcq_page",
39060
+ "body": "Uyidcq_body",
39061
+ "switch": "Uyidcq_switch"
38119
39062
  };
38120
39063
  //#endregion
38121
39064
  //#region src/client/TasksTab.tsx
@@ -38266,9 +39209,52 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
38266
39209
  ]
38267
39210
  });
38268
39211
  //#endregion
38269
- //#region \0dsh-css:src/client/RoomSpeechView.module.css.mjs
38270
- const css$6 = ".tEFZ_W_speech{grid-template-columns:28px minmax(0,1fr);gap:10px;margin:8px 0 16px;display:grid}.tEFZ_W_avatar{background:color-mix(in srgb, var(--member-color,var(--dsw-alias-label-tertiary,#7f8287)) 85%, black);color:#fff;user-select:none;border-radius:50%;place-items:center;width:28px;height:28px;margin-top:2px;font-size:12px;font-weight:600;display:grid}.tEFZ_W_card{border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#00000014);background:var(--dsw-alias-bg-layer-1,#fff);border-radius:12px;flex-direction:column;gap:2px;min-width:0;padding:8px 12px;display:flex}.tEFZ_W_identity{flex-wrap:wrap;align-items:baseline;gap:2px 8px;display:flex}.tEFZ_W_name{color:var(--dsw-alias-label-primary,#1f2329);font-size:13px;font-weight:600}.tEFZ_W_role{background:var(--dsw-alias-bg-layer-2,#0000000d);color:var(--dsw-alias-label-secondary,#5a5a5ae6);border-radius:5px;padding:0 6px;font-size:11px;line-height:18px}.tEFZ_W_provider{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);font-size:12px;line-height:18px}.tEFZ_W_interrupted{color:var(--dsw-alias-text-error,#d9363e);font-size:12px}.tEFZ_W_body{color:var(--dsw-alias-label-primary,#1f2329);font-size:14px;line-height:24px}.tEFZ_W_clamped{max-height:240px;position:relative;overflow:hidden}.tEFZ_W_fade{cursor:pointer;background:linear-gradient(180deg, color-mix(in srgb, var(--dsw-alias-bg-layer-1,#fff) 0%, transparent), var(--dsw-alias-bg-layer-1,#fff));height:48px;position:absolute;bottom:0;left:0;right:0}.tEFZ_W_foldBar{justify-content:flex-end;margin:2px -4px 0 0;display:flex}.tEFZ_W_clamped .tEFZ_W_foldBar{margin:0;position:absolute;bottom:4px;right:4px}.tEFZ_W_foldToggle{background:var(--dsw-alias-bg-base,#fff);width:30px;height:20px;color:var(--dsw-alias-label-secondary,var(--dsw-alias-label-primary));box-shadow:0 0 0 .5px color-mix(in srgb, var(--dsw-alias-label-primary,#000) 8%, transparent);cursor:pointer;border:none;border-radius:10px;justify-content:center;align-items:center;padding:0;transition:background-color .12s,color .12s;display:inline-flex}.tEFZ_W_foldToggle svg{transition:transform .16s}.tEFZ_W_foldToggle[aria-expanded=true] svg{transform:rotate(180deg)}.tEFZ_W_foldToggle:hover{background:color-mix(in srgb, var(--dsw-alias-bg-base,#fff) 82%, var(--dsw-alias-label-primary,#000));color:var(--dsw-alias-label-primary,var(--dsw-alias-label-secondary))}.tEFZ_W_foldToggle:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4176e6);outline-offset:2px}.tEFZ_W_actions{align-items:center;gap:8px;height:28px;margin-top:6px;transition:opacity .12s;display:flex}.tEFZ_W_stack{flex-direction:column;min-width:0;display:flex}.tEFZ_W_speech[data-actions-reveal=hover] .tEFZ_W_actions{opacity:0}.tEFZ_W_speech[data-actions-reveal=hover]:hover .tEFZ_W_actions,.tEFZ_W_speech[data-actions-reveal=hover]:focus-within .tEFZ_W_actions{opacity:1}@media (hover:none){.tEFZ_W_speech[data-actions-reveal=hover] .tEFZ_W_actions{opacity:1}}.tEFZ_W_usage{display:inline-flex;position:relative}.tEFZ_W_usageChip{height:24px;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);white-space:nowrap;cursor:default;background:0 0;border:none;border-radius:6px;padding:0 6px;font-size:12px;line-height:24px}.tEFZ_W_usageChip:hover,.tEFZ_W_usageChip[aria-expanded=true]{background:var(--dsw-alias-interactive-bg-hover,#7f7f7f24);color:var(--dsw-alias-label-secondary,#5a5a5ae6)}.tEFZ_W_usagePanel{z-index:10;border:1px solid var(--dsw-alias-border-l2-darkmode-thin,var(--dsw-alias-border-l2,#0000001a));background:var(--dsw-specific-menu,var(--dsw-alias-bg-layer-2,var(--dsw-alias-bg-layer-1,#fff)));min-width:260px;backdrop-filter:var(--dsw-menu-backdrop-filter,blur(20px));box-shadow:var(--dsw-elevation-prominent,0 12px 32px #0000001f);font-variant-numeric:tabular-nums;border-radius:12px;flex-direction:column;gap:2px;padding:10px 14px;font-size:12px;line-height:22px;display:flex;position:absolute;bottom:calc(100% + 6px);left:0}.tEFZ_W_usageHead,.tEFZ_W_usageRow{white-space:nowrap;justify-content:space-between;gap:24px;display:flex}.tEFZ_W_usageHead{border-bottom:1px solid var(--dsw-alias-border-l2,#7f7f7f33);color:var(--dsw-alias-label-primary,#1f2329);margin-bottom:4px;padding-bottom:6px;font-weight:600}.tEFZ_W_usageRow>:first-child{color:var(--dsw-alias-label-tertiary,#7f7f7fcc)}.tEFZ_W_usageRow>:last-child{color:var(--dsw-alias-label-secondary,#5a5a5ae6)}.tEFZ_W_action{width:28px;height:28px;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);cursor:pointer;background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;padding:6px;display:inline-flex}.tEFZ_W_action:hover{background:var(--dsw-alias-interactive-bg-hover,#7f7f7f24);color:var(--dsw-alias-label-secondary,#5a5a5ae6)}.tEFZ_W_meta,.tEFZ_W_reported{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);white-space:nowrap;font-size:12px;line-height:24px}.tEFZ_W_reported{color:var(--dsw-alias-state-success,#1f9a55)}.tEFZ_W_action:focus:not(:focus-visible),.tEFZ_W_foldToggle:focus:not(:focus-visible){outline:none}";
38271
- const tagId$6 = "@khorsheed/dsh-room/RoomSpeechView.module.css";
39212
+ //#region src/client/path-mentions.ts
39213
+ /** Extensions a member's inline code most often names as a deliverable or source file. */
39214
+ const FILE_EXTENSION = /\.(?:png|jpe?g|gif|webp|svg|md|txt|json|ya?ml|toml|csv|html?|css|[cm]?[jt]sx?|py|sh|glb|gltf|blend|fbx|obj|mp3|wav|ogg|mp4|webm|pdf)$/i;
39215
+ /**
39216
+ * Whether an inline-code token reads as a file path.
39217
+ * @param value - the token as authored.
39218
+ * @returns true for a path-shaped token with a known file extension.
39219
+ */
39220
+ function looksLikeFilePath(value) {
39221
+ return value.length <= 300 && !/\s/.test(value) && !value.includes("://") && !value.startsWith("-") && FILE_EXTENSION.test(value);
39222
+ }
39223
+ /**
39224
+ * The absolute path a member's token names: as written when absolute, under
39225
+ * the member's working directory when it has its own, else left relative (the
39226
+ * file address then resolves it against the room session's workspace).
39227
+ * @param value - the token.
39228
+ * @param cwd - the member's own working directory, when it has one.
39229
+ * @returns the path to open.
39230
+ */
39231
+ function memberPath(value, cwd) {
39232
+ if (value.startsWith("/") || value.startsWith("~") || cwd === void 0) return value;
39233
+ return `${cwd.replace(/\/+$/, "")}/${value.replace(/^\.\//, "")}`;
39234
+ }
39235
+ /**
39236
+ * The file-mention vocabulary for one member's text.
39237
+ * @param open - opens one resolved path in the sidebar.
39238
+ * @param cwd - the member's own working directory, when it has one.
39239
+ * @returns the MarkdownText fileMentions value.
39240
+ */
39241
+ function pathMentions(open, cwd) {
39242
+ return { resolve: (value) => {
39243
+ if (!looksLikeFilePath(value)) return void 0;
39244
+ const path = memberPath(value, cwd);
39245
+ return {
39246
+ open: () => {
39247
+ open(path);
39248
+ },
39249
+ label: value,
39250
+ title: path
39251
+ };
39252
+ } };
39253
+ }
39254
+ //#endregion
39255
+ //#region \0dsh-css:src/client/RoomQuestionView.module.css.mjs
39256
+ const css$6 = ".Ot_rXG_row{grid-template-columns:28px minmax(0,1fr);gap:10px;margin:8px 0 16px;display:grid}.Ot_rXG_card{border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#00000014);background:var(--dsw-alias-bg-layer-1,#fff);min-width:0;font-size:var(--dsh-content-font-size,14px);line-height:calc(22px + var(--dsh-content-font-delta,0px));color:var(--dsw-alias-label-primary,#1f2329);border-radius:12px;flex-direction:column;gap:12px;padding:12px 14px;display:flex}.Ot_rXG_row[data-state=cancelled]{opacity:.6}.Ot_rXG_head{align-items:center;gap:8px;display:flex}.Ot_rXG_avatar{background:color-mix(in srgb, var(--member-color,var(--dsw-alias-label-tertiary,#7f8287)) 85%, black);color:#fff;user-select:none;border-radius:50%;place-items:center;width:28px;height:28px;margin-top:2px;font-size:12px;font-weight:600;display:grid}.Ot_rXG_title{font-weight:600}.Ot_rXG_status{color:var(--dsw-alias-label-tertiary,#1f232980);margin-left:auto;font-size:12px}.Ot_rXG_question{border:0;flex-direction:column;gap:6px;min-width:0;margin:0;padding:0;display:flex}.Ot_rXG_prompt{flex-wrap:wrap;align-items:baseline;gap:6px;margin-bottom:2px;padding:0;font-weight:500;display:flex}.Ot_rXG_chip{background:var(--dsw-alias-interactive-bg-hover,#0000000d);color:var(--dsw-alias-label-secondary,#1f2329b3);border-radius:6px;padding:0 6px;font-size:12px;font-weight:500}.Ot_rXG_hint{color:var(--dsw-alias-label-tertiary,#1f232980);font-size:12px;font-weight:400}.Ot_rXG_option{border:1px solid var(--dsw-alias-border-l2,#7f7f7f3d);cursor:pointer;border-radius:10px;align-items:flex-start;gap:8px;padding:7px 10px;transition:background-color .1s,border-color .1s;display:flex}.Ot_rXG_option:hover{background:var(--dsw-alias-interactive-bg-hover,#0000000a)}.Ot_rXG_option[data-picked=true]{border-color:var(--dsw-alias-state-business-primary,#4176e6);background:color-mix(in srgb, var(--dsw-alias-state-business-primary,#4176e6) 8%, transparent)}.Ot_rXG_option input{accent-color:var(--dsw-alias-state-business-primary,#4176e6);flex:none;margin:4px 0 0}.Ot_rXG_optionText{flex-direction:column;min-width:0;display:flex}.Ot_rXG_optionLabel{font-weight:500}.Ot_rXG_optionDescription{color:var(--dsw-alias-label-secondary,#1f2329b3);font-size:12px;line-height:18px}.Ot_rXG_other{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,#7f7f7f3d);width:100%;color:inherit;font:inherit;background:0 0;border-radius:10px;outline:none;padding:6px 10px}.Ot_rXG_other:focus{border-color:var(--dsw-alias-state-business-primary,#4176e6)}.Ot_rXG_answer{color:var(--dsw-alias-label-secondary,#1f2329b3)}.Ot_rXG_actions{justify-content:flex-end;align-items:center;gap:10px;display:flex}.Ot_rXG_error{color:var(--dsw-alias-state-error-primary,#d9363e);font-size:12px}.Ot_rXG_submit{background:var(--dsw-alias-button-info-fill,#4176e6);color:#fff;height:32px;font:inherit;cursor:pointer;border:none;border-radius:999px;padding:0 14px;font-weight:500}.Ot_rXG_submit:disabled{opacity:.4;cursor:default}.Ot_rXG_inline{border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#00000014);background:var(--dsw-alias-bg-layer-2,#00000008);font-size:var(--dsh-content-font-size,14px);color:var(--dsw-alias-label-primary,#1f2329);border-radius:10px;flex-direction:column;gap:10px;margin:6px 0 12px;padding:9px 12px;display:flex}.Ot_rXG_inline[data-state=pending]{border-color:color-mix(in srgb, var(--dsw-alias-state-warning-primary,#c08419) 55%, transparent);background:color-mix(in srgb, var(--dsw-alias-state-warning-primary,#c08419) 7%, var(--dsw-alias-bg-layer-1,#fff));box-shadow:0 0 0 3px color-mix(in srgb, var(--dsw-alias-state-warning-primary,#c08419) 14%, transparent)}.Ot_rXG_inline[data-state=late]{border-style:dashed}.Ot_rXG_inlineHead{color:var(--dsw-alias-label-tertiary,#1f232980);align-items:center;gap:8px;font-size:12px;display:flex}.Ot_rXG_inline[data-state=pending] .Ot_rXG_inlineHead{color:var(--dsw-alias-state-warning-primary,#c08419);font-weight:600}";
39257
+ const tagId$6 = "@khorsheed/dsh-room/RoomQuestionView.module.css";
38272
39258
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$6) + "]") === null) {
38273
39259
  const tag = document.createElement("style");
38274
39260
  tag.dataset.plugin = "@khorsheed/dsh-room";
@@ -38276,472 +39262,206 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
38276
39262
  tag.textContent = css$6;
38277
39263
  document.head.appendChild(tag);
38278
39264
  }
38279
- var RoomSpeechView_module_css_default = {
38280
- "stack": "tEFZ_W_stack",
38281
- "action": "tEFZ_W_action",
38282
- "usage": "tEFZ_W_usage",
38283
- "identity": "tEFZ_W_identity",
38284
- "role": "tEFZ_W_role",
38285
- "fade": "tEFZ_W_fade",
38286
- "name": "tEFZ_W_name",
38287
- "foldBar": "tEFZ_W_foldBar",
38288
- "meta": "tEFZ_W_meta",
38289
- "avatar": "tEFZ_W_avatar",
38290
- "clamped": "tEFZ_W_clamped",
38291
- "usageHead": "tEFZ_W_usageHead",
38292
- "usagePanel": "tEFZ_W_usagePanel",
38293
- "usageRow": "tEFZ_W_usageRow",
38294
- "reported": "tEFZ_W_reported",
38295
- "card": "tEFZ_W_card",
38296
- "actions": "tEFZ_W_actions",
38297
- "provider": "tEFZ_W_provider",
38298
- "speech": "tEFZ_W_speech",
38299
- "body": "tEFZ_W_body",
38300
- "foldToggle": "tEFZ_W_foldToggle",
38301
- "usageChip": "tEFZ_W_usageChip",
38302
- "interrupted": "tEFZ_W_interrupted"
39265
+ var RoomQuestionView_module_css_default = {
39266
+ "hint": "Ot_rXG_hint",
39267
+ "title": "Ot_rXG_title",
39268
+ "submit": "Ot_rXG_submit",
39269
+ "status": "Ot_rXG_status",
39270
+ "optionDescription": "Ot_rXG_optionDescription",
39271
+ "inlineHead": "Ot_rXG_inlineHead",
39272
+ "question": "Ot_rXG_question",
39273
+ "prompt": "Ot_rXG_prompt",
39274
+ "chip": "Ot_rXG_chip",
39275
+ "optionLabel": "Ot_rXG_optionLabel",
39276
+ "actions": "Ot_rXG_actions",
39277
+ "optionText": "Ot_rXG_optionText",
39278
+ "row": "Ot_rXG_row",
39279
+ "avatar": "Ot_rXG_avatar",
39280
+ "card": "Ot_rXG_card",
39281
+ "other": "Ot_rXG_other",
39282
+ "option": "Ot_rXG_option",
39283
+ "answer": "Ot_rXG_answer",
39284
+ "error": "Ot_rXG_error",
39285
+ "inline": "Ot_rXG_inline",
39286
+ "head": "Ot_rXG_head"
38303
39287
  };
38304
39288
  //#endregion
38305
- //#region src/client/RoomSpeechView.tsx
38306
- /**
38307
- * Member speech node ('room-speech' keyed renderer): a conversation entry —
38308
- * the member's color avatar beside a light card that blocks off one member's
38309
- * turn (several agents take turns in a room, so each turn reads as its own
38310
- * block): a header (name, public role, provider, time), the markdown body —
38311
- * the official MarkdownText, typographically identical to main-agent speech —
38312
- * and a quiet footer row. A
38313
- * body past {@link COLLAPSE_CHARS} may fold to ~10 lines under a bg-base fade
38314
- * with an expand/collapse toggle (the fade expands too). The newest reply to
38315
- * the room starts unfolded — it is what the human is reading — and folds once
38316
- * a newer reply lands; reports to another member and older replies start
38317
- * folded. The human's own expand/collapse wins and is remembered per speech
38318
- * (see {@link foldChoices}). The action row replicates the
38319
- * official MessageIconActions chrome: copy, child-session jump (when the
38320
- * speech carries its handle), honest duration, and a hover-revealed clock.
38321
- * Deliberately absent: branch (forking the room session has undefined
38322
- * roster/blackboard semantics) and TPS/TTFT (a CLI run has no token stream).
38323
- */
39289
+ //#region src/client/RoomQuestionView.tsx
38324
39290
  /**
38325
- * Speeches longer than this start collapsed. Chars, not rendered lines: a
38326
- * stable threshold that needs no layout measurement — roughly ten rendered
38327
- * lines of prose.
38328
- */
38329
- const COLLAPSE_CHARS = 600;
38330
- /** Browser storage key of one room's remembered expand/collapse choices. */
38331
- const FOLD_KEY_PREFIX = "dsh-room:speech-fold:";
38332
- /** Choices kept per room (newest speeches win): bounds the stored map. */
38333
- const FOLD_KEEP = 200;
38334
- /**
38335
- * The human's expand/collapse choices for one room's speeches, by speech seq.
38336
- * A per-viewer convenience in browser storage: unreadable storage (private
38337
- * window, blocked site data) only means the default folding applies.
39291
+ * A member's question card ('room-question' keyed renderer): the questions a
39292
+ * CLI member asked through its bridge's `ask_user_question`, answered by
39293
+ * picking — one option (or several on a multi-pick question) plus an optional
39294
+ * 其他 free-text line — instead of a numbered list in the member's reply that
39295
+ * the human answers by typing. Submitting resolves the member's waiting call;
39296
+ * the card then folds to the given answers. When the call ended unanswered
39297
+ * (a timeout, or a restart took the member's process) the card stays
39298
+ * answerable — the answers then reach the member as a new message (已补答);
39299
+ * only a consent gate (room_help's 允许/不允许) folds to 已过期 for good.
38338
39300
  */
38339
- const foldChoices = {
38340
- read(sessionId) {
38341
- try {
38342
- const raw = globalThis.localStorage?.getItem(FOLD_KEY_PREFIX + sessionId);
38343
- const parsed = raw == null ? void 0 : JSON.parse(raw);
38344
- return typeof parsed === "object" && parsed !== null ? parsed : {};
38345
- } catch {
38346
- return {};
38347
- }
38348
- },
38349
- write(sessionId, seq, expanded) {
38350
- try {
38351
- const choices = {
38352
- ...foldChoices.read(sessionId),
38353
- [String(seq)]: expanded
38354
- };
38355
- const kept = Object.keys(choices).map(Number).sort((a, b) => b - a).slice(0, FOLD_KEEP);
38356
- globalThis.localStorage?.setItem(FOLD_KEY_PREFIX + sessionId, JSON.stringify(Object.fromEntries(kept.map((key) => [key, choices[key]]))));
38357
- } catch {}
38358
- }
38359
- };
38360
- /** Localized Markdown chrome (code-fence copy buttons, footnotes) over the room namespace. */
38361
- function markdownLabels(t) {
38362
- return {
38363
- code: {
38364
- copyLabel: t("action.copy"),
38365
- copiedLabel: t("action.copied")
38366
- },
38367
- footnotes: t("markdown.footnotes")
38368
- };
38369
- }
38370
- /** The member speech row. */
38371
- function RoomSpeechView({ node, sessionId, roomStore, openSession, openDetail, t }) {
39301
+ /** The question card. */
39302
+ function RoomQuestionView({ node, answerQuestion, inline, t }) {
38372
39303
  const data = node.data;
38373
- const [copied, setCopied] = (0, react.useState)(false);
38374
- const [chosen, setChosen] = (0, react.useState)(() => foldChoices.read(sessionId)[String(node.data.seq)]);
38375
- const copyTimer = (0, react.useRef)(null);
38376
- (0, react.useEffect)(() => () => {
38377
- if (copyTimer.current !== null) clearTimeout(copyTimer.current);
38378
- }, []);
38379
- const state = (0, react.useSyncExternalStore)(roomStore.subscribe, () => roomStore.getCached(sessionId));
38380
- const member = state?.members.find((entry) => entry.name === data.member);
38381
- const provider = member === void 0 ? void 0 : member.kind === "main-agent" ? t("member.kind.main") : member.provider;
38382
- const child = data.childSessionId;
38383
- const execution = data.runId === void 0 ? void 0 : state?.executions?.find((entry) => entry.id === data.runId);
38384
- const usage = execution?.usage;
38385
- const tokens = usage === void 0 ? execution?.tokens : usage.inputTokens + (usage.cacheReadTokens ?? 0) + (usage.cacheWriteTokens ?? 0) + usage.outputTokens;
38386
- const newestSpeech = data.seq >= (state?.latestSpeechSeq ?? data.seq);
38387
- const collapsible = data.text.length > COLLAPSE_CHARS;
38388
- const newestReply = data.reportedTo === void 0 && data.seq >= (state?.latestReplySeq ?? data.seq);
38389
- const expanded = chosen ?? newestReply;
38390
- const clamped = collapsible && !expanded;
38391
- const toggle = (next) => {
38392
- setChosen(next);
38393
- foldChoices.write(sessionId, data.seq, next);
39304
+ const [drafts, setDrafts] = (0, react.useState)({});
39305
+ const [busy, setBusy] = (0, react.useState)(false);
39306
+ const [error, setError] = (0, react.useState)(void 0);
39307
+ const pending = data.state === "pending";
39308
+ const lateOpen = data.state === "cancelled" && data.consent !== true;
39309
+ const open = pending || lateOpen;
39310
+ const draftOf = (id) => drafts[id] ?? {
39311
+ selected: [],
39312
+ custom: ""
38394
39313
  };
38395
- const labels = (0, react.useMemo)(() => markdownLabels(t), [t]);
38396
- const copy = () => {
38397
- (0, _deepseek_ai_dsh_client_ui_primitives.writeClipboard)(data.text).then((ok) => {
38398
- if (!ok) return;
38399
- setCopied(true);
38400
- copyTimer.current = setTimeout(() => {
38401
- setCopied(false);
38402
- }, 1e3);
39314
+ const setDraft = (id, next) => {
39315
+ setDrafts((current) => ({
39316
+ ...current,
39317
+ [id]: next
39318
+ }));
39319
+ };
39320
+ const answered = (id) => draftOf(id).selected.length > 0 || draftOf(id).custom.trim() !== "";
39321
+ const complete = data.questions.every((question) => answered(question.id));
39322
+ const pick = (id, label, multi) => {
39323
+ const draft = draftOf(id);
39324
+ const has = draft.selected.includes(label);
39325
+ setDraft(id, {
39326
+ ...draft,
39327
+ selected: multi ? has ? draft.selected.filter((entry) => entry !== label) : [...draft.selected, label] : has ? [] : [label]
38403
39328
  });
38404
39329
  };
38405
- const color = memberColor(data.member);
39330
+ const submit = async () => {
39331
+ if (busy || !complete) return;
39332
+ setBusy(true);
39333
+ try {
39334
+ const answers = data.questions.map((question) => {
39335
+ const draft = draftOf(question.id);
39336
+ const custom = draft.custom.trim();
39337
+ return {
39338
+ id: question.id,
39339
+ selected: draft.selected,
39340
+ ...custom === "" ? {} : { custom }
39341
+ };
39342
+ });
39343
+ setError(await answerQuestion(data.questionId, answers));
39344
+ } finally {
39345
+ setBusy(false);
39346
+ }
39347
+ };
39348
+ /** The folded answer text of one question. */
39349
+ const answerText = (id) => {
39350
+ const answer = data.answers?.find((entry) => entry.id === id);
39351
+ return [...answer?.selected ?? [], ...answer?.custom === void 0 ? [] : [answer.custom]].join(";");
39352
+ };
39353
+ const status = !pending && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
39354
+ className: RoomQuestionView_module_css_default.status,
39355
+ children: t(data.state === "answered" ? data.late === true ? "question.answeredLate" : "question.answered" : lateOpen ? "question.lateOpen" : "question.cancelled")
39356
+ });
39357
+ const body = /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [data.questions.map((question) => {
39358
+ const multi = question.multiSelect === true;
39359
+ const draft = draftOf(question.id);
39360
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("fieldset", {
39361
+ className: RoomQuestionView_module_css_default.question,
39362
+ disabled: !open || busy,
39363
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("legend", {
39364
+ className: RoomQuestionView_module_css_default.prompt,
39365
+ children: [
39366
+ question.header !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
39367
+ className: RoomQuestionView_module_css_default.chip,
39368
+ children: question.header
39369
+ }),
39370
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: question.question }),
39371
+ open && multi && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
39372
+ className: RoomQuestionView_module_css_default.hint,
39373
+ children: t("question.multi")
39374
+ })
39375
+ ]
39376
+ }), open ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(question.options ?? []).map((option) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
39377
+ className: RoomQuestionView_module_css_default.option,
39378
+ "data-picked": draft.selected.includes(option.label),
39379
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
39380
+ type: multi ? "checkbox" : "radio",
39381
+ name: `${data.questionId}-${question.id}`,
39382
+ checked: draft.selected.includes(option.label),
39383
+ onChange: () => {
39384
+ pick(question.id, option.label, multi);
39385
+ },
39386
+ onClick: (event) => {
39387
+ if (!multi && draft.selected.includes(option.label)) {
39388
+ event.preventDefault();
39389
+ pick(question.id, option.label, multi);
39390
+ }
39391
+ }
39392
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
39393
+ className: RoomQuestionView_module_css_default.optionText,
39394
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
39395
+ className: RoomQuestionView_module_css_default.optionLabel,
39396
+ children: option.label
39397
+ }), option.description !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
39398
+ className: RoomQuestionView_module_css_default.optionDescription,
39399
+ children: option.description
39400
+ })]
39401
+ })]
39402
+ }, option.label)), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
39403
+ className: RoomQuestionView_module_css_default.other,
39404
+ value: draft.custom,
39405
+ "aria-label": t("question.other"),
39406
+ placeholder: (question.options ?? []).length > 0 ? `${t("question.other")}:${t("question.otherPlaceholder")}` : t("question.otherPlaceholder"),
39407
+ onChange: (event) => {
39408
+ setDraft(question.id, {
39409
+ ...draft,
39410
+ custom: event.target.value
39411
+ });
39412
+ }
39413
+ })] }) : data.state === "answered" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
39414
+ className: RoomQuestionView_module_css_default.answer,
39415
+ children: t("question.answer", { answer: answerText(question.id) })
39416
+ })]
39417
+ }, question.id);
39418
+ }), open && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39419
+ className: RoomQuestionView_module_css_default.actions,
39420
+ children: [error !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
39421
+ className: RoomQuestionView_module_css_default.error,
39422
+ children: error
39423
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
39424
+ type: "button",
39425
+ className: RoomQuestionView_module_css_default.submit,
39426
+ disabled: !complete || busy,
39427
+ onClick: () => {
39428
+ submit();
39429
+ },
39430
+ children: t("question.submit")
39431
+ })]
39432
+ })] });
39433
+ if (inline !== void 0) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39434
+ className: RoomQuestionView_module_css_default.inline,
39435
+ "data-state": lateOpen ? "late" : data.state,
39436
+ "data-ask-id": data.questionId,
39437
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39438
+ className: RoomQuestionView_module_css_default.inlineHead,
39439
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [pending ? t("question.waiting", { member: data.member }) : t("question.asked"), inline.mid === true ? ` · ${t("question.midRound")}` : ""] }), status]
39440
+ }), body]
39441
+ });
38406
39442
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38407
- className: RoomSpeechView_module_css_default.speech,
38408
- "data-time-hover-root": "",
38409
- "data-actions-reveal": newestSpeech ? "always" : "hover",
38410
- style: { "--member-color": color },
39443
+ className: RoomQuestionView_module_css_default.row,
39444
+ "data-state": lateOpen ? "late" : data.state,
39445
+ "data-ask-id": data.questionId,
39446
+ style: { "--member-color": memberColor(data.member) },
38411
39447
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38412
- className: RoomSpeechView_module_css_default.avatar,
39448
+ className: RoomQuestionView_module_css_default.avatar,
38413
39449
  "aria-hidden": true,
38414
39450
  children: data.member.slice(0, 1).toUpperCase()
38415
39451
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38416
- className: RoomSpeechView_module_css_default.stack,
39452
+ className: RoomQuestionView_module_css_default.card,
38417
39453
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38418
- className: RoomSpeechView_module_css_default.card,
38419
- children: [
38420
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38421
- className: RoomSpeechView_module_css_default.identity,
38422
- children: [
38423
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38424
- className: RoomSpeechView_module_css_default.name,
38425
- children: data.member
38426
- }),
38427
- member?.role !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38428
- className: RoomSpeechView_module_css_default.role,
38429
- children: member.role
38430
- }),
38431
- provider !== void 0 && provider !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38432
- className: RoomSpeechView_module_css_default.provider,
38433
- children: provider
38434
- }),
38435
- data.interrupted !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38436
- className: RoomSpeechView_module_css_default.interrupted,
38437
- children: t(data.interrupted === "cancelled" ? "speech.stopped" : "speech.failed")
38438
- })
38439
- ]
38440
- }),
38441
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38442
- className: clamped ? `${RoomSpeechView_module_css_default.body} ${RoomSpeechView_module_css_default.clamped}` : RoomSpeechView_module_css_default.body,
38443
- children: [
38444
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.MarkdownText, {
38445
- text: data.text,
38446
- labels
38447
- }),
38448
- clamped && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
38449
- className: RoomSpeechView_module_css_default.fade,
38450
- "aria-hidden": true,
38451
- onClick: () => {
38452
- toggle(true);
38453
- }
38454
- }),
38455
- collapsible && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
38456
- className: RoomSpeechView_module_css_default.foldBar,
38457
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
38458
- label: expanded ? t("speech.collapse") : t("speech.expand"),
38459
- side: "bottom",
38460
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
38461
- type: "button",
38462
- className: RoomSpeechView_module_css_default.foldToggle,
38463
- "aria-label": expanded ? t("speech.collapse") : t("speech.expand"),
38464
- "aria-expanded": expanded,
38465
- onClick: () => {
38466
- toggle(!expanded);
38467
- },
38468
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconChevronDownOutlineMedium, {})
38469
- })
38470
- })
38471
- })
38472
- ]
38473
- }),
38474
- data.reportedTo !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38475
- className: RoomSpeechView_module_css_default.reported,
38476
- children: t("speech.reportedTo", { member: data.reportedTo })
38477
- })
38478
- ]
38479
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38480
- className: RoomSpeechView_module_css_default.actions,
38481
- children: [
38482
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
38483
- label: copied ? t("action.copied") : t("action.copy"),
38484
- side: "bottom",
38485
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
38486
- type: "button",
38487
- className: RoomSpeechView_module_css_default.action,
38488
- "aria-label": copied ? t("action.copied") : t("action.copy"),
38489
- onClick: copy,
38490
- children: copied ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconCheckOutlineMedium, {}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconCopyOutlineMedium, {})
38491
- })
38492
- }),
38493
- child !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
38494
- label: t("speech.jump"),
38495
- side: "bottom",
38496
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
38497
- type: "button",
38498
- className: RoomSpeechView_module_css_default.action,
38499
- "aria-label": t("speech.jump"),
38500
- onClick: () => {
38501
- openSession(child);
38502
- },
38503
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconLinkOutlineMedium, {})
38504
- })
38505
- }),
38506
- child !== void 0 && data.messageId !== void 0 && openDetail !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
38507
- label: t("speech.detail"),
38508
- side: "bottom",
38509
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
38510
- type: "button",
38511
- className: RoomSpeechView_module_css_default.action,
38512
- "aria-label": t("speech.detail"),
38513
- onClick: () => {
38514
- openDetail(child, data.messageId);
38515
- },
38516
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconRequestDetailOutline16, {})
38517
- })
38518
- }),
38519
- tokens !== void 0 && tokens > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(UsageChip, {
38520
- tokens,
38521
- execution,
38522
- provider: member?.kind === "cli" ? member.provider : void 0,
38523
- durationMs: data.durationMs,
38524
- t
38525
- }) : data.durationMs !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38526
- className: RoomSpeechView_module_css_default.meta,
38527
- children: formatDurationMs(data.durationMs)
38528
- }),
38529
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38530
- className: RoomSpeechView_module_css_default.meta,
38531
- children: formatClock(data.time)
38532
- })
38533
- ]
38534
- })]
38535
- })]
38536
- });
38537
- }
38538
- /**
38539
- * 用量 with its breakdown on hover or focus — the host's turn usage panel:
38540
- * total, provider / model, cache hit, the disjoint input buckets, output, and
38541
- * this round's run time. Rows the harness did not report are left out.
38542
- */
38543
- function UsageChip({ tokens, execution, provider, durationMs, t }) {
38544
- const [open, setOpen] = (0, react.useState)(false);
38545
- const usage = execution?.usage;
38546
- const billed = usage === void 0 ? 0 : usage.inputTokens + (usage.cacheReadTokens ?? 0) + (usage.cacheWriteTokens ?? 0);
38547
- const exact = (n) => n.toLocaleString("en-US");
38548
- const route = [provider, execution?.model].filter(Boolean).join("/");
38549
- const rows = [
38550
- ...route === "" ? [] : [[t("usage.route"), route]],
38551
- ...usage !== void 0 && billed > 0 ? [[t("usage.cacheHit"), `${Math.round((usage.cacheReadTokens ?? 0) / billed * 1e3) / 10}%`]] : [],
38552
- ...usage === void 0 ? [] : [
38553
- [t("usage.uncached"), `${exact(usage.inputTokens)} tok`],
38554
- ...usage.cacheReadTokens === void 0 ? [] : [[t("usage.cacheRead"), `${exact(usage.cacheReadTokens)} tok`]],
38555
- ...usage.cacheWriteTokens === void 0 ? [] : [[t("usage.cacheWrite"), `${exact(usage.cacheWriteTokens)} tok`]],
38556
- [t("usage.output"), `${exact(usage.outputTokens)} tok`]
38557
- ],
38558
- ...durationMs === void 0 ? [] : [[t("usage.duration"), formatDurationMs(durationMs)]]
38559
- ];
38560
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
38561
- className: RoomSpeechView_module_css_default.usage,
38562
- onMouseEnter: () => {
38563
- setOpen(true);
38564
- },
38565
- onMouseLeave: () => {
38566
- setOpen(false);
38567
- },
38568
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
38569
- type: "button",
38570
- className: RoomSpeechView_module_css_default.usageChip,
38571
- "aria-expanded": open,
38572
- onFocus: () => {
38573
- setOpen(true);
38574
- },
38575
- onBlur: () => {
38576
- setOpen(false);
38577
- },
38578
- children: t("speech.usage", { tokens: formatTokens$1(tokens) })
38579
- }), open && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
38580
- className: RoomSpeechView_module_css_default.usagePanel,
38581
- role: "tooltip",
38582
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
38583
- className: RoomSpeechView_module_css_default.usageHead,
38584
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("usage.title") }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [exact(tokens), " tok"] })]
38585
- }), rows.map(([label, value]) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
38586
- className: RoomSpeechView_module_css_default.usageRow,
38587
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: label }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: value })]
38588
- }, label))]
38589
- })]
38590
- });
38591
- }
38592
- //#endregion
38593
- //#region \0dsh-css:src/client/RoomRunView.module.css.mjs
38594
- const css$5 = "._7amxlW_run{height:24px;color:var(--dsw-alias-label-secondary,#5a5a5ae6);cursor:pointer;border-radius:6px;align-items:center;gap:8px;padding:0 4px;font-size:13px;line-height:18px;display:flex;position:relative;overflow:hidden}._7amxlW_run:hover{background:var(--dsw-alias-interactive-bg-hover,#7f7f7f24)}._7amxlW_leading{flex:none}._7amxlW_title{white-space:nowrap}._7amxlW_run[data-state=failed] ._7amxlW_title{color:var(--dsw-alias-text-error,#d9363e)}._7amxlW_elapsed{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);flex:1;overflow:hidden}._7amxlW_reason{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-text-error,#d9363e);flex:2;overflow:hidden}._7amxlW_stop{width:20px;height:20px;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);cursor:pointer;background:0 0;border:none;border-radius:20px;justify-content:center;align-items:center;padding:2px;display:inline-flex}._7amxlW_stop:hover{background:var(--dsw-alias-interactive-bg-hover,#7f7f7f24);color:var(--dsw-alias-label-secondary,#5a5a5ae6)}._7amxlW_run[data-state=running]:after{content:\"\";background:linear-gradient(90deg, transparent, var(--dsw-alias-bg-layer-1,#fff9) 50%, transparent);opacity:.6;pointer-events:none;width:300px;animation:2.6s ease-out infinite _7amxlW_dsh-room-run-sweep;position:absolute;top:0;bottom:0;left:0}@keyframes _7amxlW_dsh-room-run-sweep{0%{left:-300px}90%,to{left:100%}}@media (prefers-reduced-motion:reduce){._7amxlW_run[data-state=running]:after{content:none;animation:none}}._7amxlW_run:focus:not(:focus-visible),._7amxlW_stop:focus:not(:focus-visible){outline:none}._7amxlW_liveCard{padding-bottom:8px}._7amxlW_liveCard>._7amxlW_run{margin:-2px -4px 2px}";
38595
- const tagId$5 = "@khorsheed/dsh-room/RoomRunView.module.css";
38596
- if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$5) + "]") === null) {
38597
- const tag = document.createElement("style");
38598
- tag.dataset.plugin = "@khorsheed/dsh-room";
38599
- tag.dataset.pluginCss = tagId$5;
38600
- tag.textContent = css$5;
38601
- document.head.appendChild(tag);
38602
- }
38603
- var RoomRunView_module_css_default = {
38604
- "elapsed": "_7amxlW_elapsed",
38605
- "dsh-room-run-sweep": "_7amxlW_dsh-room-run-sweep",
38606
- "reason": "_7amxlW_reason",
38607
- "liveCard": "_7amxlW_liveCard",
38608
- "title": "_7amxlW_title",
38609
- "leading": "_7amxlW_leading",
38610
- "run": "_7amxlW_run",
38611
- "stop": "_7amxlW_stop"
38612
- };
38613
- //#endregion
38614
- //#region src/client/RoomRunView.tsx
38615
- /**
38616
- * Member run node ('room-run' keyed renderer): a ToolRow-isomorphic 24px
38617
- * line — StateDot +「ada 正在工作… · 12s」+ the running sweep (with a
38618
- * prefers-reduced-motion fallback). The WHOLE row jumps into the member's
38619
- * child session (looked up from the room store's roster — run events carry
38620
- * no handle), and a trailing stop button cancels through the Remote. A
38621
- * failed run stays as a dim error row with the journaled reason (truncated,
38622
- * the full text on hover); done/cancelled are hidden by the Definition and
38623
- * never reach here. A RUNNING member's row takes the speech card's shape —
38624
- * avatar and light card, the row as the card's header, the live output
38625
- * below — so the reply card that replaces it lands in the same place.
38626
- */
38627
- /** The member run row. */
38628
- function RoomRunView({ node, sessionId, roomStore, openSession, cancelMember, renderMemberOutput, t }) {
38629
- const state = (0, react.useSyncExternalStore)(roomStore.subscribe, () => roomStore.getCached(sessionId));
38630
- const recovered = state?.runs.find((run) => run.member === node.data.member && run.startedAt === node.data.startedAt);
38631
- const data = node.data.state === "running" && recovered !== void 0 ? {
38632
- ...node.data,
38633
- ...recovered
38634
- } : node.data;
38635
- const [now, setNow] = (0, react.useState)(() => Date.now());
38636
- (0, react.useEffect)(() => {
38637
- if (data.state !== "running") return void 0;
38638
- const timer = setInterval(() => {
38639
- setNow(Date.now());
38640
- }, 1e3);
38641
- return () => {
38642
- clearInterval(timer);
38643
- };
38644
- }, [data.state]);
38645
- const childSessionId = state?.members.find((entry) => entry.name === data.member)?.childSessionId;
38646
- if (data.state === "done" || data.state === "cancelled") return null;
38647
- const failed = data.state === "failed";
38648
- const elapsed = failed ? data.elapsedMs : Math.max(0, now - data.startedAt);
38649
- const jump = () => {
38650
- if (childSessionId !== void 0) openSession(childSessionId);
38651
- };
38652
- const onKeyDown = (event) => {
38653
- if (event.key === "Enter" || event.key === " ") {
38654
- event.preventDefault();
38655
- jump();
38656
- }
38657
- };
38658
- const row = /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38659
- className: RoomRunView_module_css_default.run,
38660
- "data-state": failed ? "failed" : "running",
38661
- role: "button",
38662
- tabIndex: 0,
38663
- onClick: jump,
38664
- onKeyDown,
38665
- children: [
38666
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.StateDot, { state: failed ? "error" : "ongoing" }),
38667
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38668
- className: RoomRunView_module_css_default.title,
38669
- children: failed ? t("run.failed", { member: data.member }) : t("run.working", { member: data.member })
38670
- }),
38671
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
38672
- className: RoomRunView_module_css_default.elapsed,
38673
- "aria-hidden": true,
38674
- children: ["· ", elapsed === void 0 ? t("run.durationUnknown") : formatDurationMs(elapsed)]
38675
- }),
38676
- failed && data.error !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38677
- className: RoomRunView_module_css_default.reason,
38678
- title: data.error,
38679
- children: data.error
38680
- }),
38681
- !failed && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
38682
- label: t("run.stop"),
38683
- side: "bottom",
38684
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
38685
- type: "button",
38686
- className: RoomRunView_module_css_default.stop,
38687
- "aria-label": t("run.stop"),
38688
- onClick: (event) => {
38689
- event.stopPropagation();
38690
- cancelMember(data.member);
38691
- },
38692
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconStopFillMedium, {})
38693
- })
38694
- })
38695
- ]
38696
- });
38697
- if (failed) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { children: row });
38698
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38699
- className: RoomSpeechView_module_css_default.speech,
38700
- style: { "--member-color": memberColor(data.member) },
38701
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38702
- className: RoomSpeechView_module_css_default.avatar,
38703
- "aria-hidden": true,
38704
- children: data.member.slice(0, 1).toUpperCase()
38705
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38706
- className: `${RoomSpeechView_module_css_default.card} ${RoomRunView_module_css_default.liveCard}`,
38707
- children: [row, childSessionId !== void 0 && renderMemberOutput?.(childSessionId, data.startedAt)]
39454
+ className: RoomQuestionView_module_css_default.head,
39455
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
39456
+ className: RoomQuestionView_module_css_default.title,
39457
+ children: t("question.title", { member: data.member })
39458
+ }), status]
39459
+ }), body]
38708
39460
  })]
38709
39461
  });
38710
39462
  }
38711
39463
  //#endregion
38712
- //#region \0dsh-css:src/client/RoomEventView.module.css.mjs
38713
- const css$4 = ".MkUhUa_row{white-space:nowrap;text-overflow:ellipsis;height:24px;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);align-items:center;padding:0 4px;font-size:13px;line-height:18px;display:flex;overflow:hidden}";
38714
- const tagId$4 = "@khorsheed/dsh-room/RoomEventView.module.css";
38715
- if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$4) + "]") === null) {
38716
- const tag = document.createElement("style");
38717
- tag.dataset.plugin = "@khorsheed/dsh-room";
38718
- tag.dataset.pluginCss = tagId$4;
38719
- tag.textContent = css$4;
38720
- document.head.appendChild(tag);
38721
- }
38722
- var RoomEventView_module_css_default = { "row": "MkUhUa_row" };
38723
- //#endregion
38724
- //#region src/client/RoomEventView.tsx
38725
- /** The boundary dim line. */
38726
- function RoomEventView({ node, t }) {
38727
- const data = node.data;
38728
- let text;
38729
- switch (data.sub) {
38730
- case "member-added":
38731
- text = t("event.joined", {
38732
- member: data.member ?? "",
38733
- provider: data.provider ?? ""
38734
- }) + (data.invitedBy === "agent" ? t("event.joinedByAgent") : "");
38735
- break;
38736
- case "member-removed": text = t("event.left", { member: data.member ?? "" });
38737
- }
38738
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
38739
- className: RoomEventView_module_css_default.row,
38740
- children: text
38741
- });
38742
- }
38743
- //#endregion
38744
- //#region ../../node_modules/.pnpm/@deepseek-ai+dsh-session@0.2.1-rc.1_@deepseek-ai+cordis@4.0.4_@deepseek-ai+dsh-scope@0._53fab4e766dbd120da89b13a533f63c3/node_modules/@deepseek-ai/dsh-session/lib/types/surface.js
39464
+ //#region ../../node_modules/.pnpm/@deepseek-ai+dsh-session@0.2.1-rc.3_@deepseek-ai+cordis@4.0.4_@deepseek-ai+dsh-scope@0._a4f9aa29af8d436e2dcb9e4e85687430/node_modules/@deepseek-ai/dsh-session/lib/types/surface.js
38745
39465
  /** Runtime counterpart of the message-producing event union. */
38746
39466
  const SURFACE_EVENT_TYPES = /* @__PURE__ */ new Set([
38747
39467
  "system/message",
@@ -38775,6 +39495,26 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
38775
39495
  }
38776
39496
  //#endregion
38777
39497
  //#region src/client/nodes.ts
39498
+ /**
39499
+ * The card data of a question from the room's ask log, for the inline
39500
+ * renderings (a round's live card and its reply).
39501
+ * @param ask - the logged question.
39502
+ * @returns the card data.
39503
+ */
39504
+ function askCardData(ask) {
39505
+ return {
39506
+ seq: 0,
39507
+ time: ask.time,
39508
+ questionId: ask.id,
39509
+ member: ask.member,
39510
+ questions: ask.questions,
39511
+ state: ask.state,
39512
+ ...ask.answers === void 0 ? {} : { answers: ask.answers },
39513
+ ...ask.consent === true ? { consent: true } : {},
39514
+ ...ask.late === true ? { late: true } : {},
39515
+ ...ask.runId === void 0 ? {} : { runId: ask.runId }
39516
+ };
39517
+ }
38778
39518
  /** The shared final-node materialization (single shape across the three kinds). */
38779
39519
  function viewNode(context, kind, visibility = "visible") {
38780
39520
  if (context.state === void 0) return null;
@@ -38808,6 +39548,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
38808
39548
  time: event.time,
38809
39549
  member: event.data.member,
38810
39550
  text: event.data.text,
39551
+ ...event.data.asks === void 0 ? {} : { asks: event.data.asks },
38811
39552
  ...event.data.interrupted === void 0 ? {} : { interrupted: event.data.interrupted },
38812
39553
  ...event.data.reportedTo === void 0 ? {} : { reportedTo: event.data.reportedTo },
38813
39554
  ...event.data.childSessionId === void 0 ? {} : { childSessionId: event.data.childSessionId },
@@ -38822,7 +39563,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
38822
39563
  /**
38823
39564
  * The member-run Definition: one Context per run (matched on
38824
39565
  * member+startedAt), started by the running edge and updated by its terminal
38825
- * edge. A running run renders the live row; a failed run stays as a dim
39566
+ * edge. A `room/run-moved` edge re-anchors a running card (its seq, which the
39567
+ * view orders by) below a reply or human message that landed after it. A running run renders the live row; a failed run stays as a dim
38826
39568
  * error row; done/cancelled hide the row IN PLACE — the assembler's live
38827
39569
  * incremental flush forbids withdrawing a materialized node with null (the
38828
39570
  * withdrawal contract is the same key with `visibility: 'hidden'`; a null
@@ -38835,6 +39577,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
38835
39577
  match: (event) => event.type === "room/run-state" ? {
38836
39578
  id: `${event.data.member}:${event.data.startedAt}`,
38837
39579
  role: event.data.state === "running" ? "start" : "update"
39580
+ } : event.type === "room/run-moved" ? {
39581
+ id: `${event.data.member}:${event.data.startedAt}`,
39582
+ role: "update"
38838
39583
  } : null,
38839
39584
  start: (_context, match) => {
38840
39585
  const event = match.event;
@@ -38849,6 +39594,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
38849
39594
  },
38850
39595
  update: (context, match) => {
38851
39596
  const event = match.event;
39597
+ if (event.type === "room/run-moved") return context.state.state === "running" ? {
39598
+ ...context.state,
39599
+ seq: event.seq
39600
+ } : context.state;
38852
39601
  if (event.type !== "room/run-state") return context.state;
38853
39602
  const { error: _error, elapsedMs: _elapsed, ...previous } = context.state;
38854
39603
  return {
@@ -38997,7 +39746,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
38997
39746
  questionId: event.data.id,
38998
39747
  member: event.data.member,
38999
39748
  questions: event.data.questions,
39000
- state: "pending"
39749
+ state: "pending",
39750
+ ...event.data.consent === true ? { consent: true } : {},
39751
+ ...event.data.runId === void 0 ? {} : { runId: event.data.runId }
39001
39752
  };
39002
39753
  },
39003
39754
  update: (context, match) => {
@@ -39006,10 +39757,11 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
39006
39757
  return {
39007
39758
  ...context.state,
39008
39759
  state: event.data.outcome,
39009
- ...event.data.answers === void 0 ? {} : { answers: event.data.answers }
39760
+ ...event.data.answers === void 0 ? {} : { answers: event.data.answers },
39761
+ ...event.data.late === true ? { late: true } : {}
39010
39762
  };
39011
39763
  },
39012
- buildViewNode: (context) => viewNode(context, "room-question")
39764
+ buildViewNode: (context) => viewNode(context, "room-question", context.state?.runId === void 0 ? "visible" : "hidden")
39013
39765
  };
39014
39766
  /**
39015
39767
  * The relay Definition: one Context per relay (matched on the relay id),
@@ -39182,66 +39934,616 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
39182
39934
  text: text("text")
39183
39935
  };
39184
39936
  }
39185
- /**
39186
- * A help request in the helper's session: the `user/message` the room queued
39187
- * there (its `room-help` source) renders as a card naming the asking room
39188
- * instead of a plain injected-context row.
39189
- */
39190
- const roomHelpRequestDefinition = {
39191
- kind: "room-help-request",
39192
- target: "chat",
39193
- match: (event) => {
39194
- if (event.type !== "user/message" || !isAppendSurfaceEvent(event) || helpSourceOf(event.data.source) === void 0) return null;
39195
- return {
39196
- id: String(event.seq),
39197
- role: "start"
39198
- };
39199
- },
39200
- start: (_context, match) => {
39201
- const event = match.event;
39202
- const source = event.type === "user/message" ? helpSourceOf(event.data.source) : void 0;
39203
- if (source === void 0) throw new Error("room-help-request start requires a room-help message");
39204
- return {
39205
- seq: event.seq,
39206
- time: event.time,
39207
- ...source
39208
- };
39209
- },
39210
- update: (context) => context.state,
39211
- buildViewNode: (context) => viewNode(context, "room-help-request")
39212
- };
39213
- /**
39214
- * Another room asked this room for help (`room/help-in`): the same request
39215
- * card, naming the member it went to (and that it waits while this room is
39216
- * paused), with a jump back to the asking room.
39217
- */
39218
- const roomHelpInDefinition = {
39219
- kind: "room-help-in",
39220
- target: "chat",
39221
- match: (event) => event.type === "room/help-in" ? {
39222
- id: String(event.seq),
39223
- role: "start"
39224
- } : null,
39225
- start: (_context, match) => {
39226
- const event = match.event;
39227
- if (event.type !== "room/help-in") throw new Error("room-help-in start requires a room/help-in event");
39228
- const data = event.data;
39229
- return {
39230
- seq: event.seq,
39231
- time: event.time,
39232
- help: data.id,
39233
- room: data.room,
39234
- roomTitle: data.roomTitle,
39235
- from: data.from,
39236
- op: data.op,
39237
- text: data.text,
39238
- member: data.member,
39239
- ...data.held === true ? { held: true } : {}
39240
- };
39241
- },
39242
- update: (context) => context.state,
39243
- buildViewNode: (context) => viewNode(context, "room-help-request")
39244
- };
39937
+ /**
39938
+ * A help request in the helper's session: the `user/message` the room queued
39939
+ * there (its `room-help` source) renders as a card naming the asking room
39940
+ * instead of a plain injected-context row.
39941
+ */
39942
+ const roomHelpRequestDefinition = {
39943
+ kind: "room-help-request",
39944
+ target: "chat",
39945
+ match: (event) => {
39946
+ if (event.type !== "user/message" || !isAppendSurfaceEvent(event) || helpSourceOf(event.data.source) === void 0) return null;
39947
+ return {
39948
+ id: String(event.seq),
39949
+ role: "start"
39950
+ };
39951
+ },
39952
+ start: (_context, match) => {
39953
+ const event = match.event;
39954
+ const source = event.type === "user/message" ? helpSourceOf(event.data.source) : void 0;
39955
+ if (source === void 0) throw new Error("room-help-request start requires a room-help message");
39956
+ return {
39957
+ seq: event.seq,
39958
+ time: event.time,
39959
+ ...source
39960
+ };
39961
+ },
39962
+ update: (context) => context.state,
39963
+ buildViewNode: (context) => viewNode(context, "room-help-request")
39964
+ };
39965
+ /**
39966
+ * Another room asked this room for help (`room/help-in`): the same request
39967
+ * card, naming the member it went to (and that it waits while this room is
39968
+ * paused), with a jump back to the asking room.
39969
+ */
39970
+ const roomHelpInDefinition = {
39971
+ kind: "room-help-in",
39972
+ target: "chat",
39973
+ match: (event) => event.type === "room/help-in" ? {
39974
+ id: String(event.seq),
39975
+ role: "start"
39976
+ } : null,
39977
+ start: (_context, match) => {
39978
+ const event = match.event;
39979
+ if (event.type !== "room/help-in") throw new Error("room-help-in start requires a room/help-in event");
39980
+ const data = event.data;
39981
+ return {
39982
+ seq: event.seq,
39983
+ time: event.time,
39984
+ help: data.id,
39985
+ room: data.room,
39986
+ roomTitle: data.roomTitle,
39987
+ from: data.from,
39988
+ op: data.op,
39989
+ text: data.text,
39990
+ member: data.member,
39991
+ ...data.held === true ? { held: true } : {}
39992
+ };
39993
+ },
39994
+ update: (context) => context.state,
39995
+ buildViewNode: (context) => viewNode(context, "room-help-request")
39996
+ };
39997
+ //#endregion
39998
+ //#region \0dsh-css:src/client/RoomSpeechView.module.css.mjs
39999
+ const css$5 = ".tEFZ_W_speech{grid-template-columns:28px minmax(0,1fr);gap:10px;margin:8px 0 16px;display:grid}.tEFZ_W_avatar{background:color-mix(in srgb, var(--member-color,var(--dsw-alias-label-tertiary,#7f8287)) 85%, black);color:#fff;user-select:none;border-radius:50%;place-items:center;width:28px;height:28px;margin-top:2px;font-size:12px;font-weight:600;display:grid}.tEFZ_W_card{border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#00000014);background:var(--dsw-alias-bg-layer-1,#fff);border-radius:12px;flex-direction:column;gap:2px;min-width:0;padding:8px 12px;display:flex}.tEFZ_W_identity{flex-wrap:wrap;align-items:baseline;gap:2px 8px;display:flex}.tEFZ_W_name{color:var(--dsw-alias-label-primary,#1f2329);font-size:13px;font-weight:600}.tEFZ_W_role{background:var(--dsw-alias-bg-layer-2,#0000000d);color:var(--dsw-alias-label-secondary,#5a5a5ae6);border-radius:5px;padding:0 6px;font-size:11px;line-height:18px}.tEFZ_W_provider{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);font-size:12px;line-height:18px}.tEFZ_W_interrupted{color:var(--dsw-alias-text-error,#d9363e);font-size:12px}.tEFZ_W_body{color:var(--dsw-alias-label-primary,#1f2329);font-size:14px;line-height:24px}.tEFZ_W_clamped{max-height:240px;position:relative;overflow:hidden}.tEFZ_W_fade{cursor:pointer;background:linear-gradient(180deg, color-mix(in srgb, var(--dsw-alias-bg-layer-1,#fff) 0%, transparent), var(--dsw-alias-bg-layer-1,#fff));height:48px;position:absolute;bottom:0;left:0;right:0}.tEFZ_W_foldBar{justify-content:flex-end;margin:2px -4px 0 0;display:flex}.tEFZ_W_clamped .tEFZ_W_foldBar{margin:0;position:absolute;bottom:4px;right:4px}.tEFZ_W_foldToggle{background:var(--dsw-alias-bg-base,#fff);width:30px;height:20px;color:var(--dsw-alias-label-secondary,var(--dsw-alias-label-primary));box-shadow:0 0 0 .5px color-mix(in srgb, var(--dsw-alias-label-primary,#000) 8%, transparent);cursor:pointer;border:none;border-radius:10px;justify-content:center;align-items:center;padding:0;transition:background-color .12s,color .12s;display:inline-flex}.tEFZ_W_foldToggle svg{transition:transform .16s}.tEFZ_W_foldToggle[aria-expanded=true] svg{transform:rotate(180deg)}.tEFZ_W_foldToggle:hover{background:color-mix(in srgb, var(--dsw-alias-bg-base,#fff) 82%, var(--dsw-alias-label-primary,#000));color:var(--dsw-alias-label-primary,var(--dsw-alias-label-secondary))}.tEFZ_W_foldToggle:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4176e6);outline-offset:2px}.tEFZ_W_actions{align-items:center;gap:8px;height:28px;margin-top:6px;transition:opacity .12s;display:flex}.tEFZ_W_stack{flex-direction:column;min-width:0;display:flex}.tEFZ_W_speech[data-actions-reveal=hover] .tEFZ_W_actions{opacity:0}.tEFZ_W_speech[data-actions-reveal=hover]:hover .tEFZ_W_actions,.tEFZ_W_speech[data-actions-reveal=hover]:focus-within .tEFZ_W_actions{opacity:1}@media (hover:none){.tEFZ_W_speech[data-actions-reveal=hover] .tEFZ_W_actions{opacity:1}}.tEFZ_W_usage{display:inline-flex;position:relative}.tEFZ_W_usageChip{height:24px;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);white-space:nowrap;cursor:default;background:0 0;border:none;border-radius:6px;padding:0 6px;font-size:12px;line-height:24px}.tEFZ_W_usageChip:hover,.tEFZ_W_usageChip[aria-expanded=true]{background:var(--dsw-alias-interactive-bg-hover,#7f7f7f24);color:var(--dsw-alias-label-secondary,#5a5a5ae6)}.tEFZ_W_usagePanel{z-index:10;border:1px solid var(--dsw-alias-border-l2-darkmode-thin,var(--dsw-alias-border-l2,#0000001a));background:var(--dsw-specific-menu,var(--dsw-alias-bg-layer-2,var(--dsw-alias-bg-layer-1,#fff)));min-width:260px;backdrop-filter:var(--dsw-menu-backdrop-filter,blur(20px));box-shadow:var(--dsw-elevation-prominent,0 12px 32px #0000001f);font-variant-numeric:tabular-nums;border-radius:12px;flex-direction:column;gap:2px;padding:10px 14px;font-size:12px;line-height:22px;display:flex;position:absolute;bottom:calc(100% + 6px);left:0}.tEFZ_W_usageHead,.tEFZ_W_usageRow{white-space:nowrap;justify-content:space-between;gap:24px;display:flex}.tEFZ_W_usageHead{border-bottom:1px solid var(--dsw-alias-border-l2,#7f7f7f33);color:var(--dsw-alias-label-primary,#1f2329);margin-bottom:4px;padding-bottom:6px;font-weight:600}.tEFZ_W_usageRow>:first-child{color:var(--dsw-alias-label-tertiary,#7f7f7fcc)}.tEFZ_W_usageRow>:last-child{color:var(--dsw-alias-label-secondary,#5a5a5ae6)}.tEFZ_W_action{width:28px;height:28px;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);cursor:pointer;background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;padding:6px;display:inline-flex}.tEFZ_W_action:hover{background:var(--dsw-alias-interactive-bg-hover,#7f7f7f24);color:var(--dsw-alias-label-secondary,#5a5a5ae6)}.tEFZ_W_meta,.tEFZ_W_reported{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);white-space:nowrap;font-size:12px;line-height:24px}.tEFZ_W_reported{color:var(--dsw-alias-state-success,#1f9a55)}.tEFZ_W_action:focus:not(:focus-visible),.tEFZ_W_foldToggle:focus:not(:focus-visible){outline:none}";
40000
+ const tagId$5 = "@khorsheed/dsh-room/RoomSpeechView.module.css";
40001
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$5) + "]") === null) {
40002
+ const tag = document.createElement("style");
40003
+ tag.dataset.plugin = "@khorsheed/dsh-room";
40004
+ tag.dataset.pluginCss = tagId$5;
40005
+ tag.textContent = css$5;
40006
+ document.head.appendChild(tag);
40007
+ }
40008
+ var RoomSpeechView_module_css_default = {
40009
+ "usage": "tEFZ_W_usage",
40010
+ "usageChip": "tEFZ_W_usageChip",
40011
+ "interrupted": "tEFZ_W_interrupted",
40012
+ "clamped": "tEFZ_W_clamped",
40013
+ "stack": "tEFZ_W_stack",
40014
+ "fade": "tEFZ_W_fade",
40015
+ "usageHead": "tEFZ_W_usageHead",
40016
+ "usageRow": "tEFZ_W_usageRow",
40017
+ "meta": "tEFZ_W_meta",
40018
+ "foldBar": "tEFZ_W_foldBar",
40019
+ "action": "tEFZ_W_action",
40020
+ "avatar": "tEFZ_W_avatar",
40021
+ "reported": "tEFZ_W_reported",
40022
+ "name": "tEFZ_W_name",
40023
+ "identity": "tEFZ_W_identity",
40024
+ "card": "tEFZ_W_card",
40025
+ "speech": "tEFZ_W_speech",
40026
+ "body": "tEFZ_W_body",
40027
+ "role": "tEFZ_W_role",
40028
+ "provider": "tEFZ_W_provider",
40029
+ "actions": "tEFZ_W_actions",
40030
+ "usagePanel": "tEFZ_W_usagePanel",
40031
+ "foldToggle": "tEFZ_W_foldToggle"
40032
+ };
40033
+ //#endregion
40034
+ //#region src/client/RoomSpeechView.tsx
40035
+ /**
40036
+ * Member speech node ('room-speech' keyed renderer): a conversation entry —
40037
+ * the member's color avatar beside a light card that blocks off one member's
40038
+ * turn (several agents take turns in a room, so each turn reads as its own
40039
+ * block): a header (name, public role, provider, time), the markdown body —
40040
+ * the official MarkdownText, typographically identical to main-agent speech —
40041
+ * and a quiet footer row. A
40042
+ * body past {@link COLLAPSE_CHARS} may fold to ~10 lines under a bg-base fade
40043
+ * with an expand/collapse toggle (the fade expands too). The newest reply to
40044
+ * the room starts unfolded — it is what the human is reading — and folds once
40045
+ * a newer reply lands; reports to another member and older replies start
40046
+ * folded. The human's own expand/collapse wins and is remembered per speech
40047
+ * (see {@link foldChoices}). The action row replicates the
40048
+ * official MessageIconActions chrome: copy, child-session jump (when the
40049
+ * speech carries its handle), honest duration, and a hover-revealed clock.
40050
+ * Deliberately absent: branch (forking the room session has undefined
40051
+ * roster/blackboard semantics) and TPS/TTFT (a CLI run has no token stream).
40052
+ */
40053
+ /**
40054
+ * Speeches longer than this start collapsed. Chars, not rendered lines: a
40055
+ * stable threshold that needs no layout measurement — roughly ten rendered
40056
+ * lines of prose.
40057
+ */
40058
+ const COLLAPSE_CHARS = 600;
40059
+ /** Browser storage key of one room's remembered expand/collapse choices. */
40060
+ const FOLD_KEY_PREFIX = "dsh-room:speech-fold:";
40061
+ /** Choices kept per room (newest speeches win): bounds the stored map. */
40062
+ const FOLD_KEEP = 200;
40063
+ /**
40064
+ * The human's expand/collapse choices for one room's speeches, by speech seq.
40065
+ * A per-viewer convenience in browser storage: unreadable storage (private
40066
+ * window, blocked site data) only means the default folding applies.
40067
+ */
40068
+ const foldChoices = {
40069
+ read(sessionId) {
40070
+ try {
40071
+ const raw = globalThis.localStorage?.getItem(FOLD_KEY_PREFIX + sessionId);
40072
+ const parsed = raw == null ? void 0 : JSON.parse(raw);
40073
+ return typeof parsed === "object" && parsed !== null ? parsed : {};
40074
+ } catch {
40075
+ return {};
40076
+ }
40077
+ },
40078
+ write(sessionId, seq, expanded) {
40079
+ try {
40080
+ const choices = {
40081
+ ...foldChoices.read(sessionId),
40082
+ [String(seq)]: expanded
40083
+ };
40084
+ const kept = Object.keys(choices).map(Number).sort((a, b) => b - a).slice(0, FOLD_KEEP);
40085
+ globalThis.localStorage?.setItem(FOLD_KEY_PREFIX + sessionId, JSON.stringify(Object.fromEntries(kept.map((key) => [key, choices[key]]))));
40086
+ } catch {}
40087
+ }
40088
+ };
40089
+ /** Localized Markdown chrome (code-fence copy buttons, footnotes) over the room namespace. */
40090
+ function markdownLabels(t) {
40091
+ return {
40092
+ code: {
40093
+ copyLabel: t("action.copy"),
40094
+ copiedLabel: t("action.copied")
40095
+ },
40096
+ footnotes: t("markdown.footnotes")
40097
+ };
40098
+ }
40099
+ /**
40100
+ * Split a reply around the questions its round asked, in the order it said
40101
+ * and asked them (offsets recorded when the reply landed; -1 = the split
40102
+ * point was not found, so the question opens the reply marked mid-round).
40103
+ * A question the log does not know (an older cache) is left out.
40104
+ * @param data - the speech node data.
40105
+ * @param askLog - the room's question log.
40106
+ * @returns the parts, text and questions interleaved.
40107
+ */
40108
+ function replyParts(data, askLog) {
40109
+ const logged = new Map((askLog ?? []).map((ask) => [ask.id, ask]));
40110
+ const asks = (data.asks ?? []).filter((entry) => logged.has(entry.id)).sort((a, b) => a.at - b.at);
40111
+ if (asks.length === 0) return [{
40112
+ kind: "text",
40113
+ from: 0,
40114
+ text: data.text
40115
+ }];
40116
+ const parts = [];
40117
+ let cursor = 0;
40118
+ for (const entry of asks) {
40119
+ const at = Math.max(cursor, Math.min(entry.at, data.text.length));
40120
+ const piece = data.text.slice(cursor, at);
40121
+ if (piece.trim() !== "") parts.push({
40122
+ kind: "text",
40123
+ from: cursor,
40124
+ text: piece
40125
+ });
40126
+ parts.push({
40127
+ kind: "ask",
40128
+ ask: logged.get(entry.id),
40129
+ mid: entry.at < 0
40130
+ });
40131
+ cursor = at;
40132
+ }
40133
+ const rest = data.text.slice(cursor);
40134
+ if (rest.trim() !== "") parts.push({
40135
+ kind: "text",
40136
+ from: cursor,
40137
+ text: rest
40138
+ });
40139
+ return parts;
40140
+ }
40141
+ function RoomSpeechView({ node, sessionId, roomStore, openSession, openDetail, openPath, answerQuestion, t }) {
40142
+ const data = node.data;
40143
+ const [copied, setCopied] = (0, react.useState)(false);
40144
+ const [chosen, setChosen] = (0, react.useState)(() => foldChoices.read(sessionId)[String(node.data.seq)]);
40145
+ const copyTimer = (0, react.useRef)(null);
40146
+ (0, react.useEffect)(() => () => {
40147
+ if (copyTimer.current !== null) clearTimeout(copyTimer.current);
40148
+ }, []);
40149
+ const state = (0, react.useSyncExternalStore)(roomStore.subscribe, () => roomStore.getCached(sessionId));
40150
+ const member = state?.members.find((entry) => entry.name === data.member);
40151
+ const provider = member === void 0 ? void 0 : member.kind === "main-agent" ? t("member.kind.main") : member.provider;
40152
+ const child = data.childSessionId;
40153
+ const execution = data.runId === void 0 ? void 0 : state?.executions?.find((entry) => entry.id === data.runId);
40154
+ const usage = execution?.usage;
40155
+ const tokens = usage === void 0 ? execution?.tokens : usage.inputTokens + (usage.cacheReadTokens ?? 0) + (usage.cacheWriteTokens ?? 0) + usage.outputTokens;
40156
+ const newestSpeech = data.seq >= (state?.latestSpeechSeq ?? data.seq);
40157
+ const collapsible = data.text.length > COLLAPSE_CHARS;
40158
+ const newestReply = data.reportedTo === void 0 && data.seq >= (state?.latestReplySeq ?? data.seq);
40159
+ const expanded = chosen ?? newestReply;
40160
+ const clamped = collapsible && !expanded;
40161
+ const toggle = (next) => {
40162
+ setChosen(next);
40163
+ foldChoices.write(sessionId, data.seq, next);
40164
+ };
40165
+ const labels = (0, react.useMemo)(() => markdownLabels(t), [t]);
40166
+ const memberCwd = member?.cwd;
40167
+ const mentions = (0, react.useMemo)(() => openPath === void 0 ? void 0 : pathMentions((path) => {
40168
+ openPath(sessionId, path);
40169
+ }, memberCwd), [
40170
+ openPath,
40171
+ sessionId,
40172
+ memberCwd
40173
+ ]);
40174
+ const copy = () => {
40175
+ (0, _deepseek_ai_dsh_client_ui_primitives.writeClipboard)(data.text).then((ok) => {
40176
+ if (!ok) return;
40177
+ setCopied(true);
40178
+ copyTimer.current = setTimeout(() => {
40179
+ setCopied(false);
40180
+ }, 1e3);
40181
+ });
40182
+ };
40183
+ const color = memberColor(data.member);
40184
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
40185
+ className: RoomSpeechView_module_css_default.speech,
40186
+ "data-time-hover-root": "",
40187
+ "data-actions-reveal": newestSpeech ? "always" : "hover",
40188
+ style: { "--member-color": color },
40189
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
40190
+ className: RoomSpeechView_module_css_default.avatar,
40191
+ "aria-hidden": true,
40192
+ children: data.member.slice(0, 1).toUpperCase()
40193
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
40194
+ className: RoomSpeechView_module_css_default.stack,
40195
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
40196
+ className: RoomSpeechView_module_css_default.card,
40197
+ children: [
40198
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
40199
+ className: RoomSpeechView_module_css_default.identity,
40200
+ children: [
40201
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
40202
+ className: RoomSpeechView_module_css_default.name,
40203
+ children: data.member
40204
+ }),
40205
+ member?.role !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
40206
+ className: RoomSpeechView_module_css_default.role,
40207
+ children: member.role
40208
+ }),
40209
+ provider !== void 0 && provider !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
40210
+ className: RoomSpeechView_module_css_default.provider,
40211
+ children: provider
40212
+ }),
40213
+ data.interrupted !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
40214
+ className: RoomSpeechView_module_css_default.interrupted,
40215
+ children: t(data.interrupted === "cancelled" ? "speech.stopped" : "speech.failed")
40216
+ })
40217
+ ]
40218
+ }),
40219
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
40220
+ className: clamped ? `${RoomSpeechView_module_css_default.body} ${RoomSpeechView_module_css_default.clamped}` : RoomSpeechView_module_css_default.body,
40221
+ children: [
40222
+ replyParts(data, state?.askLog).map((part) => part.kind === "text" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.MarkdownText, {
40223
+ text: part.text,
40224
+ labels,
40225
+ fileMentions: mentions
40226
+ }, `t${part.from}`) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RoomQuestionView, {
40227
+ node: { data: askCardData(part.ask) },
40228
+ answerQuestion,
40229
+ t,
40230
+ inline: { mid: part.mid }
40231
+ }, part.ask.id)),
40232
+ clamped && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
40233
+ className: RoomSpeechView_module_css_default.fade,
40234
+ "aria-hidden": true,
40235
+ onClick: () => {
40236
+ toggle(true);
40237
+ }
40238
+ }),
40239
+ collapsible && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
40240
+ className: RoomSpeechView_module_css_default.foldBar,
40241
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
40242
+ label: expanded ? t("speech.collapse") : t("speech.expand"),
40243
+ side: "bottom",
40244
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
40245
+ type: "button",
40246
+ className: RoomSpeechView_module_css_default.foldToggle,
40247
+ "aria-label": expanded ? t("speech.collapse") : t("speech.expand"),
40248
+ "aria-expanded": expanded,
40249
+ onClick: () => {
40250
+ toggle(!expanded);
40251
+ },
40252
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconChevronDownOutlineMedium, {})
40253
+ })
40254
+ })
40255
+ })
40256
+ ]
40257
+ }),
40258
+ data.reportedTo !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
40259
+ className: RoomSpeechView_module_css_default.reported,
40260
+ children: t("speech.reportedTo", { member: data.reportedTo })
40261
+ })
40262
+ ]
40263
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
40264
+ className: RoomSpeechView_module_css_default.actions,
40265
+ children: [
40266
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
40267
+ label: copied ? t("action.copied") : t("action.copy"),
40268
+ side: "bottom",
40269
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
40270
+ type: "button",
40271
+ className: RoomSpeechView_module_css_default.action,
40272
+ "aria-label": copied ? t("action.copied") : t("action.copy"),
40273
+ onClick: copy,
40274
+ children: copied ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconCheckOutlineMedium, {}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconCopyOutlineMedium, {})
40275
+ })
40276
+ }),
40277
+ child !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
40278
+ label: t("speech.jump"),
40279
+ side: "bottom",
40280
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
40281
+ type: "button",
40282
+ className: RoomSpeechView_module_css_default.action,
40283
+ "aria-label": t("speech.jump"),
40284
+ onClick: () => {
40285
+ openSession(child);
40286
+ },
40287
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconLinkOutlineMedium, {})
40288
+ })
40289
+ }),
40290
+ child !== void 0 && data.messageId !== void 0 && openDetail !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
40291
+ label: t("speech.detail"),
40292
+ side: "bottom",
40293
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
40294
+ type: "button",
40295
+ className: RoomSpeechView_module_css_default.action,
40296
+ "aria-label": t("speech.detail"),
40297
+ onClick: () => {
40298
+ openDetail(child, data.messageId);
40299
+ },
40300
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconRequestDetailOutline16, {})
40301
+ })
40302
+ }),
40303
+ tokens !== void 0 && tokens > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(UsageChip, {
40304
+ tokens,
40305
+ execution,
40306
+ provider: member?.kind === "cli" ? member.provider : void 0,
40307
+ durationMs: data.durationMs,
40308
+ t
40309
+ }) : data.durationMs !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
40310
+ className: RoomSpeechView_module_css_default.meta,
40311
+ children: formatDurationMs(data.durationMs)
40312
+ }),
40313
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
40314
+ className: RoomSpeechView_module_css_default.meta,
40315
+ children: formatClock(data.time)
40316
+ })
40317
+ ]
40318
+ })]
40319
+ })]
40320
+ });
40321
+ }
40322
+ /**
40323
+ * 用量 with its breakdown on hover or focus — the host's turn usage panel:
40324
+ * total, provider / model, cache hit, the disjoint input buckets, output, and
40325
+ * this round's run time. Rows the harness did not report are left out.
40326
+ */
40327
+ function UsageChip({ tokens, execution, provider, durationMs, t }) {
40328
+ const [open, setOpen] = (0, react.useState)(false);
40329
+ const usage = execution?.usage;
40330
+ const billed = usage === void 0 ? 0 : usage.inputTokens + (usage.cacheReadTokens ?? 0) + (usage.cacheWriteTokens ?? 0);
40331
+ const exact = (n) => n.toLocaleString("en-US");
40332
+ const route = [provider, execution?.model].filter(Boolean).join("/");
40333
+ const rows = [
40334
+ ...route === "" ? [] : [[t("usage.route"), route]],
40335
+ ...usage !== void 0 && billed > 0 ? [[t("usage.cacheHit"), `${Math.round((usage.cacheReadTokens ?? 0) / billed * 1e3) / 10}%`]] : [],
40336
+ ...usage === void 0 ? [] : [
40337
+ [t("usage.uncached"), `${exact(usage.inputTokens)} tok`],
40338
+ ...usage.cacheReadTokens === void 0 ? [] : [[t("usage.cacheRead"), `${exact(usage.cacheReadTokens)} tok`]],
40339
+ ...usage.cacheWriteTokens === void 0 ? [] : [[t("usage.cacheWrite"), `${exact(usage.cacheWriteTokens)} tok`]],
40340
+ [t("usage.output"), `${exact(usage.outputTokens)} tok`]
40341
+ ],
40342
+ ...durationMs === void 0 ? [] : [[t("usage.duration"), formatDurationMs(durationMs)]]
40343
+ ];
40344
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
40345
+ className: RoomSpeechView_module_css_default.usage,
40346
+ onMouseEnter: () => {
40347
+ setOpen(true);
40348
+ },
40349
+ onMouseLeave: () => {
40350
+ setOpen(false);
40351
+ },
40352
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
40353
+ type: "button",
40354
+ className: RoomSpeechView_module_css_default.usageChip,
40355
+ "aria-expanded": open,
40356
+ onFocus: () => {
40357
+ setOpen(true);
40358
+ },
40359
+ onBlur: () => {
40360
+ setOpen(false);
40361
+ },
40362
+ children: t("speech.usage", { tokens: formatTokens$1(tokens) })
40363
+ }), open && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
40364
+ className: RoomSpeechView_module_css_default.usagePanel,
40365
+ role: "tooltip",
40366
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
40367
+ className: RoomSpeechView_module_css_default.usageHead,
40368
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("usage.title") }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [exact(tokens), " tok"] })]
40369
+ }), rows.map(([label, value]) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
40370
+ className: RoomSpeechView_module_css_default.usageRow,
40371
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: label }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: value })]
40372
+ }, label))]
40373
+ })]
40374
+ });
40375
+ }
40376
+ //#endregion
40377
+ //#region \0dsh-css:src/client/RoomRunView.module.css.mjs
40378
+ const css$4 = "._7amxlW_run{height:24px;color:var(--dsw-alias-label-secondary,#5a5a5ae6);cursor:pointer;border-radius:6px;align-items:center;gap:8px;padding:0 4px;font-size:13px;line-height:18px;display:flex;position:relative;overflow:hidden}._7amxlW_run:hover{background:var(--dsw-alias-interactive-bg-hover,#7f7f7f24)}._7amxlW_leading{flex:none}._7amxlW_title{white-space:nowrap}._7amxlW_run[data-state=failed] ._7amxlW_title{color:var(--dsw-alias-text-error,#d9363e)}._7amxlW_elapsed{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);flex:1;overflow:hidden}._7amxlW_reason{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-text-error,#d9363e);flex:2;overflow:hidden}._7amxlW_stop{width:20px;height:20px;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);cursor:pointer;background:0 0;border:none;border-radius:20px;justify-content:center;align-items:center;padding:2px;display:inline-flex}._7amxlW_stop:hover{background:var(--dsw-alias-interactive-bg-hover,#7f7f7f24);color:var(--dsw-alias-label-secondary,#5a5a5ae6)}._7amxlW_run[data-state=running]:after{content:\"\";background:linear-gradient(90deg, transparent, var(--dsw-alias-bg-layer-1,#fff9) 50%, transparent);opacity:.6;pointer-events:none;width:300px;animation:2.6s ease-out infinite _7amxlW_dsh-room-run-sweep;position:absolute;top:0;bottom:0;left:0}@keyframes _7amxlW_dsh-room-run-sweep{0%{left:-300px}90%,to{left:100%}}@media (prefers-reduced-motion:reduce){._7amxlW_run[data-state=running]:after{content:none;animation:none}}._7amxlW_run:focus:not(:focus-visible),._7amxlW_stop:focus:not(:focus-visible){outline:none}._7amxlW_liveCard{padding-bottom:8px}._7amxlW_liveCard>._7amxlW_run{margin:-2px -4px 2px}";
40379
+ const tagId$4 = "@khorsheed/dsh-room/RoomRunView.module.css";
40380
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$4) + "]") === null) {
40381
+ const tag = document.createElement("style");
40382
+ tag.dataset.plugin = "@khorsheed/dsh-room";
40383
+ tag.dataset.pluginCss = tagId$4;
40384
+ tag.textContent = css$4;
40385
+ document.head.appendChild(tag);
40386
+ }
40387
+ var RoomRunView_module_css_default = {
40388
+ "stop": "_7amxlW_stop",
40389
+ "liveCard": "_7amxlW_liveCard",
40390
+ "elapsed": "_7amxlW_elapsed",
40391
+ "leading": "_7amxlW_leading",
40392
+ "title": "_7amxlW_title",
40393
+ "run": "_7amxlW_run",
40394
+ "dsh-room-run-sweep": "_7amxlW_dsh-room-run-sweep",
40395
+ "reason": "_7amxlW_reason"
40396
+ };
40397
+ //#endregion
40398
+ //#region src/client/RoomRunView.tsx
40399
+ /**
40400
+ * Member run node ('room-run' keyed renderer): a ToolRow-isomorphic 24px
40401
+ * line — StateDot +「ada 正在工作… · 12s」+ the running sweep (with a
40402
+ * prefers-reduced-motion fallback). The WHOLE row jumps into the member's
40403
+ * child session (looked up from the room store's roster — run events carry
40404
+ * no handle), and a trailing stop button cancels through the Remote. A
40405
+ * failed run stays as a dim error row with the journaled reason (truncated,
40406
+ * the full text on hover); done/cancelled are hidden by the Definition and
40407
+ * never reach here. A RUNNING member's row takes the speech card's shape —
40408
+ * avatar and light card, the row as the card's header, the live output
40409
+ * below — so the reply card that replaces it lands in the same place.
40410
+ */
40411
+ /** The member run row. */
40412
+ function RoomRunView({ node, sessionId, roomStore, openSession, cancelMember, renderMemberOutput, openPath, answerQuestion, t }) {
40413
+ const state = (0, react.useSyncExternalStore)(roomStore.subscribe, () => roomStore.getCached(sessionId));
40414
+ const recovered = state?.runs.find((run) => run.member === node.data.member && run.startedAt === node.data.startedAt);
40415
+ const data = node.data.state === "running" && recovered !== void 0 ? {
40416
+ ...node.data,
40417
+ ...recovered
40418
+ } : node.data;
40419
+ const [now, setNow] = (0, react.useState)(() => Date.now());
40420
+ (0, react.useEffect)(() => {
40421
+ if (data.state !== "running") return void 0;
40422
+ const timer = setInterval(() => {
40423
+ setNow(Date.now());
40424
+ }, 1e3);
40425
+ return () => {
40426
+ clearInterval(timer);
40427
+ };
40428
+ }, [data.state]);
40429
+ const rosterEntry = state?.members.find((entry) => entry.name === data.member);
40430
+ const childSessionId = rosterEntry?.childSessionId;
40431
+ const memberCwd = rosterEntry?.cwd;
40432
+ const runId = recovered?.runId;
40433
+ const waiting = runId === void 0 ? [] : (state?.askLog ?? []).filter((ask) => ask.runId === runId && ask.state === "pending");
40434
+ const mentions = (0, react.useMemo)(() => openPath === void 0 ? void 0 : pathMentions((path) => {
40435
+ openPath(sessionId, path);
40436
+ }, memberCwd), [
40437
+ openPath,
40438
+ sessionId,
40439
+ memberCwd
40440
+ ]);
40441
+ if (data.state === "done" || data.state === "cancelled") return null;
40442
+ const failed = data.state === "failed";
40443
+ const elapsed = failed ? data.elapsedMs : Math.max(0, now - data.startedAt);
40444
+ const jump = () => {
40445
+ if (childSessionId !== void 0) openSession(childSessionId);
40446
+ };
40447
+ const onKeyDown = (event) => {
40448
+ if (event.key === "Enter" || event.key === " ") {
40449
+ event.preventDefault();
40450
+ jump();
40451
+ }
40452
+ };
40453
+ const row = /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
40454
+ className: RoomRunView_module_css_default.run,
40455
+ "data-state": failed ? "failed" : "running",
40456
+ role: "button",
40457
+ tabIndex: 0,
40458
+ onClick: jump,
40459
+ onKeyDown,
40460
+ children: [
40461
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.StateDot, { state: failed ? "error" : waiting.length > 0 ? "warning" : "ongoing" }),
40462
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
40463
+ className: RoomRunView_module_css_default.title,
40464
+ children: failed ? t("run.failed", { member: data.member }) : waiting.length > 0 ? t("run.waiting", { member: data.member }) : t("run.working", { member: data.member })
40465
+ }),
40466
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
40467
+ className: RoomRunView_module_css_default.elapsed,
40468
+ "aria-hidden": true,
40469
+ children: ["· ", elapsed === void 0 ? t("run.durationUnknown") : formatDurationMs(elapsed)]
40470
+ }),
40471
+ failed && data.error !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
40472
+ className: RoomRunView_module_css_default.reason,
40473
+ title: data.error,
40474
+ children: data.error
40475
+ }),
40476
+ !failed && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
40477
+ label: t("run.stop"),
40478
+ side: "bottom",
40479
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
40480
+ type: "button",
40481
+ className: RoomRunView_module_css_default.stop,
40482
+ "aria-label": t("run.stop"),
40483
+ onClick: (event) => {
40484
+ event.stopPropagation();
40485
+ cancelMember(data.member);
40486
+ },
40487
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconStopFillMedium, {})
40488
+ })
40489
+ })
40490
+ ]
40491
+ });
40492
+ if (failed) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { children: row });
40493
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
40494
+ className: RoomSpeechView_module_css_default.speech,
40495
+ style: { "--member-color": memberColor(data.member) },
40496
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
40497
+ className: RoomSpeechView_module_css_default.avatar,
40498
+ "aria-hidden": true,
40499
+ children: data.member.slice(0, 1).toUpperCase()
40500
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
40501
+ className: `${RoomSpeechView_module_css_default.card} ${RoomRunView_module_css_default.liveCard}`,
40502
+ children: [
40503
+ row,
40504
+ childSessionId !== void 0 && (mentions === void 0 ? renderMemberOutput?.(childSessionId, data.startedAt) : renderMemberOutput?.(childSessionId, data.startedAt, { fileMentions: mentions })),
40505
+ waiting.map((ask) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RoomQuestionView, {
40506
+ node: { data: askCardData(ask) },
40507
+ answerQuestion,
40508
+ t,
40509
+ inline: {}
40510
+ }, ask.id))
40511
+ ]
40512
+ })]
40513
+ });
40514
+ }
40515
+ //#endregion
40516
+ //#region \0dsh-css:src/client/RoomEventView.module.css.mjs
40517
+ const css$3 = ".MkUhUa_row{white-space:nowrap;text-overflow:ellipsis;height:24px;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);align-items:center;padding:0 4px;font-size:13px;line-height:18px;display:flex;overflow:hidden}";
40518
+ const tagId$3 = "@khorsheed/dsh-room/RoomEventView.module.css";
40519
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$3) + "]") === null) {
40520
+ const tag = document.createElement("style");
40521
+ tag.dataset.plugin = "@khorsheed/dsh-room";
40522
+ tag.dataset.pluginCss = tagId$3;
40523
+ tag.textContent = css$3;
40524
+ document.head.appendChild(tag);
40525
+ }
40526
+ var RoomEventView_module_css_default = { "row": "MkUhUa_row" };
40527
+ //#endregion
40528
+ //#region src/client/RoomEventView.tsx
40529
+ /** The boundary dim line. */
40530
+ function RoomEventView({ node, t }) {
40531
+ const data = node.data;
40532
+ let text;
40533
+ switch (data.sub) {
40534
+ case "member-added":
40535
+ text = t("event.joined", {
40536
+ member: data.member ?? "",
40537
+ provider: data.provider ?? ""
40538
+ }) + (data.invitedBy === "agent" ? t("event.joinedByAgent") : "");
40539
+ break;
40540
+ case "member-removed": text = t("event.left", { member: data.member ?? "" });
40541
+ }
40542
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
40543
+ className: RoomEventView_module_css_default.row,
40544
+ children: text
40545
+ });
40546
+ }
39245
40547
  //#endregion
39246
40548
  //#region src/client/room-store.ts
39247
40549
  /**
@@ -39589,13 +40891,13 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
39589
40891
  };
39590
40892
  //#endregion
39591
40893
  //#region \0dsh-css:src/client/RoomRelayView.module.css.mjs
39592
- const css$3 = "._79-ovW_row{white-space:nowrap;height:24px;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);align-items:center;gap:6px;padding:0 4px;font-size:13px;line-height:18px;display:flex;overflow:hidden}._79-ovW_text{text-overflow:ellipsis;overflow:hidden}._79-ovW_action{color:var(--dsw-alias-label-secondary,#7f7f7f);cursor:pointer;background:0 0;border:none;border-radius:4px;flex:none;padding:0 6px;font-size:12px;line-height:18px}._79-ovW_action:hover{background:var(--dsw-alias-fill-secondary,#7f7f7f1f);color:var(--dsw-alias-label-primary,#1e1e1e)}._79-ovW_action:focus:not(:focus-visible){outline:none}._79-ovW_reason{background:var(--dsw-alias-bg-layer-2,#0000000d);color:var(--dsw-alias-label-secondary,#5a5a5ae6);border-radius:5px;margin-right:6px;padding:0 6px;font-size:11px}";
39593
- const tagId$3 = "@khorsheed/dsh-room/RoomRelayView.module.css";
39594
- if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$3) + "]") === null) {
40894
+ const css$2 = "._79-ovW_row{white-space:nowrap;height:24px;color:var(--dsw-alias-label-tertiary,#7f7f7fcc);align-items:center;gap:6px;padding:0 4px;font-size:13px;line-height:18px;display:flex;overflow:hidden}._79-ovW_text{text-overflow:ellipsis;overflow:hidden}._79-ovW_action{color:var(--dsw-alias-label-secondary,#7f7f7f);cursor:pointer;background:0 0;border:none;border-radius:4px;flex:none;padding:0 6px;font-size:12px;line-height:18px}._79-ovW_action:hover{background:var(--dsw-alias-fill-secondary,#7f7f7f1f);color:var(--dsw-alias-label-primary,#1e1e1e)}._79-ovW_action:focus:not(:focus-visible){outline:none}._79-ovW_reason{background:var(--dsw-alias-bg-layer-2,#0000000d);color:var(--dsw-alias-label-secondary,#5a5a5ae6);border-radius:5px;margin-right:6px;padding:0 6px;font-size:11px}";
40895
+ const tagId$2 = "@khorsheed/dsh-room/RoomRelayView.module.css";
40896
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$2) + "]") === null) {
39595
40897
  const tag = document.createElement("style");
39596
40898
  tag.dataset.plugin = "@khorsheed/dsh-room";
39597
- tag.dataset.pluginCss = tagId$3;
39598
- tag.textContent = css$3;
40899
+ tag.dataset.pluginCss = tagId$2;
40900
+ tag.textContent = css$2;
39599
40901
  document.head.appendChild(tag);
39600
40902
  }
39601
40903
  var RoomRelayView_module_css_default = {
@@ -39655,20 +40957,20 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
39655
40957
  }
39656
40958
  //#endregion
39657
40959
  //#region \0dsh-css:src/client/RoomInboxView.module.css.mjs
39658
- const css$2 = ".DVGCdG_row{border:1px dashed var(--dsw-alias-border-l2-darkmode-thin,#00000029);color:var(--dsw-alias-label-secondary,#5a5a5ae6);border-radius:8px;flex-wrap:wrap;align-items:center;gap:4px 10px;margin:2px 0;padding:6px 10px;font-size:12px;line-height:18px;display:flex}.DVGCdG_text{flex:1;min-width:0}.DVGCdG_why{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);margin-left:8px}.DVGCdG_action{color:var(--dsw-alias-state-business-primary,#4176e6);font:inherit;cursor:pointer;background:0 0;border:none;padding:0}.DVGCdG_action:disabled{opacity:.5;cursor:default}";
39659
- const tagId$2 = "@khorsheed/dsh-room/RoomInboxView.module.css";
39660
- if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$2) + "]") === null) {
40960
+ const css$1 = ".DVGCdG_row{border:1px dashed var(--dsw-alias-border-l2-darkmode-thin,#00000029);color:var(--dsw-alias-label-secondary,#5a5a5ae6);border-radius:8px;flex-wrap:wrap;align-items:center;gap:4px 10px;margin:2px 0;padding:6px 10px;font-size:12px;line-height:18px;display:flex}.DVGCdG_text{flex:1;min-width:0}.DVGCdG_why{color:var(--dsw-alias-label-tertiary,#7f7f7fcc);margin-left:8px}.DVGCdG_action{color:var(--dsw-alias-state-business-primary,#4176e6);font:inherit;cursor:pointer;background:0 0;border:none;padding:0}.DVGCdG_action:disabled{opacity:.5;cursor:default}";
40961
+ const tagId$1 = "@khorsheed/dsh-room/RoomInboxView.module.css";
40962
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
39661
40963
  const tag = document.createElement("style");
39662
40964
  tag.dataset.plugin = "@khorsheed/dsh-room";
39663
- tag.dataset.pluginCss = tagId$2;
39664
- tag.textContent = css$2;
40965
+ tag.dataset.pluginCss = tagId$1;
40966
+ tag.textContent = css$1;
39665
40967
  document.head.appendChild(tag);
39666
40968
  }
39667
40969
  var RoomInboxView_module_css_default = {
39668
- "row": "DVGCdG_row",
39669
- "text": "DVGCdG_text",
39670
40970
  "action": "DVGCdG_action",
39671
- "why": "DVGCdG_why"
40971
+ "text": "DVGCdG_text",
40972
+ "why": "DVGCdG_why",
40973
+ "row": "DVGCdG_row"
39672
40974
  };
39673
40975
  //#endregion
39674
40976
  //#region src/client/RoomInboxView.tsx
@@ -39764,200 +41066,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
39764
41066
  });
39765
41067
  }
39766
41068
  //#endregion
39767
- //#region \0dsh-css:src/client/RoomQuestionView.module.css.mjs
39768
- const css$1 = ".Ot_rXG_card{border:1px solid var(--dsw-alias-border-l2-darkmode-thin,#00000014);background:var(--dsw-alias-bg-layer-1,#fff);font-size:var(--dsh-content-font-size,14px);line-height:calc(22px + var(--dsh-content-font-delta,0px));color:var(--dsw-alias-label-primary,#1f2329);border-radius:12px;flex-direction:column;gap:12px;margin:4px 0;padding:12px 14px;display:flex}.Ot_rXG_card[data-state=cancelled]{opacity:.6}.Ot_rXG_head{align-items:center;gap:8px;display:flex}.Ot_rXG_avatar{background:color-mix(in srgb, var(--member-color,var(--dsw-alias-label-tertiary,#7f8287)) 85%, black);color:#fff;user-select:none;border-radius:50%;flex:none;place-items:center;width:22px;height:22px;font-size:11px;font-weight:600;display:grid}.Ot_rXG_title{font-weight:600}.Ot_rXG_status{color:var(--dsw-alias-label-tertiary,#1f232980);margin-left:auto;font-size:12px}.Ot_rXG_question{border:0;flex-direction:column;gap:6px;min-width:0;margin:0;padding:0;display:flex}.Ot_rXG_prompt{flex-wrap:wrap;align-items:baseline;gap:6px;margin-bottom:2px;padding:0;font-weight:500;display:flex}.Ot_rXG_chip{background:var(--dsw-alias-interactive-bg-hover,#0000000d);color:var(--dsw-alias-label-secondary,#1f2329b3);border-radius:6px;padding:0 6px;font-size:12px;font-weight:500}.Ot_rXG_hint{color:var(--dsw-alias-label-tertiary,#1f232980);font-size:12px;font-weight:400}.Ot_rXG_option{border:1px solid var(--dsw-alias-border-l2,#7f7f7f3d);cursor:pointer;border-radius:10px;align-items:flex-start;gap:8px;padding:7px 10px;transition:background-color .1s,border-color .1s;display:flex}.Ot_rXG_option:hover{background:var(--dsw-alias-interactive-bg-hover,#0000000a)}.Ot_rXG_option[data-picked=true]{border-color:var(--dsw-alias-state-business-primary,#4176e6);background:color-mix(in srgb, var(--dsw-alias-state-business-primary,#4176e6) 8%, transparent)}.Ot_rXG_option input{accent-color:var(--dsw-alias-state-business-primary,#4176e6);flex:none;margin:4px 0 0}.Ot_rXG_optionText{flex-direction:column;min-width:0;display:flex}.Ot_rXG_optionLabel{font-weight:500}.Ot_rXG_optionDescription{color:var(--dsw-alias-label-secondary,#1f2329b3);font-size:12px;line-height:18px}.Ot_rXG_other{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,#7f7f7f3d);width:100%;color:inherit;font:inherit;background:0 0;border-radius:10px;outline:none;padding:6px 10px}.Ot_rXG_other:focus{border-color:var(--dsw-alias-state-business-primary,#4176e6)}.Ot_rXG_answer{color:var(--dsw-alias-label-secondary,#1f2329b3)}.Ot_rXG_actions{justify-content:flex-end;align-items:center;gap:10px;display:flex}.Ot_rXG_error{color:var(--dsw-alias-state-error-primary,#d9363e);font-size:12px}.Ot_rXG_submit{background:var(--dsw-alias-button-info-fill,#4176e6);color:#fff;height:32px;font:inherit;cursor:pointer;border:none;border-radius:999px;padding:0 14px;font-weight:500}.Ot_rXG_submit:disabled{opacity:.4;cursor:default}";
39769
- const tagId$1 = "@khorsheed/dsh-room/RoomQuestionView.module.css";
39770
- if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
39771
- const tag = document.createElement("style");
39772
- tag.dataset.plugin = "@khorsheed/dsh-room";
39773
- tag.dataset.pluginCss = tagId$1;
39774
- tag.textContent = css$1;
39775
- document.head.appendChild(tag);
39776
- }
39777
- var RoomQuestionView_module_css_default = {
39778
- "avatar": "Ot_rXG_avatar",
39779
- "title": "Ot_rXG_title",
39780
- "option": "Ot_rXG_option",
39781
- "other": "Ot_rXG_other",
39782
- "chip": "Ot_rXG_chip",
39783
- "submit": "Ot_rXG_submit",
39784
- "hint": "Ot_rXG_hint",
39785
- "card": "Ot_rXG_card",
39786
- "optionLabel": "Ot_rXG_optionLabel",
39787
- "head": "Ot_rXG_head",
39788
- "actions": "Ot_rXG_actions",
39789
- "error": "Ot_rXG_error",
39790
- "status": "Ot_rXG_status",
39791
- "answer": "Ot_rXG_answer",
39792
- "question": "Ot_rXG_question",
39793
- "optionDescription": "Ot_rXG_optionDescription",
39794
- "optionText": "Ot_rXG_optionText",
39795
- "prompt": "Ot_rXG_prompt"
39796
- };
39797
- //#endregion
39798
- //#region src/client/RoomQuestionView.tsx
39799
- /**
39800
- * A member's question card ('room-question' keyed renderer): the questions a
39801
- * CLI member asked through its bridge's `ask_user_question`, answered by
39802
- * picking — one option (or several on a multi-pick question) plus an optional
39803
- * 其他 free-text line — instead of a numbered list in the member's reply that
39804
- * the human answers by typing. Submitting resolves the member's waiting call;
39805
- * the card then folds to the given answers (or 已过期 when the call ended).
39806
- */
39807
- /** The question card. */
39808
- function RoomQuestionView({ node, answerQuestion, t }) {
39809
- const data = node.data;
39810
- const [drafts, setDrafts] = (0, react.useState)({});
39811
- const [busy, setBusy] = (0, react.useState)(false);
39812
- const [error, setError] = (0, react.useState)(void 0);
39813
- const pending = data.state === "pending";
39814
- const draftOf = (id) => drafts[id] ?? {
39815
- selected: [],
39816
- custom: ""
39817
- };
39818
- const setDraft = (id, next) => {
39819
- setDrafts((current) => ({
39820
- ...current,
39821
- [id]: next
39822
- }));
39823
- };
39824
- const answered = (id) => draftOf(id).selected.length > 0 || draftOf(id).custom.trim() !== "";
39825
- const complete = data.questions.every((question) => answered(question.id));
39826
- const pick = (id, label, multi) => {
39827
- const draft = draftOf(id);
39828
- const has = draft.selected.includes(label);
39829
- setDraft(id, {
39830
- ...draft,
39831
- selected: multi ? has ? draft.selected.filter((entry) => entry !== label) : [...draft.selected, label] : has ? [] : [label]
39832
- });
39833
- };
39834
- const submit = async () => {
39835
- if (busy || !complete) return;
39836
- setBusy(true);
39837
- try {
39838
- const answers = data.questions.map((question) => {
39839
- const draft = draftOf(question.id);
39840
- const custom = draft.custom.trim();
39841
- return {
39842
- id: question.id,
39843
- selected: draft.selected,
39844
- ...custom === "" ? {} : { custom }
39845
- };
39846
- });
39847
- setError(await answerQuestion(data.questionId, answers));
39848
- } finally {
39849
- setBusy(false);
39850
- }
39851
- };
39852
- /** The folded answer text of one question. */
39853
- const answerText = (id) => {
39854
- const answer = data.answers?.find((entry) => entry.id === id);
39855
- return [...answer?.selected ?? [], ...answer?.custom === void 0 ? [] : [answer.custom]].join(";");
39856
- };
39857
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39858
- className: RoomQuestionView_module_css_default.card,
39859
- "data-state": data.state,
39860
- style: { "--member-color": memberColor(data.member) },
39861
- children: [
39862
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39863
- className: RoomQuestionView_module_css_default.head,
39864
- children: [
39865
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
39866
- className: RoomQuestionView_module_css_default.avatar,
39867
- "aria-hidden": true,
39868
- children: data.member.slice(0, 1).toUpperCase()
39869
- }),
39870
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
39871
- className: RoomQuestionView_module_css_default.title,
39872
- children: t("question.title", { member: data.member })
39873
- }),
39874
- !pending && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
39875
- className: RoomQuestionView_module_css_default.status,
39876
- children: t(data.state === "answered" ? "question.answered" : "question.cancelled")
39877
- })
39878
- ]
39879
- }),
39880
- data.questions.map((question) => {
39881
- const multi = question.multiSelect === true;
39882
- const draft = draftOf(question.id);
39883
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("fieldset", {
39884
- className: RoomQuestionView_module_css_default.question,
39885
- disabled: !pending || busy,
39886
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("legend", {
39887
- className: RoomQuestionView_module_css_default.prompt,
39888
- children: [
39889
- question.header !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
39890
- className: RoomQuestionView_module_css_default.chip,
39891
- children: question.header
39892
- }),
39893
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: question.question }),
39894
- pending && multi && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
39895
- className: RoomQuestionView_module_css_default.hint,
39896
- children: t("question.multi")
39897
- })
39898
- ]
39899
- }), pending ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(question.options ?? []).map((option) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
39900
- className: RoomQuestionView_module_css_default.option,
39901
- "data-picked": draft.selected.includes(option.label),
39902
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
39903
- type: multi ? "checkbox" : "radio",
39904
- name: `${data.questionId}-${question.id}`,
39905
- checked: draft.selected.includes(option.label),
39906
- onChange: () => {
39907
- pick(question.id, option.label, multi);
39908
- },
39909
- onClick: (event) => {
39910
- if (!multi && draft.selected.includes(option.label)) {
39911
- event.preventDefault();
39912
- pick(question.id, option.label, multi);
39913
- }
39914
- }
39915
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
39916
- className: RoomQuestionView_module_css_default.optionText,
39917
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
39918
- className: RoomQuestionView_module_css_default.optionLabel,
39919
- children: option.label
39920
- }), option.description !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
39921
- className: RoomQuestionView_module_css_default.optionDescription,
39922
- children: option.description
39923
- })]
39924
- })]
39925
- }, option.label)), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
39926
- className: RoomQuestionView_module_css_default.other,
39927
- value: draft.custom,
39928
- "aria-label": t("question.other"),
39929
- placeholder: (question.options ?? []).length > 0 ? `${t("question.other")}:${t("question.otherPlaceholder")}` : t("question.otherPlaceholder"),
39930
- onChange: (event) => {
39931
- setDraft(question.id, {
39932
- ...draft,
39933
- custom: event.target.value
39934
- });
39935
- }
39936
- })] }) : data.state === "answered" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
39937
- className: RoomQuestionView_module_css_default.answer,
39938
- children: t("question.answer", { answer: answerText(question.id) })
39939
- })]
39940
- }, question.id);
39941
- }),
39942
- pending && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39943
- className: RoomQuestionView_module_css_default.actions,
39944
- children: [error !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
39945
- className: RoomQuestionView_module_css_default.error,
39946
- children: error
39947
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
39948
- type: "button",
39949
- className: RoomQuestionView_module_css_default.submit,
39950
- disabled: !complete || busy,
39951
- onClick: () => {
39952
- submit();
39953
- },
39954
- children: t("question.submit")
39955
- })]
39956
- })
39957
- ]
39958
- });
39959
- }
39960
- //#endregion
39961
41069
  //#region src/client/RoomDecisionView.tsx
39962
41070
  /**
39963
41071
  * The line's text for one decision.
@@ -40031,23 +41139,23 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
40031
41139
  document.head.appendChild(tag);
40032
41140
  }
40033
41141
  var RoomHelpView_module_css_default = {
41142
+ "line": "gZ0Tza_line",
40034
41143
  "icon": "gZ0Tza_icon",
41144
+ "text": "gZ0Tza_text",
40035
41145
  "card": "gZ0Tza_card",
40036
- "entry": "gZ0Tza_entry",
40037
- "label": "gZ0Tza_label",
40038
- "line": "gZ0Tza_line",
40039
- "cardBody": "gZ0Tza_cardBody",
40040
41146
  "more": "gZ0Tza_more",
40041
41147
  "nudge": "gZ0Tza_nudge",
40042
- "text": "gZ0Tza_text",
40043
- "cardHead": "gZ0Tza_cardHead",
40044
- "cardTitle": "gZ0Tza_cardTitle",
40045
41148
  "action": "gZ0Tza_action",
40046
- "handoff": "gZ0Tza_handoff",
41149
+ "copy": "gZ0Tza_copy",
41150
+ "cardTitle": "gZ0Tza_cardTitle",
40047
41151
  "thread": "gZ0Tza_thread",
40048
- "tag": "gZ0Tza_tag",
40049
41152
  "body": "gZ0Tza_body",
40050
- "copy": "gZ0Tza_copy"
41153
+ "label": "gZ0Tza_label",
41154
+ "entry": "gZ0Tza_entry",
41155
+ "cardBody": "gZ0Tza_cardBody",
41156
+ "tag": "gZ0Tza_tag",
41157
+ "cardHead": "gZ0Tza_cardHead",
41158
+ "handoff": "gZ0Tza_handoff"
40051
41159
  };
40052
41160
  //#endregion
40053
41161
  //#region src/client/RoomHelpView.tsx
@@ -40293,7 +41401,45 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
40293
41401
  ctx.effect(() => roomStore.start(), "room: store");
40294
41402
  const roomChrome = new RoomPresetVisibility(ctx, (sessionId) => roomStore.isRoomCached(sessionId) === true);
40295
41403
  const requestIds = new RoomRequestIds();
40296
- const submit = async (sessionId, text, targets, task) => {
41404
+ /** Answer a member's question card (the row of its own, or inline in its round). */
41405
+ const answerFor = (sessionId) => async (questionId, answers) => {
41406
+ if (remote === void 0) return t("composer.error.generic");
41407
+ const carried = await remote.answerQuestion({
41408
+ sessionId,
41409
+ id: questionId,
41410
+ answers
41411
+ });
41412
+ roomStore.refresh(sessionId);
41413
+ if (!carried.ok) return t("composer.error.generic");
41414
+ return carried.value.ok ? void 0 : t("question.expired");
41415
+ };
41416
+ /**
41417
+ * Open a path a member named in the sidebar's file viewer — the same file
41418
+ * address the main conversation's file links open (a relative path resolves
41419
+ * against the room session's workspace).
41420
+ */
41421
+ const openPath = ctx.get("sidebarRight") === void 0 ? void 0 : (sessionId, path) => {
41422
+ const cwd = ctx.sessions.list.getSnapshot().byId[sessionId]?.cwd;
41423
+ try {
41424
+ ctx.get("sidebarRight").openResource(fileAddressFor(sessionId, cwd, path));
41425
+ } catch {}
41426
+ };
41427
+ const attachmentsFor = () => {
41428
+ const conversation = ctx.get("conversation");
41429
+ return conversation?.createDrafts === void 0 || conversation.resolveDraftAttachments === void 0 || conversation.releaseDraftAttachment === void 0 || conversation.retryFileUpload === void 0 || conversation.fileUploads === void 0 || conversation.serializeDraftAttachments === void 0 ? void 0 : {
41430
+ create: (sessionId, files) => conversation.createDrafts.call(conversation, sessionId, files),
41431
+ resolve: (ids) => conversation.resolveDraftAttachments.call(conversation, ids),
41432
+ release: (id) => {
41433
+ conversation.releaseDraftAttachment.call(conversation, id);
41434
+ },
41435
+ retry: (sessionId, id) => {
41436
+ conversation.retryFileUpload.call(conversation, sessionId, id);
41437
+ },
41438
+ uploads: conversation.fileUploads,
41439
+ serialize: async (ids) => (await conversation.serializeDraftAttachments.call(conversation, ids)).attachments
41440
+ };
41441
+ };
41442
+ const submit = async (sessionId, text, targets, task, attachments) => {
40297
41443
  if (remote === void 0) return {
40298
41444
  ok: false,
40299
41445
  message: t("composer.error.generic")
@@ -40304,7 +41450,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
40304
41450
  text,
40305
41451
  requestId,
40306
41452
  ...targets === void 0 || targets.length === 0 ? {} : { targets },
40307
- ...task === void 0 ? {} : { task }
41453
+ ...task === void 0 ? {} : { task },
41454
+ ...attachments === void 0 || attachments.length === 0 ? {} : { attachments }
40308
41455
  });
40309
41456
  if (!carried.ok) return {
40310
41457
  ok: false,
@@ -40314,6 +41461,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
40314
41461
  if (!result.ok) return result.error.code === "unknown-targets" ? {
40315
41462
  ok: false,
40316
41463
  message: t("composer.error.unknownTargets", { names: result.error.names.join(" ") })
41464
+ } : result.error.code === "attachment-invalid" ? {
41465
+ ok: false,
41466
+ message: t("composer.error.attachment", { reason: result.error.message })
40317
41467
  } : {
40318
41468
  ok: false,
40319
41469
  message: t("composer.error.generic")
@@ -40642,6 +41792,40 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
40642
41792
  return { ok: true };
40643
41793
  }
40644
41794
  });
41795
+ ctx.inject(["uiSession"], (sctx) => {
41796
+ if (remote === void 0) return;
41797
+ const uiSession = sctx.uiSession;
41798
+ if (uiSession.registerPendingInteraction === void 0) return;
41799
+ const publish = uiSession.registerPendingInteraction(() => -1);
41800
+ const shown = /* @__PURE__ */ new Map();
41801
+ const sync = async () => {
41802
+ const carried = await remote.pendingCards({}).catch(() => void 0);
41803
+ if (carried === void 0 || !carried.ok) return;
41804
+ const keys = new Set(carried.value.map((card) => roomInteractionKey(card.kind, card.id)));
41805
+ for (const [key, remove] of shown) {
41806
+ if (keys.has(key)) continue;
41807
+ remove();
41808
+ shown.delete(key);
41809
+ }
41810
+ for (const card of carried.value) {
41811
+ const key = roomInteractionKey(card.kind, card.id);
41812
+ if (!shown.has(key)) shown.set(key, publish({
41813
+ key,
41814
+ kind: card.kind,
41815
+ sessionId: card.sessionId
41816
+ }, async () => {}));
41817
+ }
41818
+ };
41819
+ sync();
41820
+ const timer = setInterval(() => {
41821
+ sync();
41822
+ }, 4e3);
41823
+ sctx.effect(() => () => {
41824
+ clearInterval(timer);
41825
+ for (const remove of shown.values()) remove();
41826
+ shown.clear();
41827
+ }, "room: pending cards");
41828
+ });
40645
41829
  ctx.inject(["uiConversation"], (lctx) => {
40646
41830
  lctx.uiConversation.events.register(roomSpeechDefinition);
40647
41831
  lctx.uiConversation.events.register(roomRunDefinition);
@@ -40774,6 +41958,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
40774
41958
  } },
40775
41959
  taskTags,
40776
41960
  submit,
41961
+ ...(() => {
41962
+ const face = attachmentsFor();
41963
+ return face === void 0 ? {} : { attachments: face };
41964
+ })(),
40777
41965
  renderMemberConfiguration: ctx.get("localAgentUi")?.renderMemberConfiguration,
40778
41966
  renderMemberInbox: ctx.get("localAgentUi")?.renderMemberInbox,
40779
41967
  stopMember: (name, expectedRunId) => {
@@ -40873,9 +42061,11 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
40873
42061
  name: "conversation.chat.node",
40874
42062
  key: "room-speech",
40875
42063
  locale: NS,
40876
- inject: () => ({
42064
+ inject: (sessionId) => ({
40877
42065
  roomStore,
40878
42066
  openSession,
42067
+ answerQuestion: answerFor(sessionId),
42068
+ ...openPath === void 0 ? {} : { openPath },
40879
42069
  ...ctx.get("remote.requestInspector") === void 0 || ctx.get("sidebarRight") === void 0 ? {} : { openDetail: (sessionId, messageId) => {
40880
42070
  try {
40881
42071
  ctx.get("sidebarRight").openTab("context-lens", { params: {
@@ -40894,7 +42084,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
40894
42084
  renderMemberOutput: ctx.get("localAgentUi")?.renderMemberOutput,
40895
42085
  roomStore,
40896
42086
  openSession,
40897
- cancelMember: (member) => cancelMember(sessionId, member)
42087
+ cancelMember: (member) => cancelMember(sessionId, member),
42088
+ answerQuestion: answerFor(sessionId),
42089
+ ...openPath === void 0 ? {} : { openPath }
40898
42090
  })
40899
42091
  }, RoomRunView));
40900
42092
  ctx.slots.inject("conversation.chat.node", () => ctx.slots.register({
@@ -40940,17 +42132,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
40940
42132
  name: "conversation.chat.node",
40941
42133
  key: "room-question",
40942
42134
  locale: NS,
40943
- inject: (sessionId) => ({ answerQuestion: async (questionId, answers) => {
40944
- if (remote === void 0) return t("composer.error.generic");
40945
- const carried = await remote.answerQuestion({
40946
- sessionId,
40947
- id: questionId,
40948
- answers
40949
- });
40950
- roomStore.refresh(sessionId);
40951
- if (!carried.ok) return t("composer.error.generic");
40952
- return carried.value.ok ? void 0 : t("question.expired");
40953
- } })
42135
+ inject: (sessionId) => ({ answerQuestion: answerFor(sessionId) })
40954
42136
  }, RoomQuestionView));
40955
42137
  ctx.slots.inject("conversation.chat.node", () => ctx.slots.register({
40956
42138
  name: "conversation.chat.node",