@awiki/dsh-plugin 0.3.7-dsh-test.20260831.2 → 0.3.7

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 (99) hide show
  1. package/README.md +60 -58
  2. package/README.zh.md +51 -45
  3. package/THIRD_PARTY_NOTICES.md +1 -1
  4. package/cordis.patch.yml +8 -7
  5. package/lib/client.js +1119 -1340
  6. package/lib/client.js.map +1 -1
  7. package/lib/index.js +809 -1085
  8. package/lib/provider.js +17 -70
  9. package/lib/{sdk-adapter-FGaOi8It.mjs → sdk-adapter--trNlr-T.mjs} +84 -168
  10. package/lib/typert.host.js +178 -406
  11. package/lib/typert.remote-client.d.ts +7 -19
  12. package/lib/typert.remote-client.d.ts.map +1 -1
  13. package/lib/typert.remote-client.js +178 -406
  14. package/lib/types/base64.d.ts +4 -0
  15. package/lib/types/base64.d.ts.map +1 -0
  16. package/lib/types/base64.js +28 -0
  17. package/lib/types/base64.js.map +1 -0
  18. package/lib/types/client/AwikiIdentityAccess.d.ts +5 -6
  19. package/lib/types/client/AwikiIdentityAccess.d.ts.map +1 -1
  20. package/lib/types/client/AwikiIdentityAccess.js +27 -88
  21. package/lib/types/client/AwikiIdentityAccess.js.map +1 -1
  22. package/lib/types/client/AwikiMail.d.ts +1 -1
  23. package/lib/types/client/AwikiMail.d.ts.map +1 -1
  24. package/lib/types/client/AwikiMail.js +130 -6
  25. package/lib/types/client/AwikiMail.js.map +1 -1
  26. package/lib/types/client/AwikiOverlay.d.ts.map +1 -1
  27. package/lib/types/client/AwikiOverlay.js +12 -5
  28. package/lib/types/client/AwikiOverlay.js.map +1 -1
  29. package/lib/types/client/AwikiRecoveryForm.d.ts.map +1 -1
  30. package/lib/types/client/AwikiRecoveryForm.js +1 -1
  31. package/lib/types/client/AwikiRecoveryForm.js.map +1 -1
  32. package/lib/types/client/controller.d.ts +34 -20
  33. package/lib/types/client/controller.d.ts.map +1 -1
  34. package/lib/types/client/controller.js +203 -56
  35. package/lib/types/client/controller.js.map +1 -1
  36. package/lib/types/client/index.d.ts.map +1 -1
  37. package/lib/types/client/index.js +4 -8
  38. package/lib/types/client/index.js.map +1 -1
  39. package/lib/types/client/mail-attachment.d.ts +40 -0
  40. package/lib/types/client/mail-attachment.d.ts.map +1 -0
  41. package/lib/types/client/mail-attachment.js +187 -0
  42. package/lib/types/client/mail-attachment.js.map +1 -0
  43. package/lib/types/client/settings-locales.js +8 -8
  44. package/lib/types/client/settings-locales.js.map +1 -1
  45. package/lib/types/client/slots.d.ts +10 -10
  46. package/lib/types/client/slots.d.ts.map +1 -1
  47. package/lib/types/conversation-preferences.d.ts.map +1 -1
  48. package/lib/types/conversation-preferences.js +17 -0
  49. package/lib/types/conversation-preferences.js.map +1 -1
  50. package/lib/types/index.d.ts +30 -59
  51. package/lib/types/index.d.ts.map +1 -1
  52. package/lib/types/index.js +464 -805
  53. package/lib/types/index.js.map +1 -1
  54. package/lib/types/listener-state.d.ts +3 -5
  55. package/lib/types/listener-state.d.ts.map +1 -1
  56. package/lib/types/listener-state.js +13 -28
  57. package/lib/types/listener-state.js.map +1 -1
  58. package/lib/types/listener.d.ts +32 -9
  59. package/lib/types/listener.d.ts.map +1 -1
  60. package/lib/types/listener.js +127 -11
  61. package/lib/types/listener.js.map +1 -1
  62. package/lib/types/mail.d.ts +28 -2
  63. package/lib/types/mail.d.ts.map +1 -1
  64. package/lib/types/mail.js +79 -2
  65. package/lib/types/mail.js.map +1 -1
  66. package/lib/types/profile-state.d.ts +17 -0
  67. package/lib/types/profile-state.d.ts.map +1 -0
  68. package/lib/types/profile-state.js +58 -0
  69. package/lib/types/profile-state.js.map +1 -0
  70. package/lib/types/provider-api.d.ts +38 -102
  71. package/lib/types/provider-api.d.ts.map +1 -1
  72. package/lib/types/provider.d.ts +2 -8
  73. package/lib/types/provider.d.ts.map +1 -1
  74. package/lib/types/provider.js +16 -73
  75. package/lib/types/provider.js.map +1 -1
  76. package/lib/types/sdk-adapter.d.ts +7 -32
  77. package/lib/types/sdk-adapter.d.ts.map +1 -1
  78. package/lib/types/sdk-adapter.js +104 -163
  79. package/lib/types/sdk-adapter.js.map +1 -1
  80. package/lib/types/sent-mail-store.d.ts +7 -2
  81. package/lib/types/sent-mail-store.d.ts.map +1 -1
  82. package/lib/types/sent-mail-store.js +125 -23
  83. package/lib/types/sent-mail-store.js.map +1 -1
  84. package/lib/types/tools.d.ts +1 -1
  85. package/lib/types/tools.d.ts.map +1 -1
  86. package/lib/types/tools.js +20 -4
  87. package/lib/types/tools.js.map +1 -1
  88. package/lib/types/types.d.ts +66 -77
  89. package/lib/types/types.d.ts.map +1 -1
  90. package/lib/types/types.js.map +1 -1
  91. package/package.json +15 -20
  92. package/lib/types/client/AwikiDevices.d.ts +0 -28
  93. package/lib/types/client/AwikiDevices.d.ts.map +0 -1
  94. package/lib/types/client/AwikiDevices.js +0 -85
  95. package/lib/types/client/AwikiDevices.js.map +0 -1
  96. package/lib/types/realtime-supervisor.d.ts +0 -54
  97. package/lib/types/realtime-supervisor.d.ts.map +0 -1
  98. package/lib/types/realtime-supervisor.js +0 -242
  99. package/lib/types/realtime-supervisor.js.map +0 -1
package/lib/client.js CHANGED
@@ -589,7 +589,7 @@ window.__ModuleLoader__.load({
589
589
  const ipv6 = /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$/;
590
590
  const cidrv4 = /^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$/;
591
591
  const cidrv6 = /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/;
592
- const base64 = /^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$/;
592
+ const base64$1 = /^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$/;
593
593
  const base64url = /^[A-Za-z0-9_-]*$/;
594
594
  const httpProtocol = /^https?$/;
595
595
  const e164 = /^\+[1-9]\d{6,14}$/;
@@ -1326,7 +1326,7 @@ window.__ModuleLoader__.load({
1326
1326
  }
1327
1327
  }
1328
1328
  const $ZodBase64 = /*@__PURE__*/ $constructor("$ZodBase64", (inst, def) => {
1329
- def.pattern ?? (def.pattern = base64);
1329
+ def.pattern ?? (def.pattern = base64$1);
1330
1330
  $ZodStringFormat.init(inst, def);
1331
1331
  inst._zod.bag.contentEncoding = "base64";
1332
1332
  inst._zod.check = (payload) => {
@@ -4112,6 +4112,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4112
4112
  literal("forbidden"),
4113
4113
  literal("identity-recovery-required"),
4114
4114
  literal("conflict"),
4115
+ literal("state-in-use"),
4115
4116
  literal("rate-limited"),
4116
4117
  literal("group-membership-required"),
4117
4118
  literal("group-identity-stale"),
@@ -4146,12 +4147,14 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4146
4147
  "failureCode": string().readonly().optional(),
4147
4148
  "retryable": boolean().readonly(),
4148
4149
  "localOrdinaryDataWillMigrate": boolean().readonly(),
4149
- "otherDevicesMustRejoin": boolean().readonly()
4150
+ "otherDevicesMustRejoin": boolean().readonly(),
4151
+ "unsupportedE2eeGroupCount": number().readonly(),
4152
+ "unsupportedDidOnlyGroupCount": number().readonly()
4150
4153
  }).readonly()
4151
4154
  })]);
4152
4155
  const _awiki_dsh_plugin_awiki_addGroupMember_parameter_0$schema = object({
4153
4156
  "member": string().readonly(),
4154
- "role": union([literal("member"), literal("admin")]).readonly().optional(),
4157
+ "role": union([literal("admin"), literal("member")]).readonly().optional(),
4155
4158
  "groupDid": intersection(string(), unknown()).readonly()
4156
4159
  });
4157
4160
  const _awiki_dsh_plugin_awiki_addGroupMember_result$schema = union([object({
@@ -4169,6 +4172,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4169
4172
  literal("forbidden"),
4170
4173
  literal("identity-recovery-required"),
4171
4174
  literal("conflict"),
4175
+ literal("state-in-use"),
4172
4176
  literal("rate-limited"),
4173
4177
  literal("group-membership-required"),
4174
4178
  literal("group-identity-stale"),
@@ -4191,139 +4195,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4191
4195
  "handle": intersection(string(), unknown()).readonly().optional()
4192
4196
  }).readonly()
4193
4197
  })]);
4194
- const _awiki_dsh_plugin_awiki_approveDeviceJoin_parameter_0$schema = object({
4195
- "enteredSas": string().readonly(),
4196
- "confirmation": string().readonly(),
4197
- "requestRef": string().readonly()
4198
- });
4199
- const _awiki_dsh_plugin_awiki_approveDeviceJoin_result$schema = union([object({
4200
- "ok": literal(false).readonly(),
4201
- "error": object({
4202
- "code": union([
4203
- literal("not-registered"),
4204
- literal("signed-out"),
4205
- literal("already-registered"),
4206
- literal("invalid-request"),
4207
- literal("invalid-otp"),
4208
- literal("challenge-expired"),
4209
- literal("handle-unavailable"),
4210
- literal("not-found"),
4211
- literal("forbidden"),
4212
- literal("identity-recovery-required"),
4213
- literal("conflict"),
4214
- literal("rate-limited"),
4215
- literal("group-membership-required"),
4216
- literal("group-identity-stale"),
4217
- literal("attachment-too-large"),
4218
- literal("summary-unavailable"),
4219
- literal("summary-timeout"),
4220
- literal("summary-cancelled"),
4221
- literal("summary-invalid-output"),
4222
- literal("summary-failed"),
4223
- literal("delivery-unknown"),
4224
- literal("network"),
4225
- literal("remote")
4226
- ]).readonly(),
4227
- "message": string().readonly()
4228
- }).readonly()
4229
- }), object({
4230
- "ok": literal(true).readonly(),
4231
- "value": object({
4232
- "requestRef": string().readonly(),
4233
- "phase": union([
4234
- literal("pending"),
4235
- literal("verifying"),
4236
- literal("sas-ready"),
4237
- literal("authorized"),
4238
- literal("cancelled"),
4239
- literal("rejected"),
4240
- literal("expired")
4241
- ]).readonly(),
4242
- "expiresAt": string().readonly(),
4243
- "sas": string().readonly().optional()
4244
- }).readonly()
4245
- })]);
4246
- const _awiki_dsh_plugin_awiki_beginDeviceJoin_result$schema = union([object({
4247
- "ok": literal(false).readonly(),
4248
- "error": object({
4249
- "code": union([
4250
- literal("not-registered"),
4251
- literal("signed-out"),
4252
- literal("already-registered"),
4253
- literal("invalid-request"),
4254
- literal("invalid-otp"),
4255
- literal("challenge-expired"),
4256
- literal("handle-unavailable"),
4257
- literal("not-found"),
4258
- literal("forbidden"),
4259
- literal("identity-recovery-required"),
4260
- literal("conflict"),
4261
- literal("rate-limited"),
4262
- literal("group-membership-required"),
4263
- literal("group-identity-stale"),
4264
- literal("attachment-too-large"),
4265
- literal("summary-unavailable"),
4266
- literal("summary-timeout"),
4267
- literal("summary-cancelled"),
4268
- literal("summary-invalid-output"),
4269
- literal("summary-failed"),
4270
- literal("delivery-unknown"),
4271
- literal("network"),
4272
- literal("remote")
4273
- ]).readonly(),
4274
- "message": string().readonly()
4275
- }).readonly()
4276
- }), object({
4277
- "ok": literal(true).readonly(),
4278
- "value": object({
4279
- "phase": union([
4280
- literal("pending"),
4281
- literal("verifying"),
4282
- literal("sas-ready"),
4283
- literal("authorized"),
4284
- literal("cancelled"),
4285
- literal("rejected"),
4286
- literal("expired")
4287
- ]).readonly(),
4288
- "expiresAt": string().readonly(),
4289
- "sas": string().readonly().optional(),
4290
- "completed": boolean().readonly()
4291
- }).readonly()
4292
- })]);
4293
- const _awiki_dsh_plugin_awiki_cancelDeviceJoin_result$schema = union([object({
4294
- "ok": literal(false).readonly(),
4295
- "error": object({
4296
- "code": union([
4297
- literal("not-registered"),
4298
- literal("signed-out"),
4299
- literal("already-registered"),
4300
- literal("invalid-request"),
4301
- literal("invalid-otp"),
4302
- literal("challenge-expired"),
4303
- literal("handle-unavailable"),
4304
- literal("not-found"),
4305
- literal("forbidden"),
4306
- literal("identity-recovery-required"),
4307
- literal("conflict"),
4308
- literal("rate-limited"),
4309
- literal("group-membership-required"),
4310
- literal("group-identity-stale"),
4311
- literal("attachment-too-large"),
4312
- literal("summary-unavailable"),
4313
- literal("summary-timeout"),
4314
- literal("summary-cancelled"),
4315
- literal("summary-invalid-output"),
4316
- literal("summary-failed"),
4317
- literal("delivery-unknown"),
4318
- literal("network"),
4319
- literal("remote")
4320
- ]).readonly(),
4321
- "message": string().readonly()
4322
- }).readonly()
4323
- }), object({
4324
- "ok": literal(true).readonly(),
4325
- "value": object({ "completed": literal(true).readonly() }).readonly()
4326
- })]);
4327
4198
  const _awiki_dsh_plugin_awiki_clearLocalData_parameter_0$schema = object({ "confirmation": string().readonly() });
4328
4199
  const _awiki_dsh_plugin_awiki_clearLocalData_result$schema = union([object({
4329
4200
  "ok": literal(false).readonly(),
@@ -4340,6 +4211,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4340
4211
  literal("forbidden"),
4341
4212
  literal("identity-recovery-required"),
4342
4213
  literal("conflict"),
4214
+ literal("state-in-use"),
4343
4215
  literal("rate-limited"),
4344
4216
  literal("group-membership-required"),
4345
4217
  literal("group-identity-stale"),
@@ -4378,6 +4250,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4378
4250
  literal("forbidden"),
4379
4251
  literal("identity-recovery-required"),
4380
4252
  literal("conflict"),
4253
+ literal("state-in-use"),
4381
4254
  literal("rate-limited"),
4382
4255
  literal("group-membership-required"),
4383
4256
  literal("group-identity-stale"),
@@ -4424,6 +4297,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4424
4297
  literal("forbidden"),
4425
4298
  literal("identity-recovery-required"),
4426
4299
  literal("conflict"),
4300
+ literal("state-in-use"),
4427
4301
  literal("rate-limited"),
4428
4302
  literal("group-membership-required"),
4429
4303
  literal("group-identity-stale"),
@@ -4458,6 +4332,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4458
4332
  literal("forbidden"),
4459
4333
  literal("identity-recovery-required"),
4460
4334
  literal("conflict"),
4335
+ literal("state-in-use"),
4461
4336
  literal("rate-limited"),
4462
4337
  literal("group-membership-required"),
4463
4338
  literal("group-identity-stale"),
@@ -4496,6 +4371,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4496
4371
  literal("forbidden"),
4497
4372
  literal("identity-recovery-required"),
4498
4373
  literal("conflict"),
4374
+ literal("state-in-use"),
4499
4375
  literal("rate-limited"),
4500
4376
  literal("group-membership-required"),
4501
4377
  literal("group-identity-stale"),
@@ -4524,7 +4400,11 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4524
4400
  "bytesBase64": string().readonly()
4525
4401
  }).readonly()
4526
4402
  })]);
4527
- const _awiki_dsh_plugin_awiki_getConfig_result$schema = union([object({
4403
+ const _awiki_dsh_plugin_awiki_downloadMailAttachment_parameter_0$schema = object({
4404
+ "localMessageId": intersection(string(), unknown()).readonly(),
4405
+ "attachmentIndex": number().readonly()
4406
+ });
4407
+ const _awiki_dsh_plugin_awiki_downloadMailAttachment_result$schema = union([object({
4528
4408
  "ok": literal(false).readonly(),
4529
4409
  "error": object({
4530
4410
  "code": union([
@@ -4539,6 +4419,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4539
4419
  literal("forbidden"),
4540
4420
  literal("identity-recovery-required"),
4541
4421
  literal("conflict"),
4422
+ literal("state-in-use"),
4542
4423
  literal("rate-limited"),
4543
4424
  literal("group-membership-required"),
4544
4425
  literal("group-identity-stale"),
@@ -4557,12 +4438,14 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4557
4438
  }), object({
4558
4439
  "ok": literal(true).readonly(),
4559
4440
  "value": object({
4560
- "pollIntervalMs": number().readonly(),
4561
- "attachmentMaxBytes": number().readonly(),
4562
- "handleRecoveryPhoneEnabled": boolean().readonly()
4441
+ "fileName": string().readonly(),
4442
+ "contentType": string().readonly(),
4443
+ "sizeBytes": number().readonly(),
4444
+ "sha256": string().readonly(),
4445
+ "bytesBase64": string().readonly()
4563
4446
  }).readonly()
4564
4447
  })]);
4565
- const _awiki_dsh_plugin_awiki_getConversationPreferences_result$schema = union([object({
4448
+ const _awiki_dsh_plugin_awiki_getConfig_result$schema = union([object({
4566
4449
  "ok": literal(false).readonly(),
4567
4450
  "error": object({
4568
4451
  "code": union([
@@ -4577,6 +4460,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4577
4460
  literal("forbidden"),
4578
4461
  literal("identity-recovery-required"),
4579
4462
  literal("conflict"),
4463
+ literal("state-in-use"),
4580
4464
  literal("rate-limited"),
4581
4465
  literal("group-membership-required"),
4582
4466
  literal("group-identity-stale"),
@@ -4594,30 +4478,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4594
4478
  }).readonly()
4595
4479
  }), object({
4596
4480
  "ok": literal(true).readonly(),
4597
- "value": object({ "hiddenConversations": array(object({
4598
- "conversation": union([object({
4599
- "kind": literal("group").readonly(),
4600
- "id": intersection(string(), unknown()).readonly(),
4601
- "groupDid": intersection(string(), unknown()).readonly(),
4602
- "title": string().readonly(),
4603
- "unreadCount": number().readonly().optional(),
4604
- "lastMessageAt": number().readonly().optional(),
4605
- "lastMessagePreview": string().readonly().optional()
4606
- }), object({
4607
- "kind": literal("direct").readonly(),
4608
- "id": intersection(string(), unknown()).readonly(),
4609
- "peerDid": intersection(string(), unknown()).readonly(),
4610
- "peerHandle": intersection(string(), unknown()).readonly().optional(),
4611
- "displayName": string().readonly().optional(),
4612
- "title": string().readonly(),
4613
- "unreadCount": number().readonly().optional(),
4614
- "lastMessageAt": number().readonly().optional(),
4615
- "lastMessagePreview": string().readonly().optional()
4616
- })]).readonly(),
4617
- "hiddenAt": number().readonly()
4618
- })).readonly() }).readonly()
4481
+ "value": object({
4482
+ "tenantDomain": string().readonly(),
4483
+ "pollIntervalMs": number().readonly(),
4484
+ "attachmentMaxBytes": number().readonly(),
4485
+ "mailAttachmentMaxCount": number().readonly(),
4486
+ "mailAttachmentMaxBytes": number().readonly(),
4487
+ "mailAttachmentTotalMaxBytes": number().readonly(),
4488
+ "profileName": string().readonly().optional(),
4489
+ "legacySharedStateDetected": boolean().readonly().optional()
4490
+ }).readonly()
4619
4491
  })]);
4620
- const _awiki_dsh_plugin_awiki_getDeviceJoinStatus_result$schema = union([object({
4492
+ const _awiki_dsh_plugin_awiki_getConversationPreferences_result$schema = union([object({
4621
4493
  "ok": literal(false).readonly(),
4622
4494
  "error": object({
4623
4495
  "code": union([
@@ -4632,6 +4504,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4632
4504
  literal("forbidden"),
4633
4505
  literal("identity-recovery-required"),
4634
4506
  literal("conflict"),
4507
+ literal("state-in-use"),
4635
4508
  literal("rate-limited"),
4636
4509
  literal("group-membership-required"),
4637
4510
  literal("group-identity-stale"),
@@ -4649,20 +4522,31 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4649
4522
  }).readonly()
4650
4523
  }), object({
4651
4524
  "ok": literal(true).readonly(),
4652
- "value": union([literal(null), object({
4653
- "phase": union([
4654
- literal("pending"),
4655
- literal("verifying"),
4656
- literal("sas-ready"),
4657
- literal("authorized"),
4658
- literal("cancelled"),
4659
- literal("rejected"),
4660
- literal("expired")
4661
- ]).readonly(),
4662
- "expiresAt": string().readonly(),
4663
- "sas": string().readonly().optional(),
4664
- "completed": boolean().readonly()
4665
- })]).readonly()
4525
+ "value": object({
4526
+ "hiddenConversations": array(object({
4527
+ "conversation": union([object({
4528
+ "kind": literal("group").readonly(),
4529
+ "id": intersection(string(), unknown()).readonly(),
4530
+ "groupDid": intersection(string(), unknown()).readonly(),
4531
+ "title": string().readonly(),
4532
+ "unreadCount": number().readonly().optional(),
4533
+ "lastMessageAt": number().readonly().optional(),
4534
+ "lastMessagePreview": string().readonly().optional()
4535
+ }), object({
4536
+ "kind": literal("direct").readonly(),
4537
+ "id": intersection(string(), unknown()).readonly(),
4538
+ "peerDid": intersection(string(), unknown()).readonly(),
4539
+ "peerHandle": intersection(string(), unknown()).readonly().optional(),
4540
+ "displayName": string().readonly().optional(),
4541
+ "title": string().readonly(),
4542
+ "unreadCount": number().readonly().optional(),
4543
+ "lastMessageAt": number().readonly().optional(),
4544
+ "lastMessagePreview": string().readonly().optional()
4545
+ })]).readonly(),
4546
+ "hiddenAt": number().readonly()
4547
+ })).readonly(),
4548
+ "dismissedGroupRecoverySignature": string().readonly().optional()
4549
+ }).readonly()
4666
4550
  })]);
4667
4551
  const _awiki_dsh_plugin_awiki_getGroup_parameter_0$schema = object({ "groupDid": intersection(string(), unknown()).readonly() });
4668
4552
  const _awiki_dsh_plugin_awiki_getGroup_result$schema = union([object({
@@ -4680,6 +4564,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4680
4564
  literal("forbidden"),
4681
4565
  literal("identity-recovery-required"),
4682
4566
  literal("conflict"),
4567
+ literal("state-in-use"),
4683
4568
  literal("rate-limited"),
4684
4569
  literal("group-membership-required"),
4685
4570
  literal("group-identity-stale"),
@@ -4727,6 +4612,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4727
4612
  literal("forbidden"),
4728
4613
  literal("identity-recovery-required"),
4729
4614
  literal("conflict"),
4615
+ literal("state-in-use"),
4730
4616
  literal("rate-limited"),
4731
4617
  literal("group-membership-required"),
4732
4618
  literal("group-identity-stale"),
@@ -4795,6 +4681,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4795
4681
  literal("forbidden"),
4796
4682
  literal("identity-recovery-required"),
4797
4683
  literal("conflict"),
4684
+ literal("state-in-use"),
4798
4685
  literal("rate-limited"),
4799
4686
  literal("group-membership-required"),
4800
4687
  literal("group-identity-stale"),
@@ -4839,6 +4726,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4839
4726
  literal("forbidden"),
4840
4727
  literal("identity-recovery-required"),
4841
4728
  literal("conflict"),
4729
+ literal("state-in-use"),
4842
4730
  literal("rate-limited"),
4843
4731
  literal("group-membership-required"),
4844
4732
  literal("group-identity-stale"),
@@ -4907,6 +4795,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4907
4795
  literal("forbidden"),
4908
4796
  literal("identity-recovery-required"),
4909
4797
  literal("conflict"),
4798
+ literal("state-in-use"),
4910
4799
  literal("rate-limited"),
4911
4800
  literal("group-membership-required"),
4912
4801
  literal("group-identity-stale"),
@@ -4945,6 +4834,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4945
4834
  literal("forbidden"),
4946
4835
  literal("identity-recovery-required"),
4947
4836
  literal("conflict"),
4837
+ literal("state-in-use"),
4948
4838
  literal("rate-limited"),
4949
4839
  literal("group-membership-required"),
4950
4840
  literal("group-identity-stale"),
@@ -4987,6 +4877,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4987
4877
  literal("forbidden"),
4988
4878
  literal("identity-recovery-required"),
4989
4879
  literal("conflict"),
4880
+ literal("state-in-use"),
4990
4881
  literal("rate-limited"),
4991
4882
  literal("group-membership-required"),
4992
4883
  literal("group-identity-stale"),
@@ -5021,7 +4912,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5021
4912
  "failureCode": string().readonly().optional(),
5022
4913
  "retryable": boolean().readonly(),
5023
4914
  "localOrdinaryDataWillMigrate": boolean().readonly(),
5024
- "otherDevicesMustRejoin": boolean().readonly()
4915
+ "otherDevicesMustRejoin": boolean().readonly(),
4916
+ "unsupportedE2eeGroupCount": number().readonly(),
4917
+ "unsupportedDidOnlyGroupCount": number().readonly()
5025
4918
  }).readonly()
5026
4919
  })]);
5027
4920
  const _awiki_dsh_plugin_awiki_getSession_result$schema = union([object({
@@ -5039,6 +4932,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5039
4932
  literal("forbidden"),
5040
4933
  literal("identity-recovery-required"),
5041
4934
  literal("conflict"),
4935
+ literal("state-in-use"),
5042
4936
  literal("rate-limited"),
5043
4937
  literal("group-membership-required"),
5044
4938
  literal("group-identity-stale"),
@@ -5086,6 +4980,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5086
4980
  literal("forbidden"),
5087
4981
  literal("identity-recovery-required"),
5088
4982
  literal("conflict"),
4983
+ literal("state-in-use"),
5089
4984
  literal("rate-limited"),
5090
4985
  literal("group-membership-required"),
5091
4986
  literal("group-identity-stale"),
@@ -5124,6 +5019,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5124
5019
  literal("forbidden"),
5125
5020
  literal("identity-recovery-required"),
5126
5021
  literal("conflict"),
5022
+ literal("state-in-use"),
5127
5023
  literal("rate-limited"),
5128
5024
  literal("group-membership-required"),
5129
5025
  literal("group-identity-stale"),
@@ -5167,6 +5063,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5167
5063
  literal("forbidden"),
5168
5064
  literal("identity-recovery-required"),
5169
5065
  literal("conflict"),
5066
+ literal("state-in-use"),
5170
5067
  literal("rate-limited"),
5171
5068
  literal("group-membership-required"),
5172
5069
  literal("group-identity-stale"),
@@ -5205,6 +5102,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5205
5102
  literal("forbidden"),
5206
5103
  literal("identity-recovery-required"),
5207
5104
  literal("conflict"),
5105
+ literal("state-in-use"),
5208
5106
  literal("rate-limited"),
5209
5107
  literal("group-membership-required"),
5210
5108
  literal("group-identity-stale"),
@@ -5266,6 +5164,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5266
5164
  literal("forbidden"),
5267
5165
  literal("identity-recovery-required"),
5268
5166
  literal("conflict"),
5167
+ literal("state-in-use"),
5269
5168
  literal("rate-limited"),
5270
5169
  literal("group-membership-required"),
5271
5170
  literal("group-identity-stale"),
@@ -5325,6 +5224,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5325
5224
  literal("forbidden"),
5326
5225
  literal("identity-recovery-required"),
5327
5226
  literal("conflict"),
5227
+ literal("state-in-use"),
5328
5228
  literal("rate-limited"),
5329
5229
  literal("group-membership-required"),
5330
5230
  literal("group-identity-stale"),
@@ -5378,6 +5278,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5378
5278
  literal("forbidden"),
5379
5279
  literal("identity-recovery-required"),
5380
5280
  literal("conflict"),
5281
+ literal("state-in-use"),
5381
5282
  literal("rate-limited"),
5382
5283
  literal("group-membership-required"),
5383
5284
  literal("group-identity-stale"),
@@ -5425,6 +5326,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5425
5326
  literal("forbidden"),
5426
5327
  literal("identity-recovery-required"),
5427
5328
  literal("conflict"),
5329
+ literal("state-in-use"),
5428
5330
  literal("rate-limited"),
5429
5331
  literal("group-membership-required"),
5430
5332
  literal("group-identity-stale"),
@@ -5472,6 +5374,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5472
5374
  literal("forbidden"),
5473
5375
  literal("identity-recovery-required"),
5474
5376
  literal("conflict"),
5377
+ literal("state-in-use"),
5475
5378
  literal("rate-limited"),
5476
5379
  literal("group-membership-required"),
5477
5380
  literal("group-identity-stale"),
@@ -5507,6 +5410,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5507
5410
  literal("forbidden"),
5508
5411
  literal("identity-recovery-required"),
5509
5412
  literal("conflict"),
5413
+ literal("state-in-use"),
5510
5414
  literal("rate-limited"),
5511
5415
  literal("group-membership-required"),
5512
5416
  literal("group-identity-stale"),
@@ -5546,6 +5450,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5546
5450
  literal("forbidden"),
5547
5451
  literal("identity-recovery-required"),
5548
5452
  literal("conflict"),
5453
+ literal("state-in-use"),
5549
5454
  literal("rate-limited"),
5550
5455
  literal("group-membership-required"),
5551
5456
  literal("group-identity-stale"),
@@ -5580,7 +5485,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5580
5485
  "failureCode": string().readonly().optional(),
5581
5486
  "retryable": boolean().readonly(),
5582
5487
  "localOrdinaryDataWillMigrate": boolean().readonly(),
5583
- "otherDevicesMustRejoin": boolean().readonly()
5488
+ "otherDevicesMustRejoin": boolean().readonly(),
5489
+ "unsupportedE2eeGroupCount": number().readonly(),
5490
+ "unsupportedDidOnlyGroupCount": number().readonly()
5584
5491
  }).readonly()
5585
5492
  })]);
5586
5493
  const _awiki_dsh_plugin_awiki_readMail_parameter_0$schema = object({ "messageId": intersection(string(), unknown()).readonly() });
@@ -5599,6 +5506,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5599
5506
  literal("forbidden"),
5600
5507
  literal("identity-recovery-required"),
5601
5508
  literal("conflict"),
5509
+ literal("state-in-use"),
5602
5510
  literal("rate-limited"),
5603
5511
  literal("group-membership-required"),
5604
5512
  literal("group-identity-stale"),
@@ -5644,74 +5552,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5644
5552
  })).readonly()
5645
5553
  }).readonly()
5646
5554
  })]);
5647
- const _awiki_dsh_plugin_awiki_refreshDeviceManagement_result$schema = union([object({
5648
- "ok": literal(false).readonly(),
5649
- "error": object({
5650
- "code": union([
5651
- literal("not-registered"),
5652
- literal("signed-out"),
5653
- literal("already-registered"),
5654
- literal("invalid-request"),
5655
- literal("invalid-otp"),
5656
- literal("challenge-expired"),
5657
- literal("handle-unavailable"),
5658
- literal("not-found"),
5659
- literal("forbidden"),
5660
- literal("identity-recovery-required"),
5661
- literal("conflict"),
5662
- literal("rate-limited"),
5663
- literal("group-membership-required"),
5664
- literal("group-identity-stale"),
5665
- literal("attachment-too-large"),
5666
- literal("summary-unavailable"),
5667
- literal("summary-timeout"),
5668
- literal("summary-cancelled"),
5669
- literal("summary-invalid-output"),
5670
- literal("summary-failed"),
5671
- literal("delivery-unknown"),
5672
- literal("network"),
5673
- literal("remote")
5674
- ]).readonly(),
5675
- "message": string().readonly()
5676
- }).readonly()
5677
- }), object({
5678
- "ok": literal(true).readonly(),
5679
- "value": object({
5680
- "canManage": boolean().readonly(),
5681
- "role": union([literal("member"), literal("admin")]).readonly().optional(),
5682
- "readiness": union([
5683
- literal("legacy"),
5684
- literal("member_ready"),
5685
- literal("admin_awaiting_root"),
5686
- literal("admin_ready"),
5687
- literal("blocked")
5688
- ]).readonly(),
5689
- "devices": array(object({
5690
- "deviceRef": string().readonly(),
5691
- "status": union([literal("active"), literal("revoked")]).readonly(),
5692
- "role": union([literal("member"), literal("admin")]).readonly(),
5693
- "managementReady": boolean().readonly(),
5694
- "isCurrent": boolean().readonly()
5695
- })).readonly(),
5696
- "requests": array(object({
5697
- "requestRef": string().readonly(),
5698
- "candidateKeyFingerprint": string().readonly(),
5699
- "issuedAt": string().readonly(),
5700
- "expiresAt": string().readonly(),
5701
- "state": union([
5702
- literal("pending"),
5703
- literal("verifying"),
5704
- literal("sas-ready"),
5705
- literal("authorized"),
5706
- literal("cancelled"),
5707
- literal("rejected"),
5708
- literal("expired")
5709
- ]).readonly(),
5710
- "claimedByCurrentDevice": boolean().readonly(),
5711
- "canStartVerification": boolean().readonly()
5712
- })).readonly()
5713
- }).readonly()
5714
- })]);
5715
5555
  const _awiki_dsh_plugin_awiki_registerIdentity_parameter_0$schema = object({
5716
5556
  "handle": string().readonly(),
5717
5557
  "phone": string().readonly(),
@@ -5732,6 +5572,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5732
5572
  literal("forbidden"),
5733
5573
  literal("identity-recovery-required"),
5734
5574
  literal("conflict"),
5575
+ literal("state-in-use"),
5735
5576
  literal("rate-limited"),
5736
5577
  literal("group-membership-required"),
5737
5578
  literal("group-identity-stale"),
@@ -5749,26 +5590,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5749
5590
  }).readonly()
5750
5591
  }), object({
5751
5592
  "ok": literal(true).readonly(),
5752
- "value": union([object({
5753
- "status": literal("registered").readonly(),
5754
- "identity": object({
5755
- "handle": intersection(string(), unknown()).readonly(),
5756
- "did": intersection(string(), unknown()).readonly(),
5757
- "displayName": string().readonly().optional(),
5758
- "registeredAt": number().readonly()
5759
- }).readonly()
5760
- }), object({
5761
- "status": literal("join-required").readonly(),
5762
- "fullHandle": intersection(string(), unknown()).readonly(),
5763
- "mode": union([literal("ordinary"), literal("handle-recovery-rebind")]).readonly(),
5764
- "requiresUserPresence": boolean().readonly()
5765
- })]).readonly()
5593
+ "value": object({
5594
+ "handle": intersection(string(), unknown()).readonly(),
5595
+ "did": intersection(string(), unknown()).readonly(),
5596
+ "displayName": string().readonly().optional(),
5597
+ "registeredAt": number().readonly()
5598
+ }).readonly()
5766
5599
  })]);
5767
- const _awiki_dsh_plugin_awiki_rejectDeviceJoin_parameter_0$schema = object({
5768
- "reason": union([literal("user_rejected"), literal("sas_mismatch")]).readonly(),
5769
- "requestRef": string().readonly()
5600
+ const _awiki_dsh_plugin_awiki_removeGroupMember_parameter_0$schema = object({
5601
+ "member": string().readonly(),
5602
+ "groupDid": intersection(string(), unknown()).readonly()
5770
5603
  });
5771
- const _awiki_dsh_plugin_awiki_rejectDeviceJoin_result$schema = union([object({
5604
+ const _awiki_dsh_plugin_awiki_removeGroupMember_result$schema = union([object({
5772
5605
  "ok": literal(false).readonly(),
5773
5606
  "error": object({
5774
5607
  "code": union([
@@ -5783,6 +5616,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5783
5616
  literal("forbidden"),
5784
5617
  literal("identity-recovery-required"),
5785
5618
  literal("conflict"),
5619
+ literal("state-in-use"),
5786
5620
  literal("rate-limited"),
5787
5621
  literal("group-membership-required"),
5788
5622
  literal("group-identity-stale"),
@@ -5801,25 +5635,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5801
5635
  }), object({
5802
5636
  "ok": literal(true).readonly(),
5803
5637
  "value": object({
5804
- "requestRef": string().readonly(),
5805
- "phase": union([
5806
- literal("pending"),
5807
- literal("verifying"),
5808
- literal("sas-ready"),
5809
- literal("authorized"),
5810
- literal("cancelled"),
5811
- literal("rejected"),
5812
- literal("expired")
5813
- ]).readonly(),
5814
- "expiresAt": string().readonly(),
5815
- "sas": string().readonly().optional()
5638
+ "did": intersection(string(), unknown()).readonly(),
5639
+ "handle": intersection(string(), unknown()).readonly().optional()
5816
5640
  }).readonly()
5817
5641
  })]);
5818
- const _awiki_dsh_plugin_awiki_removeGroupMember_parameter_0$schema = object({
5819
- "member": string().readonly(),
5820
- "groupDid": intersection(string(), unknown()).readonly()
5821
- });
5822
- const _awiki_dsh_plugin_awiki_removeGroupMember_result$schema = union([object({
5642
+ const _awiki_dsh_plugin_awiki_resolvePeer_parameter_0$schema = object({ "peer": string().readonly() });
5643
+ const _awiki_dsh_plugin_awiki_resolvePeer_result$schema = union([object({
5823
5644
  "ok": literal(false).readonly(),
5824
5645
  "error": object({
5825
5646
  "code": union([
@@ -5834,6 +5655,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5834
5655
  literal("forbidden"),
5835
5656
  literal("identity-recovery-required"),
5836
5657
  literal("conflict"),
5658
+ literal("state-in-use"),
5837
5659
  literal("rate-limited"),
5838
5660
  literal("group-membership-required"),
5839
5661
  literal("group-identity-stale"),
@@ -5853,11 +5675,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5853
5675
  "ok": literal(true).readonly(),
5854
5676
  "value": object({
5855
5677
  "did": intersection(string(), unknown()).readonly(),
5856
- "handle": intersection(string(), unknown()).readonly().optional()
5678
+ "handle": intersection(string(), unknown()).readonly().optional(),
5679
+ "displayName": string().readonly().optional(),
5680
+ "conversationId": intersection(string(), unknown()).readonly()
5857
5681
  }).readonly()
5858
5682
  })]);
5859
- const _awiki_dsh_plugin_awiki_resolvePeer_parameter_0$schema = object({ "peer": string().readonly() });
5860
- const _awiki_dsh_plugin_awiki_resolvePeer_result$schema = union([object({
5683
+ const _awiki_dsh_plugin_awiki_resumeGroupRebindRecovery_result$schema = union([object({
5861
5684
  "ok": literal(false).readonly(),
5862
5685
  "error": object({
5863
5686
  "code": union([
@@ -5872,6 +5695,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5872
5695
  literal("forbidden"),
5873
5696
  literal("identity-recovery-required"),
5874
5697
  literal("conflict"),
5698
+ literal("state-in-use"),
5875
5699
  literal("rate-limited"),
5876
5700
  literal("group-membership-required"),
5877
5701
  literal("group-identity-stale"),
@@ -5890,10 +5714,14 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5890
5714
  }), object({
5891
5715
  "ok": literal(true).readonly(),
5892
5716
  "value": object({
5893
- "did": intersection(string(), unknown()).readonly(),
5894
- "handle": intersection(string(), unknown()).readonly().optional(),
5895
- "displayName": string().readonly().optional(),
5896
- "conversationId": intersection(string(), unknown()).readonly()
5717
+ "processed": number().readonly(),
5718
+ "completed": number().readonly(),
5719
+ "pending": number().readonly(),
5720
+ "blocked": number().readonly(),
5721
+ "items": array(object({
5722
+ "groupDid": intersection(string(), unknown()).readonly(),
5723
+ "status": union([literal("pending"), literal("blocked")]).readonly()
5724
+ })).readonly()
5897
5725
  }).readonly()
5898
5726
  })]);
5899
5727
  const _awiki_dsh_plugin_awiki_resumeRecovery_parameter_0$schema = object({ "operationId": string().readonly() });
@@ -5912,6 +5740,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5912
5740
  literal("forbidden"),
5913
5741
  literal("identity-recovery-required"),
5914
5742
  literal("conflict"),
5743
+ literal("state-in-use"),
5915
5744
  literal("rate-limited"),
5916
5745
  literal("group-membership-required"),
5917
5746
  literal("group-identity-stale"),
@@ -5946,79 +5775,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5946
5775
  "failureCode": string().readonly().optional(),
5947
5776
  "retryable": boolean().readonly(),
5948
5777
  "localOrdinaryDataWillMigrate": boolean().readonly(),
5949
- "otherDevicesMustRejoin": boolean().readonly()
5950
- }).readonly()
5951
- })]);
5952
- const _awiki_dsh_plugin_awiki_revokeDevice_parameter_0$schema = object({
5953
- "deviceRef": string().readonly(),
5954
- "confirmation": string().readonly()
5955
- });
5956
- const _awiki_dsh_plugin_awiki_revokeDevice_result$schema = union([object({
5957
- "ok": literal(false).readonly(),
5958
- "error": object({
5959
- "code": union([
5960
- literal("not-registered"),
5961
- literal("signed-out"),
5962
- literal("already-registered"),
5963
- literal("invalid-request"),
5964
- literal("invalid-otp"),
5965
- literal("challenge-expired"),
5966
- literal("handle-unavailable"),
5967
- literal("not-found"),
5968
- literal("forbidden"),
5969
- literal("identity-recovery-required"),
5970
- literal("conflict"),
5971
- literal("rate-limited"),
5972
- literal("group-membership-required"),
5973
- literal("group-identity-stale"),
5974
- literal("attachment-too-large"),
5975
- literal("summary-unavailable"),
5976
- literal("summary-timeout"),
5977
- literal("summary-cancelled"),
5978
- literal("summary-invalid-output"),
5979
- literal("summary-failed"),
5980
- literal("delivery-unknown"),
5981
- literal("network"),
5982
- literal("remote")
5983
- ]).readonly(),
5984
- "message": string().readonly()
5985
- }).readonly()
5986
- }), object({
5987
- "ok": literal(true).readonly(),
5988
- "value": object({
5989
- "canManage": boolean().readonly(),
5990
- "role": union([literal("member"), literal("admin")]).readonly().optional(),
5991
- "readiness": union([
5992
- literal("legacy"),
5993
- literal("member_ready"),
5994
- literal("admin_awaiting_root"),
5995
- literal("admin_ready"),
5996
- literal("blocked")
5997
- ]).readonly(),
5998
- "devices": array(object({
5999
- "deviceRef": string().readonly(),
6000
- "status": union([literal("active"), literal("revoked")]).readonly(),
6001
- "role": union([literal("member"), literal("admin")]).readonly(),
6002
- "managementReady": boolean().readonly(),
6003
- "isCurrent": boolean().readonly()
6004
- })).readonly(),
6005
- "requests": array(object({
6006
- "requestRef": string().readonly(),
6007
- "candidateKeyFingerprint": string().readonly(),
6008
- "issuedAt": string().readonly(),
6009
- "expiresAt": string().readonly(),
6010
- "state": union([
6011
- literal("pending"),
6012
- literal("verifying"),
6013
- literal("sas-ready"),
6014
- literal("authorized"),
6015
- literal("cancelled"),
6016
- literal("rejected"),
6017
- literal("expired")
6018
- ]).readonly(),
6019
- "claimedByCurrentDevice": boolean().readonly(),
6020
- "canStartVerification": boolean().readonly()
6021
- })).readonly()
5778
+ "otherDevicesMustRejoin": boolean().readonly(),
5779
+ "unsupportedE2eeGroupCount": number().readonly(),
5780
+ "unsupportedDidOnlyGroupCount": number().readonly()
6022
5781
  }).readonly()
6023
5782
  })]);
6024
5783
  const _awiki_dsh_plugin_awiki_sendAttachment_parameter_0$schema = object({
@@ -6050,6 +5809,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6050
5809
  literal("forbidden"),
6051
5810
  literal("identity-recovery-required"),
6052
5811
  literal("conflict"),
5812
+ literal("state-in-use"),
6053
5813
  literal("rate-limited"),
6054
5814
  literal("group-membership-required"),
6055
5815
  literal("group-identity-stale"),
@@ -6103,7 +5863,13 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6103
5863
  "to": array(string()).readonly(),
6104
5864
  "cc": array(string()).readonly().optional(),
6105
5865
  "subject": string().readonly(),
6106
- "bodyText": string().readonly()
5866
+ "bodyText": string().readonly(),
5867
+ "attachments": array(object({
5868
+ "fileName": string().readonly(),
5869
+ "contentType": string().readonly(),
5870
+ "sizeBytes": number().readonly(),
5871
+ "bytesBase64": string().readonly()
5872
+ })).readonly().optional()
6107
5873
  });
6108
5874
  const _awiki_dsh_plugin_awiki_sendMail_result$schema = union([object({
6109
5875
  "ok": literal(false).readonly(),
@@ -6120,6 +5886,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6120
5886
  literal("forbidden"),
6121
5887
  literal("identity-recovery-required"),
6122
5888
  literal("conflict"),
5889
+ literal("state-in-use"),
6123
5890
  literal("rate-limited"),
6124
5891
  literal("group-membership-required"),
6125
5892
  literal("group-identity-stale"),
@@ -6162,6 +5929,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6162
5929
  literal("forbidden"),
6163
5930
  literal("identity-recovery-required"),
6164
5931
  literal("conflict"),
5932
+ literal("state-in-use"),
6165
5933
  literal("rate-limited"),
6166
5934
  literal("group-membership-required"),
6167
5935
  literal("group-identity-stale"),
@@ -6205,6 +5973,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6205
5973
  literal("forbidden"),
6206
5974
  literal("identity-recovery-required"),
6207
5975
  literal("conflict"),
5976
+ literal("state-in-use"),
6208
5977
  literal("rate-limited"),
6209
5978
  literal("group-membership-required"),
6210
5979
  literal("group-identity-stale"),
@@ -6260,6 +6029,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6260
6029
  literal("forbidden"),
6261
6030
  literal("identity-recovery-required"),
6262
6031
  literal("conflict"),
6032
+ literal("state-in-use"),
6263
6033
  literal("rate-limited"),
6264
6034
  literal("group-membership-required"),
6265
6035
  literal("group-identity-stale"),
@@ -6309,54 +6079,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6309
6079
  })]).readonly()
6310
6080
  }).readonly()
6311
6081
  })]);
6312
- const _awiki_dsh_plugin_awiki_startDeviceJoinVerification_parameter_0$schema = object({ "requestRef": string().readonly() });
6313
- const _awiki_dsh_plugin_awiki_startDeviceJoinVerification_result$schema = union([object({
6314
- "ok": literal(false).readonly(),
6315
- "error": object({
6316
- "code": union([
6317
- literal("not-registered"),
6318
- literal("signed-out"),
6319
- literal("already-registered"),
6320
- literal("invalid-request"),
6321
- literal("invalid-otp"),
6322
- literal("challenge-expired"),
6323
- literal("handle-unavailable"),
6324
- literal("not-found"),
6325
- literal("forbidden"),
6326
- literal("identity-recovery-required"),
6327
- literal("conflict"),
6328
- literal("rate-limited"),
6329
- literal("group-membership-required"),
6330
- literal("group-identity-stale"),
6331
- literal("attachment-too-large"),
6332
- literal("summary-unavailable"),
6333
- literal("summary-timeout"),
6334
- literal("summary-cancelled"),
6335
- literal("summary-invalid-output"),
6336
- literal("summary-failed"),
6337
- literal("delivery-unknown"),
6338
- literal("network"),
6339
- literal("remote")
6340
- ]).readonly(),
6341
- "message": string().readonly()
6342
- }).readonly()
6343
- }), object({
6344
- "ok": literal(true).readonly(),
6345
- "value": object({
6346
- "requestRef": string().readonly(),
6347
- "phase": union([
6348
- literal("pending"),
6349
- literal("verifying"),
6350
- literal("sas-ready"),
6351
- literal("authorized"),
6352
- literal("cancelled"),
6353
- literal("rejected"),
6354
- literal("expired")
6355
- ]).readonly(),
6356
- "expiresAt": string().readonly(),
6357
- "sas": string().readonly().optional()
6358
- }).readonly()
6359
- })]);
6360
6082
  const _awiki_dsh_plugin_awiki_summarizeConversation_parameter_0$schema = object({
6361
6083
  "conversationId": intersection(string(), unknown()).readonly(),
6362
6084
  "unreadCountAtOpen": number().readonly().optional()
@@ -6376,6 +6098,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6376
6098
  literal("forbidden"),
6377
6099
  literal("identity-recovery-required"),
6378
6100
  literal("conflict"),
6101
+ literal("state-in-use"),
6379
6102
  literal("rate-limited"),
6380
6103
  literal("group-membership-required"),
6381
6104
  literal("group-identity-stale"),
@@ -6411,31 +6134,38 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6411
6134
  })).readonly()
6412
6135
  }).readonly()
6413
6136
  })]);
6414
- const _awiki_dsh_plugin_awiki_updateConversationPreference_parameter_0$schema = union([object({
6415
- "action": literal("hide").readonly(),
6416
- "conversation": union([object({
6417
- "kind": literal("group").readonly(),
6418
- "id": intersection(string(), unknown()).readonly(),
6419
- "groupDid": intersection(string(), unknown()).readonly(),
6420
- "title": string().readonly(),
6421
- "unreadCount": number().readonly().optional(),
6422
- "lastMessageAt": number().readonly().optional(),
6423
- "lastMessagePreview": string().readonly().optional()
6424
- }), object({
6425
- "kind": literal("direct").readonly(),
6426
- "id": intersection(string(), unknown()).readonly(),
6427
- "peerDid": intersection(string(), unknown()).readonly(),
6428
- "peerHandle": intersection(string(), unknown()).readonly().optional(),
6429
- "displayName": string().readonly().optional(),
6430
- "title": string().readonly(),
6431
- "unreadCount": number().readonly().optional(),
6432
- "lastMessageAt": number().readonly().optional(),
6433
- "lastMessagePreview": string().readonly().optional()
6434
- })]).readonly()
6435
- }), object({
6436
- "action": literal("restore").readonly(),
6437
- "conversationId": intersection(string(), unknown()).readonly()
6438
- })]);
6137
+ const _awiki_dsh_plugin_awiki_updateConversationPreference_parameter_0$schema = union([
6138
+ object({
6139
+ "action": literal("hide").readonly(),
6140
+ "conversation": union([object({
6141
+ "kind": literal("group").readonly(),
6142
+ "id": intersection(string(), unknown()).readonly(),
6143
+ "groupDid": intersection(string(), unknown()).readonly(),
6144
+ "title": string().readonly(),
6145
+ "unreadCount": number().readonly().optional(),
6146
+ "lastMessageAt": number().readonly().optional(),
6147
+ "lastMessagePreview": string().readonly().optional()
6148
+ }), object({
6149
+ "kind": literal("direct").readonly(),
6150
+ "id": intersection(string(), unknown()).readonly(),
6151
+ "peerDid": intersection(string(), unknown()).readonly(),
6152
+ "peerHandle": intersection(string(), unknown()).readonly().optional(),
6153
+ "displayName": string().readonly().optional(),
6154
+ "title": string().readonly(),
6155
+ "unreadCount": number().readonly().optional(),
6156
+ "lastMessageAt": number().readonly().optional(),
6157
+ "lastMessagePreview": string().readonly().optional()
6158
+ })]).readonly()
6159
+ }),
6160
+ object({
6161
+ "action": literal("restore").readonly(),
6162
+ "conversationId": intersection(string(), unknown()).readonly()
6163
+ }),
6164
+ object({
6165
+ "action": literal("dismiss-group-recovery").readonly(),
6166
+ "signature": string().readonly()
6167
+ })
6168
+ ]);
6439
6169
  const _awiki_dsh_plugin_awiki_updateConversationPreference_result$schema = union([object({
6440
6170
  "ok": literal(false).readonly(),
6441
6171
  "error": object({
@@ -6451,6 +6181,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6451
6181
  literal("forbidden"),
6452
6182
  literal("identity-recovery-required"),
6453
6183
  literal("conflict"),
6184
+ literal("state-in-use"),
6454
6185
  literal("rate-limited"),
6455
6186
  literal("group-membership-required"),
6456
6187
  literal("group-identity-stale"),
@@ -6468,28 +6199,31 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6468
6199
  }).readonly()
6469
6200
  }), object({
6470
6201
  "ok": literal(true).readonly(),
6471
- "value": object({ "hiddenConversations": array(object({
6472
- "conversation": union([object({
6473
- "kind": literal("group").readonly(),
6474
- "id": intersection(string(), unknown()).readonly(),
6475
- "groupDid": intersection(string(), unknown()).readonly(),
6476
- "title": string().readonly(),
6477
- "unreadCount": number().readonly().optional(),
6478
- "lastMessageAt": number().readonly().optional(),
6479
- "lastMessagePreview": string().readonly().optional()
6480
- }), object({
6481
- "kind": literal("direct").readonly(),
6482
- "id": intersection(string(), unknown()).readonly(),
6483
- "peerDid": intersection(string(), unknown()).readonly(),
6484
- "peerHandle": intersection(string(), unknown()).readonly().optional(),
6485
- "displayName": string().readonly().optional(),
6486
- "title": string().readonly(),
6487
- "unreadCount": number().readonly().optional(),
6488
- "lastMessageAt": number().readonly().optional(),
6489
- "lastMessagePreview": string().readonly().optional()
6490
- })]).readonly(),
6491
- "hiddenAt": number().readonly()
6492
- })).readonly() }).readonly()
6202
+ "value": object({
6203
+ "hiddenConversations": array(object({
6204
+ "conversation": union([object({
6205
+ "kind": literal("group").readonly(),
6206
+ "id": intersection(string(), unknown()).readonly(),
6207
+ "groupDid": intersection(string(), unknown()).readonly(),
6208
+ "title": string().readonly(),
6209
+ "unreadCount": number().readonly().optional(),
6210
+ "lastMessageAt": number().readonly().optional(),
6211
+ "lastMessagePreview": string().readonly().optional()
6212
+ }), object({
6213
+ "kind": literal("direct").readonly(),
6214
+ "id": intersection(string(), unknown()).readonly(),
6215
+ "peerDid": intersection(string(), unknown()).readonly(),
6216
+ "peerHandle": intersection(string(), unknown()).readonly().optional(),
6217
+ "displayName": string().readonly().optional(),
6218
+ "title": string().readonly(),
6219
+ "unreadCount": number().readonly().optional(),
6220
+ "lastMessageAt": number().readonly().optional(),
6221
+ "lastMessagePreview": string().readonly().optional()
6222
+ })]).readonly(),
6223
+ "hiddenAt": number().readonly()
6224
+ })).readonly(),
6225
+ "dismissedGroupRecoverySignature": string().readonly().optional()
6226
+ }).readonly()
6493
6227
  })]);
6494
6228
  const _awiki_dsh_plugin_awiki_updateDisplayName_parameter_0$schema = object({ "displayName": string().readonly() });
6495
6229
  const _awiki_dsh_plugin_awiki_updateDisplayName_result$schema = union([object({
@@ -6507,6 +6241,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6507
6241
  literal("forbidden"),
6508
6242
  literal("identity-recovery-required"),
6509
6243
  literal("conflict"),
6244
+ literal("state-in-use"),
6510
6245
  literal("rate-limited"),
6511
6246
  literal("group-membership-required"),
6512
6247
  literal("group-identity-stale"),
@@ -6551,6 +6286,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6551
6286
  literal("forbidden"),
6552
6287
  literal("identity-recovery-required"),
6553
6288
  literal("conflict"),
6289
+ literal("state-in-use"),
6554
6290
  literal("rate-limited"),
6555
6291
  literal("group-membership-required"),
6556
6292
  literal("group-identity-stale"),
@@ -6603,7 +6339,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6603
6339
  },
6604
6340
  sourceLocation: {
6605
6341
  "file": "packages/dsh-awiki/src/index.ts",
6606
- "line": 158,
6342
+ "line": 119,
6607
6343
  "column": 9
6608
6344
  }
6609
6345
  },
@@ -6630,73 +6366,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6630
6366
  },
6631
6367
  sourceLocation: {
6632
6368
  "file": "packages/dsh-awiki/src/index.ts",
6633
- "line": 188,
6369
+ "line": 149,
6634
6370
  "column": 3
6635
6371
  }
6636
6372
  },
6637
- {
6638
- id: "@awiki/dsh-plugin#awiki/approveDeviceJoin",
6639
- service: "awiki",
6640
- namespace: "awiki",
6641
- method: "approveDeviceJoin",
6642
- invocation: { kind: "direct" },
6643
- parameters: [{
6644
- name: "request",
6645
- wire: "request",
6646
- source: "json",
6647
- codec: {
6648
- mode: "strict",
6649
- typeSymbol: "@awiki/dsh-plugin/types#AwikiApproveDeviceJoinRequest",
6650
- schema: _awiki_dsh_plugin_awiki_approveDeviceJoin_parameter_0$schema
6651
- }
6652
- }],
6653
- result: {
6654
- mode: "strict",
6655
- typeSymbol: "@awiki/dsh-plugin/types#AwikiResult",
6656
- schema: _awiki_dsh_plugin_awiki_approveDeviceJoin_result$schema
6657
- },
6658
- sourceLocation: {
6659
- "file": "packages/dsh-awiki/src/index.ts",
6660
- "line": 128,
6661
- "column": 9
6662
- }
6663
- },
6664
- {
6665
- id: "@awiki/dsh-plugin#awiki/beginDeviceJoin",
6666
- service: "awiki",
6667
- namespace: "awiki",
6668
- method: "beginDeviceJoin",
6669
- invocation: { kind: "direct" },
6670
- parameters: [],
6671
- result: {
6672
- mode: "strict",
6673
- typeSymbol: "@awiki/dsh-plugin/types#AwikiResult",
6674
- schema: _awiki_dsh_plugin_awiki_beginDeviceJoin_result$schema
6675
- },
6676
- sourceLocation: {
6677
- "file": "packages/dsh-awiki/src/index.ts",
6678
- "line": 111,
6679
- "column": 9
6680
- }
6681
- },
6682
- {
6683
- id: "@awiki/dsh-plugin#awiki/cancelDeviceJoin",
6684
- service: "awiki",
6685
- namespace: "awiki",
6686
- method: "cancelDeviceJoin",
6687
- invocation: { kind: "direct" },
6688
- parameters: [],
6689
- result: {
6690
- mode: "strict",
6691
- typeSymbol: "@awiki/dsh-plugin/types#AwikiResult",
6692
- schema: _awiki_dsh_plugin_awiki_cancelDeviceJoin_result$schema
6693
- },
6694
- sourceLocation: {
6695
- "file": "packages/dsh-awiki/src/index.ts",
6696
- "line": 117,
6697
- "column": 9
6698
- }
6699
- },
6700
6373
  {
6701
6374
  id: "@awiki/dsh-plugin#awiki/clearLocalData",
6702
6375
  service: "awiki",
@@ -6720,7 +6393,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6720
6393
  },
6721
6394
  sourceLocation: {
6722
6395
  "file": "packages/dsh-awiki/src/index.ts",
6723
- "line": 243,
6396
+ "line": 212,
6724
6397
  "column": 3
6725
6398
  }
6726
6399
  },
@@ -6747,7 +6420,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6747
6420
  },
6748
6421
  sourceLocation: {
6749
6422
  "file": "packages/dsh-awiki/src/index.ts",
6750
- "line": 173,
6423
+ "line": 134,
6751
6424
  "column": 9
6752
6425
  }
6753
6426
  },
@@ -6774,7 +6447,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6774
6447
  },
6775
6448
  sourceLocation: {
6776
6449
  "file": "packages/dsh-awiki/src/index.ts",
6777
- "line": 167,
6450
+ "line": 128,
6778
6451
  "column": 9
6779
6452
  }
6780
6453
  },
@@ -6801,62 +6474,71 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6801
6474
  },
6802
6475
  sourceLocation: {
6803
6476
  "file": "packages/dsh-awiki/src/index.ts",
6804
- "line": 225,
6477
+ "line": 189,
6805
6478
  "column": 9
6806
6479
  }
6807
6480
  },
6808
6481
  {
6809
- id: "@awiki/dsh-plugin#awiki/getConfig",
6482
+ id: "@awiki/dsh-plugin#awiki/downloadMailAttachment",
6810
6483
  service: "awiki",
6811
6484
  namespace: "awiki",
6812
- method: "getConfig",
6485
+ method: "downloadMailAttachment",
6813
6486
  invocation: { kind: "direct" },
6814
- parameters: [],
6487
+ parameters: [{
6488
+ name: "request",
6489
+ wire: "request",
6490
+ source: "json",
6491
+ codec: {
6492
+ mode: "strict",
6493
+ typeSymbol: "@awiki/dsh-plugin/types#AwikiMailAttachmentDownloadRequest",
6494
+ schema: _awiki_dsh_plugin_awiki_downloadMailAttachment_parameter_0$schema
6495
+ }
6496
+ }],
6815
6497
  result: {
6816
6498
  mode: "strict",
6817
6499
  typeSymbol: "@awiki/dsh-plugin/types#AwikiResult",
6818
- schema: _awiki_dsh_plugin_awiki_getConfig_result$schema
6500
+ schema: _awiki_dsh_plugin_awiki_downloadMailAttachment_result$schema
6819
6501
  },
6820
6502
  sourceLocation: {
6821
6503
  "file": "packages/dsh-awiki/src/index.ts",
6822
- "line": 85,
6504
+ "line": 207,
6823
6505
  "column": 9
6824
6506
  }
6825
6507
  },
6826
6508
  {
6827
- id: "@awiki/dsh-plugin#awiki/getConversationPreferences",
6509
+ id: "@awiki/dsh-plugin#awiki/getConfig",
6828
6510
  service: "awiki",
6829
6511
  namespace: "awiki",
6830
- method: "getConversationPreferences",
6512
+ method: "getConfig",
6831
6513
  invocation: { kind: "direct" },
6832
6514
  parameters: [],
6833
6515
  result: {
6834
6516
  mode: "strict",
6835
6517
  typeSymbol: "@awiki/dsh-plugin/types#AwikiResult",
6836
- schema: _awiki_dsh_plugin_awiki_getConversationPreferences_result$schema
6518
+ schema: _awiki_dsh_plugin_awiki_getConfig_result$schema
6837
6519
  },
6838
6520
  sourceLocation: {
6839
6521
  "file": "packages/dsh-awiki/src/index.ts",
6840
- "line": 194,
6522
+ "line": 78,
6841
6523
  "column": 3
6842
6524
  }
6843
6525
  },
6844
6526
  {
6845
- id: "@awiki/dsh-plugin#awiki/getDeviceJoinStatus",
6527
+ id: "@awiki/dsh-plugin#awiki/getConversationPreferences",
6846
6528
  service: "awiki",
6847
6529
  namespace: "awiki",
6848
- method: "getDeviceJoinStatus",
6530
+ method: "getConversationPreferences",
6849
6531
  invocation: { kind: "direct" },
6850
6532
  parameters: [],
6851
6533
  result: {
6852
6534
  mode: "strict",
6853
6535
  typeSymbol: "@awiki/dsh-plugin/types#AwikiResult",
6854
- schema: _awiki_dsh_plugin_awiki_getDeviceJoinStatus_result$schema
6536
+ schema: _awiki_dsh_plugin_awiki_getConversationPreferences_result$schema
6855
6537
  },
6856
6538
  sourceLocation: {
6857
6539
  "file": "packages/dsh-awiki/src/index.ts",
6858
- "line": 114,
6859
- "column": 9
6540
+ "line": 158,
6541
+ "column": 3
6860
6542
  }
6861
6543
  },
6862
6544
  {
@@ -6882,7 +6564,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6882
6564
  },
6883
6565
  sourceLocation: {
6884
6566
  "file": "packages/dsh-awiki/src/index.ts",
6885
- "line": 176,
6567
+ "line": 137,
6886
6568
  "column": 3
6887
6569
  }
6888
6570
  },
@@ -6909,7 +6591,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6909
6591
  },
6910
6592
  sourceLocation: {
6911
6593
  "file": "packages/dsh-awiki/src/index.ts",
6912
- "line": 205,
6594
+ "line": 169,
6913
6595
  "column": 3
6914
6596
  }
6915
6597
  },
@@ -6927,7 +6609,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6927
6609
  },
6928
6610
  sourceLocation: {
6929
6611
  "file": "packages/dsh-awiki/src/index.ts",
6930
- "line": 88,
6612
+ "line": 81,
6931
6613
  "column": 9
6932
6614
  }
6933
6615
  },
@@ -6954,7 +6636,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6954
6636
  },
6955
6637
  sourceLocation: {
6956
6638
  "file": "packages/dsh-awiki/src/index.ts",
6957
- "line": 208,
6639
+ "line": 172,
6958
6640
  "column": 3
6959
6641
  }
6960
6642
  },
@@ -6972,7 +6654,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6972
6654
  },
6973
6655
  sourceLocation: {
6974
6656
  "file": "packages/dsh-awiki/src/index.ts",
6975
- "line": 228,
6657
+ "line": 192,
6976
6658
  "column": 3
6977
6659
  }
6978
6660
  },
@@ -6990,7 +6672,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6990
6672
  },
6991
6673
  sourceLocation: {
6992
6674
  "file": "packages/dsh-awiki/src/index.ts",
6993
- "line": 146,
6675
+ "line": 107,
6994
6676
  "column": 3
6995
6677
  }
6996
6678
  },
@@ -7017,7 +6699,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7017
6699
  },
7018
6700
  sourceLocation: {
7019
6701
  "file": "packages/dsh-awiki/src/index.ts",
7020
- "line": 161,
6702
+ "line": 122,
7021
6703
  "column": 9
7022
6704
  }
7023
6705
  },
@@ -7035,7 +6717,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7035
6717
  },
7036
6718
  sourceLocation: {
7037
6719
  "file": "packages/dsh-awiki/src/index.ts",
7038
- "line": 91,
6720
+ "line": 84,
7039
6721
  "column": 9
7040
6722
  }
7041
6723
  },
@@ -7062,7 +6744,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7062
6744
  },
7063
6745
  sourceLocation: {
7064
6746
  "file": "packages/dsh-awiki/src/index.ts",
7065
- "line": 100,
6747
+ "line": 93,
7066
6748
  "column": 9
7067
6749
  }
7068
6750
  },
@@ -7089,7 +6771,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7089
6771
  },
7090
6772
  sourceLocation: {
7091
6773
  "file": "packages/dsh-awiki/src/index.ts",
7092
- "line": 179,
6774
+ "line": 140,
7093
6775
  "column": 3
7094
6776
  }
7095
6777
  },
@@ -7116,7 +6798,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7116
6798
  },
7117
6799
  sourceLocation: {
7118
6800
  "file": "packages/dsh-awiki/src/index.ts",
7119
- "line": 182,
6801
+ "line": 143,
7120
6802
  "column": 9
7121
6803
  }
7122
6804
  },
@@ -7144,7 +6826,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7144
6826
  },
7145
6827
  sourceLocation: {
7146
6828
  "file": "packages/dsh-awiki/src/index.ts",
7147
- "line": 202,
6829
+ "line": 166,
7148
6830
  "column": 3
7149
6831
  }
7150
6832
  },
@@ -7171,7 +6853,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7171
6853
  },
7172
6854
  sourceLocation: {
7173
6855
  "file": "packages/dsh-awiki/src/index.ts",
7174
- "line": 185,
6856
+ "line": 146,
7175
6857
  "column": 3
7176
6858
  }
7177
6859
  },
@@ -7199,7 +6881,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7199
6881
  },
7200
6882
  sourceLocation: {
7201
6883
  "file": "packages/dsh-awiki/src/index.ts",
7202
- "line": 231,
6884
+ "line": 195,
7203
6885
  "column": 9
7204
6886
  }
7205
6887
  },
@@ -7217,7 +6899,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7217
6899
  },
7218
6900
  sourceLocation: {
7219
6901
  "file": "packages/dsh-awiki/src/index.ts",
7220
- "line": 97,
6902
+ "line": 90,
7221
6903
  "column": 3
7222
6904
  }
7223
6905
  },
@@ -7244,7 +6926,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7244
6926
  },
7245
6927
  sourceLocation: {
7246
6928
  "file": "packages/dsh-awiki/src/index.ts",
7247
- "line": 94,
6929
+ "line": 87,
7248
6930
  "column": 3
7249
6931
  }
7250
6932
  },
@@ -7271,7 +6953,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7271
6953
  },
7272
6954
  sourceLocation: {
7273
6955
  "file": "packages/dsh-awiki/src/index.ts",
7274
- "line": 216,
6956
+ "line": 180,
7275
6957
  "column": 3
7276
6958
  }
7277
6959
  },
@@ -7298,7 +6980,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7298
6980
  },
7299
6981
  sourceLocation: {
7300
6982
  "file": "packages/dsh-awiki/src/index.ts",
7301
- "line": 237,
6983
+ "line": 201,
7302
6984
  "column": 3
7303
6985
  }
7304
6986
  },
@@ -7325,7 +7007,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7325
7007
  },
7326
7008
  sourceLocation: {
7327
7009
  "file": "packages/dsh-awiki/src/index.ts",
7328
- "line": 155,
7010
+ "line": 116,
7329
7011
  "column": 3
7330
7012
  }
7331
7013
  },
@@ -7352,28 +7034,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7352
7034
  },
7353
7035
  sourceLocation: {
7354
7036
  "file": "packages/dsh-awiki/src/index.ts",
7355
- "line": 234,
7037
+ "line": 198,
7356
7038
  "column": 9
7357
7039
  }
7358
7040
  },
7359
- {
7360
- id: "@awiki/dsh-plugin#awiki/refreshDeviceManagement",
7361
- service: "awiki",
7362
- namespace: "awiki",
7363
- method: "refreshDeviceManagement",
7364
- invocation: { kind: "direct" },
7365
- parameters: [],
7366
- result: {
7367
- mode: "strict",
7368
- typeSymbol: "@awiki/dsh-plugin/types#AwikiResult",
7369
- schema: _awiki_dsh_plugin_awiki_refreshDeviceManagement_result$schema
7370
- },
7371
- sourceLocation: {
7372
- "file": "packages/dsh-awiki/src/index.ts",
7373
- "line": 120,
7374
- "column": 3
7375
- }
7376
- },
7377
7041
  {
7378
7042
  id: "@awiki/dsh-plugin#awiki/registerIdentity",
7379
7043
  service: "awiki",
@@ -7397,34 +7061,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7397
7061
  },
7398
7062
  sourceLocation: {
7399
7063
  "file": "packages/dsh-awiki/src/index.ts",
7400
- "line": 108,
7401
- "column": 9
7402
- }
7403
- },
7404
- {
7405
- id: "@awiki/dsh-plugin#awiki/rejectDeviceJoin",
7406
- service: "awiki",
7407
- namespace: "awiki",
7408
- method: "rejectDeviceJoin",
7409
- invocation: { kind: "direct" },
7410
- parameters: [{
7411
- name: "request",
7412
- wire: "request",
7413
- source: "json",
7414
- codec: {
7415
- mode: "strict",
7416
- typeSymbol: "@awiki/dsh-plugin/types#AwikiRejectDeviceJoinRequest",
7417
- schema: _awiki_dsh_plugin_awiki_rejectDeviceJoin_parameter_0$schema
7418
- }
7419
- }],
7420
- result: {
7421
- mode: "strict",
7422
- typeSymbol: "@awiki/dsh-plugin/types#AwikiResult",
7423
- schema: _awiki_dsh_plugin_awiki_rejectDeviceJoin_result$schema
7424
- },
7425
- sourceLocation: {
7426
- "file": "packages/dsh-awiki/src/index.ts",
7427
- "line": 133,
7064
+ "line": 101,
7428
7065
  "column": 9
7429
7066
  }
7430
7067
  },
@@ -7451,7 +7088,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7451
7088
  },
7452
7089
  sourceLocation: {
7453
7090
  "file": "packages/dsh-awiki/src/index.ts",
7454
- "line": 191,
7091
+ "line": 152,
7455
7092
  "column": 3
7456
7093
  }
7457
7094
  },
@@ -7478,42 +7115,33 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7478
7115
  },
7479
7116
  sourceLocation: {
7480
7117
  "file": "packages/dsh-awiki/src/index.ts",
7481
- "line": 170,
7118
+ "line": 131,
7482
7119
  "column": 3
7483
7120
  }
7484
7121
  },
7485
7122
  {
7486
- id: "@awiki/dsh-plugin#awiki/resumeRecovery",
7123
+ id: "@awiki/dsh-plugin#awiki/resumeGroupRebindRecovery",
7487
7124
  service: "awiki",
7488
7125
  namespace: "awiki",
7489
- method: "resumeRecovery",
7126
+ method: "resumeGroupRebindRecovery",
7490
7127
  invocation: { kind: "direct" },
7491
- parameters: [{
7492
- name: "request",
7493
- wire: "request",
7494
- source: "json",
7495
- codec: {
7496
- mode: "strict",
7497
- typeSymbol: "@awiki/dsh-plugin/types#AwikiRecoveryOperationRequest",
7498
- schema: _awiki_dsh_plugin_awiki_resumeRecovery_parameter_0$schema
7499
- }
7500
- }],
7128
+ parameters: [],
7501
7129
  result: {
7502
7130
  mode: "strict",
7503
7131
  typeSymbol: "@awiki/dsh-plugin/types#AwikiResult",
7504
- schema: _awiki_dsh_plugin_awiki_resumeRecovery_result$schema
7132
+ schema: _awiki_dsh_plugin_awiki_resumeGroupRebindRecovery_result$schema
7505
7133
  },
7506
7134
  sourceLocation: {
7507
7135
  "file": "packages/dsh-awiki/src/index.ts",
7508
- "line": 164,
7136
+ "line": 155,
7509
7137
  "column": 9
7510
7138
  }
7511
7139
  },
7512
7140
  {
7513
- id: "@awiki/dsh-plugin#awiki/revokeDevice",
7141
+ id: "@awiki/dsh-plugin#awiki/resumeRecovery",
7514
7142
  service: "awiki",
7515
7143
  namespace: "awiki",
7516
- method: "revokeDevice",
7144
+ method: "resumeRecovery",
7517
7145
  invocation: { kind: "direct" },
7518
7146
  parameters: [{
7519
7147
  name: "request",
@@ -7521,18 +7149,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7521
7149
  source: "json",
7522
7150
  codec: {
7523
7151
  mode: "strict",
7524
- typeSymbol: "@awiki/dsh-plugin/types#AwikiRevokeDeviceRequest",
7525
- schema: _awiki_dsh_plugin_awiki_revokeDevice_parameter_0$schema
7152
+ typeSymbol: "@awiki/dsh-plugin/types#AwikiRecoveryOperationRequest",
7153
+ schema: _awiki_dsh_plugin_awiki_resumeRecovery_parameter_0$schema
7526
7154
  }
7527
7155
  }],
7528
7156
  result: {
7529
7157
  mode: "strict",
7530
7158
  typeSymbol: "@awiki/dsh-plugin/types#AwikiResult",
7531
- schema: _awiki_dsh_plugin_awiki_revokeDevice_result$schema
7159
+ schema: _awiki_dsh_plugin_awiki_resumeRecovery_result$schema
7532
7160
  },
7533
7161
  sourceLocation: {
7534
7162
  "file": "packages/dsh-awiki/src/index.ts",
7535
- "line": 138,
7163
+ "line": 125,
7536
7164
  "column": 9
7537
7165
  }
7538
7166
  },
@@ -7559,7 +7187,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7559
7187
  },
7560
7188
  sourceLocation: {
7561
7189
  "file": "packages/dsh-awiki/src/index.ts",
7562
- "line": 222,
7190
+ "line": 186,
7563
7191
  "column": 9
7564
7192
  }
7565
7193
  },
@@ -7586,7 +7214,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7586
7214
  },
7587
7215
  sourceLocation: {
7588
7216
  "file": "packages/dsh-awiki/src/index.ts",
7589
- "line": 240,
7217
+ "line": 204,
7590
7218
  "column": 9
7591
7219
  }
7592
7220
  },
@@ -7613,7 +7241,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7613
7241
  },
7614
7242
  sourceLocation: {
7615
7243
  "file": "packages/dsh-awiki/src/index.ts",
7616
- "line": 152,
7244
+ "line": 113,
7617
7245
  "column": 3
7618
7246
  }
7619
7247
  },
@@ -7640,8 +7268,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7640
7268
  },
7641
7269
  sourceLocation: {
7642
7270
  "file": "packages/dsh-awiki/src/index.ts",
7643
- "line": 105,
7644
- "column": 9
7271
+ "line": 98,
7272
+ "column": 3
7645
7273
  }
7646
7274
  },
7647
7275
  {
@@ -7667,37 +7295,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7667
7295
  },
7668
7296
  sourceLocation: {
7669
7297
  "file": "packages/dsh-awiki/src/index.ts",
7670
- "line": 219,
7298
+ "line": 183,
7671
7299
  "column": 3
7672
7300
  }
7673
7301
  },
7674
- {
7675
- id: "@awiki/dsh-plugin#awiki/startDeviceJoinVerification",
7676
- service: "awiki",
7677
- namespace: "awiki",
7678
- method: "startDeviceJoinVerification",
7679
- invocation: { kind: "direct" },
7680
- parameters: [{
7681
- name: "request",
7682
- wire: "request",
7683
- source: "json",
7684
- codec: {
7685
- mode: "strict",
7686
- typeSymbol: "@awiki/dsh-plugin/types#AwikiRequestRefInput",
7687
- schema: _awiki_dsh_plugin_awiki_startDeviceJoinVerification_parameter_0$schema
7688
- }
7689
- }],
7690
- result: {
7691
- mode: "strict",
7692
- typeSymbol: "@awiki/dsh-plugin/types#AwikiResult",
7693
- schema: _awiki_dsh_plugin_awiki_startDeviceJoinVerification_result$schema
7694
- },
7695
- sourceLocation: {
7696
- "file": "packages/dsh-awiki/src/index.ts",
7697
- "line": 123,
7698
- "column": 9
7699
- }
7700
- },
7701
7302
  {
7702
7303
  id: "@awiki/dsh-plugin#awiki/summarizeConversation",
7703
7304
  service: "awiki",
@@ -7721,7 +7322,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7721
7322
  },
7722
7323
  sourceLocation: {
7723
7324
  "file": "packages/dsh-awiki/src/index.ts",
7724
- "line": 211,
7325
+ "line": 175,
7725
7326
  "column": 9
7726
7327
  }
7727
7328
  },
@@ -7748,7 +7349,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7748
7349
  },
7749
7350
  sourceLocation: {
7750
7351
  "file": "packages/dsh-awiki/src/index.ts",
7751
- "line": 197,
7352
+ "line": 161,
7752
7353
  "column": 3
7753
7354
  }
7754
7355
  },
@@ -7775,7 +7376,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7775
7376
  },
7776
7377
  sourceLocation: {
7777
7378
  "file": "packages/dsh-awiki/src/index.ts",
7778
- "line": 143,
7379
+ "line": 104,
7779
7380
  "column": 9
7780
7381
  }
7781
7382
  },
@@ -7802,7 +7403,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7802
7403
  },
7803
7404
  sourceLocation: {
7804
7405
  "file": "packages/dsh-awiki/src/index.ts",
7805
- "line": 149,
7406
+ "line": 110,
7806
7407
  "column": 3
7807
7408
  }
7808
7409
  }
@@ -7831,13 +7432,13 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7831
7432
  const AWIKI_CLEAR_LOCAL_DATA_CONFIRMATION = "clear-awiki-local-data";
7832
7433
  //#endregion
7833
7434
  //#region \0dsh-awiki-css:AwikiIdentityPage.module.css.mjs
7834
- const css$5 = "._0dbJua_page{width:100%;height:100%;min-height:0;color:var(--dsw-alias-label-secondary);grid-template-rows:auto minmax(0,1fr);display:grid;overflow:hidden}._0dbJua_navigation{box-sizing:border-box;align-items:center;min-height:44px;padding:8px 16px 0;display:flex}._0dbJua_backButton{min-height:36px;color:var(--dsw-alias-label-secondary);cursor:pointer;font:inherit;background:0 0;border:0;border-radius:8px;align-items:center;gap:6px;padding:0 8px;font-size:12px;line-height:18px;display:inline-flex}._0dbJua_backButton:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}._0dbJua_backButton:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}._0dbJua_backButton:disabled{cursor:default;opacity:.5}._0dbJua_viewport{min-height:0;overflow:auto}._0dbJua_content{box-sizing:border-box;align-content:center;width:min(400px,100%);min-height:100%;margin:0 auto;padding:28px 32px;display:grid}@media (height<=560px){._0dbJua_navigation{min-height:36px;padding:4px 8px 0}._0dbJua_backButton{min-height:32px}._0dbJua_content{align-content:start;padding:12px 16px}}@media (prefers-reduced-motion:reduce){._0dbJua_backButton{transition-duration:.001ms!important}}";
7835
- const tagId$5 = "@awiki/dsh-plugin/AwikiIdentityPage.module.css";
7836
- if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$5) + "]") === null) {
7435
+ const css$4 = "._0dbJua_page{width:100%;height:100%;min-height:0;color:var(--dsw-alias-label-secondary);grid-template-rows:auto minmax(0,1fr);display:grid;overflow:hidden}._0dbJua_navigation{box-sizing:border-box;align-items:center;min-height:44px;padding:8px 16px 0;display:flex}._0dbJua_backButton{min-height:36px;color:var(--dsw-alias-label-secondary);cursor:pointer;font:inherit;background:0 0;border:0;border-radius:8px;align-items:center;gap:6px;padding:0 8px;font-size:12px;line-height:18px;display:inline-flex}._0dbJua_backButton:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}._0dbJua_backButton:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}._0dbJua_backButton:disabled{cursor:default;opacity:.5}._0dbJua_viewport{min-height:0;overflow:auto}._0dbJua_content{box-sizing:border-box;align-content:center;width:min(400px,100%);min-height:100%;margin:0 auto;padding:28px 32px;display:grid}@media (height<=560px){._0dbJua_navigation{min-height:36px;padding:4px 8px 0}._0dbJua_backButton{min-height:32px}._0dbJua_content{align-content:start;padding:12px 16px}}@media (prefers-reduced-motion:reduce){._0dbJua_backButton{transition-duration:.001ms!important}}";
7436
+ const tagId$4 = "@awiki/dsh-plugin/AwikiIdentityPage.module.css";
7437
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$4) + "]") === null) {
7837
7438
  const tag = document.createElement("style");
7838
7439
  tag.dataset.plugin = "@awiki/dsh-plugin";
7839
- tag.dataset.pluginCss = tagId$5;
7840
- tag.textContent = css$5;
7440
+ tag.dataset.pluginCss = tagId$4;
7441
+ tag.textContent = css$4;
7841
7442
  document.head.appendChild(tag);
7842
7443
  }
7843
7444
  var _dsh_awiki_css_AwikiIdentityPage_module_css_default = {
@@ -7875,13 +7476,13 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7875
7476
  }
7876
7477
  //#endregion
7877
7478
  //#region \0dsh-awiki-css:AwikiOverlay.module.css.mjs
7878
- const css$4 = ".EtEeYG_trigger{z-index:2;border:1px solid var(--dsw-alias-border-l2);width:48px;height:48px;color:var(--dsw-alias-brand-primary);box-shadow:var(--dsw-shadow-lv2);cursor:grab;font:inherit;touch-action:none;user-select:none;background:#fff;border-radius:50%;place-items:center;padding:0;display:grid;position:fixed;overflow:visible}.EtEeYG_trigger:hover{box-shadow:var(--dsw-shadow-lv3);background:#fff}.EtEeYG_trigger:active,.EtEeYG_trigger[data-dragging]{cursor:grabbing}.EtEeYG_launcherIcon{object-fit:cover;pointer-events:none;border-radius:50%;width:100%;height:100%;display:block}.EtEeYG_unreadBadge{border:2px solid var(--dsw-alias-bg-base);background:var(--dsw-alias-state-error-primary);color:#fff;box-sizing:border-box;pointer-events:none;border-radius:10px;place-items:center;min-width:20px;height:20px;padding:0 5px;font-size:11px;font-weight:600;line-height:16px;display:grid;position:absolute;top:-5px;right:-5px}.EtEeYG_trigger:focus-visible,.EtEeYG_drawer button:focus-visible,.EtEeYG_drawer input:focus-visible,.EtEeYG_drawer textarea:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}.EtEeYG_drawer{--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);z-index:1;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);width:min(720px,100vw - 80px);min-width:min(360px,100vw - 80px);height:min(720px,100vh - 16px);color:var(--dsw-alias-label-primary);box-shadow:var(--dsw-shadow-lv3);border-radius:16px;flex-direction:column;transition:width .16s;display:flex;position:fixed;overflow:hidden}.EtEeYG_drawer[data-mode=mail]{width:min(1040px,100vw - 80px)}.EtEeYG_drawer[data-resizing]{user-select:none;transition:none}.EtEeYG_resizeHandle{z-index:5;touch-action:none;user-select:none;position:absolute}.EtEeYG_resizeHandle[data-resize-handle=n],.EtEeYG_resizeHandle[data-resize-handle=s]{cursor:ns-resize;height:8px;left:14px;right:14px}.EtEeYG_resizeHandle[data-resize-handle=n]{top:0}.EtEeYG_resizeHandle[data-resize-handle=s]{bottom:0}.EtEeYG_resizeHandle[data-resize-handle=e],.EtEeYG_resizeHandle[data-resize-handle=w]{cursor:ew-resize;width:8px;top:14px;bottom:14px}.EtEeYG_resizeHandle[data-resize-handle=e]{right:0}.EtEeYG_resizeHandle[data-resize-handle=w]{left:0}.EtEeYG_resizeHandle[data-resize-handle=ne],.EtEeYG_resizeHandle[data-resize-handle=se],.EtEeYG_resizeHandle[data-resize-handle=sw],.EtEeYG_resizeHandle[data-resize-handle=nw]{width:14px;height:14px}.EtEeYG_resizeHandle[data-resize-handle=ne]{cursor:nesw-resize;top:0;right:0}.EtEeYG_resizeHandle[data-resize-handle=se]{cursor:nwse-resize;bottom:0;right:0}.EtEeYG_resizeHandle[data-resize-handle=sw]{cursor:nesw-resize;bottom:0;left:0}.EtEeYG_resizeHandle[data-resize-handle=nw]{cursor:nwse-resize;top:0;left:0}.EtEeYG_drawerHeader{border-bottom:1px solid var(--dsw-alias-border-l1);cursor:grab;touch-action:none;user-select:none;flex:none;align-items:center;gap:8px;height:58px;padding:0 14px 0 18px;display:flex}.EtEeYG_drawerHeader[data-dragging]{cursor:grabbing}.EtEeYG_drawerHeader>div{flex:1;align-items:center;gap:8px;display:flex}.EtEeYG_drawerHeader h2{margin:0;font-size:16px;line-height:24px}.EtEeYG_drawerHeader button,.EtEeYG_back{cursor:pointer;width:32px;height:32px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:9px;place-items:center;padding:0;display:grid}.EtEeYG_drawerHeader button:hover,.EtEeYG_back:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.EtEeYG_centerState,.EtEeYG_threadEmpty{text-align:center;color:var(--dsw-alias-label-secondary);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:14px;padding:32px;display:flex}.EtEeYG_centerState p{overflow-wrap:anywhere;max-width:420px;margin:0}.EtEeYG_registrationIcon{background:var(--dsw-alias-interactive-bg-active);width:48px;height:48px;color:var(--dsw-alias-brand-primary);border-radius:50%;justify-self:center;place-items:center;display:grid}.EtEeYG_fileDraft input,.EtEeYG_composeRow textarea{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);width:100%;color:var(--dsw-alias-label-primary);font:inherit;border-radius:10px}.EtEeYG_primary,.EtEeYG_more,.EtEeYG_fileDraft button{background:var(--dsw-alias-button-primary-fill);min-height:36px;color:var(--dsw-alias-label-primary-inverted);cursor:pointer;font:inherit;border:0;border-radius:10px;padding:0 14px}.EtEeYG_primary:hover,.EtEeYG_fileDraft button:hover{background:var(--dsw-alias-button-primary-hover)}.EtEeYG_primary:disabled,.EtEeYG_fileDraft button:disabled{opacity:.5;cursor:default}.EtEeYG_secondary{border:1px solid var(--dsw-alias-border-l2);min-height:36px;color:var(--dsw-alias-label-primary);cursor:pointer;font:inherit;background:0 0;border-radius:10px;padding:0 14px}.EtEeYG_secondary:hover{background:var(--dsw-alias-interactive-bg-hover)}.EtEeYG_composeBackdrop{background:color-mix(in srgb, var(--dsw-alias-bg-layer-1) 72%, transparent);place-items:center;padding:24px;display:grid;position:absolute;inset:58px 0 0;overflow:auto}.EtEeYG_composeCard{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);width:min(360px,100%);box-shadow:var(--dsw-shadow-lv3);border-radius:14px;gap:12px;padding:20px;display:grid}.EtEeYG_composeCard h3{margin:0;font-size:16px;line-height:24px}.EtEeYG_composeCard p{color:var(--dsw-alias-label-secondary);margin:0;font-size:13px;line-height:20px}.EtEeYG_composeCard label{color:var(--dsw-alias-label-secondary);gap:6px;font-size:13px;line-height:20px;display:grid}.EtEeYG_composeCard input,.EtEeYG_composeCard textarea{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);width:100%;color:var(--dsw-alias-label-primary);font:inherit;border-radius:10px;padding:9px 12px}.EtEeYG_composeCard input{height:40px;padding-block:0}.EtEeYG_composeCard textarea{resize:vertical;min-height:92px}.EtEeYG_composeActions{justify-content:flex-end;gap:8px;display:flex}.EtEeYG_logoutWarning{color:var(--dsw-alias-label-secondary);gap:8px;font-size:13px;line-height:20px;display:grid}.EtEeYG_logoutWarning p{margin:0}.EtEeYG_logoutConfirm{border-color:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-state-error-primary)}.EtEeYG_compactModal.EtEeYG_compactModal{max-height:calc(100vh - 48px)}.EtEeYG_compactModalContent{min-height:0;overflow-y:auto}.EtEeYG_linkButton{color:var(--dsw-alias-brand-primary);cursor:pointer;background:0 0;border:0}.EtEeYG_notice{color:var(--dsw-alias-state-success-primary);text-align:center}.EtEeYG_identityAccess{flex:1;min-height:0;overflow:hidden}.EtEeYG_recoveryForm{width:100%;min-width:0;color:var(--dsw-alias-label-secondary);gap:14px;display:grid}.EtEeYG_recoveryForm h3{color:var(--dsw-alias-label-primary);text-align:center;margin:0}.EtEeYG_recoveryForm>p{text-align:center;margin:0;font-size:13px;line-height:20px}.EtEeYG_recoveryForm>label:not(.EtEeYG_recoveryConfirmation){gap:6px;font-size:13px;line-height:20px;display:grid}.EtEeYG_recoveryForm>label>input:not([type=checkbox]){box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);width:100%;height:40px;color:var(--dsw-alias-label-primary);font:inherit;border-radius:8px;padding:0 12px}.EtEeYG_recoveryForm input:focus-visible,.EtEeYG_recoveryForm button:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}.EtEeYG_recoveryStatusLine{border-bottom:1px solid var(--dsw-alias-border-l1);gap:3px;min-width:0;padding-bottom:10px;display:grid}.EtEeYG_recoveryStatusLine span{color:var(--dsw-alias-brand-primary);font-size:12px;font-weight:600}.EtEeYG_recoveryIdentitySummary{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:8px;grid-template-columns:max-content minmax(0,1fr);gap:6px 14px;min-width:0;padding:12px;font-size:12px;line-height:18px;display:grid}.EtEeYG_recoveryIdentitySummary span{color:var(--dsw-alias-label-tertiary)}.EtEeYG_recoveryIdentitySummary strong{overflow-wrap:anywhere;min-width:0;color:var(--dsw-alias-label-primary)}.EtEeYG_recoveryDiagnostics{border-top:1px solid var(--dsw-alias-border-l1);min-width:0;color:var(--dsw-alias-label-tertiary);padding-top:2px;font-size:11px;line-height:17px}.EtEeYG_recoveryDiagnostics summary{cursor:pointer;width:max-content;color:var(--dsw-alias-label-secondary);user-select:none}.EtEeYG_recoveryDiagnostics summary:hover{color:var(--dsw-alias-label-primary)}.EtEeYG_recoveryDiagnostics summary:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px;border-radius:4px}.EtEeYG_recoveryDiagnostics dl{gap:6px;margin:8px 0 0;display:grid}.EtEeYG_recoveryDiagnostics dl>div{gap:2px;min-width:0;display:grid}.EtEeYG_recoveryDiagnostics dt{color:var(--dsw-alias-label-tertiary)}.EtEeYG_recoveryDiagnostics dd{min-width:0;margin:0}.EtEeYG_recoveryDiagnostics code{overflow-wrap:anywhere;color:var(--dsw-alias-label-secondary);font-size:10px;line-height:16px;display:block}.EtEeYG_recoveryImpact{border-left:3px solid var(--dsw-alias-brand-primary);background:var(--dsw-alias-bg-layer-2);gap:6px;padding:12px;display:grid}.EtEeYG_recoveryImpact p{align-items:flex-start;gap:7px;margin:0;font-size:12px;line-height:18px;display:flex}.EtEeYG_recoveryImpact svg{flex:none;margin-top:2px}.EtEeYG_recoveryImpact p[data-tone=success] svg{color:var(--dsw-alias-state-success-primary)}.EtEeYG_recoveryImpact p[data-tone=neutral] svg{color:var(--dsw-alias-label-tertiary)}.EtEeYG_recoveryHandle{overflow-wrap:anywhere;color:var(--dsw-alias-label-primary);text-align:center;margin:-8px 0 0;font-size:13px;line-height:20px}.EtEeYG_recoveryConfirmationCopy{color:var(--dsw-alias-label-secondary);text-align:left;margin:0;font-size:12px;line-height:18px}.EtEeYG_recoveryProgressPanel{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);text-align:center;border-radius:8px;justify-items:center;gap:10px;min-width:0;padding:16px;display:grid}.EtEeYG_recoveryProgressPanel>svg{color:var(--dsw-alias-brand-primary);animation:1s linear infinite EtEeYG_summary-spin}.EtEeYG_recoveryProgressPanel p{margin:0;font-size:12px;line-height:18px}.EtEeYG_recoveryProgressPanel button{justify-content:center;align-items:center;gap:6px;width:100%;display:flex}.EtEeYG_chat{flex:1;grid-template-columns:240px minmax(0,1fr);min-height:0;display:grid}.EtEeYG_roster{border-right:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);flex-direction:column;min-width:0;display:flex}.EtEeYG_identityCard{background:var(--dsw-alias-bg-layer-3);border-radius:12px;flex-direction:column;gap:2px;margin:14px;padding:12px;display:flex}.EtEeYG_identityNameRow{align-items:center;min-width:0;min-height:24px;display:flex}.EtEeYG_profileAvatar{background:var(--dsw-alias-interactive-bg-active);width:24px;height:24px;color:var(--dsw-alias-brand-primary);border-radius:50%;flex:none;place-items:center;margin-right:7px;display:grid}.EtEeYG_identityNameText{min-width:0;color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:14px;line-height:22px;overflow:hidden}.EtEeYG_identityName{min-width:0;color:var(--dsw-alias-label-primary);font:inherit;text-align:left;text-overflow:ellipsis;white-space:nowrap;cursor:text;background:0 0;border:0;flex:1;padding:0;font-size:16px;font-weight:600;line-height:24px;overflow:hidden}.EtEeYG_identityName:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px;border-radius:4px}.EtEeYG_identityEdit{width:24px;height:24px;color:var(--dsw-alias-label-secondary);cursor:pointer;opacity:.72;background:0 0;border:0;border-radius:6px;flex:none;place-items:center;margin-left:4px;padding:0;transition:opacity .12s;display:grid}.EtEeYG_identityNameRow:hover .EtEeYG_identityEdit,.EtEeYG_identityNameRow:focus-within .EtEeYG_identityEdit{opacity:1}.EtEeYG_identityEdit:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.EtEeYG_identityEditor{flex:1;align-items:center;gap:4px;min-width:0;display:flex}.EtEeYG_identityEditor input{border:1px solid var(--dsw-alias-brand-primary);background:var(--dsw-alias-bg-layer-1);min-width:0;height:28px;color:var(--dsw-alias-label-primary);font:inherit;border-radius:7px;outline:none;flex:1;padding:0 8px;font-size:13px}.EtEeYG_identityEditor button{width:26px;height:26px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:6px;flex:none;place-items:center;padding:0;display:grid}.EtEeYG_identityEditor button:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.EtEeYG_identityEditor button:disabled,.EtEeYG_identityName:disabled{cursor:default;opacity:.5}.EtEeYG_identityEdit:disabled{cursor:default}.EtEeYG_identityHandle{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:11px;line-height:16px;overflow:hidden}.EtEeYG_identityStatus{color:var(--dsw-alias-state-success-primary);margin-top:4px;font-size:12px;line-height:18px}.EtEeYG_identityError{color:var(--dsw-alias-state-error-primary);margin-top:4px;font-size:11px;line-height:16px}.EtEeYG_identityCard i{background:var(--dsw-alias-state-success-primary);border-radius:50%;width:6px;height:6px;margin-right:5px;display:inline-block}.EtEeYG_profileBio{color:var(--dsw-alias-label-secondary);-webkit-line-clamp:2;-webkit-box-orient:vertical;margin:6px 0 2px;font-size:11px;line-height:17px;display:-webkit-box;overflow:hidden}.EtEeYG_profileTags{flex-wrap:wrap;gap:4px;margin-top:5px;display:flex}.EtEeYG_profileTags>span{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);min-width:0;max-width:100%;min-height:20px;color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;border-radius:7px;align-items:center;gap:3px;padding:0 6px;font-size:10px;line-height:16px;display:inline-flex}.EtEeYG_profileTags>span>button{width:16px;height:16px;color:inherit;cursor:pointer;background:0 0;border:0;border-radius:4px;place-items:center;padding:0;display:grid}.EtEeYG_profileTags>span>button:hover{background:var(--dsw-alias-interactive-bg-hover)}.EtEeYG_profileEditor{gap:10px;display:grid}.EtEeYG_profileEditor label{color:var(--dsw-alias-label-secondary);gap:4px;font-size:11px;line-height:16px;display:grid;position:relative}.EtEeYG_profileEditor label>small{color:var(--dsw-alias-label-tertiary);font-size:10px;position:absolute;top:0;right:1px}.EtEeYG_profileEditor input,.EtEeYG_profileEditor textarea{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);width:100%;color:var(--dsw-alias-label-primary);font:inherit;border-radius:7px;padding:7px 8px;font-size:12px}.EtEeYG_profileEditor input{height:32px;padding-block:0}.EtEeYG_profileEditor textarea{resize:vertical}.EtEeYG_profileTagEditor{gap:4px;display:grid}.EtEeYG_profileTagEditor>div:first-of-type{grid-template-columns:minmax(0,1fr) 30px;gap:5px;display:grid}.EtEeYG_profileTagEditor>div:first-of-type button{border:1px solid var(--dsw-alias-border-l2);width:30px;height:30px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border-radius:7px;place-items:center;padding:0;display:grid}.EtEeYG_profileEditorActions{grid-template-columns:1fr 1fr;gap:6px;margin-top:2px;display:grid}.EtEeYG_profileEditorActions button{min-width:0;padding-inline:6px;font-size:12px}.EtEeYG_modePanel{flex:1;min-height:0;display:none}.EtEeYG_modePanel[data-active]{display:flex}.EtEeYG_modeTabs{background:var(--dsw-alias-bg-layer-3);border-radius:9px;grid-template-columns:1fr 1fr;gap:4px;margin:0 14px 12px;padding:3px;display:grid}.EtEeYG_modeTabs button{min-height:30px;color:var(--dsw-alias-label-tertiary);cursor:pointer;font:inherit;background:0 0;border:0;border-radius:7px;justify-content:center;align-items:center;gap:5px;padding:0 8px;font-size:12px;line-height:18px;display:flex}.EtEeYG_modeTabs button:hover{color:var(--dsw-alias-label-primary)}.EtEeYG_modeTabs button[aria-selected=true]{background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);box-shadow:var(--dsw-shadow-lv1)}.EtEeYG_modeTabs small{min-width:18px;color:var(--dsw-alias-brand-primary);font-size:10px;line-height:14px}.EtEeYG_rosterHeader{justify-content:space-between;align-items:center;min-height:32px;padding:0 8px 8px 16px;display:flex}.EtEeYG_rosterTitle{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}.EtEeYG_rosterActions{align-items:center;gap:2px;display:flex}.EtEeYG_rosterAction{width:32px;height:32px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:9px;place-items:center;padding:0;display:grid}.EtEeYG_rosterAction:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.EtEeYG_rosterActions .EtEeYG_rosterAction{position:relative}.EtEeYG_rosterActions .EtEeYG_rosterAction small{background:var(--dsw-alias-bg-layer-3);min-width:14px;height:14px;color:var(--dsw-alias-label-secondary);box-sizing:border-box;border-radius:7px;place-items:center;padding:0 3px;font-size:9px;line-height:12px;display:grid;position:absolute;top:1px;right:0}.EtEeYG_conversationList{flex:1;min-height:0;padding:0 8px;overflow:auto}.EtEeYG_conversationRow{width:100%;color:inherit;background:0 0;border-radius:10px;grid-template-columns:minmax(0,1fr) auto;align-items:center;display:grid}.EtEeYG_conversationRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.EtEeYG_conversationRow[data-active]{background:var(--dsw-alias-interactive-bg-active)}.EtEeYG_conversationSelect{width:100%;min-width:0;color:inherit;cursor:pointer;text-align:left;background:0 0;border:0;border-radius:10px;align-items:center;gap:10px;padding:9px;display:flex}.EtEeYG_conversationMenu{width:28px;height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;opacity:0;background:0 0;border:0;border-radius:7px;place-items:center;margin-right:5px;padding:0;display:grid}.EtEeYG_conversationRow:hover .EtEeYG_conversationMenu,.EtEeYG_conversationRow:focus-within .EtEeYG_conversationMenu,.EtEeYG_conversationMenu[aria-expanded=true]{opacity:1}.EtEeYG_conversationMenu:hover{background:var(--dsw-alias-interactive-bg-active);color:var(--dsw-alias-label-primary)}.EtEeYG_conversationMenu:disabled{cursor:default;opacity:.45}.EtEeYG_avatar{background:var(--dsw-alias-interactive-bg-active);width:34px;height:34px;color:var(--dsw-alias-brand-primary);border-radius:50%;flex:none;place-items:center;font-size:12px;line-height:18px;display:grid;position:relative;overflow:visible}.EtEeYG_conversationUnreadBadge{border:2px solid var(--dsw-alias-bg-layer-2);background:var(--dsw-alias-state-error-primary);min-width:18px;height:18px;color:var(--dsw-alias-label-primary-inverted);box-sizing:border-box;pointer-events:none;border-radius:9px;place-items:center;padding:0 4px;font-size:10px;font-weight:600;line-height:14px;display:grid;position:absolute;top:-6px;right:-7px}.EtEeYG_conversationText{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.EtEeYG_conversationHeader{align-items:center;gap:8px;min-width:0;display:flex}.EtEeYG_conversationHeader strong{flex:1;min-width:0}.EtEeYG_conversationTime{color:var(--dsw-alias-label-tertiary);flex:none;font-size:11px;font-weight:400;line-height:16px}.EtEeYG_conversationText strong,.EtEeYG_conversationText small{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.EtEeYG_conversationText strong{font-size:13px;line-height:20px}.EtEeYG_conversationText small{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}.EtEeYG_more{background:var(--dsw-alias-button-elevated-fill);color:var(--dsw-alias-label-secondary);margin:8px}.EtEeYG_more:hover{background:var(--dsw-alias-interactive-bg-hover)}.EtEeYG_hiddenConversationList{max-height:min(320px,48vh);display:grid;overflow:auto}.EtEeYG_hiddenConversationRow{border-bottom:1px solid var(--dsw-alias-border-l1);grid-template-columns:32px minmax(0,1fr) auto;align-items:center;gap:9px;min-height:50px;padding:6px 2px;display:grid}.EtEeYG_hiddenConversationRow:last-child{border-bottom:0}.EtEeYG_hiddenConversationRow .EtEeYG_avatar{width:30px;height:30px}.EtEeYG_hiddenConversationRow>span:nth-child(2){min-width:0;display:grid}.EtEeYG_hiddenConversationRow strong,.EtEeYG_hiddenConversationRow small{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.EtEeYG_hiddenConversationRow strong{font-size:12px;line-height:18px}.EtEeYG_hiddenConversationRow small{color:var(--dsw-alias-label-tertiary);font-size:10px;line-height:15px}.EtEeYG_hiddenConversationRow>button{border:1px solid var(--dsw-alias-border-l2);min-height:28px;color:var(--dsw-alias-label-primary);cursor:pointer;font:inherit;background:0 0;border-radius:7px;padding:0 9px;font-size:11px}.EtEeYG_hiddenConversationRow>button:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.EtEeYG_hiddenConversationRow>button:disabled{cursor:default;opacity:.55}.EtEeYG_conversationPreferenceError{color:var(--dsw-alias-state-error-primary);font-size:11px;line-height:17px}.EtEeYG_thread{flex-direction:column;min-width:0;min-height:0;display:flex;position:relative}.EtEeYG_threadHeader{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;align-items:center;gap:8px;height:56px;padding:0 14px;display:flex}.EtEeYG_threadTitle{flex-direction:column;flex:1;min-width:0;display:flex}.EtEeYG_threadTitle strong,.EtEeYG_threadTitle small{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.EtEeYG_threadHeader small{color:var(--dsw-alias-label-tertiary)}.EtEeYG_threadAction{width:30px;height:30px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:8px;flex:none;place-items:center;padding:0;display:grid}.EtEeYG_threadAction:hover,.EtEeYG_threadAction[aria-expanded=true]{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.EtEeYG_groupAccessNotice{border-bottom:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);flex:none;grid-template-columns:20px minmax(0,1fr) auto;align-items:start;gap:8px 10px;padding:11px 14px;display:grid}.EtEeYG_groupAccessNotice[data-status=blocked],.EtEeYG_groupAccessNotice[data-status=not-member]{background:var(--dsw-alias-interactive-bg-hover-danger)}.EtEeYG_groupAccessNotice[data-compact]{grid-template-columns:20px minmax(0,1fr);padding:12px 16px}.EtEeYG_groupAccessIcon{min-height:20px;color:var(--dsw-alias-label-secondary);place-items:center;display:grid}.EtEeYG_groupAccessNotice[data-status=loading] .EtEeYG_groupAccessIcon svg,.EtEeYG_groupAccessNotice[data-status=recovering] .EtEeYG_groupAccessIcon svg{animation:1s linear infinite EtEeYG_summary-spin}.EtEeYG_groupAccessCopy{gap:2px;min-width:0;display:grid}.EtEeYG_groupAccessCopy strong{font-size:12px;line-height:18px}.EtEeYG_groupAccessCopy small{color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;font-size:11px;line-height:17px}.EtEeYG_groupAccessActions{flex-wrap:wrap;justify-content:flex-end;gap:6px;display:flex}.EtEeYG_groupAccessNotice[data-compact] .EtEeYG_groupAccessActions{grid-column:2;justify-content:flex-start}.EtEeYG_groupAccessActions button{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);min-height:28px;color:var(--dsw-alias-label-primary);cursor:pointer;font:inherit;border-radius:7px;justify-content:center;align-items:center;gap:5px;padding:0 8px;font-size:11px;line-height:16px;display:flex}.EtEeYG_groupAccessActions button:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.EtEeYG_groupAccessActions button:disabled{cursor:default;opacity:.55}.EtEeYG_groupDetails{z-index:4;border-left:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);width:min(360px,100%);min-width:0;box-shadow:var(--dsw-shadow-lv2);flex-direction:column;display:flex;position:absolute;top:56px;bottom:0;right:0;overflow:hidden}.EtEeYG_groupDetailsHeader{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;align-items:center;gap:12px;min-height:54px;padding:0 12px 0 16px;display:flex}.EtEeYG_groupDetailsHeader>div{flex-direction:column;flex:1;min-width:0;display:flex}.EtEeYG_groupDetailsHeader strong{font-size:14px;line-height:21px}.EtEeYG_groupDetailsHeader small{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:15px;overflow:hidden}.EtEeYG_groupDetailsHeader button,.EtEeYG_groupMemberHeading button,.EtEeYG_groupMemberRemove{width:28px;height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:7px;flex:none;place-items:center;padding:0;display:grid}.EtEeYG_groupDetailsHeader button:hover,.EtEeYG_groupMemberHeading button:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.EtEeYG_groupDetailsLoading{color:var(--dsw-alias-label-tertiary);margin:auto;font-size:12px}.EtEeYG_groupSummary{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;gap:5px;padding:16px;display:grid}.EtEeYG_groupSummary>strong{font-size:15px;line-height:22px}.EtEeYG_groupSummary>code{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;overflow:hidden}.EtEeYG_groupSummary>p{color:var(--dsw-alias-label-secondary);margin:3px 0 0;font-size:12px;line-height:18px}.EtEeYG_groupSummary dl{grid-template-columns:1fr 1fr;gap:8px;margin:8px 0 0;display:grid}.EtEeYG_groupSummary dl>div{gap:1px;display:grid}.EtEeYG_groupSummary dt{color:var(--dsw-alias-label-tertiary);font-size:10px}.EtEeYG_groupSummary dd{color:var(--dsw-alias-label-primary);margin:0;font-size:12px}.EtEeYG_groupInvite{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;gap:5px;padding:12px 16px;display:grid}.EtEeYG_groupInvite label{color:var(--dsw-alias-label-secondary);font-size:11px}.EtEeYG_groupInvite>div{grid-template-columns:minmax(0,1fr) 32px;gap:6px;display:grid}.EtEeYG_groupInvite input{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);min-width:0;height:32px;color:var(--dsw-alias-label-primary);font:inherit;border-radius:7px;padding:0 9px;font-size:12px}.EtEeYG_groupInvite button{background:var(--dsw-alias-button-primary-fill);width:32px;height:32px;color:var(--dsw-alias-label-primary-inverted);cursor:pointer;border:0;border-radius:7px;place-items:center;padding:0;display:grid}.EtEeYG_groupInvite button:disabled{cursor:default;opacity:.7}.EtEeYG_groupInvite button[data-busy] svg{animation:1s linear infinite EtEeYG_summary-spin}.EtEeYG_groupInviteStatus{overflow-wrap:anywhere;min-width:0;color:var(--dsw-alias-label-tertiary);margin:0;font-size:10px;line-height:16px}.EtEeYG_groupInviteStatus[data-state=success]{color:var(--dsw-alias-state-success-primary)}.EtEeYG_groupInviteStatus[data-state=error]{color:var(--dsw-alias-state-error-primary)}.EtEeYG_groupMemberSection{flex-direction:column;flex:1;min-height:0;display:flex}.EtEeYG_groupMemberHeading{flex:none;justify-content:space-between;align-items:center;min-height:40px;padding:0 12px 0 16px;display:flex}.EtEeYG_groupMemberHeading strong{font-size:12px;line-height:18px}.EtEeYG_groupMemberHeading button[data-busy] svg{animation:1s linear infinite EtEeYG_summary-spin}.EtEeYG_groupMemberRefreshStatus{overflow-wrap:anywhere;min-height:22px;color:var(--dsw-alias-label-tertiary);flex:none;margin:0;padding:2px 16px 4px;font-size:10px;line-height:16px}.EtEeYG_groupMemberRefreshStatus[data-state=success]{color:var(--dsw-alias-state-success-primary)}.EtEeYG_groupMemberRefreshStatus[data-state=error]{color:var(--dsw-alias-state-error-primary)}.EtEeYG_groupMemberList{min-height:0;padding:0 8px;overflow:auto}.EtEeYG_groupMemberRow{border-bottom:1px solid var(--dsw-alias-border-l1);grid-template-columns:30px minmax(0,1fr) auto 28px;align-items:center;gap:8px;min-height:48px;padding:4px 6px;display:grid}.EtEeYG_groupMemberAvatar{background:var(--dsw-alias-interactive-bg-active);width:30px;height:30px;color:var(--dsw-alias-brand-primary);border-radius:50%;place-items:center;font-size:11px;display:grid}.EtEeYG_groupMemberIdentity{flex-direction:column;min-width:0;display:flex}.EtEeYG_groupMemberIdentity strong{text-overflow:ellipsis;white-space:nowrap;align-items:center;gap:5px;font-size:12px;line-height:18px;display:flex;overflow:hidden}.EtEeYG_groupMemberIdentity strong small{background:var(--dsw-alias-interactive-bg-active);color:var(--dsw-alias-brand-primary);border-radius:4px;padding:0 4px;font-size:9px}.EtEeYG_groupMemberIdentity>small{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:15px;overflow:hidden}.EtEeYG_groupMemberRole{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:10px}.EtEeYG_groupMemberRemove:hover{background:var(--dsw-alias-interactive-bg-hover-danger);color:var(--dsw-alias-state-error-primary)}.EtEeYG_groupDetailsFooter{border-top:1px solid var(--dsw-alias-border-l1);flex:none;justify-content:space-between;align-items:center;gap:8px;min-height:46px;padding:0 16px;display:flex}.EtEeYG_groupDetailsFooter small{color:var(--dsw-alias-label-tertiary);font-size:10px}.EtEeYG_dangerText{color:var(--dsw-alias-state-error-primary);cursor:pointer;font:inherit;background:0 0;border:0;padding:0;font-size:12px}.EtEeYG_dangerText:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.EtEeYG_groupDetailsError{background:var(--dsw-alias-interactive-bg-hover-danger);color:var(--dsw-alias-state-error-primary);flex:none;padding:8px 12px;font-size:11px;line-height:17px}.EtEeYG_summaryTrigger{min-height:30px;color:var(--dsw-alias-brand-primary);cursor:pointer;font:inherit;background:0 0;border:0;border-radius:8px;flex:none;align-items:center;gap:5px;padding:0 8px;font-size:12px;line-height:18px;display:flex}.EtEeYG_summaryTrigger:hover{background:var(--dsw-alias-interactive-bg-hover)}.EtEeYG_summaryTrigger:disabled{cursor:default;opacity:.7}.EtEeYG_summaryTrigger[aria-expanded=true]>svg:last-child{transform:rotate(180deg)}.EtEeYG_summaryTrigger>svg:first-child{flex:none}.EtEeYG_summaryPanel{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);min-height:0;max-height:min(220px,33%);color:var(--dsw-alias-label-primary);border-radius:10px;flex:0 33%;margin:8px 10px 0;overflow:hidden}.EtEeYG_summaryPanel[data-collapsed]{flex-basis:auto;max-height:42px}.EtEeYG_summaryHeader{border-bottom:1px solid var(--dsw-alias-border-l1);align-items:center;gap:9px;min-height:38px;padding:0 8px 0 12px;display:flex}.EtEeYG_summaryHeader>span{color:var(--dsw-alias-brand-primary);align-items:center;gap:6px;display:flex}.EtEeYG_summaryHeader>span strong{color:var(--dsw-alias-label-primary);font-size:13px;line-height:20px}.EtEeYG_summaryHeader>small{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:11px;line-height:16px;overflow:hidden}.EtEeYG_summaryHeader>button{width:28px;height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:7px;flex:none;place-items:center;padding:0;display:grid}.EtEeYG_summaryHeader>button:hover{background:var(--dsw-alias-interactive-bg-hover)}.EtEeYG_summaryCollapsed{width:100%;min-height:40px;color:inherit;cursor:pointer;text-align:left;background:0 0;border:0;grid-template-columns:auto minmax(0,1fr) auto auto;align-items:center;gap:8px;padding:0 10px 0 12px;display:grid}.EtEeYG_summaryCollapsed:hover{background:var(--dsw-alias-interactive-bg-hover)}.EtEeYG_summaryCollapsed>span{color:var(--dsw-alias-brand-primary);align-items:center;gap:6px;font-size:12px;font-weight:600;display:flex}.EtEeYG_summaryCollapsed>small{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.EtEeYG_summaryCollapsed>em{color:var(--dsw-alias-state-warn-label);white-space:nowrap;font-size:11px;font-style:normal}.EtEeYG_summaryLoading{min-height:88px;color:var(--dsw-alias-brand-primary);justify-content:center;align-items:center;gap:10px;padding:16px;display:flex}.EtEeYG_summaryLoading>svg,.EtEeYG_summaryTrigger:disabled>svg:first-child{animation:1s linear infinite EtEeYG_summary-spin}.EtEeYG_summaryLoading>span{flex-direction:column;gap:2px;display:flex}.EtEeYG_summaryLoading strong{color:var(--dsw-alias-label-primary);font-size:13px;line-height:20px}.EtEeYG_summaryLoading small{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}.EtEeYG_summaryError{min-height:58px;color:var(--dsw-alias-state-error-primary);justify-content:space-between;align-items:center;gap:12px;padding:12px;font-size:12px;line-height:18px;display:flex}.EtEeYG_summaryError>span{overflow-wrap:anywhere;min-width:0}.EtEeYG_summaryError button,.EtEeYG_summaryStale button{border:1px solid var(--dsw-alias-border-l2);min-height:28px;color:var(--dsw-alias-label-primary);cursor:pointer;font:inherit;background:0 0;border-radius:7px;flex:none;align-items:center;gap:5px;padding:0 8px;font-size:11px;display:flex}.EtEeYG_summaryError button:hover,.EtEeYG_summaryStale button:hover{background:var(--dsw-alias-interactive-bg-hover)}.EtEeYG_summaryStale{background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-state-warn-label);justify-content:space-between;align-items:center;gap:10px;padding:6px 10px;font-size:11px;line-height:16px;display:flex}.EtEeYG_summaryBody{gap:10px;max-height:118px;padding:10px 12px;display:grid;overflow:auto}.EtEeYG_summarySection h4{color:var(--dsw-alias-label-primary);align-items:center;gap:6px;margin:0 0 4px;font-size:12px;line-height:18px;display:flex}.EtEeYG_summarySection h4>svg{color:var(--dsw-alias-label-secondary);flex:none}.EtEeYG_summarySection ul{color:var(--dsw-alias-label-secondary);gap:2px;margin:0;padding-left:18px;font-size:11px;line-height:17px;display:grid}.EtEeYG_summarySection li{overflow-wrap:anywhere;padding-left:1px}.EtEeYG_summarySection p{color:var(--dsw-alias-label-tertiary);margin:0;font-size:11px;line-height:17px}.EtEeYG_summarySection b{color:var(--dsw-alias-label-primary);font-weight:500}.EtEeYG_summaryActions{border-top:1px solid var(--dsw-alias-border-l1);grid-template-columns:auto 1fr auto auto;align-items:center;gap:4px;min-height:34px;padding:0 8px;display:grid}.EtEeYG_summaryActions button{min-height:26px;color:var(--dsw-alias-brand-primary);cursor:pointer;font:inherit;background:0 0;border:0;border-radius:6px;align-items:center;gap:5px;padding:0 6px;font-size:11px;line-height:16px;display:flex}.EtEeYG_summaryActions button:hover{background:var(--dsw-alias-interactive-bg-hover)}.EtEeYG_summaryPrivacy{border-top:1px solid var(--dsw-alias-border-l1);min-height:28px;color:var(--dsw-alias-label-tertiary);align-items:center;gap:6px;padding:0 10px;font-size:10px;line-height:15px;display:flex}.EtEeYG_summaryPrivacy svg{flex:none}.EtEeYG_summaryCopyError{color:var(--dsw-alias-state-error-primary);padding:4px 10px;font-size:10px;line-height:15px}@keyframes EtEeYG_summary-spin{to{transform:rotate(360deg)}}.EtEeYG_back{display:none}.EtEeYG_historyShell{flex:1;min-height:0;position:relative}.EtEeYG_history{box-sizing:border-box;flex-direction:column;gap:12px;height:100%;min-height:0;padding:16px;display:flex;overflow:auto}.EtEeYG_historyLoading{color:var(--dsw-alias-label-tertiary);align-items:center;gap:8px;margin:auto;font-size:12px;line-height:18px;display:flex}.EtEeYG_historyLoading>svg{color:var(--dsw-alias-brand-primary);animation:1s linear infinite EtEeYG_summary-spin}.EtEeYG_latestMessages{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-button-floating-fill);min-width:30px;min-height:30px;color:var(--dsw-alias-label-primary);box-shadow:var(--dsw-shadow-lv2);cursor:pointer;font:inherit;border-radius:16px;justify-content:center;align-items:center;gap:5px;padding:0 9px;font-size:11px;line-height:16px;display:flex;position:absolute;bottom:12px;left:50%;transform:translate(-50%)}.EtEeYG_latestMessages:hover{background:var(--dsw-alias-button-floating-hover)}.EtEeYG_message{align-self:flex-start;max-width:min(78%,420px)}.EtEeYG_message[data-outgoing]{align-self:flex-end}.EtEeYG_messageMeta{color:var(--dsw-alias-label-tertiary);justify-content:space-between;gap:10px;margin-bottom:3px;font-size:11px;line-height:16px;display:flex}.EtEeYG_message p,.EtEeYG_attachment{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;border-radius:12px;margin:0;padding:9px 11px;line-height:20px}.EtEeYG_message[data-outgoing] p,.EtEeYG_message[data-outgoing] .EtEeYG_attachment{background:var(--dsw-alias-interactive-bg-active)}.EtEeYG_mention{background:var(--dsw-alias-interactive-bg-active);color:var(--dsw-alias-brand-primary);border-radius:3px;padding:0 2px;font-weight:600}.EtEeYG_pendingMessage{grid-template-columns:auto minmax(0,1fr);align-self:flex-end;align-items:end;gap:7px;max-width:min(78%,420px);display:grid}.EtEeYG_pendingMessageSpinner{color:var(--dsw-alias-label-tertiary);margin-bottom:12px;animation:1s linear infinite EtEeYG_summary-spin}.EtEeYG_pendingMessageContent{opacity:.82;min-width:0}.EtEeYG_pendingMessageContent>p,.EtEeYG_pendingAttachment{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-interactive-bg-active);color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;border-radius:12px;margin:0;padding:9px 11px;line-height:20px}.EtEeYG_pendingAttachment{align-items:center;gap:9px;display:flex}.EtEeYG_pendingAttachment>svg{color:var(--dsw-alias-label-secondary);flex:none}.EtEeYG_pendingAttachment span{flex-direction:column;min-width:0;display:flex}.EtEeYG_pendingAttachment strong{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.EtEeYG_pendingAttachment small{color:var(--dsw-alias-label-tertiary)}.EtEeYG_pendingMessageContent>.EtEeYG_pendingCaption{color:var(--dsw-alias-label-secondary);background:0 0;border:0;margin-top:4px;padding:4px 8px;font-size:12px}.EtEeYG_attachment{cursor:pointer;font:inherit;text-align:left;align-items:center;gap:12px;display:flex}.EtEeYG_attachment span{flex-direction:column;min-width:0;display:flex}.EtEeYG_attachment strong{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.EtEeYG_attachment small{color:var(--dsw-alias-label-tertiary)}.EtEeYG_attachment:disabled{cursor:default}.EtEeYG_imageAttachment{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);width:280px;max-width:100%;color:var(--dsw-alias-label-primary);cursor:pointer;font:inherit;text-align:left;border-radius:12px;margin:0;padding:0;display:block;overflow:hidden}.EtEeYG_imageAttachment img{background:var(--dsw-alias-bg-layer-1);object-fit:contain;width:100%;max-height:280px;display:block}.EtEeYG_imageAttachment span{grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:0 10px;padding:7px 9px;display:grid}.EtEeYG_imageAttachment strong{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.EtEeYG_imageAttachment small{color:var(--dsw-alias-label-tertiary);grid-column:1}.EtEeYG_imageAttachment svg{grid-area:1/2/span 2}.EtEeYG_message .EtEeYG_caption{color:var(--dsw-alias-label-secondary);background:0 0;margin-top:4px;padding:4px 8px;font-size:12px}.EtEeYG_inlineError{color:var(--dsw-alias-state-error-primary);margin-top:4px;display:block}.EtEeYG_empty{color:var(--dsw-alias-label-tertiary);text-align:center;margin:auto;padding:20px}.EtEeYG_composer{border-top:1px solid var(--dsw-alias-border-l1);flex:none;gap:8px;padding:10px 14px 14px;display:grid}.EtEeYG_filePicker{border:1px solid var(--dsw-alias-border-l2);width:32px;height:32px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border-radius:50%;flex:none;place-items:center;padding:0;display:grid}.EtEeYG_filePicker:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.EtEeYG_filePicker:disabled{opacity:.45;cursor:default}.EtEeYG_fileInput{display:none}.EtEeYG_composeInput{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);border-radius:10px;gap:6px;min-width:0;padding:9px 10px 8px;display:grid;position:relative}.EtEeYG_mentionCandidates{z-index:3;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);max-height:180px;box-shadow:var(--dsw-shadow-lv2);border-radius:8px;padding:5px;position:absolute;bottom:calc(100% + 7px);left:0;right:0;overflow:auto}.EtEeYG_mentionCandidates button{width:100%;min-height:42px;color:var(--dsw-alias-label-primary);cursor:pointer;text-align:left;background:0 0;border:0;border-radius:6px;grid-template-rows:auto auto;grid-template-columns:28px minmax(0,1fr);align-items:center;column-gap:8px;padding:4px 7px;display:grid}.EtEeYG_mentionCandidates button:hover,.EtEeYG_mentionCandidates button[aria-selected=true]{background:var(--dsw-alias-interactive-bg-active)}.EtEeYG_mentionCandidates button>span{background:var(--dsw-alias-bg-layer-3);width:28px;height:28px;color:var(--dsw-alias-brand-primary);border-radius:50%;grid-row:1/span 2;place-items:center;font-size:10px;display:grid}.EtEeYG_mentionCandidates strong,.EtEeYG_mentionCandidates small{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.EtEeYG_mentionCandidates strong{align-self:end;font-size:12px;line-height:16px}.EtEeYG_mentionCandidates small{color:var(--dsw-alias-label-tertiary);align-self:start;font-size:10px;line-height:14px}.EtEeYG_composeInput:focus-within{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}.EtEeYG_composeInput textarea{resize:none;background:0 0;border:0;border-radius:0;outline:0;min-width:0;min-height:42px;padding:0}.EtEeYG_composeInput textarea:focus-visible{outline:0}.EtEeYG_composeActions{justify-content:space-between;align-items:center;min-height:32px;display:flex}.EtEeYG_filePreview{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:10px;align-items:center;gap:8px;width:min(240px,100% - 8px);min-height:36px;padding:5px 28px 5px 8px;display:flex;position:relative}.EtEeYG_filePreview[data-image]{width:72px;height:72px;min-height:0;padding:0}.EtEeYG_filePreview img{object-fit:cover;border-radius:9px;width:72px;height:72px;display:block}.EtEeYG_filePreviewIcon{color:var(--dsw-alias-label-secondary);flex:none;place-items:center;display:grid}.EtEeYG_filePreviewName{min-width:0;color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;font-size:12px;line-height:18px;overflow:hidden}.EtEeYG_removeFile{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-button-floating-fill);width:22px;height:22px;color:var(--dsw-alias-label-primary);box-shadow:var(--dsw-shadow-lv1);cursor:pointer;border-radius:50%;place-items:center;padding:0;display:grid;position:absolute;top:-7px;right:-7px}.EtEeYG_removeFile:hover{background:var(--dsw-alias-button-floating-hover)}.EtEeYG_send{background:var(--dsw-alias-button-primary-fill);width:32px;height:32px;color:var(--dsw-alias-label-primary-inverted);cursor:pointer;border:0;border-radius:50%;flex:none;place-items:center;padding:0;display:grid}.EtEeYG_send:disabled{opacity:.45;cursor:default}.EtEeYG_error{background:var(--dsw-alias-interactive-bg-hover-danger);color:var(--dsw-alias-state-error-primary);overflow-wrap:anywhere;flex:none;padding:8px 14px;font-size:12px;line-height:18px}.EtEeYG_pending{background:var(--dsw-alias-button-primary-fill);color:var(--dsw-alias-label-primary-inverted);box-shadow:var(--dsw-shadow-lv2);border-radius:9px;padding:7px 10px;font-size:12px;line-height:18px;position:absolute;bottom:14px;right:14px}@media (width<=620px){.EtEeYG_trigger span{display:none}.EtEeYG_trigger{justify-content:center;width:36px;padding:0}.EtEeYG_drawer{width:calc(100vw - 56px);min-width:0}.EtEeYG_chat{grid-template-columns:1fr}.EtEeYG_thread{display:none}.EtEeYG_thread[data-visible]{display:flex}.EtEeYG_roster[data-hidden]{display:none}.EtEeYG_back{display:grid}.EtEeYG_summaryPanel{max-height:min(190px,33%);margin-left:8px;margin-right:8px}.EtEeYG_summaryTrigger>span{display:none}.EtEeYG_summaryTrigger{justify-content:center;width:30px;padding:0}.EtEeYG_summaryTrigger>svg:last-child{display:none}}@media (height<=420px){.EtEeYG_drawer{border-radius:10px}.EtEeYG_drawerHeader{height:44px;padding:0 8px 0 12px}.EtEeYG_drawerHeader h2{font-size:14px;line-height:20px}.EtEeYG_drawerHeader button,.EtEeYG_back{width:28px;height:28px}.EtEeYG_centerState,.EtEeYG_threadEmpty{justify-content:flex-start;gap:8px;min-height:0;padding:12px;overflow:auto}.EtEeYG_registrationIcon{width:32px;height:32px}.EtEeYG_composeBackdrop{place-items:start center;padding:8px;inset:44px 0 0}.EtEeYG_composeCard{border-radius:10px;gap:8px;padding:12px}.EtEeYG_recoveryForm{gap:8px}.EtEeYG_identityCard{border-radius:8px;margin:6px 8px;padding:7px 9px}.EtEeYG_profileBio,.EtEeYG_profileTags,.EtEeYG_identityStatus{display:none}.EtEeYG_modeTabs{margin:0 8px 4px}.EtEeYG_modeTabs button{min-height:26px}.EtEeYG_rosterHeader{min-height:28px;padding:0 4px 2px 12px}.EtEeYG_conversationSelect{gap:7px;padding:5px 7px}.EtEeYG_avatar{width:28px;height:28px}.EtEeYG_threadHeader{gap:5px;height:44px;padding:0 8px}.EtEeYG_groupAccessNotice{grid-template-columns:18px minmax(0,1fr);gap:6px 8px;padding:8px}.EtEeYG_groupAccessActions{grid-column:2;justify-content:flex-start}.EtEeYG_groupDetails{top:44px;overflow-y:auto}.EtEeYG_groupDetailsHeader{z-index:2;background:var(--dsw-alias-bg-layer-1);min-height:44px;padding-left:12px;position:sticky;top:0}.EtEeYG_groupSummary{gap:2px;padding:8px 12px}.EtEeYG_groupSummary dl{gap:6px;margin-top:3px}.EtEeYG_groupInvite{gap:3px;padding:7px 12px}.EtEeYG_groupMemberSection{flex:none}.EtEeYG_groupMemberHeading{min-height:32px;padding-left:12px}.EtEeYG_groupMemberList{overflow:visible}.EtEeYG_groupMemberRow{min-height:40px}.EtEeYG_groupDetailsFooter{background:var(--dsw-alias-bg-layer-1);min-height:40px;padding:0 12px;position:sticky;bottom:0}.EtEeYG_history{gap:6px;padding:8px}.EtEeYG_composer{gap:4px;padding:5px 8px 7px}.EtEeYG_composeInput{gap:3px;padding:5px 7px 4px}.EtEeYG_composeInput textarea{height:28px;min-height:28px}.EtEeYG_composeActions{min-height:28px}.EtEeYG_filePicker,.EtEeYG_send{width:28px;height:28px}.EtEeYG_mentionCandidates{max-height:72px}.EtEeYG_compactModal.EtEeYG_compactModal{border-radius:12px;gap:10px;max-height:calc(100vh - 48px);padding-bottom:12px}}@media (hover:none){.EtEeYG_conversationMenu{opacity:1}}@media (prefers-reduced-motion:reduce){.EtEeYG_drawer{scroll-behavior:auto;transition:none}.EtEeYG_summaryLoading>svg,.EtEeYG_summaryTrigger:disabled>svg:first-child,.EtEeYG_historyLoading>svg,.EtEeYG_recoveryProgressPanel>svg,.EtEeYG_groupMemberHeading button[data-busy] svg,.EtEeYG_pendingMessageSpinner{animation:none}}";
7879
- const tagId$4 = "@awiki/dsh-plugin/AwikiOverlay.module.css";
7880
- if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$4) + "]") === null) {
7479
+ const css$3 = ".EtEeYG_trigger{z-index:2;border:1px solid var(--dsw-alias-border-l2);width:48px;height:48px;color:var(--dsw-alias-brand-primary);box-shadow:var(--dsw-shadow-lv2);cursor:grab;font:inherit;touch-action:none;user-select:none;background:#fff;border-radius:50%;place-items:center;padding:0;display:grid;position:fixed;overflow:visible}.EtEeYG_trigger:hover{box-shadow:var(--dsw-shadow-lv3);background:#fff}.EtEeYG_trigger:active,.EtEeYG_trigger[data-dragging]{cursor:grabbing}.EtEeYG_launcherIcon{object-fit:cover;pointer-events:none;border-radius:50%;width:100%;height:100%;display:block}.EtEeYG_unreadBadge{border:2px solid var(--dsw-alias-bg-base);background:var(--dsw-alias-state-error-primary);color:#fff;box-sizing:border-box;pointer-events:none;border-radius:10px;place-items:center;min-width:20px;height:20px;padding:0 5px;font-size:11px;font-weight:600;line-height:16px;display:grid;position:absolute;top:-5px;right:-5px}.EtEeYG_trigger:focus-visible,.EtEeYG_drawer button:focus-visible,.EtEeYG_drawer input:focus-visible,.EtEeYG_drawer textarea:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}.EtEeYG_drawer{--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);z-index:1;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);width:min(720px,100vw - 80px);min-width:min(360px,100vw - 80px);height:min(720px,100vh - 16px);color:var(--dsw-alias-label-primary);box-shadow:var(--dsw-shadow-lv3);border-radius:16px;flex-direction:column;transition:width .16s;display:flex;position:fixed;overflow:hidden}.EtEeYG_drawer[data-mode=mail]{width:min(1040px,100vw - 80px)}.EtEeYG_drawer[data-resizing]{user-select:none;transition:none}.EtEeYG_resizeHandle{z-index:5;touch-action:none;user-select:none;position:absolute}.EtEeYG_resizeHandle[data-resize-handle=n],.EtEeYG_resizeHandle[data-resize-handle=s]{cursor:ns-resize;height:8px;left:14px;right:14px}.EtEeYG_resizeHandle[data-resize-handle=n]{top:0}.EtEeYG_resizeHandle[data-resize-handle=s]{bottom:0}.EtEeYG_resizeHandle[data-resize-handle=e],.EtEeYG_resizeHandle[data-resize-handle=w]{cursor:ew-resize;width:8px;top:14px;bottom:14px}.EtEeYG_resizeHandle[data-resize-handle=e]{right:0}.EtEeYG_resizeHandle[data-resize-handle=w]{left:0}.EtEeYG_resizeHandle[data-resize-handle=ne],.EtEeYG_resizeHandle[data-resize-handle=se],.EtEeYG_resizeHandle[data-resize-handle=sw],.EtEeYG_resizeHandle[data-resize-handle=nw]{width:14px;height:14px}.EtEeYG_resizeHandle[data-resize-handle=ne]{cursor:nesw-resize;top:0;right:0}.EtEeYG_resizeHandle[data-resize-handle=se]{cursor:nwse-resize;bottom:0;right:0}.EtEeYG_resizeHandle[data-resize-handle=sw]{cursor:nesw-resize;bottom:0;left:0}.EtEeYG_resizeHandle[data-resize-handle=nw]{cursor:nwse-resize;top:0;left:0}.EtEeYG_drawerHeader{border-bottom:1px solid var(--dsw-alias-border-l1);cursor:grab;touch-action:none;user-select:none;flex:none;align-items:center;gap:8px;height:58px;padding:0 14px 0 18px;display:flex}.EtEeYG_drawerHeader[data-dragging]{cursor:grabbing}.EtEeYG_drawerHeader>div{flex:1;align-items:center;gap:8px;display:flex}.EtEeYG_drawerHeader h2{margin:0;font-size:16px;line-height:24px}.EtEeYG_drawerHeader button,.EtEeYG_back{cursor:pointer;width:32px;height:32px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:9px;place-items:center;padding:0;display:grid}.EtEeYG_drawerHeader button:hover,.EtEeYG_back:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.EtEeYG_centerState,.EtEeYG_threadEmpty{text-align:center;color:var(--dsw-alias-label-secondary);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:14px;padding:32px;display:flex}.EtEeYG_centerState p{overflow-wrap:anywhere;max-width:420px;margin:0}.EtEeYG_registrationIcon{background:var(--dsw-alias-interactive-bg-active);width:48px;height:48px;color:var(--dsw-alias-brand-primary);border-radius:50%;justify-self:center;place-items:center;display:grid}.EtEeYG_fileDraft input,.EtEeYG_composeRow textarea{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);width:100%;color:var(--dsw-alias-label-primary);font:inherit;border-radius:10px}.EtEeYG_primary,.EtEeYG_more,.EtEeYG_fileDraft button{background:var(--dsw-alias-button-primary-fill);min-height:36px;color:var(--dsw-alias-label-primary-inverted);cursor:pointer;font:inherit;border:0;border-radius:10px;padding:0 14px}.EtEeYG_primary:hover,.EtEeYG_fileDraft button:hover{background:var(--dsw-alias-button-primary-hover)}.EtEeYG_primary:disabled,.EtEeYG_fileDraft button:disabled{opacity:.5;cursor:default}.EtEeYG_secondary{border:1px solid var(--dsw-alias-border-l2);min-height:36px;color:var(--dsw-alias-label-primary);cursor:pointer;font:inherit;background:0 0;border-radius:10px;padding:0 14px}.EtEeYG_secondary:hover{background:var(--dsw-alias-interactive-bg-hover)}.EtEeYG_composeBackdrop{background:color-mix(in srgb, var(--dsw-alias-bg-layer-1) 72%, transparent);place-items:center;padding:24px;display:grid;position:absolute;inset:58px 0 0;overflow:auto}.EtEeYG_composeCard{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);width:min(360px,100%);box-shadow:var(--dsw-shadow-lv3);border-radius:14px;gap:12px;padding:20px;display:grid}.EtEeYG_composeCard h3{margin:0;font-size:16px;line-height:24px}.EtEeYG_composeCard p{color:var(--dsw-alias-label-secondary);margin:0;font-size:13px;line-height:20px}.EtEeYG_composeCard label{color:var(--dsw-alias-label-secondary);gap:6px;font-size:13px;line-height:20px;display:grid}.EtEeYG_composeCard input,.EtEeYG_composeCard textarea{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);width:100%;color:var(--dsw-alias-label-primary);font:inherit;border-radius:10px;padding:9px 12px}.EtEeYG_composeCard input{height:40px;padding-block:0}.EtEeYG_composeCard textarea{resize:vertical;min-height:92px}.EtEeYG_composeActions{justify-content:flex-end;gap:8px;display:flex}.EtEeYG_logoutWarning{color:var(--dsw-alias-label-secondary);gap:8px;font-size:13px;line-height:20px;display:grid}.EtEeYG_logoutWarning p{margin:0}.EtEeYG_logoutConfirm{border-color:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-state-error-primary)}.EtEeYG_compactModal.EtEeYG_compactModal{max-height:calc(100vh - 48px)}.EtEeYG_compactModalContent{min-height:0;overflow-y:auto}.EtEeYG_linkButton{color:var(--dsw-alias-brand-primary);cursor:pointer;background:0 0;border:0}.EtEeYG_notice{color:var(--dsw-alias-state-success-primary);text-align:center}.EtEeYG_identityAccess{flex:1;min-height:0;overflow:hidden}.EtEeYG_recoveryForm{width:100%;min-width:0;color:var(--dsw-alias-label-secondary);gap:14px;display:grid}.EtEeYG_recoveryForm h3{color:var(--dsw-alias-label-primary);text-align:center;margin:0}.EtEeYG_recoveryForm>p{text-align:center;margin:0;font-size:13px;line-height:20px}.EtEeYG_recoveryForm>label:not(.EtEeYG_recoveryConfirmation){gap:6px;font-size:13px;line-height:20px;display:grid}.EtEeYG_recoveryForm>label>input:not([type=checkbox]){box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);width:100%;height:40px;color:var(--dsw-alias-label-primary);font:inherit;border-radius:8px;padding:0 12px}.EtEeYG_recoveryForm input:focus-visible,.EtEeYG_recoveryForm button:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}.EtEeYG_recoveryStatusLine{border-bottom:1px solid var(--dsw-alias-border-l1);gap:3px;min-width:0;padding-bottom:10px;display:grid}.EtEeYG_recoveryStatusLine span{color:var(--dsw-alias-brand-primary);font-size:12px;font-weight:600}.EtEeYG_recoveryIdentitySummary{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:8px;grid-template-columns:max-content minmax(0,1fr);gap:6px 14px;min-width:0;padding:12px;font-size:12px;line-height:18px;display:grid}.EtEeYG_recoveryIdentitySummary span{color:var(--dsw-alias-label-tertiary)}.EtEeYG_recoveryIdentitySummary strong{overflow-wrap:anywhere;min-width:0;color:var(--dsw-alias-label-primary)}.EtEeYG_recoveryDiagnostics{border-top:1px solid var(--dsw-alias-border-l1);min-width:0;color:var(--dsw-alias-label-tertiary);padding-top:2px;font-size:11px;line-height:17px}.EtEeYG_recoveryDiagnostics summary{cursor:pointer;width:max-content;color:var(--dsw-alias-label-secondary);user-select:none}.EtEeYG_recoveryDiagnostics summary:hover{color:var(--dsw-alias-label-primary)}.EtEeYG_recoveryDiagnostics summary:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px;border-radius:4px}.EtEeYG_recoveryDiagnostics dl{gap:6px;margin:8px 0 0;display:grid}.EtEeYG_recoveryDiagnostics dl>div{gap:2px;min-width:0;display:grid}.EtEeYG_recoveryDiagnostics dt{color:var(--dsw-alias-label-tertiary)}.EtEeYG_recoveryDiagnostics dd{min-width:0;margin:0}.EtEeYG_recoveryDiagnostics code{overflow-wrap:anywhere;color:var(--dsw-alias-label-secondary);font-size:10px;line-height:16px;display:block}.EtEeYG_recoveryImpact{border-left:3px solid var(--dsw-alias-brand-primary);background:var(--dsw-alias-bg-layer-2);gap:6px;padding:12px;display:grid}.EtEeYG_recoveryImpact p{align-items:flex-start;gap:7px;margin:0;font-size:12px;line-height:18px;display:flex}.EtEeYG_recoveryImpact svg{flex:none;margin-top:2px}.EtEeYG_recoveryImpact p[data-tone=success] svg{color:var(--dsw-alias-state-success-primary)}.EtEeYG_recoveryImpact p[data-tone=neutral] svg{color:var(--dsw-alias-label-tertiary)}.EtEeYG_recoveryHandle{overflow-wrap:anywhere;color:var(--dsw-alias-label-primary);text-align:center;margin:-8px 0 0;font-size:13px;line-height:20px}.EtEeYG_recoveryConfirmationCopy{color:var(--dsw-alias-label-secondary);text-align:left;margin:0;font-size:12px;line-height:18px}.EtEeYG_recoveryProgressPanel{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);text-align:center;border-radius:8px;justify-items:center;gap:10px;min-width:0;padding:16px;display:grid}.EtEeYG_recoveryProgressPanel>svg{color:var(--dsw-alias-brand-primary);animation:1s linear infinite EtEeYG_summary-spin}.EtEeYG_recoveryProgressPanel p{margin:0;font-size:12px;line-height:18px}.EtEeYG_recoveryProgressPanel button{justify-content:center;align-items:center;gap:6px;width:100%;display:flex}.EtEeYG_chat{flex:1;grid-template-columns:240px minmax(0,1fr);min-height:0;display:grid}.EtEeYG_roster{border-right:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);flex-direction:column;min-width:0;display:flex}.EtEeYG_identityCard{background:var(--dsw-alias-bg-layer-3);border-radius:12px;flex-direction:column;gap:2px;margin:14px;padding:12px;display:flex}.EtEeYG_identityNameRow{align-items:center;min-width:0;min-height:24px;display:flex}.EtEeYG_profileAvatar{background:var(--dsw-alias-interactive-bg-active);width:24px;height:24px;color:var(--dsw-alias-brand-primary);border-radius:50%;flex:none;place-items:center;margin-right:7px;display:grid}.EtEeYG_identityNameText{min-width:0;color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:14px;line-height:22px;overflow:hidden}.EtEeYG_identityName{min-width:0;color:var(--dsw-alias-label-primary);font:inherit;text-align:left;text-overflow:ellipsis;white-space:nowrap;cursor:text;background:0 0;border:0;flex:1;padding:0;font-size:16px;font-weight:600;line-height:24px;overflow:hidden}.EtEeYG_identityName:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px;border-radius:4px}.EtEeYG_identityEdit{width:24px;height:24px;color:var(--dsw-alias-label-secondary);cursor:pointer;opacity:.72;background:0 0;border:0;border-radius:6px;flex:none;place-items:center;margin-left:4px;padding:0;transition:opacity .12s;display:grid}.EtEeYG_identityNameRow:hover .EtEeYG_identityEdit,.EtEeYG_identityNameRow:focus-within .EtEeYG_identityEdit{opacity:1}.EtEeYG_identityEdit:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.EtEeYG_identityEditor{flex:1;align-items:center;gap:4px;min-width:0;display:flex}.EtEeYG_identityEditor input{border:1px solid var(--dsw-alias-brand-primary);background:var(--dsw-alias-bg-layer-1);min-width:0;height:28px;color:var(--dsw-alias-label-primary);font:inherit;border-radius:7px;outline:none;flex:1;padding:0 8px;font-size:13px}.EtEeYG_identityEditor button{width:26px;height:26px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:6px;flex:none;place-items:center;padding:0;display:grid}.EtEeYG_identityEditor button:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.EtEeYG_identityEditor button:disabled,.EtEeYG_identityName:disabled{cursor:default;opacity:.5}.EtEeYG_identityEdit:disabled{cursor:default}.EtEeYG_identityHandle{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:11px;line-height:16px;overflow:hidden}.EtEeYG_identityStatus{color:var(--dsw-alias-state-success-primary);margin-top:4px;font-size:12px;line-height:18px}.EtEeYG_identityError{color:var(--dsw-alias-state-error-primary);margin-top:4px;font-size:11px;line-height:16px}.EtEeYG_identityCard i{background:var(--dsw-alias-state-success-primary);border-radius:50%;width:6px;height:6px;margin-right:5px;display:inline-block}.EtEeYG_profileBio{color:var(--dsw-alias-label-secondary);-webkit-line-clamp:2;-webkit-box-orient:vertical;margin:6px 0 2px;font-size:11px;line-height:17px;display:-webkit-box;overflow:hidden}.EtEeYG_profileTags{flex-wrap:wrap;gap:4px;margin-top:5px;display:flex}.EtEeYG_profileTags>span{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);min-width:0;max-width:100%;min-height:20px;color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;border-radius:7px;align-items:center;gap:3px;padding:0 6px;font-size:10px;line-height:16px;display:inline-flex}.EtEeYG_profileTags>span>button{width:16px;height:16px;color:inherit;cursor:pointer;background:0 0;border:0;border-radius:4px;place-items:center;padding:0;display:grid}.EtEeYG_profileTags>span>button:hover{background:var(--dsw-alias-interactive-bg-hover)}.EtEeYG_profileEditor{gap:10px;display:grid}.EtEeYG_profileEditor label{color:var(--dsw-alias-label-secondary);gap:4px;font-size:11px;line-height:16px;display:grid;position:relative}.EtEeYG_profileEditor label>small{color:var(--dsw-alias-label-tertiary);font-size:10px;position:absolute;top:0;right:1px}.EtEeYG_profileEditor input,.EtEeYG_profileEditor textarea{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);width:100%;color:var(--dsw-alias-label-primary);font:inherit;border-radius:7px;padding:7px 8px;font-size:12px}.EtEeYG_profileEditor input{height:32px;padding-block:0}.EtEeYG_profileEditor textarea{resize:vertical}.EtEeYG_profileTagEditor{gap:4px;display:grid}.EtEeYG_profileTagEditor>div:first-of-type{grid-template-columns:minmax(0,1fr) 30px;gap:5px;display:grid}.EtEeYG_profileTagEditor>div:first-of-type button{border:1px solid var(--dsw-alias-border-l2);width:30px;height:30px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border-radius:7px;place-items:center;padding:0;display:grid}.EtEeYG_profileEditorActions{grid-template-columns:1fr 1fr;gap:6px;margin-top:2px;display:grid}.EtEeYG_profileEditorActions button{min-width:0;padding-inline:6px;font-size:12px}.EtEeYG_modePanel{flex:1;min-height:0;display:none}.EtEeYG_modePanel[data-active]{display:flex}.EtEeYG_modeTabs{background:var(--dsw-alias-bg-layer-3);border-radius:9px;grid-template-columns:1fr 1fr;gap:4px;margin:0 14px 12px;padding:3px;display:grid}.EtEeYG_modeTabs button{min-height:30px;color:var(--dsw-alias-label-tertiary);cursor:pointer;font:inherit;background:0 0;border:0;border-radius:7px;justify-content:center;align-items:center;gap:5px;padding:0 8px;font-size:12px;line-height:18px;display:flex}.EtEeYG_modeTabs button:hover{color:var(--dsw-alias-label-primary)}.EtEeYG_modeTabs button[aria-selected=true]{background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);box-shadow:var(--dsw-shadow-lv1)}.EtEeYG_modeTabs small{min-width:18px;color:var(--dsw-alias-brand-primary);font-size:10px;line-height:14px}.EtEeYG_rosterHeader{justify-content:space-between;align-items:center;min-height:32px;padding:0 8px 8px 16px;display:flex}.EtEeYG_rosterTitle{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}.EtEeYG_rosterActions{align-items:center;gap:2px;display:flex}.EtEeYG_rosterAction{width:32px;height:32px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:9px;place-items:center;padding:0;display:grid}.EtEeYG_rosterAction:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.EtEeYG_rosterActions .EtEeYG_rosterAction{position:relative}.EtEeYG_rosterActions .EtEeYG_rosterAction small{background:var(--dsw-alias-bg-layer-3);min-width:14px;height:14px;color:var(--dsw-alias-label-secondary);box-sizing:border-box;border-radius:7px;place-items:center;padding:0 3px;font-size:9px;line-height:12px;display:grid;position:absolute;top:1px;right:0}.EtEeYG_groupRecoveryNotice{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:8px;align-items:flex-start;gap:8px;margin:0 8px 8px;padding:9px 10px;display:flex}.EtEeYG_groupRecoveryNotice[data-status=blocked]{border-color:var(--dsw-alias-state-error-primary)}.EtEeYG_groupRecoveryNotice>span{flex:1;gap:2px;min-width:0;display:grid}.EtEeYG_groupRecoveryNotice strong{font-size:12px;line-height:18px}.EtEeYG_groupRecoveryNotice small{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}.EtEeYG_groupRecoveryNotice button{width:28px;height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:7px;flex:none;place-items:center;padding:0;display:grid}.EtEeYG_groupRecoveryNotice button:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.EtEeYG_groupRecoveryNotice button:disabled{cursor:default;opacity:.5}.EtEeYG_conversationList{flex:1;min-height:0;padding:0 8px;overflow:auto}.EtEeYG_conversationRow{width:100%;color:inherit;background:0 0;border-radius:10px;grid-template-columns:minmax(0,1fr) auto;align-items:center;display:grid}.EtEeYG_conversationRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.EtEeYG_conversationRow[data-active]{background:var(--dsw-alias-interactive-bg-active)}.EtEeYG_conversationSelect{width:100%;min-width:0;color:inherit;cursor:pointer;text-align:left;background:0 0;border:0;border-radius:10px;align-items:center;gap:10px;padding:9px;display:flex}.EtEeYG_conversationMenu{width:28px;height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;opacity:0;background:0 0;border:0;border-radius:7px;place-items:center;margin-right:5px;padding:0;display:grid}.EtEeYG_conversationRow:hover .EtEeYG_conversationMenu,.EtEeYG_conversationRow:focus-within .EtEeYG_conversationMenu,.EtEeYG_conversationMenu[aria-expanded=true]{opacity:1}.EtEeYG_conversationMenu:hover{background:var(--dsw-alias-interactive-bg-active);color:var(--dsw-alias-label-primary)}.EtEeYG_conversationMenu:disabled{cursor:default;opacity:.45}.EtEeYG_avatar{background:var(--dsw-alias-interactive-bg-active);width:34px;height:34px;color:var(--dsw-alias-brand-primary);border-radius:50%;flex:none;place-items:center;font-size:12px;line-height:18px;display:grid;position:relative;overflow:visible}.EtEeYG_conversationUnreadBadge{border:2px solid var(--dsw-alias-bg-layer-2);background:var(--dsw-alias-state-error-primary);min-width:18px;height:18px;color:var(--dsw-alias-label-primary-inverted);box-sizing:border-box;pointer-events:none;border-radius:9px;place-items:center;padding:0 4px;font-size:10px;font-weight:600;line-height:14px;display:grid;position:absolute;top:-6px;right:-7px}.EtEeYG_conversationText{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.EtEeYG_conversationHeader{align-items:center;gap:8px;min-width:0;display:flex}.EtEeYG_conversationHeader strong{flex:1;min-width:0}.EtEeYG_conversationTime{color:var(--dsw-alias-label-tertiary);flex:none;font-size:11px;font-weight:400;line-height:16px}.EtEeYG_conversationText strong,.EtEeYG_conversationText small{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.EtEeYG_conversationText strong{font-size:13px;line-height:20px}.EtEeYG_conversationText small{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}.EtEeYG_more{background:var(--dsw-alias-button-elevated-fill);color:var(--dsw-alias-label-secondary);margin:8px}.EtEeYG_more:hover{background:var(--dsw-alias-interactive-bg-hover)}.EtEeYG_hiddenConversationList{max-height:min(320px,48vh);display:grid;overflow:auto}.EtEeYG_hiddenConversationRow{border-bottom:1px solid var(--dsw-alias-border-l1);grid-template-columns:32px minmax(0,1fr) auto;align-items:center;gap:9px;min-height:50px;padding:6px 2px;display:grid}.EtEeYG_hiddenConversationRow:last-child{border-bottom:0}.EtEeYG_hiddenConversationRow .EtEeYG_avatar{width:30px;height:30px}.EtEeYG_hiddenConversationRow>span:nth-child(2){min-width:0;display:grid}.EtEeYG_hiddenConversationRow strong,.EtEeYG_hiddenConversationRow small{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.EtEeYG_hiddenConversationRow strong{font-size:12px;line-height:18px}.EtEeYG_hiddenConversationRow small{color:var(--dsw-alias-label-tertiary);font-size:10px;line-height:15px}.EtEeYG_hiddenConversationRow>button{border:1px solid var(--dsw-alias-border-l2);min-height:28px;color:var(--dsw-alias-label-primary);cursor:pointer;font:inherit;background:0 0;border-radius:7px;padding:0 9px;font-size:11px}.EtEeYG_hiddenConversationRow>button:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.EtEeYG_hiddenConversationRow>button:disabled{cursor:default;opacity:.55}.EtEeYG_conversationPreferenceError{color:var(--dsw-alias-state-error-primary);font-size:11px;line-height:17px}.EtEeYG_thread{flex-direction:column;min-width:0;min-height:0;display:flex;position:relative}.EtEeYG_threadHeader{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;align-items:center;gap:8px;height:56px;padding:0 14px;display:flex}.EtEeYG_threadTitle{flex-direction:column;flex:1;min-width:0;display:flex}.EtEeYG_threadTitle strong,.EtEeYG_threadTitle small{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.EtEeYG_threadHeader small{color:var(--dsw-alias-label-tertiary)}.EtEeYG_threadAction{width:30px;height:30px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:8px;flex:none;place-items:center;padding:0;display:grid}.EtEeYG_threadAction:hover,.EtEeYG_threadAction[aria-expanded=true]{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.EtEeYG_groupAccessNotice{border-bottom:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);flex:none;grid-template-columns:20px minmax(0,1fr) auto;align-items:start;gap:8px 10px;padding:11px 14px;display:grid}.EtEeYG_groupAccessNotice[data-status=blocked],.EtEeYG_groupAccessNotice[data-status=not-member]{background:var(--dsw-alias-interactive-bg-hover-danger)}.EtEeYG_groupAccessNotice[data-compact]{grid-template-columns:20px minmax(0,1fr);padding:12px 16px}.EtEeYG_groupAccessIcon{min-height:20px;color:var(--dsw-alias-label-secondary);place-items:center;display:grid}.EtEeYG_groupAccessNotice[data-status=loading] .EtEeYG_groupAccessIcon svg,.EtEeYG_groupAccessNotice[data-status=recovering] .EtEeYG_groupAccessIcon svg{animation:1s linear infinite EtEeYG_summary-spin}.EtEeYG_groupAccessCopy{gap:2px;min-width:0;display:grid}.EtEeYG_groupAccessCopy strong{font-size:12px;line-height:18px}.EtEeYG_groupAccessCopy small{color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;font-size:11px;line-height:17px}.EtEeYG_groupAccessActions{flex-wrap:wrap;justify-content:flex-end;gap:6px;display:flex}.EtEeYG_groupAccessNotice[data-compact] .EtEeYG_groupAccessActions{grid-column:2;justify-content:flex-start}.EtEeYG_groupAccessActions button{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);min-height:28px;color:var(--dsw-alias-label-primary);cursor:pointer;font:inherit;border-radius:7px;justify-content:center;align-items:center;gap:5px;padding:0 8px;font-size:11px;line-height:16px;display:flex}.EtEeYG_groupAccessActions button:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.EtEeYG_groupAccessActions button:disabled{cursor:default;opacity:.55}.EtEeYG_groupDetails{z-index:4;border-left:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);width:min(360px,100%);min-width:0;box-shadow:var(--dsw-shadow-lv2);flex-direction:column;display:flex;position:absolute;top:56px;bottom:0;right:0;overflow:hidden}.EtEeYG_groupDetailsHeader{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;align-items:center;gap:12px;min-height:54px;padding:0 12px 0 16px;display:flex}.EtEeYG_groupDetailsHeader>div{flex-direction:column;flex:1;min-width:0;display:flex}.EtEeYG_groupDetailsHeader strong{font-size:14px;line-height:21px}.EtEeYG_groupDetailsHeader small{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:15px;overflow:hidden}.EtEeYG_groupDetailsHeader button,.EtEeYG_groupMemberHeading button,.EtEeYG_groupMemberRemove{width:28px;height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:7px;flex:none;place-items:center;padding:0;display:grid}.EtEeYG_groupDetailsHeader button:hover,.EtEeYG_groupMemberHeading button:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.EtEeYG_groupDetailsLoading{color:var(--dsw-alias-label-tertiary);margin:auto;font-size:12px}.EtEeYG_groupSummary{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;gap:5px;padding:16px;display:grid}.EtEeYG_groupSummary>strong{font-size:15px;line-height:22px}.EtEeYG_groupSummary>code{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;overflow:hidden}.EtEeYG_groupSummary>p{color:var(--dsw-alias-label-secondary);margin:3px 0 0;font-size:12px;line-height:18px}.EtEeYG_groupSummary dl{grid-template-columns:1fr 1fr;gap:8px;margin:8px 0 0;display:grid}.EtEeYG_groupSummary dl>div{gap:1px;display:grid}.EtEeYG_groupSummary dt{color:var(--dsw-alias-label-tertiary);font-size:10px}.EtEeYG_groupSummary dd{color:var(--dsw-alias-label-primary);margin:0;font-size:12px}.EtEeYG_groupInvite{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;gap:5px;padding:12px 16px;display:grid}.EtEeYG_groupInvite label{color:var(--dsw-alias-label-secondary);font-size:11px}.EtEeYG_groupInvite>div{grid-template-columns:minmax(0,1fr) 32px;gap:6px;display:grid}.EtEeYG_groupInvite input{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);min-width:0;height:32px;color:var(--dsw-alias-label-primary);font:inherit;border-radius:7px;padding:0 9px;font-size:12px}.EtEeYG_groupInvite button{background:var(--dsw-alias-button-primary-fill);width:32px;height:32px;color:var(--dsw-alias-label-primary-inverted);cursor:pointer;border:0;border-radius:7px;place-items:center;padding:0;display:grid}.EtEeYG_groupInvite button:disabled{cursor:default;opacity:.7}.EtEeYG_groupInvite button[data-busy] svg{animation:1s linear infinite EtEeYG_summary-spin}.EtEeYG_groupInviteStatus{overflow-wrap:anywhere;min-width:0;color:var(--dsw-alias-label-tertiary);margin:0;font-size:10px;line-height:16px}.EtEeYG_groupInviteStatus[data-state=success]{color:var(--dsw-alias-state-success-primary)}.EtEeYG_groupInviteStatus[data-state=error]{color:var(--dsw-alias-state-error-primary)}.EtEeYG_groupMemberSection{flex-direction:column;flex:1;min-height:0;display:flex}.EtEeYG_groupMemberHeading{flex:none;justify-content:space-between;align-items:center;min-height:40px;padding:0 12px 0 16px;display:flex}.EtEeYG_groupMemberHeading strong{font-size:12px;line-height:18px}.EtEeYG_groupMemberHeading button[data-busy] svg{animation:1s linear infinite EtEeYG_summary-spin}.EtEeYG_groupMemberRefreshStatus{overflow-wrap:anywhere;min-height:22px;color:var(--dsw-alias-label-tertiary);flex:none;margin:0;padding:2px 16px 4px;font-size:10px;line-height:16px}.EtEeYG_groupMemberRefreshStatus[data-state=success]{color:var(--dsw-alias-state-success-primary)}.EtEeYG_groupMemberRefreshStatus[data-state=error]{color:var(--dsw-alias-state-error-primary)}.EtEeYG_groupMemberList{min-height:0;padding:0 8px;overflow:auto}.EtEeYG_groupMemberRow{border-bottom:1px solid var(--dsw-alias-border-l1);grid-template-columns:30px minmax(0,1fr) auto 28px;align-items:center;gap:8px;min-height:48px;padding:4px 6px;display:grid}.EtEeYG_groupMemberAvatar{background:var(--dsw-alias-interactive-bg-active);width:30px;height:30px;color:var(--dsw-alias-brand-primary);border-radius:50%;place-items:center;font-size:11px;display:grid}.EtEeYG_groupMemberIdentity{flex-direction:column;min-width:0;display:flex}.EtEeYG_groupMemberIdentity strong{text-overflow:ellipsis;white-space:nowrap;align-items:center;gap:5px;font-size:12px;line-height:18px;display:flex;overflow:hidden}.EtEeYG_groupMemberIdentity strong small{background:var(--dsw-alias-interactive-bg-active);color:var(--dsw-alias-brand-primary);border-radius:4px;padding:0 4px;font-size:9px}.EtEeYG_groupMemberIdentity>small{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:15px;overflow:hidden}.EtEeYG_groupMemberRole{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:10px}.EtEeYG_groupMemberRemove:hover{background:var(--dsw-alias-interactive-bg-hover-danger);color:var(--dsw-alias-state-error-primary)}.EtEeYG_groupDetailsFooter{border-top:1px solid var(--dsw-alias-border-l1);flex:none;justify-content:space-between;align-items:center;gap:8px;min-height:46px;padding:0 16px;display:flex}.EtEeYG_groupDetailsFooter small{color:var(--dsw-alias-label-tertiary);font-size:10px}.EtEeYG_dangerText{color:var(--dsw-alias-state-error-primary);cursor:pointer;font:inherit;background:0 0;border:0;padding:0;font-size:12px}.EtEeYG_dangerText:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.EtEeYG_groupDetailsError{background:var(--dsw-alias-interactive-bg-hover-danger);color:var(--dsw-alias-state-error-primary);flex:none;padding:8px 12px;font-size:11px;line-height:17px}.EtEeYG_summaryTrigger{min-height:30px;color:var(--dsw-alias-brand-primary);cursor:pointer;font:inherit;background:0 0;border:0;border-radius:8px;flex:none;align-items:center;gap:5px;padding:0 8px;font-size:12px;line-height:18px;display:flex}.EtEeYG_summaryTrigger:hover{background:var(--dsw-alias-interactive-bg-hover)}.EtEeYG_summaryTrigger:disabled{cursor:default;opacity:.7}.EtEeYG_summaryTrigger[aria-expanded=true]>svg:last-child{transform:rotate(180deg)}.EtEeYG_summaryTrigger>svg:first-child{flex:none}.EtEeYG_summaryPanel{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);min-height:0;max-height:min(220px,33%);color:var(--dsw-alias-label-primary);border-radius:10px;flex:0 33%;margin:8px 10px 0;overflow:hidden}.EtEeYG_summaryPanel[data-collapsed]{flex-basis:auto;max-height:42px}.EtEeYG_summaryHeader{border-bottom:1px solid var(--dsw-alias-border-l1);align-items:center;gap:9px;min-height:38px;padding:0 8px 0 12px;display:flex}.EtEeYG_summaryHeader>span{color:var(--dsw-alias-brand-primary);align-items:center;gap:6px;display:flex}.EtEeYG_summaryHeader>span strong{color:var(--dsw-alias-label-primary);font-size:13px;line-height:20px}.EtEeYG_summaryHeader>small{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:11px;line-height:16px;overflow:hidden}.EtEeYG_summaryHeader>button{width:28px;height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:7px;flex:none;place-items:center;padding:0;display:grid}.EtEeYG_summaryHeader>button:hover{background:var(--dsw-alias-interactive-bg-hover)}.EtEeYG_summaryCollapsed{width:100%;min-height:40px;color:inherit;cursor:pointer;text-align:left;background:0 0;border:0;grid-template-columns:auto minmax(0,1fr) auto auto;align-items:center;gap:8px;padding:0 10px 0 12px;display:grid}.EtEeYG_summaryCollapsed:hover{background:var(--dsw-alias-interactive-bg-hover)}.EtEeYG_summaryCollapsed>span{color:var(--dsw-alias-brand-primary);align-items:center;gap:6px;font-size:12px;font-weight:600;display:flex}.EtEeYG_summaryCollapsed>small{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.EtEeYG_summaryCollapsed>em{color:var(--dsw-alias-state-warn-label);white-space:nowrap;font-size:11px;font-style:normal}.EtEeYG_summaryLoading{min-height:88px;color:var(--dsw-alias-brand-primary);justify-content:center;align-items:center;gap:10px;padding:16px;display:flex}.EtEeYG_summaryLoading>svg,.EtEeYG_summaryTrigger:disabled>svg:first-child{animation:1s linear infinite EtEeYG_summary-spin}.EtEeYG_summaryLoading>span{flex-direction:column;gap:2px;display:flex}.EtEeYG_summaryLoading strong{color:var(--dsw-alias-label-primary);font-size:13px;line-height:20px}.EtEeYG_summaryLoading small{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}.EtEeYG_summaryError{min-height:58px;color:var(--dsw-alias-state-error-primary);justify-content:space-between;align-items:center;gap:12px;padding:12px;font-size:12px;line-height:18px;display:flex}.EtEeYG_summaryError>span{overflow-wrap:anywhere;min-width:0}.EtEeYG_summaryError button,.EtEeYG_summaryStale button{border:1px solid var(--dsw-alias-border-l2);min-height:28px;color:var(--dsw-alias-label-primary);cursor:pointer;font:inherit;background:0 0;border-radius:7px;flex:none;align-items:center;gap:5px;padding:0 8px;font-size:11px;display:flex}.EtEeYG_summaryError button:hover,.EtEeYG_summaryStale button:hover{background:var(--dsw-alias-interactive-bg-hover)}.EtEeYG_summaryStale{background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-state-warn-label);justify-content:space-between;align-items:center;gap:10px;padding:6px 10px;font-size:11px;line-height:16px;display:flex}.EtEeYG_summaryBody{gap:10px;max-height:118px;padding:10px 12px;display:grid;overflow:auto}.EtEeYG_summarySection h4{color:var(--dsw-alias-label-primary);align-items:center;gap:6px;margin:0 0 4px;font-size:12px;line-height:18px;display:flex}.EtEeYG_summarySection h4>svg{color:var(--dsw-alias-label-secondary);flex:none}.EtEeYG_summarySection ul{color:var(--dsw-alias-label-secondary);gap:2px;margin:0;padding-left:18px;font-size:11px;line-height:17px;display:grid}.EtEeYG_summarySection li{overflow-wrap:anywhere;padding-left:1px}.EtEeYG_summarySection p{color:var(--dsw-alias-label-tertiary);margin:0;font-size:11px;line-height:17px}.EtEeYG_summarySection b{color:var(--dsw-alias-label-primary);font-weight:500}.EtEeYG_summaryActions{border-top:1px solid var(--dsw-alias-border-l1);grid-template-columns:auto 1fr auto auto;align-items:center;gap:4px;min-height:34px;padding:0 8px;display:grid}.EtEeYG_summaryActions button{min-height:26px;color:var(--dsw-alias-brand-primary);cursor:pointer;font:inherit;background:0 0;border:0;border-radius:6px;align-items:center;gap:5px;padding:0 6px;font-size:11px;line-height:16px;display:flex}.EtEeYG_summaryActions button:hover{background:var(--dsw-alias-interactive-bg-hover)}.EtEeYG_summaryPrivacy{border-top:1px solid var(--dsw-alias-border-l1);min-height:28px;color:var(--dsw-alias-label-tertiary);align-items:center;gap:6px;padding:0 10px;font-size:10px;line-height:15px;display:flex}.EtEeYG_summaryPrivacy svg{flex:none}.EtEeYG_summaryCopyError{color:var(--dsw-alias-state-error-primary);padding:4px 10px;font-size:10px;line-height:15px}@keyframes EtEeYG_summary-spin{to{transform:rotate(360deg)}}.EtEeYG_back{display:none}.EtEeYG_historyShell{flex:1;min-height:0;position:relative}.EtEeYG_history{box-sizing:border-box;flex-direction:column;gap:12px;height:100%;min-height:0;padding:16px;display:flex;overflow:auto}.EtEeYG_historyLoading{color:var(--dsw-alias-label-tertiary);align-items:center;gap:8px;margin:auto;font-size:12px;line-height:18px;display:flex}.EtEeYG_historyLoading>svg{color:var(--dsw-alias-brand-primary);animation:1s linear infinite EtEeYG_summary-spin}.EtEeYG_latestMessages{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-button-floating-fill);min-width:30px;min-height:30px;color:var(--dsw-alias-label-primary);box-shadow:var(--dsw-shadow-lv2);cursor:pointer;font:inherit;border-radius:16px;justify-content:center;align-items:center;gap:5px;padding:0 9px;font-size:11px;line-height:16px;display:flex;position:absolute;bottom:12px;left:50%;transform:translate(-50%)}.EtEeYG_latestMessages:hover{background:var(--dsw-alias-button-floating-hover)}.EtEeYG_message{align-self:flex-start;max-width:min(78%,420px)}.EtEeYG_message[data-outgoing]{align-self:flex-end}.EtEeYG_messageMeta{color:var(--dsw-alias-label-tertiary);justify-content:space-between;gap:10px;margin-bottom:3px;font-size:11px;line-height:16px;display:flex}.EtEeYG_message p,.EtEeYG_attachment{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;border-radius:12px;margin:0;padding:9px 11px;line-height:20px}.EtEeYG_message[data-outgoing] p,.EtEeYG_message[data-outgoing] .EtEeYG_attachment{background:var(--dsw-alias-interactive-bg-active)}.EtEeYG_mention{background:var(--dsw-alias-interactive-bg-active);color:var(--dsw-alias-brand-primary);border-radius:3px;padding:0 2px;font-weight:600}.EtEeYG_pendingMessage{grid-template-columns:auto minmax(0,1fr);align-self:flex-end;align-items:end;gap:7px;max-width:min(78%,420px);display:grid}.EtEeYG_pendingMessageSpinner{color:var(--dsw-alias-label-tertiary);margin-bottom:12px;animation:1s linear infinite EtEeYG_summary-spin}.EtEeYG_pendingMessageContent{opacity:.82;min-width:0}.EtEeYG_pendingMessageContent>p,.EtEeYG_pendingAttachment{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-interactive-bg-active);color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;border-radius:12px;margin:0;padding:9px 11px;line-height:20px}.EtEeYG_pendingAttachment{align-items:center;gap:9px;display:flex}.EtEeYG_pendingAttachment>svg{color:var(--dsw-alias-label-secondary);flex:none}.EtEeYG_pendingAttachment span{flex-direction:column;min-width:0;display:flex}.EtEeYG_pendingAttachment strong{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.EtEeYG_pendingAttachment small{color:var(--dsw-alias-label-tertiary)}.EtEeYG_pendingMessageContent>.EtEeYG_pendingCaption{color:var(--dsw-alias-label-secondary);background:0 0;border:0;margin-top:4px;padding:4px 8px;font-size:12px}.EtEeYG_attachment{cursor:pointer;font:inherit;text-align:left;align-items:center;gap:12px;display:flex}.EtEeYG_attachment span{flex-direction:column;min-width:0;display:flex}.EtEeYG_attachment strong{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.EtEeYG_attachment small{color:var(--dsw-alias-label-tertiary)}.EtEeYG_attachment:disabled{cursor:default}.EtEeYG_imageAttachment{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);width:280px;max-width:100%;color:var(--dsw-alias-label-primary);cursor:pointer;font:inherit;text-align:left;border-radius:12px;margin:0;padding:0;display:block;overflow:hidden}.EtEeYG_imageAttachment img{background:var(--dsw-alias-bg-layer-1);object-fit:contain;width:100%;max-height:280px;display:block}.EtEeYG_imageAttachment span{grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:0 10px;padding:7px 9px;display:grid}.EtEeYG_imageAttachment strong{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.EtEeYG_imageAttachment small{color:var(--dsw-alias-label-tertiary);grid-column:1}.EtEeYG_imageAttachment svg{grid-area:1/2/span 2}.EtEeYG_message .EtEeYG_caption{color:var(--dsw-alias-label-secondary);background:0 0;margin-top:4px;padding:4px 8px;font-size:12px}.EtEeYG_inlineError{color:var(--dsw-alias-state-error-primary);margin-top:4px;display:block}.EtEeYG_empty{color:var(--dsw-alias-label-tertiary);text-align:center;margin:auto;padding:20px}.EtEeYG_composer{border-top:1px solid var(--dsw-alias-border-l1);flex:none;gap:8px;padding:10px 14px 14px;display:grid}.EtEeYG_filePicker{border:1px solid var(--dsw-alias-border-l2);width:32px;height:32px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border-radius:50%;flex:none;place-items:center;padding:0;display:grid}.EtEeYG_filePicker:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.EtEeYG_filePicker:disabled{opacity:.45;cursor:default}.EtEeYG_fileInput{display:none}.EtEeYG_composeInput{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);border-radius:10px;gap:6px;min-width:0;padding:9px 10px 8px;display:grid;position:relative}.EtEeYG_mentionCandidates{z-index:3;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);max-height:180px;box-shadow:var(--dsw-shadow-lv2);border-radius:8px;padding:5px;position:absolute;bottom:calc(100% + 7px);left:0;right:0;overflow:auto}.EtEeYG_mentionCandidates button{width:100%;min-height:42px;color:var(--dsw-alias-label-primary);cursor:pointer;text-align:left;background:0 0;border:0;border-radius:6px;grid-template-rows:auto auto;grid-template-columns:28px minmax(0,1fr);align-items:center;column-gap:8px;padding:4px 7px;display:grid}.EtEeYG_mentionCandidates button:hover,.EtEeYG_mentionCandidates button[aria-selected=true]{background:var(--dsw-alias-interactive-bg-active)}.EtEeYG_mentionCandidates button>span{background:var(--dsw-alias-bg-layer-3);width:28px;height:28px;color:var(--dsw-alias-brand-primary);border-radius:50%;grid-row:1/span 2;place-items:center;font-size:10px;display:grid}.EtEeYG_mentionCandidates strong,.EtEeYG_mentionCandidates small{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.EtEeYG_mentionCandidates strong{align-self:end;font-size:12px;line-height:16px}.EtEeYG_mentionCandidates small{color:var(--dsw-alias-label-tertiary);align-self:start;font-size:10px;line-height:14px}.EtEeYG_composeInput:focus-within{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}.EtEeYG_composeInput textarea{resize:none;background:0 0;border:0;border-radius:0;outline:0;min-width:0;min-height:42px;padding:0}.EtEeYG_composeInput textarea:focus-visible{outline:0}.EtEeYG_composeActions{justify-content:space-between;align-items:center;min-height:32px;display:flex}.EtEeYG_filePreview{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:10px;align-items:center;gap:8px;width:min(240px,100% - 8px);min-height:36px;padding:5px 28px 5px 8px;display:flex;position:relative}.EtEeYG_filePreview[data-image]{width:72px;height:72px;min-height:0;padding:0}.EtEeYG_filePreview img{object-fit:cover;border-radius:9px;width:72px;height:72px;display:block}.EtEeYG_filePreviewIcon{color:var(--dsw-alias-label-secondary);flex:none;place-items:center;display:grid}.EtEeYG_filePreviewName{min-width:0;color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;font-size:12px;line-height:18px;overflow:hidden}.EtEeYG_removeFile{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-button-floating-fill);width:22px;height:22px;color:var(--dsw-alias-label-primary);box-shadow:var(--dsw-shadow-lv1);cursor:pointer;border-radius:50%;place-items:center;padding:0;display:grid;position:absolute;top:-7px;right:-7px}.EtEeYG_removeFile:hover{background:var(--dsw-alias-button-floating-hover)}.EtEeYG_send{background:var(--dsw-alias-button-primary-fill);width:32px;height:32px;color:var(--dsw-alias-label-primary-inverted);cursor:pointer;border:0;border-radius:50%;flex:none;place-items:center;padding:0;display:grid}.EtEeYG_send:disabled{opacity:.45;cursor:default}.EtEeYG_error{background:var(--dsw-alias-interactive-bg-hover-danger);color:var(--dsw-alias-state-error-primary);overflow-wrap:anywhere;flex:none;padding:8px 14px;font-size:12px;line-height:18px}.EtEeYG_pending{background:var(--dsw-alias-button-primary-fill);color:var(--dsw-alias-label-primary-inverted);box-shadow:var(--dsw-shadow-lv2);border-radius:9px;padding:7px 10px;font-size:12px;line-height:18px;position:absolute;bottom:14px;right:14px}@media (width<=620px){.EtEeYG_trigger span{display:none}.EtEeYG_trigger{justify-content:center;width:36px;padding:0}.EtEeYG_drawer{width:calc(100vw - 56px);min-width:0}.EtEeYG_chat{grid-template-columns:1fr}.EtEeYG_thread{display:none}.EtEeYG_thread[data-visible]{display:flex}.EtEeYG_roster[data-hidden]{display:none}.EtEeYG_back{display:grid}.EtEeYG_summaryPanel{max-height:min(190px,33%);margin-left:8px;margin-right:8px}.EtEeYG_summaryTrigger>span{display:none}.EtEeYG_summaryTrigger{justify-content:center;width:30px;padding:0}.EtEeYG_summaryTrigger>svg:last-child{display:none}}@media (height<=420px){.EtEeYG_drawer{border-radius:10px}.EtEeYG_drawerHeader{height:44px;padding:0 8px 0 12px}.EtEeYG_drawerHeader h2{font-size:14px;line-height:20px}.EtEeYG_drawerHeader button,.EtEeYG_back{width:28px;height:28px}.EtEeYG_centerState,.EtEeYG_threadEmpty{justify-content:flex-start;gap:8px;min-height:0;padding:12px;overflow:auto}.EtEeYG_registrationIcon{width:32px;height:32px}.EtEeYG_composeBackdrop{place-items:start center;padding:8px;inset:44px 0 0}.EtEeYG_composeCard{border-radius:10px;gap:8px;padding:12px}.EtEeYG_recoveryForm{gap:8px}.EtEeYG_identityCard{border-radius:8px;margin:6px 8px;padding:7px 9px}.EtEeYG_profileBio,.EtEeYG_profileTags,.EtEeYG_identityStatus{display:none}.EtEeYG_modeTabs{margin:0 8px 4px}.EtEeYG_modeTabs button{min-height:26px}.EtEeYG_rosterHeader{min-height:28px;padding:0 4px 2px 12px}.EtEeYG_conversationSelect{gap:7px;padding:5px 7px}.EtEeYG_avatar{width:28px;height:28px}.EtEeYG_threadHeader{gap:5px;height:44px;padding:0 8px}.EtEeYG_groupAccessNotice{grid-template-columns:18px minmax(0,1fr);gap:6px 8px;padding:8px}.EtEeYG_groupAccessActions{grid-column:2;justify-content:flex-start}.EtEeYG_groupDetails{top:44px;overflow-y:auto}.EtEeYG_groupDetailsHeader{z-index:2;background:var(--dsw-alias-bg-layer-1);min-height:44px;padding-left:12px;position:sticky;top:0}.EtEeYG_groupSummary{gap:2px;padding:8px 12px}.EtEeYG_groupSummary dl{gap:6px;margin-top:3px}.EtEeYG_groupInvite{gap:3px;padding:7px 12px}.EtEeYG_groupMemberSection{flex:none}.EtEeYG_groupMemberHeading{min-height:32px;padding-left:12px}.EtEeYG_groupMemberList{overflow:visible}.EtEeYG_groupMemberRow{min-height:40px}.EtEeYG_groupDetailsFooter{background:var(--dsw-alias-bg-layer-1);min-height:40px;padding:0 12px;position:sticky;bottom:0}.EtEeYG_history{gap:6px;padding:8px}.EtEeYG_composer{gap:4px;padding:5px 8px 7px}.EtEeYG_composeInput{gap:3px;padding:5px 7px 4px}.EtEeYG_composeInput textarea{height:28px;min-height:28px}.EtEeYG_composeActions{min-height:28px}.EtEeYG_filePicker,.EtEeYG_send{width:28px;height:28px}.EtEeYG_mentionCandidates{max-height:72px}.EtEeYG_compactModal.EtEeYG_compactModal{border-radius:12px;gap:10px;max-height:calc(100vh - 48px);padding-bottom:12px}}@media (hover:none){.EtEeYG_conversationMenu{opacity:1}}@media (prefers-reduced-motion:reduce){.EtEeYG_drawer{scroll-behavior:auto;transition:none}.EtEeYG_summaryLoading>svg,.EtEeYG_summaryTrigger:disabled>svg:first-child,.EtEeYG_historyLoading>svg,.EtEeYG_recoveryProgressPanel>svg,.EtEeYG_groupMemberHeading button[data-busy] svg,.EtEeYG_pendingMessageSpinner{animation:none}}";
7480
+ const tagId$3 = "@awiki/dsh-plugin/AwikiOverlay.module.css";
7481
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$3) + "]") === null) {
7881
7482
  const tag = document.createElement("style");
7882
7483
  tag.dataset.plugin = "@awiki/dsh-plugin";
7883
- tag.dataset.pluginCss = tagId$4;
7884
- tag.textContent = css$4;
7484
+ tag.dataset.pluginCss = tagId$3;
7485
+ tag.textContent = css$3;
7885
7486
  document.head.appendChild(tag);
7886
7487
  }
7887
7488
  var _dsh_awiki_css_AwikiOverlay_module_css_default = {
@@ -7939,6 +7540,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7939
7540
  "groupMemberRole": "EtEeYG_groupMemberRole",
7940
7541
  "groupMemberRow": "EtEeYG_groupMemberRow",
7941
7542
  "groupMemberSection": "EtEeYG_groupMemberSection",
7543
+ "groupRecoveryNotice": "EtEeYG_groupRecoveryNotice",
7942
7544
  "groupSummary": "EtEeYG_groupSummary",
7943
7545
  "hiddenConversationList": "EtEeYG_hiddenConversationList",
7944
7546
  "hiddenConversationRow": "EtEeYG_hiddenConversationRow",
@@ -8287,16 +7889,36 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8287
7889
  className: _dsh_awiki_css_AwikiOverlay_module_css_default.recoveryHandle,
8288
7890
  children: progress.fullHandle
8289
7891
  }),
8290
- (0, react_jsx_runtime.jsx)("div", {
7892
+ (0, react_jsx_runtime.jsxs)("div", {
8291
7893
  className: _dsh_awiki_css_AwikiOverlay_module_css_default.recoveryImpact,
8292
- children: (0, react_jsx_runtime.jsxs)("p", {
8293
- "data-tone": progress.localOrdinaryDataWillMigrate ? "success" : "neutral",
8294
- children: [
8295
- progress.localOrdinaryDataWillMigrate ? (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCheckOutline16, { size: 14 }) : (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconWarningOutline16, { size: 14 }),
8296
- "普通本地会话数据",
8297
- progress.localOrdinaryDataWillMigrate ? "将迁移到恢复后的身份" : "不会迁移"
8298
- ]
8299
- })
7894
+ children: [
7895
+ (0, react_jsx_runtime.jsxs)("p", {
7896
+ "data-tone": progress.localOrdinaryDataWillMigrate ? "success" : "neutral",
7897
+ children: [
7898
+ progress.localOrdinaryDataWillMigrate ? (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCheckOutline16, { size: 14 }) : (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconWarningOutline16, { size: 14 }),
7899
+ "普通本地会话数据",
7900
+ progress.localOrdinaryDataWillMigrate ? "将迁移到恢复后的身份" : "不会迁移"
7901
+ ]
7902
+ }),
7903
+ progress.unsupportedE2eeGroupCount > 0 && (0, react_jsx_runtime.jsxs)("p", {
7904
+ "data-tone": "neutral",
7905
+ children: [
7906
+ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconWarningOutline16, { size: 14 }),
7907
+ "有 ",
7908
+ progress.unsupportedE2eeGroupCount,
7909
+ " 个加密群聊无法自动迁移。"
7910
+ ]
7911
+ }),
7912
+ progress.unsupportedDidOnlyGroupCount > 0 && (0, react_jsx_runtime.jsxs)("p", {
7913
+ "data-tone": "neutral",
7914
+ children: [
7915
+ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconWarningOutline16, { size: 14 }),
7916
+ "有 ",
7917
+ progress.unsupportedDidOnlyGroupCount,
7918
+ " 个仅 DID 群聊需要手动处理。"
7919
+ ]
7920
+ })
7921
+ ]
8300
7922
  }),
8301
7923
  preCommit ? (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)("p", {
8302
7924
  className: _dsh_awiki_css_AwikiOverlay_module_css_default.recoveryConfirmationCopy,
@@ -8341,13 +7963,13 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8341
7963
  }
8342
7964
  //#endregion
8343
7965
  //#region \0dsh-awiki-css:AwikiIdentityAccess.module.css.mjs
8344
- const css$3 = ".r_slHG_accessFlow{width:100%;min-width:0;color:var(--dsw-alias-label-secondary);gap:14px;display:grid}.r_slHG_identityIcon,.r_slHG_progressIcon{width:48px;height:48px;color:var(--dsw-alias-brand-primary);background:var(--dsw-alias-interactive-bg-active);border-radius:50%;place-items:center;margin:0 auto;display:grid}.r_slHG_progressIcon svg{animation:1s linear infinite r_slHG_identity-spin}@keyframes r_slHG_identity-spin{to{transform:rotate(360deg)}}.r_slHG_headingGroup{text-align:center;gap:6px;display:grid}.r_slHG_headingGroup h3,.r_slHG_headingGroup p,.r_slHG_existingNotice p,.r_slHG_dangerPanel p{margin:0}.r_slHG_headingGroup h3{color:var(--dsw-alias-label-primary);font-size:18px;line-height:26px}.r_slHG_headingGroup p,.r_slHG_existingNotice p,.r_slHG_dangerPanel p{font-size:13px;line-height:20px}.r_slHG_headingGroup strong{color:var(--dsw-alias-label-primary);overflow-wrap:anywhere}.r_slHG_identitySummary{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:8px;grid-template-columns:max-content minmax(0,1fr);gap:6px 14px;padding:12px 14px;font-size:12px;line-height:18px;display:grid}.r_slHG_identitySummary span{color:var(--dsw-alias-label-tertiary)}.r_slHG_identitySummary strong{overflow-wrap:anywhere;min-width:0;color:var(--dsw-alias-label-primary)}.r_slHG_field{color:var(--dsw-alias-label-secondary);text-align:left;gap:6px;font-size:13px;line-height:20px;display:grid}.r_slHG_field input{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);width:100%;height:40px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);font:inherit;border-radius:8px;padding:0 12px}.r_slHG_field input:focus-visible,.r_slHG_primary:focus-visible,.r_slHG_secondary:focus-visible,.r_slHG_linkButton:focus-visible,.r_slHG_dangerLink:focus-visible,.r_slHG_dangerButton:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}.r_slHG_primary,.r_slHG_secondary,.r_slHG_dangerButton{cursor:pointer;min-height:40px;font:inherit;border-radius:8px;padding:0 14px}.r_slHG_primary{color:var(--dsw-alias-label-primary-inverted);background:var(--dsw-alias-button-primary-fill);border:0}.r_slHG_primary:hover{background:var(--dsw-alias-button-primary-hover)}.r_slHG_secondary{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:0 0}.r_slHG_secondary:hover{background:var(--dsw-alias-interactive-bg-hover)}.r_slHG_primary:disabled,.r_slHG_secondary:disabled,.r_slHG_linkButton:disabled,.r_slHG_dangerLink:disabled,.r_slHG_dangerButton:disabled{cursor:default;opacity:.5}.r_slHG_linkButton,.r_slHG_dangerLink{cursor:pointer;min-height:32px;font:inherit;background:0 0;border:0;padding:0;font-size:12px}.r_slHG_linkButton{color:var(--dsw-alias-brand-primary)}.r_slHG_dangerLink{color:var(--dsw-alias-state-error-primary)}.r_slHG_actionStack{gap:8px;display:grid}.r_slHG_existingNotice,.r_slHG_dangerPanel{border-left:3px solid var(--dsw-alias-brand-primary);background:var(--dsw-alias-bg-layer-2);gap:10px;padding:12px 14px;display:grid}.r_slHG_existingNotice strong{color:var(--dsw-alias-label-primary)}.r_slHG_dangerPanel{border-left-color:var(--dsw-alias-state-error-primary)}.r_slHG_dangerPanel strong{color:var(--dsw-alias-label-primary);font-size:13px;line-height:20px}.r_slHG_confirmation{color:var(--dsw-alias-label-secondary);align-items:flex-start;gap:8px;font-size:12px;line-height:18px;display:flex}.r_slHG_confirmation input{width:16px;height:16px;accent-color:var(--dsw-alias-state-error-primary);flex:none;margin:1px 0 0}.r_slHG_dangerButton{border:1px solid var(--dsw-alias-state-error-primary);color:var(--dsw-alias-state-error-primary);background:0 0}.r_slHG_dangerButton:hover{background:var(--dsw-alias-interactive-bg-hover-danger)}.r_slHG_recoveryHelp{border-top:1px solid var(--dsw-alias-border-l1);gap:10px;padding-top:14px;display:grid}.r_slHG_recoveryHelp p{color:var(--dsw-alias-label-secondary);margin:0;font-size:12px;line-height:18px}.r_slHG_notice,.r_slHG_error{overflow-wrap:anywhere;font-size:12px;line-height:18px}.r_slHG_notice{color:var(--dsw-alias-label-secondary)}.r_slHG_error{color:var(--dsw-alias-state-error-primary)}.r_slHG_sas{letter-spacing:.2em;text-align:center;font-variant-numeric:tabular-nums;font-size:32px}@media (height<=560px){.r_slHG_accessFlow{gap:8px}.r_slHG_identityIcon,.r_slHG_progressIcon{width:32px;height:32px}}@media (prefers-reduced-motion:reduce){.r_slHG_primary,.r_slHG_secondary,.r_slHG_linkButton,.r_slHG_dangerLink,.r_slHG_dangerButton{transition-duration:.001ms!important}.r_slHG_progressIcon svg{animation-duration:.001ms!important}}";
8345
- const tagId$3 = "@awiki/dsh-plugin/AwikiIdentityAccess.module.css";
8346
- if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$3) + "]") === null) {
7966
+ const css$2 = ".r_slHG_accessFlow{width:100%;min-width:0;color:var(--dsw-alias-label-secondary);gap:14px;display:grid}.r_slHG_identityIcon,.r_slHG_progressIcon{width:48px;height:48px;color:var(--dsw-alias-brand-primary);background:var(--dsw-alias-interactive-bg-active);border-radius:50%;place-items:center;margin:0 auto;display:grid}.r_slHG_progressIcon svg{animation:1s linear infinite r_slHG_identity-spin}@keyframes r_slHG_identity-spin{to{transform:rotate(360deg)}}.r_slHG_headingGroup{text-align:center;gap:6px;display:grid}.r_slHG_headingGroup h3,.r_slHG_headingGroup p,.r_slHG_existingNotice p,.r_slHG_dangerPanel p{margin:0}.r_slHG_headingGroup h3{color:var(--dsw-alias-label-primary);font-size:18px;line-height:26px}.r_slHG_headingGroup p,.r_slHG_existingNotice p,.r_slHG_dangerPanel p{font-size:13px;line-height:20px}.r_slHG_headingGroup strong{color:var(--dsw-alias-label-primary);overflow-wrap:anywhere}.r_slHG_identitySummary{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:8px;grid-template-columns:max-content minmax(0,1fr);gap:6px 14px;padding:12px 14px;font-size:12px;line-height:18px;display:grid}.r_slHG_identitySummary span{color:var(--dsw-alias-label-tertiary)}.r_slHG_identitySummary strong{overflow-wrap:anywhere;min-width:0;color:var(--dsw-alias-label-primary)}.r_slHG_field{color:var(--dsw-alias-label-secondary);text-align:left;gap:6px;font-size:13px;line-height:20px;display:grid}.r_slHG_field input{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);width:100%;height:40px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);font:inherit;border-radius:8px;padding:0 12px}.r_slHG_field input:focus-visible,.r_slHG_primary:focus-visible,.r_slHG_secondary:focus-visible,.r_slHG_linkButton:focus-visible,.r_slHG_dangerLink:focus-visible,.r_slHG_dangerButton:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}.r_slHG_primary,.r_slHG_secondary,.r_slHG_dangerButton{cursor:pointer;min-height:40px;font:inherit;border-radius:8px;padding:0 14px}.r_slHG_primary{color:var(--dsw-alias-label-primary-inverted);background:var(--dsw-alias-button-primary-fill);border:0}.r_slHG_primary:hover{background:var(--dsw-alias-button-primary-hover)}.r_slHG_secondary{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:0 0}.r_slHG_secondary:hover{background:var(--dsw-alias-interactive-bg-hover)}.r_slHG_primary:disabled,.r_slHG_secondary:disabled,.r_slHG_linkButton:disabled,.r_slHG_dangerLink:disabled,.r_slHG_dangerButton:disabled{cursor:default;opacity:.5}.r_slHG_linkButton,.r_slHG_dangerLink{cursor:pointer;min-height:32px;font:inherit;background:0 0;border:0;padding:0;font-size:12px}.r_slHG_linkButton{color:var(--dsw-alias-brand-primary)}.r_slHG_dangerLink{color:var(--dsw-alias-state-error-primary)}.r_slHG_actionStack{gap:8px;display:grid}.r_slHG_existingNotice,.r_slHG_dangerPanel{border-left:3px solid var(--dsw-alias-brand-primary);background:var(--dsw-alias-bg-layer-2);gap:10px;padding:12px 14px;display:grid}.r_slHG_existingNotice strong{color:var(--dsw-alias-label-primary)}.r_slHG_dangerPanel{border-left-color:var(--dsw-alias-state-error-primary)}.r_slHG_dangerPanel strong{color:var(--dsw-alias-label-primary);font-size:13px;line-height:20px}.r_slHG_confirmation{color:var(--dsw-alias-label-secondary);align-items:flex-start;gap:8px;font-size:12px;line-height:18px;display:flex}.r_slHG_confirmation input{width:16px;height:16px;accent-color:var(--dsw-alias-state-error-primary);flex:none;margin:1px 0 0}.r_slHG_dangerButton{border:1px solid var(--dsw-alias-state-error-primary);color:var(--dsw-alias-state-error-primary);background:0 0}.r_slHG_dangerButton:hover{background:var(--dsw-alias-interactive-bg-hover-danger)}.r_slHG_recoveryHelp{border-top:1px solid var(--dsw-alias-border-l1);gap:10px;padding-top:14px;display:grid}.r_slHG_recoveryHelp p{color:var(--dsw-alias-label-secondary);margin:0;font-size:12px;line-height:18px}.r_slHG_notice,.r_slHG_error{overflow-wrap:anywhere;font-size:12px;line-height:18px}.r_slHG_notice{color:var(--dsw-alias-label-secondary)}.r_slHG_error{color:var(--dsw-alias-state-error-primary)}@media (height<=560px){.r_slHG_accessFlow{gap:8px}.r_slHG_identityIcon,.r_slHG_progressIcon{width:32px;height:32px}}@media (prefers-reduced-motion:reduce){.r_slHG_primary,.r_slHG_secondary,.r_slHG_linkButton,.r_slHG_dangerLink,.r_slHG_dangerButton{transition-duration:.001ms!important}.r_slHG_progressIcon svg{animation-duration:.001ms!important}}";
7967
+ const tagId$2 = "@awiki/dsh-plugin/AwikiIdentityAccess.module.css";
7968
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$2) + "]") === null) {
8347
7969
  const tag = document.createElement("style");
8348
7970
  tag.dataset.plugin = "@awiki/dsh-plugin";
8349
- tag.dataset.pluginCss = tagId$3;
8350
- tag.textContent = css$3;
7971
+ tag.dataset.pluginCss = tagId$2;
7972
+ tag.textContent = css$2;
8351
7973
  document.head.appendChild(tag);
8352
7974
  }
8353
7975
  var _dsh_awiki_css_AwikiIdentityAccess_module_css_default = {
@@ -8369,7 +7991,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8369
7991
  "primary": "r_slHG_primary",
8370
7992
  "progressIcon": "r_slHG_progressIcon",
8371
7993
  "recoveryHelp": "r_slHG_recoveryHelp",
8372
- "sas": "r_slHG_sas",
8373
7994
  "secondary": "r_slHG_secondary"
8374
7995
  };
8375
7996
  //#endregion
@@ -8408,8 +8029,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8408
8029
  const [signedOutAlternative, setSignedOutAlternative] = (0, react.useState)("none");
8409
8030
  const [replaceConfirmed, setReplaceConfirmed] = (0, react.useState)(false);
8410
8031
  const [loginFailed, setLoginFailed] = (0, react.useState)(false);
8411
- const [joinContext, setJoinContext] = (0, react.useState)(null);
8412
- const [joinProgress, setJoinProgress] = (0, react.useState)(null);
8413
8032
  (0, react.useEffect)(() => {
8414
8033
  if (retryDeadline === null) return;
8415
8034
  const update = () => {
@@ -8454,7 +8073,36 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8454
8073
  setRetrySeconds(cooldownSeconds);
8455
8074
  setNotice(`注册验证码已发送;${cooldownSeconds} 秒后可重新获取。`);
8456
8075
  };
8457
- const requestIdentityOtp = requestRegistrationOtp;
8076
+ const requestIdentityOtp = async () => {
8077
+ setError(null);
8078
+ setNotice(null);
8079
+ const requestedHandle = handle.trim();
8080
+ const requestedPhone = phone.trim();
8081
+ const inspection = await props.inspectIdentityAccess({ handle: requestedHandle });
8082
+ if (!inspection.ok) {
8083
+ setError(inspection.error);
8084
+ return;
8085
+ }
8086
+ if (inspection.value.status === "existing") {
8087
+ const factorContext = {
8088
+ fullHandle: inspection.value.fullHandle,
8089
+ phone: requestedPhone
8090
+ };
8091
+ setRecoveryFactorContext(factorContext);
8092
+ const recovery = await props.sendRecoveryOtp(factorContext);
8093
+ if (!recovery.ok) {
8094
+ setRecoveryFactorContext(null);
8095
+ setError(recovery.error);
8096
+ return;
8097
+ }
8098
+ setRecoveryFactorContext({
8099
+ fullHandle: recovery.value.fullHandle,
8100
+ phone: requestedPhone
8101
+ });
8102
+ return;
8103
+ }
8104
+ await requestRegistrationOtp();
8105
+ };
8458
8106
  const completeRegistration = async () => {
8459
8107
  if (!registrationOtpSent) return;
8460
8108
  setError(null);
@@ -8467,77 +8115,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8467
8115
  setError(result.error);
8468
8116
  return;
8469
8117
  }
8470
- if (result.value.status === "join-required") {
8471
- setOtp("");
8472
- setJoinContext({
8473
- fullHandle: result.value.fullHandle,
8474
- phone: phone.trim()
8475
- });
8476
- return;
8477
- }
8478
8118
  setPhone("");
8479
8119
  setHandle("");
8480
8120
  resetIdentityEntry();
8481
8121
  };
8482
- const beginJoin = async () => {
8483
- setError(null);
8484
- const result = await props.beginDeviceJoin();
8485
- if (!result.ok) return setError(result.error);
8486
- setJoinProgress(result.value);
8487
- };
8488
- const cancelJoin = async () => {
8489
- setError(null);
8490
- const result = await props.cancelDeviceJoin();
8491
- if (!result.ok) return setError(result.error);
8492
- setJoinContext(null);
8493
- setJoinProgress(null);
8494
- resetIdentityEntry();
8495
- };
8496
- const chooseRecovery = async () => {
8497
- if (joinContext === null || !props.handleRecoveryPhoneEnabled) return;
8498
- setError(null);
8499
- const discarded = await props.cancelDeviceJoin();
8500
- if (!discarded.ok) return setError(discarded.error);
8501
- const recovery = await props.sendRecoveryOtp({
8502
- fullHandle: joinContext.fullHandle,
8503
- phone: joinContext.phone
8504
- });
8505
- if (!recovery.ok) return setError(recovery.error);
8506
- setRecoveryFactorContext({
8507
- fullHandle: recovery.value.fullHandle,
8508
- phone: joinContext.phone
8509
- });
8510
- setJoinContext(null);
8511
- };
8512
- (0, react.useEffect)(() => {
8513
- if (props.sessionStatus !== "unregistered" || joinContext !== null || joinProgress !== null || typeof props.getDeviceJoinStatus !== "function") return;
8514
- let active = true;
8515
- props.getDeviceJoinStatus().then((result) => {
8516
- if (!active) return;
8517
- if (!result.ok) setError(result.error);
8518
- else if (result.value !== null) setJoinProgress(result.value);
8519
- });
8520
- return () => {
8521
- active = false;
8522
- };
8523
- }, [props.sessionStatus]);
8524
- (0, react.useEffect)(() => {
8525
- if (joinProgress === null || [
8526
- "authorized",
8527
- "cancelled",
8528
- "rejected",
8529
- "expired"
8530
- ].includes(joinProgress.phase)) return;
8531
- const timer = setInterval(() => {
8532
- props.getDeviceJoinStatus().then((result) => {
8533
- if (!result.ok) setError(result.error);
8534
- else if (result.value !== null) setJoinProgress(result.value);
8535
- });
8536
- }, 2e3);
8537
- return () => {
8538
- clearInterval(timer);
8539
- };
8540
- }, [joinProgress?.phase]);
8541
8122
  const login = async () => {
8542
8123
  setError(null);
8543
8124
  setLoginFailed(false);
@@ -8583,94 +8164,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8583
8164
  requestTitle: "需要重新恢复身份",
8584
8165
  requestDescription: "这个 Handle 已在另一台设备完成了更新恢复,当前设备的旧凭证因此失效。验证绑定手机号后即可继续使用本机数据。"
8585
8166
  });
8586
- if (props.sessionStatus === "unregistered" && joinProgress !== null) {
8587
- const terminal = [
8588
- "cancelled",
8589
- "rejected",
8590
- "expired"
8591
- ].includes(joinProgress.phase);
8592
- return (0, react_jsx_runtime.jsx)(AwikiIdentityPage, { children: (0, react_jsx_runtime.jsxs)("div", {
8593
- className: _dsh_awiki_css_AwikiIdentityAccess_module_css_default.accessFlow,
8594
- children: [
8595
- (0, react_jsx_runtime.jsx)("div", {
8596
- className: _dsh_awiki_css_AwikiIdentityAccess_module_css_default.identityIcon,
8597
- children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconUserOutline16, { size: 24 })
8598
- }),
8599
- (0, react_jsx_runtime.jsxs)("div", {
8600
- className: _dsh_awiki_css_AwikiIdentityAccess_module_css_default.headingGroup,
8601
- children: [(0, react_jsx_runtime.jsx)("h3", { children: joinProgress.phase === "sas-ready" ? "核对安全码" : terminal ? "设备加入已结束" : "正在加入设备" }), (0, react_jsx_runtime.jsx)("p", { children: joinProgress.phase === "sas-ready" ? "请在已有管理设备上核对下面的 6 位安全码;只有两端一致时才批准。" : joinProgress.phase === "rejected" ? "管理设备拒绝了这次加入。" : joinProgress.phase === "expired" ? "这次设备加入已过期,请重新验证手机号。" : joinProgress.phase === "cancelled" ? "这次设备加入已取消。" : "请在已有 AWiki Me 或 CLI 管理设备上处理加入请求。" })]
8602
- }),
8603
- joinProgress.phase === "sas-ready" && (0, react_jsx_runtime.jsx)("strong", {
8604
- className: _dsh_awiki_css_AwikiIdentityAccess_module_css_default.sas,
8605
- children: joinProgress.sas
8606
- }),
8607
- !terminal && (0, react_jsx_runtime.jsxs)("small", {
8608
- className: _dsh_awiki_css_AwikiIdentityAccess_module_css_default.notice,
8609
- role: "status",
8610
- children: ["有效期至 ", joinProgress.expiresAt]
8611
- }),
8612
- (0, react_jsx_runtime.jsx)("button", {
8613
- type: "button",
8614
- className: terminal ? _dsh_awiki_css_AwikiIdentityAccess_module_css_default.primary : _dsh_awiki_css_AwikiIdentityAccess_module_css_default.secondary,
8615
- disabled: props.pending,
8616
- onClick: () => {
8617
- cancelJoin();
8618
- },
8619
- children: terminal ? "返回身份入口" : "取消加入"
8620
- }),
8621
- error !== null && (0, react_jsx_runtime.jsx)("small", {
8622
- className: _dsh_awiki_css_AwikiIdentityAccess_module_css_default.error,
8623
- role: "alert",
8624
- children: error
8625
- })
8626
- ]
8627
- }) });
8628
- }
8629
- if (props.sessionStatus === "unregistered" && joinContext !== null) return (0, react_jsx_runtime.jsx)(AwikiIdentityPage, { children: (0, react_jsx_runtime.jsxs)("div", {
8630
- className: _dsh_awiki_css_AwikiIdentityAccess_module_css_default.accessFlow,
8631
- children: [
8632
- (0, react_jsx_runtime.jsx)("div", {
8633
- className: _dsh_awiki_css_AwikiIdentityAccess_module_css_default.identityIcon,
8634
- children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconUserOutline16, { size: 24 })
8635
- }),
8636
- (0, react_jsx_runtime.jsxs)("div", {
8637
- className: _dsh_awiki_css_AwikiIdentityAccess_module_css_default.headingGroup,
8638
- children: [(0, react_jsx_runtime.jsx)("h3", { children: "这个 Handle 已存在" }), (0, react_jsx_runtime.jsx)("p", { children: "推荐把当前 DSH 作为新设备加入,原身份和其他设备会继续有效。" })]
8639
- }),
8640
- (0, react_jsx_runtime.jsx)("button", {
8641
- type: "button",
8642
- className: _dsh_awiki_css_AwikiIdentityAccess_module_css_default.primary,
8643
- disabled: props.pending,
8644
- onClick: () => {
8645
- beginJoin();
8646
- },
8647
- children: "加入新设备(推荐)"
8648
- }),
8649
- props.handleRecoveryPhoneEnabled && (0, react_jsx_runtime.jsx)("button", {
8650
- type: "button",
8651
- className: _dsh_awiki_css_AwikiIdentityAccess_module_css_default.dangerLink,
8652
- disabled: props.pending,
8653
- onClick: () => {
8654
- chooseRecovery();
8655
- },
8656
- children: "恢复 Handle(会替换 DID)"
8657
- }),
8658
- (0, react_jsx_runtime.jsx)("button", {
8659
- type: "button",
8660
- className: _dsh_awiki_css_AwikiIdentityAccess_module_css_default.secondary,
8661
- disabled: props.pending,
8662
- onClick: () => {
8663
- cancelJoin();
8664
- },
8665
- children: "取消"
8666
- }),
8667
- error !== null && (0, react_jsx_runtime.jsx)("small", {
8668
- className: _dsh_awiki_css_AwikiIdentityAccess_module_css_default.error,
8669
- role: "alert",
8670
- children: error
8671
- })
8672
- ]
8673
- }) });
8674
8167
  if (props.sessionStatus === "signed-out") {
8675
8168
  if (signedOutAlternative === "recover") return (0, react_jsx_runtime.jsx)(Recovery, {
8676
8169
  ...props,
@@ -8799,7 +8292,16 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8799
8292
  }),
8800
8293
  (0, react_jsx_runtime.jsxs)("div", {
8801
8294
  className: _dsh_awiki_css_AwikiIdentityAccess_module_css_default.headingGroup,
8802
- children: [(0, react_jsx_runtime.jsx)("h3", { children: registrationOtpSent ? "验证身份" : "进入 AWiki" }), (0, react_jsx_runtime.jsx)("p", { children: registrationOtpSent ? "输入注册验证码。新 Handle 会创建身份,已有 Handle 会进入设备加入选择。" : "输入 Handle 和手机号,统一获取注册验证码。" })]
8295
+ children: [(0, react_jsx_runtime.jsx)("h3", { children: registrationOtpSent ? "创建新身份" : "进入 AWiki" }), (0, react_jsx_runtime.jsx)("p", { children: registrationOtpSent ? "这个 Handle 尚未注册。输入刚收到的验证码以创建身份。" : "输入 Handle 和手机号。已有 Handle 会恢复身份,新 Handle 会创建身份。" })]
8296
+ }),
8297
+ props.legacySharedStateDetected === true && props.profileName != null && (0, react_jsx_runtime.jsxs)("div", {
8298
+ className: _dsh_awiki_css_AwikiIdentityAccess_module_css_default.existingNotice,
8299
+ role: "status",
8300
+ children: [(0, react_jsx_runtime.jsx)("strong", { children: "已为当前 Profile 隔离 AWiki 数据" }), (0, react_jsx_runtime.jsxs)("p", { children: [
8301
+ "检测到旧版共享数据。为避免多个 DSH Profile 同时占用数据库,当前 Profile「",
8302
+ props.profileName,
8303
+ "」使用独立数据目录;旧数据未删除或复制。请用原 Handle 和手机号恢复到此设备。"
8304
+ ] })]
8803
8305
  }),
8804
8306
  (0, react_jsx_runtime.jsxs)("label", {
8805
8307
  className: _dsh_awiki_css_AwikiIdentityAccess_module_css_default.field,
@@ -8842,7 +8344,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8842
8344
  type: "submit",
8843
8345
  className: _dsh_awiki_css_AwikiIdentityAccess_module_css_default.primary,
8844
8346
  disabled: props.pending || handle.trim() === "" || phone.trim() === "" || registrationOtpSent && otp.trim() === "",
8845
- children: registrationOtpSent ? "继续" : "获取验证码"
8347
+ children: registrationOtpSent ? "创建身份" : "获取验证码"
8846
8348
  }),
8847
8349
  registrationOtpSent && (0, react_jsx_runtime.jsx)("button", {
8848
8350
  type: "button",
@@ -9118,6 +8620,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9118
8620
  groupAccess: null,
9119
8621
  groupMembers: Object.freeze([]),
9120
8622
  groupMembersHasMore: false,
8623
+ groupRecovery: null,
9121
8624
  messages: Object.freeze([]),
9122
8625
  historyHasMore: false,
9123
8626
  localPending: false,
@@ -9125,7 +8628,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9125
8628
  pending: null,
9126
8629
  error: null,
9127
8630
  attachmentMaxBytes: 0,
9128
- handleRecoveryPhoneEnabled: false,
8631
+ profileName: null,
8632
+ legacySharedStateDetected: false,
9129
8633
  summaries: Object.freeze({}),
9130
8634
  recoveryOperationId: null,
9131
8635
  recoveryProgress: null
@@ -9181,9 +8685,48 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9181
8685
  default: return `${failure.code}:${failure.message}`;
9182
8686
  }
9183
8687
  }
8688
+ function groupRecoveryFailureMessage(failure) {
8689
+ return failure.code === "network" ? "无法连接 AWiki 服务,暂时不能恢复旧群聊身份。" : "暂时不能检查旧群聊身份,请稍后重试。";
8690
+ }
9184
8691
  function conversationPreferenceFailureMessage(_failure) {
9185
8692
  return "无法保存本机会话设置,请稍后重试。";
9186
8693
  }
8694
+ function recoveryFingerprint(parts) {
8695
+ let hash = 2166136261;
8696
+ for (const part of parts) {
8697
+ for (let index = 0; index < part.length; index += 1) {
8698
+ hash ^= part.charCodeAt(index);
8699
+ hash = Math.imul(hash, 16777619);
8700
+ }
8701
+ hash ^= 0;
8702
+ hash = Math.imul(hash, 16777619);
8703
+ }
8704
+ return (hash >>> 0).toString(16).padStart(8, "0");
8705
+ }
8706
+ function groupRecoveryProjection(summary, hiddenGroupDids) {
8707
+ const hiddenItems = summary.items.filter((item) => hiddenGroupDids.has(item.groupDid));
8708
+ const hiddenPending = hiddenItems.filter((item) => item.status === "pending").length;
8709
+ const hiddenBlocked = hiddenItems.filter((item) => item.status === "blocked").length;
8710
+ const pending = Math.max(0, summary.pending - hiddenPending);
8711
+ const blocked = Math.max(0, summary.blocked - hiddenBlocked);
8712
+ const signature = `v1:${pending}:${blocked}:${recoveryFingerprint(summary.items.filter((item) => !hiddenGroupDids.has(item.groupDid)).map((item) => `${item.status}:${item.groupDid}`).sort())}`;
8713
+ if (blocked > 0) return {
8714
+ view: {
8715
+ status: "blocked",
8716
+ pending,
8717
+ blocked
8718
+ },
8719
+ signature
8720
+ };
8721
+ return {
8722
+ view: pending > 0 ? {
8723
+ status: "pending",
8724
+ pending,
8725
+ blocked: 0
8726
+ } : null,
8727
+ signature
8728
+ };
8729
+ }
9187
8730
  function groupReadFailureReason(failure) {
9188
8731
  switch (failure.code) {
9189
8732
  case "group-identity-stale": return "recovering";
@@ -9361,18 +8904,23 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9361
8904
  ];
9362
8905
  /** Runtime-only decoded-byte budget that prevents repeat Host calls while browsing. */
9363
8906
  const BROWSER_IMAGE_ATTACHMENT_CACHE_MAX_BYTES = 33554432;
9364
- const RECOVERY_OPERATION_STORAGE_KEY = "awiki.handle-recovery.operation.v1";
9365
- function storedRecoveryOperation() {
8907
+ const RECOVERY_OPERATION_STORAGE_PREFIX = "awiki.handle-recovery.operation.v2:";
8908
+ function recoveryOperationStorageKey(tenantDomain) {
8909
+ return `${RECOVERY_OPERATION_STORAGE_PREFIX}${encodeURIComponent(tenantDomain)}`;
8910
+ }
8911
+ function storedRecoveryOperation(tenantDomain) {
9366
8912
  try {
9367
- return globalThis.localStorage?.getItem(RECOVERY_OPERATION_STORAGE_KEY) ?? null;
8913
+ return globalThis.localStorage?.getItem(recoveryOperationStorageKey(tenantDomain)) ?? null;
9368
8914
  } catch {
9369
8915
  return null;
9370
8916
  }
9371
8917
  }
9372
- function storeRecoveryOperation(operationId) {
8918
+ function storeRecoveryOperation(tenantDomain, operationId) {
8919
+ if (tenantDomain === void 0) return;
9373
8920
  try {
9374
- if (operationId === null) globalThis.localStorage?.removeItem(RECOVERY_OPERATION_STORAGE_KEY);
9375
- else globalThis.localStorage?.setItem(RECOVERY_OPERATION_STORAGE_KEY, operationId);
8921
+ const key = recoveryOperationStorageKey(tenantDomain);
8922
+ if (operationId === null) globalThis.localStorage?.removeItem(key);
8923
+ else globalThis.localStorage?.setItem(key, operationId);
9376
8924
  } catch {}
9377
8925
  }
9378
8926
  /** Wait between group-history readiness probes without retaining controller state. */
@@ -9442,12 +8990,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9442
8990
  directProfiles = /* @__PURE__ */ new Map();
9443
8991
  /** Last trustworthy group title for the active identity, keyed by canonical Group DID. */
9444
8992
  groupTitles = /* @__PURE__ */ new Map();
8993
+ /** Current secret-free Core journal state, keyed by canonical Group DID. */
8994
+ groupRecoveryItems = /* @__PURE__ */ new Map();
9445
8995
  /** Identity-scoped product overlays. Core conversations and history remain untouched. */
9446
8996
  hiddenConversationPreferences = /* @__PURE__ */ new Map();
8997
+ dismissedGroupRecoverySignature;
8998
+ lastGroupRecoverySignature;
8999
+ lastGroupRecoverySummary;
9447
9000
  /** Verified image payloads retained outside observable state for instant remounts. */
9448
9001
  imageAttachments = /* @__PURE__ */ new Map();
9449
9002
  imageAttachmentCacheBytes = 0;
9450
9003
  presentationCacheOwnerDid = null;
9004
+ groupRecoveryOperation;
9451
9005
  /**
9452
9006
  * @param remote - generated Host Remote namespace.
9453
9007
  * @param persistentImageCache - browser-origin verified preview cache.
@@ -9500,10 +9054,11 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9500
9054
  identity: session.value.status === "active" ? session.value.identity : null,
9501
9055
  error: null,
9502
9056
  attachmentMaxBytes: config.value.attachmentMaxBytes,
9503
- handleRecoveryPhoneEnabled: config.value.handleRecoveryPhoneEnabled,
9504
- recoveryOperationId: storedRecoveryOperation()
9057
+ profileName: config.value.profileName ?? null,
9058
+ legacySharedStateDetected: config.value.legacySharedStateDetected ?? false,
9059
+ recoveryOperationId: storedRecoveryOperation(config.value.tenantDomain)
9505
9060
  });
9506
- const operationId = storedRecoveryOperation();
9061
+ const operationId = storedRecoveryOperation(config.value.tenantDomain);
9507
9062
  if (operationId !== null) {
9508
9063
  const recovery = await call(() => this.remote.getRecoveryStatus({ operationId }));
9509
9064
  if (this.current(generation) && recovery.ok) {
@@ -9513,7 +9068,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9513
9068
  recoveryProgress: recovery.value
9514
9069
  });
9515
9070
  if (recovery.value.phase === "applied") {
9516
- storeRecoveryOperation(null);
9071
+ storeRecoveryOperation(config.value.tenantDomain, null);
9517
9072
  this.publish({
9518
9073
  ...this.view,
9519
9074
  recoveryOperationId: null,
@@ -9545,7 +9100,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9545
9100
  if (!loaded.ok) return loaded;
9546
9101
  const generation = this.generation;
9547
9102
  if (this.view.identity !== null) {
9548
- const listed = await this.refreshConversations(generation);
9103
+ const listed = await this.refreshConversationsAndRecoverGroups(generation);
9549
9104
  if (!listed.ok) return listed;
9550
9105
  }
9551
9106
  if (this.current(generation)) this.timer = setInterval(() => {
@@ -9573,8 +9128,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9573
9128
  ...INITIAL_VIEW,
9574
9129
  status: "ready",
9575
9130
  sessionStatus: "signed-out",
9576
- attachmentMaxBytes: this.config?.attachmentMaxBytes ?? 0,
9577
- handleRecoveryPhoneEnabled: this.config?.handleRecoveryPhoneEnabled ?? false
9131
+ attachmentMaxBytes: this.config?.attachmentMaxBytes ?? 0
9578
9132
  });
9579
9133
  return result;
9580
9134
  }
@@ -9628,49 +9182,15 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9628
9182
  const result = await this.withPending("注册身份", () => call(() => this.remote.registerIdentity(request), registrationFailureMessage));
9629
9183
  if (!result.ok) return result;
9630
9184
  if (!this.current(generation)) return result;
9631
- if (result.value.status === "registered") {
9632
- this.activatePresentationCache(result.value.identity);
9633
- this.publish({
9634
- ...this.view,
9635
- sessionStatus: "active",
9636
- identity: result.value.identity,
9637
- error: null
9638
- });
9639
- await this.refreshConversations(generation);
9640
- }
9641
- return result;
9642
- }
9643
- beginDeviceJoin() {
9644
- return this.withPending("开始加入设备", () => call(() => this.remote.beginDeviceJoin()));
9645
- }
9646
- async getDeviceJoinStatus() {
9647
- const result = await call(() => this.remote.getDeviceJoinStatus());
9648
- if (result.ok && result.value?.completed) await this.loadSession();
9649
- return result;
9650
- }
9651
- cancelDeviceJoin() {
9652
- return this.withPending("取消加入设备", async () => {
9653
- const result = await call(() => this.remote.cancelDeviceJoin());
9654
- return result.ok ? {
9655
- ok: true,
9656
- value: void 0
9657
- } : result;
9185
+ this.activatePresentationCache(result.value);
9186
+ this.publish({
9187
+ ...this.view,
9188
+ sessionStatus: "active",
9189
+ identity: result.value,
9190
+ error: null
9658
9191
  });
9659
- }
9660
- refreshDeviceManagement() {
9661
- return call(() => this.remote.refreshDeviceManagement());
9662
- }
9663
- startDeviceJoinVerification(request) {
9664
- return this.withPending("开始设备验证", () => call(() => this.remote.startDeviceJoinVerification(request)));
9665
- }
9666
- approveDeviceJoin(request) {
9667
- return this.withPending("批准设备", () => call(() => this.remote.approveDeviceJoin(request)));
9668
- }
9669
- rejectDeviceJoin(request) {
9670
- return this.withPending("拒绝设备", () => call(() => this.remote.rejectDeviceJoin(request)));
9671
- }
9672
- revokeDevice(request) {
9673
- return this.withPending("撤销设备", () => call(() => this.remote.revokeDevice(request)));
9192
+ await this.refreshConversationsAndRecoverGroups(generation);
9193
+ return result;
9674
9194
  }
9675
9195
  /**
9676
9196
  * Update the deployment identity's public display name.
@@ -9723,7 +9243,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9723
9243
  async sendRecoveryOtp(request) {
9724
9244
  const result = await this.withPending("发送恢复验证码", () => call(() => this.remote.sendRecoveryOtp(request), registrationOtpFailureMessage), { publishFailure: false });
9725
9245
  if (!result.ok) return result;
9726
- storeRecoveryOperation(result.value.operationId);
9246
+ storeRecoveryOperation(this.config?.tenantDomain, result.value.operationId);
9727
9247
  this.publish({
9728
9248
  ...this.view,
9729
9249
  recoveryOperationId: result.value.operationId,
@@ -9758,7 +9278,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9758
9278
  recoveryProgress: result.value
9759
9279
  });
9760
9280
  if (result.value.phase === "applied") {
9761
- storeRecoveryOperation(null);
9281
+ storeRecoveryOperation(this.config?.tenantDomain, null);
9762
9282
  this.publish({
9763
9283
  ...this.view,
9764
9284
  recoveryOperationId: null,
@@ -9779,7 +9299,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9779
9299
  recoveryProgress: result.value
9780
9300
  });
9781
9301
  if (result.value.phase === "applied") {
9782
- storeRecoveryOperation(null);
9302
+ storeRecoveryOperation(this.config?.tenantDomain, null);
9783
9303
  this.publish({
9784
9304
  ...this.view,
9785
9305
  recoveryOperationId: null,
@@ -9806,7 +9326,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9806
9326
  recoveryProgress: result.value
9807
9327
  });
9808
9328
  if (result.value.phase === "applied") {
9809
- storeRecoveryOperation(null);
9329
+ storeRecoveryOperation(this.config?.tenantDomain, null);
9810
9330
  this.publish({
9811
9331
  ...this.view,
9812
9332
  recoveryOperationId: null,
@@ -9827,7 +9347,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9827
9347
  if (phase !== void 0 && phase !== "awaiting_factor" && phase !== "ready_to_commit") return this.fail("当前恢复状态不能取消");
9828
9348
  const result = await this.withPending("取消身份恢复", () => call(() => this.remote.discardRecovery({ operationId })), { publishFailure: false });
9829
9349
  if (!result.ok) return result;
9830
- storeRecoveryOperation(null);
9350
+ storeRecoveryOperation(this.config?.tenantDomain, null);
9831
9351
  this.publish({
9832
9352
  ...this.view,
9833
9353
  recoveryOperationId: null,
@@ -9838,6 +9358,16 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9838
9358
  value: void 0
9839
9359
  };
9840
9360
  }
9361
+ /** Return cached browser-safe runtime policy, or load it once on demand. */
9362
+ async getConfig() {
9363
+ if (this.config !== null) return {
9364
+ ok: true,
9365
+ value: this.config
9366
+ };
9367
+ const result = await call(() => this.remote.getConfig(), mailFailureMessage);
9368
+ if (result.ok) this.config = result.value;
9369
+ return result;
9370
+ }
9841
9371
  /** Read the active deployment identity's public mailbox state. */
9842
9372
  getMailAccount() {
9843
9373
  return call(() => this.remote.getMailAccount(), mailFailureMessage);
@@ -9858,6 +9388,20 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9858
9388
  sendMail(request) {
9859
9389
  return call(() => this.remote.sendMail(request), mailFailureMessage);
9860
9390
  }
9391
+ /** Download one explicitly selected mail attachment without retaining its bytes. */
9392
+ async downloadMailAttachment(request) {
9393
+ if (this.disposed) return {
9394
+ ok: false,
9395
+ error: "AWiki 插件已卸载"
9396
+ };
9397
+ const generation = this.generation;
9398
+ const result = await call(() => this.remote.downloadMailAttachment(request), mailFailureMessage);
9399
+ if (!this.current(generation)) return {
9400
+ ok: false,
9401
+ error: "AWiki 已关闭"
9402
+ };
9403
+ return result;
9404
+ }
9861
9405
  /**
9862
9406
  * Load another page of the conversation roster.
9863
9407
  * @returns successful pagination or one display-safe failure.
@@ -9880,6 +9424,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9880
9424
  ...this.view,
9881
9425
  conversations: appendUnique(this.view.conversations, conversations.visible, (value) => value.id),
9882
9426
  hiddenConversations: conversations.hidden,
9427
+ groupRecovery: this.currentGroupRecoveryView(),
9883
9428
  conversationsHasMore: result.value.hasMore && result.value.nextCursor !== void 0
9884
9429
  });
9885
9430
  return {
@@ -9887,6 +9432,41 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9887
9432
  value: void 0
9888
9433
  };
9889
9434
  }
9435
+ /** Synchronize account projections, then retry Core's durable group-rebind journal. */
9436
+ async retryGroupRebindRecovery() {
9437
+ const generation = this.generation;
9438
+ return this.withPending("恢复群聊身份", async () => {
9439
+ const listed = await this.refreshConversations(generation, true);
9440
+ if (!listed.ok) return {
9441
+ ok: false,
9442
+ error: listed.error
9443
+ };
9444
+ return this.resumeGroupRebindRecovery(generation);
9445
+ });
9446
+ }
9447
+ /** Dismiss only the current recovery-summary revision; Core recovery remains untouched. */
9448
+ async dismissGroupRecoveryNotice() {
9449
+ const signature = this.lastGroupRecoverySignature;
9450
+ if (signature === void 0 || this.view.groupRecovery === null) return {
9451
+ ok: true,
9452
+ value: void 0
9453
+ };
9454
+ const result = await call(() => this.remote.updateConversationPreference({
9455
+ action: "dismiss-group-recovery",
9456
+ signature
9457
+ }), conversationPreferenceFailureMessage);
9458
+ if (!result.ok) return this.fail(result.error);
9459
+ this.applyConversationPreferences(result.value);
9460
+ this.publish({
9461
+ ...this.view,
9462
+ groupRecovery: null,
9463
+ error: null
9464
+ });
9465
+ return {
9466
+ ok: true,
9467
+ value: void 0
9468
+ };
9469
+ }
9890
9470
  /** Hide one recent row locally without leaving a group or deleting history. */
9891
9471
  async hideConversation(conversationId) {
9892
9472
  const conversation = this.view.conversations.find((item) => item.id === conversationId);
@@ -9923,6 +9503,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9923
9503
  localPending: false,
9924
9504
  refreshing: false
9925
9505
  } : {},
9506
+ groupRecovery: this.currentGroupRecoveryView(),
9926
9507
  error: null
9927
9508
  });
9928
9509
  return {
@@ -9953,6 +9534,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9953
9534
  ...this.view,
9954
9535
  conversations: appendUnique([conversation], this.view.conversations, (item) => item.id),
9955
9536
  hiddenConversations: this.hiddenConversationsView(),
9537
+ groupRecovery: this.currentGroupRecoveryView(),
9956
9538
  error: null
9957
9539
  });
9958
9540
  return {
@@ -10100,6 +9682,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10100
9682
  error: null
10101
9683
  });
10102
9684
  const result = await (async () => {
9685
+ if (this.view.groupAccess?.status !== "available" && this.view.groupAccess?.status !== "loading") await this.resumeGroupRebindRecovery(this.generation);
10103
9686
  const refreshed = await this.loadGroupState(conversation, true, true);
10104
9687
  return refreshed.ok ? {
10105
9688
  ok: true,
@@ -10654,13 +10237,14 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10654
10237
  if (!result.ok) return result;
10655
10238
  await this.persistentImageCache.clear().catch(() => void 0);
10656
10239
  this.close();
10240
+ const tenantDomain = this.config?.tenantDomain;
10657
10241
  this.config = null;
10658
10242
  this.conversationsCursor = void 0;
10659
10243
  this.historyCursor = void 0;
10660
10244
  this.unreadAtOpen.clear();
10661
10245
  this.summaryBaselines.clear();
10662
10246
  this.clearPresentationCache();
10663
- storeRecoveryOperation(null);
10247
+ storeRecoveryOperation(tenantDomain, null);
10664
10248
  this.publish({
10665
10249
  ...INITIAL_VIEW,
10666
10250
  status: "ready"
@@ -10688,10 +10272,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10688
10272
  conversation: { ...hidden.conversation },
10689
10273
  hiddenAt: hidden.hiddenAt
10690
10274
  });
10275
+ this.dismissedGroupRecoverySignature = preferences.dismissedGroupRecoverySignature;
10691
10276
  }
10692
10277
  hiddenConversationsView() {
10693
10278
  return [...this.hiddenConversationPreferences.values()].sort((left, right) => right.hiddenAt - left.hiddenAt).map((item) => item.conversation);
10694
10279
  }
10280
+ currentGroupRecoveryView() {
10281
+ const summary = this.lastGroupRecoverySummary;
10282
+ if (summary === void 0) return this.view.groupRecovery;
10283
+ const projection = groupRecoveryProjection(summary, new Set([...this.hiddenConversationPreferences.values()].map((item) => item.conversation).filter((conversation) => conversation.kind === "group").map((conversation) => conversation.groupDid)));
10284
+ this.lastGroupRecoverySignature = projection.signature;
10285
+ return projection.signature === this.dismissedGroupRecoverySignature ? null : projection.view;
10286
+ }
10695
10287
  async reconcileConversationPage(incoming, generation) {
10696
10288
  const current = [...this.view.conversations, ...this.view.hiddenConversations];
10697
10289
  const conversations = incoming.map((item) => this.cacheConversation(item, current.find((candidate) => candidate.id === item.id)));
@@ -10742,6 +10334,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10742
10334
  ...this.view,
10743
10335
  conversations: firstPage ? refreshed.visible : appendUnique(refreshed.visible, this.view.conversations, (value) => value.id),
10744
10336
  hiddenConversations: refreshed.hidden,
10337
+ groupRecovery: this.currentGroupRecoveryView(),
10745
10338
  conversationsHasMore: firstPage ? result.value.hasMore && result.value.nextCursor !== void 0 : this.view.conversationsHasMore,
10746
10339
  error: background ? this.view.error : null
10747
10340
  });
@@ -10774,6 +10367,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10774
10367
  this.groupMembersCursor = void 0;
10775
10368
  this.unreadAtOpen.clear();
10776
10369
  this.summaryBaselines.clear();
10370
+ this.groupRecoveryItems.clear();
10371
+ this.lastGroupRecoverySignature = void 0;
10372
+ this.lastGroupRecoverySummary = void 0;
10777
10373
  this.clearImageAttachments();
10778
10374
  this.publish({
10779
10375
  ...this.view,
@@ -10787,6 +10383,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10787
10383
  groupAccess: null,
10788
10384
  groupMembers: Object.freeze([]),
10789
10385
  groupMembersHasMore: false,
10386
+ groupRecovery: null,
10790
10387
  messages: Object.freeze([]),
10791
10388
  historyHasMore: false,
10792
10389
  localPending: false,
@@ -10796,6 +10393,45 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10796
10393
  summaries: Object.freeze({})
10797
10394
  });
10798
10395
  }
10396
+ /** Hydrate account-projected groups before asking Core to resume their durable rebind jobs. */
10397
+ async refreshConversationsAndRecoverGroups(generation, background = false) {
10398
+ const listed = await this.refreshConversations(generation, background);
10399
+ if (!listed.ok || !this.current(generation)) return listed;
10400
+ await this.resumeGroupRebindRecovery(generation);
10401
+ return listed;
10402
+ }
10403
+ resumeGroupRebindRecovery(generation) {
10404
+ const active = this.groupRecoveryOperation;
10405
+ if (active !== void 0 && active.generation === generation) return active.operation;
10406
+ let operation;
10407
+ operation = call(() => this.remote.resumeGroupRebindRecovery(), groupRecoveryFailureMessage).then((result) => {
10408
+ if (!this.current(generation)) return result;
10409
+ if (result.ok) {
10410
+ this.lastGroupRecoverySummary = result.value;
10411
+ this.groupRecoveryItems.clear();
10412
+ for (const item of result.value.items) this.groupRecoveryItems.set(item.groupDid, item.status);
10413
+ } else {
10414
+ this.lastGroupRecoverySummary = void 0;
10415
+ this.lastGroupRecoverySignature = "unavailable";
10416
+ }
10417
+ this.publish({
10418
+ ...this.view,
10419
+ groupRecovery: result.ok ? this.currentGroupRecoveryView() : this.dismissedGroupRecoverySignature === "unavailable" ? null : {
10420
+ status: "unavailable",
10421
+ pending: 0,
10422
+ blocked: 0
10423
+ }
10424
+ });
10425
+ return result;
10426
+ }).finally(() => {
10427
+ if (this.groupRecoveryOperation?.operation === operation) this.groupRecoveryOperation = void 0;
10428
+ });
10429
+ this.groupRecoveryOperation = {
10430
+ generation,
10431
+ operation
10432
+ };
10433
+ return operation;
10434
+ }
10799
10435
  async loadHistory(older) {
10800
10436
  const conversationId = this.view.selectedConversationId;
10801
10437
  if (conversationId === null) return this.fail("请先选择会话");
@@ -10837,7 +10473,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10837
10473
  if (this.polling || !this.current(generation) || this.view.identity === null) return;
10838
10474
  this.polling = true;
10839
10475
  try {
10840
- await this.refreshConversations(generation, true);
10476
+ const knownGroups = new Set(this.view.conversations.filter((conversation) => conversation.kind === "group").map((conversation) => conversation.groupDid));
10477
+ if ((await this.refreshConversations(generation, true)).ok && this.view.conversations.some((conversation) => conversation.kind === "group" && !knownGroups.has(conversation.groupDid))) await this.resumeGroupRebindRecovery(generation);
10841
10478
  const selected = this.view.selectedConversationId;
10842
10479
  if (selected === null || !this.current(generation)) return;
10843
10480
  if (this.selectedConversation()?.kind === "group" && this.view.groupAccess?.status !== "available") return;
@@ -10931,7 +10568,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10931
10568
  return selected === null ? void 0 : this.view.conversations.find((value) => value.id === selected);
10932
10569
  }
10933
10570
  publishGroupAccessFailure(conversation, reason) {
10934
- const status = reason;
10571
+ const journal = this.groupRecoveryItems.get(conversation.groupDid);
10572
+ const status = reason === "not-member" ? journal === "blocked" ? "blocked" : journal === "pending" ? "recovering" : "not-member" : reason;
10935
10573
  this.publish({
10936
10574
  ...this.view,
10937
10575
  groupAccess: {
@@ -10947,7 +10585,11 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10947
10585
  if (ownerDid === this.presentationCacheOwnerDid) return;
10948
10586
  this.directProfiles.clear();
10949
10587
  this.groupTitles.clear();
10588
+ this.groupRecoveryItems.clear();
10950
10589
  this.hiddenConversationPreferences.clear();
10590
+ this.dismissedGroupRecoverySignature = void 0;
10591
+ this.lastGroupRecoverySignature = void 0;
10592
+ this.lastGroupRecoverySummary = void 0;
10951
10593
  this.clearImageAttachments();
10952
10594
  this.presentationCacheOwnerDid = ownerDid;
10953
10595
  }
@@ -10955,7 +10597,11 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10955
10597
  clearPresentationCache() {
10956
10598
  this.directProfiles.clear();
10957
10599
  this.groupTitles.clear();
10600
+ this.groupRecoveryItems.clear();
10958
10601
  this.hiddenConversationPreferences.clear();
10602
+ this.dismissedGroupRecoverySignature = void 0;
10603
+ this.lastGroupRecoverySignature = void 0;
10604
+ this.lastGroupRecoverySummary = void 0;
10959
10605
  this.clearImageAttachments();
10960
10606
  this.presentationCacheOwnerDid = null;
10961
10607
  }
@@ -11314,36 +10960,190 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11314
10960
  const owner = mailListCacheOwner(ownerDid);
11315
10961
  if (owner === void 0) return "inbox";
11316
10962
  try {
11317
- return storage.getItem(`${FOLDER_PREFIX}${encodeURIComponent(owner)}`) === "sent" ? "sent" : "inbox";
10963
+ return storage.getItem(`${FOLDER_PREFIX}${encodeURIComponent(owner)}`) === "sent" ? "sent" : "inbox";
10964
+ } catch {
10965
+ return "inbox";
10966
+ }
10967
+ }
10968
+ /** Remember the current folder without storing any message content. */
10969
+ function writeMailFolderCache(storage, ownerDid, folder) {
10970
+ const owner = mailListCacheOwner(ownerDid);
10971
+ if (owner === void 0) return;
10972
+ try {
10973
+ storage.setItem(`${FOLDER_PREFIX}${encodeURIComponent(owner)}`, folder);
10974
+ } catch {}
10975
+ }
10976
+ //#endregion
10977
+ //#region lib/types/base64.js
10978
+ /** Linear-time standard Base64 syntax validation for bounded binary payloads. */
10979
+ function base64Character(code) {
10980
+ return code >= 65 && code <= 90 || code >= 97 && code <= 122 || code >= 48 && code <= 57 || code === 43 || code === 47;
10981
+ }
10982
+ /** Reject misplaced padding and non-Base64 bytes without recursive regexp matching. */
10983
+ function standardBase64Syntax(value) {
10984
+ if (value.length % 4 !== 0) return false;
10985
+ let dataEnd = value.length;
10986
+ if (dataEnd > 0 && value.charCodeAt(dataEnd - 1) === 61) dataEnd -= 1;
10987
+ if (dataEnd > 0 && value.charCodeAt(dataEnd - 1) === 61) dataEnd -= 1;
10988
+ for (let index = 0; index < dataEnd; index += 1) if (!base64Character(value.charCodeAt(index))) return false;
10989
+ for (let index = dataEnd; index < value.length; index += 1) if (value.charCodeAt(index) !== 61) return false;
10990
+ return true;
10991
+ }
10992
+ //#endregion
10993
+ //#region lib/types/client/mail-attachment.js
10994
+ /** Browser-only mail attachment selection, encoding, integrity, and download helpers. */
10995
+ function invalid(message) {
10996
+ throw new TypeError(message);
10997
+ }
10998
+ function fileName(value) {
10999
+ if (value.length === 0 || value.trim() !== value || value.replace(/[. ]+$/u, "") !== value || value === "." || value === ".." || new TextEncoder().encode(value).byteLength > 255 || /[\\/\p{C}]/u.test(value)) invalid("附件文件名无效。");
11000
+ return value;
11001
+ }
11002
+ function contentType(value) {
11003
+ if (value === "") return "application/octet-stream";
11004
+ if (!/^[A-Za-z0-9!#$&^_.+-]+\/[A-Za-z0-9!#$&^_.+-]+$/u.test(value)) invalid("附件 MIME 类型无效。");
11005
+ return value;
11006
+ }
11007
+ function assertLimits(limits) {
11008
+ if (!Number.isSafeInteger(limits.maxCount) || limits.maxCount < 0 || !Number.isSafeInteger(limits.maxBytes) || limits.maxBytes < 1 || !Number.isSafeInteger(limits.totalMaxBytes) || limits.totalMaxBytes < limits.maxBytes) invalid("邮件附件限制暂不可用。");
11009
+ }
11010
+ function base64(bytes) {
11011
+ let binary = "";
11012
+ const chunkSize = 32768;
11013
+ for (let offset = 0; offset < bytes.length; offset += chunkSize) binary += String.fromCharCode(...bytes.subarray(offset, offset + chunkSize));
11014
+ return btoa(binary);
11015
+ }
11016
+ /** Append browser File references after enforcing the exact Host-owned limits. */
11017
+ function selectMailAttachments(current, selected, limits, createId) {
11018
+ assertLimits(limits);
11019
+ const additions = Array.from(selected, (file) => ({
11020
+ id: createId(),
11021
+ file,
11022
+ fileName: fileName(file.name),
11023
+ contentType: contentType(file.type),
11024
+ sizeBytes: file.size,
11025
+ lastModified: file.lastModified
11026
+ }));
11027
+ const combined = [...current, ...additions];
11028
+ if (combined.length > limits.maxCount) invalid(`邮件最多选择 ${limits.maxCount} 个附件。`);
11029
+ for (const attachment of combined) {
11030
+ if (!Number.isSafeInteger(attachment.sizeBytes) || attachment.sizeBytes < 0) invalid("附件大小无效。");
11031
+ if (attachment.sizeBytes > limits.maxBytes) invalid(`单个附件不能超过 ${limits.maxBytes} bytes。`);
11032
+ }
11033
+ const total = combined.reduce((sum, attachment) => sum + attachment.sizeBytes, 0);
11034
+ if (!Number.isSafeInteger(total) || total > limits.totalMaxBytes) invalid(`附件总大小不能超过 ${limits.totalMaxBytes} bytes。`);
11035
+ return combined;
11036
+ }
11037
+ /** Re-read the same approved File objects and return JSON-safe Remote attachments. */
11038
+ async function encodeMailAttachments(attachments, limits) {
11039
+ selectMailAttachments([], attachments.map((value) => value.file), limits, () => "validation-only");
11040
+ const encoded = [];
11041
+ for (const attachment of attachments) {
11042
+ if (attachment.file.name !== attachment.fileName || contentType(attachment.file.type) !== attachment.contentType || attachment.file.size !== attachment.sizeBytes || attachment.file.lastModified !== attachment.lastModified) invalid(`附件 ${attachment.fileName} 已发生变化,请重新选择。`);
11043
+ let buffer;
11044
+ try {
11045
+ buffer = await attachment.file.arrayBuffer();
11046
+ } catch {
11047
+ invalid(`无法读取附件 ${attachment.fileName},请重新选择。`);
11048
+ }
11049
+ const bytes = new Uint8Array(buffer);
11050
+ if (bytes.byteLength !== attachment.sizeBytes) invalid(`附件 ${attachment.fileName} 的大小已发生变化,请重新选择。`);
11051
+ encoded.push({
11052
+ fileName: attachment.fileName,
11053
+ contentType: attachment.contentType,
11054
+ sizeBytes: bytes.byteLength,
11055
+ bytesBase64: base64(bytes)
11056
+ });
11057
+ }
11058
+ return encoded;
11059
+ }
11060
+ /** Return canonical download metadata only when the service supplied every required field. */
11061
+ function downloadableMailAttachment(value, maxBytes) {
11062
+ if (!Number.isSafeInteger(value.index) || value.index < 0 || value.index > 4294967295) return void 0;
11063
+ if (value.fileName === void 0 || value.contentType === void 0 || value.sizeBytes === void 0) return void 0;
11064
+ if (!/^(?:0|[1-9][0-9]*)$/u.test(value.sizeBytes)) return void 0;
11065
+ const sizeBytes = Number(value.sizeBytes);
11066
+ if (!Number.isSafeInteger(sizeBytes) || sizeBytes < 0 || sizeBytes > maxBytes) return void 0;
11067
+ try {
11068
+ return {
11069
+ index: value.index,
11070
+ fileName: fileName(value.fileName),
11071
+ contentType: contentType(value.contentType),
11072
+ sizeBytes
11073
+ };
11074
+ } catch {
11075
+ return;
11076
+ }
11077
+ }
11078
+ /** Validate exact metadata, canonical Base64, byte length, and SHA-256 before download. */
11079
+ async function prepareMailAttachmentDownload(value, expected, maxBytes) {
11080
+ if (fileName(value.fileName) !== expected.fileName || contentType(value.contentType) !== expected.contentType || value.sizeBytes !== expected.sizeBytes || value.sizeBytes > maxBytes) invalid("下载附件与邮件元数据不一致。");
11081
+ if (!/^[a-f0-9]{64}$/u.test(value.sha256)) invalid("下载附件完整性信息无效。");
11082
+ const expectedEncodedLength = Math.ceil(value.sizeBytes / 3) * 4;
11083
+ if (value.bytesBase64.length !== expectedEncodedLength || value.bytesBase64.length % 4 !== 0 || !standardBase64Syntax(value.bytesBase64)) invalid("下载附件编码无效。");
11084
+ let binary;
11085
+ try {
11086
+ binary = atob(value.bytesBase64);
11318
11087
  } catch {
11319
- return "inbox";
11088
+ invalid("下载附件编码无效。");
11320
11089
  }
11090
+ const bytes = Uint8Array.from(binary, (character) => character.charCodeAt(0));
11091
+ if (bytes.byteLength !== value.sizeBytes || base64(bytes) !== value.bytesBase64) invalid("下载附件大小或编码不一致。");
11092
+ const digest = new Uint8Array(await crypto.subtle.digest("SHA-256", bytes));
11093
+ if (Array.from(digest, (byte) => byte.toString(16).padStart(2, "0")).join("") !== value.sha256) invalid("下载附件完整性校验失败。");
11094
+ return {
11095
+ fileName: expected.fileName,
11096
+ contentType: expected.contentType,
11097
+ bytes
11098
+ };
11321
11099
  }
11322
- /** Remember the current folder without storing any message content. */
11323
- function writeMailFolderCache(storage, ownerDid, folder) {
11324
- const owner = mailListCacheOwner(ownerDid);
11325
- if (owner === void 0) return;
11100
+ /** Trigger one download and always revoke the temporary object URL immediately. */
11101
+ function savePreparedMailAttachment(value) {
11102
+ const url = URL.createObjectURL(new Blob([value.bytes], { type: value.contentType }));
11103
+ const anchor = document.createElement("a");
11326
11104
  try {
11327
- storage.setItem(`${FOLDER_PREFIX}${encodeURIComponent(owner)}`, folder);
11328
- } catch {}
11105
+ anchor.href = url;
11106
+ anchor.download = value.fileName;
11107
+ anchor.hidden = true;
11108
+ document.body.append(anchor);
11109
+ anchor.click();
11110
+ } finally {
11111
+ anchor.remove();
11112
+ URL.revokeObjectURL(url);
11113
+ }
11114
+ }
11115
+ /** Execute the exact Browser UI download path: Remote, integrity check, Blob, and save click. */
11116
+ async function downloadAndSaveMailAttachment(download, request, expected, maxBytes, active = () => true) {
11117
+ const result = await download(request);
11118
+ if (!active()) return false;
11119
+ if (!result.ok) invalid(result.error);
11120
+ const prepared = await prepareMailAttachmentDownload(result.value, expected, maxBytes);
11121
+ if (!active()) return false;
11122
+ savePreparedMailAttachment(prepared);
11123
+ return true;
11329
11124
  }
11330
11125
  //#endregion
11331
11126
  //#region \0dsh-awiki-css:AwikiMail.module.css.mjs
11332
- const css$2 = ".eMUW5a_mail{background:var(--dsw-alias-bg-layer-1);flex:1;grid-template-columns:240px 320px minmax(420px,1fr);min-height:0;display:grid;position:relative}.eMUW5a_sidebar,.eMUW5a_mailList,.eMUW5a_mailDetail{min-width:0;min-height:0}.eMUW5a_sidebar{border-right:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);flex-direction:column;display:flex}.eMUW5a_accountCard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:10px;gap:3px;margin:0 14px 12px;padding:10px 12px;display:grid}.eMUW5a_accountCard small,.eMUW5a_accountCard span{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:11px;line-height:16px;overflow:hidden}.eMUW5a_accountCard strong{text-overflow:ellipsis;white-space:nowrap;font-size:12px;line-height:18px;overflow:hidden}.eMUW5a_accountCard .eMUW5a_accountStatus{color:var(--dsw-alias-state-success-primary)}.eMUW5a_folderNav{gap:4px;padding:0 10px;display:grid}.eMUW5a_folderNav button{min-height:38px;color:var(--dsw-alias-label-secondary);cursor:pointer;font:inherit;text-align:left;background:0 0;border:0;border-radius:9px;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:9px;padding:0 10px;display:grid}.eMUW5a_folderNav button:hover{background:var(--dsw-alias-interactive-bg-hover)}.eMUW5a_folderNav button[data-active]{background:var(--dsw-alias-interactive-bg-active);color:var(--dsw-alias-label-primary)}.eMUW5a_folderNav small{min-width:20px;color:var(--dsw-alias-brand-primary);text-align:right}.eMUW5a_folderRow{color:var(--dsw-alias-label-secondary);border-radius:9px;grid-template-columns:minmax(0,1fr) 38px;display:grid}.eMUW5a_folderRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.eMUW5a_folderRow[data-active]{background:var(--dsw-alias-interactive-bg-active);color:var(--dsw-alias-label-primary)}.eMUW5a_folderRow>button{color:inherit;background:0 0;border-radius:0}.eMUW5a_folderRow>button:hover{background:0 0}.eMUW5a_folderRow>.eMUW5a_composeIconButton{border-radius:8px;grid-template-columns:1fr;place-items:center;gap:0;width:38px;padding:0}.eMUW5a_folderRow>.eMUW5a_composeIconButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.eMUW5a_mailList{border-right:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);flex-direction:column;display:flex;position:relative}.eMUW5a_listHeader,.eMUW5a_detailHeader{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;align-items:center;gap:9px;min-height:56px;padding:0 12px;display:flex}.eMUW5a_listHeader>div,.eMUW5a_detailHeader>div{flex-direction:column;flex:1;min-width:0;display:flex}.eMUW5a_listHeader strong,.eMUW5a_detailHeader strong,.eMUW5a_listHeader small,.eMUW5a_detailHeader small{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.eMUW5a_listHeader strong,.eMUW5a_detailHeader strong{font-size:13px;line-height:20px}.eMUW5a_listHeader small,.eMUW5a_detailHeader small{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}.eMUW5a_listHeader>button,.eMUW5a_detailBack{width:30px;height:30px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:8px;flex:none;place-items:center;padding:0;display:grid}.eMUW5a_listHeader>button:hover,.eMUW5a_detailBack:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.eMUW5a_listHeader>button:disabled{opacity:.5;cursor:default}.eMUW5a_detailBack{display:none}.eMUW5a_listHeader svg,.eMUW5a_loadingState svg{animation:none}.eMUW5a_listHeader button:disabled svg,.eMUW5a_loadingState svg{animation:1s linear infinite eMUW5a_mail-spin}@keyframes eMUW5a_mail-spin{to{transform:rotate(360deg)}}.eMUW5a_rows{flex:1;min-height:0;padding:6px;overflow:auto}.eMUW5a_mailRow{width:100%;min-height:82px;color:inherit;cursor:pointer;font:inherit;text-align:left;background:0 0;border:0;border-radius:10px;grid-template-columns:7px minmax(0,1fr) auto;gap:7px;padding:10px 9px;display:grid;position:relative}.eMUW5a_mailRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.eMUW5a_mailRow[data-active]{background:var(--dsw-alias-interactive-bg-active)}.eMUW5a_unreadDot{background:0 0;border-radius:50%;align-self:start;width:6px;height:6px;margin-top:7px}.eMUW5a_mailRow[data-unread] .eMUW5a_unreadDot{background:var(--dsw-alias-brand-primary)}.eMUW5a_rowContent{flex-direction:column;gap:2px;min-width:0;display:flex}.eMUW5a_rowTop{align-items:center;gap:8px;display:flex}.eMUW5a_rowTop strong{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-size:12px;line-height:18px;overflow:hidden}.eMUW5a_mailRow[data-unread] .eMUW5a_rowTop strong,.eMUW5a_mailRow[data-unread] .eMUW5a_rowSubject{font-weight:600}.eMUW5a_rowTop time{color:var(--dsw-alias-label-tertiary);flex:none;font-size:10px;line-height:15px}.eMUW5a_rowSubject,.eMUW5a_rowPreview{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.eMUW5a_rowSubject{color:var(--dsw-alias-label-primary);font-size:12px;line-height:18px}.eMUW5a_rowPreview{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}.eMUW5a_rowAttachment{color:var(--dsw-alias-label-tertiary);align-self:end;align-items:center;gap:2px;display:flex}.eMUW5a_rowAttachment small{font-size:10px}.eMUW5a_inlineError,.eMUW5a_detailError{background:var(--dsw-alias-interactive-bg-hover-danger);color:var(--dsw-alias-state-error-primary);justify-content:space-between;align-items:center;gap:8px;padding:8px 12px;font-size:11px;line-height:16px;display:flex}.eMUW5a_inlineError button{color:inherit;cursor:pointer;background:0 0;border:0;flex:none;text-decoration:underline}.eMUW5a_loadingState,.eMUW5a_emptyState,.eMUW5a_detailEmpty{color:var(--dsw-alias-label-tertiary);justify-content:center;align-items:center;gap:8px;font-size:12px;display:flex}.eMUW5a_loadingState{pointer-events:none;position:absolute;inset:56px 0 0}.eMUW5a_emptyState{flex-direction:column;min-height:180px}.eMUW5a_emptyState p,.eMUW5a_detailEmpty p{margin:0}.eMUW5a_loadMore{background:var(--dsw-alias-button-elevated-fill);min-height:34px;color:var(--dsw-alias-label-secondary);cursor:pointer;font:inherit;border:0;border-radius:9px;margin:7px}.eMUW5a_loadMore:hover{background:var(--dsw-alias-interactive-bg-hover)}.eMUW5a_mailDetail{background:var(--dsw-alias-bg-layer-1);flex-direction:column;display:flex;position:relative}.eMUW5a_detailEmpty{flex-direction:column;flex:1}.eMUW5a_detailEmpty button{background:var(--dsw-alias-button-primary-fill);min-height:34px;color:var(--dsw-alias-label-primary-inverted);cursor:pointer;border:0;border-radius:9px;padding:0 14px}.eMUW5a_markReadButton{border:1px solid var(--dsw-alias-border-l2);min-height:30px;color:var(--dsw-alias-label-primary);cursor:pointer;font:inherit;background:0 0;border-radius:8px;flex:none;padding:0 9px;font-size:11px}.eMUW5a_markReadButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.eMUW5a_markReadButton:disabled{opacity:.5;cursor:default}.eMUW5a_messageBody{flex:1;min-height:0;padding:22px 24px;overflow:auto}.eMUW5a_messageMeta{border-bottom:1px solid var(--dsw-alias-border-l1);padding-bottom:18px}.eMUW5a_messageMeta h3{overflow-wrap:anywhere;margin:0 0 5px;font-size:18px;line-height:27px}.eMUW5a_messageMeta>time{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}.eMUW5a_messageMeta dl{gap:3px;margin:14px 0 0;display:grid}.eMUW5a_messageMeta dl>div{grid-template-columns:48px minmax(0,1fr);gap:8px;font-size:11px;line-height:17px;display:grid}.eMUW5a_messageMeta dt{color:var(--dsw-alias-label-tertiary)}.eMUW5a_messageMeta dd{color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;margin:0}.eMUW5a_untrustedNotice{background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-tertiary);border-radius:8px;align-items:center;gap:7px;margin:16px 0;padding:8px 10px;font-size:11px;line-height:16px;display:flex}.eMUW5a_plainBody{min-height:120px;color:var(--dsw-alias-label-primary);white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:22px}.eMUW5a_truncatedNotice{color:var(--dsw-alias-state-warn-label);margin:14px 0 0;font-size:11px}.eMUW5a_attachments{border-top:1px solid var(--dsw-alias-border-l1);gap:8px;margin-top:22px;padding-top:16px;display:grid}.eMUW5a_attachments h4{margin:0;font-size:12px;line-height:18px}.eMUW5a_attachments>div{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:9px;align-items:center;gap:9px;padding:9px 10px;display:flex}.eMUW5a_attachments>div>span{flex-direction:column;min-width:0;display:flex}.eMUW5a_attachments strong{text-overflow:ellipsis;white-space:nowrap;font-size:11px;line-height:16px;overflow:hidden}.eMUW5a_attachments small{color:var(--dsw-alias-label-tertiary);font-size:10px;line-height:15px}.eMUW5a_notice{z-index:6;box-sizing:border-box;background:var(--dsw-alias-button-primary-fill);max-width:min(360px,100% - 32px);color:var(--dsw-alias-label-primary-inverted);box-shadow:var(--dsw-shadow-lv2);overflow-wrap:anywhere;pointer-events:none;text-align:center;border-radius:9px;padding:10px 14px;font-size:12px;line-height:18px;animation:2.4s both eMUW5a_mail-notice;position:absolute;top:16px;left:50%;transform:translate(-50%)}@keyframes eMUW5a_mail-notice{0%{opacity:0;transform:translate(-50%,-6px)}8%,88%{opacity:1;transform:translate(-50%)}to{opacity:0;transform:translate(-50%,-4px)}}.eMUW5a_composer{flex-direction:column;flex:1;min-height:0;display:flex}.eMUW5a_composeFields{flex-direction:column;flex:1;gap:11px;min-height:0;padding:18px 20px;display:flex;overflow:auto}.eMUW5a_composeFields label{color:var(--dsw-alias-label-secondary);grid-template-rows:max-content max-content;gap:5px;font-size:11px;line-height:16px;display:grid}.eMUW5a_composeFields input,.eMUW5a_composeFields textarea{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);width:100%;color:var(--dsw-alias-label-primary);font:inherit;resize:vertical;border-radius:9px;padding:8px 10px}.eMUW5a_composeFields input{height:38px}.eMUW5a_composeFields .eMUW5a_bodyField{flex:1;grid-template-rows:max-content minmax(160px,1fr);min-height:160px}.eMUW5a_bodyField textarea{resize:none;min-height:160px}.eMUW5a_composeError{color:var(--dsw-alias-state-error-primary);margin:0;font-size:11px;line-height:16px}.eMUW5a_composeFooter{border-top:1px solid var(--dsw-alias-border-l1);flex:none;justify-content:flex-end;gap:8px;padding:10px 14px;display:flex}.eMUW5a_cancelButton,.eMUW5a_sendButton{cursor:pointer;min-height:34px;font:inherit;border-radius:9px;justify-content:center;align-items:center;gap:6px;padding:0 13px;display:flex}.eMUW5a_cancelButton{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:0 0}.eMUW5a_sendButton{background:var(--dsw-alias-button-primary-fill);color:var(--dsw-alias-label-primary-inverted);border:0}.eMUW5a_cancelButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.eMUW5a_sendButton:hover{background:var(--dsw-alias-button-primary-hover)}.eMUW5a_confirmSummary{color:var(--dsw-alias-label-secondary);gap:6px;display:grid}.eMUW5a_confirmSummary p,.eMUW5a_discardText{overflow-wrap:anywhere;margin:0}@media (width<=1119px){.eMUW5a_mail{grid-template-columns:220px minmax(0,1fr)}.eMUW5a_mailList,.eMUW5a_mailDetail{grid-area:1/2}.eMUW5a_mailDetail,.eMUW5a_mail[data-detail-active] .eMUW5a_mailList{display:none}.eMUW5a_mail[data-detail-active] .eMUW5a_mailDetail{display:flex}.eMUW5a_detailBack{display:grid}}@media (width<=719px){.eMUW5a_mail{grid-template-columns:1fr}.eMUW5a_sidebar,.eMUW5a_mailList,.eMUW5a_mailDetail{grid-area:1/1}.eMUW5a_mailList,.eMUW5a_mailDetail,.eMUW5a_mail[data-pane=list] .eMUW5a_sidebar,.eMUW5a_mail[data-pane=detail] .eMUW5a_sidebar{display:none}.eMUW5a_mail[data-pane=list] .eMUW5a_mailList,.eMUW5a_mail[data-pane=detail] .eMUW5a_mailDetail{display:flex}.eMUW5a_messageBody{padding:18px}}@media (prefers-reduced-motion:reduce){.eMUW5a_listHeader button:disabled svg,.eMUW5a_loadingState svg,.eMUW5a_notice{animation:none}}";
11333
- const tagId$2 = "@awiki/dsh-plugin/AwikiMail.module.css";
11334
- if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$2) + "]") === null) {
11127
+ const css$1 = ".eMUW5a_mail{background:var(--dsw-alias-bg-layer-1);flex:1;grid-template-columns:240px 320px minmax(420px,1fr);min-height:0;display:grid;position:relative}.eMUW5a_sidebar,.eMUW5a_mailList,.eMUW5a_mailDetail{min-width:0;min-height:0}.eMUW5a_sidebar{border-right:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);flex-direction:column;display:flex}.eMUW5a_accountCard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:10px;gap:3px;margin:0 14px 12px;padding:10px 12px;display:grid}.eMUW5a_accountCard small,.eMUW5a_accountCard span{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:11px;line-height:16px;overflow:hidden}.eMUW5a_accountCard strong{text-overflow:ellipsis;white-space:nowrap;font-size:12px;line-height:18px;overflow:hidden}.eMUW5a_accountCard .eMUW5a_accountStatus{color:var(--dsw-alias-state-success-primary)}.eMUW5a_folderNav{gap:4px;padding:0 10px;display:grid}.eMUW5a_folderNav button{min-height:38px;color:var(--dsw-alias-label-secondary);cursor:pointer;font:inherit;text-align:left;background:0 0;border:0;border-radius:9px;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:9px;padding:0 10px;display:grid}.eMUW5a_folderNav button:hover{background:var(--dsw-alias-interactive-bg-hover)}.eMUW5a_folderNav button[data-active]{background:var(--dsw-alias-interactive-bg-active);color:var(--dsw-alias-label-primary)}.eMUW5a_folderNav small{min-width:20px;color:var(--dsw-alias-brand-primary);text-align:right}.eMUW5a_folderRow{color:var(--dsw-alias-label-secondary);border-radius:9px;grid-template-columns:minmax(0,1fr) 38px;display:grid}.eMUW5a_folderRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.eMUW5a_folderRow[data-active]{background:var(--dsw-alias-interactive-bg-active);color:var(--dsw-alias-label-primary)}.eMUW5a_folderRow>button{color:inherit;background:0 0;border-radius:0}.eMUW5a_folderRow>button:hover{background:0 0}.eMUW5a_folderRow>.eMUW5a_composeIconButton{border-radius:8px;grid-template-columns:1fr;place-items:center;gap:0;width:38px;padding:0}.eMUW5a_folderRow>.eMUW5a_composeIconButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.eMUW5a_mailList{border-right:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);flex-direction:column;display:flex;position:relative}.eMUW5a_listHeader,.eMUW5a_detailHeader{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;align-items:center;gap:9px;min-height:56px;padding:0 12px;display:flex}.eMUW5a_listHeader>div,.eMUW5a_detailHeader>div{flex-direction:column;flex:1;min-width:0;display:flex}.eMUW5a_listHeader strong,.eMUW5a_detailHeader strong,.eMUW5a_listHeader small,.eMUW5a_detailHeader small{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.eMUW5a_listHeader strong,.eMUW5a_detailHeader strong{font-size:13px;line-height:20px}.eMUW5a_listHeader small,.eMUW5a_detailHeader small{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}.eMUW5a_listHeader>button,.eMUW5a_detailBack{width:30px;height:30px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:8px;flex:none;place-items:center;padding:0;display:grid}.eMUW5a_listHeader>button:hover,.eMUW5a_detailBack:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.eMUW5a_listHeader>button:disabled{opacity:.5;cursor:default}.eMUW5a_detailBack{display:none}.eMUW5a_listHeader svg,.eMUW5a_loadingState svg{animation:none}.eMUW5a_listHeader button:disabled svg,.eMUW5a_loadingState svg{animation:1s linear infinite eMUW5a_mail-spin}.eMUW5a_listHeader>.eMUW5a_listBack{display:none}@keyframes eMUW5a_mail-spin{to{transform:rotate(360deg)}}.eMUW5a_rows{flex:1;min-height:0;padding:6px;overflow:auto}.eMUW5a_mailRow{width:100%;min-height:82px;color:inherit;cursor:pointer;font:inherit;text-align:left;background:0 0;border:0;border-radius:10px;grid-template-columns:7px minmax(0,1fr) auto;gap:7px;padding:10px 9px;display:grid;position:relative}.eMUW5a_mailRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.eMUW5a_mailRow[data-active]{background:var(--dsw-alias-interactive-bg-active)}.eMUW5a_unreadDot{background:0 0;border-radius:50%;align-self:start;width:6px;height:6px;margin-top:7px}.eMUW5a_mailRow[data-unread] .eMUW5a_unreadDot{background:var(--dsw-alias-brand-primary)}.eMUW5a_rowContent{flex-direction:column;gap:2px;min-width:0;display:flex}.eMUW5a_rowTop{align-items:center;gap:8px;display:flex}.eMUW5a_rowTop strong{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-size:12px;line-height:18px;overflow:hidden}.eMUW5a_mailRow[data-unread] .eMUW5a_rowTop strong,.eMUW5a_mailRow[data-unread] .eMUW5a_rowSubject{font-weight:600}.eMUW5a_rowTop time{color:var(--dsw-alias-label-tertiary);flex:none;font-size:10px;line-height:15px}.eMUW5a_rowSubject,.eMUW5a_rowPreview{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.eMUW5a_rowSubject{color:var(--dsw-alias-label-primary);font-size:12px;line-height:18px}.eMUW5a_rowPreview{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}.eMUW5a_rowAttachment{color:var(--dsw-alias-label-tertiary);align-self:end;align-items:center;gap:2px;display:flex}.eMUW5a_rowAttachment small{font-size:10px}.eMUW5a_inlineError,.eMUW5a_detailError{background:var(--dsw-alias-interactive-bg-hover-danger);color:var(--dsw-alias-state-error-primary);justify-content:space-between;align-items:center;gap:8px;padding:8px 12px;font-size:11px;line-height:16px;display:flex}.eMUW5a_inlineError button{color:inherit;cursor:pointer;background:0 0;border:0;flex:none;text-decoration:underline}.eMUW5a_loadingState,.eMUW5a_emptyState,.eMUW5a_detailEmpty{color:var(--dsw-alias-label-tertiary);justify-content:center;align-items:center;gap:8px;font-size:12px;display:flex}.eMUW5a_loadingState{pointer-events:none;position:absolute;inset:56px 0 0}.eMUW5a_emptyState{flex-direction:column;min-height:180px}.eMUW5a_emptyState p,.eMUW5a_detailEmpty p{margin:0}.eMUW5a_loadMore{background:var(--dsw-alias-button-elevated-fill);min-height:34px;color:var(--dsw-alias-label-secondary);cursor:pointer;font:inherit;border:0;border-radius:9px;margin:7px}.eMUW5a_loadMore:hover{background:var(--dsw-alias-interactive-bg-hover)}.eMUW5a_mailDetail{background:var(--dsw-alias-bg-layer-1);flex-direction:column;display:flex;position:relative}.eMUW5a_detailEmpty{flex-direction:column;flex:1}.eMUW5a_detailEmpty button{background:var(--dsw-alias-button-primary-fill);min-height:34px;color:var(--dsw-alias-label-primary-inverted);cursor:pointer;border:0;border-radius:9px;padding:0 14px}.eMUW5a_markReadButton{border:1px solid var(--dsw-alias-border-l2);min-height:30px;color:var(--dsw-alias-label-primary);cursor:pointer;font:inherit;background:0 0;border-radius:8px;flex:none;padding:0 9px;font-size:11px}.eMUW5a_markReadButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.eMUW5a_markReadButton:disabled{opacity:.5;cursor:default}.eMUW5a_messageBody{flex:1;min-height:0;padding:22px 24px;overflow:auto}.eMUW5a_messageMeta{border-bottom:1px solid var(--dsw-alias-border-l1);padding-bottom:18px}.eMUW5a_messageMeta h3{overflow-wrap:anywhere;margin:0 0 5px;font-size:18px;line-height:27px}.eMUW5a_messageMeta>time{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}.eMUW5a_messageMeta dl{gap:3px;margin:14px 0 0;display:grid}.eMUW5a_messageMeta dl>div{grid-template-columns:48px minmax(0,1fr);gap:8px;font-size:11px;line-height:17px;display:grid}.eMUW5a_messageMeta dt{color:var(--dsw-alias-label-tertiary)}.eMUW5a_messageMeta dd{color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;margin:0}.eMUW5a_untrustedNotice{background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-tertiary);border-radius:8px;align-items:center;gap:7px;margin:16px 0;padding:8px 10px;font-size:11px;line-height:16px;display:flex}.eMUW5a_plainBody{min-height:120px;color:var(--dsw-alias-label-primary);white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:22px}.eMUW5a_truncatedNotice{color:var(--dsw-alias-state-warn-label);margin:14px 0 0;font-size:11px}.eMUW5a_attachments{border-top:1px solid var(--dsw-alias-border-l1);gap:8px;min-width:0;margin-top:22px;padding-top:16px;display:grid}.eMUW5a_attachments h4{margin:0;font-size:12px;line-height:18px}.eMUW5a_attachments>div{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:9px;align-items:center;gap:9px;min-width:0;max-width:100%;padding:9px 10px;display:flex}.eMUW5a_attachments>div>span{flex-direction:column;flex:1;min-width:0;display:flex}.eMUW5a_attachments strong{text-overflow:ellipsis;white-space:nowrap;font-size:11px;line-height:16px;overflow:hidden}.eMUW5a_attachments small{color:var(--dsw-alias-label-tertiary);font-size:10px;line-height:15px}.eMUW5a_attachments button,.eMUW5a_selectedAttachments button{border:1px solid var(--dsw-alias-border-l2);min-height:30px;color:var(--dsw-alias-label-primary);cursor:pointer;font:inherit;background:0 0;border-radius:8px;flex:none;padding:0 10px;font-size:11px}.eMUW5a_attachments button:hover,.eMUW5a_selectedAttachments button:hover{background:var(--dsw-alias-interactive-bg-hover)}.eMUW5a_attachments button:disabled,.eMUW5a_selectedAttachments button:disabled{opacity:.5;cursor:default}.eMUW5a_attachments .eMUW5a_attachmentDownloadError{color:var(--dsw-alias-state-error-primary);overflow-wrap:anywhere}.eMUW5a_notice{z-index:6;box-sizing:border-box;background:var(--dsw-alias-button-primary-fill);max-width:min(360px,100% - 32px);color:var(--dsw-alias-label-primary-inverted);box-shadow:var(--dsw-shadow-lv2);overflow-wrap:anywhere;pointer-events:none;text-align:center;border-radius:9px;padding:10px 14px;font-size:12px;line-height:18px;animation:2.4s both eMUW5a_mail-notice;position:absolute;top:16px;left:50%;transform:translate(-50%)}@keyframes eMUW5a_mail-notice{0%{opacity:0;transform:translate(-50%,-6px)}8%,88%{opacity:1;transform:translate(-50%)}to{opacity:0;transform:translate(-50%,-4px)}}.eMUW5a_composer{flex-direction:column;flex:1;min-height:0;display:flex}.eMUW5a_composeFields{flex-direction:column;flex:1;gap:11px;min-height:0;padding:18px 20px;display:flex;overflow:auto}.eMUW5a_composeFields label{color:var(--dsw-alias-label-secondary);grid-template-rows:max-content max-content;gap:5px;font-size:11px;line-height:16px;display:grid}.eMUW5a_composeFields input,.eMUW5a_composeFields textarea{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);width:100%;color:var(--dsw-alias-label-primary);font:inherit;resize:vertical;border-radius:9px;padding:8px 10px}.eMUW5a_composeFields input{height:38px}.eMUW5a_composeFields .eMUW5a_bodyField{flex:1;grid-template-rows:max-content minmax(160px,1fr);min-height:160px}.eMUW5a_bodyField textarea{resize:none;min-height:160px}.eMUW5a_composeAttachments{gap:9px;display:grid}.eMUW5a_attachmentPickerRow{align-items:center;gap:10px;display:flex}.eMUW5a_attachmentPickerRow>small{color:var(--dsw-alias-label-tertiary);font-size:10px;line-height:15px}.eMUW5a_attachmentPicker{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);appearance:none;background:var(--dsw-alias-bg-layer-1);height:30px;color:var(--dsw-alias-label-primary);cursor:pointer;font:inherit;white-space:nowrap;border-radius:7px;flex:none;justify-content:center;align-items:center;gap:5px;padding:0 10px;font-size:11px;font-weight:500;line-height:16px;display:inline-flex}.eMUW5a_attachmentPicker:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.eMUW5a_attachmentPicker:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}.eMUW5a_attachmentPicker:disabled{opacity:.5;cursor:default}.eMUW5a_attachmentInput{display:none}.eMUW5a_selectedAttachments{gap:7px;display:grid}.eMUW5a_selectedAttachments>div{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:9px;align-items:center;gap:9px;padding:8px 9px;display:flex}.eMUW5a_selectedAttachments>div>span{flex-direction:column;flex:1;min-width:0;display:flex}.eMUW5a_selectedAttachments strong{text-overflow:ellipsis;white-space:nowrap;font-size:11px;line-height:16px;overflow:hidden}.eMUW5a_selectedAttachments small{color:var(--dsw-alias-label-tertiary);font-size:10px;line-height:15px}.eMUW5a_selectedAttachments>p{color:var(--dsw-alias-label-tertiary);margin:0;font-size:10px;line-height:15px}.eMUW5a_composeError{color:var(--dsw-alias-state-error-primary);margin:0;font-size:11px;line-height:16px}.eMUW5a_composeFooter{border-top:1px solid var(--dsw-alias-border-l1);flex:none;justify-content:flex-end;gap:8px;padding:10px 14px;display:flex}.eMUW5a_cancelButton,.eMUW5a_sendButton{cursor:pointer;min-height:34px;font:inherit;border-radius:9px;justify-content:center;align-items:center;gap:6px;padding:0 13px;display:flex}.eMUW5a_cancelButton{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:0 0}.eMUW5a_sendButton{background:var(--dsw-alias-button-primary-fill);color:var(--dsw-alias-label-primary-inverted);border:0}.eMUW5a_cancelButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.eMUW5a_sendButton:hover{background:var(--dsw-alias-button-primary-hover)}.eMUW5a_confirmSummary{color:var(--dsw-alias-label-secondary);gap:6px;display:grid}.eMUW5a_confirmSummary p,.eMUW5a_discardText{overflow-wrap:anywhere;margin:0}@media (width<=1119px){.eMUW5a_mail{grid-template-columns:220px minmax(0,1fr)}.eMUW5a_mailList,.eMUW5a_mailDetail{grid-area:1/2}.eMUW5a_mailDetail,.eMUW5a_mail[data-detail-active] .eMUW5a_mailList{display:none}.eMUW5a_mail[data-detail-active] .eMUW5a_mailDetail{display:flex}.eMUW5a_detailBack{display:grid}}@media (width<=719px){.eMUW5a_mail{grid-template-columns:1fr}.eMUW5a_sidebar,.eMUW5a_mailList,.eMUW5a_mailDetail{grid-area:1/1}.eMUW5a_mailList,.eMUW5a_mailDetail,.eMUW5a_mail[data-pane=list] .eMUW5a_sidebar,.eMUW5a_mail[data-pane=detail] .eMUW5a_sidebar{display:none}.eMUW5a_mail[data-pane=list] .eMUW5a_mailList,.eMUW5a_mail[data-pane=detail] .eMUW5a_mailDetail{display:flex}.eMUW5a_listHeader>.eMUW5a_listBack{display:grid}.eMUW5a_messageBody{padding:18px}}@media (prefers-reduced-motion:reduce){.eMUW5a_listHeader button:disabled svg,.eMUW5a_loadingState svg,.eMUW5a_notice{animation:none}}";
11128
+ const tagId$1 = "@awiki/dsh-plugin/AwikiMail.module.css";
11129
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
11335
11130
  const tag = document.createElement("style");
11336
11131
  tag.dataset.plugin = "@awiki/dsh-plugin";
11337
- tag.dataset.pluginCss = tagId$2;
11338
- tag.textContent = css$2;
11132
+ tag.dataset.pluginCss = tagId$1;
11133
+ tag.textContent = css$1;
11339
11134
  document.head.appendChild(tag);
11340
11135
  }
11341
11136
  var _dsh_awiki_css_AwikiMail_module_css_default = {
11342
11137
  "accountCard": "eMUW5a_accountCard",
11343
11138
  "accountStatus": "eMUW5a_accountStatus",
11139
+ "attachmentDownloadError": "eMUW5a_attachmentDownloadError",
11140
+ "attachmentInput": "eMUW5a_attachmentInput",
11141
+ "attachmentPicker": "eMUW5a_attachmentPicker",
11142
+ "attachmentPickerRow": "eMUW5a_attachmentPickerRow",
11344
11143
  "attachments": "eMUW5a_attachments",
11345
11144
  "bodyField": "eMUW5a_bodyField",
11346
11145
  "cancelButton": "eMUW5a_cancelButton",
11146
+ "composeAttachments": "eMUW5a_composeAttachments",
11347
11147
  "composeError": "eMUW5a_composeError",
11348
11148
  "composeFields": "eMUW5a_composeFields",
11349
11149
  "composeFooter": "eMUW5a_composeFooter",
@@ -11359,6 +11159,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11359
11159
  "folderNav": "eMUW5a_folderNav",
11360
11160
  "folderRow": "eMUW5a_folderRow",
11361
11161
  "inlineError": "eMUW5a_inlineError",
11162
+ "listBack": "eMUW5a_listBack",
11362
11163
  "listHeader": "eMUW5a_listHeader",
11363
11164
  "loadingState": "eMUW5a_loadingState",
11364
11165
  "loadMore": "eMUW5a_loadMore",
@@ -11379,6 +11180,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11379
11180
  "rows": "eMUW5a_rows",
11380
11181
  "rowSubject": "eMUW5a_rowSubject",
11381
11182
  "rowTop": "eMUW5a_rowTop",
11183
+ "selectedAttachments": "eMUW5a_selectedAttachments",
11382
11184
  "sendButton": "eMUW5a_sendButton",
11383
11185
  "sidebar": "eMUW5a_sidebar",
11384
11186
  "truncatedNotice": "eMUW5a_truncatedNotice",
@@ -11424,6 +11226,11 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11424
11226
  function utf8Bytes(value) {
11425
11227
  return new TextEncoder().encode(value).byteLength;
11426
11228
  }
11229
+ function displayBytes(value) {
11230
+ if (value < 1024) return `${value} bytes`;
11231
+ if (value < 1048576) return `${(value / 1024).toFixed(value < 10240 ? 1 : 0)} KiB`;
11232
+ return `${(value / 1048576).toFixed(value < 10485760 ? 1 : 0)} MiB`;
11233
+ }
11427
11234
  function browserLocalStorage() {
11428
11235
  try {
11429
11236
  return window.localStorage;
@@ -11560,6 +11367,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11560
11367
  const [cc, setCc] = (0, react.useState)("");
11561
11368
  const [subject, setSubject] = (0, react.useState)("");
11562
11369
  const [bodyText, setBodyText] = (0, react.useState)("");
11370
+ const [attachmentLimits, setAttachmentLimits] = (0, react.useState)(null);
11371
+ const [attachments, setAttachments] = (0, react.useState)([]);
11372
+ const [attachmentError, setAttachmentError] = (0, react.useState)(null);
11373
+ const [downloadStates, setDownloadStates] = (0, react.useState)({});
11563
11374
  const [composeError, setComposeError] = (0, react.useState)(null);
11564
11375
  const [confirmOpen, setConfirmOpen] = (0, react.useState)(false);
11565
11376
  const [discardOpen, setDiscardOpen] = (0, react.useState)(false);
@@ -11570,6 +11381,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11570
11381
  const loadGeneration = (0, react.useRef)(0);
11571
11382
  const detailGeneration = (0, react.useRef)(0);
11572
11383
  const noticeRevision = (0, react.useRef)(0);
11384
+ const attachmentRevision = (0, react.useRef)(0);
11385
+ const fileInput = (0, react.useRef)(null);
11573
11386
  const visibleUnreadCount = (0, react.useMemo)(() => items.reduce((total, item) => total + (item.unread ? 1 : 0), 0), [items]);
11574
11387
  (0, react.useEffect)(() => {
11575
11388
  props.onUnreadCountChange(inboxUnreadCount);
@@ -11618,6 +11431,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11618
11431
  setListError(null);
11619
11432
  setNotice(null);
11620
11433
  const cacheVisible = hydrateListCache(requestedFolder);
11434
+ const configRequest = props.getConfig();
11621
11435
  const accountRequest = props.getMailAccount();
11622
11436
  const inboxRequest = props.listMailInbox({
11623
11437
  folder: requestedFolder,
@@ -11625,6 +11439,13 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11625
11439
  limit: 20,
11626
11440
  offset: 0
11627
11441
  });
11442
+ const configResult = await configRequest;
11443
+ if (generation !== loadGeneration.current) return;
11444
+ setAttachmentLimits(configResult.ok ? {
11445
+ maxCount: configResult.value.mailAttachmentMaxCount,
11446
+ maxBytes: configResult.value.mailAttachmentMaxBytes,
11447
+ totalMaxBytes: configResult.value.mailAttachmentTotalMaxBytes
11448
+ } : null);
11628
11449
  const accountResult = await accountRequest;
11629
11450
  if (generation !== loadGeneration.current) return;
11630
11451
  if (accountResult.ok) setAccount(accountResult.value);
@@ -11670,6 +11491,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11670
11491
  setSelectedId(null);
11671
11492
  setMessage(null);
11672
11493
  setDetailError(null);
11494
+ setDownloadStates({});
11673
11495
  if (!hydrateListCache(nextFolder)) applyListPage(nextFolder, {
11674
11496
  items: [],
11675
11497
  hasMore: false
@@ -11682,6 +11504,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11682
11504
  setCompose(false);
11683
11505
  setSelectedId(summary.id);
11684
11506
  setMessage(null);
11507
+ setDownloadStates({});
11685
11508
  setDetailLoading(true);
11686
11509
  setDetailError(null);
11687
11510
  setNotice(null);
@@ -11761,6 +11584,14 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11761
11584
  showNotice(result.value.updated > 0 ? "已标为已读。" : "该邮件已经是已读状态。");
11762
11585
  };
11763
11586
  const requestSend = () => {
11587
+ if (attachmentError !== null) {
11588
+ setComposeError(attachmentError);
11589
+ return;
11590
+ }
11591
+ if (attachments.length > 0 && attachmentLimits === null) {
11592
+ setComposeError("邮件附件限制暂不可用,请稍后刷新邮箱再试。");
11593
+ return;
11594
+ }
11764
11595
  const validated = validateDraft$1(to, cc, subject, bodyText);
11765
11596
  if (!validated.ok) {
11766
11597
  setComposeError(validated.error);
@@ -11774,6 +11605,32 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11774
11605
  setCc("");
11775
11606
  setSubject("");
11776
11607
  setBodyText("");
11608
+ setAttachments([]);
11609
+ setAttachmentError(null);
11610
+ if (fileInput.current !== null) fileInput.current.value = "";
11611
+ setComposeError(null);
11612
+ };
11613
+ const chooseAttachments = (files) => {
11614
+ if (files === null || files.length === 0) return;
11615
+ if (attachmentLimits === null) {
11616
+ setAttachmentError("邮件附件限制暂不可用,请稍后刷新邮箱再试。");
11617
+ return;
11618
+ }
11619
+ try {
11620
+ const next = selectMailAttachments(attachments, files, attachmentLimits, () => {
11621
+ attachmentRevision.current += 1;
11622
+ return `mail-attachment-${attachmentRevision.current}`;
11623
+ });
11624
+ setAttachments(next);
11625
+ setAttachmentError(null);
11626
+ setComposeError(null);
11627
+ } catch (error) {
11628
+ setAttachmentError(error instanceof TypeError ? error.message : "无法选择这些附件。");
11629
+ }
11630
+ };
11631
+ const removeAttachment = (id) => {
11632
+ setAttachments((current) => current.filter((attachment) => attachment.id !== id));
11633
+ setAttachmentError(null);
11777
11634
  setComposeError(null);
11778
11635
  };
11779
11636
  const confirmSend = async () => {
@@ -11783,12 +11640,27 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11783
11640
  setComposeError(validated.error);
11784
11641
  return;
11785
11642
  }
11643
+ if (attachmentError !== null || attachments.length > 0 && attachmentLimits === null) {
11644
+ setConfirmOpen(false);
11645
+ setComposeError(attachmentError ?? "邮件附件限制暂不可用,请稍后刷新邮箱再试。");
11646
+ return;
11647
+ }
11786
11648
  setSending(true);
11649
+ let encodedAttachments = [];
11650
+ try {
11651
+ if (attachments.length > 0) encodedAttachments = await encodeMailAttachments(attachments, attachmentLimits);
11652
+ } catch (error) {
11653
+ setSending(false);
11654
+ setConfirmOpen(false);
11655
+ setComposeError(error instanceof TypeError ? error.message : "无法读取附件,请重新选择后再试。");
11656
+ return;
11657
+ }
11787
11658
  const request = {
11788
11659
  to: validated.value.to,
11789
11660
  cc: validated.value.cc,
11790
11661
  subject: validated.value.subject,
11791
- bodyText: validated.value.bodyText
11662
+ bodyText: validated.value.bodyText,
11663
+ ...encodedAttachments.length === 0 ? {} : { attachments: encodedAttachments }
11792
11664
  };
11793
11665
  const result = await props.sendMail(request);
11794
11666
  setSending(false);
@@ -11801,7 +11673,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11801
11673
  setComposeError("邮件服务没有接受本次发送,请检查内容后重试。");
11802
11674
  return;
11803
11675
  }
11804
- const warningText = result.value.warnings.length === 0 ? "" : `,服务返回 ${result.value.warnings.length} 条提示`;
11676
+ const acceptedWithWarning = result.value.warnings.length > 0;
11805
11677
  clearDraft();
11806
11678
  setFolder("sent");
11807
11679
  const storage = browserLocalStorage();
@@ -11814,9 +11686,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11814
11686
  setCompose(false);
11815
11687
  setPane("list");
11816
11688
  refresh("sent");
11817
- showNotice(`邮件已发送${warningText}。`);
11689
+ showNotice(acceptedWithWarning ? `邮件已被服务接受,但返回 ${result.value.warnings.length} 条本地记录提示,请勿立即重复发送。` : "邮件已发送。");
11818
11690
  };
11819
- const dirty = to.trim() !== "" || cc.trim() !== "" || subject.trim() !== "" || bodyText.trim() !== "";
11691
+ const dirty = to.trim() !== "" || cc.trim() !== "" || subject.trim() !== "" || bodyText.trim() !== "" || attachments.length > 0;
11820
11692
  const cancelCompose = () => {
11821
11693
  if (dirty) {
11822
11694
  setDiscardOpen(true);
@@ -11826,6 +11698,39 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11826
11698
  setPane("list");
11827
11699
  };
11828
11700
  const selectedSummary = items.find((item) => item.id === selectedId);
11701
+ const attachmentTotalBytes = attachments.reduce((sum, attachment) => sum + attachment.sizeBytes, 0);
11702
+ const downloadAttachment = async (attachment) => {
11703
+ if (message === null || attachmentLimits === null) return;
11704
+ const expected = downloadableMailAttachment(attachment, attachmentLimits.maxBytes);
11705
+ if (expected === void 0 || downloadStates[attachment.index]?.status === "loading") return;
11706
+ const generation = detailGeneration.current;
11707
+ const localMessageId = message.summary.id;
11708
+ setDownloadStates((current) => ({
11709
+ ...current,
11710
+ [attachment.index]: { status: "loading" }
11711
+ }));
11712
+ try {
11713
+ if (!await downloadAndSaveMailAttachment(props.downloadMailAttachment, {
11714
+ localMessageId,
11715
+ attachmentIndex: attachment.index
11716
+ }, expected, attachmentLimits.maxBytes, () => generation === detailGeneration.current && message.summary.id === localMessageId)) return;
11717
+ setDownloadStates((current) => {
11718
+ const next = { ...current };
11719
+ delete next[attachment.index];
11720
+ return next;
11721
+ });
11722
+ showNotice(`已开始下载 ${expected.fileName}。`);
11723
+ } catch (error) {
11724
+ if (generation !== detailGeneration.current || message.summary.id !== localMessageId) return;
11725
+ setDownloadStates((current) => ({
11726
+ ...current,
11727
+ [attachment.index]: {
11728
+ status: "error",
11729
+ error: error instanceof TypeError ? error.message : "无法保存附件,请重试。"
11730
+ }
11731
+ }));
11732
+ }
11733
+ };
11829
11734
  return (0, react_jsx_runtime.jsxs)("div", {
11830
11735
  className: _dsh_awiki_css_AwikiMail_module_css_default.mail,
11831
11736
  "data-pane": pane,
@@ -11891,19 +11796,31 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11891
11796
  children: [
11892
11797
  (0, react_jsx_runtime.jsxs)("header", {
11893
11798
  className: _dsh_awiki_css_AwikiMail_module_css_default.listHeader,
11894
- children: [(0, react_jsx_runtime.jsxs)("div", { children: [(0, react_jsx_runtime.jsx)("strong", { children: MAIL_FOLDER_COPY[folder].title }), (0, react_jsx_runtime.jsxs)("small", { children: [
11895
- items.length,
11896
- " 封邮件",
11897
- folder === "inbox" && visibleUnreadCount > 0 ? ` · ${visibleUnreadCount} 封未读` : ""
11898
- ] })] }), (0, react_jsx_runtime.jsx)("button", {
11899
- type: "button",
11900
- "aria-label": `刷新${MAIL_FOLDER_COPY[folder].title}`,
11901
- disabled: listLoading,
11902
- onClick: () => {
11903
- refresh();
11904
- },
11905
- children: listLoading ? (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconLoadingOutline16, { size: 15 }) : (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconRefreshOutline14, { size: 15 })
11906
- })]
11799
+ children: [
11800
+ (0, react_jsx_runtime.jsx)("button", {
11801
+ type: "button",
11802
+ className: _dsh_awiki_css_AwikiMail_module_css_default.listBack,
11803
+ "aria-label": "返回邮箱导航",
11804
+ onClick: () => {
11805
+ setPane("folders");
11806
+ },
11807
+ children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronLeftOutline14, { size: 14 })
11808
+ }),
11809
+ (0, react_jsx_runtime.jsxs)("div", { children: [(0, react_jsx_runtime.jsx)("strong", { children: MAIL_FOLDER_COPY[folder].title }), (0, react_jsx_runtime.jsxs)("small", { children: [
11810
+ items.length,
11811
+ " 封邮件",
11812
+ folder === "inbox" && visibleUnreadCount > 0 ? ` · ${visibleUnreadCount} 封未读` : ""
11813
+ ] })] }),
11814
+ (0, react_jsx_runtime.jsx)("button", {
11815
+ type: "button",
11816
+ "aria-label": `刷新${MAIL_FOLDER_COPY[folder].title}`,
11817
+ disabled: listLoading,
11818
+ onClick: () => {
11819
+ refresh();
11820
+ },
11821
+ children: listLoading ? (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconLoadingOutline16, { size: 15 }) : (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconRefreshOutline14, { size: 15 })
11822
+ })
11823
+ ]
11907
11824
  }),
11908
11825
  listError !== null && (0, react_jsx_runtime.jsxs)("div", {
11909
11826
  className: _dsh_awiki_css_AwikiMail_module_css_default.inlineError,
@@ -11964,7 +11881,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11964
11881
  "aria-label": `返回${MAIL_FOLDER_COPY[folder].title}`,
11965
11882
  onClick: cancelCompose,
11966
11883
  children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronLeftOutline14, { size: 14 })
11967
- }), (0, react_jsx_runtime.jsxs)("div", { children: [(0, react_jsx_runtime.jsx)("strong", { children: "写邮件" }), (0, react_jsx_runtime.jsx)("small", { children: "发送纯文本邮件" })] })]
11884
+ }), (0, react_jsx_runtime.jsxs)("div", { children: [(0, react_jsx_runtime.jsx)("strong", { children: "写邮件" }), (0, react_jsx_runtime.jsx)("small", { children: "发送纯文本邮件,可添加附件" })] })]
11968
11885
  }),
11969
11886
  (0, react_jsx_runtime.jsxs)("div", {
11970
11887
  className: _dsh_awiki_css_AwikiMail_module_css_default.composeFields,
@@ -11972,6 +11889,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11972
11889
  (0, react_jsx_runtime.jsxs)("label", { children: ["收件人", (0, react_jsx_runtime.jsx)("textarea", {
11973
11890
  value: to,
11974
11891
  rows: 1,
11892
+ disabled: sending,
11975
11893
  autoFocus: true,
11976
11894
  placeholder: "alice@example.com,可用逗号或换行分隔",
11977
11895
  onChange: (event) => {
@@ -11982,6 +11900,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11982
11900
  (0, react_jsx_runtime.jsxs)("label", { children: ["抄送", (0, react_jsx_runtime.jsx)("textarea", {
11983
11901
  value: cc,
11984
11902
  rows: 1,
11903
+ disabled: sending,
11985
11904
  placeholder: "选填",
11986
11905
  onChange: (event) => {
11987
11906
  setCc(event.target.value);
@@ -11990,6 +11909,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11990
11909
  })] }),
11991
11910
  (0, react_jsx_runtime.jsxs)("label", { children: ["主题", (0, react_jsx_runtime.jsx)("input", {
11992
11911
  value: subject,
11912
+ disabled: sending,
11993
11913
  placeholder: "邮件主题",
11994
11914
  onChange: (event) => {
11995
11915
  setSubject(event.target.value);
@@ -12000,6 +11920,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
12000
11920
  className: _dsh_awiki_css_AwikiMail_module_css_default.bodyField,
12001
11921
  children: ["正文", (0, react_jsx_runtime.jsx)("textarea", {
12002
11922
  value: bodyText,
11923
+ disabled: sending,
12003
11924
  placeholder: "输入纯文本邮件正文",
12004
11925
  onChange: (event) => {
12005
11926
  setBodyText(event.target.value);
@@ -12007,6 +11928,65 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
12007
11928
  }
12008
11929
  })]
12009
11930
  }),
11931
+ (0, react_jsx_runtime.jsxs)("section", {
11932
+ className: _dsh_awiki_css_AwikiMail_module_css_default.composeAttachments,
11933
+ "aria-label": "邮件附件",
11934
+ children: [(0, react_jsx_runtime.jsxs)("div", {
11935
+ className: _dsh_awiki_css_AwikiMail_module_css_default.attachmentPickerRow,
11936
+ children: [
11937
+ (0, react_jsx_runtime.jsxs)("button", {
11938
+ type: "button",
11939
+ className: _dsh_awiki_css_AwikiMail_module_css_default.attachmentPicker,
11940
+ disabled: sending || attachmentLimits === null || attachmentLimits.maxCount === 0,
11941
+ onClick: () => {
11942
+ fileInput.current?.click();
11943
+ },
11944
+ children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconPaperclipOutline16, { size: 14 }), "添加附件"]
11945
+ }),
11946
+ (0, react_jsx_runtime.jsx)("input", {
11947
+ ref: fileInput,
11948
+ className: _dsh_awiki_css_AwikiMail_module_css_default.attachmentInput,
11949
+ type: "file",
11950
+ multiple: true,
11951
+ "aria-label": "选择邮件附件",
11952
+ disabled: sending || attachmentLimits === null || attachmentLimits.maxCount === 0,
11953
+ onChange: (event) => {
11954
+ chooseAttachments(event.currentTarget.files);
11955
+ event.currentTarget.value = "";
11956
+ }
11957
+ }),
11958
+ (0, react_jsx_runtime.jsx)("small", { children: attachmentLimits === null ? "附件限制暂不可用" : `最多 ${attachmentLimits.maxCount} 个 · 单个 ${displayBytes(attachmentLimits.maxBytes)} · 总计 ${displayBytes(attachmentLimits.totalMaxBytes)}` })
11959
+ ]
11960
+ }), attachments.length > 0 && (0, react_jsx_runtime.jsxs)("div", {
11961
+ className: _dsh_awiki_css_AwikiMail_module_css_default.selectedAttachments,
11962
+ children: [attachments.map((attachment) => (0, react_jsx_runtime.jsxs)("div", { children: [
11963
+ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconPaperclipOutline16, { size: 15 }),
11964
+ (0, react_jsx_runtime.jsxs)("span", { children: [(0, react_jsx_runtime.jsx)("strong", { children: attachment.fileName }), (0, react_jsx_runtime.jsxs)("small", { children: [
11965
+ attachment.contentType,
11966
+ " · ",
11967
+ displayBytes(attachment.sizeBytes)
11968
+ ] })] }),
11969
+ (0, react_jsx_runtime.jsx)("button", {
11970
+ type: "button",
11971
+ disabled: sending,
11972
+ "aria-label": `移除附件 ${attachment.fileName}`,
11973
+ onClick: () => {
11974
+ removeAttachment(attachment.id);
11975
+ },
11976
+ children: "移除"
11977
+ })
11978
+ ] }, attachment.id)), (0, react_jsx_runtime.jsxs)("p", { children: [
11979
+ attachments.length,
11980
+ " 个附件 · 共 ",
11981
+ displayBytes(attachmentTotalBytes)
11982
+ ] })]
11983
+ })]
11984
+ }),
11985
+ attachmentError !== null && (0, react_jsx_runtime.jsx)("p", {
11986
+ className: _dsh_awiki_css_AwikiMail_module_css_default.composeError,
11987
+ role: "alert",
11988
+ children: attachmentError
11989
+ }),
12010
11990
  composeError !== null && (0, react_jsx_runtime.jsx)("p", {
12011
11991
  className: _dsh_awiki_css_AwikiMail_module_css_default.composeError,
12012
11992
  role: "alert",
@@ -12025,7 +12005,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
12025
12005
  }), (0, react_jsx_runtime.jsxs)("button", {
12026
12006
  type: "submit",
12027
12007
  className: _dsh_awiki_css_AwikiMail_module_css_default.sendButton,
12028
- disabled: sending,
12008
+ disabled: sending || attachmentError !== null,
12029
12009
  children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconSendOutline16, { size: 15 }), "发送"]
12030
12010
  })]
12031
12011
  })
@@ -12050,8 +12030,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
12050
12030
  className: _dsh_awiki_css_AwikiMail_module_css_default.detailBack,
12051
12031
  "aria-label": `返回${MAIL_FOLDER_COPY[folder].title}`,
12052
12032
  onClick: () => {
12033
+ detailGeneration.current += 1;
12053
12034
  setSelectedId(null);
12054
12035
  setMessage(null);
12036
+ setDownloadStates({});
12055
12037
  setPane("list");
12056
12038
  },
12057
12039
  children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronLeftOutline14, { size: 14 })
@@ -12107,8 +12089,33 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
12107
12089
  }),
12108
12090
  message.attachments.length > 0 && (0, react_jsx_runtime.jsxs)("section", {
12109
12091
  className: _dsh_awiki_css_AwikiMail_module_css_default.attachments,
12110
- "aria-label": "附件元数据",
12111
- children: [(0, react_jsx_runtime.jsx)("h4", { children: "附件(仅元数据)" }), message.attachments.map((attachment) => (0, react_jsx_runtime.jsxs)("div", { children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconPaperclipOutline16, { size: 15 }), (0, react_jsx_runtime.jsxs)("span", { children: [(0, react_jsx_runtime.jsx)("strong", { children: attachment.fileName ?? `附件 ${attachment.index + 1}` }), (0, react_jsx_runtime.jsx)("small", { children: [attachment.contentType, attachment.sizeBytes === void 0 ? void 0 : `${attachment.sizeBytes} bytes`].filter(Boolean).join(" · ") || "暂无更多信息" })] })] }, attachment.index))]
12092
+ "aria-label": "邮件附件",
12093
+ children: [(0, react_jsx_runtime.jsx)("h4", { children: "附件" }), message.attachments.map((attachment) => {
12094
+ const downloadable = attachmentLimits === null ? void 0 : downloadableMailAttachment(attachment, attachmentLimits.maxBytes);
12095
+ const state = downloadStates[attachment.index];
12096
+ return (0, react_jsx_runtime.jsxs)("div", { children: [
12097
+ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconPaperclipOutline16, { size: 15 }),
12098
+ (0, react_jsx_runtime.jsxs)("span", { children: [
12099
+ (0, react_jsx_runtime.jsx)("strong", { children: attachment.fileName ?? `附件 ${attachment.index + 1}` }),
12100
+ (0, react_jsx_runtime.jsx)("small", { children: [attachment.contentType, attachment.sizeBytes === void 0 ? void 0 : `${attachment.sizeBytes} bytes`].filter(Boolean).join(" · ") || "暂无更多信息" }),
12101
+ downloadable === void 0 && (0, react_jsx_runtime.jsx)("small", { children: "当前记录缺少完整、可验证的下载元数据。" }),
12102
+ state?.status === "error" && (0, react_jsx_runtime.jsx)("small", {
12103
+ className: _dsh_awiki_css_AwikiMail_module_css_default.attachmentDownloadError,
12104
+ role: "alert",
12105
+ children: state.error
12106
+ })
12107
+ ] }),
12108
+ downloadable !== void 0 && (0, react_jsx_runtime.jsx)("button", {
12109
+ type: "button",
12110
+ disabled: state?.status === "loading",
12111
+ "aria-label": `${state?.status === "error" ? "重试下载" : "下载附件"} ${downloadable.fileName}`,
12112
+ onClick: () => {
12113
+ downloadAttachment(attachment);
12114
+ },
12115
+ children: state?.status === "loading" ? "下载中…" : state?.status === "error" ? "重试" : "下载"
12116
+ })
12117
+ ] }, attachment.index);
12118
+ })]
12112
12119
  })
12113
12120
  ]
12114
12121
  })
@@ -12161,7 +12168,20 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
12161
12168
  splitAddresses(cc).length,
12162
12169
  " 人"
12163
12170
  ] }),
12164
- (0, react_jsx_runtime.jsxs)("p", { children: ["主题:", subject.trim()] })
12171
+ (0, react_jsx_runtime.jsxs)("p", { children: ["主题:", subject.trim()] }),
12172
+ (0, react_jsx_runtime.jsxs)("p", { children: [
12173
+ "附件:",
12174
+ attachments.length,
12175
+ " 个 · 共 ",
12176
+ displayBytes(attachmentTotalBytes)
12177
+ ] }),
12178
+ attachments.map((attachment) => (0, react_jsx_runtime.jsxs)("p", { children: [
12179
+ attachment.fileName,
12180
+ " · ",
12181
+ attachment.contentType,
12182
+ " · ",
12183
+ displayBytes(attachment.sizeBytes)
12184
+ ] }, attachment.id))
12165
12185
  ]
12166
12186
  })
12167
12187
  }),
@@ -12172,7 +12192,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
12172
12192
  },
12173
12193
  title: "放弃这封邮件?",
12174
12194
  closeLabel: "继续编辑",
12175
- description: "首版不会保存草稿,放弃后当前内容将被清空。",
12195
+ description: "当前不会保存草稿,放弃后文字和附件选择都会被清空。",
12176
12196
  footer: (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
12177
12197
  type: "button",
12178
12198
  variant: "outline",
@@ -12193,7 +12213,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
12193
12213
  })] }),
12194
12214
  children: (0, react_jsx_runtime.jsx)("p", {
12195
12215
  className: _dsh_awiki_css_AwikiMail_module_css_default.discardText,
12196
- children: "收件人、主题和正文中的未发送内容都会丢失。"
12216
+ children: "收件人、主题、正文和已选择的附件都会丢失。"
12197
12217
  })
12198
12218
  })
12199
12219
  ]
@@ -12840,247 +12860,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
12840
12860
  });
12841
12861
  }
12842
12862
  //#endregion
12843
- //#region \0dsh-awiki-css:AwikiDevices.module.css.mjs
12844
- const css$1 = ".xQ4iKW_page{align-content:start;gap:16px;height:100%;padding:16px;display:grid;overflow:auto}.xQ4iKW_heading{justify-content:space-between;align-items:start;gap:12px;display:flex}.xQ4iKW_heading h3,.xQ4iKW_heading p,.xQ4iKW_page h4,.xQ4iKW_page p{margin:0}.xQ4iKW_heading p,.xQ4iKW_card small{color:var(--dsw-alias-label-secondary)}.xQ4iKW_card{border:1px solid var(--dsw-alias-border-l1);border-radius:10px;gap:8px;margin-top:8px;padding:12px;display:grid}.xQ4iKW_actions{flex-wrap:wrap;gap:8px;display:flex}.xQ4iKW_sas{letter-spacing:.2em;text-align:center;font-variant-numeric:tabular-nums;font-size:30px}.xQ4iKW_error{color:var(--dsw-alias-state-error-primary)}";
12845
- const tagId$1 = "@awiki/dsh-plugin/AwikiDevices.module.css";
12846
- if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
12847
- const tag = document.createElement("style");
12848
- tag.dataset.plugin = "@awiki/dsh-plugin";
12849
- tag.dataset.pluginCss = tagId$1;
12850
- tag.textContent = css$1;
12851
- document.head.appendChild(tag);
12852
- }
12853
- var _dsh_awiki_css_AwikiDevices_module_css_default = {
12854
- "actions": "xQ4iKW_actions",
12855
- "card": "xQ4iKW_card",
12856
- "error": "xQ4iKW_error",
12857
- "heading": "xQ4iKW_heading",
12858
- "page": "xQ4iKW_page",
12859
- "sas": "xQ4iKW_sas"
12860
- };
12861
- //#endregion
12862
- //#region lib/types/client/AwikiDevices.js
12863
- /** Foreground-only ready-admin device management. SAS remains component-local. */
12864
- function AwikiDevices(props) {
12865
- const [snapshot, setSnapshot] = (0, react.useState)(null);
12866
- const [progress, setProgress] = (0, react.useState)(null);
12867
- const [enteredSas, setEnteredSas] = (0, react.useState)("");
12868
- const [approval, setApproval] = (0, react.useState)("");
12869
- const [revokeRef, setRevokeRef] = (0, react.useState)(null);
12870
- const [revokeConfirmation, setRevokeConfirmation] = (0, react.useState)("");
12871
- const [error, setError] = (0, react.useState)(null);
12872
- const refresh = async () => {
12873
- const result = await props.refreshDeviceManagement();
12874
- if (!result.ok) return setError(result.error);
12875
- setSnapshot(result.value);
12876
- if (progress !== null && ![
12877
- "authorized",
12878
- "cancelled",
12879
- "rejected",
12880
- "expired"
12881
- ].includes(progress.phase)) {
12882
- const advanced = await props.startDeviceJoinVerification({ requestRef: progress.requestRef });
12883
- if (advanced.ok) setProgress(advanced.value);
12884
- }
12885
- setError(null);
12886
- };
12887
- (0, react.useEffect)(() => {
12888
- if (!props.active) return;
12889
- let alive = true;
12890
- props.refreshDeviceManagement().then((result) => {
12891
- if (!alive) return;
12892
- if (result.ok) setSnapshot(result.value);
12893
- else setError(result.error);
12894
- });
12895
- const timer = setInterval(() => {
12896
- if (alive) refresh();
12897
- }, 3e3);
12898
- return () => {
12899
- alive = false;
12900
- clearInterval(timer);
12901
- };
12902
- }, [
12903
- props.active,
12904
- progress?.phase,
12905
- progress?.requestRef
12906
- ]);
12907
- const start = async (requestRef) => {
12908
- const result = await props.startDeviceJoinVerification({ requestRef });
12909
- if (!result.ok) return setError(result.error);
12910
- setProgress(result.value);
12911
- setError(null);
12912
- };
12913
- const approve = async () => {
12914
- if (progress === null) return;
12915
- const result = await props.approveDeviceJoin({
12916
- requestRef: progress.requestRef,
12917
- enteredSas,
12918
- confirmation: approval
12919
- });
12920
- if (!result.ok) return setError(result.error);
12921
- setProgress(null);
12922
- setEnteredSas("");
12923
- setApproval("");
12924
- await refresh();
12925
- };
12926
- const reject = async (requestRef) => {
12927
- const result = await props.rejectDeviceJoin({
12928
- requestRef,
12929
- reason: "user_rejected"
12930
- });
12931
- if (!result.ok) return setError(result.error);
12932
- setProgress(null);
12933
- await refresh();
12934
- };
12935
- const revoke = async () => {
12936
- if (revokeRef === null) return;
12937
- const result = await props.revokeDevice({
12938
- deviceRef: revokeRef,
12939
- confirmation: revokeConfirmation
12940
- });
12941
- if (!result.ok) return setError(result.error);
12942
- setSnapshot(result.value);
12943
- setRevokeRef(null);
12944
- setRevokeConfirmation("");
12945
- setError(null);
12946
- };
12947
- return (0, react_jsx_runtime.jsxs)("section", {
12948
- className: _dsh_awiki_css_AwikiDevices_module_css_default.page,
12949
- "aria-label": "AWiki 设备管理",
12950
- children: [
12951
- props.modeTabs,
12952
- (0, react_jsx_runtime.jsxs)("header", {
12953
- className: _dsh_awiki_css_AwikiDevices_module_css_default.heading,
12954
- children: [(0, react_jsx_runtime.jsxs)("div", { children: [(0, react_jsx_runtime.jsx)("h3", { children: "设备" }), (0, react_jsx_runtime.jsx)("p", { children: "只有当前 ready-admin 可以批准或撤销设备。" })] }), (0, react_jsx_runtime.jsx)("button", {
12955
- type: "button",
12956
- disabled: props.pending,
12957
- onClick: () => {
12958
- refresh();
12959
- },
12960
- children: "刷新"
12961
- })]
12962
- }),
12963
- snapshot === null && (0, react_jsx_runtime.jsx)("p", {
12964
- role: "status",
12965
- children: "正在读取设备状态…"
12966
- }),
12967
- snapshot !== null && !snapshot.canManage && (0, react_jsx_runtime.jsx)("p", { children: "当前设备不是可用的管理设备,不能批准或撤销其他设备。" }),
12968
- snapshot?.canManage && (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
12969
- (0, react_jsx_runtime.jsxs)("section", { children: [
12970
- (0, react_jsx_runtime.jsx)("h4", { children: "待加入" }),
12971
- snapshot.requests.length === 0 && (0, react_jsx_runtime.jsx)("p", { children: "没有待处理请求。" }),
12972
- snapshot.requests.map((request) => (0, react_jsx_runtime.jsxs)("article", {
12973
- className: _dsh_awiki_css_AwikiDevices_module_css_default.card,
12974
- children: [
12975
- (0, react_jsx_runtime.jsx)("code", { children: request.candidateKeyFingerprint }),
12976
- (0, react_jsx_runtime.jsxs)("small", { children: [
12977
- request.state,
12978
- " · 有效期至 ",
12979
- request.expiresAt
12980
- ] }),
12981
- (0, react_jsx_runtime.jsxs)("div", {
12982
- className: _dsh_awiki_css_AwikiDevices_module_css_default.actions,
12983
- children: [(0, react_jsx_runtime.jsx)("button", {
12984
- type: "button",
12985
- disabled: props.pending || !request.canStartVerification && !request.claimedByCurrentDevice,
12986
- onClick: () => {
12987
- start(request.requestRef);
12988
- },
12989
- children: "开始验证"
12990
- }), (0, react_jsx_runtime.jsx)("button", {
12991
- type: "button",
12992
- disabled: props.pending,
12993
- onClick: () => {
12994
- reject(request.requestRef);
12995
- },
12996
- children: "拒绝"
12997
- })]
12998
- })
12999
- ]
13000
- }, request.requestRef))
13001
- ] }),
13002
- progress?.phase === "sas-ready" && (0, react_jsx_runtime.jsxs)("section", {
13003
- className: _dsh_awiki_css_AwikiDevices_module_css_default.card,
13004
- children: [
13005
- (0, react_jsx_runtime.jsx)("h4", { children: "核对安全码" }),
13006
- (0, react_jsx_runtime.jsx)("strong", {
13007
- className: _dsh_awiki_css_AwikiDevices_module_css_default.sas,
13008
- children: progress.sas
13009
- }),
13010
- (0, react_jsx_runtime.jsx)("p", { children: "输入手机显示的 6 位码,并输入 APPROVE。" }),
13011
- (0, react_jsx_runtime.jsx)("input", {
13012
- "aria-label": "手机安全码",
13013
- value: enteredSas,
13014
- inputMode: "numeric",
13015
- maxLength: 6,
13016
- onChange: (event) => {
13017
- setEnteredSas(event.target.value);
13018
- }
13019
- }),
13020
- (0, react_jsx_runtime.jsx)("input", {
13021
- "aria-label": "批准确认词",
13022
- value: approval,
13023
- autoComplete: "off",
13024
- onChange: (event) => {
13025
- setApproval(event.target.value);
13026
- },
13027
- placeholder: "APPROVE"
13028
- }),
13029
- (0, react_jsx_runtime.jsx)("button", {
13030
- type: "button",
13031
- disabled: props.pending || enteredSas.length !== 6 || approval !== "APPROVE",
13032
- onClick: () => {
13033
- approve();
13034
- },
13035
- children: "批准为 member"
13036
- })
13037
- ]
13038
- }),
13039
- (0, react_jsx_runtime.jsxs)("section", { children: [(0, react_jsx_runtime.jsx)("h4", { children: "已登记设备" }), snapshot.devices.map((device) => (0, react_jsx_runtime.jsxs)("article", {
13040
- className: _dsh_awiki_css_AwikiDevices_module_css_default.card,
13041
- children: [(0, react_jsx_runtime.jsxs)("span", { children: [
13042
- device.isCurrent ? "当前设备" : "其他设备",
13043
- " · ",
13044
- device.role,
13045
- " · ",
13046
- device.status
13047
- ] }), !device.isCurrent && device.status === "active" && (revokeRef === device.deviceRef ? (0, react_jsx_runtime.jsxs)("div", {
13048
- className: _dsh_awiki_css_AwikiDevices_module_css_default.actions,
13049
- children: [(0, react_jsx_runtime.jsx)("input", {
13050
- "aria-label": "撤销确认词",
13051
- value: revokeConfirmation,
13052
- onChange: (event) => {
13053
- setRevokeConfirmation(event.target.value);
13054
- },
13055
- placeholder: "REVOKE"
13056
- }), (0, react_jsx_runtime.jsx)("button", {
13057
- type: "button",
13058
- disabled: props.pending || revokeConfirmation !== "REVOKE",
13059
- onClick: () => {
13060
- revoke();
13061
- },
13062
- children: "确认撤销"
13063
- })]
13064
- }) : (0, react_jsx_runtime.jsx)("button", {
13065
- type: "button",
13066
- disabled: props.pending,
13067
- onClick: () => {
13068
- setRevokeRef(device.deviceRef);
13069
- setRevokeConfirmation("");
13070
- },
13071
- children: "撤销"
13072
- }))]
13073
- }, device.deviceRef))] })
13074
- ] }),
13075
- error !== null && (0, react_jsx_runtime.jsx)("p", {
13076
- className: _dsh_awiki_css_AwikiDevices_module_css_default.error,
13077
- role: "alert",
13078
- children: error
13079
- })
13080
- ]
13081
- });
13082
- }
13083
- //#endregion
13084
12863
  //#region lib/types/client/AwikiProfileCard.js
13085
12864
  const MAX_DISPLAY_NAME = 50;
13086
12865
  const MAX_BIO = 100;
@@ -13549,35 +13328,23 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
13549
13328
  className: _dsh_awiki_css_AwikiOverlay_module_css_default.modeTabs,
13550
13329
  role: "tablist",
13551
13330
  "aria-label": "AWiki 功能",
13552
- children: [
13553
- (0, react_jsx_runtime.jsx)("button", {
13554
- type: "button",
13555
- role: "tab",
13556
- "aria-selected": props.mode === "chat",
13557
- onClick: () => {
13558
- props.onChange("chat");
13559
- },
13560
- children: "会话"
13561
- }),
13562
- (0, react_jsx_runtime.jsxs)("button", {
13563
- type: "button",
13564
- role: "tab",
13565
- "aria-selected": props.mode === "mail",
13566
- onClick: () => {
13567
- props.onChange("mail");
13568
- },
13569
- children: ["邮件", props.mailUnreadCount > 0 && (0, react_jsx_runtime.jsx)("small", { children: props.mailUnreadCount > 99 ? "99+" : props.mailUnreadCount })]
13570
- }),
13571
- (0, react_jsx_runtime.jsx)("button", {
13572
- type: "button",
13573
- role: "tab",
13574
- "aria-selected": props.mode === "devices",
13575
- onClick: () => {
13576
- props.onChange("devices");
13577
- },
13578
- children: "设备"
13579
- })
13580
- ]
13331
+ children: [(0, react_jsx_runtime.jsx)("button", {
13332
+ type: "button",
13333
+ role: "tab",
13334
+ "aria-selected": props.mode === "chat",
13335
+ onClick: () => {
13336
+ props.onChange("chat");
13337
+ },
13338
+ children: "会话"
13339
+ }), (0, react_jsx_runtime.jsxs)("button", {
13340
+ type: "button",
13341
+ role: "tab",
13342
+ "aria-selected": props.mode === "mail",
13343
+ onClick: () => {
13344
+ props.onChange("mail");
13345
+ },
13346
+ children: ["邮件", props.mailUnreadCount > 0 && (0, react_jsx_runtime.jsx)("small", { children: props.mailUnreadCount > 99 ? "99+" : props.mailUnreadCount })]
13347
+ })]
13581
13348
  });
13582
13349
  }
13583
13350
  /** Incoming sender label: WNS display name, then Handle, then DID. */
@@ -14276,6 +14043,40 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
14276
14043
  }), props.composeMenu]
14277
14044
  })]
14278
14045
  }),
14046
+ view.groupRecovery !== null && (0, react_jsx_runtime.jsxs)("div", {
14047
+ className: _dsh_awiki_css_AwikiOverlay_module_css_default.groupRecoveryNotice,
14048
+ "data-status": view.groupRecovery.status,
14049
+ role: view.groupRecovery.status === "blocked" ? "alert" : "status",
14050
+ children: [
14051
+ (0, react_jsx_runtime.jsxs)("span", { children: [(0, react_jsx_runtime.jsx)("strong", { children: view.groupRecovery.status === "pending" ? "正在恢复旧群聊身份" : view.groupRecovery.status === "blocked" ? "部分旧群聊需要处理" : "暂时无法检查旧群聊身份" }), (0, react_jsx_runtime.jsx)("small", { children: view.groupRecovery.status === "pending" ? `${view.groupRecovery.pending} 个群聊尚未完成,其他会话不受影响。` : view.groupRecovery.status === "blocked" ? `${view.groupRecovery.blocked} 个群聊未能自动恢复,其他会话不受影响。` : "私聊和新群聊不受影响,可稍后重试。" })] }),
14052
+ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
14053
+ label: "重试群聊身份恢复",
14054
+ side: "right",
14055
+ children: (0, react_jsx_runtime.jsx)("button", {
14056
+ type: "button",
14057
+ "aria-label": "重试群聊身份恢复",
14058
+ disabled: view.pending !== null,
14059
+ onClick: () => {
14060
+ props.retryGroupRebindRecovery();
14061
+ },
14062
+ children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconRefreshOutline14, { size: 14 })
14063
+ })
14064
+ }),
14065
+ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
14066
+ label: "稍后处理",
14067
+ side: "right",
14068
+ children: (0, react_jsx_runtime.jsx)("button", {
14069
+ type: "button",
14070
+ "aria-label": "关闭旧群聊处理提示",
14071
+ disabled: view.pending !== null,
14072
+ onClick: () => {
14073
+ props.dismissGroupRecoveryNotice();
14074
+ },
14075
+ children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCloseOutline16, { size: 14 })
14076
+ })
14077
+ })
14078
+ ]
14079
+ }),
14279
14080
  (0, react_jsx_runtime.jsxs)("div", {
14280
14081
  className: _dsh_awiki_css_AwikiOverlay_module_css_default.conversationList,
14281
14082
  children: [view.conversations.map((conversation) => (0, react_jsx_runtime.jsx)(ConversationRow, {
@@ -15257,113 +15058,95 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15257
15058
  recoveryOperationId: view.recoveryOperationId,
15258
15059
  recoveryProgress: view.recoveryProgress,
15259
15060
  pending: view.pending !== null,
15260
- handleRecoveryPhoneEnabled: view.handleRecoveryPhoneEnabled
15061
+ profileName: view.profileName,
15062
+ legacySharedStateDetected: view.legacySharedStateDetected
15261
15063
  })
15262
15064
  }),
15263
- view.status === "ready" && view.sessionStatus === "active" && view.identity !== null && (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
15264
- (0, react_jsx_runtime.jsx)("div", {
15265
- className: _dsh_awiki_css_AwikiOverlay_module_css_default.modePanel,
15266
- "data-active": mode === "chat" || void 0,
15267
- hidden: mode !== "chat",
15268
- children: (0, react_jsx_runtime.jsx)(Chat, {
15269
- ...props,
15270
- selectConversation,
15271
- view: {
15272
- ...view,
15273
- identity: view.identity
15065
+ view.status === "ready" && view.sessionStatus === "active" && view.identity !== null && (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)("div", {
15066
+ className: _dsh_awiki_css_AwikiOverlay_module_css_default.modePanel,
15067
+ "data-active": mode === "chat" || void 0,
15068
+ hidden: mode !== "chat",
15069
+ children: (0, react_jsx_runtime.jsx)(Chat, {
15070
+ ...props,
15071
+ selectConversation,
15072
+ view: {
15073
+ ...view,
15074
+ identity: view.identity
15075
+ },
15076
+ modeTabs: (0, react_jsx_runtime.jsx)(ModeTabs, {
15077
+ mode,
15078
+ mailUnreadCount,
15079
+ onChange: setMode
15080
+ }),
15081
+ composeMenu: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Menu, {
15082
+ open: menuOpen,
15083
+ onClose: () => {
15084
+ setMenuOpen(false);
15274
15085
  },
15275
- modeTabs: (0, react_jsx_runtime.jsx)(ModeTabs, {
15276
- mode,
15277
- mailUnreadCount,
15278
- onChange: setMode
15279
- }),
15280
- composeMenu: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Menu, {
15281
- open: menuOpen,
15282
- onClose: () => {
15283
- setMenuOpen(false);
15086
+ align: "end",
15087
+ portal: true,
15088
+ compact: true,
15089
+ items: [
15090
+ {
15091
+ id: "direct",
15092
+ label: "发起私聊"
15284
15093
  },
15285
- align: "end",
15286
- portal: true,
15287
- compact: true,
15288
- items: [
15289
- {
15290
- id: "direct",
15291
- label: "发起私聊"
15292
- },
15293
- {
15294
- id: "group",
15295
- label: "发起群聊"
15296
- },
15297
- {
15298
- id: "join-group",
15299
- label: "加入群聊"
15300
- }
15301
- ],
15302
- onSelect: (id) => {
15303
- setMenuOpen(false);
15304
- if (id === "direct") setComposeDirect(true);
15305
- if (id === "group") setComposeGroup(true);
15306
- if (id === "join-group") setJoinGroupOpen(true);
15094
+ {
15095
+ id: "group",
15096
+ label: "发起群聊"
15307
15097
  },
15308
- anchor: (0, react_jsx_runtime.jsx)("button", {
15309
- type: "button",
15310
- className: _dsh_awiki_css_AwikiOverlay_module_css_default.rosterAction,
15311
- "aria-label": "发起会话",
15312
- "aria-expanded": menuOpen,
15313
- "aria-haspopup": "menu",
15314
- onClick: () => {
15315
- setMenuOpen((value) => !value);
15316
- },
15317
- children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconPlusOutline16, {})
15318
- })
15098
+ {
15099
+ id: "join-group",
15100
+ label: "加入群聊"
15101
+ }
15102
+ ],
15103
+ onSelect: (id) => {
15104
+ setMenuOpen(false);
15105
+ if (id === "direct") setComposeDirect(true);
15106
+ if (id === "group") setComposeGroup(true);
15107
+ if (id === "join-group") setJoinGroupOpen(true);
15108
+ },
15109
+ anchor: (0, react_jsx_runtime.jsx)("button", {
15110
+ type: "button",
15111
+ className: _dsh_awiki_css_AwikiOverlay_module_css_default.rosterAction,
15112
+ "aria-label": "发起会话",
15113
+ "aria-expanded": menuOpen,
15114
+ "aria-haspopup": "menu",
15115
+ onClick: () => {
15116
+ setMenuOpen((value) => !value);
15117
+ },
15118
+ children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconPlusOutline16, {})
15319
15119
  })
15320
15120
  })
15321
- }),
15322
- (0, react_jsx_runtime.jsx)("div", {
15323
- className: _dsh_awiki_css_AwikiOverlay_module_css_default.modePanel,
15324
- "data-active": mode === "mail" || void 0,
15325
- hidden: mode !== "mail",
15326
- children: (0, react_jsx_runtime.jsx)(AwikiMail, {
15327
- active: mode === "mail",
15328
- cacheOwner: view.identity.did,
15329
- identityCard: mode === "mail" ? (0, react_jsx_runtime.jsx)(AwikiProfileCard, {
15330
- identity: view.identity,
15331
- profile: view.profile,
15332
- pending: view.pending !== null,
15333
- updateProfile: props.updateProfile
15334
- }) : null,
15335
- modeTabs: (0, react_jsx_runtime.jsx)(ModeTabs, {
15336
- mode,
15337
- mailUnreadCount,
15338
- onChange: setMode
15339
- }),
15340
- onUnreadCountChange: setMailUnreadCount,
15341
- getMailAccount: props.getMailAccount,
15342
- listMailInbox: props.listMailInbox,
15343
- readMail: props.readMail,
15344
- markMailRead: props.markMailRead,
15345
- sendMail: props.sendMail
15346
- }, view.identity.did)
15347
- }),
15348
- mode === "devices" && (0, react_jsx_runtime.jsx)("div", {
15349
- className: _dsh_awiki_css_AwikiOverlay_module_css_default.modePanel,
15350
- "data-active": true,
15351
- children: (0, react_jsx_runtime.jsx)(AwikiDevices, {
15352
- active: true,
15353
- pending: view.pending !== null,
15354
- modeTabs: (0, react_jsx_runtime.jsx)(ModeTabs, {
15355
- mode,
15356
- mailUnreadCount,
15357
- onChange: setMode
15358
- }),
15359
- refreshDeviceManagement: props.refreshDeviceManagement,
15360
- startDeviceJoinVerification: props.startDeviceJoinVerification,
15361
- approveDeviceJoin: props.approveDeviceJoin,
15362
- rejectDeviceJoin: props.rejectDeviceJoin,
15363
- revokeDevice: props.revokeDevice
15364
- })
15365
15121
  })
15366
- ] }),
15122
+ }), (0, react_jsx_runtime.jsx)("div", {
15123
+ className: _dsh_awiki_css_AwikiOverlay_module_css_default.modePanel,
15124
+ "data-active": mode === "mail" || void 0,
15125
+ hidden: mode !== "mail",
15126
+ children: (0, react_jsx_runtime.jsx)(AwikiMail, {
15127
+ active: mode === "mail",
15128
+ cacheOwner: view.identity.did,
15129
+ identityCard: mode === "mail" ? (0, react_jsx_runtime.jsx)(AwikiProfileCard, {
15130
+ identity: view.identity,
15131
+ profile: view.profile,
15132
+ pending: view.pending !== null,
15133
+ updateProfile: props.updateProfile
15134
+ }) : null,
15135
+ modeTabs: (0, react_jsx_runtime.jsx)(ModeTabs, {
15136
+ mode,
15137
+ mailUnreadCount,
15138
+ onChange: setMode
15139
+ }),
15140
+ onUnreadCountChange: setMailUnreadCount,
15141
+ getConfig: props.getConfig,
15142
+ getMailAccount: props.getMailAccount,
15143
+ listMailInbox: props.listMailInbox,
15144
+ readMail: props.readMail,
15145
+ markMailRead: props.markMailRead,
15146
+ sendMail: props.sendMail,
15147
+ downloadMailAttachment: props.downloadMailAttachment
15148
+ }, view.identity.did)
15149
+ })] }),
15367
15150
  composeDirect && (0, react_jsx_runtime.jsx)("div", {
15368
15151
  className: _dsh_awiki_css_AwikiOverlay_module_css_default.composeBackdrop,
15369
15152
  children: (0, react_jsx_runtime.jsxs)("form", {
@@ -15951,16 +15734,16 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15951
15734
  /** Bilingual copy for the AWiki identity and installation settings page. */
15952
15735
  const zh = {
15953
15736
  nav: "AWiki",
15954
- intro: "管理 AWiki 身份、域名与本地数据设置。",
15955
- domainLabel: "默认域名",
15956
- domainDescription: "输入纯域名,不要包含协议、路径或端口。",
15737
+ intro: "管理 AWiki 租户、身份与本地数据设置。",
15738
+ domainLabel: "租户域名",
15739
+ domainDescription: "输入纯域名;重启后 User、Message、Mail 与附件服务都会切换到该域名。",
15957
15740
  defaultValue: "默认值:{domain}",
15958
15741
  save: "保存",
15959
15742
  saving: "保存中…",
15960
15743
  reset: "恢复默认值",
15961
15744
  saved: "已保存。",
15962
15745
  restartNotice: "重启 DeepSeek Harness 后生效。",
15963
- identityNotice: "此设置仅影响后续注册和短 Handle 的域名补全,不会改写已经注册的 DID 或 Handle。",
15746
+ identityNotice: "不同域名使用相互隔离的本地身份、消息与身份恢复进度。切回原域名时会恢复该域名原有的本地状态。",
15964
15747
  invalidDomain: "请输入有效的域名,例如 awiki.ai。",
15965
15748
  saveFailed: "未能保存设置,请刷新后重试。",
15966
15749
  loading: "正在读取 AWiki 设置…",
@@ -15983,16 +15766,16 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15983
15766
  };
15984
15767
  const en = {
15985
15768
  nav: "AWiki",
15986
- intro: "Manage AWiki identity, domain, and local data settings.",
15987
- domainLabel: "Default domain",
15988
- domainDescription: "Enter a bare domain without a protocol, path, or port.",
15769
+ intro: "Manage the AWiki tenant, identity, and local data settings.",
15770
+ domainLabel: "Tenant domain",
15771
+ domainDescription: "Enter a bare domain. After restart, User, Message, Mail, and attachment services all switch to it.",
15989
15772
  defaultValue: "Default: {domain}",
15990
15773
  save: "Save",
15991
15774
  saving: "Saving…",
15992
15775
  reset: "Restore default",
15993
15776
  saved: "Saved.",
15994
15777
  restartNotice: "Restart DeepSeek Harness for the change to take effect.",
15995
- identityNotice: "This affects future registrations and short-Handle completion. It does not rewrite an existing DID or Handle.",
15778
+ identityNotice: "Each domain uses isolated local identity, message, and identity-recovery state. Switching back restores that domain’s previous local state.",
15996
15779
  invalidDomain: "Enter a valid domain, such as awiki.ai.",
15997
15780
  saveFailed: "The setting could not be saved. Refresh and try again.",
15998
15781
  loading: "Loading AWiki settings…",
@@ -16241,14 +16024,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
16241
16024
  inspectIdentityAccess: (request) => awiki.inspectIdentityAccess(request),
16242
16025
  sendRegistrationOtp: (request) => awiki.sendRegistrationOtp(request),
16243
16026
  registerIdentity: (request) => awiki.registerIdentity(request),
16244
- beginDeviceJoin: () => awiki.beginDeviceJoin(),
16245
- getDeviceJoinStatus: () => awiki.getDeviceJoinStatus(),
16246
- cancelDeviceJoin: () => awiki.cancelDeviceJoin(),
16247
- refreshDeviceManagement: () => awiki.refreshDeviceManagement(),
16248
- startDeviceJoinVerification: (request) => awiki.startDeviceJoinVerification(request),
16249
- approveDeviceJoin: (request) => awiki.approveDeviceJoin(request),
16250
- rejectDeviceJoin: (request) => awiki.rejectDeviceJoin(request),
16251
- revokeDevice: (request) => awiki.revokeDevice(request),
16252
16027
  updateDisplayName: (displayName) => awiki.updateDisplayName(displayName),
16253
16028
  updateProfile: (request) => awiki.updateProfile(request),
16254
16029
  sendRecoveryOtp: (request) => awiki.sendRecoveryOtp(request),
@@ -16258,6 +16033,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
16258
16033
  resumeRecovery: () => awiki.resumeRecovery(),
16259
16034
  discardRecovery: () => awiki.discardRecovery(),
16260
16035
  loadMoreConversations: () => awiki.loadMoreConversations(),
16036
+ retryGroupRebindRecovery: () => awiki.retryGroupRebindRecovery(),
16037
+ dismissGroupRecoveryNotice: () => awiki.dismissGroupRecoveryNotice(),
16261
16038
  hideConversation: (conversationId) => awiki.hideConversation(conversationId),
16262
16039
  restoreConversation: (conversationId) => awiki.restoreConversation(conversationId),
16263
16040
  startDirectChat: (handle) => awiki.startDirectChat(handle),
@@ -16287,11 +16064,13 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
16287
16064
  value: void 0
16288
16065
  } : result;
16289
16066
  },
16067
+ getConfig: () => awiki.getConfig(),
16290
16068
  getMailAccount: () => awiki.getMailAccount(),
16291
16069
  listMailInbox: (request) => awiki.listMailInbox(request),
16292
16070
  readMail: (request) => awiki.readMail(request),
16293
16071
  markMailRead: (request) => awiki.markMailRead(request),
16294
- sendMail: (request) => awiki.sendMail(request)
16072
+ sendMail: (request) => awiki.sendMail(request),
16073
+ downloadMailAttachment: (request) => awiki.downloadMailAttachment(request)
16295
16074
  })
16296
16075
  }, AwikiOverlay);
16297
16076
  });