@senguoyun/dsh-arkme 0.1.45 → 0.1.46

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 (105) hide show
  1. package/docs/direct-message-refusal.md +39 -0
  2. package/docs/plugin-release.md +28 -3
  3. package/lib/client.js +1719 -562
  4. package/lib/client.js.map +1 -1
  5. package/lib/harness-model-client.js +4922 -0
  6. package/lib/index.js +1605 -110
  7. package/lib/persistent-extension.js +1 -1
  8. package/lib/{persistent-runtime-CEGGFpR7.js → persistent-runtime-DpNP9UKr.js} +1152 -155
  9. package/lib/sdk.js +25 -2
  10. package/lib/types/arkme-service.d.ts +10 -1
  11. package/lib/types/arkme-service.d.ts.map +1 -1
  12. package/lib/types/chat-pin-projection.d.ts +4 -0
  13. package/lib/types/chat-pin-projection.d.ts.map +1 -0
  14. package/lib/types/chat-realtime.d.ts +13 -1
  15. package/lib/types/chat-realtime.d.ts.map +1 -1
  16. package/lib/types/client/ArkmeAttachmentStrip.d.ts +2 -1
  17. package/lib/types/client/ArkmeAttachmentStrip.d.ts.map +1 -1
  18. package/lib/types/client/ArkmeBillingSettings.d.ts +7 -1
  19. package/lib/types/client/ArkmeBillingSettings.d.ts.map +1 -1
  20. package/lib/types/client/ArkmeMarkdownComposerInput.d.ts.map +1 -1
  21. package/lib/types/client/ArkmeModelSelect.d.ts +20 -0
  22. package/lib/types/client/ArkmeModelSelect.d.ts.map +1 -0
  23. package/lib/types/client/ArkmeNoteDetails.d.ts +3 -1
  24. package/lib/types/client/ArkmeNoteDetails.d.ts.map +1 -1
  25. package/lib/types/client/ArkmeRichContent.d.ts +3 -1
  26. package/lib/types/client/ArkmeRichContent.d.ts.map +1 -1
  27. package/lib/types/client/ArkmeSidebar.d.ts.map +1 -1
  28. package/lib/types/client/ArkmeVirtualWorkspace.d.ts.map +1 -1
  29. package/lib/types/client/chat-directory-store.d.ts +7 -1
  30. package/lib/types/client/chat-directory-store.d.ts.map +1 -1
  31. package/lib/types/client/conversation-memory-cache.d.ts +3 -0
  32. package/lib/types/client/conversation-memory-cache.d.ts.map +1 -1
  33. package/lib/types/client/conversation-timeline-refresh.d.ts +5 -0
  34. package/lib/types/client/conversation-timeline-refresh.d.ts.map +1 -0
  35. package/lib/types/client/direct-message-admission.d.ts +15 -0
  36. package/lib/types/client/direct-message-admission.d.ts.map +1 -0
  37. package/lib/types/client/harness-model-client.d.ts +15 -0
  38. package/lib/types/client/harness-model-client.d.ts.map +1 -0
  39. package/lib/types/client/realtime-client-events.d.ts.map +1 -1
  40. package/lib/types/client/record-reedit-editors.d.ts +38 -0
  41. package/lib/types/client/record-reedit-editors.d.ts.map +1 -0
  42. package/lib/types/client/record-reedit-submissions.d.ts +12 -0
  43. package/lib/types/client/record-reedit-submissions.d.ts.map +1 -0
  44. package/lib/types/client/timeline-media.d.ts +4 -0
  45. package/lib/types/client/timeline-media.d.ts.map +1 -0
  46. package/lib/types/client/ui-controller.d.ts.map +1 -1
  47. package/lib/types/direct-message-admission.d.ts +17 -0
  48. package/lib/types/direct-message-admission.d.ts.map +1 -0
  49. package/lib/types/file-transfer-contract.d.ts +2 -0
  50. package/lib/types/file-transfer-contract.d.ts.map +1 -1
  51. package/lib/types/file-transfer-owner.d.ts.map +1 -1
  52. package/lib/types/harness-embed-contract.d.ts +1 -0
  53. package/lib/types/harness-embed-contract.d.ts.map +1 -1
  54. package/lib/types/harness-embed-route.d.ts +2 -1
  55. package/lib/types/harness-embed-route.d.ts.map +1 -1
  56. package/lib/types/host-api.d.ts.map +1 -1
  57. package/lib/types/index.d.ts.map +1 -1
  58. package/lib/types/local-database.d.ts +7 -2
  59. package/lib/types/local-database.d.ts.map +1 -1
  60. package/lib/types/managed-ai/adapter.d.ts +4 -1
  61. package/lib/types/managed-ai/adapter.d.ts.map +1 -1
  62. package/lib/types/managed-ai/image-preparer.d.ts +19 -0
  63. package/lib/types/managed-ai/image-preparer.d.ts.map +1 -0
  64. package/lib/types/managed-ai/multipart-upload.d.ts +8 -0
  65. package/lib/types/managed-ai/multipart-upload.d.ts.map +1 -0
  66. package/lib/types/managed-ai/transport.d.ts +59 -0
  67. package/lib/types/managed-ai/transport.d.ts.map +1 -0
  68. package/lib/types/record-reedit-contract.d.ts +84 -1
  69. package/lib/types/record-reedit-contract.d.ts.map +1 -1
  70. package/lib/types/rich-media-routes.d.ts.map +1 -1
  71. package/lib/types/sdk/index.d.ts +6 -1
  72. package/lib/types/sdk/index.d.ts.map +1 -1
  73. package/lib/types/services/chat-realtime-service.d.ts +4 -3
  74. package/lib/types/services/chat-realtime-service.d.ts.map +1 -1
  75. package/lib/types/services/chat-service.d.ts.map +1 -1
  76. package/lib/types/services/direct-message-admission-service.d.ts +21 -0
  77. package/lib/types/services/direct-message-admission-service.d.ts.map +1 -0
  78. package/lib/types/services/file-transfers.d.ts +8 -1
  79. package/lib/types/services/file-transfers.d.ts.map +1 -1
  80. package/lib/types/services/media-service.d.ts +2 -0
  81. package/lib/types/services/media-service.d.ts.map +1 -1
  82. package/lib/types/services/message-action-infrastructure.d.ts.map +1 -1
  83. package/lib/types/services/record-reedit-attachments.d.ts +30 -0
  84. package/lib/types/services/record-reedit-attachments.d.ts.map +1 -0
  85. package/lib/types/services/record-reedit-submissions.d.ts +37 -0
  86. package/lib/types/services/record-reedit-submissions.d.ts.map +1 -0
  87. package/lib/types/services/record-service.d.ts +30 -2
  88. package/lib/types/services/record-service.d.ts.map +1 -1
  89. package/lib/types/services/recording-forward-gateway.d.ts.map +1 -1
  90. package/lib/types/services/service.d.ts +12 -2
  91. package/lib/types/services/service.d.ts.map +1 -1
  92. package/lib/types/services/source-service.d.ts +0 -1
  93. package/lib/types/services/source-service.d.ts.map +1 -1
  94. package/lib/types/state-store.d.ts +8 -2
  95. package/lib/types/state-store.d.ts.map +1 -1
  96. package/lib/types/tools/business/conversation/direct-message-refusal.d.ts +3 -0
  97. package/lib/types/tools/business/conversation/direct-message-refusal.d.ts.map +1 -0
  98. package/lib/types/tools/business/index.d.ts.map +1 -1
  99. package/lib/types/tools/business/records/reedit.d.ts.map +1 -1
  100. package/lib/types/tools/ports/index.d.ts +2 -1
  101. package/lib/types/tools/ports/index.d.ts.map +1 -1
  102. package/lib/types/tools/registry/registrar.d.ts.map +1 -1
  103. package/lib/types/types.d.ts +24 -2
  104. package/lib/types/types.d.ts.map +1 -1
  105. package/package.json +6 -6
package/lib/client.js CHANGED
@@ -38,9 +38,9 @@ window.__ModuleLoader__.load({
38
38
  //#endregion
39
39
  let react = require("react");
40
40
  react = __toESM(react, 1);
41
- let react_jsx_runtime = require("react/jsx-runtime");
42
41
  let react_dom = require("react-dom");
43
42
  react_dom = __toESM(react_dom, 1);
43
+ let react_jsx_runtime = require("react/jsx-runtime");
44
44
  let _deepseek_ai_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
45
45
  let react_dom_client = require("react-dom/client");
46
46
  //#region src/types.ts
@@ -338,6 +338,28 @@ window.__ModuleLoader__.load({
338
338
  if (sourceRef.trim() === "") throw new TypeError("Arkme private-chat source reference must not be empty");
339
339
  return await this.call("user-ban.status", { sourceRef }, signal);
340
340
  }
341
+ async directMessageAdmission(sourceRef, signal) {
342
+ if (sourceRef.trim() === "") throw new TypeError("Arkme private-chat source reference must not be empty");
343
+ if ((await this.capabilities(signal)).features.directMessageAdmission !== true) throw new ArkmeClientError({
344
+ code: "CAPABILITY_UNSUPPORTED",
345
+ message: "当前 Arkme Provider 不支持私聊拒收,请升级",
346
+ retryable: false
347
+ });
348
+ return await this.call("chat.direct-message-admission", { sourceRef }, signal);
349
+ }
350
+ async setDirectMessageRefusal(sourceRef, refused, expectedRevision, signal) {
351
+ if (sourceRef.trim() === "" || typeof refused !== "boolean" || !Number.isSafeInteger(expectedRevision) || expectedRevision < 0) throw new TypeError("Arkme private-chat refusal input is invalid");
352
+ if ((await this.capabilities(signal)).features.directMessageAdmission !== true) throw new ArkmeClientError({
353
+ code: "CAPABILITY_UNSUPPORTED",
354
+ message: "当前 Arkme Provider 不支持私聊拒收,请升级",
355
+ retryable: false
356
+ });
357
+ return await this.call("chat.direct-message-refusal.set", {
358
+ sourceRef,
359
+ refused,
360
+ expectedRevision
361
+ }, signal);
362
+ }
341
363
  /** Employee-only idempotent ban. Callers must obtain explicit human approval first. */
342
364
  async banPrivateChatUser(sourceRef, remark = "", signal) {
343
365
  if (sourceRef.trim() === "") throw new TypeError("Arkme private-chat source reference must not be empty");
@@ -1160,14 +1182,15 @@ window.__ModuleLoader__.load({
1160
1182
  if (!/^arkme-file-v1\.[0-9a-f-]{36}$/.test(fileRef)) throw new TypeError("Invalid local file reference");
1161
1183
  return `${this.route}/files/local?ref=${encodeURIComponent(fileRef)}${download ? "&download=1" : ""}`;
1162
1184
  }
1163
- /** Stage locally only. Cloud upload starts when sendFiles accepts a task. */
1185
+ /** Stage locally. Reference-managed files require a Host-persisted draft or task to retain them beyond seven days. */
1164
1186
  async stageFile(file, options = {}) {
1165
1187
  const payload = await (await this.fetchImpl(`${this.route}/files/stage`, {
1166
1188
  method: "POST",
1167
1189
  headers: {
1168
1190
  "Content-Type": file.type || "application/octet-stream",
1169
1191
  "X-Arkme-File-Name": encodeURIComponent(options.fileName ?? file.name ?? "attachment"),
1170
- ...expectedUserIdHeaders(options.expectedUserId)
1192
+ ...expectedUserIdHeaders(options.expectedUserId),
1193
+ ...options.retention ? { "X-Arkme-File-Retention": options.retention } : {}
1171
1194
  },
1172
1195
  body: file,
1173
1196
  ...options.signal === void 0 ? {} : { signal: options.signal }
@@ -5360,7 +5383,10 @@ window.__ModuleLoader__.load({
5360
5383
  qrcode.stringToBytes;
5361
5384
  //#endregion
5362
5385
  //#region package.json
5363
- var version$1 = "0.1.45";
5386
+ var version$1 = "0.1.46";
5387
+ //#endregion
5388
+ //#region src/client/arkme-billing.css?inline
5389
+ var arkme_billing_default = ".arkme-billing-backdrop {\n z-index: 120;\n backdrop-filter: blur(3px);\n background: #181b223d;\n place-items: center;\n padding: 28px;\n display: grid;\n position: fixed;\n inset: 0;\n}\n\n.arkme-billing-recharge-dialog, .arkme-billing-payment-dialog {\n color: #20232c;\n background: #fff;\n border: 1px solid #dedfe3;\n border-radius: 20px;\n width: min(620px, 100%);\n max-height: min(720px, 100vh - 56px);\n overflow-y: auto;\n box-shadow: 0 24px 72px #191c232e;\n}\n\n.arkme-billing-payment-dialog {\n width: min(420px, 100%);\n}\n\n.arkme-billing-dialog-header {\n border-bottom: 1px solid #ececef;\n justify-content: space-between;\n align-items: flex-start;\n gap: 18px;\n min-height: 78px;\n padding: 20px 22px 16px;\n display: flex;\n}\n\n.arkme-billing-dialog-header h2 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n line-height: 25px;\n}\n\n.arkme-billing-dialog-header p {\n overflow-wrap: anywhere;\n color: #8a8e96;\n margin: 4px 0 0;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-billing-dialog-header > button {\n color: #777c85;\n width: 32px;\n height: 32px;\n font: inherit;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 9px;\n flex: none;\n place-items: center;\n font-size: 22px;\n display: grid;\n}\n\n.arkme-billing-dialog-header > button:hover {\n color: #20232c;\n background: #f3f3f5;\n}\n\n.arkme-billing-dialog-body {\n padding: 18px 22px 22px;\n}\n\n.arkme-billing-dialog-balance {\n border-bottom: 1px solid #ececef;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: center;\n column-gap: 12px;\n min-height: 48px;\n padding: 0 2px 16px;\n display: grid;\n}\n\n.arkme-billing-dialog-balance > span {\n color: #8a8e96;\n grid-column: 1;\n font-size: 11px;\n line-height: 16px;\n}\n\n.arkme-billing-dialog-balance > strong {\n grid-column: 1;\n font-size: 22px;\n font-weight: 600;\n line-height: 28px;\n}\n\n.arkme-billing-dialog-balance > button, .arkme-billing-error > button {\n color: #626772;\n height: 30px;\n font: inherit;\n cursor: pointer;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 9px;\n grid-area: 1 / 2 / span 2;\n padding: 0 12px;\n font-size: 11px;\n}\n\n.arkme-billing-products-section, .arkme-billing-payment-section {\n padding-top: 17px;\n}\n\n.arkme-billing-products-section h3, .arkme-billing-payment-section h3 {\n color: #747984;\n margin: 0 0 11px;\n font-size: 12px;\n font-weight: 500;\n line-height: 18px;\n}\n\n.arkme-billing-product-grid {\n width: 100%;\n}\n\n.arkme-billing-product-grid > button {\n color: #20232c;\n min-width: 0;\n min-height: 62px;\n font: inherit;\n text-align: left;\n cursor: pointer;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 11px;\n align-content: center;\n gap: 4px;\n padding: 9px 11px;\n display: grid;\n}\n\n.arkme-billing-product-grid > button:hover {\n background: #f8f8f9;\n border-color: #cfd2d8;\n}\n\n.arkme-billing-product-grid > button.is-selected {\n border-color: #75839e;\n box-shadow: 0 0 0 1px #75839e;\n}\n\n.arkme-billing-product-grid > button > span {\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 12px;\n font-weight: 500;\n line-height: 17px;\n overflow: hidden;\n}\n\n.arkme-billing-product-grid > button > strong {\n font-size: 14px;\n font-weight: 600;\n line-height: 19px;\n}\n\n.arkme-billing-payment-actions {\n flex-wrap: wrap;\n gap: 10px;\n display: flex;\n}\n\n.arkme-billing-payment-actions > button {\n color: #333842;\n min-width: 154px;\n height: 38px;\n font: inherit;\n cursor: pointer;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 10px;\n justify-content: center;\n align-items: center;\n gap: 8px;\n padding: 0 14px;\n font-size: 12px;\n display: inline-flex;\n}\n\n.arkme-billing-payment-actions > button:hover {\n background: #f7f7f8;\n border-color: #cfd3da;\n}\n\n.arkme-billing-payment-actions > button:disabled, .arkme-billing-product-grid > button:disabled {\n opacity: .48;\n cursor: default;\n}\n\n.arkme-billing-platform-icon {\n flex: none;\n width: 18px;\n height: 18px;\n}\n\n.arkme-billing-platform-icon.is-alipay {\n color: #1677ff;\n}\n\n.arkme-billing-platform-icon.is-wechat {\n color: #07c160;\n}\n\n.arkme-billing-state {\n color: #858992;\n margin: 12px 0 2px;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-billing-error {\n color: #b54841;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n margin-top: 10px;\n font-size: 12px;\n line-height: 18px;\n display: flex;\n}\n\n.arkme-billing-error.is-purchase {\n justify-content: flex-start;\n}\n\n.arkme-billing-payment-content {\n text-align: center;\n justify-items: center;\n gap: 10px;\n padding: 28px 24px 18px;\n display: grid;\n}\n\n.arkme-billing-payment-content > .arkme-billing-platform-icon {\n width: 38px;\n height: 38px;\n margin-bottom: 4px;\n}\n\n.arkme-billing-payment-content > img {\n border-radius: 10px;\n width: 210px;\n height: 210px;\n}\n\n.arkme-billing-payment-content > strong {\n font-size: 14px;\n font-weight: 600;\n line-height: 21px;\n}\n\n.arkme-billing-payment-content > p {\n color: #858992;\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-billing-payment-content.is-paid > strong {\n color: #16794f;\n font-size: 18px;\n line-height: 25px;\n}\n\n.arkme-billing-payment-content.is-paid > .arkme-billing-error {\n justify-content: center;\n}\n\n.arkme-billing-payment-content.is-crediting > strong {\n color: #335f9e;\n}\n\n.arkme-billing-dialog-actions {\n flex-wrap: wrap;\n justify-content: center;\n gap: 9px;\n padding: 0 22px 20px;\n display: flex;\n}\n\n.arkme-billing-dialog-actions > button, .arkme-billing-primary-action {\n color: #3c424d;\n height: 34px;\n font: inherit;\n cursor: pointer;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 9px;\n padding: 0 14px;\n font-size: 12px;\n}\n\n.arkme-billing-dialog-actions > .arkme-billing-primary-action, .arkme-billing-payment-content > .arkme-billing-primary-action {\n color: #fff;\n background: #20232d;\n border-color: #20232d;\n}\n";
5364
5390
  //#endregion
5365
5391
  //#region src/client/arkme-billing.ts
5366
5392
  function createBillingClientRequestId(source = globalThis.crypto) {
@@ -5897,7 +5923,7 @@ window.__ModuleLoader__.load({
5897
5923
  })
5898
5924
  });
5899
5925
  }
5900
- function ArkmeBillingSettings() {
5926
+ function ArkmeBillingSettings({ active = true, renderTrigger } = {}) {
5901
5927
  const [open, setOpen] = (0, react.useState)(false);
5902
5928
  const [quotaState, setQuotaState] = (0, react.useState)({ kind: "loading" });
5903
5929
  const [productsState, setProductsState] = (0, react.useState)({ kind: "loading" });
@@ -5912,15 +5938,20 @@ window.__ModuleLoader__.load({
5912
5938
  const pollerRef = (0, react.useRef)();
5913
5939
  const checkoutAttemptRef = (0, react.useRef)();
5914
5940
  const selectedProductIdRef = (0, react.useRef)();
5941
+ const dialogRoot = (0, react.useRef)(null);
5915
5942
  const quotaLoadGenerationRef = (0, react.useRef)(0);
5943
+ const quotaRequestRef = (0, react.useRef)();
5916
5944
  const openPaymentUrl = (0, react.useCallback)((url) => {
5917
5945
  window.open(url, "_blank", "noopener,noreferrer");
5918
5946
  }, []);
5919
5947
  const loadQuota = (0, react.useCallback)(async () => {
5920
5948
  const generation = ++quotaLoadGenerationRef.current;
5949
+ quotaRequestRef.current?.abort();
5950
+ const request = new AbortController();
5951
+ quotaRequestRef.current = request;
5921
5952
  setQuotaState({ kind: "loading" });
5922
5953
  try {
5923
- const quota = await callArkme("billing.quota");
5954
+ const quota = await callArkme("billing.quota", void 0, request.signal);
5924
5955
  if (generation === quotaLoadGenerationRef.current) setQuotaState({
5925
5956
  kind: "ready",
5926
5957
  quota
@@ -5952,12 +5983,13 @@ window.__ModuleLoader__.load({
5952
5983
  }
5953
5984
  }, []);
5954
5985
  (0, react.useEffect)(() => {
5955
- loadQuota();
5956
- return () => {
5957
- quotaLoadGenerationRef.current += 1;
5958
- pollerRef.current?.stop();
5959
- };
5960
- }, [loadQuota]);
5986
+ if (active) loadQuota();
5987
+ }, [active, loadQuota]);
5988
+ (0, react.useEffect)(() => () => {
5989
+ quotaLoadGenerationRef.current += 1;
5990
+ quotaRequestRef.current?.abort();
5991
+ pollerRef.current?.stop();
5992
+ }, []);
5961
5993
  (0, react.useEffect)(() => {
5962
5994
  if (open) loadProducts();
5963
5995
  }, [loadProducts, open]);
@@ -6079,15 +6111,48 @@ window.__ModuleLoader__.load({
6079
6111
  setOrder(void 0);
6080
6112
  createPayment(paymentMethod, true);
6081
6113
  };
6082
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
6083
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeBalanceSettingsRowView, {
6084
- quotaState,
6085
- onOpen: () => {
6086
- setOpen(true);
6087
- loadQuota();
6114
+ const triggerProps = {
6115
+ quotaState,
6116
+ onOpen: () => {
6117
+ setOpen(true);
6118
+ loadQuota();
6119
+ },
6120
+ onRefresh: () => {
6121
+ loadQuota();
6122
+ }
6123
+ };
6124
+ (0, react.useEffect)(() => {
6125
+ const dialog = dialogRoot.current;
6126
+ if (!dialog) return;
6127
+ const previous = document.activeElement;
6128
+ const controls = () => [...dialog.querySelectorAll("button:not(:disabled), [href], input:not(:disabled), [tabindex=\"0\"]")];
6129
+ controls()[0]?.focus();
6130
+ const keydown = (event) => {
6131
+ if (event.key === "Escape") {
6132
+ event.preventDefault();
6133
+ event.stopPropagation();
6134
+ if (order) closePayment();
6135
+ else closeRecharge();
6136
+ } else if (event.key === "Tab") {
6137
+ const items = controls(), first = items[0], last = items.at(-1);
6138
+ if (event.shiftKey && document.activeElement === first) {
6139
+ event.preventDefault();
6140
+ last?.focus();
6141
+ } else if (!event.shiftKey && document.activeElement === last) {
6142
+ event.preventDefault();
6143
+ first?.focus();
6144
+ }
6088
6145
  }
6089
- }),
6090
- open && order === void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeRechargeDialogView, {
6146
+ };
6147
+ dialog.addEventListener("keydown", keydown);
6148
+ return () => {
6149
+ dialog.removeEventListener("keydown", keydown);
6150
+ if (previous?.isConnected) previous.focus();
6151
+ };
6152
+ }, [open, order?.orderId]);
6153
+ const dialogs = /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6154
+ ref: dialogRoot,
6155
+ children: [open && order === void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeRechargeDialogView, {
6091
6156
  quotaState,
6092
6157
  productsState,
6093
6158
  selectedProductId,
@@ -6104,8 +6169,7 @@ window.__ModuleLoader__.load({
6104
6169
  onPurchase: (paymentMethod) => {
6105
6170
  createPayment(paymentMethod);
6106
6171
  }
6107
- }),
6108
- order !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmePaymentDialog, {
6172
+ }), order !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmePaymentDialog, {
6109
6173
  order,
6110
6174
  nowMillis,
6111
6175
  statusError: orderStatusError,
@@ -6119,7 +6183,12 @@ window.__ModuleLoader__.load({
6119
6183
  loadQuota();
6120
6184
  },
6121
6185
  onOpenPaymentUrl: openPaymentUrl
6122
- })
6186
+ })]
6187
+ });
6188
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
6189
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("style", { children: arkme_billing_default }),
6190
+ renderTrigger ? renderTrigger(triggerProps) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeBalanceSettingsRowView, { ...triggerProps }),
6191
+ (open || order !== void 0) && (renderTrigger && typeof document !== "undefined" ? (0, react_dom.createPortal)(dialogs, document.body) : dialogs)
6123
6192
  ] });
6124
6193
  }
6125
6194
  //#endregion
@@ -8949,7 +9018,7 @@ window.__ModuleLoader__.load({
8949
9018
  //#region src/client/ui-controller.ts
8950
9019
  function sameSelectedSource(left, right) {
8951
9020
  if (left === void 0 || right === void 0) return left === right;
8952
- return left.sourceRef === right.sourceRef && left.sourceKey === right.sourceKey && left.kind === right.kind && left.displayName === right.displayName && left.latestPreview === right.latestPreview && left.activeAtMillis === right.activeAtMillis && left.unreadCount === right.unreadCount && left.hasUnreadMention === right.hasUnreadMention && left.badgeUnreadCount === right.badgeUnreadCount && left.notificationAllowed === right.notificationAllowed && left.isMuted === right.isMuted && left.isPinned === right.isPinned && left.latestSequence === right.latestSequence && left.avatarRef === right.avatarRef && (left.avatarRefs ?? []).join("|") === (right.avatarRefs ?? []).join("|") && JSON.stringify(left.groupAvatar) === JSON.stringify(right.groupAvatar);
9021
+ return left.sourceRef === right.sourceRef && left.sourceKey === right.sourceKey && left.kind === right.kind && left.displayName === right.displayName && left.latestPreview === right.latestPreview && left.activeAtMillis === right.activeAtMillis && left.unreadCount === right.unreadCount && left.hasUnreadMention === right.hasUnreadMention && left.badgeUnreadCount === right.badgeUnreadCount && left.notificationAllowed === right.notificationAllowed && left.directMessageAdmissionApplicable === right.directMessageAdmissionApplicable && left.isMuted === right.isMuted && left.isPinned === right.isPinned && left.latestSequence === right.latestSequence && left.avatarRef === right.avatarRef && (left.avatarRefs ?? []).join("|") === (right.avatarRefs ?? []).join("|") && JSON.stringify(left.groupAvatar) === JSON.stringify(right.groupAvatar);
8953
9022
  }
8954
9023
  function sameBot(left, right) {
8955
9024
  if (left === void 0 || right === void 0) return left === right;
@@ -33164,6 +33233,212 @@ function(test) {
33164
33233
  });
33165
33234
  }
33166
33235
  //#endregion
33236
+ //#region src/direct-message-admission.ts
33237
+ function directMessageAdmissionMessage(admission) {
33238
+ switch (admission.state) {
33239
+ case "allowed": return "";
33240
+ case "refused_by_self": return "你已拒收对方的消息";
33241
+ case "refused_by_counterpart": return "对方已拒收你的消息";
33242
+ case "mutually_refused": return "你们已互相拒收消息";
33243
+ }
33244
+ }
33245
+ //#endregion
33246
+ //#region src/client/direct-message-admission.ts
33247
+ async function requireDirectMessageSendAllowed(source, signal) {
33248
+ if (source.directMessageAdmissionApplicable !== true) return;
33249
+ let admission;
33250
+ try {
33251
+ admission = await callArkme("chat.direct-message-admission", { sourceRef: source.sourceRef }, signal);
33252
+ } catch {
33253
+ signal?.throwIfAborted();
33254
+ return;
33255
+ }
33256
+ if (!admission.canSend) throw new Error(`${source.displayName}:${directMessageAdmissionMessage(admission)}`);
33257
+ }
33258
+ function readCachedAdmission(scope) {
33259
+ if (scope === "") return void 0;
33260
+ try {
33261
+ const raw = typeof window === "undefined" ? null : window.localStorage?.getItem(`arkme.direct-message-admission.v1:${scope}`);
33262
+ if (raw == null) return void 0;
33263
+ const value = JSON.parse(raw);
33264
+ if (typeof value.ownRefused !== "boolean" || typeof value.counterpartRefused !== "boolean" || typeof value.refusalCreationEnabled !== "boolean" || typeof value.canSend !== "boolean" || !Number.isSafeInteger(value.ownRevision) || value.ownRevision < 0 || !Number.isSafeInteger(value.counterpartRevision) || value.counterpartRevision < 0 || value.ownRefused && value.ownRevision === 0 || value.counterpartRefused && value.counterpartRevision === 0) return void 0;
33265
+ const state = value.ownRefused ? value.counterpartRefused ? "mutually_refused" : "refused_by_self" : value.counterpartRefused ? "refused_by_counterpart" : "allowed";
33266
+ return value.state === state && value.canSend === (state === "allowed") ? value : void 0;
33267
+ } catch {
33268
+ return;
33269
+ }
33270
+ }
33271
+ function cacheAdmission(scope, admission) {
33272
+ try {
33273
+ if (scope !== "" && typeof window !== "undefined") window.localStorage?.setItem(`arkme.direct-message-admission.v1:${scope}`, JSON.stringify(admission));
33274
+ } catch {}
33275
+ }
33276
+ const listeners$1 = /* @__PURE__ */ new Set();
33277
+ function invalidateDirectMessageAdmission() {
33278
+ for (const listener of listeners$1) listener();
33279
+ }
33280
+ function useDirectMessageAdmission(account, sourceRef, applicable) {
33281
+ const scope = account !== void 0 && sourceRef !== void 0 && applicable ? `${account}:${sourceRef}` : "";
33282
+ const scopeRef = (0, react.useRef)(scope);
33283
+ scopeRef.current = scope;
33284
+ const [revision, setRevision] = (0, react.useState)(0);
33285
+ const [view, setView] = (0, react.useState)({
33286
+ scope: "",
33287
+ loading: false,
33288
+ mutating: false,
33289
+ error: ""
33290
+ });
33291
+ const queryAbort = (0, react.useRef)();
33292
+ const mutationAbort = (0, react.useRef)();
33293
+ const refresh = (0, react.useCallback)(() => {
33294
+ setRevision((value) => value + 1);
33295
+ }, []);
33296
+ (0, react.useEffect)(() => {
33297
+ if (scope === "") return;
33298
+ listeners$1.add(refresh);
33299
+ const browserWindow = typeof window === "undefined" ? void 0 : window;
33300
+ const browserDocument = typeof document === "undefined" ? void 0 : document;
33301
+ browserWindow?.addEventListener("focus", refresh);
33302
+ const visible = () => {
33303
+ if (browserDocument?.visibilityState === "visible") refresh();
33304
+ };
33305
+ browserDocument?.addEventListener("visibilitychange", visible);
33306
+ return () => {
33307
+ listeners$1.delete(refresh);
33308
+ browserWindow?.removeEventListener("focus", refresh);
33309
+ browserDocument?.removeEventListener("visibilitychange", visible);
33310
+ };
33311
+ }, [refresh, scope]);
33312
+ (0, react.useEffect)(() => () => {
33313
+ mutationAbort.current?.abort();
33314
+ mutationAbort.current = void 0;
33315
+ }, [scope]);
33316
+ (0, react.useEffect)(() => {
33317
+ if (scope === "" || sourceRef === void 0 || mutationAbort.current !== void 0) return;
33318
+ const controller = new AbortController();
33319
+ queryAbort.current = controller;
33320
+ setView((current) => {
33321
+ const admission = current.scope === scope ? current.admission : readCachedAdmission(scope);
33322
+ return {
33323
+ scope,
33324
+ ...admission === void 0 ? {} : { admission },
33325
+ loading: true,
33326
+ mutating: false,
33327
+ error: ""
33328
+ };
33329
+ });
33330
+ callArkme("chat.direct-message-admission", { sourceRef }, controller.signal).then((admission) => {
33331
+ if (!controller.signal.aborted && scopeRef.current === scope) {
33332
+ cacheAdmission(scope, admission);
33333
+ setView({
33334
+ scope,
33335
+ admission,
33336
+ loading: false,
33337
+ mutating: false,
33338
+ error: ""
33339
+ });
33340
+ }
33341
+ }).catch(() => {
33342
+ if (!controller.signal.aborted && scopeRef.current === scope) setView((current) => ({
33343
+ ...current,
33344
+ scope,
33345
+ loading: false,
33346
+ mutating: false,
33347
+ error: "暂时无法读取拒收设置"
33348
+ }));
33349
+ });
33350
+ return () => {
33351
+ controller.abort();
33352
+ };
33353
+ }, [
33354
+ scope,
33355
+ sourceRef,
33356
+ revision
33357
+ ]);
33358
+ const current = view.scope === scope ? view : void 0;
33359
+ const toggle = async (confirmRefusal) => {
33360
+ if (scope === "" || sourceRef === void 0 || current?.loading || current?.mutating || mutationAbort.current !== void 0) return;
33361
+ if (current?.admission?.ownRefused === false && current.admission.refusalCreationEnabled === false) return;
33362
+ const controller = new AbortController();
33363
+ queryAbort.current?.abort();
33364
+ mutationAbort.current = controller;
33365
+ let admission = current?.admission;
33366
+ setView({
33367
+ scope,
33368
+ ...admission === void 0 ? {} : { admission },
33369
+ loading: false,
33370
+ mutating: true,
33371
+ error: ""
33372
+ });
33373
+ let succeeded = false;
33374
+ let attemptedMutation = false;
33375
+ try {
33376
+ if (admission === void 0) {
33377
+ admission = await callArkme("chat.direct-message-admission", { sourceRef }, controller.signal);
33378
+ if (controller.signal.aborted || scopeRef.current !== scope) return;
33379
+ cacheAdmission(scope, admission);
33380
+ }
33381
+ if (!admission.ownRefused && (!admission.refusalCreationEnabled || confirmRefusal?.() === false)) {
33382
+ setView({
33383
+ scope,
33384
+ admission,
33385
+ loading: false,
33386
+ mutating: false,
33387
+ error: ""
33388
+ });
33389
+ return;
33390
+ }
33391
+ attemptedMutation = true;
33392
+ const next = await callArkme("chat.direct-message-refusal.set", {
33393
+ sourceRef,
33394
+ refused: !admission.ownRefused,
33395
+ expectedRevision: admission.ownRevision
33396
+ }, controller.signal);
33397
+ if (!controller.signal.aborted && scopeRef.current === scope) {
33398
+ cacheAdmission(scope, next);
33399
+ setView({
33400
+ scope,
33401
+ admission: next,
33402
+ loading: false,
33403
+ mutating: false,
33404
+ error: ""
33405
+ });
33406
+ succeeded = true;
33407
+ }
33408
+ } catch (error) {
33409
+ if (!controller.signal.aborted && scopeRef.current === scope) {
33410
+ const latest = error instanceof ArkmeClientError ? error.body.directMessageAdmission : void 0;
33411
+ if (latest !== void 0) cacheAdmission(scope, latest);
33412
+ const retained = latest ?? admission;
33413
+ setView({
33414
+ scope,
33415
+ ...retained === void 0 ? {} : { admission: retained },
33416
+ loading: false,
33417
+ mutating: false,
33418
+ error: !attemptedMutation ? "暂时无法读取拒收设置" : error instanceof Error ? error.message : "拒收设置失败"
33419
+ });
33420
+ }
33421
+ } finally {
33422
+ if (mutationAbort.current === controller) mutationAbort.current = void 0;
33423
+ if (!controller.signal.aborted && scopeRef.current === scope) {
33424
+ if (succeeded) invalidateDirectMessageAdmission();
33425
+ else if (attemptedMutation) refresh();
33426
+ }
33427
+ }
33428
+ };
33429
+ const blocked = scope !== "" && current?.admission?.canSend === false;
33430
+ return {
33431
+ applicable: scope !== "",
33432
+ admission: current?.admission,
33433
+ blocked,
33434
+ error: current?.error ?? "",
33435
+ busy: current?.loading === true || current?.mutating === true,
33436
+ message: blocked && current?.admission !== void 0 ? directMessageAdmissionMessage(current.admission) : "",
33437
+ refresh,
33438
+ toggle
33439
+ };
33440
+ }
33441
+ //#endregion
33167
33442
  //#region node_modules/@phosphor-icons/react/dist/defs/Robot.es.js
33168
33443
  const e$36 = /* @__PURE__ */ new Map([
33169
33444
  ["bold", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M72,104a16,16,0,1,1,16,16A16,16,0,0,1,72,104Zm96,16a16,16,0,1,0-16-16A16,16,0,0,0,168,120Zm68-40V192a36,36,0,0,1-36,36H56a36,36,0,0,1-36-36V80A36,36,0,0,1,56,44h60V16a12,12,0,0,1,24,0V44h60A36,36,0,0,1,236,80Zm-24,0a12,12,0,0,0-12-12H56A12,12,0,0,0,44,80V192a12,12,0,0,0,12,12H200a12,12,0,0,0,12-12Zm-12,82a30,30,0,0,1-30,30H86a30,30,0,0,1,0-60h84A30,30,0,0,1,200,162Zm-80-6v12h16V156ZM86,168H96V156H86a6,6,0,0,0,0,12Zm90-6a6,6,0,0,0-6-6H160v12h10A6,6,0,0,0,176,162Z" }))],
@@ -33207,6 +33482,50 @@ function(test) {
33207
33482
  o$11.displayName = "UserMinusIcon";
33208
33483
  const m$5 = o$11;
33209
33484
  //#endregion
33485
+ //#region node_modules/@phosphor-icons/react/dist/defs/Prohibit.es.js
33486
+ const t$5 = /* @__PURE__ */ new Map([
33487
+ ["bold", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M128,20A108,108,0,1,0,236,128,108.12,108.12,0,0,0,128,20Zm84,108a83.6,83.6,0,0,1-16.75,50.28L77.72,60.75A84,84,0,0,1,212,128ZM44,128A83.6,83.6,0,0,1,60.75,77.72L178.28,195.25A84,84,0,0,1,44,128Z" }))],
33488
+ ["duotone", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", {
33489
+ d: "M224,128a96,96,0,1,1-96-96A96,96,0,0,1,224,128Z",
33490
+ opacity: "0.2"
33491
+ }), /* @__PURE__ */ react.createElement("path", { d: "M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm88,104a87.56,87.56,0,0,1-20.41,56.28L71.72,60.4A88,88,0,0,1,216,128ZM40,128A87.56,87.56,0,0,1,60.41,71.72L184.28,195.6A88,88,0,0,1,40,128Z" }))],
33492
+ ["fill", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M200,128a71.69,71.69,0,0,1-15.78,44.91L83.09,71.78A71.95,71.95,0,0,1,200,128ZM56,128a71.95,71.95,0,0,0,116.91,56.22L71.78,83.09A71.69,71.69,0,0,0,56,128Zm180,0A108,108,0,1,1,128,20,108.12,108.12,0,0,1,236,128Zm-20,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128Z" }))],
33493
+ ["light", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M128,26A102,102,0,1,0,230,128,102.12,102.12,0,0,0,128,26Zm90,102a89.6,89.6,0,0,1-22.29,59.22L68.78,60.29A89.95,89.95,0,0,1,218,128ZM38,128A89.6,89.6,0,0,1,60.29,68.78L187.22,195.71A89.95,89.95,0,0,1,38,128Z" }))],
33494
+ ["regular", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm88,104a87.56,87.56,0,0,1-20.41,56.28L71.72,60.4A88,88,0,0,1,216,128ZM40,128A87.56,87.56,0,0,1,60.41,71.72L184.28,195.6A88,88,0,0,1,40,128Z" }))],
33495
+ ["thin", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M128,28A100,100,0,1,0,228,128,100.11,100.11,0,0,0,128,28Zm92,100a91.67,91.67,0,0,1-24.21,62.13L65.87,60.21A92,92,0,0,1,220,128ZM36,128A91.67,91.67,0,0,1,60.21,65.87L190.13,195.79A92,92,0,0,1,36,128Z" }))]
33496
+ ]);
33497
+ //#endregion
33498
+ //#region node_modules/@phosphor-icons/react/dist/csr/Prohibit.es.js
33499
+ const r$8 = react.forwardRef((t, i) => /* @__PURE__ */ react.createElement(p$2, {
33500
+ ref: i,
33501
+ ...t,
33502
+ weights: t$5
33503
+ }));
33504
+ r$8.displayName = "ProhibitIcon";
33505
+ const s$5 = r$8;
33506
+ //#endregion
33507
+ //#region node_modules/@phosphor-icons/react/dist/defs/Check.es.js
33508
+ const a$16 = /* @__PURE__ */ new Map([
33509
+ ["bold", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z" }))],
33510
+ ["duotone", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", {
33511
+ d: "M232,56V200a16,16,0,0,1-16,16H40a16,16,0,0,1-16-16V56A16,16,0,0,1,40,40H216A16,16,0,0,1,232,56Z",
33512
+ opacity: "0.2"
33513
+ }), /* @__PURE__ */ react.createElement("path", { d: "M205.66,85.66l-96,96a8,8,0,0,1-11.32,0l-40-40a8,8,0,0,1,11.32-11.32L104,164.69l90.34-90.35a8,8,0,0,1,11.32,11.32Z" }))],
33514
+ ["fill", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM205.66,85.66l-96,96a8,8,0,0,1-11.32,0l-40-40a8,8,0,0,1,11.32-11.32L104,164.69l90.34-90.35a8,8,0,0,1,11.32,11.32Z" }))],
33515
+ ["light", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M228.24,76.24l-128,128a6,6,0,0,1-8.48,0l-56-56a6,6,0,0,1,8.48-8.48L96,191.51,219.76,67.76a6,6,0,0,1,8.48,8.48Z" }))],
33516
+ ["regular", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M229.66,77.66l-128,128a8,8,0,0,1-11.32,0l-56-56a8,8,0,0,1,11.32-11.32L96,188.69,218.34,66.34a8,8,0,0,1,11.32,11.32Z" }))],
33517
+ ["thin", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M226.83,74.83l-128,128a4,4,0,0,1-5.66,0l-56-56a4,4,0,0,1,5.66-5.66L96,194.34,221.17,69.17a4,4,0,1,1,5.66,5.66Z" }))]
33518
+ ]);
33519
+ //#endregion
33520
+ //#region node_modules/@phosphor-icons/react/dist/csr/Check.es.js
33521
+ const o$10 = react.forwardRef((c, r) => /* @__PURE__ */ react.createElement(p$2, {
33522
+ ref: r,
33523
+ ...c,
33524
+ weights: a$16
33525
+ }));
33526
+ o$10.displayName = "CheckIcon";
33527
+ const n$6 = o$10;
33528
+ //#endregion
33210
33529
  //#region node_modules/@phosphor-icons/react/dist/defs/UserPlus.es.js
33211
33530
  const e$34 = /* @__PURE__ */ new Map([
33212
33531
  ["bold", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M256,136a12,12,0,0,1-12,12h-8v8a12,12,0,0,1-24,0v-8h-8a12,12,0,0,1,0-24h8v-8a12,12,0,0,1,24,0v8h8A12,12,0,0,1,256,136Zm-54.81,56.28a12,12,0,1,1-18.38,15.44C169.12,191.42,145,172,108,172c-28.89,0-55.46,12.68-74.81,35.72a12,12,0,0,1-18.38-15.44A124.08,124.08,0,0,1,63.5,156.53a72,72,0,1,1,89,0A124,124,0,0,1,201.19,192.28ZM108,148a48,48,0,1,0-48-48A48.05,48.05,0,0,0,108,148Z" }))],
@@ -33221,13 +33540,32 @@ function(test) {
33221
33540
  ]);
33222
33541
  //#endregion
33223
33542
  //#region node_modules/@phosphor-icons/react/dist/csr/UserPlus.es.js
33224
- const o$10 = react.forwardRef((r, s) => /* @__PURE__ */ react.createElement(p$2, {
33543
+ const o$9 = react.forwardRef((r, s) => /* @__PURE__ */ react.createElement(p$2, {
33225
33544
  ref: s,
33226
33545
  ...r,
33227
33546
  weights: e$34
33228
33547
  }));
33229
- o$10.displayName = "UserPlusIcon";
33230
- const n$6 = o$10;
33548
+ o$9.displayName = "UserPlusIcon";
33549
+ const n$5 = o$9;
33550
+ //#endregion
33551
+ //#region src/client/timeline-media.ts
33552
+ /** Same-version read failures may retain display, never claim a complete read. */
33553
+ function retainPartialTimelineMedia(previous, incoming) {
33554
+ const version = incoming.recordVersion ?? incoming.version ?? 0;
33555
+ if (incoming.mediaUnavailable !== true || incoming.status !== 1 || previous?.status !== 1 || previous.itemUid !== incoming.itemUid || version <= 0 || version !== (previous.recordVersion ?? previous.version)) return incoming;
33556
+ const current = incoming.contentBlocks ?? [];
33557
+ const assets = new Map(current.filter((block) => block.fileAssetUid).map((block) => [block.fileAssetUid, block]));
33558
+ const retained = (previous.contentBlocks ?? []).flatMap((block) => {
33559
+ if (!block.fileAssetUid) return current.length === 0 ? [block] : [];
33560
+ const replacement = assets.get(block.fileAssetUid);
33561
+ assets.delete(block.fileAssetUid);
33562
+ return [replacement ?? block];
33563
+ });
33564
+ return {
33565
+ ...incoming,
33566
+ contentBlocks: [...retained, ...current.filter((block) => !block.fileAssetUid || assets.has(block.fileAssetUid))].sort((left, right) => left.sortOrder - right.sortOrder)
33567
+ };
33568
+ }
33231
33569
  //#endregion
33232
33570
  //#region src/client/member-event-hints.ts
33233
33571
  const listeners = /* @__PURE__ */ new Set();
@@ -39554,7 +39892,7 @@ function(test) {
39554
39892
  }
39555
39893
  //#endregion
39556
39894
  //#region node_modules/@phosphor-icons/react/dist/defs/Play.es.js
39557
- const a$16 = /* @__PURE__ */ new Map([
39895
+ const a$15 = /* @__PURE__ */ new Map([
39558
39896
  ["bold", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M234.49,111.07,90.41,22.94A20,20,0,0,0,60,39.87V216.13a20,20,0,0,0,30.41,16.93l144.08-88.13a19.82,19.82,0,0,0,0-33.86ZM84,208.85V47.15L216.16,128Z" }))],
39559
39897
  ["duotone", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", {
39560
39898
  d: "M228.23,134.69,84.15,222.81A8,8,0,0,1,72,216.12V39.88a8,8,0,0,1,12.15-6.69l144.08,88.12A7.82,7.82,0,0,1,228.23,134.69Z",
@@ -39567,13 +39905,13 @@ function(test) {
39567
39905
  ]);
39568
39906
  //#endregion
39569
39907
  //#region node_modules/@phosphor-icons/react/dist/csr/Play.es.js
39570
- const a$15 = react.forwardRef((e, r) => /* @__PURE__ */ react.createElement(p$2, {
39908
+ const a$14 = react.forwardRef((e, r) => /* @__PURE__ */ react.createElement(p$2, {
39571
39909
  ref: r,
39572
39910
  ...e,
39573
- weights: a$16
39911
+ weights: a$15
39574
39912
  }));
39575
- a$15.displayName = "PlayIcon";
39576
- const n$5 = a$15;
39913
+ a$14.displayName = "PlayIcon";
39914
+ const n$4 = a$14;
39577
39915
  //#endregion
39578
39916
  //#region node_modules/@phosphor-icons/react/dist/defs/Pause.es.js
39579
39917
  const e$33 = /* @__PURE__ */ new Map([
@@ -39589,13 +39927,13 @@ function(test) {
39589
39927
  ]);
39590
39928
  //#endregion
39591
39929
  //#region node_modules/@phosphor-icons/react/dist/csr/Pause.es.js
39592
- const o$9 = react.forwardRef((a, r) => /* @__PURE__ */ react.createElement(p$2, {
39930
+ const o$8 = react.forwardRef((a, r) => /* @__PURE__ */ react.createElement(p$2, {
39593
39931
  ref: r,
39594
39932
  ...a,
39595
39933
  weights: e$33
39596
39934
  }));
39597
- o$9.displayName = "PauseIcon";
39598
- const n$4 = o$9;
39935
+ o$8.displayName = "PauseIcon";
39936
+ const n$3 = o$8;
39599
39937
  //#endregion
39600
39938
  //#region node_modules/@phosphor-icons/react/dist/defs/SpinnerGap.es.js
39601
39939
  const e$32 = /* @__PURE__ */ new Map([
@@ -39611,13 +39949,13 @@ function(test) {
39611
39949
  ]);
39612
39950
  //#endregion
39613
39951
  //#region node_modules/@phosphor-icons/react/dist/csr/SpinnerGap.es.js
39614
- const o$8 = react.forwardRef((r, n) => /* @__PURE__ */ react.createElement(p$2, {
39952
+ const o$7 = react.forwardRef((r, n) => /* @__PURE__ */ react.createElement(p$2, {
39615
39953
  ref: n,
39616
39954
  ...r,
39617
39955
  weights: e$32
39618
39956
  }));
39619
- o$8.displayName = "SpinnerGapIcon";
39620
- const m$4 = o$8;
39957
+ o$7.displayName = "SpinnerGapIcon";
39958
+ const m$4 = o$7;
39621
39959
  //#endregion
39622
39960
  //#region node_modules/mediabunny/dist/modules/src/misc.js
39623
39961
  /*!
@@ -53358,11 +53696,11 @@ function(test) {
53358
53696
  "aria-hidden": true,
53359
53697
  className: "arkme-icon-spin",
53360
53698
  "data-arkme-voice-loading": "true"
53361
- }) : status === "playing" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$4, {
53699
+ }) : status === "playing" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$3, {
53362
53700
  size: 16,
53363
53701
  weight: "fill",
53364
53702
  "aria-hidden": true
53365
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$5, {
53703
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$4, {
53366
53704
  size: 16,
53367
53705
  weight: "fill",
53368
53706
  "aria-hidden": true
@@ -54705,12 +55043,12 @@ function(test) {
54705
55043
  renderLink
54706
55044
  });
54707
55045
  }
54708
- function mediaUrl$1(block) {
55046
+ function arkmeContentMediaUrl(block) {
54709
55047
  if (block.localFileRef !== void 0) return arkmeLocalFileUrl(block.localFileRef);
54710
55048
  return `${mediaRoute$1}?ref=${encodeURIComponent(block.mediaRef)}`;
54711
55049
  }
54712
55050
  function mediaAttemptUrl(block, attempt) {
54713
- const url = mediaUrl$1(block);
55051
+ const url = arkmeContentMediaUrl(block);
54714
55052
  return attempt > 0 ? `${url}${url.includes("?") ? "&" : "?"}retry=${String(attempt)}` : url;
54715
55053
  }
54716
55054
  function UploadProgress({ block }) {
@@ -55130,7 +55468,7 @@ function(test) {
55130
55468
  const [imageMode, setImageMode] = (0, react.useState)("contained");
55131
55469
  const [imageDragging, setImageDragging] = (0, react.useState)(false);
55132
55470
  const original = useArkmeOriginal(selected, selected.kind === "image");
55133
- const originalUrl = previewUrl ?? (original.localRef === void 0 ? mediaUrl$1(selected) : arkmeLocalFileUrl(original.localRef));
55471
+ const originalUrl = previewUrl ?? (original.localRef === void 0 ? arkmeContentMediaUrl(selected) : arkmeLocalFileUrl(original.localRef));
55134
55472
  (0, react.useEffect)(() => {
55135
55473
  setImageMode("contained");
55136
55474
  setImageDragging(false);
@@ -55402,27 +55740,19 @@ function(test) {
55402
55740
  function arkmeRelatedRecordingItemFromSharedRecording(item) {
55403
55741
  return item.sharedRecording === void 0 ? void 0 : arkmeRelatedRecordingItemFromSharedRecordingPreview(item.sharedRecording, item);
55404
55742
  }
55405
- function ArkmeMessageContent({ item, sourceRef, onLongArticleUpdated, highlightMentions = false, collapseText = true, presentation = "bubble", shareWebsite, onMessageCopyLinkOpen }) {
55743
+ function ArkmeMessageContent({ item, sourceRef, onLongArticleUpdated, highlightMentions = false, collapseText = true, presentation = "bubble", shareWebsite, onMessageCopyLinkOpen, mediaSelectionIsExplicit = false }) {
55406
55744
  const lastMedia = (0, react.useRef)();
55407
55745
  const snapshot = lastMedia.current;
55408
55746
  const previous = snapshot !== void 0 && snapshot.sourceRef === sourceRef ? snapshot.item : void 0;
55409
55747
  const version = item.recordVersion ?? item.version;
55410
- const sameRevision = version !== void 0 && version > 0 && version === (previous?.recordVersion ?? previous?.version);
55411
- const displayBlocks = (item.mediaUnavailable === true && sameRevision && item.status === 1 && previous?.status === 1 && previous.itemUid === item.itemUid && (item.contentBlocks?.length ?? 0) === 0 ? previous.contentBlocks : void 0) ?? item.contentBlocks;
55748
+ const display = mediaSelectionIsExplicit ? item : retainPartialTimelineMedia(previous, item);
55412
55749
  (0, react.useEffect)(() => {
55413
55750
  lastMedia.current = {
55414
55751
  sourceRef,
55415
- item: {
55416
- ...item,
55417
- ...displayBlocks === void 0 ? {} : { contentBlocks: displayBlocks }
55418
- }
55752
+ item: display
55419
55753
  };
55420
- }, [
55421
- item,
55422
- sourceRef,
55423
- displayBlocks
55424
- ]);
55425
- const blocks = [...displayBlocks ?? []].sort((left, right) => left.sortOrder - right.sortOrder);
55754
+ }, [display, sourceRef]);
55755
+ const blocks = [...display.contentBlocks ?? []].sort((left, right) => left.sortOrder - right.sortOrder);
55426
55756
  const visualBlocks = blocks.filter((block) => block.kind !== "audio");
55427
55757
  const [preview, setPreview] = (0, react.useState)();
55428
55758
  const [articleOpen, setArticleOpen] = (0, react.useState)(false);
@@ -56893,41 +57223,6 @@ function(test) {
56893
57223
  });
56894
57224
  }
56895
57225
  //#endregion
56896
- //#region src/chat-attention.ts
56897
- function integerLikeValue(value) {
56898
- if (typeof value === "number" && Number.isFinite(value)) return Math.trunc(value);
56899
- if (typeof value !== "string" || value.trim() === "") return void 0;
56900
- const parsed = Number(value.trim());
56901
- return Number.isFinite(parsed) ? Math.trunc(parsed) : void 0;
56902
- }
56903
- function arkmeChatPolicyNotificationDisabled(policy) {
56904
- if (policy === null || typeof policy !== "object" || Array.isArray(policy)) return void 0;
56905
- const value = policy;
56906
- const muteState = integerLikeValue(value.mute_state ?? value.muteState);
56907
- const notifyState = integerLikeValue(value.notify_state ?? value.notifyState);
56908
- if (muteState === 2 || notifyState === 2) return true;
56909
- if (muteState === 1 || notifyState === 1) return false;
56910
- }
56911
- function projectArkmeChatAttention(rawUnreadCount, policy, fallbackMuted = false) {
56912
- const unreadCount = Math.max(0, integerLikeValue(rawUnreadCount) ?? 0);
56913
- const isMuted = arkmeChatPolicyNotificationDisabled(policy) ?? fallbackMuted;
56914
- const notificationAllowed = !isMuted;
56915
- return {
56916
- unreadCount,
56917
- badgeUnreadCount: notificationAllowed ? unreadCount : 0,
56918
- notificationAllowed,
56919
- isMuted
56920
- };
56921
- }
56922
- function projectArkmeChatAttentionFromMuted(rawUnreadCount, isMuted) {
56923
- return projectArkmeChatAttention(rawUnreadCount, void 0, isMuted);
56924
- }
56925
- function arkmeBadgeUnreadCount(value) {
56926
- if (value.notificationAllowed === false || value.isMuted === true) return 0;
56927
- if (typeof value.badgeUnreadCount === "number" && Number.isFinite(value.badgeUnreadCount)) return Math.max(0, Math.trunc(value.badgeUnreadCount));
56928
- return value.notificationAllowed ?? true ? Math.max(0, Math.trunc(value.unreadCount ?? 0)) : 0;
56929
- }
56930
- //#endregion
56931
57226
  //#region src/client/file-send-tasks.ts
56932
57227
  function localFileBlock(file, sortOrder = 0) {
56933
57228
  return {
@@ -57101,6 +57396,316 @@ function(test) {
57101
57396
  };
57102
57397
  }
57103
57398
  //#endregion
57399
+ //#region src/client/record-reedit-submissions.ts
57400
+ /** Shared by display handoff and receipt acknowledgement; newer edits always win. */
57401
+ function recordReeditProjectionSettled(item, job) {
57402
+ if (!job.result || item.itemUid !== job.itemUid) return false;
57403
+ const version = item.recordVersion ?? item.version ?? 0;
57404
+ return version > job.result.version || version === job.result.version && (item.status !== 1 || item.mediaUnavailable !== true);
57405
+ }
57406
+ function projectRecordReedit(item, jobs) {
57407
+ const job = jobs.find((value) => value.itemUid === item.itemUid);
57408
+ const version = item.recordVersion ?? item.version ?? 0;
57409
+ if (!job || item.status !== 1 || (job.result ? recordReeditProjectionSettled(item, job) : version > job.baseVersion)) return item;
57410
+ const voiceBlock = job.voiceFileAssetUid ? [...item.contentBlocks ?? [], ...job.voiceBlock ? [job.voiceBlock] : []].find((block) => block.kind === "audio" && block.fileAssetUid === job.voiceFileAssetUid) : void 0;
57411
+ return {
57412
+ ...item,
57413
+ title: job.title,
57414
+ textContent: job.textContent,
57415
+ mediaUnavailable: Boolean(job.voiceFileAssetUid && !voiceBlock),
57416
+ contentBlocks: [...voiceBlock ? [voiceBlock] : [], ...job.attachments.flatMap((attachment, index) => {
57417
+ const block = attachment.localFile ? localFileBlock(attachment.localFile, index) : (item.contentBlocks ?? []).find((value) => value.fileAssetUid === attachment.asset.fileAssetUid) ?? attachment.block ?? {
57418
+ kind: "file",
57419
+ mediaRef: "",
57420
+ fileName: attachment.asset.fileName,
57421
+ mimeType: attachment.asset.mimeType,
57422
+ size: attachment.asset.size,
57423
+ sortOrder: index
57424
+ };
57425
+ return block ? [{
57426
+ ...block,
57427
+ sortOrder: index
57428
+ }] : [];
57429
+ })]
57430
+ };
57431
+ }
57432
+ /** Activates Host recovery explicitly and hands receipts off to the canonical timeline. */
57433
+ function useRecordReeditSubmissions(sourceRef, accountKey, active, items, refreshCurrentWindow, sourceKey) {
57434
+ const key = JSON.stringify([
57435
+ sourceKey,
57436
+ accountKey,
57437
+ active
57438
+ ]);
57439
+ const scope = (0, react.useRef)({
57440
+ key,
57441
+ sourceRef,
57442
+ generation: 0,
57443
+ requestGeneration: 0
57444
+ });
57445
+ if (scope.current.key !== key || scope.current.sourceRef !== sourceRef) scope.current = {
57446
+ key,
57447
+ sourceRef,
57448
+ generation: scope.current.generation + (scope.current.key === key ? 0 : 1),
57449
+ requestGeneration: scope.current.requestGeneration + 1
57450
+ };
57451
+ const { generation, requestGeneration } = scope.current;
57452
+ const revision = (0, react.useRef)(0);
57453
+ const resumedGeneration = (0, react.useRef)(-1);
57454
+ const [snapshot, setSnapshot] = (0, react.useState)({
57455
+ key,
57456
+ generation,
57457
+ requestGeneration: -1,
57458
+ jobs: []
57459
+ });
57460
+ const jobs = snapshot.key === key && snapshot.generation === generation ? snapshot.jobs : [];
57461
+ const needsDiscovery = snapshot.key !== key || snapshot.generation !== generation || snapshot.requestGeneration !== requestGeneration;
57462
+ const needsPolling = needsDiscovery || jobs.some((job) => job.state === "pending" || job.state === "committing" || job.state === "uncertain" || job.result && items.some((item) => item.itemUid === job.itemUid));
57463
+ const refresh = (0, react.useCallback)(async (reconcile = false) => {
57464
+ if (!sourceRef || !accountKey || !active) return;
57465
+ const started = revision.current;
57466
+ if (reconcile) await callArkme("source.record-reedit.resume", {
57467
+ sourceRef,
57468
+ reconcile: true
57469
+ });
57470
+ const jobs = await callArkme("source.record-reedit.submissions", { sourceRef });
57471
+ if (scope.current.requestGeneration !== requestGeneration || scope.current.generation !== generation || scope.current.key !== key || started !== revision.current || !Array.isArray(jobs)) return;
57472
+ setSnapshot({
57473
+ key,
57474
+ generation,
57475
+ requestGeneration,
57476
+ jobs
57477
+ });
57478
+ }, [
57479
+ sourceRef,
57480
+ accountKey,
57481
+ active,
57482
+ key,
57483
+ generation,
57484
+ requestGeneration
57485
+ ]);
57486
+ (0, react.useEffect)(() => {
57487
+ let disposed = false;
57488
+ let timer;
57489
+ const poll = async () => {
57490
+ if (resumedGeneration.current !== requestGeneration) try {
57491
+ await callArkme("source.record-reedit.resume", { sourceRef });
57492
+ if (!disposed) resumedGeneration.current = requestGeneration;
57493
+ } catch {}
57494
+ if (disposed) return;
57495
+ try {
57496
+ await refresh();
57497
+ } catch {}
57498
+ if (!disposed) timer = setTimeout(() => {
57499
+ poll();
57500
+ }, 1500);
57501
+ };
57502
+ if (active && sourceRef && accountKey && needsPolling) if (needsDiscovery) poll();
57503
+ else timer = setTimeout(() => {
57504
+ poll();
57505
+ }, 1500);
57506
+ return () => {
57507
+ disposed = true;
57508
+ clearTimeout(timer);
57509
+ };
57510
+ }, [
57511
+ refresh,
57512
+ active,
57513
+ sourceRef,
57514
+ accountKey,
57515
+ needsPolling,
57516
+ needsDiscovery,
57517
+ requestGeneration
57518
+ ]);
57519
+ const accepted = (0, react.useCallback)((job) => {
57520
+ if (scope.current.key !== key || scope.current.generation !== generation) return;
57521
+ revision.current += 1;
57522
+ setSnapshot((previous) => ({
57523
+ ...previous,
57524
+ key,
57525
+ generation,
57526
+ jobs: [...(previous.key === key && previous.generation === generation ? previous.jobs : []).filter((value) => value.itemUid !== job.itemUid), job]
57527
+ }));
57528
+ }, [key, generation]);
57529
+ const projectionWindow = (0, react.useRef)({
57530
+ items,
57531
+ refreshCurrentWindow
57532
+ });
57533
+ projectionWindow.current = {
57534
+ items,
57535
+ refreshCurrentWindow
57536
+ };
57537
+ (0, react.useEffect)(() => {
57538
+ if (!active || !sourceRef || !accountKey || scope.current.key !== key || scope.current.generation !== generation) return;
57539
+ const current = projectionWindow.current;
57540
+ for (const job of jobs) if (job.result && current.items.some((item) => recordReeditProjectionSettled(item, job))) callArkme("source.record-reedit.acknowledge", {
57541
+ sourceRef,
57542
+ submissionId: job.submissionId,
57543
+ version: job.result.version
57544
+ }).catch(() => void 0);
57545
+ if (jobs.some((job) => job.result && current.items.some((item) => item.itemUid === job.itemUid && !recordReeditProjectionSettled(item, job)))) current.refreshCurrentWindow().catch(() => void 0);
57546
+ }, [
57547
+ jobs,
57548
+ sourceRef,
57549
+ accountKey,
57550
+ active,
57551
+ key,
57552
+ generation
57553
+ ]);
57554
+ return {
57555
+ jobs,
57556
+ accepted,
57557
+ refresh
57558
+ };
57559
+ }
57560
+ //#endregion
57561
+ //#region src/client/record-reedit-editors.ts
57562
+ const scopeKey = (scope) => JSON.stringify([scope.accountKey, scope.sourceKey]);
57563
+ const editorKey = (scope, itemUid) => JSON.stringify([scopeKey(scope), itemUid]);
57564
+ /** In-memory input owner; Host drafts and accepted submission receipts keep their existing owners. */
57565
+ function useRecordReeditEditors() {
57566
+ const [state, setState] = (0, react.useState)(() => ({
57567
+ candidates: /* @__PURE__ */ new Map(),
57568
+ selected: /* @__PURE__ */ new Map(),
57569
+ currentKey: void 0
57570
+ }));
57571
+ const stateRef = (0, react.useRef)(state);
57572
+ const composerRef = (0, react.useRef)();
57573
+ const publish = (0, react.useCallback)((next) => {
57574
+ stateRef.current = next;
57575
+ composerRef.current = next.currentKey === void 0 ? void 0 : next.candidates.get(next.currentKey);
57576
+ setState(next);
57577
+ }, []);
57578
+ const updateCandidate = (0, react.useCallback)((target, update) => {
57579
+ const previous = stateRef.current;
57580
+ const key = editorKey(target, target.item.itemUid);
57581
+ const current = previous.candidates.get(key);
57582
+ if (current === void 0 || current.persisted !== target.persisted) return;
57583
+ const value = update(current);
57584
+ if (value === current) return;
57585
+ const next = {
57586
+ ...previous,
57587
+ candidates: new Map(previous.candidates),
57588
+ selected: new Map(previous.selected)
57589
+ };
57590
+ if (value === void 0) {
57591
+ next.candidates.delete(key);
57592
+ if (next.selected.get(scopeKey(target)) === key) next.selected.delete(scopeKey(target));
57593
+ if (next.currentKey === key) next.currentKey = void 0;
57594
+ } else next.candidates.set(key, value);
57595
+ publish(next);
57596
+ }, [publish]);
57597
+ const setComposer = (0, react.useCallback)((update) => {
57598
+ const current = composerRef.current;
57599
+ const value = typeof update === "function" ? update(current) : update;
57600
+ if (value === current) return;
57601
+ if (value === void 0) {
57602
+ if (current !== void 0) updateCandidate(current, () => void 0);
57603
+ return;
57604
+ }
57605
+ const previous = stateRef.current;
57606
+ const key = editorKey(value, value.item.itemUid);
57607
+ publish({
57608
+ candidates: new Map(previous.candidates).set(key, value),
57609
+ selected: new Map(previous.selected).set(scopeKey(value), key),
57610
+ currentKey: key
57611
+ });
57612
+ }, [publish, updateCandidate]);
57613
+ const activateScope = (0, react.useCallback)((scope, generation) => {
57614
+ const previous = stateRef.current;
57615
+ const key = previous.selected.get(scopeKey(scope));
57616
+ const current = key === void 0 ? void 0 : previous.candidates.get(key);
57617
+ const candidates = new Map(previous.candidates);
57618
+ if (current !== void 0 && key !== void 0) candidates.set(key, {
57619
+ ...current,
57620
+ generation
57621
+ });
57622
+ publish({
57623
+ ...previous,
57624
+ candidates,
57625
+ currentKey: key
57626
+ });
57627
+ }, [publish]);
57628
+ const findCandidate = (0, react.useCallback)((scope, itemUid) => stateRef.current.candidates.get(editorKey(scope, itemUid)), []);
57629
+ return {
57630
+ composer: state.currentKey === void 0 ? void 0 : state.candidates.get(state.currentKey),
57631
+ composerRef,
57632
+ setComposer,
57633
+ updateCandidate,
57634
+ activateScope,
57635
+ findCandidate
57636
+ };
57637
+ }
57638
+ //#endregion
57639
+ //#region src/client/conversation-timeline-refresh.ts
57640
+ /** Refresh the loaded records, not the navigation window. Apply only after all reads succeed. */
57641
+ async function readConversationTimelineWindow(snapshot, readPage, signal) {
57642
+ const records = snapshot.items.filter((item) => item.status === 1 && item.awaitingTimelineProjection !== true);
57643
+ const aroundRange = snapshot.mode === "around" ? snapshot.aroundSequenceRange : void 0;
57644
+ const sequenced = aroundRange !== void 0 || records.length > 0 && records.every((item) => (item.sequence ?? 0) > 0);
57645
+ const oldest = records.reduce((previous, item) => previous === void 0 || (sequenced ? item.sequence < previous.sequence : item.sendAtMillis < previous.sendAtMillis || item.sendAtMillis === previous.sendAtMillis && item.itemUid < previous.itemUid) ? item : previous, void 0);
57646
+ const minimumSequence = aroundRange?.minimumSequence ?? oldest?.sequence ?? 0;
57647
+ const maximumSequence = aroundRange?.maximumSequence ?? Math.max(...records.map((item) => item.sequence ?? 0));
57648
+ let cursor = snapshot.mode === "around" && sequenced ? { beforeSequence: maximumSequence + 1 } : void 0;
57649
+ const ids = new Set(snapshot.items.map((item) => item.itemUid));
57650
+ const items = /* @__PURE__ */ new Map();
57651
+ const visited = /* @__PURE__ */ new Set();
57652
+ let first;
57653
+ for (;;) {
57654
+ signal.throwIfAborted();
57655
+ const key = JSON.stringify(cursor ?? null);
57656
+ if (visited.has(key)) throw new Error("消息列表刷新游标未推进");
57657
+ visited.add(key);
57658
+ const page = await readPage(cursor);
57659
+ signal.throwIfAborted();
57660
+ first ??= page;
57661
+ for (const item of page.items) {
57662
+ if (aroundRange !== void 0 && ((item.sequence ?? 0) < minimumSequence || (item.sequence ?? 0) > maximumSequence)) continue;
57663
+ if (ids.has(item.itemUid) || oldest === void 0 || (sequenced ? (item.sequence ?? 0) >= minimumSequence : item.sendAtMillis > oldest.sendAtMillis || item.sendAtMillis === oldest.sendAtMillis && item.itemUid >= oldest.itemUid)) items.set(item.itemUid, item);
57664
+ }
57665
+ if ((sequenced ? page.items.some((item) => item.sequence === minimumSequence) || (page.nextCursor?.beforeSequence ?? Infinity) <= minimumSequence : oldest === void 0 || page.items.some((item) => item.itemUid === oldest.itemUid) || (page.nextCursor?.sendAtMillis ?? Infinity) < oldest.sendAtMillis || page.nextCursor?.sendAtMillis === oldest.sendAtMillis && page.nextCursor.itemUid !== void 0 && page.nextCursor.itemUid <= oldest.itemUid) || !page.hasMore) return {
57666
+ ...first,
57667
+ items: [...items.values()]
57668
+ };
57669
+ if (page.nextCursor === void 0) throw new Error("消息列表刷新缺少分页游标");
57670
+ cursor = page.nextCursor;
57671
+ }
57672
+ }
57673
+ //#endregion
57674
+ //#region src/chat-attention.ts
57675
+ function integerLikeValue(value) {
57676
+ if (typeof value === "number" && Number.isFinite(value)) return Math.trunc(value);
57677
+ if (typeof value !== "string" || value.trim() === "") return void 0;
57678
+ const parsed = Number(value.trim());
57679
+ return Number.isFinite(parsed) ? Math.trunc(parsed) : void 0;
57680
+ }
57681
+ function arkmeChatPolicyNotificationDisabled(policy) {
57682
+ if (policy === null || typeof policy !== "object" || Array.isArray(policy)) return void 0;
57683
+ const value = policy;
57684
+ const muteState = integerLikeValue(value.mute_state ?? value.muteState);
57685
+ const notifyState = integerLikeValue(value.notify_state ?? value.notifyState);
57686
+ if (muteState === 2 || notifyState === 2) return true;
57687
+ if (muteState === 1 || notifyState === 1) return false;
57688
+ }
57689
+ function projectArkmeChatAttention(rawUnreadCount, policy, fallbackMuted = false) {
57690
+ const unreadCount = Math.max(0, integerLikeValue(rawUnreadCount) ?? 0);
57691
+ const isMuted = arkmeChatPolicyNotificationDisabled(policy) ?? fallbackMuted;
57692
+ const notificationAllowed = !isMuted;
57693
+ return {
57694
+ unreadCount,
57695
+ badgeUnreadCount: notificationAllowed ? unreadCount : 0,
57696
+ notificationAllowed,
57697
+ isMuted
57698
+ };
57699
+ }
57700
+ function projectArkmeChatAttentionFromMuted(rawUnreadCount, isMuted) {
57701
+ return projectArkmeChatAttention(rawUnreadCount, void 0, isMuted);
57702
+ }
57703
+ function arkmeBadgeUnreadCount(value) {
57704
+ if (value.notificationAllowed === false || value.isMuted === true) return 0;
57705
+ if (typeof value.badgeUnreadCount === "number" && Number.isFinite(value.badgeUnreadCount)) return Math.max(0, Math.trunc(value.badgeUnreadCount));
57706
+ return value.notificationAllowed ?? true ? Math.max(0, Math.trunc(value.unreadCount ?? 0)) : 0;
57707
+ }
57708
+ //#endregion
57104
57709
  //#region src/client/read-intent-visibility.ts
57105
57710
  function arkmeVisibleReadIntentAllowed(documentRef = typeof document === "undefined" ? void 0 : document) {
57106
57711
  if (documentRef === void 0) return true;
@@ -57119,7 +57724,7 @@ function(test) {
57119
57724
  }
57120
57725
  //#endregion
57121
57726
  //#region node_modules/@phosphor-icons/react/dist/defs/ArrowLeft.es.js
57122
- const a$14 = /* @__PURE__ */ new Map([
57727
+ const a$13 = /* @__PURE__ */ new Map([
57123
57728
  ["bold", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M228,128a12,12,0,0,1-12,12H69l51.52,51.51a12,12,0,0,1-17,17l-72-72a12,12,0,0,1,0-17l72-72a12,12,0,0,1,17,17L69,116H216A12,12,0,0,1,228,128Z" }))],
57124
57729
  ["duotone", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", {
57125
57730
  d: "M112,56V200L40,128Z",
@@ -57132,16 +57737,16 @@ function(test) {
57132
57737
  ]);
57133
57738
  //#endregion
57134
57739
  //#region node_modules/@phosphor-icons/react/dist/csr/ArrowLeft.es.js
57135
- const r$8 = react.forwardRef((e, t) => /* @__PURE__ */ react.createElement(p$2, {
57740
+ const r$7 = react.forwardRef((e, t) => /* @__PURE__ */ react.createElement(p$2, {
57136
57741
  ref: t,
57137
57742
  ...e,
57138
- weights: a$14
57743
+ weights: a$13
57139
57744
  }));
57140
- r$8.displayName = "ArrowLeftIcon";
57141
- const s$5 = r$8;
57745
+ r$7.displayName = "ArrowLeftIcon";
57746
+ const s$4 = r$7;
57142
57747
  //#endregion
57143
57748
  //#region node_modules/@phosphor-icons/react/dist/defs/ArrowUp.es.js
57144
- const a$13 = /* @__PURE__ */ new Map([
57749
+ const a$12 = /* @__PURE__ */ new Map([
57145
57750
  ["bold", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M208.49,120.49a12,12,0,0,1-17,0L140,69V216a12,12,0,0,1-24,0V69L64.49,120.49a12,12,0,0,1-17-17l72-72a12,12,0,0,1,17,0l72,72A12,12,0,0,1,208.49,120.49Z" }))],
57146
57751
  ["duotone", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", {
57147
57752
  d: "M200,112H56l72-72Z",
@@ -57154,16 +57759,16 @@ function(test) {
57154
57759
  ]);
57155
57760
  //#endregion
57156
57761
  //#region node_modules/@phosphor-icons/react/dist/csr/ArrowUp.es.js
57157
- const r$7 = react.forwardRef((e, t) => /* @__PURE__ */ react.createElement(p$2, {
57762
+ const r$6 = react.forwardRef((e, t) => /* @__PURE__ */ react.createElement(p$2, {
57158
57763
  ref: t,
57159
57764
  ...e,
57160
- weights: a$13
57765
+ weights: a$12
57161
57766
  }));
57162
- r$7.displayName = "ArrowUpIcon";
57163
- const s$4 = r$7;
57767
+ r$6.displayName = "ArrowUpIcon";
57768
+ const s$3 = r$6;
57164
57769
  //#endregion
57165
57770
  //#region node_modules/@phosphor-icons/react/dist/defs/Plus.es.js
57166
- const a$12 = /* @__PURE__ */ new Map([
57771
+ const a$11 = /* @__PURE__ */ new Map([
57167
57772
  ["bold", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M228,128a12,12,0,0,1-12,12H140v76a12,12,0,0,1-24,0V140H40a12,12,0,0,1,0-24h76V40a12,12,0,0,1,24,0v76h76A12,12,0,0,1,228,128Z" }))],
57168
57773
  ["duotone", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", {
57169
57774
  d: "M216,56V200a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V56A16,16,0,0,1,56,40H200A16,16,0,0,1,216,56Z",
@@ -57179,32 +57784,10 @@ function(test) {
57179
57784
  const e$31 = react.forwardRef((r, s) => /* @__PURE__ */ react.createElement(p$2, {
57180
57785
  ref: s,
57181
57786
  ...r,
57182
- weights: a$12
57787
+ weights: a$11
57183
57788
  }));
57184
57789
  e$31.displayName = "PlusIcon";
57185
- const n$3 = e$31;
57186
- //#endregion
57187
- //#region node_modules/@phosphor-icons/react/dist/defs/Prohibit.es.js
57188
- const t$5 = /* @__PURE__ */ new Map([
57189
- ["bold", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M128,20A108,108,0,1,0,236,128,108.12,108.12,0,0,0,128,20Zm84,108a83.6,83.6,0,0,1-16.75,50.28L77.72,60.75A84,84,0,0,1,212,128ZM44,128A83.6,83.6,0,0,1,60.75,77.72L178.28,195.25A84,84,0,0,1,44,128Z" }))],
57190
- ["duotone", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", {
57191
- d: "M224,128a96,96,0,1,1-96-96A96,96,0,0,1,224,128Z",
57192
- opacity: "0.2"
57193
- }), /* @__PURE__ */ react.createElement("path", { d: "M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm88,104a87.56,87.56,0,0,1-20.41,56.28L71.72,60.4A88,88,0,0,1,216,128ZM40,128A87.56,87.56,0,0,1,60.41,71.72L184.28,195.6A88,88,0,0,1,40,128Z" }))],
57194
- ["fill", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M200,128a71.69,71.69,0,0,1-15.78,44.91L83.09,71.78A71.95,71.95,0,0,1,200,128ZM56,128a71.95,71.95,0,0,0,116.91,56.22L71.78,83.09A71.69,71.69,0,0,0,56,128Zm180,0A108,108,0,1,1,128,20,108.12,108.12,0,0,1,236,128Zm-20,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128Z" }))],
57195
- ["light", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M128,26A102,102,0,1,0,230,128,102.12,102.12,0,0,0,128,26Zm90,102a89.6,89.6,0,0,1-22.29,59.22L68.78,60.29A89.95,89.95,0,0,1,218,128ZM38,128A89.6,89.6,0,0,1,60.29,68.78L187.22,195.71A89.95,89.95,0,0,1,38,128Z" }))],
57196
- ["regular", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm88,104a87.56,87.56,0,0,1-20.41,56.28L71.72,60.4A88,88,0,0,1,216,128ZM40,128A87.56,87.56,0,0,1,60.41,71.72L184.28,195.6A88,88,0,0,1,40,128Z" }))],
57197
- ["thin", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M128,28A100,100,0,1,0,228,128,100.11,100.11,0,0,0,128,28Zm92,100a91.67,91.67,0,0,1-24.21,62.13L65.87,60.21A92,92,0,0,1,220,128ZM36,128A91.67,91.67,0,0,1,60.21,65.87L190.13,195.79A92,92,0,0,1,36,128Z" }))]
57198
- ]);
57199
- //#endregion
57200
- //#region node_modules/@phosphor-icons/react/dist/csr/Prohibit.es.js
57201
- const r$6 = react.forwardRef((t, i) => /* @__PURE__ */ react.createElement(p$2, {
57202
- ref: i,
57203
- ...t,
57204
- weights: t$5
57205
- }));
57206
- r$6.displayName = "ProhibitIcon";
57207
- const s$3 = r$6;
57790
+ const n$2 = e$31;
57208
57791
  //#endregion
57209
57792
  //#region node_modules/@phosphor-icons/react/dist/defs/Sparkle.es.js
57210
57793
  const l$1 = /* @__PURE__ */ new Map([
@@ -57220,13 +57803,13 @@ function(test) {
57220
57803
  ]);
57221
57804
  //#endregion
57222
57805
  //#region node_modules/@phosphor-icons/react/dist/csr/Sparkle.es.js
57223
- const o$7 = react.forwardRef((r, a) => /* @__PURE__ */ react.createElement(p$2, {
57806
+ const o$6 = react.forwardRef((r, a) => /* @__PURE__ */ react.createElement(p$2, {
57224
57807
  ref: a,
57225
57808
  ...r,
57226
57809
  weights: l$1
57227
57810
  }));
57228
- o$7.displayName = "SparkleIcon";
57229
- const s$2 = o$7;
57811
+ o$6.displayName = "SparkleIcon";
57812
+ const s$2 = o$6;
57230
57813
  //#endregion
57231
57814
  //#region src/client/arkme-assets.ts
57232
57815
  /** Transparent Arkme application mark used by public DSH brand slots. */
@@ -59633,7 +60216,7 @@ function(test) {
59633
60216
  setView("rules");
59634
60217
  setError("");
59635
60218
  },
59636
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$5, { size: 18 })
60219
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$4, { size: 18 })
59637
60220
  }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {}),
59638
60221
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
59639
60222
  style: styles$48.aiHeaderTitle,
@@ -59746,7 +60329,7 @@ function(test) {
59746
60329
  openEditor();
59747
60330
  },
59748
60331
  children: [
59749
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$3, { size: 16 }),
60332
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$2, { size: 16 }),
59750
60333
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
59751
60334
  style: styles$48.aiRuleName,
59752
60335
  children: "新建规则"
@@ -59846,7 +60429,7 @@ function(test) {
59846
60429
  onClick: () => {
59847
60430
  generateRule();
59848
60431
  },
59849
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$4, {
60432
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$3, {
59850
60433
  size: 16,
59851
60434
  weight: "bold"
59852
60435
  })
@@ -60022,7 +60605,7 @@ function(test) {
60022
60605
  display: "grid",
60023
60606
  placeItems: "center"
60024
60607
  },
60025
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$3, { size: 18 })
60608
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$5, { size: 18 })
60026
60609
  }),
60027
60610
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "禁止加入名单" }),
60028
60611
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
@@ -65285,29 +65868,7 @@ function(test) {
65285
65868
  weights: e$29
65286
65869
  }));
65287
65870
  e$28.displayName = "ClockCounterClockwiseIcon";
65288
- const a$11 = e$28;
65289
- //#endregion
65290
- //#region node_modules/@phosphor-icons/react/dist/defs/Check.es.js
65291
- const a$10 = /* @__PURE__ */ new Map([
65292
- ["bold", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z" }))],
65293
- ["duotone", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", {
65294
- d: "M232,56V200a16,16,0,0,1-16,16H40a16,16,0,0,1-16-16V56A16,16,0,0,1,40,40H216A16,16,0,0,1,232,56Z",
65295
- opacity: "0.2"
65296
- }), /* @__PURE__ */ react.createElement("path", { d: "M205.66,85.66l-96,96a8,8,0,0,1-11.32,0l-40-40a8,8,0,0,1,11.32-11.32L104,164.69l90.34-90.35a8,8,0,0,1,11.32,11.32Z" }))],
65297
- ["fill", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM205.66,85.66l-96,96a8,8,0,0,1-11.32,0l-40-40a8,8,0,0,1,11.32-11.32L104,164.69l90.34-90.35a8,8,0,0,1,11.32,11.32Z" }))],
65298
- ["light", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M228.24,76.24l-128,128a6,6,0,0,1-8.48,0l-56-56a6,6,0,0,1,8.48-8.48L96,191.51,219.76,67.76a6,6,0,0,1,8.48,8.48Z" }))],
65299
- ["regular", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M229.66,77.66l-128,128a8,8,0,0,1-11.32,0l-56-56a8,8,0,0,1,11.32-11.32L96,188.69,218.34,66.34a8,8,0,0,1,11.32,11.32Z" }))],
65300
- ["thin", /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("path", { d: "M226.83,74.83l-128,128a4,4,0,0,1-5.66,0l-56-56a4,4,0,0,1,5.66-5.66L96,194.34,221.17,69.17a4,4,0,1,1,5.66,5.66Z" }))]
65301
- ]);
65302
- //#endregion
65303
- //#region node_modules/@phosphor-icons/react/dist/csr/Check.es.js
65304
- const o$6 = react.forwardRef((c, r) => /* @__PURE__ */ react.createElement(p$2, {
65305
- ref: r,
65306
- ...c,
65307
- weights: a$10
65308
- }));
65309
- o$6.displayName = "CheckIcon";
65310
- const n$2 = o$6;
65871
+ const a$10 = e$28;
65311
65872
  //#endregion
65312
65873
  //#region node_modules/@phosphor-icons/react/dist/defs/ArrowCounterClockwise.es.js
65313
65874
  const e$27 = /* @__PURE__ */ new Map([
@@ -68323,7 +68884,7 @@ function(test) {
68323
68884
  style: styles$42.optionLabel,
68324
68885
  children: [option.label, option.isCurrentUser ? "(我)" : ""]
68325
68886
  }),
68326
- selected && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$2, {
68887
+ selected && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$6, {
68327
68888
  size: 14,
68328
68889
  "aria-label": "已选择"
68329
68890
  })
@@ -68499,7 +69060,7 @@ function(test) {
68499
69060
  mutate();
68500
69061
  },
68501
69062
  children: [
68502
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$3, { size: 15 }),
69063
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$2, { size: 15 }),
68503
69064
  "添加“",
68504
69065
  newSpeakerName,
68505
69066
  "”为说话人"
@@ -69566,11 +70127,11 @@ function(test) {
69566
70127
  onClick: onTogglePlayback,
69567
70128
  "aria-label": playbackLoading ? "取消录音加载" : isPlaying ? "暂停录音" : "播放录音",
69568
70129
  title: playbackLoading ? "加载中,点击取消" : isPlaying ? "暂停" : "播放",
69569
- children: isPlaying || playbackLoading ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$4, {
70130
+ children: isPlaying || playbackLoading ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$3, {
69570
70131
  size: 10,
69571
70132
  weight: "fill",
69572
70133
  "aria-hidden": true
69573
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$5, {
70134
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$4, {
69574
70135
  size: 10,
69575
70136
  weight: "fill",
69576
70137
  "aria-hidden": true
@@ -99210,7 +99771,7 @@ function(test) {
99210
99771
  placeItems: "center",
99211
99772
  background: "transparent"
99212
99773
  },
99213
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$4, { size: 18 })
99774
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$3, { size: 18 })
99214
99775
  }),
99215
99776
  source === "doubao" && pending && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", {
99216
99777
  role: "status",
@@ -100021,7 +100582,7 @@ function(test) {
100021
100582
  cursor: "inherit",
100022
100583
  opacity: disabled && !sent ? .4 : 1
100023
100584
  }
100024
- }), checked && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$2, {
100585
+ }), checked && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$6, {
100025
100586
  "aria-hidden": true,
100026
100587
  size: 14,
100027
100588
  weight: "bold",
@@ -101625,7 +102186,7 @@ function(test) {
101625
102186
  }),
101626
102187
  variant === "model" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
101627
102188
  style: styles$40.analysisDropdownCheck,
101628
- children: isSelected && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$2, {
102189
+ children: isSelected && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$6, {
101629
102190
  size: 18,
101630
102191
  "aria-hidden": true
101631
102192
  })
@@ -102436,7 +102997,7 @@ function(test) {
102436
102997
  setVisibleMonth(monthStart(today));
102437
102998
  setSelectedDate(today);
102438
102999
  },
102439
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(a$11, { size: 18 }), "回到今日"]
103000
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(a$10, { size: 18 }), "回到今日"]
102440
103001
  })]
102441
103002
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
102442
103003
  style: styles$40.calendarGrid,
@@ -104780,7 +105341,7 @@ function(test) {
104780
105341
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
104781
105342
  style: styles$39.videoPlay,
104782
105343
  "aria-hidden": "true",
104783
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$5, {
105344
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$4, {
104784
105345
  size: 25,
104785
105346
  weight: "fill"
104786
105347
  })
@@ -104800,7 +105361,7 @@ function(test) {
104800
105361
  onClick: () => {
104801
105362
  startVideoPlayback(realMain);
104802
105363
  },
104803
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$5, {
105364
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$4, {
104804
105365
  size: 25,
104805
105366
  weight: "fill"
104806
105367
  })
@@ -104847,10 +105408,10 @@ function(test) {
104847
105408
  style: styles$39.videoControlButton,
104848
105409
  "aria-label": videoPlaying ? "暂停视频记录" : "继续播放视频记录",
104849
105410
  onClick: toggleVideoPlayback,
104850
- children: videoPlaying ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$4, {
105411
+ children: videoPlaying ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$3, {
104851
105412
  size: 15,
104852
105413
  weight: "fill"
104853
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$5, {
105414
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$4, {
104854
105415
  size: 15,
104855
105416
  weight: "fill"
104856
105417
  })
@@ -105003,7 +105564,7 @@ function(test) {
105003
105564
  onClick: () => {
105004
105565
  openPicker();
105005
105566
  },
105006
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$3, { size: 16 }), "发起通话"]
105567
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$2, { size: 16 }), "发起通话"]
105007
105568
  })
105008
105569
  ]
105009
105570
  })
@@ -108670,7 +109231,7 @@ function(test) {
108670
109231
  style: styles$38.backButton,
108671
109232
  "aria-label": "返回世界",
108672
109233
  onClick: onBackToWorld,
108673
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$5, {
109234
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$4, {
108674
109235
  size: 18,
108675
109236
  weight: "bold"
108676
109237
  })
@@ -108713,7 +109274,7 @@ function(test) {
108713
109274
  },
108714
109275
  "aria-label": "发世界",
108715
109276
  onClick: onOpenComposer,
108716
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$3, {
109277
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$2, {
108717
109278
  size: 14,
108718
109279
  weight: "regular",
108719
109280
  "aria-hidden": true
@@ -109072,7 +109633,7 @@ function(test) {
109072
109633
  children: [
109073
109634
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
109074
109635
  style: styles$38.publishUploadIcon,
109075
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$3, {
109636
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$2, {
109076
109637
  size: 18,
109077
109638
  weight: "regular",
109078
109639
  "aria-hidden": true
@@ -109116,7 +109677,7 @@ function(test) {
109116
109677
  onClick: () => {
109117
109678
  fileInputRef.current?.click();
109118
109679
  },
109119
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$3, {
109680
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$2, {
109120
109681
  size: 19,
109121
109682
  weight: "regular",
109122
109683
  "aria-hidden": true
@@ -109996,7 +110557,7 @@ function(test) {
109996
110557
  })
109997
110558
  });
109998
110559
  }
109999
- function ArkmeAttachmentStrip({ attachments, disabled, onMove, onRemove, onPreview }) {
110560
+ function ArkmeAttachmentStrip({ attachments, disabled, onMove, onRemove, onPreview, canPreview }) {
110000
110561
  const dragging = (0, react.useRef)();
110001
110562
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
110002
110563
  role: "list",
@@ -110061,7 +110622,7 @@ function(test) {
110061
110622
  asset: metadata,
110062
110623
  disabled,
110063
110624
  ...previewUrl === void 0 ? {} : { previewUrl },
110064
- ...attachment.localFile === void 0 ? {} : { onOpen: () => onPreview(attachment) },
110625
+ ...canPreview?.(attachment) ?? attachment.localFile !== void 0 ? { onOpen: () => onPreview(attachment) } : {},
110065
110626
  onRemove: () => {
110066
110627
  if (!disabled) onRemove(attachment);
110067
110628
  }
@@ -140140,7 +140701,10 @@ Please report this to https://github.com/markedjs/marked.`, e) {
140140
140701
  if (!editor) return void 0;
140141
140702
  const rect = editor.view.coordsAtPos(editor.state.selection.head);
140142
140703
  return {
140143
- ...rect,
140704
+ left: rect.left,
140705
+ right: rect.right,
140706
+ top: rect.top,
140707
+ bottom: rect.bottom,
140144
140708
  width: rect.right - rect.left,
140145
140709
  height: rect.bottom - rect.top
140146
140710
  };
@@ -167436,10 +168000,22 @@ Please report this to https://github.com/markedjs/marked.`, e) {
167436
168000
  });
167437
168001
  }
167438
168002
  //#endregion
168003
+ //#region src/chat-pin-projection.ts
168004
+ /** Policy freshness is independent of message sequence and event delivery order. */
168005
+ function retainNewerArkmeChatPin(current, incoming) {
168006
+ if (incoming.kind !== "private_chat" && incoming.kind !== "group_chat" || current?.kind !== incoming.kind || current.isPinned === void 0 || current.chatPolicyUpdatedAtMillis === void 0 || current.chatPolicyUpdatedAtMillis <= (incoming.chatPolicyUpdatedAtMillis ?? 0)) return incoming;
168007
+ return {
168008
+ ...incoming,
168009
+ isPinned: current.isPinned,
168010
+ chatPolicyUpdatedAtMillis: current.chatPolicyUpdatedAtMillis
168011
+ };
168012
+ }
168013
+ //#endregion
167439
168014
  //#region src/client/chat-directory-store.ts
167440
168015
  const DEFAULT_ROOT_CACHE_MAX_AGE_MS = 3e4;
167441
168016
  const ROOT_DIRECTORY_PAGE_LIMIT = 20;
167442
168017
  const MAX_ROOT_PAGES = 10;
168018
+ const ROOT_READ_RETRY_DELAYS_MS = [2e3, 4e3];
167443
168019
  function clientAccountScopeKey(scope) {
167444
168020
  if (typeof scope === "number") return Number.isSafeInteger(scope) && scope > 0 ? String(scope) : void 0;
167445
168021
  const normalized = scope?.trim();
@@ -167525,7 +168101,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
167525
168101
  const existingSequence = normalizedSequence(existing?.latestSequence);
167526
168102
  const sourceSequence = normalizedSequence(source.latestSequence);
167527
168103
  const sourceWithAvatarPresentation = retainRealtimeAvatarPresentation(existing, source);
167528
- return applyReadWatermark(projectSourceAttention(existing !== void 0 && sourceSequence < existingSequence ? (() => {
168104
+ return applyReadWatermark(projectSourceAttention(retainNewerArkmeChatPin(existing, existing !== void 0 && sourceSequence < existingSequence ? (() => {
167529
168105
  const latestPreview = existing.latestPreview ?? sourceWithAvatarPresentation.latestPreview;
167530
168106
  return {
167531
168107
  ...sourceWithAvatarPresentation,
@@ -167542,7 +168118,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
167542
168118
  activeAtMillis: Math.max(existing?.activeAtMillis ?? 0, source.activeAtMillis),
167543
168119
  ...hasUnreadMention === void 0 ? {} : { hasUnreadMention }
167544
168120
  };
167545
- })() }), watermarks, indexes, sourceKey);
168121
+ })() })), watermarks, indexes, sourceKey);
167546
168122
  }
167547
168123
  function sourceUpdate(update) {
167548
168124
  if ("source" in update) return update;
@@ -167555,6 +168131,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
167555
168131
  return normalizedSourceKey(source.sourceKey) ?? source.sourceRef;
167556
168132
  }
167557
168133
  const DIRECTORY_SOURCE_SCALAR_FIELDS = {
168134
+ directMessageAdmissionApplicable: true,
167558
168135
  sourceRef: true,
167559
168136
  sourceKey: true,
167560
168137
  peerUserId: true,
@@ -167574,6 +168151,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
167574
168151
  hasUnreadMention: true,
167575
168152
  isMuted: true,
167576
168153
  isPinned: true,
168154
+ chatPolicyUpdatedAtMillis: true,
167577
168155
  latestSequence: true,
167578
168156
  recordCount: true
167579
168157
  };
@@ -167600,7 +168178,8 @@ Please report this to https://github.com/markedjs/marked.`, e) {
167600
168178
  const currentByIdentity = new Map(current.map((source) => [directorySourceIdentity(source), source]));
167601
168179
  const reconciled = incoming.map((source) => {
167602
168180
  const previous = currentByIdentity.get(directorySourceIdentity(source));
167603
- return previous !== void 0 && sameDirectorySourcePresentation(previous, source) ? previous : source;
168181
+ const projected = retainNewerArkmeChatPin(previous, source);
168182
+ return previous !== void 0 && sameDirectorySourcePresentation(previous, projected) ? previous : projected;
167604
168183
  });
167605
168184
  return reconciled.length === current.length && reconciled.every((source, index) => source === current[index]) ? current : reconciled;
167606
168185
  }
@@ -167699,13 +168278,8 @@ Please report this to https://github.com/markedjs/marked.`, e) {
167699
168278
  async refreshRoot(options = {}) {
167700
168279
  if (options.force !== true && this.refreshedAtMillis > 0 && this.now() - this.refreshedAtMillis < this.maxAgeMs) return [...this.snapshot.sources];
167701
168280
  if (this.refreshInFlight !== void 0) {
167702
- if (options.silent === true) return await this.refreshInFlight;
167703
- this.setRefreshing(true);
167704
- try {
167705
- return await this.refreshInFlight;
167706
- } finally {
167707
- this.setRefreshing(false);
167708
- }
168281
+ if (options.silent !== true) this.setRefreshing(true);
168282
+ return await this.refreshInFlight;
167709
168283
  }
167710
168284
  if (options.silent !== true) this.setRefreshing(true);
167711
168285
  const generation = this.generation;
@@ -167714,7 +168288,9 @@ Please report this to https://github.com/markedjs/marked.`, e) {
167714
168288
  const seen = /* @__PURE__ */ new Set();
167715
168289
  let cursor;
167716
168290
  for (let pageIndex = 0; pageIndex < MAX_ROOT_PAGES; pageIndex += 1) {
167717
- const page = await this.loadPage(cursor, options.force === true);
168291
+ const page = await this.loadRootPage(cursor, options.force === true, generation);
168292
+ if (generation !== this.generation) return [...this.snapshot.sources];
168293
+ if (page === void 0) return [...this.snapshot.sources];
167718
168294
  for (const source of page.items) {
167719
168295
  const identity = arkmeSourceIdentityKey(source);
167720
168296
  if (seen.has(identity)) continue;
@@ -167724,7 +168300,6 @@ Please report this to https://github.com/markedjs/marked.`, e) {
167724
168300
  if (!page.hasMore || page.nextCursor === void 0) break;
167725
168301
  cursor = page.nextCursor;
167726
168302
  }
167727
- if (generation !== this.generation) return [...this.snapshot.sources];
167728
168303
  this.refreshedAtMillis = this.now();
167729
168304
  this.publish(loaded);
167730
168305
  return [...this.snapshot.sources];
@@ -167735,10 +168310,69 @@ Please report this to https://github.com/markedjs/marked.`, e) {
167735
168310
  } finally {
167736
168311
  if (this.refreshInFlight === pending) {
167737
168312
  this.refreshInFlight = void 0;
167738
- if (options.silent !== true) this.setRefreshing(false);
168313
+ this.setRefreshing(false);
167739
168314
  }
167740
168315
  }
167741
168316
  }
168317
+ async loadRootPage(cursor, force, generation) {
168318
+ for (let attempt = 0;; attempt += 1) {
168319
+ if (generation !== this.generation) return void 0;
168320
+ try {
168321
+ return await this.loadPage(cursor, force);
168322
+ } catch (error) {
168323
+ if (generation !== this.generation) return void 0;
168324
+ const delay = ROOT_READ_RETRY_DELAYS_MS[attempt];
168325
+ if (!(error instanceof ArkmeClientError) || !error.body.retryable || delay === void 0) throw error;
168326
+ await new Promise((resolve) => {
168327
+ setTimeout(resolve, delay);
168328
+ });
168329
+ }
168330
+ }
168331
+ }
168332
+ /** Retain visible rows while preventing older reads from satisfying a new owner invalidation. */
168333
+ invalidateRoot() {
168334
+ this.generation += 1;
168335
+ this.refreshInFlight = void 0;
168336
+ this.refreshedAtMillis = 0;
168337
+ this.setRefreshing(false);
168338
+ }
168339
+ /** A reconnect pin projection is not a directory membership or message snapshot. */
168340
+ reconcilePins(pins) {
168341
+ const byKey = /* @__PURE__ */ new Map();
168342
+ for (const pin of pins) {
168343
+ const previous = byKey.get(pin.sourceKey);
168344
+ if (previous === void 0 || previous.policyUpdatedAtMillis < pin.policyUpdatedAtMillis) byKey.set(pin.sourceKey, pin);
168345
+ }
168346
+ let changed = false;
168347
+ const sources = this.snapshot.sources.map((source) => {
168348
+ if (source.kind !== "private_chat" && source.kind !== "group_chat" || source.sourceKey === void 0) return source;
168349
+ const pin = byKey.get(source.sourceKey);
168350
+ if (pin === void 0) return source;
168351
+ const projected = retainNewerArkmeChatPin(source, {
168352
+ ...source,
168353
+ isPinned: pin.pinned,
168354
+ chatPolicyUpdatedAtMillis: pin.policyUpdatedAtMillis
168355
+ });
168356
+ if (source.isPinned === projected.isPinned && source.chatPolicyUpdatedAtMillis === projected.chatPolicyUpdatedAtMillis) return source;
168357
+ changed = true;
168358
+ return projected;
168359
+ });
168360
+ if (changed) this.commit(sources);
168361
+ }
168362
+ confirmPin(source, pinned, policyUpdatedAtMillis) {
168363
+ if (source.kind !== "private_chat" && source.kind !== "group_chat") return;
168364
+ const targetKey = arkmeSourceIdentityKey(source);
168365
+ const current = this.snapshot.sources.find((item) => arkmeSourceIdentityKey(item) === targetKey);
168366
+ if (current === void 0) return;
168367
+ const updated = retainNewerArkmeChatPin(current, {
168368
+ ...current,
168369
+ isPinned: pinned,
168370
+ chatPolicyUpdatedAtMillis: policyUpdatedAtMillis
168371
+ });
168372
+ if (updated.chatPolicyUpdatedAtMillis !== policyUpdatedAtMillis) return;
168373
+ this.refreshedAtMillis = 0;
168374
+ this.commit(this.snapshot.sources.map((item) => arkmeSourceIdentityKey(item) === targetKey ? updated : item));
168375
+ }
167742
168376
  publish(sources) {
167743
168377
  const merged = applyDirectoryMutations(sources, this.pendingMutations, this.combinedReadWatermarks(), { sourceKeysByRef: this.sourceKeysByRef });
167744
168378
  const reconciled = reconcileDirectorySources(this.snapshot.sources, merged);
@@ -169872,9 +170506,9 @@ Please report this to https://github.com/markedjs/marked.`, e) {
169872
170506
  const [topicCreateSubmitting, setTopicCreateSubmitting] = (0, react.useState)(false);
169873
170507
  const [pendingRevealSourceRef, setPendingRevealSourceRef] = (0, react.useState)();
169874
170508
  const [createdHighlight, setCreatedHighlight] = (0, react.useState)();
169875
- const [directoryContextMenu, setDirectoryContextMenu] = (0, react.useState)();
169876
- const [directoryMutationSourceRef, setDirectoryMutationSourceRef] = (0, react.useState)();
169877
- const [directoryMutationBotRef, setDirectoryMutationBotRef] = (0, react.useState)();
170509
+ const [directoryContextTarget, setDirectoryContextMenu] = (0, react.useState)();
170510
+ const directoryMutationAbortRef = (0, react.useRef)();
170511
+ const [directoryMutation, setDirectoryMutation] = (0, react.useState)();
169878
170512
  const [directoryActionFeedback, setDirectoryActionFeedback] = (0, react.useState)();
169879
170513
  const [officialAuthorOpening, setOfficialAuthorOpening] = (0, react.useState)(false);
169880
170514
  const [officialAuthorProfile, setOfficialAuthorProfile] = (0, react.useState)();
@@ -169945,6 +170579,18 @@ Please report this to https://github.com/markedjs/marked.`, e) {
169945
170579
  conversationVisibility,
169946
170580
  conversationVisibilityHydrated
169947
170581
  ]);
170582
+ const directoryContextMenu = (0, react.useMemo)(() => {
170583
+ if (directoryContextTarget === void 0) return void 0;
170584
+ const row = rootConversationRows.find((row) => row.kind === directoryContextTarget.kind && (row.kind === "source" ? arkmeSourceIdentityKey(row.source) : conversationBotVisibilityKey(row.bot)) === directoryContextTarget.key);
170585
+ return row === void 0 ? void 0 : {
170586
+ ...row,
170587
+ x: directoryContextTarget.x,
170588
+ y: directoryContextTarget.y
170589
+ };
170590
+ }, [directoryContextTarget, rootConversationRows]);
170591
+ (0, react.useEffect)(() => {
170592
+ if (directoryContextTarget !== void 0 && directoryContextMenu === void 0) setDirectoryContextMenu(void 0);
170593
+ }, [directoryContextMenu, directoryContextTarget]);
169948
170594
  const sendToSelfPresentation = arkmeSendToSelfDirectoryPresentation(sendToSelfSource);
169949
170595
  const stopCreatedHighlightAnimation = (0, react.useCallback)(() => {
169950
170596
  createdHighlightTimeoutsRef.current.forEach((timer) => {
@@ -170016,8 +170662,8 @@ Please report this to https://github.com/markedjs/marked.`, e) {
170016
170662
  cacheRef.current = next;
170017
170663
  writeNavigationCache(next);
170018
170664
  }, []);
170019
- const reconcileAuth = (0, react.useCallback)((snapshot) => {
170020
- if (snapshot?.status !== "authenticated" || snapshot.userId === void 0) {
170665
+ const reconcileAuth = (0, react.useCallback)((status, environment, userId) => {
170666
+ if (status !== "authenticated" || userId === void 0) {
170021
170667
  authenticatedUserIdRef.current = void 0;
170022
170668
  cacheRef.current = void 0;
170023
170669
  clearLastNavigationCache();
@@ -170026,11 +170672,11 @@ Please report this to https://github.com/markedjs/marked.`, e) {
170026
170672
  setSources([]);
170027
170673
  return;
170028
170674
  }
170029
- arkmeChatDirectory.activateAccount(`${snapshot.environment}:${String(snapshot.userId)}`);
170030
- authenticatedUserIdRef.current = snapshot.userId;
170031
- const cached = readNavigationCache(snapshot.userId) ?? {
170675
+ arkmeChatDirectory.activateAccount(`${environment}:${String(userId)}`);
170676
+ authenticatedUserIdRef.current = userId;
170677
+ const cached = readNavigationCache(userId) ?? {
170032
170678
  version: 1,
170033
- userId: snapshot.userId,
170679
+ userId,
170034
170680
  directory: "root",
170035
170681
  sources: {},
170036
170682
  updatedAtMillis: 0
@@ -170088,18 +170734,35 @@ Please report this to https://github.com/markedjs/marked.`, e) {
170088
170734
  if (directoryRequestAbortRef.current === controller) directoryRequestAbortRef.current = void 0;
170089
170735
  }
170090
170736
  }, [persistCache]);
170737
+ const authStatus = auth?.status;
170738
+ const authEnvironment = auth?.environment;
170739
+ const authUserId = auth?.userId;
170091
170740
  (0, react.useEffect)(() => {
170092
- reconcileAuth(auth);
170093
- }, [auth, reconcileAuth]);
170741
+ reconcileAuth(authStatus, authEnvironment, authUserId);
170742
+ }, [
170743
+ authStatus,
170744
+ authEnvironment,
170745
+ authUserId,
170746
+ reconcileAuth
170747
+ ]);
170094
170748
  (0, react.useEffect)(() => {
170095
170749
  conversationVisibilityEpochRef.current += 1;
170096
170750
  conversationVisibilityFeedbackRef.current = emptyConversationVisibilityOverlay();
170097
170751
  setConversationVisibility(emptyConversationVisibilityOverlay());
170098
170752
  setConversationVisibilityHydrated(emptyConversationVisibilityHydration());
170099
- setDirectoryMutationSourceRef(void 0);
170100
- setDirectoryMutationBotRef(void 0);
170753
+ const controller = new AbortController();
170754
+ directoryMutationAbortRef.current = controller;
170755
+ setDirectoryMutation(void 0);
170756
+ setDirectoryContextMenu(void 0);
170101
170757
  setDirectoryActionFeedback(void 0);
170102
- }, [auth?.userId]);
170758
+ return () => {
170759
+ controller.abort();
170760
+ };
170761
+ }, [
170762
+ authenticated,
170763
+ auth?.environment,
170764
+ auth?.userId
170765
+ ]);
170103
170766
  (0, react.useEffect)(() => {
170104
170767
  setBotDirectoryPreferences(readBotDirectoryPreferences(authenticated ? auth?.userId : void 0));
170105
170768
  if (!authenticated) {
@@ -170159,6 +170822,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
170159
170822
  };
170160
170823
  }, [
170161
170824
  authenticated,
170825
+ auth?.environment,
170162
170826
  auth?.userId,
170163
170827
  bots,
170164
170828
  chatRevision,
@@ -170500,59 +171164,48 @@ Please report this to https://github.com/markedjs/marked.`, e) {
170500
171164
  });
170501
171165
  onActivateSurface?.();
170502
171166
  };
170503
- const updateRootSources = (nextSources) => {
170504
- setSources(nextSources);
170505
- arkmeChatDirectory.publish(nextSources);
170506
- persistCache({
170507
- directory: "root",
170508
- sources: { root: nextSources }
170509
- });
170510
- };
170511
171167
  const updateConversationDirectoryPin = async (target, pinned) => {
170512
- if (directoryMutationSourceRef !== void 0 || directoryMutationBotRef !== void 0) return;
170513
- const mutationUserId = authenticatedUserIdRef.current;
170514
- if (mutationUserId === void 0) return;
170515
- const previousSources = sources;
171168
+ if (directoryMutation !== void 0) return;
171169
+ const controller = directoryMutationAbortRef.current;
171170
+ if (authenticatedUserIdRef.current === void 0 || controller === void 0 || controller.signal.aborted) return;
170516
171171
  const previousBotPreferences = botDirectoryPreferences;
170517
- const nextSources = target.kind === "source" ? sources.map((item) => item.sourceRef === target.source.sourceRef ? {
170518
- ...item,
170519
- isPinned: pinned
170520
- } : item) : sources;
170521
171172
  const nextBotPreferences = target.kind === "bot" ? updateBotDirectoryPreferences(botDirectoryPreferences, target.bot, { pinned }) : botDirectoryPreferences;
170522
171173
  directoryContextRequestRef.current += 1;
170523
171174
  setDirectoryContextMenu(void 0);
170524
- if (target.kind === "source") {
170525
- setDirectoryMutationSourceRef(target.source.sourceRef);
170526
- updateRootSources(nextSources);
170527
- } else setDirectoryMutationBotRef(target.bot.botRef);
171175
+ setDirectoryMutation({
171176
+ kind: target.kind,
171177
+ key: target.kind === "source" ? arkmeSourceIdentityKey(target.source) : conversationBotVisibilityKey(target.bot),
171178
+ action: "pin"
171179
+ });
170528
171180
  try {
170529
- if (target.kind === "source") await callArkme("source.directory.policy.set", {
170530
- sourceRef: target.source.sourceRef,
170531
- pinned
170532
- });
170533
- else {
171181
+ if (target.kind === "source") {
171182
+ const result = await callArkme("source.directory.policy.set", {
171183
+ sourceRef: target.source.sourceRef,
171184
+ pinned
171185
+ }, controller.signal);
171186
+ if (controller.signal.aborted) return;
171187
+ arkmeChatDirectory.confirmPin(target.source, result.pinned, result.policyUpdatedAtMillis);
171188
+ } else {
170534
171189
  setBotDirectoryPreferences(nextBotPreferences);
170535
171190
  writeBotDirectoryPreferences(auth?.userId, nextBotPreferences);
170536
171191
  }
170537
- if (authenticatedUserIdRef.current !== mutationUserId) return;
171192
+ if (controller.signal.aborted) return;
170538
171193
  setDirectoryActionFeedback(pinned ? "已置顶对话" : "已取消置顶");
170539
171194
  } catch (caught) {
170540
- if (authenticatedUserIdRef.current !== mutationUserId) return;
170541
- if (target.kind === "source") updateRootSources(previousSources);
170542
- else {
171195
+ if (controller.signal.aborted) return;
171196
+ if (target.kind === "bot") {
170543
171197
  setBotDirectoryPreferences(previousBotPreferences);
170544
171198
  writeBotDirectoryPreferences(auth?.userId, previousBotPreferences);
170545
171199
  }
170546
171200
  setDirectoryActionFeedback(caught instanceof Error ? caught.message : "操作失败,请重试");
170547
171201
  } finally {
170548
- if (authenticatedUserIdRef.current === mutationUserId) if (target.kind === "source") setDirectoryMutationSourceRef(void 0);
170549
- else setDirectoryMutationBotRef(void 0);
171202
+ if (!controller.signal.aborted) setDirectoryMutation(void 0);
170550
171203
  }
170551
171204
  };
170552
171205
  const dismissConversationDirectoryEntry = async (target) => {
170553
- if (directoryMutationSourceRef !== void 0 || directoryMutationBotRef !== void 0) return;
170554
- const mutationUserId = authenticatedUserIdRef.current;
170555
- if (mutationUserId === void 0) return;
171206
+ if (directoryMutation !== void 0) return;
171207
+ const controller = directoryMutationAbortRef.current;
171208
+ if (authenticatedUserIdRef.current === void 0 || controller === void 0 || controller.signal.aborted) return;
170556
171209
  const entryKind = target.kind;
170557
171210
  const stableKey = target.kind === "source" ? conversationSourceVisibilityKey(target.source) : conversationBotVisibilityKey(target.bot);
170558
171211
  let entryRef;
@@ -170574,28 +171227,32 @@ Please report this to https://github.com/markedjs/marked.`, e) {
170574
171227
  conversationVisibilityEpochRef.current += 1;
170575
171228
  directoryContextRequestRef.current += 1;
170576
171229
  setDirectoryContextMenu(void 0);
170577
- if (target.kind === "source") setDirectoryMutationSourceRef(entryRef);
170578
- else setDirectoryMutationBotRef(entryRef);
171230
+ setDirectoryMutation({
171231
+ kind: target.kind,
171232
+ key: target.kind === "source" ? arkmeSourceIdentityKey(target.source) : conversationBotVisibilityKey(target.bot),
171233
+ action: "dismiss"
171234
+ });
170579
171235
  try {
170580
171236
  await callArkme("conversation.directory.visibility.set", {
170581
171237
  entryKind,
170582
171238
  entryRef,
170583
171239
  hidden: true
170584
- });
170585
- if (authenticatedUserIdRef.current !== mutationUserId) return;
171240
+ }, controller.signal);
171241
+ if (controller.signal.aborted) return;
170586
171242
  const currentActivity = conversationVisibilityActivityRef.current.get(activityKey);
170587
171243
  if (currentActivity === void 0 || conversationVisibilityActivityAdvanced(submittedActivity, currentActivity)) return;
170588
171244
  setConversationVisibility((current) => dismissConversationVisibilityEntry(current, entryKind, stableKey));
170589
171245
  setDirectoryActionFeedback("已移除对话,可在联系人中找回");
170590
171246
  } catch (caught) {
170591
- if (authenticatedUserIdRef.current !== mutationUserId) return;
171247
+ if (controller.signal.aborted) return;
170592
171248
  setDirectoryActionFeedback(caught instanceof Error ? caught.message : "操作失败,请重试");
170593
171249
  } finally {
170594
- const protectedKeys = new Set(conversationVisibilityFeedbackRef.current);
170595
- protectedKeys.delete(protectedKey);
170596
- conversationVisibilityFeedbackRef.current = protectedKeys;
170597
- if (authenticatedUserIdRef.current === mutationUserId) if (target.kind === "source") setDirectoryMutationSourceRef(void 0);
170598
- else setDirectoryMutationBotRef(void 0);
171250
+ if (!controller.signal.aborted) {
171251
+ const protectedKeys = new Set(conversationVisibilityFeedbackRef.current);
171252
+ protectedKeys.delete(protectedKey);
171253
+ conversationVisibilityFeedbackRef.current = protectedKeys;
171254
+ setDirectoryMutation(void 0);
171255
+ }
170599
171256
  }
170600
171257
  };
170601
171258
  const selectTopicSource = (row) => {
@@ -170841,14 +171498,14 @@ Please report this to https://github.com/markedjs/marked.`, e) {
170841
171498
  style: styles$16.createTaskButton,
170842
171499
  "aria-label": "添加联系人、群聊或 Bot",
170843
171500
  onClick: showLogin,
170844
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$3, { size: 19 })
171501
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$2, { size: 19 })
170845
171502
  }),
170846
171503
  onCreateTask !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
170847
171504
  type: "button",
170848
171505
  style: styles$16.createTaskButton,
170849
171506
  "aria-label": "新任务",
170850
171507
  onClick: onCreateTask,
170851
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$3, { size: 19 })
171508
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$2, { size: 19 })
170852
171509
  })
170853
171510
  ]
170854
171511
  }),
@@ -171024,7 +171681,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
171024
171681
  const unreadPlacement = arkmeRootChatUnreadPlacement(bot);
171025
171682
  const badgeUnreadCount = arkmeBadgeUnreadCount(bot);
171026
171683
  const unreadText = badgeUnreadCount > 99 ? "99+" : badgeUnreadCount;
171027
- const interactionsDisabled = directoryMutationBotRef === bot.botRef;
171684
+ const interactionsDisabled = directoryMutation?.kind === "bot" && directoryMutation.key === conversationBotVisibilityKey(bot);
171028
171685
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
171029
171686
  type: "button",
171030
171687
  role: "treeitem",
@@ -171048,7 +171705,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
171048
171705
  directoryContextRequestRef.current += 1;
171049
171706
  setDirectoryContextMenu({
171050
171707
  kind: "bot",
171051
- bot,
171708
+ key: conversationBotVisibilityKey(bot),
171052
171709
  x: event.clientX,
171053
171710
  y: event.clientY
171054
171711
  });
@@ -171109,7 +171766,8 @@ Please report this to https://github.com/markedjs/marked.`, e) {
171109
171766
  const unreadPlacement = arkmeRootChatUnreadPlacement(source);
171110
171767
  const badgeUnreadCount = arkmeBadgeUnreadCount(source);
171111
171768
  const unreadText = badgeUnreadCount > 99 ? "99+" : badgeUnreadCount;
171112
- const interactionsDisabled = directoryMutationSourceRef === source.sourceRef;
171769
+ const mutationPending = directoryMutation?.kind === "source" && directoryMutation.key === arkmeSourceIdentityKey(source);
171770
+ const interactionsDisabled = mutationPending && directoryMutation.action === "dismiss";
171113
171771
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
171114
171772
  type: "button",
171115
171773
  role: "treeitem",
@@ -171125,17 +171783,17 @@ Please report this to https://github.com/markedjs/marked.`, e) {
171125
171783
  ...interactionsDisabled ? styles$16.chatRowRemoving : {}
171126
171784
  },
171127
171785
  disabled: interactionsDisabled,
171128
- "aria-busy": interactionsDisabled || void 0,
171786
+ "aria-busy": mutationPending || void 0,
171129
171787
  onClick: () => {
171130
171788
  selectSource(source);
171131
171789
  },
171132
171790
  onContextMenu: (event) => {
171133
171791
  event.preventDefault();
171134
- if (interactionsDisabled) return;
171792
+ if (mutationPending) return;
171135
171793
  directoryContextRequestRef.current += 1;
171136
171794
  setDirectoryContextMenu({
171137
171795
  kind: "source",
171138
- source,
171796
+ key: arkmeSourceIdentityKey(source),
171139
171797
  x: event.clientX,
171140
171798
  y: event.clientY
171141
171799
  });
@@ -171277,10 +171935,9 @@ Please report this to https://github.com/markedjs/marked.`, e) {
171277
171935
  type: "button",
171278
171936
  role: "menuitem",
171279
171937
  style: styles$16.directoryContextMenuItem,
171280
- disabled: directoryMutationSourceRef !== void 0 || directoryMutationBotRef !== void 0,
171938
+ disabled: directoryMutation !== void 0,
171281
171939
  onClick: () => {
171282
- if (directoryContextMenu.kind === "source") updateConversationDirectoryPin(directoryContextMenu, !directoryContextMenuPinned);
171283
- else updateConversationDirectoryPin(directoryContextMenu, !directoryContextMenuPinned);
171940
+ updateConversationDirectoryPin(directoryContextMenu, !directoryContextMenuPinned);
171284
171941
  },
171285
171942
  onMouseEnter: (event) => {
171286
171943
  event.currentTarget.style.background = arkmeTheme.subtle;
@@ -171301,7 +171958,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
171301
171958
  ...styles$16.directoryContextMenuItem,
171302
171959
  ...styles$16.directoryContextMenuDanger
171303
171960
  },
171304
- disabled: directoryMutationSourceRef !== void 0 || directoryMutationBotRef !== void 0,
171961
+ disabled: directoryMutation !== void 0,
171305
171962
  onClick: () => {
171306
171963
  dismissConversationDirectoryEntry(directoryContextMenu);
171307
171964
  },
@@ -174637,9 +175294,21 @@ Please report this to https://github.com/markedjs/marked.`, e) {
174637
175294
  pendingInterwovenRefreshRevisions = /* @__PURE__ */ new Map();
174638
175295
  viewports = /* @__PURE__ */ new Map();
174639
175296
  recency = /* @__PURE__ */ new Map();
175297
+ appliedTimelineDeltas = /* @__PURE__ */ new Map();
174640
175298
  constructor(maxSources = 20) {
174641
175299
  this.maxSources = maxSources;
174642
175300
  }
175301
+ unappliedTimelineDeltaItems(conversationKey, items) {
175302
+ const applied = this.appliedTimelineDeltas.get(conversationKey);
175303
+ return items.filter((item) => !applied?.has(item));
175304
+ }
175305
+ consumeTimelineDeltaItems(conversationKey, items) {
175306
+ if (items.length === 0) return;
175307
+ const applied = this.appliedTimelineDeltas.get(conversationKey) ?? /* @__PURE__ */ new WeakSet();
175308
+ for (const item of items) applied.add(item);
175309
+ this.appliedTimelineDeltas.set(conversationKey, applied);
175310
+ this.touch(conversationKey);
175311
+ }
174643
175312
  getTimeline(conversationKey) {
174644
175313
  const snapshot = this.timelines.get(conversationKey);
174645
175314
  if (snapshot !== void 0) this.touch(conversationKey);
@@ -174710,6 +175379,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
174710
175379
  this.pendingInterwovenRefreshRevisions.clear();
174711
175380
  this.viewports.clear();
174712
175381
  this.recency.clear();
175382
+ this.appliedTimelineDeltas.clear();
174713
175383
  }
174714
175384
  touch(conversationKey) {
174715
175385
  this.recency.delete(conversationKey);
@@ -174719,6 +175389,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
174719
175389
  if (oldest === void 0) return;
174720
175390
  this.recency.delete(oldest);
174721
175391
  this.timelines.delete(oldest);
175392
+ this.appliedTimelineDeltas.delete(oldest);
174722
175393
  this.interwovenMoments.delete(oldest);
174723
175394
  this.interwovenRefreshRevisions.delete(oldest);
174724
175395
  this.pendingInterwovenMoments.delete(oldest);
@@ -175667,7 +176338,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
175667
176338
  rememberCurrentScroll();
175668
176339
  onBackRelated?.();
175669
176340
  },
175670
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$5, {
176341
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$4, {
175671
176342
  size: 18,
175672
176343
  "aria-hidden": true
175673
176344
  })
@@ -177257,7 +177928,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
177257
177928
  style: styles$9.back,
177258
177929
  "aria-label": backLabel ?? "返回",
177259
177930
  onClick: onBack,
177260
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$5, { size: 18 })
177931
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$4, { size: 18 })
177261
177932
  }),
177262
177933
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
177263
177934
  style: styles$9.heading,
@@ -177318,7 +177989,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
177318
177989
  await removeDetailExtensionAttachments(attachments);
177319
177990
  });
177320
177991
  }
177321
- function DetailExtensionComposer({ sourceRef, messageActionRef, parentRecordUid, targetKey, onSent, onError }) {
177992
+ function DetailExtensionComposer({ sourceRef, messageActionRef, parentRecordUid, targetKey, onSent, onError, messageCreationBlocked, messageCreationRestriction }) {
177322
177993
  const [text, setText] = (0, react.useState)("");
177323
177994
  const [markdown, setMarkdown] = (0, react.useState)();
177324
177995
  const [markdownEnabled, setMarkdownEnabled] = (0, react.useState)(false);
@@ -177367,7 +178038,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
177367
178038
  };
177368
178039
  }, [targetKey]);
177369
178040
  const selectFiles = async (files) => {
177370
- if (files === null || files.length === 0 || preparing || sending) return;
178041
+ if (messageCreationBlocked || files === null || files.length === 0 || preparing || sending) return;
177371
178042
  const controller = new AbortController();
177372
178043
  stageAbortRef.current?.abort();
177373
178044
  stageAbortRef.current = controller;
@@ -177423,7 +178094,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
177423
178094
  const send = async () => {
177424
178095
  const normalizedText = markdown?.source ?? text.trim();
177425
178096
  const fileRefs = attachments.flatMap((attachment) => attachment.localFile === void 0 ? [] : [attachment.localFile.fileRef]);
177426
- if (sending || preparing || normalizedText === "" && fileRefs.length === 0) return;
178097
+ if (messageCreationBlocked || sending || preparing || normalizedText === "" && fileRefs.length === 0) return;
177427
178098
  const fingerprint = JSON.stringify([
177428
178099
  parentRecordUid ?? "",
177429
178100
  normalizedText,
@@ -177474,7 +178145,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
177474
178145
  if (generationRef.current === generation) setSending(false);
177475
178146
  }
177476
178147
  };
177477
- const disabled = preparing || sending;
178148
+ const disabled = messageCreationBlocked || preparing || sending;
177478
178149
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
177479
178150
  style: styles$9.extensionComposer,
177480
178151
  onDragOver: (event) => {
@@ -177490,11 +178161,16 @@ Please report this to https://github.com/markedjs/marked.`, e) {
177490
178161
  }
177491
178162
  },
177492
178163
  children: [
178164
+ messageCreationBlocked && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
178165
+ role: "status",
178166
+ children: messageCreationRestriction
178167
+ }),
177493
178168
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
177494
178169
  ref: fileInputRef,
177495
178170
  type: "file",
177496
178171
  multiple: true,
177497
178172
  hidden: true,
178173
+ disabled,
177498
178174
  "data-arkme-detail-extension-file-input": "true",
177499
178175
  onChange: (event) => selectFiles(event.currentTarget.files)
177500
178176
  }),
@@ -177561,8 +178237,12 @@ Please report this to https://github.com/markedjs/marked.`, e) {
177561
178237
  maxLength: 2e4,
177562
178238
  markdownEnabled,
177563
178239
  markdown,
177564
- onTextChange: setText,
177565
- onMarkdownChange: setMarkdown,
178240
+ onTextChange: (value) => {
178241
+ if (!disabled) setText(value);
178242
+ },
178243
+ onMarkdownChange: (value) => {
178244
+ if (!disabled) setMarkdown(value);
178245
+ },
177566
178246
  onPaste: (event) => {
177567
178247
  const files = clipboardFiles(event.clipboardData);
177568
178248
  if (files.length > 0) {
@@ -177806,7 +178486,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
177806
178486
  function relatedQuickNoteReferenceExpired$1(error) {
177807
178487
  return error instanceof ArkmeClientError && error.body.code === "related-quick-note-ref-expired";
177808
178488
  }
177809
- function ArkmeTimelineDetailDrawer({ item, sourceRef, showOriginal, onClose, onToggleOriginal, shareWebsite, onMessageCopyLinkOpen, onExtensionSent, onToast }) {
178489
+ function ArkmeTimelineDetailDrawer({ item, sourceRef, showOriginal, onClose, onToggleOriginal, shareWebsite, onMessageCopyLinkOpen, onExtensionSent, onToast, messageCreationBlocked = false, messageCreationRestriction = "" }) {
177810
178490
  const [relatedView, setRelatedView] = (0, react.useState)("source-detail");
177811
178491
  const [relatedState, setRelatedState] = (0, react.useState)({ kind: "idle" });
177812
178492
  const [relatedDetailState, setRelatedDetailState] = (0, react.useState)({ kind: "idle" });
@@ -177956,6 +178636,8 @@ Please report this to https://github.com/markedjs/marked.`, e) {
177956
178636
  const extensionFooter = normalizedSourceRef === "" || messageActionRef === "" ? void 0 : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DetailExtensionComposer, {
177957
178637
  sourceRef: normalizedSourceRef,
177958
178638
  messageActionRef,
178639
+ messageCreationBlocked,
178640
+ messageCreationRestriction,
177959
178641
  ...selectedExtensionRecordUid === void 0 ? {} : { parentRecordUid: selectedExtensionRecordUid },
177960
178642
  targetKey: `${normalizedSourceRef}:${item.itemUid}:${selectedExtensionRecordUid ?? item.itemUid}`,
177961
178643
  onError: (message) => {
@@ -182045,8 +182727,11 @@ Please report this to https://github.com/markedjs/marked.`, e) {
182045
182727
  const map = new Map(current.map((item) => [item.itemUid, item]));
182046
182728
  for (const item of incoming) {
182047
182729
  const previous = map.get(item.itemUid);
182730
+ const version = item.recordVersion ?? item.version ?? 0;
182731
+ const previousVersion = previous?.recordVersion ?? previous?.version ?? 0;
182732
+ if (previous?.status === 1 && item.status === 1 && version > 0 && previousVersion > 0 && previousVersion > version) continue;
182048
182733
  map.set(item.itemUid, {
182049
- ...item,
182734
+ ...retainPartialTimelineMedia(previous, item),
182050
182735
  ...previous?.aiPolish !== void 0 && item.aiPolish === void 0 ? { aiPolish: previous.aiPolish } : {},
182051
182736
  ...previous?.recordDurationMillis !== void 0 && item.recordDurationMillis === void 0 ? { recordDurationMillis: previous.recordDurationMillis } : {},
182052
182737
  ...previous?.editDurationMillis !== void 0 && item.editDurationMillis === void 0 ? { editDurationMillis: previous.editDurationMillis } : {},
@@ -182057,6 +182742,15 @@ Please report this to https://github.com/markedjs/marked.`, e) {
182057
182742
  }
182058
182743
  return [...map.values()].sort((a, b) => a.sendAtMillis - b.sendAtMillis || a.itemUid.localeCompare(b.itemUid));
182059
182744
  }
182745
+ function reconcileTimelinePage(cachedItems, delta, pageItems, readStartDeltas) {
182746
+ const removedKeys = new Set(delta?.removedItemKeys ?? []);
182747
+ const retainedPage = pageItems.filter((item) => !removedKeys.has(item.timelineItemKey ?? ""));
182748
+ const ids = new Set(retainedPage.map((item) => item.itemUid));
182749
+ const relevant = (delta?.items ?? []).filter((item) => ids.has(item.itemUid));
182750
+ const beforeRead = relevant.filter((item) => item === readStartDeltas.get(item.itemUid));
182751
+ const duringRead = relevant.filter((item) => item !== readStartDeltas.get(item.itemUid));
182752
+ return mergeItems(mergeItems(mergeItems(cachedItems.filter((item) => ids.has(item.itemUid)), beforeRead), retainedPage), duringRead);
182753
+ }
182060
182754
  function detailExtensionTimelineItem(parent, result) {
182061
182755
  const extension = result.extension;
182062
182756
  const avatarRef = extension.senderAvatarUrl?.trim() ?? "";
@@ -182151,11 +182845,29 @@ Please report this to https://github.com/markedjs/marked.`, e) {
182151
182845
  };
182152
182846
  return mergeItems(current.filter((item) => item.itemUid !== optimisticItemUid && item.itemUid !== result.itemUid), [confirmed]);
182153
182847
  }
182154
- function arkmeRecordReeditCandidateKey(title, textContent, textFormat = "plain") {
182155
- return `${title.trim()}\0${textFormat === "markdown" ? textContent : textContent.trim()}`;
182848
+ function arkmeRecordReeditFailure(caught) {
182849
+ const code = caught instanceof ArkmeClientError ? caught.body.code : void 0;
182850
+ return {
182851
+ error: errorMessage$2(caught) || "草稿保存失败,请重试",
182852
+ conflict: code === "record-reedit-conflict" ? "record" : code === "record-reedit-draft-changed" ? "draft" : void 0
182853
+ };
182854
+ }
182855
+ function arkmeRecordReeditCandidateKey(title, textContent, attachments, textFormat = "plain") {
182856
+ return JSON.stringify([
182857
+ title.trim(),
182858
+ textFormat === "markdown" ? textContent : textContent.trim(),
182859
+ attachments.map((attachment) => attachment.selection)
182860
+ ]);
182156
182861
  }
182157
182862
  function sameArkmeRecordReeditSession(left, right) {
182158
- return left !== void 0 && left.generation === right.generation && left.sourceRef === right.sourceRef && left.item.itemUid === right.item.itemUid;
182863
+ return left !== void 0 && left.generation === right.generation && left.accountKey === right.accountKey && left.sourceKey === right.sourceKey && left.sourceRef === right.sourceRef && left.item.itemUid === right.item.itemUid;
182864
+ }
182865
+ function arkmeRecordReeditPreparationKey(target) {
182866
+ return `record-reedit:${target.generation}`;
182867
+ }
182868
+ function arkmeRecordReeditAttachmentBlock(attachment) {
182869
+ if (attachment.unavailable) return void 0;
182870
+ return attachment.block ?? (attachment.localFile === void 0 ? void 0 : localFileBlock(attachment.localFile));
182159
182871
  }
182160
182872
  function resolveStateAction(action, current) {
182161
182873
  return typeof action === "function" ? action(current) : action;
@@ -183248,8 +183960,26 @@ Please report this to https://github.com/markedjs/marked.`, e) {
183248
183960
  activeSourceKeyRef.current = conversationKey;
183249
183961
  }, [conversationKey]);
183250
183962
  const sourceIsChat = source?.kind === "private_chat" || source?.kind === "group_chat";
183963
+ const [foregroundReadRevision, setForegroundReadRevision] = (0, react.useState)(0);
183964
+ (0, react.useEffect)(() => {
183965
+ if (!activeConversation || !sourceIsChat || authenticatedUserId === void 0 || typeof window === "undefined" || typeof document === "undefined") return;
183966
+ const resumeRead = () => {
183967
+ if (arkmeVisibleReadIntentAllowed()) setForegroundReadRevision((value) => value + 1);
183968
+ };
183969
+ window.addEventListener("focus", resumeRead);
183970
+ document.addEventListener("visibilitychange", resumeRead);
183971
+ return () => {
183972
+ window.removeEventListener("focus", resumeRead);
183973
+ document.removeEventListener("visibilitychange", resumeRead);
183974
+ };
183975
+ }, [
183976
+ activeConversation,
183977
+ authenticatedUserId,
183978
+ sourceIsChat
183979
+ ]);
183251
183980
  const sourceProjectionRevision = (0, react.useSyncExternalStore)(activeConversation && !sourceIsChat ? arkmeUi.subscribe : NOOP_SUBSCRIBE, () => activeConversation && !sourceIsChat ? arkmeUi.getRecordRevision() : 0, () => 0);
183252
183981
  const composerDraftKey = arkmeSourceComposerDraftKey(authenticatedUserId, source);
183982
+ const directAdmission = useDirectMessageAdmission(authenticatedAccountKey, source?.sourceRef, activeConversation && source?.directMessageAdmissionApplicable === true);
183253
183983
  const composerAsyncScopeRef = (0, react.useRef)({
183254
183984
  accountKey: void 0,
183255
183985
  sourceKey: "",
@@ -183275,59 +184005,58 @@ Please report this to https://github.com/markedjs/marked.`, e) {
183275
184005
  const [composerShowsInputTime, setComposerShowsInputTime] = (0, react.useState)(arkmeComposerShowsInputTime);
183276
184006
  const [composerExtensionTarget, setComposerExtensionTarget] = (0, react.useState)();
183277
184007
  const activeComposerExtensionTarget = composerExtensionTarget?.sourceRef === source?.sourceRef ? composerExtensionTarget : void 0;
183278
- const [recordReeditComposer, setRecordReeditComposer] = (0, react.useState)();
183279
- const recordReeditComposerRef = (0, react.useRef)();
184008
+ const { composer: recordReeditComposer, composerRef: recordReeditComposerRef, setComposer: setRecordReeditComposer, updateCandidate: updateRecordReeditCandidate, activateScope: activateRecordReeditScope, findCandidate: findRecordReeditCandidate } = useRecordReeditEditors();
184009
+ const seenReeditCommits = (0, react.useRef)(/* @__PURE__ */ new Set());
184010
+ const pendingReeditHighlights = (0, react.useRef)(/* @__PURE__ */ new Set());
183280
184011
  const recordReeditGenerationRef = (0, react.useRef)(0);
183281
- const recordReeditDraftSaveTailRef = (0, react.useRef)(Promise.resolve());
183282
- const recordReeditCommitGenerationRef = (0, react.useRef)();
183283
184012
  const [recordReeditHighlightUid, setRecordReeditHighlightUid] = (0, react.useState)("");
183284
184013
  const recordReeditHighlightTimerRef = (0, react.useRef)();
183285
- recordReeditComposerRef.current = recordReeditComposer;
183286
- const activeRecordReeditComposer = recordReeditComposer?.sourceRef === source?.sourceRef ? recordReeditComposer : void 0;
183287
- const persistRecordReeditDraft = (0, react.useCallback)(async (target) => {
184014
+ const activeRecordReeditComposer = recordReeditComposer?.sourceKey === conversationKey && recordReeditComposer?.accountKey === authenticatedAccountKey ? recordReeditComposer : void 0;
184015
+ const persistRecordReeditDraft = (0, react.useCallback)(async (target, forCommit = false) => {
183288
184016
  const snapshot = target.snapshot;
183289
- if (snapshot === void 0 || target.busy) return;
184017
+ if (snapshot === void 0 || target.busy || arkmeAuthenticatedAccountKey(arkmeAuthStore.getSnapshot().auth) !== target.accountKey) return false;
183290
184018
  const nextTitle = target.title.trim();
183291
184019
  const textFormat = snapshot.textFormat ?? target.item.textFormat;
183292
184020
  const nextText = textFormat === "markdown" ? target.textContent : target.textContent.trim();
183293
184021
  const supportsTitle = snapshot.displayKind === 1;
183294
- if (nextText.trim() === "" || supportsTitle && nextTitle === "") return;
183295
- const nextCandidateKey = arkmeRecordReeditCandidateKey(nextTitle, nextText, textFormat);
183296
- if (nextCandidateKey === target.persistedCandidateKey) return;
183297
- const operation = recordReeditDraftSaveTailRef.current.catch(() => void 0).then(async () => {
183298
- if (recordReeditCommitGenerationRef.current === target.generation) return false;
183299
- await callArkme("source.record-reedit.draft.put", {
184022
+ const nextCandidateKey = arkmeRecordReeditCandidateKey(nextTitle, nextText, target.attachments, textFormat);
184023
+ const alreadyPersisted = () => nextCandidateKey === target.persisted.candidateKey && (!forCommit || target.persisted.draftRevision > 0);
184024
+ const operation = target.persisted.saveTail.catch(() => void 0).then(async () => {
184025
+ if (!forCommit && target.persisted.exclusive || arkmeAuthenticatedAccountKey(arkmeAuthStore.getSnapshot().auth) !== target.accountKey || alreadyPersisted()) return;
184026
+ const result = await callArkme("source.record-reedit.draft.put", {
183300
184027
  sourceRef: target.sourceRef,
183301
184028
  itemUid: target.item.itemUid,
183302
184029
  newText: nextText,
183303
- expectedVersion: snapshot.version,
184030
+ expectedVersion: snapshot.draft?.baseVersion ?? snapshot.version,
184031
+ expectedDraftRevision: target.persisted.draftRevision,
184032
+ attachments: target.attachments.map((attachment) => attachment.selection),
183304
184033
  ...supportsTitle ? { newTitle: nextTitle } : {}
183305
184034
  });
183306
- return true;
184035
+ target.persisted.draftRevision = result.draftRevision;
184036
+ target.persisted.candidateKey = nextCandidateKey;
183307
184037
  });
183308
- recordReeditDraftSaveTailRef.current = operation.then(() => void 0, () => void 0);
183309
- if (!await operation) return;
183310
- setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, target) ? {
183311
- ...current,
183312
- persistedCandidateKey: nextCandidateKey
183313
- } : current);
184038
+ target.persisted.saveTail = operation.then(() => void 0, () => void 0);
184039
+ await operation;
184040
+ return alreadyPersisted();
183314
184041
  }, []);
183315
184042
  const persistRecordReeditBeforeContextExit = (0, react.useCallback)((target, shouldClose) => {
183316
184043
  recordReeditGenerationRef.current += 1;
183317
- if (target.snapshot === void 0 || target.busy) {
183318
- setRecordReeditComposer(void 0);
184044
+ if (target.snapshot === void 0) {
184045
+ updateRecordReeditCandidate(target, (current) => sameArkmeRecordReeditSession(current, target) ? void 0 : current);
183319
184046
  return;
183320
184047
  }
183321
- persistRecordReeditDraft(target).then(() => {
183322
- setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, target) && arkmeRecordReeditCandidateKey(current.title, current.textContent, current.snapshot?.textFormat ?? current.item.textFormat) === arkmeRecordReeditCandidateKey(target.title, target.textContent, target.snapshot?.textFormat ?? target.item.textFormat) && shouldClose() ? void 0 : current);
184048
+ if (target.busy) return;
184049
+ persistRecordReeditDraft(target).then((saved) => {
184050
+ if (!saved) return;
184051
+ updateRecordReeditCandidate(target, (current) => sameArkmeRecordReeditSession(current, target) && arkmeRecordReeditCandidateKey(current.title, current.textContent, current.attachments, current.snapshot?.textFormat ?? current.item.textFormat) === arkmeRecordReeditCandidateKey(target.title, target.textContent, target.attachments, target.snapshot?.textFormat ?? target.item.textFormat) && shouldClose() ? void 0 : current);
183323
184052
  }).catch((caught) => {
183324
- setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, target) ? {
184053
+ updateRecordReeditCandidate(target, (current) => sameArkmeRecordReeditSession(current, target) ? {
183325
184054
  ...current,
183326
184055
  busy: false,
183327
- error: errorMessage$2(caught) || "草稿保存失败,请重试"
184056
+ ...arkmeRecordReeditFailure(caught)
183328
184057
  } : current);
183329
184058
  });
183330
- }, [persistRecordReeditDraft]);
184059
+ }, [persistRecordReeditDraft, updateRecordReeditCandidate]);
183331
184060
  (0, react.useEffect)(() => {
183332
184061
  if (composerExtensionTarget !== void 0 && composerExtensionTarget.sourceRef !== source?.sourceRef) setComposerExtensionTarget(void 0);
183333
184062
  }, [composerExtensionTarget, source?.sourceRef]);
@@ -183338,9 +184067,40 @@ Please report this to https://github.com/markedjs/marked.`, e) {
183338
184067
  }
183339
184068
  setRecordReeditHighlightUid("");
183340
184069
  const target = recordReeditComposerRef.current;
183341
- if (target === void 0 || target.sourceRef === source?.sourceRef) return;
183342
- persistRecordReeditBeforeContextExit(target, () => arkmeUi.getSnapshot().selectedSource?.sourceRef !== target.sourceRef);
183343
- }, [persistRecordReeditBeforeContextExit, source?.sourceRef]);
184070
+ const nextScope = {
184071
+ accountKey: authenticatedAccountKey,
184072
+ sourceKey: conversationKey,
184073
+ sourceRef: source?.sourceRef ?? ""
184074
+ };
184075
+ if (target === void 0 || target.accountKey !== authenticatedAccountKey) {
184076
+ if (target !== void 0 && target.snapshot === void 0) updateRecordReeditCandidate(target, () => void 0);
184077
+ activateRecordReeditScope(nextScope, ++recordReeditGenerationRef.current);
184078
+ return;
184079
+ }
184080
+ if (target.sourceKey === conversationKey) {
184081
+ if (activeConversation && target.generation !== recordReeditGenerationRef.current) {
184082
+ const generation = ++recordReeditGenerationRef.current;
184083
+ setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, target) ? {
184084
+ ...current,
184085
+ generation
184086
+ } : current);
184087
+ }
184088
+ return;
184089
+ }
184090
+ persistRecordReeditBeforeContextExit(target, () => {
184091
+ const selected = arkmeUi.getSnapshot().selectedSource;
184092
+ return selected === void 0 || arkmeSourceIdentityKey(selected) !== target.sourceKey;
184093
+ });
184094
+ activateRecordReeditScope(nextScope, ++recordReeditGenerationRef.current);
184095
+ }, [
184096
+ activeConversation,
184097
+ authenticatedAccountKey,
184098
+ conversationKey,
184099
+ persistRecordReeditBeforeContextExit,
184100
+ source?.sourceRef,
184101
+ activateRecordReeditScope,
184102
+ updateRecordReeditCandidate
184103
+ ]);
183344
184104
  (0, react.useEffect)(() => {
183345
184105
  if (activeRecordReeditComposer?.snapshot === void 0) return;
183346
184106
  const generation = activeRecordReeditComposer.generation;
@@ -183380,18 +184140,26 @@ Please report this to https://github.com/markedjs/marked.`, e) {
183380
184140
  };
183381
184141
  }, [recordInputCaptureOwner]);
183382
184142
  const backgroundSoundCaptureEnabled = (0, react.useSyncExternalStore)((0, react.useCallback)((listener) => subscribeArkmeBackgroundSoundCapturePreference(authenticatedAccountKey, listener), [authenticatedAccountKey]), (0, react.useCallback)(() => arkmeBackgroundSoundCaptureEnabled(authenticatedAccountKey), [authenticatedAccountKey]), () => false);
183383
- const visibleComposerText = activeRecordReeditComposer?.textContent ?? draft;
184143
+ const visibleComposerText = activeRecordReeditComposer?.textContent ?? (directAdmission.blocked ? "" : draft);
184144
+ const visibleComposerAttachments = activeRecordReeditComposer === void 0 ? attachments : activeRecordReeditComposer.attachments.map((attachment) => {
184145
+ const block = arkmeRecordReeditAttachmentBlock(attachment);
184146
+ return block === void 0 ? attachment : {
184147
+ ...attachment,
184148
+ previewUrl: arkmeContentMediaUrl(block)
184149
+ };
184150
+ });
183384
184151
  const composerTextLength = Array.from(visibleComposerText).length;
183385
- const composerHasUserContent = composerTextLength > 0 || activeRecordReeditComposer === void 0 && attachments.length > 0;
184152
+ const composerHasUserContent = composerTextLength > 0 || visibleComposerAttachments.length > 0;
183386
184153
  const composerStatsVisible = composerInputFocused || composerHasUserContent;
183387
184154
  const composerInputStartedAtMillis = recordInputCaptureOwner.getStartedAtMillis(composerDraftKey);
183388
184155
  (0, react.useEffect)(() => {
183389
184156
  recordInputCaptureOwner.sync({
183390
184157
  draftKey: composerDraftKey,
183391
- isActive: activeRecordReeditComposer === void 0 && activeConversation && backgroundSoundSupported && backgroundSoundEligibilityReason === "eligible" && composerInputFocused && arkmeSourceSupportsRecordInputCapture(source?.kind),
184158
+ isActive: !directAdmission.blocked && activeRecordReeditComposer === void 0 && activeConversation && backgroundSoundSupported && backgroundSoundEligibilityReason === "eligible" && composerInputFocused && arkmeSourceSupportsRecordInputCapture(source?.kind),
183392
184159
  hasUserContent: composerHasUserContent
183393
184160
  });
183394
184161
  }, [
184162
+ directAdmission.blocked,
183395
184163
  activeConversation,
183396
184164
  activeRecordReeditComposer,
183397
184165
  backgroundSoundEligibilityReason,
@@ -183405,11 +184173,12 @@ Please report this to https://github.com/markedjs/marked.`, e) {
183405
184173
  const syncComposerUserInput = (0, react.useCallback)((hasUserContent) => {
183406
184174
  recordInputCaptureOwner.sync({
183407
184175
  draftKey: composerDraftKey,
183408
- isActive: activeConversation && backgroundSoundSupported && backgroundSoundEligibilityReason === "eligible" && composerInputFocused && arkmeSourceSupportsRecordInputCapture(source?.kind),
184176
+ isActive: !directAdmission.blocked && activeConversation && backgroundSoundSupported && backgroundSoundEligibilityReason === "eligible" && composerInputFocused && arkmeSourceSupportsRecordInputCapture(source?.kind),
183409
184177
  hasUserContent
183410
184178
  });
183411
184179
  if (hasUserContent) recordInputCaptureOwner.beginUserInput(composerDraftKey);
183412
184180
  }, [
184181
+ directAdmission.blocked,
183413
184182
  activeConversation,
183414
184183
  backgroundSoundEligibilityReason,
183415
184184
  backgroundSoundSupported,
@@ -183599,13 +184368,16 @@ Please report this to https://github.com/markedjs/marked.`, e) {
183599
184368
  }, [authenticatedUserId]);
183600
184369
  const [busy, setBusy] = (0, react.useState)(false);
183601
184370
  const preparingFiles = composerDraftKey !== void 0 && preparingKeys.has(composerDraftKey);
184371
+ const preparingReeditFiles = activeRecordReeditComposer !== void 0 && preparingKeys.has(arkmeRecordReeditPreparationKey(activeRecordReeditComposer));
184372
+ const composerFilesDisabled = activeRecordReeditComposer === void 0 ? preparingFiles || directAdmission.blocked : activeRecordReeditComposer.snapshot === void 0 || preparingReeditFiles || activeRecordReeditComposer.loading || activeRecordReeditComposer.busy;
184373
+ const composerFileAddingDisabled = composerFilesDisabled || activeRecordReeditComposer?.snapshot?.maxAttachments === 0;
183602
184374
  const messagePreparing = useMessagePreparing({
183603
184375
  source,
183604
184376
  accountScope: authenticatedAccountKey,
183605
- enabled: activeConversation && activeRecordReeditComposer === void 0 && !preparingFiles,
184377
+ enabled: activeConversation && activeRecordReeditComposer === void 0 && !preparingFiles && !directAdmission.blocked,
183606
184378
  focused: composerInputFocused
183607
184379
  });
183608
- const canSend = activeRecordReeditComposer === void 0 ? arkmeComposerCanSend(draft, attachments.length + (composerDraftKey !== void 0 && preparingKeys.has(composerDraftKey) ? 1 : 0), preparingFiles) : activeRecordReeditComposer.snapshot !== void 0 && !activeRecordReeditComposer.loading && !activeRecordReeditComposer.busy && activeRecordReeditComposer.textContent.trim() !== "";
184380
+ const canSend = activeRecordReeditComposer === void 0 ? !directAdmission.blocked && arkmeComposerCanSend(draft, attachments.length + (composerDraftKey !== void 0 && preparingKeys.has(composerDraftKey) ? 1 : 0), preparingFiles) : activeRecordReeditComposer.snapshot !== void 0 && !activeRecordReeditComposer.loading && !activeRecordReeditComposer.busy && !preparingReeditFiles && (activeRecordReeditComposer.textContent.trim() !== "" || activeRecordReeditComposer.attachments.length > 0 || activeRecordReeditComposer.snapshot.hasVoice === true);
183609
184381
  const pendingComposerFocusDraftKeyRef = (0, react.useRef)();
183610
184382
  const [compactNavigation, setCompactNavigation] = (0, react.useState)(false);
183611
184383
  const [submitBusy, setSubmitBusy] = (0, react.useState)(false);
@@ -183916,6 +184688,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
183916
184688
  const cacheAccountKeyRef = (0, react.useRef)();
183917
184689
  const timelineGenerationRef = (0, react.useRef)(0);
183918
184690
  const timelineWindowRevisionRef = (0, react.useRef)(0);
184691
+ const appliedTimelineInvalidationsRef = (0, react.useRef)(/* @__PURE__ */ new Map());
183919
184692
  const timelineRequestsRef = (0, react.useRef)(/* @__PURE__ */ new Map());
183920
184693
  const pendingViewportRestoreRef = (0, react.useRef)();
183921
184694
  const pendingConversationTargetLocateRef = (0, react.useRef)();
@@ -184430,7 +185203,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
184430
185203
  const hostRect = host.getBoundingClientRect();
184431
185204
  const buttonRect = button.getBoundingClientRect();
184432
185205
  const menuWidth = 248;
184433
- const menuHeight = canManageUserBan ? 88 : 44;
185206
+ const menuHeight = (canManageUserBan ? 88 : 44) + (directAdmission.applicable ? 88 : 0);
184434
185207
  setRelatedMenuPosition({
184435
185208
  left: Math.max(12, Math.min(hostRect.width - menuWidth - 12, buttonRect.right - hostRect.left - menuWidth)),
184436
185209
  top: Math.max(8, Math.min(hostRect.height - menuHeight - 12, buttonRect.bottom - hostRect.top + 8))
@@ -184441,6 +185214,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
184441
185214
  ensureUserBanStatus();
184442
185215
  }, [
184443
185216
  canManageUserBan,
185217
+ directAdmission.applicable,
184444
185218
  ensureRelatedEligibility,
184445
185219
  ensureUserBanStatus,
184446
185220
  relatedMenuOpen,
@@ -184453,7 +185227,9 @@ Please report this to https://github.com/markedjs/marked.`, e) {
184453
185227
  const readAckKey = `${source.sourceRef}:${String(readSequence)}`;
184454
185228
  if (readSequence <= 0 || lastReadAckRef.current === readAckKey) return;
184455
185229
  if (!(source.unreadCount > 0 || arkmeChatDirectory.hasOptimisticRead(source.sourceRef, source.sourceKey, source.latestSequence ?? readSequence))) return;
185230
+ const generation = timelineGenerationRef.current;
184456
185231
  if (!await arkmeAwaitVisibleReadIntent()) return;
185232
+ if (!activeConversationRef.current || generation !== timelineGenerationRef.current) return;
184457
185233
  if (lastReadAckRef.current === readAckKey) return;
184458
185234
  lastReadAckRef.current = readAckKey;
184459
185235
  try {
@@ -184473,9 +185249,13 @@ Please report this to https://github.com/markedjs/marked.`, e) {
184473
185249
  const sourceRef = source.sourceRef;
184474
185250
  const sourceKey = arkmeSourceIdentityKey(source);
184475
185251
  const generation = timelineGenerationRef.current;
185252
+ const invalidationRevision = arkmeChatTimelineDelta.getSnapshotForSource(sourceKey).invalidationRevision;
185253
+ const refreshWindow = intent === "refresh" || intent === "background" ? conversationCacheRef.current.getTimeline(sourceKey) : void 0;
185254
+ if (intent === "refresh" && conversationTargetAbortRef.current !== void 0 && !conversationTargetAbortRef.current.signal.aborted) return;
184476
185255
  if (intent === "background" && (conversationCacheRef.current.getTimeline(sourceKey)?.mode === "around" || conversationTargetAbortRef.current !== void 0 && !conversationTargetAbortRef.current.signal.aborted)) return;
184477
- const direction = cursor === void 0 ? "initial" : (cursor.afterSequence ?? 0) > 0 ? "newer" : "older";
184478
- const requestKey = `${sourceKey}:${cursor === void 0 ? "initial" : JSON.stringify(cursor)}`;
185256
+ if (refreshWindow !== void 0 && timelineRequestsRef.current.get("initial")?.controller.signal.aborted === false) return;
185257
+ const direction = refreshWindow === void 0 ? cursor === void 0 ? "initial" : (cursor.afterSequence ?? 0) > 0 ? "newer" : "older" : "refresh";
185258
+ const requestKey = refreshWindow === void 0 ? `${sourceKey}:${cursor === void 0 ? "initial" : JSON.stringify(cursor)}` : `${sourceKey}:refresh:${invalidationRevision}`;
184479
185259
  const activeRequest = timelineRequestsRef.current.get(direction);
184480
185260
  if (activeRequest !== void 0 && !activeRequest.controller.signal.aborted && activeRequest.requestKey === requestKey) return;
184481
185261
  if (intent === "latest") {
@@ -184490,31 +185270,50 @@ Please report this to https://github.com/markedjs/marked.`, e) {
184490
185270
  controller,
184491
185271
  requestKey
184492
185272
  });
185273
+ const readStartDeltas = /* @__PURE__ */ new Map();
184493
185274
  let page;
184494
185275
  try {
184495
- page = await retryArkmeRead(() => callArkme("source.timeline", {
184496
- sourceRef,
184497
- limit,
184498
- ...cursor === void 0 ? {} : { cursor }
184499
- }, controller.signal), { signal: controller.signal });
185276
+ const readPage = (pageCursor) => retryArkmeRead(async () => {
185277
+ const start = new Map((sourceIsChat ? arkmeChatTimelineDelta.getSnapshotForSource(sourceKey).items : []).map((item) => [item.itemUid, item]));
185278
+ const result = await callArkme("source.timeline", {
185279
+ sourceRef,
185280
+ limit: refreshWindow === void 0 ? limit : 100,
185281
+ ...pageCursor === void 0 ? {} : { cursor: pageCursor }
185282
+ }, controller.signal);
185283
+ for (const item of result.items) readStartDeltas.set(item.itemUid, start.get(item.itemUid));
185284
+ return result;
185285
+ }, { signal: controller.signal });
185286
+ page = refreshWindow === void 0 ? await readPage(cursor) : await readConversationTimelineWindow(refreshWindow, readPage, controller.signal);
184500
185287
  } catch (caught) {
184501
185288
  if (isArkmeRequestAbort(caught, controller.signal)) return;
184502
185289
  throw caught;
184503
185290
  } finally {
184504
185291
  if (timelineRequestsRef.current.get(direction)?.controller === controller) timelineRequestsRef.current.delete(direction);
184505
185292
  }
184506
- if (generation !== timelineGenerationRef.current || windowRevision !== timelineWindowRevisionRef.current) return;
185293
+ if (controller.signal.aborted || generation !== timelineGenerationRef.current || windowRevision !== timelineWindowRevisionRef.current) return;
184507
185294
  const cached = conversationCacheRef.current.getTimeline(sourceKey);
184508
185295
  const loadingNewerPage = (cursor?.afterSequence ?? 0) > 0;
184509
185296
  const cachedItemUids = new Set((cached?.items ?? []).map((item) => item.itemUid));
184510
185297
  const newerPageStartItemUid = loadingNewerPage ? mergeItems([], page.items.filter((item) => !cachedItemUids.has(item.itemUid)))[0]?.itemUid : void 0;
184511
185298
  const nextAroundSequenceRange = !(cursor === void 0 || loadingNewerPage && !page.hasMore) && (cached?.mode ?? "latest") === "around" ? arkmeConversationTimelineSequenceRange(page.items, cached?.aroundSequenceRange) : void 0;
184512
185299
  const nextAiPolishSettings = cursor === void 0 ? page.aiPolishSettings : cached?.aiPolishSettings;
184513
- const authoritativeItems = mergeItems(cursor === void 0 ? (cached?.items ?? []).filter((item) => item.awaitingTimelineProjection === true && !page.items.some((projected) => projected.itemUid === item.itemUid)) : [], page.items);
184514
- const snapshot = {
185300
+ const pendingProjectionItems = cursor === void 0 ? (cached?.items ?? []).filter((item) => item.awaitingTimelineProjection === true && !page.items.some((projected) => projected.itemUid === item.itemUid)) : [];
185301
+ const delta = sourceIsChat ? arkmeChatTimelineDelta.getSnapshotForSource(sourceKey) : void 0;
185302
+ const removedKeys = new Set(delta?.removedItemKeys ?? []);
185303
+ const authoritativeItems = mergeItems(pendingProjectionItems, reconcileTimelinePage(cached?.items ?? [], delta, page.items, readStartDeltas));
185304
+ const refreshRange = refreshWindow?.mode === "around" ? refreshWindow.aroundSequenceRange : void 0;
185305
+ const refreshedIds = new Set(refreshWindow?.items.filter((item) => item.status === 1 && (refreshRange === void 0 || (item.sequence ?? 0) >= refreshRange.minimumSequence && (item.sequence ?? 0) <= refreshRange.maximumSequence)).map((item) => item.itemUid));
185306
+ const snapshot = refreshWindow !== void 0 && cached !== void 0 ? {
185307
+ ...cached,
185308
+ items: confirmedSendRetention.merge(sourceKey, mergeItems(cached.items.filter((item) => !refreshedIds.has(item.itemUid) && !removedKeys.has(item.timelineItemKey ?? "")), authoritativeItems)),
185309
+ fetchedAtMillis: Date.now(),
185310
+ aiPolishNotices: page.aiPolishNotices ?? cached.aiPolishNotices,
185311
+ ...page.aiPolishSettings === void 0 ? {} : { aiPolishSettings: page.aiPolishSettings },
185312
+ ...sourceIsChat ? { latestSequence: Math.max(cached.latestSequence ?? 0, source.latestSequence ?? 0, ...page.items.map((item) => item.sequence ?? 0)) } : { recordRevision: sourceProjectionRevision }
185313
+ } : {
184515
185314
  mode: cursor === void 0 ? "latest" : loadingNewerPage && !page.hasMore ? "latest" : cached?.mode ?? "latest",
184516
185315
  ...nextAroundSequenceRange === void 0 ? {} : { aroundSequenceRange: nextAroundSequenceRange },
184517
- items: cursor === void 0 ? confirmedSendRetention.merge(sourceKey, authoritativeItems) : mergeItems(cached?.items ?? [], page.items),
185316
+ items: cursor === void 0 ? confirmedSendRetention.merge(sourceKey, authoritativeItems) : mergeItems(cached?.items ?? [], authoritativeItems),
184518
185317
  aiPolishNotices: cursor === void 0 ? page.aiPolishNotices ?? [] : cached?.aiPolishNotices ?? [],
184519
185318
  hasMore: loadingNewerPage ? cached?.hasMore ?? false : page.hasMore,
184520
185319
  newerHasMore: loadingNewerPage ? page.hasMore : cursor === void 0 ? false : cached?.newerHasMore ?? false,
@@ -184526,6 +185325,9 @@ Please report this to https://github.com/markedjs/marked.`, e) {
184526
185325
  };
184527
185326
  const contentChanged = !arkmeConversationTimelineContentEqual(cached, snapshot);
184528
185327
  const releasedMoments = conversationCacheRef.current.storeTimeline(sourceKey, snapshot);
185328
+ const readIds = new Set(page.items.map((item) => item.itemUid));
185329
+ conversationCacheRef.current.consumeTimelineDeltaItems(sourceKey, (delta?.items ?? []).filter((item) => readIds.has(item.itemUid)));
185330
+ if (cursor === void 0) appliedTimelineInvalidationsRef.current.set(sourceKey, Math.max(appliedTimelineInvalidationsRef.current.get(sourceKey) ?? 0, invalidationRevision));
184529
185331
  const releasedMomentsChanged = releasedMoments !== void 0 && JSON.stringify(releasedMoments) !== JSON.stringify(interwovenMoments);
184530
185332
  if (contentChanged || releasedMomentsChanged) {
184531
185333
  const body = bodyRef.current;
@@ -184554,6 +185356,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
184554
185356
  if (!hadCachedTimeline && snapshot.items.length > 0) setTimelineRevealKey(sourceKey);
184555
185357
  await acknowledgeRead(snapshot.items);
184556
185358
  }
185359
+ if (generation === timelineGenerationRef.current && windowRevision === timelineWindowRevisionRef.current && arkmeChatTimelineDelta.getSnapshotForSource(sourceKey).invalidationRevision > invalidationRevision) await loadTimeline(void 0, true, 40, "refresh");
184557
185360
  }, [
184558
185361
  acknowledgeRead,
184559
185362
  confirmedSendRetention,
@@ -184660,24 +185463,30 @@ Please report this to https://github.com/markedjs/marked.`, e) {
184660
185463
  const controller = new AbortController();
184661
185464
  conversationTargetAbortRef.current?.abort();
184662
185465
  conversationTargetAbortRef.current = controller;
184663
- retryArkmeRead(() => callArkme("source.timeline-around", {
184664
- sourceRef: source.sourceRef,
184665
- itemUid: target.itemUid,
184666
- recordOwnerUserId: target.recordOwnerUserId,
184667
- beforeLimit: 20,
184668
- afterLimit: 20
184669
- }, controller.signal), { signal: controller.signal }).then((page) => {
185466
+ let readStartDeltas = /* @__PURE__ */ new Map();
185467
+ retryArkmeRead(() => {
185468
+ readStartDeltas = new Map(arkmeChatTimelineDelta.getSnapshotForSource(conversationKey).items.map((item) => [item.itemUid, item]));
185469
+ return callArkme("source.timeline-around", {
185470
+ sourceRef: source.sourceRef,
185471
+ itemUid: target.itemUid,
185472
+ recordOwnerUserId: target.recordOwnerUserId,
185473
+ beforeLimit: 20,
185474
+ afterLimit: 20
185475
+ }, controller.signal);
185476
+ }, { signal: controller.signal }).then((page) => {
184670
185477
  if (controller.signal.aborted || generation !== timelineGenerationRef.current || windowRevision !== timelineWindowRevisionRef.current || arkmeUi.getSnapshot().conversationTarget?.revision !== target.revision) return;
184671
- if (!page.items.some((item) => item.itemUid === target.itemUid)) throw new Error("未找到要定位的快记");
185478
+ const cached = conversationCacheRef.current.getTimeline(conversationKey);
185479
+ const delta = sourceIsChat ? arkmeChatTimelineDelta.getSnapshotForSource(conversationKey) : void 0;
185480
+ const items = reconcileTimelinePage(cached?.items ?? [], delta, page.items, readStartDeltas);
185481
+ if (!items.some((item) => item.itemUid === target.itemUid)) throw new Error("未找到要定位的快记");
184672
185482
  timelineRequestsRef.current.get("initial")?.controller.abort();
184673
185483
  timelineRequestsRef.current.delete("initial");
184674
185484
  timelineWindowRevisionRef.current += 1;
184675
- const cached = conversationCacheRef.current.getTimeline(conversationKey);
184676
185485
  const nextAroundSequenceRange = arkmeConversationTimelineSequenceRange(page.items);
184677
185486
  const snapshot = {
184678
185487
  mode: "around",
184679
185488
  ...nextAroundSequenceRange === void 0 ? {} : { aroundSequenceRange: nextAroundSequenceRange },
184680
- items: page.items,
185489
+ items,
184681
185490
  aiPolishNotices: cached?.aiPolishNotices ?? [],
184682
185491
  hasMore: page.olderHasMore,
184683
185492
  newerHasMore: page.newerHasMore,
@@ -184688,6 +185497,9 @@ Please report this to https://github.com/markedjs/marked.`, e) {
184688
185497
  ...page.newerCursor === void 0 ? {} : { newerCursor: page.newerCursor }
184689
185498
  };
184690
185499
  conversationCacheRef.current.storeTimeline(conversationKey, snapshot);
185500
+ const readIds = new Set(page.items.map((item) => item.itemUid));
185501
+ conversationCacheRef.current.consumeTimelineDeltaItems(conversationKey, (delta?.items ?? []).filter((item) => readIds.has(item.itemUid)));
185502
+ conversationTargetAbortRef.current = void 0;
184691
185503
  pendingViewportRestoreRef.current = void 0;
184692
185504
  setMemberEventWindowRevision((value) => value + 1);
184693
185505
  pendingConversationTargetLocateRef.current = {
@@ -184707,8 +185519,13 @@ Please report this to https://github.com/markedjs/marked.`, e) {
184707
185519
  newerCursor: snapshot.newerCursor,
184708
185520
  newerHasMore: snapshot.newerHasMore ?? false
184709
185521
  });
185522
+ if (arkmeChatTimelineDelta.getSnapshotForSource(conversationKey).invalidationRevision > (appliedTimelineInvalidationsRef.current.get(conversationKey) ?? 0)) loadTimeline(void 0, true, 40, "refresh").catch((caught) => {
185523
+ setError(errorMessage$2(caught));
185524
+ });
184710
185525
  }).catch((caught) => {
184711
185526
  if (isArkmeRequestAbort(caught, controller.signal)) return;
185527
+ if (generation !== timelineGenerationRef.current || windowRevision !== timelineWindowRevisionRef.current) return;
185528
+ conversationTargetAbortRef.current = void 0;
184712
185529
  if (pendingConversationTargetLocateRef.current?.revision === target.revision) pendingConversationTargetLocateRef.current = void 0;
184713
185530
  const message = errorMessage$2(caught) || "暂时无法定位这条快记";
184714
185531
  if (messageActionStatusTimerRef.current !== void 0) window.clearTimeout(messageActionStatusTimerRef.current);
@@ -184718,6 +185535,9 @@ Please report this to https://github.com/markedjs/marked.`, e) {
184718
185535
  messageActionStatusTimerRef.current = void 0;
184719
185536
  }, MESSAGE_ACTION_NOTICE_MS);
184720
185537
  arkmeUi.consumeConversationTarget(target.revision);
185538
+ if (arkmeChatTimelineDelta.getSnapshotForSource(conversationKey).invalidationRevision > (appliedTimelineInvalidationsRef.current.get(conversationKey) ?? 0)) loadTimeline(void 0, true, 40, "refresh").catch((error) => {
185539
+ setError(errorMessage$2(error));
185540
+ });
184721
185541
  }).finally(() => {
184722
185542
  if (conversationTargetAbortRef.current === controller) conversationTargetAbortRef.current = void 0;
184723
185543
  });
@@ -184774,6 +185594,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
184774
185594
  if (!accountChanged && timelineStateKey !== "" && bodyRef.current !== null) conversationCacheRef.current.storeViewport(timelineStateKey, arkmeConversationViewport(bodyRef.current));
184775
185595
  if (accountChanged) {
184776
185596
  conversationCacheRef.current.clear();
185597
+ appliedTimelineInvalidationsRef.current.clear();
184777
185598
  cacheAccountKeyRef.current = authenticatedAccountKey;
184778
185599
  }
184779
185600
  const sourceKey = authenticated && conversationKey !== "" ? conversationKey : void 0;
@@ -184904,6 +185725,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
184904
185725
  authenticated,
184905
185726
  chatDelta.items,
184906
185727
  conversationKey,
185728
+ foregroundReadRevision,
184907
185729
  loadTimeline,
184908
185730
  notificationActivationRevision,
184909
185731
  source,
@@ -185013,13 +185835,14 @@ Please report this to https://github.com/markedjs/marked.`, e) {
185013
185835
  };
185014
185836
  }, [activeConversation, authenticated]);
185015
185837
  (0, react.useEffect)(() => {
185016
- if (!activeConversation || !authenticated || source === void 0) return;
185017
- const deltaItems = chatDelta.items;
185838
+ if (!activeConversation || !authenticated || source === void 0 || timelineStateKey !== conversationKey) return;
185839
+ const deltaItems = conversationCacheRef.current.unappliedTimelineDeltaItems(conversationKey, chatDelta.items);
185018
185840
  const removedItemKeys = new Set(chatDelta.removedItemKeys);
185019
185841
  const retainedItems = removedItemKeys.size === 0 ? items : items.filter((item) => !removedItemKeys.has(item.timelineItemKey ?? ""));
185020
185842
  const applicableDeltaItems = arkmeConversationTimelineDeltaItems(timelineMode, aroundSequenceRange, retainedItems, deltaItems);
185021
185843
  if (applicableDeltaItems.length === 0 && retainedItems.length === items.length) return;
185022
185844
  const nextItems = mergeItems(retainedItems, applicableDeltaItems);
185845
+ conversationCacheRef.current.consumeTimelineDeltaItems(conversationKey, applicableDeltaItems);
185023
185846
  if (JSON.stringify(nextItems) === JSON.stringify(items)) return;
185024
185847
  const body = bodyRef.current;
185025
185848
  const viewport = body === null ? void 0 : arkmeConversationViewport(body);
@@ -185049,15 +185872,14 @@ Please report this to https://github.com/markedjs/marked.`, e) {
185049
185872
  conversationKey,
185050
185873
  items,
185051
185874
  source,
185052
- timelineMode
185875
+ timelineMode,
185876
+ timelineStateKey
185053
185877
  ]);
185054
- const appliedTimelineInvalidationsRef = (0, react.useRef)(/* @__PURE__ */ new Map());
185055
185878
  (0, react.useEffect)(() => {
185056
185879
  if (!activeConversation || !authenticated || source === void 0 || chatDelta.invalidationRevision <= 0) return;
185057
185880
  const applied = appliedTimelineInvalidationsRef.current.get(conversationKey) ?? 0;
185058
185881
  if (chatDelta.invalidationRevision <= applied) return;
185059
- appliedTimelineInvalidationsRef.current.set(conversationKey, chatDelta.invalidationRevision);
185060
- loadTimeline(void 0, true).catch((caught) => {
185882
+ loadTimeline(void 0, true, 40, "refresh").catch((caught) => {
185061
185883
  setError(errorMessage$2(caught));
185062
185884
  });
185063
185885
  }, [
@@ -185430,28 +186252,45 @@ Please report this to https://github.com/markedjs/marked.`, e) {
185430
186252
  request.send(file);
185431
186253
  });
185432
186254
  const selectFiles = async (files) => {
186255
+ if (activeRecordReeditComposer === void 0 && directAdmission.blocked) return;
185433
186256
  if (files === null || files.length === 0) return;
186257
+ const reeditTarget = activeRecordReeditComposer;
186258
+ if (reeditTarget?.snapshot?.maxAttachments === 0) return;
185434
186259
  const targetDraftKey = composerDraftKey;
185435
186260
  const targetUserId = authenticatedUserId;
185436
186261
  if (targetDraftKey === void 0 || targetUserId === void 0) return;
185437
- syncComposerUserInput(true);
186262
+ const preparationKey = reeditTarget === void 0 ? targetDraftKey : arkmeRecordReeditPreparationKey(reeditTarget);
186263
+ if (reeditTarget !== void 0 && (reeditTarget.snapshot === void 0 || reeditTarget.loading || reeditTarget.busy || preparationJobs.current.has(preparationKey))) return;
186264
+ const scope = captureComposerAsyncScope();
186265
+ const sameReeditTarget = () => reeditTarget !== void 0 && sameComposerAsyncScope(scope) && recordReeditGenerationRef.current === reeditTarget.generation && sameArkmeRecordReeditSession(recordReeditComposerRef.current, reeditTarget);
186266
+ const showPreparationError = (message) => {
186267
+ if (reeditTarget === void 0) setError(message);
186268
+ else if (sameReeditTarget()) setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, reeditTarget) ? {
186269
+ ...current,
186270
+ error: message
186271
+ } : current);
186272
+ };
186273
+ if (reeditTarget === void 0) syncComposerUserInput(true);
185438
186274
  const picked = Array.from(files);
185439
186275
  const controller = new AbortController();
185440
186276
  stageControllers.current.add(controller);
185441
186277
  setAddMenuOpen(false);
185442
- setError("");
185443
- setPreparingKeys((current) => /* @__PURE__ */ new Set([...current, targetDraftKey]));
186278
+ showPreparationError("");
186279
+ setPreparingKeys((current) => /* @__PURE__ */ new Set([...current, preparationKey]));
185444
186280
  if (fileInputRef.current !== null) fileInputRef.current.value = "";
185445
- const job = (preparationJobs.current.get(targetDraftKey) ?? Promise.resolve(true)).catch(() => false).then(async () => {
186281
+ const job = (preparationJobs.current.get(preparationKey) ?? Promise.resolve(true)).catch(() => false).then(async () => {
185446
186282
  const sdk = createArkmeSdk();
185447
186283
  const policy = await sdk.fileCapabilities();
186284
+ const maxAttachments = Math.min(policy.maxAttachments, reeditTarget?.snapshot?.maxAttachments ?? policy.maxAttachments);
185448
186285
  const errors = [];
186286
+ let reeditAttachmentCount = reeditTarget?.attachments.length ?? 0;
185449
186287
  let added = false;
185450
186288
  for (const file of picked) {
185451
186289
  controller.signal.throwIfAborted();
186290
+ if (reeditTarget !== void 0 && !sameReeditTarget()) return false;
185452
186291
  const limit = file.type.startsWith("image/") ? policy.maxImageBytes : policy.maxFileBytes;
185453
- if (arkmeComposerDraftStore.get(targetDraftKey).attachments.length >= policy.maxAttachments) {
185454
- errors.push(`最多添加 ${policy.maxAttachments} 个附件:${file.name}`);
186292
+ if ((reeditTarget === void 0 ? arkmeComposerDraftStore.get(targetDraftKey).attachments.length : reeditAttachmentCount) >= maxAttachments) {
186293
+ errors.push(`最多添加 ${maxAttachments} 个附件:${file.name}`);
185455
186294
  continue;
185456
186295
  }
185457
186296
  if (file.size === 0 || file.size > limit) {
@@ -185459,34 +186298,52 @@ Please report this to https://github.com/markedjs/marked.`, e) {
185459
186298
  continue;
185460
186299
  }
185461
186300
  try {
185462
- const localFile = await sdk.stageFile(file, { signal: controller.signal });
186301
+ const localFile = await sdk.stageFile(file, {
186302
+ signal: controller.signal,
186303
+ expectedUserId: targetUserId,
186304
+ ...reeditTarget ? { retention: "references" } : {}
186305
+ });
185463
186306
  const currentAuth = arkmeAuthStore.getSnapshot().auth;
185464
186307
  if (currentAuth?.status !== "authenticated" || currentAuth.userId !== targetUserId) return false;
185465
- arkmeComposerDraftStore.appendAttachments(targetDraftKey, [{ localFile }], policy.maxAttachments);
186308
+ if (reeditTarget === void 0) arkmeComposerDraftStore.appendAttachments(targetDraftKey, [{ localFile }], policy.maxAttachments);
186309
+ else {
186310
+ if (!sameReeditTarget()) return false;
186311
+ reeditAttachmentCount += 1;
186312
+ setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, reeditTarget) ? {
186313
+ ...current,
186314
+ attachments: [...current.attachments, {
186315
+ localFile,
186316
+ selection: { fileRef: localFile.fileRef }
186317
+ }]
186318
+ } : current);
186319
+ }
185466
186320
  added = true;
185467
186321
  } catch (caught) {
185468
186322
  if (controller.signal.aborted) throw caught;
185469
186323
  errors.push(`${file.name}:${errorMessage$2(caught)}`);
185470
186324
  }
185471
186325
  }
185472
- if (errors.length > 0) setError(errors.join(";"));
186326
+ if (errors.length > 0) showPreparationError(errors.join(";"));
185473
186327
  return added;
185474
186328
  }).catch((caught) => {
185475
- if (!controller.signal.aborted) setError(errorMessage$2(caught));
186329
+ if (!controller.signal.aborted) showPreparationError(errorMessage$2(caught));
185476
186330
  return false;
185477
186331
  }).finally(() => {
185478
186332
  stageControllers.current.delete(controller);
185479
- if (preparationJobs.current.get(targetDraftKey) === job) {
185480
- preparationJobs.current.delete(targetDraftKey);
186333
+ if (preparationJobs.current.get(preparationKey) === job) {
186334
+ preparationJobs.current.delete(preparationKey);
185481
186335
  setPreparingKeys((current) => {
185482
186336
  const next = new Set(current);
185483
- next.delete(targetDraftKey);
186337
+ next.delete(preparationKey);
185484
186338
  return next;
185485
186339
  });
185486
186340
  }
185487
- pendingComposerFocusDraftKeyRef.current = targetDraftKey;
186341
+ if (reeditTarget === void 0) pendingComposerFocusDraftKeyRef.current = targetDraftKey;
186342
+ else if (sameReeditTarget()) requestAnimationFrame(() => {
186343
+ textareaRef.current?.focus();
186344
+ });
185488
186345
  });
185489
- preparationJobs.current.set(targetDraftKey, job);
186346
+ preparationJobs.current.set(preparationKey, job);
185490
186347
  await job;
185491
186348
  };
185492
186349
  const rememberSentHashTags = (0, react.useCallback)((accountKey, itemUid, textContent, sendAtMillis, textFormat) => {
@@ -185499,6 +186356,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
185499
186356
  }]));
185500
186357
  }, []);
185501
186358
  const send = async () => {
186359
+ if (activeRecordReeditComposer === void 0 && directAdmission.blocked) return;
185502
186360
  if (activeRecordReeditComposer !== void 0) {
185503
186361
  await commitRecordReedit();
185504
186362
  return;
@@ -185908,6 +186766,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
185908
186766
  if (pendingAssets.length > 0) await loadTimeline();
185909
186767
  } catch (caught) {
185910
186768
  if (sameTargetComposer()) setItems((current) => current.filter((item) => item.itemUid !== recordUid));
186769
+ if (caught instanceof ArkmeClientError && caught.body.directMessageAdmission !== void 0) invalidateDirectMessageAdmission();
185911
186770
  if (sameTargetAccount()) if (!durableFileSendUncertain) {
185912
186771
  arkmeComposerDraftStore.restore(targetDraftKey, pendingDraft);
185913
186772
  recordInputCaptureOwner.restoreForRetry(targetDraftKey, inputCapture);
@@ -185917,7 +186776,9 @@ Please report this to https://github.com/markedjs/marked.`, e) {
185917
186776
  }
185918
186777
  };
185919
186778
  const updateComposerText = (text) => {
186779
+ if (activeRecordReeditComposer === void 0 && directAdmission.blocked) return;
185920
186780
  if (activeRecordReeditComposer !== void 0) {
186781
+ if (activeRecordReeditComposer.snapshot === void 0 || activeRecordReeditComposer.loading || activeRecordReeditComposer.busy || preparationJobs.current.has(arkmeRecordReeditPreparationKey(activeRecordReeditComposer))) return;
185921
186782
  setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, activeRecordReeditComposer) ? {
185922
186783
  ...current,
185923
186784
  textContent: text,
@@ -186455,10 +187316,39 @@ Please report this to https://github.com/markedjs/marked.`, e) {
186455
187316
  }
186456
187317
  setMomentRelatedView(relatedDrawerBackTarget(momentRelatedView));
186457
187318
  };
186458
- const displayItems = (0, react.useMemo)(() => {
187319
+ const refreshCurrentWindow = (0, react.useCallback)(() => loadTimeline(void 0, true, 40, "refresh"), [loadTimeline]);
187320
+ const reeditSubmissions = useRecordReeditSubmissions(source?.sourceRef, authenticatedAccountKey, activeConversation, timelineStateKey === conversationKey ? items : [], refreshCurrentWindow, conversationKey);
187321
+ const { displayItems, reeditItems } = (0, react.useMemo)(() => {
186459
187322
  const remoteIds = new Set(items.map((item) => item.itemUid));
186460
- return [...items.map((item) => bindSentFileTaskLocals(item, fileTasks.tasks)), ...fileTasks.tasks.filter((task) => !remoteIds.has(task.result?.itemUid ?? task.recordUid)).map(fileTaskTimelineItem)].sort((a, b) => a.sendAtMillis - b.sendAtMillis);
186461
- }, [items, fileTasks.tasks]);
187323
+ const reeditItems = /* @__PURE__ */ new Set();
187324
+ return {
187325
+ displayItems: [...items.map((item) => {
187326
+ const bound = bindSentFileTaskLocals(item, fileTasks.tasks);
187327
+ const projected = projectRecordReedit(bound, reeditSubmissions.jobs);
187328
+ if (projected !== bound) reeditItems.add(projected);
187329
+ return projected;
187330
+ }), ...fileTasks.tasks.filter((task) => !remoteIds.has(task.result?.itemUid ?? task.recordUid)).map(fileTaskTimelineItem)].sort((a, b) => a.sendAtMillis - b.sendAtMillis),
187331
+ reeditItems
187332
+ };
187333
+ }, [
187334
+ items,
187335
+ fileTasks.tasks,
187336
+ reeditSubmissions.jobs
187337
+ ]);
187338
+ (0, react.useEffect)(() => {
187339
+ for (const job of reeditSubmissions.jobs) if (job.state === "pending" || job.state === "committing") pendingReeditHighlights.current.add(job.submissionId);
187340
+ const committed = reeditSubmissions.jobs.filter((job) => job.state === "committed" && pendingReeditHighlights.current.has(job.submissionId) && !seenReeditCommits.current.has(job.submissionId));
187341
+ if (committed.length === 0) return;
187342
+ for (const job of committed) seenReeditCommits.current.add(job.submissionId);
187343
+ const latest = committed[committed.length - 1];
187344
+ if (recordReeditHighlightTimerRef.current !== void 0) window.clearTimeout(recordReeditHighlightTimerRef.current);
187345
+ setHighlightedTargetUid("");
187346
+ setRecordReeditHighlightUid(latest.itemUid);
187347
+ recordReeditHighlightTimerRef.current = window.setTimeout(() => {
187348
+ recordReeditHighlightTimerRef.current = void 0;
187349
+ setRecordReeditHighlightUid("");
187350
+ }, ARKME_RECORD_REEDIT_HIGHLIGHT_MILLIS);
187351
+ }, [reeditSubmissions.jobs]);
186462
187352
  const visibleConversationJoinEvents = (0, react.useMemo)(() => source?.kind === "group_chat" ? arkmeConversationJoinEventsInLoadedWindow(conversationJoinEvents, displayItems, hasMore) : [], [
186463
187353
  conversationJoinEvents,
186464
187354
  displayItems,
@@ -186676,7 +187566,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
186676
187566
  const actionRef = arkmeTimelineMessageActionRef(item);
186677
187567
  closeMessageMenu();
186678
187568
  if (source === void 0 || actionRef === "") return;
186679
- if (recordReeditComposerRef.current !== void 0) {
187569
+ if (activeRecordReeditComposer !== void 0) {
186680
187570
  showMessageActionStatus("请先完成编辑后再进行延展");
186681
187571
  return;
186682
187572
  }
@@ -186689,42 +187579,51 @@ Please report this to https://github.com/markedjs/marked.`, e) {
186689
187579
  textareaRef.current?.focus();
186690
187580
  });
186691
187581
  }, [
187582
+ activeRecordReeditComposer,
186692
187583
  closeMessageMenu,
186693
187584
  showMessageActionStatus,
186694
187585
  source
186695
187586
  ]);
186696
187587
  const closeRecordReedit = (0, react.useCallback)(async () => {
186697
187588
  const target = recordReeditComposerRef.current;
186698
- if (target === void 0 || target.busy) return;
187589
+ if (target === void 0 || target.busy || preparationJobs.current.has(arkmeRecordReeditPreparationKey(target))) return;
186699
187590
  setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, target) ? {
186700
187591
  ...current,
186701
187592
  busy: true,
186702
187593
  error: ""
186703
187594
  } : current);
186704
187595
  try {
186705
- await persistRecordReeditDraft(target);
186706
- if (!sameArkmeRecordReeditSession(recordReeditComposerRef.current, target)) return;
186707
- recordReeditGenerationRef.current += 1;
186708
- setRecordReeditComposer(void 0);
186709
- requestAnimationFrame(() => {
186710
- textareaRef.current?.focus();
186711
- });
187596
+ if (target.snapshot !== void 0 && !await persistRecordReeditDraft(target)) {
187597
+ updateRecordReeditCandidate(target, (current) => ({
187598
+ ...current,
187599
+ busy: false
187600
+ }));
187601
+ return;
187602
+ }
187603
+ const active = sameArkmeRecordReeditSession(recordReeditComposerRef.current, target);
187604
+ updateRecordReeditCandidate(target, () => void 0);
187605
+ if (active) {
187606
+ recordReeditGenerationRef.current += 1;
187607
+ requestAnimationFrame(() => {
187608
+ textareaRef.current?.focus();
187609
+ });
187610
+ }
186712
187611
  } catch (caught) {
186713
- setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, target) ? {
187612
+ updateRecordReeditCandidate(target, (current) => ({
186714
187613
  ...current,
186715
187614
  busy: false,
186716
- error: errorMessage$2(caught) || "草稿保存失败,请重试"
186717
- } : current);
187615
+ ...arkmeRecordReeditFailure(caught)
187616
+ }));
186718
187617
  }
186719
- }, [persistRecordReeditDraft]);
187618
+ }, [persistRecordReeditDraft, updateRecordReeditCandidate]);
186720
187619
  const commitRecordReedit = (0, react.useCallback)(async () => {
186721
187620
  const target = recordReeditComposerRef.current;
186722
187621
  const targetSource = source;
186723
- if (target === void 0 || target.snapshot === void 0 || target.loading || target.busy || targetSource === void 0) return;
187622
+ if (target === void 0 || target.snapshot === void 0 || target.loading || target.busy || targetSource === void 0 || preparationJobs.current.has(arkmeRecordReeditPreparationKey(target)) || target.persisted.exclusive || target.sourceKey !== arkmeSourceIdentityKey(targetSource) || target.accountKey !== arkmeAuthenticatedAccountKey(arkmeAuthStore.getSnapshot().auth)) return;
186724
187623
  const nextTitle = target.title.trim();
186725
187624
  const nextText = (target.snapshot.textFormat ?? target.item.textFormat) === "markdown" ? target.textContent : target.textContent.trim();
186726
187625
  const supportsTitle = target.snapshot.displayKind === 1;
186727
- if (nextText.trim() === "" || supportsTitle && nextTitle === "") {
187626
+ if (nextText.trim() === "" && target.attachments.length === 0 && !target.snapshot.hasVoice || supportsTitle && nextTitle === "") {
186728
187627
  setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, target) ? {
186729
187628
  ...current,
186730
187629
  error: "请输入完整内容"
@@ -186738,94 +187637,172 @@ Please report this to https://github.com/markedjs/marked.`, e) {
186738
187637
  } : current);
186739
187638
  return;
186740
187639
  }
186741
- recordReeditCommitGenerationRef.current = target.generation;
187640
+ target.persisted.exclusive = true;
186742
187641
  setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, target) ? {
186743
187642
  ...current,
186744
187643
  busy: true,
186745
187644
  error: ""
186746
187645
  } : current);
186747
187646
  try {
186748
- await recordReeditDraftSaveTailRef.current;
186749
- const result = await callArkme("source.record-reedit.update", {
187647
+ await persistRecordReeditDraft(target, true);
187648
+ await target.persisted.saveTail;
187649
+ if (target.accountKey !== arkmeAuthenticatedAccountKey(arkmeAuthStore.getSnapshot().auth)) return;
187650
+ const result = await callArkme("source.record-reedit.submit", {
186750
187651
  sourceRef: target.sourceRef,
186751
187652
  itemUid: target.item.itemUid,
186752
187653
  newText: nextText,
186753
- expectedVersion: target.snapshot.version,
187654
+ expectedVersion: target.snapshot.draft?.baseVersion ?? target.snapshot.version,
187655
+ expectedDraftRevision: target.persisted.draftRevision,
187656
+ attachments: target.attachments.map((attachment) => attachment.selection),
186754
187657
  ...supportsTitle ? { newTitle: nextTitle } : {}
186755
187658
  });
186756
- if (!sameArkmeRecordReeditSession(recordReeditComposerRef.current, target)) return;
186757
- setItems((current) => current.map((item) => item.itemUid === result.itemUid ? {
186758
- ...item,
186759
- title: supportsTitle ? nextTitle : target.snapshot.title,
186760
- textContent: nextText,
186761
- version: result.version,
186762
- recordVersion: result.version,
186763
- updateAtMillis: Date.now()
186764
- } : item));
186765
- if (isArkmeSelfWorkspaceSource(targetSource)) arkmeUi.recordChanged();
186766
- recordReeditGenerationRef.current += 1;
186767
- setRecordReeditComposer(void 0);
186768
- if (recordReeditHighlightTimerRef.current !== void 0) window.clearTimeout(recordReeditHighlightTimerRef.current);
186769
- setHighlightedTargetUid("");
186770
- setRecordReeditHighlightUid(result.itemUid);
186771
- recordReeditHighlightTimerRef.current = window.setTimeout(() => {
186772
- recordReeditHighlightTimerRef.current = void 0;
186773
- setRecordReeditHighlightUid((current) => current === result.itemUid ? "" : current);
186774
- }, ARKME_RECORD_REEDIT_HIGHLIGHT_MILLIS);
186775
- requestAnimationFrame(() => {
186776
- textareaRef.current?.focus();
186777
- });
187659
+ const active = sameArkmeRecordReeditSession(recordReeditComposerRef.current, target) && target.accountKey === arkmeAuthenticatedAccountKey(arkmeAuthStore.getSnapshot().auth) && recordReeditGenerationRef.current === target.generation;
187660
+ reeditSubmissions.accepted(result);
187661
+ updateRecordReeditCandidate(target, () => void 0);
187662
+ if (active) {
187663
+ recordReeditGenerationRef.current += 1;
187664
+ requestAnimationFrame(() => {
187665
+ textareaRef.current?.focus();
187666
+ });
187667
+ }
186778
187668
  } catch (caught) {
187669
+ updateRecordReeditCandidate(target, (current) => ({
187670
+ ...current,
187671
+ busy: false,
187672
+ ...arkmeRecordReeditFailure(caught)
187673
+ }));
187674
+ } finally {
187675
+ target.persisted.exclusive = false;
187676
+ updateRecordReeditCandidate(target, (current) => current.busy ? {
187677
+ ...current,
187678
+ busy: false
187679
+ } : current);
187680
+ }
187681
+ }, [
187682
+ persistRecordReeditDraft,
187683
+ source,
187684
+ reeditSubmissions.accepted,
187685
+ updateRecordReeditCandidate
187686
+ ]);
187687
+ const recoverRecordReedit = (0, react.useCallback)(async () => {
187688
+ const target = recordReeditComposerRef.current;
187689
+ if (target === void 0 || target.busy || !target.recoveryConfirmation || preparationJobs.current.has(arkmeRecordReeditPreparationKey(target)) || target.persisted.exclusive) return;
187690
+ const sameTarget = () => {
187691
+ const selected = arkmeUi.getSnapshot().selectedSource;
187692
+ return selected !== void 0 && arkmeSourceIdentityKey(selected) === target.sourceKey && arkmeAuthenticatedAccountKey(arkmeAuthStore.getSnapshot().auth) === target.accountKey && sameArkmeRecordReeditSession(recordReeditComposerRef.current, target) && recordReeditGenerationRef.current === target.generation;
187693
+ };
187694
+ if (!sameTarget()) return;
187695
+ target.persisted.exclusive = true;
187696
+ setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, target) ? {
187697
+ ...current,
187698
+ busy: true,
187699
+ error: ""
187700
+ } : current);
187701
+ try {
187702
+ await target.persisted.saveTail;
187703
+ if (!sameTarget()) return;
187704
+ let snapshot = await callArkme("source.record-reedit.detail", {
187705
+ sourceRef: target.sourceRef,
187706
+ itemUid: target.item.itemUid
187707
+ });
187708
+ if (!sameTarget()) return;
187709
+ const draftChanged = (snapshot.draft?.draftRevision ?? 0) !== target.persisted.draftRevision;
187710
+ if (target.conflict !== "draft" && !draftChanged && snapshot.draft !== void 0) {
187711
+ await callArkme("source.record-reedit.draft.delete", {
187712
+ sourceRef: target.sourceRef,
187713
+ itemUid: target.item.itemUid,
187714
+ expectedDraftRevision: target.persisted.draftRevision
187715
+ });
187716
+ if (!sameTarget()) return;
187717
+ snapshot = await callArkme("source.record-reedit.detail", {
187718
+ sourceRef: target.sourceRef,
187719
+ itemUid: target.item.itemUid
187720
+ });
187721
+ }
187722
+ if (!sameTarget()) return;
187723
+ const title = snapshot.draft?.title ?? snapshot.title;
187724
+ const textContent = snapshot.draft?.textContent ?? snapshot.textContent;
187725
+ const attachments = snapshot.draft?.attachments ?? snapshot.attachments ?? [];
186779
187726
  setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, target) ? {
186780
187727
  ...current,
187728
+ snapshot,
187729
+ title,
187730
+ textContent,
187731
+ attachments,
187732
+ persisted: {
187733
+ candidateKey: arkmeRecordReeditCandidateKey(title, textContent, attachments, snapshot.textFormat ?? current.item.textFormat),
187734
+ draftRevision: snapshot.draft?.draftRevision ?? 0,
187735
+ saveTail: Promise.resolve()
187736
+ },
186781
187737
  busy: false,
186782
- error: errorMessage$2(caught)
187738
+ conflict: void 0,
187739
+ recoveryConfirmation: false,
187740
+ error: draftChanged ? "已重新载入其他入口更新的草稿,请检查后再决定是否放弃" : ""
187741
+ } : current);
187742
+ setDraftPreview(void 0);
187743
+ } catch (caught) {
187744
+ if (sameTarget()) setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, target) ? {
187745
+ ...current,
187746
+ busy: false,
187747
+ ...arkmeRecordReeditFailure(caught)
186783
187748
  } : current);
186784
187749
  } finally {
186785
- if (recordReeditCommitGenerationRef.current === target.generation) recordReeditCommitGenerationRef.current = void 0;
187750
+ target.persisted.exclusive = false;
187751
+ updateRecordReeditCandidate(target, (current) => current.busy ? {
187752
+ ...current,
187753
+ busy: false
187754
+ } : current);
186786
187755
  }
186787
- }, [source]);
187756
+ }, [updateRecordReeditCandidate]);
186788
187757
  const openRecordReedit = (0, react.useCallback)(async (item) => {
186789
187758
  closeMessageMenu();
186790
187759
  if (source === void 0 || !arkmeCanReeditTimelineMessage(item)) return;
187760
+ const submission = reeditSubmissions.jobs.find((job) => job.itemUid === item.itemUid);
187761
+ if (submission && [
187762
+ "pending",
187763
+ "committing",
187764
+ "uncertain"
187765
+ ].includes(submission.state)) {
187766
+ showMessageActionStatus("这条快记仍在保存或核对,请稍后再编辑;其他消息不受影响");
187767
+ return;
187768
+ }
186791
187769
  const previous = recordReeditComposerRef.current;
186792
187770
  if (previous !== void 0) {
186793
- if (previous.busy) return;
186794
- if (previous.sourceRef === source.sourceRef && previous.item.itemUid === item.itemUid) {
187771
+ if (previous.accountKey === authenticatedAccountKey && previous.sourceKey === arkmeSourceIdentityKey(source) && previous.item.itemUid === item.itemUid) {
186795
187772
  requestAnimationFrame(() => {
186796
187773
  textareaRef.current?.focus();
186797
187774
  });
186798
187775
  return;
186799
187776
  }
186800
- setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, previous) ? {
186801
- ...current,
186802
- busy: true,
186803
- error: ""
186804
- } : current);
186805
- try {
186806
- await persistRecordReeditDraft(previous);
186807
- } catch (caught) {
186808
- setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, previous) ? {
186809
- ...current,
186810
- busy: false,
186811
- error: errorMessage$2(caught) || "草稿保存失败,请重试"
186812
- } : current);
186813
- return;
186814
- }
186815
- if (!sameArkmeRecordReeditSession(recordReeditComposerRef.current, previous)) return;
187777
+ persistRecordReeditBeforeContextExit(previous, () => true);
186816
187778
  }
186817
187779
  const generation = ++recordReeditGenerationRef.current;
186818
- const target = {
187780
+ const retained = findRecordReeditCandidate({
187781
+ accountKey: authenticatedAccountKey,
187782
+ sourceKey: arkmeSourceIdentityKey(source),
187783
+ sourceRef: source.sourceRef
187784
+ }, item.itemUid);
187785
+ const target = retained === void 0 ? {
186819
187786
  generation,
187787
+ accountKey: authenticatedAccountKey,
187788
+ sourceKey: arkmeSourceIdentityKey(source),
186820
187789
  sourceRef: source.sourceRef,
186821
187790
  item,
186822
187791
  snapshot: void 0,
186823
187792
  title: item.title,
186824
187793
  textContent: item.textContent,
186825
- persistedCandidateKey: arkmeRecordReeditCandidateKey(item.title, item.textContent, item.textFormat),
187794
+ attachments: [],
187795
+ persisted: {
187796
+ candidateKey: arkmeRecordReeditCandidateKey(item.title, item.textContent, [], item.textFormat),
187797
+ draftRevision: 0,
187798
+ saveTail: Promise.resolve()
187799
+ },
186826
187800
  loading: true,
186827
187801
  busy: false,
186828
187802
  error: ""
187803
+ } : {
187804
+ ...retained,
187805
+ generation
186829
187806
  };
186830
187807
  setComposerExtensionTarget(void 0);
186831
187808
  setAddMenuOpen(false);
@@ -186836,6 +187813,12 @@ Please report this to https://github.com/markedjs/marked.`, e) {
186836
187813
  setDraftPreview(void 0);
186837
187814
  setDrawer(void 0);
186838
187815
  setRecordReeditComposer(target);
187816
+ if (retained !== void 0) {
187817
+ requestAnimationFrame(() => {
187818
+ textareaRef.current?.focus();
187819
+ });
187820
+ return;
187821
+ }
186839
187822
  try {
186840
187823
  const snapshot = await callArkme("source.record-reedit.detail", {
186841
187824
  sourceRef: source.sourceRef,
@@ -186844,12 +187827,18 @@ Please report this to https://github.com/markedjs/marked.`, e) {
186844
187827
  if (recordReeditGenerationRef.current !== generation) return;
186845
187828
  const title = snapshot.draft?.title ?? snapshot.title;
186846
187829
  const textContent = snapshot.draft?.textContent ?? snapshot.textContent;
187830
+ const attachments = snapshot.draft?.attachments ?? snapshot.attachments ?? [];
186847
187831
  setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, target) ? {
186848
187832
  ...current,
186849
187833
  snapshot,
186850
187834
  title,
186851
187835
  textContent,
186852
- persistedCandidateKey: arkmeRecordReeditCandidateKey(title, textContent, snapshot.textFormat ?? item.textFormat),
187836
+ attachments,
187837
+ persisted: {
187838
+ candidateKey: arkmeRecordReeditCandidateKey(title, textContent, attachments, snapshot.textFormat ?? item.textFormat),
187839
+ draftRevision: snapshot.draft?.draftRevision ?? 0,
187840
+ saveTail: Promise.resolve()
187841
+ },
186853
187842
  loading: false
186854
187843
  } : current);
186855
187844
  if (snapshot.draft !== void 0) showMessageActionStatus("已恢复本机重新编辑草稿");
@@ -186865,10 +187854,13 @@ Please report this to https://github.com/markedjs/marked.`, e) {
186865
187854
  } : current);
186866
187855
  }
186867
187856
  }, [
187857
+ authenticatedAccountKey,
186868
187858
  closeMessageMenu,
186869
- persistRecordReeditDraft,
187859
+ persistRecordReeditBeforeContextExit,
187860
+ findRecordReeditCandidate,
186870
187861
  showMessageActionStatus,
186871
- source
187862
+ source,
187863
+ reeditSubmissions.jobs
186872
187864
  ]);
186873
187865
  const closeMessageSnapshot = (0, react.useCallback)(() => {
186874
187866
  snapshotRequestRef.current?.abort();
@@ -187189,7 +188181,11 @@ Please report this to https://github.com/markedjs/marked.`, e) {
187189
188181
  const openForwardTargetPicker = (0, react.useCallback)((itemsToForward = selectedMessageItems) => {
187190
188182
  if (!activeConversationRef.current) return;
187191
188183
  closeMessageMenu();
187192
- const forwardableItems = itemsToForward.filter((item) => arkmeTimelineMessageActionRef(item) !== "");
188184
+ const savedItems = itemsToForward.map((item) => {
188185
+ const saved = items.find((value) => arkmeTimelineOccurrenceKey(value) === arkmeTimelineOccurrenceKey(item));
188186
+ return saved && projectRecordReedit(saved, reeditSubmissions.jobs) !== saved ? saved : item;
188187
+ });
188188
+ const forwardableItems = savedItems.filter((item) => arkmeTimelineMessageActionRef(item) !== "");
187193
188189
  if (source === void 0 || forwardableItems.length === 0) {
187194
188190
  showMessageActionStatus("请选择要转发的快记");
187195
188191
  return;
@@ -187198,6 +188194,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
187198
188194
  showMessageActionStatus("最多选择 100 条快记");
187199
188195
  return;
187200
188196
  }
188197
+ if (savedItems.some((saved, index) => saved !== itemsToForward[index])) showMessageActionStatus("转发使用已保存内容,请核对预览;尚未同步的编辑不参与转发");
187201
188198
  const initialTargets = arkmeForwardableTargetSources(arkmeChatDirectory.getSnapshot().sources, selfSources, aggregateSource);
187202
188199
  const sourceKey = conversationKey;
187203
188200
  setForwardTargetPicker({
@@ -187250,19 +188247,27 @@ Please report this to https://github.com/markedjs/marked.`, e) {
187250
188247
  aggregateSource,
187251
188248
  closeMessageMenu,
187252
188249
  conversationKey,
188250
+ items,
188251
+ reeditSubmissions.jobs,
187253
188252
  selectedMessageItems,
187254
188253
  selfSources,
187255
188254
  showMessageActionStatus,
187256
188255
  source
187257
188256
  ]);
187258
- const toggleForwardTarget = (0, react.useCallback)((target) => {
188257
+ const toggleForwardTarget = (0, react.useCallback)(async (target) => {
187259
188258
  if (forwardTargetPicker === void 0 || messageActionBusy === "forward") return;
187260
188259
  const selected = forwardTargetPicker.selectedSourceRefs.includes(target.sourceRef);
188260
+ if (!selected && target.directMessageAdmissionApplicable === true) try {
188261
+ await requireDirectMessageSendAllowed(target);
188262
+ } catch (error) {
188263
+ showMessageActionStatus(errorMessage$2(error));
188264
+ return;
188265
+ }
187261
188266
  if (!selected && forwardTargetPicker.selectedSourceRefs.length >= MAX_FORWARD_TARGET_SELECTION) {
187262
188267
  showMessageActionStatus(`最多选择 ${String(MAX_FORWARD_TARGET_SELECTION)} 个转发对象`);
187263
188268
  return;
187264
188269
  }
187265
- setForwardTargetPicker({
188270
+ setForwardTargetPicker((current) => current !== forwardTargetPicker ? current : {
187266
188271
  ...forwardTargetPicker,
187267
188272
  selectedSourceRefs: selected ? forwardTargetPicker.selectedSourceRefs.filter((sourceRef) => sourceRef !== target.sourceRef) : [...forwardTargetPicker.selectedSourceRefs, target.sourceRef]
187268
188273
  });
@@ -187290,17 +188295,20 @@ Please report this to https://github.com/markedjs/marked.`, e) {
187290
188295
  sendError: ""
187291
188296
  });
187292
188297
  try {
187293
- const results = await Promise.allSettled(targetSources.map(async (targetSource) => ({
187294
- targetSource,
187295
- result: await callArkme("source.forward-messages", {
187296
- sourceRef,
187297
- targetSourceRef: targetSource.sourceRef,
187298
- actionRefs,
187299
- recordUid: crypto.randomUUID(),
187300
- relationUid: crypto.randomUUID(),
187301
- ...normalizedCommentText === "" ? {} : { commentText: normalizedCommentText }
187302
- }, controller.signal)
187303
- })));
188298
+ const results = await Promise.allSettled(targetSources.map(async (targetSource) => {
188299
+ await requireDirectMessageSendAllowed(targetSource, controller.signal);
188300
+ return {
188301
+ targetSource,
188302
+ result: await callArkme("source.forward-messages", {
188303
+ sourceRef,
188304
+ targetSourceRef: targetSource.sourceRef,
188305
+ actionRefs,
188306
+ recordUid: crypto.randomUUID(),
188307
+ relationUid: crypto.randomUUID(),
188308
+ ...normalizedCommentText === "" ? {} : { commentText: normalizedCommentText }
188309
+ }, controller.signal)
188310
+ };
188311
+ }));
187304
188312
  if (activeSourceKeyRef.current !== sourceKey) return;
187305
188313
  let successCount = 0;
187306
188314
  let failureCount = 0;
@@ -187436,7 +188444,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
187436
188444
  const utilityContentVisible = authView === "content" && (ui.mode === "recordings" || ui.mode === "world" || ui.mode === "search" || ui.mode === "extensions" || ui.mode === "voiceprint" || ui.mode === "calls");
187437
188445
  const conversationOverlayHost = panelRef.current;
187438
188446
  const composerPlaceholder = arkmeComposerPlaceholderText(arkmeComposerPlaceholderTargetForSource(selectedSource, conversationMembers.length));
187439
- const effectiveComposerPlaceholder = activeRecordReeditComposer !== void 0 ? activeRecordReeditComposer.loading ? "正在读取快记和草稿…" : "重新编辑快记…" : activeComposerExtensionTarget === void 0 ? composerPlaceholder : `发送到「${source?.displayName ?? ""}」…`;
188447
+ const effectiveComposerPlaceholder = activeRecordReeditComposer !== void 0 ? activeRecordReeditComposer.loading ? "正在读取快记和草稿…" : "重新编辑快记…" : directAdmission.blocked ? directAdmission.message : activeComposerExtensionTarget === void 0 ? composerPlaceholder : `发送到「${source?.displayName ?? ""}」…`;
187440
188448
  const activeComposerTargetItem = activeRecordReeditComposer === void 0 ? activeComposerExtensionTarget?.item : {
187441
188449
  ...activeRecordReeditComposer.item,
187442
188450
  title: activeRecordReeditComposer.snapshot?.title ?? activeRecordReeditComposer.item.title,
@@ -187718,81 +188726,119 @@ Please report this to https://github.com/markedjs/marked.`, e) {
187718
188726
  onMouseDown: (event) => {
187719
188727
  event.stopPropagation();
187720
188728
  },
187721
- children: [shouldShowRelatedRecordingsEntry(authenticated, source?.kind, relatedEligibility, relatedPanelOpen) ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
187722
- type: "button",
187723
- role: "menuitem",
187724
- style: ARKME_CONVERSATION_SETTINGS_MENU_ROW_STYLE,
187725
- onMouseEnter: (event) => {
187726
- event.currentTarget.style.background = arkmeTheme.subtle;
187727
- },
187728
- onMouseLeave: (event) => {
187729
- event.currentTarget.style.background = "transparent";
187730
- },
187731
- onClick: openRelatedPanel,
187732
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$7, {
187733
- size: 20,
187734
- "aria-hidden": true
187735
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "相关录音" })]
187736
- }) : relatedEligibility === "error" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
187737
- type: "button",
187738
- role: "menuitem",
187739
- style: ARKME_CONVERSATION_SETTINGS_MENU_ROW_STYLE,
187740
- onMouseEnter: (event) => {
187741
- event.currentTarget.style.background = arkmeTheme.subtle;
187742
- },
187743
- onMouseLeave: (event) => {
187744
- event.currentTarget.style.background = "transparent";
187745
- },
187746
- onClick: ensureRelatedEligibility,
187747
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$7, {
187748
- size: 20,
187749
- "aria-hidden": true
187750
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "重新检查相关录音" })]
187751
- }) : relatedEligibility === "denied" && canManageUserBan ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
187752
- role: "status",
187753
- style: ARKME_CONVERSATION_SETTINGS_MENU_STATUS_STYLE,
187754
- children: relatedEligibility === "denied" ? "当前没有可用操作" : "正在检查相关录音…"
187755
- }), canManageUserBan && userBanState === "ready" && userBanSnapshot !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
187756
- type: "button",
187757
- role: "menuitem",
187758
- style: ARKME_CONVERSATION_SETTINGS_MENU_ROW_STYLE,
187759
- disabled: userBanBusy,
187760
- onMouseEnter: (event) => {
187761
- event.currentTarget.style.background = arkmeTheme.subtle;
187762
- },
187763
- onMouseLeave: (event) => {
187764
- event.currentTarget.style.background = "transparent";
187765
- },
187766
- onClick: () => {
187767
- changeUserBanState();
187768
- },
187769
- children: [userBanSnapshot.banned ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$6, {
187770
- size: 20,
187771
- "aria-hidden": true
187772
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(m$5, {
187773
- size: 20,
187774
- "aria-hidden": true
187775
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: userBanSnapshot.banned ? "解封用户" : "封禁用户" })]
187776
- }) : canManageUserBan && userBanState === "error" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
187777
- type: "button",
187778
- role: "menuitem",
187779
- style: ARKME_CONVERSATION_SETTINGS_MENU_ROW_STYLE,
187780
- onMouseEnter: (event) => {
187781
- event.currentTarget.style.background = arkmeTheme.subtle;
187782
- },
187783
- onMouseLeave: (event) => {
187784
- event.currentTarget.style.background = "transparent";
187785
- },
187786
- onClick: ensureUserBanStatus,
187787
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(m$5, {
187788
- size: 20,
187789
- "aria-hidden": true
187790
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "重新检查封禁状态" })]
187791
- }) : canManageUserBan ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
187792
- role: "status",
187793
- style: ARKME_CONVERSATION_SETTINGS_MENU_STATUS_STYLE,
187794
- children: "正在检查封禁状态…"
187795
- }) : null]
188729
+ children: [
188730
+ shouldShowRelatedRecordingsEntry(authenticated, source?.kind, relatedEligibility, relatedPanelOpen) ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
188731
+ type: "button",
188732
+ role: "menuitem",
188733
+ style: ARKME_CONVERSATION_SETTINGS_MENU_ROW_STYLE,
188734
+ onMouseEnter: (event) => {
188735
+ event.currentTarget.style.background = arkmeTheme.subtle;
188736
+ },
188737
+ onMouseLeave: (event) => {
188738
+ event.currentTarget.style.background = "transparent";
188739
+ },
188740
+ onClick: openRelatedPanel,
188741
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$7, {
188742
+ size: 20,
188743
+ "aria-hidden": true
188744
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "相关录音" })]
188745
+ }) : relatedEligibility === "error" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
188746
+ type: "button",
188747
+ role: "menuitem",
188748
+ style: ARKME_CONVERSATION_SETTINGS_MENU_ROW_STYLE,
188749
+ onMouseEnter: (event) => {
188750
+ event.currentTarget.style.background = arkmeTheme.subtle;
188751
+ },
188752
+ onMouseLeave: (event) => {
188753
+ event.currentTarget.style.background = "transparent";
188754
+ },
188755
+ onClick: ensureRelatedEligibility,
188756
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$7, {
188757
+ size: 20,
188758
+ "aria-hidden": true
188759
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "重新检查相关录音" })]
188760
+ }) : relatedEligibility === "denied" && (canManageUserBan || directAdmission.applicable) ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
188761
+ role: "status",
188762
+ style: ARKME_CONVERSATION_SETTINGS_MENU_STATUS_STYLE,
188763
+ children: relatedEligibility === "denied" ? "当前没有可用操作" : "正在检查相关录音…"
188764
+ }),
188765
+ directAdmission.applicable && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
188766
+ type: "button",
188767
+ role: "menuitemcheckbox",
188768
+ "aria-checked": directAdmission.admission === void 0 ? "mixed" : directAdmission.admission.ownRefused,
188769
+ "aria-busy": directAdmission.busy,
188770
+ title: directAdmission.error || void 0,
188771
+ style: ARKME_CONVERSATION_SETTINGS_MENU_ROW_STYLE,
188772
+ disabled: directAdmission.busy || directAdmission.admission !== void 0 && !directAdmission.admission.ownRefused && !directAdmission.admission.refusalCreationEnabled,
188773
+ onMouseEnter: (event) => {
188774
+ event.currentTarget.style.background = arkmeTheme.subtle;
188775
+ },
188776
+ onMouseLeave: (event) => {
188777
+ event.currentTarget.style.background = "transparent";
188778
+ },
188779
+ onClick: () => {
188780
+ directAdmission.toggle(() => window.confirm("拒收对方消息?\n拒收后你们都无法发送新消息;聊天记录保留,你可以随时解除拒收。"));
188781
+ },
188782
+ children: [
188783
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(s$5, {
188784
+ size: 20,
188785
+ "aria-hidden": true
188786
+ }),
188787
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "拒收对方消息" }),
188788
+ directAdmission.admission?.ownRefused === true && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$6, {
188789
+ size: 16,
188790
+ style: { marginLeft: "auto" },
188791
+ "aria-hidden": true
188792
+ })
188793
+ ]
188794
+ }),
188795
+ directAdmission.applicable && directAdmission.error !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
188796
+ role: "status",
188797
+ style: ARKME_CONVERSATION_SETTINGS_MENU_STATUS_STYLE,
188798
+ children: directAdmission.error
188799
+ }),
188800
+ canManageUserBan && userBanState === "ready" && userBanSnapshot !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
188801
+ type: "button",
188802
+ role: "menuitem",
188803
+ style: ARKME_CONVERSATION_SETTINGS_MENU_ROW_STYLE,
188804
+ disabled: userBanBusy,
188805
+ onMouseEnter: (event) => {
188806
+ event.currentTarget.style.background = arkmeTheme.subtle;
188807
+ },
188808
+ onMouseLeave: (event) => {
188809
+ event.currentTarget.style.background = "transparent";
188810
+ },
188811
+ onClick: () => {
188812
+ changeUserBanState();
188813
+ },
188814
+ children: [userBanSnapshot.banned ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$5, {
188815
+ size: 20,
188816
+ "aria-hidden": true
188817
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(m$5, {
188818
+ size: 20,
188819
+ "aria-hidden": true
188820
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: userBanSnapshot.banned ? "解封用户" : "封禁用户" })]
188821
+ }) : canManageUserBan && userBanState === "error" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
188822
+ type: "button",
188823
+ role: "menuitem",
188824
+ style: ARKME_CONVERSATION_SETTINGS_MENU_ROW_STYLE,
188825
+ onMouseEnter: (event) => {
188826
+ event.currentTarget.style.background = arkmeTheme.subtle;
188827
+ },
188828
+ onMouseLeave: (event) => {
188829
+ event.currentTarget.style.background = "transparent";
188830
+ },
188831
+ onClick: ensureUserBanStatus,
188832
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(m$5, {
188833
+ size: 20,
188834
+ "aria-hidden": true
188835
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "重新检查封禁状态" })]
188836
+ }) : canManageUserBan ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
188837
+ role: "status",
188838
+ style: ARKME_CONVERSATION_SETTINGS_MENU_STATUS_STYLE,
188839
+ children: "正在检查封禁状态…"
188840
+ }) : null
188841
+ ]
187796
188842
  })
187797
188843
  }), conversationOverlayHost)
187798
188844
  ]
@@ -188108,6 +189154,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
188108
189154
  }),
188109
189155
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeMessageContent, {
188110
189156
  item,
189157
+ mediaSelectionIsExplicit: reeditItems.has(item),
188111
189158
  sourceRef: source.sourceRef,
188112
189159
  highlightMentions: true,
188113
189160
  shareWebsite,
@@ -188129,6 +189176,32 @@ Please report this to https://github.com/markedjs/marked.`, e) {
188129
189176
  }
188130
189177
  }, `message-content:${conversationOverlayKey}`),
188131
189178
  !isSharedRecordingCard && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeTimelineAgentSourceBadge, { item }),
189179
+ reeditSubmissions.jobs.filter((job) => job.itemUid === item.itemUid && (job.state === "failed" || job.state === "uncertain")).map((job) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
189180
+ role: "status",
189181
+ "aria-label": "重新编辑保存状态",
189182
+ style: styles$6.polishMeta,
189183
+ children: [
189184
+ job.state === "failed" ? `保存失败:${job.error ?? "请恢复编辑后重试"}` : "保存结果待确认",
189185
+ job.state === "failed" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
189186
+ type: "button",
189187
+ style: styles$6.retry,
189188
+ onClick: (event) => {
189189
+ event.stopPropagation();
189190
+ openRecordReedit(item);
189191
+ },
189192
+ children: "恢复编辑"
189193
+ }),
189194
+ job.state === "uncertain" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
189195
+ type: "button",
189196
+ style: styles$6.retry,
189197
+ onClick: (event) => {
189198
+ event.stopPropagation();
189199
+ reeditSubmissions.refresh(true).catch((caught) => setError(errorMessage$2(caught)));
189200
+ },
189201
+ children: "核对结果"
189202
+ })
189203
+ ]
189204
+ }, job.submissionId)),
188132
189205
  fileTasks.tasks.filter((task) => (task.result?.itemUid ?? task.recordUid) === item.itemUid && task.state !== "sent" && fileTaskShowsInlineStatus(task)).map((task) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
188133
189206
  role: "status",
188134
189207
  style: {
@@ -188137,7 +189210,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
188137
189210
  },
188138
189211
  children: [
188139
189212
  task.error ?? (task.state === "sending" ? "正在发送…" : task.state === "queued" ? "等待上传" : "正在上传"),
188140
- task.state === "failed" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
189213
+ task.state === "failed" && task.retryable !== false && !directAdmission.blocked && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
188141
189214
  type: "button",
188142
189215
  onClick: (event) => {
188143
189216
  event.stopPropagation();
@@ -188385,13 +189458,13 @@ Please report this to https://github.com/markedjs/marked.`, e) {
188385
189458
  className: "arkme-conversation-composer",
188386
189459
  style: styles$6.composer,
188387
189460
  onDragOver: (event) => {
188388
- if (!preparingFiles && Array.from(event.dataTransfer.types).includes("Files")) {
189461
+ if (!composerFileAddingDisabled && Array.from(event.dataTransfer.types).includes("Files")) {
188389
189462
  event.preventDefault();
188390
189463
  event.dataTransfer.dropEffect = "copy";
188391
189464
  }
188392
189465
  },
188393
189466
  onDrop: (event) => {
188394
- if (!preparingFiles && event.dataTransfer.files.length > 0) {
189467
+ if (!composerFileAddingDisabled && event.dataTransfer.files.length > 0) {
188395
189468
  event.preventDefault();
188396
189469
  selectFiles(event.dataTransfer.files);
188397
189470
  }
@@ -188421,6 +189494,34 @@ Please report this to https://github.com/markedjs/marked.`, e) {
188421
189494
  style: styles$6.error,
188422
189495
  children: activeRecordReeditComposer.error
188423
189496
  }),
189497
+ activeRecordReeditComposer !== void 0 && (activeRecordReeditComposer.conflict !== void 0 || activeRecordReeditComposer.snapshot?.draft !== void 0 && activeRecordReeditComposer.snapshot.draft.baseVersion !== void 0 && activeRecordReeditComposer.snapshot.draft.baseVersion !== activeRecordReeditComposer.snapshot.version) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
189498
+ type: "button",
189499
+ style: styles$6.retry,
189500
+ disabled: composerFilesDisabled,
189501
+ "aria-label": activeRecordReeditComposer.conflict === "draft" ? "重新载入草稿" : "放弃草稿并重新载入",
189502
+ onClick: () => setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, activeRecordReeditComposer) ? {
189503
+ ...current,
189504
+ recoveryConfirmation: true
189505
+ } : current),
189506
+ children: activeRecordReeditComposer.conflict === "draft" ? "重新载入草稿" : "放弃草稿并重新载入"
189507
+ }),
189508
+ activeRecordReeditComposer?.recoveryConfirmation && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeConfirmDialog, {
189509
+ titleId: "arkme-reedit-recovery-title",
189510
+ title: activeRecordReeditComposer.conflict === "draft" ? "重新载入最新草稿?" : "放弃草稿并重新载入?",
189511
+ description: activeRecordReeditComposer.conflict === "draft" ? "当前输入区将替换为其他入口保存的最新草稿。不会删除草稿或修改已保存的快记。" : "本机这份重新编辑草稿中的正文和附件改动将被放弃,重新载入已保存的快记。此操作不会删除线上附件。",
189512
+ busy: activeRecordReeditComposer.busy,
189513
+ error: activeRecordReeditComposer.error,
189514
+ confirmTone: activeRecordReeditComposer.conflict === "draft" ? "primary" : "danger",
189515
+ confirmLabel: activeRecordReeditComposer.conflict === "draft" ? "重新载入" : "放弃并重新载入",
189516
+ busyLabel: "正在重新载入…",
189517
+ onClose: () => setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, activeRecordReeditComposer) && !current.busy ? {
189518
+ ...current,
189519
+ recoveryConfirmation: false
189520
+ } : current),
189521
+ onConfirm: () => {
189522
+ recoverRecordReedit();
189523
+ }
189524
+ }),
188424
189525
  activeComposerTargetItem !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
188425
189526
  style: styles$6.composerExtensionTarget,
188426
189527
  ...activeRecordReeditComposer === void 0 ? { "data-arkme-composer-extension-target": "true" } : { "data-arkme-composer-reedit-target": "true" },
@@ -188458,7 +189559,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
188458
189559
  type: "button",
188459
189560
  style: styles$6.composerExtensionTargetCancel,
188460
189561
  "aria-label": activeRecordReeditComposer === void 0 ? "取消延展" : "关闭重新编辑",
188461
- disabled: activeRecordReeditComposer?.busy === true,
189562
+ disabled: activeRecordReeditComposer?.busy === true || preparingReeditFiles,
188462
189563
  onClick: () => {
188463
189564
  if (activeRecordReeditComposer === void 0) {
188464
189565
  setComposerExtensionTarget(void 0);
@@ -188488,35 +189589,31 @@ Please report this to https://github.com/markedjs/marked.`, e) {
188488
189589
  ref: addMenuRef,
188489
189590
  style: styles$6.addMenu,
188490
189591
  role: "menu",
188491
- children: [
188492
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
188493
- type: "button",
188494
- role: "menuitem",
188495
- style: styles$6.addMenuItem,
188496
- onClick: () => {
188497
- setAddMenuOpen(false);
188498
- fileInputRef.current?.click();
188499
- },
188500
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
188501
- "aria-hidden": true,
188502
- children: "📎"
188503
- }), "添加照片和文件"]
188504
- }),
188505
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { style: styles$6.menuDivider }),
188506
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
188507
- type: "button",
188508
- role: "menuitem",
188509
- style: styles$6.addMenuItem,
188510
- onClick: () => {
188511
- setLongArticleCreating(true);
188512
- setAddMenuOpen(false);
188513
- },
188514
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
188515
- "aria-hidden": true,
188516
- children: "✎"
188517
- }), "写长文"]
188518
- })
188519
- ]
189592
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
189593
+ type: "button",
189594
+ role: "menuitem",
189595
+ style: styles$6.addMenuItem,
189596
+ onClick: () => {
189597
+ setAddMenuOpen(false);
189598
+ fileInputRef.current?.click();
189599
+ },
189600
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
189601
+ "aria-hidden": true,
189602
+ children: "📎"
189603
+ }), "添加照片和文件"]
189604
+ }), activeRecordReeditComposer === void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { style: styles$6.menuDivider }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
189605
+ type: "button",
189606
+ role: "menuitem",
189607
+ style: styles$6.addMenuItem,
189608
+ onClick: () => {
189609
+ setLongArticleCreating(true);
189610
+ setAddMenuOpen(false);
189611
+ },
189612
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
189613
+ "aria-hidden": true,
189614
+ children: "✎"
189615
+ }), "写长文"]
189616
+ })] })]
188520
189617
  }),
188521
189618
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
188522
189619
  ref: fileInputRef,
@@ -188530,21 +189627,61 @@ Please report this to https://github.com/markedjs/marked.`, e) {
188530
189627
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
188531
189628
  className: "arkme-conversation-input-card",
188532
189629
  children: [
188533
- activeRecordReeditComposer === void 0 && attachments.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeAttachmentStrip, {
188534
- attachments,
188535
- disabled: preparingFiles,
188536
- onMove: (from, to) => arkmeComposerDraftStore.moveAttachment(composerDraftKey, from, to),
189630
+ visibleComposerAttachments.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeAttachmentStrip, {
189631
+ attachments: visibleComposerAttachments,
189632
+ disabled: composerFilesDisabled,
189633
+ onMove: (from, to) => {
189634
+ if (composerFilesDisabled) return;
189635
+ if (activeRecordReeditComposer === void 0) arkmeComposerDraftStore.moveAttachment(composerDraftKey, from, to);
189636
+ else setRecordReeditComposer((current) => {
189637
+ if (!sameArkmeRecordReeditSession(current, activeRecordReeditComposer)) return current;
189638
+ const next = [...current.attachments];
189639
+ const attachment = next[from];
189640
+ if (attachment === void 0 || to < 0 || to >= next.length) return current;
189641
+ next.splice(from, 1);
189642
+ next.splice(to, 0, attachment);
189643
+ return {
189644
+ ...current,
189645
+ attachments: next,
189646
+ error: ""
189647
+ };
189648
+ });
189649
+ },
189650
+ canPreview: (attachment) => activeRecordReeditComposer === void 0 ? attachment.localFile !== void 0 : activeRecordReeditComposer.attachments.some((view) => arkmeAttachmentId(view) === arkmeAttachmentId(attachment) && arkmeRecordReeditAttachmentBlock(view) !== void 0),
188537
189651
  onPreview: (attachment) => {
188538
- if (attachment.localFile !== void 0) setDraftPreview(localFileBlock(attachment.localFile));
189652
+ if (activeRecordReeditComposer === void 0) {
189653
+ if (attachment.localFile !== void 0) setDraftPreview(localFileBlock(attachment.localFile));
189654
+ } else {
189655
+ const view = activeRecordReeditComposer.attachments.find((view) => arkmeAttachmentId(view) === arkmeAttachmentId(attachment));
189656
+ if (view !== void 0) setDraftPreview(arkmeRecordReeditAttachmentBlock(view));
189657
+ }
188539
189658
  },
188540
189659
  onRemove: (attachment) => {
189660
+ if (composerFilesDisabled) return;
189661
+ if (activeRecordReeditComposer !== void 0) {
189662
+ setRecordReeditComposer((current) => sameArkmeRecordReeditSession(current, activeRecordReeditComposer) ? {
189663
+ ...current,
189664
+ attachments: current.attachments.filter((view) => arkmeAttachmentId(view) !== arkmeAttachmentId(attachment)),
189665
+ error: ""
189666
+ } : current);
189667
+ setDraftPreview(void 0);
189668
+ return;
189669
+ }
188541
189670
  arkmeComposerDraftStore.removeAttachment(composerDraftKey, arkmeAttachmentId(attachment));
188542
189671
  if (attachment.localFile !== void 0) callArkme("files.local.remove", { fileRef: attachment.localFile.fileRef }).catch((caught) => setError(errorMessage$2(caught)));
188543
189672
  }
188544
189673
  }),
189674
+ activeRecordReeditComposer?.attachments.some((attachment) => attachment.unavailable) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
189675
+ role: "status",
189676
+ style: styles$6.error,
189677
+ children: "部分附件不可用,请移除后重新添加"
189678
+ }),
188545
189679
  activeConversation && draftPreview !== void 0 && typeof document !== "undefined" && (0, react_dom.createPortal)(/* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeMediaPreview, {
188546
189680
  selected: draftPreview,
188547
- blocks: attachments.flatMap((attachment) => attachment.localFile === void 0 ? [] : [localFileBlock(attachment.localFile)]),
189681
+ blocks: activeRecordReeditComposer === void 0 ? attachments.flatMap((attachment) => attachment.localFile === void 0 ? [] : [localFileBlock(attachment.localFile)]) : activeRecordReeditComposer.attachments.flatMap((attachment) => {
189682
+ const block = arkmeRecordReeditAttachmentBlock(attachment);
189683
+ return block === void 0 ? [] : [block];
189684
+ }),
188548
189685
  onSelect: setDraftPreview,
188549
189686
  onClose: () => setDraftPreview(void 0),
188550
189687
  openLocalFile: false
@@ -188666,10 +189803,10 @@ Please report this to https://github.com/markedjs/marked.`, e) {
188666
189803
  maxLength: activeRecordReeditComposer?.snapshot?.maxTextLength ?? 2e4,
188667
189804
  placeholder: effectiveComposerPlaceholder,
188668
189805
  ariaLabel: activeRecordReeditComposer === void 0 ? effectiveComposerPlaceholder : "重新编辑快记",
188669
- disabled: activeRecordReeditComposer === void 0 ? preparingFiles : activeRecordReeditComposer.loading || activeRecordReeditComposer.busy,
188670
- markdown: activeRecordReeditComposer === void 0 ? composerDraft.markdown : void 0,
189806
+ disabled: composerFilesDisabled,
189807
+ markdown: activeRecordReeditComposer === void 0 && !directAdmission.blocked ? composerDraft.markdown : void 0,
188671
189808
  onMarkdownChange: (markdown, text, mentions, emojis) => {
188672
- if (activeRecordReeditComposer === void 0) arkmeComposerDraftStore.setMarkdown(composerDraftKey, markdown, text, mentions, emojis);
189809
+ if (activeRecordReeditComposer === void 0 && !directAdmission.blocked) arkmeComposerDraftStore.setMarkdown(composerDraftKey, markdown, text, mentions, emojis);
188673
189810
  },
188674
189811
  onTextChange: updateComposerText,
188675
189812
  onInputActivity: messagePreparing.input,
@@ -188683,7 +189820,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
188683
189820
  },
188684
189821
  onSelectionChange: updateComposerRichTrigger,
188685
189822
  onPaste: (event) => {
188686
- if (activeRecordReeditComposer !== void 0) return;
189823
+ if (composerFileAddingDisabled) return;
188687
189824
  const files = arkmeClipboardFiles(event.clipboardData);
188688
189825
  if (files.length === 0) return;
188689
189826
  event.preventDefault();
@@ -188764,13 +189901,13 @@ Please report this to https://github.com/markedjs/marked.`, e) {
188764
189901
  "aria-label": "添加内容",
188765
189902
  "aria-haspopup": "menu",
188766
189903
  "aria-expanded": addMenuOpen,
188767
- disabled: preparingFiles || activeRecordReeditComposer !== void 0,
189904
+ disabled: composerFileAddingDisabled,
188768
189905
  onClick: () => {
188769
189906
  setAddMenuOpen((value) => !value);
188770
189907
  },
188771
- children: preparingFiles ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeFilePreparingIndicator, {}) : "+"
189908
+ children: (activeRecordReeditComposer === void 0 ? preparingFiles : preparingReeditFiles) ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeFilePreparingIndicator, {}) : "+"
188772
189909
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeEmojiPicker, {
188773
- disabled: preparingFiles || activeRecordReeditComposer !== void 0,
189910
+ disabled: preparingFiles || directAdmission.blocked || activeRecordReeditComposer !== void 0,
188774
189911
  scopeKey: composerDraftKey,
188775
189912
  ...source?.kind === "private_chat" || source?.kind === "group_chat" ? { sourceRef: source.sourceRef } : {},
188776
189913
  getCaretGeometry: () => textareaRef.current?.getCaretGeometry(),
@@ -189390,6 +190527,8 @@ Please report this to https://github.com/markedjs/marked.`, e) {
189390
190527
  shareWebsite,
189391
190528
  onMessageCopyLinkOpen: openMessageCopyLinkDetail,
189392
190529
  onExtensionSent: acceptDetailExtension,
190530
+ messageCreationBlocked: directAdmission.blocked,
190531
+ messageCreationRestriction: directAdmission.blocked ? directAdmission.message : "",
189393
190532
  onToast: showMessageActionStatus
189394
190533
  }, detailItem.itemUid),
189395
190534
  activeConversation && drawer === "copyLink" && copyLinkDetail !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
@@ -191604,7 +192743,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
191604
192743
  onClick: () => {
191605
192744
  playback.toggle(item.segmentRef, mediaRef);
191606
192745
  },
191607
- children: controlState === "pause" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$4, {
192746
+ children: controlState === "pause" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$3, {
191608
192747
  "aria-hidden": true,
191609
192748
  "data-audio-state-icon": "pause",
191610
192749
  size: 18,
@@ -191615,7 +192754,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
191615
192754
  "data-audio-state-icon": "loading",
191616
192755
  size: 18,
191617
192756
  weight: "bold"
191618
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$5, {
192757
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$4, {
191619
192758
  "aria-hidden": true,
191620
192759
  "data-audio-state-icon": controlState,
191621
192760
  size: 18,
@@ -192295,6 +193434,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
192295
193434
  if (stopped) return;
192296
193435
  if (ownsMessagePreparing) arkmeMessagePreparing.reset();
192297
193436
  reconcileReceipts();
193437
+ invalidateDirectMessageAdmission();
192298
193438
  reconcileArkmeProviderInstance().then(async (changed) => {
192299
193439
  if (!changed || stopped) return;
192300
193440
  try {
@@ -192346,6 +193486,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
192346
193486
  if (update.attentionSummary !== void 0) arkmeAttentionSummary.apply(update.attentionSummary);
192347
193487
  arkmeInterwovenInvalidation.invalidate();
192348
193488
  reconcileReceipts();
193489
+ invalidateDirectMessageAdmission();
192349
193490
  if (update.refresh === "none") return;
192350
193491
  refreshUnread(update.refresh === "force").then(() => {
192351
193492
  if (stopped) return;
@@ -192367,6 +193508,10 @@ Please report this to https://github.com/markedjs/marked.`, e) {
192367
193508
  return;
192368
193509
  }
192369
193510
  if (update.type === "projection-invalidated") {
193511
+ if (update.projection === "chat.direct_message_admission") {
193512
+ invalidateDirectMessageAdmission();
193513
+ return;
193514
+ }
192370
193515
  if (update.projection !== "record") return;
192371
193516
  arkmeInterwovenInvalidation.invalidate();
192372
193517
  arkmeCalendarInvalidations.publishAll();
@@ -192383,6 +193528,18 @@ Please report this to https://github.com/markedjs/marked.`, e) {
192383
193528
  arkmeCalendarInvalidations.publishAll();
192384
193529
  return;
192385
193530
  }
193531
+ if (update.type === "chat-pins-reconciled") {
193532
+ arkmeChatDirectory.reconcilePins(update.pins);
193533
+ return;
193534
+ }
193535
+ if (update.type === "chat-policy-invalidated") {
193536
+ arkmeChatDirectory.invalidateRoot();
193537
+ arkmeChatDirectory.refreshRoot({
193538
+ force: true,
193539
+ silent: true
193540
+ }).catch(() => void 0);
193541
+ return;
193542
+ }
192386
193543
  if (update.type === "conversation-list-preference-invalidated") {
192387
193544
  arkmeUi.chatChanged();
192388
193545
  return;
@@ -193273,7 +194430,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
193273
194430
  }
193274
194431
  //#endregion
193275
194432
  //#region src/client/redesign/arkme-redesign.css?inline
193276
- var arkme_redesign_default = "[data-arkme-workspace] {\n --arkme-line: #e7e7e9;\n --arkme-muted: #8e9199;\n --arkme-soft: #f6f6f7;\n --arkme-focus: #cbd5ff;\n color: #171923;\n font-synthesis: none;\n font-family: SF Pro Text, SF Pro Display, -apple-system, BlinkMacSystemFont, PingFang SC, Helvetica Neue, Microsoft YaHei, sans-serif;\n}\n\n[data-arkme-workspace], [data-arkme-workspace] * {\n box-sizing: border-box;\n}\n\n[data-arkme-workspace] button, [data-arkme-workspace] input, [data-arkme-workspace] textarea {\n font: inherit;\n}\n\n[data-arkme-workspace] button {\n color: inherit;\n cursor: pointer;\n background: none;\n border: 0;\n}\n\n[data-arkme-workspace] [data-arkme-theme-image=\"dark\"] {\n display: none !important;\n}\n\n.arkme-redesign-root {\n --arkme-native-titlebar: 0px;\n background: #fff;\n width: 100%;\n min-width: 0;\n height: 100%;\n min-height: 0;\n position: relative;\n overflow: hidden;\n}\n\n.arkme-native-desktop .arkme-redesign-root {\n --arkme-native-titlebar: 50px;\n}\n\n.arkme-native-desktop .arkme-redesign-root:before {\n content: \"\";\n z-index: 30;\n pointer-events: none;\n background: #e8e8ea;\n height: 1px;\n position: absolute;\n top: 49px;\n left: 0;\n right: 0;\n}\n\n.arkme-native-desktop [data-arkme-owned=\"persistent-sidebar\"] > [data-arkme-owned=\"product-navigation\"] {\n padding-top: 28px !important;\n}\n\n.arkme-redesign-rail {\n z-index: 8;\n top: calc(26px + var(--arkme-native-titlebar));\n background: #fbfbfc;\n border: 1px solid #e4e4e7;\n border-radius: 22px;\n flex-direction: column;\n width: 72px;\n padding: 10px 8px;\n display: flex;\n position: absolute;\n bottom: 22px;\n left: 24px;\n box-shadow: 0 16px 38px #1e20260e;\n}\n\n.arkme-redesign-rail-primary {\n flex-direction: column;\n gap: 5px;\n display: flex;\n}\n\n.arkme-redesign-rail-primary button {\n color: #3e4149;\n border-radius: 15px;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n gap: 5px;\n min-height: 57px;\n transition: background .18s, color .18s;\n display: flex;\n position: relative;\n}\n\n.arkme-redesign-rail-primary button span {\n letter-spacing: .01em;\n font-size: 11px;\n font-weight: 400;\n}\n\n.arkme-redesign-rail-primary button:hover {\n background: #f4f4f5;\n}\n\n.arkme-redesign-rail-primary button.is-active {\n color: #151722;\n background: #f1f2f6;\n}\n\n.arkme-redesign-rail-primary button.is-active:before {\n content: \"\";\n background: #9eadff;\n border-radius: 3px;\n width: 3px;\n height: 33px;\n position: absolute;\n left: -9px;\n}\n\n.arkme-redesign-rail-footer {\n border-top: 0 solid #ededee;\n justify-items: center;\n gap: 7px;\n margin-top: auto;\n padding-top: 0;\n display: grid;\n position: relative;\n}\n\n.arkme-redesign-rail-footer:has( > .arkme-update-rail-slot) {\n border-top-width: 1px;\n padding-top: 10px;\n}\n\n.arkme-redesign-rail-footer > button {\n color: #4b4f58;\n border-radius: 14px;\n place-items: center;\n width: 46px;\n height: 46px;\n display: grid;\n}\n\n.arkme-redesign-rail-footer > button:hover, .arkme-redesign-rail-footer > button.is-active {\n background: #f1f2f5;\n}\n\n.arkme-redesign-rail-footer:empty {\n display: none;\n}\n\n.arkme-conversation-input-card {\n display: contents;\n}\n\nbody:is([data-ds-skin=\"qq2006\"], [data-arkme-skin=\"qq2006\"]) [data-arkme-owned=\"product-surface\"] .arkme-conversation-input-card.arkme-conversation-input-card.arkme-conversation-tools {\n display: flex !important;\n}\n\n.arkme-update-rail-slot {\n width: 52px;\n height: 30px;\n position: relative;\n}\n\nbutton.arkme-update-rail {\n color: #53648e;\n cursor: pointer;\n width: 52px;\n min-height: 28px;\n font: inherit;\n background: #f1f3fa;\n border: 0;\n border-radius: 999px;\n justify-content: center;\n align-items: center;\n gap: 4px;\n padding: 0 7px;\n transition: transform .16s, background .16s, color .16s, box-shadow .16s;\n display: flex;\n box-shadow: inset 0 0 0 1px #5b70ab17;\n}\n\nbutton.arkme-update-rail:hover, button.arkme-update-rail.is-active {\n transform: translateY(-1px);\n color: #34476f !important;\n background: #e9edf8 !important;\n}\n\nbutton.arkme-update-rail.is-available {\n color: #fff !important;\n background: #f0524f !important;\n box-shadow: 0 5px 12px #e03c3933, inset 0 0 0 1px #b2232014 !important;\n}\n\nbutton.arkme-update-rail.is-available:hover, button.arkme-update-rail.is-available.is-active {\n color: #fff !important;\n background: #df4542 !important;\n box-shadow: 0 7px 16px #d736333d, inset 0 0 0 1px #961a181a !important;\n}\n\nbutton.arkme-update-rail.is-error {\n color: #b54841 !important;\n background: #fff0ee !important;\n}\n\n.arkme-update-rail span {\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n font-size: 9px;\n font-weight: 550;\n line-height: 1;\n}\n\n.arkme-update-rail svg {\n flex: none;\n}\n\n.arkme-update-rail.is-ready {\n gap: 3px;\n padding: 0 4px;\n}\n\n.arkme-update-rail.is-ready svg {\n width: 13px;\n height: 13px;\n}\n\n.arkme-update-rail.is-downloading svg {\n animation: 1.6s linear infinite arkme-update-spin;\n}\n\n.arkme-update-popover {\n z-index: 100000;\n overflow-wrap: anywhere;\n box-sizing: border-box;\n color: #171923;\n backdrop-filter: blur(20px) saturate(1.12);\n background: #fffffff7;\n border: 1px solid #cfd1d7e6;\n border-radius: 20px;\n width: 356px;\n max-width: calc(100vw - 16px);\n max-height: calc(100vh - 16px);\n padding: 18px;\n animation: .2s cubic-bezier(.2, .8, .2, 1) arkme-update-popover-in;\n position: fixed;\n bottom: 14px;\n left: 68px;\n overflow-y: auto;\n box-shadow: 0 24px 58px #1b1e2629, 0 3px 10px #1b1e260e;\n}\n\n.arkme-update-popover-heading {\n grid-template-columns: minmax(0, 1fr) 28px;\n align-items: center;\n gap: 12px;\n display: grid;\n}\n\n.arkme-update-popover-heading > div {\n gap: 4px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-update-popover-heading span {\n color: #92959d;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 10px;\n font-weight: 500;\n overflow: hidden;\n}\n\n.arkme-update-popover-heading h2 {\n color: #242731;\n letter-spacing: -.025em;\n margin: 0;\n font-size: 17px;\n font-weight: 600;\n}\n\n.arkme-update-popover-heading > button {\n color: #93969e;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 9px;\n place-items: center;\n width: 28px;\n height: 28px;\n padding: 0;\n display: grid;\n}\n\n.arkme-update-popover-heading > button:hover {\n color: #3d414a;\n background: #f1f2f4;\n}\n\n.arkme-update-popover-summary {\n color: #7d818a;\n margin: 13px 0 0;\n font-size: 11px;\n line-height: 1.55;\n}\n\n.arkme-update-release-notes {\n border-top: 1px solid #ececef;\n border-bottom: 1px solid #ececef;\n margin-top: 14px;\n padding: 5px 0;\n}\n\n.arkme-update-release-notes > div {\n grid-template-columns: 28px minmax(0, 1fr);\n align-items: center;\n gap: 10px;\n min-height: 51px;\n display: grid;\n}\n\n.arkme-update-release-notes > div + div {\n border-top: 1px solid #f0f0f2;\n}\n\n.arkme-update-release-notes > div > span {\n color: #a3a6ad;\n font-variant-numeric: tabular-nums;\n font-size: 9px;\n}\n\n.arkme-update-release-notes p {\n gap: 4px;\n margin: 0;\n display: grid;\n}\n\n.arkme-update-release-notes strong {\n color: #3b3f48;\n font-size: 12px;\n font-weight: 500;\n}\n\n.arkme-update-release-notes small {\n color: #92959d;\n font-size: 10px;\n line-height: 1.45;\n}\n\n.arkme-update-message {\n color: #747983;\n margin: 12px 0 0;\n font-size: 11px;\n line-height: 17px;\n}\n\n.arkme-update-message.is-error {\n color: #b54841;\n}\n\n.arkme-update-popover-actions {\n grid-template-columns: 1fr 1.45fr;\n gap: 9px;\n margin-top: 16px;\n display: grid;\n}\n\n.arkme-update-popover-actions button {\n cursor: pointer;\n height: 42px;\n font: inherit;\n border-radius: 12px;\n padding: 0;\n font-size: 12px;\n font-weight: 500;\n transition: transform .16s, background .16s, box-shadow .16s;\n border: 0 !important;\n}\n\n.arkme-update-popover-actions button:hover {\n transform: translateY(-1px);\n}\n\n.arkme-update-popover-actions .arkme-update-later {\n color: #666a73 !important;\n background: #f2f2f4 !important;\n}\n\n.arkme-update-popover-actions .arkme-update-later:hover {\n background: #ececef !important;\n}\n\n.arkme-update-popover-actions .arkme-update-now {\n color: #fff !important;\n background: #1c1f28 !important;\n box-shadow: 0 7px 18px #181b2324 !important;\n}\n\n.arkme-update-popover-actions .arkme-update-now:hover {\n background: #11131b !important;\n box-shadow: 0 9px 22px #181b232e !important;\n}\n\n.arkme-update-now:disabled {\n opacity: .46;\n cursor: default;\n transform: none;\n}\n\n.arkme-update-capsule {\n z-index: 10030;\n box-sizing: border-box;\n color: #171923;\n backdrop-filter: blur(20px) saturate(1.2);\n background: #ffffffed;\n border: 1px solid #cdd0d8d6;\n border-radius: 18px;\n grid-template-columns: minmax(0, 1fr) 28px;\n align-items: center;\n gap: 10px;\n width: 326px;\n max-width: calc(100vw - 16px);\n min-height: 52px;\n padding: 9px 9px 9px 14px;\n animation: .22s cubic-bezier(.2, .8, .2, 1) arkme-update-capsule-in;\n display: grid;\n position: fixed;\n top: 18px;\n left: 50%;\n transform: translateX(-50%);\n box-shadow: 0 16px 40px #1c1f2724, 0 2px 8px #1c1f270f;\n}\n\n.arkme-native-desktop .arkme-update-capsule {\n top: 62px;\n}\n\n.arkme-update-capsule-copy {\n gap: 3px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-update-capsule-copy strong {\n color: #333741;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 11px;\n font-weight: 600;\n overflow: hidden;\n}\n\n.arkme-update-capsule-copy small {\n color: #93969e;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 9px;\n overflow: hidden;\n}\n\n.arkme-update-progress {\n background: #eceef3;\n border-radius: 999px;\n height: 4px;\n overflow: hidden;\n}\n\n.arkme-update-progress span {\n border-radius: inherit;\n background: #6779b5;\n height: 100%;\n transition: width .65s cubic-bezier(.2, .7, .25, 1);\n display: block;\n}\n\n.arkme-update-progress.is-indeterminate span {\n width: 34%;\n animation: 1.25s ease-in-out infinite arkme-update-indeterminate;\n}\n\n.arkme-update-capsule > b {\n color: #656a75;\n font-variant-numeric: tabular-nums;\n text-align: right;\n font-size: 10px;\n font-weight: 500;\n}\n\n.arkme-update-capsule[data-layout=\"progress\"] {\n grid-template-columns: minmax(0, 1fr) minmax(40px, .8fr) 34px 28px;\n}\n\n.arkme-update-capsule[data-layout=\"action\"], .arkme-update-capsule[data-layout=\"ready-action\"] {\n width: 380px;\n}\n\n.arkme-update-capsule[data-layout=\"action\"] {\n grid-template-columns: minmax(0, 1fr) auto 28px;\n}\n\n.arkme-update-capsule[data-layout=\"ready-action\"] {\n grid-template-columns: minmax(0, 1fr) auto;\n padding-right: 16px;\n}\n\n.arkme-update-capsule:is([data-layout=\"action\"], [data-layout=\"ready-action\"]) .arkme-update-capsule-copy small {\n -webkit-line-clamp: 3;\n white-space: normal;\n overflow-wrap: anywhere;\n -webkit-box-orient: vertical;\n font-size: 11px;\n line-height: 1.45;\n display: -webkit-box;\n}\n\n.arkme-update-capsule[data-layout=\"restarting\"] {\n grid-template-columns: minmax(0, 1fr);\n width: 218px;\n padding-right: 14px;\n}\n\n.arkme-update-capsule.is-restarting .arkme-update-capsule-copy {\n text-align: center;\n justify-self: center;\n}\n\n.arkme-update-ready-action {\n color: #fff;\n cursor: pointer;\n width: auto;\n height: 32px;\n font: inherit;\n white-space: nowrap;\n background: #242731;\n border: 0;\n border-radius: 10px;\n padding: 0 11px;\n font-size: 10px;\n font-weight: 550;\n}\n\n.arkme-update-ready-action:hover {\n background: #151821;\n}\n\n.arkme-update-ready-action:disabled {\n opacity: .65;\n cursor: wait;\n}\n\n.arkme-update-ready-action:focus-visible {\n outline-offset: 2px;\n outline: 2px solid #6779b5;\n}\n\n.arkme-update-ready-actions {\n align-items: center;\n gap: 6px;\n display: flex;\n}\n\n.arkme-update-later-action {\n color: #737781;\n cursor: pointer;\n height: 32px;\n font: inherit;\n white-space: nowrap;\n background: none;\n border: 0;\n border-radius: 9px;\n padding: 0 8px;\n font-size: 10px;\n}\n\n.arkme-update-later-action:hover {\n color: #343841;\n background: #f0f1f3;\n}\n\n.arkme-update-capsule-close {\n color: #8a8e97;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 9px;\n place-items: center;\n width: 28px;\n height: 28px;\n padding: 0;\n display: grid;\n}\n\n.arkme-update-capsule-close:hover {\n color: #343841;\n background: #f0f1f3;\n}\n\n@keyframes arkme-update-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes arkme-update-popover-in {\n from {\n opacity: 0;\n transform: translate(-8px, 3px) scale(.985);\n }\n}\n\n@keyframes arkme-update-capsule-in {\n from {\n opacity: 0;\n transform: translate(-50%, -8px) scale(.98);\n }\n}\n\n@keyframes arkme-update-indeterminate {\n from {\n transform: translateX(-100%);\n }\n\n to {\n transform: translateX(300%);\n }\n}\n\n.arkme-redesign-profile {\n position: relative;\n}\n\n.arkme-redesign-profile > span {\n width: 32px !important;\n height: 32px !important;\n}\n\n.arkme-redesign-profile-popover {\n z-index: 10000;\n backdrop-filter: blur(20px);\n background: #fffffff5;\n border: 1px solid #d8d9dde6;\n border-radius: 18px;\n width: 264px;\n padding: 10px;\n position: fixed;\n bottom: 14px;\n left: 64px;\n box-shadow: 0 20px 50px #1a1c2326, 0 2px 8px #1a1c230d;\n}\n\n.arkme-redesign-profile-head {\n align-items: center;\n gap: 11px;\n padding: 9px 9px 13px;\n display: flex;\n}\n\n.arkme-redesign-profile-head > span {\n text-align: left;\n gap: 4px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-redesign-profile-head strong {\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 14px;\n font-weight: 600;\n overflow: hidden;\n}\n\n.arkme-redesign-profile-head small {\n color: #8b8f98;\n font-size: 11px;\n font-weight: 400;\n}\n\n.arkme-redesign-profile-menu {\n border-top: 1px solid #eeeeef;\n gap: 2px;\n padding-top: 6px;\n display: grid;\n}\n\n.arkme-redesign-profile-menu button {\n width: 100%;\n min-height: 50px;\n box-shadow: none;\n color: #393d46;\n font: inherit;\n text-align: left;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 11px;\n outline: 0;\n grid-template-columns: 28px minmax(0, 1fr) 16px;\n align-items: center;\n gap: 8px;\n padding: 7px 8px;\n display: grid;\n}\n\n.arkme-redesign-profile-menu button:hover {\n background: #f4f4f5;\n}\n\n.arkme-redesign-profile-menu button > span {\n gap: 3px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-redesign-profile-menu strong {\n font-size: 12px;\n font-weight: 500;\n}\n\n.arkme-redesign-profile-menu small {\n color: #92969f;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 10px;\n font-weight: 400;\n overflow: hidden;\n}\n\n.arkme-redesign-profile-menu button > svg:last-child {\n color: #a0a3aa;\n}\n\n.arkme-redesign-native-settings-trigger {\n clip-path: inset(50%);\n width: 1px;\n height: 1px;\n position: absolute;\n overflow: hidden;\n}\n\n.arkme-redesign-chat-panel {\n inset: var(--arkme-native-titlebar) auto 0 96px;\n z-index: 3;\n border-right: 1px solid var(--arkme-line);\n background: #fff;\n flex-direction: column;\n width: 300px;\n min-width: 0;\n padding: 0;\n display: flex;\n position: absolute;\n overflow: hidden;\n}\n\n.arkme-redesign-chat-search {\n text-align: left;\n border-radius: 11px;\n align-items: center;\n gap: 9px;\n width: 100%;\n height: 40px;\n margin: 20px 0 10px;\n padding: 0 12px;\n display: flex;\n color: #9699a1 !important;\n border: 1px solid #e1e2e5 !important;\n font-size: 11px !important;\n}\n\n.arkme-redesign-chat-search:hover {\n background: #f7f7f8;\n}\n\n.arkme-redesign-chat-directory {\n flex: 1;\n min-height: 0;\n margin: 0;\n overflow: hidden;\n}\n\n.arkme-redesign-chat-directory > section {\n background: none !important;\n}\n\n.arkme-redesign-task-section {\n z-index: 3;\n border-bottom: 1px solid #ececef;\n outline: none;\n height: 158px;\n margin: 0 6px 12px;\n position: relative;\n}\n\n.arkme-redesign-task-section-title {\n color: #767b85;\n justify-content: space-between;\n align-items: center;\n height: 28px;\n padding: 0 7px;\n display: flex;\n}\n\n.arkme-redesign-task-section-title strong {\n font-size: 12px;\n font-weight: 500;\n}\n\n.arkme-redesign-task-section-title button {\n border-radius: 7px;\n place-items: center;\n width: 24px;\n height: 24px;\n display: grid;\n}\n\n.arkme-redesign-task-section-title button:hover {\n background: #f3f3f5;\n}\n\n.arkme-redesign-task-list {\n overscroll-behavior: contain;\n scrollbar-gutter: stable;\n background: #fff;\n max-height: 128px;\n padding-bottom: 2px;\n transition: max-height .18s, box-shadow .18s, padding .18s;\n display: grid;\n position: absolute;\n top: 28px;\n left: 0;\n right: 0;\n overflow: hidden auto;\n}\n\n.arkme-redesign-task-section:hover .arkme-redesign-task-list, .arkme-redesign-task-section:focus-within .arkme-redesign-task-list {\n max-height: min(360px, 100vh - 180px);\n padding-bottom: 6px;\n box-shadow: 0 14px 22px #1b1e2512;\n}\n\n.arkme-redesign-task-list > button {\n color: #555a64;\n text-align: left;\n border-radius: 8px;\n grid-template-columns: 16px minmax(0, 1fr);\n align-items: center;\n gap: 4px;\n width: 100%;\n min-width: 0;\n height: 32px;\n padding: 0 8px;\n display: grid;\n}\n\n.arkme-redesign-task-list > button:hover {\n background: #f7f7f8;\n}\n\n.arkme-redesign-task-list > button.is-selected {\n color: #232630;\n background: #f0f1f4;\n}\n\n.arkme-redesign-task-state {\n justify-content: center;\n align-items: center;\n width: 16px;\n height: 20px;\n display: inline-flex;\n}\n\n.arkme-redesign-task-state.is-complete > i {\n background: #39a56b1a;\n border-radius: 50%;\n width: 10px;\n height: 10px;\n display: block;\n position: relative;\n}\n\n.arkme-redesign-task-state.is-complete > i:after {\n content: \"\";\n background: #39a56b;\n border-radius: 50%;\n position: absolute;\n inset: 2px;\n}\n\n.arkme-redesign-task-matrix {\n grid-template-columns: repeat(3, 2px);\n grid-auto-rows: 2px;\n gap: 1px;\n width: 10px;\n height: 10px;\n display: grid;\n}\n\n.arkme-redesign-task-matrix i {\n opacity: .15;\n background: #5d76e8;\n border-radius: 1px;\n animation: 1s infinite arkme-task-dot-chase;\n}\n\n.arkme-redesign-task-matrix i:nth-child(2) {\n animation-delay: .125s;\n}\n\n.arkme-redesign-task-matrix i:nth-child(3) {\n animation-delay: .25s;\n}\n\n.arkme-redesign-task-matrix i:nth-child(4) {\n animation-delay: .375s;\n}\n\n.arkme-redesign-task-matrix i:nth-child(5) {\n animation-delay: .5s;\n}\n\n.arkme-redesign-task-matrix i:nth-child(6) {\n animation-delay: .625s;\n}\n\n.arkme-redesign-task-matrix i:nth-child(7) {\n animation-delay: .75s;\n}\n\n.arkme-redesign-task-matrix i:nth-child(8) {\n animation-delay: .875s;\n}\n\n@keyframes arkme-task-dot-chase {\n 0%, 12.4% {\n opacity: 1;\n }\n\n 12.5%, 24.9% {\n opacity: .6;\n }\n\n 25%, 37.4% {\n opacity: .35;\n }\n\n 37.5%, 100% {\n opacity: .15;\n }\n}\n\n.arkme-redesign-task-copy {\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n min-width: 0;\n display: flex;\n}\n\n.arkme-redesign-task-copy strong {\n white-space: nowrap;\n text-overflow: ellipsis;\n min-width: 0;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n overflow: hidden;\n}\n\n.arkme-redesign-task-copy small {\n color: #9a9da5;\n flex: none;\n font-size: 12px;\n line-height: 20px;\n}\n\n.arkme-redesign-task-first {\n color: #555a64;\n text-align: left;\n border-radius: 8px;\n width: calc(100% - 12px);\n height: 32px;\n margin: 0 6px;\n padding: 0 8px;\n font-size: 14px;\n}\n\n.arkme-redesign-task-first:hover {\n background: #f7f7f8;\n}\n\n.arkme-redesign-content {\n inset: var(--arkme-native-titlebar) 0 0 96px;\n background: #fff;\n min-width: 0;\n min-height: 0;\n position: absolute;\n overflow: hidden;\n}\n\n.arkme-redesign-content.has-panel {\n left: 396px;\n}\n\n.arkme-redesign-content.has-details {\n right: 360px;\n}\n\n.arkme-redesign-content.is-login-takeover {\n left: 0;\n right: 0;\n}\n\n.arkme-redesign-route-surface {\n width: 100%;\n min-width: 0;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-surface {\n background: #fff !important;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-header {\n border-bottom: 1px solid #ececef !important;\n height: 68px !important;\n padding: 12px 16px 12px 20px !important;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-header h2 {\n font-size: 15px !important;\n font-weight: 600 !important;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-body {\n padding: 22px 22px 12px !important;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-records {\n gap: 0 !important;\n width: 100% !important;\n}\n\n.arkme-conversation-records-reveal {\n animation: .12s ease-out both arkme-conversation-records-reveal;\n}\n\n@keyframes arkme-conversation-records-reveal {\n from {\n opacity: 0;\n }\n\n to {\n opacity: 1;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .arkme-conversation-records-reveal {\n animation: none;\n }\n}\n\n.arkme-redesign-route-chats [data-arkme-content-presentation=\"bubble\"] p {\n font-size: 14px;\n line-height: 1.62;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-composer {\n padding: 0 24px 20px !important;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-composer-inner {\n background: #fff !important;\n border: 1px solid #dfe1e6 !important;\n border-radius: 15px !important;\n gap: 8px !important;\n width: 100% !important;\n padding: 12px 13px 9px !important;\n box-shadow: 0 8px 30px #1c1f270b !important;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-composer-inner[data-arkme-primary-composer=\"true\"] {\n box-shadow: none !important;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-composer-inner[data-arkme-primary-composer=\"true\"][data-arkme-composer-focused=\"true\"] {\n background: color-mix(in srgb, var(--dsw-alias-bg-base, #fff) 97%, #000) !important;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-composer textarea {\n min-height: 38px !important;\n padding: 0 !important;\n font-size: 14px !important;\n line-height: 22px !important;\n}\n\n.arkme-redesign-task-conversation {\n font-size: 15px;\n}\n\n.arkme-redesign-task-conversation [data-phase] {\n --dsh-chat-content-width: calc(100% - 64px);\n --dsh-composer-card-max-width: calc(100% - 32px);\n}\n\n.arkme-redesign-task-conversation [data-chat-flow] {\n width: calc(100% - 64px) !important;\n max-width: none !important;\n margin-left: 32px !important;\n margin-right: 32px !important;\n}\n\n.arkme-redesign-task-conversation textarea {\n font-size: 14px !important;\n}\n\n[data-slot=\"root\"] > div[data-details-collapsed=\"true\"]:has([data-arkme-owned=\"persistent-sidebar\"][data-arkme-login-mode=\"false\"][data-arkme-directory-visible=\"true\"] [data-arkme-directory-mode=\"conversations\"]), [data-slot=\"root\"] > div[data-details-collapsed=\"true\"]:has([data-arkme-owned=\"persistent-sidebar\"][data-arkme-web-locked] [data-arkme-directory-mode=\"web-locked\"]) {\n grid-template-columns: var(--arkme-persistent-sidebar-width, 356px) minmax(0, 1fr) 0 !important;\n}\n\n[data-slot=\"root\"] > div[data-details-collapsed=\"true\"]:has([data-arkme-owned=\"persistent-sidebar\"][data-arkme-login-mode=\"false\"][data-arkme-directory-visible=\"false\"]) {\n grid-template-columns: 72px minmax(0, 1fr) 0 !important;\n}\n\n@media (width >= 1100px) {\n [data-slot=\"root\"] > div[data-details-collapsed=\"true\"]:has([data-arkme-owned=\"persistent-sidebar\"][data-arkme-login-mode=\"false\"] [data-arkme-directory-mode=\"contacts\"]) {\n grid-template-columns: var(--arkme-persistent-sidebar-width, 356px) minmax(0, 1fr) 0 !important;\n }\n\n [data-slot=\"root\"] > div[data-details-collapsed=\"true\"]:has([data-arkme-owned=\"persistent-sidebar\"][data-arkme-login-mode=\"true\"]:not([data-arkme-web-locked])) {\n grid-template-columns: 0 minmax(0, 1fr) 0 !important;\n }\n}\n\n[data-arkme-owned=\"persistent-sidebar\"][data-arkme-login-mode=\"false\"]:has( > [data-arkme-directory-mode=\"conversations\"]) > [data-arkme-owned=\"product-navigation\"] {\n flex: 0 0 72px !important;\n width: 72px !important;\n min-width: 72px !important;\n}\n\n[data-arkme-owned=\"persistent-sidebar\"] :is([data-arkme-directory-mode=\"conversations\"], [data-arkme-directory-mode=\"web-locked\"]) {\n min-width: 64px !important;\n}\n\n[data-arkme-avatar-only=\"true\"] > :not([role=\"tree\"]) {\n display: none !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] {\n padding: 8px 6px 18px !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] > button {\n justify-content: center !important;\n gap: 0 !important;\n padding-left: 0 !important;\n padding-right: 0 !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] > button > :not(:first-child) {\n display: none !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] > button > span:first-child:has( > span:nth-child(2)) {\n justify-content: center !important;\n gap: 0 !important;\n width: auto !important;\n min-width: 38px !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] > button > span:first-child > span:nth-child(2) {\n display: contents !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] > button > span:first-child > span:nth-child(2) > span:first-child {\n display: none !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] > button > span:first-child > span:nth-child(2) > span:last-child {\n display: contents !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] > button > span:first-child > span:nth-child(2) > span:last-child > :not([style*=\"min-width: 17px\"]) {\n display: none !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] > button > span:first-child > span:nth-child(2) > span:last-child > [style*=\"min-width: 17px\"] {\n top: 3px;\n right: 3px;\n position: absolute !important;\n}\n\n.arkme-redesign-feature-page {\n background: #fff;\n flex-direction: column;\n width: 100%;\n min-width: 0;\n height: 100%;\n min-height: 0;\n padding: 30px 48px 36px;\n display: flex;\n overflow: hidden;\n}\n\n.arkme-redesign-feature-page > header {\n flex: none;\n margin: 0 0 22px;\n}\n\n.arkme-redesign-feature-page > header p {\n color: #8d9098;\n margin: 0 0 8px;\n font-size: 11px;\n}\n\n.arkme-redesign-feature-page > header h1 {\n letter-spacing: -.04em;\n margin: 0;\n font-size: 27px;\n font-weight: 600;\n}\n\n.arkme-redesign-feature-page > header span {\n color: #858992;\n margin-top: 10px;\n font-size: 12px;\n display: block;\n}\n\n.arkme-redesign-feature-body {\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n.arkme-redesign-recordings-page {\n background: #fff;\n padding: 0;\n}\n\n.arkme-redesign-recordings-page > div {\n height: 100% !important;\n}\n\n.arkme-redesign-search-page {\n padding: 66px 0 40px;\n}\n\n.arkme-redesign-search-page > header, .arkme-redesign-search-page > .arkme-redesign-feature-body {\n width: min(980px, 100% - 80px);\n margin-left: auto;\n margin-right: auto;\n}\n\n.arkme-redesign-search-page > header {\n margin-bottom: 28px;\n}\n\n.arkme-redesign-search-page > header h1 {\n font-size: 32px;\n}\n\n.arkme-redesign-search-page .arkme-redesign-feature-body {\n overflow-y: auto;\n}\n\n.arkme-redesign-search-page .arkme-redesign-feature-body > div {\n width: 100% !important;\n padding: 0 !important;\n}\n\n.arkme-redesign-search-page .arkme-redesign-feature-body > div > header {\n display: none !important;\n}\n\n.arkme-redesign-search-page .arkme-search-box {\n box-shadow: 0 8px 28px #1c1f2709;\n color: #646872 !important;\n background: #fff !important;\n border: 1px solid #e1e2e5 !important;\n border-radius: 15px !important;\n gap: 12px !important;\n height: 68px !important;\n padding: 0 20px !important;\n}\n\n.arkme-redesign-search-page input[aria-label=\"搜索\"] {\n font-size: 14px !important;\n}\n\n.arkme-redesign-search-page input[aria-label=\"搜索\"]:not(:focus)::placeholder {\n color: #92959d;\n}\n\n.arkme-redesign-search-page .arkme-search-history, .arkme-redesign-search-page .arkme-search-quick {\n margin: 24px 0 0 !important;\n}\n\n.arkme-redesign-search-page .arkme-search-history > div, .arkme-redesign-search-page .arkme-search-quick > div {\n gap: 0 !important;\n display: grid !important;\n}\n\n.arkme-redesign-search-page .arkme-search-history button, .arkme-redesign-search-page .arkme-search-quick button {\n text-align: left;\n overflow: hidden;\n color: #30333b !important;\n border: 0 !important;\n border-bottom: 1px solid #e6e7e9 !important;\n border-radius: 0 !important;\n justify-content: space-between !important;\n align-items: center !important;\n gap: 14px !important;\n width: 100% !important;\n height: 52px !important;\n padding: 0 6px !important;\n font-size: 12px !important;\n display: flex !important;\n}\n\n.arkme-redesign-search-page .arkme-search-history button span, .arkme-redesign-search-page .arkme-search-quick button span {\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n\n.arkme-redesign-plugins-page {\n background: #fff;\n}\n\n.arkme-redesign-plugins-page .arkme-extension-center-embedded > section {\n background: #fff !important;\n}\n\n.arkme-redesign-plugins-page .arkme-extension-center-embedded header {\n display: none !important;\n}\n\n.arkme-extension-toolbar {\n align-items: center;\n gap: 12px;\n height: 46px;\n display: flex;\n}\n\n.arkme-extension-toolbar label {\n color: #8e929a;\n border: 1px solid #e1e2e5;\n border-radius: 12px;\n flex: 1;\n align-items: center;\n gap: 10px;\n min-width: 0;\n height: 44px;\n padding: 0 14px;\n display: flex;\n}\n\n.arkme-extension-toolbar input {\n color: #262932;\n background: none;\n border: 0;\n outline: 0;\n flex: 1;\n min-width: 0;\n font-size: 12px;\n}\n\n.arkme-extension-toolbar > button {\n border-radius: 11px;\n height: 38px;\n padding: 0 15px;\n font-size: 11px;\n border: 1px solid #e1e2e5 !important;\n}\n\n.arkme-extension-toolbar > button:hover {\n background: #f6f6f7;\n}\n\n.arkme-redesign-plugins-page .arkme-extension-center-embedded nav {\n width: 420px;\n height: 38px !important;\n padding: 0 !important;\n}\n\n.arkme-redesign-plugins-page .arkme-extension-center-embedded main {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n align-content: start;\n gap: 12px;\n padding: 16px 0 0 !important;\n display: grid !important;\n}\n\n.arkme-redesign-plugins-page .arkme-extension-card {\n background: #fff !important;\n border: 1px solid #e3e4e7 !important;\n border-radius: 15px !important;\n min-height: 138px !important;\n margin: 0 !important;\n padding: 18px !important;\n}\n\n.arkme-redesign-plugins-page .arkme-extension-card:hover {\n background: #fafafa !important;\n border-color: #d5d7dc !important;\n}\n\n.arkme-redesign-plugins-page .arkme-extension-grid-span, .arkme-redesign-plugins-page .arkme-extension-center-embedded main > [role=\"status\"], .arkme-redesign-plugins-page .arkme-extension-center-embedded main > [role=\"alert\"] {\n grid-column: 1 / -1;\n}\n\n@keyframes arkme-icon-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n.arkme-icon-spin {\n animation: .8s linear infinite arkme-icon-spin;\n}\n\n@media (prefers-reduced-motion: reduce) {\n [data-arkme-voice] .arkme-icon-spin {\n animation: none;\n }\n}\n\n.arkme-redesign-settings-surface {\n color: #20232c;\n background: none;\n width: 100%;\n height: auto;\n overflow: visible;\n}\n\n.arkme-redesign-settings-shell {\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n padding: 0;\n}\n\n.arkme-redesign-settings-profile {\n align-items: center;\n gap: 16px;\n padding: 0 0 24px;\n display: flex;\n}\n\n.arkme-redesign-settings-profile > div:nth-child(2) {\n min-width: 0;\n}\n\n.arkme-redesign-settings-profile h1 {\n color: #20232c;\n letter-spacing: -.03em;\n white-space: nowrap;\n text-overflow: ellipsis;\n margin: 0 0 6px;\n font-size: 24px;\n font-weight: 600;\n line-height: 30px;\n overflow: hidden;\n}\n\n.arkme-redesign-settings-profile p {\n color: #858992;\n align-items: center;\n gap: 8px;\n margin: 0;\n font-size: 13px;\n line-height: 18px;\n display: flex;\n overflow: hidden;\n}\n\n.arkme-redesign-settings-profile p > span {\n white-space: nowrap;\n text-overflow: ellipsis;\n min-width: 0;\n overflow: hidden;\n}\n\n.arkme-account-profile-qr {\n color: #858992;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 0;\n flex: none;\n justify-content: center;\n align-items: center;\n width: 24px;\n height: 24px;\n margin: 0;\n padding: 2px;\n display: inline-flex;\n}\n\n.arkme-account-profile-qr:disabled {\n opacity: .55;\n cursor: default;\n}\n\n.arkme-account-profile-qr svg {\n width: 20px;\n height: 20px;\n display: block;\n}\n\n.arkme-redesign-settings-group {\n background: none;\n border: 0;\n border-bottom: 1px solid #e1e2e5;\n border-radius: 0;\n margin: 0;\n overflow: hidden;\n}\n\n.arkme-redesign-settings-group:last-child {\n border-bottom: 0;\n}\n\n.arkme-redesign-settings-group > h2 {\n color: #8a8e96;\n border-bottom: 1px solid #ededee;\n margin: 0;\n padding: 15px 1px 10px;\n font-size: 12px;\n font-weight: 500;\n line-height: 17px;\n}\n\n.arkme-redesign-settings-group > div {\n padding: 0;\n}\n\n.arkme-redesign-setting-row {\n box-sizing: border-box;\n width: 100%;\n min-height: 54px;\n color: inherit;\n font: inherit;\n text-align: left;\n background: none;\n border: 0;\n border-bottom: 1px solid #ededee;\n grid-template-columns: minmax(0, 1fr) auto 18px;\n align-items: center;\n gap: 10px;\n padding: 9px 1px;\n text-decoration: none;\n display: grid;\n}\n\n.arkme-redesign-setting-row:last-child {\n border-bottom: 0;\n}\n\nbutton.arkme-redesign-setting-row, a.arkme-redesign-setting-row {\n cursor: pointer;\n}\n\nbutton.arkme-redesign-setting-row:hover, a.arkme-redesign-setting-row:hover {\n color: #53617d;\n}\n\n.arkme-redesign-setting-row:disabled {\n opacity: .6;\n cursor: default;\n}\n\n.arkme-redesign-setting-row > strong {\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n overflow: hidden;\n}\n\n.arkme-redesign-setting-row > strong.is-danger {\n color: #b54841;\n}\n\n.arkme-redesign-setting-summary {\n color: #858992;\n text-align: right;\n white-space: nowrap;\n text-overflow: ellipsis;\n max-width: 360px;\n font-size: 12px;\n line-height: 18px;\n overflow: hidden;\n}\n\n.arkme-redesign-setting-row > svg {\n color: #8d929b;\n}\n\n.arkme-account-info-row {\n box-sizing: border-box;\n width: 100%;\n min-height: 54px;\n color: inherit;\n font: inherit;\n text-align: left;\n background: none;\n border: 0;\n border-bottom: 1px solid #ededee;\n grid-template-columns: 26px minmax(0, 1fr) auto 18px;\n align-items: center;\n gap: 10px;\n padding: 9px 1px;\n display: grid;\n}\n\n.arkme-account-info-row:last-child {\n border-bottom: 0;\n}\n\nbutton.arkme-account-info-row {\n cursor: pointer;\n}\n\n.arkme-account-info-row:disabled {\n opacity: .6;\n cursor: default;\n}\n\n.arkme-account-info-icon {\n color: #6f7580;\n justify-content: center;\n align-items: center;\n width: 26px;\n height: 26px;\n display: inline-flex;\n}\n\n.arkme-account-info-copy {\n gap: 2px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-account-info-copy > strong {\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n overflow: hidden;\n}\n\n.arkme-account-info-copy > small {\n color: #858992;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 12px;\n line-height: 18px;\n overflow: hidden;\n}\n\n.arkme-account-info-action {\n color: #858992;\n white-space: nowrap;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-account-info-row > svg {\n color: #8d929b;\n}\n\n.arkme-account-feedback {\n color: #b54841;\n align-items: flex-start;\n gap: 6px;\n margin: 8px 0 14px;\n font-size: 12px;\n line-height: 18px;\n display: flex;\n}\n\n.arkme-account-dialog-backdrop {\n z-index: 50;\n background: #12141a6b;\n justify-content: center;\n align-items: center;\n padding: 18px;\n display: flex;\n position: fixed;\n inset: 0;\n}\n\n.arkme-account-dialog {\n box-sizing: border-box;\n color: #20232c;\n background: #fff;\n border: 1px solid #e1e2e5;\n border-radius: 16px;\n width: min(420px, 100vw - 36px);\n max-height: calc(100vh - 56px);\n overflow: auto;\n box-shadow: 0 18px 52px #11182738;\n}\n\n.arkme-account-dialog > header {\n border-bottom: 1px solid #ededee;\n justify-content: space-between;\n align-items: center;\n height: 58px;\n padding: 0 16px 0 20px;\n display: flex;\n}\n\n.arkme-account-dialog h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 650;\n line-height: 24px;\n}\n\n.arkme-account-dialog > header button {\n color: #8d929b;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 50%;\n width: 34px;\n height: 34px;\n}\n\n.arkme-account-qr-card {\n box-sizing: border-box;\n background: #fff;\n border: 1px solid #ededee;\n border-radius: 14px;\n justify-items: center;\n gap: 7px;\n width: 270px;\n margin: 22px auto 16px;\n padding: 24px 22px 22px;\n display: grid;\n}\n\n.arkme-account-qr-card strong {\n margin-top: 4px;\n font-size: 17px;\n font-weight: 650;\n line-height: 23px;\n}\n\n.arkme-account-qr-card span, .arkme-account-qr-card small {\n color: #858992;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-account-qr-card img {\n width: 180px;\n height: 180px;\n margin-top: 8px;\n}\n\n.arkme-account-form {\n gap: 12px;\n padding: 18px 20px 20px;\n display: grid;\n}\n\n.arkme-account-form label {\n color: #5f6570;\n gap: 7px;\n font-size: 12px;\n line-height: 18px;\n display: grid;\n}\n\n.arkme-account-form input {\n box-sizing: border-box;\n color: #20232c;\n width: 100%;\n height: 42px;\n font: inherit;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 11px;\n outline: none;\n padding: 0 12px;\n}\n\n.arkme-account-form input:focus {\n border-color: #9aa7c2;\n box-shadow: 0 0 0 3px #53617d1f;\n}\n\n.arkme-account-rule {\n color: #858992;\n margin: -2px 0 0;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-account-code-row {\n grid-template-columns: minmax(0, 1fr) 92px;\n gap: 8px;\n display: grid;\n}\n\n.arkme-account-code-row button {\n color: #343944;\n font: inherit;\n cursor: pointer;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 11px;\n}\n\n.arkme-account-code-row button:disabled {\n opacity: .55;\n cursor: default;\n}\n\n.arkme-account-dialog-actions {\n justify-content: flex-end;\n gap: 10px;\n padding-top: 6px;\n display: flex;\n}\n\n.arkme-account-dialog-actions button {\n color: #343944;\n min-width: 78px;\n height: 36px;\n font: inherit;\n cursor: pointer;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 10px;\n justify-content: center;\n align-items: center;\n gap: 6px;\n padding: 0 14px;\n display: inline-flex;\n}\n\n.arkme-account-dialog-actions button[type=\"submit\"], .arkme-account-dialog-actions button:last-child {\n color: #fff;\n background: #20232c;\n border-color: #20232c;\n}\n\n.arkme-account-dialog-actions button:disabled {\n opacity: .55;\n cursor: default;\n}\n\n.arkme-account-dialog-status {\n color: #13a85b;\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-account-dialog-status.is-error {\n color: #b54841;\n}\n\n.arkme-redesign-version-row {\n grid-template-columns: minmax(0, 1fr) minmax(150px, auto) auto 18px;\n}\n\n.arkme-redesign-version-row.is-without-action {\n grid-template-columns: minmax(0, 1fr) auto 18px;\n}\n\n.arkme-redesign-version-copy {\n gap: 2px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-redesign-version-copy > strong {\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n overflow: hidden;\n}\n\n.arkme-redesign-version-copy > small {\n color: #858992;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 11px;\n line-height: 16px;\n overflow: hidden;\n}\n\n.arkme-redesign-version-value {\n color: #858992;\n white-space: nowrap;\n justify-self: end;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-redesign-version-action-slot {\n justify-content: flex-end;\n display: inline-flex;\n}\n\n.arkme-redesign-trailing-slot {\n width: 18px;\n height: 1px;\n}\n\nbutton.arkme-redesign-update-button {\n color: #343944;\n min-width: 72px;\n height: 30px;\n font: inherit;\n white-space: nowrap;\n cursor: pointer;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 9px;\n justify-content: center;\n align-items: center;\n gap: 5px;\n padding: 0 11px;\n font-size: 11px;\n display: inline-flex;\n}\n\nbutton.arkme-redesign-update-button:hover {\n background: #f7f7f8;\n border-color: #cfd3da;\n}\n\nbutton.arkme-redesign-update-button:disabled {\n opacity: .55;\n cursor: default;\n}\n\n.arkme-redesign-settings-group:has(.arkme-redesign-balance-row) {\n overflow: visible;\n}\n\n.arkme-redesign-balance-row {\n grid-template-columns: max-content max-content minmax(0, 1fr) 18px;\n column-gap: 20px;\n}\n\n.arkme-redesign-balance-row.is-without-reserved {\n grid-template-columns: max-content minmax(0, 1fr) 18px;\n}\n\n.arkme-redesign-balance-main {\n min-width: 0;\n color: inherit;\n font: inherit;\n text-align: left;\n cursor: pointer;\n background: none;\n border: 0;\n gap: 2px;\n padding: 0;\n display: grid;\n}\n\n.arkme-redesign-balance-main > strong {\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n}\n\n.arkme-redesign-balance-main > small {\n color: #858992;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-redesign-balance-usage {\n color: #8a8e96;\n white-space: nowrap;\n font-size: 11px;\n line-height: 16px;\n}\n\n.arkme-redesign-reserved-balance {\n gap: 2px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-redesign-recharge-trigger {\n justify-self: end;\n}\n\n.arkme-redesign-reserved-title {\n align-items: center;\n gap: 5px;\n width: fit-content;\n display: inline-flex;\n position: relative;\n}\n\n.arkme-redesign-reserved-title > strong {\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n}\n\n.arkme-redesign-reserved-balance > small {\n color: #858992;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-redesign-reserved-help {\n box-sizing: border-box;\n color: #858992;\n cursor: help;\n border: 1px solid #a6aab2;\n border-radius: 50%;\n place-items: center;\n width: 15px;\n height: 15px;\n font-size: 10px;\n font-weight: 600;\n line-height: 1;\n display: inline-grid;\n}\n\n.arkme-redesign-reserved-help:focus-visible {\n outline-offset: 2px;\n outline: 2px solid #7b8cad;\n}\n\n.arkme-redesign-reserved-title > [role=\"tooltip\"] {\n box-sizing: border-box;\n z-index: 20;\n color: #fff;\n opacity: 0;\n visibility: hidden;\n pointer-events: none;\n background: #2e323b;\n border-radius: 8px;\n width: 240px;\n padding: 9px 11px;\n font-size: 11px;\n font-weight: 400;\n line-height: 17px;\n transition: opacity .12s, transform .12s, visibility .12s;\n position: absolute;\n bottom: calc(100% + 8px);\n left: calc(100% - 7.5px);\n transform: translate(-50%, 2px);\n box-shadow: 0 6px 18px #181b222e;\n}\n\n.arkme-redesign-reserved-help:hover ~ [role=\"tooltip\"], .arkme-redesign-reserved-help:focus ~ [role=\"tooltip\"] {\n opacity: 1;\n visibility: visible;\n transform: translate(-50%);\n}\n\n.arkme-billing-backdrop {\n z-index: 120;\n backdrop-filter: blur(3px);\n background: #181b223d;\n place-items: center;\n padding: 28px;\n display: grid;\n position: fixed;\n inset: 0;\n}\n\n.arkme-billing-recharge-dialog, .arkme-billing-payment-dialog {\n color: #20232c;\n background: #fff;\n border: 1px solid #dedfe3;\n border-radius: 20px;\n width: min(620px, 100%);\n max-height: min(720px, 100vh - 56px);\n overflow-y: auto;\n box-shadow: 0 24px 72px #191c232e;\n}\n\n.arkme-billing-payment-dialog {\n width: min(420px, 100%);\n}\n\n.arkme-billing-dialog-header {\n border-bottom: 1px solid #ececef;\n justify-content: space-between;\n align-items: flex-start;\n gap: 18px;\n min-height: 78px;\n padding: 20px 22px 16px;\n display: flex;\n}\n\n.arkme-billing-dialog-header h2 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n line-height: 25px;\n}\n\n.arkme-billing-dialog-header p {\n overflow-wrap: anywhere;\n color: #8a8e96;\n margin: 4px 0 0;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-billing-dialog-header > button {\n color: #777c85;\n width: 32px;\n height: 32px;\n font: inherit;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 9px;\n flex: none;\n place-items: center;\n font-size: 22px;\n display: grid;\n}\n\n.arkme-billing-dialog-header > button:hover {\n color: #20232c;\n background: #f3f3f5;\n}\n\n.arkme-billing-dialog-body {\n padding: 18px 22px 22px;\n}\n\n.arkme-billing-dialog-balance {\n border-bottom: 1px solid #ececef;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: center;\n column-gap: 12px;\n min-height: 48px;\n padding: 0 2px 16px;\n display: grid;\n}\n\n.arkme-billing-dialog-balance > span {\n color: #8a8e96;\n grid-column: 1;\n font-size: 11px;\n line-height: 16px;\n}\n\n.arkme-billing-dialog-balance > strong {\n grid-column: 1;\n font-size: 22px;\n font-weight: 600;\n line-height: 28px;\n}\n\n.arkme-billing-dialog-balance > button, .arkme-billing-error > button {\n color: #626772;\n height: 30px;\n font: inherit;\n cursor: pointer;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 9px;\n grid-area: 1 / 2 / span 2;\n padding: 0 12px;\n font-size: 11px;\n}\n\n.arkme-billing-products-section, .arkme-billing-payment-section {\n padding-top: 17px;\n}\n\n.arkme-billing-products-section h3, .arkme-billing-payment-section h3 {\n color: #747984;\n margin: 0 0 11px;\n font-size: 12px;\n font-weight: 500;\n line-height: 18px;\n}\n\n.arkme-billing-product-grid {\n width: 100%;\n}\n\n.arkme-billing-product-grid > button {\n color: #20232c;\n min-width: 0;\n min-height: 62px;\n font: inherit;\n text-align: left;\n cursor: pointer;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 11px;\n align-content: center;\n gap: 4px;\n padding: 9px 11px;\n display: grid;\n}\n\n.arkme-billing-product-grid > button:hover {\n background: #f8f8f9;\n border-color: #cfd2d8;\n}\n\n.arkme-billing-product-grid > button.is-selected {\n border-color: #75839e;\n box-shadow: 0 0 0 1px #75839e;\n}\n\n.arkme-billing-product-grid > button > span {\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 12px;\n font-weight: 500;\n line-height: 17px;\n overflow: hidden;\n}\n\n.arkme-billing-product-grid > button > strong {\n font-size: 14px;\n font-weight: 600;\n line-height: 19px;\n}\n\n.arkme-billing-payment-actions {\n flex-wrap: wrap;\n gap: 10px;\n display: flex;\n}\n\n.arkme-billing-payment-actions > button {\n color: #333842;\n min-width: 154px;\n height: 38px;\n font: inherit;\n cursor: pointer;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 10px;\n justify-content: center;\n align-items: center;\n gap: 8px;\n padding: 0 14px;\n font-size: 12px;\n display: inline-flex;\n}\n\n.arkme-billing-payment-actions > button:hover {\n background: #f7f7f8;\n border-color: #cfd3da;\n}\n\n.arkme-billing-payment-actions > button:disabled, .arkme-billing-product-grid > button:disabled {\n opacity: .48;\n cursor: default;\n}\n\n.arkme-billing-platform-icon {\n flex: none;\n width: 18px;\n height: 18px;\n}\n\n.arkme-billing-platform-icon.is-alipay {\n color: #1677ff;\n}\n\n.arkme-billing-platform-icon.is-wechat {\n color: #07c160;\n}\n\n.arkme-billing-state {\n color: #858992;\n margin: 12px 0 2px;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-billing-error {\n color: #b54841;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n margin-top: 10px;\n font-size: 12px;\n line-height: 18px;\n display: flex;\n}\n\n.arkme-billing-error.is-purchase {\n justify-content: flex-start;\n}\n\n.arkme-billing-payment-content {\n text-align: center;\n justify-items: center;\n gap: 10px;\n padding: 28px 24px 18px;\n display: grid;\n}\n\n.arkme-billing-payment-content > .arkme-billing-platform-icon {\n width: 38px;\n height: 38px;\n margin-bottom: 4px;\n}\n\n.arkme-billing-payment-content > img {\n border-radius: 10px;\n width: 210px;\n height: 210px;\n}\n\n.arkme-billing-payment-content > strong {\n font-size: 14px;\n font-weight: 600;\n line-height: 21px;\n}\n\n.arkme-billing-payment-content > p {\n color: #858992;\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-billing-payment-content.is-paid > strong {\n color: #16794f;\n font-size: 18px;\n line-height: 25px;\n}\n\n.arkme-billing-payment-content.is-paid > .arkme-billing-error {\n justify-content: center;\n}\n\n.arkme-billing-payment-content.is-crediting > strong {\n color: #335f9e;\n}\n\n.arkme-billing-dialog-actions {\n flex-wrap: wrap;\n justify-content: center;\n gap: 9px;\n padding: 0 22px 20px;\n display: flex;\n}\n\n.arkme-billing-dialog-actions > button, .arkme-billing-primary-action {\n color: #3c424d;\n height: 34px;\n font: inherit;\n cursor: pointer;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 9px;\n padding: 0 14px;\n font-size: 12px;\n}\n\n.arkme-billing-dialog-actions > .arkme-billing-primary-action, .arkme-billing-payment-content > .arkme-billing-primary-action {\n color: #fff;\n background: #20232d;\n border-color: #20232d;\n}\n\n.arkme-redesign-settings-error {\n color: #b54841;\n background: #fff3f0;\n border-radius: 10px;\n margin: -8px 0 28px;\n padding: 10px 13px;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-remote-settings-dialog-backdrop {\n z-index: 1150;\n box-sizing: border-box;\n backdrop-filter: blur(1.5px);\n background: #16181d47;\n place-items: center;\n padding: 24px;\n display: grid;\n position: fixed;\n inset: 0;\n}\n\n.arkme-remote-settings-dialog {\n color: #20232c;\n background: #fff;\n border: 1px solid #14182014;\n border-radius: 19px;\n flex-direction: column;\n width: min(720px, 100vw - 48px);\n max-height: min(720px, 100vh - 48px);\n display: flex;\n overflow: hidden;\n box-shadow: 0 18px 54px #11141b2e;\n}\n\n.arkme-remote-page-header {\n box-sizing: border-box;\n border-bottom: 1px solid #ededee;\n justify-content: space-between;\n align-items: center;\n gap: 20px;\n min-height: 74px;\n padding: 0 24px 0 28px;\n display: flex;\n}\n\n.arkme-remote-page-header > div {\n min-width: 0;\n}\n\n.arkme-remote-page-header h1 {\n color: #20232c;\n letter-spacing: -.02em;\n margin: 0;\n font-size: 18px;\n font-weight: 620;\n line-height: 25px;\n}\n\n.arkme-remote-page-header p {\n color: #8b9098;\n margin: 3px 0 0;\n font-size: 11px;\n line-height: 17px;\n}\n\n.arkme-remote-settings-close {\n color: #777c85;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 9px;\n flex: none;\n justify-content: center;\n align-items: center;\n width: 32px;\n height: 32px;\n padding: 0;\n display: inline-flex;\n}\n\n.arkme-remote-settings-close:hover {\n color: #20232c;\n background: #f3f3f4;\n}\n\n.arkme-remote-settings-dialog-body {\n overscroll-behavior: contain;\n gap: 28px;\n padding: 24px 28px 28px;\n display: grid;\n overflow-y: auto;\n}\n\n.arkme-remote-section {\n gap: 13px;\n display: grid;\n}\n\n.arkme-remote-section-header {\n justify-content: space-between;\n align-items: flex-end;\n gap: 18px;\n min-height: 34px;\n display: flex;\n}\n\n.arkme-remote-section-header > div:first-child {\n min-width: 0;\n}\n\n.arkme-remote-section-header h2 {\n color: #292c34;\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n line-height: 21px;\n}\n\n.arkme-remote-section-header p {\n color: #8b9098;\n margin: 2px 0 0;\n font-size: 11px;\n line-height: 17px;\n}\n\n.arkme-remote-section-header > div:last-child {\n align-items: center;\n gap: 8px;\n display: flex;\n}\n\n.arkme-remote-icon-button {\n color: #8a8f97;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 9px;\n justify-content: center;\n align-items: center;\n width: 32px;\n height: 32px;\n padding: 0;\n display: inline-flex;\n}\n\n.arkme-remote-icon-button:hover {\n color: #343944;\n background: #f3f3f4;\n}\n\n.arkme-remote-add-button {\n color: #fff;\n min-height: 32px;\n font: inherit;\n cursor: pointer;\n background: #20232c;\n border: 0;\n border-radius: 9px;\n align-items: center;\n gap: 5px;\n padding: 0 12px;\n font-size: 11px;\n font-weight: 550;\n display: inline-flex;\n}\n\n.arkme-remote-add-button:hover {\n background: #343944;\n}\n\n.arkme-remote-add-button:disabled, .arkme-remote-icon-button:disabled {\n opacity: .45;\n cursor: default;\n}\n\n.arkme-remote-settings-card {\n background: #fff;\n border: 1px solid #e1e2e5;\n border-radius: 16px;\n overflow: hidden;\n}\n\n.arkme-remote-allow-row {\n border-bottom: 1px solid #ededee;\n justify-content: space-between;\n align-items: center;\n gap: 18px;\n min-height: 60px;\n padding: 0 18px;\n display: flex;\n}\n\n.arkme-remote-allow-row > div {\n gap: 2px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-remote-allow-row strong, .arkme-remote-device-row strong, .arkme-remote-name-row strong {\n color: #343944;\n font-size: 12px;\n font-weight: 600;\n line-height: 18px;\n}\n\n.arkme-remote-allow-row span, .arkme-remote-device-row span, .arkme-remote-name-row small {\n color: #8b9098;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 10px;\n line-height: 16px;\n overflow: hidden;\n}\n\n.arkme-remote-switch {\n cursor: pointer;\n background: #d7d9dd;\n border: 0;\n border-radius: 999px;\n flex: none;\n width: 40px;\n height: 23px;\n padding: 0;\n transition: background .16s;\n position: relative;\n}\n\n.arkme-remote-switch > span {\n background: #fff;\n border-radius: 50%;\n width: 17px;\n height: 17px;\n transition: transform .16s;\n position: absolute;\n top: 3px;\n left: 3px;\n box-shadow: 0 1px 3px #14182038;\n}\n\n.arkme-remote-switch[aria-checked=\"true\"] {\n background: #3b9cf5;\n}\n\n.arkme-remote-switch[aria-checked=\"true\"] > span {\n transform: translateX(17px);\n}\n\n.arkme-remote-switch:disabled {\n opacity: .5;\n cursor: default;\n}\n\n.arkme-remote-device-row {\n border-bottom: 1px solid #ededee;\n grid-template-columns: 24px minmax(0, 1fr) auto;\n align-items: center;\n gap: 11px;\n min-height: 64px;\n padding: 0 18px;\n display: grid;\n}\n\n.arkme-remote-device-row:last-child {\n border-bottom: 0;\n}\n\n.arkme-remote-device-row > svg {\n color: #68707c;\n}\n\n.arkme-remote-device-row > div {\n gap: 1px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-remote-device-row > button {\n color: #5d626c;\n min-height: 30px;\n font: inherit;\n cursor: pointer;\n background: #f3f3f4;\n border: 0;\n border-radius: 9px;\n padding: 0 10px;\n font-size: 10px;\n}\n\n.arkme-remote-device-row > button:hover {\n color: #b54841;\n background: #fff0ed;\n}\n\n.arkme-remote-device-row > button:disabled {\n opacity: .45;\n cursor: default;\n}\n\n.arkme-remote-empty-row {\n color: #989ca3;\n align-items: center;\n gap: 11px;\n min-height: 52px;\n padding: 0 18px;\n font-size: 11px;\n display: flex;\n}\n\n.arkme-remote-empty-row > svg {\n color: #a2a6ad;\n}\n\n.arkme-remote-name-row {\n color: #727780;\n width: 100%;\n min-height: 62px;\n font: inherit;\n text-align: left;\n cursor: pointer;\n background: none;\n border: 0;\n grid-template-columns: 24px minmax(0, 1fr) 20px;\n align-items: center;\n gap: 11px;\n padding: 0 18px;\n display: grid;\n}\n\n.arkme-remote-name-row:hover {\n background: #fafafb;\n}\n\n.arkme-remote-name-row > span {\n gap: 1px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-remote-name-row small {\n display: block;\n}\n\n.arkme-remote-rename {\n border-top: 1px solid #ededee;\n grid-template-columns: minmax(0, 1fr) auto auto;\n gap: 7px;\n padding: 12px 18px;\n display: grid;\n}\n\n.arkme-remote-rename input {\n box-sizing: border-box;\n color: #20232c;\n min-width: 0;\n height: 34px;\n font: inherit;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 9px;\n outline: 0;\n padding: 0 10px;\n font-size: 12px;\n}\n\n.arkme-remote-rename input:focus {\n border-color: #6eb3f3;\n box-shadow: 0 0 0 3px #3b9cf51f;\n}\n\n.arkme-remote-rename button {\n color: #4f5560;\n min-height: 34px;\n font: inherit;\n cursor: pointer;\n background: #fff;\n border: 1px solid #e0e1e4;\n border-radius: 9px;\n padding: 0 11px;\n font-size: 11px;\n}\n\n.arkme-remote-rename button[type=\"submit\"] {\n color: #fff;\n background: #20232c;\n border-color: #20232c;\n}\n\n.arkme-remote-rename button:disabled {\n opacity: .5;\n cursor: default;\n}\n\n.arkme-remote-error {\n margin: -22px 0 0;\n}\n\n.arkme-remote-dialog-backdrop {\n z-index: 1200;\n box-sizing: border-box;\n backdrop-filter: blur(1.5px);\n background: #16181d47;\n place-items: center;\n padding: 24px;\n display: grid;\n position: fixed;\n inset: 0;\n overflow: auto;\n}\n\n.arkme-remote-dialog {\n box-sizing: border-box;\n color: #20232c;\n background: #fff;\n border: 1px solid #14182014;\n border-radius: 19px;\n width: min(440px, 100vw - 32px);\n max-height: calc(100vh - 48px);\n padding: 28px;\n position: relative;\n overflow: auto;\n box-shadow: 0 18px 54px #11141b2e;\n}\n\n.arkme-remote-dialog-close {\n color: #777c85;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 9px;\n justify-content: center;\n align-items: center;\n width: 32px;\n height: 32px;\n padding: 0;\n display: inline-flex;\n position: absolute;\n top: 16px;\n right: 16px;\n}\n\n.arkme-remote-dialog-close:hover {\n color: #20232c;\n background: #f3f3f4;\n}\n\n.arkme-remote-dialog-symbol {\n color: #343944;\n justify-content: center;\n align-items: center;\n gap: 9px;\n height: 38px;\n display: flex;\n}\n\n.arkme-remote-dialog-symbol > span {\n background: #d6d8dc;\n width: 28px;\n height: 1px;\n}\n\n.arkme-remote-dialog > header {\n text-align: center;\n margin: 12px 0 22px;\n}\n\n.arkme-remote-dialog h2 {\n letter-spacing: -.02em;\n margin: 0;\n font-size: 19px;\n font-weight: 620;\n line-height: 27px;\n}\n\n.arkme-remote-dialog header p {\n color: #858992;\n margin: 6px 0 0;\n font-size: 11px;\n line-height: 17px;\n}\n\n.arkme-remote-pairing-tabs {\n box-sizing: border-box;\n background: #f1f1f2;\n border-radius: 11px;\n grid-template-columns: 1fr 1fr;\n gap: 3px;\n height: 38px;\n padding: 3px;\n display: grid;\n}\n\n.arkme-remote-pairing-tabs button {\n color: #737881;\n font: inherit;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 8px;\n font-size: 11px;\n}\n\n.arkme-remote-pairing-tabs button[aria-selected=\"true\"] {\n color: #252831;\n background: #fff;\n box-shadow: 0 1px 3px #14182017;\n}\n\n.arkme-remote-pairing-display {\n box-sizing: border-box;\n background: #fff;\n border: 1px solid #e5e6e8;\n border-radius: 16px;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n min-height: 308px;\n margin-top: 14px;\n padding: 24px;\n display: flex;\n position: relative;\n}\n\n.arkme-remote-pairing-display > img {\n width: 232px;\n height: 232px;\n image-rendering: pixelated;\n display: block;\n}\n\n.arkme-remote-pairing-display > p {\n color: #8b9098;\n text-align: center;\n margin: 10px 0 0;\n font-size: 10px;\n line-height: 16px;\n}\n\n.arkme-remote-pairing-code {\n color: #20232c;\n letter-spacing: .17em;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n user-select: all;\n font-size: 33px;\n font-weight: 620;\n line-height: 46px;\n}\n\n.arkme-remote-pairing-tools {\n gap: 4px;\n display: flex;\n position: absolute;\n bottom: 12px;\n right: 12px;\n}\n\n.arkme-remote-pairing-tools button {\n color: #8a8f97;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 8px;\n justify-content: center;\n align-items: center;\n width: 30px;\n height: 30px;\n padding: 0;\n display: inline-flex;\n}\n\n.arkme-remote-pairing-tools button:hover {\n color: #343944;\n background: #f3f3f4;\n}\n\n.arkme-remote-pairing-expired {\n text-align: center;\n justify-items: center;\n gap: 7px;\n display: grid;\n}\n\n.arkme-remote-pairing-expired strong {\n font-size: 14px;\n line-height: 20px;\n}\n\n.arkme-remote-pairing-expired p {\n color: #8b9098;\n margin: 0;\n font-size: 11px;\n}\n\n.arkme-remote-pairing-expired button {\n color: #fff;\n min-height: 32px;\n font: inherit;\n cursor: pointer;\n background: #20232c;\n border: 0;\n border-radius: 9px;\n margin-top: 7px;\n padding: 0 12px;\n font-size: 11px;\n}\n\n.arkme-remote-dialog-note {\n color: #858992;\n align-items: flex-start;\n gap: 7px;\n margin: 14px 2px 0;\n font-size: 10px;\n line-height: 16px;\n display: flex;\n}\n\n.arkme-remote-dialog-note > svg {\n color: #5e856d;\n flex: none;\n margin-top: 1px;\n}\n\n.arkme-remote-settings-close:focus-visible, .arkme-remote-icon-button:focus-visible, .arkme-remote-add-button:focus-visible, .arkme-remote-switch:focus-visible, .arkme-remote-device-row > button:focus-visible, .arkme-remote-name-row:focus-visible, .arkme-remote-rename button:focus-visible, .arkme-remote-dialog button:focus-visible {\n outline-offset: 2px;\n outline: 2px solid #3b9cf5;\n}\n\n@media (width <= 520px) {\n .arkme-remote-settings-dialog-backdrop {\n padding: 10px;\n }\n\n .arkme-remote-settings-dialog {\n border-radius: 17px;\n width: calc(100vw - 20px);\n max-height: calc(100vh - 20px);\n }\n\n .arkme-remote-page-header {\n min-height: 68px;\n padding: 0 16px 0 20px;\n }\n\n .arkme-remote-page-header p {\n display: none;\n }\n\n .arkme-remote-settings-dialog-body {\n gap: 24px;\n padding: 20px 18px 22px;\n }\n\n .arkme-remote-section-header p {\n display: none;\n }\n\n .arkme-remote-device-row {\n grid-template-columns: 22px minmax(0, 1fr);\n padding-top: 10px;\n padding-bottom: 10px;\n }\n\n .arkme-remote-device-row > button {\n grid-column: 2;\n justify-self: start;\n }\n\n .arkme-remote-dialog-backdrop {\n padding: 12px;\n }\n\n .arkme-remote-dialog {\n padding: 24px 20px;\n }\n\n .arkme-remote-pairing-display {\n min-height: 282px;\n padding: 18px;\n }\n\n .arkme-remote-pairing-display > img {\n width: min(224px, 100%);\n height: auto;\n }\n\n .arkme-remote-pairing-code {\n letter-spacing: .12em;\n font-size: 26px;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .arkme-remote-switch, .arkme-remote-switch > span {\n transition: none;\n }\n}\n\n.arkme-redesign-model-settings {\n color: #20232c;\n background: #fff;\n width: 100%;\n height: 100%;\n overflow-y: auto;\n}\n\n.arkme-redesign-model-settings > header {\n width: min(760px, 100% - 96px);\n margin: 0 auto;\n padding: 42px 0 22px;\n}\n\n.arkme-redesign-model-settings > header button {\n color: #525762;\n height: 34px;\n font: inherit;\n cursor: pointer;\n background: #fff;\n border: 1px solid #e1e2e5;\n border-radius: 18px;\n align-items: center;\n gap: 4px;\n padding: 0 10px 0 7px;\n font-size: 13px;\n display: inline-flex;\n}\n\n.arkme-redesign-model-settings > header button:hover {\n color: #20232c;\n background: #f6f6f7;\n}\n\n.arkme-redesign-model-settings-body {\n width: min(760px, 100% - 96px);\n margin: 0 auto;\n padding: 0 0 68px;\n}\n\n.arkme-redesign-model-settings-body > * {\n max-width: none !important;\n}\n\n.arkme-redesign-task-start {\n place-items: center;\n width: 100%;\n height: 100%;\n padding: 28px 58px 64px;\n display: grid;\n}\n\n.arkme-redesign-task-start-inner {\n text-align: center;\n width: min(760px, 88%);\n transform: translateY(-12px);\n}\n\n.arkme-redesign-task-greeting {\n justify-content: center;\n align-items: center;\n gap: 12px;\n margin-bottom: 24px;\n display: flex;\n}\n\n.arkme-redesign-task-greeting img {\n object-fit: contain;\n flex: none;\n width: 62px;\n height: 16px;\n display: block;\n}\n\n.arkme-redesign-task-start h1 {\n letter-spacing: -.03em;\n margin: 0;\n font-size: 29px;\n font-weight: 600;\n line-height: 1.15;\n}\n\n.arkme-redesign-hero-input {\n border: 1px solid var(--arkme-focus);\n text-align: left;\n background: #fff;\n border-radius: 17px;\n grid-template-rows: minmax(56px, 1fr) auto;\n min-height: 142px;\n padding: 17px 16px 13px 20px;\n display: grid;\n box-shadow: 0 8px 30px #1c1f270b;\n}\n\n.arkme-redesign-hero-input:focus-within {\n border-color: #aebdff;\n box-shadow: 0 10px 38px #36488c13, 0 0 0 3px #91a4ff12;\n}\n\n.arkme-redesign-hero-input textarea {\n resize: none;\n color: #20232c;\n border: 0;\n outline: 0;\n width: 100%;\n min-height: 58px;\n padding: 0;\n font-size: 15px;\n line-height: 1.6;\n}\n\n.arkme-redesign-hero-input textarea::placeholder {\n color: #a3a6ad;\n}\n\n.arkme-redesign-hero-controls {\n justify-content: space-between;\n align-items: center;\n gap: 16px;\n display: flex;\n}\n\n.arkme-redesign-hero-controls > div {\n align-items: center;\n gap: 7px;\n display: flex;\n}\n\n.arkme-redesign-source-button {\n border-radius: 22px;\n align-items: center;\n gap: 8px;\n height: 36px;\n padding: 0 13px;\n font-size: 13px;\n display: flex;\n border: 1px solid #e2e3e6 !important;\n}\n\n.arkme-redesign-round-tool, .arkme-redesign-send-task {\n border-radius: 50%;\n place-items: center;\n width: 40px;\n height: 40px;\n display: grid;\n border: 1px solid #e2e3e6 !important;\n}\n\n.arkme-redesign-round-tool:hover {\n background: #f5f5f6;\n}\n\n.arkme-redesign-send-task {\n color: #fff !important;\n background: #20232d !important;\n border: 0 !important;\n}\n\n.arkme-redesign-send-task:disabled {\n cursor: default;\n background: #d9dade !important;\n}\n\n.arkme-redesign-task-error {\n color: #b84747;\n text-align: left;\n margin-top: 10px;\n font-size: 12px;\n}\n\n.arkme-redesign-starters {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n width: calc(100% - 18px);\n margin: 22px auto 0;\n display: grid;\n}\n\n.arkme-redesign-starters > button {\n text-align: left;\n border-right: 1px solid #e7e7e9;\n align-items: center;\n gap: 12px;\n min-width: 0;\n min-height: 48px;\n padding: 4px 18px;\n display: flex;\n}\n\n.arkme-redesign-starters > button:last-child {\n border-right: 0;\n}\n\n.arkme-redesign-starters > button:hover strong {\n color: #5365ad;\n}\n\n.arkme-redesign-starter-icon {\n color: #30333b;\n border: 1px solid #e2e3e6;\n border-radius: 50%;\n flex: none;\n place-items: center;\n width: 38px;\n height: 38px;\n display: grid;\n}\n\n.arkme-redesign-starters > button > span:last-child {\n gap: 4px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-redesign-starters strong {\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 13px;\n font-weight: 500;\n overflow: hidden;\n}\n\n.arkme-redesign-starters small {\n color: #8d919a;\n font-size: 12px;\n}\n\n.arkme-redesign-details {\n z-index: 4;\n top: var(--arkme-native-titlebar);\n background: #fff;\n border-left: 1px solid #e7e7e9;\n width: 360px;\n position: absolute;\n bottom: 0;\n right: 0;\n overflow: hidden;\n}\n\n.arkme-redesign-calendar-overlay {\n z-index: 14;\n inset: var(--arkme-native-titlebar) 0 0;\n pointer-events: none;\n position: absolute;\n}\n\n.arkme-redesign-calendar-overlay > * {\n pointer-events: auto;\n}\n\n.arkme-redesign-overlays {\n z-index: 20;\n pointer-events: none;\n position: absolute;\n inset: 0;\n}\n\n.arkme-redesign-overlays > * {\n pointer-events: auto;\n}\n\n.arkme-workspace-dialog-backdrop {\n z-index: 60;\n backdrop-filter: blur(2px);\n background: #181b2238;\n place-items: center;\n padding: 28px;\n display: grid;\n position: absolute;\n inset: 0;\n}\n\n.arkme-workspace-dialog {\n background: #fff;\n border: 1px solid #dddfe4;\n border-radius: 18px;\n grid-template-rows: auto auto minmax(0, 1fr) auto;\n width: min(640px, 100%);\n height: min(620px, 100%);\n min-height: 420px;\n display: grid;\n overflow: hidden;\n box-shadow: 0 24px 70px #191c232e;\n}\n\n.arkme-workspace-dialog > header {\n justify-content: space-between;\n align-items: flex-start;\n gap: 18px;\n padding: 22px 24px 16px;\n display: flex;\n}\n\n.arkme-workspace-dialog > header span {\n color: #8b8e96;\n font-size: 10px;\n}\n\n.arkme-workspace-dialog > header h2 {\n margin: 5px 0 0;\n font-size: 19px;\n font-weight: 600;\n}\n\n.arkme-workspace-dialog > header > button {\n border-radius: 9px;\n place-items: center;\n width: 32px;\n height: 32px;\n display: grid;\n}\n\n.arkme-workspace-dialog > nav {\n border-top: 1px solid #ececef;\n border-bottom: 1px solid #ececef;\n align-items: center;\n gap: 2px;\n min-height: 42px;\n padding: 0 22px;\n display: flex;\n overflow-x: auto;\n}\n\n.arkme-workspace-dialog > nav > span {\n white-space: nowrap;\n color: #9a9da5;\n align-items: center;\n gap: 2px;\n display: inline-flex;\n}\n\n.arkme-workspace-dialog > nav button {\n color: #666a73;\n border-radius: 8px;\n align-items: center;\n gap: 5px;\n height: 30px;\n padding: 0 7px;\n font-size: 11px;\n display: inline-flex;\n}\n\n.arkme-workspace-directory-list {\n min-height: 0;\n padding: 10px 14px;\n overflow-y: auto;\n}\n\n.arkme-workspace-directory-list > button {\n text-align: left;\n border-radius: 11px;\n grid-template-columns: 34px minmax(0, 1fr) 18px;\n align-items: center;\n gap: 9px;\n width: 100%;\n height: 48px;\n padding: 0 11px;\n display: grid;\n}\n\n.arkme-workspace-directory-list > button:hover {\n background: #f5f5f7;\n}\n\n.arkme-workspace-directory-list > button > span {\n color: #636873;\n border: 1px solid #e5e6e9;\n border-radius: 9px;\n place-items: center;\n width: 32px;\n height: 32px;\n display: grid;\n}\n\n.arkme-workspace-directory-list strong {\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 12px;\n font-weight: 500;\n overflow: hidden;\n}\n\n.arkme-workspace-dialog-status, .arkme-workspace-dialog-error {\n color: #8c9098;\n text-align: center;\n padding: 54px 16px;\n font-size: 12px;\n}\n\n.arkme-workspace-dialog-error {\n color: #b94b4b;\n}\n\n.arkme-workspace-dialog > footer {\n border-top: 1px solid #e8e9ec;\n justify-content: space-between;\n align-items: center;\n gap: 18px;\n min-height: 72px;\n padding: 12px 18px;\n display: flex;\n}\n\n.arkme-workspace-dialog-back {\n color: #696d76;\n align-items: center;\n gap: 6px;\n height: 36px;\n padding: 0 10px;\n font-size: 11px;\n display: inline-flex;\n}\n\n.arkme-workspace-dialog > footer > div {\n align-items: center;\n gap: 12px;\n min-width: 0;\n display: flex;\n}\n\n.arkme-workspace-dialog > footer small {\n white-space: nowrap;\n text-overflow: ellipsis;\n color: #92959d;\n max-width: 280px;\n font-size: 9px;\n overflow: hidden;\n}\n\n.arkme-workspace-dialog > footer > div > button {\n color: #fff;\n background: #20232d;\n border-radius: 10px;\n flex: none;\n height: 38px;\n padding: 0 17px;\n font-size: 11px;\n font-weight: 600;\n}\n\n.arkme-workspace-dialog button:disabled {\n opacity: .48;\n cursor: default;\n}\n\n.arkme-redesign-placeholder {\n color: #858992;\n text-align: center;\n place-content: center;\n justify-items: center;\n width: 100%;\n height: 100%;\n display: grid;\n}\n\n.arkme-redesign-placeholder > span {\n color: #555a64;\n border: 1px solid #e1e2e5;\n border-radius: 14px;\n place-items: center;\n width: 48px;\n height: 48px;\n display: grid;\n}\n\n.arkme-redesign-placeholder h1 {\n color: #3e424b;\n margin: 16px 0 7px;\n font-size: 18px;\n}\n\n.arkme-redesign-placeholder p {\n margin: 0;\n font-size: 12px;\n}\n\nbody[data-ds-dark-theme] [data-arkme-workspace] {\n --arkme-line: var(--dsw-alias-border-l1);\n --arkme-muted: var(--dsw-alias-label-tertiary);\n --arkme-soft: var(--dsw-alias-bg-layer-2);\n --arkme-focus: var(--dsw-alias-state-business-primary);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"persistent-sidebar\"], body[data-ds-dark-theme] [data-arkme-owned=\"product-navigation\"] {\n background: var(--dsw-specific-sidebar-fill) !important;\n color: var(--dsw-alias-label-secondary) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"product-brand\"] {\n box-shadow: none;\n background: none !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-workspace] [data-arkme-theme-image=\"light\"] {\n display: none !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-workspace] [data-arkme-theme-image=\"dark\"] {\n display: block !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"persistent-sidebar\"] > div {\n border-color: var(--dsw-alias-border-l1) !important;\n background: var(--dsw-alias-bg-layer-1) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"persistent-workspace\"] {\n background: var(--dsw-alias-bg-base) !important;\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"persistent-workspace\"] .arkme-conversation-surface, body[data-ds-dark-theme] [data-arkme-owned=\"persistent-workspace\"] .arkme-conversation-composer {\n background: var(--dsw-alias-bg-base) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"persistent-workspace\"] div:has( > input[aria-label=\"搜索\"]) {\n border-color: var(--dsw-alias-border-l2) !important;\n background: var(--dsw-specific-input-major) !important;\n box-shadow: var(--dsw-shadow-lv2) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"product-navigation\"] button:hover {\n background: var(--dsw-alias-interactive-bg-hover) !important;\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"product-navigation\"] button[aria-current=\"page\"] {\n background: var(--dsw-alias-interactive-bg-active) !important;\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"product-navigation\"] button[aria-current=\"page\"] > span[aria-hidden=\"true\"] {\n background: var(--dsw-alias-state-business-primary) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"product-surface\"], body[data-ds-dark-theme] [data-arkme-owned=\"directory-pane\"], body[data-ds-dark-theme] [data-arkme-owned=\"directory-pane\"] [aria-label=\"Arkme 会话列表\"], body[data-ds-dark-theme] [data-arkme-owned=\"persistent-sidebar\"] [aria-label=\"Arkme 会话列表\"] {\n background: var(--dsw-alias-bg-base) !important;\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"directory-pane\"] label:has( > input[aria-label=\"搜索对话或消息\"]), body[data-ds-dark-theme] [data-arkme-owned=\"directory-pane\"] button[aria-label=\"新任务\"], body[data-ds-dark-theme] [data-arkme-owned=\"persistent-sidebar\"] [aria-label=\"Arkme 会话列表\"] label:has( > input[aria-label=\"搜索对话或消息\"]), body[data-ds-dark-theme] [data-arkme-owned=\"persistent-sidebar\"] [aria-label=\"Arkme 会话列表\"] button[aria-label=\"新任务\"] {\n border-color: var(--dsw-alias-border-l2) !important;\n background: var(--dsw-specific-input-major) !important;\n color: var(--dsw-alias-label-secondary) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"directory-pane\"] [role=\"treeitem\"][aria-selected=\"true\"], body[data-ds-dark-theme] [data-arkme-owned=\"persistent-sidebar\"] [aria-label=\"Arkme 会话列表\"] [role=\"treeitem\"][aria-selected=\"true\"] {\n background: var(--dsw-alias-interactive-bg-active) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"directory-pane\"] [role=\"status\"][aria-label$=\"个人测试版\"], body[data-ds-dark-theme] [data-arkme-owned=\"persistent-sidebar\"] [aria-label=\"Arkme 会话列表\"] [role=\"status\"][aria-label$=\"个人测试版\"] {\n background: var(--dsw-alias-bg-layer-2) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"product-surface\"] .arkme-conversation-composer {\n background: var(--dsw-alias-bg-base) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-recordings-page [aria-label=\"全天候录音操作\"] > div > button, body[data-ds-dark-theme] [data-arkme-owned=\"product-surface\"] [aria-label=\"全天候录音操作\"] > div > button {\n border-color: var(--dsw-alias-border-l2) !important;\n background: var(--dsw-alias-button-elevated-fill) !important;\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-recordings-page [aria-label=\"全天候录音操作\"] > div > button:first-child, body[data-ds-dark-theme] [data-arkme-owned=\"product-surface\"] [aria-label=\"全天候录音操作\"] > div > button:first-child {\n border-color: var(--dsw-alias-button-primary-fill) !important;\n background: var(--dsw-alias-button-primary-fill) !important;\n color: var(--dsw-alias-label-primary-inverted) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-update-popover, body[data-ds-dark-theme] .arkme-update-capsule {\n border-color: var(--dsw-alias-border-l1);\n background: color-mix(in srgb, var(--dsw-alias-bg-base) 94%, transparent);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-update-popover-heading h2, body[data-ds-dark-theme] .arkme-update-release-notes strong, body[data-ds-dark-theme] .arkme-update-capsule-copy strong {\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-update-popover-heading span, body[data-ds-dark-theme] .arkme-update-popover-summary, body[data-ds-dark-theme] .arkme-update-release-notes small, body[data-ds-dark-theme] .arkme-update-capsule-copy small {\n color: var(--dsw-alias-label-secondary);\n}\n\nbody[data-ds-dark-theme] .arkme-update-release-notes, body[data-ds-dark-theme] .arkme-update-release-notes > div + div {\n border-color: var(--dsw-alias-border-l1);\n}\n\nbody[data-ds-dark-theme] .arkme-update-later, body[data-ds-dark-theme] .arkme-update-progress, body[data-ds-dark-theme] .arkme-update-rail:not(.is-available) {\n background: var(--dsw-alias-fill-l1);\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) {\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) > div > section[aria-label=\"客户端日历\"], body[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) > div > section[aria-label=\"当天内容\"] {\n border-color: var(--dsw-alias-border-l2) !important;\n background: var(--dsw-alias-bg-layer-1) !important;\n color: var(--dsw-alias-label-primary) !important;\n box-shadow: var(--dsw-shadow-lv2) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) > div > section[aria-label=\"客户端日历\"] > span[aria-hidden] {\n border-color: var(--dsw-alias-border-l2) !important;\n background: var(--dsw-alias-bg-layer-1) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"客户端日历\"] > header button, body[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"客户端日历\"] button[aria-label*=\"记录\"] {\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"客户端日历\"] > div > span {\n color: var(--dsw-alias-label-tertiary) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"客户端日历\"] button[data-selected=\"false\"][aria-label*=\"条记录\"] > span:last-child {\n background: var(--dsw-alias-bg-layer-2) !important;\n color: var(--dsw-alias-label-secondary) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"客户端日历\"] button[data-selected=\"true\"], body[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"客户端日历\"] button[data-selected=\"true\"] > span {\n color: var(--dsw-alias-label-primary-inverted) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"客户端日历\"] button[data-selected=\"true\"] > span:last-child {\n color: var(--dsw-alias-label-primary-inverted) !important;\n background: none !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"当天内容\"] article > div > div:last-child {\n border-color: var(--dsw-alias-border-l1) !important;\n background: var(--dsw-alias-bg-layer-2) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"当天内容\"] article h3, body[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"当天内容\"] article p {\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"当天内容\"] article time, body[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"当天内容\"] article span {\n color: var(--dsw-alias-label-secondary) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-root, body[data-ds-dark-theme] .arkme-redesign-chat-panel, body[data-ds-dark-theme] .arkme-redesign-content, body[data-ds-dark-theme] .arkme-redesign-feature-page, body[data-ds-dark-theme] .arkme-redesign-recordings-page, body[data-ds-dark-theme] .arkme-redesign-plugins-page, body[data-ds-dark-theme] .arkme-redesign-model-settings, body[data-ds-dark-theme] .arkme-redesign-details {\n background: var(--dsw-alias-bg-base);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-native-desktop .arkme-redesign-root:before {\n background: var(--dsw-alias-border-l1);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-rail {\n border-color: var(--dsw-alias-border-l2);\n background: var(--dsw-specific-sidebar-fill);\n box-shadow: var(--dsw-shadow-lv2);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-rail-primary button, body[data-ds-dark-theme] .arkme-redesign-rail-footer > button, body[data-ds-dark-theme] .arkme-redesign-profile-menu button, body[data-ds-dark-theme] .arkme-redesign-task-list > button, body[data-ds-dark-theme] .arkme-redesign-task-first, body[data-ds-dark-theme] .arkme-workspace-dialog > nav button, body[data-ds-dark-theme] .arkme-workspace-dialog-back, body[data-ds-dark-theme] .arkme-redesign-placeholder > span {\n color: var(--dsw-alias-label-secondary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-rail-primary button:hover, body[data-ds-dark-theme] .arkme-redesign-rail-footer > button:hover, body[data-ds-dark-theme] .arkme-redesign-profile-menu button:hover, body[data-ds-dark-theme] .arkme-redesign-chat-search:hover, body[data-ds-dark-theme] .arkme-redesign-task-section-title button:hover, body[data-ds-dark-theme] .arkme-redesign-task-list > button:hover, body[data-ds-dark-theme] .arkme-redesign-task-first:hover, body[data-ds-dark-theme] .arkme-extension-toolbar > button:hover, body[data-ds-dark-theme] button.arkme-redesign-setting-row:hover, body[data-ds-dark-theme] a.arkme-redesign-setting-row:hover, body[data-ds-dark-theme] .arkme-redesign-model-settings > header button:hover, body[data-ds-dark-theme] .arkme-redesign-round-tool:hover, body[data-ds-dark-theme] .arkme-workspace-directory-list > button:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-rail-primary button.is-active, body[data-ds-dark-theme] .arkme-redesign-rail-footer > button.is-active, body[data-ds-dark-theme] .arkme-redesign-task-list > button.is-selected {\n background: var(--dsw-alias-interactive-bg-active);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-rail-primary button.is-active:before {\n background: var(--dsw-alias-state-business-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-rail-footer, body[data-ds-dark-theme] .arkme-redesign-profile-menu, body[data-ds-dark-theme] .arkme-redesign-task-section, body[data-ds-dark-theme] .arkme-redesign-route-chats .arkme-conversation-header, body[data-ds-dark-theme] .arkme-redesign-search-page .arkme-search-history button, body[data-ds-dark-theme] .arkme-redesign-search-page .arkme-search-quick button, body[data-ds-dark-theme] .arkme-redesign-settings-group h2, body[data-ds-dark-theme] .arkme-redesign-setting-row, body[data-ds-dark-theme] .arkme-account-info-row, body[data-ds-dark-theme] .arkme-redesign-starters > button, body[data-ds-dark-theme] .arkme-redesign-details, body[data-ds-dark-theme] .arkme-workspace-dialog > nav, body[data-ds-dark-theme] .arkme-workspace-dialog > footer {\n border-color: var(--dsw-alias-border-l1) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-profile-popover, body[data-ds-dark-theme] .arkme-workspace-dialog {\n border-color: var(--dsw-alias-border-l2);\n background: var(--dsw-specific-menu);\n box-shadow: var(--dsw-shadow-lv3);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-profile-head small, body[data-ds-dark-theme] .arkme-redesign-profile-menu small, body[data-ds-dark-theme] .arkme-redesign-profile-menu button > svg:last-child, body[data-ds-dark-theme] .arkme-redesign-task-section-title, body[data-ds-dark-theme] .arkme-redesign-task-copy small, body[data-ds-dark-theme] .arkme-account-profile-qr, body[data-ds-dark-theme] .arkme-redesign-feature-page > header p, body[data-ds-dark-theme] .arkme-redesign-feature-page > header span, body[data-ds-dark-theme] .arkme-redesign-search-page input[aria-label=\"搜索\"]:not(:focus)::placeholder, body[data-ds-dark-theme] .arkme-redesign-settings-profile p, body[data-ds-dark-theme] .arkme-redesign-settings-group h2, body[data-ds-dark-theme] .arkme-redesign-setting-summary, body[data-ds-dark-theme] .arkme-account-info-copy > small, body[data-ds-dark-theme] .arkme-account-info-action, body[data-ds-dark-theme] .arkme-account-info-row > svg, body[data-ds-dark-theme] .arkme-account-info-icon, body[data-ds-dark-theme] .arkme-redesign-setting-row > svg, body[data-ds-dark-theme] .arkme-redesign-hero-input textarea::placeholder, body[data-ds-dark-theme] .arkme-redesign-starters small, body[data-ds-dark-theme] .arkme-workspace-dialog > header span, body[data-ds-dark-theme] .arkme-workspace-dialog > nav > span, body[data-ds-dark-theme] .arkme-workspace-dialog-status, body[data-ds-dark-theme] .arkme-workspace-dialog > footer small, body[data-ds-dark-theme] .arkme-redesign-placeholder {\n color: var(--dsw-alias-label-tertiary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-chat-search, body[data-ds-dark-theme] .arkme-extension-toolbar label, body[data-ds-dark-theme] .arkme-extension-toolbar > button, body[data-ds-dark-theme] .arkme-redesign-settings-group, body[data-ds-dark-theme] .arkme-redesign-model-settings > header button, body[data-ds-dark-theme] .arkme-redesign-source-button, body[data-ds-dark-theme] .arkme-redesign-round-tool, body[data-ds-dark-theme] .arkme-redesign-starter-icon, body[data-ds-dark-theme] .arkme-workspace-directory-list > button > span, body[data-ds-dark-theme] .arkme-redesign-placeholder > span {\n border-color: var(--dsw-alias-border-l2) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-chat-search, body[data-ds-dark-theme] .arkme-extension-toolbar label {\n color: var(--dsw-alias-label-tertiary) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-extension-toolbar input, body[data-ds-dark-theme] .arkme-redesign-settings-profile h1, body[data-ds-dark-theme] .arkme-redesign-model-settings > header button, body[data-ds-dark-theme] .arkme-redesign-task-start h1, body[data-ds-dark-theme] .arkme-redesign-hero-input textarea, body[data-ds-dark-theme] .arkme-redesign-starter-icon, body[data-ds-dark-theme] .arkme-redesign-placeholder h1 {\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-task-list, body[data-ds-dark-theme] .arkme-redesign-model-settings > header button, body[data-ds-dark-theme] .arkme-redesign-plugins-page .arkme-extension-card {\n background: var(--dsw-alias-bg-layer-1) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-settings-surface, body[data-ds-dark-theme] .arkme-redesign-settings-group {\n color: var(--dsw-alias-label-primary);\n background: none !important;\n}\n\nbody[data-ds-dark-theme] .arkme-account-dialog {\n border-color: var(--dsw-alias-border-l2);\n background: var(--dsw-specific-menu);\n color: var(--dsw-alias-label-primary);\n box-shadow: var(--dsw-shadow-lv3);\n}\n\nbody[data-ds-dark-theme] .arkme-account-dialog > header, body[data-ds-dark-theme] .arkme-account-qr-card {\n border-color: var(--dsw-alias-border-l1);\n}\n\nbody[data-ds-dark-theme] .arkme-account-qr-card, body[data-ds-dark-theme] .arkme-account-form input, body[data-ds-dark-theme] .arkme-account-code-row button, body[data-ds-dark-theme] .arkme-account-dialog-actions button {\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-primary);\n border-color: var(--dsw-alias-border-l2);\n}\n\nbody[data-ds-dark-theme] .arkme-account-dialog-actions button[type=\"submit\"], body[data-ds-dark-theme] .arkme-account-dialog-actions button:last-child {\n border-color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-label-primary);\n color: var(--dsw-alias-bg-base);\n}\n\nbody[data-ds-dark-theme] .arkme-account-rule, body[data-ds-dark-theme] .arkme-account-qr-card span, body[data-ds-dark-theme] .arkme-account-qr-card small, body[data-ds-dark-theme] .arkme-account-form label {\n color: var(--dsw-alias-label-tertiary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-route-chats .arkme-conversation-surface, body[data-ds-dark-theme] .arkme-redesign-plugins-page .arkme-extension-center-embedded > section {\n background: var(--dsw-alias-bg-base) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-route-chats .arkme-conversation-composer-inner, body[data-ds-dark-theme] .arkme-redesign-search-page .arkme-search-box {\n border-color: var(--dsw-alias-border-l2) !important;\n background: var(--dsw-specific-input-major) !important;\n color: var(--dsw-alias-label-primary) !important;\n box-shadow: var(--dsw-shadow-lv2) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-route-chats .arkme-conversation-composer-inner[data-arkme-primary-composer=\"true\"] {\n box-shadow: none !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-route-chats .arkme-conversation-composer-inner[data-arkme-primary-composer=\"true\"][data-arkme-composer-focused=\"true\"] {\n background: color-mix(in srgb, var(--dsw-alias-bg-base, #fff) 97%, #000) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-task-greeting img {\n filter: invert() hue-rotate(180deg);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-hero-input {\n border-color: var(--dsw-alias-border-l2) !important;\n background: var(--dsw-specific-input-major) !important;\n color: var(--dsw-alias-label-primary) !important;\n box-shadow: var(--dsw-shadow-lv2) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-hero-input textarea {\n background: none !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-source-button, body[data-ds-dark-theme] .arkme-redesign-round-tool, body[data-ds-dark-theme] .arkme-redesign-starter-icon {\n background: var(--dsw-alias-button-elevated-fill) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-search-page .arkme-search-history button, body[data-ds-dark-theme] .arkme-redesign-search-page .arkme-search-quick button {\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-plugins-page .arkme-extension-card {\n border-color: var(--dsw-alias-border-l1) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-plugins-page .arkme-extension-card:hover {\n border-color: var(--dsw-alias-border-l2) !important;\n background: var(--dsw-alias-interactive-bg-hover) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-task-section:focus-within .arkme-redesign-task-list {\n box-shadow: var(--dsw-shadow-lv2);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-settings-error {\n background: var(--dsw-alias-interactive-bg-hover-danger);\n color: var(--dsw-alias-state-error-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-page-header h1, body[data-ds-dark-theme] .arkme-remote-section-header h2, body[data-ds-dark-theme] .arkme-remote-allow-row strong, body[data-ds-dark-theme] .arkme-remote-device-row strong, body[data-ds-dark-theme] .arkme-remote-name-row strong, body[data-ds-dark-theme] .arkme-remote-dialog, body[data-ds-dark-theme] .arkme-remote-pairing-code {\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-section-header p, body[data-ds-dark-theme] .arkme-remote-page-header p, body[data-ds-dark-theme] .arkme-remote-allow-row span, body[data-ds-dark-theme] .arkme-remote-device-row span, body[data-ds-dark-theme] .arkme-remote-name-row small, body[data-ds-dark-theme] .arkme-remote-dialog header p, body[data-ds-dark-theme] .arkme-remote-pairing-display > p, body[data-ds-dark-theme] .arkme-remote-dialog-note, body[data-ds-dark-theme] .arkme-remote-empty-row {\n color: var(--dsw-alias-label-tertiary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-settings-card, body[data-ds-dark-theme] .arkme-remote-settings-dialog, body[data-ds-dark-theme] .arkme-remote-dialog, body[data-ds-dark-theme] .arkme-remote-pairing-display, body[data-ds-dark-theme] .arkme-remote-rename input {\n border-color: var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-allow-row, body[data-ds-dark-theme] .arkme-remote-device-row, body[data-ds-dark-theme] .arkme-remote-rename, body[data-ds-dark-theme] .arkme-remote-page-header {\n border-color: var(--dsw-alias-border-l1);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-settings-close, body[data-ds-dark-theme] .arkme-remote-icon-button, body[data-ds-dark-theme] .arkme-remote-dialog-close, body[data-ds-dark-theme] .arkme-remote-pairing-tools button, body[data-ds-dark-theme] .arkme-remote-name-row {\n color: var(--dsw-alias-label-secondary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-settings-close:hover, body[data-ds-dark-theme] .arkme-remote-icon-button:hover, body[data-ds-dark-theme] .arkme-remote-dialog-close:hover, body[data-ds-dark-theme] .arkme-remote-pairing-tools button:hover, body[data-ds-dark-theme] .arkme-remote-name-row:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-add-button, body[data-ds-dark-theme] .arkme-remote-rename button[type=\"submit\"], body[data-ds-dark-theme] .arkme-remote-pairing-expired button {\n background: var(--dsw-alias-button-primary-fill);\n color: var(--dsw-alias-label-primary-inverted);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-device-row > button, body[data-ds-dark-theme] .arkme-remote-rename button {\n border-color: var(--dsw-alias-border-l2);\n background: var(--dsw-alias-button-elevated-fill);\n color: var(--dsw-alias-label-secondary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-switch[aria-checked=\"true\"] {\n background: var(--dsw-alias-state-business-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-pairing-tabs {\n background: var(--dsw-alias-bg-layer-2);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-pairing-tabs button {\n color: var(--dsw-alias-label-tertiary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-pairing-tabs button[aria-selected=\"true\"] {\n background: var(--dsw-alias-button-elevated-fill);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-settings-dialog-backdrop, body[data-ds-dark-theme] .arkme-remote-dialog-backdrop {\n background: #07090d8f;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-setting-row > strong.is-danger, body[data-ds-dark-theme] .arkme-redesign-task-error, body[data-ds-dark-theme] .arkme-workspace-dialog-error {\n color: var(--dsw-alias-state-error-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-task-state.is-complete > i {\n background: var(--dsw-alias-state-success-tertiary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-task-state.is-complete > i:after {\n background: var(--dsw-alias-state-success-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-task-matrix i, body[data-ds-dark-theme] .arkme-redesign-rail-primary button.is-active:before {\n background: var(--dsw-alias-state-business-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-hero-input:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: 0 0 0 3px var(--dsw-alias-state-business-tertiary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-starters > button:hover strong {\n color: var(--dsw-alias-state-business-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-send-task, body[data-ds-dark-theme] .arkme-workspace-dialog > footer > div > button {\n background: var(--dsw-alias-button-primary-fill) !important;\n color: var(--dsw-alias-label-primary-inverted) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-send-task:disabled {\n background: var(--dsw-alias-button-elevated-fill) !important;\n color: var(--dsw-alias-label-secondary) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-workspace-dialog-backdrop {\n background: var(--dsw-alias-bg-mask-1);\n}\n\n@media (width <= 1024px) {\n .arkme-redesign-chat-panel {\n width: 264px;\n left: 82px;\n }\n\n .arkme-redesign-content {\n left: 82px;\n }\n\n .arkme-redesign-content.has-panel {\n left: 346px;\n }\n\n .arkme-redesign-rail {\n left: 12px;\n }\n\n .arkme-redesign-starters > button {\n padding: 0 10px;\n }\n\n .arkme-redesign-feature-page {\n padding-left: 30px;\n padding-right: 30px;\n }\n}\n\n@media (width <= 820px) {\n .arkme-redesign-chat-panel {\n display: none;\n }\n\n .arkme-redesign-content.has-panel {\n left: 82px;\n }\n\n .arkme-redesign-task-start {\n padding: 28px;\n }\n\n .arkme-redesign-starters {\n grid-template-columns: 1fr;\n gap: 6px;\n }\n\n .arkme-redesign-starters > button {\n border-right: 0;\n }\n\n .arkme-voiceprint-relationships {\n grid-template-columns: minmax(0, 1fr) !important;\n gap: 28px !important;\n }\n\n .arkme-voiceprint-outbound {\n border-left: 0 !important;\n border-top: 1px solid var(--dsw-alias-border-subtle, #e6e7eb) !important;\n padding-top: 28px !important;\n padding-left: 0 !important;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .arkme-redesign-task-matrix i {\n opacity: .6;\n animation: none;\n }\n\n .arkme-update-rail.is-downloading svg, .arkme-update-popover, .arkme-update-capsule, .arkme-update-progress.is-indeterminate span {\n animation: none;\n }\n\n .arkme-update-rail, .arkme-update-progress span {\n transition: none;\n }\n}\n\n.arkme-contact-directory, .arkme-directory-detail-pane {\n box-sizing: border-box;\n min-width: 0;\n height: 100%;\n min-height: 0;\n color: var(--dsw-alias-label-primary, #202124);\n font-size: 13px;\n overflow: hidden;\n}\n\n[data-arkme-directory-mode=\"contacts\"] {\n background: var(--dsw-specific-sidebar-fill, #fff) !important;\n border-left-color: var(--dsw-alias-border-l1, #ececef) !important;\n}\n\n.arkme-contact-directory {\n overflow-wrap: anywhere;\n padding: 8px 6px 18px;\n overflow-y: auto;\n}\n\n.arkme-directory-detail-pane {\n overflow: hidden;\n}\n\n.arkme-contact-directory button, .arkme-directory-detail-pane button {\n appearance: none;\n box-sizing: border-box;\n font: inherit;\n color: inherit;\n border: 0;\n margin: 0;\n}\n\n.arkme-contact-directory-section {\n border-bottom: 1px solid var(--dsw-alias-border-l1, var(--arkme-line));\n min-width: 0;\n padding: 2px 0 5px;\n}\n\n.arkme-contact-directory-section-header {\n text-align: left;\n cursor: pointer;\n background: none;\n border-radius: 10px;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n width: 100%;\n min-width: 0;\n min-height: 42px;\n padding: 0 10px;\n display: flex;\n}\n\n.arkme-contact-directory-section-title {\n align-items: center;\n gap: 6px;\n min-width: 0;\n display: flex;\n}\n\n.arkme-contact-directory-section-title strong {\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 13px;\n font-weight: 650;\n overflow: hidden;\n}\n\n.arkme-contact-directory-caret {\n width: 14px;\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n text-align: center;\n transform-origin: center;\n flex: none;\n font-size: 18px;\n line-height: 1;\n transition: transform .16s;\n}\n\n.arkme-contact-directory-section-header[aria-expanded=\"true\"] .arkme-contact-directory-caret {\n transform: rotate(90deg);\n}\n\n.arkme-contact-directory-section-header:hover {\n background: var(--dsw-alias-interactive-bg-hover, #f6f6f7);\n}\n\n.arkme-contact-directory-section-body {\n min-width: 0;\n padding: 0 0 5px;\n}\n\n.arkme-contact-directory-list {\n gap: 1px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-contact-directory-count {\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n font-variant-numeric: tabular-nums;\n flex: none;\n font-size: 11px;\n}\n\n.arkme-contact-directory-row {\n text-align: left;\n cursor: pointer;\n background: none;\n border-radius: 13px;\n align-items: center;\n gap: 10px;\n width: 100%;\n min-width: 0;\n min-height: 52px;\n margin: 1px 0;\n padding: 7px 10px;\n display: flex;\n overflow: hidden;\n}\n\n.arkme-contact-directory-row img {\n object-fit: cover;\n border-radius: 50%;\n flex: none;\n width: 38px;\n height: 38px;\n}\n\n.arkme-contact-directory-row.is-static {\n cursor: default;\n}\n\n.arkme-contact-directory-row.is-selected {\n background: var(--dsw-alias-interactive-bg-active, #eef0f4);\n}\n\n.arkme-contact-directory-row:not(.is-static):hover {\n background: var(--dsw-alias-interactive-bg-hover, #f6f6f7);\n}\n\n.arkme-contact-directory-avatar {\n border-radius: 50%;\n flex: none;\n place-items: center;\n width: 38px;\n height: 38px;\n display: grid;\n overflow: hidden;\n}\n\n.arkme-contact-directory-row-copy {\n flex: 1;\n align-content: center;\n min-width: 0;\n display: grid;\n overflow: hidden;\n}\n\n.arkme-contact-directory-row-copy strong {\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 13px;\n font-weight: 600;\n line-height: 18px;\n overflow: hidden;\n}\n\n.arkme-contact-directory-row-copy small {\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--dsw-alias-label-secondary, #68707c);\n font-size: 11px;\n line-height: 16px;\n overflow: hidden;\n}\n\n.arkme-contact-directory-letter {\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n padding: 8px 10px 2px;\n font-size: 11px;\n font-weight: 600;\n line-height: 16px;\n}\n\n.arkme-contact-directory-alphabetical, .arkme-contact-directory-letter-group {\n min-width: 0;\n}\n\n.arkme-contact-directory-status, .arkme-contact-directory-warning {\n color: var(--dsw-alias-label-secondary, var(--arkme-muted));\n overflow-wrap: anywhere;\n margin: 3px 8px;\n padding: 7px 9px;\n font-size: 11px;\n line-height: 16px;\n}\n\n.arkme-contact-directory-warning {\n color: var(--dsw-alias-state-warning-primary, #b45309);\n background: var(--dsw-alias-state-warning-tertiary, #fff7ed);\n border-radius: 9px;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n display: flex;\n}\n\n.arkme-contact-directory-warning button {\n color: inherit;\n cursor: pointer;\n background: none;\n flex: none;\n padding: 2px 4px;\n font-weight: 600;\n}\n\n.arkme-contact-directory-more {\n text-align: center;\n cursor: pointer;\n background: none;\n border-radius: 9px;\n width: calc(100% - 16px);\n min-height: 32px;\n padding: 6px 8px;\n color: var(--dsw-alias-state-business-primary, #4f5fbf) !important;\n margin: 3px 8px !important;\n}\n\n.arkme-contact-directory-empty {\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n text-align: center;\n padding: 14px 12px;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-directory-detail-empty {\n background: var(--dsw-alias-bg-base, #fff);\n place-items: center;\n min-width: 0;\n height: 100%;\n min-height: 0;\n display: grid;\n}\n\n.arkme-directory-detail-logo {\n object-fit: contain;\n opacity: .9;\n width: 96px;\n height: 96px;\n}\n\n.arkme-contact-detail, .arkme-contact-profile, .arkme-contact-world-card, .arkme-unmarked-speaker-summary, .arkme-unmarked-speaker-audio, .arkme-unmarked-speaker-choice {\n overflow-wrap: anywhere;\n min-width: 0;\n}\n\n.arkme-contact-detail {\n background: var(--dsw-alias-bg-base, #fff);\n grid-template-rows: auto minmax(0, 1fr);\n height: 100%;\n min-height: 0;\n display: grid;\n overflow: hidden;\n}\n\n.arkme-contact-profile {\n border-bottom: 1px solid var(--dsw-alias-border-l1, var(--arkme-line));\n padding: 32px clamp(24px, 5vw, 56px);\n}\n\n.arkme-contact-profile-main {\n grid-template-columns: 72px minmax(0, 1fr) auto;\n align-items: center;\n gap: 18px;\n width: min(100%, 760px);\n margin: 0 auto;\n display: grid;\n}\n\n.arkme-contact-profile-avatar {\n border-radius: 50%;\n place-items: center;\n width: 72px;\n height: 72px;\n display: grid;\n overflow: hidden;\n}\n\n.arkme-contact-profile-identity {\n gap: 8px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-contact-profile-name {\n text-overflow: ellipsis;\n white-space: nowrap;\n margin: 0;\n font-size: 20px;\n font-weight: 650;\n line-height: 28px;\n display: block;\n overflow: hidden;\n}\n\n.arkme-contact-profile-fields {\n gap: 4px;\n margin: 0;\n display: grid;\n}\n\n.arkme-contact-profile-fields > div {\n min-width: 0;\n color: var(--dsw-alias-label-secondary, #68707c);\n gap: 4px;\n font-size: 12px;\n line-height: 18px;\n display: flex;\n}\n\n.arkme-contact-profile-fields dt, .arkme-contact-profile-fields dd {\n text-overflow: ellipsis;\n white-space: nowrap;\n margin: 0;\n overflow: hidden;\n}\n\n.arkme-contact-profile-fields dt {\n flex: none;\n}\n\n[data-arkme-workspace] .arkme-contact-profile-message {\n background: var(--dsw-alias-button-primary-fill, #5667cc);\n cursor: pointer;\n border-radius: 10px;\n min-height: 36px;\n padding: 0 16px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary-inverted, #fff) !important;\n}\n\n.arkme-contact-profile-message:disabled {\n opacity: .55;\n cursor: default;\n}\n\n.arkme-contact-profile-error, .arkme-contact-profile-message-error {\n max-width: 760px;\n color: var(--dsw-alias-state-error-primary, #b42318);\n overflow-wrap: anywhere;\n margin: 0 auto;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-contact-profile-error {\n background: var(--dsw-alias-state-error-tertiary, #fff1f0);\n border-radius: 10px;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n padding: 12px 14px;\n display: flex;\n}\n\n.arkme-contact-profile-status {\n max-width: 760px;\n color: var(--dsw-alias-label-secondary, var(--arkme-muted));\n margin: 0 auto;\n padding: 24px 0;\n font-size: 12px;\n}\n\n.arkme-team-detail {\n background: var(--dsw-alias-bg-base, #fff);\n grid-template-rows: auto minmax(0, 1fr);\n min-width: 0;\n height: 100%;\n min-height: 0;\n display: grid;\n overflow: hidden;\n}\n\n.arkme-team-detail-header {\n border-bottom: 1px solid var(--dsw-alias-border-l1, var(--arkme-line));\n min-width: 0;\n padding: 32px clamp(24px, 5vw, 56px);\n}\n\n.arkme-team-detail-header-main {\n grid-template-columns: 72px minmax(0, 1fr) auto;\n align-items: center;\n gap: 18px;\n width: min(100%, 760px);\n min-width: 0;\n margin: 0 auto;\n display: grid;\n}\n\n.arkme-team-detail-glyph {\n background: var(--dsw-alias-state-business-tertiary, #eef0ff);\n width: 72px;\n height: 72px;\n color: var(--dsw-alias-state-business-primary, #4f5fbf);\n border-radius: 20px;\n place-items: center;\n font-size: 20px;\n font-weight: 700;\n line-height: 1;\n display: grid;\n}\n\n.arkme-team-detail-summary {\n gap: 7px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-team-detail-header h1 {\n text-overflow: ellipsis;\n white-space: nowrap;\n letter-spacing: -.02em;\n margin: 0;\n font-size: 20px;\n font-weight: 650;\n line-height: 28px;\n overflow: hidden;\n}\n\n.arkme-team-detail-meta {\n flex-wrap: wrap;\n align-items: center;\n gap: 7px;\n min-width: 0;\n display: flex;\n}\n\n.arkme-team-detail-public-id {\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 100%;\n color: var(--dsw-alias-label-secondary, #68707c);\n font-size: 12px;\n line-height: 20px;\n overflow: hidden;\n}\n\n.arkme-team-role-badge, .arkme-team-member-role {\n background: var(--dsw-alias-bg-layer-2, #f2f3f5);\n color: var(--dsw-alias-label-secondary, #68707c);\n border-radius: 999px;\n flex: none;\n font-size: 11px;\n font-weight: 600;\n line-height: 20px;\n}\n\n.arkme-team-role-badge {\n padding: 0 8px;\n}\n\n.arkme-team-detail-count {\n min-width: 58px;\n color: var(--dsw-alias-label-secondary, #68707c);\n justify-items: end;\n gap: 1px;\n display: grid;\n}\n\n.arkme-team-detail-count strong {\n color: var(--dsw-alias-label-primary, #202124);\n font-variant-numeric: tabular-nums;\n font-size: 21px;\n font-weight: 680;\n line-height: 24px;\n}\n\n.arkme-team-detail-count span {\n font-size: 11px;\n line-height: 16px;\n}\n\n.arkme-team-members {\n box-sizing: border-box;\n background: var(--dsw-alias-bg-subtle, #f7f7f8);\n min-width: 0;\n min-height: 0;\n padding: 22px clamp(24px, 5vw, 56px) 32px;\n overflow-y: auto;\n}\n\n.arkme-team-members-container {\n width: min(100%, 760px);\n min-width: 0;\n margin: 0 auto;\n}\n\n.arkme-team-members h2 {\n margin: 0 0 13px;\n font-size: 15px;\n font-weight: 650;\n line-height: 22px;\n}\n\n.arkme-team-member-list {\n border: 1px solid var(--dsw-alias-border-l1, var(--arkme-line));\n background: var(--dsw-alias-bg-layer-1, #fff);\n border-radius: 14px;\n min-width: 0;\n overflow: hidden;\n box-shadow: 0 8px 24px #161b2309;\n}\n\n.arkme-team-member-row {\n box-sizing: border-box;\n border-bottom: 1px solid var(--dsw-alias-border-l1, var(--arkme-line));\n grid-template-columns: 40px minmax(0, 1fr) auto;\n align-items: center;\n gap: 12px;\n min-width: 0;\n min-height: 64px;\n padding: 11px 14px;\n display: grid;\n}\n\n.arkme-team-member-row:not(:has( ~ .arkme-team-member-row)) {\n border-bottom: 0;\n}\n\n.arkme-team-member-avatar {\n border-radius: 50%;\n place-items: center;\n width: 40px;\n height: 40px;\n display: grid;\n overflow: hidden;\n}\n\n.arkme-team-member-copy {\n gap: 2px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-team-member-copy strong, .arkme-team-member-copy small {\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n}\n\n.arkme-team-member-copy strong {\n font-size: 14px;\n font-weight: 620;\n line-height: 20px;\n}\n\n.arkme-team-member-copy small {\n color: var(--dsw-alias-label-secondary, #68707c);\n font-size: 12px;\n line-height: 17px;\n}\n\n.arkme-team-member-role {\n padding: 0 9px;\n}\n\n.arkme-team-role-badge[data-team-role=\"owner\"], .arkme-team-role-badge[data-team-role=\"admin\"], .arkme-team-member-role[data-team-member-role=\"owner\"], .arkme-team-member-role[data-team-member-role=\"admin\"] {\n background: var(--dsw-alias-state-business-tertiary, #eef0ff);\n color: var(--dsw-alias-state-business-primary, #4f5fbf);\n}\n\n.arkme-team-detail-status {\n min-height: 100%;\n color: var(--dsw-alias-label-secondary, #68707c);\n justify-content: center;\n align-items: center;\n gap: 12px;\n display: flex;\n}\n\n.arkme-team-detail-status.is-error, .arkme-team-member-more-error {\n color: var(--dsw-alias-state-error-primary, #b42318);\n}\n\n.arkme-team-detail-status button, .arkme-team-member-more {\n border: 1px solid var(--dsw-alias-border-l2, var(--arkme-line));\n background: var(--dsw-alias-button-elevated-fill, #fff);\n cursor: pointer;\n border-radius: 9px;\n min-height: 34px;\n padding: 0 12px;\n}\n\n.arkme-team-member-more {\n width: calc(100% - 24px);\n color: var(--dsw-alias-state-business-primary, #4f5fbf) !important;\n margin: 12px !important;\n}\n\n.arkme-team-member-more:disabled {\n opacity: .55;\n cursor: default;\n}\n\n.arkme-team-member-more-error {\n padding: 12px 14px 0;\n font-size: 12px;\n}\n\n.arkme-contact-world {\n min-height: 0;\n display: grid;\n overflow: hidden;\n}\n\n.arkme-contact-detail > .arkme-contact-world {\n box-sizing: border-box;\n background: var(--dsw-alias-bg-subtle, #f7f7f8);\n padding: 22px clamp(20px, 4vw, 52px) 28px;\n}\n\n.arkme-contact-world-container {\n box-sizing: border-box;\n background: var(--dsw-alias-bg-layer-1, #fff);\n border-radius: 18px;\n flex-direction: column;\n width: min(100%, 980px);\n min-width: 0;\n height: 100%;\n min-height: 0;\n margin: 0 auto;\n display: flex;\n overflow-y: auto;\n box-shadow: 0 16px 48px #161b230f;\n}\n\n.arkme-contact-world-title {\n box-sizing: border-box;\n width: min(100%, 760px);\n margin: 0 auto;\n padding: 22px 28px 10px;\n font-size: 15px;\n font-weight: 650;\n line-height: 22px;\n}\n\n.arkme-contact-world-list {\n box-sizing: border-box;\n align-content: start;\n gap: 30px;\n width: min(100%, 760px);\n min-height: 0;\n margin: 0 auto;\n padding: 28px 28px 42px;\n display: grid;\n}\n\n.arkme-contact-world-year {\n gap: 24px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-contact-world-year > h2 {\n letter-spacing: -.04em;\n margin: 0;\n font-size: 28px;\n font-weight: 750;\n line-height: 36px;\n}\n\n.arkme-contact-world-entry {\n gap: 8px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-contact-world-diary {\n color: var(--dsw-alias-label-secondary, #68707c);\n font-size: 13px;\n font-weight: 500;\n line-height: 19px;\n}\n\n.arkme-contact-world-entry > .arkme-contact-world-time {\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n align-items: center;\n gap: 8px;\n font-size: 11px;\n line-height: 16px;\n display: flex;\n}\n\n.arkme-contact-world-entry > .arkme-contact-world-time span {\n font-size: 17px;\n line-height: 10px;\n}\n\n.arkme-contact-world-card {\n border: 1px dashed var(--dsw-alias-border-l2, #d9dce2);\n background: var(--dsw-alias-bg-layer-1, #fff);\n border-radius: 14px;\n gap: 10px;\n padding: 15px 16px;\n display: grid;\n}\n\n.arkme-contact-world-card-header {\n grid-template-columns: 36px minmax(0, 1fr) auto;\n align-items: center;\n gap: 9px;\n display: grid;\n}\n\n.arkme-contact-world-author {\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n font-size: 13px;\n font-weight: 600;\n overflow: hidden;\n}\n\n.arkme-contact-world-time {\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n flex: none;\n font-size: 11px;\n}\n\n.arkme-contact-world-headline {\n margin: 2px 0 0;\n font-size: 14px;\n line-height: 20px;\n}\n\n.arkme-contact-world-text {\n color: var(--dsw-alias-label-secondary, #68707c);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n margin: 0;\n font-size: 13px;\n line-height: 20px;\n}\n\n.arkme-contact-world-images {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 6px;\n width: 100%;\n min-width: 0;\n max-width: 620px;\n display: grid;\n}\n\n.arkme-contact-world-image {\n aspect-ratio: 1;\n object-fit: cover;\n border-radius: 11px;\n width: 100%;\n display: block;\n}\n\n.arkme-contact-world-image-error, .arkme-contact-world-image-loading {\n aspect-ratio: 1;\n background: var(--dsw-alias-bg-layer-2, var(--arkme-soft));\n width: 100%;\n min-width: 0;\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n border-radius: 11px;\n place-items: center;\n display: grid;\n}\n\n.arkme-contact-world-tags {\n flex-wrap: wrap;\n gap: 6px;\n display: flex;\n}\n\n.arkme-contact-world-tag {\n background: var(--dsw-alias-bg-layer-2, var(--arkme-soft));\n color: var(--dsw-alias-label-secondary, var(--arkme-muted));\n border-radius: 999px;\n padding: 2px 7px;\n font-size: 11px;\n}\n\n.arkme-contact-world-empty {\n box-sizing: border-box;\n text-align: center;\n flex: 1;\n place-content: center;\n justify-items: center;\n min-height: 240px;\n padding: 36px 20px;\n display: grid;\n}\n\n.arkme-contact-world-empty img {\n width: 140px;\n height: 100px;\n display: block;\n}\n\n.arkme-contact-world-empty p {\n color: var(--dsw-alias-label-secondary, #858992);\n margin: 16px 0 0;\n font-size: 13px;\n line-height: 20px;\n}\n\n.arkme-contact-world-error, .arkme-contact-world-status {\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n text-align: center;\n place-self: center;\n padding: 28px 20px;\n font-size: 12px;\n}\n\n.arkme-contact-world-error {\n color: var(--dsw-alias-state-error-primary, #b42318);\n}\n\n.arkme-contact-world-load-more {\n cursor: pointer;\n background: none;\n border-radius: 9px;\n place-self: center;\n min-height: 34px;\n padding: 0 12px;\n color: var(--dsw-alias-state-business-primary, #4f5fbf) !important;\n}\n\n.arkme-contact-world-load-more-status, .arkme-contact-world-load-more-error {\n min-height: 20px;\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n text-align: center;\n padding: 8px 16px;\n font-size: 11px;\n}\n\n.arkme-contact-world-load-more-error {\n color: var(--dsw-alias-state-error-primary, #b42318);\n}\n\n.arkme-contact-world-page-empty {\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n text-align: center;\n align-self: center;\n padding: 28px 20px;\n font-size: 12px;\n}\n\n.arkme-directory-unmarked-speaker-detail {\n background: var(--dsw-alias-bg-base, #fff);\n min-height: 0;\n padding: clamp(28px, 5vw, 60px);\n overflow-y: auto;\n}\n\n.arkme-unmarked-speaker-token-avatar {\n background: var(--dsw-alias-bg-module-platform, var(--dsw-alias-bg-layer-1, #f1f2f3));\n color: var(--dsw-alias-label-secondary, #666c75);\n letter-spacing: -.02em;\n border-radius: 50%;\n flex: none;\n place-items: center;\n font-weight: 650;\n line-height: 1;\n display: grid;\n}\n\n.arkme-unmarked-speaker-summary {\n box-sizing: border-box;\n background: none;\n border: 0;\n gap: 18px;\n width: min(100%, 720px);\n margin: 0 auto;\n padding: 4px 0 24px;\n display: grid;\n}\n\n.arkme-unmarked-speaker-summary h1, .arkme-unmarked-speaker-summary h2, .arkme-unmarked-speaker-audio h2, .arkme-unmarked-speaker-choice h2 {\n letter-spacing: -.02em;\n margin: 0;\n font-size: 20px;\n font-weight: 680;\n line-height: 28px;\n}\n\n.arkme-unmarked-speaker-identity {\n align-items: center;\n gap: 16px;\n min-width: 0;\n padding: 2px 4px;\n display: flex;\n}\n\n.arkme-unmarked-speaker-identity > div {\n gap: 3px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-unmarked-speaker-identity p {\n color: var(--dsw-alias-label-secondary, #737984);\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-unmarked-speaker-stats {\n min-width: 0;\n color: var(--dsw-alias-label-secondary, #737984);\n flex-wrap: wrap;\n gap: 8px 20px;\n padding: 0 4px;\n font-size: 12px;\n line-height: 19px;\n display: flex;\n}\n\n.arkme-unmarked-speaker-stats span {\n white-space: nowrap;\n position: relative;\n}\n\n.arkme-unmarked-speaker-stats span + span:before {\n content: \"\";\n background: var(--dsw-alias-label-caption, #b3b7bd);\n border-radius: 50%;\n width: 3px;\n height: 3px;\n position: absolute;\n top: 8px;\n left: -11px;\n}\n\n.arkme-unmarked-speaker-stats strong {\n color: var(--dsw-alias-label-primary, #202124);\n font-weight: 650;\n}\n\n.arkme-unmarked-speaker-inference {\n background: var(--dsw-alias-bg-layer-2, #f5f5f6);\n border-radius: 18px;\n grid-template-columns: 40px minmax(0, 1fr);\n align-items: start;\n gap: 12px;\n min-width: 0;\n padding: 18px;\n display: grid;\n}\n\n.arkme-unmarked-speaker-inference-icon, .arkme-unmarked-speaker-action-icon {\n border: 1px solid var(--dsw-alias-border-l1, #e3e4e7);\n background: var(--dsw-alias-bg-layer-1, #fff);\n width: 40px;\n height: 40px;\n color: var(--dsw-alias-label-secondary, #656b75);\n border-radius: 50%;\n place-items: center;\n display: grid;\n}\n\n.arkme-unmarked-speaker-inference-icon svg path, .arkme-unmarked-speaker-action-icon svg path {\n stroke: currentColor;\n stroke-width: 1.5px;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n\n.arkme-unmarked-speaker-inference > div {\n gap: 5px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-unmarked-speaker-inference-label {\n color: var(--dsw-alias-label-secondary, #747983);\n font-size: 11px;\n line-height: 16px;\n}\n\n.arkme-unmarked-speaker-inference strong {\n color: var(--dsw-alias-label-primary, #202124);\n font-size: 14px;\n font-weight: 650;\n line-height: 21px;\n}\n\n.arkme-unmarked-speaker-inference p {\n color: var(--dsw-alias-label-secondary, #686e78);\n margin: 0;\n font-size: 12px;\n line-height: 20px;\n}\n\n.arkme-unmarked-speaker-actions {\n gap: 10px;\n display: grid;\n}\n\n[data-arkme-workspace] .arkme-unmarked-speaker-action {\n border: 1px solid var(--dsw-alias-border-l1, #e5e6e8);\n background: var(--dsw-alias-bg-layer-1, #fff);\n width: 100%;\n min-height: 62px;\n color: var(--dsw-alias-label-primary, #202124);\n text-align: left;\n cursor: pointer;\n border-radius: 16px;\n grid-template-columns: 42px minmax(0, 1fr);\n align-items: center;\n gap: 12px;\n padding: 10px 46px 10px 14px;\n font-size: 13px;\n font-weight: 650;\n display: grid;\n position: relative;\n}\n\n.arkme-unmarked-speaker-action:after {\n content: \"›\";\n color: var(--dsw-alias-label-caption, #a7abb2);\n font-size: 22px;\n font-weight: 400;\n position: absolute;\n right: 18px;\n}\n\n.arkme-unmarked-speaker-action:hover {\n background: var(--dsw-alias-interactive-bg-hover, #f7f7f8);\n border-color: var(--dsw-alias-border-l2, #d9dade);\n}\n\n.arkme-unmarked-speaker-summary > [role=\"status\"], .arkme-unmarked-speaker-summary > [role=\"alert\"], .arkme-unmarked-speaker-audio > [role=\"status\"], .arkme-unmarked-speaker-audio > [role=\"alert\"], .arkme-unmarked-speaker-choice > [role=\"status\"], .arkme-unmarked-speaker-choice > [role=\"alert\"] {\n color: var(--dsw-alias-label-secondary, #68707c);\n background: var(--dsw-alias-bg-layer-2, #f5f5f6);\n border-radius: 10px;\n padding: 9px 12px;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-unmarked-speaker-summary > [role=\"alert\"], .arkme-unmarked-speaker-audio > [role=\"alert\"], .arkme-unmarked-speaker-choice > [role=\"alert\"] {\n color: var(--dsw-alias-state-error-primary, #b42318);\n background: var(--dsw-alias-state-error-tertiary, #fff1f0);\n}\n\n.arkme-unmarked-speaker-audio, .arkme-unmarked-speaker-choice {\n box-sizing: border-box;\n background: none;\n border: 0;\n gap: 16px;\n width: min(100%, 720px);\n margin: 0 auto;\n padding: 4px 0 28px;\n display: grid;\n}\n\n.arkme-unmarked-speaker-subview-header {\n grid-template-columns: auto 40px minmax(0, 1fr);\n align-items: center;\n gap: 12px;\n min-width: 0;\n padding-bottom: 4px;\n display: grid;\n}\n\n.arkme-unmarked-speaker-subview-header > button {\n min-height: 32px;\n color: var(--dsw-alias-label-secondary, #68707c);\n cursor: pointer;\n background: none;\n border-radius: 9px;\n padding: 0 10px;\n font-size: 11px;\n}\n\n.arkme-unmarked-speaker-subview-header > button:before {\n content: \"‹\";\n vertical-align: -1px;\n margin-right: 4px;\n font-size: 17px;\n}\n\n.arkme-unmarked-speaker-subview-heading {\n gap: 2px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-unmarked-speaker-subview-heading p {\n color: var(--dsw-alias-label-secondary, #737984);\n margin: 0;\n font-size: 11px;\n line-height: 17px;\n}\n\n.arkme-unmarked-speaker-segment-list {\n gap: 10px;\n display: grid;\n}\n\n.arkme-unmarked-speaker-segment-card {\n border: 1px solid var(--dsw-alias-border-l1, #e5e6e8);\n background: var(--dsw-alias-bg-layer-1, #fff);\n border-radius: 16px;\n grid-template-columns: minmax(0, 1fr) auto;\n gap: 8px 16px;\n min-width: 0;\n padding: 16px 16px 14px;\n display: grid;\n}\n\n.arkme-unmarked-speaker-segment-meta {\n min-width: 0;\n color: var(--dsw-alias-label-secondary, #757b85);\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 11px;\n line-height: 17px;\n overflow: hidden;\n}\n\n.arkme-unmarked-speaker-segment-transcript {\n min-width: 0;\n color: var(--dsw-alias-label-primary, #292c34);\n white-space: pre-wrap;\n grid-column: 1;\n margin: 0;\n font-size: 13px;\n line-height: 20px;\n}\n\n[data-arkme-workspace] .arkme-unmarked-speaker-segment-play {\n background: var(--dsw-alias-bg-layer-2, #f4f4f5);\n width: 38px;\n min-width: 38px;\n height: 38px;\n min-height: 38px;\n color: var(--dsw-alias-label-primary, #292c34);\n cursor: pointer;\n border-radius: 50%;\n grid-area: 1 / 2 / span 2;\n align-self: center;\n place-items: center;\n padding: 0;\n display: inline-grid;\n}\n\n[data-arkme-workspace] .arkme-unmarked-speaker-segment-play:not(:disabled):hover {\n background: var(--dsw-alias-bg-layer-3, #e9eaec);\n}\n\n.arkme-unmarked-speaker-segment-play:disabled {\n opacity: .5;\n cursor: default;\n}\n\n.arkme-unmarked-speaker-choice-meta {\n color: var(--dsw-alias-label-secondary, #737984);\n margin: -4px 0 0;\n padding: 0 4px;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-unmarked-speaker-choice-options {\n border: 0;\n gap: 8px;\n min-width: 0;\n margin: 0;\n padding: 0;\n display: grid;\n}\n\n.arkme-unmarked-speaker-choice-options legend {\n color: var(--dsw-alias-label-secondary, #737984);\n margin-bottom: 9px;\n font-size: 11px;\n line-height: 17px;\n}\n\n.arkme-unmarked-speaker-choice-option {\n border: 1px solid var(--dsw-alias-border-l1, #e5e6e8);\n background: var(--dsw-alias-bg-layer-1, #fff);\n cursor: pointer;\n border-radius: 14px;\n grid-template-columns: 18px minmax(0, 1fr) auto;\n align-items: center;\n gap: 10px;\n min-width: 0;\n min-height: 52px;\n padding: 10px 14px;\n font-size: 13px;\n display: grid;\n}\n\n.arkme-unmarked-speaker-choice-option:has(input:checked) {\n border-color: var(--dsw-alias-state-business-primary, #6677d9);\n background: var(--dsw-alias-interactive-bg-active, #f0f2ff);\n}\n\n.arkme-unmarked-speaker-choice-option input {\n width: 16px;\n height: 16px;\n accent-color: var(--dsw-alias-state-business-primary, #6677d9);\n margin: 0;\n}\n\n.arkme-unmarked-speaker-recommended {\n background: var(--dsw-alias-state-business-tertiary, #eef0ff);\n color: var(--dsw-alias-state-business-primary, #5667cc);\n border-radius: 999px;\n padding: 2px 7px;\n font-size: 10px;\n line-height: 16px;\n}\n\n.arkme-unmarked-speaker-choice-new-name {\n border: 1px solid var(--dsw-alias-border-l1, #dfe1e5);\n background: var(--dsw-specific-input-major, #fff);\n width: 100%;\n min-height: 42px;\n color: var(--dsw-alias-label-primary, #202124);\n border-radius: 12px;\n outline: 0;\n padding: 0 13px;\n font-size: 12px;\n}\n\n.arkme-unmarked-speaker-choice-new-name:focus {\n border-color: var(--dsw-alias-state-business-primary, #6677d9);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--dsw-alias-state-business-primary, #6677d9) 14%, transparent);\n}\n\n[data-arkme-workspace] .arkme-unmarked-speaker-confirm {\n background: var(--dsw-alias-button-primary-fill, #202124);\n min-height: 42px;\n color: var(--dsw-alias-label-primary-inverted, #fff);\n cursor: pointer;\n border-radius: 12px;\n padding: 0 16px;\n font-size: 12px;\n font-weight: 650;\n}\n\n.arkme-unmarked-speaker-confirm:disabled {\n opacity: .45;\n cursor: default;\n}\n\n.arkme-unmarked-speaker-summary button:not(.arkme-unmarked-speaker-action), .arkme-unmarked-speaker-audio button:not(.arkme-unmarked-speaker-segment-play), .arkme-unmarked-speaker-choice button:not(.arkme-unmarked-speaker-confirm), .arkme-contact-world-error button, .arkme-contact-profile-error button {\n border: 1px solid var(--dsw-alias-border-l2, var(--arkme-line));\n background: var(--dsw-alias-button-elevated-fill, #fff);\n min-height: 34px;\n color: var(--dsw-alias-label-primary, #202124);\n cursor: pointer;\n border-radius: 9px;\n padding: 0 12px;\n}\n\n.arkme-unmarked-speaker-gone, .arkme-unmarked-speaker-success {\n box-sizing: border-box;\n background: var(--dsw-alias-state-warning-tertiary, #fff7ed);\n width: min(100%, 680px);\n color: var(--dsw-alias-state-warning-primary, #9a3412);\n border-radius: 10px;\n margin: 0 auto;\n padding: 12px 14px;\n}\n\n.arkme-unmarked-speaker-success {\n background: var(--dsw-alias-state-success-tertiary, #ecfdf3);\n color: var(--dsw-alias-state-success-primary, #067647);\n}\n\n.arkme-contact-directory button:focus-visible, .arkme-directory-detail-pane button:focus-visible, [data-arkme-owned=\"product-navigation\"] button:focus-visible {\n outline: 2px solid var(--arkme-focus);\n outline-offset: 2px;\n}\n\nbody[data-ds-dark-theme] .arkme-contact-directory, body[data-ds-dark-theme] .arkme-directory-detail-pane {\n background: var(--dsw-alias-bg-base);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-contact-directory-row.is-selected, body[data-ds-dark-theme] .arkme-contact-world-card, body[data-ds-dark-theme] .arkme-unmarked-speaker-choice {\n background: var(--dsw-alias-interactive-bg-active);\n}\n\nbody[data-ds-dark-theme] .arkme-unmarked-speaker-inference, body[data-ds-dark-theme] .arkme-unmarked-speaker-segment-card, body[data-ds-dark-theme] .arkme-unmarked-speaker-choice-option, body[data-ds-dark-theme] .arkme-unmarked-speaker-action {\n background: var(--dsw-alias-bg-layer-1);\n border-color: var(--dsw-alias-border-l1);\n}\n\nbody[data-ds-dark-theme] .arkme-unmarked-speaker-inference-icon, body[data-ds-dark-theme] .arkme-unmarked-speaker-action-icon, body[data-ds-dark-theme] .arkme-unmarked-speaker-segment-play {\n background: var(--dsw-specific-input-major);\n color: var(--dsw-alias-label-secondary);\n}\n\nbody[data-ds-dark-theme] .arkme-unmarked-speaker-choice-option:has(input:checked) {\n background: var(--dsw-alias-interactive-bg-active);\n border-color: var(--dsw-alias-state-business-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-contact-detail > .arkme-contact-world {\n background: var(--dsw-alias-bg-subtle);\n}\n\nbody[data-ds-dark-theme] .arkme-contact-world-container {\n background: var(--dsw-alias-bg-layer-1);\n box-shadow: none;\n}\n\nbody[data-ds-dark-theme] .arkme-team-detail {\n background: var(--dsw-alias-bg-base);\n}\n\nbody[data-ds-dark-theme] .arkme-team-members {\n background: var(--dsw-alias-bg-subtle);\n}\n\nbody[data-ds-dark-theme] .arkme-team-member-list {\n background: var(--dsw-alias-bg-layer-1);\n box-shadow: none;\n}\n\nbody[data-ds-dark-theme] .arkme-contact-directory-warning, body[data-ds-dark-theme] .arkme-unmarked-speaker-gone, body[data-ds-dark-theme] .arkme-contact-world-image-error, body[data-ds-dark-theme] .arkme-contact-world-image-loading {\n background: var(--dsw-specific-input-major);\n color: var(--dsw-alias-label-secondary);\n}\n\nbody[data-ds-dark-theme] .arkme-unmarked-speaker-success {\n background: var(--dsw-alias-state-success-tertiary);\n color: var(--dsw-alias-state-success-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-contact-profile-error, body[data-ds-dark-theme] .arkme-contact-profile-message-error, body[data-ds-dark-theme] .arkme-contact-world-error, body[data-ds-dark-theme] .arkme-contact-world-load-more-error {\n color: var(--dsw-alias-state-error-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-contact-profile-message {\n background: var(--dsw-alias-button-primary-fill);\n}\n\nbody[data-ds-dark-theme] .arkme-contact-directory-more, body[data-ds-dark-theme] .arkme-contact-world-load-more {\n color: var(--dsw-alias-state-business-primary);\n}\n\n@media (width <= 1024px) {\n [data-arkme-owned=\"persistent-sidebar\"] [data-arkme-directory-mode=\"contacts\"] {\n min-width: 0;\n }\n}\n\n@media (width <= 820px) {\n div:has( > [data-shell-overlay]):has([data-arkme-directory-mode=\"contacts\"]):has([data-arkme-contacts-mobile-view=\"directory\"]) {\n grid-template-columns: minmax(0, 1fr) 0 0 !important;\n }\n\n div:has( > [data-shell-overlay]):has([data-arkme-directory-mode=\"contacts\"]):has([data-arkme-contacts-mobile-view=\"content\"]) {\n grid-template-columns: 0 minmax(0, 1fr) 0 !important;\n }\n\n [data-arkme-owned=\"persistent-sidebar\"][data-arkme-contacts-mobile-view=\"content\"], [data-arkme-owned=\"persistent-workspace\"][data-arkme-contacts-mobile-view=\"directory\"] {\n display: none !important;\n }\n\n [data-arkme-owned=\"persistent-sidebar\"] [data-arkme-directory-mode=\"contacts\"], .arkme-directory-detail-pane {\n min-width: 0;\n }\n}\n\n.arkme-directory-mobile-back {\n display: none;\n}\n\n@media (width <= 820px) {\n .arkme-directory-mobile-back {\n min-height: 42px;\n color: var(--dsw-alias-label-secondary, #68707c);\n cursor: pointer;\n background: none;\n align-items: center;\n gap: 5px;\n padding: 0 14px;\n display: inline-flex;\n }\n\n .arkme-directory-mobile-back:before {\n content: \"‹\";\n font-size: 18px;\n line-height: 1;\n }\n\n .arkme-directory-mobile-back:hover {\n color: var(--dsw-alias-label-primary, #202124);\n }\n\n .arkme-contact-profile {\n padding: 26px 20px;\n }\n\n .arkme-contact-profile-main {\n grid-template-columns: 56px minmax(0, 1fr) auto;\n gap: 12px;\n }\n\n .arkme-contact-profile-avatar {\n width: 56px;\n height: 56px;\n }\n\n .arkme-contact-profile-avatar > span {\n width: 56px !important;\n height: 56px !important;\n }\n\n .arkme-team-detail-header {\n padding: 26px 20px;\n }\n\n .arkme-team-detail-header-main {\n grid-template-columns: 56px minmax(0, 1fr);\n gap: 12px;\n }\n\n .arkme-team-detail-glyph {\n border-radius: 16px;\n width: 56px;\n height: 56px;\n font-size: 18px;\n }\n\n .arkme-team-detail-count {\n justify-items: initial;\n grid-column: 2;\n align-items: baseline;\n gap: 4px;\n min-width: 0;\n display: flex;\n }\n\n .arkme-team-detail-count strong {\n font-size: 14px;\n line-height: 18px;\n }\n\n .arkme-team-detail-count span {\n font-size: 11px;\n }\n\n .arkme-team-members {\n padding: 18px 20px 28px;\n }\n\n .arkme-team-member-list {\n border-radius: 12px;\n }\n\n .arkme-team-member-row {\n padding-left: 12px;\n padding-right: 12px;\n }\n\n .arkme-contact-world-title {\n padding-left: 20px;\n padding-right: 20px;\n }\n\n .arkme-directory-unmarked-speaker-detail {\n padding: 20px 18px 30px;\n }\n\n .arkme-unmarked-speaker-summary, .arkme-unmarked-speaker-audio, .arkme-unmarked-speaker-choice {\n gap: 14px;\n }\n\n .arkme-unmarked-speaker-stats {\n gap: 7px 14px;\n }\n\n .arkme-unmarked-speaker-stats span + span:before {\n display: none;\n }\n\n .arkme-unmarked-speaker-inference {\n grid-template-columns: 36px minmax(0, 1fr);\n padding: 15px;\n }\n\n .arkme-unmarked-speaker-inference-icon, .arkme-unmarked-speaker-action-icon {\n width: 36px;\n height: 36px;\n }\n\n .arkme-unmarked-speaker-subview-header {\n grid-template-columns: auto 36px minmax(0, 1fr);\n gap: 9px;\n }\n\n .arkme-unmarked-speaker-segment-card {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .arkme-unmarked-speaker-segment-transcript, [data-arkme-workspace] .arkme-unmarked-speaker-segment-play {\n grid-area: auto / 1;\n }\n\n [data-arkme-workspace] .arkme-unmarked-speaker-segment-play {\n justify-self: start;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .arkme-contact-directory-caret {\n transition: none;\n }\n\n .arkme-icon-spin {\n animation: none;\n }\n}\n\n.arkme-conversation-surface {\n --arkme-chat-self-bubble: #eef1f8;\n --arkme-chat-other-bubble: #f3f4f6;\n}\n\nbody[data-ds-dark-theme] .arkme-conversation-surface {\n --arkme-chat-self-bubble: #2c3142;\n --arkme-chat-other-bubble: #282a31;\n --arkme-audio-control: #8995c5;\n}\n\nbody[data-ds-dark-theme] .arkme-detail-extension-input-bar {\n border-top-color: #363636 !important;\n}\n\nbody[data-ds-dark-theme] .arkme-detail-extension-input-shell {\n background: #2b2b2b !important;\n}\n\n[data-arkme-message-direction]:focus-visible, [data-arkme-note-detail] button:focus-visible {\n outline: 2px solid var(--dsw-alias-state-business-primary, #8295e8);\n outline-offset: 2px;\n}\n";
194433
+ var arkme_redesign_default = "[data-arkme-workspace] {\n --arkme-line: #e7e7e9;\n --arkme-muted: #8e9199;\n --arkme-soft: #f6f6f7;\n --arkme-focus: #cbd5ff;\n color: #171923;\n font-synthesis: none;\n font-family: SF Pro Text, SF Pro Display, -apple-system, BlinkMacSystemFont, PingFang SC, Helvetica Neue, Microsoft YaHei, sans-serif;\n}\n\n[data-arkme-workspace], [data-arkme-workspace] * {\n box-sizing: border-box;\n}\n\n[data-arkme-workspace] button, [data-arkme-workspace] input, [data-arkme-workspace] textarea {\n font: inherit;\n}\n\n[data-arkme-workspace] button {\n color: inherit;\n cursor: pointer;\n background: none;\n border: 0;\n}\n\n[data-arkme-workspace] [data-arkme-theme-image=\"dark\"] {\n display: none !important;\n}\n\n.arkme-redesign-root {\n --arkme-native-titlebar: 0px;\n background: #fff;\n width: 100%;\n min-width: 0;\n height: 100%;\n min-height: 0;\n position: relative;\n overflow: hidden;\n}\n\n.arkme-native-desktop .arkme-redesign-root {\n --arkme-native-titlebar: 50px;\n}\n\n.arkme-native-desktop .arkme-redesign-root:before {\n content: \"\";\n z-index: 30;\n pointer-events: none;\n background: #e8e8ea;\n height: 1px;\n position: absolute;\n top: 49px;\n left: 0;\n right: 0;\n}\n\n.arkme-native-desktop [data-arkme-owned=\"persistent-sidebar\"] > [data-arkme-owned=\"product-navigation\"] {\n padding-top: 28px !important;\n}\n\n.arkme-redesign-rail {\n z-index: 8;\n top: calc(26px + var(--arkme-native-titlebar));\n background: #fbfbfc;\n border: 1px solid #e4e4e7;\n border-radius: 22px;\n flex-direction: column;\n width: 72px;\n padding: 10px 8px;\n display: flex;\n position: absolute;\n bottom: 22px;\n left: 24px;\n box-shadow: 0 16px 38px #1e20260e;\n}\n\n.arkme-redesign-rail-primary {\n flex-direction: column;\n gap: 5px;\n display: flex;\n}\n\n.arkme-redesign-rail-primary button {\n color: #3e4149;\n border-radius: 15px;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n gap: 5px;\n min-height: 57px;\n transition: background .18s, color .18s;\n display: flex;\n position: relative;\n}\n\n.arkme-redesign-rail-primary button span {\n letter-spacing: .01em;\n font-size: 11px;\n font-weight: 400;\n}\n\n.arkme-redesign-rail-primary button:hover {\n background: #f4f4f5;\n}\n\n.arkme-redesign-rail-primary button.is-active {\n color: #151722;\n background: #f1f2f6;\n}\n\n.arkme-redesign-rail-primary button.is-active:before {\n content: \"\";\n background: #9eadff;\n border-radius: 3px;\n width: 3px;\n height: 33px;\n position: absolute;\n left: -9px;\n}\n\n.arkme-redesign-rail-footer {\n border-top: 0 solid #ededee;\n justify-items: center;\n gap: 7px;\n margin-top: auto;\n padding-top: 0;\n display: grid;\n position: relative;\n}\n\n.arkme-redesign-rail-footer:has( > .arkme-update-rail-slot) {\n border-top-width: 1px;\n padding-top: 10px;\n}\n\n.arkme-redesign-rail-footer > button {\n color: #4b4f58;\n border-radius: 14px;\n place-items: center;\n width: 46px;\n height: 46px;\n display: grid;\n}\n\n.arkme-redesign-rail-footer > button:hover, .arkme-redesign-rail-footer > button.is-active {\n background: #f1f2f5;\n}\n\n.arkme-redesign-rail-footer:empty {\n display: none;\n}\n\n.arkme-conversation-input-card {\n display: contents;\n}\n\nbody:is([data-ds-skin=\"qq2006\"], [data-arkme-skin=\"qq2006\"]) [data-arkme-owned=\"product-surface\"] .arkme-conversation-input-card.arkme-conversation-input-card.arkme-conversation-tools {\n display: flex !important;\n}\n\n.arkme-update-rail-slot {\n width: 52px;\n height: 30px;\n position: relative;\n}\n\nbutton.arkme-update-rail {\n color: #53648e;\n cursor: pointer;\n width: 52px;\n min-height: 28px;\n font: inherit;\n background: #f1f3fa;\n border: 0;\n border-radius: 999px;\n justify-content: center;\n align-items: center;\n gap: 4px;\n padding: 0 7px;\n transition: transform .16s, background .16s, color .16s, box-shadow .16s;\n display: flex;\n box-shadow: inset 0 0 0 1px #5b70ab17;\n}\n\nbutton.arkme-update-rail:hover, button.arkme-update-rail.is-active {\n transform: translateY(-1px);\n color: #34476f !important;\n background: #e9edf8 !important;\n}\n\nbutton.arkme-update-rail.is-available {\n color: #fff !important;\n background: #f0524f !important;\n box-shadow: 0 5px 12px #e03c3933, inset 0 0 0 1px #b2232014 !important;\n}\n\nbutton.arkme-update-rail.is-available:hover, button.arkme-update-rail.is-available.is-active {\n color: #fff !important;\n background: #df4542 !important;\n box-shadow: 0 7px 16px #d736333d, inset 0 0 0 1px #961a181a !important;\n}\n\nbutton.arkme-update-rail.is-error {\n color: #b54841 !important;\n background: #fff0ee !important;\n}\n\n.arkme-update-rail span {\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n font-size: 9px;\n font-weight: 550;\n line-height: 1;\n}\n\n.arkme-update-rail svg {\n flex: none;\n}\n\n.arkme-update-rail.is-ready {\n gap: 3px;\n padding: 0 4px;\n}\n\n.arkme-update-rail.is-ready svg {\n width: 13px;\n height: 13px;\n}\n\n.arkme-update-rail.is-downloading svg {\n animation: 1.6s linear infinite arkme-update-spin;\n}\n\n.arkme-update-popover {\n z-index: 100000;\n overflow-wrap: anywhere;\n box-sizing: border-box;\n color: #171923;\n backdrop-filter: blur(20px) saturate(1.12);\n background: #fffffff7;\n border: 1px solid #cfd1d7e6;\n border-radius: 20px;\n width: 356px;\n max-width: calc(100vw - 16px);\n max-height: calc(100vh - 16px);\n padding: 18px;\n animation: .2s cubic-bezier(.2, .8, .2, 1) arkme-update-popover-in;\n position: fixed;\n bottom: 14px;\n left: 68px;\n overflow-y: auto;\n box-shadow: 0 24px 58px #1b1e2629, 0 3px 10px #1b1e260e;\n}\n\n.arkme-update-popover-heading {\n grid-template-columns: minmax(0, 1fr) 28px;\n align-items: center;\n gap: 12px;\n display: grid;\n}\n\n.arkme-update-popover-heading > div {\n gap: 4px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-update-popover-heading span {\n color: #92959d;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 10px;\n font-weight: 500;\n overflow: hidden;\n}\n\n.arkme-update-popover-heading h2 {\n color: #242731;\n letter-spacing: -.025em;\n margin: 0;\n font-size: 17px;\n font-weight: 600;\n}\n\n.arkme-update-popover-heading > button {\n color: #93969e;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 9px;\n place-items: center;\n width: 28px;\n height: 28px;\n padding: 0;\n display: grid;\n}\n\n.arkme-update-popover-heading > button:hover {\n color: #3d414a;\n background: #f1f2f4;\n}\n\n.arkme-update-popover-summary {\n color: #7d818a;\n margin: 13px 0 0;\n font-size: 11px;\n line-height: 1.55;\n}\n\n.arkme-update-release-notes {\n border-top: 1px solid #ececef;\n border-bottom: 1px solid #ececef;\n margin-top: 14px;\n padding: 5px 0;\n}\n\n.arkme-update-release-notes > div {\n grid-template-columns: 28px minmax(0, 1fr);\n align-items: center;\n gap: 10px;\n min-height: 51px;\n display: grid;\n}\n\n.arkme-update-release-notes > div + div {\n border-top: 1px solid #f0f0f2;\n}\n\n.arkme-update-release-notes > div > span {\n color: #a3a6ad;\n font-variant-numeric: tabular-nums;\n font-size: 9px;\n}\n\n.arkme-update-release-notes p {\n gap: 4px;\n margin: 0;\n display: grid;\n}\n\n.arkme-update-release-notes strong {\n color: #3b3f48;\n font-size: 12px;\n font-weight: 500;\n}\n\n.arkme-update-release-notes small {\n color: #92959d;\n font-size: 10px;\n line-height: 1.45;\n}\n\n.arkme-update-message {\n color: #747983;\n margin: 12px 0 0;\n font-size: 11px;\n line-height: 17px;\n}\n\n.arkme-update-message.is-error {\n color: #b54841;\n}\n\n.arkme-update-popover-actions {\n grid-template-columns: 1fr 1.45fr;\n gap: 9px;\n margin-top: 16px;\n display: grid;\n}\n\n.arkme-update-popover-actions button {\n cursor: pointer;\n height: 42px;\n font: inherit;\n border-radius: 12px;\n padding: 0;\n font-size: 12px;\n font-weight: 500;\n transition: transform .16s, background .16s, box-shadow .16s;\n border: 0 !important;\n}\n\n.arkme-update-popover-actions button:hover {\n transform: translateY(-1px);\n}\n\n.arkme-update-popover-actions .arkme-update-later {\n color: #666a73 !important;\n background: #f2f2f4 !important;\n}\n\n.arkme-update-popover-actions .arkme-update-later:hover {\n background: #ececef !important;\n}\n\n.arkme-update-popover-actions .arkme-update-now {\n color: #fff !important;\n background: #1c1f28 !important;\n box-shadow: 0 7px 18px #181b2324 !important;\n}\n\n.arkme-update-popover-actions .arkme-update-now:hover {\n background: #11131b !important;\n box-shadow: 0 9px 22px #181b232e !important;\n}\n\n.arkme-update-now:disabled {\n opacity: .46;\n cursor: default;\n transform: none;\n}\n\n.arkme-update-capsule {\n z-index: 10030;\n box-sizing: border-box;\n color: #171923;\n backdrop-filter: blur(20px) saturate(1.2);\n background: #ffffffed;\n border: 1px solid #cdd0d8d6;\n border-radius: 18px;\n grid-template-columns: minmax(0, 1fr) 28px;\n align-items: center;\n gap: 10px;\n width: 326px;\n max-width: calc(100vw - 16px);\n min-height: 52px;\n padding: 9px 9px 9px 14px;\n animation: .22s cubic-bezier(.2, .8, .2, 1) arkme-update-capsule-in;\n display: grid;\n position: fixed;\n top: 18px;\n left: 50%;\n transform: translateX(-50%);\n box-shadow: 0 16px 40px #1c1f2724, 0 2px 8px #1c1f270f;\n}\n\n.arkme-native-desktop .arkme-update-capsule {\n top: 62px;\n}\n\n.arkme-update-capsule-copy {\n gap: 3px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-update-capsule-copy strong {\n color: #333741;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 11px;\n font-weight: 600;\n overflow: hidden;\n}\n\n.arkme-update-capsule-copy small {\n color: #93969e;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 9px;\n overflow: hidden;\n}\n\n.arkme-update-progress {\n background: #eceef3;\n border-radius: 999px;\n height: 4px;\n overflow: hidden;\n}\n\n.arkme-update-progress span {\n border-radius: inherit;\n background: #6779b5;\n height: 100%;\n transition: width .65s cubic-bezier(.2, .7, .25, 1);\n display: block;\n}\n\n.arkme-update-progress.is-indeterminate span {\n width: 34%;\n animation: 1.25s ease-in-out infinite arkme-update-indeterminate;\n}\n\n.arkme-update-capsule > b {\n color: #656a75;\n font-variant-numeric: tabular-nums;\n text-align: right;\n font-size: 10px;\n font-weight: 500;\n}\n\n.arkme-update-capsule[data-layout=\"progress\"] {\n grid-template-columns: minmax(0, 1fr) minmax(40px, .8fr) 34px 28px;\n}\n\n.arkme-update-capsule[data-layout=\"action\"], .arkme-update-capsule[data-layout=\"ready-action\"] {\n width: 380px;\n}\n\n.arkme-update-capsule[data-layout=\"action\"] {\n grid-template-columns: minmax(0, 1fr) auto 28px;\n}\n\n.arkme-update-capsule[data-layout=\"ready-action\"] {\n grid-template-columns: minmax(0, 1fr) auto;\n padding-right: 16px;\n}\n\n.arkme-update-capsule:is([data-layout=\"action\"], [data-layout=\"ready-action\"]) .arkme-update-capsule-copy small {\n -webkit-line-clamp: 3;\n white-space: normal;\n overflow-wrap: anywhere;\n -webkit-box-orient: vertical;\n font-size: 11px;\n line-height: 1.45;\n display: -webkit-box;\n}\n\n.arkme-update-capsule[data-layout=\"restarting\"] {\n grid-template-columns: minmax(0, 1fr);\n width: 218px;\n padding-right: 14px;\n}\n\n.arkme-update-capsule.is-restarting .arkme-update-capsule-copy {\n text-align: center;\n justify-self: center;\n}\n\n.arkme-update-ready-action {\n color: #fff;\n cursor: pointer;\n width: auto;\n height: 32px;\n font: inherit;\n white-space: nowrap;\n background: #242731;\n border: 0;\n border-radius: 10px;\n padding: 0 11px;\n font-size: 10px;\n font-weight: 550;\n}\n\n.arkme-update-ready-action:hover {\n background: #151821;\n}\n\n.arkme-update-ready-action:disabled {\n opacity: .65;\n cursor: wait;\n}\n\n.arkme-update-ready-action:focus-visible {\n outline-offset: 2px;\n outline: 2px solid #6779b5;\n}\n\n.arkme-update-ready-actions {\n align-items: center;\n gap: 6px;\n display: flex;\n}\n\n.arkme-update-later-action {\n color: #737781;\n cursor: pointer;\n height: 32px;\n font: inherit;\n white-space: nowrap;\n background: none;\n border: 0;\n border-radius: 9px;\n padding: 0 8px;\n font-size: 10px;\n}\n\n.arkme-update-later-action:hover {\n color: #343841;\n background: #f0f1f3;\n}\n\n.arkme-update-capsule-close {\n color: #8a8e97;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 9px;\n place-items: center;\n width: 28px;\n height: 28px;\n padding: 0;\n display: grid;\n}\n\n.arkme-update-capsule-close:hover {\n color: #343841;\n background: #f0f1f3;\n}\n\n@keyframes arkme-update-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes arkme-update-popover-in {\n from {\n opacity: 0;\n transform: translate(-8px, 3px) scale(.985);\n }\n}\n\n@keyframes arkme-update-capsule-in {\n from {\n opacity: 0;\n transform: translate(-50%, -8px) scale(.98);\n }\n}\n\n@keyframes arkme-update-indeterminate {\n from {\n transform: translateX(-100%);\n }\n\n to {\n transform: translateX(300%);\n }\n}\n\n.arkme-redesign-profile {\n position: relative;\n}\n\n.arkme-redesign-profile > span {\n width: 32px !important;\n height: 32px !important;\n}\n\n.arkme-redesign-profile-popover {\n z-index: 10000;\n backdrop-filter: blur(20px);\n background: #fffffff5;\n border: 1px solid #d8d9dde6;\n border-radius: 18px;\n width: 264px;\n padding: 10px;\n position: fixed;\n bottom: 14px;\n left: 64px;\n box-shadow: 0 20px 50px #1a1c2326, 0 2px 8px #1a1c230d;\n}\n\n.arkme-redesign-profile-head {\n align-items: center;\n gap: 11px;\n padding: 9px 9px 13px;\n display: flex;\n}\n\n.arkme-redesign-profile-head > span {\n text-align: left;\n gap: 4px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-redesign-profile-head strong {\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 14px;\n font-weight: 600;\n overflow: hidden;\n}\n\n.arkme-redesign-profile-head small {\n color: #8b8f98;\n font-size: 11px;\n font-weight: 400;\n}\n\n.arkme-redesign-profile-menu {\n border-top: 1px solid #eeeeef;\n gap: 2px;\n padding-top: 6px;\n display: grid;\n}\n\n.arkme-redesign-profile-menu button {\n width: 100%;\n min-height: 50px;\n box-shadow: none;\n color: #393d46;\n font: inherit;\n text-align: left;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 11px;\n outline: 0;\n grid-template-columns: 28px minmax(0, 1fr) 16px;\n align-items: center;\n gap: 8px;\n padding: 7px 8px;\n display: grid;\n}\n\n.arkme-redesign-profile-menu button:hover {\n background: #f4f4f5;\n}\n\n.arkme-redesign-profile-menu button > span {\n gap: 3px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-redesign-profile-menu strong {\n font-size: 12px;\n font-weight: 500;\n}\n\n.arkme-redesign-profile-menu small {\n color: #92969f;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 10px;\n font-weight: 400;\n overflow: hidden;\n}\n\n.arkme-redesign-profile-menu button > svg:last-child {\n color: #a0a3aa;\n}\n\n.arkme-redesign-native-settings-trigger {\n clip-path: inset(50%);\n width: 1px;\n height: 1px;\n position: absolute;\n overflow: hidden;\n}\n\n.arkme-redesign-chat-panel {\n inset: var(--arkme-native-titlebar) auto 0 96px;\n z-index: 3;\n border-right: 1px solid var(--arkme-line);\n background: #fff;\n flex-direction: column;\n width: 300px;\n min-width: 0;\n padding: 0;\n display: flex;\n position: absolute;\n overflow: hidden;\n}\n\n.arkme-redesign-chat-search {\n text-align: left;\n border-radius: 11px;\n align-items: center;\n gap: 9px;\n width: 100%;\n height: 40px;\n margin: 20px 0 10px;\n padding: 0 12px;\n display: flex;\n color: #9699a1 !important;\n border: 1px solid #e1e2e5 !important;\n font-size: 11px !important;\n}\n\n.arkme-redesign-chat-search:hover {\n background: #f7f7f8;\n}\n\n.arkme-redesign-chat-directory {\n flex: 1;\n min-height: 0;\n margin: 0;\n overflow: hidden;\n}\n\n.arkme-redesign-chat-directory > section {\n background: none !important;\n}\n\n.arkme-redesign-task-section {\n z-index: 3;\n border-bottom: 1px solid #ececef;\n outline: none;\n height: 158px;\n margin: 0 6px 12px;\n position: relative;\n}\n\n.arkme-redesign-task-section-title {\n color: #767b85;\n justify-content: space-between;\n align-items: center;\n height: 28px;\n padding: 0 7px;\n display: flex;\n}\n\n.arkme-redesign-task-section-title strong {\n font-size: 12px;\n font-weight: 500;\n}\n\n.arkme-redesign-task-section-title button {\n border-radius: 7px;\n place-items: center;\n width: 24px;\n height: 24px;\n display: grid;\n}\n\n.arkme-redesign-task-section-title button:hover {\n background: #f3f3f5;\n}\n\n.arkme-redesign-task-list {\n overscroll-behavior: contain;\n scrollbar-gutter: stable;\n background: #fff;\n max-height: 128px;\n padding-bottom: 2px;\n transition: max-height .18s, box-shadow .18s, padding .18s;\n display: grid;\n position: absolute;\n top: 28px;\n left: 0;\n right: 0;\n overflow: hidden auto;\n}\n\n.arkme-redesign-task-section:hover .arkme-redesign-task-list, .arkme-redesign-task-section:focus-within .arkme-redesign-task-list {\n max-height: min(360px, 100vh - 180px);\n padding-bottom: 6px;\n box-shadow: 0 14px 22px #1b1e2512;\n}\n\n.arkme-redesign-task-list > button {\n color: #555a64;\n text-align: left;\n border-radius: 8px;\n grid-template-columns: 16px minmax(0, 1fr);\n align-items: center;\n gap: 4px;\n width: 100%;\n min-width: 0;\n height: 32px;\n padding: 0 8px;\n display: grid;\n}\n\n.arkme-redesign-task-list > button:hover {\n background: #f7f7f8;\n}\n\n.arkme-redesign-task-list > button.is-selected {\n color: #232630;\n background: #f0f1f4;\n}\n\n.arkme-redesign-task-state {\n justify-content: center;\n align-items: center;\n width: 16px;\n height: 20px;\n display: inline-flex;\n}\n\n.arkme-redesign-task-state.is-complete > i {\n background: #39a56b1a;\n border-radius: 50%;\n width: 10px;\n height: 10px;\n display: block;\n position: relative;\n}\n\n.arkme-redesign-task-state.is-complete > i:after {\n content: \"\";\n background: #39a56b;\n border-radius: 50%;\n position: absolute;\n inset: 2px;\n}\n\n.arkme-redesign-task-matrix {\n grid-template-columns: repeat(3, 2px);\n grid-auto-rows: 2px;\n gap: 1px;\n width: 10px;\n height: 10px;\n display: grid;\n}\n\n.arkme-redesign-task-matrix i {\n opacity: .15;\n background: #5d76e8;\n border-radius: 1px;\n animation: 1s infinite arkme-task-dot-chase;\n}\n\n.arkme-redesign-task-matrix i:nth-child(2) {\n animation-delay: .125s;\n}\n\n.arkme-redesign-task-matrix i:nth-child(3) {\n animation-delay: .25s;\n}\n\n.arkme-redesign-task-matrix i:nth-child(4) {\n animation-delay: .375s;\n}\n\n.arkme-redesign-task-matrix i:nth-child(5) {\n animation-delay: .5s;\n}\n\n.arkme-redesign-task-matrix i:nth-child(6) {\n animation-delay: .625s;\n}\n\n.arkme-redesign-task-matrix i:nth-child(7) {\n animation-delay: .75s;\n}\n\n.arkme-redesign-task-matrix i:nth-child(8) {\n animation-delay: .875s;\n}\n\n@keyframes arkme-task-dot-chase {\n 0%, 12.4% {\n opacity: 1;\n }\n\n 12.5%, 24.9% {\n opacity: .6;\n }\n\n 25%, 37.4% {\n opacity: .35;\n }\n\n 37.5%, 100% {\n opacity: .15;\n }\n}\n\n.arkme-redesign-task-copy {\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n min-width: 0;\n display: flex;\n}\n\n.arkme-redesign-task-copy strong {\n white-space: nowrap;\n text-overflow: ellipsis;\n min-width: 0;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n overflow: hidden;\n}\n\n.arkme-redesign-task-copy small {\n color: #9a9da5;\n flex: none;\n font-size: 12px;\n line-height: 20px;\n}\n\n.arkme-redesign-task-first {\n color: #555a64;\n text-align: left;\n border-radius: 8px;\n width: calc(100% - 12px);\n height: 32px;\n margin: 0 6px;\n padding: 0 8px;\n font-size: 14px;\n}\n\n.arkme-redesign-task-first:hover {\n background: #f7f7f8;\n}\n\n.arkme-redesign-content {\n inset: var(--arkme-native-titlebar) 0 0 96px;\n background: #fff;\n min-width: 0;\n min-height: 0;\n position: absolute;\n overflow: hidden;\n}\n\n.arkme-redesign-content.has-panel {\n left: 396px;\n}\n\n.arkme-redesign-content.has-details {\n right: 360px;\n}\n\n.arkme-redesign-content.is-login-takeover {\n left: 0;\n right: 0;\n}\n\n.arkme-redesign-route-surface {\n width: 100%;\n min-width: 0;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-surface {\n background: #fff !important;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-header {\n border-bottom: 1px solid #ececef !important;\n height: 68px !important;\n padding: 12px 16px 12px 20px !important;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-header h2 {\n font-size: 15px !important;\n font-weight: 600 !important;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-body {\n padding: 22px 22px 12px !important;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-records {\n gap: 0 !important;\n width: 100% !important;\n}\n\n.arkme-conversation-records-reveal {\n animation: .12s ease-out both arkme-conversation-records-reveal;\n}\n\n@keyframes arkme-conversation-records-reveal {\n from {\n opacity: 0;\n }\n\n to {\n opacity: 1;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .arkme-conversation-records-reveal {\n animation: none;\n }\n}\n\n.arkme-redesign-route-chats [data-arkme-content-presentation=\"bubble\"] p {\n font-size: 14px;\n line-height: 1.62;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-composer {\n padding: 0 24px 20px !important;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-composer-inner {\n background: #fff !important;\n border: 1px solid #dfe1e6 !important;\n border-radius: 15px !important;\n gap: 8px !important;\n width: 100% !important;\n padding: 12px 13px 9px !important;\n box-shadow: 0 8px 30px #1c1f270b !important;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-composer-inner[data-arkme-primary-composer=\"true\"] {\n box-shadow: none !important;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-composer-inner[data-arkme-primary-composer=\"true\"][data-arkme-composer-focused=\"true\"] {\n background: color-mix(in srgb, var(--dsw-alias-bg-base, #fff) 97%, #000) !important;\n}\n\n.arkme-redesign-route-chats .arkme-conversation-composer textarea {\n min-height: 38px !important;\n padding: 0 !important;\n font-size: 14px !important;\n line-height: 22px !important;\n}\n\n.arkme-redesign-task-conversation {\n font-size: 15px;\n}\n\n.arkme-redesign-task-conversation [data-phase] {\n --dsh-chat-content-width: calc(100% - 64px);\n --dsh-composer-card-max-width: calc(100% - 32px);\n}\n\n.arkme-redesign-task-conversation [data-chat-flow] {\n width: calc(100% - 64px) !important;\n max-width: none !important;\n margin-left: 32px !important;\n margin-right: 32px !important;\n}\n\n.arkme-redesign-task-conversation textarea {\n font-size: 14px !important;\n}\n\n[data-slot=\"root\"] > div[data-details-collapsed=\"true\"]:has([data-arkme-owned=\"persistent-sidebar\"][data-arkme-login-mode=\"false\"][data-arkme-directory-visible=\"true\"] [data-arkme-directory-mode=\"conversations\"]), [data-slot=\"root\"] > div[data-details-collapsed=\"true\"]:has([data-arkme-owned=\"persistent-sidebar\"][data-arkme-web-locked] [data-arkme-directory-mode=\"web-locked\"]) {\n grid-template-columns: var(--arkme-persistent-sidebar-width, 356px) minmax(0, 1fr) 0 !important;\n}\n\n[data-slot=\"root\"] > div[data-details-collapsed=\"true\"]:has([data-arkme-owned=\"persistent-sidebar\"][data-arkme-login-mode=\"false\"][data-arkme-directory-visible=\"false\"]) {\n grid-template-columns: 72px minmax(0, 1fr) 0 !important;\n}\n\n@media (width >= 1100px) {\n [data-slot=\"root\"] > div[data-details-collapsed=\"true\"]:has([data-arkme-owned=\"persistent-sidebar\"][data-arkme-login-mode=\"false\"] [data-arkme-directory-mode=\"contacts\"]) {\n grid-template-columns: var(--arkme-persistent-sidebar-width, 356px) minmax(0, 1fr) 0 !important;\n }\n\n [data-slot=\"root\"] > div[data-details-collapsed=\"true\"]:has([data-arkme-owned=\"persistent-sidebar\"][data-arkme-login-mode=\"true\"]:not([data-arkme-web-locked])) {\n grid-template-columns: 0 minmax(0, 1fr) 0 !important;\n }\n}\n\n[data-arkme-owned=\"persistent-sidebar\"][data-arkme-login-mode=\"false\"]:has( > [data-arkme-directory-mode=\"conversations\"]) > [data-arkme-owned=\"product-navigation\"] {\n flex: 0 0 72px !important;\n width: 72px !important;\n min-width: 72px !important;\n}\n\n[data-arkme-owned=\"persistent-sidebar\"] :is([data-arkme-directory-mode=\"conversations\"], [data-arkme-directory-mode=\"web-locked\"]) {\n min-width: 64px !important;\n}\n\n[data-arkme-avatar-only=\"true\"] > :not([role=\"tree\"]) {\n display: none !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] {\n padding: 8px 6px 18px !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] > button {\n justify-content: center !important;\n gap: 0 !important;\n padding-left: 0 !important;\n padding-right: 0 !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] > button > :not(:first-child) {\n display: none !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] > button > span:first-child:has( > span:nth-child(2)) {\n justify-content: center !important;\n gap: 0 !important;\n width: auto !important;\n min-width: 38px !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] > button > span:first-child > span:nth-child(2) {\n display: contents !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] > button > span:first-child > span:nth-child(2) > span:first-child {\n display: none !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] > button > span:first-child > span:nth-child(2) > span:last-child {\n display: contents !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] > button > span:first-child > span:nth-child(2) > span:last-child > :not([style*=\"min-width: 17px\"]) {\n display: none !important;\n}\n\n[data-arkme-avatar-only=\"true\"] [role=\"tree\"] > button > span:first-child > span:nth-child(2) > span:last-child > [style*=\"min-width: 17px\"] {\n top: 3px;\n right: 3px;\n position: absolute !important;\n}\n\n.arkme-redesign-feature-page {\n background: #fff;\n flex-direction: column;\n width: 100%;\n min-width: 0;\n height: 100%;\n min-height: 0;\n padding: 30px 48px 36px;\n display: flex;\n overflow: hidden;\n}\n\n.arkme-redesign-feature-page > header {\n flex: none;\n margin: 0 0 22px;\n}\n\n.arkme-redesign-feature-page > header p {\n color: #8d9098;\n margin: 0 0 8px;\n font-size: 11px;\n}\n\n.arkme-redesign-feature-page > header h1 {\n letter-spacing: -.04em;\n margin: 0;\n font-size: 27px;\n font-weight: 600;\n}\n\n.arkme-redesign-feature-page > header span {\n color: #858992;\n margin-top: 10px;\n font-size: 12px;\n display: block;\n}\n\n.arkme-redesign-feature-body {\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n.arkme-redesign-recordings-page {\n background: #fff;\n padding: 0;\n}\n\n.arkme-redesign-recordings-page > div {\n height: 100% !important;\n}\n\n.arkme-redesign-search-page {\n padding: 66px 0 40px;\n}\n\n.arkme-redesign-search-page > header, .arkme-redesign-search-page > .arkme-redesign-feature-body {\n width: min(980px, 100% - 80px);\n margin-left: auto;\n margin-right: auto;\n}\n\n.arkme-redesign-search-page > header {\n margin-bottom: 28px;\n}\n\n.arkme-redesign-search-page > header h1 {\n font-size: 32px;\n}\n\n.arkme-redesign-search-page .arkme-redesign-feature-body {\n overflow-y: auto;\n}\n\n.arkme-redesign-search-page .arkme-redesign-feature-body > div {\n width: 100% !important;\n padding: 0 !important;\n}\n\n.arkme-redesign-search-page .arkme-redesign-feature-body > div > header {\n display: none !important;\n}\n\n.arkme-redesign-search-page .arkme-search-box {\n box-shadow: 0 8px 28px #1c1f2709;\n color: #646872 !important;\n background: #fff !important;\n border: 1px solid #e1e2e5 !important;\n border-radius: 15px !important;\n gap: 12px !important;\n height: 68px !important;\n padding: 0 20px !important;\n}\n\n.arkme-redesign-search-page input[aria-label=\"搜索\"] {\n font-size: 14px !important;\n}\n\n.arkme-redesign-search-page input[aria-label=\"搜索\"]:not(:focus)::placeholder {\n color: #92959d;\n}\n\n.arkme-redesign-search-page .arkme-search-history, .arkme-redesign-search-page .arkme-search-quick {\n margin: 24px 0 0 !important;\n}\n\n.arkme-redesign-search-page .arkme-search-history > div, .arkme-redesign-search-page .arkme-search-quick > div {\n gap: 0 !important;\n display: grid !important;\n}\n\n.arkme-redesign-search-page .arkme-search-history button, .arkme-redesign-search-page .arkme-search-quick button {\n text-align: left;\n overflow: hidden;\n color: #30333b !important;\n border: 0 !important;\n border-bottom: 1px solid #e6e7e9 !important;\n border-radius: 0 !important;\n justify-content: space-between !important;\n align-items: center !important;\n gap: 14px !important;\n width: 100% !important;\n height: 52px !important;\n padding: 0 6px !important;\n font-size: 12px !important;\n display: flex !important;\n}\n\n.arkme-redesign-search-page .arkme-search-history button span, .arkme-redesign-search-page .arkme-search-quick button span {\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n\n.arkme-redesign-plugins-page {\n background: #fff;\n}\n\n.arkme-redesign-plugins-page .arkme-extension-center-embedded > section {\n background: #fff !important;\n}\n\n.arkme-redesign-plugins-page .arkme-extension-center-embedded header {\n display: none !important;\n}\n\n.arkme-extension-toolbar {\n align-items: center;\n gap: 12px;\n height: 46px;\n display: flex;\n}\n\n.arkme-extension-toolbar label {\n color: #8e929a;\n border: 1px solid #e1e2e5;\n border-radius: 12px;\n flex: 1;\n align-items: center;\n gap: 10px;\n min-width: 0;\n height: 44px;\n padding: 0 14px;\n display: flex;\n}\n\n.arkme-extension-toolbar input {\n color: #262932;\n background: none;\n border: 0;\n outline: 0;\n flex: 1;\n min-width: 0;\n font-size: 12px;\n}\n\n.arkme-extension-toolbar > button {\n border-radius: 11px;\n height: 38px;\n padding: 0 15px;\n font-size: 11px;\n border: 1px solid #e1e2e5 !important;\n}\n\n.arkme-extension-toolbar > button:hover {\n background: #f6f6f7;\n}\n\n.arkme-redesign-plugins-page .arkme-extension-center-embedded nav {\n width: 420px;\n height: 38px !important;\n padding: 0 !important;\n}\n\n.arkme-redesign-plugins-page .arkme-extension-center-embedded main {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n align-content: start;\n gap: 12px;\n padding: 16px 0 0 !important;\n display: grid !important;\n}\n\n.arkme-redesign-plugins-page .arkme-extension-card {\n background: #fff !important;\n border: 1px solid #e3e4e7 !important;\n border-radius: 15px !important;\n min-height: 138px !important;\n margin: 0 !important;\n padding: 18px !important;\n}\n\n.arkme-redesign-plugins-page .arkme-extension-card:hover {\n background: #fafafa !important;\n border-color: #d5d7dc !important;\n}\n\n.arkme-redesign-plugins-page .arkme-extension-grid-span, .arkme-redesign-plugins-page .arkme-extension-center-embedded main > [role=\"status\"], .arkme-redesign-plugins-page .arkme-extension-center-embedded main > [role=\"alert\"] {\n grid-column: 1 / -1;\n}\n\n@keyframes arkme-icon-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n.arkme-icon-spin {\n animation: .8s linear infinite arkme-icon-spin;\n}\n\n@media (prefers-reduced-motion: reduce) {\n [data-arkme-voice] .arkme-icon-spin {\n animation: none;\n }\n}\n\n.arkme-redesign-settings-surface {\n color: #20232c;\n background: none;\n width: 100%;\n height: auto;\n overflow: visible;\n}\n\n.arkme-redesign-settings-shell {\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n padding: 0;\n}\n\n.arkme-redesign-settings-profile {\n align-items: center;\n gap: 16px;\n padding: 0 0 24px;\n display: flex;\n}\n\n.arkme-redesign-settings-profile > div:nth-child(2) {\n min-width: 0;\n}\n\n.arkme-redesign-settings-profile h1 {\n color: #20232c;\n letter-spacing: -.03em;\n white-space: nowrap;\n text-overflow: ellipsis;\n margin: 0 0 6px;\n font-size: 24px;\n font-weight: 600;\n line-height: 30px;\n overflow: hidden;\n}\n\n.arkme-redesign-settings-profile p {\n color: #858992;\n align-items: center;\n gap: 8px;\n margin: 0;\n font-size: 13px;\n line-height: 18px;\n display: flex;\n overflow: hidden;\n}\n\n.arkme-redesign-settings-profile p > span {\n white-space: nowrap;\n text-overflow: ellipsis;\n min-width: 0;\n overflow: hidden;\n}\n\n.arkme-account-profile-qr {\n color: #858992;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 0;\n flex: none;\n justify-content: center;\n align-items: center;\n width: 24px;\n height: 24px;\n margin: 0;\n padding: 2px;\n display: inline-flex;\n}\n\n.arkme-account-profile-qr:disabled {\n opacity: .55;\n cursor: default;\n}\n\n.arkme-account-profile-qr svg {\n width: 20px;\n height: 20px;\n display: block;\n}\n\n.arkme-redesign-settings-group {\n background: none;\n border: 0;\n border-bottom: 1px solid #e1e2e5;\n border-radius: 0;\n margin: 0;\n overflow: hidden;\n}\n\n.arkme-redesign-settings-group:last-child {\n border-bottom: 0;\n}\n\n.arkme-redesign-settings-group > h2 {\n color: #8a8e96;\n border-bottom: 1px solid #ededee;\n margin: 0;\n padding: 15px 1px 10px;\n font-size: 12px;\n font-weight: 500;\n line-height: 17px;\n}\n\n.arkme-redesign-settings-group > div {\n padding: 0;\n}\n\n.arkme-redesign-setting-row {\n box-sizing: border-box;\n width: 100%;\n min-height: 54px;\n color: inherit;\n font: inherit;\n text-align: left;\n background: none;\n border: 0;\n border-bottom: 1px solid #ededee;\n grid-template-columns: minmax(0, 1fr) auto 18px;\n align-items: center;\n gap: 10px;\n padding: 9px 1px;\n text-decoration: none;\n display: grid;\n}\n\n.arkme-redesign-setting-row:last-child {\n border-bottom: 0;\n}\n\nbutton.arkme-redesign-setting-row, a.arkme-redesign-setting-row {\n cursor: pointer;\n}\n\nbutton.arkme-redesign-setting-row:hover, a.arkme-redesign-setting-row:hover {\n color: #53617d;\n}\n\n.arkme-redesign-setting-row:disabled {\n opacity: .6;\n cursor: default;\n}\n\n.arkme-redesign-setting-row > strong {\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n overflow: hidden;\n}\n\n.arkme-redesign-setting-row > strong.is-danger {\n color: #b54841;\n}\n\n.arkme-redesign-setting-summary {\n color: #858992;\n text-align: right;\n white-space: nowrap;\n text-overflow: ellipsis;\n max-width: 360px;\n font-size: 12px;\n line-height: 18px;\n overflow: hidden;\n}\n\n.arkme-redesign-setting-row > svg {\n color: #8d929b;\n}\n\n.arkme-account-info-row {\n box-sizing: border-box;\n width: 100%;\n min-height: 54px;\n color: inherit;\n font: inherit;\n text-align: left;\n background: none;\n border: 0;\n border-bottom: 1px solid #ededee;\n grid-template-columns: 26px minmax(0, 1fr) auto 18px;\n align-items: center;\n gap: 10px;\n padding: 9px 1px;\n display: grid;\n}\n\n.arkme-account-info-row:last-child {\n border-bottom: 0;\n}\n\nbutton.arkme-account-info-row {\n cursor: pointer;\n}\n\n.arkme-account-info-row:disabled {\n opacity: .6;\n cursor: default;\n}\n\n.arkme-account-info-icon {\n color: #6f7580;\n justify-content: center;\n align-items: center;\n width: 26px;\n height: 26px;\n display: inline-flex;\n}\n\n.arkme-account-info-copy {\n gap: 2px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-account-info-copy > strong {\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n overflow: hidden;\n}\n\n.arkme-account-info-copy > small {\n color: #858992;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 12px;\n line-height: 18px;\n overflow: hidden;\n}\n\n.arkme-account-info-action {\n color: #858992;\n white-space: nowrap;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-account-info-row > svg {\n color: #8d929b;\n}\n\n.arkme-account-feedback {\n color: #b54841;\n align-items: flex-start;\n gap: 6px;\n margin: 8px 0 14px;\n font-size: 12px;\n line-height: 18px;\n display: flex;\n}\n\n.arkme-account-dialog-backdrop {\n z-index: 50;\n background: #12141a6b;\n justify-content: center;\n align-items: center;\n padding: 18px;\n display: flex;\n position: fixed;\n inset: 0;\n}\n\n.arkme-account-dialog {\n box-sizing: border-box;\n color: #20232c;\n background: #fff;\n border: 1px solid #e1e2e5;\n border-radius: 16px;\n width: min(420px, 100vw - 36px);\n max-height: calc(100vh - 56px);\n overflow: auto;\n box-shadow: 0 18px 52px #11182738;\n}\n\n.arkme-account-dialog > header {\n border-bottom: 1px solid #ededee;\n justify-content: space-between;\n align-items: center;\n height: 58px;\n padding: 0 16px 0 20px;\n display: flex;\n}\n\n.arkme-account-dialog h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 650;\n line-height: 24px;\n}\n\n.arkme-account-dialog > header button {\n color: #8d929b;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 50%;\n width: 34px;\n height: 34px;\n}\n\n.arkme-account-qr-card {\n box-sizing: border-box;\n background: #fff;\n border: 1px solid #ededee;\n border-radius: 14px;\n justify-items: center;\n gap: 7px;\n width: 270px;\n margin: 22px auto 16px;\n padding: 24px 22px 22px;\n display: grid;\n}\n\n.arkme-account-qr-card strong {\n margin-top: 4px;\n font-size: 17px;\n font-weight: 650;\n line-height: 23px;\n}\n\n.arkme-account-qr-card span, .arkme-account-qr-card small {\n color: #858992;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-account-qr-card img {\n width: 180px;\n height: 180px;\n margin-top: 8px;\n}\n\n.arkme-account-form {\n gap: 12px;\n padding: 18px 20px 20px;\n display: grid;\n}\n\n.arkme-account-form label {\n color: #5f6570;\n gap: 7px;\n font-size: 12px;\n line-height: 18px;\n display: grid;\n}\n\n.arkme-account-form input {\n box-sizing: border-box;\n color: #20232c;\n width: 100%;\n height: 42px;\n font: inherit;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 11px;\n outline: none;\n padding: 0 12px;\n}\n\n.arkme-account-form input:focus {\n border-color: #9aa7c2;\n box-shadow: 0 0 0 3px #53617d1f;\n}\n\n.arkme-account-rule {\n color: #858992;\n margin: -2px 0 0;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-account-code-row {\n grid-template-columns: minmax(0, 1fr) 92px;\n gap: 8px;\n display: grid;\n}\n\n.arkme-account-code-row button {\n color: #343944;\n font: inherit;\n cursor: pointer;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 11px;\n}\n\n.arkme-account-code-row button:disabled {\n opacity: .55;\n cursor: default;\n}\n\n.arkme-account-dialog-actions {\n justify-content: flex-end;\n gap: 10px;\n padding-top: 6px;\n display: flex;\n}\n\n.arkme-account-dialog-actions button {\n color: #343944;\n min-width: 78px;\n height: 36px;\n font: inherit;\n cursor: pointer;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 10px;\n justify-content: center;\n align-items: center;\n gap: 6px;\n padding: 0 14px;\n display: inline-flex;\n}\n\n.arkme-account-dialog-actions button[type=\"submit\"], .arkme-account-dialog-actions button:last-child {\n color: #fff;\n background: #20232c;\n border-color: #20232c;\n}\n\n.arkme-account-dialog-actions button:disabled {\n opacity: .55;\n cursor: default;\n}\n\n.arkme-account-dialog-status {\n color: #13a85b;\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-account-dialog-status.is-error {\n color: #b54841;\n}\n\n.arkme-redesign-version-row {\n grid-template-columns: minmax(0, 1fr) minmax(150px, auto) auto 18px;\n}\n\n.arkme-redesign-version-row.is-without-action {\n grid-template-columns: minmax(0, 1fr) auto 18px;\n}\n\n.arkme-redesign-version-copy {\n gap: 2px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-redesign-version-copy > strong {\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n overflow: hidden;\n}\n\n.arkme-redesign-version-copy > small {\n color: #858992;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 11px;\n line-height: 16px;\n overflow: hidden;\n}\n\n.arkme-redesign-version-value {\n color: #858992;\n white-space: nowrap;\n justify-self: end;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-redesign-version-action-slot {\n justify-content: flex-end;\n display: inline-flex;\n}\n\n.arkme-redesign-trailing-slot {\n width: 18px;\n height: 1px;\n}\n\nbutton.arkme-redesign-update-button {\n color: #343944;\n min-width: 72px;\n height: 30px;\n font: inherit;\n white-space: nowrap;\n cursor: pointer;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 9px;\n justify-content: center;\n align-items: center;\n gap: 5px;\n padding: 0 11px;\n font-size: 11px;\n display: inline-flex;\n}\n\nbutton.arkme-redesign-update-button:hover {\n background: #f7f7f8;\n border-color: #cfd3da;\n}\n\nbutton.arkme-redesign-update-button:disabled {\n opacity: .55;\n cursor: default;\n}\n\n.arkme-redesign-settings-group:has(.arkme-redesign-balance-row) {\n overflow: visible;\n}\n\n.arkme-redesign-balance-row {\n grid-template-columns: max-content max-content minmax(0, 1fr) 18px;\n column-gap: 20px;\n}\n\n.arkme-redesign-balance-row.is-without-reserved {\n grid-template-columns: max-content minmax(0, 1fr) 18px;\n}\n\n.arkme-redesign-balance-main {\n min-width: 0;\n color: inherit;\n font: inherit;\n text-align: left;\n cursor: pointer;\n background: none;\n border: 0;\n gap: 2px;\n padding: 0;\n display: grid;\n}\n\n.arkme-redesign-balance-main > strong {\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n}\n\n.arkme-redesign-balance-main > small {\n color: #858992;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-redesign-balance-usage {\n color: #8a8e96;\n white-space: nowrap;\n font-size: 11px;\n line-height: 16px;\n}\n\n.arkme-redesign-reserved-balance {\n gap: 2px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-redesign-recharge-trigger {\n justify-self: end;\n}\n\n.arkme-redesign-reserved-title {\n align-items: center;\n gap: 5px;\n width: fit-content;\n display: inline-flex;\n position: relative;\n}\n\n.arkme-redesign-reserved-title > strong {\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n}\n\n.arkme-redesign-reserved-balance > small {\n color: #858992;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-redesign-reserved-help {\n box-sizing: border-box;\n color: #858992;\n cursor: help;\n border: 1px solid #a6aab2;\n border-radius: 50%;\n place-items: center;\n width: 15px;\n height: 15px;\n font-size: 10px;\n font-weight: 600;\n line-height: 1;\n display: inline-grid;\n}\n\n.arkme-redesign-reserved-help:focus-visible {\n outline-offset: 2px;\n outline: 2px solid #7b8cad;\n}\n\n.arkme-redesign-reserved-title > [role=\"tooltip\"] {\n box-sizing: border-box;\n z-index: 20;\n color: #fff;\n opacity: 0;\n visibility: hidden;\n pointer-events: none;\n background: #2e323b;\n border-radius: 8px;\n width: 240px;\n padding: 9px 11px;\n font-size: 11px;\n font-weight: 400;\n line-height: 17px;\n transition: opacity .12s, transform .12s, visibility .12s;\n position: absolute;\n bottom: calc(100% + 8px);\n left: calc(100% - 7.5px);\n transform: translate(-50%, 2px);\n box-shadow: 0 6px 18px #181b222e;\n}\n\n.arkme-redesign-reserved-help:hover ~ [role=\"tooltip\"], .arkme-redesign-reserved-help:focus ~ [role=\"tooltip\"] {\n opacity: 1;\n visibility: visible;\n transform: translate(-50%);\n}\n\n.arkme-redesign-settings-error {\n color: #b54841;\n background: #fff3f0;\n border-radius: 10px;\n margin: -8px 0 28px;\n padding: 10px 13px;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-remote-settings-dialog-backdrop {\n z-index: 1150;\n box-sizing: border-box;\n backdrop-filter: blur(1.5px);\n background: #16181d47;\n place-items: center;\n padding: 24px;\n display: grid;\n position: fixed;\n inset: 0;\n}\n\n.arkme-remote-settings-dialog {\n color: #20232c;\n background: #fff;\n border: 1px solid #14182014;\n border-radius: 19px;\n flex-direction: column;\n width: min(720px, 100vw - 48px);\n max-height: min(720px, 100vh - 48px);\n display: flex;\n overflow: hidden;\n box-shadow: 0 18px 54px #11141b2e;\n}\n\n.arkme-remote-page-header {\n box-sizing: border-box;\n border-bottom: 1px solid #ededee;\n justify-content: space-between;\n align-items: center;\n gap: 20px;\n min-height: 74px;\n padding: 0 24px 0 28px;\n display: flex;\n}\n\n.arkme-remote-page-header > div {\n min-width: 0;\n}\n\n.arkme-remote-page-header h1 {\n color: #20232c;\n letter-spacing: -.02em;\n margin: 0;\n font-size: 18px;\n font-weight: 620;\n line-height: 25px;\n}\n\n.arkme-remote-page-header p {\n color: #8b9098;\n margin: 3px 0 0;\n font-size: 11px;\n line-height: 17px;\n}\n\n.arkme-remote-settings-close {\n color: #777c85;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 9px;\n flex: none;\n justify-content: center;\n align-items: center;\n width: 32px;\n height: 32px;\n padding: 0;\n display: inline-flex;\n}\n\n.arkme-remote-settings-close:hover {\n color: #20232c;\n background: #f3f3f4;\n}\n\n.arkme-remote-settings-dialog-body {\n overscroll-behavior: contain;\n gap: 28px;\n padding: 24px 28px 28px;\n display: grid;\n overflow-y: auto;\n}\n\n.arkme-remote-section {\n gap: 13px;\n display: grid;\n}\n\n.arkme-remote-section-header {\n justify-content: space-between;\n align-items: flex-end;\n gap: 18px;\n min-height: 34px;\n display: flex;\n}\n\n.arkme-remote-section-header > div:first-child {\n min-width: 0;\n}\n\n.arkme-remote-section-header h2 {\n color: #292c34;\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n line-height: 21px;\n}\n\n.arkme-remote-section-header p {\n color: #8b9098;\n margin: 2px 0 0;\n font-size: 11px;\n line-height: 17px;\n}\n\n.arkme-remote-section-header > div:last-child {\n align-items: center;\n gap: 8px;\n display: flex;\n}\n\n.arkme-remote-icon-button {\n color: #8a8f97;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 9px;\n justify-content: center;\n align-items: center;\n width: 32px;\n height: 32px;\n padding: 0;\n display: inline-flex;\n}\n\n.arkme-remote-icon-button:hover {\n color: #343944;\n background: #f3f3f4;\n}\n\n.arkme-remote-add-button {\n color: #fff;\n min-height: 32px;\n font: inherit;\n cursor: pointer;\n background: #20232c;\n border: 0;\n border-radius: 9px;\n align-items: center;\n gap: 5px;\n padding: 0 12px;\n font-size: 11px;\n font-weight: 550;\n display: inline-flex;\n}\n\n.arkme-remote-add-button:hover {\n background: #343944;\n}\n\n.arkme-remote-add-button:disabled, .arkme-remote-icon-button:disabled {\n opacity: .45;\n cursor: default;\n}\n\n.arkme-remote-settings-card {\n background: #fff;\n border: 1px solid #e1e2e5;\n border-radius: 16px;\n overflow: hidden;\n}\n\n.arkme-remote-allow-row {\n border-bottom: 1px solid #ededee;\n justify-content: space-between;\n align-items: center;\n gap: 18px;\n min-height: 60px;\n padding: 0 18px;\n display: flex;\n}\n\n.arkme-remote-allow-row > div {\n gap: 2px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-remote-allow-row strong, .arkme-remote-device-row strong, .arkme-remote-name-row strong {\n color: #343944;\n font-size: 12px;\n font-weight: 600;\n line-height: 18px;\n}\n\n.arkme-remote-allow-row span, .arkme-remote-device-row span, .arkme-remote-name-row small {\n color: #8b9098;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 10px;\n line-height: 16px;\n overflow: hidden;\n}\n\n.arkme-remote-switch {\n cursor: pointer;\n background: #d7d9dd;\n border: 0;\n border-radius: 999px;\n flex: none;\n width: 40px;\n height: 23px;\n padding: 0;\n transition: background .16s;\n position: relative;\n}\n\n.arkme-remote-switch > span {\n background: #fff;\n border-radius: 50%;\n width: 17px;\n height: 17px;\n transition: transform .16s;\n position: absolute;\n top: 3px;\n left: 3px;\n box-shadow: 0 1px 3px #14182038;\n}\n\n.arkme-remote-switch[aria-checked=\"true\"] {\n background: #3b9cf5;\n}\n\n.arkme-remote-switch[aria-checked=\"true\"] > span {\n transform: translateX(17px);\n}\n\n.arkme-remote-switch:disabled {\n opacity: .5;\n cursor: default;\n}\n\n.arkme-remote-device-row {\n border-bottom: 1px solid #ededee;\n grid-template-columns: 24px minmax(0, 1fr) auto;\n align-items: center;\n gap: 11px;\n min-height: 64px;\n padding: 0 18px;\n display: grid;\n}\n\n.arkme-remote-device-row:last-child {\n border-bottom: 0;\n}\n\n.arkme-remote-device-row > svg {\n color: #68707c;\n}\n\n.arkme-remote-device-row > div {\n gap: 1px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-remote-device-row > button {\n color: #5d626c;\n min-height: 30px;\n font: inherit;\n cursor: pointer;\n background: #f3f3f4;\n border: 0;\n border-radius: 9px;\n padding: 0 10px;\n font-size: 10px;\n}\n\n.arkme-remote-device-row > button:hover {\n color: #b54841;\n background: #fff0ed;\n}\n\n.arkme-remote-device-row > button:disabled {\n opacity: .45;\n cursor: default;\n}\n\n.arkme-remote-empty-row {\n color: #989ca3;\n align-items: center;\n gap: 11px;\n min-height: 52px;\n padding: 0 18px;\n font-size: 11px;\n display: flex;\n}\n\n.arkme-remote-empty-row > svg {\n color: #a2a6ad;\n}\n\n.arkme-remote-name-row {\n color: #727780;\n width: 100%;\n min-height: 62px;\n font: inherit;\n text-align: left;\n cursor: pointer;\n background: none;\n border: 0;\n grid-template-columns: 24px minmax(0, 1fr) 20px;\n align-items: center;\n gap: 11px;\n padding: 0 18px;\n display: grid;\n}\n\n.arkme-remote-name-row:hover {\n background: #fafafb;\n}\n\n.arkme-remote-name-row > span {\n gap: 1px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-remote-name-row small {\n display: block;\n}\n\n.arkme-remote-rename {\n border-top: 1px solid #ededee;\n grid-template-columns: minmax(0, 1fr) auto auto;\n gap: 7px;\n padding: 12px 18px;\n display: grid;\n}\n\n.arkme-remote-rename input {\n box-sizing: border-box;\n color: #20232c;\n min-width: 0;\n height: 34px;\n font: inherit;\n background: #fff;\n border: 1px solid #dfe1e5;\n border-radius: 9px;\n outline: 0;\n padding: 0 10px;\n font-size: 12px;\n}\n\n.arkme-remote-rename input:focus {\n border-color: #6eb3f3;\n box-shadow: 0 0 0 3px #3b9cf51f;\n}\n\n.arkme-remote-rename button {\n color: #4f5560;\n min-height: 34px;\n font: inherit;\n cursor: pointer;\n background: #fff;\n border: 1px solid #e0e1e4;\n border-radius: 9px;\n padding: 0 11px;\n font-size: 11px;\n}\n\n.arkme-remote-rename button[type=\"submit\"] {\n color: #fff;\n background: #20232c;\n border-color: #20232c;\n}\n\n.arkme-remote-rename button:disabled {\n opacity: .5;\n cursor: default;\n}\n\n.arkme-remote-error {\n margin: -22px 0 0;\n}\n\n.arkme-remote-dialog-backdrop {\n z-index: 1200;\n box-sizing: border-box;\n backdrop-filter: blur(1.5px);\n background: #16181d47;\n place-items: center;\n padding: 24px;\n display: grid;\n position: fixed;\n inset: 0;\n overflow: auto;\n}\n\n.arkme-remote-dialog {\n box-sizing: border-box;\n color: #20232c;\n background: #fff;\n border: 1px solid #14182014;\n border-radius: 19px;\n width: min(440px, 100vw - 32px);\n max-height: calc(100vh - 48px);\n padding: 28px;\n position: relative;\n overflow: auto;\n box-shadow: 0 18px 54px #11141b2e;\n}\n\n.arkme-remote-dialog-close {\n color: #777c85;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 9px;\n justify-content: center;\n align-items: center;\n width: 32px;\n height: 32px;\n padding: 0;\n display: inline-flex;\n position: absolute;\n top: 16px;\n right: 16px;\n}\n\n.arkme-remote-dialog-close:hover {\n color: #20232c;\n background: #f3f3f4;\n}\n\n.arkme-remote-dialog-symbol {\n color: #343944;\n justify-content: center;\n align-items: center;\n gap: 9px;\n height: 38px;\n display: flex;\n}\n\n.arkme-remote-dialog-symbol > span {\n background: #d6d8dc;\n width: 28px;\n height: 1px;\n}\n\n.arkme-remote-dialog > header {\n text-align: center;\n margin: 12px 0 22px;\n}\n\n.arkme-remote-dialog h2 {\n letter-spacing: -.02em;\n margin: 0;\n font-size: 19px;\n font-weight: 620;\n line-height: 27px;\n}\n\n.arkme-remote-dialog header p {\n color: #858992;\n margin: 6px 0 0;\n font-size: 11px;\n line-height: 17px;\n}\n\n.arkme-remote-pairing-tabs {\n box-sizing: border-box;\n background: #f1f1f2;\n border-radius: 11px;\n grid-template-columns: 1fr 1fr;\n gap: 3px;\n height: 38px;\n padding: 3px;\n display: grid;\n}\n\n.arkme-remote-pairing-tabs button {\n color: #737881;\n font: inherit;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 8px;\n font-size: 11px;\n}\n\n.arkme-remote-pairing-tabs button[aria-selected=\"true\"] {\n color: #252831;\n background: #fff;\n box-shadow: 0 1px 3px #14182017;\n}\n\n.arkme-remote-pairing-display {\n box-sizing: border-box;\n background: #fff;\n border: 1px solid #e5e6e8;\n border-radius: 16px;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n min-height: 308px;\n margin-top: 14px;\n padding: 24px;\n display: flex;\n position: relative;\n}\n\n.arkme-remote-pairing-display > img {\n width: 232px;\n height: 232px;\n image-rendering: pixelated;\n display: block;\n}\n\n.arkme-remote-pairing-display > p {\n color: #8b9098;\n text-align: center;\n margin: 10px 0 0;\n font-size: 10px;\n line-height: 16px;\n}\n\n.arkme-remote-pairing-code {\n color: #20232c;\n letter-spacing: .17em;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n user-select: all;\n font-size: 33px;\n font-weight: 620;\n line-height: 46px;\n}\n\n.arkme-remote-pairing-tools {\n gap: 4px;\n display: flex;\n position: absolute;\n bottom: 12px;\n right: 12px;\n}\n\n.arkme-remote-pairing-tools button {\n color: #8a8f97;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 8px;\n justify-content: center;\n align-items: center;\n width: 30px;\n height: 30px;\n padding: 0;\n display: inline-flex;\n}\n\n.arkme-remote-pairing-tools button:hover {\n color: #343944;\n background: #f3f3f4;\n}\n\n.arkme-remote-pairing-expired {\n text-align: center;\n justify-items: center;\n gap: 7px;\n display: grid;\n}\n\n.arkme-remote-pairing-expired strong {\n font-size: 14px;\n line-height: 20px;\n}\n\n.arkme-remote-pairing-expired p {\n color: #8b9098;\n margin: 0;\n font-size: 11px;\n}\n\n.arkme-remote-pairing-expired button {\n color: #fff;\n min-height: 32px;\n font: inherit;\n cursor: pointer;\n background: #20232c;\n border: 0;\n border-radius: 9px;\n margin-top: 7px;\n padding: 0 12px;\n font-size: 11px;\n}\n\n.arkme-remote-dialog-note {\n color: #858992;\n align-items: flex-start;\n gap: 7px;\n margin: 14px 2px 0;\n font-size: 10px;\n line-height: 16px;\n display: flex;\n}\n\n.arkme-remote-dialog-note > svg {\n color: #5e856d;\n flex: none;\n margin-top: 1px;\n}\n\n.arkme-remote-settings-close:focus-visible, .arkme-remote-icon-button:focus-visible, .arkme-remote-add-button:focus-visible, .arkme-remote-switch:focus-visible, .arkme-remote-device-row > button:focus-visible, .arkme-remote-name-row:focus-visible, .arkme-remote-rename button:focus-visible, .arkme-remote-dialog button:focus-visible {\n outline-offset: 2px;\n outline: 2px solid #3b9cf5;\n}\n\n@media (width <= 520px) {\n .arkme-remote-settings-dialog-backdrop {\n padding: 10px;\n }\n\n .arkme-remote-settings-dialog {\n border-radius: 17px;\n width: calc(100vw - 20px);\n max-height: calc(100vh - 20px);\n }\n\n .arkme-remote-page-header {\n min-height: 68px;\n padding: 0 16px 0 20px;\n }\n\n .arkme-remote-page-header p {\n display: none;\n }\n\n .arkme-remote-settings-dialog-body {\n gap: 24px;\n padding: 20px 18px 22px;\n }\n\n .arkme-remote-section-header p {\n display: none;\n }\n\n .arkme-remote-device-row {\n grid-template-columns: 22px minmax(0, 1fr);\n padding-top: 10px;\n padding-bottom: 10px;\n }\n\n .arkme-remote-device-row > button {\n grid-column: 2;\n justify-self: start;\n }\n\n .arkme-remote-dialog-backdrop {\n padding: 12px;\n }\n\n .arkme-remote-dialog {\n padding: 24px 20px;\n }\n\n .arkme-remote-pairing-display {\n min-height: 282px;\n padding: 18px;\n }\n\n .arkme-remote-pairing-display > img {\n width: min(224px, 100%);\n height: auto;\n }\n\n .arkme-remote-pairing-code {\n letter-spacing: .12em;\n font-size: 26px;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .arkme-remote-switch, .arkme-remote-switch > span {\n transition: none;\n }\n}\n\n.arkme-redesign-model-settings {\n color: #20232c;\n background: #fff;\n width: 100%;\n height: 100%;\n overflow-y: auto;\n}\n\n.arkme-redesign-model-settings > header {\n width: min(760px, 100% - 96px);\n margin: 0 auto;\n padding: 42px 0 22px;\n}\n\n.arkme-redesign-model-settings > header button {\n color: #525762;\n height: 34px;\n font: inherit;\n cursor: pointer;\n background: #fff;\n border: 1px solid #e1e2e5;\n border-radius: 18px;\n align-items: center;\n gap: 4px;\n padding: 0 10px 0 7px;\n font-size: 13px;\n display: inline-flex;\n}\n\n.arkme-redesign-model-settings > header button:hover {\n color: #20232c;\n background: #f6f6f7;\n}\n\n.arkme-redesign-model-settings-body {\n width: min(760px, 100% - 96px);\n margin: 0 auto;\n padding: 0 0 68px;\n}\n\n.arkme-redesign-model-settings-body > * {\n max-width: none !important;\n}\n\n.arkme-redesign-task-start {\n place-items: center;\n width: 100%;\n height: 100%;\n padding: 28px 58px 64px;\n display: grid;\n}\n\n.arkme-redesign-task-start-inner {\n text-align: center;\n width: min(760px, 88%);\n transform: translateY(-12px);\n}\n\n.arkme-redesign-task-greeting {\n justify-content: center;\n align-items: center;\n gap: 12px;\n margin-bottom: 24px;\n display: flex;\n}\n\n.arkme-redesign-task-greeting img {\n object-fit: contain;\n flex: none;\n width: 62px;\n height: 16px;\n display: block;\n}\n\n.arkme-redesign-task-start h1 {\n letter-spacing: -.03em;\n margin: 0;\n font-size: 29px;\n font-weight: 600;\n line-height: 1.15;\n}\n\n.arkme-redesign-hero-input {\n border: 1px solid var(--arkme-focus);\n text-align: left;\n background: #fff;\n border-radius: 17px;\n grid-template-rows: minmax(56px, 1fr) auto;\n min-height: 142px;\n padding: 17px 16px 13px 20px;\n display: grid;\n box-shadow: 0 8px 30px #1c1f270b;\n}\n\n.arkme-redesign-hero-input:focus-within {\n border-color: #aebdff;\n box-shadow: 0 10px 38px #36488c13, 0 0 0 3px #91a4ff12;\n}\n\n.arkme-redesign-hero-input textarea {\n resize: none;\n color: #20232c;\n border: 0;\n outline: 0;\n width: 100%;\n min-height: 58px;\n padding: 0;\n font-size: 15px;\n line-height: 1.6;\n}\n\n.arkme-redesign-hero-input textarea::placeholder {\n color: #a3a6ad;\n}\n\n.arkme-redesign-hero-controls {\n justify-content: space-between;\n align-items: center;\n gap: 16px;\n display: flex;\n}\n\n.arkme-redesign-hero-controls > div {\n align-items: center;\n gap: 7px;\n display: flex;\n}\n\n.arkme-redesign-source-button {\n border-radius: 22px;\n align-items: center;\n gap: 8px;\n height: 36px;\n padding: 0 13px;\n font-size: 13px;\n display: flex;\n border: 1px solid #e2e3e6 !important;\n}\n\n.arkme-redesign-round-tool, .arkme-redesign-send-task {\n border-radius: 50%;\n place-items: center;\n width: 40px;\n height: 40px;\n display: grid;\n border: 1px solid #e2e3e6 !important;\n}\n\n.arkme-redesign-round-tool:hover {\n background: #f5f5f6;\n}\n\n.arkme-redesign-send-task {\n color: #fff !important;\n background: #20232d !important;\n border: 0 !important;\n}\n\n.arkme-redesign-send-task:disabled {\n cursor: default;\n background: #d9dade !important;\n}\n\n.arkme-redesign-task-error {\n color: #b84747;\n text-align: left;\n margin-top: 10px;\n font-size: 12px;\n}\n\n.arkme-redesign-starters {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n width: calc(100% - 18px);\n margin: 22px auto 0;\n display: grid;\n}\n\n.arkme-redesign-starters > button {\n text-align: left;\n border-right: 1px solid #e7e7e9;\n align-items: center;\n gap: 12px;\n min-width: 0;\n min-height: 48px;\n padding: 4px 18px;\n display: flex;\n}\n\n.arkme-redesign-starters > button:last-child {\n border-right: 0;\n}\n\n.arkme-redesign-starters > button:hover strong {\n color: #5365ad;\n}\n\n.arkme-redesign-starter-icon {\n color: #30333b;\n border: 1px solid #e2e3e6;\n border-radius: 50%;\n flex: none;\n place-items: center;\n width: 38px;\n height: 38px;\n display: grid;\n}\n\n.arkme-redesign-starters > button > span:last-child {\n gap: 4px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-redesign-starters strong {\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 13px;\n font-weight: 500;\n overflow: hidden;\n}\n\n.arkme-redesign-starters small {\n color: #8d919a;\n font-size: 12px;\n}\n\n.arkme-redesign-details {\n z-index: 4;\n top: var(--arkme-native-titlebar);\n background: #fff;\n border-left: 1px solid #e7e7e9;\n width: 360px;\n position: absolute;\n bottom: 0;\n right: 0;\n overflow: hidden;\n}\n\n.arkme-redesign-calendar-overlay {\n z-index: 14;\n inset: var(--arkme-native-titlebar) 0 0;\n pointer-events: none;\n position: absolute;\n}\n\n.arkme-redesign-calendar-overlay > * {\n pointer-events: auto;\n}\n\n.arkme-redesign-overlays {\n z-index: 20;\n pointer-events: none;\n position: absolute;\n inset: 0;\n}\n\n.arkme-redesign-overlays > * {\n pointer-events: auto;\n}\n\n.arkme-workspace-dialog-backdrop {\n z-index: 60;\n backdrop-filter: blur(2px);\n background: #181b2238;\n place-items: center;\n padding: 28px;\n display: grid;\n position: absolute;\n inset: 0;\n}\n\n.arkme-workspace-dialog {\n background: #fff;\n border: 1px solid #dddfe4;\n border-radius: 18px;\n grid-template-rows: auto auto minmax(0, 1fr) auto;\n width: min(640px, 100%);\n height: min(620px, 100%);\n min-height: 420px;\n display: grid;\n overflow: hidden;\n box-shadow: 0 24px 70px #191c232e;\n}\n\n.arkme-workspace-dialog > header {\n justify-content: space-between;\n align-items: flex-start;\n gap: 18px;\n padding: 22px 24px 16px;\n display: flex;\n}\n\n.arkme-workspace-dialog > header span {\n color: #8b8e96;\n font-size: 10px;\n}\n\n.arkme-workspace-dialog > header h2 {\n margin: 5px 0 0;\n font-size: 19px;\n font-weight: 600;\n}\n\n.arkme-workspace-dialog > header > button {\n border-radius: 9px;\n place-items: center;\n width: 32px;\n height: 32px;\n display: grid;\n}\n\n.arkme-workspace-dialog > nav {\n border-top: 1px solid #ececef;\n border-bottom: 1px solid #ececef;\n align-items: center;\n gap: 2px;\n min-height: 42px;\n padding: 0 22px;\n display: flex;\n overflow-x: auto;\n}\n\n.arkme-workspace-dialog > nav > span {\n white-space: nowrap;\n color: #9a9da5;\n align-items: center;\n gap: 2px;\n display: inline-flex;\n}\n\n.arkme-workspace-dialog > nav button {\n color: #666a73;\n border-radius: 8px;\n align-items: center;\n gap: 5px;\n height: 30px;\n padding: 0 7px;\n font-size: 11px;\n display: inline-flex;\n}\n\n.arkme-workspace-directory-list {\n min-height: 0;\n padding: 10px 14px;\n overflow-y: auto;\n}\n\n.arkme-workspace-directory-list > button {\n text-align: left;\n border-radius: 11px;\n grid-template-columns: 34px minmax(0, 1fr) 18px;\n align-items: center;\n gap: 9px;\n width: 100%;\n height: 48px;\n padding: 0 11px;\n display: grid;\n}\n\n.arkme-workspace-directory-list > button:hover {\n background: #f5f5f7;\n}\n\n.arkme-workspace-directory-list > button > span {\n color: #636873;\n border: 1px solid #e5e6e9;\n border-radius: 9px;\n place-items: center;\n width: 32px;\n height: 32px;\n display: grid;\n}\n\n.arkme-workspace-directory-list strong {\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 12px;\n font-weight: 500;\n overflow: hidden;\n}\n\n.arkme-workspace-dialog-status, .arkme-workspace-dialog-error {\n color: #8c9098;\n text-align: center;\n padding: 54px 16px;\n font-size: 12px;\n}\n\n.arkme-workspace-dialog-error {\n color: #b94b4b;\n}\n\n.arkme-workspace-dialog > footer {\n border-top: 1px solid #e8e9ec;\n justify-content: space-between;\n align-items: center;\n gap: 18px;\n min-height: 72px;\n padding: 12px 18px;\n display: flex;\n}\n\n.arkme-workspace-dialog-back {\n color: #696d76;\n align-items: center;\n gap: 6px;\n height: 36px;\n padding: 0 10px;\n font-size: 11px;\n display: inline-flex;\n}\n\n.arkme-workspace-dialog > footer > div {\n align-items: center;\n gap: 12px;\n min-width: 0;\n display: flex;\n}\n\n.arkme-workspace-dialog > footer small {\n white-space: nowrap;\n text-overflow: ellipsis;\n color: #92959d;\n max-width: 280px;\n font-size: 9px;\n overflow: hidden;\n}\n\n.arkme-workspace-dialog > footer > div > button {\n color: #fff;\n background: #20232d;\n border-radius: 10px;\n flex: none;\n height: 38px;\n padding: 0 17px;\n font-size: 11px;\n font-weight: 600;\n}\n\n.arkme-workspace-dialog button:disabled {\n opacity: .48;\n cursor: default;\n}\n\n.arkme-redesign-placeholder {\n color: #858992;\n text-align: center;\n place-content: center;\n justify-items: center;\n width: 100%;\n height: 100%;\n display: grid;\n}\n\n.arkme-redesign-placeholder > span {\n color: #555a64;\n border: 1px solid #e1e2e5;\n border-radius: 14px;\n place-items: center;\n width: 48px;\n height: 48px;\n display: grid;\n}\n\n.arkme-redesign-placeholder h1 {\n color: #3e424b;\n margin: 16px 0 7px;\n font-size: 18px;\n}\n\n.arkme-redesign-placeholder p {\n margin: 0;\n font-size: 12px;\n}\n\nbody[data-ds-dark-theme] [data-arkme-workspace] {\n --arkme-line: var(--dsw-alias-border-l1);\n --arkme-muted: var(--dsw-alias-label-tertiary);\n --arkme-soft: var(--dsw-alias-bg-layer-2);\n --arkme-focus: var(--dsw-alias-state-business-primary);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"persistent-sidebar\"], body[data-ds-dark-theme] [data-arkme-owned=\"product-navigation\"] {\n background: var(--dsw-specific-sidebar-fill) !important;\n color: var(--dsw-alias-label-secondary) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"product-brand\"] {\n box-shadow: none;\n background: none !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-workspace] [data-arkme-theme-image=\"light\"] {\n display: none !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-workspace] [data-arkme-theme-image=\"dark\"] {\n display: block !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"persistent-sidebar\"] > div {\n border-color: var(--dsw-alias-border-l1) !important;\n background: var(--dsw-alias-bg-layer-1) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"persistent-workspace\"] {\n background: var(--dsw-alias-bg-base) !important;\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"persistent-workspace\"] .arkme-conversation-surface, body[data-ds-dark-theme] [data-arkme-owned=\"persistent-workspace\"] .arkme-conversation-composer {\n background: var(--dsw-alias-bg-base) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"persistent-workspace\"] div:has( > input[aria-label=\"搜索\"]) {\n border-color: var(--dsw-alias-border-l2) !important;\n background: var(--dsw-specific-input-major) !important;\n box-shadow: var(--dsw-shadow-lv2) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"product-navigation\"] button:hover {\n background: var(--dsw-alias-interactive-bg-hover) !important;\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"product-navigation\"] button[aria-current=\"page\"] {\n background: var(--dsw-alias-interactive-bg-active) !important;\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"product-navigation\"] button[aria-current=\"page\"] > span[aria-hidden=\"true\"] {\n background: var(--dsw-alias-state-business-primary) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"product-surface\"], body[data-ds-dark-theme] [data-arkme-owned=\"directory-pane\"], body[data-ds-dark-theme] [data-arkme-owned=\"directory-pane\"] [aria-label=\"Arkme 会话列表\"], body[data-ds-dark-theme] [data-arkme-owned=\"persistent-sidebar\"] [aria-label=\"Arkme 会话列表\"] {\n background: var(--dsw-alias-bg-base) !important;\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"directory-pane\"] label:has( > input[aria-label=\"搜索对话或消息\"]), body[data-ds-dark-theme] [data-arkme-owned=\"directory-pane\"] button[aria-label=\"新任务\"], body[data-ds-dark-theme] [data-arkme-owned=\"persistent-sidebar\"] [aria-label=\"Arkme 会话列表\"] label:has( > input[aria-label=\"搜索对话或消息\"]), body[data-ds-dark-theme] [data-arkme-owned=\"persistent-sidebar\"] [aria-label=\"Arkme 会话列表\"] button[aria-label=\"新任务\"] {\n border-color: var(--dsw-alias-border-l2) !important;\n background: var(--dsw-specific-input-major) !important;\n color: var(--dsw-alias-label-secondary) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"directory-pane\"] [role=\"treeitem\"][aria-selected=\"true\"], body[data-ds-dark-theme] [data-arkme-owned=\"persistent-sidebar\"] [aria-label=\"Arkme 会话列表\"] [role=\"treeitem\"][aria-selected=\"true\"] {\n background: var(--dsw-alias-interactive-bg-active) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"directory-pane\"] [role=\"status\"][aria-label$=\"个人测试版\"], body[data-ds-dark-theme] [data-arkme-owned=\"persistent-sidebar\"] [aria-label=\"Arkme 会话列表\"] [role=\"status\"][aria-label$=\"个人测试版\"] {\n background: var(--dsw-alias-bg-layer-2) !important;\n}\n\nbody[data-ds-dark-theme] [data-arkme-owned=\"product-surface\"] .arkme-conversation-composer {\n background: var(--dsw-alias-bg-base) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-recordings-page [aria-label=\"全天候录音操作\"] > div > button, body[data-ds-dark-theme] [data-arkme-owned=\"product-surface\"] [aria-label=\"全天候录音操作\"] > div > button {\n border-color: var(--dsw-alias-border-l2) !important;\n background: var(--dsw-alias-button-elevated-fill) !important;\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-recordings-page [aria-label=\"全天候录音操作\"] > div > button:first-child, body[data-ds-dark-theme] [data-arkme-owned=\"product-surface\"] [aria-label=\"全天候录音操作\"] > div > button:first-child {\n border-color: var(--dsw-alias-button-primary-fill) !important;\n background: var(--dsw-alias-button-primary-fill) !important;\n color: var(--dsw-alias-label-primary-inverted) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-update-popover, body[data-ds-dark-theme] .arkme-update-capsule {\n border-color: var(--dsw-alias-border-l1);\n background: color-mix(in srgb, var(--dsw-alias-bg-base) 94%, transparent);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-update-popover-heading h2, body[data-ds-dark-theme] .arkme-update-release-notes strong, body[data-ds-dark-theme] .arkme-update-capsule-copy strong {\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-update-popover-heading span, body[data-ds-dark-theme] .arkme-update-popover-summary, body[data-ds-dark-theme] .arkme-update-release-notes small, body[data-ds-dark-theme] .arkme-update-capsule-copy small {\n color: var(--dsw-alias-label-secondary);\n}\n\nbody[data-ds-dark-theme] .arkme-update-release-notes, body[data-ds-dark-theme] .arkme-update-release-notes > div + div {\n border-color: var(--dsw-alias-border-l1);\n}\n\nbody[data-ds-dark-theme] .arkme-update-later, body[data-ds-dark-theme] .arkme-update-progress, body[data-ds-dark-theme] .arkme-update-rail:not(.is-available) {\n background: var(--dsw-alias-fill-l1);\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) {\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) > div > section[aria-label=\"客户端日历\"], body[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) > div > section[aria-label=\"当天内容\"] {\n border-color: var(--dsw-alias-border-l2) !important;\n background: var(--dsw-alias-bg-layer-1) !important;\n color: var(--dsw-alias-label-primary) !important;\n box-shadow: var(--dsw-shadow-lv2) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) > div > section[aria-label=\"客户端日历\"] > span[aria-hidden] {\n border-color: var(--dsw-alias-border-l2) !important;\n background: var(--dsw-alias-bg-layer-1) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"客户端日历\"] > header button, body[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"客户端日历\"] button[aria-label*=\"记录\"] {\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"客户端日历\"] > div > span {\n color: var(--dsw-alias-label-tertiary) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"客户端日历\"] button[data-selected=\"false\"][aria-label*=\"条记录\"] > span:last-child {\n background: var(--dsw-alias-bg-layer-2) !important;\n color: var(--dsw-alias-label-secondary) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"客户端日历\"] button[data-selected=\"true\"], body[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"客户端日历\"] button[data-selected=\"true\"] > span {\n color: var(--dsw-alias-label-primary-inverted) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"客户端日历\"] button[data-selected=\"true\"] > span:last-child {\n color: var(--dsw-alias-label-primary-inverted) !important;\n background: none !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"当天内容\"] article > div > div:last-child {\n border-color: var(--dsw-alias-border-l1) !important;\n background: var(--dsw-alias-bg-layer-2) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"当天内容\"] article h3, body[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"当天内容\"] article p {\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"当天内容\"] article time, body[data-ds-dark-theme] [aria-label=\"客户端日历\"]:has( > button[aria-label=\"关闭日历\"]) section[aria-label=\"当天内容\"] article span {\n color: var(--dsw-alias-label-secondary) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-root, body[data-ds-dark-theme] .arkme-redesign-chat-panel, body[data-ds-dark-theme] .arkme-redesign-content, body[data-ds-dark-theme] .arkme-redesign-feature-page, body[data-ds-dark-theme] .arkme-redesign-recordings-page, body[data-ds-dark-theme] .arkme-redesign-plugins-page, body[data-ds-dark-theme] .arkme-redesign-model-settings, body[data-ds-dark-theme] .arkme-redesign-details {\n background: var(--dsw-alias-bg-base);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-native-desktop .arkme-redesign-root:before {\n background: var(--dsw-alias-border-l1);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-rail {\n border-color: var(--dsw-alias-border-l2);\n background: var(--dsw-specific-sidebar-fill);\n box-shadow: var(--dsw-shadow-lv2);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-rail-primary button, body[data-ds-dark-theme] .arkme-redesign-rail-footer > button, body[data-ds-dark-theme] .arkme-redesign-profile-menu button, body[data-ds-dark-theme] .arkme-redesign-task-list > button, body[data-ds-dark-theme] .arkme-redesign-task-first, body[data-ds-dark-theme] .arkme-workspace-dialog > nav button, body[data-ds-dark-theme] .arkme-workspace-dialog-back, body[data-ds-dark-theme] .arkme-redesign-placeholder > span {\n color: var(--dsw-alias-label-secondary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-rail-primary button:hover, body[data-ds-dark-theme] .arkme-redesign-rail-footer > button:hover, body[data-ds-dark-theme] .arkme-redesign-profile-menu button:hover, body[data-ds-dark-theme] .arkme-redesign-chat-search:hover, body[data-ds-dark-theme] .arkme-redesign-task-section-title button:hover, body[data-ds-dark-theme] .arkme-redesign-task-list > button:hover, body[data-ds-dark-theme] .arkme-redesign-task-first:hover, body[data-ds-dark-theme] .arkme-extension-toolbar > button:hover, body[data-ds-dark-theme] button.arkme-redesign-setting-row:hover, body[data-ds-dark-theme] a.arkme-redesign-setting-row:hover, body[data-ds-dark-theme] .arkme-redesign-model-settings > header button:hover, body[data-ds-dark-theme] .arkme-redesign-round-tool:hover, body[data-ds-dark-theme] .arkme-workspace-directory-list > button:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-rail-primary button.is-active, body[data-ds-dark-theme] .arkme-redesign-rail-footer > button.is-active, body[data-ds-dark-theme] .arkme-redesign-task-list > button.is-selected {\n background: var(--dsw-alias-interactive-bg-active);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-rail-primary button.is-active:before {\n background: var(--dsw-alias-state-business-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-rail-footer, body[data-ds-dark-theme] .arkme-redesign-profile-menu, body[data-ds-dark-theme] .arkme-redesign-task-section, body[data-ds-dark-theme] .arkme-redesign-route-chats .arkme-conversation-header, body[data-ds-dark-theme] .arkme-redesign-search-page .arkme-search-history button, body[data-ds-dark-theme] .arkme-redesign-search-page .arkme-search-quick button, body[data-ds-dark-theme] .arkme-redesign-settings-group h2, body[data-ds-dark-theme] .arkme-redesign-setting-row, body[data-ds-dark-theme] .arkme-account-info-row, body[data-ds-dark-theme] .arkme-redesign-starters > button, body[data-ds-dark-theme] .arkme-redesign-details, body[data-ds-dark-theme] .arkme-workspace-dialog > nav, body[data-ds-dark-theme] .arkme-workspace-dialog > footer {\n border-color: var(--dsw-alias-border-l1) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-profile-popover, body[data-ds-dark-theme] .arkme-workspace-dialog {\n border-color: var(--dsw-alias-border-l2);\n background: var(--dsw-specific-menu);\n box-shadow: var(--dsw-shadow-lv3);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-profile-head small, body[data-ds-dark-theme] .arkme-redesign-profile-menu small, body[data-ds-dark-theme] .arkme-redesign-profile-menu button > svg:last-child, body[data-ds-dark-theme] .arkme-redesign-task-section-title, body[data-ds-dark-theme] .arkme-redesign-task-copy small, body[data-ds-dark-theme] .arkme-account-profile-qr, body[data-ds-dark-theme] .arkme-redesign-feature-page > header p, body[data-ds-dark-theme] .arkme-redesign-feature-page > header span, body[data-ds-dark-theme] .arkme-redesign-search-page input[aria-label=\"搜索\"]:not(:focus)::placeholder, body[data-ds-dark-theme] .arkme-redesign-settings-profile p, body[data-ds-dark-theme] .arkme-redesign-settings-group h2, body[data-ds-dark-theme] .arkme-redesign-setting-summary, body[data-ds-dark-theme] .arkme-account-info-copy > small, body[data-ds-dark-theme] .arkme-account-info-action, body[data-ds-dark-theme] .arkme-account-info-row > svg, body[data-ds-dark-theme] .arkme-account-info-icon, body[data-ds-dark-theme] .arkme-redesign-setting-row > svg, body[data-ds-dark-theme] .arkme-redesign-hero-input textarea::placeholder, body[data-ds-dark-theme] .arkme-redesign-starters small, body[data-ds-dark-theme] .arkme-workspace-dialog > header span, body[data-ds-dark-theme] .arkme-workspace-dialog > nav > span, body[data-ds-dark-theme] .arkme-workspace-dialog-status, body[data-ds-dark-theme] .arkme-workspace-dialog > footer small, body[data-ds-dark-theme] .arkme-redesign-placeholder {\n color: var(--dsw-alias-label-tertiary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-chat-search, body[data-ds-dark-theme] .arkme-extension-toolbar label, body[data-ds-dark-theme] .arkme-extension-toolbar > button, body[data-ds-dark-theme] .arkme-redesign-settings-group, body[data-ds-dark-theme] .arkme-redesign-model-settings > header button, body[data-ds-dark-theme] .arkme-redesign-source-button, body[data-ds-dark-theme] .arkme-redesign-round-tool, body[data-ds-dark-theme] .arkme-redesign-starter-icon, body[data-ds-dark-theme] .arkme-workspace-directory-list > button > span, body[data-ds-dark-theme] .arkme-redesign-placeholder > span {\n border-color: var(--dsw-alias-border-l2) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-chat-search, body[data-ds-dark-theme] .arkme-extension-toolbar label {\n color: var(--dsw-alias-label-tertiary) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-extension-toolbar input, body[data-ds-dark-theme] .arkme-redesign-settings-profile h1, body[data-ds-dark-theme] .arkme-redesign-model-settings > header button, body[data-ds-dark-theme] .arkme-redesign-task-start h1, body[data-ds-dark-theme] .arkme-redesign-hero-input textarea, body[data-ds-dark-theme] .arkme-redesign-starter-icon, body[data-ds-dark-theme] .arkme-redesign-placeholder h1 {\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-task-list, body[data-ds-dark-theme] .arkme-redesign-model-settings > header button, body[data-ds-dark-theme] .arkme-redesign-plugins-page .arkme-extension-card {\n background: var(--dsw-alias-bg-layer-1) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-settings-surface, body[data-ds-dark-theme] .arkme-redesign-settings-group {\n color: var(--dsw-alias-label-primary);\n background: none !important;\n}\n\nbody[data-ds-dark-theme] .arkme-account-dialog {\n border-color: var(--dsw-alias-border-l2);\n background: var(--dsw-specific-menu);\n color: var(--dsw-alias-label-primary);\n box-shadow: var(--dsw-shadow-lv3);\n}\n\nbody[data-ds-dark-theme] .arkme-account-dialog > header, body[data-ds-dark-theme] .arkme-account-qr-card {\n border-color: var(--dsw-alias-border-l1);\n}\n\nbody[data-ds-dark-theme] .arkme-account-qr-card, body[data-ds-dark-theme] .arkme-account-form input, body[data-ds-dark-theme] .arkme-account-code-row button, body[data-ds-dark-theme] .arkme-account-dialog-actions button {\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-primary);\n border-color: var(--dsw-alias-border-l2);\n}\n\nbody[data-ds-dark-theme] .arkme-account-dialog-actions button[type=\"submit\"], body[data-ds-dark-theme] .arkme-account-dialog-actions button:last-child {\n border-color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-label-primary);\n color: var(--dsw-alias-bg-base);\n}\n\nbody[data-ds-dark-theme] .arkme-account-rule, body[data-ds-dark-theme] .arkme-account-qr-card span, body[data-ds-dark-theme] .arkme-account-qr-card small, body[data-ds-dark-theme] .arkme-account-form label {\n color: var(--dsw-alias-label-tertiary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-route-chats .arkme-conversation-surface, body[data-ds-dark-theme] .arkme-redesign-plugins-page .arkme-extension-center-embedded > section {\n background: var(--dsw-alias-bg-base) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-route-chats .arkme-conversation-composer-inner, body[data-ds-dark-theme] .arkme-redesign-search-page .arkme-search-box {\n border-color: var(--dsw-alias-border-l2) !important;\n background: var(--dsw-specific-input-major) !important;\n color: var(--dsw-alias-label-primary) !important;\n box-shadow: var(--dsw-shadow-lv2) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-route-chats .arkme-conversation-composer-inner[data-arkme-primary-composer=\"true\"] {\n box-shadow: none !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-route-chats .arkme-conversation-composer-inner[data-arkme-primary-composer=\"true\"][data-arkme-composer-focused=\"true\"] {\n background: color-mix(in srgb, var(--dsw-alias-bg-base, #fff) 97%, #000) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-task-greeting img {\n filter: invert() hue-rotate(180deg);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-hero-input {\n border-color: var(--dsw-alias-border-l2) !important;\n background: var(--dsw-specific-input-major) !important;\n color: var(--dsw-alias-label-primary) !important;\n box-shadow: var(--dsw-shadow-lv2) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-hero-input textarea {\n background: none !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-source-button, body[data-ds-dark-theme] .arkme-redesign-round-tool, body[data-ds-dark-theme] .arkme-redesign-starter-icon {\n background: var(--dsw-alias-button-elevated-fill) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-search-page .arkme-search-history button, body[data-ds-dark-theme] .arkme-redesign-search-page .arkme-search-quick button {\n color: var(--dsw-alias-label-primary) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-plugins-page .arkme-extension-card {\n border-color: var(--dsw-alias-border-l1) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-plugins-page .arkme-extension-card:hover {\n border-color: var(--dsw-alias-border-l2) !important;\n background: var(--dsw-alias-interactive-bg-hover) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-task-section:focus-within .arkme-redesign-task-list {\n box-shadow: var(--dsw-shadow-lv2);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-settings-error {\n background: var(--dsw-alias-interactive-bg-hover-danger);\n color: var(--dsw-alias-state-error-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-page-header h1, body[data-ds-dark-theme] .arkme-remote-section-header h2, body[data-ds-dark-theme] .arkme-remote-allow-row strong, body[data-ds-dark-theme] .arkme-remote-device-row strong, body[data-ds-dark-theme] .arkme-remote-name-row strong, body[data-ds-dark-theme] .arkme-remote-dialog, body[data-ds-dark-theme] .arkme-remote-pairing-code {\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-section-header p, body[data-ds-dark-theme] .arkme-remote-page-header p, body[data-ds-dark-theme] .arkme-remote-allow-row span, body[data-ds-dark-theme] .arkme-remote-device-row span, body[data-ds-dark-theme] .arkme-remote-name-row small, body[data-ds-dark-theme] .arkme-remote-dialog header p, body[data-ds-dark-theme] .arkme-remote-pairing-display > p, body[data-ds-dark-theme] .arkme-remote-dialog-note, body[data-ds-dark-theme] .arkme-remote-empty-row {\n color: var(--dsw-alias-label-tertiary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-settings-card, body[data-ds-dark-theme] .arkme-remote-settings-dialog, body[data-ds-dark-theme] .arkme-remote-dialog, body[data-ds-dark-theme] .arkme-remote-pairing-display, body[data-ds-dark-theme] .arkme-remote-rename input {\n border-color: var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-allow-row, body[data-ds-dark-theme] .arkme-remote-device-row, body[data-ds-dark-theme] .arkme-remote-rename, body[data-ds-dark-theme] .arkme-remote-page-header {\n border-color: var(--dsw-alias-border-l1);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-settings-close, body[data-ds-dark-theme] .arkme-remote-icon-button, body[data-ds-dark-theme] .arkme-remote-dialog-close, body[data-ds-dark-theme] .arkme-remote-pairing-tools button, body[data-ds-dark-theme] .arkme-remote-name-row {\n color: var(--dsw-alias-label-secondary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-settings-close:hover, body[data-ds-dark-theme] .arkme-remote-icon-button:hover, body[data-ds-dark-theme] .arkme-remote-dialog-close:hover, body[data-ds-dark-theme] .arkme-remote-pairing-tools button:hover, body[data-ds-dark-theme] .arkme-remote-name-row:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-add-button, body[data-ds-dark-theme] .arkme-remote-rename button[type=\"submit\"], body[data-ds-dark-theme] .arkme-remote-pairing-expired button {\n background: var(--dsw-alias-button-primary-fill);\n color: var(--dsw-alias-label-primary-inverted);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-device-row > button, body[data-ds-dark-theme] .arkme-remote-rename button {\n border-color: var(--dsw-alias-border-l2);\n background: var(--dsw-alias-button-elevated-fill);\n color: var(--dsw-alias-label-secondary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-switch[aria-checked=\"true\"] {\n background: var(--dsw-alias-state-business-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-pairing-tabs {\n background: var(--dsw-alias-bg-layer-2);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-pairing-tabs button {\n color: var(--dsw-alias-label-tertiary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-pairing-tabs button[aria-selected=\"true\"] {\n background: var(--dsw-alias-button-elevated-fill);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-remote-settings-dialog-backdrop, body[data-ds-dark-theme] .arkme-remote-dialog-backdrop {\n background: #07090d8f;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-setting-row > strong.is-danger, body[data-ds-dark-theme] .arkme-redesign-task-error, body[data-ds-dark-theme] .arkme-workspace-dialog-error {\n color: var(--dsw-alias-state-error-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-task-state.is-complete > i {\n background: var(--dsw-alias-state-success-tertiary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-task-state.is-complete > i:after {\n background: var(--dsw-alias-state-success-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-task-matrix i, body[data-ds-dark-theme] .arkme-redesign-rail-primary button.is-active:before {\n background: var(--dsw-alias-state-business-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-hero-input:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: 0 0 0 3px var(--dsw-alias-state-business-tertiary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-starters > button:hover strong {\n color: var(--dsw-alias-state-business-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-send-task, body[data-ds-dark-theme] .arkme-workspace-dialog > footer > div > button {\n background: var(--dsw-alias-button-primary-fill) !important;\n color: var(--dsw-alias-label-primary-inverted) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-redesign-send-task:disabled {\n background: var(--dsw-alias-button-elevated-fill) !important;\n color: var(--dsw-alias-label-secondary) !important;\n}\n\nbody[data-ds-dark-theme] .arkme-workspace-dialog-backdrop {\n background: var(--dsw-alias-bg-mask-1);\n}\n\n@media (width <= 1024px) {\n .arkme-redesign-chat-panel {\n width: 264px;\n left: 82px;\n }\n\n .arkme-redesign-content {\n left: 82px;\n }\n\n .arkme-redesign-content.has-panel {\n left: 346px;\n }\n\n .arkme-redesign-rail {\n left: 12px;\n }\n\n .arkme-redesign-starters > button {\n padding: 0 10px;\n }\n\n .arkme-redesign-feature-page {\n padding-left: 30px;\n padding-right: 30px;\n }\n}\n\n@media (width <= 820px) {\n .arkme-redesign-chat-panel {\n display: none;\n }\n\n .arkme-redesign-content.has-panel {\n left: 82px;\n }\n\n .arkme-redesign-task-start {\n padding: 28px;\n }\n\n .arkme-redesign-starters {\n grid-template-columns: 1fr;\n gap: 6px;\n }\n\n .arkme-redesign-starters > button {\n border-right: 0;\n }\n\n .arkme-voiceprint-relationships {\n grid-template-columns: minmax(0, 1fr) !important;\n gap: 28px !important;\n }\n\n .arkme-voiceprint-outbound {\n border-left: 0 !important;\n border-top: 1px solid var(--dsw-alias-border-subtle, #e6e7eb) !important;\n padding-top: 28px !important;\n padding-left: 0 !important;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .arkme-redesign-task-matrix i {\n opacity: .6;\n animation: none;\n }\n\n .arkme-update-rail.is-downloading svg, .arkme-update-popover, .arkme-update-capsule, .arkme-update-progress.is-indeterminate span {\n animation: none;\n }\n\n .arkme-update-rail, .arkme-update-progress span {\n transition: none;\n }\n}\n\n.arkme-contact-directory, .arkme-directory-detail-pane {\n box-sizing: border-box;\n min-width: 0;\n height: 100%;\n min-height: 0;\n color: var(--dsw-alias-label-primary, #202124);\n font-size: 13px;\n overflow: hidden;\n}\n\n[data-arkme-directory-mode=\"contacts\"] {\n background: var(--dsw-specific-sidebar-fill, #fff) !important;\n border-left-color: var(--dsw-alias-border-l1, #ececef) !important;\n}\n\n.arkme-contact-directory {\n overflow-wrap: anywhere;\n padding: 8px 6px 18px;\n overflow-y: auto;\n}\n\n.arkme-directory-detail-pane {\n overflow: hidden;\n}\n\n.arkme-contact-directory button, .arkme-directory-detail-pane button {\n appearance: none;\n box-sizing: border-box;\n font: inherit;\n color: inherit;\n border: 0;\n margin: 0;\n}\n\n.arkme-contact-directory-section {\n border-bottom: 1px solid var(--dsw-alias-border-l1, var(--arkme-line));\n min-width: 0;\n padding: 2px 0 5px;\n}\n\n.arkme-contact-directory-section-header {\n text-align: left;\n cursor: pointer;\n background: none;\n border-radius: 10px;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n width: 100%;\n min-width: 0;\n min-height: 42px;\n padding: 0 10px;\n display: flex;\n}\n\n.arkme-contact-directory-section-title {\n align-items: center;\n gap: 6px;\n min-width: 0;\n display: flex;\n}\n\n.arkme-contact-directory-section-title strong {\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 13px;\n font-weight: 650;\n overflow: hidden;\n}\n\n.arkme-contact-directory-caret {\n width: 14px;\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n text-align: center;\n transform-origin: center;\n flex: none;\n font-size: 18px;\n line-height: 1;\n transition: transform .16s;\n}\n\n.arkme-contact-directory-section-header[aria-expanded=\"true\"] .arkme-contact-directory-caret {\n transform: rotate(90deg);\n}\n\n.arkme-contact-directory-section-header:hover {\n background: var(--dsw-alias-interactive-bg-hover, #f6f6f7);\n}\n\n.arkme-contact-directory-section-body {\n min-width: 0;\n padding: 0 0 5px;\n}\n\n.arkme-contact-directory-list {\n gap: 1px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-contact-directory-count {\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n font-variant-numeric: tabular-nums;\n flex: none;\n font-size: 11px;\n}\n\n.arkme-contact-directory-row {\n text-align: left;\n cursor: pointer;\n background: none;\n border-radius: 13px;\n align-items: center;\n gap: 10px;\n width: 100%;\n min-width: 0;\n min-height: 52px;\n margin: 1px 0;\n padding: 7px 10px;\n display: flex;\n overflow: hidden;\n}\n\n.arkme-contact-directory-row img {\n object-fit: cover;\n border-radius: 50%;\n flex: none;\n width: 38px;\n height: 38px;\n}\n\n.arkme-contact-directory-row.is-static {\n cursor: default;\n}\n\n.arkme-contact-directory-row.is-selected {\n background: var(--dsw-alias-interactive-bg-active, #eef0f4);\n}\n\n.arkme-contact-directory-row:not(.is-static):hover {\n background: var(--dsw-alias-interactive-bg-hover, #f6f6f7);\n}\n\n.arkme-contact-directory-avatar {\n border-radius: 50%;\n flex: none;\n place-items: center;\n width: 38px;\n height: 38px;\n display: grid;\n overflow: hidden;\n}\n\n.arkme-contact-directory-row-copy {\n flex: 1;\n align-content: center;\n min-width: 0;\n display: grid;\n overflow: hidden;\n}\n\n.arkme-contact-directory-row-copy strong {\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 13px;\n font-weight: 600;\n line-height: 18px;\n overflow: hidden;\n}\n\n.arkme-contact-directory-row-copy small {\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--dsw-alias-label-secondary, #68707c);\n font-size: 11px;\n line-height: 16px;\n overflow: hidden;\n}\n\n.arkme-contact-directory-letter {\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n padding: 8px 10px 2px;\n font-size: 11px;\n font-weight: 600;\n line-height: 16px;\n}\n\n.arkme-contact-directory-alphabetical, .arkme-contact-directory-letter-group {\n min-width: 0;\n}\n\n.arkme-contact-directory-status, .arkme-contact-directory-warning {\n color: var(--dsw-alias-label-secondary, var(--arkme-muted));\n overflow-wrap: anywhere;\n margin: 3px 8px;\n padding: 7px 9px;\n font-size: 11px;\n line-height: 16px;\n}\n\n.arkme-contact-directory-warning {\n color: var(--dsw-alias-state-warning-primary, #b45309);\n background: var(--dsw-alias-state-warning-tertiary, #fff7ed);\n border-radius: 9px;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n display: flex;\n}\n\n.arkme-contact-directory-warning button {\n color: inherit;\n cursor: pointer;\n background: none;\n flex: none;\n padding: 2px 4px;\n font-weight: 600;\n}\n\n.arkme-contact-directory-more {\n text-align: center;\n cursor: pointer;\n background: none;\n border-radius: 9px;\n width: calc(100% - 16px);\n min-height: 32px;\n padding: 6px 8px;\n color: var(--dsw-alias-state-business-primary, #4f5fbf) !important;\n margin: 3px 8px !important;\n}\n\n.arkme-contact-directory-empty {\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n text-align: center;\n padding: 14px 12px;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-directory-detail-empty {\n background: var(--dsw-alias-bg-base, #fff);\n place-items: center;\n min-width: 0;\n height: 100%;\n min-height: 0;\n display: grid;\n}\n\n.arkme-directory-detail-logo {\n object-fit: contain;\n opacity: .9;\n width: 96px;\n height: 96px;\n}\n\n.arkme-contact-detail, .arkme-contact-profile, .arkme-contact-world-card, .arkme-unmarked-speaker-summary, .arkme-unmarked-speaker-audio, .arkme-unmarked-speaker-choice {\n overflow-wrap: anywhere;\n min-width: 0;\n}\n\n.arkme-contact-detail {\n background: var(--dsw-alias-bg-base, #fff);\n grid-template-rows: auto minmax(0, 1fr);\n height: 100%;\n min-height: 0;\n display: grid;\n overflow: hidden;\n}\n\n.arkme-contact-profile {\n border-bottom: 1px solid var(--dsw-alias-border-l1, var(--arkme-line));\n padding: 32px clamp(24px, 5vw, 56px);\n}\n\n.arkme-contact-profile-main {\n grid-template-columns: 72px minmax(0, 1fr) auto;\n align-items: center;\n gap: 18px;\n width: min(100%, 760px);\n margin: 0 auto;\n display: grid;\n}\n\n.arkme-contact-profile-avatar {\n border-radius: 50%;\n place-items: center;\n width: 72px;\n height: 72px;\n display: grid;\n overflow: hidden;\n}\n\n.arkme-contact-profile-identity {\n gap: 8px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-contact-profile-name {\n text-overflow: ellipsis;\n white-space: nowrap;\n margin: 0;\n font-size: 20px;\n font-weight: 650;\n line-height: 28px;\n display: block;\n overflow: hidden;\n}\n\n.arkme-contact-profile-fields {\n gap: 4px;\n margin: 0;\n display: grid;\n}\n\n.arkme-contact-profile-fields > div {\n min-width: 0;\n color: var(--dsw-alias-label-secondary, #68707c);\n gap: 4px;\n font-size: 12px;\n line-height: 18px;\n display: flex;\n}\n\n.arkme-contact-profile-fields dt, .arkme-contact-profile-fields dd {\n text-overflow: ellipsis;\n white-space: nowrap;\n margin: 0;\n overflow: hidden;\n}\n\n.arkme-contact-profile-fields dt {\n flex: none;\n}\n\n[data-arkme-workspace] .arkme-contact-profile-message {\n background: var(--dsw-alias-button-primary-fill, #5667cc);\n cursor: pointer;\n border-radius: 10px;\n min-height: 36px;\n padding: 0 16px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary-inverted, #fff) !important;\n}\n\n.arkme-contact-profile-message:disabled {\n opacity: .55;\n cursor: default;\n}\n\n.arkme-contact-profile-error, .arkme-contact-profile-message-error {\n max-width: 760px;\n color: var(--dsw-alias-state-error-primary, #b42318);\n overflow-wrap: anywhere;\n margin: 0 auto;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-contact-profile-error {\n background: var(--dsw-alias-state-error-tertiary, #fff1f0);\n border-radius: 10px;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n padding: 12px 14px;\n display: flex;\n}\n\n.arkme-contact-profile-status {\n max-width: 760px;\n color: var(--dsw-alias-label-secondary, var(--arkme-muted));\n margin: 0 auto;\n padding: 24px 0;\n font-size: 12px;\n}\n\n.arkme-team-detail {\n background: var(--dsw-alias-bg-base, #fff);\n grid-template-rows: auto minmax(0, 1fr);\n min-width: 0;\n height: 100%;\n min-height: 0;\n display: grid;\n overflow: hidden;\n}\n\n.arkme-team-detail-header {\n border-bottom: 1px solid var(--dsw-alias-border-l1, var(--arkme-line));\n min-width: 0;\n padding: 32px clamp(24px, 5vw, 56px);\n}\n\n.arkme-team-detail-header-main {\n grid-template-columns: 72px minmax(0, 1fr) auto;\n align-items: center;\n gap: 18px;\n width: min(100%, 760px);\n min-width: 0;\n margin: 0 auto;\n display: grid;\n}\n\n.arkme-team-detail-glyph {\n background: var(--dsw-alias-state-business-tertiary, #eef0ff);\n width: 72px;\n height: 72px;\n color: var(--dsw-alias-state-business-primary, #4f5fbf);\n border-radius: 20px;\n place-items: center;\n font-size: 20px;\n font-weight: 700;\n line-height: 1;\n display: grid;\n}\n\n.arkme-team-detail-summary {\n gap: 7px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-team-detail-header h1 {\n text-overflow: ellipsis;\n white-space: nowrap;\n letter-spacing: -.02em;\n margin: 0;\n font-size: 20px;\n font-weight: 650;\n line-height: 28px;\n overflow: hidden;\n}\n\n.arkme-team-detail-meta {\n flex-wrap: wrap;\n align-items: center;\n gap: 7px;\n min-width: 0;\n display: flex;\n}\n\n.arkme-team-detail-public-id {\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 100%;\n color: var(--dsw-alias-label-secondary, #68707c);\n font-size: 12px;\n line-height: 20px;\n overflow: hidden;\n}\n\n.arkme-team-role-badge, .arkme-team-member-role {\n background: var(--dsw-alias-bg-layer-2, #f2f3f5);\n color: var(--dsw-alias-label-secondary, #68707c);\n border-radius: 999px;\n flex: none;\n font-size: 11px;\n font-weight: 600;\n line-height: 20px;\n}\n\n.arkme-team-role-badge {\n padding: 0 8px;\n}\n\n.arkme-team-detail-count {\n min-width: 58px;\n color: var(--dsw-alias-label-secondary, #68707c);\n justify-items: end;\n gap: 1px;\n display: grid;\n}\n\n.arkme-team-detail-count strong {\n color: var(--dsw-alias-label-primary, #202124);\n font-variant-numeric: tabular-nums;\n font-size: 21px;\n font-weight: 680;\n line-height: 24px;\n}\n\n.arkme-team-detail-count span {\n font-size: 11px;\n line-height: 16px;\n}\n\n.arkme-team-members {\n box-sizing: border-box;\n background: var(--dsw-alias-bg-subtle, #f7f7f8);\n min-width: 0;\n min-height: 0;\n padding: 22px clamp(24px, 5vw, 56px) 32px;\n overflow-y: auto;\n}\n\n.arkme-team-members-container {\n width: min(100%, 760px);\n min-width: 0;\n margin: 0 auto;\n}\n\n.arkme-team-members h2 {\n margin: 0 0 13px;\n font-size: 15px;\n font-weight: 650;\n line-height: 22px;\n}\n\n.arkme-team-member-list {\n border: 1px solid var(--dsw-alias-border-l1, var(--arkme-line));\n background: var(--dsw-alias-bg-layer-1, #fff);\n border-radius: 14px;\n min-width: 0;\n overflow: hidden;\n box-shadow: 0 8px 24px #161b2309;\n}\n\n.arkme-team-member-row {\n box-sizing: border-box;\n border-bottom: 1px solid var(--dsw-alias-border-l1, var(--arkme-line));\n grid-template-columns: 40px minmax(0, 1fr) auto;\n align-items: center;\n gap: 12px;\n min-width: 0;\n min-height: 64px;\n padding: 11px 14px;\n display: grid;\n}\n\n.arkme-team-member-row:not(:has( ~ .arkme-team-member-row)) {\n border-bottom: 0;\n}\n\n.arkme-team-member-avatar {\n border-radius: 50%;\n place-items: center;\n width: 40px;\n height: 40px;\n display: grid;\n overflow: hidden;\n}\n\n.arkme-team-member-copy {\n gap: 2px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-team-member-copy strong, .arkme-team-member-copy small {\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n}\n\n.arkme-team-member-copy strong {\n font-size: 14px;\n font-weight: 620;\n line-height: 20px;\n}\n\n.arkme-team-member-copy small {\n color: var(--dsw-alias-label-secondary, #68707c);\n font-size: 12px;\n line-height: 17px;\n}\n\n.arkme-team-member-role {\n padding: 0 9px;\n}\n\n.arkme-team-role-badge[data-team-role=\"owner\"], .arkme-team-role-badge[data-team-role=\"admin\"], .arkme-team-member-role[data-team-member-role=\"owner\"], .arkme-team-member-role[data-team-member-role=\"admin\"] {\n background: var(--dsw-alias-state-business-tertiary, #eef0ff);\n color: var(--dsw-alias-state-business-primary, #4f5fbf);\n}\n\n.arkme-team-detail-status {\n min-height: 100%;\n color: var(--dsw-alias-label-secondary, #68707c);\n justify-content: center;\n align-items: center;\n gap: 12px;\n display: flex;\n}\n\n.arkme-team-detail-status.is-error, .arkme-team-member-more-error {\n color: var(--dsw-alias-state-error-primary, #b42318);\n}\n\n.arkme-team-detail-status button, .arkme-team-member-more {\n border: 1px solid var(--dsw-alias-border-l2, var(--arkme-line));\n background: var(--dsw-alias-button-elevated-fill, #fff);\n cursor: pointer;\n border-radius: 9px;\n min-height: 34px;\n padding: 0 12px;\n}\n\n.arkme-team-member-more {\n width: calc(100% - 24px);\n color: var(--dsw-alias-state-business-primary, #4f5fbf) !important;\n margin: 12px !important;\n}\n\n.arkme-team-member-more:disabled {\n opacity: .55;\n cursor: default;\n}\n\n.arkme-team-member-more-error {\n padding: 12px 14px 0;\n font-size: 12px;\n}\n\n.arkme-contact-world {\n min-height: 0;\n display: grid;\n overflow: hidden;\n}\n\n.arkme-contact-detail > .arkme-contact-world {\n box-sizing: border-box;\n background: var(--dsw-alias-bg-subtle, #f7f7f8);\n padding: 22px clamp(20px, 4vw, 52px) 28px;\n}\n\n.arkme-contact-world-container {\n box-sizing: border-box;\n background: var(--dsw-alias-bg-layer-1, #fff);\n border-radius: 18px;\n flex-direction: column;\n width: min(100%, 980px);\n min-width: 0;\n height: 100%;\n min-height: 0;\n margin: 0 auto;\n display: flex;\n overflow-y: auto;\n box-shadow: 0 16px 48px #161b230f;\n}\n\n.arkme-contact-world-title {\n box-sizing: border-box;\n width: min(100%, 760px);\n margin: 0 auto;\n padding: 22px 28px 10px;\n font-size: 15px;\n font-weight: 650;\n line-height: 22px;\n}\n\n.arkme-contact-world-list {\n box-sizing: border-box;\n align-content: start;\n gap: 30px;\n width: min(100%, 760px);\n min-height: 0;\n margin: 0 auto;\n padding: 28px 28px 42px;\n display: grid;\n}\n\n.arkme-contact-world-year {\n gap: 24px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-contact-world-year > h2 {\n letter-spacing: -.04em;\n margin: 0;\n font-size: 28px;\n font-weight: 750;\n line-height: 36px;\n}\n\n.arkme-contact-world-entry {\n gap: 8px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-contact-world-diary {\n color: var(--dsw-alias-label-secondary, #68707c);\n font-size: 13px;\n font-weight: 500;\n line-height: 19px;\n}\n\n.arkme-contact-world-entry > .arkme-contact-world-time {\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n align-items: center;\n gap: 8px;\n font-size: 11px;\n line-height: 16px;\n display: flex;\n}\n\n.arkme-contact-world-entry > .arkme-contact-world-time span {\n font-size: 17px;\n line-height: 10px;\n}\n\n.arkme-contact-world-card {\n border: 1px dashed var(--dsw-alias-border-l2, #d9dce2);\n background: var(--dsw-alias-bg-layer-1, #fff);\n border-radius: 14px;\n gap: 10px;\n padding: 15px 16px;\n display: grid;\n}\n\n.arkme-contact-world-card-header {\n grid-template-columns: 36px minmax(0, 1fr) auto;\n align-items: center;\n gap: 9px;\n display: grid;\n}\n\n.arkme-contact-world-author {\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n font-size: 13px;\n font-weight: 600;\n overflow: hidden;\n}\n\n.arkme-contact-world-time {\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n flex: none;\n font-size: 11px;\n}\n\n.arkme-contact-world-headline {\n margin: 2px 0 0;\n font-size: 14px;\n line-height: 20px;\n}\n\n.arkme-contact-world-text {\n color: var(--dsw-alias-label-secondary, #68707c);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n margin: 0;\n font-size: 13px;\n line-height: 20px;\n}\n\n.arkme-contact-world-images {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 6px;\n width: 100%;\n min-width: 0;\n max-width: 620px;\n display: grid;\n}\n\n.arkme-contact-world-image {\n aspect-ratio: 1;\n object-fit: cover;\n border-radius: 11px;\n width: 100%;\n display: block;\n}\n\n.arkme-contact-world-image-error, .arkme-contact-world-image-loading {\n aspect-ratio: 1;\n background: var(--dsw-alias-bg-layer-2, var(--arkme-soft));\n width: 100%;\n min-width: 0;\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n border-radius: 11px;\n place-items: center;\n display: grid;\n}\n\n.arkme-contact-world-tags {\n flex-wrap: wrap;\n gap: 6px;\n display: flex;\n}\n\n.arkme-contact-world-tag {\n background: var(--dsw-alias-bg-layer-2, var(--arkme-soft));\n color: var(--dsw-alias-label-secondary, var(--arkme-muted));\n border-radius: 999px;\n padding: 2px 7px;\n font-size: 11px;\n}\n\n.arkme-contact-world-empty {\n box-sizing: border-box;\n text-align: center;\n flex: 1;\n place-content: center;\n justify-items: center;\n min-height: 240px;\n padding: 36px 20px;\n display: grid;\n}\n\n.arkme-contact-world-empty img {\n width: 140px;\n height: 100px;\n display: block;\n}\n\n.arkme-contact-world-empty p {\n color: var(--dsw-alias-label-secondary, #858992);\n margin: 16px 0 0;\n font-size: 13px;\n line-height: 20px;\n}\n\n.arkme-contact-world-error, .arkme-contact-world-status {\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n text-align: center;\n place-self: center;\n padding: 28px 20px;\n font-size: 12px;\n}\n\n.arkme-contact-world-error {\n color: var(--dsw-alias-state-error-primary, #b42318);\n}\n\n.arkme-contact-world-load-more {\n cursor: pointer;\n background: none;\n border-radius: 9px;\n place-self: center;\n min-height: 34px;\n padding: 0 12px;\n color: var(--dsw-alias-state-business-primary, #4f5fbf) !important;\n}\n\n.arkme-contact-world-load-more-status, .arkme-contact-world-load-more-error {\n min-height: 20px;\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n text-align: center;\n padding: 8px 16px;\n font-size: 11px;\n}\n\n.arkme-contact-world-load-more-error {\n color: var(--dsw-alias-state-error-primary, #b42318);\n}\n\n.arkme-contact-world-page-empty {\n color: var(--dsw-alias-label-tertiary, var(--arkme-muted));\n text-align: center;\n align-self: center;\n padding: 28px 20px;\n font-size: 12px;\n}\n\n.arkme-directory-unmarked-speaker-detail {\n background: var(--dsw-alias-bg-base, #fff);\n min-height: 0;\n padding: clamp(28px, 5vw, 60px);\n overflow-y: auto;\n}\n\n.arkme-unmarked-speaker-token-avatar {\n background: var(--dsw-alias-bg-module-platform, var(--dsw-alias-bg-layer-1, #f1f2f3));\n color: var(--dsw-alias-label-secondary, #666c75);\n letter-spacing: -.02em;\n border-radius: 50%;\n flex: none;\n place-items: center;\n font-weight: 650;\n line-height: 1;\n display: grid;\n}\n\n.arkme-unmarked-speaker-summary {\n box-sizing: border-box;\n background: none;\n border: 0;\n gap: 18px;\n width: min(100%, 720px);\n margin: 0 auto;\n padding: 4px 0 24px;\n display: grid;\n}\n\n.arkme-unmarked-speaker-summary h1, .arkme-unmarked-speaker-summary h2, .arkme-unmarked-speaker-audio h2, .arkme-unmarked-speaker-choice h2 {\n letter-spacing: -.02em;\n margin: 0;\n font-size: 20px;\n font-weight: 680;\n line-height: 28px;\n}\n\n.arkme-unmarked-speaker-identity {\n align-items: center;\n gap: 16px;\n min-width: 0;\n padding: 2px 4px;\n display: flex;\n}\n\n.arkme-unmarked-speaker-identity > div {\n gap: 3px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-unmarked-speaker-identity p {\n color: var(--dsw-alias-label-secondary, #737984);\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-unmarked-speaker-stats {\n min-width: 0;\n color: var(--dsw-alias-label-secondary, #737984);\n flex-wrap: wrap;\n gap: 8px 20px;\n padding: 0 4px;\n font-size: 12px;\n line-height: 19px;\n display: flex;\n}\n\n.arkme-unmarked-speaker-stats span {\n white-space: nowrap;\n position: relative;\n}\n\n.arkme-unmarked-speaker-stats span + span:before {\n content: \"\";\n background: var(--dsw-alias-label-caption, #b3b7bd);\n border-radius: 50%;\n width: 3px;\n height: 3px;\n position: absolute;\n top: 8px;\n left: -11px;\n}\n\n.arkme-unmarked-speaker-stats strong {\n color: var(--dsw-alias-label-primary, #202124);\n font-weight: 650;\n}\n\n.arkme-unmarked-speaker-inference {\n background: var(--dsw-alias-bg-layer-2, #f5f5f6);\n border-radius: 18px;\n grid-template-columns: 40px minmax(0, 1fr);\n align-items: start;\n gap: 12px;\n min-width: 0;\n padding: 18px;\n display: grid;\n}\n\n.arkme-unmarked-speaker-inference-icon, .arkme-unmarked-speaker-action-icon {\n border: 1px solid var(--dsw-alias-border-l1, #e3e4e7);\n background: var(--dsw-alias-bg-layer-1, #fff);\n width: 40px;\n height: 40px;\n color: var(--dsw-alias-label-secondary, #656b75);\n border-radius: 50%;\n place-items: center;\n display: grid;\n}\n\n.arkme-unmarked-speaker-inference-icon svg path, .arkme-unmarked-speaker-action-icon svg path {\n stroke: currentColor;\n stroke-width: 1.5px;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n\n.arkme-unmarked-speaker-inference > div {\n gap: 5px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-unmarked-speaker-inference-label {\n color: var(--dsw-alias-label-secondary, #747983);\n font-size: 11px;\n line-height: 16px;\n}\n\n.arkme-unmarked-speaker-inference strong {\n color: var(--dsw-alias-label-primary, #202124);\n font-size: 14px;\n font-weight: 650;\n line-height: 21px;\n}\n\n.arkme-unmarked-speaker-inference p {\n color: var(--dsw-alias-label-secondary, #686e78);\n margin: 0;\n font-size: 12px;\n line-height: 20px;\n}\n\n.arkme-unmarked-speaker-actions {\n gap: 10px;\n display: grid;\n}\n\n[data-arkme-workspace] .arkme-unmarked-speaker-action {\n border: 1px solid var(--dsw-alias-border-l1, #e5e6e8);\n background: var(--dsw-alias-bg-layer-1, #fff);\n width: 100%;\n min-height: 62px;\n color: var(--dsw-alias-label-primary, #202124);\n text-align: left;\n cursor: pointer;\n border-radius: 16px;\n grid-template-columns: 42px minmax(0, 1fr);\n align-items: center;\n gap: 12px;\n padding: 10px 46px 10px 14px;\n font-size: 13px;\n font-weight: 650;\n display: grid;\n position: relative;\n}\n\n.arkme-unmarked-speaker-action:after {\n content: \"›\";\n color: var(--dsw-alias-label-caption, #a7abb2);\n font-size: 22px;\n font-weight: 400;\n position: absolute;\n right: 18px;\n}\n\n.arkme-unmarked-speaker-action:hover {\n background: var(--dsw-alias-interactive-bg-hover, #f7f7f8);\n border-color: var(--dsw-alias-border-l2, #d9dade);\n}\n\n.arkme-unmarked-speaker-summary > [role=\"status\"], .arkme-unmarked-speaker-summary > [role=\"alert\"], .arkme-unmarked-speaker-audio > [role=\"status\"], .arkme-unmarked-speaker-audio > [role=\"alert\"], .arkme-unmarked-speaker-choice > [role=\"status\"], .arkme-unmarked-speaker-choice > [role=\"alert\"] {\n color: var(--dsw-alias-label-secondary, #68707c);\n background: var(--dsw-alias-bg-layer-2, #f5f5f6);\n border-radius: 10px;\n padding: 9px 12px;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-unmarked-speaker-summary > [role=\"alert\"], .arkme-unmarked-speaker-audio > [role=\"alert\"], .arkme-unmarked-speaker-choice > [role=\"alert\"] {\n color: var(--dsw-alias-state-error-primary, #b42318);\n background: var(--dsw-alias-state-error-tertiary, #fff1f0);\n}\n\n.arkme-unmarked-speaker-audio, .arkme-unmarked-speaker-choice {\n box-sizing: border-box;\n background: none;\n border: 0;\n gap: 16px;\n width: min(100%, 720px);\n margin: 0 auto;\n padding: 4px 0 28px;\n display: grid;\n}\n\n.arkme-unmarked-speaker-subview-header {\n grid-template-columns: auto 40px minmax(0, 1fr);\n align-items: center;\n gap: 12px;\n min-width: 0;\n padding-bottom: 4px;\n display: grid;\n}\n\n.arkme-unmarked-speaker-subview-header > button {\n min-height: 32px;\n color: var(--dsw-alias-label-secondary, #68707c);\n cursor: pointer;\n background: none;\n border-radius: 9px;\n padding: 0 10px;\n font-size: 11px;\n}\n\n.arkme-unmarked-speaker-subview-header > button:before {\n content: \"‹\";\n vertical-align: -1px;\n margin-right: 4px;\n font-size: 17px;\n}\n\n.arkme-unmarked-speaker-subview-heading {\n gap: 2px;\n min-width: 0;\n display: grid;\n}\n\n.arkme-unmarked-speaker-subview-heading p {\n color: var(--dsw-alias-label-secondary, #737984);\n margin: 0;\n font-size: 11px;\n line-height: 17px;\n}\n\n.arkme-unmarked-speaker-segment-list {\n gap: 10px;\n display: grid;\n}\n\n.arkme-unmarked-speaker-segment-card {\n border: 1px solid var(--dsw-alias-border-l1, #e5e6e8);\n background: var(--dsw-alias-bg-layer-1, #fff);\n border-radius: 16px;\n grid-template-columns: minmax(0, 1fr) auto;\n gap: 8px 16px;\n min-width: 0;\n padding: 16px 16px 14px;\n display: grid;\n}\n\n.arkme-unmarked-speaker-segment-meta {\n min-width: 0;\n color: var(--dsw-alias-label-secondary, #757b85);\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 11px;\n line-height: 17px;\n overflow: hidden;\n}\n\n.arkme-unmarked-speaker-segment-transcript {\n min-width: 0;\n color: var(--dsw-alias-label-primary, #292c34);\n white-space: pre-wrap;\n grid-column: 1;\n margin: 0;\n font-size: 13px;\n line-height: 20px;\n}\n\n[data-arkme-workspace] .arkme-unmarked-speaker-segment-play {\n background: var(--dsw-alias-bg-layer-2, #f4f4f5);\n width: 38px;\n min-width: 38px;\n height: 38px;\n min-height: 38px;\n color: var(--dsw-alias-label-primary, #292c34);\n cursor: pointer;\n border-radius: 50%;\n grid-area: 1 / 2 / span 2;\n align-self: center;\n place-items: center;\n padding: 0;\n display: inline-grid;\n}\n\n[data-arkme-workspace] .arkme-unmarked-speaker-segment-play:not(:disabled):hover {\n background: var(--dsw-alias-bg-layer-3, #e9eaec);\n}\n\n.arkme-unmarked-speaker-segment-play:disabled {\n opacity: .5;\n cursor: default;\n}\n\n.arkme-unmarked-speaker-choice-meta {\n color: var(--dsw-alias-label-secondary, #737984);\n margin: -4px 0 0;\n padding: 0 4px;\n font-size: 12px;\n line-height: 18px;\n}\n\n.arkme-unmarked-speaker-choice-options {\n border: 0;\n gap: 8px;\n min-width: 0;\n margin: 0;\n padding: 0;\n display: grid;\n}\n\n.arkme-unmarked-speaker-choice-options legend {\n color: var(--dsw-alias-label-secondary, #737984);\n margin-bottom: 9px;\n font-size: 11px;\n line-height: 17px;\n}\n\n.arkme-unmarked-speaker-choice-option {\n border: 1px solid var(--dsw-alias-border-l1, #e5e6e8);\n background: var(--dsw-alias-bg-layer-1, #fff);\n cursor: pointer;\n border-radius: 14px;\n grid-template-columns: 18px minmax(0, 1fr) auto;\n align-items: center;\n gap: 10px;\n min-width: 0;\n min-height: 52px;\n padding: 10px 14px;\n font-size: 13px;\n display: grid;\n}\n\n.arkme-unmarked-speaker-choice-option:has(input:checked) {\n border-color: var(--dsw-alias-state-business-primary, #6677d9);\n background: var(--dsw-alias-interactive-bg-active, #f0f2ff);\n}\n\n.arkme-unmarked-speaker-choice-option input {\n width: 16px;\n height: 16px;\n accent-color: var(--dsw-alias-state-business-primary, #6677d9);\n margin: 0;\n}\n\n.arkme-unmarked-speaker-recommended {\n background: var(--dsw-alias-state-business-tertiary, #eef0ff);\n color: var(--dsw-alias-state-business-primary, #5667cc);\n border-radius: 999px;\n padding: 2px 7px;\n font-size: 10px;\n line-height: 16px;\n}\n\n.arkme-unmarked-speaker-choice-new-name {\n border: 1px solid var(--dsw-alias-border-l1, #dfe1e5);\n background: var(--dsw-specific-input-major, #fff);\n width: 100%;\n min-height: 42px;\n color: var(--dsw-alias-label-primary, #202124);\n border-radius: 12px;\n outline: 0;\n padding: 0 13px;\n font-size: 12px;\n}\n\n.arkme-unmarked-speaker-choice-new-name:focus {\n border-color: var(--dsw-alias-state-business-primary, #6677d9);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--dsw-alias-state-business-primary, #6677d9) 14%, transparent);\n}\n\n[data-arkme-workspace] .arkme-unmarked-speaker-confirm {\n background: var(--dsw-alias-button-primary-fill, #202124);\n min-height: 42px;\n color: var(--dsw-alias-label-primary-inverted, #fff);\n cursor: pointer;\n border-radius: 12px;\n padding: 0 16px;\n font-size: 12px;\n font-weight: 650;\n}\n\n.arkme-unmarked-speaker-confirm:disabled {\n opacity: .45;\n cursor: default;\n}\n\n.arkme-unmarked-speaker-summary button:not(.arkme-unmarked-speaker-action), .arkme-unmarked-speaker-audio button:not(.arkme-unmarked-speaker-segment-play), .arkme-unmarked-speaker-choice button:not(.arkme-unmarked-speaker-confirm), .arkme-contact-world-error button, .arkme-contact-profile-error button {\n border: 1px solid var(--dsw-alias-border-l2, var(--arkme-line));\n background: var(--dsw-alias-button-elevated-fill, #fff);\n min-height: 34px;\n color: var(--dsw-alias-label-primary, #202124);\n cursor: pointer;\n border-radius: 9px;\n padding: 0 12px;\n}\n\n.arkme-unmarked-speaker-gone, .arkme-unmarked-speaker-success {\n box-sizing: border-box;\n background: var(--dsw-alias-state-warning-tertiary, #fff7ed);\n width: min(100%, 680px);\n color: var(--dsw-alias-state-warning-primary, #9a3412);\n border-radius: 10px;\n margin: 0 auto;\n padding: 12px 14px;\n}\n\n.arkme-unmarked-speaker-success {\n background: var(--dsw-alias-state-success-tertiary, #ecfdf3);\n color: var(--dsw-alias-state-success-primary, #067647);\n}\n\n.arkme-contact-directory button:focus-visible, .arkme-directory-detail-pane button:focus-visible, [data-arkme-owned=\"product-navigation\"] button:focus-visible {\n outline: 2px solid var(--arkme-focus);\n outline-offset: 2px;\n}\n\nbody[data-ds-dark-theme] .arkme-contact-directory, body[data-ds-dark-theme] .arkme-directory-detail-pane {\n background: var(--dsw-alias-bg-base);\n color: var(--dsw-alias-label-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-contact-directory-row.is-selected, body[data-ds-dark-theme] .arkme-contact-world-card, body[data-ds-dark-theme] .arkme-unmarked-speaker-choice {\n background: var(--dsw-alias-interactive-bg-active);\n}\n\nbody[data-ds-dark-theme] .arkme-unmarked-speaker-inference, body[data-ds-dark-theme] .arkme-unmarked-speaker-segment-card, body[data-ds-dark-theme] .arkme-unmarked-speaker-choice-option, body[data-ds-dark-theme] .arkme-unmarked-speaker-action {\n background: var(--dsw-alias-bg-layer-1);\n border-color: var(--dsw-alias-border-l1);\n}\n\nbody[data-ds-dark-theme] .arkme-unmarked-speaker-inference-icon, body[data-ds-dark-theme] .arkme-unmarked-speaker-action-icon, body[data-ds-dark-theme] .arkme-unmarked-speaker-segment-play {\n background: var(--dsw-specific-input-major);\n color: var(--dsw-alias-label-secondary);\n}\n\nbody[data-ds-dark-theme] .arkme-unmarked-speaker-choice-option:has(input:checked) {\n background: var(--dsw-alias-interactive-bg-active);\n border-color: var(--dsw-alias-state-business-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-contact-detail > .arkme-contact-world {\n background: var(--dsw-alias-bg-subtle);\n}\n\nbody[data-ds-dark-theme] .arkme-contact-world-container {\n background: var(--dsw-alias-bg-layer-1);\n box-shadow: none;\n}\n\nbody[data-ds-dark-theme] .arkme-team-detail {\n background: var(--dsw-alias-bg-base);\n}\n\nbody[data-ds-dark-theme] .arkme-team-members {\n background: var(--dsw-alias-bg-subtle);\n}\n\nbody[data-ds-dark-theme] .arkme-team-member-list {\n background: var(--dsw-alias-bg-layer-1);\n box-shadow: none;\n}\n\nbody[data-ds-dark-theme] .arkme-contact-directory-warning, body[data-ds-dark-theme] .arkme-unmarked-speaker-gone, body[data-ds-dark-theme] .arkme-contact-world-image-error, body[data-ds-dark-theme] .arkme-contact-world-image-loading {\n background: var(--dsw-specific-input-major);\n color: var(--dsw-alias-label-secondary);\n}\n\nbody[data-ds-dark-theme] .arkme-unmarked-speaker-success {\n background: var(--dsw-alias-state-success-tertiary);\n color: var(--dsw-alias-state-success-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-contact-profile-error, body[data-ds-dark-theme] .arkme-contact-profile-message-error, body[data-ds-dark-theme] .arkme-contact-world-error, body[data-ds-dark-theme] .arkme-contact-world-load-more-error {\n color: var(--dsw-alias-state-error-primary);\n}\n\nbody[data-ds-dark-theme] .arkme-contact-profile-message {\n background: var(--dsw-alias-button-primary-fill);\n}\n\nbody[data-ds-dark-theme] .arkme-contact-directory-more, body[data-ds-dark-theme] .arkme-contact-world-load-more {\n color: var(--dsw-alias-state-business-primary);\n}\n\n@media (width <= 1024px) {\n [data-arkme-owned=\"persistent-sidebar\"] [data-arkme-directory-mode=\"contacts\"] {\n min-width: 0;\n }\n}\n\n@media (width <= 820px) {\n div:has( > [data-shell-overlay]):has([data-arkme-directory-mode=\"contacts\"]):has([data-arkme-contacts-mobile-view=\"directory\"]) {\n grid-template-columns: minmax(0, 1fr) 0 0 !important;\n }\n\n div:has( > [data-shell-overlay]):has([data-arkme-directory-mode=\"contacts\"]):has([data-arkme-contacts-mobile-view=\"content\"]) {\n grid-template-columns: 0 minmax(0, 1fr) 0 !important;\n }\n\n [data-arkme-owned=\"persistent-sidebar\"][data-arkme-contacts-mobile-view=\"content\"], [data-arkme-owned=\"persistent-workspace\"][data-arkme-contacts-mobile-view=\"directory\"] {\n display: none !important;\n }\n\n [data-arkme-owned=\"persistent-sidebar\"] [data-arkme-directory-mode=\"contacts\"], .arkme-directory-detail-pane {\n min-width: 0;\n }\n}\n\n.arkme-directory-mobile-back {\n display: none;\n}\n\n@media (width <= 820px) {\n .arkme-directory-mobile-back {\n min-height: 42px;\n color: var(--dsw-alias-label-secondary, #68707c);\n cursor: pointer;\n background: none;\n align-items: center;\n gap: 5px;\n padding: 0 14px;\n display: inline-flex;\n }\n\n .arkme-directory-mobile-back:before {\n content: \"‹\";\n font-size: 18px;\n line-height: 1;\n }\n\n .arkme-directory-mobile-back:hover {\n color: var(--dsw-alias-label-primary, #202124);\n }\n\n .arkme-contact-profile {\n padding: 26px 20px;\n }\n\n .arkme-contact-profile-main {\n grid-template-columns: 56px minmax(0, 1fr) auto;\n gap: 12px;\n }\n\n .arkme-contact-profile-avatar {\n width: 56px;\n height: 56px;\n }\n\n .arkme-contact-profile-avatar > span {\n width: 56px !important;\n height: 56px !important;\n }\n\n .arkme-team-detail-header {\n padding: 26px 20px;\n }\n\n .arkme-team-detail-header-main {\n grid-template-columns: 56px minmax(0, 1fr);\n gap: 12px;\n }\n\n .arkme-team-detail-glyph {\n border-radius: 16px;\n width: 56px;\n height: 56px;\n font-size: 18px;\n }\n\n .arkme-team-detail-count {\n justify-items: initial;\n grid-column: 2;\n align-items: baseline;\n gap: 4px;\n min-width: 0;\n display: flex;\n }\n\n .arkme-team-detail-count strong {\n font-size: 14px;\n line-height: 18px;\n }\n\n .arkme-team-detail-count span {\n font-size: 11px;\n }\n\n .arkme-team-members {\n padding: 18px 20px 28px;\n }\n\n .arkme-team-member-list {\n border-radius: 12px;\n }\n\n .arkme-team-member-row {\n padding-left: 12px;\n padding-right: 12px;\n }\n\n .arkme-contact-world-title {\n padding-left: 20px;\n padding-right: 20px;\n }\n\n .arkme-directory-unmarked-speaker-detail {\n padding: 20px 18px 30px;\n }\n\n .arkme-unmarked-speaker-summary, .arkme-unmarked-speaker-audio, .arkme-unmarked-speaker-choice {\n gap: 14px;\n }\n\n .arkme-unmarked-speaker-stats {\n gap: 7px 14px;\n }\n\n .arkme-unmarked-speaker-stats span + span:before {\n display: none;\n }\n\n .arkme-unmarked-speaker-inference {\n grid-template-columns: 36px minmax(0, 1fr);\n padding: 15px;\n }\n\n .arkme-unmarked-speaker-inference-icon, .arkme-unmarked-speaker-action-icon {\n width: 36px;\n height: 36px;\n }\n\n .arkme-unmarked-speaker-subview-header {\n grid-template-columns: auto 36px minmax(0, 1fr);\n gap: 9px;\n }\n\n .arkme-unmarked-speaker-segment-card {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .arkme-unmarked-speaker-segment-transcript, [data-arkme-workspace] .arkme-unmarked-speaker-segment-play {\n grid-area: auto / 1;\n }\n\n [data-arkme-workspace] .arkme-unmarked-speaker-segment-play {\n justify-self: start;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .arkme-contact-directory-caret {\n transition: none;\n }\n\n .arkme-icon-spin {\n animation: none;\n }\n}\n\n.arkme-conversation-surface {\n --arkme-chat-self-bubble: #eef1f8;\n --arkme-chat-other-bubble: #f3f4f6;\n}\n\nbody[data-ds-dark-theme] .arkme-conversation-surface {\n --arkme-chat-self-bubble: #2c3142;\n --arkme-chat-other-bubble: #282a31;\n --arkme-audio-control: #8995c5;\n}\n\nbody[data-ds-dark-theme] .arkme-detail-extension-input-bar {\n border-top-color: #363636 !important;\n}\n\nbody[data-ds-dark-theme] .arkme-detail-extension-input-shell {\n background: #2b2b2b !important;\n}\n\n[data-arkme-message-direction]:focus-visible, [data-arkme-note-detail] button:focus-visible {\n outline: 2px solid var(--dsw-alias-state-business-primary, #8295e8);\n outline-offset: 2px;\n}\n";
193277
194434
  //#endregion
193278
194435
  //#region src/client/redesign/styles.ts
193279
194436
  const REDESIGN_STYLE_ID = "@senguoyun/dsh-arkme/redesign";