@yfwu2020/dsh-selection-explain 0.10.3 → 0.10.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/README.md +13 -11
  2. package/cordis.patch.yml +1 -1
  3. package/lib/client.js +10694 -12424
  4. package/lib/client.js.map +7 -0
  5. package/lib/config-values.js +55 -0
  6. package/lib/config-values.js.map +1 -0
  7. package/lib/host/analyze.js +795 -0
  8. package/lib/host/analyze.js.map +1 -0
  9. package/lib/host/config.js +81 -0
  10. package/lib/host/config.js.map +1 -0
  11. package/lib/host/constants.js +25 -0
  12. package/lib/host/constants.js.map +1 -0
  13. package/lib/host/context.js +237 -0
  14. package/lib/host/context.js.map +1 -0
  15. package/lib/host/design-skill.js +42 -0
  16. package/lib/host/design-skill.js.map +1 -0
  17. package/lib/host/effort.js +239 -0
  18. package/lib/host/effort.js.map +1 -0
  19. package/lib/host/filters.js +132 -0
  20. package/lib/host/filters.js.map +1 -0
  21. package/lib/host/history-store.js +404 -0
  22. package/lib/host/history-store.js.map +1 -0
  23. package/lib/host/http.js +46 -0
  24. package/lib/host/http.js.map +1 -0
  25. package/lib/host/messages.js +14 -0
  26. package/lib/host/messages.js.map +1 -0
  27. package/lib/host/mic.js +246 -0
  28. package/lib/host/mic.js.map +1 -0
  29. package/lib/host/models.js +246 -0
  30. package/lib/host/models.js.map +1 -0
  31. package/lib/host/plugin.js +41 -0
  32. package/lib/host/plugin.js.map +1 -0
  33. package/lib/host/promote.js +219 -0
  34. package/lib/host/promote.js.map +1 -0
  35. package/lib/host/routes.js +237 -0
  36. package/lib/host/routes.js.map +1 -0
  37. package/lib/host/sessions.js +181 -0
  38. package/lib/host/sessions.js.map +1 -0
  39. package/lib/host/settings-store.js +140 -0
  40. package/lib/host/settings-store.js.map +1 -0
  41. package/lib/host/speech.js +320 -0
  42. package/lib/host/speech.js.map +1 -0
  43. package/lib/host/tools.js +179 -0
  44. package/lib/host/tools.js.map +1 -0
  45. package/lib/host/types.js +2 -0
  46. package/lib/host/types.js.map +1 -0
  47. package/lib/index.js +10 -3691
  48. package/lib/index.js.map +1 -1
  49. package/lib/prompts.js +1 -1
  50. package/lib/settings.js +17 -27
  51. package/lib/settings.js.map +1 -1
  52. package/lib/types/config-values.d.ts +175 -0
  53. package/lib/types/host/analyze.d.ts +10 -0
  54. package/lib/types/host/config.d.ts +147 -0
  55. package/lib/types/host/constants.d.ts +24 -0
  56. package/lib/types/host/context.d.ts +41 -0
  57. package/lib/types/host/design-skill.d.ts +1 -0
  58. package/lib/types/host/effort.d.ts +61 -0
  59. package/lib/types/host/filters.d.ts +20 -0
  60. package/lib/types/host/history-store.d.ts +13 -0
  61. package/lib/types/host/http.d.ts +8 -0
  62. package/lib/types/host/messages.d.ts +13 -0
  63. package/lib/types/host/mic.d.ts +17 -0
  64. package/lib/types/host/models.d.ts +57 -0
  65. package/lib/types/host/plugin.d.ts +3 -0
  66. package/lib/types/host/promote.d.ts +9 -0
  67. package/lib/types/host/routes.d.ts +14 -0
  68. package/lib/types/host/sessions.d.ts +14 -0
  69. package/lib/types/host/settings-store.d.ts +8 -0
  70. package/lib/types/host/speech.d.ts +23 -0
  71. package/lib/types/host/tools.d.ts +39 -0
  72. package/lib/types/host/types.d.ts +89 -0
  73. package/lib/types/index.d.ts +12 -441
  74. package/lib/types/prompts.d.ts +1 -1
  75. package/lib/types/settings.d.ts +1 -1
  76. package/package.json +31 -21
  77. package/assets/code.png +0 -0
  78. package/assets/detail.png +0 -0
  79. package/assets/quotes.png +0 -0
  80. package/assets/stage1.png +0 -0
  81. package/assets/stage2.png +0 -0
  82. package/assets/translation.png +0 -0
  83. package/assets/voice-card-light.png +0 -0
  84. package/assets/voice-inserted.png +0 -0
  85. package/assets/voice-settings.png +0 -0
  86. package/assets/voice.png +0 -0
  87. package/assets/web.png +0 -0
  88. package/scripts/build-demo-pages.mjs +0 -350
  89. package/scripts/build-vcard-lab.mjs +0 -834
  90. package/scripts/build.sh +0 -147
  91. package/scripts/crop-png.mjs +0 -142
  92. package/scripts/dump-prompt.mjs +0 -143
  93. package/scripts/fixtures/fake-mic-probe.sh +0 -9
  94. package/scripts/gen-star-path.mjs +0 -71
  95. package/scripts/measure-cost.mjs +0 -251
  96. package/scripts/smoke-bridge.mjs +0 -365
  97. package/scripts/smoke-panel.mjs +0 -1903
  98. package/scripts/smoke-voice.mjs +0 -774
  99. package/scripts/test-bridge.mjs +0 -412
  100. package/scripts/test-client.mjs +0 -6175
  101. package/scripts/test-effort-map.mjs +0 -129
  102. package/scripts/test-effort-retry.mjs +0 -109
  103. package/scripts/test-escape-focus.mjs +0 -101
  104. package/scripts/test-filters.mjs +0 -146
  105. package/scripts/test-format.mjs +0 -93
  106. package/scripts/test-guard.mjs +0 -48
  107. package/scripts/test-mic-idle.mjs +0 -158
  108. package/scripts/test-model-follow.mjs +0 -193
  109. package/scripts/test-prompt.mjs +0 -193
  110. package/scripts/test-route-cache.mjs +0 -138
  111. package/scripts/test-settings-behavior.mjs +0 -188
  112. package/scripts/test-settings-host.mjs +0 -48
  113. package/scripts/test-settings.mjs +0 -329
  114. package/scripts/test-speech.mjs +0 -220
  115. package/scripts/test-transcript.mjs +0 -151
  116. package/src/client/index.js +0 -12580
  117. package/src/index.ts +0 -4179
  118. package/src/prompts.ts +0 -144
  119. package/src/settings.ts +0 -313
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/client/index.js", "../src/client/keyboard.js", "../src/client/dom.js", "../src/client/constants.js", "../src/client/styles.js", "../src/client/icons.js", "../src/client/context.js", "../src/client/render.js", "../src/client/audio.js", "../src/client/settings.js", "../src/client/selection.js", "../src/client/voice-card.js", "../src/client/quotes.js", "../src/client/bridge.js", "../src/client/preview.js", "../src/client/panel.js", "../src/client/pill.js", "../src/client/history.js", "../src/client/conversation.js", "../src/client/models.js", "../src/client/voice.js"],
4
+ "sourcesContent": ["import { handlePanelEscape, handleVoiceCardEscape } from './keyboard.js'\nimport { el, listen, selectionDetached, clamp } from './dom.js'\nimport { CSS } from './styles.js'\nimport { Z_BTN, Z_PANEL, PILL_STAR_DOT_D, preferences, PING, PILL_MORPH_MS, PILL_STAR_D, VOICE_FALLBACK_SECONDS, PILL_BALL_SIZE, PILL_SNAP_RADIUS } from './constants.js'\nimport { sparkleIcon, quoteIcon, actionButton, headerHistoryIcon, headerPromoteIcon, headerSettingsIcon, iconButton, headerCloseIcon, buildSection, markdownIcon, windowIcon, sendIcon, micIcon, closeIcon, stopIcon, backIcon } from './icons.js'\nimport React from 'react'\nimport { previewFrames, applyPreviewHeight, splitSections } from './render.js'\nimport { recordingSupported } from './audio.js'\n\nimport { createSettingsController } from './settings.js'\nimport { createSelectionController } from './selection.js'\nimport { createVoiceCardController } from './voice-card.js'\nimport { createQuotesController } from './quotes.js'\nimport { createPreviewController } from './preview.js'\nimport { createPanelController } from './panel.js'\nimport { createPillController } from './pill.js'\nimport { createHistoryController } from './history.js'\nimport { createConversationController } from './conversation.js'\nimport { createModelsController } from './models.js'\nimport { createVoiceController } from './voice.js'\n\nexport function apply(ctx) {\n\n /** \u5F53\u524D\u9762\u677F\u72B6\u6001\u3002 */\n var state = {\n /** \u6700\u8FD1\u4E00\u6B21\u6709\u6548\u9009\u533A\uFF1A{ text, range, rect }\u3002 */\n selection: null,\n /** \u5F53\u524D\u8BF7\u6C42\uFF1A{ abort }\u3002 */\n request: null,\n /** \u539F\u59CB\u6D41\u5F0F\u6587\u672C\u3002 */\n raw: '',\n /** 'idle' | 'loading' | 'streaming' | 'done' | 'error'\u3002 */\n phase: 'idle',\n /**\n * \u5F53\u524D\u9009\u533A\u662F\u4E0D\u662F\u6765\u81EA**\u4FA7\u8FB9\u680F\u7F51\u9875\u91CC\u7684\u6865**\uFF08iframe \u5E27\u5185\u4E0A\u62A5\uFF09\u3002\n * \u4E3A true \u65F6\u9876\u5C42\u9009\u533A\u584C\u6389\u4E0D\u7B97\"\u9009\u533A\u6CA1\u4E86\"\u2014\u2014\u90A3\u79CD\u584C\u9677\u662F\u6211\u4EEC\u70B9\u6D6E\u6807\u9020\u6210\u7684\u3002\n */\n bridgeActive: false,\n /** \u8BA1\u65F6\u4E0E\u7EDF\u8BA1\u3002 */\n startedAt: 0,\n elapsed: 0,\n chars: 0,\n error: '',\n model: '',\n /** host \u56DE\u4F20\u7684\u63A8\u7406\u6863\u4F4D\uFF08\u7B49\u5F85\u8D85\u8FC7 6 \u79D2\u65F6\u5199\u8FDB\u7B49\u5F85\u63D0\u793A\uFF09\u3002 */\n /** \u6A21\u578B\u601D\u8003\u8FC7\u7A0B\u7684\u6700\u65B0\u5C3E\u5DF4\uFF08\u53EA\u7528\u4E8E\u7B49\u5F85\u63D0\u793A\uFF0C\u4E0D\u8FDB\u6B63\u6587\uFF09\u3002 */\n thought: '',\n /** \u7B2C\u4E00\u8282\u6807\u9898\uFF1A'\u7FFB\u8BD1' | '\u89E3\u8BFB' | '\u6CE8\u91CA'\u3002 */\n sectionTitle: '\u7FFB\u8BD1',\n /** 'code' | 'text'\uFF1A\u9009\u4E2D\u6587\u5B57\u662F\u4EE3\u7801\u8FD8\u662F\u6587\u672C\u3002 */\n kind: 'text',\n /** \u672C\u8F6E\u7528\u8FC7\u7684\u5DE5\u5177\uFF08\u53EA\u505A\u5185\u90E8\u6458\u8981\uFF0C**\u4E0D\u6E32\u67D3**\uFF09\u3002 */\n tools: [],\n /** \u5DE5\u5177\u7ED3\u679C\u6458\u8981\uFF1A\u8FFD\u95EE\u65F6\u5E26\u7ED9\u6A21\u578B\uFF0C\u907F\u514D\u91CD\u590D\u8054\u7F51\u3002 */\n toolDigest: '',\n /** \u6709\u5DE5\u5177\u6B63\u5728\u8DD1\uFF08\u7B49\u5F85\u63D0\u793A\u8BF4\"\u6B63\u5728\u68C0\u7D22\u8D44\u6599\"\uFF0C\u4E0D\u663E\u793A\u662F\u54EA\u4E2A\u5DE5\u5177\u3001\u67E5\u4E86\u4EC0\u4E48\uFF09\u3002 */\n toolBusy: false,\n /** \u6A21\u578B\u8F93\u51FA\u4E86\u4F2A\u9020\u7684\u5DE5\u5177\u8C03\u7528\u683C\u5F0F\uFF08\u5DF2\u88AB\u5265\u6389\uFF09\u3002 */\n /** \u8FD9\u6B21\u5185\u5BB9\u662F\"\u4ECE\u5386\u53F2\u56DE\u653E\"\u51FA\u6765\u7684\uFF08\u4E0D\u662F\u672C\u6B21\u8BF7\u6C42\uFF09\u3002 */\n fromHistory: false,\n /** \u5F53\u524D\u9009\u533A\u7684\u672C\u5730\u7F13\u5B58 key\u3002 */\n cacheKey: '',\n /** 'local' | 'shared' | 'miss'\uFF1A\u547D\u4E2D\u60C5\u51B5\uFF08\u72B6\u6001\u680F\u4E0E\u81EA\u68C0\u94A9\u5B50\u90FD\u4F1A\u62A5\uFF09\u3002 */\n cacheState: 'miss',\n /** \u6CA1\u547D\u4E2D\u3001\u4F46\u7F13\u5B58\u91CC\u6709\u8FC7\"\u540C\u4E00\u4E2A\u8BCD\"\uFF08\u4E0A\u4E0B\u6587\u4E0D\u540C\uFF09\u2014\u2014\u72B6\u6001\u680F\u636E\u6B64\u89E3\u91CA\u3002 */\n sameTextHint: false,\n /** \u6700\u8FD1\u4E00\u6B21\u8BF7\u6C42\u8F7D\u8377\uFF08\u91CD\u65B0\u751F\u6210\u590D\u7528\uFF09\u3002 */\n payload: null,\n /** \u5DF2\u751F\u6210\u7684\u4E24\u8282\u5185\u5BB9\uFF08\u5206\u9636\u6BB5\u4EA7\u51FA\uFF09\u3002 */\n parts: { translation: '', detail: '' },\n /** \u5F53\u524D\u9636\u6BB5\uFF1A'translation' | 'detail' | 'chat'\u3002 */\n stage: '',\n /** \u8FFD\u95EE\u8F6E\u6B21\uFF1A[{ role: 'user' | 'assistant', text }]\uFF0C\u53EA\u6D3B\u5728\u9762\u677F/\u5185\u5B58\u91CC\uFF08\u4E34\u65F6\uFF09\u3002 */\n turns: [],\n /**\n * \u5F85\u53D1\u9001\u7684\u5F15\u7528\uFF1A[{ label: '\u5C0F\u7A97\u56DE\u7B54' | '\u4E3B\u754C\u9762\u9009\u4E2D' \u2026, text }]\u3002\n * \u53EA\u5C5E\u4E8E**\u4E0B\u4E00\u6761**\u63D0\u95EE\uFF08\u53D1\u9001\u5373\u6E05\u7A7A\uFF09\uFF1B\u5173\u6389\u9762\u677F\u4E0D\u6E05 \u2014\u2014 \u56DE\u6765\u63A5\u7740\u5199\u8FD8\u770B\u5F97\u89C1\u3002\n */\n quotes: [],\n /** \u6700\u8FD1\u4E00\u6B21\"\u53EF\u4EE5\u5F15\u7528\"\u7684\u9009\u533A\uFF1A[{ text, label, rect, source }]\uFF08\u6D6E\u6807\u636E\u6B64\u663E\u793A\uFF09\u3002 */\n quoteSelection: null,\n /** \u6B63\u5728\u53D6\u5F15\u7528\u7684\u4F1A\u8BDD\u4E0A\u4E0B\u6587\uFF08\u8FD9\u671F\u95F4\u518D\u6309 Enter \u4E0D\u80FD\u7A7A\u53D1\u4E00\u6761\uFF09\u3002 */\n resolvingQuotes: false,\n /** \u6700\u8FD1\u4E00\u6761\u72B6\u6001\u6587\u672C\uFF08\u754C\u9762\u4E0A\u4E0D\u663E\u793A\uFF0C\u53EA\u7ED9\u81EA\u68C0\u7528\uFF09\u3002 */\n lastStatus: '',\n /** \u662F\u4E0D\u662F\"\u8DDF\u7740\u6700\u65B0\u6D88\u606F\u8D70\"\uFF08\u53D1\u5B8C\u6D88\u606F\u81EA\u52A8\u7F6E\u771F\uFF1B\u7528\u6237\u81EA\u5DF1\u5F80\u4E0A\u6EDA\u5C31\u4EA4\u56DE\u7ED9\u4ED6\uFF09\u3002 */\n follow: false,\n /** \u8FFD\u95EE\u7684\u8FDB\u884C\u4E2D\u8BF7\u6C42\uFF08\u7528\u4E8E\"\u505C\u6B62\"\uFF09\u3002 */\n askRequest: null,\n /** \u8FD9\u4E00\u8F6E\u662F\u4E0D\u662F\u88AB\u7528\u6237\u6309\"\u505C\u6B62\"\u6253\u65AD\u7684\u3002 */\n stopped: false,\n /** \u5C0F\u7A97\u7684\u6A21\u578B\u9009\u62E9\uFF08null = \u8DDF\u968F\u4F1A\u8BDD\u9ED8\u8BA4\uFF09\u3002 */\n modelChoice: null,\n /** \u7528\u6237\u5728\u6A21\u578B\u83DC\u5355\u91CC\u9009\u7684**\u8FFD\u95EE\u6863**\u63A8\u7406\u7B49\u7EA7\uFF08null = \u7528\u914D\u7F6E\u9ED8\u8BA4\uFF09\u3002\u53EA\u6709\u83DC\u5355\u4F1A\u5199\u5B83\u3002 */\n effort: null,\n /**\n * host \u56DE\u62A5\u7684\"\u672C\u6B21\u8BF7\u6C42\u5B9E\u9645\u7528\u7684\u6863\u4F4D\"\uFF0C\u53EA\u7528\u4E8E\u7B49\u5F85\u63D0\u793A\u663E\u793A\u3002\n * \u5FC5\u987B\u548C\u4E0A\u9762\u7684 effort \u5206\u5F00\uFF1A\u4EE5\u524D\u5171\u7528\u4E00\u4E2A\u5B57\u6BB5\uFF0C\u9996\u8F6E\uFF08\u7FFB\u8BD1\uFF0C\u56FA\u5B9A low\uFF09\u8DD1\u5B8C\u5C31\u628A\u7528\u6237\u9009\u7684\u6863\u4F4D\u8986\u76D6\u6210 low\uFF0C\n * \u8FFD\u95EE\u4E8E\u662F\u6C38\u8FDC\u53D1 low \u2014\u2014 \u8868\u73B0\u4E3A\"\u63A8\u7406\u7B49\u7EA7\u7684\u8BBE\u7F6E\u6CA1\u8D77\u4F5C\u7528\"\u3002\n */\n stageEffort: '',\n /**\n * \u9996\u8F6E/\u8BE6\u89E3\u671F\u95F4 host \u53D1\u7684 notice\uFF08\u6362\u6863\u91CD\u8BD5\u3001\u4E0A\u6E38\u5076\u53D1\u9519\u8BEF\u2026\uFF09\u3002\n * \u4EE5\u524D\u9996\u8F6E\u90A3\u6761 SSE \u5904\u7406\u5668**\u6CA1\u6709 notice \u5206\u652F**\uFF0Chost \u8BF4\u7684\u8BDD\u5168\u88AB\u4E22\u6389 \u2014\u2014\n * \u7528\u6237\u53EA\u770B\u5230\"\u5361\u4E86\u5341\u51E0\u79D2\"\uFF0C\u4E0D\u77E5\u9053\u63D2\u4EF6\u6B63\u5728\u6362\u6863\u91CD\u8BD5\u3002\n */\n notice: '',\n /** \u7F51\u9875\u6A21\u5F0F\uFF08\u5C0F\u7A97\u5F00\u5173\uFF09\uFF1A\u590D\u6742\u95EE\u9898\u9ED8\u8BA4\u7528\u7F51\u9875\u56DE\u7B54\u3002 */\n webAnswer: false,\n /** \u8FFD\u95EE\u662F\u5426\u6B63\u5728\u6D41\u5F0F\u8FD4\u56DE\u3002 */\n asking: false,\n /** \u8FD9\u4E00\u8F6E\u8FFD\u95EE\u7684\u5F00\u59CB\u65F6\u523B\uFF08\u80F6\u56CA\u663E\u793A\u79D2\u6570\u7528\uFF09\u3002 */\n askingStartedAt: 0,\n /** \u662F\u4E0D\u662F\"\u7528\u6237\u6536\u8D77\u5C0F\u7A97\"\u5BFC\u81F4\u7684\u4E2D\u6B62\uFF08\u662F\u7684\u8BDD\u4E0D\u8BB0\u6210\u5931\u8D25\uFF0C\u8BB0\u6210\u5DF2\u505C\u6B62\uFF09\u3002 */\n aborted: false,\n /** \u5347\u683C\u8BF7\u6C42\u8FDB\u884C\u4E2D\u3002 */\n promoting: false,\n }\n\n /** \u7ED3\u679C\u7F13\u5B58\uFF1A\u540C\u9009\u533A+\u4E0A\u4E0B\u6587\u7B2C\u4E8C\u6B21\u70B9\u5F00\u5373\u79D2\u56DE\u3002 */\n var cache = new Map()\n\n // \u2014\u2014 DOM \u2014\u2014\n var styleEl = el('style')\n\n styleEl.setAttribute('data-plugin', '@yfwu2020/dsh-selection-explain')\n\n styleEl.textContent = CSS\n\n document.head.appendChild(styleEl)\n\n /** \u81EA\u6709\u6D6E\u5C42\u6839\uFF1A\u4F4D\u4E8E body\uFF0C\u516C\u5171\u7236\u5C42\u7684\u5806\u53E0\u4E0A\u4E0B\u6587\u4E0D\u5F71\u54CD\u5B83\u3002 */\n var layer = el('div', 'dsh-sel-layer')\n\n layer.style.pointerEvents = 'none'\n\n layer.setAttribute('data-dsh-floating-owner', 'explanation')\n\n var button = el('button', 'dsh-sel-btn')\n\n button.type = 'button'\n\n button.title = '\u89E3\u8BFB\u9009\u4E2D\u6587\u5B57\uFF08\u7FFB\u8BD1 + \u8BE6\u89E3\uFF09'\n\n button.style.zIndex = String(Z_BTN)\n\n button.style.pointerEvents = 'auto'\n\n button.appendChild(sparkleIcon())\n\n button.appendChild(el('span', null, '\u89E3\u8BFB'))\n\n layer.appendChild(button)\n\n /**\n * \u5F15\u7528\u6D6E\u6807\uFF08`\u275D \u5F15\u7528`\uFF09\uFF1A**\u5C0F\u7A97\u5F00\u7740**\u7684\u65F6\u5019\u624D\u6709\u5B83 \u2014\u2014 \u8FD9\u65F6\u5019\u7528\u6237\u5212\u8BCD\u591A\u534A\u662F\u60F3\n * \u63A5\u7740\u95EE\uFF0C\u800C\u4E0D\u662F\u518D\u5F00\u4E00\u4E2A\u5C0F\u7A97\uFF08\u518D\u5F00\u4E00\u4E2A\u7684\u5165\u53E3\u662F\u5148\u628A\u5F53\u524D\u5C0F\u7A97\u6536\u8D77\u6765\uFF09\u3002\n * \u4E24\u79CD\u6765\u6E90\u5171\u7528\u5B83\uFF1A\n * \u00B7 \u5C0F\u7A97\u81EA\u5DF1\u6B63\u6587\u91CC\u7684\u9009\u533A\uFF08\u56DE\u7B54 / \u7FFB\u8BD1 / \u8BE6\u89E3 / \u9876\u90E8\u9009\u4E2D\u6587\u5B57\u6761\uFF09\uFF1B\n * \u00B7 \u5C0F\u7A97\u5F00\u7740\u65F6\u4E3B\u754C\u9762\u4E0A\u7684\u9009\u533A\uFF08\u542B\u4FA7\u8FB9\u680F\u7F51\u9875\u91CC\u90A3\u6761\u7531\u6865\u62A5\u4E0A\u6765\u7684\uFF09\u3002\n * \u70B9\u4E00\u4E0B \u2192 \u6302\u8FDB\u5C0F\u7A97\u8F93\u5165\u6846\u7684\u5F15\u7528\u533A\uFF0C\u4E0D\u6253\u65AD\u8F93\u5165\u3002\n */\n var quoteButton = el('button', 'dsh-sel-btn dsh-sel-quotebtn')\n\n quoteButton.type = 'button'\n\n quoteButton.title = '\u5F15\u7528\u5230\u5C0F\u7A97\u8F93\u5165\u6846\uFF08\u4F5C\u4E3A\u4E0B\u4E00\u53E5\u63D0\u95EE\u7684\u6750\u6599\uFF09'\n\n // **\u5FC5\u987B\u6BD4\u9762\u677F\u9AD8**\uFF1A\u5C0F\u7A97\u91CC\u5212\u8BCD\u65F6\uFF0C\u6D6E\u6807\u662F\u753B\u5728\u9762\u677F\u4E0A\u9762\u7684\u90A3\u5C42\uFF08\u540C\u4E00\u4E2A\u6D6E\u5C42\u91CC\u7684\u5144\u5F1F\u8282\u70B9\uFF0C\n // \u8C01 z-index \u5927\u8C01\u5728\u4E0A\uFF09\u3002\u7528 Z_BTN \u7684\u8BDD\u6D6E\u6807\u4F1A\u88AB\u9762\u677F\u6574\u4E2A\u76D6\u4F4F \u2014\u2014 \u770B\u4E0D\u89C1\u4E5F\u70B9\u4E0D\u7740\u3002\n quoteButton.style.zIndex = String(Z_PANEL + 1)\n\n quoteButton.style.pointerEvents = 'auto'\n\n quoteButton.appendChild(quoteIcon())\n\n quoteButton.appendChild(el('span', null, '\u5F15\u7528'))\n\n layer.appendChild(quoteButton)\n\n /**\n * \u60AC\u6D6E\u72B6\u6001\u80F6\u56CA\uFF1A\u663E\u793A\"\u6700\u8FD1\u4E00\u6B21\u5212\u8BCD\u73B0\u5728\u5904\u4E8E\u4EC0\u4E48\u72B6\u6001\"\uFF0C\u70B9\u4E00\u4E0B\u56DE\u5230\u90A3\u4E2A\u5C0F\u7A97\u3002\n * \u4F4D\u7F6E\u7531 placePill() \u52A8\u6001\u8D34\u5230\u53F3\u4E0B\u89D2\u8D39\u7528\u80F6\u56CA\uFF08dsh-spend\uFF09\u4E0A\u65B9\uFF1B\u8001\u7248\u672C\u6CA1\u88C5\u90A3\u4E2A\u63D2\u4EF6\u65F6\u7528\u515C\u5E95\u4F4D\u7F6E\u3002\n */\n var pill = el('div', 'dsh-sel-pill')\n\n pill.setAttribute('role', 'button')\n\n pill.setAttribute('tabindex', '0')\n\n pill.style.pointerEvents = 'auto'\n\n // \u7403\u5FC3\u91CC\u7684\u56FE\u5F62\uFF1A\u4E00\u679A 32\u00D732 \u7684 SVG\uFF08viewBox -16..16\uFF0C1 \u5355\u4F4D = 1px\uFF09\uFF0C\u91CC\u9762\u53EA\u6709\u4E00\u6761 path\u3002\n // \u5C55\u5F00\u6001\u5B83\u753B\u6210 8px \u5706\u70B9\uFF08PILL_STAR_DOT_D\uFF09\uFF0C\u6536\u7403\u65F6\u628A d \u6362\u6210\u661F\u8292\uFF08PILL_STAR_D\uFF09\u2014\u2014\n // \u4E24\u6761 path \u547D\u4EE4\u7ED3\u6784\u4E00\u81F4\uFF0CChrome \u5BF9 d \u63D2\u503C\uFF0C\u4E8E\u662F\"\u5706\u70B9\u957F\u6210\u661F\u8292\"\u662F\u4E00\u6761\u8FDE\u7EED\u5F62\u53D8\u3002\n var pillIcon = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n\n pillIcon.setAttribute('class', 'dsh-sel-pillicon')\n\n pillIcon.setAttribute('viewBox', '-16 -16 32 32')\n\n pillIcon.setAttribute('aria-hidden', 'true')\n\n pillIcon.setAttribute('focusable', 'false')\n\n var pillStar = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n\n pillStar.setAttribute('class', 'dsh-sel-pillstar')\n\n pillStar.setAttribute('d', PILL_STAR_DOT_D)\n\n pillIcon.appendChild(pillStar)\n\n // \u548C\u8D39\u7528\u80F6\u56CA\u540C\u6784\uFF1A\u4E3B\u4F53\u4E00\u6BB5\uFF08\u52A0\u7C97\uFF09\u3001\u6B21\u8981\u4E00\u6BB5\uFF08\u6DE1\uFF09\u3001\u7BAD\u5934\u4E00\u6BB5\uFF08\u66F4\u6DE1\uFF09\n var pillName = el('span', 'dsh-sel-pillname', '\u5212\u8BCD\u89E3\u8BFB')\n\n var pillMeta = el('span', 'dsh-sel-pillmeta', '\u00B7 \u5C31\u7EEA')\n\n var pillCaret = el('span', 'dsh-sel-pillcaret', '\u25B4')\n\n pill.appendChild(pillIcon)\n\n pill.appendChild(pillName)\n\n pill.appendChild(pillMeta)\n\n pill.appendChild(pillCaret)\n\n layer.appendChild(pill)\n\n var panel = el('div', 'dsh-sel-panel')\n\n panel.style.zIndex = String(Z_PANEL)\n\n panel.style.pointerEvents = 'auto'\n\n panel.setAttribute('role', 'dialog')\n\n panel.setAttribute('aria-label', '\u5212\u8BCD\u89E3\u8BFB')\n\n var head = el('div', 'dsh-sel-head')\n\n head.appendChild(el('span', 'dsh-sel-mark'))\n\n head.appendChild(el('span', 'dsh-sel-title', '\u5212\u8BCD\u89E3\u8BFB'))\n\n // \u6491\u5F00\u7528\uFF1A\u628A\u53F3\u4FA7\u4E09\u4E2A\u6309\u94AE\uFF08\u6700\u8FD1/\u5347\u683C/\u2715\uFF09\u9876\u5230\u6700\u53F3\u3002\n // \u4EE5\u524D\u8FD9\u4E00\u6B65\u662F\"\u6A21\u578B\u540D\u6807\u7B7E\"\u7684 margin-left:auto \u517C\u4EFB\u7684\uFF0C\u6807\u7B7E\u4E00\u5220\u6309\u94AE\u5C31\u8D34\u5230\u6807\u9898\u540E\u9762\u4E86\u3002\n head.appendChild(el('span', 'dsh-sel-headspace'))\n\n var historyButton = actionButton('\u6700\u8FD1\u804A\u8FC7\u7684\u5212\u8BCD\uFF08\u70B9\u4E00\u6761\u628A\u90A3\u6BB5\u5BF9\u8BDD\u8C03\u56DE\u6765\uFF09', '\u6700\u8FD1', headerHistoryIcon)\n\n var promoteButton = actionButton('\u5347\u683C\u4E3A\u6B63\u5F0F\u4F1A\u8BDD\uFF08\u5EFA\u5728\u540C\u4E00\u4E2A\u9879\u76EE\u4E0B\uFF0C\u5E26\u7740\u8FD9\u6BB5\u6587\u5B57\u4E0E\u4E0A\u9762\u7684\u8BA8\u8BBA\uFF09', '\u5347\u683C', headerPromoteIcon)\n\n // \u8BBE\u7F6E\uFF1A\u4E0E\u300C\u6700\u8FD1 / \u5347\u683C\u300D**\u540C\u6B3E**\uFF08\u540C\u8FB9\u6846\u3001\u540C\u9AD8\u3001\u540C\u5706\u89D2\u3001\u540C hover\uFF09\uFF0C\u56FE\u6807 + \u6587\u5B57\u3002\n // \u7528\u6237\u8981\u6C42\"\u56FE\u6807\u65C1\u52A0\u4E0A\u8BBE\u7F6E\u4E24\u5B57\" \u2014\u2014 \u4E00\u6392\u6587\u5B57\u952E\uFF0C\u89C6\u89C9\u4E0A\u624D\u662F\u540C\u4E00\u5957\u4E1C\u897F\u3002\n var settingsButton = actionButton('\u8BBE\u7F6E\uFF08\u6A21\u578B / \u89E3\u8BFB / \u80CC\u666F / \u8054\u7F51 / \u754C\u9762 / \u6570\u636E\uFF09', '\u8BBE\u7F6E', headerSettingsIcon)\n\n settingsButton.setAttribute('aria-haspopup', 'dialog')\n\n settingsButton.setAttribute('aria-pressed', 'false')\n\n var closeButton = iconButton('\u5173\u95ED\uFF08Esc\uFF09', headerCloseIcon)\n\n head.appendChild(historyButton)\n\n head.appendChild(promoteButton)\n\n head.appendChild(settingsButton)\n\n head.appendChild(closeButton)\n\n var quote = el('div', 'dsh-sel-quote')\n\n var body = el('div', 'dsh-sel-body')\n\n // \u9009\u4E2D\u6587\u5B57\u6761\u662F\u6EDA\u52A8\u533A\u7684**\u7B2C\u4E00\u9879**\uFF1A\u5FC5\u987B\u5728\u4E24\u8282/\u5BF9\u8BDD\u533A\u4E4B\u524D append\uFF0C\n // \u5426\u5219\u5B83\u4F1A\u6392\u5230\u6D88\u606F\u4E0B\u9762\u53BB\uFF08\u5B9E\u6D4B\u8E29\u8FC7\uFF1Aappend \u7684\u65F6\u673A\u6BD4 appendChild \u7684\u76EE\u6807\u66F4\u91CD\u8981\uFF09\n body.appendChild(quote)\n\n var expandButton = el('button', 'dsh-sel-expand')\n\n expandButton.type = 'button'\n\n expandButton.title = '\u5F53\u524D\u53EA\u7ED9\u4E86\u7FFB\u8BD1\uFF08\u80CC\u666F 8 \u6761\uFF0C\u9996\u5B57\u66F4\u5FEB\uFF09\u3002\u70B9\u8FD9\u91CC\u52A0\u8F7D\u5B8C\u6574\u4F1A\u8BDD\u80CC\u666F\u5E76\u751F\u6210\u8BE6\u89E3\u3002'\n\n expandButton.appendChild(el('span', null, '\u2193 \u5C55\u5F00\u8BE6\u89E3'))\n\n var translationSection = buildSection('1', '\u7FFB\u8BD1', 'translation')\n\n var detailSection = buildSection('2', '\u8BE6\u89E3', 'detail')\n\n body.appendChild(translationSection.root)\n\n body.appendChild(detailSection.root)\n\n body.appendChild(expandButton)\n\n var chatLog = el('div', 'dsh-sel-chatlog')\n\n body.appendChild(chatLog)\n\n var askRow = el('div', 'dsh-sel-ask')\n\n // \u5F15\u7528\u533A\u662F composer \u7684**\u7B2C\u4E00\u884C**\uFF1A\u6302\u5728\u8F93\u5165\u6846\u4E0A\u9762\uFF08\u53D1\u9001\u65F6\u968F\u63D0\u95EE\u4E00\u8D77\u5E26\u8D70\u3001\u53D1\u5B8C\u6E05\u7A7A\uFF09\u3002\n // \u987A\u5E8F\u5F88\u91CD\u8981 \u2014\u2014 \u5148 append \u5230 askRow \u518D append \u8F93\u5165\u6846\uFF0C\u5426\u5219\u4F1A\u6392\u5230\u5DE5\u5177\u884C\u4E0B\u9762\u53BB\u3002\n var quotesBox = el('div', 'dsh-sel-quotes')\n\n askRow.appendChild(quotesBox)\n\n var askBox = el('textarea', 'dsh-sel-askbox')\n\n askBox.rows = 1\n\n askBox.placeholder = '\u5C31\u8FD9\u6BB5\u6587\u5B57\u7EE7\u7EED\u8FFD\u95EE\u2026\uFF08Enter \u53D1\u9001\uFF0CShift+Enter \u6362\u884C\uFF09'\n\n // \u7F51\u9875\u6A21\u5F0F\u5F00\u5173\uFF1A\u6253\u5F00\u540E\uFF0C\u8FFD\u95EE\u91CC\u8F83\u590D\u6742\u7684\u95EE\u9898\u9ED8\u8BA4\u7528\u7F51\u9875\u56DE\u7B54\uFF08\u5E76\u6CE8\u5165\u9644\u5E26\u7684\u8BBE\u8BA1\u89C4\u8303\uFF09\n // \u8F93\u51FA\u504F\u597D\uFF1A\u6587\u5B57 + \u56FE\u6807\u5206\u6BB5\uFF08\u4E24\u683C\uFF1AM\u2193 = Markdown / \u25AD = \u7F51\u9875\uFF0C\u9009\u4E2D\u683C\u662F\u6ED1\u52A8\u7684\u836F\u4E38\uFF09\n var webMode = el('span', 'dsh-sel-pref')\n\n webMode.appendChild(el('span', 'dsh-sel-preftext', '\u8F93\u51FA\u504F\u597D'))\n\n var prefSeg = el('span', 'dsh-sel-seg')\n\n prefSeg.setAttribute('role', 'radiogroup')\n\n prefSeg.setAttribute('aria-label', '\u8F93\u51FA\u504F\u597D')\n\n var prefPill = el('span', 'dsh-sel-segpill')\n\n var cellMd = el('button', 'dsh-sel-segcell')\n\n cellMd.type = 'button'\n\n cellMd.setAttribute('role', 'radio')\n\n cellMd.setAttribute('aria-label', 'Markdown\uFF1A\u666E\u901A\u6BB5\u843D\uFF0C\u6700\u7701\u65F6\u95F4')\n\n cellMd.appendChild(markdownIcon())\n\n var cellWeb = el('button', 'dsh-sel-segcell')\n\n cellWeb.type = 'button'\n\n cellWeb.setAttribute('role', 'radio')\n\n cellWeb.setAttribute('aria-label', '\u7F51\u9875\uFF1A\u590D\u6742\u95EE\u9898\u751F\u6210\u4E00\u4E2A HTML \u9875\u9762')\n\n cellWeb.appendChild(windowIcon())\n\n prefSeg.appendChild(prefPill)\n\n prefSeg.appendChild(cellMd)\n\n prefSeg.appendChild(cellWeb)\n\n webMode.appendChild(prefSeg)\n\n var askSend = el('button', 'dsh-sel-iconbtn dsh-sel-asksend')\n\n askSend.type = 'button'\n\n askSend.setAttribute('aria-label', '\u53D1\u9001')\n\n askSend.appendChild(sendIcon())\n\n // \u8BED\u97F3\u8F93\u5165\uFF1A\u9EA6\u514B\u98CE\u8D34\u5728\u53D1\u9001\u952E\u5DE6\u8FB9\uFF08\u548C\u4E3B\u4F1A\u8BDD composer \u7684\u4F4D\u7F6E\u4E00\u81F4\uFF09\u3002\n // \u5E73\u65F6\u5C31\u662F\u8FD9\u679A\u56FE\u6807\uFF1B\u4E00\u65E6\u5F00\u59CB\u5F55\uFF0C\u5DE5\u5177\u884C\u6574\u4E2A\u6362\u6210\u4E0B\u9762\u7684\"\u5F55\u97F3\u884C\"\uFF08\u4E0E\u4E3B\u4F1A\u8BDD\u540C\u4E00\u5957\uFF09\u3002\n var micButton = el('button', 'dsh-sel-iconbtn dsh-sel-mic')\n\n micButton.type = 'button'\n\n micButton.setAttribute('data-state', 'idle')\n\n micButton.setAttribute('aria-label', '\u8BED\u97F3\u8F93\u5165')\n\n micButton.title = '\u8BED\u97F3\u8F93\u5165\uFF08\u70B9\u4E00\u4E0B\u5F00\u59CB\u8BF4\uFF0C\u518D\u70B9\u4E00\u4E0B\u7ED3\u675F\u5E76\u8F6C\u6210\u6587\u5B57\uFF09'\n\n micButton.appendChild(micIcon())\n\n // \u6A21\u578B + \u63A8\u7406\u7B49\u7EA7\uFF08\u8FFD\u95EE\u6863\uFF09\uFF1A\u80F6\u56CA\u5728\u53D1\u9001\u952E\u5DE6\u8FB9\uFF0C\u83DC\u5355\u5411\u4E0A\u5F39\n var modelPill = el('button', 'dsh-sel-picker')\n\n modelPill.type = 'button'\n\n modelPill.setAttribute('aria-haspopup', 'menu')\n\n modelPill.setAttribute('aria-expanded', 'false')\n\n var modelPillName = el('span', 'dsh-sel-picker-name', '\u6A21\u578B')\n\n var modelPillTier = el('span', 'dsh-sel-picker-tier', '')\n\n modelPill.appendChild(modelPillName)\n\n modelPill.appendChild(modelPillTier)\n\n modelPill.appendChild(el('span', 'dsh-sel-picker-caret', '\u25BC'))\n\n var modelMenu = el('div', 'dsh-sel-pickermenu')\n\n // role \u968F\u5F00\u5408\u540C\u6B65\uFF1ADSH \u6309 [role=\"menu\"] \u5224\u5B9A\u5F39\u5C42\uFF0C\u4E0D\u68C0\u67E5 CSS \u53EF\u89C1\u6027\u3002\n\n // \u2500\u2500 \u5F55\u97F3\u884C\uFF08\u4E0E\u4E3B\u4F1A\u8BDD ui-voice-input \u540C\u4E00\u5957\u7ED3\u6784\uFF09\u2500\u2500\n // [\u2715 \u53D6\u6D88] [\u5B9E\u65F6\u6CE2\u5F62 / \u72B6\u6001\u6587\u6848] [\u25A0 \u505C\u6B62 \u6216 \u884C\u5185\u52A8\u4F5C] \u2026\u2026 [\u2191 \u53D1\u9001\uFF08\u539F\u4F4D\u4E0D\u52A8\uFF09]\n // \u5F55\u97F3\u65F6\u662F\u300C\u2715 + \u6CE2\u5F62 + \u25A0\u300D\uFF1B\u8BF7\u6C42\u6743\u9650\u4E0E\u8BC6\u522B\u4E2D\u662F\u300C\u2715 + \u547C\u5438\u70B9 + \u8BF7\u5141\u8BB8\u4F7F\u7528\u9EA6\u514B\u98CE\u2026/\u8BC6\u522B\u4E2D\u2026\u300D\uFF1B\n // \u51FA\u9519\u662F\u300C\u2715 + \u539F\u56E0 + \u884C\u5185\u52A8\u4F5C\uFF08\u51C6\u5907\u6A21\u578B / \u91CD\u65B0\u5F55\u97F3\uFF09\u300D\u3002\n var captureRow = el('div', 'dsh-sel-capture')\n\n captureRow.setAttribute('data-show', '0')\n\n var voiceCancel = el('button', 'dsh-sel-round')\n\n voiceCancel.type = 'button'\n\n voiceCancel.setAttribute('aria-label', '\u53D6\u6D88')\n\n voiceCancel.title = '\u53D6\u6D88\uFF08Esc\uFF09'\n\n voiceCancel.appendChild(closeIcon())\n\n // \u6CE2\u5F62\uFF1A80 \u6839\u7AD6\u7EBF\uFF0C\u9759\u97F3\u65F6\u662F\u4E00\u6761\u865A\u7EBF\uFF08\u7B97\u6CD5\u7167\u6284\u4E3B\u4F1A\u8BDD\u7684 Waveform\uFF09\n var waveSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n\n waveSvg.setAttribute('class', 'dsh-sel-vwave')\n\n waveSvg.setAttribute('viewBox', '0 0 640 40')\n\n waveSvg.setAttribute('preserveAspectRatio', 'none')\n\n waveSvg.setAttribute('role', 'img')\n\n waveSvg.setAttribute('aria-label', '\u6B63\u5728\u5F55\u97F3\u2026')\n\n var waveBars = []\n\n for (var waveIndex = 0; waveIndex < 80; waveIndex += 1) {\n var waveBar = document.createElementNS('http://www.w3.org/2000/svg', 'line')\n waveBar.setAttribute('x1', String(waveIndex * 8 + 4))\n waveBar.setAttribute('x2', String(waveIndex * 8 + 4))\n waveBar.setAttribute('y1', '19')\n waveBar.setAttribute('y2', '21')\n waveBar.setAttribute('stroke', 'currentColor')\n waveBar.setAttribute('stroke-width', '3')\n waveBar.setAttribute('stroke-linecap', 'round')\n waveBar.setAttribute('opacity', String(0.25 + waveIndex / 120))\n waveSvg.appendChild(waveBar)\n // \u6700\u65B0\u7684\u7535\u5E73\u5728\u6700\u53F3\u8FB9\uFF1A\u548C\u4E3B\u4F1A\u8BDD\u4E00\u6837\u4ECE\u53F3\u5F80\u5DE6\u63A8\n waveBars.unshift({ node: waveBar, level: 0 })\n }\n\n var voiceActivity = el('span', 'dsh-sel-vactivity')\n\n voiceActivity.setAttribute('role', 'status')\n\n var voiceDot = el('span', 'dsh-sel-vdot')\n\n var voiceActivityText = el('span', null, '')\n\n voiceActivity.appendChild(voiceDot)\n\n voiceActivity.appendChild(voiceActivityText)\n\n var voiceStop = el('button', 'dsh-sel-round dsh-sel-stop')\n\n voiceStop.type = 'button'\n\n voiceStop.setAttribute('aria-label', '\u505C\u6B62\u5E76\u8BC6\u522B')\n\n voiceStop.title = '\u505C\u6B62\u5E76\u8BC6\u522B'\n\n voiceStop.appendChild(stopIcon())\n\n // \u884C\u5185\u52A8\u4F5C\u4F4D\uFF1A\u6309\u72B6\u6001\u653E\u300C\u51C6\u5907\u6A21\u578B\u300D\u6587\u5B57\u952E\u6216\u300C\u91CD\u65B0\u5F55\u97F3\u300D\uD83C\uDFA4\u5706\u952E\uFF08\u4E3B\u4F1A\u8BDD\u540C\u6B3E inlineAction\uFF09\n var voiceActionSlot = el('span', 'dsh-sel-vactslot')\n\n captureRow.appendChild(voiceCancel)\n\n captureRow.appendChild(waveSvg)\n\n captureRow.appendChild(voiceActivity)\n\n captureRow.appendChild(voiceActionSlot)\n\n captureRow.appendChild(voiceStop)\n\n var askTools = el('div', 'dsh-sel-asktools')\n\n var askSpacer = el('span', 'dsh-sel-askspace')\n\n askTools.appendChild(webMode)\n\n askTools.appendChild(askSpacer)\n\n askTools.appendChild(modelPill)\n\n askTools.appendChild(micButton)\n\n askTools.appendChild(captureRow)\n\n askTools.appendChild(askSend)\n\n askRow.appendChild(askBox)\n\n askRow.appendChild(askTools)\n\n askRow.appendChild(modelMenu)\n\n // \u300C\u91CD\u65B0\u751F\u6210\u300D\u4E0D\u518D\u5E38\u9A7B\u9875\u811A\uFF1A\u53EA\u5728\u5185\u5BB9\u533A\u6CA1\u6709\u53EF\u7528\u7ED3\u679C\u65F6\u51FA\u73B0\u5728\u6B63\u6587\u91CC\n var retryButton = el('button', 'dsh-sel-retry', '\u91CD\u65B0\u751F\u6210')\n\n retryButton.type = 'button'\n\n retryButton.style.display = 'none'\n\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 \u8BBE\u7F6E\u9875\uFF08\u62BD\u5C49\uFF09 \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n // \u6302\u5728\u9762\u677F**\u5185\u90E8**\uFF1A\u9762\u677F\u662F position:fixed\uFF08\u4E5F\u7B97\u5B9A\u4F4D\u7956\u5148\uFF09\u4E14 overflow:hidden\uFF0C\n // \u4E8E\u662F\"\u4ECE\u53F3\u4FA7\u6ED1\u5165\"\u7684\u90A3\u4E00\u5E27\u4F1A\u88AB\u5706\u89D2\u88C1\u6389\uFF0C\u4E0D\u4F1A\u6EA2\u51FA\u5230\u9762\u677F\u5916\u9762\u53BB\u3002\n var settingsScrim = el('div', 'dsh-sel-scrim')\n\n settingsScrim.setAttribute('data-open', '0')\n\n var settingsSheet = el('div', 'dsh-sel-sheet')\n\n settingsSheet.setAttribute('data-open', '0')\n\n settingsSheet.setAttribute('role', 'dialog')\n\n settingsSheet.setAttribute('aria-label', '\u5212\u8BCD\u89E3\u8BFB\u8BBE\u7F6E')\n\n var settingsHead = el('div', 'dsh-sel-sheethead')\n\n var settingsBack = el('button', 'dsh-sel-sheetback')\n\n settingsBack.type = 'button'\n\n settingsBack.title = '\u8FD4\u56DE\uFF08Esc\uFF09'\n\n settingsBack.setAttribute('aria-label', '\u8FD4\u56DE')\n\n settingsBack.appendChild(backIcon())\n\n settingsHead.appendChild(settingsBack)\n\n settingsHead.appendChild(el('span', 'dsh-sel-sheettitle', '\u8BBE\u7F6E'))\n\n settingsHead.appendChild(el('span', 'dsh-sel-sheetscope', '\u4EC5\u672C\u63D2\u4EF6 \u00B7 \u5373\u65F6\u751F\u6548'))\n\n var settingsMain = el('div', 'dsh-sel-sheetmain')\n\n var settingsRail = el('div', 'dsh-sel-rail')\n\n settingsRail.setAttribute('role', 'tablist')\n\n settingsRail.setAttribute('aria-orientation', 'vertical')\n\n var settingsBody = el('div', 'dsh-sel-sheetbody')\n\n settingsMain.appendChild(settingsRail)\n\n settingsMain.appendChild(settingsBody)\n\n var settingsFoot = el('div', 'dsh-sel-sheetfoot')\n\n var settingsNote = el('span', 'dsh-sel-sfootnote')\n\n settingsNote.setAttribute('data-dirty', '0')\n\n settingsNote.appendChild(el('i'))\n\n var settingsNoteText = el('span', null, '\u6539\u52A8\u4F1A\u81EA\u52A8\u4FDD\u5B58')\n\n settingsNote.appendChild(settingsNoteText)\n\n var settingsReset = el('button', 'dsh-sel-sbtn', '\u6062\u590D\u9ED8\u8BA4')\n\n settingsReset.type = 'button'\n\n settingsReset.title = '\u628A\u6240\u6709\u8BBE\u7F6E\u5199\u56DE cordis.patch.yml / \u51FA\u5382\u9ED8\u8BA4'\n\n var settingsClose = el('button', 'dsh-sel-sbtn', '\u5173\u95ED')\n\n settingsClose.type = 'button'\n\n settingsFoot.appendChild(settingsNote)\n\n settingsFoot.appendChild(settingsReset)\n\n settingsFoot.appendChild(settingsClose)\n\n settingsSheet.appendChild(settingsHead)\n\n settingsSheet.appendChild(settingsMain)\n\n settingsSheet.appendChild(settingsFoot)\n\n // \u2500\u2500 \u6539\u5927\u5C0F\u624B\u67C4\uFF08\u53F3\u4E0B\u89D2 + \u53F3\u8FB9\u7F18 + \u4E0B\u8FB9\u7F18\uFF09\u2500\u2500\n // \u5C0F\u7A97\u7684\u5C3A\u5BF8/\u4F4D\u7F6E\u90FD\u7531\u8FD9\u91CC\u9A71\u52A8\uFF1B\u62D6\u5B8C\u8BB0\u5728 host \u4E0A\uFF08\u89C1 savePanelBox\uFF09\u3002\n var gripCorner = el('div', 'dsh-sel-grip dsh-sel-grip-corner')\n\n var gripRight = el('div', 'dsh-sel-grip dsh-sel-grip-r')\n\n var gripBottom = el('div', 'dsh-sel-grip dsh-sel-grip-b')\n\n gripCorner.title = '\u62D6\u52A8\u6539\u5927\u5C0F\uFF08\u53CC\u51FB\u6062\u590D\u9ED8\u8BA4\uFF09'\n\n panel.appendChild(gripCorner)\n\n panel.appendChild(gripRight)\n\n panel.appendChild(gripBottom)\n\n panel.appendChild(settingsScrim)\n\n panel.appendChild(settingsSheet)\n\n panel.appendChild(head)\n\n panel.appendChild(body)\n\n panel.appendChild(askRow)\n\n layer.appendChild(panel)\n var settingsController = createSettingsController({\n get state() { return state },\n get modelCatalog() { return modelsController.modelCatalog },\n get paintModelPill() { return modelsController.paintModelPill },\n get panelSessionId() { return panelSessionId },\n get currentSessionId() { return panelController.currentSessionId },\n get loadModelCatalog() { return modelsController.loadModelCatalog },\n get settingsSheet() { return settingsSheet },\n get modelMenu() { return modelMenu },\n get renderModelMenu() { return modelsController.renderModelMenu },\n get catalogItemOf() { return modelsController.catalogItemOf },\n get settingsNote() { return settingsNote },\n get settingsNoteText() { return settingsNoteText },\n get bridgeOn() { return previewController.bridgeOn },\n set bridgeOn(value) { previewController.bridgeOn = value },\n get scheduleBridgeScan() { return previewController.scheduleBridgeScan },\n get settingsRail() { return settingsRail },\n get settingsBody() { return settingsBody },\n get pillHidden() { return pillHidden },\n set pillHidden(value) { pillHidden = value },\n get pill() { return pill },\n get placePill() { return pillController.placePill },\n get pillIdleId() { return pillIdleId },\n set pillIdleId(value) { pillIdleId = value },\n get schedulePillIdle() { return pillController.schedulePillIdle },\n get panelOpen() { return panelOpen },\n get panel() { return panel },\n get settingsScrim() { return settingsScrim },\n get settingsButton() { return settingsButton },\n })\n var selectionController = createSelectionController({\n get later() { return later },\n get layer() { return layer },\n get panel() { return panel },\n get pill() { return pill },\n get body() { return body },\n get state() { return state },\n get translationSection() { return translationSection },\n get detailSection() { return detailSection },\n get hideQuoteButton() { return voiceCardController.hideQuoteButton },\n get turnIndexOfNode() { return quotesController.turnIndexOfNode },\n get panelOpen() { return panelOpen },\n get button() { return button },\n get currentSurfaceTheme() { return historyController.currentSurfaceTheme },\n get startMicWatch() { return voiceCardController.startMicWatch },\n get vcardState() { return voiceCardController.vcardState },\n get stopMicWatch() { return voiceCardController.stopMicWatch },\n get quoteButton() { return quoteButton },\n })\n var voiceCardController = createVoiceCardController({\n get layer() { return layer },\n get later() { return later },\n get panelOpen() { return panelOpen },\n get state() { return state },\n get isTypingTarget() { return panelController.isTypingTarget },\n get button() { return button },\n get hideButton() { return selectionController.hideButton },\n get settingsLive() { return settingsController.settingsLive },\n get rangeSelection() { return panelController.rangeSelection },\n get openPanelWith() { return panelController.openPanelWith },\n get clearDocSelection() { return panelController.clearDocSelection },\n get frameTouchedAt() { return previewController.frameTouchedAt },\n get timers() { return timers },\n get voice() { return voiceController.voice },\n get addQuote() { return quotesController.addQuote },\n get quoteContextFor() { return quotesController.quoteContextFor },\n get composerVisible() { return panelController.composerVisible },\n get focusAskBox() { return panelController.focusAskBox },\n get quoteButton() { return quoteButton },\n get setQuotePop() { return selectionController.setQuotePop },\n })\n var quotesController = createQuotesController({\n get state() { return state },\n get setStatus() { return panelController.setStatus },\n get refreshAskState() { return conversationController.refreshAskState },\n get askRow() { return askRow },\n get composerVisible() { return panelController.composerVisible },\n get focusAskBox() { return panelController.focusAskBox },\n get quotesBox() { return quotesBox },\n get body() { return body },\n get panel() { return panel },\n get rangeSelection() { return panelController.rangeSelection },\n get currentSessionId() { return panelController.currentSessionId },\n get timers() { return timers },\n })\n var previewController = createPreviewController({\n get panel() { return panel },\n get state() { return state },\n get vcardState() { return voiceCardController.vcardState },\n get hideButton() { return selectionController.hideButton },\n get later() { return later },\n })\n var panelController = createPanelController({\n get panelSessionId() { return panelSessionId },\n set panelSessionId(value) { panelSessionId = value },\n get ctx() { return ctx },\n get cache() { return cache },\n get state() { return state },\n get translationSection() { return translationSection },\n get expandButton() { return expandButton },\n get hideButton() { return selectionController.hideButton },\n get quote() { return quote },\n get clearQuotes() { return quotesController.clearQuotes },\n get renderTurns() { return historyController.renderTurns },\n get sendAsk() { return conversationController.sendAsk },\n get restoreFromHistory() { return historyController.restoreFromHistory },\n get runRequest() { return conversationController.runRequest },\n get vcardHandoff() { return voiceCardController.vcardHandoff },\n set vcardHandoff(value) { voiceCardController.vcardHandoff = value },\n get panel() { return panel },\n get historyList() { return historyList },\n get placeHistoryList() { return historyController.placeHistoryList },\n get panelOpen() { return panelOpen },\n set panelOpen(value) { panelOpen = value },\n get autoGrowAskBox() { return conversationController.autoGrowAskBox },\n get askFocusPending() { return askFocusPending },\n set askFocusPending(value) { askFocusPending = value },\n get hideQuoteButton() { return voiceCardController.hideQuoteButton },\n get paintPill() { return pillController.paintPill },\n get refreshFollowRoute() { return settingsController.refreshFollowRoute },\n get syncRouteWatch() { return settingsController.syncRouteWatch },\n get warmModelCatalog() { return modelsController.warmModelCatalog },\n get prefersReducedMotion() { return voiceCardController.prefersReducedMotion },\n get panelGrowTimer() { return voiceCardController.panelGrowTimer },\n set panelGrowTimer(value) { voiceCardController.panelGrowTimer = value },\n get panelGrowHandler() { return voiceCardController.panelGrowHandler },\n set panelGrowHandler(value) { voiceCardController.panelGrowHandler = value },\n get later() { return later },\n get closeModelMenu() { return modelsController.closeModelMenu },\n get closeSettings() { return settingsController.closeSettings },\n get hideHistoryList() { return historyController.hideHistoryList },\n get cancelVoice() { return voiceController.cancelVoice },\n get visibleRaw() { return historyController.visibleRaw },\n get showWaiting() { return conversationController.showWaiting },\n get retryButton() { return retryButton },\n get detailSection() { return detailSection },\n get currentSurfaceTheme() { return historyController.currentSurfaceTheme },\n get layer() { return layer },\n get askRow() { return askRow },\n get closeButton() { return closeButton },\n get refreshAskState() { return conversationController.refreshAskState },\n get focusBail() { return focusBail },\n set focusBail(value) { focusBail = value },\n get askBox() { return askBox },\n get insidePanelContent() { return selectionController.insidePanelContent },\n })\n var pillController = createPillController({\n get state() { return state },\n get pillName() { return pillName },\n get pillMeta() { return pillMeta },\n get pill() { return pill },\n get panelOpen() { return panelOpen },\n get pillCaret() { return pillCaret },\n get pillHost() { return pillHost },\n set pillHost(value) { pillHost = value },\n get pillFreeRight() { return pillFreeRight },\n set pillFreeRight(value) { pillFreeRight = value },\n get pillDock() { return pillDock },\n set pillDock(value) { pillDock = value },\n get pillHidden() { return pillHidden },\n get pillAnchorWidth() { return pillAnchorWidth },\n set pillAnchorWidth(value) { pillAnchorWidth = value },\n get pillBall() { return pillBall },\n set pillBall(value) { pillBall = value },\n get pillSnapUntil() { return pillSnapUntil },\n set pillSnapUntil(value) { pillSnapUntil = value },\n get pillHover() { return pillHover },\n get pillDrag() { return pillDrag },\n set pillDrag(value) { pillDrag = value },\n get pillStar() { return pillStar },\n get pillIdleId() { return pillIdleId },\n set pillIdleId(value) { pillIdleId = value },\n get pillDragMoved() { return pillDragMoved },\n set pillDragMoved(value) { pillDragMoved = value },\n get later() { return later },\n get pillWatched() { return pillWatched },\n set pillWatched(value) { pillWatched = value },\n get pillObserver() { return pillObserver },\n set pillObserver(value) { pillObserver = value },\n get pillPollDelay() { return pillPollDelay },\n set pillPollDelay(value) { pillPollDelay = value },\n get PILL_POLL_MIN() { return PILL_POLL_MIN },\n get PILL_POLL_MAX() { return PILL_POLL_MAX },\n get pillPlacerId() { return pillPlacerId },\n set pillPlacerId(value) { pillPlacerId = value },\n get closePanel() { return panelController.closePanel },\n get showPanel() { return panelController.showPanel },\n get paint() { return panelController.paint },\n get renderTurns() { return historyController.renderTurns },\n get setStatus() { return panelController.setStatus },\n get loadHistoryEntry() { return historyController.loadHistoryEntry },\n })\n var historyController = createHistoryController({\n get sentTextOf() { return quotesController.sentTextOf },\n get panel() { return panel },\n get state() { return state },\n get exportTurns() { return quotesController.exportTurns },\n get clearQuotes() { return quotesController.clearQuotes },\n get buildPayload() { return panelController.buildPayload },\n get askFocusAfterTurn() { return panelController.askFocusAfterTurn },\n get quote() { return quote },\n get applySectionTitle() { return panelController.applySectionTitle },\n get paint() { return panelController.paint },\n get timers() { return timers },\n get panelOpen() { return panelOpen },\n set panelOpen(value) { panelOpen = value },\n get historyList() { return historyList },\n get historyButton() { return historyButton },\n get panelLayoutRect() { return panelController.panelLayoutRect },\n get setStatus() { return panelController.setStatus },\n get showPanel() { return panelController.showPanel },\n get rectOfPill() { return pillController.rectOfPill },\n get refreshFollowRoute() { return settingsController.refreshFollowRoute },\n get syncRouteWatch() { return settingsController.syncRouteWatch },\n get warmModelCatalog() { return modelsController.warmModelCatalog },\n get progressText() { return panelController.progressText },\n get body() { return body },\n get chatLog() { return chatLog },\n get panelInteracting() { return panelController.panelInteracting },\n get clampPanelPosition() { return panelController.clampPanelPosition },\n get clearWaiting() { return conversationController.clearWaiting },\n get showWaiting() { return conversationController.showWaiting },\n get quoteLabelOf() { return quotesController.quoteLabelOf },\n get quoteBrief() { return quotesController.quoteBrief },\n get addQuote() { return quotesController.addQuote },\n get turnLabelOf() { return selectionController.turnLabelOf },\n })\n var conversationController = createConversationController({\n get state() { return state },\n get askBox() { return askBox },\n get keepInsideViewport() { return panelController.keepInsideViewport },\n get askSend() { return askSend },\n get setStatus() { return panelController.setStatus },\n get voice() { return voiceController.voice },\n get cancelVoice() { return voiceController.cancelVoice },\n get renderQuotes() { return quotesController.renderQuotes },\n get resolveQuoteContexts() { return quotesController.resolveQuoteContexts },\n get composeQuestion() { return quotesController.composeQuestion },\n get seedHistoryFromExplanation() { return historyController.seedHistoryFromExplanation },\n get syncPanelStage() { return panelController.syncPanelStage },\n get syncExpandCta() { return panelController.syncExpandCta },\n get ensureChatFollow() { return historyController.ensureChatFollow },\n get renderTurns() { return historyController.renderTurns },\n get paintPill() { return pillController.paintPill },\n get timers() { return timers },\n get FOLD_HISTORY_KEEP_LATEST() { return historyController.FOLD_HISTORY_KEEP_LATEST },\n get historyTextOf() { return historyController.historyTextOf },\n get clearTransientNotice() { return historyController.clearTransientNotice },\n get chatLog() { return chatLog },\n get saveHistory() { return historyController.saveHistory },\n get askFocusAfterTurn() { return panelController.askFocusAfterTurn },\n get panelOrCurrentSessionId() { return panelController.panelOrCurrentSessionId },\n get currentSurfaceTheme() { return historyController.currentSurfaceTheme },\n get applyToolEvent() { return historyController.applyToolEvent },\n get rememberBadTier() { return modelsController.rememberBadTier },\n get paintModelPill() { return modelsController.paintModelPill },\n get turnsRenderPending() { return turnsRenderPending },\n set turnsRenderPending(value) { turnsRenderPending = value },\n get lastTurnsRenderAt() { return lastTurnsRenderAt },\n set lastTurnsRenderAt(value) { lastTurnsRenderAt = value },\n get STREAM_RENDER_MS() { return STREAM_RENDER_MS },\n get later() { return later },\n get waitList() { return waitList },\n get paint() { return panelController.paint },\n get progressText() { return panelController.progressText },\n get visibleRaw() { return historyController.visibleRaw },\n get cache() { return cache },\n get rafPending() { return rafPending },\n set rafPending(value) { rafPending = value },\n get ensurePanelInsideViewportNow() { return historyController.ensurePanelInsideViewportNow },\n get promoteButton() { return promoteButton },\n get exportTurns() { return quotesController.exportTurns },\n get closePanel() { return panelController.closePanel },\n get ctx() { return ctx },\n get buildPayload() { return panelController.buildPayload },\n })\n var modelsController = createModelsController({\n get state() { return state },\n get modelPillName() { return modelPillName },\n get modelPillTier() { return modelPillTier },\n get modelPill() { return modelPill },\n get paintEffortMapHint() { return settingsController.paintEffortMapHint },\n get panelSessionId() { return panelSessionId },\n get currentSessionId() { return panelController.currentSessionId },\n get panelOrCurrentSessionId() { return panelController.panelOrCurrentSessionId },\n get modelMenu() { return modelMenu },\n get chooseSharedModel() { return settingsController.chooseSharedModel },\n get setStatus() { return panelController.setStatus },\n get chatSlot() { return settingsController.chatSlot },\n get SLOT_ORDER() { return settingsController.SLOT_ORDER },\n get SLOT_LABEL() { return settingsController.SLOT_LABEL },\n get setChatSlot() { return settingsController.setChatSlot },\n get webMode() { return webMode },\n get cellMd() { return cellMd },\n get cellWeb() { return cellWeb },\n })\n var voiceController = createVoiceController({\n get voiceActivityText() { return voiceActivityText },\n get voiceActivity() { return voiceActivity },\n get voiceDot() { return voiceDot },\n get voiceActionSlot() { return voiceActionSlot },\n get captureRow() { return captureRow },\n get askTools() { return askTools },\n get webMode() { return webMode },\n get askSpacer() { return askSpacer },\n get modelPill() { return modelPill },\n get micButton() { return micButton },\n get waveSvg() { return waveSvg },\n get voiceStop() { return voiceStop },\n get voiceCancel() { return voiceCancel },\n get waveBars() { return waveBars },\n get focusAskBox() { return panelController.focusAskBox },\n get askBox() { return askBox },\n get refreshAskState() { return conversationController.refreshAskState },\n })\n quotesController.renderQuotes()\n\n // \u300C\u6700\u8FD1\u804A\u8FC7\u7684\u300D\u662F**\u72EC\u7ACB\u7684\u6D6E\u5C42**\uFF08\u8D34\u9762\u677F\u4FA7\u8FB9\uFF09\uFF0C\u4E0D\u548C\u6D88\u606F\u5171\u7528\u4E00\u4E2A\u6EDA\u52A8\u533A\n var historyList = el('div', 'dsh-sel-history')\n\n historyList.style.display = 'none'\n\n layer.appendChild(historyList)\n\n /**\n * \u5B98\u65B9\u69FD\u4EC5\u4FDD\u7559\u4E0D\u53EF\u89C1\u7684\u751F\u547D\u5468\u671F\u951A\u70B9\uFF1B\u754C\u9762\u6839\u7531\u672C\u63D2\u4EF6\u6302\u5230 body\u3002\n * \u7A33\u5B9A ref \u907F\u514D React \u91CD\u6E32\u67D3\u65F6\u6458\u6302\u6839\u8282\u70B9\u3001\u4E22\u5931\u8F93\u5165\u7126\u70B9\u3002\n */\n function syncFullViewLayer() {\n var fullView = !!document.querySelector('[data-dsh-full-view]')\n if (fullView !== layer.hasAttribute('data-full-view')) {\n if (fullView) layer.setAttribute('data-full-view', '')\n else layer.removeAttribute('data-full-view')\n }\n }\n\n function mountFloatingLayer(node) {\n if (node) {\n if (layer.parentNode !== document.body) document.body.appendChild(layer)\n syncFullViewLayer()\n } else if (layer.parentNode) layer.parentNode.removeChild(layer)\n }\n\n var fullViewObserver = null\n\n if (typeof MutationObserver === 'function') {\n fullViewObserver = new MutationObserver(syncFullViewLayer)\n fullViewObserver.observe(document.body, {subtree:true, childList:true, attributes:true, attributeFilter:['data-dsh-full-view']})\n }\n\n /** \u5F00\u7A97\u540E\"\u8FD8\u6CA1\u805A\u7126\u8FC7\u8F93\u5165\u6846\"\uFF08\u89C1 focusComposerOnce\uFF09\u3002 */\n var askFocusPending = false\n\n /** \u8C03\u8BD5\uFF1A\u6700\u540E\u4E00\u6B21\"\u6CA1\u805A\u7126\"\u5361\u5728\u54EA\u4E00\u6B65\uFF08-1 \u8868\u793A\u805A\u7126\u6210\u529F\uFF09\u3002 */\n /** \u8C03\u8BD5\uFF1A\u6700\u540E\u4E00\u6B21\"\u6CA1\u805A\u7126\"\u5361\u5728\u54EA\u4E00\u6B65\uFF08\u6210\u529F\u65F6\u662F 'ok'\uFF09\u3002\u81EA\u52A8\u805A\u7126\u8FD9\u7C7B\u95EE\u9898\u5F88\u96BE\u4ECE\u5916\u90E8\u770B\u51FA\u6765\u3002 */\n var focusBail = ''\n\n var offSlot = null\n\n if (ctx.slots && typeof ctx.slots.inject === 'function') {\n try {\n offSlot = ctx.slots.inject('shell.overlay', function () {\n return ctx.slots.register({\n name: 'shell.overlay',\n id: '@yfwu2020/dsh-selection-explain',\n order: 20,\n label: function () {\n return '\u5212\u8BCD\u89E3\u8BFB'\n },\n }, function SelectionExplainLayer() {\n return React.createElement('div', {\n className: 'dsh-sel-anchor',\n style: { display: 'none', pointerEvents: 'none' },\n ref: mountFloatingLayer,\n })\n })\n })\n } catch (error) {\n // \u69FD\u6CE8\u518C\u5931\u8D25\u4EC5\u62A5\u9519\uFF0C\u81EA\u6709\u754C\u9762\u6839\u4FDD\u6301\u672A\u6302\u8F7D\uFF0C\u4E0D\u5F71\u54CD\u5176\u4ED6\u63D2\u4EF6\u3002\n console.error('[dsh-selection-explain] shell.overlay \u69FD\u6CE8\u518C\u5931\u8D25\uFF1A', error)\n }\n } else {\n console.error('[dsh-selection-explain] slots \u670D\u52A1\u4E0D\u53EF\u7528\uFF0C\u5212\u8BCD\u89E3\u8BFB UI \u672A\u6302\u8F7D')\n }\n\n var panelOpen = false\n\n /**\n * **\u672C\u5C0F\u7A97\u6240\u5C5E\u7684\u4F1A\u8BDD**\uFF08\u5212\u8BCD\u90A3\u4E00\u523B\u6240\u5728\u7684\u90A3\u4E2A\uFF09\u3002\n *\n * \u4E0D\u80FD\u76F4\u63A5\u7528 currentSessionId()\uFF1A\u90A3\u662F\"\u5F53\u524D\u6B63\u5728\u770B\u7684\u4F1A\u8BDD\"\uFF0C\u7528\u6237\u5207\u8D70\u4E4B\u540E\u5B83\u7ACB\u523B\u53D8\u4E86\u3002\n * \u5C0F\u7A97\u7684\u6A21\u578B\u3001\u80CC\u666F\u3001\u5347\u683C\u90FD\u8BE5\u6309**\u5B83\u81EA\u5DF1\u90A3\u4E2A\u4F1A\u8BDD**\u7B97 \u2014\u2014\n * \u5426\u5219\u5207\u5230\u522B\u7684\u4F1A\u8BDD\u518D\u6253\u5F00\u8BBE\u7F6E\uFF0C\u62EC\u53F7\u91CC\u4F1A\u62A5\u6210\u53E6\u4E00\u4E2A\u4F1A\u8BDD\u7684\u6A21\u578B\uFF08\u7528\u6237\u62A5\u7684\u95EE\u9898\uFF09\u3002\n */\n var panelSessionId = ''\n\n var rafPending = false\n\n /** \u6D41\u5F0F\u91CD\u7ED8\u9650\u901F\uFF08\u6BEB\u79D2\uFF09\uFF1A\u89C1 scheduleTurnsRender / schedulePaint\u3002 */\n var STREAM_RENDER_MS = 90\n\n var turnsRenderPending = false\n\n var lastTurnsRenderAt = 0\n\n var timers = []\n\n /** \u8D34\u4F4D\u7F6E\u7684\u81EA\u9002\u5E94\u8282\u594F\uFF08\u89C1 schedulePillPlacer\uFF09\u3002 */\n var PILL_POLL_MIN = 2000\n\n var PILL_POLL_MAX = 60000\n\n var pillPollDelay = PILL_POLL_MIN\n\n /**\n * \u80F6\u56CA\u7684\u62D6\u52A8 / \u5438\u9644 / \u6536\u7403\u72B6\u6001\uFF08\u51E0\u4F55\u53C2\u6570 PILL_* \u5728\u6587\u4EF6\u4E0A\u65B9\uFF0CCSS \u4E5F\u8981\u7528\uFF09\u3002\n *\n * \u00B7 pillDock\uFF1A'anchor' = \u8D34\u8D39\u7528\u80F6\u56CA\uFF08\u91CF\u4E0D\u5230\u5C31\u8D34\u53F3\u4E0B\u89D2\uFF0C\u7531 placePill \u7BA1\uFF09\uFF1B\n * 'free' = \u7528\u6237\u62D6\u5230\u522B\u5904\u4E86 \u2014\u2014 \u4F4D\u7F6E\u5F52\u7528\u6237\uFF0C\u8F6E\u8BE2\u4E0D\u8BB8\u518D\u52A8\u5B83\u3002\n * \u00B7 pillFreeRight\uFF1A\u81EA\u7531\u6446\u653E\u65F6\u8BB0\u7684\u662F**\u53F3\u8FB9\u7F18**\uFF08\u6536\u7403/\u5C55\u5F00\u90FD\u4EE5\u53F3\u4FA7\u4E3A\u951A\u70B9\uFF1A\n * \u80F6\u56CA\u5411\u5DE6\u5C55\u5F00\u3001\u5411\u53F3\u6536\u6210\u7403\uFF0C\u53F3\u8FB9\u7F18\u4E00\u4E2A\u50CF\u7D20\u90FD\u4E0D\u52A8 \u2014\u2014 \u7528\u6237\u8981\u7684\u5C31\u662F\u8FD9\u4E2A\uFF09\u3002\n * \u8BB0\u4E2D\u5FC3\u662F\u4E0D\u884C\u7684\uFF1A\u6536\u7403\u65F6\u53F3\u8FB9\u7F18\u4F1A\u5F80\u5DE6\u8DD1\uFF0C\u7403\u770B\u8D77\u6765\"\u98D8\"\u4E86\u4E00\u4E0B\u3002\n * \u00B7 pillAnchorWidth\uFF1A\u672C\u6B21\u91CF\u5230\u7684\u8D39\u7528\u80F6\u56CA\u5BBD\u5EA6\uFF080 = \u6CA1\u91CF\u5230\uFF09\u2014\u2014 \u51B3\u5B9A\"\u8DDF\u968F\"\u8FD8\u662F\"\u515C\u5E95\"\uFF0C\n * \u4E5F\u662F\"\u80FD\u4E0D\u80FD\u6536\u7403\"\u7684\u524D\u63D0\uFF08\u7528\u6237\u5B9A\u7684\uFF1A\u53EA\u6709\u6CA1\u6709\u8D39\u7528\u80F6\u56CA\u65F6\u624D\u6536\u6210\u5C0F\u7403\uFF09\u3002\n */\n /** \u80F6\u56CA\u603B\u5F00\u5173\uFF1Ahost \u7684 pillEnabled \u8BF4\u5173\u5C31\u5173\uFF08\u89C1\u4E0B\u9762 ping \u5206\u652F\uFF09\u3002 */\n var pillHidden = false\n\n var pillDock = 'anchor'\n\n var pillFreeRight = null\n\n var pillBall = false\n\n var pillHover = false\n\n var pillDrag = null\n\n /** \u521A\u62D6\u5B8C\u7684\u90A3\u4E00\u4E0B click \u8981\u541E\u6389\uFF08\u62D6\u52A8\u4E0D\u8BE5\u987A\u624B\u5F00\u5173\u5C0F\u7A97\uFF09\u3002 */\n var pillDragMoved = false\n\n /** \u9759\u7F6E\u8BA1\u65F6\u5668 id\uFF080 = \u6CA1\u6709\uFF09\u3002\u7528\u88F8 setTimeout\uFF1A\u5B83\u6BCF\u5E27\u90FD\u53EF\u80FD\u88AB\u91CD\u7F6E\uFF0C\u585E\u8FDB timers \u6570\u7EC4\u4F1A\u4E00\u76F4\u957F\u3002 */\n var pillIdleId = 0\n\n /**\n * \u5438\u9644\u6ED1\u884C\u7A97\u53E3\u7684\u622A\u6B62\u65F6\u523B\uFF08\u89C1 settlePillDrop / placePill\uFF09\uFF1A\n * \u8FD9\u6BB5\u65F6\u95F4\u5185\u4F4D\u7F6E\u6309 left/top \u7EF4\u6301\uFF08\u80FD\u8FC7\u6E21\uFF09\uFF0C\u4E4B\u540E\u518D\u4EA4\u8FD8\u7ED9 right/bottom \u7684\u7A33\u6001\u5B9A\u4F4D\u3002\n */\n var pillSnapUntil = 0\n\n var pillAnchorWidth = 0\n\n var pillPlacerId = 0\n\n /** \u4E0A\u4E00\u6B21\u91CF\u5230\u7684\u8D39\u7528\u80F6\u56CA\u5BB9\u5668 / \u6B63\u5728\u89C2\u5BDF\u5B83\u7684 ResizeObserver\uFF08\u6D4F\u89C8\u5668\u6CA1\u6709\u8FD9\u4E2A API \u65F6\u4E3A null\uFF09\u3002 */\n var pillHost = null\n\n var pillWatched = null\n\n var pillObserver = null\n\n /** \u6B63\u5728\u663E\u793A\u7684\u7B49\u5F85\u7279\u6548\uFF08\u6BCF\u4E2A\u5BB9\u5668\u4E00\u6761\uFF1B\u540C\u5904\u540C\u6587\u6848\u590D\u7528\u8282\u70B9\uFF0C\u907F\u514D\u91CD\u5EFA\u6253\u65AD\u52A8\u753B\uFF09\u3002 */\n var waitList = []\n\n function later(fn, ms) {\n var id = setTimeout(fn, ms)\n timers.push(id)\n return id\n }\n\n /**\n * \u5E27\u5185\u6865\u62A5\u8FC7\u6765\u7684\u9009\u533A\uFF1A\u6362\u7B97\u5750\u6807 \u2192 \u590D\u7528\u540C\u4E00\u5957\u6D6E\u6807\u4E0E\u9762\u677F\u3002\n *\n * \u53EA\u8BA4\"\u6211\u4EEC\u6865\u8FC7\u7684\u5E27\"\u53D1\u6765\u7684\u6D88\u606F\uFF08`frameBySource`\uFF09\u3002\n * \u5C0F\u7A97\u5F00\u7740\u65F6\u5B83\u8D70**\u5F15\u7528**\u90A3\u6761\u8DEF\uFF08\u5212\u4FA7\u8FB9\u680F\u7F51\u9875\u91CC\u7684\u6587\u5B57\uFF0C\u540C\u6837\u80FD\u6302\u8FDB\u8F93\u5165\u6846\uFF09\uFF1B\n * \u5C0F\u7A97\u5173\u7740\u65F6\u624D\u662F\u300C\u2726 \u89E3\u8BFB\u300D\uFF08\u8981\u5212\u65B0\u8BCD\u5F00\u65B0\u7A97\uFF0C\u5148\u6309 Esc \u6536\u8D77\u5F53\u524D\u8FD9\u6247\uFF09\u3002\n */\n var offBridgeMessage = listen(window, 'message', function (event) {\n var data = event && event.data\n if (!previewController.bridgeOn || !data || data.__dshSel !== 1) return\n var frame = previewController.frameBySource(event.source)\n if (!frame) return\n // \u8FD9\u6761\u6D88\u606F\u672C\u8EAB\u5C31\u662F\"\u7528\u6237\u6B64\u523B\u6B63\u5728\u90A3\u4E2A\u7F51\u9875\u91CC\"\u7684\u8BC1\u636E\uFF08\u89C1 hasFocusEvidence\uFF09\n previewController.frameTouchedAt.set(frame, Date.now())\n if (data.kind === 'press') {\n // \u5E27\u5185\u6309\u4E0B\uFF1A\u4E0E\u4E3B\u4F1A\u8BDD\u4E00\u81F4\u2014\u2014\u5148\u6536\u6D6E\u6807\u3002\u7236\u9875\u9762\u6536\u4E0D\u5230\u5E27\u5185\u7684 mousedown\uFF0C\n // \u5C11\u4E86\u8FD9\u4E00\u6761\uFF0C\u5728\u7F51\u9875\u91CC\u70B9\u4E00\u4E0B\uFF08\u53D6\u6D88\u9009\u533A\u3001\u70B9\u522B\u5904\u3001\u70B9\u53E6\u4E00\u4E2A\u7F51\u9875\uFF09\u6D6E\u6807\u5C31\u8D56\u7740\u4E0D\u8D70\u3002\n if (state.selection && state.selection.source === 'iframe' && state.selection.frame !== frame) {\n // \u70B9\u7684\u662F**\u53E6\u4E00\u4E2A**\u5E27\uFF1A\u90A3\u6761\u9009\u533A\u5DF2\u7ECF\u4E0D\u662F\u7528\u6237\u6B64\u523B\u5728\u770B\u7684\u4E86\uFF0C\u8FDE\u72B6\u6001\u4E00\u8D77\u6E05\n state.selection = null\n state.bridgeActive = false\n }\n selectionController.hideButton()\n voiceCardController.hideQuoteButton()\n // \u5361\u7247\u5F00\u7740\u65F6\u540C\u7406\u8981\u6536\u5361\u7247\uFF08\u4E0E\u4E3B\u4F1A\u8BDD\"\u70B9\u522B\u5904\u5C31\u6536\u5361\"\u540C\u4E00\u6761\u89C4\u5219\uFF1A\u90A3\u8FB9\u9760 document \u4E0A\u7684\n // mousedown\uFF0C\u5E27\u5185\u7684\u70B9\u51FB\u7236\u9875\u9762\u6536\u4E0D\u5230\uFF09\u3002suppress \u4E5F\u8981\u7F6E\u4E0A\uFF0C\u5426\u5219\u4E0B\u4E00\u62CD\u8F6E\u8BE2\u53D1\u73B0\n // \"\u8FD8\u5728\u5F55\"\u4F1A\u628A\u5361\u7247\u53C8\u5F39\u56DE\u6765 \u2014\u2014 Esc \u90A3\u6761\u8DEF\u540C\u6837\u662F\u8FD9\u4E48\u5904\u7406\u7684\u3002\n if (voiceCardController.vcardState.open && state.selection && state.selection.frame === frame) {\n voiceCardController.vcardState.suppress = true\n voiceCardController.closeVCard(true)\n }\n return\n }\n if (data.kind === 'clear') {\n if (state.selection && state.selection.frame === frame) {\n state.bridgeActive = false\n // \u26A0\uFE0F \u5361\u7247\u5F00\u7740\u65F6**\u4E0D\u6E05\u9009\u533A**\uFF1A\u62A2\u7126\u70B9\u5FC5\u7136\u8BA9\u5E27\u5185\u9009\u533A\u584C\u6389\uFF08\u8F93\u5165\u6CD5\u4E0A\u5C4F\u8981\u7684\u6B63\u662F\u7126\u70B9\uFF09\uFF0C\n // \u6865\u4E8E\u662F\u62A5 clear \u2014\u2014 \u4F46\u7528\u6237\u9009\u7684\u90A3\u6BB5\u6587\u5B57\u4ECD\u7136\u662F\u8FD9\u4E00\u8F6E\u7684\u89E3\u8BFB\u5BF9\u8C61\uFF08\u53D1\u9001\u65F6\u8981\u7528\u5B83\uFF0C\n // \u9EA6\u514B\u98CE\u8F6E\u8BE2\u4E5F\u8981\u9760 state.selection \u5224\u65AD\"\u8BF4\u5B8C\u4E86\u6CA1\u6709\"\uFF09\u3002\n // \u672C\u6587\u6863\u90A3\u6761\u8DEF\u662F\u4E00\u81F4\u7684\uFF1A\u9876\u5C42\u9009\u533A\u88AB\u62A2\u7126\u70B9\u641E\u584C\u65F6\u4E5F\u53EA\u6536\u6D6E\u6807\uFF0C\u4E0D\u6E05 state.selection\u3002\n if (!voiceCardController.vcardState.open) state.selection = null\n selectionController.hideButton()\n voiceCardController.hideQuoteButton()\n }\n return\n }\n if (data.kind !== 'selection' || !data.sel) return\n if (!frame.isConnected) return\n var text = String(data.sel.text || '')\n if (!text.trim() || text.length > preferences.maxSelectionChars) return\n var rect = previewController.mapFrameRect(frame, data.sel.rect)\n if (!rect) {\n // \u9009\u533A\u6EDA\u51FA\u5E27\u7684\u53EF\u89C6\u533A\uFF1A\u628A\u6D6E\u6807\u6536\u6389\uFF08\u5E27\u5185\u518D\u6EDA\u56DE\u6765\u4F1A\u91CD\u65B0\u62A5\uFF09\n if (state.selection && state.selection.frame === frame) {\n selectionController.hideButton()\n voiceCardController.hideQuoteButton()\n }\n return\n }\n state.selection = {\n text: text.trim(),\n /** 'document'\uFF08\u9876\u5C42\u9009\u533A\uFF0C\u7F3A\u7701\uFF09| 'iframe'\uFF08\u4FA7\u8FB9\u680F\u7F51\u9875\uFF0C\u4E0A\u4E0B\u6587\u7531\u5E27\u5185\u6865\u7ED9\uFF09\u3002 */\n source: 'iframe',\n frame: frame,\n rect: rect,\n frameRect: data.sel.rect,\n context: String(data.sel.context || ''),\n keyContext: String(data.sel.keyContext || ''),\n label: previewController.labelForFrame(frame, data.sel.label),\n }\n state.bridgeActive = true\n // \u5361\u7247\u5F00\u7740\u65F6\uFF0C\u5E27\u5185\u7684\u91CD\u62A5\uFF08\u6EDA\u52A8 / \u6539\u5C3A\u5BF8 / \u632A\u9009\u533A\uFF09\u53EA\u662F\"\u90A3\u6BB5\u6587\u5B57\u52A8\u4E86\"\uFF1A\n // \u8DDF\u7740\u632A\u5361\u7247\u4E0E\u951A\u70B9\uFF0C**\u4E0D\u8981**\u518D\u6D6E\u51FA\u6D6E\u6807\uFF08\u6D6E\u6807\u4E0E\u5361\u7247\u662F\u4E92\u65A5\u7684\u4E24\u6001\uFF09\u3002\n if (voiceCardController.vcardState.open) {\n if (state.selection.frame === frame) {\n voiceCardController.vcardState.anchorRect = rect\n voiceCardController.repositionVCard()\n return\n }\n // \u53E6\u4E00\u5E27\u62A5\u4E86\u65B0\u9009\u533A\uFF1A\u8FD9\u5F20\u5361\u5DF2\u7ECF\u4E0D\u662F\u7528\u6237\u5728\u770B\u7684\u4E1C\u897F\u4E86\uFF0C\u6536\u6389\u518D\u6309\u65B0\u9009\u533A\u8D70\n voiceCardController.closeVCard(true)\n }\n if (panelOpen) {\n // \u5C0F\u7A97\u5F00\u7740\uFF1A\u5E27\u5185\u8FD9\u6761\u9009\u533A\u4E5F\u53EA\u662F\"\u4E00\u6BB5\u53EF\u4EE5\u5F15\u7528\u7684\u6587\u5B57\"\uFF08\u4E0A\u4E0B\u6587\u7531\u5E27\u5185\u7684\u6865\u7ED9\uFF09\n state.quoteSelection = {\n text: text.trim(),\n label: state.selection.label || '\u4FA7\u8FB9\u680F\u7F51\u9875',\n source: 'iframe',\n rect: rect,\n context: String(state.selection.context || ''),\n turnIndex: -1,\n }\n selectionController.showQuoteButton(rect)\n return\n }\n selectionController.showButton(rect)\n })\n\n // \u4FA7\u8FB9\u680F\u91CC\u7684\u9884\u89C8\u5E27\u662F\u5BBF\u4E3B React \u6E32\u67D3\u7684\uFF1A\u65B0\u5F00\u6807\u7B7E\u3001\u5207\u9884\u89C8/\u6E90\u7801\u3001\u6587\u4EF6\u53D8\u4E86\u90FD\u4F1A\u6362\u5E27\uFF0C\n // \u6240\u4EE5\u65E2\u8981\u521D\u59CB\u626B\u4E00\u904D\uFF0C\u4E5F\u8981\u76EF\u7740 DOM\uFF08\u53EA\u76EF srcdoc/src \u4E24\u4E2A\u5C5E\u6027 + \u5B50\u8282\u70B9\u589E\u5220\uFF09\u3002\n if (typeof MutationObserver === 'function') {\n previewController.bridgeObserver = new MutationObserver(previewController.scheduleBridgeScan)\n previewController.bridgeObserver.observe(document.body || document.documentElement, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['srcdoc', 'src'],\n })\n }\n\n previewController.scheduleBridgeScan()\n\n // \u2014\u2014 \u4E8B\u4EF6 \u2014\u2014\n\n // \u52A8\u753B\u7ED3\u675F\u5C31\u6458\u6389\u52A8\u6548\u7C7B\uFF1A`.dsh-sel-btn-pop` \u7528\u4E86 fill:both\uFF0C\n // \u4E0D\u6458\u7684\u8BDD transform \u4F1A\u4E00\u76F4\u88AB\u52A8\u753B\u9489\u5728 none \u4E0A\uFF0C`:active` \u7684\u6309\u538B\u7F29\u653E\u5C31\u6C38\u8FDC\u4E0D\u751F\u6548\n var offPopEnd = listen(button, 'animationend', function () {\n selectionController.setButtonPop(false)\n })\n\n var offQuotePopEnd = listen(quoteButton, 'animationend', function () {\n selectionController.setQuotePop(false)\n })\n\n /**\n * \u9F20\u6807\u662F\u4E0D\u662F\u6309\u7740\uFF08\u62D6\u62FD\u5212\u8BCD\u8FDB\u884C\u4E2D\uFF09\u2014\u2014 \u8BB0\u7684\u662F\"\u6309\u4E0B\u90A3\u4E00\u523B\"\u3002\n *\n * \u4E3A\u4EC0\u4E48\u8BB0\u65F6\u523B\u800C\u4E0D\u662F\u8BB0\u4E00\u4E2A\u5E03\u5C14\uFF1A\u677E\u624B\u843D\u5728\u6D4F\u89C8\u5668\u7A97\u53E3\u5916\u65F6**\u4E0D\u4F1A\u8865\u53D1 mouseup**\uFF0C\n * \u5E03\u5C14\u4E00\u65E6\u5361\u5728 true\uFF0C`selectionchange` \u5C31\u88AB\u6C38\u4E45\u5FFD\u7565 \u2014\u2014 \u6D6E\u6807\u4ECE\u6B64\u518D\u4E5F\u4E0D\u4F1A\u81EA\u5DF1\u6536\u4E86\u3002\n * \u8D85\u8FC7 SELECT_PRESS_STALE_MS \u5C31\u5F53\u5DF2\u7ECF\u677E\u5F00\uFF08\u5E27\u5185\u90A3\u6761\u6865\u7528\u7684\u662F\u540C\u4E00\u4E2A\u515C\u5E95\uFF0C\u89C1 bridgeBody\uFF09\u3002\n *\n * \u62D6\u62FD\u671F\u95F4\u4E00\u5F8B\u4E0D\u67E5\u9009\u533A\uFF1A\u65F6\u673A\u8981\u548C\"\u677E\u624B\u624D\u5F39\u6D6E\u6807\"\u4E00\u81F4\uFF0C\u5426\u5219\u62D6\u5230\u4E00\u534A\u6D6E\u6807\u5C31\u5192\u51FA\u6765\uFF0C\n * \u8FD8\u8DDF\u7740\u624B\u6307\u8DD1\u3002\n */\n var SELECT_PRESS_STALE_MS = 6000\n\n var selectPressedAt = 0\n\n function selectPressing() {\n return selectPressedAt > 0 && Date.now() - selectPressedAt < SELECT_PRESS_STALE_MS\n }\n\n var offMouseUp = listen(document, 'mouseup', function (event) {\n selectPressedAt = 0\n // \u9762\u677F\u91CC\u7684 mouseup **\u4E5F\u8981\u8D70\u4E00\u6B21\u68C0\u67E5**\uFF1A\u5C0F\u7A97\u5F00\u7740\u65F6\"\u5212\u5C0F\u7A97\u6B63\u6587\"\u6B63\u662F\u300C\u5F15\u7528\u300D\u7684\u4E3B\u5165\u53E3\n // \uFF08\u65E9\u5148\u8FD9\u91CC\u5BF9\u9762\u677F\u76F4\u63A5 return \u2014\u2014 \u90A3\u662F\"\u9762\u677F\u91CC\u5212\u8BCD\u4E00\u5F8B\u4E0D\u7BA1\"\u5E74\u4EE3\u7684\u5199\u6CD5\uFF0C\n // \u7ED3\u679C\u5C31\u662F\u5C0F\u7A97\u91CC\u5212\u8BCD\u6BEB\u65E0\u53CD\u5E94\uFF0C\u53EA\u6709\u6C14\u6CE1\u672B\u5C3E\u7684\u300C\u5F15\u7528\u6574\u6761\u300D\u80FD\u7528\uFF09\u3002\n if (button.contains(event.target) || quoteButton.contains(event.target)) return\n selectionController.scheduleCheck()\n }, true)\n\n var offKeyUp = listen(document, 'keyup', function (event) {\n if (event.key === 'Shift' || event.key === 'Control' || event.key === 'Meta' || event.key.indexOf('Arrow') === 0) {\n selectionController.scheduleCheck()\n }\n }, true)\n\n /**\n * \u9009\u4E2D\u7684\u6587\u5B57**\u6CA1\u4E86** \u2192 \u6D6E\u6807\u8DDF\u7740\u6D88\u5931\u3002\n *\n * \u4E3A\u4EC0\u4E48\u975E\u8981\u6709\u8FD9\u4E00\u6761\uFF1A\u6D6E\u6807\u53EA\u5728 mouseup \u548C\u5C11\u6570\u51E0\u4E2A\u952E\u7684 keyup \u4E4B\u540E\u88AB\u68C0\u67E5\uFF0C\n * \u800C\"\u628A\u9009\u4E2D\u7684\u5B57\u5220\u6389\"\u8FD9\u4E24\u79CD\u52A8\u4F5C\u90FD\u4E0D\u5728\u90A3\u6761\u8DEF\u5F84\u4E0A \u2014\u2014\n * \u00B7 Backspace / Delete / \u76F4\u63A5\u6253\u5B57\u8986\u76D6 / \u526A\u5207 / \u64A4\u56DE\uFF08\u2318Z\uFF09\uFF1B\n * \u00B7 \u5185\u5BB9\u5237\u65B0\u628A\u9009\u4E2D\u7684\u8282\u70B9\u6574\u4E2A\u6362\u6389\uFF08\u6D41\u5F0F\u56DE\u7B54\u91CD\u6E32\u67D3\u3001\u6D88\u606F\u91CD\u753B\uFF09\u3002\n * \u4E8E\u662F\u6D6E\u6807\u8D56\u5728\u5C4F\u5E55\u4E0A\u4E0D\u8D70\uFF0C\u70B9\u4E0B\u53BB\u8FD8\u4F1A\u89E3\u8BFB\u4E00\u6BB5**\u5C4F\u5E55\u4E0A\u5DF2\u7ECF\u4E0D\u5B58\u5728**\u7684\u6587\u5B57\uFF08\u7528\u6237\u62A5\u7684\u6B63\u662F\u8FD9\u4E2A\uFF09\u3002\n *\n * `selectionchange` \u662F\u6D4F\u89C8\u5668\u5BF9\"\u9009\u533A\u53D8\u4E86\"\u6700\u6743\u5A01\u7684\u4FE1\u53F7\uFF08\u584C\u9677 / \u88AB\u5220 / \u88AB\u7A0B\u5E8F\u6539\u52A8\u90FD\u4F1A\u53D1\uFF09\uFF0C\n * \u7528\u5B83\u515C\u4F4F\u6240\u6709\u975E\u9F20\u6807\u8DEF\u5F84\uFF1B\u8282\u70B9\u88AB\u6458\u6389\u4F46\u9009\u533A\u6CA1\u584C\u9677\u90A3\u79CD\uFF08Firefox\uFF09\u53E6\u6709 selectionDetached \u5224\u6B7B\u3002\n */\n var offSelectionChange = listen(document, 'selectionchange', function () {\n if (selectPressing()) return\n selectionController.scheduleCheck()\n }, true)\n\n /**\n * Esc \u6536\u8BED\u97F3\u5361\u3002\n *\n * \u7528 capture \u62A2\u5728\u6700\u524D\u9762\uFF1A\u5361\u7247\u662F\u5F53\u4E0B\u6700\u5185\u5C42\u7684\u4E1C\u897F\uFF0CEsc \u8BE5\u5148\u9000\u5B83\n * \uFF08\u5C0F\u7A97\u90A3\u5957 Esc \u662F\"\u4ECE\u6700\u5185\u5C42\u5F80\u5916\u9000\"\uFF0C\u8FD9\u91CC\u662F\u540C\u4E00\u6761\u89C4\u5219\u5F80\u5916\u591A\u5305\u4E00\u5C42\uFF09\u3002\n * \u5DF2\u7ECF\u8BF4\u51FA\u6765\u7684\u5B57**\u4E22\u6389**\uFF1A\u5361\u8FD8\u6CA1\u53D1\u51FA\u53BB\uFF0C\u53D6\u6D88\u5C31\u662F\u53D6\u6D88\uFF1B\u8981\u7559\u7740\u5C31\u5148\u70B9\u53D1\u9001\u3002\n */\n var offVoiceEscape = listen(document, 'keydown', function (event) { handleVoiceCardEscape(event, { document: document, vcardState: voiceCardController.vcardState, closeVCard: voiceCardController.closeVCard }) }, true)\n\n /**\n * \u6D6E\u6807\u4EAE\u7740\u7684\u65F6\u5019\uFF0C\u9694\u51E0\u62CD\u786E\u8BA4\u4E00\u6B21\"\u90A3\u6BB5\u6587\u5B57\u8FD8\u5728\u4E0D\u5728\"\u3002\n *\n * \u4E3A\u4EC0\u4E48\u5149\u6709\u4E8B\u4EF6\u8FD8\u4E0D\u591F\uFF1A**Chrome \u628A\u9009\u4E2D\u7684\u8282\u70B9\u6574\u4E2A\u6458\u6389\u65F6\u4F1A\u6084\u6084\u628A\u9009\u533A\u584C\u9677\uFF0C\u5374\u4E0D\u53D1\n * `selectionchange`**\uFF08\u771F\u6D4F\u89C8\u5668\u5B9E\u6D4B\uFF1A\u66FF\u6362 textContent \u540E `rangeCount` \u4ECD\u662F 1\u3001\n * `isCollapsed` \u53D8\u6210 true\uFF0C\u800C\u4E8B\u4EF6\u8BA1\u6570\u4E00\u4E2A\u90FD\u4E0D\u6DA8\uFF09\u3002\u6D41\u5F0F\u56DE\u7B54\u91CD\u6E32\u67D3 / \u6D88\u606F\u91CD\u753B\u8D70\u7684\u6B63\u662F\u8FD9\u6761\u8DEF \u2014\u2014\n * \u53EA\u9760\u4E8B\u4EF6\u7684\u8BDD\uFF0C\u6D6E\u6807\u4F1A\u4E00\u76F4\u4EAE\u7740\uFF0C\u70B9\u4E0B\u53BB\u89E3\u8BFB\u7684\u662F\u4E00\u6BB5\u5C4F\u5E55\u4E0A\u5DF2\u7ECF\u6CA1\u6709\u7684\u6587\u5B57\u3002\n *\n * \u4EE3\u4EF7\u662F\u53EF\u63A7\u7684\uFF1A**\u53EA\u5728\u6D6E\u6807\u53EF\u89C1\u7684\u90A3\u51E0\u62CD\u91CC\u5E72\u6D3B**\uFF08\u5B83\u4E0D\u53EF\u89C1\u65F6\u8FD9\u4E00\u62CD\u7ACB\u523B\u8FD4\u56DE\uFF0C\n * \u8FDE\u9009\u533A\u90FD\u4E0D\u8BFB\uFF09\uFF0C\u800C\u4E14\u53EA\u6709\u53D1\u73B0\u9009\u533A\u6CA1\u4E86/\u951A\u70B9\u88AB\u6458\u6389\u65F6\u624D\u53BB\u6392\u4E00\u6B21\u68C0\u67E5 \u2014\u2014\n * \u6B63\u5E38\u4EAE\u7740\u7684\u90A3\u51E0\u62CD\u4E0D\u505A\u4EFB\u4F55 DOM \u5199\u3002\n */\n var FLOAT_WATCH_MS = 400\n\n function watchFloatLiveness() {\n // \u62D6\u62FD\u5212\u8BCD\u8FDB\u884C\u4E2D\u4E0D\u67E5\uFF1A\u6D6E\u6807\u8981\u7B49\u677E\u624B\u624D\u51FA\u73B0\uFF08\u4E0E mouseup \u90A3\u6761\u8DEF\u5F84\u540C\u4E00\u5957\u65F6\u673A\uFF09\n if (selectPressing()) return\n if (button.style.display !== 'inline-flex' && quoteButton.style.display !== 'inline-flex') return\n var selection = window.getSelection && window.getSelection()\n if (!selection || selection.rangeCount === 0 || selection.isCollapsed) {\n // \u5E27\u5185\u90A3\u6761\u9009\u533A**\u4E0D\u5728\u672C\u6587\u6863**\uFF1A\u70B9\u6D6E\u6807\u4F1A\u8BA9\u672C\u6587\u6863\u7684\u9009\u533A\u584C\u6389\uFF0C\u522B\u628A\u5B83\u8BEF\u5F53\u6210\"\u6587\u5B57\u6CA1\u4E86\"\n if (state.bridgeActive && state.selection && state.selection.source === 'iframe') return\n selectionController.scheduleCheck()\n return\n }\n var range = null\n try {\n range = selection.getRangeAt(0)\n } catch (error) {\n return\n }\n // \u9009\u533A\u6CA1\u584C\u9677\u3001\u951A\u70B9\u5374\u88AB\u6458\u6389\u4E86\uFF08Firefox \u7684\u884C\u4E3A\uFF09\uFF1A\u4E5F\u5F53\"\u6587\u5B57\u6CA1\u4E86\"\n if (selectionDetached(range)) selectionController.scheduleCheck()\n }\n\n var floatWatchId = setInterval(watchFloatLiveness, FLOAT_WATCH_MS)\n\n var offMouseDown = listen(document, 'mousedown', function (event) {\n selectPressedAt = Date.now()\n var target = event.target\n // \u6A21\u578B\u83DC\u5355\uFF1A\u70B9\u5B83\u81EA\u5DF1\u548C\u80F6\u56CA\u4E4B\u5916**\u4EFB\u4F55\u5730\u65B9**\u90FD\u6536\u8D77\u3002\n // \u5FC5\u987B\u653E\u5728\u6700\u524D\u9762 \u2014\u2014 \u4E0B\u9762\u7684 historyButton / pill / panel \u5206\u652F\u90FD\u4F1A return\uFF0C\n // \u653E\u5728\u540E\u9762\u5C31\u4F1A\u88AB\u77ED\u8DEF\u6389\uFF08\u5B9E\u6D4B\uFF1A\u70B9\u4E86\u522B\u5904\u83DC\u5355\u4E0D\u5173\uFF09\u3002\n if (modelMenu.getAttribute('data-open') === '1' && !modelMenu.contains(target) && !modelPill.contains(target)) {\n modelsController.closeModelMenu()\n }\n if (historyList.contains(target)) return // \u5217\u8868\u5185\u90E8\uFF1A\u884C\u81EA\u5DF1\u5904\u7406\n if (historyButton.contains(target)) return // \u300C\u6700\u8FD1\u300D\u5F00\u5173\u81EA\u5DF1 toggle\n if (button.contains(target)) return // \u6D6E\u6807\n if (quoteButton.contains(target)) return // \u5F15\u7528\u6D6E\u6807\uFF1A\u70B9\u5B83\u4E0D\u80FD\u5148\u628A\u81EA\u5DF1\u6536\u6389\n // \u72B6\u6001\u80F6\u56CA\uFF1A\u5B83\u81EA\u5DF1\u5C31\u662F\u5F00\u5173\uFF0C\u70B9\u5B83\u7684 mousedown \u4E0D\u80FD\u88AB\u5F53\u6210\"\u70B9\u4E86\u5916\u9762\"\uFF08\u5426\u5219\u5148\u5173\u540E\u5F00\uFF0C\u770B\u7740\u50CF\u6CA1\u53CD\u5E94\uFF09\n if (pill.contains(target)) return\n // \u5230\u8FD9\u91CC\u8BF4\u660E\u70B9\u7684\u4E0D\u662F\u4FA7\u8FB9\u680F\u672C\u8EAB\uFF1A**\u542B\u9762\u677F\u6B63\u6587**\uFF08\u6D88\u606F\u533A/\u8F93\u5165\u6846/\u9009\u4E2D\u6587\u5B57\uFF09\u5728\u5185\uFF0C\n // \u4E00\u5F8B\u5148\u628A\u4FA7\u8FB9\u680F\u6536\u56DE\u2014\u2014\u5B83\u662F\u7528\u5B8C\u5C31\u8D70\u7684\u5BFC\u822A\uFF0C\u4E0D\u8BE5\u7B49\u4F60\u70B9\u4E86\"\u5916\u9762\"\u624D\u6536\u3002\n historyController.hideHistoryList()\n if (panel.contains(target)) return // \u9762\u677F\u5185\u7684\u70B9\u51FB\u53EA\u6536\u4FA7\u8FB9\u680F\uFF0C\u4E0D\u5173\u9762\u677F\n selectionController.hideButton()\n voiceCardController.hideQuoteButton()\n // \u70B9\u9762\u677F\u5916**\u4E0D\u5173\u5C0F\u7A97**\uFF08\u65E0\u8BBA\u6709\u6CA1\u6709\u8FFD\u95EE\u8FC7\uFF09\uFF1A\u7B54\u6848\u7559\u5728\u539F\u5730\uFF0C\u53EA\u6709 \u2715 / Esc / \u80F6\u56CA\u80FD\u6536\u3002\n // \u66FE\u7ECF\u7684\u89C4\u5219\u662F\"\u6CA1\u8FFD\u95EE\u8FC7\u624D\u5173\"\uFF0C\u4F46\u90A3\u4F1A\u8BA9\u7528\u6237\u5728\u8BFB\u7B2C\u4E00\u5C4F\u7FFB\u8BD1\u65F6\u88AB\u8BEF\u5173\uFF08\u70B9\u4E00\u4E0B\u522B\u5904\u5C31\u6CA1\u4E86\uFF09\u3002\n }, true)\n\n // \u8BA9\u6309\u94AE\u541E\u6389 mousedown\uFF1A\u70B9\u51FB\u65F6\u4E0D\u7834\u574F\u9009\u533A\u9AD8\u4EAE\n var offButtonDown = listen(button, 'mousedown', function (event) {\n event.preventDefault()\n event.stopPropagation()\n })\n\n var offButtonClick = listen(button, 'click', function (event) {\n event.preventDefault()\n event.stopPropagation()\n var selection = state.selection\n if (selection) panelController.openForSelection(selection)\n })\n\n // \u5F15\u7528\u6D6E\u6807\uFF1A\u541E\u6389 mousedown\uFF08\u70B9\u4E86\u4E0D\u80FD\u628A\u9009\u533A\u6253\u6563\u3001\u4E5F\u4E0D\u80FD\u8BA9\u9762\u677F\u5931\u7126\uFF09\uFF0C\n // \u70B9\u4E00\u4E0B = \u628A\u8FD9\u6BB5\u6587\u5B57\u6302\u8FDB\u8F93\u5165\u6846\u7684\u5F15\u7528\u533A\uFF0C\u7136\u540E\u81EA\u5DF1\u6536\u8D77\u6765\uFF08\"\u5DF2\u7ECF\u8FDB\u53BB\u4E86\"\u7684\u4FE1\u53F7\uFF09\n var offQuoteDown = listen(quoteButton, 'mousedown', function (event) {\n event.preventDefault()\n event.stopPropagation()\n })\n\n var offQuoteClick = listen(quoteButton, 'click', function (event) {\n event.preventDefault()\n event.stopPropagation()\n var selection = state.quoteSelection\n if (!selection) return\n // \u4E0A\u4E0B\u6587\u5728\u8FD9\u91CC\u624D\u91C7\uFF1A\u5F15\u7528**\u5F53\u65F6**\u5728\u54EA\u4E00\u6BB5\u5BF9\u8BDD\u91CC\uFF0C\u662F\u8FD9\u6761\u5F15\u7528\u6700\u6709\u7528\u7684\u4FE1\u606F\n quotesController.addQuote(selection.text, selection.label, quotesController.quoteContextFor(selection))\n voiceCardController.hideQuoteButton()\n })\n\n var offScroll = listen(window, 'scroll', function (event) {\n selectionController.hideButton()\n voiceCardController.hideQuoteButton()\n // \u9875\u9762/\u9762\u677F\u6EDA\u52A8\u4E5F\u6536\u56DE\u4FA7\u8FB9\u680F\uFF1B\u6EDA\u52A8\u5217\u8868\u81EA\u8EAB\u4E0D\u7B97\uFF08\u5B83\u6709\u81EA\u5DF1\u7684\u6EDA\u52A8\u6761\uFF09\u3002\n // event.target \u4E0D\u4E00\u5B9A\u662F Node\uFF08\u5408\u6210\u4E8B\u4EF6\u53EF\u80FD\u662F window\uFF09\uFF0Ccontains \u4F1A\u629B\uFF0C\u5F97\u81EA\u5DF1\u6321\u4E00\u9053\n var target = event && event.target\n var insideList = !!(target && target.nodeType && historyList.contains(target))\n if (historyList.style.display === 'flex' && !insideList) historyController.hideHistoryList()\n }, true)\n\n var offModelPill = listen(modelPill, 'click', function (event) {\n event.preventDefault()\n event.stopPropagation()\n modelsController.modelPillClicks += 1\n if (modelMenu.getAttribute('data-open') === '1') modelsController.closeModelMenu()\n else modelsController.openModelMenu()\n })\n\n var offModelMenu = listen(modelMenu, 'click', function (event) {\n event.stopPropagation() // \u83DC\u5355\u5185\u90E8\u70B9\u51FB\u4E0D\u8981\u89E6\u53D1\"\u70B9\u5230\u5916\u9762\"\n })\n\n var offModelKeys = listen(modelMenu, 'keydown', function (event) {\n if (event.key === 'Escape' && !document.querySelector('[role=\"dialog\"][aria-modal=\"true\"]')) modelsController.closeModelMenu()\n })\n\n state.webAnswer = modelsController.readWebMode()\n\n modelsController.paintWebMode()\n\n // \u6A21\u578B/\u6863\u4F4D\uFF1A\u4ECE localStorage \u6062\u590D\uFF1B\u6CA1\u5B58\u8FC7\u5C31\u8DDF\u968F\"\u5F53\u524D\u8DEF\u7531 + \u914D\u7F6E\u6863\u4F4D\"\uFF08ping \u91CC\u5C31\u6709\uFF09\n // \u4ECE host \u7684\u7EDF\u4E00\u8BBE\u7F6E\u6062\u590D\u6A21\u578B\uFF0C\u4E0D\u8BFB\u53D6\u65E7\u6D4F\u89C8\u5668\u6A21\u578B\u8986\u76D6\u3002\n settingsController.loadSettings(false)\n\n // \u300C\u8FFD\u95EE\u300D\u6863\u4F4D\u4E0D\u518D\u6709\u6D4F\u89C8\u5668\u672C\u5730\u8986\u76D6\uFF1A\u8BBE\u7F6E\u9875\u90A3\u4E00\u884C\u3001\u5C0F\u7A97\u90A3\u56DB\u4E2A\u683C\u5B50\u3001\u53D1\u51FA\u53BB\u7684\u8BF7\u6C42\n // \u8BFB\u7684\u90FD\u662F\u540C\u4E00\u4EFD\u914D\u7F6E\uFF08chatReasoningEffort\uFF0C\u52A0\u8F7D\u5B8C\u7531 applyServerValues \u540C\u6B65\u8FDB state.effort\uFF09\n modelsController.paintModelPill()\n\n fetch(PING + (panelController.currentSessionId() ? '?sessionId=' + encodeURIComponent(panelController.currentSessionId()) : ''), {\n headers: { accept: 'application/json' },\n })\n .then(function (response) {\n return response.json()\n })\n .then(function (data) {\n modelsController.modelCatalog.current = (data && data.route) || null\n modelsController.modelCatalog.stages = { chat: (data && data.reasoningEffortByStage && data.reasoningEffortByStage.chat) || '' }\n if (!settingsController.settingsSpec && data && data.limits) settingsController.applySelectionLimit(data.limits)\n // \u4FA7\u8FB9\u680F\u7F51\u9875\u5212\u8BCD\u6865\u7684\u603B\u5F00\u5173\uFF08host \u914D\u7F6E bridgeSidebarPreview\uFF0C\u9ED8\u8BA4\u5F00\uFF09\n if (data && data.bridgeSidebarPreview === false) previewController.bridgeOn = false\n // \u60AC\u6D6E\u80F6\u56CA\u7684\u4E24\u4E2A\u504F\u597D\u8DDF\u7740 ping \u4E00\u8D77\u4E0B\u53D1\uFF08\u7701\u5F97\u4E3A\u5B83\u5355\u5F00\u4E00\u6B21\u8BF7\u6C42\uFF09\u3002\n // \u62FF\u4E0D\u5230\u5C31\u4FDD\u6301\u9ED8\u8BA4\uFF08\u663E\u793A + 10 \u79D2\u6536\u7403\uFF09\u2014\u2014 ping \u5931\u8D25\u4E0D\u8BE5\u8BA9\u80F6\u56CA\u6D88\u5931\u3002\n if (data && data.pill) settingsController.applyPillPrefs(data.pill)\n modelsController.paintModelPill()\n return null\n })\n .catch(function () {\n /* ping \u5931\u8D25\u4E0D\u5F71\u54CD\u4F7F\u7528\uFF1A\u80F6\u56CA\u663E\u793A\u9ED8\u8BA4\u6587\u6848 */\n })\n\n // \u70B9\u54EA\u4E00\u683C\u5C31\u9009\u54EA\u4E00\u683C\uFF08\u4E0D\u518D\"\u70B9\u4E00\u4E0B\u7FFB\u8F6C\"\uFF09\u2014\u2014\u5206\u6BB5\u63A7\u4EF6\u7684\u6807\u51C6\u884C\u4E3A\n var offCellMd = listen(cellMd, 'click', function (event) {\n event.preventDefault()\n event.stopPropagation()\n modelsController.setPref(false)\n })\n\n var offCellWeb = listen(cellWeb, 'click', function (event) {\n event.preventDefault()\n event.stopPropagation()\n modelsController.setPref(true)\n })\n\n // \u952E\u76D8\uFF1A\u5DE6\u53F3\u65B9\u5411\u952E\u5728\u4E24\u683C\u95F4\u5207\u6362\uFF08radiogroup \u60EF\u4F8B\uFF1BEnter/Space \u7531 button \u539F\u751F\u652F\u6301\uFF09\n var offPrefKeys = listen(prefSeg, 'keydown', function (event) {\n var key = event && event.key\n if (key !== 'ArrowLeft' && key !== 'ArrowRight') return\n event.preventDefault()\n modelsController.setPref(key === 'ArrowRight', true)\n })\n\n var offPillDown = listen(pill, 'mousedown', function (event) {\n // \u62D6\u62FD/\u5212\u8BCD\u7684\u624B\u52BF\u4E0D\u8BE5\u88AB\u80F6\u56CA\u63A5\u8D70\n event.preventDefault()\n event.stopPropagation()\n pillController.beginPillDrag(event)\n })\n\n var offPillClick = listen(pill, 'click', function (event) {\n event.preventDefault()\n event.stopPropagation()\n // \u521A\u62D6\u5B8C\u7684\u90A3\u4E00\u4E0B\u4E0D\u7B97\u70B9\u51FB\uFF08\u5426\u5219\u62D6\u5230\u522B\u5904\u4F1A\u987A\u624B\u628A\u62BD\u5C49\u5F00\u5F00\u5173\u5173\uFF09\n if (pillDragMoved) {\n pillDragMoved = false\n return\n }\n pillController.reopenLast()\n pillController.notePillActivity()\n })\n\n // \u9F20\u6807\u505C\u5728\u4E0A\u9762\u5C31\u4E0D\u6536\u7403\uFF08\u8981\"\u70B9\u5F97\u5230\"\uFF0C\u4E0D\u662F\"\u85CF\u8D77\u6765\"\uFF09\uFF1B\u79BB\u5F00\u65F6\u91CD\u65B0\u5F00\u59CB\u9759\u7F6E\u8BA1\u65F6\n var offPillEnter = listen(pill, 'mouseenter', function () {\n pillHover = true\n pillController.notePillActivity()\n })\n\n var offPillLeave = listen(pill, 'mouseleave', function () {\n pillHover = false\n pillController.notePillActivity()\n })\n\n var offPillKey = listen(pill, 'keydown', function (event) {\n if (event.key !== 'Enter' && event.key !== ' ') return\n event.preventDefault()\n pillController.reopenLast()\n pillController.notePillActivity()\n })\n\n /**\n * \u9884\u89C8\u9875\u628A\u81EA\u8EAB\u9AD8\u5EA6\u62A5\u8FC7\u6765\uFF08\u89C1 adaptPreviewHtml \u6CE8\u5165\u7684 hook\uFF09\u2192 \u76F4\u63A5\u957F\u5230\u5185\u5BB9\u90A3\u4E48\u9AD8\uFF0C\n * \u6846\u91CC\u5C31\u4E0D\u4F1A\u51FA\u73B0\u90A3\u6761\u788D\u773C\u7684\u6EDA\u52A8\u6761\uFF1B\u8D85\u8FC7\u4E0A\u9650\u624D\u56DE\u843D\u6210\u5185\u90E8\u6EDA\u52A8\uFF08\u4E0A\u9650\u8DDF\u7740\u9762\u677F\u53EF\u89C6\u9AD8\u5EA6\u8D70\uFF09\u3002\n */\n var offPreviewHeight = listen(window, 'message', function (event) {\n var data = event && event.data\n // \u7528\u771F\u503C\u5224\u65AD\u800C\u4E0D\u662F `!== true`\uFF1A\u6CE8\u5165\u7AEF\u53D1\u8FC7 1\uFF08\u6570\u5B57\uFF09\uFF0C\u4E25\u683C\u76F8\u7B49\u4F1A\u628A\u81EA\u5BB6\u6D88\u606F\u6321\u6389\uFF08\u5B9E\u6D4B\u8E29\u8FC7\uFF09\n if (!data || !data.__dshPreview) return\n var item = previewFrames[String(data.id || '')]\n if (!item || !item.frame) return\n var frame = item.frame\n try {\n // \u53EA\u8BA4\u8FD9\u4E00\u5E27\u53D1\u6765\u7684\uFF08\u6D88\u606F\u53EF\u4EE5\u88AB\u4EFB\u610F\u9875\u9762\u4F2A\u9020\uFF0C\u6765\u6E90\u5FC5\u987B\u5BF9\u5F97\u4E0A\uFF09\n if (frame.contentWindow && event.source !== frame.contentWindow) return\n } catch (error) {\n return\n }\n var reported = Math.max(140, Number(data.h) || 0)\n if (!reported) return\n var current = Number(frame.getAttribute('data-preview-h')) || 0\n if (Math.abs(reported - current) < 4) return\n frame.setAttribute('data-preview-h', String(reported))\n // \u5168\u91CF\u6A21\u5F0F\uFF1A\u76F4\u63A5\u957F\u5230\u5185\u5BB9\u9AD8\u5EA6\uFF08\u5185\u90E8\u4E0D\u6EDA\u52A8\uFF09\uFF1B\u8FD8\u539F\u6A21\u5F0F\uFF1A\u6E05\u6389 inline \u9AD8\u5EA6\uFF0C\u7528 CSS \u7684 320px\n applyPreviewHeight(frame, frame.parentNode && frame.parentNode.parentNode)\n })\n\n // \u8D39\u7528\u80F6\u56CA\u7684\u4F4D\u7F6E/\u5C3A\u5BF8\u4F1A\u53D8\uFF08\u5C55\u5F00\u3001\u7F29\u653E\u3001\u6570\u5B57\u53D8\u957F\u3001\u63D2\u4EF6\u8FDF\u5230\u6302\u8F7D\uFF09\u2192 \u81EA\u9002\u5E94\u9891\u7387\u5730\u8D34\u4E0A\u53BB\n pillController.loadPillPos()\n // \u5148\u95EE\u4E00\u53E5\u4E0A\u6B21\u62D6\u5230\u54EA\u513F\uFF08\u5F02\u6B65\uFF0C\u56DE\u6765\u518D\u6446\uFF09\n panelController.loadPanelSize()\n // \u5C0F\u7A97\u7684\u5C3A\u5BF8\u4E5F\u95EE\u4E00\u53E5\uFF08\u62D6\u89D2\u6539\u8FC7\u4E4B\u540E\u624D\u6709\u7684\u503C\uFF1B\u4F4D\u7F6E\u4E0D\u8BB0\uFF09\n pillController.placePill()\n\n pillController.ensureResizeWatch()\n\n pillController.schedulePillPlacer()\n\n pillController.paintPill()\n\n // \u8FC7\u6E21\u8981\u7B49\"\u7B2C\u4E00\u5E27\u5DF2\u7ECF\u8D34\u597D\u4F4D\u7F6E\"\u4E4B\u540E\u518D\u6253\u5F00\uFF1A\u5426\u5219\u6302\u8F7D\u90A3\u4E00\u4E0B\u4F1A\u4ECE CSS \u9ED8\u8BA4\u7684 bottom:64\n // \u4E00\u8DEF\u6ED1\u5230\u5B9E\u6D4B\u4F4D\u7F6E\uFF08\u53F3\u4E0B\u89D2\u770B\u7740\u50CF\u81EA\u5DF1\u98DE\u8FC7\u53BB\uFF09\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(function () {\n pill.setAttribute('data-ready', '1')\n })\n } else {\n pill.setAttribute('data-ready', '1')\n }\n\n var offResize = listen(window, 'resize', function () {\n selectionController.hideButton()\n voiceCardController.hideQuoteButton()\n // \u5BBD\u5EA6\u53D8\u4E86 \u2192 \u6362\u884C\u4F4D\u7F6E\u53D8\u4E86 \u2192 \u8F93\u5165\u6846\u9AD8\u5EA6\u8981\u91CD\u91CF\uFF08\u5426\u5219\u4F1A\u662F\u6309\u65E7\u5BBD\u5EA6\u7B97\u51FA\u6765\u7684\u9AD8\u5EA6\uFF09\n conversationController.autoGrowAskBox()\n // \u62D6\u7A97\u53E3\u53D8\u5C0F\u540E\uFF0C\u9762\u677F\u672C\u8EAB\u4E5F\u8981\u62C9\u56DE\u89C6\u53E3\u5185\uFF08\u5426\u5219\u5386\u53F2\u5217\u8868\u4F1A\u8DDF\u7740\u7B97\u5230\u5C4F\u5E55\u5916\uFF09\n panelController.keepInsideViewport()\n if (historyList.style.display === 'flex') historyController.placeHistoryList()\n // \u7A97\u53E3\u5C3A\u5BF8\u53D8\u4E86\uFF1A\u7ACB\u523B\u91CF\u4E00\u6B21\uFF0C\u5E76\u628A\u8282\u594F\u8C03\u56DE\u6700\u5FEB\n pillController.placePill()\n pillPollDelay = PILL_POLL_MIN\n })\n\n var offKeyDown = listen(document, 'keydown', function (event) { handlePanelEscape(event, { document: document, panelOpen: panelOpen, panel: panel, historyList: historyList, captureRow: captureRow, settingsOpen: settingsController.settingsOpen, settingsByKey: settingsController.settingsByKey, closeModelPicks: settingsController.closeModelPicks, closeSettings: settingsController.closeSettings, cancelVoice: voiceController.cancelVoice, closePanel: panelController.closePanel }) }, true)\n\n var offSettingsOpen = listen(settingsButton, 'click', function (event) {\n event.stopPropagation()\n if (settingsController.settingsOpen) settingsController.closeSettings()\n else settingsController.openSettings()\n })\n\n var offSettingsBack = listen(settingsBack, 'click', function (event) {\n event.stopPropagation()\n settingsController.closeSettings()\n })\n\n var offSettingsClose = listen(settingsClose, 'click', function (event) {\n event.stopPropagation()\n settingsController.closeSettings()\n })\n\n var offSettingsReset = listen(settingsReset, 'click', function (event) {\n event.stopPropagation()\n settingsController.resetSettings()\n })\n\n // \u62BD\u5C49\u91CC\u4E0D\u8BE5\u89E6\u53D1\u8D77\u62D6\u9762\u677F / \u5212\u8BCD\uFF1A\u6574\u4E2A\u62BD\u5C49\u541E\u6389 mousedown \u7684\u5192\u6CE1\n var offSettingsStop = listen(settingsSheet, 'mousedown', function (event) {\n event.stopPropagation()\n })\n\n // \u70B9\u62BD\u5C49\u91CC\u7684\u7A7A\u767D\u5904\uFF08\u6B63\u6587 / \u5206\u7C7B\u680F\uFF09\u628A\u6A21\u578B\u4E0B\u62C9\u6536\u6389 \u2014\u2014 \u70B9\u83DC\u5355\u5185\u90E8\u4E0D\u4F1A\u8D70\u5230\u8FD9\u91CC\uFF08\u884C\u81EA\u5DF1 stopPropagation\uFF09\n var offSettingsPickAway = listen(settingsSheet, 'click', function () {\n settingsController.closeModelPicks()\n })\n\n var offSettingsScrim = listen(settingsScrim, 'click', function (event) {\n event.stopPropagation()\n settingsController.closeSettings()\n })\n\n var offHistory = listen(historyButton, 'click', function (event) {\n event.stopPropagation()\n historyController.toggleHistoryList()\n })\n\n var offPromote = listen(promoteButton, 'click', function (event) {\n event.stopPropagation()\n conversationController.promote()\n })\n\n var offRetry = listen(retryButton, 'click', function (event) {\n event.stopPropagation()\n conversationController.regenerate()\n })\n\n var offExpand = listen(expandButton, 'click', function (event) {\n event.stopPropagation()\n conversationController.expandDetail()\n })\n\n var offAskKey = listen(askBox, 'keydown', function (event) {\n if (event.key !== 'Enter' || event.shiftKey) return\n // \u8F93\u5165\u6CD5\uFF08\u4E2D\u6587/\u65E5\u6587\u2026\uFF09\u5728\u7EC4\u5408\u671F\u95F4\u6309 Enter \u662F\"\u786E\u8BA4\u5019\u9009\u8BCD\"\uFF0C\u4E0D\u662F\u53D1\u9001\uFF1A\n // \u8FD9\u65F6 askBox.value \u5F80\u5F80\u8FD8\u662F\u7A7A\u7684\uFF0C\u7167\u53D1\u4F1A\u6E05\u7A7A\u8F93\u5165\u6846 + \u53D1\u7A7A\u5185\u5BB9 \u2192 \u770B\u8D77\u6765\"\u6CA1\u53CD\u5E94\"\n if (event.isComposing === true || event.keyCode === 229) return\n event.preventDefault()\n event.stopPropagation()\n var question = askBox.value\n // \u7A7A\u8F93\u5165\u6846\u7167\u53D1**\u53EA\u5728\u6302\u4E86\u5F15\u7528\u65F6**\u6210\u7ACB\uFF08\u5F15\u7528\u672C\u8EAB\u5C31\u662F\u7528\u6237\u8981\u9001\u51FA\u53BB\u7684\u5185\u5BB9\uFF09\n if (!question.trim() && state.quotes.length === 0) return\n // \u6E05\u7A7A\u4EA4\u7ED9 ask()\uFF1A\u5B83\u6536\u4E0B\u624D\u6E05\uFF08\u751F\u6210\u4E2D\u88AB\u62D2\u65F6\u4FDD\u7559\u4F60\u6253\u7684\u5B57\uFF09\n conversationController.ask(question)\n })\n\n var offAskInput = listen(askBox, 'input', function () {\n conversationController.refreshAskState()\n })\n\n var offAskSend = listen(askSend, 'click', function (event) {\n event.stopPropagation()\n if (conversationController.isGenerating()) {\n conversationController.stopCurrent()\n return\n }\n var question = askBox.value\n if (!question.trim() && state.quotes.length === 0) return\n // \u6E05\u7A7A\u4EA4\u7ED9 ask()\uFF1A\u5B83\u6536\u4E0B\u624D\u6E05\n conversationController.ask(question)\n })\n\n var offMic = listen(micButton, 'click', function (event) {\n event.stopPropagation()\n voiceController.startVoice()\n })\n\n // \u5207\u8D70\u8FD9\u4E2A\u7A97\u53E3\uFF08\u6362\u5230\u522B\u7684 App\uFF09\u5C31\u505C\u6B62\u5F55\u97F3 \u2014\u2014 \u4E3B\u4F1A\u8BDD\u4E5F\u662F\u8FD9\u4E48\u505A\u7684\uFF1A\n // \u4EBA\u5DF2\u7ECF\u4E0D\u5728\u8BF4\u8BDD\u4E86\uFF0C\u7EE7\u7EED\u5360\u7740\u9EA6\u514B\u98CE\u53EA\u4F1A\u5F55\u4E00\u4E32\u73AF\u5883\u566A\u97F3\u3002\u8BC6\u522B**\u4E0D\u6253\u65AD**\uFF08\u90A3\u65F6\u97F3\u9891\u5DF2\u7ECF\u62FF\u5230\u4E86\uFF09\u3002\n var offVoiceBlur = listen(window, 'blur', function () {\n if (voiceController.voice.phase === 'recording') voiceController.cancelVoice()\n })\n\n var offVoiceCancel = listen(voiceCancel, 'click', function (event) {\n event.stopPropagation()\n // feedback \u9636\u6BB5\u70B9 \u2715 \u53EA\u662F\"\u5173\u6389\u8FD9\u6761\u63D0\u793A\"\uFF0C\u5176\u4F59\u9636\u6BB5\u662F\u53D6\u6D88\u8FD9\u6B21\u5F55\u97F3/\u8BC6\u522B\u3002\n // \u53D6\u6D88**\u4E0D\u5220\u5B57**\uFF1A\u5DF2\u7ECF\u8BF4\u51FA\u6765\u7684\uFF08\u542B\u534A\u53E5\u9884\u89C8\uFF09\u4E00\u5F8B\u7559\u5728\u8F93\u5165\u6846\u91CC\u3002\n voiceController.cancelVoice()\n })\n\n var offVoiceStop = listen(voiceStop, 'click', function (event) {\n event.stopPropagation()\n voiceController.finishVoice()\n })\n\n voiceController.paintVoice()\n\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 \u8BED\u97F3\u8F93\u5165\uFF08\u7ED3\u675F\uFF09 \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\n // \u7528\u6237\u81EA\u5DF1\u6EDA\u6D88\u606F\u533A\uFF08\u6EDA\u8F6E/\u89E6\u6478\uFF09\u2192 \u4E0D\u518D\u5F3A\u884C\u628A\u4ED6\u62C9\u56DE\u5E95\u90E8\n var offBodyWheel = listen(body, 'wheel', historyController.noteUserScroll)\n\n var offBodyTouch = listen(body, 'touchmove', historyController.noteUserScroll)\n\n var offBodyScroll = listen(body, 'scroll', historyController.noteBodyScroll)\n\n var offClose = listen(closeButton, 'click', function (event) {\n event.stopPropagation()\n panelController.closePanel()\n })\n\n var offDrag = listen(head, 'mousedown', function (event) {\n if (promoteButton.contains(event.target) || closeButton.contains(event.target)) return\n if (settingsButton.contains(event.target) || historyButton.contains(event.target)) return\n event.preventDefault()\n var rect = panelController.panelLayoutRect()\n var offsetX = event.clientX - rect.left\n var offsetY = event.clientY - rect.top\n panelController.panelInteracting = true\n var move = function (moveEvent) {\n panel.style.left = clamp(moveEvent.clientX - offsetX, 4, window.innerWidth - rect.width - 4) + 'px'\n panel.style.top = clamp(moveEvent.clientY - offsetY, 4, window.innerHeight - 40) + 'px'\n if (historyList.style.display === 'flex') historyController.placeHistoryList()\n }\n var up = function () {\n window.removeEventListener('mousemove', move, true)\n window.removeEventListener('mouseup', up, true)\n panelController.panelInteracting = false\n // **\u4E0D\u5B58\u4F4D\u7F6E**\uFF1A\u62D6\u52A8\u53EA\u5BF9\u8FD9\u4E00\u6B21\u6709\u6548\uFF1B\u4E0B\u6B21\u5F00\u7A97\u4ECD\u6309\u9009\u533A\u91CD\u65B0\u951A\u5B9A\u3002\n }\n window.addEventListener('mousemove', move, true)\n window.addEventListener('mouseup', up, true)\n })\n\n historyController.ensurePanelInsideViewport()\n\n panelController.bindResizeGrip(gripCorner, 'se')\n\n panelController.bindResizeGrip(gripRight, 'e')\n\n panelController.bindResizeGrip(gripBottom, 's')\n\n // \u7A97\u53E3\u53D8\u5C0F\uFF1A\u628A**\u5C3A\u5BF8**\u5939\u56DE\u53EF\u89C6\u533A\uFF08\u4F4D\u7F6E\u4E0D\u5F52\u8FD9\u91CC\u7BA1 \u2014\u2014 \u5B83\u7531 showPanel \u7684\u951A\u5B9A\u51B3\u5B9A\uFF09\n var offPanelResize = listen(window, 'resize', function () {\n if (!panelController.panelSize || panelController.panelInteracting) return\n var next = panelController.clampPanelSize({ w: panelController.panelSize.w, h: panelController.panelSize.h })\n if (next.w === panelController.panelSize.w && next.h === panelController.panelSize.h) return\n panelController.panelSize = next\n panelController.applyPanelSizeOnOpen()\n panelController.clampPanelPosition()\n panelController.savePanelSize()\n })\n\n // \u2014\u2014 \u8C03\u8BD5\u94A9\u5B50\uFF08\u81EA\u52A8\u5316\u9A8C\u8BC1\u7528\uFF09 \u2014\u2014\n window.__dshSelectionExplain = {\n /**\n * \u8BED\u97F3\u5361\uFF08\u9009\u4E2D\u6587\u5B57 + \u8F93\u5165\u6CD5\u6B63\u5728\u8BED\u97F3\u8F93\u5165 \u2192 \u5C31\u5730\u8FFD\u95EE\uFF09\u7684\u72B6\u6001\u3002\n * \u7ED9\u81EA\u52A8\u5316\u9A8C\u8BC1\u7528\uFF1A\u80FD\u4E0D\u80FD\u5F39\u3001\u6709\u6CA1\u6709\u7126\u70B9\u3001\u51E0\u4F55\u5BF9\u4E0D\u5BF9\uFF0C\u5168\u5728\u8FD9\u91CC\u8BFB\u3002\n */\n voiceCard: function () {\n return {\n open: voiceCardController.vcardState.open,\n closing: voiceCardController.vcardState.closing,\n watching: !!voiceCardController.vcardState.timer,\n /** \u6B63\u5728\u7B49\u6587\u5B57\u5B9A\u7A3F\uFF08\u677E\u624B\u540E\u8F93\u5165\u6CD5\u8FD8\u4F1A\u667A\u80FD\u6574\u7406\uFF09\uFF1BsettleFor = \u8DDD\u4E0A\u6B21\u6587\u5B57\u53D8\u5316\u591A\u4E45\uFF08\u6BEB\u79D2\uFF09\u3002 */\n settling: !!voiceCardController.vcardState.settleTimer,\n settleFor: voiceCardController.vcardState.settleStableAt ? Date.now() - voiceCardController.vcardState.settleStableAt : -1,\n voiced: !!(voiceCardController.vcard && voiceCardController.vcard.getAttribute('data-voiced') === '1'),\n hasText: !!(voiceCardController.vcard && voiceCardController.vcard.getAttribute('data-text') === '1'),\n text: voiceCardController.vcardBox ? voiceCardController.vcardBox.value : '',\n focused: !!(voiceCardController.vcardBox && document.activeElement === voiceCardController.vcardBox),\n geometry: voiceCardController.vcard\n ? {\n left: voiceCardController.vcard.style.left,\n top: voiceCardController.vcard.style.top,\n width: voiceCardController.vcard.style.width,\n height: voiceCardController.vcard.style.height,\n }\n : null,\n }\n },\n /** \u624B\u5DE5\u628A\u5361\u6253\u5F00/\u6536\u8D77/\u53D1\u9001\uFF08\u6D4B\u8BD5\u4E0E\u8C03\u8BD5\u7528\uFF1B\u6B63\u5E38\u8DEF\u5F84\u7531\u9EA6\u514B\u98CE\u8F6E\u8BE2\u9A71\u52A8\uFF09\u3002 */\n /** \u8C03\u8BD5\uFF1A\u6700\u540E\u4E00\u6B21\u81EA\u52A8\u805A\u7126\u5361\u5728\u54EA\u4E00\u6B65\u3002 */\n focusBail: function () {\n return focusBail\n },\n /** \u91CD\u65B0\u62C9\u4E00\u6B21\u8BBE\u7F6E\uFF08\u6D4B\u8BD5\u7528\uFF1A\u8BBE\u7F6E\u53EA\u5728\u542F\u52A8\u65F6\u8BFB\u4E00\u6B21\uFF0C\u6869\u91CC\u6539\u5B8C\u503C\u8981\u80FD\u5237\u65B0\uFF09\u3002 */\n reloadSettings: function () {\n settingsController.loadSettings(true)\n return Object.assign({}, settingsController.settingsLive)\n },\n voiceCardOpen: function () {\n voiceCardController.openVCard()\n return window.__dshSelectionExplain.voiceCard()\n },\n voiceCardClose: function () {\n voiceCardController.closeVCard()\n return window.__dshSelectionExplain.voiceCard()\n },\n voiceCardSend: function (text) {\n if (voiceCardController.vcardBox && text !== undefined) {\n voiceCardController.vcardBox.value = String(text)\n voiceCardController.syncVCardText()\n }\n voiceCardController.sendVCard()\n return true\n },\n /** \u91CD\u65B0\u8BFB\u4E00\u6B21 host \u4E0A\u7684\u5C0F\u7A97\u5C3A\u5BF8\uFF08\u6D4B\u8BD5\u7528\uFF1B\u6B63\u5E38\u8DEF\u5F84\u53EA\u5728\u6302\u8F7D\u65F6\u8BFB\u4E00\u6B21\uFF09\u3002 */\n loadPanelSize: function () {\n panelController.panelSizeAsked = false\n panelController.loadPanelSize()\n return true\n },\n /** \u5F53\u524D\u5C0F\u7A97\u51E0\u4F55\uFF08\u6D4B\u8BD5\u7528\uFF1A\u76F4\u63A5\u8BFB\u6E32\u67D3\u503C\uFF0C\u4E0D\u7ECF\u8FC7\u53D8\u91CF\uFF09\u3002 */\n panelGeom: function () {\n var rect = panelController.panelLayoutRect()\n return { x: rect.left, y: rect.top, w: rect.width, h: rect.height, resized: panel.getAttribute('data-resized') === '1' }\n },\n /** \u91CD\u65B0\u8BFB\u4E00\u6B21 host \u4E0A\u7684\u80F6\u56CA\u4F4D\u7F6E\uFF08\u6D4B\u8BD5\u7528\uFF1B\u6B63\u5E38\u8DEF\u5F84\u53EA\u5728\u6302\u8F7D\u65F6\u8BFB\u4E00\u6B21\uFF09\u3002 */\n loadPillPos: function () {\n pillController.pillPosAsked = false\n pillController.pillUserPlaced = false // \u6D4B\u8BD5\u8981\u786E\u5B9A\u6027\u5730\u9A8C\"\u8BFB\u56DE\u6765\"\u8FD9\u6761\u8DEF\u5F84\n pillController.loadPillPos()\n return true\n },\n /** \u7403\u5FC3\u56FE\u5F62\u5728\u8FDB\u5EA6 p \u5904\u7684 path\uFF08p \u53EF\u7565\u8D8A\u754C\uFF09\u2014\u2014 \u6D4B\u8BD5\u6309\u5B83\u6838\u5BF9\u6574\u6761\u5F62\u53D8\u8F68\u8FF9\u3002 */\n pillStarAt: function (p) {\n return pillController.pillStarPathAt(p)\n },\n /** \u5F53\u524D\u8FDB\u5EA6\u4E0E\u76EE\u6807\uFF08\u6D4B\u8BD5\u6838\u5BF9\u6536/\u653E\u786E\u5B9E\u628A\u56FE\u5F62\u63A8\u5411\u4E86\u6B63\u786E\u7684\u4E00\u7AEF\uFF09\u3002 */\n pillStarProgress: function () {\n return pillController.pillStarP\n },\n pillStarTarget: function () {\n return pillController.pillStarTargetP\n },\n /** \u5F62\u53D8\u52A8\u753B\u88AB\u8D77\u8DD1\u4E86\u51E0\u6B21 + \u76EE\u6807\u5E8F\u5217\uFF08\u8BCA\u65AD\u7528\uFF1A\u4E00\u76F4\u91CD\u65B0\u8D77\u8DD1\u5C31\u6C38\u8FDC\u5230\u4E0D\u4E86\u7EC8\u70B9\uFF09\u3002 */\n pillStarStarts: function () {\n return pillController.pillStarStarts\n },\n pillStarLog: function () {\n return pillController.pillStarLog\n },\n /** \u76F4\u63A5\u8DD1\u4E00\u6B21\u5F62\u53D8\u52A8\u753B\uFF08\u4E0E\u80F6\u56CA\u72B6\u6001\u89E3\u8026\uFF09\uFF1A\u6D4B\u8BD5\u7528\u5B83\u786E\u5B9A\u6027\u5730\u9A8C\"\u8BA1\u65F6\u5668\u5728\u63A8\u8FDB\"\u3002 */\n pillStarAnimate: function (to) {\n pillController.animatePillStar(to ? 1 : 0)\n return true\n },\n /** \u540C\u6B65\u753B\u5230\u67D0\u4E2A\u8FDB\u5EA6\uFF08\u51E0\u4F55\u65AD\u8A00/\u622A\u56FE\u7528\uFF0C\u7ED5\u5F00\u8BA1\u65F6\u5668\u4E0E\u5F02\u6B65\u6D3B\u52A8\uFF09\u3002 */\n pillStarTo: function (p) {\n if (pillController.pillStarTimer) {\n clearTimeout(pillController.pillStarTimer)\n pillController.pillStarTimer = 0\n }\n pillController.pillStarTargetP = p\n pillController.paintPillStar(p)\n return true\n },\n pillStarEaseAt: function (x) {\n return pillController.pillStarEase(x)\n },\n /** JS \u90A3\u6761\u65F6\u957F\uFF08\u6BEB\u79D2\uFF09\u2014\u2014 \u6D4B\u8BD5\u6838\u5BF9\u5B83\u4E0E CSS \u90A3\u6761 .28s \u662F\u5426\u540C\u62CD\u3002 */\n pillMorphMs: function () {\n return PILL_MORPH_MS\n },\n /** \u7403\u5FC3\u91CC\u90A3\u4E24\u6761 path\uFF08\u5706\u70B9\u6001 / \u661F\u8292\u6001\uFF09\u2014\u2014 \u81EA\u68C0\u4E0E\u622A\u56FE\u6A21\u5F0F\u7528\u5B83\uFF0C\u907F\u514D\u5728\u6D4B\u8BD5\u91CC\u6284\u4E00\u904D\u51E0\u4F55\u3002 */\n pillStarD: function () {\n return PILL_STAR_D\n },\n pillStarDotD: function () {\n return PILL_STAR_DOT_D\n },\n open: function (text, context, label, keyContext) {\n state.selection = { text: text, range: null, rect: null }\n // \u548C\u771F\u5B9E\u5212\u8BCD\u5B8C\u5168\u540C\u4E00\u6761\u8DEF\u5F84\uFF08\u542B\u672C\u5730\u7F13\u5B58\u547D\u4E2D\uFF09\uFF1BkeyContext \u7701\u7565\u65F6\u4E0E context \u76F8\u540C\n panelController.openPanelWith(text, context || '', label || '\u8C03\u8BD5', null, keyContext)\n return true\n },\n expand: function () {\n conversationController.expandDetail()\n return true\n },\n parts: function () {\n return { ...state.parts, stage: state.stage }\n },\n promote: function () {\n conversationController.promote()\n return true\n },\n ask: function (question) {\n conversationController.ask(question)\n return true\n },\n turns: function () {\n return state.turns.slice()\n },\n /** \u81EA\u68C0\u7528\uFF1A\u5F53\u524D\u5F85\u53D1\u9001\u7684\u5F15\u7528\uFF08\u5F15\u7528\u533A\u91CC\u90A3\u51E0\u5F20\u5361\u7247\uFF09\u3002 */\n quotes: function () {\n return state.quotes.map(function (quote) {\n return {\n id: quote.id,\n label: quote.label,\n text: quote.text,\n context: quote.context || '',\n contextChars: (quote.context || '').length,\n session: quote.session === true,\n }\n })\n },\n /** \u81EA\u68C0\u7528\uFF1A\u624B\u5DE5\u52A0\u4E00\u6BB5\u5F15\u7528\uFF08\u7B49\u4EF7\u4E8E\u70B9\u4E86\u300C\u275D \u5F15\u7528\u300D/\u300C\u5F15\u7528\u6574\u6761\u300D\uFF09\u3002 */\n quote: function (text, label, extra) {\n return quotesController.addQuote(text, label || '\u8C03\u8BD5', extra || {})\n },\n /** \u81EA\u68C0\u7528\uFF1A\u67D0\u4E2A\u8282\u70B9\u4E0A\u7684\u9009\u533A\u4F1A\u88AB\u6807\u6210\u4EC0\u4E48\u51FA\u5904\uFF08\u7B49\u4EF7\u4E8E\u70B9\u5F15\u7528\u90A3\u4E00\u523B\u7B97\u51FA\u6765\u7684\u90A3\u4E2A\uFF09\u3002 */\n quoteLabel: function (node) {\n return node ? selectionController.panelSourceLabel(node) : '\uFF08\u9700\u8981\u4F20\u8282\u70B9\uFF09'\n },\n /** \u81EA\u68C0\u7528\uFF1A\u5F15\u7528 + \u63D0\u95EE\u62FC\u51FA\u6765\u7684\u90A3\u6761\u6D88\u606F\u539F\u6587\uFF08\u53D1\u7ED9\u6A21\u578B\u7684\u5C31\u662F\u5B83\uFF09\u3002 */\n compose: function (quotes, question) {\n return quotesController.composeQuestion(quotes || state.quotes, question)\n },\n /** \u81EA\u68C0\u7528\uFF1A\u5F15\u7528\u6D6E\u6807\u4E0E\u6700\u8FD1\u4E00\u6B21\u53EF\u5F15\u7528\u9009\u533A\u7684\u72B6\u6001\u3002 */\n quoteState: function () {\n return {\n visible: quoteButton.style.display === 'inline-flex',\n selection: state.quoteSelection\n ? {\n text: state.quoteSelection.text,\n label: state.quoteSelection.label,\n source: state.quoteSelection.source,\n turnIndex: state.quoteSelection.turnIndex === undefined ? -1 : state.quoteSelection.turnIndex,\n hasRange: !!state.quoteSelection.range,\n }\n : null,\n panelOpen: panelOpen,\n resolving: state.resolvingQuotes === true,\n }\n },\n /** \u81EA\u68C0\u7528\uFF1A\u5F15\u7528\u6D6E\u6807\u7684\u8282\u70B9\uFF08\u65E0\u5934\u73AF\u5883\u91CC\u9875\u9762\u53EF\u80FD\u6302\u4E86\u4E24\u68F5\u6811\uFF0C\u7528\u8FD9\u4E2A\u62FF\u771F\u6B63\u5E26\u76D1\u542C\u7684\u90A3\u4E2A\uFF09\u3002 */\n quoteNode: function () {\n return quoteButton\n },\n close: panelController.closePanel,\n /**\n * \u81EA\u68C0\u7528\uFF1A\u8BED\u97F3\u8F93\u5165\u7684\u72B6\u6001\uFF08\u9636\u6BB5 / \u63D0\u793A / \u76EE\u5F55 / \u6700\u8FD1\u4E00\u6B21\u8F6C\u5199\uFF09\u3002\n * phase\uFF1Aidle / requesting / recording / transcribing / done\n */\n voice: function () {\n return {\n phase: voiceController.voice.phase,\n supported: recordingSupported(),\n /** \u5F55\u97F3\u884C\u51FA\u6765\u4E86\u6CA1\u6709\uFF08\u51FA\u6765\u4E86 = \u5DE5\u5177\u884C\u6362\u6210\u4E86 \u2715 / \u6CE2\u5F62 / \u25A0 \u90A3\u4E00\u5957\uFF09\u3002 */\n capture: captureRow.getAttribute('data-show') === '1',\n /** \u72B6\u6001\u6587\u6848\uFF08\u8BF7\u5141\u8BB8\u4F7F\u7528\u9EA6\u514B\u98CE\u2026 / \u8BC6\u522B\u4E2D\u2026 / \u51FA\u9519\u539F\u56E0\uFF09\u3002 */\n activity: voiceActivityText.textContent,\n activityTone: voiceActivity.getAttribute('data-tone') || '',\n dot: voiceDot.style.display !== 'none',\n waveform: waveSvg.style.display !== 'none',\n stop: voiceStop.style.display !== 'none',\n /** \u884C\u5185\u52A8\u4F5C\uFF1A'prepare'\uFF08\u51C6\u5907\u6A21\u578B\uFF09/ 'retry'\uFF08\uD83C\uDFA4 \u91CD\u5F55\uFF09/ ''\u3002 */\n action: voiceController.voice.action || '',\n maxSeconds: voiceController.voice.maxSeconds || VOICE_FALLBACK_SECONDS,\n level: Number(voiceController.voice.level.toFixed(3)),\n lastText: voiceController.voice.lastText,\n /** \u6CE2\u5F62 80 \u6839\u7EBF\u7684\u9AD8\u5EA6\uFF08\u81EA\u68C0/\u5192\u70DF\u7528\uFF1A\u9759\u97F3\u65F6\u5168\u662F 2px \u7684\u57FA\u7EBF\uFF09\u3002 */\n bars: waveBars.map(function (bar) {\n return Number(bar.node.getAttribute('y2')) - Number(bar.node.getAttribute('y1'))\n }),\n /** \u5B9E\u65F6\u5B57\u5E55\uFF1A\u5B9A\u7A3F / \u534A\u53E5\u9884\u89C8 / \u62CD\u6570 / \u6709\u6CA1\u6709\u88AB\u6574\u6BB5\u8BC6\u522B\u6539\u5199\u8FC7\u3002 */\n live: {\n active: voiceController.voice.live.active,\n disabled: voiceController.voice.live.disabled,\n reason: voiceController.voice.live.reason,\n committed: voiceController.voice.live.committed,\n preview: voiceController.voice.live.preview,\n text: voiceController.voice.live.text,\n passes: { preview: voiceController.voice.live.passes.preview, commit: voiceController.voice.live.passes.commit },\n rewritten: voiceController.voice.live.rewritten,\n boundary: voiceController.voice.live.boundary,\n phraseStart: voiceController.voice.live.phraseStart,\n tap: voiceController.voice.capture && voiceController.voice.capture.tap && voiceController.voice.capture.tap.supported()\n ? {\n length: voiceController.voice.capture.tap.length(),\n loudIndex: voiceController.voice.capture.tap.loudIndex(),\n loudAt: voiceController.voice.capture.tap.loudAt(),\n }\n : null,\n },\n catalog: voiceController.voice.catalog\n ? {\n available: voiceController.voice.catalog.available === true,\n reason: voiceController.voice.catalog.reason || '',\n error: voiceController.voice.catalog.error || '',\n providers: (voiceController.voice.catalog.providers || []).map(function (provider) {\n return { id: provider.id, name: provider.name, phase: provider.phase }\n }),\n }\n : null,\n }\n },\n /** \u81EA\u68C0\u7528\uFF1A\u9EA6\u514B\u98CE\u6309\u94AE\u8282\u70B9\uFF08\u65E0\u5934\u73AF\u5883\u91CC\u9875\u9762\u53EF\u80FD\u6302\u4E86\u4E24\u68F5\u6811\uFF0C\u7528\u8FD9\u4E2A\u62FF\u771F\u6B63\u5E26\u76D1\u542C\u7684\u90A3\u4E2A\uFF09\u3002 */\n voiceNode: function () {\n return micButton\n },\n /** \u81EA\u68C0\u7528\uFF1A\u624B\u52A8\u50AC\u4E00\u62CD\u5B9E\u65F6\u5B57\u5E55\uFF08\u6D4B\u8BD5\u91CC\u4E0D\u7528\u5E72\u7B49 1.3s \u7684\u8282\u6D41\uFF09\u3002 */\n voiceTick: function () {\n voiceController.voice.live.tickAt = 0\n voiceController.liveTick()\n return true\n },\n /** \u81EA\u68C0\u7528\uFF1A\u5F55\u97F3\u884C\u7684\u5404\u90E8\u4EF6\uFF08\u2715 / \u6CE2\u5F62 / \u72B6\u6001 / \u52A8\u4F5C\u4F4D / \u25A0\uFF09\u3002 */\n voiceNodes: function () {\n return {\n row: captureRow,\n cancel: voiceCancel,\n wave: waveSvg,\n activity: voiceActivity,\n action: voiceActionSlot,\n stop: voiceStop,\n }\n },\n /** \u81EA\u68C0\u7528\uFF1A\u8BFB/\u5199\u8FFD\u95EE\u8F93\u5165\u6846\uFF08\u9A8C\u8BC1\"\u8F6C\u5199\u6587\u5B57\u63D2\u8FDB\u8F93\u5165\u6846\"\uFF09\u3002 */\n askValue: function (text) {\n if (text !== undefined) {\n askBox.value = String(text)\n conversationController.refreshAskState()\n }\n return askBox.value\n },\n /** \u81EA\u68C0\u7528\uFF1A\u6E05\u6389\u672C\u5730\u7F13\u5B58\uFF0C\u6A21\u62DF\"\u5237\u65B0\u9875\u9762\u540E\u91CD\u5F00\"\uFF08\u9A8C\u8BC1\u5386\u53F2\u56DE\u653E\u8DEF\u5F84\uFF09\u3002 */\n forget: function () {\n cache.clear()\n return true\n },\n state: function () {\n return {\n phase: state.phase,\n cache: state.cacheState,\n cacheKey: state.cacheKey.slice(0, 24),\n sameTextSeen: state.sameTextHint,\n chars: state.chars,\n /** host \u56DE\u62A5\u7684\u672C\u6B21\u8BF7\u6C42\u5B9E\u9645\u6863\u4F4D\uFF08\u7B49\u5F85\u63D0\u793A\u7528\uFF09\uFF1B\u548C\u7528\u6237\u9009\u7684 effort \u662F\u4E24\u7801\u4E8B */\n stageEffort: state.stageEffort,\n raw: state.raw,\n model: state.model,\n sections: splitSections(state.raw),\n tools: state.tools.length,\n toolBusy: state.toolBusy,\n toolDigest: state.toolDigest,\n /** \u81EA\u68C0\u7528\uFF1A\u6709\u6CA1\u6709\u5728\u98DE\u7684\u8BF7\u6C42 / \u662F\u4E0D\u662F\"\u6536\u8D77\u5C0F\u7A97\u4E2D\u6B62\"\u7684\u90A3\u4E00\u8F6E\u3002 */\n thought: state.thought,\n status: state.lastStatus,\n follow: state.follow,\n hasRequest: !!state.request,\n aborted: !!state.aborted,\n asking: !!state.asking,\n }\n },\n panel: function () {\n return panel\n },\n pill: function () {\n return pill\n },\n /** \u81EA\u68C0\u7528\uFF1A\u6A21\u578B/\u6863\u4F4D\u5F53\u524D\u503C + \u5DF2\u52A0\u8F7D\u7684\u76EE\u5F55\u89C4\u6A21\u3002 */\n modelState: function () {\n return {\n choice: state.modelChoice,\n effort: state.effort,\n pill: modelPillName.textContent + modelPillTier.textContent,\n menuOpen: modelMenu.getAttribute('data-open') === '1',\n catalog: { count: (modelsController.modelCatalog.items || []).length, current: modelsController.modelCatalog.current, stages: modelsController.modelCatalog.stages, error: modelsController.modelCatalog.error },\n }\n },\n /** \u81EA\u68C0\u7528\uFF1A\u6A21\u578B\u63A7\u4EF6\u8282\u70B9\uFF08\u65E0\u5934\u73AF\u5883\u91CC\u9875\u9762\u53EF\u80FD\u6302\u4E86\u4E24\u68F5\u6811\uFF0C\u7528\u8FD9\u4E2A\u62FF\u5230\u771F\u6B63\u5E26\u76D1\u542C\u7684\u90A3\u4E2A\uFF09\u3002 */\n modelNodes: function () {\n return { pill: modelPill, menu: modelMenu }\n },\n /** \u81EA\u68C0\u7528\uFF1A\u83DC\u5355\u5F00\u5408\u4E0E\u70B9\u51FB\u8BA1\u6570\u3002 */\n modelMenuDebug: function () {\n return { clicks: modelsController.modelPillClicks, open: modelMenu.getAttribute('data-open'), expanded: modelPill.getAttribute('aria-expanded') }\n },\n openModel: function () {\n modelsController.openModelMenu()\n return modelMenu.getAttribute('data-open')\n },\n /** \u81EA\u68C0\u7528\uFF1A\u62C9\u4E00\u6B21\u6A21\u578B\u76EE\u5F55\uFF08\u83DC\u5355\u4F1A\u81EA\u5DF1\u62C9\uFF0C\u8FD9\u91CC\u7ED9\u6D4B\u8BD5\u7528\uFF09\u3002 */\n loadModels: function (force) {\n return modelsController.loadModelCatalog(force === true).then(function (catalog) {\n modelsController.renderModelMenu()\n modelsController.paintModelPill()\n return { count: (catalog.items || []).length, current: catalog.current, stages: catalog.stages, error: catalog.error }\n })\n },\n /** \u81EA\u68C0\u7528\uFF1A\u6298\u53E0\u7EDF\u8BA1\u4E0E\"\u5373\u5C06\u53D1\u51FA\u53BB\u7684\u5386\u53F2\"\u3002 */\n foldStats: function () {\n return {\n folds: historyController.foldCount,\n turns: state.turns.map(function (turn) {\n return {\n role: turn.role,\n chars: String(turn.text || '').length,\n folded: typeof turn.foldedCache === 'string' ? turn.foldedCache.length : null,\n }\n }),\n }\n },\n /** \u81EA\u68C0\u7528\uFF1A\u624B\u5DE5\u6298\u4E00\u6BB5\u6587\u672C\uFF08\u9A8C\u8BC1\u6298\u53E0\u51FD\u6570\u672C\u8EAB\uFF09\u3002 */\n foldText: function (text) {\n return historyController.foldForHistory(text)\n },\n /** \u81EA\u68C0\u7528\uFF1A\u8BFB/\u5199\u7F51\u9875\u6A21\u5F0F\u5F00\u5173\u3002 */\n webMode: function () {\n return !!state.webAnswer\n },\n setWebMode: function (on) {\n return modelsController.setPref(on === true)\n },\n /** \u81EA\u68C0\u7528\uFF1A\u5F53\u524D\u6863\u4F4D\u7684 aria \u72B6\u6001\uFF08\u4E24\u683C\u5404\u81EA\u7684 aria-checked\uFF09\u3002 */\n prefCells: function () {\n return {\n markdown: cellMd.getAttribute('aria-checked') === 'true',\n web: cellWeb.getAttribute('aria-checked') === 'true',\n pillShift: webMode.getAttribute('data-on') === '1',\n }\n },\n /** \u81EA\u68C0\u7528\uFF1A\u624B\u52A8\u89E6\u53D1\u4E00\u6B21\"\u8D34\u5230\u8D39\u7528\u80F6\u56CA\u4E0A\"\uFF0C\u5E76\u62A5\u51FA\u8FD9\u6B21\u6709\u6CA1\u6709\u771F\u7684\u53D8\u3002 */\n place: function () {\n return pillController.placePill()\n },\n /**\n * \u81EA\u68C0\u7528\uFF1A\u80F6\u56CA\u7684\u505C\u9760 / \u62D6\u52A8 / \u6536\u7403\u72B6\u6001\u3002\n * \u62D6\u52A8\u3001\u5438\u9644\u3001\u6536\u7403\u90A3\u51E0\u6761\u65AD\u8A00\u90FD\u8BFB\u5B83\uFF08\u771F\u6D4F\u89C8\u5668\u91CC\u8DD1\uFF0C\u91CF\u7684\u662F\u771F\u5E03\u5C40\uFF09\u3002\n */\n pillState: function () {\n var rect = pill.getBoundingClientRect()\n return {\n dock: pillDock,\n ball: pillBall,\n hover: pillHover,\n dragging: !!pillDrag,\n ready: pill.getAttribute('data-ready') === '1',\n anchorWidth: pillAnchorWidth,\n freeRight: pillFreeRight ? { right: Math.round(pillFreeRight.right), y: Math.round(pillFreeRight.y) } : null,\n rect: {\n left: Math.round(rect.left),\n top: Math.round(rect.top),\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n right: Math.round(window.innerWidth - rect.right),\n bottom: Math.round(window.innerHeight - rect.bottom),\n },\n style: {\n left: pill.style.left,\n top: pill.style.top,\n right: pill.style.right,\n bottom: pill.style.bottom,\n width: pill.style.width,\n maxWidth: pill.style.maxWidth,\n },\n ballSize: PILL_BALL_SIZE,\n idleMs: preferences.pillIdleMs,\n snapRadius: PILL_SNAP_RADIUS,\n }\n },\n /**\n * \u81EA\u68C0\u7528\uFF1A\u7ACB\u523B\u8DD1\u4E00\u6B21\"\u9759\u7F6E\u8BE5\u4E0D\u8BE5\u6536\u7403\"\uFF08\u6D4B\u8BD5\u91CC\u7B49\u4E0D\u8D77 PILL_BALL_IDLE_MS \u90A3 10 \u79D2\uFF09\u3002\n * \u8FD4\u56DE true = \u8FD9\u6B21\u771F\u7684\u6536\u6210\u7403\u4E86\u3002\n */\n pillIdle: function () {\n if (pillIdleId) {\n clearTimeout(pillIdleId)\n pillIdleId = 0\n }\n if (!pillController.pillCanBall()) return false\n pillController.collapsePill()\n return true\n },\n /** \u81EA\u68C0\u7528\uFF1A\u5F53\u524D\u7684\u81EA\u9002\u5E94\u95F4\u9694\uFF08\u6BEB\u79D2\uFF09\u3002 */\n pollDelay: function () {\n return pillPollDelay\n },\n /** \u81EA\u68C0\u7528\uFF1A\u8D70\u4E00\u6B21\u8C03\u5EA6\u5668\u7684\u5355\u6B65\uFF08\u8D34\u4E00\u6B21 + \u6309\u7ED3\u679C\u8C03\u6574\u8282\u594F\uFF09\uFF0C\u8FD4\u56DE\u65B0\u7684\u95F4\u9694\u3002 */\n pollStep: function () {\n return pillController.pillPollStep()\n },\n /** \u81EA\u68C0\u7528\uFF1A\u6709\u6CA1\u6709\u7528\u4E0A ResizeObserver\uFF08\u6D4F\u89C8\u5668\u91CC\u6709\uFF0CNode \u6D4B\u8BD5\u73AF\u5883\u91CC\u6CA1\u6709\uFF09\u3002 */\n resizing: function () {\n return !!pillObserver\n },\n /**\n * \u81EA\u68C0\u7528\uFF1A\u4FA7\u8FB9\u680F\u7F51\u9875\u5212\u8BCD\u6865\u7684\u72B6\u6001\u3002\n * frames \u91CC\u7684\u6BCF\u4E00\u9879\u5BF9\u5E94\u4E00\u4E2A\"\u6865\u8FC7\u7684\u9884\u89C8\u5E27\"\uFF1Bown=true \u8868\u793A\u90A3\u4E00\u5E27\u7684\u6587\u6863\n * \u662F\u6211\u4EEC\u81EA\u5DF1\u91CD\u53D1\u8FC7\u7684 blob\uFF08\u4EA4\u4E92\u5F0F\u9884\u89C8\u8D70\u8FD9\u6761\uFF09\u3002\n */\n bridge: function () {\n var frames = []\n previewController.bridged.forEach(function (url, frame) {\n frames.push({\n connected: frame.isConnected === true,\n own: !!url,\n srcdoc: frame.getAttribute('srcdoc') !== null,\n sandbox: frame.getAttribute('sandbox'),\n })\n })\n return {\n on: previewController.bridgeOn,\n frames: frames,\n active: !!state.bridgeActive,\n selection: state.selection && state.selection.source === 'iframe' ? state.selection.text : '',\n }\n },\n /** \u81EA\u68C0\u7528\uFF1A\u626B\u4E00\u904D\u9884\u89C8\u5E27\uFF08\u7B49\u4EF7\u4E8E DOM \u53D8\u52A8\u540E\u7684\u90A3\u6B21\u81EA\u52A8\u626B\u63CF\uFF09\u3002 */\n bridgeScan: function () {\n previewController.scanPreviewFrames()\n return window.__dshSelectionExplain.bridge()\n },\n /** \u81EA\u68C0\u7528\uFF1A\u5F53\u524D\u9009\u533A\u7684\u6765\u6E90\u4E0E\u6807\u7B7E\uFF08source=iframe \u8868\u793A\u6765\u81EA\u4FA7\u8FB9\u680F\u7F51\u9875\u91CC\u7684\u6865\uFF09\u3002 */\n selection: function () {\n if (!state.selection) return null\n return {\n text: state.selection.text,\n source: state.selection.source || 'document',\n label: state.selection.label || '',\n context: state.selection.context || '',\n keyContext: state.selection.keyContext || '',\n }\n },\n /** \u81EA\u68C0\u7528\uFF1A\u6700\u8FD1\u4E00\u6B21\u8BF7\u6C42\u8F7D\u8377\u7684\u5173\u952E\u5B57\u6BB5\uFF08\u6807\u7B7E / \u4E0A\u4E0B\u6587 / \u9009\u4E2D\u6587\u5B57\uFF09\u3002 */\n payload: function () {\n if (!state.payload) return null\n return {\n text: state.payload.text,\n label: state.payload.label,\n context: state.payload.context,\n kind: state.payload.kind,\n stage: state.payload.stage,\n }\n },\n /** \u6A21\u62DF\"\u5237\u65B0\u9875\u9762\u540E\"\uFF1A\u5185\u5B58\u91CC\u90A3\u6BB5\u5C0F\u7A97\u6CA1\u4E86\uFF0C\u53EA\u5269 host \u4E0A\u7684\u5386\u53F2\u3002 */\n reset: function () {\n panelController.closePanel()\n state.payload = null\n state.selection = null\n state.bridgeActive = false\n state.parts = { translation: '', detail: '' }\n state.turns = []\n quotesController.clearQuotes()\n state.raw = ''\n state.phase = 'idle'\n state.error = ''\n state.chars = 0\n state.aborted = false\n state.asking = false\n state.cacheKey = ''\n quote.textContent = ''\n panelController.paint()\n historyController.renderTurns()\n return true\n },\n ping: function () {\n // \u5E26\u4E0A\u4F1A\u8BDD id\uFF1A\u5DE5\u5177\u662F\u6309\u4F1A\u8BDD\u4F5C\u7528\u57DF\u6CE8\u518C\u7684\uFF0C\u4E0D\u5E26\u5C31\u770B\u4E0D\u5230 web_search\n var id = panelController.currentSessionId()\n var url = PING + (id ? '?sessionId=' + encodeURIComponent(id) : '')\n return fetch(url).then(function (response) {\n return response.json()\n })\n },\n }\n\n // \u2014\u2014 \u53EF\u9006\u6E05\u7406 \u2014\u2014\n ctx.effect(function () {\n if (typeof console !== 'undefined' && console.log) {\n console.log('[dsh-selection-explain] \u5212\u8BCD\u89E3\u8BFB\u5DF2\u5C31\u7EEA\uFF08\u9009\u4E2D\u6587\u5B57\u8BD5\u8BD5\uFF09')\n }\n return function () {\n offPopEnd()\n offQuotePopEnd()\n offMouseUp()\n offKeyUp()\n offSelectionChange()\n offVoiceEscape()\n if (floatWatchId) clearInterval(floatWatchId)\n offMouseDown()\n offButtonDown()\n offButtonClick()\n offQuoteDown()\n offQuoteClick()\n offScroll()\n offResize()\n offKeyDown()\n offPromote()\n // \u8BBE\u7F6E\u62BD\u5C49\uFF1A\u6458\u6389\u5B83\u81EA\u5DF1\u90A3\u51E0\u6761\u76D1\u542C\uFF08\u62BD\u5C49 DOM \u968F\u9762\u677F\u4E00\u8D77\u9500\u6BC1\uFF09\n offSettingsOpen()\n offSettingsBack()\n offSettingsClose()\n offSettingsReset()\n offSettingsStop()\n offSettingsPickAway()\n offSettingsScrim()\n offRetry()\n offExpand()\n offAskKey()\n offAskInput()\n offAskSend()\n // \u8BED\u97F3\u8F93\u5165\uFF1A\u6458\u6389\u9EA6\u514B\u98CE\u76D1\u542C\uFF0C\u5E76\u628A\u6B63\u5728\u5F55/\u6B63\u5728\u8BC6\u522B\u7684\u8FD9\u4E00\u8F6E\u5F7B\u5E95\u4F5C\u5E9F\uFF08\u677E\u5F00\u9EA6\u514B\u98CE\uFF09\n offMic()\n offVoiceCancel()\n offVoiceStop()\n offVoiceBlur()\n voiceController.cancelVoice()\n offClose()\n offDrag()\n offPanelResize()\n offPillDown()\n offPillClick()\n offPillEnter()\n offPillLeave()\n offPillKey()\n offPreviewHeight()\n offBridgeMessage()\n offCellMd()\n offCellWeb()\n offPrefKeys()\n offModelPill()\n offModelMenu()\n offModelKeys()\n offBodyWheel()\n offBodyTouch()\n offBodyScroll()\n if (historyController.chatGrowWatch) historyController.chatGrowWatch.disconnect()\n if (historyController.panelGrowWatch) {\n historyController.panelGrowWatch.disconnect()\n historyController.panelGrowWatch = null\n }\n if (pillPlacerId) clearTimeout(pillPlacerId)\n if (pillObserver) {\n try {\n pillObserver.disconnect()\n } catch (error) {\n /* noop */\n }\n pillObserver = null\n }\n if (fullViewObserver) fullViewObserver.disconnect()\n if (typeof offSlot === 'function') offSlot()\n // \u5212\u8BCD\u6865\uFF1A\u6458\u89C2\u5BDF\u8005\u4E0E\u6D88\u606F\u76D1\u542C\uFF0C\u5E76\u628A\u6211\u4EEC\u81EA\u5DF1\u5EFA\u7684\u9884\u89C8 blob \u5168\u90E8\u56DE\u6536\n if (previewController.bridgeScanId) clearTimeout(previewController.bridgeScanId)\n previewController.bridgeScanId = 0\n if (previewController.bridgeObserver) {\n try {\n previewController.bridgeObserver.disconnect()\n } catch (error) {\n /* noop */\n }\n previewController.bridgeObserver = null\n }\n previewController.bridged.forEach(function (url) {\n if (!url) return\n try {\n URL.revokeObjectURL(url)\n } catch (error) {\n /* noop */\n }\n })\n previewController.bridged.clear()\n state.turns = []\n state.quotes = []\n if (state.request) state.request.abort()\n for (var i = 0; i < timers.length; i++) clearTimeout(timers[i])\n // \u9759\u7F6E\u8BA1\u65F6\u5668\u662F\u88F8 setTimeout\uFF08\u4E0D\u8FDB timers \u6570\u7EC4\uFF0C\u89C1 schedulePillIdle\uFF09\uFF0C\u5355\u72EC\u6E05\n if (pillIdleId) clearTimeout(pillIdleId)\n if (pillController.pillStarTimer) clearTimeout(pillController.pillStarTimer)\n cache.clear()\n if (layer.parentNode) layer.parentNode.removeChild(layer)\n if (button.parentNode) button.parentNode.removeChild(button)\n if (quoteButton.parentNode) quoteButton.parentNode.removeChild(quoteButton)\n if (panel.parentNode) panel.parentNode.removeChild(panel)\n if (pill.parentNode) pill.parentNode.removeChild(pill)\n if (styleEl.parentNode) styleEl.parentNode.removeChild(styleEl)\n try {\n delete window.__dshSelectionExplain\n } catch (error) {\n window.__dshSelectionExplain = undefined\n }\n }\n }, '@yfwu2020/dsh-selection-explain: \u5212\u8BCD\u89E3\u8BFB UI')\n}\nexport const inject = ['slots']\n", "export function handleVoiceCardEscape(event, env) {\n if (event.key !== 'Escape' || !env.vcardState.open || event.defaultPrevented) return\n if (env.document.querySelector('[role=\"dialog\"][aria-modal=\"true\"]')) return\n event.preventDefault()\n event.stopPropagation()\n env.vcardState.suppress = true\n env.closeVCard(true)\n }\n\nexport function handlePanelEscape(event, env) {\n if (event.key !== 'Escape' || !env.panelOpen || event.defaultPrevented || event.isComposing || event.keyCode === 229) return\n // \u5B98\u65B9\u6A21\u6001\u6D6E\u5C42\u7684 Esc \u5728\u5192\u6CE1\u9636\u6BB5\u5904\u7406\uFF1Bcapture \u4E0D\u6D88\u8D39\uFF0C\u5148\u8BA9\u5B98\u65B9\u8BBE\u7F6E\u7B49\u6D6E\u5C42\u9000\u51FA\u3002\n // \u63D2\u4EF6\u9762\u677F\u548C\u8BBE\u7F6E\u62BD\u5C49\u662F\u975E\u6A21\u6001 dialog\uFF0C\u4E0D\u5E26 aria-modal\uFF0C\u4E0D\u4F1A\u547D\u4E2D\u8FD9\u91CC\u3002\n if (env.document.querySelector('[role=\"dialog\"][aria-modal=\"true\"]')) return\n // \u5B8C\u6574\u89C6\u56FE\u8BB0\u5F55\u6700\u540E\u70B9\u51FB/\u64CD\u4F5C\u7684\u5C0F\u7A97\uFF1B\u4E0D\u80FD\u53EA\u770B\u53EF\u80FD\u505C\u5728\u53E6\u4E00\u7A97\u7684\u952E\u76D8\u7126\u70B9\u3002\n var fullViewFrame = env.document.querySelector('[data-dsh-full-view]')\n if (fullViewFrame) {\n var escapeTarget = event.target\n var canFindEscapeOwner = escapeTarget && typeof escapeTarget.closest === 'function'\n var expandedChatSelector = '[data-dsh-floating-chat]:not([data-dsh-chat-minimized]):not([data-dsh-chat-hidden])'\n var activeFloatingWindow = fullViewFrame.getAttribute('data-dsh-active-floating-window')\n if (activeFloatingWindow === 'chat' && env.document.querySelector(expandedChatSelector)) return\n // \u4E0E\u65E7\u7248\u5B8C\u6574\u89C6\u56FE\u5171\u5B58\u65F6\u4ECD\u4FDD\u7559\u539F\u6765\u7684\u952E\u76D8\u7126\u70B9\u5224\u65AD\u3002\n if (activeFloatingWindow === null && canFindEscapeOwner && escapeTarget.closest(expandedChatSelector)) return\n // \u5BBF\u4E3B\u83DC\u5355\u53EF\u80FD\u6302\u5728\u804A\u5929\u5916\uFF1B\u8BA9\u5B83\u5148\u6D88\u8D39 Esc\uFF0C\u4E0D\u8FDE\u5E26\u5173\u95ED\u89E3\u8BFB\u3002\n if (!env.panel.contains(escapeTarget) && !env.historyList.contains(escapeTarget) && canFindEscapeOwner && escapeTarget.closest('[role=\"menu\"], [role=\"listbox\"], [data-trigger-menu]')) return\n }\n // Esc \u5206\u4E09\u7EA7\uFF1A**\u4ECE\u6700\u5185\u5C42\u5F80\u5916\u9000**\uFF0C\u4E00\u6B21\u53EA\u9000\u4E00\u5C42\uFF08\u7528\u6237\u6309\u4E00\u6B21\u4E0D\u8BE5\u8FDE\u5173\u4E24\u5C42\uFF09\u3002\n // \u2460 \u8BBE\u7F6E\u62BD\u5C49\u5F00\u7740 \u2192 \u53EA\u6536\u62BD\u5C49\uFF0C\u5C0F\u7A97\u7559\u7740\uFF08\u7528\u6237\u591A\u534A\u53EA\u662F\u6539\u5B8C\u60F3\u63A5\u7740\u770B\u89E3\u8BFB\uFF09\uFF1B\n // \u2461 \u8BED\u97F3\u8FDB\u884C\u4E2D\uFF08\u5F55\u97F3\u884C\u8FD8\u5728\uFF09\u2192 \u53EA\u53D6\u6D88\u8FD9\u4E00\u6B21\u8BED\u97F3\uFF08\u7B49\u4EF7\u4E8E\u70B9 \u2715\uFF0C\u5DF2\u7ECF\u8BF4\u51FA\u6765\u7684\u5B57\u7559\u7740\uFF09\uFF1B\n // \u2462 \u5176\u4F59\u60C5\u51B5 \u2192 \u5173\u6389\u5C0F\u7A97\uFF08\u4E00\u6B21\u5230\u4F4D\uFF0C\u4E0D\u53D7\"\u6709\u6CA1\u6709\u8FFD\u95EE\u8FC7\"\u9650\u5236\uFF09\u3002\n // \u4EE5\u524D\u662F\u4E00\u5F8B\u5173\u7A97\uFF1A\u6B63\u5728\u8BF4\u4E00\u53E5\u8BDD\u65F6\u6309 Esc \u60F3\u653E\u5F03\u8FD9\u53E5\u8BDD\uFF0C\u7ED3\u679C\u6574\u4E2A\u5C0F\u7A97\u6CA1\u4E86\u3002\n if (env.settingsOpen) {\n event.preventDefault()\n event.stopPropagation()\n // \u62BD\u5C49\u91CC\u8FD8\u5F00\u7740\u6A21\u578B\u4E0B\u62C9\u65F6\uFF0CEsc \u5148\u6536\u4E0B\u62C9 \u2014\u2014 \u4E00\u6B21\u53EA\u9000\u6700\u5185\u5C42\n var anyPickOpen = Object.keys(env.settingsByKey).some(function (key) {\n var entry = env.settingsByKey[key]\n return !!(entry && entry.menu && entry.menu.getAttribute('data-open') === '1')\n })\n if (anyPickOpen) env.closeModelPicks()\n else env.closeSettings()\n return\n }\n if (env.captureRow.getAttribute('data-show') === '1') {\n event.preventDefault()\n event.stopPropagation()\n env.cancelVoice()\n return\n }\n event.preventDefault()\n event.stopPropagation()\n env.closePanel()\n }\n", "\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u5C0F\u5DE5\u5177 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function el(tag, cls, text) {\n var node = document.createElement(tag)\n if (cls) node.className = cls\n if (text !== undefined && text !== null) node.textContent = text\n return node\n}\n\nexport function listen(target, type, handler, capture) {\n target.addEventListener(type, handler, capture === true)\n return function () {\n target.removeEventListener(type, handler, capture === true)\n }\n}\n\nexport function clamp(value, min, max) {\n return value < min ? min : value > max ? max : value\n}\n\n/**\n * \u9009\u533A\u662F\u4E0D\u662F\"\u6307\u7740\u4E00\u6BB5\u5DF2\u7ECF\u4E0D\u5728\u6587\u6863\u91CC\u7684\u6587\u5B57\"\u3002\n *\n * \u8FD9\u662F\"\u9009\u4E2D\u7684\u6587\u5B57\u88AB\u5220\u6389\"\u7684\u7B2C\u4E8C\u79CD\u5F62\u6001\uFF0C\u8DDF\u584C\u9677\uFF08`isCollapsed`\uFF09**\u4E0D\u662F**\u4E00\u56DE\u4E8B\uFF1A\n * \u8282\u70B9\u88AB\u6574\u4E2A\u6458\u6389\u65F6\uFF08\u6D41\u5F0F\u56DE\u7B54\u91CD\u6E32\u67D3 / \u6D88\u606F\u88AB\u66FF\u6362 / \u5185\u5BB9\u533A\u5237\u65B0\uFF09\uFF0CFirefox \u91CC\u9009\u533A\u5E76\u4E0D\u584C\u9677 \u2014\u2014\n * `isCollapsed` \u4ECD\u662F false\u3001`toString()` \u8FD8\u5410\u5F97\u51FA\u90A3\u6BB5\u65E7\u6587\u5B57\uFF0C\u53EF\u90A3\u6BB5\u6587\u5B57\u5C4F\u5E55\u4E0A\u5DF2\u7ECF\u6CA1\u6709\u4E86\u3002\n * \u53EA\u8BA4\u584C\u9677\u7684\u8BDD\u6D6E\u6807\u4F1A\u8D56\u7740\u4E0D\u8D70\uFF0C\u70B9\u4E0B\u53BB\u89E3\u8BFB\u7684\u662F\u4E00\u6BB5**\u4E0D\u5B58\u5728\u7684\u6587\u5B57**\u3002\n *\n * \u53D6\u4E0D\u5230 `isConnected`\uFF08\u8001\u73AF\u5883 / \u65E0\u6D4F\u89C8\u5668\u6D4B\u8BD5\u7684\u6869 DOM\uFF09\u65F6\u4E00\u5F8B\u5F53\"\u8FD8\u5728\"\uFF1A\n * \u5B81\u53EF\u591A\u7559\u4E00\u4F1A\u513F\uFF0C\u4E5F\u4E0D\u8BEF\u6536\u4E00\u4E2A\u6B63\u5E38\u9009\u533A\u3002\n */\nexport function selectionDetached(range) {\n var node = range && range.startContainer\n return !!node && node.isConnected === false\n}\n\n/** \u9009\u533A\u662F\u5426\u843D\u5728\u8F93\u5165\u6846\u91CC\uFF08\u90A3\u91CC\u4E0D\u8BE5\u5F39\u6309\u94AE\uFF0C\u907F\u514D\u5E72\u6270\u8F93\u5165\uFF09\u3002 */\nexport function insideEditable(node) {\n var element = node && node.nodeType === 1 ? node : node && node.parentElement\n if (!element || !element.closest) return false\n return !!element.closest('input, textarea')\n}\n\nexport function formatDuration(ms) {\n return ms < 1000 ? ms + 'ms' : (ms / 1000).toFixed(1) + 's'\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u5F55\u97F3\uFF08\u8BED\u97F3\u8F93\u5165\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// \u8FD9\u4E00\u8282\u662F**\u7EAF\u51FD\u6570 + \u6D4F\u89C8\u5668\u80FD\u529B\u5224\u65AD**\uFF0C\u4E0D\u78B0\u9762\u677F\u72B6\u6001\uFF1A\u5C0F\u7A97\u7684\u7F16\u6392\u5728 apply() \u91CC\u3002\n// \u5355\u4F4D\u6362\u7B97\u548C WAV \u5934\u5FC5\u987B\u548C host \u7684 validateWave \u9010\u5B57\u6BB5\u5BF9\u4E0A\uFF0816kHz / \u5355\u58F0\u9053 / PCM16\uFF09\uFF0C\n// \u5BF9\u4E0D\u4E0A host \u4F1A\u76F4\u63A5\u62D2\u6536 \u2014\u2014 \u8FD9\u662F\u523B\u610F\u7684\uFF1A\u5B81\u53EF\u660E\u786E\u62A5\"\u97F3\u9891\u683C\u5F0F\u4E0D\u5BF9\"\uFF0C\n// \u4E5F\u4E0D\u8981\u8BA9\u8BC6\u522B\u670D\u52A1\u6309\u9519\u8BEF\u7684\u91C7\u6837\u7387\u53BB\u542C\u4E00\u6BB5\u5FEB\u653E\u3002\n\n/** \u5F55\u97F3\u65F6\u957F\uFF1A0:07\uFF08\u4E0A\u9650 60 \u79D2\uFF0C\u6240\u4EE5\u53EA\u6709\u5206:\u79D2\uFF09\u3002 */\nexport function formatClock(ms) {\n var seconds = Math.max(0, Math.floor(ms / 1000))\n var mm = Math.floor(seconds / 60)\n var ss = seconds % 60\n return mm + ':' + (ss < 10 ? '0' : '') + ss\n}", "\n/** host \u8DEF\u7531\u3002 */\nexport var API = '/selection-explain/api/analyze'\n\nexport var PING = '/selection-explain/api/ping'\n\nexport var PROMOTE = '/selection-explain/api/promote'\n\n/** \u80F6\u56CA\u62D6\u5230\u522B\u5904\u540E\u7684\u4F4D\u7F6E\uFF08\u8BB0\u5728 host \u4E0A\uFF1A\u62D6\u5230\u522B\u5904\u2192\u5B58\uFF0C\u5438\u9644\u56DE\u53F3\u4E0B\u89D2\u2192\u6E05\uFF0C\u6302\u8F7D\u2192\u8BFB\u56DE\u6765\uFF09\u3002 */\nexport var PILL_POS = '/selection-explain/api/pill'\n\n/** \u5C0F\u7A97\u7684**\u5C3A\u5BF8**\uFF08\u6539\u8FC7\u5927\u5C0F\u4E4B\u540E\u8BB0\u5728 host \u4E0A\uFF0C\u5237\u65B0\u540E\u56DE\u5230\u90A3\u4E2A\u5927\u5C0F\uFF09\u3002\u4F4D\u7F6E\u4E0D\u8BB0\u3002 */\nexport var PANEL_SIZE = '/selection-explain/api/panel'\n\nexport var HISTORY = '/selection-explain/api/history'\n\n/** \u6A21\u578B\u6E05\u5355\uFF08\u5E26\u6BCF\u4E2A\u6A21\u578B\u652F\u6301\u7684\u63A8\u7406\u7B49\u7EA7\uFF09\u3002 */\nexport var MODELS = '/selection-explain/api/models'\n\n/**\n * \u5C0F\u7A97\u8BBE\u7F6E\uFF1AGET \u62FF spec + \u5F53\u524D\u503C\uFF0CPOST \u5199\u56DE\u3002\n *\n * spec\uFF08\u5206\u7EC4 / \u6807\u9898 / \u8BF4\u660E / \u8FB9\u754C / \u5355\u4F4D\uFF09\u7531 host \u4E0B\u53D1 \u2014\u2014 \u5BA2\u6237\u7AEF**\u4E0D\u505A\u4E1A\u52A1\u5224\u65AD**\uFF0C\n * \u514D\u5F97 UI \u7684\u8FB9\u754C\u548C host \u7684 clamp \u5404\u5199\u4E00\u4EFD\u3001\u65F6\u95F4\u4E45\u4E86\u4E92\u76F8\u6F02\uFF08\u89C1 src/settings.ts \u9876\u90E8\u6CE8\u91CA\uFF09\u3002\n */\nexport var SETTINGS = '/selection-explain/api/settings'\n\n/** \u6781\u8F7B\u7684\"\u8FD9\u4E00\u8F6E\u7528\u54EA\u4E2A\u6A21\u578B\"\u67E5\u8BE2\uFF1A\u8BBE\u7F6E\u9875\u5F00\u7740\u65F6\u6309\u79D2\u8F6E\u8BE2\u5B83\uFF0C\u8BA9\u62EC\u53F7\u91CC\u7684\u540D\u5B57\u5B9E\u65F6\u8DDF\u7740\u53D8\u3002 */\nexport var ROUTE = '/selection-explain/api/route'\n\n/**\n * \u8BED\u97F3\u8F93\u5165\uFF08\u5C0F\u7A97\u9EA6\u514B\u98CE\uFF09\uFF1A\u8BC6\u522B\u5728 host \u4E0A\u505A\uFF0C\u6D4F\u89C8\u5668\u53EA\u8D1F\u8D23\u5F55\u4E00\u6BB5\u89C4\u8303 WAV \u9001\u8FC7\u53BB\u3002\n * \u00B7 \u76EE\u5F55\u63A5\u53E3\u8BF4\u6E05\"\u80FD\u4E0D\u80FD\u5F55\u3001\u8981\u5F55\u591A\u4E45\u3001\u8981\u4E0D\u8981\u5148\u51C6\u5907\u6A21\u578B\"\uFF1B\n * \u00B7 \u97F3\u9891\u4E0D\u843D\u76D8\u3001\u4E0D\u8FDB\u4F1A\u8BDD\uFF0C\u8F6C\u5199\u5B8C\u5373\u4E22\uFF08\u5BA2\u6237\u7AEF\u7684\u5F15\u7528\u91CC\u4E5F\u4E0D\u4F1A\u51FA\u73B0\u97F3\u9891\uFF09\u3002\n */\nexport var SPEECH_API = '/selection-explain/api/speech'\n\nexport var SPEECH_TRANSCRIBE = SPEECH_API + '/transcribe'\n\nexport var SPEECH_PREPARE = SPEECH_API + '/prepare'\n\n/**\n * \u9EA6\u514B\u98CE\u5360\u7528\uFF08\"\u8F93\u5165\u6CD5\u6B63\u5728\u8BED\u97F3\u8F93\u5165\"\uFF09\uFF1Ahost \u8BFB CoreAudio \u7684\u8FDB\u7A0B\u5BF9\u8C61\u5217\u8868\uFF0C\n * \u89C1 src/index.ts \u7684 micPresence \u4E0E native/mic-probe.c\u3002\n * \u2192 { ok, available, capturing, processes:[{pid,bundleId,name}], reason }\n * \u8BFB\u5B83\u4E0D\u9700\u8981\u9EA6\u514B\u98CE\u6388\u6743 \u2014\u2014 \u63D2\u4EF6\u4E0D\u8BE5\u4E3A\u4E86\u4E00\u4E2A\"\u6307\u793A\u706F\"\u53BB\u8981\u7528\u6237\u7684\u9EA6\u514B\u98CE\u6743\u9650\u3002\n */\nexport var MIC_API = '/selection-explain/api/mic'\n\n/**\n * \u8BA4\u54EA\u4E9B\u8F93\u5165\u6CD5\uFF08bundleId \u524D\u7F00\uFF09\u3002\u8C46\u5305\u8F93\u5165\u6CD5\u3002\n * \u52A0\u65B0\u8F93\u5165\u6CD5\u5C31\u5F80\u8FD9\u91CC\u52A0\u4E00\u884C\uFF1A\u7279\u6027\u53EA\u5BF9\"\u5DF2\u77E5\u8F93\u5165\u6CD5\"\u751F\u6548\uFF0C\u4E0D\u53BB\u731C\u522B\u7684 App \u5728\u5F55\u4EC0\u4E48\u3002\n */\nexport var IME_BUNDLES = ['com.bytedance.inputmethod.doubaoime']\n\n/**\n * \u8F6E\u8BE2\u95F4\u9694\uFF1A\u53EA\u5728\"\u6709\u9009\u533A\"\u65F6\u95EE\uFF08\u6D6E\u6807\u4EAE\u7740\u7684\u90A3\u51E0\u62CD\uFF09\u3002\n *\n * 200ms\uFF1A\u5B83\u662F\"\u6309 Fn \u2192 \u5361\u7247\u5F39\u51FA\"\u5EF6\u8FDF\u91CC\u7684\u4E24\u9879\u4E4B\u4E00\uFF08\u53E6\u4E00\u9879\u662F\u5BBF\u4E3B\u63A2\u9488\u7684\u91C7\u6837\u95F4\u9694\uFF0C\n * \u89C1 src/index.ts \u7684 MIC_WATCH_MS\uFF09\u3002\u539F\u6765 400ms \u662F\u4FDD\u5B88\u4F30\u7684\uFF0C\u5B9E\u6D4B\u672C\u673A\u4E00\u6B21 GET\n * \u7684\u5F00\u9500\u53EF\u5FFD\u7565\uFF0C\u6240\u4EE5\u8C03\u5FEB\u4E00\u500D\u3001\u628A\u611F\u77E5\u5EF6\u8FDF\u538B\u4E0B\u6765\u3002\n * \u6CE8\u610F\uFF1A\u5373\u4F7F\u8C03\u5FEB\uFF0C\u4E5F\u4E0D\u80FD\u9760\"\u68C0\u6D4B\u5230\u6587\u5B57\u518D\u5F39\u6846\" \u2014\u2014 \u4E0A\u5C4F\u53D1\u751F\u5728\u677E\u624B\u90A3\u4E00\u523B\uFF0C\n * \u90A3\u65F6\u624D\u62A2\u7126\u70B9\u5C31\u665A\u4E86\uFF08\u5B57\u4F1A\u843D\u5230\u522B\u5904\uFF09\uFF1B\u6211\u4EEC\u8981\u7684\u662F\"\u5B83\u5F00\u9EA6\u65F6\u5C31\u62A2\"\u3002\n */\nexport var MIC_POLL_MS = 200\n\n/** \u8BED\u97F3\u5361\u51E0\u4F55\uFF1A\u53F3\u7F18\u8D34\u6D6E\u6807\u53F3\u7F18\uFF0C\u5DE6\u7F18\u5C55\u5F00\u5230\u6B63\u6587\u5217\u5DE6\u8FB9 \u2014\u2014 \u5BBD\u5EA6\u7531\u8FD9\u4E24\u6761\u8FB9\u754C\u7B97\u51FA\u6765\u3002 */\n/**\n * \u5361\u7247\u5BBD\u5EA6\uFF1A**\u56FA\u5B9A 360**\u3002\n *\n * \u539F\u6765\u6309\"\u6B63\u6587\u5217\u5DE6\u8FB9 \u2192 \u9009\u533A\u53F3\u7F18\"\u7B97\uFF0C\u518D\u5939\u5728 [360, 560] \u4E4B\u95F4 \u2014\u2014 \u60F3\u6CD5\u662F\"\u8BA9\u5361\u7247\u770B\u8D77\u6765\u5C5E\u4E8E\n * \u8FD9\u4E00\u6BB5\u6B63\u6587\"\uFF0C\u4F46\u5B9E\u6D4B**\u7ECF\u5E38\u504F\u5BBD**\uFF08\u9009\u533A\u5728\u7B2C\u4E00\u884C\u9760\u53F3\u7ED3\u675F\u65F6\u80FD\u9876\u5230 560\uFF09\uFF0C\u8BFB\u8D77\u6765\u7B28\u91CD\u3002\n * \u73B0\u5728\u7EDF\u4E00 360\uFF1A\u53F3\u7F18\u4ECD\u7136\u9489\u5728\u9009\u533A\u53F3\u7F18\uFF08\u548C\u6D6E\u6807\u540C\u4FA7\uFF0C\u5F62\u53D8\u65F6\u53F3\u7F18\u4E0D\u52A8\u3001\u5DE6\u7F18\u5C55\u5F00\uFF09\uFF0C\n * \u5BBD\u5EA6\u4E0D\u518D\u968F\u9009\u533A\u4F4D\u7F6E\u53D8\u5316\u3002\n */\nexport var VCARD_W = 360\n\n/**\n * **\u515C\u5E95**\uFF1A\u677E\u624B\u4E4B\u540E\u7B49\u6587\u5B57\"\u9759\u9ED8\"\u591A\u4E45\u624D\u8BA4\u5B9A\u5B9A\u7A3F\uFF08\u6BEB\u79D2\uFF09\u3002\n *\n * \u4E3B\u4FE1\u53F7\u662F compositionend\uFF08\u89C1 VOICE_SETTLE_COMPOSE_MS\uFF09\uFF0C\u5B9E\u6D4B\u8C46\u5305\u7684\u667A\u80FD\u6574\u7406\u90FD\u8D70\u5B83\uFF0C\n * \u6240\u4EE5\u8FD9\u6761\u515C\u5E95\u5B9E\u9645\u4E0A\u5F88\u5C11\u88AB\u7528\u5230 \u2014\u2014 \u5B83\u7BA1\u4E24\u79CD\u60C5\u51B5\uFF1A\n * 1. \u8F93\u5165\u6CD5\u76F4\u63A5\u6539 value\u3001\u6CA1\u8D70\u5408\u6210 API\uFF1B\n * 2. \u6574\u7406\u63D0\u4EA4\u53D1\u751F\u5728\u5BA2\u6237\u7AEF\u5BDF\u89C9\u677E\u624B\u4E4B\u524D\uFF08\u8F6E\u8BE2\u6709\u6700\u591A\u4E00\u4E2A\u95F4\u9694\u7684\u6EDE\u540E\uFF0C\u90A3\u65F6 compositionend \u5DF2\u7ECF\u8FC7\u53BB\u4E86\uFF09\u3002\n *\n * \u53D6 500\uFF08\u7528\u6237\u6307\u5B9A\uFF0C\u539F\u4E3A 700\uFF09\uFF1A\u5B9E\u6D4B\"\u677E\u624B \u2192 \u6574\u7406\u63D0\u4EA4\"\u662F 71/257/328/393/515/600ms\uFF0C\n * \u4F46\u90A3\u4E9B**\u90FD\u5E26 compositionend**\u3001\u8D70\u7684\u662F\u4E3B\u4FE1\u53F7\uFF0C\u6240\u4EE5\u515C\u5E95\u63D0\u524D\u5230 500 \u4E0D\u5F71\u54CD\u5B83\u4EEC\uFF1B\n * \u771F\u8981\u62C5\u5FC3\u7684\u662F\"\u6CA1\u6709\u5408\u6210\u4FE1\u53F7\"\u7684\u573A\u5408 \u2014\u2014 \u90A3\u79CD\u60C5\u51B5\u6CA1\u6709\u5B9E\u6D4B\u6570\u636E\uFF0C500 \u662F\u4E2A\u6298\u4E2D\u3002\n */\nexport var VOICE_SETTLE_MS = 500\n\n/**\n * \u6536\u5230 compositionend \u4E4B\u540E\uFF0C\u518D\u7B49\u591A\u4E45\u624D\u51B3\u5B9A\uFF08\u6BEB\u79D2\uFF09\u3002\n *\n * \u5B9E\u6D4B\u7ED3\u8BBA\uFF088 \u6B21\u771F\u5B9E\u5F55\u97F3\uFF09\uFF1A\u8C46\u5305\u7684\u667A\u80FD\u6574\u7406**\u8D70\u5408\u6210 API \u63D0\u4EA4** \u2014\u2014 6 \u6B21\u91CC\u90FD\u6709\n * `inputType=insertCompositionText` + `compositionend`\u3002\u6240\u4EE5\u5B83\u662F**\u51C6\u786E\u4FE1\u53F7**\uFF0C\n * \u4E0D\u5FC5\u518D\u9760\"\u731C\u9759\u9ED8\u7A97\u53E3\"\u3002\n *\n * \u7559\u8FD9 200ms \u662F\u56E0\u4E3A\u53EF\u80FD\u8FDE\u7740\u63D0\u4EA4\u4E24\u6B21\uFF08\u6807\u70B9\u4E00\u6B21\u3001\u6539\u8BCD\u4E00\u6B21\uFF09\uFF1A\u6BCF\u6536\u5230\u4E00\u6B21\u5C31\u91CD\u65B0\u8BA1\u65F6\u3002\n * \u5B9E\u6D4B\"\u677E\u624B \u2192 \u6574\u7406\u63D0\u4EA4\"= 71 / 257 / 328 / 393 / 515 / 600 ms\uFF1B\u6574\u7406\u5185\u5BB9\u5305\u542B\u8865\u6807\u70B9\u3001\n * \u53BB\u91CD\u590D\u8BCD\u3001\u4EE5\u53CA**\u6539\u542C\u9519\u7684\u8BCD**\uFF08\"\u8BBE\u7F6E\u6CA1\u6CD5\u5927\u6982\u7684\u8BDD\" \u2192 \"\u8BBE\u7F6E\u6CA1\u6CD5\u6253\u5F00\u7684\u8BDD\"\uFF09\u2014\u2014\n * \u6B63\u56E0\u4E3A\u4F1A\u6539\u8BCD\uFF0C\u7EDD\u4E0D\u80FD\u4E00\u677E\u624B\u5C31\u53D1\u9001\u3002\n */\nexport var VOICE_SETTLE_COMPOSE_MS = 200\n\n/** \u7B49\u5B9A\u7A3F\u7684**\u6700\u957F\u65F6\u95F4**\uFF08\u6BEB\u79D2\uFF09\uFF1A\u6574\u7406\u4E00\u76F4\u4E0D\u505C\u7684\u8BDD\uFF0C\u5230\u70B9\u5C31\u6309\u5F53\u524D\u5185\u5BB9\u51B3\u5B9A\uFF0C\u4E0D\u80FD\u65E0\u9650\u7B49\u3002 */\nexport var VOICE_SETTLE_MAX_MS = 4000\n\n/** \u89C2\u5BDF\u6587\u5B57\u6709\u6CA1\u6709\u53D8\u7684\u95F4\u9694\uFF08\u6BEB\u79D2\uFF09\u3002\u7528\u8F6E\u8BE2\u800C\u4E0D\u662F input \u4E8B\u4EF6\uFF1A\u667A\u80FD\u6574\u7406\u53EF\u80FD\u662F\u76F4\u63A5\u6539 value\uFF0C\u4E0D\u4E00\u5B9A\u53D1\u4E8B\u4EF6\u3002 */\nexport var VOICE_SETTLE_POLL_MS = 200\n\n/**\n * \u5361\u7247 \u2192 \u5C0F\u7A97\u7684\u4EA4\u63A5\uFF08\u7528\u6237\u9009\u5B9A\u7684\u65B9\u6848\uFF1A**\u7F29\u653E\u957F\u51FA**\uFF09\u3002\n *\n * \u4EE5\u524D\u8FD9\u4E24\u6B65\u662F\"\u77AC\u5207\"\uFF1A\u5361\u7247 `display:none`\u3001\u5C0F\u7A97 `display:flex`\uFF0C\u4E2D\u95F4\u96F6\u8FC7\u6E21\uFF1B\n * \u800C\u4E14\u51E0\u4F55\u672C\u8EAB\u4E5F\u6362\u4E86 \u2014\u2014 \u5361\u7247 360 \u5BBD\u3001**\u53F3\u7F18**\u8D34\u9009\u533A\u53F3\u7F18\uFF0C\u5C0F\u7A97 540 \u5BBD\u3001**\u5DE6\u7F18**\u8D34\u9009\u533A\u5DE6\u7F18\uFF0C\n * \u6240\u4EE5\u770B\u8D77\u6765\u662F\"\u8DF3\"\u3002\u73B0\u5728\u8BA9\u5C0F\u7A97**\u4ECE\u5361\u7247\u90A3\u4E00\u683C\u5F00\u59CB**\uFF1A\u8D77\u624B\u7528 transform \u628A\u9762\u677F\u538B\u5230\u5361\u7247\u7684\u77E9\u5F62\u4E0A\uFF0C\n * 260ms \u56DE\u5230\u81EA\u8EAB\uFF08\u66F2\u7EBF\u4E0E\u63D2\u4EF6\u65E2\u6709\u7684\"\u6D6E\u6807 \u2192 \u5361\u7247\"\u5F62\u53D8\u540C\u4E00\u65CF\uFF09\u3002\n *\n * \u4E3A\u4EC0\u4E48\u53EA\u52A8 transform\uFF08\u4E0D\u52A8 width/left/top\uFF09\uFF1A\u90A3\u56DB\u4E2A\u662F\u5E03\u5C40\u5C5E\u6027\uFF0C\u6BCF\u5E27\u90FD\u4F1A\u91CD\u6392\u6574\u4E2A\u9762\u677F\n * \uFF08\u9762\u677F\u91CC\u6709\u5BCC\u6587\u672C\u3001\u4EE3\u7801\u5757\uFF0C\u7F51\u9875\u6A21\u5F0F\u4E0B\u8FD8\u6709 iframe\uFF09\u2014\u2014 \u5F62\u53D8\u671F\u95F4\u4F1A\u6389\u5E27\u3002transform \u53EA\u8D70\u5408\u6210\u5668\u3002\n * \u4EE3\u4EF7\u662F\u8D77\u624B\u90A3\u51E0\u5E27\u5185\u5BB9\u88AB\u538B\u6241\uFF08\u7F29\u653E\u6001\uFF09\uFF0C\u8FD9\u6B63\u662F\"\u957F\u51FA\u6765\"\u8FD9\u4E2A\u89C2\u611F\u7684\u6765\u6E90\u3002\n */\nexport var PANEL_GROW_MS = 260\n\nexport var PANEL_GROW_EASE = 'cubic-bezier(.2,.8,.2,1)'\n\n/** \u6B63\u6587\u6700\u591A 4 \u884C\uFF08\u7EA6 93px\uFF09\uFF0C\u518D\u591A\u5185\u90E8\u6EDA\u52A8\u5E76\u505C\u5728\u6700\u65B0\u4E00\u884C\uFF08\u4E0E\u8FFD\u95EE\u6846\u540C\u4E00\u5957\uFF09\u3002 */\nexport var VCARD_TEXT_MAX = 96\n\n/**\n * \u5361\u7247\u9AD8\u5EA6 = \u6B63\u6587\u9AD8\u5EA6 + \u8FD9\u4E2A\uFF08border-box \u4E0B\u7684\u7EB5\u5411\u5185\u8FB9\u8DDD 8+8 \u4E0E\u8FB9\u6846 1+1\uFF09\u3002\n * \u5355\u884C\u5361\u56E0\u6B64\u662F 24 + 18 = 42px \u2014\u2014 \u800C\u4E0D\u662F\u6F0F\u6389 box-sizing \u65F6\u6E32\u67D3\u51FA\u6765\u7684 70px\u3002\n */\nexport var VCARD_PAD_Y = 18\n\n/**\n * \"\u8FD9\u4E00\u5E27\u521A\u88AB\u52A8\u8FC7\"\u7B97\u591A\u4E45\u4EE5\u5185\u6709\u6548\uFF08\u6BEB\u79D2\uFF09\u3002\n *\n * \u53EA\u7ED9\u4FA7\u8FB9\u680F\u7F51\u9875\u90A3\u6761\u8DEF\u7528\uFF1A\u7126\u70B9\u843D\u5728**\u4E0D\u900F\u660E\u6E90\u5B50\u6846\u67B6**\u91CC\u65F6\uFF0C\u7236\u6587\u6863\u7684 `document.hasFocus()`\n * \u662F\u5426\u8FD4\u56DE true \u7531\u6D4F\u89C8\u5668\u5B9E\u73B0\u51B3\u5B9A\uFF08\u8DE8\u5F15\u64CE\u6CA1\u6709\u7EDF\u4E00\u7B54\u6848\uFF0Cheadless \u91CC\u4E5F\u9A8C\u4E0D\u51FA\u6765\uFF09\uFF0C\n * \u6240\u4EE5\u5BF9\u5E27\u5185\u9009\u533A\u6539\u7528\"\u8FD9\u4E00\u5E27\u521A\u521A\u62A5\u8FC7\u52A8\u4F5C\uFF08\u5212\u8BCD / \u6309\u4E0B\uFF09\"\u5F53\u7126\u70B9\u8BC1\u636E \u2014\u2014\n * \u6865\u62A5\u4E0A\u6765\u7684\u90A3\u4E00\u523B\uFF0C\u7528\u6237\u786E\u5B9E\u6B63\u5728\u90A3\u4E2A\u7F51\u9875\u91CC\u64CD\u4F5C\u3002\u7A97\u53E3\u53D6 5 \u79D2\uFF1A\u9EA6\u514B\u98CE\u63A2\u9488 125ms +\n * \u9875\u9762\u8F6E\u8BE2 200ms\uFF0C\u5F00\u9EA6\u68C0\u6D4B\u6700\u6162\u4E5F\u5C31\u51E0\u767E\u6BEB\u79D2\u540E\u624D\u7528\u5230\u5B83\u3002\n */\nexport var FRAME_FOCUS_EVIDENCE_MS = 5000\n\n/** \u515C\u5E95\u9650\u5236\uFF08host \u7684 limits \u4F18\u5148\uFF1B\u62FF\u4E0D\u5230\u76EE\u5F55\u65F6\u6309\u8FD9\u5957\u8D70\uFF09\u3002 */\nexport var VOICE_FALLBACK_SECONDS = 60\n\nexport var VOICE_MAX_BYTES = 4 * 1024 * 1024\n\n/** \u76EE\u5F55\u7F13\u5B58\u65F6\u957F\uFF1A\u540C\u4E00\u5206\u949F\u5185\u53CD\u590D\u70B9\u9EA6\u514B\u98CE\u4E0D\u518D\u91CD\u590D\u95EE host\u3002 */\nexport var VOICE_CATALOG_TTL = 60 * 1000\n\n/**\n * \u5B9E\u65F6\u5B57\u5E55\uFF08\u534A\u53E5\u9884\u89C8 + \u505C\u987F\u5B9A\u7A3F\uFF09\uFF1A\n * \u00B7 \u8BF4\u8BDD\u65F6\u6BCF ~1.3s \u628A\"\u8FD8\u6CA1\u5B9A\u7A3F\u7684\u8FD9\u534A\u53E5\"\u9001\u53BB\u8BC6\u522B\u4E00\u6B21\uFF0C\u7ED3\u679C**\u6574\u6BB5\u66FF\u6362**\u4E0A\u4E00\u62CD\u7684\u9884\u89C8\uFF1B\n * \u00B7 \u68C0\u6D4B\u5230 ~0.6s \u9759\u97F3\uFF08\u4E00\u53E5\u8BDD\u8BF4\u5B8C\u4E86\uFF09\u5C31\u628A\u8FD9\u53E5\u9001\u53BB\u8BC6\u522B\u5E76**\u5B9A\u7A3F**\uFF0C\u4E4B\u540E\u4E0D\u518D\u53D8\u3002\n * \u53EA\u5728\u672C\u5730\u8BC6\u522B\u5668\u4E0A\u9ED8\u8BA4\u5F00\uFF08\u4E91\u7AEF\u6BCF\u62CD\u4E00\u6B21\u90FD\u662F\u4ED8\u8D39\u8C03\u7528\uFF09\uFF1B\u7A97\u53E3\u56FA\u5B9A \u226410 \u79D2\uFF0C\n * \u8FD9\u6837\u8BF4\u5230\u7B2C 40 \u79D2\u4E5F\u4E0D\u4F1A\u53D8\u6162\uFF08\u5B9E\u6D4B 8s \u7A97\u53E3 185ms\u300140s \u6574\u6BB5\u8981 1.1s\uFF09\u3002\n */\nexport var VOICE_PREVIEW_EVERY = 1300\n\nexport var VOICE_PREVIEW_WINDOW = 10\n\nexport var VOICE_PAUSE_MS = 600\n\nexport var VOICE_PAUSE_MIN_MS = 400\n\nexport var VOICE_COMMIT_MAX_SECONDS = 25\n\n/** \"\u6709\u58F0\"\u7684\u95E8\u9650\uFF08RMS\uFF09\uFF1A\u4F4E\u4E8E\u5B83\u7B97\u9759\u97F3\uFF0C\u8FDE\u7740 0.6s \u5C31\u662F\u4E00\u53E5\u8BDD\u8BF4\u5B8C\u4E86\u3002 */\nexport var VOICE_SILENCE_RMS = 0.012\n\n/** \u4E0A\u4E0B\u6587\u7A97\u53E3\uFF1A\u9009\u533A\u524D\u540E\u5404\u53D6\u591A\u5C11\u5B57\u7B26\u3002 */\nexport var CONTEXT_WINDOW = 1500\n\n/** key \u53EA\u53D6\u9009\u4E2D\u6587\u5B57**\u4E4B\u524D**\u8FD9\u4E48\u591A\u5B57\uFF1A\u540E\u7F00\u4F1A\u968F\u65B0\u6D88\u606F\u53D8\u5316\uFF0C\u4E0D\u80FD\u8FDB key\u3002 */\nexport var KEY_CONTEXT_CHARS = 300\n\n/**\n * \u5F15\u7528\uFF08\u275D\uFF09\uFF1A\u5C0F\u7A97\u5F00\u7740\u65F6\uFF0C\u628A**\u5C0F\u7A97\u91CC\u9009\u4E2D\u7684\u6B63\u6587**\u6216**\u4E3B\u754C\u9762\u4E0A\u9009\u4E2D\u7684\u6587\u5B57**\n * \u6302\u8FDB\u5C0F\u7A97\u8F93\u5165\u6846\uFF0C\u53D1\u9001\u65F6\u4F5C\u4E3A\u6750\u6599\u4E00\u5E76\u53D1\u7ED9\u6A21\u578B\u3002\n * \u00B7 \u4E00\u6B21\u6700\u591A\u51E0\u6BB5 \u2014\u2014 \u6BCF\u6BB5\u90FD\u4F1A\u8FDB\u672C\u8F6E\u63D0\u95EE\uFF0C\u5806\u592A\u591A\u7B49\u4E8E\u628A\u95EE\u9898\u57CB\u6389\uFF1B\n * \u00B7 \u6BCF\u6BB5\u5B57\u6570\u4E0A\u9650 \u2014\u2014 \u8D85\u4E86\u622A\u65AD\uFF08\u5F15\u7528\u6574\u6761\u56DE\u7B54\u65F6\u6700\u957F\u7684\u90A3\u79CD\u4F1A\u649E\u4E0A\uFF09\u3002\n */\nexport var MAX_QUOTES = 4\n\nexport var MAX_QUOTE_CHARS = 3000\n\n/**\n * \u5F15\u7528**\u9009\u533A**\u7684\u957F\u5EA6\u4E0A\u9650\uFF08\u6BD4 MAX_QUOTE_CHARS \u5BBD\u5F97\u591A\uFF09\u3002\n *\n * \u5212\u4E00\u5927\u6BB5\uFF08\u6BD4\u5982\u6574\u6761\u56DE\u7B54\uFF09\u65F6\u4E5F\u8981\u8BA9\u6D6E\u6807\u51FA\u6765 \u2014\u2014 \u51FA\u6765\u4E4B\u540E\u6309 MAX_QUOTE_CHARS \u622A\u65AD\u5E76\u8BF4\u660E\uFF1B\n * \u65E9\u5148\u8FD9\u91CC\u76F4\u63A5\u7528 MAX_QUOTE_CHARS \u5224\u65AD\uFF0C\u7ED3\u679C\u662F\"\u5212\u957F\u4E00\u70B9\u5C31\u6CA1\u53CD\u5E94\"\uFF0C\n * \u800C\u7528\u6237\u6839\u672C\u4E0D\u77E5\u9053\u4E3A\u4EC0\u4E48\uFF08\u6D6E\u6807\u4E0D\u51FA\u73B0 = \u6CA1\u6709\u4EFB\u4F55\u53CD\u9988\uFF09\u3002\n */\nexport var MAX_QUOTE_SELECTION = 20000\n\n/** \u53EA\u6302\u4E86\u5F15\u7528\u3001\u4E00\u4E2A\u5B57\u90FD\u6CA1\u5199\u65F6\uFF0C\u7528\u5B83\u5F53\u63D0\u95EE\uFF08\u4E0D\u66FF\u7528\u6237\u7F16\u590D\u6742\u95EE\u9898\uFF09\u3002 */\nexport var QUOTE_ONLY_QUESTION = '\u5C31\u4E0A\u9762\u5F15\u7528\u7684\u6587\u5B57\uFF0C\u8BF4\u8BF4\u5B83\u5728\u8FD9\u91CC\u662F\u4EC0\u4E48\u610F\u601D\u3002'\n\n/**\n * \u5F15\u7528\u7684\u4E0A\u4E0B\u6587\uFF1A**\u53EA\u5E26\u6A21\u578B\u770B\u4E0D\u5230\u7684\u4E1C\u897F**\u3002\n * \u00B7 \u5C0F\u7A97\u81EA\u5DF1\u7684\u6B63\u6587\uFF08\u56DE\u7B54 / \u4E24\u8282 / \u9876\u90E8\u539F\u6587\u6761\uFF09\u2192 **\u4E0D\u5E26**\uFF1A\u90A3\u51E0\u8F6E\u5BF9\u8BDD\u672C\u6765\u5C31\u4F1A\u968F history\n * \u8FDB\u6A21\u578B\uFF0C\u51FA\u5904\u9760\u6807\u7B7E\u8BF4\u6E05\uFF08\u300C\u5C0F\u7A97\u7B2C 2 \u8F6E\u56DE\u7B54\u300D\u300C\u5C0F\u7A97\u300C\u7FFB\u8BD1\u300D\u8282\u300D\uFF09\uFF1B\n * \u00B7 \u4E3B\u754C\u9762\uFF08\u4F1A\u8BDD\uFF09\u2192 \u7531 host \u4ECE\u4F1A\u8BDD\u8BB0\u5F55\u91CC\u53D6\"\u5F15\u7528\u6240\u5728\u90A3\u4E00\u7EC4\u5BF9\u8BDD \u00B1 \u4E00\u7EC4\"\uFF08\u5E72\u51C0\u6587\u672C\u3001\u6309\u8F6E\u53D6\u6574\uFF09\uFF0C\n * \u89C1 QUOTE_CONTEXT_API\uFF1B\u5BA2\u6237\u7AEF\u5148\u7528\u5C40\u90E8\u7A97\u53E3\u515C\u5E95\uFF0C\u53D1\u9001\u524D\u624D\u53BB\u95EE host\uFF1B\n * \u00B7 \u4FA7\u8FB9\u680F\u7F51\u9875 \u2192 \u5E27\u5185\u6865\u91C7\u7684\u5C40\u90E8\u7A97\u53E3\u3002\n */\nexport var QUOTE_CONTEXT_API = '/selection-explain/api/quote-context'\n\n/** \u4F1A\u8BDD\u7248\u4E0A\u4E0B\u6587\u7684\u7B49\u5F85\u4E0A\u9650\uFF08\u6BEB\u79D2\uFF09\uFF1A\u8D85\u4E86\u5C31\u7528\u5BA2\u6237\u7AEF\u90A3\u4EFD\uFF0C\u4E0D\u8BA9\u53D1\u9001\u5361\u4F4F\u3002 */\n\n\n/** \u4F1A\u8BDD\u7248\u4E0A\u4E0B\u6587\u7684\u7B49\u5F85\u4E0A\u9650\uFF08\u6BEB\u79D2\uFF09\uFF1A\u8D85\u4E86\u5C31\u7528\u5BA2\u6237\u7AEF\u90A3\u4EFD\uFF0C\u4E0D\u8BA9\u53D1\u9001\u5361\u4F4F\u3002 */\nexport var QUOTE_CONTEXT_TIMEOUT = 1500\n\n/** \u9762\u677F z-index \u9876\u90E8\u3002 */\nexport var Z_BTN = 2147483000\n\nexport var Z_PANEL = 2147483001\n\n/** \u9634\u5F71\u5B57\u4F53\u6808\uFF08\u4E0E\u5BBF\u4E3B UI \u4E00\u81F4\u7684\u4E2D\u6587\u4F18\u5148\u6808\uFF09\u3002 */\nexport var FONT =\n '-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"PingFang SC\",\"Hiragino Sans GB\",\"Microsoft YaHei\",sans-serif'\n\n// \u2014\u2014 \u60AC\u6D6E\u72B6\u6001\u80F6\u56CA\u7684\u51E0\u4F55/\u624B\u611F\u53C2\u6570\uFF08CSS \u4E0E placePill \u90FD\u8981\u7528\uFF0C\u6240\u4EE5\u653E\u8FD9\u4E00\u5C42\uFF09 \u2014\u2014\n/**\n * **\u515C\u5E95**\u6700\u5927\u5BBD\u5EA6\uFF1A\u53EA\u6709\"\u91CF\u4E0D\u5230\u8D39\u7528\u80F6\u56CA\"\u65F6\u624D\u751F\u6548\uFF08\u89C1 placePill\uFF09\u3002\n *\n * \u6709\u8D39\u7528\u80F6\u56CA\u65F6\u5BBD\u5EA6\u5199\u6B7B\u6210\u5B83\u7684\u5B9E\u6D4B\u5BBD\u5EA6 \u2014\u2014 \u4E24\u8005\u5171\u7528 CSS \u91CC\u90A3\u6761 `max-width:280px`\uFF0C\n * \u6240\u4EE5\u5E76\u6392\u65F6\u540C\u5BBD\u540C\u4F4D\u7F6E\uFF1B\u800C\u5355\u72EC\u4E00\u679A\u6D6E\u5728\u53F3\u4E0B\u89D2\u65F6 280 \u663E\u5F97\"\u6A2A\u7740\u4E00\u6761\"\uFF08\u65C1\u8FB9\u4EC0\u4E48\u90FD\u6CA1\u6709\uFF0C\n * \u5206\u91CF\u611F\u5168\u5728\u8FD9\u6761\u80F6\u56CA\u4E0A\uFF09\uFF0C\u6536\u5230 200\u3002\u53D6\u503C\u4F9D\u636E\uFF08\u771F\u6D4F\u89C8\u5668 8x \u622A\u56FE + \u91CF\u58A8\u8FF9\uFF09\uFF1A\n * \u00B7 \u77ED\u5185\u5BB9\u300C\u5212\u8BCD\u89E3\u8BFB \u00B7 \u5C31\u7EEA\u300D\u81EA\u7136\u5BBD\u5EA6 146.6px \u2192 \u4E0D\u53D7\u5F71\u54CD\uFF1B\n * \u00B7 \u82F1\u6587\u9009\u4E2D\u300Cthe migratio\u2026 \u00B7 \u5B8C\u6210 \u00B7 3 \u8F6E\u300D214px \u2192 \u4F1A\u622A\u4E00\u70B9\uFF1B\n * \u00B7 \u6700\u574F\u7EC4\u5408\u300C12 \u5B57\u4E2D\u6587 + \u00B7 \u8FFD\u95EE\u4E2D 12.3s\u300D\u540D\u5B57\u90A3\u683C\u8FD8\u5269 ~54px \u2248 3 \u4E2A\u5B57\u3002\n * \u72B6\u6001\u683C `flex:0 0 auto` \u6C38\u4E0D\u7F29 \u2014\u2014 \u5BBD\u5EA6\u4E0D\u591F\u65F6\u53EA\u727A\u7272\u9009\u4E2D\u6587\u5B57\uFF08\u7701\u7565\u53F7\u6536\u5C3E\uFF09\u3002\n */\nexport var PILL_FALLBACK_MAX = 200\n\n/** \u6536\u6210\u5C0F\u7403\u540E\u7684\u76F4\u5F84\uFF08px\uFF09\u3002\u6536\u7403 = \u628A max-width \u6536\u5230\u5B83\uFF08\u80FD\u8FC7\u6E21\uFF0C\u6240\u4EE5\u6536/\u653E\u90FD\u662F\u52A8\u753B\uFF09\u3002 */\nexport var PILL_BALL_SIZE = 32\n\n/** \u677E\u624B\u65F6\u79BB\"\u8D34\u89D2\u4F4D\u7F6E\"\u591A\u8FD1\u5C31\u5438\u9644\u56DE\u53BB\uFF08px\uFF0C\u6309\u5DE6\u4E0A\u89D2\u6BD4\uFF09\u3002 */\nexport var PILL_SNAP_RADIUS = 96\n\n/** \u4F4D\u79FB\u8D85\u8FC7\u591A\u5C11\u50CF\u7D20\u624D\u7B97\"\u62D6\"\u800C\u4E0D\u662F\"\u70B9\"\uFF08px\uFF0C\u66FC\u54C8\u987F\u8DDD\u79BB\uFF09\u3002 */\nexport var PILL_DRAG_SLOP = 4\n\n/**\n * \u6536\u7403 / \u5C55\u5F00\u90A3\u6761\u8FC7\u6E21\uFF08\u65F6\u957F + \u66F2\u7EBF\uFF09\uFF0CCSS \u91CC\u591A\u5904\u5F15\u7528\u3002\n *\n * \u66F2\u7EBF\u9009 `cubic-bezier(.5,0,.5,1)` \u662F\u56E0\u4E3A\u5B83**\u65F6\u95F4\u5BF9\u79F0**\uFF1A\u63A7\u5236\u70B9\u5173\u4E8E\u4E2D\u5FC3\u5BF9\u79F0\uFF0C\n * \u4E8E\u662F p(t) = 1 - p(1-t) \u2014\u2014 \u628A\u6536\u7403\u7684\u52A8\u753B\u5012\u8FC7\u6765\u653E\uFF0C\u6070\u597D\u5C31\u662F\u5C55\u5F00\u7684\u52A8\u753B\u3002\n * \u7528\u6237\u62A5\u7684\u6536\u653E\u4E0D\u5BF9\u79F0\u5C31\u662F\u8FD9\u4E48\u6765\u7684\uFF1A\u4E4B\u524D\u7528 easeOutQuint\uFF0C\u524D\u540E\u534A\u7A0B\u4E0D\u955C\u50CF\uFF0C\n * \u6536\u662F\u300C\u5FEB\u8D77\u6162\u6536\u300D\u3001\u653E\u4E5F\u662F\u300C\u5FEB\u8D77\u6162\u6536\u300D\uFF0C\u4E24\u4E2A\u65B9\u5411\u770B\u7740\u50CF\u4E24\u4EF6\u4E8B\u3002\n * \u65F6\u957F\u7ED9 .34s\uFF1A\u6240\u6709\u4F1A\u53D8\u7684\u5C5E\u6027\u5171\u7528\u5B83\uFF08\u4EFB\u4F55\u4E00\u6761\u4E0D\u4E00\u81F4\uFF0C\u4E2D\u95F4\u5E27\u7684\u5BBD\u5EA6\u5C31\u7531\u53E6\u4E00\u6761\u66F2\u7EBF\u51B3\u5B9A\uFF0C\u5BF9\u79F0\u6027\u5C31\u7834\u4E86\uFF09\u3002\n */\nexport var PILL_MORPH = '.28s cubic-bezier(.4,0,.6,1)'\n\n/**\n * \u6536\u7403\u540E\u7403\u5FC3\u91CC\u7684\u661F\u8292 \u2014\u2014 \u4E0E\u300C\u2726 \u89E3\u8BFB\u300D\u6D6E\u6807\u90A3\u9897\u661F**\u9010\u70B9\u540C\u5F62**\u3002\n *\n * \u6309\u94AE\u91CC\u90A3\u9897\u661F\u662F 16 \u753B\u5E03\u4E0A\u7684\u516B\u8FB9\u5F62\uFF1A\u5916\u534A\u5F84 5.6\u3001\u5185\u534A\u5F84 2.1213\uFF08\u5185\u5916\u6BD4 .3788\uFF09\u3001\u56DB\u6761\u8FB9\u662F\u76F4\u7EBF\n * \uFF08path `M8 2.4l1.5 4.1 4.1 1.5-4.1 1.5L8 13.6 6.5 9.5 2.4 8l4.1-1.5L8 2.4z`\uFF09\u3002\n * \u7403\u91CC\u7684\u5C3A\u5BF8\uFF1A\u5916\u534A\u5F84 6.0 \u2192 \u58A8\u8FF9 12.0px \u2014\u2014 \u548C\u80F6\u56CA\u91CC\u6587\u5B57\uFF08\u5B57\u53F7 12px\uFF09\u540C\u9AD8\uFF08\u7528\u6237\u8981\u6C42\uFF09\u3002\n * \uFF08\u539F\u6765\u6309 1.5 \u500D\u653E\u5927\u5230 16.8px\uFF0C\u5728 32px \u7403\u91CC\u663E\u5F97\u6BD4\u6587\u5B57\u58EE\u592A\u591A\u3002\uFF09\n *\n * \u5F62\u53D8\u65B9\u5F0F\uFF1A\u628A\"\u5706\u70B9\"\u548C\"\u661F\"\u90FD\u770B\u6210 **32 \u8FB9\u5F62**\u9010\u9876\u70B9\u63D2\u503C \u2014\u2014\n * \u00B7 PILL_STAR_DOT_D\uFF1A32 \u4E2A\u9876\u70B9\u540C\u534A\u5F84 4 \u2192 8px \u5706\u70B9\uFF088px \u4E0B\u4E0E\u6B63\u5706\u65E0\u5DEE\uFF0C\u6700\u5927\u504F\u5DEE 0.02px\uFF09\n * \u00B7 PILL_STAR_D\uFF1A32 \u4E2A\u9876\u70B9\u6B63\u597D\u843D\u5728\u661F\u8FB9\u754C\u4E0A\uFF08\u5C16\u4E0E\u8C37\u4ECD\u662F\u7CBE\u786E\u9876\u70B9\uFF09\u2192 \u4E0E\u6309\u94AE\u90A3\u6761 path \u9010\u70B9\u76F8\u540C\n * \u4E24\u6761 path \u547D\u4EE4\u7ED3\u6784\u4E00\u81F4\uFF08M + 31\u00D7L + Z\uFF09\uFF0C\u6240\u4EE5 Chrome \u80FD\u5BF9 `d` \u505A\u63D2\u503C\u3002\n * \u4E8E\u662F\"\u5706\u70B9\u957F\u6210\u661F\u8292\"\u662F**\u540C\u4E00\u4E2A\u5F62\u72B6\u5728\u957F**\uFF0C\u800C\u4E0D\u662F\"\u6DE1\u51FA\u4E00\u4E2A\u3001\u6DE1\u5165\u53E6\u4E00\u4E2A\"\uFF08\u90A3\u6837\u4E2D\u95F4\u5E27\u4F1A\u6389\u5206\u91CF\uFF09\u3002\n *\n * \u26A0\uFE0F \u522B\u6539\u6210\"\u516B\u4E2A\u9876\u70B9\u4E00\u8D77\u63D2\u503C\"\uFF1A\u6570\u5B66\u4E0A\u66F4\u77ED\uFF0C\u4F46\u4E2D\u95F4\u5E27\u4F1A\u7ECF\u8FC7\u4E00\u4E2A**\u6B63\u83F1\u5F62**\uFF08\u8C37\u8FD8\u6CA1\u6536\u3001\u8FB9\u662F\u76F4\u7684\uFF09\uFF0C\n * \u8BFB\u8D77\u6765\u50CF\"\u65B9\u5757\"\uFF0C\u548C\u5706\u70B9/\u661F\u8292\u90FD\u4E0D\u662F\u4E00\u8DEF\u3002\u5FC5\u987B\u53D6\u6837\u5230 32 \u4E2A\u9876\u70B9\uFF08\u661F\u90A3\u6761\u8FB9\u4E0A\u7684\u53D6\u6837\u70B9\u7CBE\u786E\u843D\u5728\u7EBF\u6BB5\u4E0A\uFF09\u3002\n * \u9876\u70B9\u7531 `node scripts/gen-star-path.mjs` \u751F\u6210\uFF0C\u53EF\u91CD\u8DD1\u6838\u5BF9\u3002\n */\n/**\n * \u6536\u653E\u65F6\u957F\uFF08\u6BEB\u79D2\uFF09\u2014\u2014 \u5FC5\u987B\u4E0E PILL_MORPH \u91CC\u7684 .28s \u4E00\u81F4\uFF1ACSS \u7BA1\u80F6\u56CA\u3001JS \u7BA1\u7403\u5FC3\u56FE\u5F62\uFF0C\n * \u4E24\u8005\u540C\u62CD\u624D\u662F\"\u540C\u4E00\u4EF6\u4E8B\"\u3002\u89C1 animatePillStar\u3002\n */\nexport var PILL_MORPH_MS = 280\n\n/** \u5F62\u53D8\u91C7\u6837\u70B9\u6570\uFF08\u5706\u4E0E\u661F\u90FD\u6309 32 \u8FB9\u5F62\u9010\u9876\u70B9\u63D2\u503C\uFF09\u3002 */\nexport var PILL_STAR_SAMPLES = 32\n\n/** \u5C16/\u8EAB\u4E24\u6BB5\u7684\u4EA4\u754C\uFF1A\u5C16\u5148\u62BD\u51FA\u6765\uFF080\u2192.62\uFF09\uFF0C\u8EAB\u518D\u6536\u6210\u661F\uFF08.38\u21921\uFF09\uFF0C\u91CD\u53E0 .24 \u6BB5\u4FDD\u8BC1\u65E0\u901F\u5EA6\u65AD\u70B9\u3002 */\nexport var PILL_STAR_TIP_END = 0.62\n\nexport var PILL_STAR_BODY_START = 0.38\n\n/**\n * \u7403\u5FC3\u56FE\u5F62\u90A3\u6761\u66F2\u7EBF\uFF08\u65F6\u95F4\u5BF9\u79F0\uFF1A.45+.55=1\u30010+1=1 \u2192 \u5012\u653E\u5373\u53E6\u4E00\u4E2A\u65B9\u5411\uFF09\u3002\n * \u6BD4\u80F6\u56CA\u90A3\u6761 (.4,0,.6,1) \u7565\u6536\u4E00\u70B9\uFF0C\u4E8E\u662F\u4E24\u5C42\u4E0D\u662F\u540C\u4E00\u4E2A\u8282\u62CD\uFF1A\u80F6\u56CA\u6ED1\u3001\u56FE\u5F62\u843D\u5B9A\u5F97\u5E72\u8106\u4E9B\u3002\n * \u26A0\uFE0F \u8BD5\u8FC7\u7ED9\u66F2\u7EBF\u52A0\"\u8FC7\u51B2\"\uFF08y \u8D8A\u51FA [0,1]\uFF09\u2014\u2014**\u4E0D\u884C**\uFF1A\u65F6\u95F4\u5BF9\u79F0\u7684 cubic-bezier \u53EA\u8981 y1+y2=1\uFF0C\n * \u66F2\u7EBF\u5C31\u5FC5\u662F\"\u4E0A-\u4E0B-\u4E0A\"\u7684\u6CE2\u6D6A\uFF08\u5B9E\u6D4B (.4,1.12,.6,-.12) \u5728 0.25 \u5904\u5DF2\u7ECF 0.40\u30010.75 \u5904\u624D 0.60\uFF09\uFF0C\n * \u770B\u7740\u662F\u4E00\u987F\u4E00\u987F\u7684\u3002\u8FC7\u51B2\u8981\u653E\u5728**\u5F62\u72B6\u7A7A\u95F4**\u91CC\uFF08PILL_STAR_POP\uFF09\uFF0C\u65F6\u95F4\u8F74\u4E0A\u59CB\u7EC8\u662F\u5E72\u51C0\u7684 S\u3002\n */\nexport var PILL_STAR_EASE = [0.45, 0, 0.55, 1]\n\n/**\n * \u5F62\u72B6\u7A7A\u95F4\u7684\u8FC7\u51B2\uFF1A\u5C16\u957F\u5230\u4F4D\u540E\u518D\"\u51B2\u51FA\u53BB\u4E00\u70B9\u70B9\"\u518D\u6536\u56DE\uFF080.075 = \u5C16\u6700\u591A\u5230 8.73\uFF0C\u843D\u5B9A\u56DE 8.4\uFF09\u3002\n * \u5305\u7EDC\u5728 p=.55 \u8D77\u3001p=.8 \u9644\u8FD1\u5230\u9876\u3001p=1 \u5F52\u96F6 \u2014\u2014 \u4E24\u7AEF\u4E3A 0 \u6240\u4EE5\u4E0D\u5F71\u54CD\u7AEF\u70B9\u3002\n * \u5B83\u662F p \u7684\u51FD\u6570\uFF0C\u6240\u4EE5\u6536/\u653E\u4ECD\u7136\u4E25\u683C\u4E92\u4E3A\u5012\u653E\u3002\n */\nexport var PILL_STAR_POP = 0.075\n\n/** \u5FAE\u8F6C\uFF08\u5EA6\uFF09\uFF1A\u5706\u70B9\u6001 -8\u00B0\u3001\u661F\u8292\u6001 0\u00B0\uFF1B\u8FC7\u51B2\u65F6\u4F1A\u7565\u8FC7 0 \u518D\u843D\u5B9A\u3002\u5706\u70B9\u65CB\u8F6C\u4E0D\u53D8\uFF0C\u6240\u4EE5\u8D77\u624B\u770B\u4E0D\u51FA\u6765\u3002 */\nexport var PILL_STAR_TWIST = 8\n\nexport var PILL_STAR_DOT_D = 'M4 0L3.92 0.78L3.7 1.53L3.33 2.22L2.83 2.83L2.22 3.33L1.53 3.7L0.78 3.92L0 4L-0.78 3.92L-1.53 3.7L-2.22 3.33L-2.83 2.83L-3.33 2.22L-3.7 1.53L-3.92 0.78L-4 0L-3.92 -0.78L-3.7 -1.53L-3.33 -2.22L-2.83 -2.83L-2.22 -3.33L-1.53 -3.7L-0.78 -3.92L0 -4L0.78 -3.92L1.53 -3.7L2.22 -3.33L2.83 -2.83L3.33 -2.22L3.7 -1.53L3.92 -0.78Z'\n\nexport var PILL_STAR_D = 'M6 0L3.89 0.77L2.81 1.17L2.12 1.42L1.61 1.61L1.42 2.12L1.17 2.81L0.77 3.89L0 6L-0.77 3.89L-1.17 2.81L-1.42 2.12L-1.61 1.61L-2.12 1.42L-2.81 1.17L-3.89 0.77L-6 0L-3.89 -0.77L-2.81 -1.17L-2.12 -1.42L-1.61 -1.61L-1.42 -2.12L-1.17 -2.81L-0.77 -3.89L0 -6L0.77 -3.89L1.17 -2.81L1.42 -2.12L1.61 -1.61L2.12 -1.42L2.81 -1.17L3.89 -0.77Z'\n\n/** \u5438\u9644\u6ED1\u884C\u7684\u65F6\u957F\uFF08\u6BEB\u79D2\uFF09\uFF1A\u6BD4\u8FC7\u6E21\u65F6\u957F\u591A\u4E00\u70B9\uFF0C\u8D70\u5B8C\u5C31\u628A\u5B9A\u4F4D\u4EA4\u8FD8\u7ED9 right/bottom\u3002 */\nexport var PILL_SNAP_MS = 360\nexport const preferences = { maxSelectionChars: 4000, pillIdleMs: 10000 }\n", "import { FONT, Z_BTN, PILL_BALL_SIZE, PILL_MORPH } from './constants.js'\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u6837\u5F0F \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport var CSS = [\n // \u6D6E\u73B0\u52A8\u6548\uFF1A\u4ECE\u951A\u70B9\uFF08\u53F3\u4E0B\u89D2 = \u8D34\u7740\u9009\u533A\u90A3\u4FA7\uFF09\u5F39\u6027\u653E\u5927\u3002\n // \u521D\u59CB 74% + 6px \u4E0B\u79FB\uFF0C\u7F13\u52A8\u5E26\u8FC7\u51B2\uFF1B\u65F6\u957F 240ms \u2014\u2014 \u8D85\u8FC7 ~300ms \u8FDE\u7EED\u5212\u9009\u4F1A\u663E\u5F97\u62D6\u6C93\u3002\n '.dsh-sel-btn{transform-origin:100% 100%;position:fixed;display:none;align-items:center;gap:5px;height:28px;padding:0 11px;border:0;border-radius:999px;',\n // \u6D6E\u6807\u6309\u94AE\u4FDD\u6301**\u539F\u6837**\uFF1A\u8DDF\u968F\u4E3B\u9898\u4E3B\u8272\uFF08\u9ED8\u8BA4\u84DD #3b6ef5\uFF09\uFF0C\u4E0D\u8DDF\u9762\u677F\u7684\u9752\u8272\u7EDF\u4E00\n 'background:var(--dsw-alias-button-primary-fill,#3b6ef5);color:var(--dsw-alias-label-primary-foreground,#fff);',\n 'font:500 12px/1 ' + FONT + ';cursor:pointer;white-space:nowrap;user-select:none;',\n 'box-shadow:0 6px 20px rgba(0,0,0,.24);transition:transform .1s ease,filter .1s ease}',\n '@keyframes dsh-sel-pop{from{opacity:0;transform:scale(.74) translateY(6px)}to{opacity:1;transform:none}}',\n // \u53EA\u5728\"\u4ECE\u9690\u85CF\u5230\u663E\u793A\"\u90A3\u4E00\u6B21\u6302\u4E0A\u8FD9\u4E2A\u7C7B\uFF1Banimationend \u540E\u6458\u6389\uFF0C\n // \u5426\u5219 fill:both \u4F1A\u628A transform \u9489\u5728 none \u4E0A\uFF0C:active \u7684\u6309\u538B\u7F29\u653E\u5C31\u6C38\u8FDC\u4E0D\u751F\u6548\u4E86\n // \u7528 data \u5C5E\u6027\u800C\u4E0D\u662F\u7C7B\u540D\uFF1A\u7C7B\u540D\u4E0D\u52A8\uFF0C\u5916\u9762\u6309 .dsh-sel-btn \u627E\u5B83/\u91CF\u5B83\u90FD\u4E0D\u4F1A\u88AB\u5F71\u54CD\n '.dsh-sel-btn[data-pop=\"1\"]{animation:dsh-sel-pop .24s cubic-bezier(.34,1.56,.64,1) both}',\n '.dsh-sel-btn:hover{filter:brightness(1.08)}',\n '.dsh-sel-btn:active{transform:scale(.97)}',\n // \u56FE\u6807\uFF1A13px \u753B\u5E03 + **\u5DE6\u79FB 1px**\u3002\n // \u4E3A\u4EC0\u4E48\u8981\u6709\u8FD9\u4E2A\u8D1F\u5916\u8FB9\u8DDD\uFF1A\u753B\u5E03\u662F 16\u00D716\u3001\u56FE\u5F62\u58A8\u8FF9\u53EA\u5360\u4E2D\u95F4 ~11px\uFF0C\u5DE6\u53F3\u5404\u7559 ~2px \u7A7A\u767D\uFF0C\n // \u800C\u53F3\u8FB9\u300C\u89E3\u8BFB / \u5F15\u7528\u300D\u4E24\u4E2A\u5B57\u7684\u58A8\u8FF9\u51E0\u4E4E\u6CA1\u6709\u53F3\u8FB9\u8DDD\uFF080.4~1.2px\uFF09\u2014\u2014 \u6309\u76D2\u5B50\u5C45\u4E2D\u7684\u8BDD\uFF0C\n // \u89C6\u89C9\u4E0A\u5DE6\u8FB9\u6BD4\u53F3\u8FB9\u5BBD ~1.7px\uFF0C\u6574\u7EC4\u770B\u7740\u504F\u53F3\uFF08\u5B9E\u6D4B\u58A8\u8FF9\u4E2D\u5FC3\u504F +0.88px\uFF09\u3002\n // \u8D1F\u5916\u8FB9\u8DDD\u628A\"\u58A8\u8FF9\"\u800C\u4E0D\u662F\"\u753B\u5E03\"\u6446\u6B63\uFF1B\u7528 1px \u800C\u4E0D\u662F\u7CBE\u786E\u7684 0.87px\uFF1A\u4E24\u4E2A\u6D6E\u6807\u7684\u6587\u5B57\n // \u8FB9\u8DDD\u4E0D\u540C\uFF08\u300C\u89E3\u8BFB\u300D0.4 / \u300C\u5F15\u7528\u300D1.2\uFF09\uFF0C\u53D6\u6574\u540E\u4E24\u679A\u6D6E\u6807\u7684\u504F\u5DEE\u90FD\u5728 0.5px \u5185\u3002\n '.dsh-sel-btn svg{width:13px;height:13px;display:block;margin-left:-1px}',\n // \u5168\u5C40\u4E00\u4E2A\u4E3B\u8272\uFF1A**\u9752**\uFF08\u4E24\u8282\u540C\u8272\uFF0C\u548C\u300C\u8BE6\u89E3\u300D\u4E00\u81F4\uFF09\u3002\n // --sel-a1/a2 \u88C5\u9970\uFF1A\u8FB9\u6761 / \u547C\u5438\u70B9 / \u6DE1\u5E95\uFF08\u4E0D\u627F\u8F7D\u6587\u5B57\uFF0C\u4E0D\u9700\u8981 AA\uFF09\n // --sel-a*-text \u6587\u5B57\uFF1A\u672F\u8BED\u3001\u6807\u9898\u3001\u7B26\u53F7\u3001\u94FE\u63A5\uFF08\u5B9E\u6D4B AA \u8FBE\u6807\uFF09\n // --sel-fill(-fg) \u5B9E\u5FC3\u5757\uFF1A\u6D6E\u6807\u6309\u94AE / \u53D1\u9001\u952E / \u7ED3\u8BBA\u6761\u6807\u7B7E\u2014\u2014\u5757\u4E0A\u6587\u5B57\u53E6\u7B97\u4E00\u5957\uFF0C\n // \u5426\u5219\u9752\u5E95\u914D\u767D\u5B57\u53EA\u6709 3.6\uFF08\u4E0D\u8FBE\u6807\uFF09\uFF0C\u6D45\u8272\u4E0B\u6362\u6210\u6DF1\u9752 5.4\u3001\u6DF1\u8272\u4E0B\u53CD\u767D 7.4\n // \u53D8\u91CF\u6302\u5728\u6D6E\u5C42\u5BB9\u5668\u4E0A \u2192 \u6D6E\u6807\u4E0E\u9762\u677F\u5171\u7528\uFF1B\u6DF1\u6D45\u7531**\u9762\u677F\u5B9E\u9645\u5E95\u8272**\u51B3\u5B9A\uFF08data-theme\uFF09\u3002\n '.dsh-sel-layer{position:fixed;inset:0;z-index:70;pointer-events:none;--sel-a1:#0d9488;--sel-a1-text:#0f766e;--sel-a2:#0d9488;--sel-a2-text:#0f766e;',\n '--sel-fill:#0f766e;--sel-fill-fg:#ffffff;',\n '--sel-a2-soft:color-mix(in srgb,var(--sel-a2) 12%,transparent);--sel-a1-soft:color-mix(in srgb,var(--sel-a1) 10%,transparent)}',\n '.dsh-sel-layer[data-full-view] .dsh-sel-pill{display:none!important}',\n '.dsh-sel-layer[data-theme=dark]{--sel-a1:#4ecdc4;--sel-a1-text:#6fe3d8;--sel-a2:#4ecdc4;--sel-a2-text:#6fe3d8;',\n '--sel-fill:#4ecdc4;--sel-fill-fg:#052b26;',\n '--sel-a2-soft:color-mix(in srgb,var(--sel-a2) 16%,transparent);--sel-a1-soft:color-mix(in srgb,var(--sel-a1) 16%,transparent)}',\n // \u26A0\uFE0F \u58F0\u660E\u5757\u5FC5\u987B\u5728**\u540C\u4E00\u6BB5\u5B57\u7B26\u4E32\u91CC\u6536\u5C3E**\u3002\n // \u4EE5\u524D\u8FD9\u91CC\u662F `...max-height:...;` \u540E\u9762\u76F4\u63A5\u63A5\u4E86\u4E00\u6761\u5B8C\u6574\u89C4\u5219 `[data-stage=translation]{...}`\uFF0C\n // `.dsh-sel-panel{` \u7684 `}` \u4E8E\u662F\u6C38\u8FDC\u6CA1\u51FA\u73B0 \u2014\u2014 \u90A3\u6761\u9636\u6BB5\u89C4\u5219\u88AB\u5F53\u6210\u5757\u5185\u7684**\u975E\u6CD5\u58F0\u660E**\u6574\u6761\u4E22\u5F03\uFF0C\n // \"\u9996\u8F6E\u6536\u7A84\u5230 440\" \u4ECE\u6765\u6CA1\u751F\u6548\u8FC7\uFF08\u5B9E\u6D4B\u8BA1\u7B97\u5BBD\u5EA6\u4E00\u76F4\u662F 540\uFF09\u3002\u540E\u9762\u51E0\u6BB5\u7684 border-radius /\n // overflow \u4E4B\u6240\u4EE5\u6CA1\u4E8B\uFF0C\u662F\u56E0\u4E3A CSS \u51FA\u9519\u6062\u590D\u4F1A\u8DF3\u8FC7\u574F\u58F0\u660E\u7EE7\u7EED\u5F80\u4E0B\u8BFB\u3002\n // \u5355\u6D4B\u53EA\u65AD\u8A00\u4E86 data-stage \u8FD9\u4E2A**\u5C5E\u6027**\uFF0C\u800C\u6869 DOM \u6CA1\u6709\u5E03\u5C40\uFF0C\u6240\u4EE5\u4E00\u76F4\u6CA1\u66B4\u9732\u3002\n // box-sizing:border-box \u662F**\u5FC5\u987B**\u7684\uFF1A\u62D6\u89D2\u6539\u5927\u5C0F\u65F6\u6211\u4EEC\u628A getBoundingClientRect()\uFF08\u542B\u8FB9\u6846\uFF09\n // \u7684\u5BBD\u9AD8\u5199\u56DE style.width/height\uFF0C\u800C\u5B83\u4EEC\u9ED8\u8BA4\u6309 content-box \u89E3\u91CA \u2014\u2014 \u5DEE\u4E00\u4E2A\u8FB9\u6846\u5BBD\uFF081px\uFF09\uFF0C\n // \u4E8E\u662F\"\u5B58\u8FDB\u53BB \u2192 \u8BFB\u56DE\u6765\"\u6BCF\u6765\u4E00\u8F6E\u5C31\u80D6 1px\uFF0C\u62D6\u51E0\u6B21\u5C31\u660E\u663E\u8D70\u5F62\uFF08\u5B9E\u6D4B 584 \u5B58\u8FDB\u53BB\u3001\u8BFB\u56DE\u6765 586\uFF09\u3002\n '.dsh-sel-panel{position:fixed;display:none;flex-direction:column;box-sizing:border-box;width:min(540px,calc(100vw - 20px));max-height:min(78vh,720px);',\n 'border-radius:16px;overflow:hidden;background:var(--dsw-alias-bg-layer-1,Canvas);color:var(--dsw-alias-label-primary,CanvasText);',\n 'border:.5px solid var(--dsw-alias-border-l3,rgba(140,140,140,.35));box-shadow:0 20px 52px rgba(0,0,0,.3);',\n 'font:400 13.5px/1.7 ' + FONT + '}',\n // \u8FD9\u91CC\u66FE\u7ECF\u6709\u4E00\u6761 `.dsh-sel-panel[data-stage=translation]{width:440px}`\uFF1A\n // \"\u9996\u8F6E\u53EA\u51FA\u7FFB\u8BD1\u65F6\u6536\u7A84\u4E00\u70B9\"\u3002\u5B83\u56E0\u4E3A\u4E0A\u9762\u90A3\u4E2A\u6F0F\u6389\u7684 `}` \u4E00\u76F4\u662F\u6B7B\u4EE3\u7801\uFF0C\u4FEE\u597D\u95ED\u5408\u4E4B\u540E\u624D\u771F\u6B63\u751F\u6548\uFF0C\n // \u4E00\u751F\u6548\u5C31\u66B4\u9732\u4E86\u95EE\u9898 \u2014\u2014 \u5BBD\u5EA6\u4F1A**\u5728\u8FFD\u95EE\u90A3\u4E00\u523B\u4ECE 440 \u8DF3\u5230 540**\uFF08\u89C1 syncPanelStage \u7684\u5224\u5B9A\uFF09\uFF0C\n // \u7528\u6237\u770B\u5230\u540C\u4E00\u4E2A\u7A97\u53E3\u81EA\u5DF1\u53D8\u5BBD\uFF0C\u95EE\"\u600E\u4E48\u6709\u8FFD\u95EE\u548C\u6CA1\u8FFD\u95EE\u7684\u5BBD\u5EA6\u4E0D\u4E00\u6837\"\u3002\n // \u51B3\u5B9A\uFF1A**\u7EDF\u4E00\u6210 540\uFF0C\u5BBD\u5EA6\u4E0D\u968F\u9636\u6BB5\u53D8**\u3002\u5C11\u4E00\u6863\u5C31\u6CA1\u8FD9\u6863\u5B50\u4E8B\uFF0C\u4E5F\u6CA1\u6709\"\u4EC0\u4E48\u65F6\u5019\u4F1A\u8DF3\"\u7684\u5FC3\u667A\u8D1F\u62C5\u3002\n // \uFF08data-stage \u672C\u8EAB\u4FDD\u7559 \u2014\u2014 \u5B83\u8FD8\u51B3\u5B9A\u8FFD\u95EE\u8F93\u5165\u6846\u663E\u4E0D\u663E\u793A\uFF0C\u89C1 renderPanel\u3002\uFF09\n // \u8BBE\u7F6E\u62BD\u5C49\u5F00\u7740\u65F6\u53EA\u8865**\u9AD8\u5EA6**\u4E0B\u9650\uFF0C**\u4E0D\u52A8\u5BBD\u5EA6**\u3002\n //\n // \u62BD\u5C49\u662F inset:0 \u8D34\u5728\u9762\u677F\u4E0A\u7684\uFF1A\u9762\u677F\u591A\u5BBD\uFF0C\u62BD\u5C49\u5C31\u591A\u5BBD \u2014\u2014 \u8FD9\u662F\u8981\u7684\uFF08\u8BBE\u7F6E\u7A97\u53E3\u4E0E\u5C0F\u7A97\u7B49\u5BBD\uFF0C\n // \u5F00\u62BD\u5C49\u65F6\u5C0F\u7A97\u4E0D\u8BE5\"\u80D6\u4E00\u5708\"\uFF09\u3002\u4F46\u9AD8\u5EA6\u4E0D\u80FD\u4E0D\u7BA1\uFF1A\u9762\u677F\u9AD8\u5EA6\u662F\u7531\"\u89E3\u8BFB\u5185\u5BB9\u6709\u591A\u957F\"\u6491\u51FA\u6765\u7684\uFF0C\n // \u521A\u5F00\u7A97\uFF08\u53EA\u51FA\u4E86\u7FFB\u8BD1\uFF09\u65F6\u9762\u677F\u624D ~115px \u9AD8\uFF0C\u8BBE\u7F6E\u5217\u8868\u53EA\u5269 17px \u53EF\u89C6\u9AD8\u5EA6\uFF08\u5B9E\u6D4B\uFF09\u3002\n // \u6240\u4EE5\u53EA\u7ED9 min-height\uFF1B\u5BBD\u5EA6\u4EA4\u7ED9\u9762\u677F\u81EA\u5DF1\u7684\u89C4\u5219\uFF08\u9996\u8F6E 440 / \u5176\u4F59 540\uFF09\uFF0C\u62BD\u5C49\u81EA\u52A8\u8DDF\u968F\u3002\n // min-height \u7528 min() \u4E0E max-height \u540C\u6E90\uFF0C\u89C6\u53E3\u77EE\u65F6\u4E24\u8005\u76F8\u7B49\uFF0C\u4E0D\u4F1A\u9876\u51FA\u5C4F\u5E55\u3002\n // \u53EA\u5728**\u7528\u6237\u6CA1\u81EA\u5DF1\u6539\u8FC7\u5C3A\u5BF8**\u65F6\u624D\u8865\u8FD9\u4E2A\u4E0B\u9650\uFF1A\u4ED6\u62C9\u8FC7\u5927\u5C0F\u5C31\u6309\u4ED6\u7684\u6765\uFF08min-height \u4F1A\u538B\u8FC7 inline height\uFF09\n '.dsh-sel-panel[data-settings=\"1\"]:not([data-resized=\"1\"]){min-height:min(560px,78vh)}',\n // \u6539\u5927\u5C0F\u624B\u67C4\uFF1A\u53F3\u4E0B\u89D2\u4E00\u4E2A\u89D2\u6807 + \u53F3\u8FB9/\u4E0B\u8FB9\u5404\u4E00\u6761\uFF08\u7EC6\uFF0C\u4E0D\u62A2\u89C6\u7EBF\uFF1Bhover/\u62D6\u52A8\u65F6\u624D\u660E\u663E\uFF09\n // z-index \u6BD4\u8BBE\u7F6E\u62BD\u5C49(6)\u9AD8 \u2014\u2014 \u4F46\u62BD\u5C49\u5F00\u7740\u65F6\u6574\u4F53\u9690\u85CF\uFF08\u89C1\u4E0B\u9762\u7684\u89C4\u5219\uFF09\uFF1A\n // \u62BD\u5C49\u9875\u811A\u53F3\u4FA7\u5C31\u662F\u300C\u5173\u95ED\u300D\u6309\u94AE\uFF0C\u89D2\u6807\u538B\u4E0A\u53BB\u4F1A\u8BEF\u70B9\u3002\n '.dsh-sel-grip{position:absolute;z-index:7;background:transparent;touch-action:none}',\n '.dsh-sel-grip-corner{right:0;bottom:0;width:16px;height:16px;cursor:nwse-resize}',\n '.dsh-sel-grip-r{right:0;top:12px;bottom:16px;width:6px;cursor:ew-resize}',\n '.dsh-sel-grip-b{left:12px;right:16px;bottom:0;height:6px;cursor:ns-resize}',\n // \u624B\u67C4**\u4E0D\u753B\u4EFB\u4F55\u5E38\u9A7B\u6807\u8BC6**\uFF1A\u4EE5\u524D\u89D2\u4E0A\u6709\u4E00\u9053\u5C0F\u659C\u7EB9\uFF08\u4E24\u6761 1.5px \u8FB9\u6846\u62FC\u7684\u76F4\u89D2\uFF09\uFF0C\n // \u5728\u6D45\u8272\u9762\u677F\u4E0A\u770B\u7740\u50CF\u591A\u51FA\u6765\u7684\u4E00\u7B14\uFF0C\u7528\u6237\u660E\u786E\u8981\u6C42\u53BB\u6389\u3002\n // \u4FDD\u7559 hover \u65F6\u8FB9\u7F18\u7684\u9AD8\u4EAE\uFF08\u53EA\u5728\u9F20\u6807\u79FB\u4E0A\u53BB\u65F6\u51FA\u73B0\uFF0C\u4E0D\u5360\u89C6\u89C9\uFF09\u2014\u2014\n // \u52A0\u4E0A cursor: nwse-resize / ew-resize / ns-resize\uFF0C\u53EF\u53D1\u73B0\u6027\u8FD8\u5728\u3002\n // \u62BD\u5C49\u5F00\u7740\u65F6\u6536\u8D77\u624B\u67C4\uFF08\u9875\u811A\u53F3\u4FA7\u662F\u300C\u5173\u95ED\u300D\u6309\u94AE\uFF0C\u522B\u8BA9\u89D2\u6807\u538B\u4E0A\u53BB\uFF09\n '.dsh-sel-panel[data-settings=\"1\"] .dsh-sel-grip{display:none}',\n '.dsh-sel-head{display:flex;align-items:center;gap:8px;padding:10px 10px 10px 14px;cursor:grab;user-select:none;',\n 'border-bottom:.5px solid var(--dsw-alias-border-l4,rgba(140,140,140,.22))}',\n '.dsh-sel-head:active{cursor:grabbing}',\n '.dsh-sel-mark{width:7px;height:7px;border-radius:50%;background:var(--sel-a1,#0d9488);flex:0 0 auto}',\n '.dsh-sel-title{font-weight:600;font-size:12.5px;letter-spacing:.2px}',\n // \u5206\u8282\u6807\u9898\u53F3\u4FA7\u7684\u72B6\u6001\u63D0\u793A\uFF08\u68C0\u7D22\u4E2D/\u601D\u8003\u5C3E\u5DF4/\u6863\u4F4D\u8BF4\u660E\uFF09\u2014\u2014\u9760 margin-left:auto \u8D34\u53F3\u8FB9\n '.dsh-sel-hint{margin-left:auto;font-size:11px;opacity:.55;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:150px}',\n '.dsh-sel-icon{flex:0 0 auto;width:24px;height:24px;display:grid;place-items:center;border:0;border-radius:8px;cursor:pointer;white-space:nowrap;',\n 'background:transparent;color:inherit;font:inherit;opacity:.7}',\n '.dsh-sel-icon:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(140,140,140,.16));opacity:1}',\n // \u5E26\u6587\u5B57\u7684\u52A8\u4F5C\u6309\u94AE\uFF1A\u5BBD\u5EA6\u81EA\u9002\u5E94\uFF0C\u907F\u514D\u6587\u5B57\u5728\u5C0F\u65B9\u5757\u91CC\u9519\u4F4D\n '.dsh-sel-action{flex:0 0 auto;height:24px;padding:0 9px;display:inline-flex;align-items:center;justify-content:center;gap:3px;',\n 'border:.5px solid var(--dsw-alias-border-l3,rgba(140,140,140,.35));border-radius:8px;cursor:pointer;white-space:nowrap;',\n 'background:transparent;color:inherit;font:inherit;font-size:11.5px;line-height:1;opacity:.85}',\n '.dsh-sel-action:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(140,140,140,.16));opacity:1}',\n '.dsh-sel-action:disabled{opacity:.4;cursor:default}',\n // \u7EDF\u4E00\u56FE\u6807\uFF08\u5934\u90E8 / \u5DE5\u5177\u884C\uFF09\uFF1A\u5C3A\u5BF8\u7531 SVG \u7684 width/height \u5C5E\u6027\u7ED9\uFF0C\u8FD9\u91CC\u53EA\u9489\u4F4F\u663E\u793A\u65B9\u5F0F\n '.dsh-sel-ic{display:block;flex:none}',\n // \u5E26\u6587\u5B57\u7684\u56FE\u6807\u952E\u91CC\u7684\u56FE\u6807\uFF1A\u548C\u6587\u5B57\u4E4B\u95F4\u7559\u4E00\u70B9\u547C\u5438\uFF0C\u522B\u8D34\u5728\u4E00\u8D77\n '.dsh-sel-action .dsh-sel-ic{margin-right:1px}',\n '.dsh-sel-icon .dsh-sel-ic{margin:0}',\n // \u9009\u4E2D\u6587\u5B57quote\uFF1A\u5DE6\u4FA7\u5F3A\u8C03\u6761 + \u7565\u6697\u5E95\n // \u9009\u4E2D\u6587\u5B57\u6761\uFF1A\u5728\u6EDA\u52A8\u533A\u91CC\uFF08\u8DDF\u7740\u6D88\u606F\u4E00\u8D77\u6EDA\uFF09\uFF0C\u5DE6\u53F3\u8FB9\u8DDD\u4EA4\u7ED9 body \u7684 padding \u6240\u4EE5\u4E0E\u5185\u5BB9\u5BF9\u9F50\u3002\n // \u53EF\u4EE5\u81EA\u52A8\u6362\u884C\u3001\u8D85\u8FC7 84px \u5185\u90E8\u6EDA\u52A8\uFF0C\u4F46**\u4E0D\u663E\u793A\u6EDA\u52A8\u6761**\u3002\n // \u26A0\uFE0F flex:0 0 auto \u4E0D\u80FD\u7701\uFF1A\u6EDA\u52A8\u533A\u662F flex \u5217\uFF0C\u800C overflow \u975E visible \u7684 flex \u9879\u76EE\n // \u81EA\u52A8\u6700\u5C0F\u9AD8\u5EA6\u662F 0 \u2192 \u5185\u5BB9\u4E00\u591A\u5C31\u88AB\u538B\u6241\uFF0C\u6587\u5B57\u76F4\u63A5\u770B\u4E0D\u5168\uFF08\u5B9E\u6D4B\u8E29\u8FC7\uFF09\u3002\n '.dsh-sel-quote{margin:0;padding:7px 11px;border-radius:10px;flex:0 0 auto;border-left:3px solid var(--sel-a1,#0d9488);',\n 'background:var(--dsw-alias-interactive-bg-hover,rgba(140,140,140,.11));color:var(--dsw-alias-label-secondary,inherit);',\n 'font-size:12.5px;line-height:1.6;box-sizing:border-box;max-width:100%;max-height:84px;',\n 'overflow-y:auto;overflow-x:hidden;white-space:pre-wrap;word-break:break-word;scrollbar-width:none}',\n '.dsh-sel-quote::-webkit-scrollbar{width:0;height:0;display:none}',\n // \u6B63\u6587\u533A\uFF1A\u4E24\u8282\u5404\u81EA\u6210\u5361\u7247\uFF0C\u5C42\u6B21\u6E05\u695A\n '.dsh-sel-body{overflow:auto;padding:12px 14px 14px;display:flex;flex-direction:column;gap:12px;flex:1 1 auto;',\n 'scrollbar-width:thin;scrollbar-color:rgba(140,140,140,.35) transparent}',\n '.dsh-sel-body::-webkit-scrollbar{width:9px;height:9px}',\n '.dsh-sel-body::-webkit-scrollbar-track{background:transparent}',\n '.dsh-sel-body::-webkit-scrollbar-thumb{background:rgba(140,140,140,.3);border-radius:9px;border:2px solid transparent;background-clip:content-box}',\n '.dsh-sel-body:hover::-webkit-scrollbar-thumb{background:rgba(140,140,140,.5);background-clip:content-box}',\n '.dsh-sel-sec{border-radius:12px;padding:11px 13px 12px;display:flex;flex-direction:column;gap:9px;',\n 'background:var(--dsw-alias-bg-base,rgba(140,140,140,.06));border:.5px solid var(--dsw-alias-border-l4,rgba(140,140,140,.2));',\n 'border-left-width:3px}',\n '.dsh-sel-sec[data-sec=translation]{background:var(--dsw-alias-interactive-bg-hover,rgba(140,140,140,.09));border-left-color:var(--sel-a1)}',\n '.dsh-sel-sec[data-sec=detail]{border-left-color:var(--sel-a2)}',\n '.dsh-sel-sh{display:flex;align-items:center;gap:7px;font-size:12.5px;font-weight:700;letter-spacing:.5px}',\n '.dsh-sel-sec[data-sec=translation] .dsh-sel-sh{color:var(--sel-a1-text)}',\n '.dsh-sel-sec[data-sec=detail] .dsh-sel-sh{color:var(--sel-a2-text)}',\n '.dsh-sel-sh i{width:3px;height:13px;border-radius:2px;background:currentColor;display:block}',\n '.dsh-sel-sh b{font-weight:600;font-size:11px;opacity:.6}',\n '.dsh-sel-c{font-size:13.5px;line-height:1.82;word-break:break-word;text-wrap:pretty}',\n '.dsh-sel-c p{margin:0 0 10px}',\n '.dsh-sel-c p:last-child{margin-bottom:0}',\n '.dsh-sel-sub{display:flex;align-items:center;gap:7px;font-weight:700;font-size:13.5px;margin:13px 0 6px;',\n 'color:var(--sel-a1-text)}',\n '.dsh-sel-sub::before{content:\"\";width:3px;height:12px;border-radius:2px;background:currentColor;opacity:.85;flex:0 0 auto}',\n '.dsh-sel-sec[data-sec=detail] .dsh-sel-sub{color:var(--sel-a2-text)}',\n '.dsh-sel-c>*:first-child.dsh-sel-sub{margin-top:0}',\n '.dsh-sel-list{display:flex;flex-direction:column;gap:7px;margin:0 0 10px}',\n '.dsh-sel-list:last-child{margin-bottom:0}',\n '.dsh-sel-list[data-level=\"1\"]{margin-left:16px;gap:5px}',\n '.dsh-sel-list[data-level=\"2\"]{margin-left:32px;gap:4px}',\n '.dsh-sel-item{display:flex;gap:9px;align-items:flex-start}',\n '.dsh-sel-item>span:last-child{flex:1 1 auto}',\n // \u7B26\u53F7\u7528\u672C\u8282\u4E3B\u8272\uFF1A\u9876\u5C42\u5B9E\u5FC3\u3001\u5D4C\u5957\u6DE1\u4E00\u6863\uFF0C\u626B\u4E00\u773C\u5C31\u77E5\u9053\u5C42\u7EA7\n '.dsh-sel-bullet{flex:0 0 auto;width:14px;text-align:right;font-variant-numeric:tabular-nums;line-height:1.8;',\n 'color:var(--sel-a1-text);opacity:.9;font-weight:600;font-size:12px}',\n '.dsh-sel-sec[data-sec=detail] .dsh-sel-bullet{color:var(--sel-a2-text)}',\n '.dsh-sel-list[data-level=\"1\"] .dsh-sel-bullet{opacity:.55;font-weight:400}',\n '.dsh-sel-list[data-level=\"2\"] .dsh-sel-bullet{opacity:.38;font-weight:400}',\n '.dsh-sel-item[data-num=\"1\"] .dsh-sel-bullet{width:22px;opacity:.9}',\n '.dsh-sel-quote-line{margin:0 0 9px;padding:2px 0 2px 10px;border-left:2px solid var(--dsw-alias-border-l3,rgba(140,140,140,.4));',\n 'opacity:.85}',\n // \u7FFB\u8BD1\u8282\u7684\u7ED3\u8BBA\u6761\uFF1A\u300C\u5728\u672C\u53E5\u4E2D\uFF1A\u2026\u300D\u662F\u91CD\u70B9\uFF0C\u9AD8\u4EAE\u5448\u73B0\n '.dsh-sel-callout{margin:6px 0 0;padding:9px 11px;border-radius:10px;border-left:3px solid var(--sel-a1);',\n 'background:var(--sel-a1-soft);font-size:13.5px;line-height:1.72;font-weight:500}',\n '.dsh-sel-sec[data-sec=detail] .dsh-sel-callout{border-left-color:var(--sel-a2);background:var(--sel-a2-soft)}',\n '.dsh-sel-callout-tag{display:inline-block;margin-right:6px;padding:1px 7px;border-radius:6px;font-size:11px;font-weight:600;',\n 'background:var(--sel-fill,#0f766e);color:var(--sel-fill-fg,#fff);vertical-align:1px}',\n '.dsh-sel-sec[data-sec=detail] .dsh-sel-callout-tag{background:var(--sel-fill,#0f766e);color:var(--sel-fill-fg,#fff)}',\n '.dsh-sel-sec[data-sec=translation] .dsh-sel-quote-line{border-left-width:3px;border-radius:8px;padding:8px 11px;opacity:1;',\n 'border-left-color:var(--sel-a1);background:var(--sel-a1-soft);font-weight:500}',\n // \u5BF9\u7167\u8868\u683C\n '.dsh-sel-tablewrap{overflow-x:auto;margin:2px 0 10px}',\n '.dsh-sel-table{width:100%;border-collapse:collapse;font-size:12.6px;line-height:1.6}',\n '.dsh-sel-table th,.dsh-sel-table td{border:.5px solid var(--dsw-alias-border-l4,rgba(140,140,140,.3));padding:5px 9px;text-align:left;vertical-align:top}',\n '.dsh-sel-table th{background:var(--dsw-alias-interactive-bg-hover,rgba(140,140,140,.12));font-weight:600;white-space:nowrap}',\n '.dsh-sel-table tbody tr:nth-child(even) td{background:rgba(140,140,140,.05)}',\n '.dsh-sel-hr{border:0;border-top:.5px solid var(--dsw-alias-border-l4,rgba(140,140,140,.28));margin:11px 0}',\n '.dsh-sel-code{padding:1px 5px;border-radius:5px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12.5px;',\n 'background:var(--dsw-alias-interactive-bg-hover,rgba(140,140,140,.18))}',\n // \u4EE3\u7801\u914D\u8272\uFF1A--hl-* \u7531\u4E24\u5957\u8C03\u8272\u677F\u63D0\u4F9B\uFF08\u6D45\u8272 = GitHub Light / \u6DF1\u8272 = One Dark \u98CE\u683C\uFF09\u3002\n // \u7528\u54EA\u5957\u4E0D\u770B OS \u504F\u597D\uFF0C\u800C\u662F\u6309**\u9762\u677F\u5B9E\u9645\u5E95\u8272**\u7B97\u4EAE\u5EA6\u540E\u6253 data-hl \u2014\u2014 \u4E3B\u9898\u8DDF\u7740 App \u8D70\uFF0C\n // OS \u4E0E App \u4E3B\u9898\u4E0D\u4E00\u81F4\u65F6\u4E5F\u4E0D\u4F1A\u51FA\u73B0\"\u6DF1\u5E95\u914D\u6DF1\u5B57\"\u3002\n '.dsh-sel-pre{--hl-kw:#8250df;--hl-str:#0a7d33;--hl-num:#b45309;--hl-com:#8b8f96;--hl-fn:#0a5bd3;--hl-tag:#c2410c;--hl-attr:#b45309;--hl-op:#6b7280;--hl-var:#b45309;--hl-type:#c2410c}',\n '.dsh-sel-pre[data-hl=dark]{--hl-kw:#c678dd;--hl-str:#98c379;--hl-num:#d19a66;--hl-com:#8b949e;--hl-fn:#61afef;--hl-tag:#e06c75;--hl-attr:#d19a66;--hl-op:#9aa0a6;--hl-var:#d19a66;--hl-type:#e5c07b}',\n '@media (prefers-color-scheme:dark){.dsh-sel-pre:not([data-hl]){--hl-kw:#c678dd;--hl-str:#98c379;--hl-num:#d19a66;--hl-com:#8b949e;--hl-fn:#61afef;--hl-tag:#e06c75;--hl-attr:#d19a66;--hl-op:#9aa0a6;--hl-var:#d19a66;--hl-type:#e5c07b}}',\n '.dsh-hl-com{color:var(--hl-com)}',\n '.dsh-sel-pre-line{display:block;white-space:pre;min-height:1.6em}',\n // \u6CE8\u91CA\u884C\u6298\u884C\uFF1A\u7EED\u884C\u4ECE padding \u5904\u5F00\u59CB\uFF08= \u6CE8\u91CA\u8D77\u59CB\u5217\uFF09\uFF0C\u4E0D\u4F1A\u8DD1\u5230\u6CE8\u91CA\u5DE6\u8FB9\n '.dsh-sel-pre-line[data-wrap]{white-space:pre-wrap;overflow-wrap:anywhere}',\n '.dsh-sel-pre-cmt{opacity:.78}',\n '.dsh-hl-str{color:var(--hl-str)}',\n '.dsh-hl-num{color:var(--hl-num)}',\n '.dsh-hl-kw{color:var(--hl-kw);font-weight:600}',\n '.dsh-hl-fn{color:var(--hl-fn)}',\n '.dsh-hl-tag{color:var(--hl-tag)}',\n '.dsh-hl-attr{color:var(--hl-attr)}',\n '.dsh-hl-op{color:var(--hl-op)}',\n '.dsh-hl-var{color:var(--hl-var)}',\n '.dsh-hl-type{color:var(--hl-type)}',\n // \u7F51\u9875\u9884\u89C8\u5757\uFF1A\u5DE5\u5177\u680F\uFF08\u9884\u89C8/\u4EE3\u7801 + \u653E\u5927\uFF09+ \u6C99\u7BB1 iframe\n // \u9884\u89C8\u8981\"\u65E0\u611F\u878D\u5165\"\uFF1A\u4E0D\u753B\u5916\u6846\u3001\u4E0D\u5360\u4E00\u6761\u767D\u5E95\u5DE5\u5177\u680F\uFF0C\u5DE5\u5177\u680F\u6DE1\u6DE1\u7684\u3001\u9F20\u6807\u79FB\u4E0A\u53BB\u624D\u6E05\u6670\n '.dsh-sel-preview{margin:2px 0 12px;border:0;border-radius:0;overflow:visible;background:transparent}',\n '.dsh-sel-previewbar{display:flex;align-items:center;gap:6px;padding:0 0 5px;border-bottom:0;',\n 'font-size:11px;line-height:1.4;opacity:.38;transition:opacity .15s ease}',\n '.dsh-sel-preview:hover .dsh-sel-previewbar{opacity:1}',\n '.dsh-sel-previewtabs{display:flex;gap:2px;flex:1 1 auto;min-width:0}',\n '.dsh-sel-previewtab{border:0;background:transparent;color:inherit;font:inherit;cursor:pointer;opacity:.55;',\n 'padding:2px 8px;border-radius:6px;white-space:nowrap}',\n '.dsh-sel-previewtab[data-on=\"1\"]{opacity:1;font-weight:600;background:var(--dsw-alias-interactive-bg-hover,rgba(140,140,140,.16))}',\n '.dsh-sel-previewzoom{border:0;background:transparent;color:inherit;font:inherit;cursor:pointer;opacity:.55;',\n 'padding:2px 7px;border-radius:6px;white-space:nowrap}',\n '.dsh-sel-previewzoom:hover,.dsh-sel-previewtab:hover{opacity:.9;background:var(--dsw-alias-interactive-bg-hover,rgba(140,140,140,.12))}',\n // \u9AD8\u5EA6\u7531\u9875\u9762\u81EA\u5DF1\u4E0A\u62A5\uFF08\u89C1 adaptPreviewHtml \u91CC\u6CE8\u5165\u7684 hook\uFF09\uFF0C\u521D\u59CB 320 \u53EA\u662F\u515C\u5E95\n '.dsh-sel-previewframe{display:block;width:100%;height:320px;border:0;border-radius:8px;background:#fff;',\n 'transition:height .12s ease}',\n '.dsh-sel-preview[data-view=\"code\"] .dsh-sel-previewframe{border-radius:0}',\n // \u300C\u653E\u5927\u300D\u6863\u4E0D\u518D\u662F\u56FA\u5B9A 460\uFF0C\u800C\u662F\"\u9762\u677F\u91CC\u80FD\u653E\u591A\u9AD8\u5C31\u591A\u9AD8\"\uFF08\u9762\u677F\u672C\u8EAB max-height:78vh\uFF09\n // \u9ED8\u8BA4\u5168\u91CF\uFF1A\u9AD8\u5EA6\u7531\u9875\u9762\u5185\u5BB9\u51B3\u5B9A\uFF08\u4E0B\u9762 JS \u6309\u4E0A\u62A5\u503C\u8BBE inline height\uFF09\uFF0C**\u5185\u90E8\u4E0D\u6EDA\u52A8**\n // \u70B9\u300C\u8FD8\u539F\u300D\u2192 data-full=\"0\"\uFF1A\u56DE\u5230\u56FA\u5B9A\u9AD8\u5EA6\uFF08320px\uFF0C\u8D85\u51FA\u4EA4\u7ED9\u5185\u90E8\u6EDA\u52A8\uFF0C\u6EDA\u52A8\u6761\u5DF2\u9690\u85CF\uFF09\n '.dsh-sel-preview[data-full=\"0\"] .dsh-sel-previewframe{height:320px}',\n '.dsh-sel-preview[data-view=\"code\"] .dsh-sel-previewframe{display:none}',\n '.dsh-sel-preview[data-view=\"preview\"] .dsh-sel-pre{display:none}',\n '.dsh-sel-preview .dsh-sel-pre{margin:0;border-radius:0;max-height:320px;overflow:auto}',\n '.dsh-sel-pre{margin:2px 0 10px;padding:9px 11px;border-radius:9px;overflow-x:auto;white-space:pre;',\n 'font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12.4px;line-height:1.6;',\n 'background:var(--dsw-alias-interactive-bg-hover,rgba(140,140,140,.13));border:.5px solid var(--dsw-alias-border-l4,rgba(140,140,140,.22))}',\n '.dsh-sel-strong{font-weight:600;color:var(--sel-a1-text)}',\n '.dsh-sel-sec[data-sec=detail] .dsh-sel-strong{color:var(--sel-a2-text)}',\n // \u884C\u5185\u4EE3\u7801\uFF1A\u6DE1\u5E95 + \u4E3B\u8272\uFF0C\u548C\u52A0\u7C97\u672F\u8BED\u533A\u5206\u5F00\n '.dsh-sel-code{color:var(--sel-a1-text)}',\n '.dsh-sel-sec[data-sec=detail] .dsh-sel-code{color:var(--sel-a2-text)}',\n // \u8FFD\u95EE\u5C0F\u7A97\uFF1A\u6C14\u6CE1 + \u8F93\u5165\u884C\n // \u6D88\u606F\u6392\u7248\u5BF9\u9F50\u4E3B\u4F1A\u8BDD\uFF1A\u7528\u6237\u6D88\u606F=\u53F3\u5BF9\u9F50\u5706\u89D2\u6C14\u6CE1\uFF1B\u52A9\u624B\u6D88\u606F=\u6574\u5BBD\u65E0\u6C14\u6CE1\uFF08\u5C31\u662F\u6B63\u6587\uFF09\u3002\n // \u4E4B\u524D\u4E24\u8005\u90FD\u662F\u6C14\u6CE1\uFF0C\u7ED3\u679C\"\u6709\u7F51\u9875\u7684\u6C14\u6CE1\"\u548C\"\u666E\u901A\u6C14\u6CE1\"\u5BBD\u5EA6\u4E0D\u4E00\u81F4\uFF0C\u89C2\u611F\u4E5F\u8DDF\u4E3B\u4F1A\u8BDD\u4E0D\u50CF\u3002\n '.dsh-sel-chatlog{display:flex;flex-direction:column;gap:14px}',\n '.dsh-sel-bubble{max-width:100%;padding:0;border:0;background:transparent;border-radius:0;',\n 'font-size:13.6px;line-height:1.72;word-break:break-word}',\n '.dsh-sel-bubble-user{margin-left:auto;max-width:min(82%,520px);padding:9px 15px;border-radius:20px;',\n 'background:var(--dsw-specific-bubble,var(--dsw-alias-interactive-bg-hover,rgba(140,140,140,.16)));',\n 'white-space:pre-wrap;word-break:break-word}',\n '.dsh-sel-bubble-bot{align-self:stretch;white-space:normal}',\n '.dsh-sel-bubble-err{color:var(--dsw-alias-state-error-primary,#e5484d)}',\n // \u9996\u8F6E\u7684\u5C55\u5F00 CTA\uFF1A\u8DDF\u968F\u5185\u5BB9\u6D41\uFF0C\u505A\u6210\"\u4E0B\u4E00\u6B65\u52A8\u4F5C\"\u800C\u4E0D\u662F\u4E00\u6761\u5B64\u96F6\u96F6\u7684\u6A2A\u6761\n '.dsh-sel-expand{margin:0;width:100%;padding:9px 12px;display:flex;align-items:center;justify-content:center;gap:2px;',\n 'border:1px solid color-mix(in srgb,var(--sel-a1,#0d9488) 40%,transparent);',\n 'border-radius:11px;cursor:pointer;color:var(--sel-a1-text,#0f766e);',\n 'background:var(--dsw-alias-interactive-bg-hover,rgba(140,140,140,.1));',\n 'background:color-mix(in srgb,var(--sel-a1,#0d9488) 9%,transparent);',\n 'font:inherit;font-size:13px;line-height:1.4;text-align:left;white-space:nowrap}',\n '.dsh-sel-expand:hover{background:color-mix(in srgb,var(--sel-a1,#0d9488) 16%,transparent)}',\n '.dsh-sel-expand:disabled{opacity:.5;cursor:default}',\n '.dsh-sel-expand small{font-size:11.5px;opacity:.72;font-weight:400}',\n // \u8F93\u5165\u533A\uFF1A\u4EFF\u4E3B\u4F1A\u8BDD composer \u2014\u2014 \u4E24\u884C\u7ED3\u6784\uFF08\u4E0A\u9762\u8F93\u5165\uFF0C\u4E0B\u9762\u4E00\u884C\u5DE5\u5177\uFF09\uFF0C\u5706\u89D2\u5927\u4E00\u4E9B\n '.dsh-sel-ask{position:relative;display:flex;flex-direction:column;gap:6px;margin:0 12px 12px;padding:10px 10px 8px 14px;',\n 'border-radius:22px;border:1px solid var(--dsw-alias-border-l3,rgba(140,140,140,.35));',\n 'background:var(--dsw-alias-bg-base,transparent)}',\n '.dsh-sel-ask:focus-within{border-color:var(--sel-a1,#0d9488)}',\n // \u9AD8\u5EA6\u7531 JS \u8DDF\u7740\u5185\u5BB9\u957F\uFF08autoGrowAskBox\uFF09\uFF1Atextarea \u81EA\u5DF1\u53EA\u4F1A\u7F29\u5728 rows=1 \u7684\u9AD8\u5EA6\u91CC\uFF0C\n // \u6362\u884C\u4E4B\u540E\u4E0B\u9762\u7684\u5B57\u5C31\u88AB\u88C1\u6389\u4E86\uFF08\u8BED\u97F3\u8F93\u5165\u65F6\u6700\u660E\u663E \u2014\u2014 \u5B57\u662F\u81EA\u5DF1\u957F\u51FA\u6765\u7684\uFF0C\u7528\u6237\u6839\u672C\u6CA1\u5728\u6572\u952E\u76D8\uFF09\u3002\n // \u8FD9\u91CC\u7ED9\u4E2A\u4E0A\u9650\uFF1A\u8FC7\u4E86\u5C31\u5185\u90E8\u6EDA\u52A8\uFF0C\u9762\u677F\u4E0D\u4F1A\u88AB\u4E00\u6BB5\u957F\u6587\u9876\u7A7F\u3002\n '.dsh-sel-askbox{width:100%;min-height:26px;max-height:132px;overflow-y:hidden;resize:none;padding:4px 0 0;',\n 'border:0;background:transparent;color:inherit;font:inherit;font-size:13px;line-height:1.5;outline:none}',\n // \u5F15\u7528\u533A\uFF08composer \u7B2C\u4E00\u884C\u4E4B\u4E0A\uFF09\uFF1A\u6BCF\u6BB5\u4E00\u5F20\u5C0F\u5361\u7247\uFF0C\u6765\u6E90\u4E00\u884C\u5C0F\u5B57 + \u5185\u5BB9\u4E00\u884C\uFF08\u8D85\u51FA\u7701\u7565\uFF09+ \u53F3\u4FA7 \u2715\u3002\n // \u5361\u7247\u662F**\u5F85\u53D1\u9001**\u7684\u5F15\u7528\uFF0C\u53D1\u9001\u540E\u6574\u7247\u6E05\u7A7A \u2014\u2014 \u5B83\u5C5E\u4E8E\"\u8FD9\u6761\u6D88\u606F\"\uFF0C\u4E0D\u5C5E\u4E8E\u4F1A\u8BDD\u3002\n '.dsh-sel-quotes{display:none;flex-direction:column;gap:4px;max-height:96px;overflow-y:auto;',\n 'scrollbar-width:thin;padding:1px 0 0}',\n '.dsh-sel-quotes[data-show=\"1\"]{display:flex}',\n '.dsh-sel-quotechip{display:flex;align-items:center;gap:7px;padding:4px 4px 4px 8px;border-radius:10px;',\n 'border-left:2px solid color-mix(in srgb,var(--sel-a1,#0d9488) 55%,transparent);',\n 'background:color-mix(in srgb,var(--sel-a1,#0d9488) 7%,transparent)}',\n '.dsh-sel-quotechip-src{flex:0 0 auto;font-size:10.5px;line-height:1.5;opacity:.66;white-space:nowrap;',\n 'max-width:96px;overflow:hidden;text-overflow:ellipsis}',\n '.dsh-sel-quotechip-text{flex:1 1 auto;min-width:0;font-size:12px;line-height:1.5;opacity:.9;',\n 'overflow:hidden;text-overflow:ellipsis;white-space:nowrap}',\n '.dsh-sel-quotechip-x{flex:0 0 auto;width:18px;height:18px;padding:0;border:0;border-radius:9px;cursor:pointer;',\n 'background:transparent;color:var(--dsw-alias-label-secondary,inherit);opacity:.5;font:inherit;font-size:11px;',\n 'line-height:1;display:inline-flex;align-items:center;justify-content:center}',\n '.dsh-sel-quotechip-x:hover{opacity:1;background:var(--dsw-alias-interactive-bg-hover,rgba(140,140,140,.16))}',\n // \u6C14\u6CE1\u91CC\u7684\u5F15\u7528\u5757\uFF08\u7528\u6237\u6D88\u606F\uFF09\uFF1A\u5F15\u7528\u5728\u4E0A\u3001\u95EE\u9898\u5728\u4E0B \u2014\u2014 \u548C\u53D1\u51FA\u53BB\u7ED9\u6A21\u578B\u7684\u90A3\u4EFD\u987A\u5E8F\u4E00\u81F4\n '.dsh-sel-bq{display:flex;flex-direction:column;gap:3px;margin-bottom:6px}',\n '.dsh-sel-bqitem{padding:3px 8px;border-radius:8px;border-left:2px solid color-mix(in srgb,var(--sel-a1,#0d9488) 45%,transparent);',\n 'background:var(--dsw-alias-interactive-bg-hover,rgba(140,140,140,.14));font-size:11.5px;line-height:1.55;',\n 'opacity:.82;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}',\n '.dsh-sel-bqitem b{font-weight:600;opacity:.75;margin-right:5px}',\n // \u300C\u5F15\u7528\u6574\u6761\u300D\uFF1A\u8D34\u5728\u52A9\u624B\u6C14\u6CE1\u672B\u5C3E\uFF0C**\u5E73\u65F6\u4E0D\u51FA\u73B0**\uFF08\u6B63\u6587\u4F18\u5148\uFF09\uFF0C\u9F20\u6807\u79FB\u5230\u8FD9\u6761\u6D88\u606F\u4E0A\u624D\u6D6E\u51FA\u6765\u3002\n // \u952E\u76D8 Tab \u4E5F\u80FD\u5230\uFF08:focus-visible \u540C\u6837\u70B9\u4EAE\uFF09\uFF0C\u89E6\u5C4F\u4E0A\u53E6\u6709\u6D6E\u6807\u90A3\u6761\u8DEF\u3002\n '.dsh-sel-bubquote{margin-top:7px;display:inline-flex;align-items:center;gap:4px;padding:2px 9px;',\n 'border:1px solid transparent;border-radius:9px;background:transparent;cursor:pointer;',\n 'color:var(--dsw-alias-label-secondary,inherit);font:inherit;font-size:11px;line-height:1.6;',\n 'opacity:0;transition:opacity .15s ease}',\n '.dsh-sel-bubble:hover .dsh-sel-bubquote,.dsh-sel-bubquote:focus-visible{opacity:.66}',\n '.dsh-sel-bubquote:hover{opacity:1;background:var(--dsw-alias-interactive-bg-hover,rgba(140,140,140,.14))}',\n // \u4E0B\u9762\u90A3\u884C\uFF1A\u5DE6\u4FA7\u7F51\u9875\u6A21\u5F0F\uFF08\u5706\u5F62\u6D45\u5E95\uFF0C\u548C\u4E3B\u4F1A\u8BDD\u7684 + \u540C\u6B3E\uFF09\uFF0C\u53F3\u4FA7\u53D1\u9001\uFF08\u5706\u5F62\u5B9E\u5FC3\uFF09\n // flex-wrap \u662F\u7ED9\u7A84\u5C4F\u515C\u5E95\u7684\uFF1A\u8FD9\u4E00\u884C\u73B0\u5728\u6709 4 \u4EF6\u4E1C\u897F\uFF08\u8F93\u51FA\u504F\u597D / \u6A21\u578B / \u9EA6\u514B\u98CE / \u53D1\u9001\uFF09\uFF0C\n // \u7A84\u9762\u677F\u4E0B\u5B81\u53EF\u6298\u6210\u4E24\u884C\uFF0C\u4E5F\u4E0D\u80FD\u628A\u53D1\u9001\u952E\u6324\u51FA\u53EF\u89C6\u533A\uFF08\u6324\u51FA\u53BB\u5C31\u70B9\u4E0D\u5230\u4E86\uFF09\u3002\n '.dsh-sel-asktools{display:flex;align-items:center;gap:8px;flex-wrap:wrap;row-gap:6px}',\n // \u5F55\u97F3\u884C\u51FA\u73B0\u65F6**\u4E0D\u8BB8\u6362\u884C**\uFF1A\u53D1\u9001\u952E\u5FC5\u987B\u7559\u5728\u540C\u4E00\u884C\n //\uFF08\u7528\u6237\u62A5\uFF1A\u4E00\u5F00\u9EA6\uFF0C\u2191 \u5C31\u88AB\u9876\u5230\u4E0B\u9762\u5355\u72EC\u4E00\u884C\u53BB\u4E86\uFF09\n '.dsh-sel-asktools[data-capturing=\"1\"]{flex-wrap:nowrap}',\n '.dsh-sel-askspace{flex:1 1 auto}',\n // \u9875\u7709\u91CC\u7684\u6491\u5F00\u5360\u4F4D\uFF08\u6807\u9898\u4E0E\u53F3\u4FA7\u6309\u94AE\u4E4B\u95F4\uFF09\n '.dsh-sel-headspace{flex:1 1 auto;min-width:8px}',\n // \u6309\u94AE\u7EDF\u4E00\u7F29\u5C0F\u5230 26px\uFF08\u539F\u6765 32 \u504F\u5927\uFF09\uFF1B\u56FE\u6807 14px\n '.dsh-sel-iconbtn{flex:0 0 auto;height:26px;min-width:26px;padding:0;border:0;border-radius:13px;cursor:pointer;',\n 'display:inline-flex;align-items:center;justify-content:center;gap:4px;background:transparent;',\n 'color:var(--dsw-alias-label-secondary,inherit)}',\n '.dsh-sel-iconbtn svg{width:14px;height:14px;display:block;flex:0 0 auto}',\n // \u6A21\u578B + \u63A8\u7406\u7B49\u7EA7\uFF08\u8FFD\u95EE\u6863\uFF09\uFF1A\u4E00\u679A\u80F6\u56CA\u663E\u793A\u300C\u6A21\u578B \u00B7 \u7B49\u7EA7\u300D\uFF0C\u70B9\u5F00\u5411\u4E0A\u5F39\u83DC\u5355\u3002\n // \u548C\u4E3B\u4F1A\u8BDD\u540C\u6784\uFF08\u4E3B\u4F1A\u8BDD\u4E5F\u662F\u300C\u6A21\u578B\u540D \u7B49\u7EA7 \u2304\u300D\uFF09\uFF1B\u83DC\u5355\u671D\u4E0A\u662F\u56E0\u4E3A composer \u8D34\u7740\u9762\u677F\u5E95\u90E8\u3002\n '.dsh-sel-picker{display:inline-flex;align-items:center;gap:5px;height:24px;padding:0 9px;border-radius:12px;',\n 'border:1px solid var(--dsw-alias-border-l3,rgba(140,140,140,.35));background:transparent;cursor:pointer;',\n 'font:inherit;font-size:11.5px;line-height:1;color:inherit;white-space:nowrap;max-width:190px}',\n '.dsh-sel-picker:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(140,140,140,.12))}',\n '.dsh-sel-picker-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}',\n '.dsh-sel-picker-tier{color:var(--sel-a1-text,#0f766e);font-weight:600}',\n '.dsh-sel-picker-caret{font-size:9px;opacity:.6}',\n '.dsh-sel-pickermenu{position:absolute;right:10px;bottom:calc(100% + 8px);width:236px;max-width:calc(100% - 20px);',\n 'display:none;flex-direction:column;padding:6px;border-radius:12px;z-index:20;',\n 'background:var(--dsw-alias-bg-layer-2,#232427);border:.5px solid var(--dsw-alias-border-l3,rgba(140,140,140,.35));',\n 'box-shadow:0 14px 34px rgba(0,0,0,.35)}',\n '.dsh-sel-pickermenu[data-open=\"1\"]{display:flex}',\n '.dsh-sel-pickergroup{padding:5px 8px 3px;font-size:10.5px;opacity:.6}',\n '.dsh-sel-pickerlist{max-height:168px;overflow:auto;display:flex;flex-direction:column;gap:1px}',\n '.dsh-sel-pickerrow{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:8px;cursor:pointer;',\n 'font-size:12px;text-align:left;border:0;background:transparent;color:inherit;font-family:inherit}',\n '.dsh-sel-pickerrow:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(140,140,140,.12))}',\n '.dsh-sel-pickerrow[data-on=\"1\"]{font-weight:600}',\n '.dsh-sel-pickerrow .dsh-sel-pickercheck{width:12px;flex:0 0 auto;color:var(--sel-a1-text,#0f766e);font-weight:700}',\n // \u540D\u5B57\u5360\u6389\u5269\u4E0B\u7684\u5BBD\u5EA6\u3001\u6324\u4E0D\u4E0B\u5C31\u7701\u7565\u53F7 \u2014\u2014 \u4FDD\u8BC1\u4E00\u884C\u91CC\u585E\u5F97\u4E0B \u52FE + \u540D\u5B57 + \u300C\u8DDF\u968F\u300D\u5C0F\u6807 + provider\n '.dsh-sel-pickerrow .dsh-sel-pickername{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}',\n '.dsh-sel-pickerrow .dsh-sel-pickerfollow{flex:0 0 auto;font-size:10px;line-height:14px;padding:0 5px;border-radius:6px;font-weight:600;opacity:.85;',\n 'background:color-mix(in srgb,var(--sel-a1,#0d9488) 16%,transparent)}',\n '.dsh-sel-pickerrow .dsh-sel-pickerprov{flex:0 0 auto;margin-left:auto;font-size:10.5px;opacity:.55}',\n '.dsh-sel-pickersplit{height:1px;margin:6px 4px;background:var(--dsw-alias-border-l4,rgba(140,140,140,.22))}',\n '.dsh-sel-tiers{display:flex;gap:6px;padding:4px 6px 6px}',\n '.dsh-sel-tierbtn{flex:1 1 0;height:26px;padding:0;border-radius:9px;cursor:pointer;font:inherit;font-size:11.5px;',\n 'border:1px solid var(--dsw-alias-border-l3,rgba(140,140,140,.35));background:transparent;color:inherit}',\n '.dsh-sel-tierbtn[data-on=\"1\"]{background:var(--sel-fill,#0f766e);border-color:transparent;color:var(--sel-fill-fg,#fff);font-weight:600}',\n '.dsh-sel-pickerhint{padding:2px 8px 6px;font-size:10.5px;opacity:.55;line-height:1.5}',\n // \u5B9E\u6D4B\u88AB\u4E0A\u6E38\u62D2\u8FC7\u7684\u6863\u4F4D\uFF1A\u5212\u4E00\u9053\u659C\u7EBF\uFF0C\u522B\u8BA9\u7528\u6237\u518D\u649E\u4E00\u6B21\n '.dsh-sel-tierbtn[data-bad=\"1\"]{opacity:.5;text-decoration:line-through}',\n '.dsh-sel-notice{margin:6px 0 0;padding:6px 10px;border-radius:8px;font-size:11.5px;line-height:1.6;',\n 'background:var(--sel-warn-bg,rgba(255,166,87,.12));color:var(--sel-warn-fg,#b45309)}',\n // \u8F93\u51FA\u504F\u597D\uFF1A\u6587\u5B57 + **\u56FE\u6807\u5206\u6BB5**\uFF08\u4E24\u683C\uFF1AM\u2193 / \u25AD\uFF0C\u9009\u4E2D\u683C\u662F\u4E00\u679A\u6ED1\u52A8\u7684\u836F\u4E38\uFF09\u3002\n // \u4E0D\u7528\u6ED1\u5757\u5F62\u72B6 \u2014\u2014 \u6ED1\u5757\u7684\u8BED\u4E49\u662F\"\u5F00/\u5173\u4E00\u4E2A\u80FD\u529B\"\uFF0C\u800C\u8FD9\u91CC\u662F\"\u4E24\u9009\u4E00\"\u3002\n '.dsh-sel-pref{display:inline-flex;align-items:center;gap:7px;font-size:11.5px;line-height:1;',\n 'color:var(--dsw-alias-label-secondary,inherit);white-space:nowrap}',\n '.dsh-sel-seg{position:relative;flex:0 0 auto;display:inline-flex;align-items:center;padding:2px;border-radius:13px;',\n 'background:var(--dsw-alias-interactive-bg-hover,rgba(140,140,140,.14))}',\n '.dsh-sel-segpill{position:absolute;top:2px;left:2px;width:30px;height:22px;border-radius:11px;',\n 'background:var(--sel-fill,#0f766e);transition:transform .2s cubic-bezier(.3,1.2,.4,1)}',\n '.dsh-sel-pref[data-on=\"1\"] .dsh-sel-segpill{transform:translateX(30px)}',\n '.dsh-sel-segcell{position:relative;z-index:1;width:30px;height:22px;padding:0;border:0;background:transparent;',\n 'cursor:pointer;display:inline-flex;align-items:center;justify-content:center;',\n 'color:var(--dsw-alias-label-secondary,inherit);opacity:.72}',\n '.dsh-sel-segcell:hover{opacity:1}',\n '.dsh-sel-segcell[aria-checked=\"true\"]{opacity:1;color:var(--sel-fill-fg,#fff)}',\n '.dsh-sel-segcell:focus-visible{outline:2px solid var(--sel-a1,#0d9488);outline-offset:1px;border-radius:11px}',\n '.dsh-sel-segcell svg{width:13px;height:13px;display:block}',\n '.dsh-sel-asksend{width:26px;background:var(--sel-fill,#0f766e);color:var(--sel-fill-fg,#fff);border-radius:13px}',\n '.dsh-sel-asksend:hover{filter:brightness(1.06)}',\n '.dsh-sel-asksend:disabled{opacity:.35;cursor:default;filter:none}',\n // \u751F\u6210\u4E2D\uFF1A\u53D1\u9001\u952E\u53D8\u6210\"\u505C\u6B62\"\uFF08\u65B9\u5F62\u56FE\u6807\uFF0C\u70B9\u4E86\u6253\u65AD\u5F53\u524D\u8F93\u51FA\uFF09\n '.dsh-sel-asksend[data-mode=\"stop\"]{background:var(--dsw-alias-label-secondary,rgba(120,120,120,.9));opacity:1}',\n '.dsh-sel-asksend[data-mode=\"stop\"]:hover{filter:brightness(1.12)}',\n // \u2500\u2500 \u8BED\u97F3\u8F93\u5165\uFF08\u9EA6\u514B\u98CE\uFF09\u2500\u2500\n // **\u548C\u4E3B\u4F1A\u8BDD\u540C\u4E00\u5957\u4EA4\u4E92**\uFF08\u5B98\u65B9 ui-voice-input\uFF09\uFF1A\u5E73\u65F6\u662F\u8F93\u5165\u6846\u53F3\u8FB9\u7684 \uD83C\uDFA4\uFF1B\n // \u4E00\u65E6\u5F00\u59CB\u5F55\uFF0C\u5DE5\u5177\u884C\u6574\u4E2A\u6362\u6210\"\u5F55\u97F3\u884C\" \u2014\u2014`\u2715` | \u5B9E\u65F6\u6CE2\u5F62 | `\u25A0`\uFF08\u8BC6\u522B\u4E2D\u5219\u662F\n // \u300C\u8BC6\u522B\u4E2D\u2026\u300D+ \u547C\u5438\u70B9\uFF09\uFF0C\u53D1\u9001\u952E\u539F\u4F4D\u4E0D\u52A8\u3002\u5C3A\u5BF8\u6309\u5C0F\u7A97\u7684 composer \u6536\u6210 26px\n // \uFF08\u4E3B\u4F1A\u8BDD\u662F 32px\uFF09\uFF0C\u5176\u4F59\u7ED3\u6784\u3001\u56FE\u6807\u8BED\u4E49\u3001\u6CE2\u5F62\u7B97\u6CD5\u90FD\u7167\u6284\uFF0C\u4E24\u5904\u770B\u8D77\u6765\u624D\u662F\u540C\u4E00\u4E2A\u4E1C\u897F\u3002\n '.dsh-sel-mic{transition:background .15s ease,color .15s ease}',\n '@keyframes dsh-sel-spin{to{transform:rotate(360deg)}}',\n '.dsh-sel-mic[data-state=\"requesting\"] svg{animation:dsh-sel-spin .9s linear infinite}',\n '.dsh-sel-mic:disabled{cursor:default;opacity:.35}',\n // \u5F55\u97F3\u884C\uFF1Aflex:1 \u8BA9\u5B83\u5403\u6389\u4E2D\u95F4\u90A3\u622A\uFF08\u4E3B\u4F1A\u8BDD\u4E5F\u662F waveform flex:1\uFF09\n // flex-basis \u5FC5\u987B\u7ED9 **0%**\uFF08\u4E0D\u662F auto\uFF09\uFF1A\u884C\u5185\u6362\u884C\u7684\u5224\u5B9A\u7528\u7684\u662F**\u6536\u7F29\u524D**\u7684\u5047\u8BBE\u5BBD\u5EA6\uFF0C\n // \u800C\u6CE2\u5F62\u90A3\u4E2A svg \u7684\u56FA\u6709\u5BBD\u5EA6\u7EA6 300px \u2014\u2014 \u7ED9 auto \u65F6\"\u8FD9\u4E00\u884C\u653E\u4E0D\u4E0B\"\u4F1A\u88AB\u5224\u6210\u771F\uFF0C\u53D1\u9001\u952E\u4E8E\u662F\n // \u6389\u5230\u4E0B\u4E00\u884C\u3002\u7ED9 0% \u4E4B\u540E\u4E24\u8005\u6309\u53EF\u7528\u5BBD\u5EA6\u5206\uFF1Bmin-width:0 + \u6CE2\u5F62\u7684 min-width:24px \u4FDD\u8BC1\n // \u5F55\u97F3\u884C\u7167\u65E7\u6491\u6EE1\u3001\u4E5F\u4E0D\u4F1A\u584C\u6210 0\u3002\n '.dsh-sel-capture{display:none;flex:1 1 0%;min-width:0;align-items:center;gap:8px}',\n '.dsh-sel-capture[data-show=\"1\"]{display:flex}',\n // \u5706\u952E\uFF1A\u548C\u53D1\u9001\u952E\u540C\u5C3A\u5BF8\u3001\u540C\u5706\u5EA6\uFF1B\u6D45\u5E95 + hover \u53D8\u6DF1\uFF08\u4E3B\u4F1A\u8BDD\u7684 roundButton \u4E5F\u662F\u8FD9\u5957\uFF09\n '.dsh-sel-round{flex:0 0 auto;width:26px;height:26px;padding:0;border:0;border-radius:13px;cursor:pointer;',\n 'display:inline-grid;place-items:center;background:var(--dsw-alias-interactive-bg-hover,rgba(140,140,140,.14));',\n 'color:var(--dsw-alias-label-secondary,inherit)}',\n '.dsh-sel-round:hover{background:var(--dsw-alias-interactive-bg-hover-solid,rgba(140,140,140,.28));',\n 'color:var(--dsw-alias-label-primary,inherit)}',\n '.dsh-sel-round:disabled{cursor:default;opacity:.35}',\n '.dsh-sel-round svg{width:14px;height:14px;display:block}',\n // \u505C\u6B62\u952E\uFF1A\u56FE\u6807\u662F\u5B9E\u5FC3\u65B9\u5757\uFF08\u4E3B\u4F1A\u8BDD\u7684 IconStopFill\uFF09\uFF0C\u989C\u8272\u53D6\u4E3B\u6587\u5B57\u8272 \u2014\u2014 \u4E00\u773C\u662F\"\u505C\"\n '.dsh-sel-stop{color:var(--dsw-alias-label-primary,inherit)}',\n // \u6CE2\u5F62\uFF1A80 \u6839\u7AD6\u7EBF\u3001\u4E2D\u95F4\u5BF9\u9F50\u3001\u9759\u97F3\u65F6\u662F\u4E00\u6761\u865A\u7EBF\uFF08\u7B97\u6CD5\u4E0E\u4E3B\u4F1A\u8BDD\u9010\u884C\u4E00\u81F4\uFF0C\u89C1 paintWave\uFF09\n '.dsh-sel-vwave{flex:1 1 0%;min-width:24px;height:24px;display:block;color:var(--dsw-alias-label-secondary,inherit)}',\n // \u72B6\u6001\u6587\u6848\uFF08\u8BF7\u5141\u8BB8\u4F7F\u7528\u9EA6\u514B\u98CE\u2026 / \u8BC6\u522B\u4E2D\u2026 / \u6CA1\u542C\u6E05\u2026\uFF09\uFF1A12px \u6B21\u8981\u8272 + \u53EF\u9009\u547C\u5438\u70B9\n '.dsh-sel-vactivity{flex:1 1 auto;min-width:0;display:flex;align-items:center;gap:8px;font-size:12px;line-height:1.4;',\n 'color:var(--dsw-alias-label-secondary,inherit);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}',\n '.dsh-sel-vdot{flex:0 0 auto;width:6px;height:6px;border-radius:50%;background:var(--sel-a1,#0d9488);',\n 'animation:dsh-sel-pillpulse 1.4s ease-in-out infinite}',\n '.dsh-sel-vactivity[data-tone=\"error\"]{color:var(--dsw-alias-state-error-primary,#e5484d)}',\n '.dsh-sel-vactivity[data-tone=\"warn\"]{color:var(--dsw-alias-state-warn-primary,#b45309)}',\n '.dsh-sel-vactslot{flex:0 0 auto;display:inline-flex;align-items:center;gap:6px}',\n '.dsh-sel-vactslot:empty{display:none}',\n // \u884C\u5185\u52A8\u4F5C\uFF08\u51C6\u5907\u6A21\u578B / \u91CD\u65B0\u5F55\u97F3\uFF09\uFF1A\u4E3B\u4F1A\u8BDD\u662F\u540C\u6B3E\u7684 inlineAction\n '.dsh-sel-vact{flex:0 0 auto;height:22px;padding:0 9px;border:1px solid currentColor;border-radius:11px;cursor:pointer;',\n 'background:transparent;color:inherit;font:inherit;font-size:11px;line-height:1;opacity:.85;white-space:nowrap}',\n '.dsh-sel-vact:hover{opacity:1}',\n '.dsh-sel-vact:disabled{opacity:.4;cursor:default}',\n '.dsh-sel-askbox:focus{border-color:var(--sel-a1,#0d9488)}',\n // \u5185\u5BB9\u533A\u91CC\u7684\u300C\u91CD\u65B0\u751F\u6210\u300D\uFF1A\u53EA\u5728\u6CA1\u6709\u53EF\u7528\u7ED3\u679C\uFF08\u5931\u8D25 / \u5DF2\u505C\u6B62 / \u7A7A\u56DE\u7B54\uFF09\u65F6\u51FA\u73B0\n '.dsh-sel-retry{margin-top:8px;border:1px solid var(--dsw-alias-border-l3,rgba(140,140,140,.35));background:transparent;',\n 'color:var(--sel-a1-text,#0f766e);font:inherit;font-size:12.5px;cursor:pointer;padding:5px 12px;border-radius:9px}',\n '.dsh-sel-retry:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(140,140,140,.14))}',\n // \u7B49\u5F85\u7279\u6548\uFF1A\u547C\u5438\u70B9 + \u6587\u6848 + \u5B9E\u65F6\u79D2\u6570 + \u6162\u901F\u6D41\u5149\uFF08\u9996\u5B57\u5230\u8FBE\u524D\u4E00\u76F4\u663E\u793A\uFF09\n // \u8282\u594F\u523B\u610F\u653E\u6162\uFF082.4s \u4E00\u8F6E\uFF09\uFF1A\u5FEB\u8282\u594F\u7684\u6D41\u5149\u770B\u8D77\u6765\u50CF\"\u95EA\u70C1/\u82B1\u5C4F\"\uFF0C\u6162\u4E0B\u6765\u624D\u662F\"\u5728\u8DD1\"\n // \u5DE5\u5177\u8C03\u7528\u4E0D\u843D\u8FDB\u5C0F\u7A97\uFF1A\u67E5\u8BE2\u8BCD/\u547D\u4E2D\u5B57\u6570/\u94FE\u63A5/\u8017\u65F6\u90FD\u4E0D\u6E32\u67D3\u3002\n // \u5C0F\u7A97\u91CC\u53EA\u5141\u8BB8\u51FA\u73B0\u6A21\u578B\u6D88\u5316\u540E\u7684\u7ED3\u679C\uFF0C\u68C0\u7D22\u8FC7\u7A0B\u6700\u591A\u5728\u7B49\u5F85\u63D0\u793A\u91CC\u5199\u4E00\u53E5\"\u6B63\u5728\u68C0\u7D22\u8D44\u6599\"\u3002\n '.dsh-sel-link{color:var(--sel-a1-text,#0f766e);text-decoration:underline;word-break:break-all;font-size:12px}',\n '.dsh-sel-c a{color:var(--sel-a1-text,#0f766e)}',\n '.dsh-sel-note{opacity:.6;font-size:12px;line-height:1.6}',\n // \u300C\u6700\u8FD1\u804A\u8FC7\u7684\u300D\uFF1A\u72EC\u7ACB\u6D6E\u5C42\u5361\u7247\uFF0C\u8D34\u5728\u9762\u677F\u4FA7\u8FB9\uFF08B \u65B9\u6848\uFF09\uFF0C\u4E0D\u548C\u6D88\u606F\u5171\u7528\u6EDA\u52A8\u533A\n '.dsh-sel-history{position:fixed;display:none;flex-direction:column;gap:4px;padding:8px 9px;border-radius:12px;box-sizing:border-box;',\n 'overflow:auto;background:var(--dsw-alias-bg-layer-1,Canvas);color:var(--dsw-alias-label-primary,CanvasText);',\n 'border:.5px solid var(--dsw-alias-border-l3,rgba(140,140,140,.35));box-shadow:0 14px 36px rgba(0,0,0,.26);',\n 'font:400 13px/1.6 ' + FONT + ';pointer-events:auto}',\n '.dsh-sel-historytitle{font-size:11.5px;opacity:.6;margin-bottom:2px}',\n '.dsh-sel-historyempty{font-size:12px;opacity:.5;padding:2px 0}',\n '.dsh-sel-historyrow{display:flex;flex-direction:column;gap:2px;padding:6px 8px;border-radius:7px;cursor:pointer}',\n '.dsh-sel-historyrow{position:relative}',\n '.dsh-sel-historyrow:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(140,140,140,.18))}',\n // \u5220\u9664\u952E\uFF1A\u9ED8\u8BA4\u9690\u5F62\uFF0C\u9F20\u6807\u79FB\u5230\u8FD9\u4E00\u884C\uFF08\u6216\u952E\u76D8\u805A\u7126\uFF09\u624D\u51FA\u73B0 \u2014\u2014 \u4E0D\u8BEF\u89E6\u3001\u4E0D\u62A2\u89C6\u7EBF\n '.dsh-sel-historydel{position:absolute;top:5px;right:6px;width:20px;height:20px;padding:0;border:0;border-radius:6px;',\n 'display:grid;place-items:center;cursor:pointer;opacity:0;transition:opacity .12s ease;',\n 'background:var(--dsw-alias-bg-layer-3,rgba(140,140,140,.22));color:inherit;font:inherit;font-size:12px;line-height:1}',\n '.dsh-sel-historyrow:hover .dsh-sel-historydel,.dsh-sel-historydel:focus-visible{opacity:1}',\n '.dsh-sel-historydel:hover{background:var(--sel-warn-bg,rgba(220,80,80,.22));color:var(--sel-warn-fg,#b42318)}',\n '.dsh-sel-historytext{padding-right:22px}', // \u7ED9\u5220\u9664\u952E\u7559\u4F4D\u7F6E\uFF0C\u6807\u9898\u4E0D\u94BB\u5230\u5B83\u4E0B\u9762\n '.dsh-sel-undo{display:flex;align-items:center;gap:8px;margin:4px 6px 2px;padding:6px 8px;border-radius:8px;',\n 'background:var(--sel-warn-bg,rgba(255,166,87,.14));color:var(--sel-warn-fg,#b45309);font-size:11.5px;line-height:1.4}',\n '.dsh-sel-undo button{margin-left:auto;border:0;background:transparent;color:inherit;font:inherit;font-weight:600;cursor:pointer;text-decoration:underline}',\n '.dsh-sel-historytext{font-size:13px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}',\n '.dsh-sel-historymeta{display:flex;align-items:center;gap:6px;font-size:11px;opacity:.5;font-variant-numeric:tabular-nums;min-width:0}',\n '.dsh-sel-historymeta>span:first-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}',\n '.dsh-sel-historymeta .dsh-sel-historypin{opacity:.9}',\n // \u60AC\u6D6E\u72B6\u6001\u80F6\u56CA\uFF1A\u6837\u5F0F\u5BF9\u9F50\u53F3\u4E0B\u89D2\u90A3\u679A\u8D39\u7528\u80F6\u56CA\uFF08dsh-spend\uFF09\uFF0C\u6446\u5728\u5B83\u4E0A\u65B9\n // \u9010\u9879\u5BF9\u9F50 dsh-spend \u7684 .dsu-pill\uFF1A\u540C\u6837\u7684 padding / \u5B57\u53F7 / \u884C\u9AD8 / \u8FB9\u6846 / \u5706\u89D2 / \u9634\u5F71\uFF0C\n // \u8FDE\u5C0F\u4E09\u89D2\u90FD\u7528\u540C\u4E00\u4E2A\u5B57\u7B26 \u25B4 \u25BE\uFF08\u4EE5\u524D\u7528 \u25B2 \u25BC\uFF0C\u6BD4\u5B83\u5927\u4E00\u5708\u3001\u4E5F\u4E0D\u4E00\u6837\u6DE1\uFF09\n // max-width 280 \u662F\"\u8DDF\u968F\u8D39\u7528\u80F6\u56CA\"\u90A3\u6761\u8DEF\u7684\u5C01\u9876\uFF08\u548C .dsu-pill \u540C\u503C\uFF0C\u5E76\u6392\u65F6\u624D\u80FD\u540C\u5BBD\uFF09\uFF1B\n // **\u6CA1\u6709**\u8D39\u7528\u80F6\u56CA\u53EF\u8DDF\u968F\u65F6\uFF0CplacePill() \u4F1A\u7528\u5185\u8054\u6837\u5F0F\u6536\u5230 PILL_FALLBACK_MAX\uFF08200\uFF09\u3002\n // \u8FC7\u6E21\uFF08\u6536\u7403 / \u62D6\u52A8\u5438\u9644 / \u8DDF\u968F\u4F4D\u7F6E\u53D8\u5316\uFF09\u6302\u5728 [data-ready=\"1\"] \u4E0A\uFF1A\u63D2\u4EF6\u6302\u8F7D\u90A3\u4E00\u4E0B\u662F\u5148\u8D34\u597D\n // \u4F4D\u7F6E\u518D\u5F00\u8FC7\u6E21\u7684\uFF0C\u5426\u5219\u4F1A\u4ECE CSS \u9ED8\u8BA4\u7684 bottom:64 \u4E00\u8DEF\u6ED1\u5230\u5B9E\u6D4B\u4F4D\u7F6E\u3002\n //\n // \u6536\u7403 / \u5C55\u5F00**\u5171\u7528\u8FD9\u4E00\u6761**\uFF08\u65F6\u957F + \u66F2\u7EBF\uFF09\uFF0C\u800C\u4E14\u66F2\u7EBF\u662F**\u65F6\u95F4\u5BF9\u79F0**\u7684\uFF1A\n // cubic-bezier(.5,0,.5,1) \u7684\u63A7\u5236\u70B9\u5173\u4E8E\u4E2D\u5FC3\u5BF9\u79F0 \u2192 p(t) = 1 - p(1-t)\uFF0C\n // \u4E5F\u5C31\u662F\"\u628A\u6536\u7403\u7684\u52A8\u753B\u5012\u8FC7\u6765\u653E\"\u6070\u597D\u7B49\u4E8E\u5C55\u5F00\uFF08\u7528\u6237\u8981\u7684\u5BF9\u79F0\u6027\uFF09\u3002\n // \u4E4B\u524D\u7528 easeOutQuint(.22,1,.36,1)\uFF1A\u524D\u540E\u534A\u7A0B\u4E0D\u955C\u50CF\uFF0C\u6536\u5FEB\u653E\u6162\uFF0C\u4E24\u4E2A\u65B9\u5411\u770B\u7740\u662F\u4E24\u56DE\u4E8B\u3002\n // \u6240\u6709\u4F1A\u53D8\u7684\u5C5E\u6027\u90FD\u5FC5\u987B\u6302\u540C\u4E00\u6761\uFF08\u65F6\u957F/\u66F2\u7EBF\u4E00\u81F4\uFF09\uFF0C\u5426\u5219\u4E2D\u95F4\u67D0\u4E00\u5E27\u7684\u5BBD\u5EA6\u7531**\u53E6\u4E00\u6761\u66F2\u7EBF**\u51B3\u5B9A\uFF0C\n // \u5BF9\u79F0\u6027\u5C31\u7834\u4E86 \u2014\u2014 \u8FD9\u4E5F\u662F\u4E0B\u9762 min-width / padding / gap / \u6587\u5B57 max-width \u90FD\u8981\u4E00\u8D77\u8FC7\u6E21\u7684\u539F\u56E0\u3002\n '.dsh-sel-pill{position:fixed;right:20px;bottom:64px;z-index:' + String(Z_BTN) + ';display:flex;align-items:center;gap:8px;',\n // height \u9489\u6B7B 32\uFF1A\u6536\u7403\u65F6 padding \u8981\u5F52\u96F6\uFF0C\u82E5\u9AD8\u5EA6\u7531 padding \u6491\uFF0C\u5C55\u5F00\u90A3\u4E00\u4E0B\u4F1A\u5148\u88AB\u538B\u6241\u518D\u957F\u56DE\u6765\n // \uFF08\u5B9E\u6D4B\u7684\"\u4E0D\u6D41\u7545\"\u4E4B\u4E00\uFF09\u3002min-width \u7ED9\u6570\u503C 0\uFF0C\u597D\u8BA9\"\u7403\u2192\u80F6\u56CA\"\u80FD\u4ECE 32 \u5E73\u6ED1\u8FC7\u6E21\u56DE 0\u3002\n 'box-sizing:border-box;height:' + String(PILL_BALL_SIZE) + 'px;min-width:0;padding:6px 14px;border-radius:999px;cursor:pointer;user-select:none;max-width:280px;white-space:nowrap;',\n 'background:var(--dsw-alias-bg-base,#fff);color:var(--dsw-alias-label-primary,#24292f);',\n 'border:1px solid var(--dsw-alias-border-l2,rgba(128,128,128,.22));box-shadow:0 4px 16px rgba(0,0,0,.12);',\n 'font-family:inherit;font-size:12px;line-height:18px;font-weight:400}',\n '.dsh-sel-pill[data-ready=\"1\"]{transition:box-shadow .15s ease,width ' + PILL_MORPH + ',',\n 'max-width ' + PILL_MORPH + ',min-width ' + PILL_MORPH + ',padding ' + PILL_MORPH + ',gap ' + PILL_MORPH + ',',\n 'left ' + PILL_MORPH + ',top ' + PILL_MORPH + ',right ' + PILL_MORPH + ',bottom ' + PILL_MORPH + '}',\n // \u9F20\u6807\u6B63\u6309\u7740\u62D6\uFF1A\u4F4D\u7F6E\u6BCF\u5E27\u90FD\u5728\u53D8\uFF0C\u6709\u8FC7\u6E21\u5C31\"\u9ECF\u624B\"\n '.dsh-sel-pill[data-drag=\"1\"]{transition:none;cursor:grabbing}',\n // \u6536\u6210\u5C0F\u7403\uFF1A\u53EA\u6539**\u80FD\u8FC7\u6E21\u7684\u5C5E\u6027** \u2014\u2014 \u5BBD\u5EA6\u7531\u5185\u8054 max-width/min-width \u6536\u5230 32\uFF08\u89C1 placePill\uFF09\uFF0C\n // \u8FD9\u91CC\u628A padding/gap \u5F52\u96F6\u3002\u523B\u610F\u4E0D\u7528 justify-content:center \u8BA9\u5706\u70B9\u5C45\u4E2D\uFF1A\u90A3\u662F\u79BB\u6563\u5C5E\u6027\u3001\n // \u4E00\u7FFB\u5C31\u8DF3\uFF08\u5706\u70B9\u4F1A\u77AC\u79FB\uFF09\uFF0C\u6539\u7528\u5706\u70B9\u81EA\u5DF1\u7684 margin-left\uFF08\u53EF\u8FC7\u6E21\uFF09\u628A\u5B83\u632A\u5230\u5706\u7684\u4E2D\u5FC3\u3002\n '.dsh-sel-pill[data-ball=\"1\"]{padding:0;gap:0}',\n // \u4E09\u6BB5\u6587\u5B57\uFF08\u540D\u5B57 / \u72B6\u6001 / \u7BAD\u5934\uFF09\u6536\u8D77\u6765\uFF1Amax-width \u8FC7\u6E21 + \u6DE1\u51FA\uFF0C\u800C\u4E0D\u662F display:none\uFF08\u90A3\u4E2A\u6CA1\u6CD5\u8FC7\u6E21\uFF09\u3002\n // \u26A0\uFE0F \u57FA\u7840\u6001\u5FC5\u987B\u7ED9\u4E00\u4E2A**\u6570\u503C** max-width\uFF08320px\uFF0C\u6BD4\u4EFB\u4F55\u5185\u5BB9\u90FD\u5BBD = \u7B49\u4E8E\u4E0D\u9650\u5236\uFF09\uFF1A\n // \u5426\u5219\u5B83\u662F\u4ECE none \u8FC7\u6E21\u5230 0\uFF0C\u800C none \u4E0D\u53EF\u63D2\u503C \u2014\u2014 \u6587\u5B57\u4F1A\u77AC\u95F4\u584C\u6389\u3002\n // \u5B9E\u6D4B\uFF08\u771F\u65F6\u95F4\u8F74\u9010\u5E27\u91C7\u6837\u5BBD\u5EA6\uFF09\uFF1A\u6F0F\u4E86\u8FD9\u53E5\u65F6\u6574\u679A\u80F6\u56CA 60ms \u5C31\u7F29\u5B8C\u4E86\uFF0C\u770B\u7740\u50CF\u556A\u4E00\u4E0B\u62CD\u6241\uFF0C\n // \u800C\u4E0D\u662F\u6536\u8FDB\u53BB\u3002\n // overflow:hidden \u5E38\u9A7B\uFF08\u4E0D\u6536\u7403\u65F6\u4E5F\u7559\u7740\uFF09\uFF1A\u5B83\u662F\u79BB\u6563\u5C5E\u6027\uFF0C\u82E5\u53EA\u5728\u7403\u6001\u7ED9\uFF0C\u5C55\u5F00\u7B2C\u4E00\u5E27\u6587\u5B57\u4F1A\u5148\u6EA2\u51FA\u6765\u3002\n '.dsh-sel-pill .dsh-sel-pillname,.dsh-sel-pill .dsh-sel-pillmeta,.dsh-sel-pill .dsh-sel-pillcaret{max-width:320px;overflow:hidden;transition:opacity ' + PILL_MORPH + ',max-width ' + PILL_MORPH + '}',\n '.dsh-sel-pill[data-ball=\"1\"] .dsh-sel-pillname,.dsh-sel-pill[data-ball=\"1\"] .dsh-sel-pillmeta,.dsh-sel-pill[data-ball=\"1\"] .dsh-sel-pillcaret{max-width:0;opacity:0;pointer-events:none}',\n '.dsh-sel-pill:hover{box-shadow:0 6px 22px rgba(0,0,0,.18)}',\n '.dsh-sel-pill[data-open=\"1\"]{border-color:color-mix(in srgb,var(--sel-a1,#0d9488) 55%,transparent)}',\n // \u7403\u5FC3\u91CC\u7684\u56FE\u5F62\uFF1A\u4E00\u679A 32\u00D732 \u7684 SVG \u753B\u5E03\uFF0C\u4E24\u4FA7 -12px \u8D1F\u8FB9\u8DDD\u628A**\u5E03\u5C40\u5360\u4F4D**\u538B\u6210 8px \u2014\u2014\n // \u548C\u539F\u6765\u90A3\u679A 8px \u5706\u70B9\u5360\u4F4D\u5B8C\u5168\u76F8\u540C\uFF0C\u6240\u4EE5\u80F6\u56CA\u7684\u6392\u7248\u4E0E\u5BBD\u5EA6\u4E00\u4E2A\u50CF\u7D20\u90FD\u4E0D\u7528\u6539\uFF1B\n // \u800C\u753B\u5E03\u672C\u8EAB\u662F 32px\uFF0C\u4E8E\u662F viewBox \u7684 1 \u5355\u4F4D = 1px\uFF0C\u8BBE\u8BA1\u7A3F\u4E0A\u7684\u6570\u5B57\u53EF\u4EE5\u7167\u6284\u3002\n '.dsh-sel-pillicon{flex:none;width:32px;height:32px;margin:0 -12px;display:block;overflow:visible;transition:margin ' + PILL_MORPH + '}',\n '.dsh-sel-pillstar{fill:var(--dsw-alias-label-tertiary,#8c959f)}',\n // \u56FE\u5F62\u672C\u8EAB\u4E0D\u505A CSS \u8FC7\u6E21\uFF1A\u4E24\u6761\u9759\u6001 path \u4E4B\u95F4 CSS \u53EA\u80FD\u7EBF\u6027\u63D2\u503C\uFF08\u4E2D\u9014\u4F1A\u51FA\u73B0\u6B63\u83F1\u5F62\uFF09\uFF0C\n // \u6240\u4EE5\u8DEF\u5F84\u7531 animatePillStar \u6309 p \u73B0\u7B97\uFF08\u89C1\u90A3\u91CC\u7684\u6CE8\u91CA\uFF09\u3002\n // path \u7684\u5750\u6807\u4E2D\u5FC3\u662F (0,0)\u3002\u767E\u5206\u6BD4\u539F\u70B9\u5728 SVG \u4E2D\u5374\u7B97\u6210 (16px,16px)\uFF0C\n // \u65CB\u8F6C -8\u00B0 \u4F1A\u628A\u5706\u70B9\u58A8\u8FF9\u63A8\u5230\u753B\u5E03\u53F3\u4E0A\u65B9\uFF1B\u5FC5\u987B\u7ED5\u8DEF\u5F84\u771F\u6B63\u7684\u4E2D\u5FC3\u8F6C\u3002\n '.dsh-sel-pillstar{transform-origin:0 0}',\n // \u7403\u6001\uFF1A\u753B\u5E03\u5728 32px \u7684\u5706\u91CC\u5C45\u4E2D \u2014\u2014 \u5185\u5BBD 32-2(\u8FB9\u6846)=30\uFF0C\u4E24\u4FA7\u5404 -1px \u8D1F\u8FB9\u8DDD\u6B63\u597D\u6446\u6B63\uFF08\u4E2D\u5FC3 16\uFF09\n '.dsh-sel-pill[data-ball=\"1\"] .dsh-sel-pillicon{margin:0 -1px}',\n // \u72B6\u6001\u8272\u7167\u65E7\uFF0C\u53EA\u662F\u4ECE\u5706\u70B9\u7684 background \u632A\u5230\u661F\u7684 fill\uFF1B\n // \"\u8FDB\u884C\u4E2D\"\u7684\u547C\u5438\u52A8\u753B\u6302\u5728\u753B\u5E03\u4E0A\uFF08transform \u7ED5\u81EA\u8EAB\u4E2D\u5FC3\u7F29\u653E\uFF0C\u548C\u539F\u6765\u7684\u5706\u70B9\u8109\u51B2\u540C\u4E00\u6761 keyframes\uFF09\n '.dsh-sel-pill[data-tone=busy] .dsh-sel-pillstar{fill:var(--sel-a1,#0d9488)}',\n '.dsh-sel-pill[data-tone=busy] .dsh-sel-pillicon{animation:dsh-sel-pillpulse 1.5s ease-in-out infinite}',\n '.dsh-sel-pill[data-tone=done] .dsh-sel-pillstar{fill:var(--sel-a1,#0d9488)}',\n '.dsh-sel-pill[data-tone=error] .dsh-sel-pillstar{fill:var(--dsw-alias-state-error-primary,#e5484d)}',\n '.dsh-sel-pill[data-tone=paused] .dsh-sel-pillstar{fill:#d97706}',\n '@keyframes dsh-sel-pillpulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.45;transform:scale(.82)}}',\n // \u4E09\u6BB5\u7684\u660E\u6697\u8282\u594F\u4E5F\u7167\u6284\uFF1A\u4E3B\u4F53\u52A0\u7C97\u3001\u6B21\u8981\u4FE1\u606F --secondary\u3001\u7BAD\u5934 --tertiary\n // \u5BBD\u5EA6\u7531 JS \u56FA\u5B9A\u6210\u4E0B\u9762\u90A3\u679A\u8D39\u7528\u80F6\u56CA\u7684\u5BBD\u5EA6\uFF0C\u6240\u4EE5\u6587\u5B57\u5FC5\u987B\u81EA\u5DF1\u8BA9\u4F4D\uFF1A\n // \u540D\u5B57\u90A3\u683C\u53EF\u7F29\u53EF\u7701\u7565\uFF0C\u72B6\u6001\u90A3\u683C\u548C\u7BAD\u5934\u4E0D\u7F29\uFF08\u72B6\u6001\u6BD4\"\u9009\u4E2D\u7684\u662F\u54EA\u4E2A\u8BCD\"\u66F4\u8BE5\u770B\u89C1\uFF09\n '.dsh-sel-pillname{flex:0 1 auto;min-width:0;font-weight:600;font-variant-numeric:tabular-nums;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}',\n '.dsh-sel-pillmeta{flex:0 0 auto;color:var(--dsw-alias-label-secondary,#57606a);font-variant-numeric:tabular-nums;white-space:nowrap}',\n '.dsh-sel-pillcaret{flex:none;color:var(--dsw-alias-label-tertiary,#8c959f)}',\n '.dsh-sel-historypin{flex:0 0 auto;font-size:10.5px;padding:1px 6px;border-radius:6px;opacity:.8;',\n 'background:color-mix(in srgb,var(--sel-a1,#0d9488) 16%,transparent)}',\n '.dsh-sel-wait{display:flex;flex-direction:column;gap:10px;padding:2px 0}',\n '.dsh-sel-waitline{display:flex;align-items:center;gap:7px;font-size:12.5px;opacity:.72;letter-spacing:.2px}',\n '.dsh-sel-dots{display:inline-flex;align-items:center;gap:4px}',\n '.dsh-sel-dots i{display:block;width:5px;height:5px;border-radius:50%;background:var(--sel-a1,#0d9488);',\n 'animation:dsh-sel-blink 1.6s ease-in-out infinite}',\n '.dsh-sel-dots i:nth-child(2){animation-delay:.22s}',\n '.dsh-sel-dots i:nth-child(3){animation-delay:.44s}',\n '.dsh-sel-waitclock{font-variant-numeric:tabular-nums;opacity:.72;font-size:11.5px}',\n '.dsh-sel-waithint{font-size:11.5px;opacity:.5;margin-top:-3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}',\n '.dsh-sel-sk{height:8px;border-radius:5px;background:linear-gradient(90deg,rgba(140,140,140,.10),rgba(140,140,140,.24),rgba(140,140,140,.10));',\n 'background-size:220% 100%;animation:dsh-sel-shim 2.4s ease-in-out infinite}',\n '.dsh-sel-skrow{display:flex;flex-direction:column;gap:7px;padding:1px 0}',\n '@keyframes dsh-sel-shim{0%{background-position:130% 0}100%{background-position:-130% 0}}',\n '@keyframes dsh-sel-blink{0%,100%{opacity:.24;transform:translateY(0)}45%{opacity:.95;transform:translateY(-2px)}}',\n '.dsh-sel-err{color:var(--dsw-alias-state-error-primary,#e5484d);font-size:12.5px;white-space:pre-wrap}',\n '@media (prefers-reduced-motion:reduce){.dsh-sel-sk{animation:none}.dsh-sel-dots i{animation:none;opacity:.6}',\n '.dsh-sel-btn{transition:none}.dsh-sel-btn[data-pop=\"1\"]{animation:none}}',\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u8BBE\u7F6E\u9875\uFF08\u62BD\u5C49\uFF09 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // \u4E00\u4E2A\u62BD\u5C49\uFF0C\u4E0D\u53E6\u5F00\u7A97\u53E3\uFF1A\u5C0F\u7A97\u672C\u8EAB\u5C31\u662F\u7A84\u5BB9\u5668\uFF0C\u518D\u5F39\u4E00\u4E2A\u6D6E\u7A97\u53EA\u4F1A\u4E92\u76F8\u6253\u67B6\u3002\n // \u4ECE\u9762\u677F\u53F3\u4FA7\u6ED1\u5165\u3001\u76D6\u4F4F\u6B63\u6587\uFF0C\u9762\u677F\u5C3A\u5BF8\u4E00\u4E2A\u50CF\u7D20\u90FD\u4E0D\u53D8\u3002\n '.dsh-sel-sheet{position:absolute;top:0;left:0;right:0;bottom:0;z-index:6;display:flex;flex-direction:column;',\n 'background:var(--dsw-alias-bg-layer-1,Canvas);color:var(--dsw-alias-label-primary,CanvasText);',\n // \u26A0\uFE0F \u503C\u5FC5\u987B\u5E26\u5F15\u53F7\uFF1A[data-open=1] \u662F**\u975E\u6CD5\u9009\u62E9\u5668**\uFF08CSS \u6807\u8BC6\u7B26\u4E0D\u80FD\u4EE5\u6570\u5B57\u5F00\u5934\uFF09\uFF0C\n // \u6D4F\u89C8\u5668\u4F1A\u6574\u6761\u4E22\u5F03 \u2014\u2014 \u8868\u73B0\u4E3A\"\u5C5E\u6027\u660E\u660E\u8BBE\u4E86\u3001\u62BD\u5C49\u5374\u7EB9\u4E1D\u4E0D\u52A8\"\uFF08\u5B9E\u6D4B\u8E29\u8FC7\uFF09\u3002\n 'transform:translateX(100%);opacity:0;pointer-events:none;box-shadow:-14px 0 30px rgba(0,0,0,.16);',\n 'transition:transform .34s cubic-bezier(.22,.8,.3,1),opacity .22s ease}',\n '.dsh-sel-sheet[data-open=\"1\"]{transform:translateX(0);opacity:1;pointer-events:auto}',\n // \u62BD\u5C49\u540E\u9762\u538B\u4E00\u5C42\u8584\u7EB1\uFF1A\u4E0D\u906E\u6B7B\u6B63\u6587\uFF08\u7528\u6237\u8FD8\u5F97\u770B\u5F97\u51FA\u4E0A\u4E0B\u6587\uFF09\uFF0C\u53EA\u628A\u5C42\u6B21\u5206\u5F00\n '.dsh-sel-scrim{position:absolute;top:0;left:0;right:0;bottom:0;z-index:5;background:rgba(0,0,0,.06);',\n 'opacity:0;pointer-events:none;transition:opacity .28s ease}',\n '.dsh-sel-scrim[data-open=\"1\"]{opacity:1}',\n '.dsh-sel-layer[data-theme=dark] .dsh-sel-scrim{background:rgba(0,0,0,.32)}',\n '@media (prefers-reduced-motion:reduce){.dsh-sel-sheet{transition:opacity .16s ease;transform:none}',\n '.dsh-sel-scrim{transition:none}}',\n '.dsh-sel-sheethead{display:flex;align-items:center;gap:8px;padding:10px 10px 10px 12px;flex:0 0 auto;',\n 'border-bottom:.5px solid var(--dsw-alias-border-l4,rgba(140,140,140,.22))}',\n '.dsh-sel-sheetback{flex:0 0 auto;width:24px;height:24px;display:grid;place-items:center;border:0;border-radius:8px;',\n 'cursor:pointer;background:transparent;color:inherit;opacity:.75;padding:0}',\n '.dsh-sel-sheetback:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(140,140,140,.16));opacity:1}',\n '.dsh-sel-sheettitle{font-weight:600;font-size:12.5px;letter-spacing:.2px}',\n '.dsh-sel-sheetscope{margin-left:auto;font-size:11px;opacity:.5;padding-right:4px;white-space:nowrap}',\n // \u5DE6\u680F\u5206\u7C7B + \u53F3\u680F\u5185\u5BB9\n '.dsh-sel-sheetmain{flex:1 1 auto;display:flex;min-height:0}',\n '.dsh-sel-rail{flex:0 0 96px;border-right:.5px solid var(--dsw-alias-border-l4,rgba(140,140,140,.22));',\n 'padding:8px 6px;display:flex;flex-direction:column;gap:2px;overflow:auto}',\n '.dsh-sel-railbtn{border:0;background:transparent;text-align:left;padding:6px 8px;border-radius:8px;cursor:pointer;',\n 'font:inherit;font-size:12px;color:inherit;opacity:.72;white-space:nowrap}',\n '.dsh-sel-railbtn:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(140,140,140,.12));opacity:1}',\n '.dsh-sel-railbtn[aria-current=\"true\"]{background:var(--sel-a1-soft,rgba(13,148,136,.12));color:var(--sel-a1-text,#0f766e);',\n 'font-weight:600;opacity:1}',\n '.dsh-sel-sheetbody{flex:1 1 auto;overflow:auto;padding:2px 12px 14px;min-width:0;',\n 'scrollbar-width:thin;scrollbar-color:rgba(140,140,140,.35) transparent}',\n '.dsh-sel-sheetbody::-webkit-scrollbar{width:9px;height:9px}',\n '.dsh-sel-sheetbody::-webkit-scrollbar-thumb{background:rgba(140,140,140,.3);border-radius:9px;border:2px solid transparent;background-clip:content-box}',\n '.dsh-sel-grp{padding:12px 0 4px;border-bottom:.5px solid var(--dsw-alias-border-l4,rgba(140,140,140,.16))}',\n '.dsh-sel-grp:last-child{border-bottom:0;padding-bottom:0}',\n '.dsh-sel-grph{font-size:11px;font-weight:600;opacity:.5;letter-spacing:.4px;margin-bottom:8px}',\n '.dsh-sel-ssection+.dsh-sel-ssection{margin-top:16px;padding-top:16px;border-top:.5px solid var(--dsw-alias-border-l4,rgba(140,140,140,.16))}',\n '.dsh-sel-ssectionh{font-size:14px;font-weight:600;line-height:1.5;margin:0 0 6px}',\n '.dsh-sel-ssectionhint,.dsh-sel-ssectionnote{font-size:11.5px;opacity:.6;line-height:1.7;margin:3px 0 8px}',\n '.dsh-sel-ssectionnote{margin:8px 0 0}',\n '.dsh-sel-ssection>.dsh-sel-srow+.dsh-sel-srow{border-top:.5px solid var(--dsw-alias-border-l4,rgba(140,140,140,.16))}',\n '.dsh-sel-srow[data-disabled=\"1\"]{opacity:.5}',\n '.dsh-sel-srow input:disabled,.dsh-sel-srow button:disabled{cursor:default}',\n '.dsh-sel-sheet textarea.dsh-sel-stext{resize:vertical;line-height:1.6}',\n\n '.dsh-sel-srow{display:flex;align-items:flex-start;gap:14px;padding:8px 0}',\n '.dsh-sel-srowlab{flex:1 1 auto;min-width:0}',\n '.dsh-sel-srowt{font-size:13px;line-height:1.5}',\n '.dsh-sel-srowd{font-size:11.5px;opacity:.55;line-height:1.6;margin-top:3px;max-width:46ch}',\n '.dsh-sel-srowctl{flex:0 0 auto;display:flex;align-items:center;gap:6px;padding-top:2px;min-width:0}',\n // \u5BBD\u8F93\u5165\u6846\uFF08provider / model / \u5DE5\u5177\u6E05\u5355\uFF09\u6240\u5728\u884C\uFF1A\u8BF4\u660E\u5728\u4E0A\u3001\u8F93\u5165\u6846\u72EC\u5360\u4E00\u884C\u3002\n // \u62BD\u5C49\u662F\u5D4C\u5728\u5C0F\u7A97\u91CC\u7684\u7A84\u5BB9\u5668\uFF0C\u89C6\u53E3\u518D\u5BBD\u4E5F\u5E2E\u4E0D\u4E0A\u5FD9\uFF0C\u6240\u4EE5\u6309\"\u884C\u91CC\u6709\u6CA1\u6709\u5BBD\u8F93\u5165\u6846\"\u6765\u5224\u3002\n '.dsh-sel-srow[data-wide=\"1\"]{flex-wrap:wrap}',\n '.dsh-sel-srow[data-wide=\"1\"] .dsh-sel-srowlab{flex:1 1 100%}',\n '.dsh-sel-srow[data-wide=\"1\"] .dsh-sel-srowctl{flex:1 1 100%;padding-top:6px}',\n '.dsh-sel-srow[data-wide=\"1\"] .dsh-sel-stext{width:100%;max-width:none}',\n '.dsh-sel-srow[data-wide=\"1\"] .dsh-sel-spick{width:100%;max-width:none}',\n // \u63A7\u4EF6\uFF1A\u5F00\u5173\uFF0838\u00D722\uFF0C\u89E6\u5C4F\u4E5F\u70B9\u5F97\u4F4F\uFF09\n '.dsh-sel-sws{flex:none;width:38px;height:22px;border-radius:11px;position:relative;cursor:pointer;padding:0;',\n 'border:.5px solid var(--dsw-alias-border-l3,rgba(140,140,140,.35));background:var(--dsw-alias-bg-layer-2,rgba(140,140,140,.12));',\n 'transition:background .18s ease}',\n '.dsh-sel-sws:after{content:\"\";position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;',\n 'background:var(--dsw-alias-bg-layer-1,#fff);box-shadow:0 1px 3px rgba(0,0,0,.28);',\n 'transition:transform .2s cubic-bezier(.34,1.4,.64,1)}',\n '.dsh-sel-sws[aria-checked=\"true\"]{background:var(--sel-fill,#0f766e);border-color:var(--sel-fill,#0f766e)}',\n '.dsh-sel-sws[aria-checked=\"true\"]:after{transform:translateX(16px);background:var(--sel-fill-fg,#fff)}',\n // \u63A7\u4EF6\uFF1A\u6570\u5B57 / \u6587\u672C\n '.dsh-sel-snum{width:74px;border:.5px solid var(--dsw-alias-border-l3,rgba(140,140,140,.35));border-radius:8px;',\n 'padding:5px 8px;background:transparent;color:inherit;font:inherit;font-size:12.5px;text-align:right;',\n 'font-variant-numeric:tabular-nums;box-sizing:border-box}',\n '.dsh-sel-stext{width:170px;border:.5px solid var(--dsw-alias-border-l3,rgba(140,140,140,.35));border-radius:8px;',\n 'padding:5px 8px;background:transparent;color:inherit;font:inherit;font-size:12px;box-sizing:border-box}',\n '.dsh-sel-snum:focus-visible,.dsh-sel-stext:focus-visible,.dsh-sel-sws:focus-visible,.dsh-sel-segcell:focus-visible,',\n '.dsh-sel-sheetback:focus-visible,.dsh-sel-railbtn:focus-visible,.dsh-sel-sbtn:focus-visible,',\n '.dsh-sel-action:focus-visible,.dsh-sel-icon:focus-visible{outline:2px solid var(--sel-a1,#0d9488);outline-offset:2px}',\n '.dsh-sel-sunit{font-size:11.5px;opacity:.5;white-space:nowrap}',\n // \u6A21\u578B\u9009\u62E9\uFF1A**\u81EA\u7ED8\u4E0B\u62C9**\uFF0C\u4E0D\u7528\u539F\u751F <select>\u3002\n // \u539F\u751F select \u7684\u5F39\u51FA\u5C42\u7531\u6D4F\u89C8\u5668\u753B\uFF0C42 \u4E2A\u6A21\u578B\u65F6\u4F1A\u9876\u51FA\u53EF\u89C6\u533A\u4E14\u62FF\u4E0D\u5230\u6EDA\u52A8\u6761\uFF08\u7528\u6237\u62A5\u7684\uFF09\u3002\n // \u81EA\u7ED8\u7684\u5217\u8868\u81EA\u5DF1\u5E26 max-height + overflow:auto\uFF0C\u6EDA\u52A8\u6761\u662F\u786E\u5B9A\u7684\uFF1B\u6837\u5F0F\u4E5F\u548C composer \u90A3\u679A\u6A21\u578B\u83DC\u5355\u4E00\u81F4\u3002\n '.dsh-sel-spick{width:100%;display:flex;align-items:center;gap:8px;border:.5px solid var(--dsw-alias-border-l3,rgba(140,140,140,.35));',\n 'border-radius:8px;padding:5px 8px;background:transparent;color:inherit;font:inherit;font-size:12.5px;',\n 'box-sizing:border-box;cursor:pointer;text-align:left}',\n '.dsh-sel-spick:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(140,140,140,.12))}',\n '.dsh-sel-spickname{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}',\n '.dsh-sel-spickcaret{flex:none;font-size:9px;opacity:.6}',\n // \u83DC\u5355\u6302\u5728**\u62BD\u5C49**\u4E0A\uFF08\u4E0D\u662F\u884C\u91CC\uFF09\uFF1A\u884C\u7684\u7956\u5148\u94FE\u4E0A\u6709 overflow:auto \u7684\u6EDA\u52A8\u533A\uFF0C\u6D6E\u5C42\u4F1A\u88AB\u5B83\u88C1\u6389\n '.dsh-sel-spickmenu{position:absolute;z-index:30;display:none;flex-direction:column;padding:6px;border-radius:12px;',\n 'box-sizing:border-box;background:var(--dsw-alias-bg-layer-2,#232427);',\n 'border:.5px solid var(--dsw-alias-border-l3,rgba(140,140,140,.35));box-shadow:0 14px 34px rgba(0,0,0,.35)}',\n '.dsh-sel-spickmenu[data-open=\"1\"]{display:flex}',\n '.dsh-sel-spickgroup{padding:2px 8px 5px;font-size:10.5px;opacity:.6;flex:none}',\n // \u5217\u8868\u81EA\u5DF1\u6EDA\uFF1Amax-height \u7531 JS \u6309\"\u62BD\u5C49\u5E95\u90E8\u8FD8\u5269\u591A\u5C11\"\u7ED9\uFF0C\u8FD9\u91CC\u53EA\u515C\u5E95\n '.dsh-sel-spicklist{flex:1 1 auto;min-height:0;max-height:260px;overflow-y:auto;overflow-x:hidden;',\n 'display:flex;flex-direction:column;gap:1px;scrollbar-width:thin;scrollbar-color:rgba(140,140,140,.45) transparent}',\n '.dsh-sel-spicklist::-webkit-scrollbar{width:9px}',\n '.dsh-sel-spicklist::-webkit-scrollbar-thumb{background:rgba(140,140,140,.4);border-radius:9px;border:2px solid transparent;background-clip:content-box}',\n '.dsh-sel-spickrow{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:8px;cursor:pointer;',\n 'font:inherit;font-size:12px;text-align:left;border:0;background:transparent;color:inherit;flex:none}',\n '.dsh-sel-spickrow:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(140,140,140,.12))}',\n '.dsh-sel-spickrow[data-on=\"1\"]{font-weight:600}',\n '.dsh-sel-spickcheck{width:12px;flex:0 0 auto;color:var(--sel-a1-text,#0f766e);font-weight:700}',\n '.dsh-sel-spickrowname{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}',\n '.dsh-sel-spickprov{flex:none;font-size:10.5px;opacity:.55;max-width:40%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}',\n '.dsh-sel-spickempty{padding:8px;font-size:11.5px;opacity:.55}',\n // \u63A7\u4EF6\uFF1A\u5206\u6BB5\uFF08\u6863\u4F4D\uFF09\n '.dsh-sel-sheet .dsh-sel-seg{display:inline-flex;background:var(--dsw-alias-bg-layer-2,rgba(140,140,140,.1));',\n 'border:.5px solid var(--dsw-alias-border-l3,rgba(140,140,140,.3));border-radius:9px;padding:2px;position:relative}',\n '.dsh-sel-sheet .dsh-sel-segcell{border:0;background:transparent;cursor:pointer;font:inherit;font-size:11.5px;width:auto;height:26px;min-width:34px;padding:4px 9px;',\n 'border-radius:7px;color:inherit;position:relative;z-index:1;white-space:nowrap;opacity:.8}',\n '.dsh-sel-sheet .dsh-sel-segcell[aria-checked=\"true\"]{color:var(--sel-fill-fg,#fff);font-weight:600;opacity:1}',\n '.dsh-sel-sheet .dsh-sel-segpill{position:absolute;top:2px;bottom:2px;height:auto;border-radius:7px;background:var(--sel-fill,#0f766e);z-index:0;',\n 'transition:left .22s cubic-bezier(.34,1.3,.64,1),width .22s cubic-bezier(.34,1.3,.64,1)}',\n // \u5E95\u90E8\u52A8\u4F5C\u680F\uFF1A\u5E38\u9A7B\uFF1B\u4E0D\u810F\u65F6\u5199\"\u6539\u52A8\u4F1A\u81EA\u52A8\u4FDD\u5B58\"\uFF0C\u810F\u4E86\u624D\u62A5\u6570\n '.dsh-sel-sheetfoot{flex:0 0 auto;display:flex;align-items:center;gap:8px;padding:9px 12px;',\n 'border-top:.5px solid var(--dsw-alias-border-l4,rgba(140,140,140,.22));background:var(--dsw-alias-bg-layer-2,rgba(140,140,140,.05))}',\n '.dsh-sel-sfootnote{font-size:11.5px;opacity:.55;margin-right:auto;display:flex;align-items:center;gap:6px}',\n '.dsh-sel-sfootnote i{width:6px;height:6px;border-radius:50%;background:var(--dsw-alias-state-error-primary,#e5484d);display:none}',\n '.dsh-sel-sfootnote[data-dirty=\"1\"]{opacity:.9}',\n '.dsh-sel-sfootnote[data-dirty=\"1\"] i{display:block}',\n '.dsh-sel-sbtn{border:.5px solid var(--dsw-alias-border-l3,rgba(140,140,140,.35));border-radius:8px;padding:5px 11px;',\n 'background:transparent;color:inherit;cursor:pointer;font:inherit;font-size:12px;white-space:nowrap}',\n '.dsh-sel-sbtn:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(140,140,140,.12))}',\n '.dsh-sel-sbtn:disabled{opacity:.4;cursor:default}',\n '.dsh-sel-sbtn[data-danger=\"1\"]{color:var(--dsw-alias-state-error-primary,#e5484d);',\n 'border-color:color-mix(in srgb,var(--dsw-alias-state-error-primary,#e5484d) 45%,transparent)}',\n '.dsh-sel-sempty{font-size:12px;opacity:.55;padding:14px 2px}',\n // \u2500\u2500 \u8BED\u97F3\u5361\uFF1A\u9009\u4E2D\u6587\u5B57 + \u8F93\u5165\u6CD5\u6B63\u5728\u8BED\u97F3\u8F93\u5165\u65F6\uFF0C\u5C31\u5730\u5F39\u51FA\u7684\u4E34\u65F6\u8F93\u5165\u6846 \u2500\u2500\n // \u5B83\u7531\u6D6E\u6807**\u5F62\u53D8**\u800C\u6765\uFF08\u540C\u4E00\u683C \u2192 \u4E0B\u79FB\u5C55\u5F00\uFF09\uFF0C\u6240\u4EE5\u51E0\u4F55\u5168\u90E8\u7531 JS \u7ED9\uFF0C\u8FD9\u91CC\u53EA\u7BA1\u957F\u76F8\u3002\n // box-sizing \u5FC5\u987B\u663E\u5F0F\u5199\uFF1A\u63D2\u4EF6\u662F\u6309\u7EC4\u4EF6\u8BBE\u7684\uFF08panel/history/pill \u5404\u81EA\u5199\uFF09\uFF0C\u6CA1\u6709\u5168\u5C40\u91CD\u7F6E\u3002\n // \u6F0F\u4E86\u5B83\u65F6 style.height \u53EA\u662F\"\u5185\u5BB9\u9AD8\"\uFF0C\u52A0\u4E0A\u5185\u8FB9\u8DDD\u4E0E\u8FB9\u6846\u771F\u5B9E\u9AD8\u5EA6\u4F1A\u591A\u51FA 24px \u2014\u2014\n // \u5355\u884C\u5361\u4E8E\u662F\u6E32\u67D3\u6210 70px\uFF08\u7528\u6237\u62A5\u7684\"heard \u9636\u6BB5\u6846\u592A\u5927\"\u5C31\u662F\u8FD9\u4E2A\uFF09\u3002\n '.dsh-sel-vcard{position:fixed;z-index:2147483000;display:none;align-items:stretch;gap:11px;',\n 'box-sizing:border-box;padding:8px 12px 8px 13px;background:var(--dsw-alias-bg-base,#fff);color:inherit;',\n 'border:1px solid var(--dsw-alias-border-l2,rgba(140,140,140,.28));border-radius:20px;',\n 'box-shadow:0 10px 28px rgba(0,0,0,.18);overflow:hidden;',\n 'transition:width .3s cubic-bezier(.2,.8,.2,1),height .3s cubic-bezier(.2,.8,.2,1),',\n 'left .3s cubic-bezier(.2,.8,.2,1),top .32s cubic-bezier(.2,.8,.2,1),',\n 'border-radius .3s cubic-bezier(.2,.8,.2,1),border-color .2s ease}',\n // \u300C\u5728\u542C\u300D= \u5361\u7247\u5DE6\u7F18\u90A3\u6839 3px \u7AD6\u6761\uFF08B1\uFF09+ \u9AD8\u5EA6\u547C\u5438\uFF08\u52A81\uFF09\u3002\n // \u5F53\u5E74\u5426\u6389\u7AD6\u6761\u7684\u7406\u7531\u662F\"\u592A\u50CF\u8F93\u5165\u5149\u6807\"\u2014\u2014 \u4F46\u90A3\u6B21\u662F**\u901A\u9AD8 + \u7D27\u8D34\u6587\u5B57**\uFF1B\n // \u73B0\u5728\u4FDD\u7559\u540C\u4E00\u5F62\u6001\uFF0C\u9760\"\u4F38\u7F29\"\u628A\u5B83\u4ECE\"\u5149\u6807\"\u8BFB\u6210\"\u7535\u5E73\u5728\u52A8\"\uFF08\u7528\u6237\u9009\u5B9A B1+\u52A81\uFF09\u3002\n // \u63CF\u8FB9\u4ECD\u7136\u6CDB\u9752\uFF08\u9759\u6001\u7684\"\u8FD9\u4E00\u6BB5\u5728\u7528\"\uFF09\uFF0C\u4F46**\u5149\u6655\u547C\u5438\u64A4\u6389**\uFF1A\u6307\u793A\u5668\u53EA\u7559\u4E00\u4E2A\uFF0C\u522B\u4E24\u4E2A\u4E00\u8D77\u52A8\u3002\n // \u7AD6\u6761\u5728\u975E\"\u5728\u542C\"\u65F6\u538B\u6697\u5230 .35\uFF08\u5F55\u97F3\u7ED3\u675F\u540E\u4E0D\u518D\u5047\u88C5\u5728\u542C\uFF0C\u4E14\u4E0D\u9690\u85CF \u2014\u2014 \u9690\u85CF\u4F1A\u8BA9\u6B63\u6587\u8DF3\u4E00\u4E0B\uFF09\u3002\n '.dsh-sel-vcard[data-voiced=\"1\"]{border-color:var(--sel-a2)}',\n '.dsh-sel-vbar{flex:0 0 3px;width:3px;align-self:stretch;border-radius:3px;',\n 'background:var(--sel-a1);margin-right:9px;opacity:.35}',\n '.dsh-sel-vcard[data-voiced=\"1\"] .dsh-sel-vbar{opacity:1;',\n 'animation:dsh-sel-vbar-pulse 1.05s ease-in-out infinite}',\n '@keyframes dsh-sel-vbar-pulse{50%{transform:scaleY(.55)}}',\n // \u6B63\u6587\u53F3\u4FA7\u7559 40px \u7ED9\u53D1\u9001\u952E\uFF08\u5B83\u662F\u7EDD\u5BF9\u5B9A\u4F4D\u7684\uFF0C\u4E0D\u53C2\u4E0E\u884C\u9AD8 \u2014\u2014 \u5426\u5219 30px \u7684\u6309\u94AE\u4F1A\u628A\n // \u5355\u884C\u5361\u7247\u9876\u5230 52px\uFF0C\u7528\u6237\u770B\u5230\u7684\u5C31\u662F\"\u4E34\u65F6\u6846\u592A\u9AD8\"\uFF09\n '.dsh-sel-vcard-box{flex:1;min-width:0;align-self:center;display:block;margin:0;',\n // min-height:0 \u662F\u9632\u5FA1\uFF1A\u5BBF\u4E3B App \u7684\u6837\u5F0F\u8868\u82E5\u7ED9 textarea \u8BBE\u4E86 min-height\uFF08\u6211\u4EEC\u7BA1\u4E0D\u5230\u522B\u4EBA\u7684\u5168\u5C40\u89C4\u5219\uFF09\uFF0C\n // \u9AD8\u5EA6\u5C31\u4F1A\u7531\u5B83\u8BF4\u4E86\u7B97 \u2014\u2014 \u5355\u884C\u5361\u4F1A\u56E0\u6B64\u53D8\u9AD8\n 'box-sizing:border-box;min-height:0;padding:0 40px 0 0;border:0;outline:0;background:transparent;color:inherit;',\n 'resize:none;overflow-y:hidden;font:400 15.5px/1.5 ' + FONT + ';max-height:96px}',\n '.dsh-sel-vcard-box::placeholder{color:var(--dsw-alias-label-tertiary,rgba(140,140,140,.9))}',\n // \u5C3A\u5BF8\u2248\u4E00\u884C\u884C\u9AD8\uFF0823.25px\uFF09\uFF1A\u5355\u884C\u5361\u91CC\u5B83\u548C\u6587\u5B57\u540C\u4E00\u6761\u4E2D\u7EBF\uFF1B\u591A\u884C\u65F6\u8D34\u5E95=\u8DDF\u7740\u6700\u540E\u4E00\u884C\u8D70\u3002\n // \u6BD4\u4E00\u884C\u9AD8\u592A\u591A\uFF08\u6BD4\u5982 30px\uFF09\u4F1A\u8BA9\u5B83\u5728\u5355\u884C\u5361\u91CC\"\u770B\u8D77\u6765\u6389\u5230\u6587\u5B57\u4E0B\u9762\u53BB\u4E86\"\u3002\n '.dsh-sel-vcard-send{position:absolute;right:12px;bottom:8px;width:26px;height:26px;border:0;',\n 'border-radius:50%;background:var(--sel-a1);color:#fff;font:400 14px/1 ' + FONT + ';',\n 'cursor:pointer;opacity:0;pointer-events:none;transition:opacity .16s ease}',\n // \u8FD8\u4EC0\u4E48\u90FD\u6CA1\u8BF4\u65F6\u4E0D\u6446\u51FA\u53D1\u9001\u952E\uFF08\u5148\u53EA\u663E\u793A\"\u6B63\u5728\u542C\u2026\"\uFF09\n '.dsh-sel-vcard[data-text=\"1\"] .dsh-sel-vcard-send{opacity:1;pointer-events:auto}',\n // \u2500\u2500 \u9009\u4E2D\u63D0\u793A\uFF1A\u4E0B\u5212\u7EBF + \u4ECE\u9009\u533A\u7275\u5F15\u5230\u5361\u7247\u7684\u865A\u7EBF\uFF08E \u65B9\u6848\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // \u62A2\u7126\u70B9\u4F1A\u8BA9\u539F\u751F\u9009\u533A\u5E95\u7EB9\u6D88\u5931\uFF0C\u6240\u4EE5\u7528\u8FD9\u4E24\u6837\u63A5\u624B\"\u6307\u8BA4\u8FD9\u6BB5\u6587\u5B57\"\u3002\n // \u4E24\u8005\u90FD\u5728\u6211\u4EEC\u81EA\u5DF1\u7684\u5C42\u91CC\uFF0C**\u4E0D\u78B0\u9009\u533A / \u7126\u70B9\u8BED\u4E49**\uFF0C\u5BF9\u8F93\u5165\u6CD5\u4E0A\u5C4F\u96F6\u5F71\u54CD\u3002\n // \u989C\u8272\u76F4\u63A5\u7528 --sel-a1 \u2014\u2014 \u5B83\u672C\u6765\u5C31\u6309\u660E\u6697\u6362\uFF08\u6D45\u8272 #0d9488 / \u6DF1\u8272 #4ecdc4\uFF09\u3002\n '.dsh-sel-umark{position:fixed;left:0;top:0;right:0;bottom:0;pointer-events:none;',\n 'z-index:2147482998;transition:opacity .14s ease}',\n '.dsh-sel-uline{position:fixed;height:2px;border-radius:1px;pointer-events:none}',\n // \u7275\u5F15\u7EBF\u662F **SVG \u8D1D\u585E\u5C14**\uFF08\u539F\u6765\u662F\u4E00\u6839 2px \u7AD6\u6761 \u2192 \u63A7\u5236\u70B9\u548C\u7AEF\u70B9\u540C x\uFF0C\u9000\u5316\u6210\u76F4\u7EBF\uFF0C\n // \u7528\u6237\u4E00\u773C\u770B\u51FA\"\u8FD9\u4E0D\u662F\u8D1D\u585E\u5C14\"\uFF09\u3002\u73B0\u5728\u4E24\u7AEF\u5404\u7ED9\u4E00\u4E2A\u53CD\u5411\u7684\u6A2A\u5411\u63A7\u5236\u91CF\uFF0C\u505A\u51FA\u53EF\u89C1\u7684 S \u5F62\u3002\n '.dsh-sel-thread{position:fixed;left:0;top:0;width:100%;height:100%;pointer-events:none;',\n 'z-index:2147482998;overflow:visible;display:none;opacity:0;transition:opacity .14s ease}',\n '.dsh-sel-thread path{fill:none;stroke-width:1.6;stroke-dasharray:4 4;',\n 'animation:dsh-sel-thread-flow 1.1s linear infinite}',\n // \u51FA\u73B0\u65F6\"\u5411\u5361\u7247\u751F\u957F\"\uFF1A\u7528 clip \u4ECE\u4E0A\u5F80\u4E0B\u63ED\u5F00\uFF08display:none \u2192 block \u65F6\u52A8\u753B\u81EA\u52A8\u91CD\u653E\uFF0C\n // \u4E0D\u9700\u8981 JS \u53BB\u91CD\u7F6E\uFF1B\u8FDE\u7EED\u5F00\u5173\u5361\u7247\u4E5F\u4E0D\u4F1A\u7B2C\u4E8C\u6B21\u4E0D\u52A8\uFF09\n '.dsh-sel-thread[data-grow=\"1\"]{animation:dsh-sel-thread-grow .26s ease-out}',\n '@keyframes dsh-sel-thread-grow{from{clip-path:inset(0 0 100% 0)}to{clip-path:inset(0 0 0 0)}}',\n // \u865A\u7EBF\u671D\u5361\u7247\u6D41\u52A8\uFF1ASVG \u76F4\u63A5\u52A8 stroke-dashoffset\uFF08\u6BD4\u52A8 background-position \u66F4\u7701\u3001\u4E5F\u66F4\u51C6\uFF09\n '@keyframes dsh-sel-thread-flow{to{stroke-dashoffset:-16}}',\n // \u2500\u2500 \u6D88\u5931\uFF1A\u8001\u5F0F\u7535\u89C6\u673A\u5173\u673A\uFF08A \u65B9\u6848\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // \u5361\u7247\u584C\u6210\u4E00\u6761\u7EBF\uFF0C\u4EAE\u7EBF\u518D\u6A2A\u7F29\u6210\u4E00\u4E2A\u70B9\uFF1B\u6700\u540E\u4E00\u6BB5\u505A\u6210\"\u50CF\u7D20\u6545\u969C\"\uFF1A\n // \u4EAE\u7EBF\u62C6\u6210 5 \u6BB5\uFF0C\u5404\u81EA\u95EA\u3001\u5404\u81EA\u6296\u3001\u5404\u81EA\u6B7B\uFF1B**\u6536\u7F29\u539F\u70B9\u7EDF\u4E00\u5728\u6574\u6761\u7EBF\u7684\u4E2D\u5FC3**\n // \uFF08\u767E\u5206\u6BD4\u662F\u76F8\u5BF9\u6BCF\u6BB5\u81EA\u5DF1\u7684\u5BBD\u5EA6\u7B97\u7684\uFF0C\u6240\u4EE5\u5916\u5708\u662F 200% / -200% \u8FD9\u79CD\u503C\uFF09\uFF0C\n // \u4E8E\u662F\"\u5F80\u4E2D\u95F4\u6536\"\u548C\"\u9519\u4F4D\u9732\u7F1D\"\u540C\u65F6\u53D1\u751F \u2014\u2014 \u90A3\u70B9\u7535\u5B50\u635F\u574F\u5C31\u662F\u8FD9\u4E48\u6765\u7684\u3002\n // \u4E3A\u4EC0\u4E48\u4E0D\u7528 mask \u505A\u865A\u7EBF\uFF1Amask-image \u4E0D\u662F\u53EF\u52A8\u753B\u5C5E\u6027\uFF0C\u5199\u5728\u5173\u952E\u5E27\u91CC\u4F1A\u88AB\u5FFD\u7565\u3002\n // \u4EAE\u7EBF\u662F**\u72EC\u7ACB\u5143\u7D20**\uFF0C\u4E0D\u662F\u5361\u7247\u7684 box-shadow \u2014\u2014 \u540E\u8005\u4F1A\u8DDF\u7740 transform \u4E00\u8D77\u88AB\u538B\u6241\u3002\n // \u989C\u8272\u7531 JS \u6309\u660E\u6697\u6302\u5230\u5BB9\u5668\u4E0A\uFF08\u6D45\u8272\u5E95\u767D\u7EBF\u770B\u4E0D\u89C1\uFF0C\u53EA\u5DEE ~15/255\uFF09\uFF0C\u5B50\u5143\u7D20\u7528 currentColor \u7EE7\u627F\u3002\n '.dsh-sel-crtline{position:fixed;height:3px;pointer-events:none;z-index:2147483001;opacity:0}',\n '.dsh-sel-crtseg,.dsh-sel-crtspark{position:absolute;background:currentColor;border-radius:1px}',\n '.dsh-sel-crtseg{top:0;height:100%;width:20%}',\n '.dsh-sel-crtspark{top:-1px;width:3px;height:5px;opacity:0}',\n '.dsh-sel-vcard[data-off=\"a\"]{transform-origin:50% 50%;animation:dsh-sel-crt-card-a 460ms cubic-bezier(.3,0,.2,1) forwards}',\n '.dsh-sel-crtline[data-off=\"a\"]{animation:dsh-sel-crt-line-a 460ms cubic-bezier(.35,0,.25,1) forwards}',\n '.dsh-sel-crtline[data-off=\"a\"] .dsh-sel-crtseg{animation:dsh-sel-crt-seg-a 460ms cubic-bezier(.4,0,.3,1) forwards}',\n '.dsh-sel-crtline[data-off=\"a\"] .dsh-sel-crtspark{animation:dsh-sel-crt-spark-a 460ms linear forwards}',\n '.dsh-sel-crtline[data-off=\"a\"] .dsh-sel-crtseg:nth-child(1){left:0%;transform-origin:200% 50%;animation-delay:-16ms}',\n '.dsh-sel-crtline[data-off=\"a\"] .dsh-sel-crtseg:nth-child(2){left:20%;transform-origin:100% 50%;animation-delay:-38ms}',\n '.dsh-sel-crtline[data-off=\"a\"] .dsh-sel-crtseg:nth-child(3){left:40%;transform-origin:0% 50%;animation-delay:-4ms}',\n '.dsh-sel-crtline[data-off=\"a\"] .dsh-sel-crtseg:nth-child(4){left:60%;transform-origin:-100% 50%;animation-delay:-30ms}',\n '.dsh-sel-crtline[data-off=\"a\"] .dsh-sel-crtseg:nth-child(5){left:80%;transform-origin:-200% 50%;animation-delay:-22ms}',\n '.dsh-sel-crtline[data-off=\"a\"] .dsh-sel-crtspark:nth-child(6){left:31%;animation-delay:-46ms}',\n '.dsh-sel-crtline[data-off=\"a\"] .dsh-sel-crtspark:nth-child(7){left:67%;animation-delay:-12ms}',\n // opacity \u5FC5\u987B\u5728\u524D\u9762\u663E\u5F0F\u5199 1\uFF1A\u53EA\u5728 100% \u5199 0 \u7684\u8BDD\uFF0CCSS \u4F1A\u4ECE 0% \u8D77\u5C31\u7EBF\u6027\u63D2\u503C\uFF0C\n // \u6574\u6BB5\u584C\u7F29\u90FD\u5728\u540C\u65F6\u6DE1\u51FA\uFF08\u5B9E\u6D4B 160ms \u65F6 opacity \u5DF2\u7ECF\u6389\u5230 0.365\uFF09\uFF0C\n // \u800C\u663E\u50CF\u7BA1\u662F\"\u4E00\u76F4\u4EAE\u7740\u3001\u6700\u540E\u4E00\u4E0B\u624D\u6CA1\"\u3002\n '@keyframes dsh-sel-crt-card-a{',\n '0%{transform:scale(1,1);filter:brightness(1);opacity:1}',\n '38%{transform:scale(1,1.06);filter:brightness(1.35);opacity:1}',\n '62%{transform:scale(1,.055);filter:brightness(2.2);opacity:1}',\n '88%{opacity:1}',\n '100%{transform:scale(.5,.05);filter:brightness(2.4);opacity:0}}',\n '@keyframes dsh-sel-crt-line-a{',\n '0%,52%{opacity:0}',\n '60%{opacity:1}',\n '96%{opacity:1}',\n '100%{opacity:0}}',\n // \u6BCF\u6BB5\uFF1A\u4E00\u8FB9\u5F80\u4E2D\u5FC3\u6536\uFF0C\u4E00\u8FB9\u95EA\u65AD\uFF08opacity \u9636\u68AF\uFF09+ \u4E0A\u4E0B\u6296 1px\n '@keyframes dsh-sel-crt-seg-a{',\n '0%,58%{transform:scaleX(1) translateY(0);opacity:1}',\n '64%{transform:scaleX(.94) translateY(1px);opacity:1}',\n '70%{transform:scaleX(.78) translateY(-1px);opacity:.3}',\n '74%{transform:scaleX(.66) translateY(0);opacity:1}',\n '80%{transform:scaleX(.44) translateY(1px);opacity:.15}',\n '84%{transform:scaleX(.34) translateY(0);opacity:1}',\n '90%{transform:scaleX(.16) translateY(-1px);opacity:.5}',\n '96%{transform:scaleX(.06) translateY(0);opacity:1}',\n '100%{transform:scaleX(0) translateY(0);opacity:0}}',\n // \u706B\u82B1\uFF1A\u6BB5\u5B50\u6B7B\u6389\u4E4B\u540E\u8FD8\u5728\u539F\u4F4D\u95EA\u4E24\u4E0B\u7684\u6B8B\u7559\u50CF\u7D20\n '@keyframes dsh-sel-crt-spark-a{',\n '0%,74%{opacity:0}',\n '78%{opacity:1}',\n '82%{opacity:0}',\n '88%{opacity:.9}',\n '94%{opacity:0}',\n '100%{opacity:0}}',\n '@media (prefers-reduced-motion:reduce){',\n '.dsh-sel-vcard{transition:none}.dsh-sel-vcard[data-voiced=\"1\"] .dsh-sel-vbar{animation:none}',\n '.dsh-sel-vcard[data-off=\"a\"],.dsh-sel-crtline[data-off=\"a\"],',\n '.dsh-sel-crtline[data-off=\"a\"] .dsh-sel-crtseg,.dsh-sel-crtline[data-off=\"a\"] .dsh-sel-crtspark{',\n 'animation:none!important;opacity:0}',\n '.dsh-sel-thread{animation:none}}',\n].join('')", "import { el } from './dom.js'\n\n/** \u5934\u90E8\u5C0F\u8282\u5BB9\u5668\uFF08\u5361\u7247\u5F0F\uFF1B\u5E8F\u53F7 + \u6807\u9898 + \u53F3\u4FA7\u63D0\u793A\u4F4D\uFF09\u3002 */\nexport function buildSection(index, title, key) {\n var root = el('div', 'dsh-sel-sec')\n root.setAttribute('data-sec', key)\n var header = el('div', 'dsh-sel-sh')\n header.appendChild(el('i'))\n var titleNode = el('span', null, title)\n header.appendChild(titleNode)\n var hint = el('span', 'dsh-sel-hint', '')\n header.appendChild(hint)\n var content = el('div', 'dsh-sel-c')\n root.appendChild(header)\n root.appendChild(content)\n return { root: root, content: content, hint: hint, title: titleNode }\n}\n\n/**\n * \u7EDF\u4E00\u7684\u5C0F\u56FE\u6807\u753B\u5E03\uFF1A\u5934\u90E8 / \u5DE5\u5177\u884C\u6240\u6709\u56FE\u6807\u90FD\u4ECE\u8FD9\u91CC\u51FA\u3002\n *\n * \u89C4\u8303\uFF08\u4E0E\u65E2\u6709 drawXxxIcon \u4E00\u65CF\u9010\u6761\u5BF9\u9F50\uFF0C\u522B\u5728\u8C03\u7528\u70B9\u53E6\u8D77\u4E00\u5957\uFF09\uFF1A\n * viewBox 0 0 16 16 \u00B7 \u6E32\u67D3 14px \u00B7 fill:none \u00B7 stroke:currentColor\n * \u00B7 stroke-width 1.5 \u00B7 linecap/linejoin round\n * \u8FD9\u6837\u4E00\u6392\u56FE\u6807\u624D\u6709\u540C\u4E00\u5957\u7B14\u753B\u7C97\u7EC6\u4E0E\u5706\u89D2\uFF1B\u6DF7\u7528 Unicode \u5B57\u5F62\uFF08\uD83D\uDD58 \u2197 \u2715 \uD83C\uDFA4\uFF09\n * \u4F1A\u56E0\u5B57\u4F53\u4E0D\u540C\u800C\u7C97\u7EC6\u3001\u57FA\u7EBF\u3001\u89C6\u89C9\u91CD\u91CF\u5168\u4E0D\u4E00\u6837 \u2014\u2014 \u6446\u4E00\u6392\u5C31\u662F\"\u5272\u88C2\"\u3002\n */\nexport function iconCanvas(size) {\n var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svg.setAttribute('class', 'dsh-sel-ic')\n svg.setAttribute('viewBox', '0 0 16 16')\n svg.setAttribute('width', String(size || 14))\n svg.setAttribute('height', String(size || 14))\n svg.setAttribute('fill', 'none')\n svg.setAttribute('stroke', 'currentColor')\n svg.setAttribute('stroke-width', '1.5')\n svg.setAttribute('stroke-linecap', 'round')\n svg.setAttribute('stroke-linejoin', 'round')\n svg.setAttribute('aria-hidden', 'true')\n svg.setAttribute('focusable', 'false')\n return svg\n}\n\nexport function iconPath(svg, d) {\n var path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n path.setAttribute('d', d)\n svg.appendChild(path)\n return path\n}\n\n/** \u5173\u95ED\uFF08\u2715\uFF09\uFF1A\u4E24\u6761\u659C\u7EBF\uFF0C\u7167\u65E2\u6709\u7684 closeIcon \u8DEF\u5F84\u3002 */\nexport function headerCloseIcon() {\n var svg = iconCanvas(14)\n iconPath(svg, 'M4.2 4.2l7.6 7.6M11.8 4.2l-7.6 7.6')\n return svg\n}\n\n/** \u8BBE\u7F6E\uFF1A\u4E24\u8F68\u4E24\u628A\u624B\u6ED1\u6746\u3002\n *\n * \u4E3A\u4EC0\u4E48\u4E0D\u662F\u9F7F\u8F6E\uFF1A\u591A\u9F7F\u7248\u5728 14px \u4E0B\u9F7F\u7259\u7CCA\u6210\u4E00\u56E2\uFF0C\u5C11\u9F7F\u7248**\u76F4\u63A5\u6E32\u67D3\u6210\u7A7A\u767D**\uFF08\u5B9E\u6D4B\u5BF9\u7167\u8FC7\uFF09\u3002\n * \u4E3A\u4EC0\u4E48\u53EA\u6709\u4E24\u6761\u8F68\uFF1A\u4E09\u6761\u8F68\u4E09\u4E2A\u628A\u624B\u5728 14px \u4E0B\u628A\u624B\u4F1A\u8FDE\u6210\u4E00\u7247\u3002\n * \u628A\u624B\u753B\u6210\u5B9E\u5FC3\uFF1A\u7F29\u5C0F\u540E\u5BF9\u6BD4\u5EA6\u66F4\u9AD8\uFF0C\u4ECD\u7136\u8BA4\u5F97\u51FA\"\u8FD9\u662F\u6ED1\u6746\"\u3002 */\nexport function headerSettingsIcon() {\n var svg = iconCanvas(14)\n iconPath(svg, 'M2.6 5.2h10.8M2.6 10.8h10.8')\n var dots = [[6.2, 5.2], [10.4, 10.8]]\n for (var i = 0; i < dots.length; i += 1) {\n var dot = document.createElementNS('http://www.w3.org/2000/svg', 'circle')\n dot.setAttribute('cx', String(dots[i][0]))\n dot.setAttribute('cy', String(dots[i][1]))\n dot.setAttribute('r', '1.7')\n // \u5B9E\u5FC3\u628A\u624B\uFF1Afill \u8DDF currentColor\uFF0C\u540C\u65F6\u53D6\u6D88\u63CF\u8FB9\uFF08\u5426\u5219 1.5 \u63CF\u8FB9\u4F1A\u628A\u5B83\u80C0\u5927\u4E00\u5708\uFF09\n dot.setAttribute('fill', 'currentColor')\n dot.setAttribute('stroke', 'none')\n svg.appendChild(dot)\n }\n return svg\n}\n\n/** \u6700\u8FD1\uFF08\u65F6\u949F\uFF09\uFF1A\u8868\u76D8 + \u65F6\u9488\u5206\u9488\u3002\u5916\u5708 6.1 \u8BA9\u58A8\u8FF9\u5728 16 \u753B\u5E03\u91CC\u6709 1.9 \u7684\u547C\u5438\u3002 */\nexport function headerHistoryIcon() {\n var svg = iconCanvas(14)\n var circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle')\n circle.setAttribute('cx', '8')\n circle.setAttribute('cy', '8')\n circle.setAttribute('r', '6.1')\n svg.appendChild(circle)\n iconPath(svg, 'M8 4.6V8l2.4 1.5')\n return svg\n}\n\n/** \u5347\u683C\uFF1A\u53F3\u4E0B\u89D2\u7F3A\u53E3\u7684\u65B9\u6846 + \u7529\u5411\u53F3\u4E0A\u7684\u7BAD\u5934\u3002 */\nexport function headerPromoteIcon() {\n var svg = iconCanvas(14)\n iconPath(svg, 'M13.2 9.6v2.4a1.8 1.8 0 0 1-1.8 1.8H4a1.8 1.8 0 0 1-1.8-1.8V4.6A1.8 1.8 0 0 1 4 2.8h2.4')\n iconPath(svg, 'M9.4 2.8h3.8v3.8')\n iconPath(svg, 'M13.2 2.8 8.2 7.8')\n return svg\n}\n\n/**\n * \u5E26\u6587\u5B57\u7684\u5934\u90E8\u52A8\u4F5C\u952E\uFF08\u6700\u8FD1 / \u5347\u683C / \u8BBE\u7F6E\uFF09\u3002\n *\n * \u4E09\u4E2A\u952E\u957F\u5F97\u4E00\u6837\u5F88\u91CD\u8981\uFF1A\u4EE5\u524D\u6DF7\u7740\"\u6587\u5B57 key\uFF08\uD83D\uDD58 \u6700\u8FD1 / \u2197 \u5347\u683C\uFF09\"\u548C\"\u7EAF\u56FE\u6807 key\uFF08\u2715\uFF09\"\uFF0C\n * \u56FE\u6807\u53C8\u90FD\u662F Unicode \u5B57\u5F62\uFF0C\u7C97\u7EC6\u4E0E\u57FA\u7EBF\u5404\u4E0D\u76F8\u540C\uFF0C\u4E00\u6392\u770B\u7740\u50CF\u62FC\u8D77\u6765\u7684\u3002\n * \u73B0\u5728\u7EDF\u4E00\u6210\"\u540C\u4E00\u5957 SVG \u56FE\u6807 + \u540C\u4E00\u5957\u8FB9\u6846\"\uFF0C\u53EA\u662F\u6709\u5B57\u6CA1\u5B57\u7684\u533A\u522B\u3002\n */\nexport function actionButton(title, label, buildIcon) {\n var node = el('button', 'dsh-sel-action')\n node.type = 'button'\n node.title = title\n if (typeof buildIcon === 'function') node.appendChild(buildIcon())\n node.appendChild(el('span', null, label))\n return node\n}\n\n/** \u8FD4\u56DE\uFF08\u2039\uFF09\uFF1A\u8BBE\u7F6E\u9875\u5934\u90E8\u5DE6\u4E0A\u7684\u6298\u89D2\u3002 */\nexport function backIcon() {\n var svg = iconCanvas(14)\n iconPath(svg, 'M9.8 3.4 5.2 8l4.6 4.6')\n return svg\n}\n\n/** \u9762\u677F\u5934\u90E8\u7684\u5C0F\u56FE\u6807\u6309\u94AE\u3002glyph \u4F20\u56FE\u6807\u6784\u9020\u51FD\u6570\uFF08\u4E0D\u518D\u662F Unicode \u5B57\u5F62\uFF09\u3002 */\nexport function iconButton(title, buildIcon) {\n var node = el('button', 'dsh-sel-icon')\n node.type = 'button'\n node.title = title\n if (typeof buildIcon === 'function') node.appendChild(buildIcon())\n else if (buildIcon) node.textContent = buildIcon\n return node\n}\n\n/** \u6D6E\u6807\u4E0A\u7684\u661F\u5F62\u56FE\u6807\u3002 */\n/** \u9875\u9762\u56FE\u6807\uFF08\u7F51\u9875\u6A21\u5F0F\uFF09\u3002 */\nexport function pageIcon() {\n var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svg.setAttribute('viewBox', '0 0 16 16')\n svg.setAttribute('width', '16')\n svg.setAttribute('height', '16')\n svg.setAttribute('fill', 'none')\n svg.setAttribute('stroke', 'currentColor')\n svg.setAttribute('stroke-width', '1.4')\n svg.setAttribute('stroke-linecap', 'round')\n svg.setAttribute('aria-hidden', 'true')\n var outer = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\n outer.setAttribute('x', '2.4')\n outer.setAttribute('y', '2.4')\n outer.setAttribute('width', '11.2')\n outer.setAttribute('height', '11.2')\n outer.setAttribute('rx', '2.2')\n svg.appendChild(outer)\n var lines = [\n ['M5', '6.2', 'H11'],\n ['M5', '8.6', 'H11'],\n ['M5', '11', 'H8.6'],\n ]\n for (var i = 0; i < lines.length; i += 1) {\n var path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n path.setAttribute('d', lines[i].join(' '))\n svg.appendChild(path)\n }\n return svg\n}\n\n/** Markdown \u56FE\u6807\uFF08M\u2193\uFF09\u3002\u6ED1\u5757\u91CC\u53EA\u6709 11px\uFF0C\u6240\u4EE5\u63CF\u8FB9\u52A0\u7C97\u5230 2.6 \u624D\u8BA4\u5F97\u51FA\u3002 */\nexport function markdownIcon() {\n var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svg.setAttribute('viewBox', '0 0 24 24')\n svg.setAttribute('width', '13')\n svg.setAttribute('height', '13')\n svg.setAttribute('fill', 'none')\n svg.setAttribute('stroke', 'currentColor')\n svg.setAttribute('stroke-width', '2.6')\n svg.setAttribute('stroke-linecap', 'round')\n svg.setAttribute('stroke-linejoin', 'round')\n svg.setAttribute('aria-hidden', 'true')\n var peak = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n peak.setAttribute('d', 'M3.5 17.5V7.5l4.4 5 4.4-5v10')\n svg.appendChild(peak)\n var arrow = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n arrow.setAttribute('d', 'M17.4 7v9.6M14.3 13.6l3.1 3.1 3.1-3.1')\n svg.appendChild(arrow)\n return svg\n}\n\n/** \u7F51\u9875\u7A97\u53E3\u56FE\u6807\uFF08\u6ED1\u5757\u53F3\u6863\uFF09\u3002 */\nexport function windowIcon() {\n var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svg.setAttribute('viewBox', '0 0 24 24')\n svg.setAttribute('width', '13')\n svg.setAttribute('height', '13')\n svg.setAttribute('fill', 'none')\n svg.setAttribute('stroke', 'currentColor')\n svg.setAttribute('stroke-width', '2.6')\n svg.setAttribute('stroke-linecap', 'round')\n svg.setAttribute('stroke-linejoin', 'round')\n svg.setAttribute('aria-hidden', 'true')\n var frame = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\n frame.setAttribute('x', '3')\n frame.setAttribute('y', '4.5')\n frame.setAttribute('width', '18')\n frame.setAttribute('height', '15')\n frame.setAttribute('rx', '3')\n svg.appendChild(frame)\n var bar = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n bar.setAttribute('d', 'M3 9.6h18')\n svg.appendChild(bar)\n return svg\n}\n\n/** \u5730\u7403\u56FE\u6807\uFF08\u7559\u4F5C\u590D\u7528\uFF1B\u5F53\u524D\u63A7\u4EF6\u5DF2\u6539\u4E3A\u7A97\u53E3\u56FE\u6807\uFF09\u3002 */\nexport function globeIcon() {\n var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svg.setAttribute('viewBox', '0 0 16 16')\n svg.setAttribute('width', '14')\n svg.setAttribute('height', '14')\n svg.setAttribute('fill', 'none')\n svg.setAttribute('stroke', 'currentColor')\n svg.setAttribute('stroke-width', '1.3')\n svg.setAttribute('aria-hidden', 'true')\n var circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle')\n circle.setAttribute('cx', '8')\n circle.setAttribute('cy', '8')\n circle.setAttribute('r', '5.6')\n svg.appendChild(circle)\n // \u7ECF\u7EBF + \u7EAC\u7EBF\uFF1A\u4E00\u773C\u770B\u51FA\u662F\"\u5730\u7403/\u7F51\u9875\"\n var meridian = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n meridian.setAttribute('d', 'M8 2.4c1.9 1.7 2.9 3.6 2.9 5.6S9.9 11.9 8 13.6C6.1 11.9 5.1 10 5.1 8S6.1 4.1 8 2.4z')\n svg.appendChild(meridian)\n var equator = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n equator.setAttribute('d', 'M2.5 8h11')\n svg.appendChild(equator)\n return svg\n}\n\n/** \u505C\u6B62\u56FE\u6807\uFF08\u5706\u89D2\u65B9\u5757\uFF09\uFF1A\u751F\u6210\u4E2D\u53D1\u9001\u952E\u53D8\u6210\u5B83\u3002 */\nexport function stopIcon() {\n var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svg.setAttribute('viewBox', '0 0 16 16')\n svg.setAttribute('width', '14')\n svg.setAttribute('height', '14')\n svg.setAttribute('fill', 'currentColor')\n svg.setAttribute('aria-hidden', 'true')\n var rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\n rect.setAttribute('x', '4.4')\n rect.setAttribute('y', '4.4')\n rect.setAttribute('width', '7.2')\n rect.setAttribute('height', '7.2')\n rect.setAttribute('rx', '1.8')\n svg.appendChild(rect)\n return svg\n}\n\n/** \u53D6\u6D88\u56FE\u6807\uFF08\u2715\uFF09\uFF1A\u4E24\u6761\u659C\u7EBF\uFF0C\u548C\u4E3B\u4F1A\u8BDD\u5F55\u97F3\u884C\u7684\u53D6\u6D88\u952E\u540C\u5F62\u3002 */\nexport function closeIcon() {\n var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svg.setAttribute('viewBox', '0 0 16 16')\n svg.setAttribute('fill', 'none')\n svg.setAttribute('stroke', 'currentColor')\n svg.setAttribute('stroke-width', '1.8')\n svg.setAttribute('stroke-linecap', 'round')\n svg.setAttribute('aria-hidden', 'true')\n var path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n path.setAttribute('d', 'M4.2 4.2l7.6 7.6M11.8 4.2l-7.6 7.6')\n svg.appendChild(path)\n return svg\n}\n\n/**\n * \u9EA6\u514B\u98CE\u56FE\u6807\uFF1A\u8BDD\u7B52\u5934\uFF08\u5706\u89D2\u77E9\u5F62\uFF09+ \u5E95\u5EA7\u5F27 + \u652F\u67B6\u3002\n * \u7528\u63CF\u8FB9\u800C\u4E0D\u662F\u5B9E\u5FC3\uFF1A\u5F55\u97F3\u65F6\u8FD9\u4E2A\u4F4D\u7F6E\u8981\u6362\u6210\"\u7EA2\u8272\u5B9E\u5FC3\u505C\u6B62\u952E\"\uFF0C\n * \u5E73\u65F6\u8F7B\u4E00\u70B9\uFF0C\u7EA2\u8D77\u6765\u7684\u90A3\u4E00\u523B\u5BF9\u6BD4\u624D\u591F\u5F3A\u3002\n */\nexport function micIcon() {\n var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svg.setAttribute('viewBox', '0 0 16 16')\n svg.setAttribute('width', '14')\n svg.setAttribute('height', '14')\n svg.setAttribute('fill', 'none')\n svg.setAttribute('stroke', 'currentColor')\n svg.setAttribute('stroke-width', '1.5')\n svg.setAttribute('stroke-linecap', 'round')\n svg.setAttribute('aria-hidden', 'true')\n var cap = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n cap.setAttribute('d', 'M8 1.9a2.1 2.1 0 0 1 2.1 2.1v3.4a2.1 2.1 0 0 1-4.2 0V4A2.1 2.1 0 0 1 8 1.9z')\n svg.appendChild(cap)\n var arc = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n arc.setAttribute('d', 'M3.6 7.2v.5a4.4 4.4 0 0 0 8.8 0v-.5')\n svg.appendChild(arc)\n var stem = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n stem.setAttribute('d', 'M8 12.1v2')\n svg.appendChild(stem)\n return svg\n}\n\n/** \u8F6C\u5708\u56FE\u6807\uFF08\u6743\u9650\u8BF7\u6C42\u4E2D / \u8BC6\u522B\u4E2D\uFF09\uFF1ACSS \u8BA9\u5B83\u8F6C\u8D77\u6765\u3002 */\nexport function spinnerIcon() {\n var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svg.setAttribute('viewBox', '0 0 16 16')\n svg.setAttribute('width', '14')\n svg.setAttribute('height', '14')\n svg.setAttribute('fill', 'none')\n svg.setAttribute('stroke', 'currentColor')\n svg.setAttribute('stroke-width', '1.7')\n svg.setAttribute('stroke-linecap', 'round')\n svg.setAttribute('aria-hidden', 'true')\n var arc = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n // \u7F3A\u4E00\u4E2A\u53E3\u7684\u5706\uFF1A\u8F6C\u8D77\u6765\u624D\u770B\u5F97\u51FA\u5728\u52A8\n arc.setAttribute('d', 'M8 1.8a6.2 6.2 0 1 1-4.4 1.8')\n svg.appendChild(arc)\n return svg\n}\n\n/** \u53D1\u9001\u56FE\u6807\uFF08\u4E0A\u7BAD\u5934\uFF0C\u548C\u4E3B\u4F1A\u8BDD composer \u4E00\u81F4\uFF09\u3002 */\nexport function sendIcon() {\n var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svg.setAttribute('viewBox', '0 0 16 16')\n svg.setAttribute('width', '16')\n svg.setAttribute('height', '16')\n svg.setAttribute('fill', 'none')\n svg.setAttribute('stroke', 'currentColor')\n svg.setAttribute('stroke-width', '1.7')\n svg.setAttribute('stroke-linecap', 'round')\n svg.setAttribute('stroke-linejoin', 'round')\n svg.setAttribute('aria-hidden', 'true')\n var shaft = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n shaft.setAttribute('d', 'M8 13.2V3.4')\n svg.appendChild(shaft)\n var head = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n head.setAttribute('d', 'M3.9 7.5 8 3.4l4.1 4.1')\n svg.appendChild(head)\n return svg\n}\n\n/**\n * \u89E3\u8BFB\u6D6E\u6807\u4E0A\u7684\u56DB\u89D2\u661F\uFF08\u2726\uFF09\u3002\n *\n * \u8DEF\u5F84\u5FC5\u987B\u5728 16\u00D716 \u753B\u5E03\u91CC**\u58A8\u8FF9\u5C45\u4E2D**\uFF08\u4E0A\u4E0B\u5404\u7559 2.4\uFF0C\u58A8\u8FF9\u4E2D\u5FC3 = 8\uFF09\uFF1A\n * \u6D6E\u52A8\u6309\u94AE\u662F `align-items:center` \u7684 flex\uFF0C\u5C45\u4E2D\u7684\u662F**\u753B\u5E03\u76D2\u5B50**\uFF0C\n * \u753B\u5E03\u5185\u504F\u4E00\u70B9\uFF0C\u56FE\u6807\u5C31\u6574\u4F53\u504F\u4E00\u70B9\u3002\u8001\u8DEF\u5F84 y \u5360 1.2~12.4\uFF08\u4E2D\u5FC3 6.8\uFF09\uFF0C\n * \u661F\u5F62\u4E8E\u662F\u6BD4\u53F3\u8FB9\u300C\u89E3\u8BFB\u300D\u4E24\u4E2A\u5B57\u9AD8\u4E86 1.1px\uFF08\u7528\u6237\u62A5\u7684\"\u2726 \u548C \u89E3\u8BFB \u6CA1\u5BF9\u9F50\"\uFF09\u3002\n * \u540C\u7406 x \u5360 2.4~13.6\uFF08\u4E2D\u5FC3 8\uFF0C\u672C\u6765\u5C31\u5BF9\u79F0\uFF09\u2014\u2014 \u6A2A\u5411\u90A3\u70B9\u504F\u5DEE\u4EA4\u7ED9 CSS \u7684\u8D1F\u5916\u8FB9\u8DDD\u3002\n */\nexport function sparkleIcon() {\n var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svg.setAttribute('viewBox', '0 0 16 16')\n svg.setAttribute('fill', 'currentColor')\n svg.setAttribute('aria-hidden', 'true')\n var path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n path.setAttribute('d', 'M8 2.4l1.5 4.1 4.1 1.5-4.1 1.5L8 13.6 6.5 9.5 2.4 8l4.1-1.5L8 2.4z')\n svg.appendChild(path)\n return svg\n}\n\n/**\n * \u5F15\u7528\u6D6E\u6807\u4E0A\u7684\u56FE\u6807\uFF1A\u4E24\u4E2A\u5F15\u53F7\u5757\uFF08\u275D \u7684\u7B80\u5316\u753B\u6CD5\uFF09\u3002\n * \u7528\u5706 + \u5DE6\u4E0B\u89D2\u7529\u51FA\u7684\u5C0F\u5C3E\u5DF4\u62FC \u2014\u2014 13px \u4E0B\u4E5F\u8BA4\u5F97\u51FA\uFF0C\u4E0D\u4F9D\u8D56\u7CFB\u7EDF\u6709\u6CA1\u6709\u90A3\u4E2A\u5B57\u5F62\u3002\n */\nexport function quoteIcon() {\n var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svg.setAttribute('viewBox', '0 0 16 16')\n svg.setAttribute('fill', 'currentColor')\n svg.setAttribute('aria-hidden', 'true')\n var marks = [\n { cx: 5.4, cy: 6.1, tail: 'M3.9 7.4 2.1 12.2 6.1 10.2z' },\n { cx: 11.6, cy: 6.1, tail: 'M10.1 7.4 8.3 12.2 12.3 10.2z' },\n ]\n for (var i = 0; i < marks.length; i += 1) {\n var dot = document.createElementNS('http://www.w3.org/2000/svg', 'circle')\n dot.setAttribute('cx', String(marks[i].cx))\n dot.setAttribute('cy', String(marks[i].cy))\n dot.setAttribute('r', '2.3')\n svg.appendChild(dot)\n var tail = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n tail.setAttribute('d', marks[i].tail)\n svg.appendChild(tail)\n }\n return svg\n}", "import { clamp } from './dom.js'\nimport { CONTEXT_WINDOW, KEY_CONTEXT_CHARS } from './constants.js'\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u4E0A\u4E0B\u6587\u91C7\u96C6 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** \u9009\u533A\u6240\u5728\u7684\u8BED\u4E49\u5BB9\u5668\uFF08\u6D88\u606F\u6C14\u6CE1 / \u6BB5\u843D / \u4EE3\u7801\u5757\u2026\uFF09\u3002 */\nexport function pickContainer(element) {\n var node = element\n while (node && node !== document.body) {\n var length = (node.innerText || '').length\n if (length >= 120) return node\n node = node.parentElement\n }\n return element || document.body\n}\n\n/** \u5BB9\u5668\u7684\u4EBA\u7C7B\u53EF\u8BFB\u6807\u7B7E\u3002 */\nexport function describeContainer(element) {\n if (!element || !element.closest) return '\u9875\u9762\u5185\u5BB9'\n try {\n if (element.closest('pre') || element.closest('code')) return '\u4EE3\u7801\u5757'\n if (element.closest('table')) return '\u8868\u683C'\n var message = element.closest('[data-message-role],[data-role],[data-testid*=\"message\"],article')\n if (message) {\n var role = message.getAttribute('data-message-role') || message.getAttribute('data-role') || ''\n if (role === 'user') return '\u5BF9\u8BDD\u6D88\u606F\uFF08\u7528\u6237\uFF09'\n if (role === 'assistant') return '\u5BF9\u8BDD\u6D88\u606F\uFF08\u52A9\u624B\uFF09'\n return '\u5BF9\u8BDD\u6D88\u606F'\n }\n } catch (error) {\n /* closest \u5728\u67D0\u4E9B\u5B64\u7ACB\u8282\u70B9\u4E0A\u4F1A\u629B\u9519\uFF0C\u5FFD\u7565 */\n }\n return '\u9875\u9762\u5185\u5BB9'\n}\n\n/**\n * \u91C7\u96C6\u4E0A\u4E0B\u6587\uFF1A\u5BB9\u5668\u6587\u672C\u4E2D\u9009\u533A\u524D\u540E\u5404 CONTEXT_WINDOW \u5B57\u7B26\u7684\u7A97\u53E3\uFF0C\n * \u5E76\u7528\u3010\u3011\u6807\u51FA\u9009\u4E2D\u90E8\u5206\uFF08\u524D\u540E\u6587\u5BF9\u9F50\uFF0C\u4FBF\u4E8E\u6A21\u578B\u5224\u65AD\u6307\u4EE3\uFF09\u3002\n */\nexport function collectContext(selection) {\n var fallback = { context: '', label: '\u9875\u9762\u5185\u5BB9' }\n var range\n try {\n range = selection.getRangeAt(0)\n } catch (error) {\n return fallback\n }\n var startElement = range.startContainer\n startElement = startElement && startElement.nodeType === 1 ? startElement : startElement && startElement.parentElement\n var container = pickContainer(startElement)\n if (!container) return fallback\n var label = describeContainer(container)\n\n var rawFull = ''\n var offset = 0\n try {\n var fullRange = document.createRange()\n fullRange.selectNodeContents(container)\n rawFull = fullRange.toString()\n var prefix = document.createRange()\n prefix.selectNodeContents(container)\n prefix.setEnd(range.startContainer, range.startOffset)\n offset = prefix.toString().length\n } catch (error) {\n return { context: '', label: label }\n }\n if (!rawFull) return { context: '', label: label }\n\n var selected = selection.toString()\n var start = clamp(offset - CONTEXT_WINDOW, 0, Math.max(0, rawFull.length - 1))\n var end = clamp(offset + selected.length + CONTEXT_WINDOW, 0, rawFull.length)\n var window = rawFull.slice(start, end)\n var relative = offset - start\n var marked = window\n var probe = window.slice(relative, relative + selected.length)\n if (normalizeSpace(probe) !== normalizeSpace(selected)) {\n var found = rawFull.indexOf(selected)\n if (found >= 0) {\n var s2 = clamp(found - CONTEXT_WINDOW, 0, Math.max(0, rawFull.length - 1))\n var e2 = clamp(found + selected.length + CONTEXT_WINDOW, 0, rawFull.length)\n var w2 = rawFull.slice(s2, e2)\n var r2 = found - s2\n marked = w2.slice(0, r2) + '\u3010' + w2.slice(r2, r2 + selected.length) + '\u3011' + w2.slice(r2 + selected.length)\n } else {\n marked = selected + '\\n---\\n' + window\n }\n } else {\n marked = window.slice(0, relative) + '\u3010' + probe + '\u3011' + window.slice(relative + selected.length)\n }\n var context = marked.replace(/\\u00a0/g, ' ').replace(/[ \\t]+/g, ' ').replace(/\\n{3,}/g, '\\n\\n').trim()\n // key \u7528\u7684\u4E0A\u4E0B\u6587\uFF1A**\u53EA\u53D6\u9009\u4E2D\u6587\u5B57\u4E4B\u524D**\u7684\u4E00\u5C0F\u6BB5\u3002\n // \u53D6\u524D\u540E\u6574\u6BB5\u7684\u8BDD\uFF0C\u4E3B\u4F1A\u8BDD\u53EA\u8981\u5728\u540E\u9762\u8FFD\u52A0\u65B0\u6D88\u606F\uFF0C\u540C\u4E00\u4E2A\u8BCD\u7684 key \u5C31\u53D8\u4E86 \u2014\u2014\n // \u7ED3\u679C\u5C31\u662F\"\u540C\u4E00\u4E2A\u8BCD\u627E\u4E0D\u7740\u4E0A\u6B21\u7684\u5C0F\u7A97\uFF0C\u53C8\u751F\u6210\u4E00\u4E2A\"\uFF08\u5B9E\u6D4B\u590D\u73B0\u8FC7\uFF09\u3002\n var keyContext = rawFull\n .slice(Math.max(0, offset - KEY_CONTEXT_CHARS), offset)\n .replace(/\\u00a0/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n return { context: context, label: label, keyContext: keyContext }\n}\n\nexport function normalizeSpace(text) {\n return String(text || '').replace(/\\s+/g, ' ').trim()\n}", "import { el, listen } from './dom.js'\nimport { normalizeSpace } from './context.js'\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Markdown \u8F7B\u6E32\u67D3\uFF08\u5168 DOM\uFF0C\u65E0 innerHTML\uFF09 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** \u884C\u5185\u89E3\u6790\uFF1A**\u52A0\u7C97** \u4E0E `\u4EE3\u7801`\u3002 */\nexport function appendInline(parent, text) {\n // \u52A0\u7C97 / \u884C\u5185\u4EE3\u7801 / markdown \u94FE\u63A5 / \u88F8\u94FE\u63A5\n var re = /(\\*\\*[^*\\n]+\\*\\*|`[^`\\n]+`|\\[[^\\]\\n]+\\]\\(https?:\\/\\/[^)\\s]+\\)|https?:\\/\\/[^\\s<>\"'\uFF09\u3011]+)/g\n var last = 0\n var match\n while ((match = re.exec(text)) !== null) {\n if (match.index > last) parent.appendChild(document.createTextNode(text.slice(last, match.index)))\n var token = match[0]\n if (token.indexOf('**') === 0) {\n parent.appendChild(el('strong', 'dsh-sel-strong', token.slice(2, -2)))\n } else if (token.charAt(0) === '`') {\n parent.appendChild(el('code', 'dsh-sel-code', token.slice(1, -1)))\n } else if (token.charAt(0) === '[') {\n var split = token.lastIndexOf('](')\n var label = token.slice(1, split)\n var href = token.slice(split + 2, -1)\n var link = el('a', 'dsh-sel-link', label)\n link.setAttribute('href', href)\n link.setAttribute('target', '_blank')\n link.setAttribute('rel', 'noopener noreferrer')\n parent.appendChild(link)\n } else {\n var bare = el('a', 'dsh-sel-link', token.replace(/[.,;]+$/, ''))\n bare.setAttribute('href', token.replace(/[.,;]+$/, ''))\n bare.setAttribute('target', '_blank')\n bare.setAttribute('rel', 'noopener noreferrer')\n parent.appendChild(bare)\n }\n last = match.index + token.length\n }\n if (last < text.length) parent.appendChild(document.createTextNode(text.slice(last)))\n}\n\n/**\n * \u5757\u7EA7\u6E32\u67D3\uFF1A\u6BB5\u843D / \u591A\u7EA7\u65E0\u5E8F\u4E0E\u6709\u5E8F\u5217\u8868 / \u5C0F\u6807\u9898 / \u5F15\u7528 / \u5206\u9694\u7EBF\u3002\n * \u5217\u8868\u6309\u7F29\u8FDB\u5206\u7EA7\uFF08\u6BCF 2 \u7A7A\u683C\u4E00\u7EA7\uFF0C\u6700\u591A 2 \u7EA7\uFF09\uFF0C\u6709\u5E8F\u9879\u4FDD\u7559\u539F\u7F16\u53F7\u5E76\u53F3\u5BF9\u9F50\uFF0C\n * \u8BA9\u5C0F\u6807\u9898\u3001\u8981\u70B9\u3001\u6B63\u6587\u4E4B\u95F4\u7684\u5C42\u6B21\u5728\u9762\u677F\u91CC\u4E00\u773C\u53EF\u8FA8\u3002\n */\n/**\n * \u5265\u6389\u300C- **<\u9009\u4E2D\u6587\u5B57>**\uFF1A\u5185\u5BB9\u300D\u8FD9\u79CD\u56DE\u58F0\u524D\u7F00\u3002\n * \u7FFB\u8BD1\u8282\u91CC\u6A21\u578B\u5E38\u628A\u9009\u4E2D\u6587\u5B57\u672C\u8EAB\u5F53\u6210\u8BCD\u6761\u518D\u8BD1\u4E00\u904D\uFF1B\u5F53\u52A0\u7C97\u524D\u7F00\u4E0E\u9009\u4E2D\u6587\u5B57\u4E00\u81F4\u65F6\uFF0C\n * \u76F4\u63A5\u628A\u5B83\u53BB\u6389\u3001\u53EA\u7559\u5185\u5BB9\uFF08\u907F\u514D\u300C\u9009\u4E2D\u6587\u5B57 \u2192 \u9009\u4E2D\u6587\u5B57\u300D\u7684\u91CD\u590D\uFF09\u3002\n */\nexport function stripEchoPrefix(text, selected) {\n var target = normalizeSpace(selected || '')\n if (!target) return text\n return String(text || '')\n .split('\\n')\n .map(function (line) {\n var match = /^\\s*-\\s*\\*\\*(.+?)\\*\\*\\s*[:\uFF1A]\\s*(.*)$/.exec(line)\n if (!match) return line\n var head = normalizeSpace(match[1])\n if (head !== target && head.indexOf(target) !== 0 && target.indexOf(head) !== 0) return line\n if (head.length < 2 || Math.abs(head.length - target.length) > Math.max(4, target.length * 0.4)) return line\n return match[2]\n })\n .join('\\n')\n}\n\n/** \u300C\u5728\u672C\u53E5\u4E2D\uFF1Axxx\u300D\u8FD9\u7C7B\u7ED3\u8BBA\u884C \u2192 \u9AD8\u4EAE\u7ED3\u8BBA\u6761\uFF08\u5E26\u6807\u7B7E\u80F6\u56CA\uFF09\u3002 */\nexport var CALLOUT_RE = /^(?:\\*\\*)?\\s*(\u5728(?:\u672C|\u6B64)\u53E5(?:\u4E2D|\u91CC)?|\u5728(?:\u672C|\u6B64)\u6BB5(?:\u4E2D|\u91CC)?|\u5728\u4E0A\u6587(?:\u4E2D)?|\u5C0F\u7ED3|\u603B\u7ED3|\u7ED3\u8BBA)\\s*[:\uFF1A]\\s*(?:\\*\\*)?\\s*([\\s\\S]*)$/\n\nexport function calloutNode(label, body) {\n var box = el('div', 'dsh-sel-callout')\n box.appendChild(el('span', 'dsh-sel-callout-tag', label))\n var span = el('span')\n appendInline(span, body)\n box.appendChild(span)\n return box\n}\n\n/** \u8868\u683C\u5206\u9694\u884C\uFF1A|---|:---:|---| */\nexport function isTableSeparator(line) {\n return /^\\|?\\s*:?-{2,}:?\\s*(\\|\\s*:?-{2,}:?\\s*)*\\|?$/.test(line) && line.indexOf('-') >= 0\n}\n\nexport function splitRow(line) {\n var body = line.trim().replace(/^\\|/, '').replace(/\\|$/, '')\n return body.split('|').map(function (cell) {\n return cell.trim()\n })\n}\n\n/** \u6E32\u67D3 Markdown \u8868\u683C\uFF1B\u8FD4\u56DE\u6D88\u8D39\u5230\u7684\u884C\u53F7\uFF08\u4E0D\u542B\uFF09\u3002 */\nexport function renderTable(parent, lines, start) {\n var head = splitRow(lines[start])\n var rows = []\n var i = start + 2\n while (i < lines.length && lines[i].trim().indexOf('|') >= 0) {\n rows.push(splitRow(lines[i]))\n i += 1\n }\n var wrap = el('div', 'dsh-sel-tablewrap')\n var table = el('table', 'dsh-sel-table')\n var thead = el('thead')\n var headRow = el('tr')\n for (var h = 0; h < head.length; h++) {\n var th = el('th')\n appendInline(th, head[h])\n headRow.appendChild(th)\n }\n thead.appendChild(headRow)\n table.appendChild(thead)\n var tbody = el('tbody')\n for (var r = 0; r < rows.length; r++) {\n var tr = el('tr')\n for (var c = 0; c < head.length; c++) {\n var td = el('td')\n appendInline(td, rows[r][c] === undefined ? '' : rows[r][c])\n tr.appendChild(td)\n }\n tbody.appendChild(tr)\n }\n table.appendChild(tbody)\n wrap.appendChild(table)\n parent.appendChild(wrap)\n return i\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u8BED\u6CD5\u9AD8\u4EAE\uFF08\u4EE3\u7801\u5757\u4E13\u7528\uFF0C\u65E0\u7B2C\u4E09\u65B9\u4F9D\u8D56\uFF09 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** \u56F4\u680F\u8BED\u8A00\u6807\u8BB0 \u2192 \u5BB6\u65CF\u3002\u672A\u77E5\u8BED\u8A00\u9000\u56DE auto\uFF08\u6309\u5185\u5BB9\u731C\uFF09\u3002 */\nexport var HL_FAMILY = {\n js: 'c', javascript: 'c', jsx: 'c', mjs: 'c', cjs: 'c', ts: 'c', typescript: 'c', tsx: 'c',\n java: 'c', go: 'c', golang: 'c', rust: 'c', rs: 'c', c: 'c', cpp: 'c', 'c++': 'c', h: 'c', hpp: 'c',\n cs: 'c', csharp: 'c', php: 'c', swift: 'c', kotlin: 'c', kt: 'c', scala: 'c', dart: 'c', groovy: 'c',\n py: 'py', python: 'py', rb: 'py', ruby: 'py',\n sh: 'sh', bash: 'sh', shell: 'sh', zsh: 'sh', console: 'sh', shellsession: 'sh', powershell: 'sh', ps1: 'sh',\n sql: 'sql', mysql: 'sql', postgres: 'sql', postgresql: 'sql', sqlite: 'sql', plsql: 'sql',\n html: 'html', htm: 'html', xml: 'html', svg: 'html', vue: 'html',\n css: 'css', scss: 'css', sass: 'css', less: 'css',\n json: 'json', jsonc: 'json', json5: 'json',\n yml: 'yaml', yaml: 'yaml', toml: 'yaml', ini: 'yaml',\n md: 'plain', markdown: 'plain', text: 'plain', txt: 'plain', plain: 'plain', log: 'plain', diff: 'plain',\n}\n\n/** \u5404\u5BB6\u65CF\u7684\u5173\u952E\u5B57\uFF08\u53EA\u7528\u4E8E\u4E0A\u8272\uFF0C\u4E0D\u6C42\u5B8C\u5907\uFF09\u3002 */\nexport var HL_WORDS = {\n c: 'const let var function return if else for while do switch case default break continue new delete typeof instanceof in of class extends super this try catch finally throw await async yield void export import from as static public private protected interface enum implements readonly namespace declare abstract type null undefined true false NaN Infinity get set',\n py: 'def class return if elif else for while in not and or is None True False import from as with try except finally raise lambda yield global nonlocal pass break continue assert del async await match case self print len range',\n sh: 'if then else elif fi for while until do done case esac function return in export local readonly unset shift source alias echo cd exit set sudo npm pnpm yarn npx git docker kubectl curl wget cat grep awk sed head tail chmod mkdir rm cp mv touch find xargs export',\n sql: 'select from where group by having order limit offset insert into values update set delete create alter drop table index view join left right inner outer full on as and or not null is in like between distinct union all exists asc desc primary key foreign references default case when then end',\n json: 'true false null',\n yaml: 'true false null yes no on off',\n css: '',\n html: '',\n plain: '',\n}\n\n/** \u6CA1\u6709\u8BED\u8A00\u6807\u8BB0\u65F6\u6309\u5185\u5BB9\u731C\u4E00\u4E2A\u5BB6\u65CF\u3002 */\nexport function guessFamily(code) {\n var t = String(code || '')\n if (/^\\s*#!/.test(t)) return 'sh'\n if (/<(!doctype|html|div|span|p|a|br|img|script|style|template)\\b/i.test(t)) return 'html'\n if (/^\\s*[.#@]?[a-zA-Z-]+\\s*\\{[^}]*:[^}]*;?/m.test(t) && t.indexOf('{') >= 0 && t.indexOf(':') >= 0 && !/=>|function|const |let /.test(t)) return 'css'\n if (/\\b(def |import |from |elif |self\\b|print\\()/.test(t) && /:\\s*$/m.test(t)) return 'py'\n if (/\\b(select|insert into|update|delete from|create table)\\b/i.test(t)) return 'sql'\n if (/^\\s*[{[][\\s\\S]*\"[^\"]+\"\\s*:/m.test(t) && !/function|=>|;/.test(t)) return 'json'\n // shell\uFF1A\u6709 fi/done/esac \u6536\u5C3E\uFF0C\u6216\"\u547D\u4EE4 + \u9009\u9879\"\u7684\u884C\n if (/\\b(fi|done|esac)\\b/.test(t) && /^\\s*(if|then|elif|else|for|while|do|case|until)\\b/m.test(t)) return 'sh'\n if (/^\\s*(?:[a-z]+\\s+-{1,2}[A-Za-z]|if\\s+\\[|export\\s+\\w+=|echo\\s)/m.test(t)) return 'sh'\n if (/\\b(function|const|let|var|return|class|import|export|async|await)\\b|=>/.test(t)) return 'c'\n if (/^-{3}\\s*$/m.test(t) && /^\\s*[\\w-]+:\\s/m.test(t)) return 'yaml'\n return 'c'\n}\n\n/** \u884C\u6CE8\u91CA\u8D77\u59CB\u5224\u65AD\uFF08\u6309\u5BB6\u65CF\uFF09\u3002 */\nexport function commentStartAt(line, i, family) {\n var rest = line.slice(i)\n if (family === 'py' || family === 'sh' || family === 'yaml') return rest.charAt(0) === '#'\n if (family === 'sql') return rest.slice(0, 2) === '--'\n if (family === 'html') return rest.slice(0, 4) === '<!--'\n if (family === 'json') return rest.slice(0, 2) === '//'\n return rest.slice(0, 2) === '//' // c / css \u9ED8\u8BA4\n}\n\n/**\n * \u9010\u884C\u626B\u63CF\u51FA token\uFF1Acom / str / num / kw / fn / type / attr / var / op / plain\u3002\n * \u53EA\u6C42\"\u4E00\u773C\u770B\u5F97\u61C2\"\uFF0C\u4E0D\u8FFD\u6C42\u7F16\u8BD1\u5668\u7EA7\u6B63\u786E\u3002\n */\nexport function tokenizeCodeLine(line, family, words, state) {\n var tokens = []\n var i = 0\n function push(cls, text) {\n if (!text) return\n if (cls === 'plain') {\n var last = tokens[tokens.length - 1]\n if (last && last.cls === 'plain') {\n last.text += text\n return\n }\n }\n tokens.push({ cls: cls, text: text })\n }\n function nextChar(skipSpace) {\n var j = i\n if (skipSpace) while (j < line.length && line.charAt(j) === ' ') j += 1\n return line.charAt(j)\n }\n while (i < line.length) {\n if (state.block) {\n var close = line.indexOf('*/', i)\n if (close < 0) {\n push('com', line.slice(i))\n i = line.length\n break\n }\n push('com', line.slice(i, close + 2))\n i = close + 2\n state.block = false\n continue\n }\n var ch = line.charAt(i)\n var start = i\n if (commentStartAt(line, i, family)) {\n push('com', line.slice(i))\n i = line.length\n break\n }\n if ((family === 'c' || family === 'css' || family === 'json') && line.slice(i, i + 2) === '/*') {\n state.block = true\n i += 2\n push('com', '/*')\n continue\n }\n if (family === 'html' && ch === '<') {\n var gt = line.indexOf('>', i)\n if (gt < 0) {\n push('tag', line.slice(i))\n i = line.length\n break\n }\n push('tag', line.slice(i, gt + 1))\n i = gt + 1\n continue\n }\n if (ch === '\"' || ch === \"'\" || (ch === '`' && family !== 'sql')) {\n i += 1\n while (i < line.length) {\n if (line.charAt(i) === '\\\\') {\n i += 2\n continue\n }\n if (line.charAt(i) === ch) {\n i += 1\n break\n }\n i += 1\n }\n var text2 = line.slice(start, i)\n // JSON \u7684\u952E\uFF1A\u7D27\u8DDF\u5192\u53F7\u7684\u5B57\u7B26\u4E32\u5355\u72EC\u4E0A\u8272\n push(family === 'json' && line.slice(i).replace(/\\s+/, '').charAt(0) === ':' ? 'attr' : 'str', text2)\n continue\n }\n if (ch >= '0' && ch <= '9' && !/[A-Za-z0-9_$]/.test(line.charAt(i - 1) || '')) {\n i += 1\n while (i < line.length && /[0-9a-fA-FxXoO._]/.test(line.charAt(i))) i += 1\n while (i < line.length && /[eE][+-]?[0-9]/.test(line.slice(i, i + 3)) ) i += 2\n push('num', line.slice(start, i))\n continue\n }\n if (ch === '$' && family === 'sh') {\n i += 1\n if (line.charAt(i) === '{') {\n var close2 = line.indexOf('}', i)\n i = close2 < 0 ? line.length : close2 + 1\n } else {\n while (i < line.length && /[A-Za-z0-9_?@*#!$]/.test(line.charAt(i))) i += 1\n }\n push('var', line.slice(start, i))\n continue\n }\n if (/[A-Za-z_$@#]/.test(ch)) {\n i += 1\n while (i < line.length && /[A-Za-z0-9_$-]/.test(line.charAt(i))) i += 1\n var word = line.slice(start, i)\n var bare = word.replace(/^[@#$]/, '')\n var after = nextChar(true)\n var cls = 'plain'\n if (bare && words[bare.toLowerCase()] === 1 && (family !== 'c' || /^[A-Za-z_$]/.test(ch))) cls = 'kw'\n else if (after === '(') cls = 'fn'\n else if (family === 'c' && /^[A-Z]/.test(word) && word.length > 1) cls = 'type'\n else if (family === 'css' && (line.charAt(start - 1) === '.' || line.charAt(start - 1) === '#')) cls = 'type'\n else if (family === 'css' && after === ':') cls = 'attr'\n else if (family === 'json' && line.charAt(i) === '\"') cls = 'attr'\n push(cls, word)\n continue\n }\n if (/[{}()[\\];,.:=+\\-*/%<>!&|^~?]/.test(ch)) {\n i += 1\n push('op', line.slice(start, i))\n continue\n }\n i += 1\n push('plain', line.slice(start, i))\n }\n return tokens\n}\n\n/**\n * \u628A\u4E00\u6BB5\u4EE3\u7801\u6309\u884C\u9AD8\u4EAE\u6210\u8282\u70B9\uFF08\u6BCF\u884C\u4E00\u4E2A\u6570\u7EC4\uFF0Ctokens \u4E3A {cls,text}\uFF09\u3002\n * \u8BED\u8A00\u6807\u8BB0\u8BA4\u4E0D\u51FA\u6765\u65F6\u6309\u5185\u5BB9\u731C\u3002\n */\nexport function highlightCode(code, lang) {\n var family = HL_FAMILY[String(lang || '').toLowerCase()] || guessFamily(code)\n var words = {}\n var list = (HL_WORDS[family] || '').split(' ')\n for (var w = 0; w < list.length; w += 1) if (list[w]) words[list[w]] = 1\n var lines = String(code).split('\\n')\n var state = { block: false }\n var out = []\n for (var i = 0; i < lines.length; i += 1) out.push({ line: lines[i], tokens: tokenizeCodeLine(lines[i], family, words, state) })\n return { family: family, lines: out }\n}\n\n/** \u89E3\u6790 rgb()/rgba() \u2192 [r,g,b,a]\uFF1B\u89E3\u6790\u4E0D\u4E86\u8FD4\u56DE null\u3002 */\nexport function parseColor(value) {\n var m = /rgba?\\(([^)]+)\\)/.exec(String(value || ''))\n if (!m) return null\n var parts = m[1].split(',').map(function (piece) { return parseFloat(piece) })\n if (parts.length < 3) return null\n return [parts[0], parts[1], parts[2], parts.length > 3 ? parts[3] : 1]\n}\n\n/**\n * \u7B97\u51FA\u4EE3\u7801\u5757**\u5B9E\u9645\u770B\u5230\u7684\u5E95\u8272**\uFF08\u9010\u5C42\u5411\u4E0A\u628A\u534A\u900F\u660E\u80CC\u666F\u53E0\u8D77\u6765\uFF09\uFF0C\u518D\u5224\u6DF1\u6D45\u3002\n * \u8FD9\u6837\u4E3B\u9898\u600E\u4E48\u5B9E\u73B0\u90FD\u4E0D\u5F71\u54CD\uFF1A\u53EA\u770B\u6700\u7EC8\u989C\u8272\u3002\n */\nexport function isDarkSurface(node) {\n try {\n // \u5148\u6536\u96C6\u7956\u5148\u94FE\u4E0A\u7684\u80CC\u666F\u5C42\uFF08\u5143\u7D20 \u2192 \u6839\uFF09\uFF0C\u518D**\u4ECE\u6700\u5E95\u5C42\u5F80\u4E0A\u53E0**\uFF08\u753B\u5BB6\u7B97\u6CD5\uFF09\u2014\u2014\n // \u987A\u5E8F\u53CD\u4E86\u7684\u8BDD\uFF0C\u5143\u7D20\u81EA\u5DF1\u7684\u534A\u900F\u660E\u5E95\u8272\u4F1A\u5148\u53E0\u5728\"\u767D\"\u4E0A\uFF0C\u6DF1\u8272\u4E3B\u9898\u4E5F\u4F1A\u7B97\u6210\u6D45\u8272\n var layers = []\n var current = node\n for (var depth = 0; current && depth < 12; depth += 1) {\n var background = parseColor(getComputedStyle(current).backgroundColor)\n if (background && background[3] > 0) layers.push(background)\n current = current.parentElement\n }\n var r = 255\n var g = 255\n var b = 255\n for (var i = layers.length - 1; i >= 0; i -= 1) {\n var a = layers[i][3]\n r = layers[i][0] * a + r * (1 - a)\n g = layers[i][1] * a + g * (1 - a)\n b = layers[i][2] * a + b * (1 - a)\n }\n return 0.2126 * r + 0.7152 * g + 0.0722 * b < 140\n } catch (error) {\n return false\n }\n}\n\n/**\n * \u9AD8\u4EAE\u7ED3\u679C \u2192 <pre> \u5185\u5BB9\uFF08\u6CE8\u91CA\u6574\u4F53\u5F31\u5316\uFF0C\u4EE3\u7801\u7740\u8272\uFF09\u3002\n *\n * \u6BCF\u884C\u5355\u72EC\u6210\u5757\uFF1A**\u6CE8\u91CA\u884C\u5141\u8BB8\u6298\u884C**\uFF08\u4E0D\u6A2A\u5411\u6EA2\u51FA\u5C0F\u7A97\uFF09\uFF0C\u4EE3\u7801\u884C\u4FDD\u6301 `pre` \u4E0D\u6298\n * \uFF08\u957F\u4EE3\u7801\u5B81\u53EF\u6A2A\u5411\u6EDA\u52A8\uFF0C\u4E5F\u4E0D\u8981\u88AB\u6298\u65AD\u6210\u770B\u4E0D\u61C2\u7684\u5F62\u72B6\uFF09\u3002\n */\nexport function paintHighlight(pre, code, lang) {\n pre.setAttribute('data-hl', isDarkSurface(pre) ? 'dark' : 'light')\n var hi = highlightCode(code, lang)\n for (var i = 0; i < hi.lines.length; i += 1) {\n var tokens = hi.lines[i].tokens\n // \u6574\u884C\u662F\u5426\u53EA\u6709\u6CE8\u91CA\uFF08\u7A7A\u767D + \u6CE8\u91CA\uFF09\u2192 \u6574\u884C\u53EF\u6298\u884C\n var commentOnly = tokens.length > 0\n for (var k = 0; k < tokens.length; k += 1) {\n if (tokens[k].cls !== 'com' && !(tokens[k].cls === 'plain' && !tokens[k].text.trim())) {\n commentOnly = false\n break\n }\n }\n if (commentOnly) {\n var first = 0\n for (var f = 0; f < tokens.length; f += 1) {\n if (tokens[f].cls === 'com') {\n first = f\n break\n }\n }\n pre.appendChild(codeLine(tokens, commentColumn(tokens, first), true))\n continue\n }\n // \u4EE3\u7801 + \u884C\u5C3E\u6CE8\u91CA\uFF1A\u6CE8\u91CA\u62C6\u6210\u72EC\u7ACB\u7684\u6CE8\u91CA\u884C\uFF08\u7F29\u8FDB = \u5B83\u5728\u539F\u884C\u7684\u8D77\u59CB\u5217\uFF09\uFF0C\n // \u8FD9\u6837\u6298\u884C\u540E\u7684\u7EED\u884C\u4E00\u5B9A\u4E0E\u6CE8\u91CA\u5DE6\u5BF9\u9F50\uFF0C\u800C\u4E0D\u4F1A\u8DD1\u5230\u4EE3\u7801\u5DE6\u8FB9\u53BB\n var cut = -1\n for (var c = 0; c < tokens.length; c += 1) {\n if (tokens[c].cls === 'com') {\n cut = c\n break\n }\n }\n if (cut < 0) {\n pre.appendChild(codeLine(tokens, -1, false))\n continue\n }\n pre.appendChild(codeLine(tokens.slice(0, cut), -1, false))\n pre.appendChild(codeLine(tokens.slice(cut), commentColumn(tokens, cut), true))\n }\n}\n\n/** \u4E00\u884C\u91CC\u7B2C index \u4E2A token \u4E4B\u524D\u7D2F\u8BA1\u7684\u5B57\u7B26\u6570\uFF08= \u5B83\u7684\u8D77\u59CB\u5217\uFF0C\u7528\u4E8E\u6CE8\u91CA\u7F29\u8FDB\uFF09\u3002 */\nexport function commentColumn(tokens, index) {\n var column = 0\n for (var i = 0; i < index && i < tokens.length; i += 1) column += tokens[i].text.length\n return column\n}\n\n/**\n * \u9020\u4E00\u4E2A\"\u884C\u5757\"\u3002\n *\n * indent > 0 \u8868\u793A\u8FD9\u662F\u6CE8\u91CA\u884C\uFF1A`padding-left` \u628A\u6574\u5757\u53F3\u79FB indent \u4E2A\u5B57\u7B26\u5BBD\uFF0C\n * `text-indent` \u8D1F\u503C\u518D\u628A**\u9996\u884C**\u62C9\u56DE\u539F\u5904 \u2014\u2014 \u4E8E\u662F\u9996\u884C\u843D\u5728\u6CE8\u91CA\u539F\u672C\u7684\u5217\u4E0A\uFF0C\n * \u800C**\u6298\u884C\u540E\u7684\u7EED\u884C**\u4ECE padding \u5904\u5F00\u59CB\uFF0C\u6B63\u597D\u4E0E\u6CE8\u91CA\u5DE6\u5BF9\u9F50\uFF08\u4E0D\u4F1A\u8DD1\u5230\u6CE8\u91CA\u5DE6\u8FB9\uFF09\u3002\n * indent \u4E0A\u9650 12ch\uFF1A\u771F\u5B9E\u4EE3\u7801\u91CC\u6CE8\u91CA\u7F29\u8FDB\u518D\u6DF1\u4E5F\u4E0D\u8BE5\u628A\u6B63\u6587\u9876\u51FA\u5C0F\u7A97\u3002\n */\nexport function codeLine(tokens, indent, wrap) {\n var line = el('div', 'dsh-sel-pre-line')\n var pad = indent > 0 ? Math.min(indent, 12) : 0\n // \u6CE8\u91CA\u884C\u4E00\u5F8B\u53EF\u6298\u884C\uFF08\u7F29\u8FDB\u4E3A 0 \u7684\u6CE8\u91CA\u4E5F\u8981\u6298\uFF09\uFF0C\u4EE3\u7801\u884C\u4E0D\u6298\n if (wrap === true || pad > 0) line.setAttribute('data-wrap', '1')\n if (pad > 0) {\n line.style.paddingLeft = pad + 'ch'\n line.style.textIndent = '-' + pad + 'ch'\n }\n for (var t = 0; t < tokens.length; t += 1) {\n var token = tokens[t]\n if (token.cls === 'plain') line.appendChild(document.createTextNode(token.text))\n // \u6CE8\u91CA\u989D\u5916\u6302 .dsh-sel-pre-cmt\uFF1A\u6279\u6CE8\u6E05\u5355\u91CC\u6CE8\u91CA\u6574\u4F53\u518D\u538B\u4E00\u6863\n else line.appendChild(el('span', token.cls === 'com' ? 'dsh-hl-com dsh-sel-pre-cmt' : 'dsh-hl-' + token.cls, token.text))\n }\n return line\n}\n\n/**\n * \u8FD9\u6BB5\u56F4\u680F\u5185\u5BB9\u80FD\u4E0D\u80FD\u76F4\u63A5\u5F53\u7F51\u9875\u6E32\u67D3\uFF1Ahtml/htm/xhtml/svg \u6807\u4E86\u8BED\u8A00\u5C31\u7B97\uFF1B\n * \u6CA1\u6807\u8BED\u8A00\u65F6\uFF0C\u53EA\u6709\"\u770B\u8D77\u6765\u662F\u4E00\u4EFD\u5B8C\u6574\u6587\u6863\"\uFF08doctype \u6216 <html> \u4E14\u6709 </html>\uFF09\u624D\u5F53\u7F51\u9875\uFF0C\n * \u514D\u5F97\u628A\u968F\u624B\u5199\u7684 `<div>` \u7247\u6BB5\u4E5F\u585E\u8FDB iframe\u3002\n */\nexport function looksLikeWebPage(lang, code) {\n var l = String(lang || '').toLowerCase()\n if (l === 'html' || l === 'htm' || l === 'xhtml' || l === 'svg') return true\n var text = String(code || '')\n return (/<!doctype\\s+html|<html[\\s>]/i.test(text) && /<\\/html>/i.test(text))\n}\n\n/**\n * \u7F51\u9875\u9884\u89C8\u5757\uFF1A\u5DE5\u5177\u680F\uFF08\u9884\u89C8 / \u4EE3\u7801 / \u653E\u5927\uFF09+ \u6C99\u7BB1 iframe + \u6E90\u7801\u3002\n *\n * \u5B89\u5168\uFF1Aiframe \u53EA\u7ED9 `allow-scripts`\uFF0C**\u523B\u610F\u4E0D\u7ED9 `allow-same-origin`**\u2014\u2014\n * \u4E8E\u662F\u9884\u89C8\u91CC\u7684\u811A\u672C\u8DD1\u5728\u4E0D\u900F\u660E\u6E90\u91CC\uFF1A\u80FD\u7B97\u3001\u80FD\u753B\u3001\u80FD\u53D1\u8BF7\u6C42\uFF0C\u4F46\u8BFB\u4E0D\u5230\u672C\u9875\u7684\n * DOM / Cookie / localStorage\uFF0C\u4E5F\u4E0D\u80FD\u5BFC\u822A\u9876\u5C42\u7A97\u53E3\uFF08\u6C99\u7BB1\u4E0D\u52A0 allow-top-navigation\uFF09\u3002\n */\n/**\n * D\uFF1A\u7ED9\u9884\u89C8\u9875\u6CE8\u5165\"\u7A84\u5BB9\u5668\u81EA\u9002\u5E94\"\u7684\u51E0\u6761\u57FA\u7840\u89C4\u5219\u3002\n *\n * \u6A21\u578B\u7ED9\u7684\u9875\u9762\u5E38\u6309 1000~1200px \u6392\u7248\uFF0C\u585E\u8FDB 445px \u53EA\u80FD\u5DE6\u53F3\u62D6\u2014\u2014\u8FD9\u51E0\u6761\u8BA9\u5B83\u81EA\u5DF1\u56DE\u6D41\uFF1A\n * \u56FE\u7247/\u8868\u683C\u4E0D\u8D85\u5BBD\u3001\u4EE3\u7801\u5757\u5185\u90E8\u6EDA\u52A8\u3001body \u4E0D\u6A2A\u5411\u6EA2\u51FA\u3002\n * **\u5FC5\u987B\u63D2\u5728 doctype \u4E4B\u540E**\uFF08\u63D2\u5230\u524D\u9762\u4F1A\u628A\u6587\u6863\u63A8\u8FDB\u602A\u5F02\u6A21\u5F0F\uFF0C\u9875\u9762\u4F1A\u53D8\u5F62\uFF09\u3002\n */\nexport function adaptPreviewHtml(code, previewId) {\n var reset =\n '<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">' +\n '<style data-dsh-preview-reset>' +\n 'html,body{max-width:100%;overflow-x:hidden}' +\n 'img,svg,video,canvas{max-width:100%;height:auto}' +\n 'table{max-width:100%}' +\n 'pre{max-width:100%;overflow-x:auto}' +\n // \u5185\u7F6E\u6EDA\u52A8\u6761\u5F88\u788D\u773C\uFF1A\u9AD8\u5EA6\u4F1A\u7531\u9875\u9762\u81EA\u5DF1\u4E0A\u62A5\uFF08\u89C1\u4E0B\u9762\u7684 hook\uFF09\uFF0C\u6240\u4EE5\u5E73\u65F6\u6839\u672C\u4E0D\u9700\u8981\u5B83\n 'html{scrollbar-width:none}' +\n '::-webkit-scrollbar{width:0;height:0}' +\n '</style>' +\n // \u9875\u9762\u628A\u81EA\u8EAB\u9AD8\u5EA6\u62A5\u7ED9\u7236\u7A97\u53E3 \u2192 iframe \u76F4\u63A5\u957F\u5230\u5185\u5BB9\u90A3\u4E48\u9AD8\uFF0C\u6846\u91CC\u5C31\u4E0D\u4F1A\u51FA\u73B0\u6EDA\u52A8\u6761\n '<scr' + 'ipt data-dsh-preview-hook>' +\n '(function(){var id=' + JSON.stringify(previewId || '') + ';var last=-1;' +\n 'function report(){var d=document.documentElement,b=document.body;' +\n 'var h=Math.max(d?d.scrollHeight:0,b?b.scrollHeight:0,d?d.offsetHeight:0,b?b.offsetHeight:0);' +\n 'if(!h||Math.abs(h-last)<4)return;last=h;' +\n 'try{parent.postMessage({__dshPreview:true,id:id,h:h},\"*\")}catch(e){}}' +\n 'report();document.addEventListener(\"DOMContentLoaded\",report);window.addEventListener(\"load\",report);' +\n 'setTimeout(report,120);setTimeout(report,600);' +\n 'try{new ResizeObserver(report).observe(document.documentElement)}catch(e){}' +\n 'window.addEventListener(\"resize\",report);})();' +\n '</scr' + 'ipt>'\n var text = String(code || '')\n var doctype = /^\\s*<!doctype[^>]*>/i.exec(text)\n if (doctype) {\n var cut = doctype.index + doctype[0].length\n return text.slice(0, cut) + reset + text.slice(cut)\n }\n var html = /^\\s*<html[^>]*>/i.exec(text)\n if (html) {\n var cut2 = html.index + html[0].length\n return text.slice(0, cut2) + reset + text.slice(cut2)\n }\n return reset + text\n}\n\n/** \u9884\u89C8\u5E27\u767B\u8BB0\u8868\uFF1Aid \u2192 { frame }\uFF0C\u7528\u4E8E\u628A\"\u9875\u9762\u4E0A\u62A5\u7684\u9AD8\u5EA6\"\u5BF9\u56DE\u6B63\u786E\u7684 iframe\u3002 */\nexport var previewSeq = 0\n\nexport var previewFrames = {}\n\nexport function registerPreviewFrame(frame) {\n previewSeq += 1\n var id = 'pv' + previewSeq\n previewFrames[id] = { frame: frame }\n // \u6BCF\u6B21\u91CD\u7ED8\u90FD\u4F1A\u4EA7\u751F\u65B0\u5E27\uFF0C\u987A\u624B\u628A\u5DF2\u7ECF\u8131\u79BB\u6587\u6863\u7684\u65E7\u5E27\u6E05\u6389\uFF0C\u907F\u514D\u8868\u65E0\u9650\u957F\u5927\n for (var key in previewFrames) {\n if (!Object.prototype.hasOwnProperty.call(previewFrames, key)) continue\n var item = previewFrames[key]\n if (item.frame !== frame && item.frame.isConnected === false) delete previewFrames[key]\n }\n return id\n}\n\n/**\n * \u6309\u5F53\u524D\u6A21\u5F0F\u7ED9 iframe \u5B9A\u9AD8\u3002\n *\n * - \u5168\u91CF\uFF08\u9ED8\u8BA4\uFF09\uFF1A\u9AD8\u5EA6 = \u9875\u9762\u4E0A\u62A5\u7684\u5185\u5BB9\u9AD8\u5EA6\uFF08\u5185\u90E8\u4E0D\u6EDA\u52A8\uFF0C\u6574\u9875\u8DDF\u7740\u6D88\u606F\u533A\u6EDA\uFF09\uFF1B\n * - \u8FD8\u539F\uFF1A\u6E05\u6389 inline \u9AD8\u5EA6\uFF0C\u4EA4\u7ED9 CSS \u7684\u56FA\u5B9A 320px\uFF08\u8D85\u51FA\u8D70\u5185\u90E8\u6EDA\u52A8\uFF0C\u6EDA\u52A8\u6761\u5DF2\u9690\u85CF\uFF09\u3002\n */\nexport function applyPreviewHeight(frame, wrap) {\n var full = !wrap || wrap.getAttribute('data-full') !== '0'\n var reported = Number(frame.getAttribute('data-preview-h')) || 0\n if (!full) {\n frame.style.height = ''\n return\n }\n if (reported > 0) {\n // \u4E0A\u9650\u53EA\u662F\u9632\u75C5\u6001\u9875\u9762\uFF08\u51E0\u4E07\u50CF\u7D20\uFF09\u628A\u6D88\u606F\u533A\u6491\u7206\n frame.style.height = Math.min(reported, 6000) + 'px'\n }\n}\n\nexport function webPreviewBlock(code) {\n var wrap = el('div', 'dsh-sel-preview')\n wrap.setAttribute('data-view', 'preview')\n // \u9ED8\u8BA4\u5168\u91CF\u5C55\u793A\u6574\u9875\uFF1B\u70B9\u300C\u8FD8\u539F\u300D\u5207\u56DE\u56FA\u5B9A\u9AD8\u5EA6\uFF08\u5185\u90E8\u6EDA\u52A8\uFF09\n wrap.setAttribute('data-full', '1')\n\n var bar = el('div', 'dsh-sel-previewbar')\n var tabs = el('div', 'dsh-sel-previewtabs')\n var previewTab = el('button', 'dsh-sel-previewtab', '\u9884\u89C8')\n var codeTab = el('button', 'dsh-sel-previewtab', '\u4EE3\u7801')\n previewTab.type = 'button'\n codeTab.type = 'button'\n tabs.appendChild(previewTab)\n tabs.appendChild(codeTab)\n var zoomBtn = el('button', 'dsh-sel-previewzoom', '\u2921 \u8FD8\u539F')\n zoomBtn.type = 'button'\n zoomBtn.title = '\u8FD8\u539F\u6210\u56FA\u5B9A\u9AD8\u5EA6\uFF08\u7F51\u9875\u5185\u90E8\u81EA\u5DF1\u6EDA\u52A8\uFF09'\n bar.appendChild(tabs)\n bar.appendChild(zoomBtn)\n\n var frame = document.createElement('iframe')\n frame.className = 'dsh-sel-previewframe'\n frame.setAttribute('sandbox', 'allow-scripts allow-forms allow-modals allow-popups')\n frame.setAttribute('referrerpolicy', 'no-referrer')\n frame.setAttribute('title', '\u7F51\u9875\u9884\u89C8')\n var previewId = registerPreviewFrame(frame)\n frame.setAttribute('data-preview-id', previewId)\n frame.setAttribute('srcdoc', adaptPreviewHtml(code, previewId))\n\n var pre = el('pre', 'dsh-sel-pre')\n var view = el('div', 'dsh-sel-previewbody')\n view.appendChild(frame)\n view.appendChild(pre)\n wrap.appendChild(bar)\n wrap.appendChild(view)\n\n function syncTabs() {\n var on = wrap.getAttribute('data-view')\n previewTab.setAttribute('data-on', on === 'preview' ? '1' : '0')\n codeTab.setAttribute('data-on', on === 'code' ? '1' : '0')\n }\n function switchTo(next) {\n wrap.setAttribute('data-view', next)\n syncTabs()\n }\n listen(previewTab, 'click', function (event) {\n event.stopPropagation()\n switchTo('preview')\n })\n listen(codeTab, 'click', function (event) {\n event.stopPropagation()\n switchTo('code')\n })\n listen(zoomBtn, 'click', function (event) {\n event.stopPropagation()\n var full = wrap.getAttribute('data-full') !== '0'\n var next = full ? '0' : '1'\n wrap.setAttribute('data-full', next)\n zoomBtn.textContent = next === '1' ? '\u2921 \u8FD8\u539F' : '\u2922 \u5168\u91CF'\n zoomBtn.title =\n next === '1' ? '\u8FD8\u539F\u6210\u56FA\u5B9A\u9AD8\u5EA6\uFF08\u7F51\u9875\u5185\u90E8\u81EA\u5DF1\u6EDA\u52A8\uFF09' : '\u5168\u91CF\u5C55\u793A\u6574\u9875\uFF08\u8DDF\u7740\u6D88\u606F\u533A\u4E00\u8D77\u6EDA\uFF09'\n applyPreviewHeight(frame, wrap)\n })\n syncTabs()\n return { root: wrap, pre: pre, frame: frame }\n}\n\nexport function renderRich(parent, text, options) {\n parent.textContent = ''\n var lines = String(text || '').replace(/\\r/g, '').split('\\n')\n var current = null // { level, node }\n var ordered = false\n var wantCallout = !!(options && options.callout)\n\n for (var i = 0; i < lines.length; i++) {\n var raw = lines[i]\n var trimmed = raw.trim()\n if (!trimmed) {\n current = null\n continue\n }\n // \u56F4\u680F\u4EE3\u7801\u5757\uFF1A``` \u5230\u6536\u5C3E ```\uFF08\u683C\u5F0F\u81EA\u7531\u540E\u6A21\u578B\u53EF\u80FD\u7ED9\u51FA\u4EE3\u7801/\u547D\u4EE4\u7247\u6BB5\uFF09\n if (/^```/.test(trimmed)) {\n current = null\n var fenceLang = trimmed.replace(/^```+/, '').trim().split(/[\\s:,]/)[0]\n var codeLines = []\n i += 1\n while (i < lines.length && !/^```/.test(lines[i].trim())) {\n codeLines.push(lines[i])\n i += 1\n }\n var codeText = codeLines.join('\\n')\n // \u957F\u4EE3\u7801\u5757\u5728\u6D41\u5F0F\u671F\u95F4\u5148\u7ED9\u7EAF\u6587\u672C\uFF1A\u8BED\u6CD5\u9AD8\u4EAE\u4F1A\u4E3A\u6BCF\u4E00\u884C\u9020\u4E00\u5806 span\uFF086KB \u9875\u9762 \u2248 2000+ \u4E2A\uFF09\uFF0C\n // \u6BCF\u5E27\u91CD\u505A\u4E00\u904D\u662F\u5361\u987F\u7684\u7B2C\u4E8C\u4E2A\u6765\u6E90\uFF1B\u6536\u5C3E\uFF08settled\uFF09\u90A3\u4E00\u6B21\u518D\u4E0A\u8272\u3002\n var plainWhileStreaming = codeText.length > 1200 && !(options && options.settled === true)\n // \u53EA\u6709\"\u8FD9\u4E00\u8F6E\u5DF2\u7ECF\u5B9A\u7A3F\"\u624D\u6E32\u67D3\u9884\u89C8\uFF1A\u6D41\u5F0F\u671F\u95F4\u6BCF\u6B21\u91CD\u7ED8\u90FD\u6362\u4E00\u4EFD iframe \u4F1A\u4E0D\u505C\u91CD\u8F7D\u3001\u95EA\u767D\uFF0C\n // \u6240\u4EE5\u8FB9\u751F\u6210\u8FB9\u770B\u6E90\u7801\uFF0C\u56DE\u590D\u4E00\u7ED3\u675F\uFF08settled\uFF09\u7ACB\u523B\u53D8\u6210\u53EF\u4EA4\u4E92\u7F51\u9875\u3002\n if (options && options.settled === true && looksLikeWebPage(fenceLang, codeText)) {\n var block = webPreviewBlock(codeText)\n parent.appendChild(block.root)\n // \u5148\u5165 DOM \u518D\u4E0A\u8272\uFF1A\u4E3B\u9898\u5224\u5B9A\u8981\u8BFB\u7956\u5148\u94FE\u7684**\u5B9E\u9645**\u5E95\u8272\uFF0C\u6E38\u79BB\u8282\u70B9\u8BFB\u4E0D\u5230\n paintHighlight(block.pre, codeText, fenceLang)\n } else {\n var pre = el('pre', 'dsh-sel-pre')\n parent.appendChild(pre)\n if (plainWhileStreaming) pre.textContent = codeText\n else paintHighlight(pre, codeText, fenceLang)\n }\n continue\n }\n // \u8868\u683C\uFF1A\u5F53\u524D\u884C\u4EE5 | \u5F00\u5934\u4E14\u4E0B\u4E00\u884C\u662F\u5206\u9694\u884C\n if (trimmed.charAt(0) === '|' && i + 1 < lines.length && isTableSeparator(lines[i + 1].trim())) {\n current = null\n i = renderTable(parent, lines, i) - 1\n continue\n }\n // \u7ED3\u8BBA\u6761\uFF08\u7FFB\u8BD1\u8282\u7684\u56FA\u5B9A\u7ED3\u5C3E\uFF1B\u5F15\u7528\u884C\u4E0E\u666E\u901A\u884C\u90FD\u8BC6\u522B\uFF09\n if (wantCallout) {\n var calloutSource = trimmed.charAt(0) === '>' ? trimmed.replace(/^>\\s?/, '') : trimmed\n var callout = CALLOUT_RE.exec(calloutSource)\n if (callout) {\n current = null\n parent.appendChild(calloutNode(callout[1], callout[2]))\n continue\n }\n }\n // \u5206\u9694\u7EBF\n if (/^(-{3,}|\\*{3,}|_{3,})$/.test(trimmed)) {\n current = null\n parent.appendChild(el('hr', 'dsh-sel-hr'))\n continue\n }\n // \u5F15\u7528\n var quote = /^>\\s?(.*)$/.exec(trimmed)\n if (quote) {\n current = null\n var quoteLine = el('div', 'dsh-sel-quote-line')\n appendInline(quoteLine, quote[1])\n parent.appendChild(quoteLine)\n continue\n }\n // \u5217\u8868\uFF08\u542B\u7F29\u8FDB\u5206\u7EA7\u3001\u6709\u5E8F\u7F16\u53F7\uFF09\n var bullet = /^(\\s*)([-*\u2022+]|\\d+[.)])\\s+(.*)$/.exec(raw)\n if (bullet) {\n var level = Math.min(2, Math.floor(bullet[1].replace(/\\t/g, ' ').length / 2))\n var isNumbered = /^\\d/.test(bullet[2])\n if (!current || current.level !== level || ordered !== isNumbered) {\n var listNode = el('div', 'dsh-sel-list')\n listNode.setAttribute('data-level', String(level))\n parent.appendChild(listNode)\n current = { level: level, node: listNode }\n ordered = isNumbered\n }\n var item = el('div', 'dsh-sel-item')\n if (isNumbered) item.setAttribute('data-num', '1')\n item.appendChild(el('span', 'dsh-sel-bullet', isNumbered ? bullet[2] : '\u2022'))\n var body = el('span')\n appendInline(body, bullet[3])\n item.appendChild(body)\n current.node.appendChild(item)\n continue\n }\n current = null\n // \u5C0F\u6807\u9898\n var heading = /^#{1,6}\\s*(.*)$/.exec(trimmed)\n if (heading) {\n var sub = el('div', 'dsh-sel-sub')\n appendInline(sub, heading[1])\n parent.appendChild(sub)\n continue\n }\n // \u6BB5\u843D\n var paragraph = el('p')\n appendInline(paragraph, trimmed)\n parent.appendChild(paragraph)\n }\n}\n\n/** \u6309\u300C## \u7FFB\u8BD1 / ## \u8BE6\u89E3\u300D\u628A\u6D41\u5F0F\u6587\u672C\u5207\u4E24\u8282\uFF08\u5BB9\u9519\u591A\u79CD\u5199\u6CD5\uFF0C\u542B\u65E7\u7684\u300C\u8BED\u5883\u542B\u4E49\u300D\uFF09\u3002 */\nexport function splitSections(raw) {\n var result = { translation: '', detail: '', other: '' }\n var re = /^[ \\t>]*#{1,6}[ \\t]*\\**\\s*(\u7FFB\u8BD1|\u8BD1\u6587|translation|\u89E3\u8BFB|\u6CE8\u91CA|\u4EE3\u7801|\u8BE6\u89E3|\u8BED\u5883\u542B\u4E49|\u8BED\u5883|\u542B\u4E49|\u89E3\u91CA|meaning|detail)\\**\\s*[:\uFF1A]?[ \\t]*$/gim\n var marks = []\n var match\n while ((match = re.exec(raw)) !== null) {\n marks.push({ start: match.index, end: re.lastIndex, name: sectionName(match[1]) })\n }\n if (marks.length === 0) {\n result.other = raw\n return result\n }\n result.other = raw.slice(0, marks[0].start)\n for (var i = 0; i < marks.length; i++) {\n var stop = i + 1 < marks.length ? marks[i + 1].start : raw.length\n var chunk = raw.slice(marks[i].end, stop)\n result[marks[i].name] += chunk\n }\n return result\n}\n\nexport function sectionName(label) {\n var key = label.toLowerCase()\n if (key.indexOf('\u7FFB\u8BD1') >= 0 || key.indexOf('\u8BD1\u6587') >= 0 || key.indexOf('translat') >= 0) return 'translation'\n if (key.indexOf('\u89E3\u8BFB') >= 0) return 'translation' // \u7EAF\u4E2D\u6587\u65F6\u9996\u8F6E\u6807\u9898\u5C31\u662F\u300C\u89E3\u8BFB\u300D\n if (key.indexOf('\u6CE8\u91CA') >= 0 || key.indexOf('\u4EE3\u7801') >= 0) return 'translation' // \u4EE3\u7801\u6BB5\u9996\u8F6E\u6807\u9898\u662F\u300C\u6CE8\u91CA\u300D\n if (\n key.indexOf('\u8BE6\u89E3') >= 0 ||\n key.indexOf('\u8BED\u5883') >= 0 ||\n key.indexOf('\u542B\u4E49') >= 0 ||\n key.indexOf('\u89E3\u91CA') >= 0 ||\n key.indexOf('meaning') >= 0 ||\n key.indexOf('detail') >= 0\n ) {\n return 'detail'\n }\n return 'other'\n}", "\n\n/**\n * Float32 \u91C7\u6837\uFF0816kHz \u5355\u58F0\u9053\uFF09\u2192 \u89C4\u8303\u7684 PCM16 WAV\u3002\n * @param samples \u91C7\u6837\uFF08-1..1\uFF09\n * @returns Uint8Array\uFF0844 \u5B57\u8282\u5934 + \u6570\u636E\uFF09\n */\nexport function encodeWave(samples) {\n var bytes = new Uint8Array(44 + samples.length * 2)\n var view = new DataView(bytes.buffer)\n function ascii(offset, text) {\n for (var i = 0; i < text.length; i += 1) view.setUint8(offset + i, text.charCodeAt(i))\n }\n ascii(0, 'RIFF')\n view.setUint32(4, 36 + samples.length * 2, true)\n ascii(8, 'WAVE')\n ascii(12, 'fmt ')\n view.setUint32(16, 16, true) // fmt \u5757\u957F\u5EA6\n view.setUint16(20, 1, true) // PCM\n view.setUint16(22, 1, true) // \u5355\u58F0\u9053\n view.setUint32(24, 16000, true) // \u91C7\u6837\u7387\n view.setUint32(28, 32000, true) // \u5B57\u8282\u7387\n view.setUint16(32, 2, true) // \u5757\u5BF9\u9F50\n view.setUint16(34, 16, true) // \u4F4D\u6DF1\n ascii(36, 'data')\n view.setUint32(40, samples.length * 2, true)\n for (var i = 0; i < samples.length; i += 1) {\n // \u5148\u5939\u5230 [-1,1]\uFF1A\u91CD\u91C7\u6837\u540E\u7684\u6D6E\u70B9\u5076\u5C14\u4F1A\u7565\u5FAE\u8D8A\u754C\uFF0C\u76F4\u63A5\u4E58\u4F1A\u7ED5\u56DE\u6210\u523A\u8033\u7684\u7206\u97F3\n var value = samples[i] < -1 ? -1 : samples[i] > 1 ? 1 : samples[i]\n view.setInt16(44 + i * 2, Math.round(value * (value < 0 ? 32768 : 32767)), true)\n }\n return bytes\n}\n\n/** \u5B57\u8282 \u2192 base64\uFF08\u5206\u5757\u5582 fromCharCode\uFF0C\u51E0\u5341\u4E07\u91C7\u6837\u4E00\u6B21\u6027\u5C55\u5F00\u4F1A\u7206\u6808\uFF09\u3002 */\nexport function bytesToBase64(bytes) {\n var text = ''\n for (var i = 0; i < bytes.length; i += 8192) {\n text += String.fromCharCode.apply(null, bytes.subarray(i, i + 8192))\n }\n return btoa(text)\n}\n\n/** \u8FD9\u4E2A\u6D4F\u89C8\u5668\u80FD\u4E0D\u80FD\u5F55\u97F3\uFF08\u4E0D\u652F\u6301\u65F6\u9EA6\u514B\u98CE\u6309\u94AE\u76F4\u63A5\u7ED9\u89E3\u91CA\uFF0C\u800C\u4E0D\u662F\u70B9\u4E86\u624D\u62A5\u9519\uFF09\u3002 */\nexport function recordingSupported() {\n try {\n if (typeof navigator === 'undefined' || !navigator.mediaDevices) return false\n if (typeof navigator.mediaDevices.getUserMedia !== 'function') return false\n // \u5168\u90E8\u8D70 window.*\uFF1A\u6D4F\u89C8\u5668\u91CC window \u5C31\u662F\u5168\u5C40\u5BF9\u8C61\uFF0C\u6D4B\u8BD5\u91CC\u4E5F\u80FD\u6CE8\u5165\u540C\u4E00\u5957\u6869\n if (typeof window.MediaRecorder === 'undefined') return false\n return typeof window.AudioContext !== 'undefined' || typeof window.webkitAudioContext !== 'undefined'\n } catch (error) {\n return false\n }\n}", "import { el, listen } from './dom.js'\nimport { ROUTE, preferences, SETTINGS } from './constants.js'\n\n/** settings state and operations; dependencies are supplied as live node/callback accessors. */\nexport function createSettingsController(env) {\n\n /**\n * \u8BBE\u7F6E\u9875\u72B6\u6001\u3002\n *\n * \u523B\u610F**\u4E0D\u67E5 DOM**\uFF08\u4E0D\u7528 querySelectorAll / innerHTML\uFF09\uFF1A\u63D2\u4EF6\u901A\u7BC7\u662F\"\u62FF\u4F4F\u8282\u70B9\u5F15\u7528\"\u7684\u5199\u6CD5\uFF0C\n * \u800C\u4E14\u5355\u6D4B\u7684 DOM \u6869\u4E5F\u6CA1\u6709\u8FD9\u4E24\u4E2A\u63A5\u53E3\u3002\u5206\u7EC4\u3001\u884C\u3001\u5206\u6BB5\u683C\u7684\u8282\u70B9\u90FD\u5B58\u4E0B\u6765\uFF0C\u91CD\u7ED8\u65F6\u76F4\u63A5\u6309\u5F15\u7528\u64CD\u4F5C\u3002\n *\n * spec \u2014\u2014 host \u4E0B\u53D1\u7684\u5B57\u6BB5\u58F0\u660E\uFF08\u5BA2\u6237\u7AEF\u4E0D\u786C\u7F16\u7801\u4EFB\u4F55\u5B57\u6BB5\u4E0E\u8FB9\u754C\uFF09\n * saved \u2014\u2014 host \u5DF2\u843D\u76D8\u7684\u503C\uFF08\u7B97\"\u6539\u4E86\u51E0\u9879\"\u3001\u4E5F\u662F\u300C\u6062\u590D\u9ED8\u8BA4\u300D\u540E\u7684\u5BF9\u7167\uFF09\n * live \u2014\u2014 \u63A7\u4EF6\u4E0A\u7684\u5F53\u524D\u503C\n * byKey \u2014\u2014 key \u2192 \u63A7\u4EF6\u6761\u76EE\uFF0C\u4FDD\u5B58\u65F6\u6309 key \u53D6\u503C\n */\n var settingsOpen = false\n\n var settingsSpec = null\n\n var settingsSaved = {}\n\n var settingsLive = {}\n\n var settingsByKey = {}\n\n var settingsRailButtons = []\n\n var settingsPanes = []\n\n var settingsSegs = []\n\n /**\n * \u56DB\u4E2A\u683C\u5B50\u7684\u6587\u6848\uFF08\u5173/\u4F4E/\u9AD8/\u6700\u9AD8\uFF09\u3002\n *\n * \u5B83\u662F**\u63D2\u4EF6\u7684\u56FA\u5B9A\u8BCD\u6C47**\uFF0C\u4E0E\u6A21\u578B\u65E0\u5173\uFF1B\u843D\u5230\u6A21\u578B\u7684\u54EA\u4E2A\u771F\u5B9E\u6863\u4F4D\u7531 host \u6309\u8BE5\u6A21\u578B\u7684\u58F0\u660E\n * \u5B9E\u65F6\u7B97\uFF08`/models` \u6BCF\u4E2A\u6A21\u578B\u5E26\u4E00\u4EFD `effortMap`\uFF0C\u89C1 host \u7684 mapEffortToModel\uFF09\u3002\n */\n var SLOT_LABEL = { off: '\u5173', low: '\u4F4E', high: '\u9AD8', max: '\u6700\u9AD8' }\n\n var SLOT_ORDER = ['off', 'low', 'high', 'max']\n\n /** \u8BBE\u7F6E\u9875\u91CC\u90A3\u51E0\u884C\"\u56DB\u683C \u2192 \u5F53\u524D\u6A21\u578B\u771F\u5B9E\u6863\u4F4D\"\u7684\u63D0\u793A\u8282\u70B9\uFF08\u8DDF\u7740\u6A21\u578B\u5B9E\u65F6\u53D8\uFF09\u3002 */\n var settingsEffortHints = []\n\n /** \u81EA\u7ED8\u4E0B\u62C9\u7684\u83DC\u5355\u8282\u70B9\uFF08\u6302\u5728\u62BD\u5C49\u4E0A\uFF0C\u91CD\u6E32\u67D3\u65F6\u8981\u4E00\u8D77\u6E05\u6389\uFF0C\u5426\u5219\u4F1A\u53E0\u51FA\u7B2C\u4E8C\u4EFD\u6D6E\u5C42\uFF09\u3002 */\n var settingsMenus = []\n\n var settingsFetching = false\n\n var settingsSaveTimer = 0\n\n var settingsSaveSeq = 0\n\n var settingsSaving = false\n\n var settingsSaveRequest = null\n\n var settingsResetting = false\n\n /** \u6E05\u7A7A\u4E00\u4E2A\u8282\u70B9\u7684\u5B50\u5143\u7D20\uFF08\u66FF\u4EE3 innerHTML=''\uFF0C\u4E24\u8005\u5728\u6869\u91CC\u90FD\u6CA1\u6709\uFF09\u3002 */\n function clearNode(node) {\n while (node.firstChild) node.removeChild(node.firstChild)\n }\n\n /**\n * \u9020\u4E00\u4E2A <option>\uFF08\u539F\u751F select \u7528\uFF1B\u8BBE\u7F6E\u9875\u5DF2\u6539\u6210\u81EA\u7ED8\u4E0B\u62C9\uFF0C\u8FD9\u91CC\u7559\u7ED9\u522B\u5904\u590D\u7528\uFF09\u3002\n */\n function modelOption(value, label) {\n var option = el('option', null, label)\n option.value = value\n return option\n }\n\n /**\n * \u4E00\u4E2A\u6A21\u578B\u4E0B\u62C9\u884C\"\u9009\u4E2D\u4E86\u4EC0\u4E48\"\u3002\n *\n * \u6BCF\u4E2A\u6A21\u578B\u884C\u7BA1**\u4E24\u4E2A**\u914D\u7F6E\u5B57\u6BB5\uFF08spec.keys\uFF0C\u5982 ['provider','model'] \u6216 ['chatProvider','chatModel']\uFF09\u3002\n * \u4E24\u4E2A\u90FD\u6709\u624D\u7B97\u9009\u5B9A\uFF1B\u5426\u5219\u8FD9\u4E00\u884C\u5C31\u662F\"\u8DDF\u968F\"\u72B6\u6001\u3002\n */\n function pairOf(entry) {\n var keys = entry.spec.keys || []\n var provider = settingsLive[keys[0]]\n var model = settingsLive[keys[1]]\n if (!provider || !model) return null\n return { provider: String(provider), model: String(model) }\n }\n\n /** \u4E00\u884C\"\u8DDF\u968F\"\u65F6\u8BE5\u5199\u4EC0\u4E48\u5B57\uFF08\u4E24\u884C\u8BED\u4E49\u4E0D\u540C\uFF1A\u9996\u8F6E/\u6B21\u8F6E\u8DDF\u4E3B\u4F1A\u8BDD\uFF0C\u8FFD\u95EE\u8DDF\u9996\u8F6E/\u6B21\u8F6E\uFF09\u3002 */\n function followLabelOf(entry) {\n return '\u8DDF\u968F\u4E3B\u4F1A\u8BDD'\n }\n\n /**\n * \u4E0B\u62C9\u6309\u94AE\u4E0A\u7684\u6587\u5B57\u3002\n *\n * \u00B7 \u9009\u5B9A\u8FC7 \u2192 \u663E\u793A\u6A21\u578B\u540D\uFF08\u786E\u5B9A\u65E0\u7591\uFF09\n * \u00B7 \u6CA1\u9009\u5B9A \u2192 \u300C\u8DDF\u968F\u2026\uFF08\u5F53\u524D\uFF1AX\uFF09\u300D\u2014\u2014 X \u662F\u672C\u884C**\u5B9E\u9645\u4F1A\u7528**\u7684\u90A3\u4E2A\u6A21\u578B\uFF1A\n * \u9996\u8F6E/\u6B21\u8F6E\u884C\u53D6 /route\uFF0C\u8FFD\u95EE\u884C\u53D6 /route?chat=1\u3002\u4E24\u4E2A\u4F1A\u8BDD\u7528\u4E0D\u540C\u6A21\u578B\u65F6\u5404\u62A5\u5404\u7684\u3002\n */\n function paintModelPick(entry) {\n if (!entry.label) return\n var pair = pairOf(entry)\n if (pair) {\n entry.label.textContent = modelLabel(pair.provider, pair.model, entry.catalog)\n return\n }\n var base = followLabelOf(entry)\n var route = entry.route\n entry.label.textContent = route && route.provider && route.model\n ? base + '\uFF08\u5F53\u524D\uFF1A' + modelLabel(route.provider, route.model, entry.catalog) + '\uFF09'\n : base\n }\n\n /** \u5173\u6389\u6240\u6709\u6A21\u578B\u4E0B\u62C9\uFF08\u540C\u4E00\u65F6\u523B\u53EA\u5141\u8BB8\u5F00\u4E00\u4E2A\uFF09\u3002 */\n function closeModelPicks() {\n Object.keys(settingsByKey).forEach(function (key) {\n var entry = settingsByKey[key]\n if (entry && entry.menu) {\n entry.menu.setAttribute('data-open', '0')\n if (entry.button) entry.button.setAttribute('aria-expanded', 'false')\n }\n })\n }\n\n /**\n * \u53D6\"\u8FD9\u4E00\u884C\u73B0\u5728\u5B9E\u9645\u4F1A\u7528\u54EA\u4E2A\u6A21\u578B\"\uFF08\u8F7B\u91CF\u7AEF\u70B9\uFF0C\u53EF\u9AD8\u9891\u8F6E\u8BE2\uFF09\u3002\n *\n * \u7528 /route \u800C\u4E0D\u662F /models\uFF1A\u540E\u8005\u8981\u5217 provider \u4E0E\u5168\u90E8\u6A21\u578B\uFF0842 \u4E2A + \u7AEF\u70B9\u53D1\u73B0\uFF09\uFF0C\n * \u6309\u79D2\u8F6E\u8BE2\u592A\u91CD\u3002\u8FD9\u91CC\u53EA\u505A\u4E00\u6B21\u4F1A\u8BDD\u6A21\u578B\u89E3\u6790\u3002\n */\n function fetchRoute(sessionId, isChat) {\n var query = []\n if (sessionId) query.push('sessionId=' + encodeURIComponent(sessionId))\n if (isChat) query.push('chat=1')\n return fetch(ROUTE + (query.length ? '?' + query.join('&') : ''), { headers: { accept: 'application/json' } })\n .then(function (response) { return response.json() })\n .then(function (data) {\n if (!data || data.ok === false) return null\n return { provider: String(data.provider || ''), model: String(data.model || '') }\n })\n .catch(function () { return null })\n }\n\n /**\n * \u628A\"\u8DDF\u968F\u4E3B\u4F1A\u8BDD\"\u89E3\u6790\u51FA\u6765\u7684\u8DEF\u7531\u8D34\u5230\u754C\u9762\u4E0A\u3002\n *\n * \u8DDF\u968F\u6001\u6709\u4E24\u4E2A\u5730\u65B9\u663E\u793A\u5B83\uFF0C**\u4E24\u5904\u90FD\u8981\u8D34**\uFF1A\n * \u00B7 \u62BD\u5C49\u91CC\u90A3\u4E00\u884C\u7684\u300C\u8DDF\u968F\u4E3B\u4F1A\u8BDD\uFF08\u5F53\u524D\uFF1A\u2026\uFF09\u300D\n * \u00B7 **\u8F93\u5165\u6846\u90A3\u679A\u6A21\u578B\u80F6\u56CA**\uFF08\u8DDF\u968F\u6001\u5B83\u663E\u793A\u7684\u5C31\u662F\u8FD9\u4E2A\u503C\uFF09\n * \u5206\u5F00\u8D34\u662F\u6709\u539F\u56E0\u7684\uFF1A\u4EE5\u524D\u80F6\u56CA\u7684\u66F4\u65B0\u5199\u5728\u62BD\u5C49\u90A3\u884C\u7684 `if (!item.entry) return` \u4E4B\u540E \u2014\u2014\n * \u8BBE\u7F6E\u6CA1\u6E32\u67D3\u51FA\u6765\uFF08/settings \u5931\u8D25\uFF09\u65F6\u80F6\u56CA\u5C31\u6C38\u8FDC\u4E0D\u8DDF\u7740\u53D8\uFF1B\u8FD9\u91CC\u5404\u7BA1\u5404\u7684\u3002\n */\n function applyFollowRoute(route) {\n if (!route || !route.provider || !route.model) return\n // \u9009\u4E86\u5177\u4F53\u6A21\u578B\u65F6\u80F6\u56CA\u663E\u793A\u7684\u662F\u90A3\u4E2A\u6A21\u578B\uFF0C\u4E0D\u663E\u793A\"\u8DDF\u968F\uFF08\u5F53\u524D\uFF1A\u2026\uFF09\"\n if (!env.state.modelChoice) {\n var before = env.modelCatalog.current\n if (!before || before.provider !== route.provider || before.model !== route.model) {\n env.modelCatalog.current = route\n env.paintModelPill()\n }\n }\n var entry = settingsByKey.modelChoice\n if (!entry) return\n var old = entry.route\n if (old && old.provider === route.provider && old.model === route.model) return\n entry.route = route\n paintModelPick(entry)\n }\n\n /**\n * \u5237\u65B0\u4E00\u4E2A\u6A21\u578B\u884C\uFF1A\u6E05\u5355\uFF08\u5E26\u7F13\u5B58\uFF09+ \u672C\u884C\u5F53\u524D\u503C\uFF08\u6BCF\u6B21\u90FD\u65B0\u53D6\uFF09\u2192 \u753B\u6309\u94AE\u3001\u5FC5\u8981\u65F6\u91CD\u5EFA\u5217\u8868\u3002\n *\n * `forceRoute` \u4E3A\u771F\u65F6\u8FDE\u6E05\u5355\u4E5F\u5F3A\u5236\u91CD\u53D6\uFF08\u5F00\u62BD\u5C49\u90A3\u4E00\u6B21\u7528\uFF09\u3002\n */\n function refreshModelRow(entry, forceRoute) {\n if (!entry) return\n var isChat = false\n var sessionId = env.panelSessionId || env.currentSessionId()\n env.loadModelCatalog(!!forceRoute, sessionId).then(function (catalog) {\n // **\u5FEB\u7167**\uFF0C\u4E0D\u662F\u76F4\u63A5\u62FF modelCatalog \u90A3\u4E2A\u5355\u4F8B\uFF1A\n // \u53E6\u4E00\u884C\u7A0D\u540E\u4F1A\u5E26\u7740\u81EA\u5DF1\u7684\u4F1A\u8BDD\u518D\u62C9\u4E00\u6B21\uFF0C\u90A3\u4F1A\u628A\u5355\u4F8B\u4E0A\u7684\u5B57\u6BB5\u6539\u6389\u3002\n entry.catalog = {\n current: catalog.current,\n items: catalog.items,\n sessionId: sessionId,\n error: catalog.error,\n }\n if (entry.filledSession !== sessionId) {\n entry.filledSession = sessionId\n entry.filled = false\n entry.rows = []\n }\n if (forceRoute) entry.filled = false\n fillModelMenu(entry, entry.catalog)\n paintModelPick(entry)\n paintEffortMapHint()\n })\n fetchRoute(sessionId, isChat).then(applyFollowRoute)\n }\n\n /** \u6309\u6E05\u5355\u628A\u4E0B\u62C9\u5217\u8868\u586B\u597D\uFF08\u6E05\u5355\u662F\u5F02\u6B65\u6765\u7684\uFF0C\u53EF\u80FD\u665A\u4E8E\u6E32\u67D3\uFF09\u3002 */\n function fillModelMenu(entry, catalog) {\n if (!entry.menu || entry.filled) return\n entry.filled = true\n var list = entry.list\n clearNode(list)\n entry.rows = []\n var items = (catalog && catalog.items) || []\n if (items.length === 0) {\n list.appendChild(el('div', 'dsh-sel-spickempty',\n catalog && catalog.error ? '\u8BFB\u53D6\u5931\u8D25\uFF1A' + catalog.error : '\u6CA1\u6709\u53D6\u5230\u53EF\u7528\u6A21\u578B\u6E05\u5355'))\n return\n }\n // \u7B2C\u4E00\u9879\u6C38\u8FDC\u662F\"\u8DDF\u968F\"\uFF1A\u5B83\u4E0D\u662F\u4E00\u4E2A\u6A21\u578B\uFF0C\u800C\u662F\"\u6E05\u7A7A\u8FD9\u4E00\u884C\u7684\u4E24\u4E2A\u5B57\u6BB5\"\n list.appendChild(modelPickRow(entry, null))\n for (var i = 0; i < items.length; i += 1) list.appendChild(modelPickRow(entry, items[i]))\n }\n\n /** \u4E00\u884C\u6A21\u578B\uFF08item \u4E3A null = \u300C\u8DDF\u968F\u2026\u300D\uFF09\u3002 */\n function modelPickRow(entry, item) {\n var row = el('button', 'dsh-sel-spickrow')\n row.type = 'button'\n row.setAttribute('role', 'option')\n var pair = pairOf(entry)\n var on = item\n ? !!pair && pair.provider === item.provider && pair.model === item.model\n : !pair\n row.setAttribute('data-on', on ? '1' : '0')\n row.setAttribute('aria-selected', on ? 'true' : 'false')\n row.appendChild(el('span', 'dsh-sel-spickcheck', on ? '\u2713' : ''))\n row.appendChild(el('span', 'dsh-sel-spickrowname', item ? String(item.name || item.model) : followLabelOf(entry)))\n if (item) row.appendChild(el('span', 'dsh-sel-spickprov', String(item.providerName || item.provider || '')))\n listen(row, 'click', function (event) {\n event.preventDefault()\n event.stopPropagation()\n var keys = entry.spec.keys || []\n if (item) {\n settingsLive[keys[0]] = String(item.provider || '')\n settingsLive[keys[1]] = String(item.model || '')\n } else {\n settingsLive[keys[0]] = ''\n settingsLive[keys[1]] = ''\n }\n repaintModelMenu(entry)\n paintModelPick(entry)\n closeModelPicks()\n syncComposerModel()\n renderSettingsNote('')\n scheduleSettingsSave()\n })\n if (item) entry.rows.push(item)\n return row\n }\n\n /** \u5C31\u5730\u91CD\u753B\u8FD9\u4E00\u884C\u5217\u8868\u7684\u52FE\u9009\uFF08\u4E0D\u91CD\u5EFA\u8282\u70B9\uFF0C\u7701\u5F97\u4E22\u7126\u70B9/\u6EDA\u52A8\u4F4D\u7F6E\uFF09\u3002 */\n function repaintModelMenu(entry) {\n if (!entry.list) return\n var pair = pairOf(entry)\n var rows = entry.list.children\n for (var i = 0; i < rows.length; i += 1) {\n var item = i === 0 ? null : (entry.rows[i - 1] || null)\n var on = item\n ? !!pair && pair.provider === item.provider && pair.model === item.model\n : !pair\n rows[i].setAttribute('data-on', on ? '1' : '0')\n rows[i].setAttribute('aria-selected', on ? 'true' : 'false')\n var check = rows[i].firstChild\n if (check) check.textContent = on ? '\u2713' : ''\n }\n }\n\n /**\n * \u5F00 / \u5173\u6A21\u578B\u4E0B\u62C9\u3002\n *\n * \u83DC\u5355\u6302\u5728**\u62BD\u5C49**\u4E0A\u800C\u4E0D\u662F\u884C\u91CC\uFF1A\u884C\u7684\u7956\u5148\u94FE\u4E0A\u6709 `overflow:auto` \u7684\u6EDA\u52A8\u533A\uFF0C\n * \u6D6E\u5C42\u653E\u5728\u884C\u91CC\u4F1A\u88AB\u90A3\u4E2A\u6EDA\u52A8\u533A\u88C1\u6389\uFF08\u8FD9\u6B63\u662F\"\u770B\u4E0D\u5230\u6EDA\u52A8\u6761\"\u7684\u4E00\u79CD\u6210\u56E0\uFF09\u3002\n * \u4F4D\u7F6E\u6309\u6309\u94AE\u7684\u5B9E\u6D4B\u77E9\u5F62\u7B97\uFF0C\u9AD8\u5EA6\u6309\"\u62BD\u5C49\u5E95\u90E8\u8FD8\u5269\u591A\u5C11\"\u7ED9 \u2014\u2014 \u4E8E\u662F\u5217\u8868\u4E00\u5B9A\u6EDA\u5F97\u52A8\u3002\n */\n function toggleModelMenu(entry) {\n if (!entry.menu) return\n var wasOpen = entry.menu.getAttribute('data-open') === '1'\n closeModelPicks()\n if (wasOpen) return\n var sheetRect = env.settingsSheet.getBoundingClientRect()\n var btnRect = entry.button.getBoundingClientRect()\n var left = btnRect.left - sheetRect.left\n var width = btnRect.width\n entry.menu.style.left = String(Math.max(6, left)) + 'px'\n entry.menu.style.width = String(Math.max(140, width)) + 'px'\n // \u4F18\u5148\u5411\u4E0B\u5F39\uFF1B\u4E0B\u65B9\u653E\u4E0D\u4E0B\uFF08\u7A97\u53E3\u77EE / \u884C\u8D34\u7740\u5E95\uFF09\u5C31\u7FFB\u5230\u6309\u94AE**\u4E0A\u65B9** \u2014\u2014\n // \u5426\u5219\u6D6E\u5C42\u4F1A\u88AB\u9762\u677F\u7684 overflow:hidden \u5207\u6389\u4E00\u622A\uFF0C\u770B\u8D77\u6765\u53C8\u50CF\"\u6CA1\u6709\u6EDA\u52A8\u6761\"\u3002\n var roomBelow = sheetRect.bottom - btnRect.bottom - 18\n if (roomBelow >= 140) {\n entry.menu.style.top = String(btnRect.bottom - sheetRect.top + 6) + 'px'\n entry.menu.style.bottom = ''\n entry.menu.style.maxHeight = String(roomBelow) + 'px'\n } else {\n var roomAbove = btnRect.top - sheetRect.top - 18\n entry.menu.style.top = ''\n entry.menu.style.bottom = String(sheetRect.bottom - btnRect.top + 6) + 'px'\n entry.menu.style.maxHeight = String(Math.max(140, roomAbove)) + 'px'\n }\n entry.menu.setAttribute('data-open', '1')\n entry.button.setAttribute('aria-expanded', 'true')\n }\n\n /**\n * \u6A21\u578B\u5728\u4E0B\u62C9\u91CC\u7684\u663E\u793A\u540D\u3002\n *\n * \u4F18\u5148\u7528 host \u7ED9\u7684\u4EBA\u7C7B\u53EF\u8BFB\u540D\uFF08`name`\uFF09\uFF0C\u6CA1\u6709\u5C31\u9000\u56DE `provider / model` \u2014\u2014\n * \u6E05\u5355\u91CC 42 \u4E2A\u6A21\u578B\u8DE8\u597D\u51E0\u4E2A provider\uFF0C\u53EA\u5199\u6A21\u578B\u540D\u4F1A\u5206\u4E0D\u6E05\u540C\u540D\u9879\u3002\n */\n function modelLabel(provider, model, catalog) {\n var items = (catalog && catalog.items) || env.modelCatalog.items || []\n for (var i = 0; i < items.length; i += 1) {\n if (items[i].provider === provider && items[i].model === model) {\n var name = String(items[i].name || items[i].model || '')\n var pname = String(items[i].providerName || provider || '')\n return items[i].providerName && items[i].providerName !== name ? pname + ' \u00B7 ' + name : name\n }\n }\n return (provider ? provider + ' / ' : '') + model\n }\n\n /**\n * \u8BBE\u7F6E\u9875\u90A3\u884C\"\u56DB\u683C \u2192 \u5F53\u524D\u6A21\u578B\u7684\u771F\u5B9E\u6863\u4F4D\"\u3002\n *\n * \u6620\u5C04\u662F **host \u6309\u6A21\u578B\u58F0\u660E\u5B9E\u65F6\u7B97\u7684**\uFF1A`/models` \u91CC\u6BCF\u4E2A\u6A21\u578B\u5E26\u4E00\u4EFD `effortMap`\n * \uFF08\u89C1 host \u7684 mapEffortToModel \u2014\u2014 \u5B83\u53EA\u5403\"\u8FD9\u4E2A\u6A21\u578B\u81EA\u5DF1\u58F0\u660E\u7684\u6863\u4F4D\u5217\u8868\"\uFF0C\n * \u540D\u5B57\u8BA4\u4E0D\u51FA\u5C31\u6309\u4F4D\u7F6E\u63D2\u503C\uFF0C\u6240\u4EE5\u4EFB\u4F55\u7528\u6237\u6362\u4EFB\u4F55\u6A21\u578B\u90FD\u6709\u843D\u70B9\uFF09\u3002\n * \u5BA2\u6237\u7AEF\u53EA\u8D1F\u8D23\u663E\u793A\uFF0C\u63D2\u4EF6\u91CC**\u6CA1\u6709**\u4EFB\u4F55\u6309\u6A21\u578B\u5199\u6B7B\u7684\u8868\uFF1B\u6362\u6A21\u578B / \u6362\u4F1A\u8BDD\u7ACB\u523B\u8DDF\u7740\u53D8\u3002\n */\n /** \u6A21\u578B\u81EA\u5DF1\u7ED9\u8FD9\u4E2A\u6863\u4F4D\u7684\u540D\u5B57\uFF08\u6E05\u5355\u91CC\u6CA1\u6709\u5C31\u7528 id\uFF09\u2014\u2014\u300C\u601D\u8003\u5F3A\u5EA6\u300D\u90A3\u884C\u6620\u5C04\u63D0\u793A\u4E13\u7528\u3002 */\n function modelTierNameOf(item, id) {\n var efforts = (item && item.efforts) || []\n for (var i = 0; i < efforts.length; i += 1) {\n if (efforts[i].id === id) return String(efforts[i].name || efforts[i].id)\n }\n return String(id)\n }\n\n /**\n * \u6539\u300C\u8FFD\u95EE\u300D\u7684\u601D\u8003\u5F3A\u5EA6 \u2014\u2014 **\u552F\u4E00**\u7684\u5199\u5165\u53E3\uFF08\u8BBE\u7F6E\u9875\u90A3\u4E00\u884C\u4E0E\u5C0F\u7A97\u90A3\u4E2A\u63A7\u4EF6\u5171\u7528\uFF09\u3002\n *\n * \u4E24\u5904\u8BFB\u5199\u7684\u662F**\u540C\u4E00\u4E2A\u503C**\uFF1Ahost \u914D\u7F6E `chatReasoningEffort`\uFF08\u56DB\u4E2A\u683C\u5B50\u4E4B\u4E00\uFF09\u3002\n * \u4E8E\u662F\u4E0D\u5B58\u5728\"\u4E24\u8FB9\u5404\u5199\u5404\u7684\"\uFF0C\u4E5F\u4E0D\u9700\u8981\u4EFB\u4F55\u53CD\u5411\u6620\u5C04 \u2014\u2014 \u4E00\u8FB9\u6539\uFF0C\u53E6\u4E00\u8FB9\u91CD\u753B\u4E00\u6B21\u5C31\u540C\u6B65\u4E86\u3002\n * `state.effort` \u53EA\u662F\u8FD9\u4E2A\u503C\u7684**\u5185\u5B58\u955C\u50CF**\uFF08\u53D1\u8BF7\u6C42\u65F6\u968F body.effort \u5E26\u4E0A\uFF0C\u514D\u5F97\u5B58\u76D8\u8FD8\u6CA1\u56DE\u6765\n * \u5C31\u53D1\u4E86\u8BF7\u6C42\uFF1B\u5217\u8868\u8BFB\u5230 `stages.chat` \u4E4B\u524D\u4E5F\u9760\u5B83\u515C\u5E95\uFF09\u3002\n */\n function setChatSlot(slot) {\n settingsLive.chatReasoningEffort = slot\n env.state.effort = slot\n var entry = settingsByKey.chatReasoningEffort\n if (entry) {\n setControlValue('chatReasoningEffort', slot)\n paintSegPill(entry)\n }\n if (env.modelMenu.getAttribute('data-open') === '1') env.renderModelMenu()\n renderSettingsNote('')\n scheduleSettingsSave()\n }\n\n /** \u5F53\u524D\u300C\u8FFD\u95EE\u300D\u6863\u4F4D\uFF1A\u5185\u5B58\u955C\u50CF \u2192 \u914D\u7F6E \u2192 /models \u62A5\u7684\u914D\u7F6E\u503C\uFF08\u90FD\u662F\u56DB\u4E2A\u683C\u5B50\u4E4B\u4E00\uFF09\u3002 */\n function chatSlot() {\n return env.state.effort || settingsLive.chatReasoningEffort || (env.modelCatalog.stages && env.modelCatalog.stages.chat) || ''\n }\n\n function paintEffortMapHint() {\n if (!settingsEffortHints.length) return\n var choice = env.state.modelChoice\n if (!choice && env.modelCatalog.current && env.modelCatalog.current.provider && env.modelCatalog.current.model) {\n choice = { provider: String(env.modelCatalog.current.provider), model: String(env.modelCatalog.current.model) }\n }\n var item = choice ? env.catalogItemOf(choice.provider, choice.model) : null\n var text = ''\n if (!item) {\n text = env.modelCatalog.error\n ? '\u8BFB\u4E0D\u5230\u6A21\u578B\u6E05\u5355\uFF08' + env.modelCatalog.error + '\uFF09\uFF1A\u6682\u65F6\u6309\u539F\u6863\u4F4D\u53D1\u9001\uFF0C\u88AB\u62D2\u65F6\u81EA\u52A8\u6362\u6863'\n : '\u6B63\u5728\u8BFB\u53D6\u8BE5\u6A21\u578B\u7684\u6863\u4F4D\u2026'\n } else if (item.hasReasoning === false) {\n text = '\u8BE5\u6A21\u578B\u4E0D\u652F\u6301\u601D\u8003\u5F3A\u5EA6\uFF1A\u8FD9\u56DB\u4E2A\u683C\u5B50\u5BF9\u5B83\u4E0D\u751F\u6548\uFF08\u4E0D\u4F1A\u53D1\u9001\u6863\u4F4D\uFF09'\n } else if (item.effortMap && item.effortMap[SLOT_ORDER[0]]) {\n var parts = []\n for (var i = 0; i < SLOT_ORDER.length; i += 1) {\n var slot = SLOT_ORDER[i]\n var actual = item.effortMap[slot]\n // \u53F3\u8FB9\u7528**\u6A21\u578B\u81EA\u5DF1\u7684\u6863\u4F4D\u540D**\uFF08Off/Low/Xhigh\u2026\uFF09\uFF0C\u4E0D\u8981\u6362\u6210\u6211\u4EEC\u7684\u300C\u4F4E/\u9AD8\u300D\u2014\u2014\n // \u5426\u5219\"\u5173 \u2192 \u4F4E\"\u8FD9\u79CD\u770B\u7740\u50CF\u6052\u7B49\u6620\u5C04\uFF0C\u5B9E\u9645\u843D\u5230\u7684\u662F\u6A21\u578B\u7684 low \u6863\n parts.push(SLOT_LABEL[slot] + ' \u2192 ' + (actual ? modelTierNameOf(item, actual) : '\u2014'))\n }\n text = '\u5F53\u524D\u6A21\u578B\uFF1A' + parts.join(' \u00B7 ')\n } else {\n text = '\u6682\u672A\u8BFB\u5230\u8BE5\u6A21\u578B\u58F0\u660E\u7684\u6863\u4F4D\uFF1A\u5148\u6309\u539F\u6863\u4F4D\u53D1\u9001\uFF0C\u88AB\u62D2\u65F6\u81EA\u52A8\u6362\u6863\u91CD\u8BD5'\n }\n for (var h = 0; h < settingsEffortHints.length; h += 1) settingsEffortHints[h].textContent = text\n }\n\n function settingsDirtyCount() {\n var n = 0\n Object.keys(settingsLive).forEach(function (key) {\n if (settingsSaved[key] !== settingsLive[key]) n += 1\n })\n return n\n }\n\n function renderSettingsNote(state) {\n var n = settingsDirtyCount()\n env.settingsNote.setAttribute('data-dirty', state === 'error' || n > 0 ? '1' : '0')\n if (state === 'saving') env.settingsNoteText.textContent = '\u4FDD\u5B58\u4E2D\u2026'\n else if (state === 'error') env.settingsNoteText.textContent = '\u4FDD\u5B58\u5931\u8D25\uFF0C\u6539\u52A8\u672A\u751F\u6548'\n else if (n > 0) env.settingsNoteText.textContent = '\u672A\u4FDD\u5B58 \u00B7 ' + String(n) + ' \u9879'\n else env.settingsNoteText.textContent = '\u6539\u52A8\u4F1A\u81EA\u52A8\u4FDD\u5B58'\n }\n\n /**\n * \u628A\u670D\u52A1\u7AEF\u8FD4\u56DE\u7684\u4E00\u7EC4\u503C\u94FA\u5230**\u6240\u6709**\u63A7\u4EF6\u4E0A\uFF08\u4FDD\u5B58\u6210\u529F\u3001\u6062\u590D\u9ED8\u8BA4\u90FD\u8D70\u5B83\uFF09\u3002\n *\n * \u4E3A\u4EC0\u4E48\u4E0D\u80FD\u53EA\u6309\u8FD4\u56DE\u7684\u952E\u9010\u4E2A setControlValue\uFF1A\u6A21\u578B\u884C\u7684\u6761\u76EE key \u662F\u865A\u62DF\u7684\n * \uFF08modelChoice\uFF09\uFF0C\u800C\u670D\u52A1\u7AEF\u8FD4\u56DE\u7684\u662F\u5B83\u5E95\u4E0B\u7684 provider/model \u2014\u2014\n * \u6309\u540E\u8005\u67E5\u6761\u76EE**\u67E5\u4E0D\u5230**\uFF0C\u4E8E\u662F\"\u6062\u590D\u9ED8\u8BA4\"\u4E4B\u540E\u6A21\u578B\u4E0B\u62C9\u7EB9\u4E1D\u4E0D\u52A8\uFF08\u7528\u6237\u62A5\u7684\u95EE\u9898\uFF09\u3002\n * \u6240\u4EE5\u8FD9\u91CC\u5148\u6574\u4F53\u66F4\u65B0 settingsLive/settingsSaved\uFF0C\u518D\u6309**\u6761\u76EE**\u91CD\u753B\u4E00\u904D\u3002\n */\n function applyServerValues(values, sent) {\n Object.keys(values || {}).forEach(function (key) {\n settingsSaved[key] = values[key]\n if (!sent || settingsLive[key] === sent[key]) settingsLive[key] = values[key]\n })\n Object.keys(settingsByKey).forEach(function (key) {\n var entry = settingsByKey[key]\n if (!entry) return\n if (entry.spec.kind === 'model') {\n paintModelPick(entry)\n repaintModelMenu(entry)\n } else {\n setControlValue(key, settingsLive[key])\n }\n })\n updateSettingDependencies()\n syncComposerModel()\n // \u300C\u8FFD\u95EE\u300D\u6863\u4F4D\u7684\u5185\u5B58\u955C\u50CF\u8DDF\u7740\u914D\u7F6E\u8D70\uFF08\u56DB\u4E2A\u683C\u5B50\u4E4B\u4E00\uFF1B\u5217\u8868\u8BFB\u5230 stages.chat \u4E4B\u524D\u4E5F\u9760\u5B83\u515C\u5E95\uFF09\n env.state.effort = settingsLive.chatReasoningEffort || ''\n applySelectionLimit(settingsLive)\n if (!env.state.modelChoice) refreshModelRow(settingsByKey.modelChoice, true)\n env.bridgeOn = settingsLive.bridgeSidebarPreview !== false\n if (env.bridgeOn) env.scheduleBridgeScan()\n }\n\n function applySelectionLimit(values) {\n var max = Number(values && values.maxSelectionChars)\n if (isFinite(max) && max > 0) preferences.maxSelectionChars = max\n }\n\n function syncComposerModel() {\n var provider = settingsLive.provider\n var model = settingsLive.model\n env.state.modelChoice = provider && model ? { provider: String(provider), model: String(model) } : null\n env.paintModelPill()\n }\n\n function chooseSharedModel(choice) {\n settingsLive.provider = choice ? String(choice.provider || '') : ''\n settingsLive.model = choice ? String(choice.model || '') : ''\n syncComposerModel()\n var entry = settingsByKey.modelChoice\n if (entry) { paintModelPick(entry); repaintModelMenu(entry) }\n paintEffortMapHint()\n loadSettings(false)\n renderSettingsNote('')\n scheduleSettingsSave()\n }\n\n function updateSettingDependencies() {\n Object.keys(settingsByKey).forEach(function (key) {\n var entry = settingsByKey[key]\n var disabled = !!entry.spec.enabledBy && settingsLive[entry.spec.enabledBy] === false\n if (entry.row) entry.row.setAttribute('data-disabled', disabled ? '1' : '0')\n if (entry.input) entry.input.disabled = disabled\n })\n }\n\n /** \u628A\u4E00\u4E2A\u503C\u5199\u8FDB\u63A7\u4EF6\uFF08\u9996\u6E32\u67D3\u4E0E\u300C\u6062\u590D\u9ED8\u8BA4\u300D\u5171\u7528\uFF09\u3002 */\n function setControlValue(key, value) {\n var entry = settingsByKey[key]\n if (!entry) return\n if (entry.spec.kind === 'switch') {\n entry.input.setAttribute('aria-checked', value === true ? 'true' : 'false')\n return\n }\n if (entry.spec.kind === 'seg') {\n entry.seg.setAttribute('data-value', value === undefined || value === null ? '' : String(value))\n paintSegPill(entry)\n return\n }\n if (entry.spec.kind === 'model') {\n // \u6309\u94AE\u6587\u5B57\u4E0E\u5217\u8868\u52FE\u9009\u90FD\u8DDF\u7740 settingsLive \u8D70\n paintModelPick(entry)\n repaintModelMenu(entry)\n return\n }\n // \u914D\u7F6E\u5355\u4F4D \u2192 \u663E\u793A\u5355\u4F4D\uFF08\u65F6\u95F4\u7EDF\u4E00\u6309\u79D2\u663E\u793A\uFF0C\u89C1 SettingSpec.scale\uFF09\n var shown = value\n var scale = entry.spec.scale || 1\n if (scale !== 1 && typeof value === 'number' && isFinite(value)) shown = value / scale\n entry.input.value = shown === undefined || shown === null ? '' : String(shown)\n }\n\n /**\n * \u5206\u6BB5\u63A7\u4EF6\u7684\u6ED1\u5757\uFF1A\u91CF\u5F53\u524D\u9009\u4E2D\u683C\u7684\u4F4D\u7F6E\u518D\u6446\u3002\n *\n * \u683C\u5B50\u662F**\u9690\u85CF\u65F6\u91CF\u4E0D\u5230\u5BBD\u5EA6**\u7684\uFF08display:none \u7684\u7236\u8282\u70B9\u91CC offsetWidth \u662F 0\uFF09\uFF0C\n * \u6240\u4EE5\u5207\u9875\u4E4B\u540E\u8981\u91CD\u6446\u4E00\u6B21\uFF08\u89C1 showSettingsTab\uFF09\u3002\n */\n function paintSegPill(entry) {\n if (!entry.seg || !entry.pill) return\n var value = entry.seg.getAttribute('data-value')\n var on = null\n for (var i = 0; i < entry.cells.length; i += 1) {\n var picked = entry.cells[i].getAttribute('data-value') === value\n entry.cells[i].setAttribute('aria-checked', picked ? 'true' : 'false')\n if (picked) on = entry.cells[i]\n }\n // \u503C\u4E0D\u5728\u56DB\u683C\u91CC\uFF08\u5C0F\u7A97\u9009\u4E86\u6A21\u578B\u81EA\u5DF1\u7684 medium/xhigh \u8FD9\u79CD\uFF09\uFF1A\u4E00\u4E2A\u683C\u5B50\u90FD\u4E0D\u70B9\u4EAE\u3001\n // \u6ED1\u5757\u4E5F\u6536\u8D77\u6765 \u2014\u2014 \u7559\u7740\u4E0A\u4E00\u6B21\u7684\u4F4D\u7F6E\u4F1A\u5047\u88C5\u5B83\u8FD8\u9009\u4E2D\u7740\n if (!on) {\n entry.pill.style.display = 'none'\n return\n }\n entry.pill.style.display = ''\n entry.pill.style.left = String(on.offsetLeft) + 'px'\n entry.pill.style.width = String(on.offsetWidth) + 'px'\n }\n\n /** \u4E00\u884C\u8BBE\u7F6E\uFF08\u6309 spec.kind \u9020\u5BF9\u5E94\u63A7\u4EF6\uFF09\u3002 */\n function buildSettingRow(spec) {\n var row = el('div', 'dsh-sel-srow')\n var lab = el('div', 'dsh-sel-srowlab')\n lab.appendChild(el('div', 'dsh-sel-srowt', spec.label))\n if (spec.hint) lab.appendChild(el('div', 'dsh-sel-srowd', spec.hint))\n if (spec.kind === 'model') lab.style.display = 'none'\n var ctl = el('div', 'dsh-sel-srowctl')\n row.appendChild(lab)\n row.appendChild(ctl)\n\n if (spec.kind === 'model') {\n // \u6A21\u578B\u9009\u62E9\uFF1A\u4E00\u4E2A\u4E0B\u62C9\u540C\u65F6\u5B9A provider + model\uFF08\u89C1 settings.ts \u7684 keys\uFF09\u3002\n // \u76F4\u63A5\u5217 host \u5DF2\u6709\u7684\u6A21\u578B\u6E05\u5355 \u2014\u2014 \u7528\u6237\u4E0D\u5FC5\u8BB0\u4F4F provider id \u4E0E model id \u600E\u4E48\u62FC\u3002\n row.setAttribute('data-wide', '1')\n var pick = el('button', 'dsh-sel-spick')\n pick.type = 'button'\n pick.setAttribute('aria-label', spec.label)\n pick.setAttribute('aria-haspopup', 'listbox')\n pick.setAttribute('aria-expanded', 'false')\n var pickName = el('span', 'dsh-sel-spickname', '\u8DDF\u968F\u4E3B\u4F1A\u8BDD')\n pick.appendChild(pickName)\n pick.appendChild(el('span', 'dsh-sel-spickcaret', '\u25BE'))\n // \u83DC\u5355\u6302\u5230**\u62BD\u5C49**\u4E0A\uFF08\u4E0D\u662F\u884C\u91CC\uFF09\uFF1A\u884C\u5728 overflow:auto \u7684\u6EDA\u52A8\u533A\u91CC\uFF0C\u6D6E\u5C42\u4F1A\u88AB\u88C1\u6389\n var pickMenu = el('div', 'dsh-sel-spickmenu')\n pickMenu.setAttribute('data-open', '0')\n pickMenu.setAttribute('role', 'listbox')\n pickMenu.setAttribute('aria-label', spec.label)\n var pickList = el('div', 'dsh-sel-spicklist')\n pickMenu.appendChild(el('div', 'dsh-sel-spickgroup', '\u6A21\u578B'))\n pickMenu.appendChild(pickList)\n env.settingsSheet.appendChild(pickMenu)\n settingsMenus.push(pickMenu)\n var entryModel = {\n spec: spec, row: row, button: pick, label: pickName,\n list: pickList, menu: pickMenu, filled: false, catalog: null, rows: [],\n }\n listen(pick, 'click', function (event) {\n event.preventDefault()\n event.stopPropagation()\n toggleModelMenu(entryModel)\n })\n ctl.appendChild(pick)\n settingsByKey[spec.key] = entryModel\n // \u62C9\u6E05\u5355 + \u53D6\u672C\u884C\u5F53\u524D\u503C\uFF0C\u5E76\u6309**\u672C\u5C0F\u7A97\u6240\u5C5E\u4F1A\u8BDD**\u753B\u6309\u94AE\u6587\u5B57\u3002\n // \u5F00\u62BD\u5C49\u65F6\u8FD8\u4F1A\u518D\u8DD1\u4E00\u904D\uFF08\u89C1 openSettings\uFF09\uFF0C\u8F6E\u8BE2\u4E5F\u4F1A\u6301\u7EED\u5237\u65B0\u3002\n refreshModelRow(entryModel, false)\n return row\n }\n\n if (spec.kind === 'switch') {\n var sw = el('button', 'dsh-sel-sws')\n sw.type = 'button'\n sw.setAttribute('role', 'switch')\n sw.setAttribute('aria-label', spec.label)\n sw.setAttribute('aria-checked', 'false')\n listen(sw, 'click', function () {\n var on = sw.getAttribute('aria-checked') === 'true'\n sw.setAttribute('aria-checked', on ? 'false' : 'true')\n settingsLive[spec.key] = !on\n updateSettingDependencies()\n renderSettingsNote('')\n scheduleSettingsSave()\n })\n ctl.appendChild(sw)\n settingsByKey[spec.key] = { spec: spec, row: row, input: sw }\n return row\n }\n\n if (spec.kind === 'seg') {\n var seg = el('span', 'dsh-sel-seg')\n seg.setAttribute('role', 'radiogroup')\n seg.setAttribute('aria-label', spec.label)\n seg.setAttribute('data-value', '')\n var pill = el('span', 'dsh-sel-segpill')\n seg.appendChild(pill)\n var entry = { spec: spec, row: row, seg: seg, pill: pill, cells: [] }\n var options = spec.options || []\n options.forEach(function (option) {\n var cell = el('button', 'dsh-sel-segcell', SLOT_LABEL[option] || option)\n cell.type = 'button'\n cell.setAttribute('role', 'radio')\n cell.setAttribute('data-value', option)\n cell.setAttribute('aria-checked', 'false')\n listen(cell, 'click', function () {\n seg.setAttribute('data-value', option)\n paintSegPill(entry)\n settingsLive[spec.key] = option\n // \u4E0E\u5C0F\u7A97\u90A3\u4E2A\u63A7\u4EF6\u5171\u7528\u540C\u4E00\u4E2A\u5199\u5165\u53E3\uFF08\u540C\u4E00\u4EFD\u6570\u636E\uFF1A\u914D\u7F6E\u91CC\u7684 chatReasoningEffort\uFF09\n if (spec.key === 'chatReasoningEffort') { setChatSlot(option); env.paintModelPill() }\n renderSettingsNote('')\n scheduleSettingsSave()\n })\n seg.appendChild(cell)\n entry.cells.push(cell)\n })\n ctl.appendChild(seg)\n settingsByKey[spec.key] = entry\n settingsSegs.push(entry)\n return row\n }\n\n var input = el(spec.key === 'toolNames' ? 'textarea' : 'input', spec.kind === 'number' ? 'dsh-sel-snum' : 'dsh-sel-stext')\n if (spec.key === 'toolNames') input.setAttribute('rows', '2')\n var numScale = spec.scale || 1\n if (spec.kind === 'number') {\n input.type = 'number'\n // \u8FB9\u754C\u6309**\u663E\u793A\u5355\u4F4D**\u7ED9\uFF08\u914D\u7F6E\u91CC\u662F\u6BEB\u79D2\uFF0C\u754C\u9762\u6309\u79D2\uFF09\uFF0C\u6362\u7B97\u53EA\u5728\u8FD9\u4E00\u5904\u505A\n if (spec.min !== undefined) input.setAttribute('min', String(spec.min / numScale))\n if (spec.max !== undefined) input.setAttribute('max', String(spec.max / numScale))\n if (spec.step !== undefined) input.setAttribute('step', String(spec.step / numScale))\n } else {\n input.type = 'text'\n // \u5BBD\u6587\u672C\u884C\u5FC5\u987B\u8BA9\u8F93\u5165\u6846\u72EC\u5360\u4E00\u884C\uFF0C\u5426\u5219\u503C\u4F1A\u88AB\u88C1\u6389\uFF08\u62BD\u5C49\u662F\u5D4C\u5728\u5C0F\u7A97\u91CC\u7684\u7A84\u5BB9\u5668\uFF09\n row.setAttribute('data-wide', '1')\n if (spec.placeholder) input.setAttribute('placeholder', spec.placeholder)\n }\n input.setAttribute('aria-label', spec.label)\n listen(input, 'input', function () {\n if (spec.kind === 'number') {\n // \u7A7A\u4E32\uFF08\u7528\u6237\u6B63\u5728\u6E05\u7A7A\u91CD\u6253\uFF09\u5148\u8BB0\u6210 undefined\uFF0C\u522B\u628A NaN \u9001\u53BB host\n var text = String(input.value || '').trim()\n // \u663E\u793A\u5355\u4F4D \u2192 \u914D\u7F6E\u5355\u4F4D\uFF08\u79D2 \u2192 \u6BEB\u79D2\uFF09\uFF1B\u53D6\u6574\u907F\u514D 5.000000000001 \u8FD9\u79CD\u6D6E\u70B9\u5C3E\u5DF4\n settingsLive[spec.key] = text === '' ? undefined\n : (numScale === 1 ? Number(text) : Math.round(Number(text) * numScale))\n } else {\n settingsLive[spec.key] = input.value\n }\n renderSettingsNote('')\n scheduleSettingsSave()\n })\n // \u6570\u5B57\u6846\u5931\u7126\u65F6\u628A\u503C\u5939\u56DE\u8FB9\u754C\u518D\u56DE\u663E\uFF1A\u5426\u5219\u754C\u9762\u4E0A\u7559\u7740\u7528\u6237\u6572\u7684\u8D8A\u754C\u6570\uFF0C\n // \u800C\u771F\u6B63\u751F\u6548\u7684\u662F host \u5939\u8FC7\u7684\u503C\uFF0C\u4E24\u8FB9\u5BF9\u4E0D\u4E0A\uFF08\u7528\u6237\u4F1A\u4EE5\u4E3A\u6CA1\u4FDD\u5B58\u6210\u529F\uFF09\n listen(input, 'blur', function () {\n if (spec.kind !== 'number') return\n var text = String(input.value || '').trim()\n if (text === '') return\n var num = Number(text)\n if (!isFinite(num)) return\n var min = spec.min === undefined ? -Infinity : spec.min / numScale\n var max = spec.max === undefined ? Infinity : spec.max / numScale\n var fixed = Math.min(max, Math.max(min, num))\n input.value = String(fixed)\n settingsLive[spec.key] = numScale === 1 ? fixed : Math.round(fixed * numScale)\n renderSettingsNote('')\n scheduleSettingsSave()\n })\n ctl.appendChild(input)\n if (spec.unit) ctl.appendChild(el('span', 'dsh-sel-sunit', spec.unit))\n settingsByKey[spec.key] = { spec: spec, row: row, input: input }\n return row\n }\n\n /** \u6309 spec \u753B\u6574\u9875\uFF08\u62FF\u5230 spec \u540E\u8C03\u7528\u4E00\u6B21\uFF09\u3002 */\n function renderSettings(spec, values) {\n settingsSpec = spec\n settingsByKey = {}\n settingsRailButtons = []\n settingsPanes = []\n settingsSegs = []\n settingsEffortHints = []\n for (var m = 0; m < settingsMenus.length; m += 1) {\n if (settingsMenus[m].parentNode) settingsMenus[m].parentNode.removeChild(settingsMenus[m])\n }\n settingsMenus = []\n clearNode(env.settingsRail)\n clearNode(env.settingsBody)\n var groups = spec.groups || []\n groups.forEach(function (group, index) {\n var railBtn = el('button', 'dsh-sel-railbtn', group.label)\n railBtn.type = 'button'\n railBtn.setAttribute('role', 'tab')\n railBtn.setAttribute('data-tab', group.id)\n railBtn.setAttribute('aria-current', index === 0 ? 'true' : 'false')\n listen(railBtn, 'click', function () { showSettingsTab(group.id) })\n env.settingsRail.appendChild(railBtn)\n settingsRailButtons.push({ id: group.id, node: railBtn })\n\n var section = el('section', 'dsh-sel-grp')\n section.setAttribute('data-pane', group.id)\n var parts = group.sections || [{ label: group.label, keys: group.items.map(function (item) { return item.key }) }]\n parts.forEach(function (part) {\n var block = el('section', 'dsh-sel-ssection')\n block.appendChild(el('h3', 'dsh-sel-ssectionh', part.label))\n if (part.hint) block.appendChild(el('p', 'dsh-sel-ssectionhint', part.hint))\n part.keys.forEach(function (key) {\n var item = group.items.find(function (candidate) { return candidate.key === key })\n if (item) block.appendChild(buildSettingRow(item))\n })\n if (part.note) block.appendChild(el('p', 'dsh-sel-ssectionnote', part.note))\n // \u300C\u601D\u8003\u5F3A\u5EA6\u300D\u90A3\u4E00\u8282\u591A\u4E00\u884C\uFF1A\u8FD9\u56DB\u4E2A\u683C\u5B50**\u73B0\u5728**\u843D\u5230\u5F53\u524D\u6A21\u578B\u7684\u54EA\u4E9B\u6863\u4F4D\u4E0A\u3002\n // \u6620\u5C04\u7531 host \u6309\u6A21\u578B\u58F0\u660E\u5B9E\u65F6\u7B97\uFF08\u6362\u6A21\u578B / DSH \u5347\u7EA7\u6362 adapter \u90FD\u4F1A\u8DDF\u7740\u53D8\uFF09\u3002\n if (part.keys.indexOf('chatReasoningEffort') >= 0) {\n var effortHint = el('p', 'dsh-sel-ssectionnote dsh-sel-effortmap', '')\n effortHint.setAttribute('data-effortmap', '1')\n block.appendChild(effortHint)\n settingsEffortHints.push(effortHint)\n }\n section.appendChild(block)\n })\n env.settingsBody.appendChild(section)\n settingsPanes.push({ id: group.id, node: section })\n })\n Object.keys(values || {}).forEach(function (key) {\n setControlValue(key, values[key])\n })\n updateSettingDependencies()\n syncComposerModel()\n applySelectionLimit(values)\n paintEffortMapHint()\n showSettingsTab(groups.length ? groups[0].id : '')\n }\n\n function showSettingsTab(id) {\n var i\n for (i = 0; i < settingsRailButtons.length; i += 1) {\n settingsRailButtons[i].node.setAttribute('aria-current', settingsRailButtons[i].id === id ? 'true' : 'false')\n }\n for (i = 0; i < settingsPanes.length; i += 1) {\n settingsPanes[i].node.style.display = settingsPanes[i].id === id ? '' : 'none'\n }\n env.settingsBody.scrollTop = 0\n closeModelPicks() // \u5207\u5206\u7C7B\u65F6\u628A\u6A21\u578B\u4E0B\u62C9\u6536\u6389\uFF08\u6D6E\u5C42\u6302\u5728\u62BD\u5C49\u4E0A\uFF0C\u4E0D\u8DDF\u7740\u5206\u7C7B\u8D70\uFF09\n // \u9690\u85CF\u65F6\u91CF\u4E0D\u5230 offsetWidth\uFF0C\u5207\u9875\u540E\u91CD\u6446\u4E00\u6B21\u6ED1\u5757\uFF08\u5426\u5219\u6ED1\u5757\u505C\u5728 0 \u5BBD\uFF09\n for (i = 0; i < settingsSegs.length; i += 1) {\n if (settingsSegs[i].seg.offsetParent !== null) paintSegPill(settingsSegs[i])\n }\n }\n\n /** \u62C9\u4E00\u6B21 spec + \u5F53\u524D\u503C\u3002\u5931\u8D25\u5C31\u5728\u6B63\u6587\u91CC\u7ED9\u51FA\u8BF4\u660E\uFF08\u91CD\u5F00\u62BD\u5C49\u5373\u53EF\u91CD\u8BD5\uFF09\u3002 */\n function loadSettings(force) {\n if (settingsFetching) return\n if (settingsSpec && !force) return\n settingsFetching = true\n fetch(SETTINGS, { headers: { accept: 'application/json' } })\n .then(function (response) { return response.json() })\n .then(function (payload) {\n settingsFetching = false\n if (!payload || payload.ok === false || !payload.groups) {\n throw new Error((payload && payload.error) || '\u8BBE\u7F6E\u8BFB\u53D6\u5931\u8D25')\n }\n var pending = settingsSpec ? {} : Object.assign({}, settingsLive)\n settingsSaved = Object.assign({}, payload.values || {})\n settingsLive = Object.assign({}, payload.values || {}, pending)\n renderSettings({ groups: payload.groups }, settingsLive)\n renderSettingsNote('')\n if (settingsDirtyCount() > 0) scheduleSettingsSave()\n })\n .catch(function (error) {\n settingsFetching = false\n clearNode(env.settingsBody)\n env.settingsBody.appendChild(el('div', 'dsh-sel-sempty',\n '\u8BBE\u7F6E\u8BFB\u53D6\u5931\u8D25\uFF1A' + String((error && error.message) || error) + '\uFF08\u70B9\u300C\u5173\u95ED\u300D\u540E\u91CD\u5F00\u53EF\u91CD\u8BD5\uFF09'))\n })\n }\n\n /**\n * \u4FDD\u5B58\uFF08\u9632\u6296 400ms\uFF09\u3002\n *\n * \u53EA\u53D1\u6539\u8FC7\u7684\u952E\uFF1A\u8865\u4E01\u8D8A\u5C0F\uFF0C\u8D8A\u4E0D\u5BB9\u6613\u548C\"\u53E6\u4E00\u4E2A\u7A97\u53E3\u540C\u65F6\u6539\u4E86\u522B\u7684\u9879\"\u649E\u8F66\n * \uFF08host \u4FA7\u662F**\u5408\u5E76**\u800C\u4E0D\u662F\u8986\u76D6\uFF0C\u4E24\u8005\u914D\u5408\u624D\u4E0D\u4F1A\u4E92\u76F8\u62B9\u6389\uFF09\u3002\n */\n function scheduleSettingsSave() {\n if (settingsSaveTimer) clearTimeout(settingsSaveTimer)\n settingsSaveTimer = setTimeout(function () {\n settingsSaveTimer = 0\n flushSettingsSave()\n }, 400)\n }\n\n function flushSettingsSave() {\n if (settingsSaving || settingsResetting || !settingsSpec) return settingsSaveRequest\n var patch = {}\n Object.keys(settingsLive).forEach(function (key) {\n var value = settingsLive[key]\n if (value === undefined) return\n if (settingsSaved[key] === value) return\n patch[key] = value\n })\n if (Object.keys(patch).length === 0) {\n renderSettingsNote('')\n return\n }\n var seq = ++settingsSaveSeq\n var sent = Object.assign({}, settingsLive)\n var accepted = false\n settingsSaving = true\n renderSettingsNote('saving')\n settingsSaveRequest = fetch(SETTINGS, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ values: patch }),\n })\n .then(function (response) { return response.json() })\n .then(function (payload) {\n if (seq !== settingsSaveSeq) return // \u6709\u66F4\u65B0\u7684\u4FDD\u5B58\u5728\u8DEF\u4E0A\uFF0C\u522B\u7528\u65E7\u7ED3\u679C\u8986\u76D6\n if (!payload || payload.ok === false) throw new Error((payload && payload.error) || '\u4FDD\u5B58\u5931\u8D25')\n // \u4EE5 host \u5F52\u4E00\u540E\u7684\u503C\u4E3A\u51C6\uFF08clamp \u8FC7\u7684\u6570\u5B57\u8981\u548C\u754C\u9762\u663E\u793A\u4E00\u81F4\uFF09\n applyServerValues(payload.values, sent)\n // \u80F6\u56CA\u504F\u597D\u7ACB\u523B\u751F\u6548\uFF08\u4E0D\u7B49\u4E0B\u6B21\u5237\u65B0\uFF09\u2014\u2014 \u8BBE\u7F6E\u9875\u627F\u8BFA\"\u5373\u65F6\u751F\u6548\"\n if (Object.prototype.hasOwnProperty.call(patch, 'pillEnabled') ||\n Object.prototype.hasOwnProperty.call(patch, 'pillIdleMs')) {\n applyPillPrefs({ enabled: settingsLive.pillEnabled, idleMs: settingsLive.pillIdleMs })\n }\n if (Array.isArray(payload.rejected) && payload.rejected.length > 0) {\n // \u6709\u5B57\u6BB5\u88AB\u62D2\uFF1A\u53EA\u63D0\u793A\u3001\u4E0D\u56DE\u6EDA \u2014\u2014 \u540C\u4E00\u6279\u91CC\u5176\u5B83\u5B57\u6BB5\u5DF2\u7ECF\u751F\u6548\u4E86\n env.settingsNote.setAttribute('data-dirty', '1')\n env.settingsNoteText.textContent = '\u6709 ' + String(payload.rejected.length) + ' \u9879\u672A\u63A5\u53D7'\n return\n }\n accepted = true\n renderSettingsNote('')\n })\n .catch(function () {\n if (seq !== settingsSaveSeq) return\n renderSettingsNote('error')\n })\n .finally(function () {\n settingsSaving = false\n if (accepted && !settingsResetting && settingsDirtyCount() > 0 && settingsSaveSeq === seq) scheduleSettingsSave()\n })\n return settingsSaveRequest\n }\n\n /**\n * \u628A\u80F6\u56CA\u7684\u4E24\u4E2A\u504F\u597D\u843D\u5230\u754C\u9762\u4E0A\u3002\n *\n * ping\uFF08\u542F\u52A8\u65F6\uFF09\u4E0E\u8BBE\u7F6E\u4FDD\u5B58\u540E**\u90FD\u8D70\u8FD9\u91CC** \u2014\u2014 \u8BBE\u7F6E\u9875\u5199\u7740\"\u5373\u65F6\u751F\u6548\"\uFF0C\n * \u5982\u679C\u53EA\u5728\u542F\u52A8\u65F6\u8BFB\u4E00\u6B21\uFF0C\u7528\u6237\u5173\u6389\u80F6\u56CA\u540E\u8981\u5237\u65B0\u9875\u9762\u624D\u89C1\u6548\uFF0C\u90A3\u5C31\u662F\u5047\u627F\u8BFA\u3002\n */\n function applyPillPrefs(prefs) {\n if (!prefs) return\n var idle = Number(prefs.idleMs)\n if (isFinite(idle) && idle >= 2000) preferences.pillIdleMs = idle\n if (prefs.enabled === false) {\n env.pillHidden = true\n env.pill.style.display = 'none'\n } else if (prefs.enabled === true) {\n env.pillHidden = false\n env.pill.style.display = ''\n env.placePill()\n }\n if (env.pillHidden) {\n if (env.pillIdleId) clearTimeout(env.pillIdleId)\n env.pillIdleId = 0\n } else {\n env.schedulePillIdle()\n }\n }\n\n /** \u8F6E\u8BE2\u53E5\u67C4\uFF08\u62BD\u5C49\u548C\u5C0F\u7A97\u90FD\u6536\u4E86\u5FC5\u987B\u6E05\u6389\uFF0C\u4E0D\u7136\u4F1A\u4E00\u76F4\u6253\u63A5\u53E3\uFF09\u3002 */\n var routeWatchTimer = 0\n\n /** \u8F6E\u8BE2\u95F4\u9694\uFF1A\u591F\u5FEB\u770B\u5F97\u51FA\"\u5B9E\u65F6\"\uFF0C\u53C8\u4E0D\u81F3\u4E8E\u628A\u63A5\u53E3\u6253\u7206\uFF08\u8FD9\u6761\u63A5\u53E3\u53EA\u505A\u4E00\u6B21\u4F1A\u8BDD\u89E3\u6790\uFF0C\u5F88\u8F7B\uFF09\u3002 */\n var ROUTE_WATCH_MS = 2000\n\n /**\n * \u76EF\u7740\"\u5F53\u524D\u4F1A\u8BDD\u5728\u7528\u7684\u6A21\u578B\"\u3002\n *\n * \u4E3B\u4F1A\u8BDD\u91CC\u968F\u65F6\u53EF\u4EE5\u6362\u6A21\u578B\uFF0C\u800C\u63D2\u4EF6\u8FD9\u8FB9**\u6CA1\u6709**\u53EF\u8BA2\u9605\u7684\u53D8\u66F4\u4E8B\u4EF6\uFF08\u6A21\u578B\u9009\u62E9\u662F\u4F1A\u8BDD\u4FA7\u7684\uFF09\uFF0C\n * \u6240\u4EE5\u53EA\u80FD\u8F6E\u8BE2\u90A3\u6761\u8F7B\u91CF /route\uFF1A\u503C\u4E00\u53D8\u5C31\u628A\u300C\u8DDF\u968F\u4E3B\u4F1A\u8BDD\uFF08\u5F53\u524D\uFF1A\u2026\uFF09\u300D\u548C\u8F93\u5165\u6846\u90A3\u679A\u80F6\u56CA\u6539\u6389\u3002\n *\n * **\u5C0F\u7A97\u5F00\u7740\u5C31\u8981\u76EF\uFF0C\u4E0D\u53EA\u662F\u62BD\u5C49\u5F00\u7740**\uFF1A\u8DDF\u968F\u6001\u4E0B\u8F93\u5165\u6846\u90A3\u679A\u80F6\u56CA\u62A5\u7684\u5C31\u662F\u8FD9\u4E2A\u503C \u2014\u2014\n * \u4EE5\u524D\u53EA\u5728\u62BD\u5C49\u5F00\u7740\u65F6\u8F6E\u8BE2\uFF0C\u4E8E\u662F\"\u5C0F\u7A97\u5F00\u7740\u3001\u4E3B\u4F1A\u8BDD\u6362\u4E86\u6A21\u578B\"\u8981\u7B49\u4E0B\u4E00\u6B21\u5F00/\u5173\u8BBE\u7F6E\u9875\u624D\u66F4\u65B0\n * \uFF08\u7528\u6237\u62A5\u7684\"\u6CA1\u6709\u53CA\u65F6\u5237\u65B0\"\uFF09\u3002\u62BD\u5C49\u548C\u5C0F\u7A97\u90FD\u6536\u8D77\u6765\u5373\u505C\u3002\n */\n function startRouteWatch() {\n stopRouteWatch()\n routeWatchTimer = setInterval(function () {\n if (!settingsOpen && !env.panelOpen) { stopRouteWatch(); return }\n // \u9009\u4E86\u5177\u4F53\u6A21\u578B\uFF1A\u80F6\u56CA\u4E0E\u62EC\u53F7\u663E\u793A\u7684\u90FD\u4E0D\u662F\"\u8DDF\u968F\"\u7684\u503C\uFF0C\u4E0D\u5FC5\u518D\u95EE\n if (env.state.modelChoice) return\n fetchRoute(env.panelSessionId || env.currentSessionId(), false).then(applyFollowRoute)\n }, ROUTE_WATCH_MS)\n }\n\n function stopRouteWatch() {\n if (routeWatchTimer) {\n clearInterval(routeWatchTimer)\n routeWatchTimer = 0\n }\n }\n\n /** \u62BD\u5C49\u6216\u5C0F\u7A97\u8FD8\u5F00\u7740\u5C31\u7EE7\u7EED\u8F6E\u8BE2\uFF1B\u4E24\u4E2A\u90FD\u6536\u4E86\u624D\u505C\uFF08\u5F00\u7740\u65F6\u91CD\u590D\u8C03\u7528\u4E0D\u91CD\u542F\u8BA1\u65F6\uFF09\u3002 */\n function syncRouteWatch() {\n if (!settingsOpen && !env.panelOpen) { stopRouteWatch(); return }\n if (routeWatchTimer) return\n startRouteWatch()\n }\n\n /** \u5148\u5BF9\u9F50\u4E00\u6B21\"\u8DDF\u968F\"\u7684\u503C\uFF08\u5F00\u7A97/\u5F00\u62BD\u5C49\u90A3\u4E00\u523B\uFF0C\u4E0D\u7B49\u7B2C\u4E00\u62CD\u8F6E\u8BE2\uFF09\u3002 */\n function refreshFollowRoute() {\n if (env.state.modelChoice) return\n fetchRoute(env.panelSessionId || env.currentSessionId(), false).then(applyFollowRoute)\n }\n\n function openSettings() {\n if (settingsOpen) return\n settingsOpen = true\n // \u62BD\u5C49\u8D34\u7740\u9762\u677F\uFF08inset:0\uFF09\uFF0C\u6240\u4EE5\u7ED9\u9762\u677F\u4E00\u4E2A\u5408\u9002\u7684\u5C3A\u5BF8\u4E0B\u9650 \u2014\u2014 \u5426\u5219\u5185\u5BB9\u77ED\u65F6\u62BD\u5C49\u88AB\u538B\u6210\u4E00\u6761\n env.panel.setAttribute('data-settings', '1')\n env.settingsSheet.setAttribute('data-open', '1')\n env.settingsScrim.setAttribute('data-open', '1')\n env.settingsButton.setAttribute('aria-pressed', 'true')\n loadSettings(false)\n settingsSegs.forEach(function (entry) { paintSegPill(entry) })\n // \u6BCF\u6B21\u5F00\u62BD\u5C49\u90FD\u91CD\u53D6\u4E00\u6B21\u6A21\u578B\uFF08\u5F3A\u5236\uFF0C\u7ED5\u8FC7\u7F13\u5B58\uFF09\uFF1A\n // \u4F1A\u8BDD\u6362\u4E86\u3001\u6216\u4E3B\u4F1A\u8BDD\u4E2D\u9014\u6362\u4E86\u6A21\u578B\uFF0C\u62EC\u53F7\u91CC\u7684\u540D\u5B57\u90FD\u8981\u8DDF\u7740\u53D8\u3002\n refreshModelRow(settingsByKey.modelChoice, true)\n syncRouteWatch()\n }\n\n function closeSettings() {\n if (!settingsOpen) return\n settingsOpen = false\n env.panel.removeAttribute('data-settings')\n closeModelPicks()\n env.settingsSheet.setAttribute('data-open', '0')\n env.settingsScrim.setAttribute('data-open', '0')\n env.settingsButton.setAttribute('aria-pressed', 'false')\n // \u5173\u62BD\u5C49\u524D\u628A\u8FD8\u6CA1\u843D\u76D8\u7684\u6539\u52A8\u8865\u53D1\u4E00\u6B21\uFF0C\u522B\u8BA9\"\u5173\u6389\u5C31\u8D70\"\u4E22\u6389\u521A\u6539\u7684\u503C\n if (settingsSaveTimer) {\n clearTimeout(settingsSaveTimer)\n settingsSaveTimer = 0\n flushSettingsSave()\n }\n // \u5C0F\u7A97\u8FD8\u5F00\u7740\u5C31\u7EE7\u7EED\u76EF\uFF08\u8DDF\u968F\u6001\u4E0B\u8F93\u5165\u6846\u90A3\u679A\u80F6\u56CA\u8FD8\u6307\u7740\u4F1A\u8BDD\u7684\u6A21\u578B\uFF09\n syncRouteWatch()\n }\n\n function resetSettings() {\n if (settingsResetting) return\n settingsResetting = true\n if (settingsSaveTimer) { clearTimeout(settingsSaveTimer); settingsSaveTimer = 0 }\n var sent\n renderSettingsNote('saving')\n // \u7B49\u6B63\u5728\u4FDD\u5B58\u7684\u8BF7\u6C42\u7ED3\u675F\u518D\u6062\u590D\uFF0C\u907F\u514D\u665A\u5230\u7684\u4FDD\u5B58\u628A\u9ED8\u8BA4\u503C\u8986\u76D6\u6389\u3002\n Promise.resolve(settingsSaveRequest).then(function () {\n sent = Object.assign({}, settingsLive)\n return fetch(SETTINGS, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ reset: true }),\n })\n }).then(function (response) { return response.json() })\n .then(function (payload) {\n if (!payload || payload.ok === false) throw new Error('\u6062\u590D\u9ED8\u8BA4\u5931\u8D25')\n applyServerValues(payload.values, sent)\n env.state.effort = settingsLive.chatReasoningEffort || ''\n applyPillPrefs({ enabled: settingsLive.pillEnabled, idleMs: settingsLive.pillIdleMs })\n env.bridgeOn = settingsLive.bridgeSidebarPreview !== false\n if (env.bridgeOn) env.scheduleBridgeScan()\n refreshModelRow(settingsByKey.modelChoice, true)\n env.paintModelPill()\n renderSettingsNote('')\n })\n .catch(function () { renderSettingsNote('error') })\n .finally(function () {\n settingsResetting = false\n if (settingsDirtyCount() > 0 && env.settingsNoteText.textContent !== '\u4FDD\u5B58\u5931\u8D25\uFF0C\u6539\u52A8\u672A\u751F\u6548') scheduleSettingsSave()\n })\n }\n return {\n loadSettings,\n get settingsSpec() { return settingsSpec },\n set settingsSpec(value) { settingsSpec = value },\n applySelectionLimit,\n applyPillPrefs,\n get settingsOpen() { return settingsOpen },\n set settingsOpen(value) { settingsOpen = value },\n get settingsByKey() { return settingsByKey },\n set settingsByKey(value) { settingsByKey = value },\n closeModelPicks,\n closeSettings,\n openSettings,\n resetSettings,\n get settingsLive() { return settingsLive },\n set settingsLive(value) { settingsLive = value },\n refreshFollowRoute,\n syncRouteWatch,\n paintEffortMapHint,\n chooseSharedModel,\n chatSlot,\n get SLOT_ORDER() { return SLOT_ORDER },\n set SLOT_ORDER(value) { SLOT_ORDER = value },\n get SLOT_LABEL() { return SLOT_LABEL },\n set SLOT_LABEL(value) { SLOT_LABEL = value },\n setChatSlot,\n }\n}\n", "import { selectionDetached, insideEditable, clamp } from './dom.js'\nimport { MAX_QUOTE_SELECTION, preferences } from './constants.js'\n\n/** selection state and operations; dependencies are supplied as live node/callback accessors. */\nexport function createSelectionController(env) {\n\n // \u2014\u2014 \u9009\u533A \u2192 \u6D6E\u6807 \u2014\u2014\n\n /**\n * \u6392\u4E00\u6B21\u9009\u533A\u68C0\u67E5\uFF08\u4E0B\u4E00\u62CD\u6267\u884C\uFF09\u3002\n *\n * \u540C\u4E00\u62CD\u91CC\u7684\u591A\u6B21\u8BF7\u6C42**\u5408\u5E76\u6210\u4E00\u6B21**\uFF1A`selectionchange` \u5728\u6253\u5B57 / \u6D41\u5F0F\u91CD\u7ED8\u65F6\u4F1A\u8FDE\u53D1\u5F88\u591A\u4E0B\uFF0C\n * \u6BCF\u4E0B\u90FD\u6392\u4E00\u4E2A\u8BA1\u65F6\u5668\u7684\u8BDD `timers` \u6570\u7EC4\u4F1A\u4E00\u76F4\u957F\uFF08\u6587\u4EF6\u91CC\u522B\u5904\u4E5F\u523B\u610F\u907F\u5F00\u8FD9\u79CD\u5199\u6CD5\uFF0C\n * \u89C1 schedulePillIdle \u7684\u6CE8\u91CA\uFF09\u3002\u5408\u5E76\u662F\u5B89\u5168\u7684 \u2014\u2014 \u68C0\u67E5\u8BFB\u7684\u662F\"\u5F53\u4E0B\"\u7684\u9009\u533A\uFF0C\n * \u800C\u4E0D\u662F\u6392\u961F\u90A3\u4E00\u523B\u7684\u5FEB\u7167\u3002\n */\n var checkPending = false\n\n function scheduleCheck() {\n if (checkPending) return\n checkPending = true\n env.later(function () {\n checkPending = false\n checkSelection()\n }, 0)\n }\n\n /**\n * \u9009\u533A\u662F\u4E0D\u662F\u843D\u5728**\u6211\u4EEC\u81EA\u5DF1\u7684\u754C\u9762**\u91CC\uFF08\u80F6\u56CA / \u9762\u677F / \u5386\u53F2\u6D6E\u5C42\uFF09\u3002\n *\n * \u4E0D\u52A0\u8FD9\u9053\u5224\u65AD\u7684\u8BDD\uFF0C\u5728\u4E3B\u4F1A\u8BDD\u91CC\u987A\u624B\u5212\u4E2D\u80F6\u56CA\u4E0A\u7684\u6587\u5B57\uFF08\u6BD4\u5982\"\u5DF2\u505C\u6B62\"\uFF09\uFF0C\n * \u5C31\u4F1A\u62FF\u5B83\u5F53\u9009\u4E2D\u6587\u5B57\u518D\u5F00\u4E00\u4E2A\u5C0F\u7A97\u2014\u2014\u5B9E\u6D4B\u771F\u8E29\u5230\u8FC7\uFF1A\u80F6\u56CA\u4E0A\u51FA\u73B0\u300C\u5DF2\u505C\u6B62 \u00B7 \u5DF2\u505C\u6B62\u300D\u3002\n */\n function insideOwnUI(node) {\n var current = node && node.nodeType === 3 ? node.parentNode : node\n for (var depth = 0; current && depth < 24; depth += 1) {\n var cls = typeof current.className === 'string' ? current.className : ''\n if (cls.indexOf('dsh-sel-') === 0 || cls.indexOf(' dsh-sel-') >= 0) return true\n if (current === env.layer || current === env.panel || current === env.pill) return true\n current = current.parentNode\n }\n return false\n }\n\n /**\n * \u8FD9\u4E00\u6BB5\u9009\u533A\u662F\u4E0D\u662F**\u5C0F\u7A97\u6B63\u6587**\u91CC\u7684\uFF08\u53EF\u4EE5\u5F15\u7528\uFF09\u3002\n *\n * \u5F80\u4E0A\u8D70\u5230\u5C0F\u7A97\u7684\u6EDA\u52A8\u5185\u5BB9\u533A\uFF08body\uFF09\u4E3A\u6B62\uFF1A\u4E2D\u9014\u78B0\u5230\u8F93\u5165\u6846 / \u6309\u94AE / \u5F15\u7528\u5361\u7247\u672C\u8EAB\n * \u5C31\u4E0D\u7B97 \u2014\u2014 \u90A3\u4E9B\u5730\u65B9\u7684\u9009\u533A\u8981\u4E48\u662F\u8F93\u5165\uFF08textarea\uFF09\uFF0C\u8981\u4E48\u5F15\u7528\u4E86\u4E5F\u6CA1\u610F\u4E49\uFF08\"\u2715\"\u8FD9\u79CD\u6309\u94AE\u6587\u5B57\uFF09\u3002\n * \u5386\u53F2\u5217\u8868\u3001\u80F6\u56CA\u3001\u6A21\u578B\u83DC\u5355\u90FD\u5728 panel/body \u4E4B\u5916\uFF0C\u81EA\u7136\u88AB\u6321\u6389\u3002\n * \u4E0D\u7528 closest()\uFF1A\u65E0\u6D4F\u89C8\u5668\u6D4B\u8BD5\u7684\u6869 DOM \u6CA1\u6709\u5B83\uFF0C\u800C\u6309\u7956\u5148\u94FE\u8D70\u4E00\u904D\u5728\u4E24\u8FB9\u90FD\u4E00\u6837\u51C6\u3002\n */\n function insidePanelContent(node) {\n var current = node && node.nodeType === 3 ? node.parentNode : node\n for (var depth = 0; current && depth < 32; depth += 1) {\n if (current === env.body) return true\n if (current === env.panel || current === env.layer || !env.panel.contains(current)) return false\n var tag = String(current.tagName || '').toUpperCase()\n if (tag === 'TEXTAREA' || tag === 'INPUT' || tag === 'BUTTON' || tag === 'IFRAME') return false\n var cls = typeof current.className === 'string' ? current.className : ''\n if (cls.indexOf('dsh-sel-quotes') >= 0) return false\n current = current.parentNode\n }\n return false\n }\n\n /**\n * \u300C\u5C0F\u7A97\u7B2C N \u8F6E\u56DE\u7B54 / \u63D0\u95EE\u300D\u3002\n *\n * \u5C0F\u7A97\u91CC\u7684\u5F15\u7528**\u4E0D\u5E26\u4E0A\u4E0B\u6587**\uFF08\u90A3\u51E0\u8F6E\u5BF9\u8BDD\u672C\u6765\u5C31\u4F1A\u968F\u5386\u53F2\u8FDB\u6A21\u578B\uFF09\uFF0C\u6240\u4EE5\u51FA\u5904\u5168\u9760\u6807\u7B7E\u8BF4\u6E05\uFF1A\n * \u53EA\u5199\"\u5C0F\u7A97\u56DE\u7B54\"\u592A\u7B3C\u7EDF \u2014\u2014 \u7B2C 1 \u8F6E\u548C\u7B2C 4 \u8F6E\u7684\u56DE\u7B54\u662F\u4E24\u56DE\u4E8B\u3002\n */\n function turnLabelOf(turn) {\n if (!turn) return '\u5C0F\u7A97\u5185\u5BB9'\n var index = env.state.turns.indexOf(turn)\n var round = 0\n for (var i = 0; i <= index && i < env.state.turns.length; i += 1) {\n if (env.state.turns[i].role === 'user') round += 1\n }\n var role = turn.role === 'user' ? '\u63D0\u95EE' : '\u56DE\u7B54'\n return round > 0 ? '\u5C0F\u7A97\u7B2C ' + round + ' \u8F6E' + role : '\u5C0F\u7A97' + role\n }\n\n /** \u5C0F\u7A97\u6B63\u6587\u91CC\u8FD9\u6BB5\u9009\u533A\u7684\u51FA\u5904\uFF1A\u56DE\u7B54\uFF08\u7B2C N \u8F6E\uFF09/ \u67D0\u4E00\u8282 / \u9876\u90E8\u9009\u4E2D\u6587\u5B57\u6761\u3002 */\n function panelSourceLabel(node) {\n var current = node && node.nodeType === 3 ? node.parentNode : node\n for (var depth = 0; current && depth < 32; depth += 1) {\n if (current.__turn) return turnLabelOf(current.__turn)\n // \u4E24\u8282\u7528**\u5B83\u4EEC\u81EA\u5DF1\u7684\u6807\u9898**\uFF08\u6807\u9898\u662F\u300C\u7FFB\u8BD1\u300D/\u300C\u89E3\u8BFB\u300D/\u300C\u6CE8\u91CA\u300D\uFF0C\u968F\u9009\u4E2D\u5185\u5BB9\u53D8\uFF09\uFF1A\n // \u5199\u6B7B\"\u5C0F\u7A97\u89E3\u8BFB\"\u4F1A\u5728\u6CE8\u91CA\u8282\u91CC\u6307\u9519\u5730\u65B9\n if (current === env.translationSection.root) return '\u5C0F\u7A97\u300C' + env.translationSection.title.textContent + '\u300D\u8282'\n if (current === env.detailSection.root) return '\u5C0F\u7A97\u300C' + env.detailSection.title.textContent + '\u300D\u8282'\n var cls = typeof current.className === 'string' ? current.className : ''\n if (cls.indexOf('dsh-sel-quote') === 0) return '\u5C0F\u7A97\u9876\u90E8\u7684\u9009\u4E2D\u6587\u5B57'\n if (current === env.body || current === env.panel || !current.parentNode) break\n current = current.parentNode\n }\n return '\u5C0F\u7A97\u5185\u5BB9'\n }\n\n /**\n * \u5C0F\u7A97\u5F00\u7740\u65F6\u7684\u9009\u533A\u68C0\u67E5\uFF1A\u8FD9\u65F6\u5019\u6D6E\u6807\u662F\u300C\u275D \u5F15\u7528\u300D\u800C\u4E0D\u662F\u300C\u2726 \u89E3\u8BFB\u300D\u3002\n *\n * \u4E24\u79CD\u6765\u6E90\u90FD\u8BA4\uFF1A\n * \u2460 \u5C0F\u7A97\u6B63\u6587\u91CC\u7684\u9009\u533A\uFF08\u56DE\u7B54 / \u4E24\u8282 / \u9876\u90E8\u9009\u4E2D\u6587\u5B57\u6761\uFF09\u2192 \u5F15\u7528\u7684\u5C31\u662F\u5C0F\u7A97\u81EA\u5DF1\u7684\u5185\u5BB9\uFF1B\n * \u2461 \u4E3B\u754C\u9762\u4E0A\u7684\u9009\u533A \u2192 \u5F15\u7528\u4E3B\u754C\u9762\u9009\u4E2D\u7684\u6587\u5B57\u3002\n * \u5E27\u5185\uFF08\u4FA7\u8FB9\u680F\u7F51\u9875\uFF09\u90A3\u6761\u4E0D\u5728\u8FD9\u91CC \u2014\u2014 \u5B83\u7531\u6865\u7684 message \u9001\u8FC7\u6765\uFF0C\u89C1 offBridgeMessage\u3002\n */\n function checkQuoteSelection() {\n hideButton() // \u5C0F\u7A97\u5F00\u7740\u65F6\u4E0D\u63D0\u4F9B\u300C\u89E3\u8BFB\u300D\uFF1A\u8981\u89E3\u8BFB\u76F4\u63A5\u5728\u8F93\u5165\u6846\u91CC\u95EE\n var selection = window.getSelection()\n if (!selection || selection.rangeCount === 0 || selection.isCollapsed) {\n // \u5E27\u5185\u90A3\u6761\u9009\u533A\u8FD8\u6D3B\u7740\uFF08\u672C\u6587\u6863\u584C\u9677\u53EA\u662F\u70B9\u6D6E\u6807\u9020\u6210\u7684\uFF09\u2192 \u7559\u7740\u6D6E\u6807\n if (env.state.bridgeActive && env.state.selection && env.state.selection.source === 'iframe') return\n env.state.quoteSelection = null\n env.hideQuoteButton()\n return\n }\n var range\n try {\n range = selection.getRangeAt(0)\n } catch (error) {\n return\n }\n // \u9009\u4E2D\u7684\u8282\u70B9\u88AB\u6574\u4E2A\u6458\u6389\u4E86\uFF08\u6D41\u5F0F\u56DE\u7B54\u91CD\u6E32\u67D3 / \u6D88\u606F\u6362\u6389\uFF09\uFF1A\u90A3\u6BB5\u6587\u5B57\u5DF2\u7ECF\u4E0D\u5728\u5C4F\u5E55\u4E0A\n if (selectionDetached(range)) {\n env.state.quoteSelection = null\n env.hideQuoteButton()\n return\n }\n var text = String(selection.toString() || '')\n if (!text.trim() || text.length > MAX_QUOTE_SELECTION) {\n env.state.quoteSelection = null\n env.hideQuoteButton()\n return\n }\n if (insideEditable(range.startContainer)) {\n env.state.quoteSelection = null\n env.hideQuoteButton()\n return\n }\n var inPanel = insidePanelContent(range.startContainer) || insidePanelContent(range.endContainer)\n // \u5C0F\u7A97\u91CC\u5212\u8BCD\uFF1A\u5E27\u5185\u90A3\u6761\u8BA9\u4F4D\uFF08\u4E24\u5904\u540C\u65F6\u6709\u9009\u533A\u65F6\u4EE5\u672C\u6587\u6863\u4E3A\u51C6\uFF09\n env.state.bridgeActive = false\n if (!inPanel && (insideOwnUI(range.startContainer) || insideOwnUI(range.endContainer))) {\n // \u5386\u53F2\u5217\u8868 / \u80F6\u56CA / \u5DE5\u5177\u884C\u7684\u9009\u533A\uFF1A\u5F15\u7528\u6CA1\u6709\u610F\u4E49\uFF0C\u4E5F\u4E0D\u8BE5\u5F39\u6D6E\u6807\n env.state.quoteSelection = null\n env.hideQuoteButton()\n return\n }\n var label = inPanel ? panelSourceLabel(range.startContainer) : '\u4E3B\u754C\u9762\u9009\u4E2D'\n var rects = range.getClientRects()\n var rect = rects && rects.length > 0 ? rects[rects.length - 1] : range.getBoundingClientRect()\n if (!rect || (rect.width === 0 && rect.height === 0)) {\n env.state.quoteSelection = null\n env.hideQuoteButton()\n return\n }\n env.state.quoteSelection = {\n text: text.trim(),\n label: label,\n source: inPanel ? 'panel' : 'document',\n rect: rect,\n // \u4E0A\u4E0B\u6587\u7559\u5230**\u70B9\u5F15\u7528\u90A3\u4E00\u523B**\u624D\u91C7\uFF08\u6BCF\u6B21 selectionchange \u90FD\u91C7\u592A\u8D35\uFF09\uFF1A\n // \u8FD9\u91CC\u53EA\u8BB0\u4E0B\"\u5728\u54EA\u4E00\u8F6E\u4E0A\"\uFF08\u5C0F\u7A97\uFF09/ \u9009\u533A\u672C\u8EAB\uFF08\u4E3B\u754C\u9762\uFF0C\u7528\u6765\u91C7\u5C40\u90E8\u7A97\u53E3\uFF09\n turnIndex: inPanel ? env.turnIndexOfNode(range.startContainer) : -1,\n range: inPanel ? null : safeCloneRange(range),\n }\n showQuoteButton(rect)\n }\n\n /** \u514B\u9686\u9009\u533A\uFF08\u6869\u73AF\u5883/\u8001\u6D4F\u89C8\u5668\u6CA1\u6709 cloneRange \u5C31\u8FD4\u56DE null\uFF0C\u540E\u9762\u8D70\"\u53D6\u4E0D\u5230\u4E0A\u4E0B\u6587\"\u90A3\u6761\u8DEF\uFF09\u3002 */\n function safeCloneRange(range) {\n try {\n return typeof range.cloneRange === 'function' ? range.cloneRange() : null\n } catch (error) {\n return null\n }\n }\n\n function checkSelection() {\n if (env.panelOpen) {\n checkQuoteSelection()\n return\n }\n env.hideQuoteButton()\n env.state.quoteSelection = null\n var selection = window.getSelection()\n if (!selection || selection.rangeCount === 0 || selection.isCollapsed) {\n // \u4FA7\u8FB9\u680F\u7F51\u9875\u91CC\u7684\u9009\u533A**\u4E0D\u5728\u672C\u6587\u6863**\uFF1A\u70B9\u6D6E\u6807\u4F1A\u8BA9\u672C\u6587\u6863\u7684\u9009\u533A\u584C\u6389\n // \uFF08\u4E8E\u662F\u6BCF\u6B21\u70B9\u6D6E\u6807\u90FD\u4F1A\u5148\u8DD1\u5230\u8FD9\u91CC\uFF09\uFF0C\u6240\u4EE5\u53EA\u8981\u5E27\u5185\u90A3\u6761\u9009\u533A\u8FD8\u6D3B\u7740\u5C31\u522B\u6536\u6D6E\u6807\u3002\n // \u5E27\u5185\u6E05\u7A7A\u9009\u533A\u65F6\u6865\u4F1A\u53D1 clear\uFF0C\u90A3\u91CC\u624D\u662F\u771F\u6B63\u7684\"\u8BE5\u6536\"\u4FE1\u53F7\u3002\n if (env.state.bridgeActive && env.state.selection && env.state.selection.source === 'iframe') return\n hideButton()\n return\n }\n // \u672C\u6587\u6863\u91CC\u51FA\u73B0\u4E86\u771F\u9009\u533A\uFF1A\u5E27\u5185\u90A3\u6761\u8BA9\u4F4D\uFF08\u4E24\u5904\u540C\u65F6\u6709\u9009\u533A\u65F6\u4EE5\u672C\u6587\u6863\u4E3A\u51C6\uFF09\n env.state.bridgeActive = false\n // \u5212\u5230\u81EA\u5DF1\u754C\u9762\u4E0A\uFF08\u80F6\u56CA/\u9762\u677F/\u5386\u53F2\u5217\u8868\uFF09\u65F6\u4EC0\u4E48\u90FD\u4E0D\u505A\n try {\n var ownRange = selection.getRangeAt(0)\n if (insideOwnUI(ownRange.startContainer) || insideOwnUI(ownRange.endContainer)) {\n hideButton()\n return\n }\n } catch (error) {\n /* \u8001\u6D4F\u89C8\u5668/\u6869\u73AF\u5883\u53D6\u4E0D\u5230 range \u5C31\u7B97\u4E86\uFF0C\u6309\u8001\u8DEF\u5B50\u8D70 */\n }\n var text = String(selection.toString() || '')\n if (!text.trim() || text.length > preferences.maxSelectionChars) {\n hideButton()\n return\n }\n var range = selection.getRangeAt(0)\n // \u9009\u4E2D\u7684\u8282\u70B9\u88AB\u6574\u4E2A\u6458\u6389\u4E86\uFF08\u6D41\u5F0F\u56DE\u7B54\u91CD\u6E32\u67D3 / \u6D88\u606F\u6362\u6389\uFF09\uFF1A\u90A3\u6BB5\u6587\u5B57\u5DF2\u7ECF\u4E0D\u5728\u5C4F\u5E55\u4E0A\uFF0C\n // \u6D6E\u6807\u4E0D\u8BE5\u7559\u7740\uFF08\u5426\u5219\u70B9\u4E0B\u53BB\u89E3\u8BFB\u7684\u662F\u4E00\u6BB5\u4E0D\u5B58\u5728\u7684\u6587\u5B57\uFF09\n if (selectionDetached(range)) {\n hideButton()\n return\n }\n if (insideEditable(range.startContainer)) {\n hideButton()\n return\n }\n var rects = range.getClientRects()\n var rect = rects && rects.length > 0 ? rects[rects.length - 1] : range.getBoundingClientRect()\n if (!rect || (rect.width === 0 && rect.height === 0)) {\n hideButton()\n return\n }\n env.state.selection = { text: text.trim(), range: range.cloneRange(), rect: rect, source: 'document' }\n showButton(rect)\n }\n\n /** \u6302/\u6458\u6D6E\u73B0\u52A8\u6548\uFF08\u7528 data \u5C5E\u6027\u9A71\u52A8\u52A8\u753B\uFF0C\u4E0D\u52A8\u7C7B\u540D\uFF09\u3002 */\n function setButtonPop(on) {\n if (on) env.button.setAttribute('data-pop', '1')\n else env.button.removeAttribute('data-pop')\n }\n\n function showButton(rect) {\n // \u6D6E\u6807\u4E5F\u5728\u540C\u4E00\u5957\u914D\u8272\u4E0B\uFF1A\u5B83\u7684\u5E95\u8272\u662F\"\u9875\u9762\u80CC\u666F\"\uFF08\u6D6E\u5C42\u81EA\u8EAB\u900F\u660E\uFF09\uFF0C\u6309\u5B83\u5224\u6DF1\u6D45\n if (!env.panelOpen) env.layer.setAttribute('data-theme', env.currentSurfaceTheme())\n // \u53EA\u5728\"\u6D6E\u73B0\"\u90A3\u4E00\u6B21\u64AD\u52A8\u6548\uFF1B\u5DF2\u7ECF\u53EF\u89C1\u65F6\uFF08\u5212\u9009\u8303\u56F4\u88AB\u62D6\u52A8\u3001\u952E\u76D8\u8C03\u6574\uFF09\u53EA\u5E73\u79FB\uFF0C\u907F\u514D\u4E00\u76F4\u95EA\n if (placeFloat(env.button, rect)) {\n setButtonPop(false)\n void env.button.offsetWidth // \u5F3A\u5236\u91CD\u6392\uFF0C\u8BA9\u52A8\u753B\u80FD\u91CD\u64AD\n setButtonPop(true)\n }\n // \u6709\u9009\u533A\u4E86\uFF1A\u5F00\u59CB\u770B\"\u8F93\u5165\u6CD5\u662F\u4E0D\u662F\u6B63\u5728\u8BED\u97F3\u8F93\u5165\"\uFF08\u5E42\u7B49\uFF0C\u91CD\u590D\u8C03\u7528\u65E0\u526F\u4F5C\u7528\uFF09\n env.startMicWatch()\n }\n\n function hideButton() {\n env.button.style.display = 'none'\n setButtonPop(false)\n // \u6D6E\u6807\u6536\u4E86\u5C31\u6CA1\u4EC0\u4E48\u53EF\u7B49\u7684\u4E86 \u2014\u2014 \u4F46\u8BED\u97F3\u5361\u5F00\u7740\u65F6**\u4E0D\u80FD\u505C**\uFF1A\n // \u5361\u7247\u672C\u8EAB\u5C31\u662F\"\u68C0\u6D4B\u5230\u5F00\u9EA6\"\u7684\u7ED3\u679C\uFF0C\u5B83\u8FD8\u8981\u9760\u8F6E\u8BE2\u5224\u65AD\"\u8BF4\u5B8C\u4E86\u6CA1\u6709\"\n if (!env.vcardState.open) env.stopMicWatch()\n }\n\n /**\n * \u6D6E\u6807\u5B9A\u4F4D\uFF08\u300C\u89E3\u8BFB\u300D\u4E0E\u300C\u5F15\u7528\u300D\u4E24\u4E2A\u6D6E\u6807\u5171\u7528\u4E00\u5957\u89C4\u5219\uFF09\uFF1A\n * \u8D34\u9009\u533A\u53F3\u4E0B\u89D2\uFF1B\u4E0A\u9762\u653E\u4E0D\u4E0B\uFF08\u8D34\u5230\u89C6\u53E3\u9876\uFF09\u5C31\u7FFB\u5230\u9009\u533A\u4E0B\u65B9\uFF1B\u5DE6\u53F3\u5939\u56DE\u89C6\u53E3\u5185\u3002\n * \u8FD4\u56DE\"\u8FD9\u6B21\u662F\u4ECE\u9690\u85CF\u53D8\u53EF\u89C1\" \u2014\u2014 \u8C03\u7528\u65B9\u636E\u6B64\u51B3\u5B9A\u8981\u4E0D\u8981\u64AD\u6D6E\u73B0\u52A8\u6548\u3002\n */\n function placeFloat(node, rect) {\n var wasHidden = node.style.display !== 'inline-flex'\n node.style.display = 'inline-flex'\n var width = node.offsetWidth || 62\n var height = node.offsetHeight || 28\n var left = clamp(rect.right - width, 8, Math.max(8, window.innerWidth - width - 8))\n var top = rect.top - height - 7\n if (top < 8) top = Math.min(rect.bottom + 7, window.innerHeight - height - 8)\n node.style.left = Math.round(left) + 'px'\n node.style.top = Math.round(top) + 'px'\n return wasHidden\n }\n\n function setQuotePop(on) {\n if (on) env.quoteButton.setAttribute('data-pop', '1')\n else env.quoteButton.removeAttribute('data-pop')\n }\n\n function showQuoteButton(rect) {\n if (placeFloat(env.quoteButton, rect)) {\n setQuotePop(false)\n void env.quoteButton.offsetWidth\n setQuotePop(true)\n }\n // \u6D6E\u6807\u4EAE\u7740\u5C31\u76EF\"\u8F93\u5165\u6CD5\u6709\u6CA1\u6709\u5F00\u9EA6\"\uFF08\u5E42\u7B49\uFF09\uFF1A\u8FD9\u65F6\u5F00\u9EA6\u7684\u8BED\u4E49\u662F\"\u5F15\u7528\u8FD9\u6BB5 + \u628A\u5149\u6807\u79FB\u8FDB\u5C0F\u7A97\"\uFF0C\n // \u89C1 autoQuoteFromVoice\u3002\u6CA1\u6D6E\u6807\u5C31\u6CA1\u4EBA\u95EE \u2014\u2014 \u63A2\u9488\u4E5F\u8DDF\u7740\u505C\uFF08\u5B83\u53EA\u5728\u88AB\u95EE\u65F6\u6D3B\u7740\uFF09\u3002\n env.startMicWatch()\n }\n return {\n hideButton,\n showQuoteButton,\n showButton,\n setButtonPop,\n setQuotePop,\n scheduleCheck,\n panelSourceLabel,\n insidePanelContent,\n turnLabelOf,\n }\n}\n", "import { el, listen } from './dom.js'\nimport { VOICE_SETTLE_COMPOSE_MS, VCARD_TEXT_MAX, VCARD_PAD_Y, VCARD_W, VOICE_SETTLE_MAX_MS, VOICE_SETTLE_MS, VOICE_SETTLE_POLL_MS, FRAME_FOCUS_EVIDENCE_MS, IME_BUNDLES, MIC_POLL_MS, MIC_API } from './constants.js'\nimport { isDarkSurface } from './render.js'\nimport { collectContext } from './context.js'\n\n/** voice-card state and operations; dependencies are supplied as live node/callback accessors. */\nexport function createVoiceCardController(env) {\n\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 \u8BED\u97F3\u5361\uFF1A\u9009\u4E2D\u6587\u5B57 + \u8F93\u5165\u6CD5\u6B63\u5728\u8BED\u97F3\u8F93\u5165 \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n //\n // \u573A\u666F\uFF1A\u7528\u6237\u5212\u9009\u4E00\u6BB5\u6587\u5B57\uFF0C\u540C\u65F6\u6B63\u7528\u8F93\u5165\u6CD5\uFF08\u8C46\u5305\uFF09\u5BF9\u7740\u9EA6\u514B\u98CE\u8BF4\u8BDD\u3002\n // \u8FD9\u65F6\u5728\u90A3\u6BB5\u6587\u5B57**\u4E0B\u65B9**\u5F39\u4E00\u5F20\u4E34\u65F6\u8F93\u5165\u6846\u5E76\u81EA\u52A8\u805A\u7126 \u2014\u2014 \u8F93\u5165\u6CD5\"\u4E0A\u5C4F\"\u7684\u6587\u5B57\u4F1A\u76F4\u63A5\n // \u843D\u8FDB\u8FD9\u4E2A\u6846\uFF08IME \u53EA\u8BA4\u7126\u70B9\u5143\u7D20\uFF09\uFF0C\u6240\u4EE5\u6211\u4EEC**\u4E0D\u9700\u8981**\u8BFB\u5B83\u7684\u8F6C\u5199\u7ED3\u679C\uFF0C\u4E5F\u4E0D\u9700\u8981\u4EFB\u4F55\n // \u8F93\u5165\u6CD5\u6743\u9650\u3002\u70B9\u53D1\u9001\u5C31\u8DF3\u8FC7\u7FFB\u8BD1\u4E0E\u8BE6\u89E3\uFF0C\u76F4\u63A5\u8FDB\u8FFD\u95EE\u3002\n //\n // \u4E09\u6761\u524D\u63D0\uFF0C\u7F3A\u4E00\u4E0D\u53EF\uFF08\u7F3A\u4E86\u5C31\u5B8C\u5168\u4E0D\u5F39\uFF0C\u4E0D\u88C5\u4F5C\u5728\u7B49\uFF09\uFF1A\n // \u2460 \u9009\u533A\u5728\u672C\u6587\u6863\u91CC\uFF08\u539F\u751F App \u91CC\u7684\u9009\u533A\u6211\u4EEC\u65E2\u770B\u4E0D\u5230\u3001\u4E5F\u63A5\u4E0D\u4F4F\u4E0A\u5C4F\uFF09\uFF1B\n // \u2461 \u5360\u7740\u9EA6\u514B\u98CE\u7684\u662F\u5DF2\u77E5\u8F93\u5165\u6CD5\uFF08IME_BUNDLES\uFF09\uFF1B\n // \u2462 \u9875\u9762\u6709\u7126\u70B9\u3001\u4E14\u7528\u6237\u6CA1\u5728\u522B\u5904\u6253\u5B57\uFF08\u5426\u5219\u4F1A\u628A\u4EBA\u5BB6\u5728\u522B\u5904\u7684\u542C\u5199\u62A2\u8FC7\u6765\uFF09\u3002\n //\n // \u65F6\u5E8F\u662F\u6574\u4EF6\u4E8B\u6210\u7ACB\u7684\u5173\u952E\uFF1A\u68C0\u6D4B\u5230\u5F00\u9EA6\uFF08\u2264400ms\uFF09\u2192 \u5F39\u5361 + \u62A2\u7126\u70B9 \u2192 \u7528\u6237\u7EE7\u7EED\u8BF4 \u2192\n // **\u677E\u624B\u65F6**\u8F93\u5165\u6CD5\u624D\u4E0A\u5C4F\u3002\u62A2\u7126\u70B9\u53D1\u751F\u5728\u5F00\u59CB\u65F6\u3001\u4E0A\u5C4F\u53D1\u751F\u5728\u7ED3\u675F\u65F6\uFF0C\u4E2D\u95F4\u6709\u51E0\u79D2\u4F59\u91CF\uFF1B\n // \u53CD\u8FC7\u6765\"\u7B49\u68C0\u6D4B\u5230\u6587\u5B57\u518D\u5F39\u6846\"\u5C31\u5DF2\u7ECF\u665A\u4E86 \u2014\u2014 \u5B57\u4F1A\u843D\u5230\u539F\u6765\u90A3\u4E2A\u7126\u70B9\u91CC\u53BB\u3002\n //\n // \u2500\u2500 \u4E24\u6761\u8DEF\uFF0C\u6309\"\u5C0F\u7A97\u5F00\u6CA1\u5F00\"\u5206\uFF082026-10-09 \u8D77\uFF09\u2500\u2500\n // \u00B7 \u5C0F\u7A97**\u6CA1\u5F00**\uFF1A\u4E0A\u9762\u8FD9\u5957\u8BED\u97F3\u5361\uFF08\u9009\u533A\u662F\"\u8981\u89E3\u8BFB\u7684\u5BF9\u8C61\"\uFF0C\u8BF4\u5B8C\u8FDB\u4E00\u4E2A\u65B0\u7684\u8FFD\u95EE\uFF09\u3002\n // \u00B7 \u5C0F\u7A97**\u5F00\u7740**\uFF1A\u5212\u8BCD\u6D6E\u51FA\u7684\u662F\u300C\u275D \u5F15\u7528\u300D\u6D6E\u6807\uFF0C\u8FD9\u65F6\u5F00\u9EA6\u7B49\u4E8E**\u70B9\u4E00\u4E0B\u90A3\u4E2A\u6D6E\u6807** \u2014\u2014\n // \u9009\u4E2D\u7684\u6587\u5B57\u6302\u8FDB\u5C0F\u7A97\u3001\u5149\u6807\u79FB\u5230\u5C0F\u7A97\u8F93\u5165\u6846\uFF0C\u8F93\u5165\u6CD5\u4E0A\u5C4F\u7684\u5B57\u76F4\u63A5\u843D\u8FDB\u5C0F\u7A97\uFF0C\n // \u548C\u5F15\u7528\u4E00\u8D77\u6210\u4E3A\u4E0B\u4E00\u6761\u8FFD\u95EE\uFF08`autoQuoteFromVoice`\uFF09\u3002\n // \u4E24\u79CD\u60C5\u5F62\u4E92\u65A5\uFF1A\u9762\u677F\u4E00\u5F00\uFF0C`state.selection` \u5C31\u88AB\u6E05\u6210 null\uFF0C\u8BED\u97F3\u5361\u90A3\u5957\u6839\u672C\u4E0D\u542F\u52A8\u3002\n // \u8F6E\u8BE2\u4E5F\u53EA\u8DDF\u7740\u6D6E\u6807\u8D70\uFF08\u6D6E\u6807\u4EAE\u7740\u624D\u95EE /api/mic\uFF09\uFF0C\u6CA1\u6D6E\u6807\u5C31\u6CA1\u4EBA\u95EE\u3002\n\n var vcard = null\n\n var vcardBox = null\n\n var vcardSend = null\n\n /** \u5173\u673A\u52A8\u753B\u90A3\u6761\u4EAE\u7EBF\uFF08\u61D2\u5EFA\uFF09\u3002 */\n var crtLine = null\n\n /**\n * \u53D1\u9001\u90A3\u4E00\u523B\u5361\u7247\u7684\u77E9\u5F62\uFF08\u89C6\u53E3\u5750\u6807\uFF09\u2014\u2014 \u5C0F\u7A97\u636E\u6B64\"\u4ECE\u90A3\u4E00\u683C\u957F\u51FA\u6765\"\u3002\n * \u53EA\u5728 sendVCard \u91CC\u5199\u3001\u53EA\u5728 showPanel \u91CC\u6D88\u8D39\uFF08\u7528\u5B8C\u5373\u6E05\uFF09\uFF1A\u5176\u4F59\u5F00\u7A97\u8DEF\u5F84\uFF08\u5212\u8BCD\u89E3\u8BFB /\n * \u5386\u53F2\u56DE\u653E / \u5347\u683C\uFF09\u8FD9\u91CC\u662F null\uFF0C\u56E0\u6B64\u4E0D\u53D7\u5F71\u54CD\u3001\u4FDD\u6301\u539F\u6765\u7684\"\u77AC\u5F00\"\u3002\n */\n var vcardHandoff = null\n\n /** \u4EA4\u63A5\u52A8\u753B\u7684\u515C\u5E95\u5B9A\u65F6\u5668\u4E0E transitionend \u53E5\u67C4\uFF08\u6536\u5C3E\u8981\u628A\u5185\u8054\u7684 transform/transition \u6E05\u5E72\u51C0\uFF09\u3002 */\n var panelGrowTimer = null\n\n var panelGrowHandler = null\n\n /**\n * \u8FD9\u4E00\u6B21\u5F55\u97F3\u5468\u671F\u91CC\uFF0C\"\u5F00\u9EA6 \u2192 \u81EA\u52A8\u52A0\u5F15\u7528 + \u79FB\u5149\u6807\"\u5904\u7406\u8FC7\u6CA1\u6709\u3002\n *\n * \u4E3A\u4EC0\u4E48\u8981\u8FD9\u4E2A\uFF1A\u9EA6\u514B\u98CE\u662F\u6BCF 200ms \u95EE\u4E00\u6B21\u7684\uFF0C\u540C\u4E00\u6B21\u5F55\u97F3\u4F1A\u88AB\u95EE\u5230\u5341\u51E0\u904D \u2014\u2014\n * \u4E0D\u6291\u5236\u7684\u8BDD\u5F15\u7528\u4F1A\u88AB\u53CD\u590D\u52A0\uFF08\u867D\u7136 addQuote \u5BF9\u91CD\u590D\u6587\u672C\u4F1A\u6321\u6389\uFF0C\u4F46 hideQuoteButton /\n * focusAskBox \u4F1A\u88AB\u53CD\u590D\u6267\u884C\uFF0C\u8F93\u5165\u6CD5\u7684\u8F93\u5165\u4E0A\u4E0B\u6587\u4E5F\u4F1A\u88AB\u53CD\u590D\u91CD\u7ED1\uFF09\u3002\n * \u4E0E vcardState.suppress \u540C\u4E00\u5957\u601D\u8DEF\uFF1A\u5F55\u97F3**\u505C\u6B62**\u65F6\u590D\u4F4D\uFF08\u89C1 micTick \u7684 !matchingIme \u5206\u652F\uFF09\u3002\n */\n var quoteVoiceHandled = false\n\n /** \u9009\u4E2D\u63D0\u793A\uFF1A\u4E0B\u5212\u7EBF\u5C42 / \u7275\u5F15\u7EBF / \u7275\u5F15\u7EBF\u8D77\u70B9\u7684\u5C0F\u5706\u70B9\uFF08\u61D2\u5EFA\uFF09\u3002 */\n var selMark = null\n\n var selThread = null\n\n var selThreadPath = null\n\n var selThreadDot = null\n\n var vcardState = {\n open: false,\n /** \u6253\u5F00\u65F6\u7684\u9009\u533A\u5FEB\u7167\uFF08\u6EDA\u52A8 / \u6539\u7A97\u53E3\u5927\u5C0F\u65F6\u6309\u5B83\u91CD\u7B97\u4F4D\u7F6E\uFF09\u3002 */\n range: null,\n /**\n * \u6253\u5F00\u65F6\u7684\u951A\u70B9\u77E9\u5F62\uFF08\u89C6\u53E3\u5750\u6807\uFF09\u3002\n *\n * \u4FA7\u8FB9\u680F\u7F51\u9875\u90A3\u6761\u8DEF**\u6CA1\u6709 Range**\uFF08\u4E0D\u900F\u660E\u6E90\u5E27\u91CC\u7684\u9009\u533A\u62FF\u4E0D\u51FA\u6765\uFF09\uFF0C\u5B9A\u4F4D\u53EA\u80FD\u9760\u6865\u6362\u7B97\u597D\u7684\n * \u77E9\u5F62 \u2014\u2014 \u65B0\u7684 selection \u6D88\u606F\u4F1A\u5237\u65B0\u5B83\uFF0C\u4E8E\u662F\u5E27\u5185\u6EDA\u52A8 / \u91CD\u62A5\u65F6\u5361\u7247\u8DDF\u7740\u8D70\u3002\n */\n anchorRect: null,\n timer: null,\n /** \u4E0A\u4E00\u6B21 /mic \u8FD8\u6CA1\u56DE\u6765\uFF08\u4E0D\u53E0\u8BF7\u6C42\uFF09\u3002 */\n busy: false,\n /**\n * \u7528\u6237\u521A\u53D6\u6D88\u8FC7\u8FD9\u6B21\u5F55\u97F3\uFF08Esc / \u70B9\u7A7A\u767D\uFF09\uFF1A\u5728**\u8FD9\u6B21\u5F55\u97F3\u7ED3\u675F\u4E4B\u524D**\u4E0D\u518D\u81EA\u52A8\u5F39\u5361\u7247\u3002\n * \u6CA1\u6709\u5B83\u7684\u8BDD\uFF1AEsc \u6536\u5361\u7247 \u2192 \u6062\u590D\u6D6E\u6807 \u2192 \u4E0B\u4E00\u62CD\u8F6E\u8BE2\u53D1\u73B0\"\u8FD8\u5728\u5F55\" \u2192 \u5361\u7247\u53C8\u5F39\u56DE\u6765\uFF0C\n * Esc \u770B\u8D77\u6765\u50CF\u5931\u7075\uFF08\u5B9E\u6D4B\u5C31\u662F\u8FD9\u4E48\u66B4\u9732\u51FA\u6765\u7684\uFF09\u3002\u7B49 !capturing \u624D\u89E3\u9664\u3002\n */\n suppress: false,\n /** \u5F62\u53D8\u671F\u95F4\u9489\u4F4F\u6B63\u6587\u5BBD\u5EA6\u7528\u7684\u515C\u5E95\u5B9A\u65F6\u5668 / transitionend \u53E5\u67C4\u3002 */\n unpinTimer: null,\n unpinHandler: null,\n /** \u6B63\u5728\u64AD\u5173\u673A\u52A8\u753B\uFF08\u8FD9\u6BB5\u65F6\u95F4\u5185\u5361\u7247\u8FD8\u6CA1\u771F\u6B63\u9690\u85CF\uFF09\u3002 */\n closing: false,\n /** \u5173\u673A\u52A8\u753B\u7684\u515C\u5E95\u5B9A\u65F6\u5668 / animationend \u53E5\u67C4\u3002 */\n crtTimer: null,\n crtHandler: null,\n /** \"\u7B49\u6587\u5B57\u5B9A\u7A3F\"\u7684\u89C2\u5BDF\uFF08\u677E\u624B\u540E\u8C46\u5305\u8FD8\u4F1A\u667A\u80FD\u6574\u7406\uFF0C\u89C1 VOICE_SETTLE_MS\uFF09\u3002 */\n settleTimer: null,\n settleLastText: '',\n settleStableAt: 0,\n settleDeadline: 0,\n /** \u6536\u5230 compositionend \u540E\u7684\u77ED\u5B9A\u65F6\u5668\uFF08\u89C1 VOICE_SETTLE_COMPOSE_MS\uFF09\u3002 */\n settleComposeTimer: null,\n }\n\n function ensureVCard() {\n if (vcard) return\n vcard = el('div', 'dsh-sel-vcard')\n vcard.setAttribute('data-voiced', '0')\n vcard.setAttribute('data-text', '0')\n // \u300C\u5728\u542C\u300D\u90A3\u6839 3px \u7AD6\u6761\uFF1A\u4F5C\u4E3A\u7B2C\u4E00\u4E2A flex \u5B50\u5143\u7D20\uFF0C\u6B63\u6587\u6392\u5728\u5B83\u53F3\u8FB9\uFF08\u5360 3+9=12px\uFF09\n vcard.appendChild(el('div', 'dsh-sel-vbar'))\n vcardBox = el('textarea', 'dsh-sel-vcard-box')\n vcardBox.rows = 1\n vcardBox.placeholder = '\u6B63\u5728\u542C\u2026'\n vcardBox.setAttribute('spellcheck', 'false')\n vcardSend = el('button', 'dsh-sel-vcard-send')\n vcardSend.type = 'button'\n vcardSend.title = '\u76F4\u63A5\u8FFD\u95EE\uFF08\u8DF3\u8FC7\u7FFB\u8BD1\u4E0E\u8BE6\u89E3\uFF09'\n vcardSend.textContent = '\u2191'\n vcard.appendChild(vcardBox)\n vcard.appendChild(vcardSend)\n env.layer.appendChild(vcard)\n listen(vcardBox, 'input', syncVCardText)\n // \u8F93\u5165\u6CD5\u4E0A\u5C4F\u6709\u7684\u73AF\u5883\u53EA\u53D1 compositionend \u800C\u4E0D\u53D1 input\uFF1A\u8865\u4E00\u6B21\uFF08\u5E42\u7B49\uFF09\n listen(vcardBox, 'compositionend', syncVCardText)\n // \u300C\u7B49\u5B9A\u7A3F\u300D\u7684\u4E3B\u4FE1\u53F7\uFF1A\u8F93\u5165\u6CD5\u7684\u667A\u80FD\u6574\u7406**\u8D70\u5408\u6210 API \u63D0\u4EA4**\uFF08\u5B9E\u6D4B 8 \u6B21\u5F55\u97F3\u91CC 6 \u6B21\u90FD\u6709\n // inputType=insertCompositionText + compositionend\uFF09\u3002\u6536\u5230\u5C31\u5728\u77ED\u7A97\u53E3\u540E\u51B3\u5B9A\uFF0C\n // \u4E0D\u5FC5\u7B49\u515C\u5E95\u7684 500ms \u9759\u9ED8\uFF1B\u8FDE\u7740\u6765\u4E24\u6B21\uFF08\u6807\u70B9\u4E00\u6B21\u3001\u6539\u8BCD\u4E00\u6B21\uFF09\u5C31\u91CD\u65B0\u8BA1\u65F6\u3002\n listen(vcardBox, 'compositionend', function () {\n if (!vcardState.settleTimer) return\n if (vcardState.settleComposeTimer) clearTimeout(vcardState.settleComposeTimer)\n vcardState.settleComposeTimer = setTimeout(function () {\n vcardState.settleComposeTimer = null\n if (!vcardState.open || !vcardState.settleTimer) return\n var settled = String((vcardBox && vcardBox.value) || '')\n stopVoiceSettle()\n finishVoiceSettle(settled)\n }, VOICE_SETTLE_COMPOSE_MS)\n })\n listen(vcardBox, 'keyup', syncVCardText)\n listen(vcardBox, 'keydown', function (event) {\n // Enter \u53D1\u9001\u3001Shift+Enter \u6362\u884C\uFF1B\u8F93\u5165\u6CD5\u786E\u8BA4\u5019\u9009\u8BCD\u7684\u90A3\u4E2A Enter \u4E0D\u7B97\uFF08\u4E0E\u8FFD\u95EE\u6846\u540C\u4E00\u5957\u5224\u65AD\uFF09\n if (event.key === 'Enter' && !event.shiftKey && !event.isComposing && event.keyCode !== 229) {\n event.preventDefault()\n sendVCard()\n }\n })\n listen(vcardSend, 'click', function (event) {\n event.preventDefault()\n event.stopPropagation()\n sendVCard()\n })\n // \u5361\u7247\u91CC\u7684\u9F20\u6807\u52A8\u4F5C\u522B\u5192\u6CE1\u51FA\u53BB\uFF1A\u5916\u9762\u90A3\u5957\"\u70B9\u522B\u5904\u5C31\u6536\u6D6E\u6807\"\u7684\u903B\u8F91\u4F1A\u628A\u5361\u6536\u6389\n listen(vcard, 'mousedown', function (event) {\n event.stopPropagation()\n })\n // \u2463 \u70B9\u5C4F\u5E55\u7A7A\u767D\u5904\u6536\u5361\u7247\u3002\u7528 capture\uFF1A\u5361\u7247\u81EA\u5DF1\u7684 mousedown \u662F\u5192\u6CE1\u9636\u6BB5\uFF0C\n // \u8FD9\u91CC\u5148\u8DD1\uFF0C\u6240\u4EE5\u5224\u65AD\"\u5728\u4E0D\u5728\u5361\u7247\u91CC\"\u5FC5\u987B\u7528 contains \u800C\u4E0D\u662F\u9760\u5192\u6CE1\u987A\u5E8F\u3002\n listen(document, 'mousedown', function (event) {\n if (!vcardState.open) return\n var target = event.target\n if (target && (target === vcard || (vcard.contains && vcard.contains(target)))) return\n vcardState.suppress = true\n closeVCard(true)\n }, true)\n listen(window, 'scroll', function () {\n if (vcardState.open) repositionVCard()\n }, true)\n listen(window, 'resize', function () {\n if (vcardState.open) repositionVCard()\n })\n }\n\n /** \u6709\u5B57\u4E86\u624D\u6446\u51FA\u53D1\u9001\u952E\uFF1B\u9AD8\u5EA6\u8DDF\u7740\u5185\u5BB9\u957F\uFF08\u6700\u591A 4 \u884C\uFF0C\u518D\u591A\u5185\u90E8\u6EDA\u52A8\u5E76\u505C\u5728\u6700\u65B0\u4E00\u884C\uFF09\u3002 */\n function syncVCardText() {\n if (!vcard || !vcardBox) return\n vcard.setAttribute('data-text', String(vcardBox.value || '').trim() ? '1' : '0')\n growVCardBox()\n }\n\n /**\n * \u5F62\u53D8\u7ED3\u675F\u540E\u89E3\u5F00\u6B63\u6587\u5BBD\u5EA6\uFF08\u56DE\u5230 flex \u5E03\u5C40\uFF09\u3002\n *\n * \u5F62\u53D8\u671F\u95F4\u6B63\u6587\u5BBD\u5EA6\u88AB\u9489\u5728\u7EC8\u503C\uFF08\u89C1 openVCard \u2461\uFF09\uFF1A\u5361\u7247\u53D8\u5BBD\u53EA\u662F\"\u63ED\u5F00\"\u5B83\u3002\n * \u4E0D\u89E3\u5F00\u7684\u8BDD\uFF0C\u4E4B\u540E\u6253\u5B57\u65F6\u6B63\u6587\u5BBD\u5EA6\u4E0D\u4F1A\u518D\u8DDF\u7740\u5361\u7247\u8D70\u3002\n */\n function unpinVCardBox() {\n if (vcardState.unpinTimer) {\n clearTimeout(vcardState.unpinTimer)\n vcardState.unpinTimer = null\n }\n if (vcard && vcardState.unpinHandler) {\n vcard.removeEventListener('transitionend', vcardState.unpinHandler)\n vcardState.unpinHandler = null\n }\n if (!vcardBox) return\n vcardBox.style.flex = ''\n vcardBox.style.width = ''\n }\n\n /**\n * \u6392\u4E00\u6B21\"\u89E3\u5F00\u6B63\u6587\u5BBD\u5EA6\"\u3002\n *\n * transitionend \u662F\u4E3B\u8DEF\u5F84\uFF1B\u53E6\u6302\u4E00\u4E2A\u515C\u5E95\u5B9A\u65F6\u5668 \u2014\u2014 \u5F62\u53D8\u88AB\u6253\u65AD\uFF08\u5207\u7A97\u53E3\u3001\u7ACB\u523B\u5173\u5361\u7247\uFF09\u65F6\n * transitionend \u53EF\u80FD\u6C38\u8FDC\u4E0D\u6765\uFF0C\u6B63\u6587\u5BBD\u5EA6\u5C31\u4F1A\u4E00\u76F4\u9489\u7740\u3002\n */\n function scheduleVCardUnpin() {\n if (!vcard) return\n if (vcardState.unpinTimer) {\n clearTimeout(vcardState.unpinTimer)\n vcardState.unpinTimer = null\n }\n if (vcardState.unpinHandler) {\n vcard.removeEventListener('transitionend', vcardState.unpinHandler)\n vcardState.unpinHandler = null\n }\n vcardState.unpinHandler = function (event) {\n if (event.target !== vcard) return\n if (event.propertyName === 'width') unpinVCardBox()\n // \u26A0\uFE0F \u8FD9\u91CC**\u4E0D\u8981**\u91CD\u753B\u9009\u4E2D\u63D0\u793A\u3002\n // \u66FE\u7ECF\u52A0\u8FC7\"\u5F62\u53D8\u7ED3\u675F\u540E\u91CD\u753B\u4E00\u6B21\"\u5F53\u5B89\u5168\u7F51\uFF0C\u7ED3\u679C\u662F**\u95EA\u4E00\u4E0B**\uFF1A\n // \u91CD\u753B\u4F1A\u5148 clearSelectionMarkers()\uFF08\u7275\u5F15\u7EBF display:none\uFF09\u518D\u91CD\u753B\uFF08block\uFF09\uFF0C\n // \u800C display:none \u2192 block \u4F1A\u8BA9\u751F\u957F\u52A8\u753B**\u91CD\u653E** \u2014\u2014 \u7528\u6237\u770B\u5230\u7684\u5C31\u662F\"\u66F2\u7EBF\u751F\u6210\u540E\u95EA\u4E00\u4E0B\u3001\n // \u518D\u91CD\u65B0\u957F\u4E00\u904D\"\u3002\u800C\u4E14\u5361\u7247\u5F62\u53D8\u4F1A\u5206\u522B\u89E6\u53D1 top \u548C height \u4E24\u6B21\uFF0C\u6240\u4EE5\u95EA\u4E24\u6B21\u3002\n // \u73B0\u5728\u7EC8\u70B9\u7528\u7684\u662F\u7B97\u51FA\u6765\u7684**\u6700\u7EC8\u4F4D\u7F6E**\uFF08\u4E0D\u8BFB\u5361\u7247\u5F53\u4E0B\u7684 rect\uFF09\uFF0C\u672C\u6765\u5C31\u4E0D\u9700\u8981\u8FD9\u6B21\u91CD\u753B\u3002\n }\n vcard.addEventListener('transitionend', vcardState.unpinHandler)\n vcardState.unpinTimer = env.later(unpinVCardBox, 420)\n }\n\n function growVCardBox() {\n if (!vcardBox || !vcard) return\n vcardBox.style.height = 'auto'\n var content = Math.max(24, Math.min(vcardBox.scrollHeight, VCARD_TEXT_MAX))\n vcardBox.style.height = content + 'px'\n vcardBox.style.overflowY = vcardBox.scrollHeight > VCARD_TEXT_MAX ? 'auto' : 'hidden'\n if (vcardBox.scrollHeight > VCARD_TEXT_MAX) vcardBox.scrollTop = vcardBox.scrollHeight\n vcard.style.height = (content + VCARD_PAD_Y) + 'px'\n }\n\n /**\n * \u5361\u7247\u51E0\u4F55\uFF1A\u53F3\u7F18\u9489\u5728\u6D6E\u6807\u53F3\u7F18\uFF08\u6A2A\u5411\u4E0D\u8DF3\uFF09\uFF0C\u5DE6\u7F18\u5C55\u5F00\u5230**\u6B63\u6587\u5217\u5DE6\u8FB9**\u3002\n * \u5BBD\u5EA6\u4E0D\u662F\u62CD\u8111\u888B\u5B9A\u7684 \u2014\u2014 \u5B83\u662F\"\u6D6E\u6807\u53F3\u7F18 \u2212 \u6B63\u6587\u5217\u5DE6\u8FB9\"\uFF0C\u6240\u4EE5\u5C55\u5F00\u540E\u5DE6\u7F18\u6B63\u597D\u548C\u6B63\u6587\u5BF9\u9F50\u3002\n * \u7EB5\u5411\u843D\u5728\u6574\u5757\u6587\u5B57\u4E0B\u65B9\uFF08\u4E0D\u662F\u9009\u4E2D\u90A3\u4E00\u884C\u4E0B\u65B9\uFF09\uFF1A\u5426\u5219\u4F1A\u538B\u4F4F\u4E0B\u9762\u90A3\u884C\u6B63\u6587\u3002\n */\n function vcardGeometry() {\n var range = vcardState.range\n var rect = null\n if (range) {\n try {\n rect = range.getBoundingClientRect()\n } catch (error) {\n rect = null\n }\n }\n // \u4FA7\u8FB9\u680F\u7F51\u9875\u90A3\u6761\u8DEF\u6CA1\u6709 Range\uFF1A\u951A\u70B9\u7528\u6865\u6362\u7B97\u597D\u7684\u89C6\u53E3\u77E9\u5F62\uFF08\u4E24\u8005\u90FD\u662F\u89C6\u53E3\u5750\u6807\uFF0C\u53EF\u76F4\u63A5\u6DF7\u7528\uFF09\u3002\n if ((!rect || (!rect.width && !rect.height)) && vcardState.anchorRect) rect = vcardState.anchorRect\n if (!rect || (!rect.width && !rect.height)) return null\n // \u5E27\u5185\u9009\u533A\u53EA\u77E5\u9053\u81EA\u5DF1\u90A3\u4E00\u6BB5\uFF08\"\u5757\"\u662F\u5E27\u5185\u7684\u4E8B\uFF0C\u7236\u9875\u9762\u770B\u4E0D\u89C1\uFF09\uFF1A\u6574\u5757\u5C31\u7528\u5B83\u81EA\u5DF1\uFF0C\n // \u4E8E\u662F\"\u843D\u5728\u6574\u6BB5\u6587\u5B57\u4E0B\u65B9\"\u8FD9\u6761\u89C4\u5219\u5728\u7F51\u9875\u91CC\u9000\u5316\u6210\"\u843D\u5728\u8FD9\u6BB5\u9009\u533A\u4E0B\u65B9\"\u3002\n var blockRect = (range && selectionBlockRect(range)) || rect\n var right = Math.min(rect.right, Math.max(8, window.innerWidth - 8))\n var width = VCARD_W\n var left = Math.max(8, right - width)\n // \u26A0\uFE0F \u7EB5\u5411\u5FC5\u987B\u6309**\u6574\u4E2A\u9009\u533A**\u7684\u5E95\u8FB9\u7B97\uFF0C\u4E0D\u80FD\u53EA\u6309\"\u9009\u533A\u8D77\u70B9\u6240\u5728\u7684\u5757\"\uFF1A\n // \u9009\u4E2D\u8DE8\u591A\u4E2A\u6BB5\u843D / \u4EE3\u7801\u5757\u65F6\uFF0C\u8D77\u70B9\u90A3\u4E2A\u5757\u7684\u5E95\u8FB9\u843D\u5728\u9009\u533A**\u4E2D\u95F4**\uFF0C\n // \u5361\u7247\u5C31\u4F1A\u538B\u5728\u5269\u4E0B\u7684\u9009\u4E2D\u6587\u5B57\u4E0A\uFF08\u7528\u6237\u5B9E\u6D4B\uFF1A\"\u9009\u5927\u6BB5\u6587\u5B57\u65F6\u5361\u7247\u6709\u6982\u7387\u906E\u4F4F\u6587\u5B57\"\uFF09\u3002\n var below = Math.max(blockRect.bottom, rect.bottom) + 22\n var top = below\n var cardHeight = 42\n try {\n var own = vcard && vcard.getBoundingClientRect()\n if (own && own.height) cardHeight = own.height\n } catch (error) {\n /* \u8BFB\u4E0D\u5230\u5C31\u6309\u5355\u884C 42 \u4F30 */\n }\n // \u4E0B\u65B9\u653E\u4E0D\u4E0B\u5C31\u7FFB\u5230\u9009\u533A\u4E0A\u65B9\uFF1B\u4E0A\u65B9\u4E5F\u653E\u4E0D\u4E0B\uFF08\u9009\u533A\u6BD4\u89C6\u53E3\u8FD8\u9AD8\uFF09\u5C31\u8D34\u89C6\u53E3\u5E95\u8FB9 \u2014\u2014\n // \u5B81\u53EF\u538B\u5728\u53EF\u89C1\u6587\u5B57\u7684\u4E0B\u7F18\uFF0C\u4E5F\u4E0D\u8981\u628A\u5361\u7247\u63A8\u5230\u5C4F\u5E55\u5916\uFF08\u90A3\u6837\u7B49\u4E8E\u6CA1\u5F39\uFF09\n if (below + cardHeight > window.innerHeight - 8) {\n var above = rect.top - cardHeight - 22\n top = above >= 8 ? above : Math.max(8, window.innerHeight - cardHeight - 16)\n }\n return { left: left, top: top, width: width, height: cardHeight }\n }\n\n /** \u9009\u533A\u6240\u5728\u7684\u90A3\u4E2A\"\u5757\"\uFF08\u6BB5\u843D / \u5217\u8868\u9879 / \u5355\u5143\u683C\uFF09\u2014\u2014 \u5361\u7247\u6302\u5728\u5B83\u7684\u4E0B\u65B9\u3002 */\n function selectionBlockRect(range) {\n var node = range.startContainer\n var element = node && node.nodeType === 1 ? node : node && node.parentElement\n while (element && element !== document.body && element !== document.documentElement) {\n var display = ''\n try {\n display = window.getComputedStyle(element).display\n } catch (error) {\n display = ''\n }\n if (display === 'block' || display === 'list-item' || display === 'table-cell') {\n return element.getBoundingClientRect()\n }\n element = element.parentElement\n }\n return null\n }\n\n function applyVCardGeometry(geo) {\n if (!vcard || !geo) return\n vcard.style.left = Math.round(geo.left) + 'px'\n vcard.style.top = Math.round(geo.top) + 'px'\n vcard.style.width = Math.round(geo.width) + 'px'\n }\n\n /** \u6EDA\u52A8 / \u6539\u7A97\u53E3\u65F6\u91CD\u65B0\u8D34\u4F4F\u90A3\u6BB5\u6587\u5B57\uFF08\u5173\u6389\u8FC7\u6E21\uFF0C\u514D\u5F97\u8DDF\u7740\u6EDA\"\u98D8\"\uFF09\u3002 */\n function repositionVCard() {\n var geo = vcardGeometry()\n if (!vcard || !geo) return\n vcard.style.transition = 'none'\n applyVCardGeometry(geo)\n void vcard.offsetWidth\n vcard.style.transition = ''\n // \u9009\u4E2D\u63D0\u793A\u662F\u6309\u89C6\u53E3\u5750\u6807\u6446\u7684\uFF0C\u6EDA\u52A8 / \u6539\u7A97\u53E3\u8981\u8DDF\u7740\u91CD\u753B\n if (vcardState.open) paintSelectionMarkers(false)\n }\n\n /**\n * \u4ECE\u6D6E\u6807\u90A3\u4E00\u683C**\u5F62\u53D8**\u8FC7\u6765\uFF1A\u5148\u6309\u6D6E\u6807\u7684\u51E0\u4F55\u6446\u597D\uFF08\u5173\u8FC7\u6E21\uFF09\uFF0C\u5F3A\u5236\u91CD\u6392\uFF0C\u518D\u5207\u5230\u6700\u7EC8\u51E0\u4F55\u3002\n * \u4E8E\u662F\"\u4E0B\u79FB + \u5C55\u5F00\"\u662F\u4E00\u6BB5\u8FDE\u7EED\u52A8\u753B\uFF0C\u800C\u4E0D\u662F\u65E7\u7684\u6D88\u5931\u3001\u65B0\u7684\u51FA\u73B0\u3002\n */\n function openVCard() {\n if (vcardState.open || env.panelOpen) return\n if (!env.state.selection) return\n // \u26A0\uFE0F \u4E24\u6761\u6765\u6E90\u7684\u5B9A\u4F4D\u4F9D\u636E\u4E0D\u4E00\u6837\uFF0C\u4E0D\u80FD\u53EA\u8BA4 Range\uFF1A\n // \u00B7 \u672C\u6587\u6863\u91CC\u7684\u9009\u533A \u2192 \u6709 Range\uFF08\u51E0\u4F55 / \u9009\u4E2D\u63D0\u793A\u90FD\u6309\u5B83\u7B97\uFF09\uFF1B\n // \u00B7 \u4FA7\u8FB9\u680F\u7F51\u9875\uFF08\u4E0D\u900F\u660E\u6E90 iframe\uFF09\u2192 \u7236\u9875\u9762**\u62FF\u4E0D\u5230\u90A3\u4E2A Range**\uFF0C\u53EA\u6709\u6865\u6362\u7B97\u597D\u7684\n // \u89C6\u53E3\u77E9\u5F62\uFF08state.selection.rect\uFF09\u548C\u6865\u91C7\u597D\u7684\u4E0A\u4E0B\u6587 \u2014\u2014 \u89C1 vcardGeometry / sendVCard\u3002\n if (!env.state.selection.range && env.state.selection.source !== 'iframe') return\n // \u9875\u9762\u6CA1\u7126\u70B9 / \u7528\u6237\u6B63\u5728\u522B\u5904\u6253\u5B57\uFF1A\u4E0D\u62A2 \u2014\u2014 \u62A2\u4E86\u5C31\u662F\u628A\u4EBA\u5BB6\u522B\u5904\u7684\u542C\u5199\u62FD\u8FC7\u6765\n if (!hasFocusEvidence(env.state.selection)) return\n if (env.isTypingTarget(document.activeElement)) return\n ensureVCard()\n // \u4E0A\u4E00\u8F6E\u7684\u5173\u673A\u52A8\u753B\u53EF\u80FD\u8FD8\u6CA1\u6536\u5C3E\uFF08\u7528\u6237\u9A6C\u4E0A\u53C8\u5212\u4E86\u65B0\u6587\u5B57\u3001\u53C8\u5F00\u9EA6\uFF09\uFF1A\u5148\u6536\u5E72\u51C0\u518D\u5F00\n if (vcardState.closing || vcardState.crtTimer) finishCrtOff()\n vcardState.range = env.state.selection.range || null\n vcardState.anchorRect = env.state.selection.rect || null\n var geo = vcardGeometry()\n if (!geo) return\n var pillRect = env.button.getBoundingClientRect()\n vcardState.open = true\n vcard.style.transition = 'none'\n vcard.style.display = 'flex'\n // \u2500\u2500 \u2460 \u5148\u5728**\u6700\u7EC8\u5BBD\u5EA6**\u4E0B\u91CF\u4E00\u6B21\uFF08\u540C\u4E00\u5E27\u5185\u5B8C\u6210\uFF0C\u7528\u6237\u770B\u4E0D\u89C1\uFF09\u2500\u2500\n // \u4E3A\u4EC0\u4E48\u5FC5\u987B\u5728\u8FD9\u4E2A\u5BBD\u5EA6\u4E0B\u91CF\uFF1A\u6B63\u6587\u6309\u5BBD\u5EA6\u6298\u884C\uFF0C\u5728\u6D6E\u6807\u90A3\u6761\u7A84\u7F1D\uFF08~86px\uFF09\u91CC\u91CF\u51FA\u6765\u7684\u884C\u6570\u4F1A\u66B4\u6DA8\n // \uFF08\u8E29\u8FC7\uFF1A\u5355\u884C\u5361\u88AB\u9876\u5230 111px\uFF09\u3002\u91CF\u5B8C\u4E4B\u540E\u5F62\u53D8\u5168\u7A0B\u4E0D\u518D\u8BFB scrollHeight\u3002\n vcard.style.width = Math.round(geo.width) + 'px'\n void vcard.offsetWidth\n var finalBoxHeight = Math.max(24, Math.min(vcardBox.scrollHeight, VCARD_TEXT_MAX))\n var finalCardHeight = finalBoxHeight + VCARD_PAD_Y\n var finalBoxWidth = Math.round(vcardBox.getBoundingClientRect().width)\n // \u2500\u2500 \u2461 \u5F62\u53D8\u671F\u95F4\u628A**\u6B63\u6587\u5BBD\u5EA6\u9489\u6B7B** \u2500\u2500\n // \u5361\u7247\u53D8\u5BBD\u53EA\u662F\"\u63ED\u5F00\"\u6B63\u6587\uFF0C\u6B63\u6587\u81EA\u5DF1\u4E0D\u518D\u9010\u5E27\u91CD\u65B0\u6298\u884C \u2014\u2014 \u8FD9\u662F\"\u4E0B\u79FB\u5C55\u5F00\"\u5361\u987F\u7684\u4E3B\u56E0\n // \uFF08\u6BCF\u5E27\u91CD\u6392 textarea \u91CC\u7684\u6587\u672C\uFF09\u3002\u9489\u6B7B\u4E4B\u540E\uFF0C\u5361\u7247\u53D8\u5BBD\u53EA\u662F\u4E00\u6B21\u88C1\u526A\uFF0C\u4EE3\u4EF7\u5C0F\u5F97\u591A\u3002\n if (finalBoxWidth > 0) {\n vcardBox.style.flex = '0 0 auto'\n vcardBox.style.width = finalBoxWidth + 'px'\n }\n vcardBox.style.height = finalBoxHeight + 'px'\n vcardBox.style.overflowY = finalBoxHeight >= VCARD_TEXT_MAX ? 'auto' : 'hidden'\n // \u2500\u2500 \u2462 \u56DE\u5230\u6D6E\u6807\u90A3\u4E00\u683C\uFF1A\u4F4D\u7F6E / \u5BBD / \u9AD8 / \u5706\u89D2\u90FD\u4ECE\u90A3\u91CC\u51FA\u53D1 \u2500\u2500\n vcard.style.width = Math.round(pillRect.width || 86) + 'px'\n vcard.style.left = Math.round(pillRect.left) + 'px'\n vcard.style.top = Math.round(pillRect.top) + 'px'\n vcard.style.height = Math.round(pillRect.height || 28) + 'px'\n vcard.style.borderRadius = '999px'\n markVCardListening(true)\n void vcard.offsetWidth\n // \u2500\u2500 \u2463 \u5F00\u8FC7\u6E21\uFF0C\u8D70\u5411\u7EC8\u6001 \u2500\u2500\n // \u5BBD\u5EA6\u8FD9\u6B21**\u4E5F\u53C2\u4E0E**\uFF1A\u4E0A\u4E00\u7248\u5B83\u4E0D\u53C2\u4E0E\uFF0C\u7B2C\u4E00\u5E27\u5C31\u4ECE 86px \u8DF3\u5230 460px\uFF08\u7528\u6237\u62A5\u7684\"\u8DF3\u53D8\"\uFF09\u3002\n vcard.style.transition = ''\n vcard.style.borderRadius = ''\n vcard.style.left = Math.round(geo.left) + 'px'\n vcard.style.top = Math.round(geo.top) + 'px'\n vcard.style.width = Math.round(geo.width) + 'px'\n vcard.style.height = finalCardHeight + 'px'\n scheduleVCardUnpin()\n // \u5361\u7247\u6253\u5F00\u540E\u624D\u753B\u9009\u4E2D\u63D0\u793A\uFF08\u9009\u4E2D/\u6D6E\u6807\u9636\u6BB5\u4E0D\u753B\uFF1A\u90A3\u65F6\u539F\u751F\u5E95\u7EB9\u8FD8\u5728\uFF09\n ensureSelectionMarkers()\n paintSelectionMarkers(true)\n env.hideButton()\n // \u5361\u7247\u5F00\u7740\u671F\u95F4\u5FC5\u987B\u7EE7\u7EED\u770B\u9EA6\u514B\u98CE\uFF1A\u65E2\u8981\u5224\u65AD\"\u8FD9\u6B21\u5F55\u97F3\u7ED3\u675F\u4E86\"\uFF08\u505C\u6389\u547C\u5438\uFF09\uFF0C\n // \u4E5F\u8981\u80FD\u63A5\u4F4F\"\u53C8\u6309\u4E86\u4E00\u6B21 Fn\"\uFF08\u91CD\u65B0\u6807\u8BB0\u5728\u542C\uFF09\u3002\u5E42\u7B49\uFF0C\u6B63\u5E38\u8DEF\u5F84\u4E0A\u8BA1\u65F6\u5668\u672C\u6765\u5C31\u5728\u8DD1\u3002\n startMicWatch()\n // \u5173\u952E\u4E00\u6B65\uFF1A\u8F93\u5165\u6CD5\u4E0A\u5C4F\u53EA\u8BA4\u7126\u70B9\u5143\u7D20\uFF0C\u7126\u70B9\u5FC5\u987B\u5728\u6211\u4EEC\u8FD9\u4E2A\u6846\u91CC\n focusVCard()\n // \u6CE8\u610F\uFF1A\u7126\u70B9\u4E00\u8F6C\u79FB\uFF0C\u539F\u751F\u9009\u533A\u5C31\u88AB\u6D4F\u89C8\u5668\u6E05\u6389\u4E86\uFF0C\u4E8E\u662F**\u5361\u7247\u5F00\u7740\u65F6\u770B\u4E0D\u5230\u9009\u4E2D\u5E95\u7EB9**\u3002\n // \u8FD9\u662F\u5DF2\u77E5\u53D6\u820D\uFF1A\u8865\u5E95\u7EB9\u7684\u4E24\u6761\u8DEF\uFF08CSS Custom Highlight / \u81EA\u7ED8\u8272\u5757\uFF09\u90FD\u88AB\u5426\u6389\u4E86 \u2014\u2014\n // \u524D\u8005\u53EA\u6709 Chromium \u7CFB\u652F\u6301\uFF0C\u540E\u8005\u662F\u76D6\u5728\u5B57\u4E0A\u7684\u8272\u5757\u3002\u8981\u6062\u590D\u5C31\u4ECE\u8FD9\u91CC\u63A5\u56DE\u53BB\u3002\n }\n\n /**\n * \u300C\u5728\u542C\u300D\u6807\u8BB0\u4E0E\u7A7A\u6846\u5360\u4F4D\u6587\u6848\u3002\n *\n * \u9EA6\u514B\u98CE\u4E00\u677E\u5F00\u5C31\u5FC5\u987B\u505C\u6389\u547C\u5438 \u2014\u2014 \u5426\u5219\u5361\u7247\u8FD8\u5728\u6CDB\u9752\u547C\u5438\uFF0C\u7B49\u4E8E\u5728\u8BF4\"\u6211\u8FD8\u5728\u542C\"\uFF0C\n * \u800C\u8FD9\u65F6\u8F93\u5165\u6CD5\u65E9\u5C31\u677E\u624B\u4E86\u3002\u7A7A\u6846\u7684\u5360\u4F4D\u4E5F\u8DDF\u7740\u6362\uFF08\"\u6B63\u5728\u542C\u2026\" \u2192 \"\u76F4\u63A5\u6253\u5B57\u4E5F\u884C\u2026\"\uFF09\uFF0C\n * \u4E0D\u7136\u90A3\u53E5\u8BDD\u540C\u6837\u662F\u5728\u6492\u8C0E\u3002\n */\n function markVCardListening(on) {\n if (!vcard) return\n vcard.setAttribute('data-voiced', on ? '1' : '0')\n if (!vcardBox) return\n if (String(vcardBox.value || '').trim()) return\n // \u677E\u624B\u4E4B\u540E\u3001\u6846\u8FD8\u7A7A\u7740\u65F6\u663E\u793A\u4EC0\u4E48\uFF1A\n // \u00B7 \u300C\u7A7A\u5F55\u97F3\u65F6\u6536\u8D77\u300D\u5F00\u7740\uFF08\u9ED8\u8BA4\uFF09\u2192 \u300C\u6B63\u5728\u5173\u95ED\u2026\u300D\uFF1A\u8FD9\u5F20\u5361\u9A6C\u4E0A\u8981\u88AB\u6536\u6389\uFF0C\n // \u5982\u5B9E\u8BF4\u5B83\u6B63\u5728\u8D70\uFF08\u800C\u4E0D\u662F\"\u76F4\u63A5\u6253\u5B57\u4E5F\u884C\u2026\"\u90A3\u79CD\u5047\u9080\u8BF7\uFF09\uFF1B\n // \u00B7 \u4E24\u4E2A\u6536\u5C3E\u5F00\u5173\u90FD\u5173\u7740\uFF08\u5361\u4F1A\u7559\u7740\uFF09\u2192 \u624D\u7ED9\"\u76F4\u63A5\u6253\u5B57\u4E5F\u884C\u2026\"\u8FD9\u53E5\u9080\u8BF7\u3002\n vcardBox.placeholder = on ? '\u6B63\u5728\u542C\u2026' : env.settingsLive.voiceCancelOnSilence !== false ? '\u6B63\u5728\u5173\u95ED\u2026' : '\u76F4\u63A5\u6253\u5B57\u4E5F\u884C\u2026'\n }\n\n function focusVCard() {\n if (!vcardBox) return\n try {\n vcardBox.focus({ preventScroll: true })\n } catch (error) {\n try {\n vcardBox.focus()\n } catch (inner) {\n /* \u6869\u73AF\u5883\u6CA1\u6709 focus\uFF1A\u4E0D\u5F71\u54CD\u903B\u8F91 */\n }\n }\n }\n\n /**\n * \u6536\u8D77\u5361\u7247\u3002\n *\n * **\u4E0D\u8FD8\u56DE\u300C\u2726 \u89E3\u8BFB\u300D\u6D6E\u6807**\uFF08\u7528\u6237\u8981\u6C42\uFF09\uFF1A\u53D6\u6D88\u5C31\u662F\u53D6\u6D88 \u2014\u2014 \u6D6E\u6807\u518D\u5192\u51FA\u6765\uFF0C\u7B49\u4E8E\u5728\u95EE\n * \"\u8981\u4E0D\u8981\u89E3\u8BFB\"\uFF0C\u800C\u7528\u6237\u521A\u8868\u8FBE\u7684\u662F\"\u8FD9\u6B21\u7B97\u4E86\"\u3002\u8981\u89E3\u8BFB\u5C31\u91CD\u65B0\u5212\u4E00\u6B21\u3002\n * \u53D1\u9001\u90A3\u6761\u8DEF\u4E5F\u4E0D\u8FD8\uFF08\u5B83\u76F4\u63A5\u5F00\u9762\u677F\u4E86\uFF09\u3002\n */\n /** \u9009\u4E2D\u63D0\u793A\u7684\u5143\u7D20\uFF08\u61D2\u5EFA\uFF09\uFF1A\u4E0B\u5212\u7EBF\u5C42 + \u7275\u5F15\u7EBF\uFF08SVG \u8D1D\u585E\u5C14\uFF09+ \u951A\u70B9\u5706\u3002 */\n function ensureSelectionMarkers() {\n if (selMark) return\n selMark = el('div', 'dsh-sel-umark')\n env.layer.appendChild(selMark)\n var NS = 'http://www.w3.org/2000/svg'\n selThread = document.createElementNS(NS, 'svg')\n selThread.setAttribute('class', 'dsh-sel-thread')\n selThreadPath = document.createElementNS(NS, 'path')\n selThreadPath.setAttribute('class', 'dsh-sel-threadpath')\n selThreadPath.setAttribute('fill', 'none')\n selThread.appendChild(selThreadPath)\n selThreadDot = document.createElementNS(NS, 'circle')\n selThreadDot.setAttribute('class', 'dsh-sel-threaddot')\n selThreadDot.setAttribute('r', '2.6')\n selThreadDot.setAttribute('stroke-width', '1.5')\n selThread.appendChild(selThreadDot)\n env.layer.appendChild(selThread)\n }\n\n /**\n * \u753B\"\u9009\u4E2D\u63D0\u793A\"\uFF1A\u4E0B\u5212\u7EBF\uFF08\u9010\u884C\u77E9\u5F62\u3001\u4E24\u7AEF\u6E10\u9690\uFF09+ \u4ECE\u9009\u533A\u7275\u5F15\u5230\u5361\u7247\u7684\u865A\u7EBF\u3002\n *\n * **\u53EA\u5728\u5361\u7247\u6253\u5F00\u540E\u624D\u51FA\u73B0**\uFF08\u7528\u6237\u5B9A\u7684\uFF09\uFF1A\u9009\u4E2D/\u6D6E\u6807\u9636\u6BB5\u4E0D\u753B \u2014\u2014 \u90A3\u65F6\u539F\u751F\u5E95\u7EB9\u8FD8\u5728\uFF0C\n * \u4E24\u8005\u540C\u65F6\u51FA\u73B0\u4F1A\u4E92\u76F8\u6253\u67B6\u3002\u7B49\u5E95\u7EB9\u88AB\u62A2\u7126\u70B9\u5403\u6389\uFF0C\u8FD9\u4E24\u6837\u6B63\u597D\u63A5\u4E0A\u3002\n *\n * \u4E0B\u5212\u7EBF\u6309 range \u7684**\u9010\u884C\u77E9\u5F62**\u8D34\uFF08\u591A\u884C\u9009\u533A\u5C31\u662F\u591A\u6761\uFF09\uFF0C\u4E0D\u662F\u6574\u5757\u4E00\u6761\u7EBF\u3002\n * \u7275\u5F15\u7EBF\u4ECE\u9009\u533A**\u672B\u884C\u4E2D\u70B9**\u7AD6\u76F4\u843D\u5230\u5361\u7247\u4E0A\u7F18 \u2014\u2014 \u8FD9\u4E00\u6761\u4F1A\u7A7F\u8FC7\u4E0B\u65B9\u6587\u5B57\uFF08\u7528\u6237\u63A5\u53D7\uFF09\uFF0C\n * \u6240\u4EE5\u5B83\u662F 2px \u5BBD\u7684\u7AD6\u6761 + repeating-gradient \u865A\u7EBF\uFF0C\u800C\u4E0D\u662F\u5B9E\u7EBF\u3002\n */\n function paintSelectionMarkers(grow) {\n if (!selMark) return\n clearSelectionMarkers()\n var range = vcardState.range\n if (!vcard || !vcardState.open) return\n if (!range && !vcardState.anchorRect) return\n /**\n * \u4FA7\u8FB9\u680F\u7F51\u9875\u90A3\u6761\u8DEF\uFF08\u6CA1\u6709 Range\uFF09\uFF1A**\u53EA\u753B\u7275\u5F15\u7EBF\uFF0C\u4E0D\u753B\u4E0B\u5212\u7EBF**\u3002\n *\n * \u4E24\u4E2A\u7406\u7531\uFF1A\u2460 \u9010\u884C\u77E9\u5F62\u5728\u5E27\u5185\uFF0C\u7236\u9875\u9762\u62FF\u4E0D\u5230\uFF08\u6865\u53EA\u62A5\u4E86\u4E00\u4E2A\u951A\u70B9\u77E9\u5F62\uFF09\uFF1B\n * \u2461 \u5E27\u5185\u539F\u751F\u5E95\u7EB9\u662F\u5426\u8FD8\u5728\u7531\u6D4F\u89C8\u5668\u8BF4\u4E86\u7B97 \u2014\u2014 \u4E07\u4E00\u8FD8\u5728\uFF0C\u6211\u4EEC\u6309\u4F30\u7B97\u4F4D\u7F6E\u518D\u753B\u4E00\u6761\n * \u4E0B\u5212\u7EBF\u5C31\u662F\"\u5212\u4E24\u5C42\"\uFF08\u672C\u6587\u6863\u90A3\u6761\u8DEF\u5F53\u521D\u8E29\u8FC7\u540C\u4E00\u4E2A\u5751\uFF09\u3002\n * \u7275\u5F15\u7EBF\u662F\u72EC\u7ACB\u7684\u4E00\u6761\u7EBF\uFF0C\u4E0D\u5B58\u5728\u8FD9\u4E2A\u51B2\u7A81\uFF0C\u6240\u4EE5\u7559\u7740\uFF1A\u5361\u7247\u548C\u90A3\u6BB5\u6587\u5B57\u4E4B\u95F4\u5F97\u6709\u53EF\u89C1\u7684\u8054\u7CFB\u3002\n */\n var fromFrame = !range && !!vcardState.anchorRect\n var rects = fromFrame ? null : range.getClientRects ? range.getClientRects() : null\n if (!fromFrame && (!rects || !rects.length)) return\n var accent = 'var(--sel-a1)'\n // \u26A0\uFE0F \u5FC5\u987B\u5148**\u6309\u884C\u5F52\u5E76**\u518D\u753B\uFF1A\n // \u4E00\u884C\u91CC\u5982\u679C\u6709\u884C\u5185\u5143\u7D20\uFF08<code>\u3001\u7C97\u4F53\u3001\u94FE\u63A5\uFF09\uFF0CgetClientRects() \u4F1A\u7ED9\u51FA**\u591A\u4E2A\u77E9\u5F62**\uFF0C\n // \u800C\u4E14\u5B83\u4EEC\u7684\u9AD8\u5EA6 / \u5E95\u8FB9\u5404\u4E0D\u76F8\u540C \u2014\u2014 \u6309\u77E9\u5F62\u5404\u753B\u4E00\u6761\u5C31\u4F1A\"\u5212\u4E24\u5C42\"\uFF0C\n // \u6E10\u9690\u4E5F\u4F1A\u51FA\u73B0\u5728\u884C\u4E2D\u95F4\uFF08\u7528\u6237\u5B9E\u6D4B\u7684\u4E24\u4E2A\u95EE\u9898\uFF0C\u540C\u4E00\u4E2A\u6839\u56E0\uFF09\u3002\n // \u26A0\uFE0F \u7B2C\u4E00\u6B65\uFF1A\u4E22\u6389\"\u5BB9\u5668\u77E9\u5F62\"\u3002\n // \u9009\u533A\u8DE8**\u6574\u5757**\u65F6\uFF0CgetClientRects() \u4F1A\u628A\u5757\u7EA7\u76D2\u5B50\u4E5F\u8FD4\u56DE \u2014\u2014 \u4E00\u4E2A\u8986\u76D6\u6574\u6BB5\u7684\u9AD8\u77E9\u5F62\n // \uFF08\u5B9E\u6D4B\uFF1A\u4E00\u6BB5\u4E24\u884C\u4F1A\u989D\u5916\u7ED9\u51FA h=53 \u7684\u5757\u76D2\uFF0C\u4E00\u4E2A\u4EE3\u7801\u5757\u7ED9\u51FA h=80 \u7684\u5757\u76D2\uFF09\u3002\n // \u5B83\u4F1A\u628A\u6BB5\u5185\u6240\u6709\u884C\u541E\u8FDB\u4E00\u7EC4\uFF0C\u7ED3\u679C\u6574\u6BB5\u53EA\u753B\u4E00\u6761\u4E0B\u5212\u7EBF\u3001\u5F88\u591A\u884C\u6CA1\u7EBF\uFF08\u7528\u6237\u5B9E\u6D4B\uFF09\u3002\n // \u5224\u636E\u7528\u9AD8\u5EA6\u4E2D\u4F4D\u6570\uFF1A\u884C\u7247\u6BB5\u7684\u9AD8\u5EA6\u90FD\u63A5\u8FD1\u884C\u9AD8\uFF0C\u5757\u76D2\u662F\u5B83\u7684\u6570\u500D\u3002\n // \u26A0\uFE0F \u8FD9\u4E00\u6574\u6BB5\u53EA\u5728\u6709 `rects` \u65F6\u8DD1\uFF1A\u5E27\u5185\u90A3\u6761\u6839\u672C\u6CA1\u6709\u9010\u884C\u77E9\u5F62\uFF08rects = null\uFF09\uFF0C\n // \u5B83\u53EA\u753B\u4E0B\u9762\u7684\u7275\u5F15\u7EBF\u3002\n var lines = []\n if (!fromFrame) {\n var heights = []\n for (var h = 0; h < rects.length; h += 1) {\n var probe = rects[h]\n if (probe && probe.width) heights.push(probe.bottom - probe.top)\n }\n heights.sort(function (a, b) {\n return a - b\n })\n var median = heights.length ? heights[Math.floor(heights.length / 2)] : 0\n var maxLineHeight = median > 0 ? median * 1.8 : Infinity\n for (var i = 0; i < rects.length; i += 1) {\n var rect = rects[i]\n if (!rect || !rect.width) continue\n if (rect.bottom - rect.top > maxLineHeight) continue\n var height = rect.bottom - rect.top\n var center = rect.top + height / 2\n var line = null\n for (var j = 0; j < lines.length; j += 1) {\n var group = lines[j]\n var groupHeight = group.bottom - group.top\n var groupCenter = group.top + groupHeight / 2\n // \u26A0\uFE0F \u5224\"\u540C\u4E00\u884C\"\u5FC5\u987B\u770B**\u5782\u76F4\u4E2D\u5FC3**\uFF0C\u4E0D\u80FD\u770B\u91CD\u53E0\u9762\u79EF\uFF1A\n // \u884C\u5185 code \u7684\u76D2\u5B50\u53EF\u80FD\u6BD4\u6574\u884C\u8FD8\u9AD8\uFF08\u884C\u9AD8 1.8 \u65F6\u5C24\u5176\u660E\u663E\uFF09\uFF0C\n // \u6309\u91CD\u53E0\u5224\u4F1A\u628A**\u4E0B\u4E00\u884C**\u4E5F\u541E\u8FDB\u540C\u4E00\u7EC4 \u2192 \u90A3\u51E0\u884C\u5C31\u6CA1\u6709\u4E0B\u5212\u7EBF\u4E86\uFF08\u7528\u6237\u5B9E\u6D4B\uFF09\u3002\n // \u4E2D\u5FC3\u8DDD\u7684\u5BB9\u5DEE\u53D6\"\u8F83\u77EE\u8005\u7684\u4E00\u534A\"\uFF1A\u540C\u4E00\u884C\u7684\u5143\u7D20\u4E2D\u5FC3\u51E0\u4E4E\u91CD\u5408\uFF0C\n // \u76F8\u90BB\u884C\u7684\u4E2D\u5FC3\u5DEE\u81F3\u5C11\u4E00\u4E2A\u884C\u9AD8\uFF0C\u4E24\u8005\u533A\u5206\u5F97\u5F88\u5E72\u51C0\u3002\n if (height > 0 && groupHeight > 0 && Math.abs(groupCenter - center) <= Math.min(groupHeight, height) * 0.5) {\n line = group\n break\n }\n }\n if (line) {\n line.left = Math.min(line.left, rect.left)\n line.right = Math.max(line.right, rect.right)\n line.top = Math.min(line.top, rect.top)\n line.bottom = Math.max(line.bottom, rect.bottom)\n } else {\n lines.push({ left: rect.left, right: rect.right, top: rect.top, bottom: rect.bottom })\n }\n }\n }\n for (var k = 0; k < lines.length; k += 1) {\n var row = lines[k]\n var mark = el('div', 'dsh-sel-uline')\n mark.style.left = Math.round(row.left) + 'px'\n mark.style.top = Math.round(row.bottom + 3) + 'px'\n mark.style.width = Math.round(row.right - row.left) + 'px'\n // U3\uFF1A\u4E24\u7AEF\u6E10\u9690 \u2014\u2014 \u5F52\u5E76\u4E4B\u540E\u5C31\u662F\"\u4E00\u884C\u7684\u4E24\u7AEF\"\uFF0C\u4E0D\u4F1A\u518D\u51FA\u73B0\u5728\u884C\u4E2D\u95F4\n mark.style.background =\n 'linear-gradient(90deg,transparent,' + accent + ' 12%,' + accent + ' 88%,transparent)'\n selMark.appendChild(mark)\n }\n var first = fromFrame ? vcardState.anchorRect : lines[0]\n var last = fromFrame ? vcardState.anchorRect : lines[lines.length - 1]\n var geo = vcardGeometry()\n if (!first || !last || !geo) return\n // \u7EC8\u70B9\u7528**\u7B97\u51FA\u6765\u7684\u6700\u7EC8\u4F4D\u7F6E**\uFF08geo.top\uFF09\uFF0C\u4E0D\u662F\u5361\u7247\u6B64\u523B\u7684 rect \u2014\u2014\n // \u5F00\u5361\u7247\u65F6\u5361\u7247\u8FD8\u5728\u4ECE\"\u89E3\u8BFB\u6309\u94AE\"\u90A3\u4E00\u683C\u5F62\u53D8\u8FC7\u6765\uFF0C\u8BFB\u5F53\u4E0B\u7684 rect \u4F1A\u5148\u6307\u5230\u6309\u94AE\u4E0A\uFF0C\n // \u7B49\u5F62\u53D8\u7ED3\u675F\u624D\u8DF3\u8FC7\u53BB\uFF08\u7528\u6237\uFF1A\"\u6162\u534A\u62CD\"\"\u4E00\u5F00\u59CB\u4E0D\u8981\u8FDE\u63A5\u5230\u89E3\u8BFB\u6309\u94AE\u4E0A\"\uFF09\u3002\n // \u6240\u4EE5\u8FD9\u91CC\u4E00\u5F8B\u7784\u51C6\u6700\u7EC8\u4F4D\u7F6E\uFF1B\u5F62\u53D8\u671F\u95F4\u4E0D\u9700\u8981\u8DDF\u968F\uFF08\u5F62\u53D8\u7ED3\u675F\u540E\u90A3\u6B21\u91CD\u753B\u53EA\u662F\u5B89\u5168\u7F51\uFF09\u3002\n var cardTop = geo.top\n var above = cardTop < first.top\n var anchor = above ? first : last\n var sx = (anchor.left + anchor.right) / 2\n var sy = above ? anchor.top - 2 : anchor.bottom + 2\n // \u7EC8\u70B9\uFF1A\u5361\u7247\u4E0A\uFF08\u4E0B\uFF09\u7F18\uFF0Cx \u843D\u5728\u5361\u7247\u5BBD\u5EA6\u5185\u3001\u5DE6\u53F3\u5404\u7559 24px\uFF1B\n // **\u591A\u63A2\u8FDB\u5361\u7247 4px** \u2014\u2014 SVG \u5728\u5361\u7247\u4E0B\u5C42\uFF0C\u591A\u51FA\u6765\u90A3\u6BB5\u88AB\u5361\u7247\u76D6\u4F4F\uFF0C\u89C6\u89C9\u4E0A\u6B63\u597D\u63A5\u4F4F\u3002\n var endY = above ? cardTop + (geo.height || 42) + 4 : cardTop + 4\n var endX = Math.max(geo.left + 24, Math.min(sx, geo.left + geo.width - 24))\n // \u53EF\u89C1\u7684\u8D1D\u585E\u5C14\uFF1A\u4E24\u7AEF\u5404\u4E00\u4E2A\u53CD\u5411\u7684\u6A2A\u5411\u63A7\u5236\u91CF \u2192 S \u5F62\uFF08\u539F\u6765\u63A7\u5236\u70B9\u548C\u7AEF\u70B9\u540C x\uFF0C\u662F\u76F4\u7EBF\uFF09\n var dy = Math.abs(endY - sy) || 1\n var bend = 18\n selThreadPath.setAttribute(\n 'd',\n 'M' + sx + ' ' + sy + ' C ' + (sx + bend) + ' ' + (sy + dy * 0.45) + ', ' +\n (endX - bend) + ' ' + (endY - dy * 0.45) + ', ' + endX + ' ' + endY,\n )\n selThreadPath.setAttribute('stroke', accent)\n selThreadDot.setAttribute('cx', sx)\n selThreadDot.setAttribute('cy', sy)\n selThreadDot.setAttribute('fill', accent)\n selThreadDot.setAttribute('stroke', 'var(--dsw-alias-bg-base,#fff)')\n // \u751F\u957F\u52A8\u753B**\u53EA\u5728\u5F00\u5361\u7247\u65F6**\u64AD\uFF1A\u6EDA\u52A8 / \u7F29\u653E\u4E5F\u4F1A\u8D70\u5230\u8FD9\u91CC\uFF0C\u800C display:none \u2192 block\n // \u4F1A\u91CD\u542F\u52A8\u753B \u2014\u2014 \u90A3\u5C31\u662F\u53C8\u4E00\u6B21\"\u95EA\u4E00\u4E0B\"\uFF08\u540C\u4E00\u4E2A\u5751\uFF0C\u522B\u8E29\u7B2C\u4E8C\u904D\uFF09\u3002\n if (grow) selThread.setAttribute('data-grow', '1')\n else selThread.removeAttribute('data-grow')\n selThread.style.display = 'block'\n selThread.style.opacity = '1'\n }\n\n /** \u6536\u8D77\u9009\u4E2D\u63D0\u793A\uFF08\u5E42\u7B49\uFF09\u3002 */\n function clearSelectionMarkers() {\n if (selMark && selMark.children.length) selMark.textContent = ''\n if (selMark) selMark.style.opacity = ''\n if (selThread) {\n selThread.style.display = 'none'\n selThread.style.opacity = ''\n }\n }\n\n /** \u5173\u673A\u52A8\u753B\u90A3\u6761\u4EAE\u7EBF\uFF08\u61D2\u5EFA\uFF09\u3002 */\n function ensureCrtLine() {\n if (crtLine) return crtLine\n crtLine = el('div', 'dsh-sel-crtline')\n env.layer.appendChild(crtLine)\n return crtLine\n }\n\n /**\n * \u4EAE\u7EBF\u7684\u5206\u6BB5\u4E0E\u706B\u82B1\uFF08\u61D2\u5EFA\uFF0C\u53EA\u5EFA\u4E00\u6B21\uFF09\u3002\n *\n * 5 \u6BB5\u9996\u5C3E\u76F8\u63A5\u62FC\u6210\u6574\u6761\u7EBF\uFF08\u770B\u4E0A\u53BB\u5C31\u662F\u4E00\u6761\u5B9E\u7EBF\uFF09\uFF1B\u6536\u7F29\u65F6\u5404\u6BB5\u5EF6\u8FDF\u4E0D\u540C\uFF0C\n * \u4E8E\u662F\"\u5F80\u4E2D\u95F4\u6536\"\u548C\"\u9519\u4F4D\u9732\u7F1D\"\u540C\u65F6\u53D1\u751F \u2014\u2014 \u8FD9\u70B9\u50CF\u7D20\u6545\u969C\u662F\u523B\u610F\u505A\u7684\u3002\n * \u672B\u5C3E\u4E24\u4E2A\u706B\u82B1\u662F\u6BB5\u5B50\u6B7B\u6389\u4E4B\u540E\u8FD8\u5728\u539F\u4F4D\u95EA\u4E24\u4E0B\u7684\u6B8B\u7559\u50CF\u7D20\u3002\n */\n function ensureCrtSegments(line) {\n if (line.children && line.children.length) return\n for (var i = 0; i < 5; i += 1) line.appendChild(el('div', 'dsh-sel-crtseg'))\n line.appendChild(el('div', 'dsh-sel-crtspark'))\n line.appendChild(el('div', 'dsh-sel-crtspark'))\n }\n\n /** \u7CFB\u7EDF\u662F\u5426\u8981\u6C42\u51CF\u5C11\u52A8\u6548\u3002 */\n function prefersReducedMotion() {\n try {\n return typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion: reduce)').matches\n } catch (error) {\n return false\n }\n }\n\n /**\n * \u64AD\"\u8001\u5F0F\u7535\u89C6\u673A\u5173\u673A\"\uFF1A\u5361\u7247\u584C\u6210\u4E00\u6761\u7EBF\uFF0C\u4EAE\u7EBF\u518D\u6A2A\u7F29\u6210\u4E00\u4E2A\u70B9\uFF08A \u65B9\u6848\uFF0C420ms\uFF09\u3002\n *\n * \u53EA\u5728**\u53D6\u6D88**\u65F6\u64AD \u2014\u2014 \u53D1\u9001\u90A3\u6761\u8981\u7ACB\u523B\u5F00\u9762\u677F\uFF0C\u52A8\u753B\u4F1A\u548C\u9762\u677F\u53E0\u5728\u4E00\u8D77\u3002\n *\n * \u4EAE\u7EBF\u662F**\u72EC\u7ACB\u5143\u7D20**\uFF0C\u4E0D\u662F\u5361\u7247\u7684 box-shadow\uFF1Abox-shadow \u4F1A\u8DDF\u7740 transform \u4E00\u8D77\u88AB\u538B\u6241\uFF0C\n * \u584C\u5230 5% \u65F6\u8FDE\u5149\u6655\u90FD\u6210\u4E00\u6761\uFF08\u5B9E\u6D4B\u8E29\u8FC7\uFF09\u3002\u989C\u8272\u4E5F\u6309\u660E\u6697\u7ED9\u4E24\u5957 \u2014\u2014\n * \u6D45\u8272\u5E95\u4E0A\u767D\u7EBF\u770B\u4E0D\u89C1\uFF08\u5B9E\u6D4B\u53EA\u5DEE ~15/255\uFF09\uFF0C\u6DF1\u8272\u5E95\u4E0A\u53CD\u8FC7\u6765\uFF0C\u767D\u7EBF\u624D\u4EAE\u5F97\u8D77\u6765\u3002\n *\n * \u8FD4\u56DE false \u8868\u793A\u6CA1\u64AD\uFF08\u7CFB\u7EDF\u8981\u6C42\u51CF\u5C11\u52A8\u6548 / \u5361\u7247\u91CF\u4E0D\u51FA\u5C3A\u5BF8\uFF09\uFF0C\u8C03\u7528\u65B9\u76F4\u63A5\u6536\u6389\u3002\n */\n function playCrtOff() {\n if (!vcard || prefersReducedMotion()) return false\n var rect = vcard.getBoundingClientRect()\n if (!rect.width || !rect.height) return false\n var line = ensureCrtLine()\n var dark = false\n try {\n dark = isDarkSurface(document.body)\n } catch (error) {\n dark = false\n }\n // \u4EAE\u7EBF\u6446\u5728\u5361\u7247\u6B63\u4E2D\u3001\u5BBD\u5EA6\u8DDF\u7740\u5361\u7247\uFF08\u90FD\u662F fixed \u5B9A\u4F4D\uFF0C\u540C\u4E00\u5957\u89C6\u53E3\u5750\u6807\uFF09\n line.style.left = Math.round(rect.left) + 'px'\n line.style.top = Math.round(rect.top + rect.height / 2 - 1.5) + 'px'\n line.style.width = Math.round(rect.width) + 'px'\n ensureCrtSegments(line)\n // \u989C\u8272\u6302\u5728\u5BB9\u5668\u4E0A\uFF0C\u5206\u6BB5/\u706B\u82B1\u7528 currentColor \u7EE7\u627F \u2014\u2014 \u4E00\u5904\u8D4B\u503C\uFF0C7 \u4E2A\u5B50\u5143\u7D20\u8DDF\u7740\u53D8\n line.style.color = dark ? '#FFFFFF' : 'var(--sel-a1)'\n line.style.background = 'transparent'\n line.style.boxShadow = 'none'\n line.style.filter = dark\n ? 'drop-shadow(0 0 6px rgba(190,245,255,.8))'\n : 'drop-shadow(0 0 6px rgba(13,148,136,.55))'\n vcardState.closing = true\n // \u9009\u4E2D\u63D0\u793A\u8DDF\u7740\u5361\u7247\u4E00\u8D77\u6DE1\u6389\uFF08\u5B83\u4FE9\u662F\"\u5361\u7247\u8FD9\u4E00\u6BB5\"\u7684\u6CE8\u89E3\uFF0C\u5361\u7247\u584C\u4E86\u5C31\u4E0D\u8BE5\u8FD8\u6302\u7740\uFF09\n if (selMark) selMark.style.opacity = '0'\n if (selThread) selThread.style.opacity = '0'\n if (selThreadDot) selThreadDot.style.opacity = '0'\n // \u6458\u6389\u518D\u6302\u4E0A\uFF1A\u8BA9\u52A8\u753B\u80FD\u91CD\u64AD\uFF08\u540C\u4E00\u5143\u7D20\u4E0A\u8FDE\u7EED\u4E24\u6B21\u6536\u5361\u7247\uFF09\n vcard.removeAttribute('data-off')\n line.removeAttribute('data-off')\n void vcard.offsetWidth\n vcard.setAttribute('data-off', 'a')\n line.setAttribute('data-off', 'a')\n var done = function () {\n if (vcardState.crtTimer) {\n clearTimeout(vcardState.crtTimer)\n vcardState.crtTimer = null\n }\n if (vcard && vcardState.crtHandler) {\n vcard.removeEventListener('animationend', vcardState.crtHandler)\n vcardState.crtHandler = null\n }\n finishCrtOff()\n }\n // animationend \u662F\u4E3B\u8DEF\u5F84\uFF1B\u53E6\u6302\u515C\u5E95 \u2014\u2014 \u6807\u7B7E\u9875\u5728\u540E\u53F0\u65F6\u52A8\u753B\u6839\u672C\u4E0D\u8DD1\uFF0C\u4E8B\u4EF6\u4E5F\u5C31\u4E0D\u4F1A\u6765\n vcardState.crtHandler = function (event) {\n if (event.target === vcard) done()\n }\n vcard.addEventListener('animationend', vcardState.crtHandler)\n vcardState.crtTimer = env.later(done, 700)\n return true\n }\n\n /**\n * \u5173\u673A\u52A8\u753B\u6536\u5C3E\uFF1A\u771F\u6B63\u628A\u5361\u7247\u548C\u4EAE\u7EBF\u85CF\u6389\u3002\n *\n * \u5E42\u7B49 \u2014\u2014 \u4E0D\u64AD\u52A8\u753B\u65F6 closeVCard \u76F4\u63A5\u8C03\u5B83\uFF0C\u987A\u4FBF\u6E05\u6389\u4E0A\u4E00\u8F6E\u52A8\u753B\u7684\u6B8B\u7559\u3002\n */\n function finishCrtOff() {\n vcardState.closing = false\n if (vcardState.crtTimer) {\n clearTimeout(vcardState.crtTimer)\n vcardState.crtTimer = null\n }\n if (vcard && vcardState.crtHandler) {\n vcard.removeEventListener('animationend', vcardState.crtHandler)\n vcardState.crtHandler = null\n }\n if (vcard) {\n vcard.removeAttribute('data-off')\n vcard.style.display = 'none'\n vcard.style.opacity = ''\n vcard.style.filter = ''\n vcard.style.transform = ''\n vcard.style.borderRadius = ''\n vcard.setAttribute('data-voiced', '0')\n vcard.setAttribute('data-text', '0')\n }\n if (vcardBox) {\n vcardBox.value = ''\n vcardBox.style.height = ''\n vcardBox.style.overflowY = 'hidden'\n }\n if (crtLine) {\n crtLine.removeAttribute('data-off')\n crtLine.style.opacity = ''\n crtLine.style.filter = ''\n }\n clearSelectionMarkers()\n }\n\n /**\n * \u6536\u8D77\u5361\u7247\u3002\n *\n * animate=true\uFF08\u53D6\u6D88\uFF1AEsc / \u70B9\u7A7A\u767D\uFF09\u65F6\u5148\u64AD\u5173\u673A\u52A8\u753B\uFF0C\u52A8\u753B\u7ED3\u675F\u518D\u771F\u6B63\u9690\u85CF\uFF1B\n * \u5176\u4F59\u8DEF\u5F84\uFF08\u53D1\u9001 / \u8C03\u8BD5\u94A9\u5B50\uFF09\u7ACB\u523B\u6536\u6389\u3002\n * **\u4E0D\u8FD8\u56DE\u300C\u2726 \u89E3\u8BFB\u300D\u6D6E\u6807**\uFF1A\u53D6\u6D88\u5C31\u662F\u53D6\u6D88\uFF0C\u8981\u89E3\u8BFB\u5C31\u91CD\u65B0\u5212\u4E00\u6B21\u3002\n */\n /** \u505C\u6389\"\u7B49\u6587\u5B57\u5B9A\u7A3F\"\u7684\u89C2\u5BDF\uFF08\u5E42\u7B49\uFF09\u3002 */\n function stopVoiceSettle() {\n if (vcardState.settleTimer) {\n clearInterval(vcardState.settleTimer)\n vcardState.settleTimer = null\n }\n if (vcardState.settleComposeTimer) {\n clearTimeout(vcardState.settleComposeTimer)\n vcardState.settleComposeTimer = null\n }\n // \u26A0\uFE0F \u8FD9\u91CC**\u4E0D**\u4E0A\u62A5\u6D4B\u91CF\uFF1A\u505C\u8868\u65E2\u53D1\u751F\u5728\"\u6B63\u5E38\u51B3\u5B9A\u4E4B\u524D\"\uFF08\u90A3\u4E00\u62CD\u9A6C\u4E0A\u5C31\u8981 finishVoiceSettle\uFF09\uFF0C\n // \u4E5F\u53D1\u751F\u5728\"\u88AB\u63D0\u524D\u6253\u65AD\"\u65F6\u3002\u5728\u8FD9\u91CC\u4E0A\u62A5\u4F1A\u628A\u51B3\u7B56\u4E00\u5F8B\u8BB0\u6210 stopped\uFF08\u8E29\u8FC7\uFF09\u3002\n // \u63D0\u524D\u6253\u65AD\u7684\u573A\u666F\u7531\u8C03\u7528\u65B9\u5404\u81EA\u4E0A\u62A5\uFF08closeVCard / \u65B0\u5F55\u97F3\uFF09\u3002\n vcardState.settleLastText = ''\n vcardState.settleStableAt = 0\n vcardState.settleDeadline = 0\n }\n\n /** \u6587\u5B57\u5B9A\u7A3F\u540E\uFF0C\u624D\u771F\u6B63\u6267\u884C\u6536\u5C3E\uFF08\u53D1\u9001 / \u53D6\u6D88 / \u4EC0\u4E48\u90FD\u4E0D\u505A\uFF09\u3002 */\n function finishVoiceSettle(text) {\n if (!vcardState.open) return\n var spoken = String(text || '').trim()\n if (spoken && env.settingsLive.voiceAutoSend !== false) {\n sendVCard()\n return\n }\n if (!spoken && env.settingsLive.voiceCancelOnSilence !== false) {\n closeVCard(true)\n return\n }\n markVCardListening(false)\n }\n\n /**\n * \u677E\u624B\u4E4B\u540E\uFF0C\u7B49\u6587\u5B57\u5B9A\u7A3F\u518D\u51B3\u5B9A\u6536\u5C3E\u52A8\u4F5C\u3002\n *\n * \u5224\u636E\u662F\"\u8FDE\u7EED VOICE_SETTLE_MS \u6CA1\u6709\u53D8\u5316\"\uFF0C\u6700\u957F\u7B49 VOICE_SETTLE_MAX_MS\u3002\n * \u8C46\u5305\u7684\u667A\u80FD\u6574\u7406\u901A\u5E38\u4F1A\u5728\u8FD9\u6BB5\u7A97\u53E3\u91CC\u628A\u5185\u5BB9\u6539\u5199\u4E00\u5230\u4E24\u6B21\uFF1B\u6BCF\u6539\u4E00\u6B21\u5C31\u91CD\u65B0\u8BA1\u65F6\u3002\n */\n function startVoiceSettle() {\n stopVoiceSettle()\n vcardState.settleLastText = String((vcardBox && vcardBox.value) || '')\n vcardState.settleStableAt = Date.now()\n vcardState.settleDeadline = Date.now() + VOICE_SETTLE_MAX_MS\n vcardState.settleTimer = setInterval(function () {\n if (!vcardState.open) {\n stopVoiceSettle()\n return\n }\n var now = Date.now()\n var text = String((vcardBox && vcardBox.value) || '')\n if (text !== vcardState.settleLastText) {\n // \u8FD8\u5728\u6539\u5199\uFF08\u667A\u80FD\u6574\u7406\uFF09\u2192 \u91CD\u65B0\u8BA1\u65F6\uFF0C\u7EE7\u7EED\u7B49\n vcardState.settleLastText = text\n vcardState.settleStableAt = now\n return\n }\n if (now - vcardState.settleStableAt < VOICE_SETTLE_MS && now < vcardState.settleDeadline) return\n stopVoiceSettle()\n finishVoiceSettle(text)\n }, VOICE_SETTLE_POLL_MS)\n }\n\n function closeVCard(animate) {\n if (!vcardState.open) return\n vcardState.open = false\n // \u53D6\u6D88\u7684\u90A3\u4E00\u523B\u5C31\u628A\u7A7A\u6846\u7684\u5360\u4F4D\u6362\u6210\u300C\u6B63\u5728\u5173\u95ED\u2026\u300D\uFF1A\u5361\u6B63\u5728\u584C\u7F29\uFF0C\u7A7A\u6846\u91CC\u6302\u7740\"\u76F4\u63A5\u6253\u5B57\u4E5F\u884C\u2026\"\n // \u662F\u53E5\u5047\u8BDD\u3002\u5DF2\u7ECF\u6253\u51FA\u6765\u7684\u5B57**\u4E0D\u52A8** \u2014\u2014 \u5B83\u5C31\u662F\u90A3\u4E2A\u584C\u7F29\u52A8\u753B\u8981\u6536\u6389\u7684\u4E1C\u897F\u3002\n if (vcardBox && !String(vcardBox.value || '').trim()) vcardBox.placeholder = '\u6B63\u5728\u5173\u95ED\u2026'\n vcardState.range = null\n vcardState.anchorRect = null\n // \u26A0\uFE0F \u5FC5\u987B**\u663E\u5F0F blur**\uFF0C\u4E0D\u80FD\u53EA\u628A\u5361\u7247 display:none \u6389\u3002\n //\n // \u8F93\u5165\u6CD5\uFF08\u8C46\u5305\uFF09\u7684\u8F93\u5165\u4E0A\u4E0B\u6587\u662F\u7ED1\u5728\"\u5F53\u524D\u90A3\u4E2A\u6587\u672C\u8F93\u5165\u6846\"\u4E0A\u7684\uFF1A\u5361\u7247\u6253\u5F00\u65F6\u6211\u4EEC\u628A\u7126\u70B9\n // \u62A2\u7ED9\u5B83\uFF0C\u4E0A\u4E0B\u6587\u5C31\u7ED1\u5728\u4E86\u5361\u7247\u7684 textarea \u4E0A\uFF1B\u5361\u7247\u53EA\u662F\u88AB\u9690\u85CF\u65F6\uFF0C\u5B83**\u4ECD\u7136\u662F\u8F93\u5165\u6CD5\u7684\u8F93\u5165\u6846**\n // \uFF08display:none \u4E0D\u4F1A\u8BA9 macOS \u7684\u8F93\u5165\u6CD5\u81EA\u5DF1\u89E3\u7ED1\uFF09\u3002\u4E8E\u662F\u4E4B\u540E\u7126\u70B9\u867D\u7136\u8F6C\u5230\u5C0F\u7A97\u8F93\u5165\u6846\uFF0C\n // \u8F93\u5165\u6CD5\u7684\u5408\u6210\u4ECD\u7136\u53D1\u751F\u5728\u5361\u7247\u4E0A \u2014\u2014 \u7528\u6237\u5B9E\u6D4B\u7684\u75C7\u72B6\u5C31\u662F\uFF1A\n // \u5C0F\u7A97\u8F93\u5165\u6846\u80FD\u6536\u5230 keydown\uFF0C\u5374**\u6C38\u8FDC\u6536\u4E0D\u5230 beforeinput**\uFF08\u8F93\u5165\u6CD5\u5408\u6210\uFF09\uFF0C\n // \u6253\u4E0D\u8FDB\u5B57\u3001\u4E5F\u6CA1\u6709\u63D2\u5165\u7B26\u3002\n // focus-trace \u6293\u5230\u7684\u5B9E\u6D4B\u5E8F\u5217\uFF1A\n // \u4E34\u65F6\u5361\u7247\u4E0A\u6709 beforeinput\uFF08\u6B63\u5E38\uFF09\u2192 \u5C0F\u7A97\u8F93\u5165\u6846\u4E0A\u53EA\u6709 keydown\uFF08\u6253\u4E0D\u8FDB\uFF09\n // \u2192 \u7126\u70B9\u56DE\u5230\u5BBF\u4E3B\u8F93\u5165\u6846\u540E beforeinput \u7ACB\u523B\u6062\u590D\u3002\n if (vcardBox && typeof vcardBox.blur === 'function') {\n try {\n vcardBox.blur()\n } catch (error) {\n /* \u6869\u73AF\u5883 */\n }\n }\n stopVoiceSettle()\n stopMicWatch()\n // \u5F62\u53D8\u8FD8\u6CA1\u7ED3\u675F\u5C31\u88AB\u5173\u6389\u65F6\uFF0C\u6B63\u6587\u5BBD\u5EA6\u53EF\u80FD\u8FD8\u9489\u7740 \u2014\u2014 \u4E00\u5E76\u89E3\u5F00\n unpinVCardBox()\n // \u52A8\u753B\u671F\u95F4\u6B63\u6587/\u5360\u4F4D\u90FD\u7559\u7740\uFF08\u8981\u584C\u7684\u5C31\u662F\u5B83\uFF09\uFF0C\u6536\u5C3E\u65F6\u624D\u6E05\n if (animate && playCrtOff()) return\n finishCrtOff()\n }\n\n /** \u53D1\u9001\uFF1A\u8DF3\u8FC7\u7FFB\u8BD1\u4E0E\u8BE6\u89E3\uFF0C\u628A\u8BF4\u7684\u8BDD\u5F53\u4F5C\u7B2C\u4E00\u6761\u8FFD\u95EE\u76F4\u63A5\u53D1\u51FA\u53BB\u3002 */\n function sendVCard() {\n var asked = String((vcardBox && vcardBox.value) || '').trim()\n if (!asked) {\n focusVCard()\n return\n }\n var selection = env.state.selection\n if (!selection) {\n closeVCard()\n return\n }\n // \u4FA7\u8FB9\u680F\u7F51\u9875\u90A3\u6761\u8DEF\u6CA1\u6709 Range\uFF08\u4E0D\u900F\u660E\u6E90\u5E27\u7684\u9009\u533A\u62FF\u4E0D\u51FA\u6765\uFF09\uFF0C\u4E0A\u4E0B\u6587 / \u6807\u7B7E\u76F4\u63A5\u7528\n // \u5E27\u5185\u6865\u91C7\u597D\u5E26\u8FC7\u6765\u7684\u90A3\u4EFD \u2014\u2014 \u4E0E openForSelection \u7684 iframe \u5206\u652F\u540C\u4E00\u6761\u89C4\u5219\u3002\n var contextInfo =\n selection.source === 'iframe' || !selection.range\n ? {\n context: String(selection.context || ''),\n keyContext: String(selection.keyContext || ''),\n label: selection.label,\n }\n : collectContext(env.rangeSelection(selection.range))\n // \u4EA4\u63A5\u8D77\u70B9\uFF1A\u5361\u7247**\u73B0\u5728**\u7684\u77E9\u5F62\u3002\u5FC5\u987B\u5728 closeVCard \u4E4B\u524D\u91CF \u2014\u2014 \u4E4B\u540E\u5B83 display:none\uFF0C\u91CF\u51FA\u6765\u662F 0\u3002\n // \u5C0F\u7A97\u4F1A\u4ECE\u8FD9\u4E00\u683C\"\u957F\u51FA\u6765\"\uFF08\u89C1 growPanelFromCard\uFF09\u3002\n vcardHandoff = vcardRect()\n closeVCard()\n env.openPanelWith(\n selection.text,\n contextInfo.context,\n contextInfo.label,\n selection.rect,\n contextInfo.keyContext,\n { askFirst: asked },\n )\n env.clearDocSelection()\n // \u9009\u533A\u8FDE\u540C\u5B83\u7684\u8BB0\u5F55\u4E00\u8D77\u4F5C\u5E9F\uFF08\u4E0E openForSelection \u4E00\u81F4\uFF09\n env.state.selection = null\n env.state.bridgeActive = false\n }\n\n /**\n * \"\u73B0\u5728\u8FD9\u4E00\u4E0B\u8BE5\u4E0D\u8BE5\u62A2\u7126\u70B9\"\u3002\n *\n * \u672C\u6587\u6863\u91CC\u7684\u9009\u533A\uFF1A`document.hasFocus()` \u5C31\u662F\u7B54\u6848\uFF08\u4E0E\u6539\u52A8\u524D\u5B8C\u5168\u4E00\u81F4\uFF09\u3002\n * \u4FA7\u8FB9\u680F\u7F51\u9875\u91CC\u7684\u9009\u533A\uFF1A\u7126\u70B9\u5176\u5B9E\u843D\u5728**\u4E0D\u900F\u660E\u6E90\u5B50\u6846\u67B6**\u91CC\uFF0C\u7236\u6587\u6863\u7684 `hasFocus()`\n * \u6709\u6CA1\u6709\u4E3A\u771F\u7531\u6D4F\u89C8\u5668\u5B9E\u73B0\u8BF4\u4E86\u7B97\uFF08\u8DE8\u5F15\u64CE\u6CA1\u6709\u7EDF\u4E00\u7B54\u6848\uFF09\uFF0C\u6240\u4EE5\u5BF9\u5B83\u6539\u7528\n * \"\u8FD9\u4E00\u5E27\u521A\u62A5\u8FC7\u52A8\u4F5C\"\u5F53\u8BC1\u636E \u2014\u2014 \u6865\u62A5\u4E0A\u6765\u7684\u90A3\u4E00\u523B\uFF0C\u7528\u6237\u786E\u5B9E\u6B63\u5728\u90A3\u4E2A\u7F51\u9875\u91CC\u5212\u8BCD / \u70B9\u6309\u3002\n */\n function hasFocusEvidence(selection) {\n if (typeof document.hasFocus !== 'function') return true\n if (document.hasFocus()) return true\n if (!selection || selection.source !== 'iframe' || !selection.frame) return false\n return Date.now() - (env.frameTouchedAt.get(selection.frame) || 0) < FRAME_FOCUS_EVIDENCE_MS\n }\n\n /** \u5361\u7247\u5F53\u524D\u7684\u89C6\u53E3\u77E9\u5F62\uFF08\u62FF\u4E0D\u5230\u5C31\u8FD4\u56DE null \u2014\u2014 \u90A3\u5C31\u4E0D\u505A\u4EA4\u63A5\u52A8\u753B\uFF0C\u8001\u5B9E\u77AC\u5F00\uFF09\u3002 */\n function vcardRect() {\n if (!vcard || typeof vcard.getBoundingClientRect !== 'function') return null\n try {\n var rect = vcard.getBoundingClientRect()\n return rect && rect.width && rect.height ? rect : null\n } catch (error) {\n return null\n }\n }\n\n /** host \u62A5\u7684\u5360\u7528\u8005\u91CC\uFF0C\u6709\u6CA1\u6709\u5DF2\u77E5\u8F93\u5165\u6CD5\u3002 */\n function matchingIme(data) {\n if (!data || !data.capturing || !Array.isArray(data.processes)) return null\n for (var i = 0; i < data.processes.length; i++) {\n var proc = data.processes[i] || {}\n var id = String(proc.bundleId || '')\n for (var j = 0; j < IME_BUNDLES.length; j++) {\n if (id.indexOf(IME_BUNDLES[j]) === 0) return proc\n }\n }\n return null\n }\n\n /**\n * \u53EA\u5728\"\u6709\u9009\u533A\"\u65F6\u8F6E\u8BE2\uFF08\u6D6E\u6807\u4EAE\u7740\u7684\u90A3\u51E0\u62CD\uFF09\u3002\u4E0D\u53E0\u8BF7\u6C42\uFF1A\u4E0A\u4E00\u62CD\u6CA1\u56DE\u6765\u5C31\u8DF3\u8FC7\u8FD9\u4E00\u62CD\u3002\n * \u62FF\u4E0D\u5230 host \u7684\u80FD\u529B\uFF08\u975E macOS / \u63A2\u9488\u6CA1\u7F16\u51FA\u6765\uFF09\u5C31**\u505C\u6389\u8F6E\u8BE2**\uFF0C\u4E0D\u518D\u7A7A\u8F6C\u3002\n */\n function startMicWatch() {\n if (vcardState.timer) return\n // \u4E24\u6761\u8DEF\u90FD\u8981\u76EF\u9EA6\u514B\u98CE\uFF1A\u89E3\u8BFB\u9009\u533A\uFF08\u9762\u677F\u6CA1\u5F00 \u2192 \u8BED\u97F3\u5361\uFF09\u4E0E\u5F15\u7528\u9009\u533A\uFF08\u9762\u677F\u5F00\u7740 \u2192 \u81EA\u52A8\u5F15\u7528\uFF09\n if (!env.state.selection && !env.state.quoteSelection) return\n vcardState.timer = setInterval(micTick, MIC_POLL_MS)\n env.timers.push(vcardState.timer)\n micTick()\n }\n\n function stopMicWatch() {\n // \u26A0\uFE0F \u6291\u5236\u6807\u8BB0\u5FC5\u987B**\u8DDF\u7740\u8F6E\u8BE2\u4E00\u8D77\u590D\u4F4D**\uFF0C\u4E0D\u80FD\u53EA\u653E\u5728\"\u8F6E\u8BE2\u5230\u6CA1\u5728\u5F55\"\u90A3\u4E00\u62CD\u4E0A\uFF1A\n // \u81EA\u52A8\u5F15\u7528\u505A\u5B8C\u5C31\u4F1A hideQuoteButton \u2192 \u505C\u8F6E\u8BE2\uFF08\u6D6E\u6807\u6536\u4E86\u5C31\u6CA1\u4EC0\u4E48\u53EF\u7B49\u7684\uFF09\uFF0C\n // \u90A3\u4E00\u62CD\u4E8E\u662F\u53EF\u80FD\u6C38\u8FDC\u4E0D\u6765\uFF0C\u6807\u8BB0\u5C31\u4E00\u76F4\u6302\u7740 true\u3002\n //\n // \u9760\"\u4E0B\u4E00\u6B21\u5212\u8BCD\u81EA\u6108\"\u4E5F\u4E0D\u53EF\u9760\uFF1A\u53EA\u6709\u6D6E\u6807\u4EAE\u8D77\u6765\u90A3\u4E00\u523B\u9EA6\u514B\u98CE**\u5DF2\u7ECF\u5173\u7740**\uFF0C\n // \u6700\u65E9\u90A3\u4E00\u62CD\u624D\u4F1A\u7B54\"\u6CA1\u5728\u5F55\"\u3001\u987A\u624B\u628A\u5B83\u590D\u4F4D\uFF1B\u9EA6\u514B\u98CE\u6B63\u5F00\u7740\u65F6\u6BCF\u4E00\u62CD\u90FD\u7B54\"\u5728\u5F55\"\uFF0C\n // \u6807\u8BB0\u5C31\u6CA1\u673A\u4F1A\u590D\u4F4D\u3002\u771F\u5B9E\u7528\u6CD5\u91CC\u8FD9\u4E2A\u987A\u5E8F\u51E0\u4E4E\u51D1\u4E0D\u51FA\u6765\uFF08\u9F20\u6807\u4E00\u5212\uFF0C\u8BED\u97F3\u5C31\u65AD\u4E86\uFF09\uFF0C\n // \u6240\u4EE5\u5B83\u66F4\u50CF\u9897\u57CB\u7740\u7684\u96F7\u800C\u4E0D\u662F\u73B0\u884C bug \u2014\u2014 \u4F46\u72B6\u6001\u673A\u4E0D\u8BE5\u5EFA\u7ACB\u5728\n // \"\u7528\u6237\u51D1\u4E0D\u51FA\u8FD9\u4E2A\u987A\u5E8F\"\u4E0A\uFF08\u5C06\u6765\u82E5\u7ED9\u8FD9\u6761\u8DEF\u52A0\"\u8BF4\u5B8C\u76F4\u63A5\u53D1\u9001\"\uFF0C\u5B83\u5C31\u7ACB\u523B\u53D8\u6210\u771F\u95EE\u9898\uFF09\u3002\n //\n // \u8BED\u4E49\u4E0A\u8FD9\u6837\u624D\u5BF9\uFF1A\u4E00\u6B21\u89C2\u5BDF\u7A97\u53E3\uFF08\u6D6E\u6807\u4EAE\u7740\u7684\u8FD9\u6BB5\u65F6\u95F4\uFF09\u91CC\u53EA\u5904\u7406\u7B2C\u4E00\u6B21\u5F00\u9EA6\u3002\n quoteVoiceHandled = false\n if (!vcardState.timer) return\n clearInterval(vcardState.timer)\n vcardState.timer = null\n }\n\n function micTick() {\n if (vcardState.busy) return\n // \u4E24\u4E2A\u90FD\u7A7A\u4E86\uFF08\u9009\u533A\u6CA1\u4E86 / \u5F15\u7528\u6D6E\u6807\u6536\u4E86\uFF09\uFF1A\u6CA1\u4EC0\u4E48\u53EF\u7B49\u7684\uFF0C\u505C\u6389\u8F6E\u8BE2\n if (!env.state.selection && !env.state.quoteSelection) {\n stopMicWatch()\n return\n }\n vcardState.busy = true\n fetch(MIC_API)\n .then(function (response) {\n return response.json()\n })\n .then(function (data) {\n vcardState.busy = false\n if (!data || !data.available) {\n stopMicWatch()\n return\n }\n if (matchingIme(data)) {\n // \u2500\u2500 \u5C0F\u7A97\u5F00\u7740\uFF1A\u5F15\u7528\u90A3\u6761\u8DEF\uFF08\u5F00\u9EA6 = \u70B9\u4E00\u4E0B\u300C\u275D \u5F15\u7528\u300D+ \u5149\u6807\u8FDB\u5C0F\u7A97\u8F93\u5165\u6846\uFF09\u2500\u2500\n // \u4E0E\u8BED\u97F3\u5361\u4E92\u65A5\uFF1ApanelOpen \u65F6\u524D\u8005\u6839\u672C\u4E0D\u8BE5\u542F\u52A8\uFF08openVCard \u81EA\u5DF1\u4E5F\u4F1A\u62D2\uFF09\u3002\n if (env.panelOpen && env.state.quoteSelection && !vcardState.open) {\n if (quoteVoiceHandled) return\n quoteVoiceHandled = true\n autoQuoteFromVoice()\n return\n }\n if (vcardState.suppress) return\n // \u53C8\u5F00\u59CB\u5F55\u4E86\uFF1A\u4E0A\u4E00\u6B21\u7684\"\u7B49\u5B9A\u7A3F\"\u4F5C\u5E9F\n stopVoiceSettle()\n if (!vcardState.open) openVCard()\n else markVCardListening(true)\n return\n }\n // \u6CA1\u4EBA\u5728\u5F55\u4E86\uFF1A\u8FD9\u4E00\u6B21\u5F55\u97F3\u7ED3\u675F\uFF0C\u89E3\u9664\u6291\u5236\uFF08\u4E0B\u4E00\u6B21\u5F00\u9EA6\u624D\u5141\u8BB8\u518D\u5F39 / \u518D\u52A0\u5F15\u7528\uFF09\n vcardState.suppress = false\n quoteVoiceHandled = false\n if (!vcardState.open) return\n // \u5F00\u9EA6\u7ED3\u675F\u4E86\u3002\u5361\u7247**\u4E0D\u7ACB\u523B\u9000\u51FA**\uFF1A\u4E0B\u9762\u4E24\u4E2A\u6536\u5C3E\u884C\u4E3A\u90FD\u8981\u7B49\u6587\u5B57\u5B9A\u7A3F\n //\uFF08\u677E\u624B\u90A3\u4E00\u523B\u8F93\u5165\u6CD5\u8FD8\u4F1A\u505A\u4E00\u6B21\u667A\u80FD\u6574\u7406\uFF0C\u89C1 startVoiceSettle\uFF09\u3002\n // \u4E24\u4E2A\u5F00\u5173\u90FD\u5173\u6389\u65F6\u5361\u7247\u5C31\u7559\u7740 \u2014\u2014 \u4E00\u4E2A\u5B57\u90FD\u6CA1\u8BF4\u4E5F\u80FD\u63A5\u7740\u624B\u52A8\u6253\u5B57\u3002\n // \u8FD9\u91CC\u53EA\u628A\"\u5728\u542C\"\u505C\u6389\uFF08\u89C1 markVCardListening\uFF09\u3002\n //\n // \u4E24\u4E2A\u6536\u5C3E\u884C\u4E3A\uFF08\u8BBE\u7F6E\u9875\u300C\u754C\u9762 \u00B7 \u8BED\u97F3\u8F93\u5165\u300D\uFF0C**\u9ED8\u8BA4\u90FD\u5F00**\uFF0C\u89C1 Config \u6CE8\u91CA\uFF09\uFF1A\n // \u00B7 voiceAutoSend\uFF1A\u6709\u5B57 \u2192 \u7B49\u4E8E\u66FF\u7528\u6237\u70B9\u4E86\u53D1\u9001\u952E\uFF08\u53D1\u9001\u81EA\u5DF1\u4F1A\u5173\u5361\u7247\u3001\u5F00\u5C0F\u7A97\uFF09\uFF1B\n // \u00B7 voiceCancelOnSilence\uFF1A\u6CA1\u5B57 \u2192 \u7B49\u4E8E\u66FF\u7528\u6237\u6309\u4E86 Esc\uFF08\u5E26\u5173\u673A\u52A8\u753B\uFF09\u3002\n // \u90FD\u4ECE settingsLive \u73B0\u8BFB\uFF0C\u6240\u4EE5\u8BBE\u7F6E\u4E00\u6539\u4E0B\u4E00\u6B21\u677E\u624B\u5C31\u751F\u6548\uFF1B\u5224\u65AD\u7528 `!== false` \u2014\u2014\n // \u8FD8\u6CA1\u52A0\u8F7D\u5B8C / \u8BFB\u5931\u8D25\u65F6\u6309**\u51FA\u5382\u9ED8\u8BA4\uFF08\u5F00\uFF09**\u5904\u7406\uFF0C\u4E0E host \u4FA7 Config \u7684\u7F3A\u7701\u503C\u4E00\u81F4\u3002\n // \u26A0\uFE0F \u677E\u624B\u8FD9\u4E00\u523B**\u6587\u5B57\u8FD8\u6CA1\u5B9A\u7A3F**\uFF1A\u8C46\u5305\u7D27\u63A5\u7740\u8FD8\u4F1A\u505A\u4E00\u6B21\u667A\u80FD\u6574\u7406\uFF0C\u4F1A\u6539\u5199\u8F93\u5165\u6846\u5185\u5BB9\u3002\n // \u6240\u4EE5\u4E24\u4E2A\u6536\u5C3E\u884C\u4E3A\u90FD\u4E0D\u5728\u8FD9\u91CC\u6267\u884C\uFF0C\u800C\u662F\u5148\u6302\u4E0A\"\u7B49\u5B9A\u7A3F\"\u7684\u89C2\u5BDF\uFF08\u89C1 startVoiceSettle\uFF09\u3002\n markVCardListening(false)\n // \u26A0\uFE0F \u8FD9\u4E2A\u5206\u652F\u5728\"\u9EA6\u514B\u98CE\u5173\u7740\"\u671F\u95F4**\u6BCF\u4E00\u62CD\u90FD\u4F1A\u8D70**\uFF08200ms \u4E00\u6B21\uFF09\uFF0C\n // \u6240\u4EE5\u5FC5\u987B\u5E42\u7B49\uFF1A\u5DF2\u7ECF\u5728\u7B49\u5B9A\u7A3F\u5C31\u4E0D\u8981\u518D startVoiceSettle() \u2014\u2014\n // \u90A3\u4F1A\u628A\"\u7A33\u5B9A\u8D77\u70B9\"\u91CD\u7F6E\uFF0C\u6C38\u8FDC\u7B49\u4E0D\u5230 VOICE_SETTLE_MS\uFF08\u5B9E\u6D4B\u5C31\u662F\u8FD9\u4E2A\u5751\uFF1A\n // settleFor \u4E00\u76F4\u505C\u5728\u51E0\u5341\u6BEB\u79D2\uFF0C\u5361\u7247\u6C38\u8FDC\u4E0D\u52A8\u4F5C\uFF09\u3002\n if (\n !vcardState.settleTimer &&\n (env.settingsLive.voiceAutoSend !== false || env.settingsLive.voiceCancelOnSilence !== false)\n ) {\n startVoiceSettle()\n }\n })\n .catch(function () {\n vcardState.busy = false\n stopMicWatch()\n })\n }\n\n /**\n * \u5F00\u9EA6 = \u70B9\u4E00\u4E0B\u300C\u275D \u5F15\u7528\u300D\uFF08\u7528\u6237 2026-10-09 \u5B9A\u7684\u884C\u4E3A\uFF09\u3002\n *\n * \u5C0F\u7A97\u5F00\u7740\u65F6\uFF0C\u5212\u8BCD\u6D6E\u51FA\u7684\u662F\u5F15\u7528\u6D6E\u6807\uFF1B\u8FD9\u65F6\u7528\u6237\u6309\u4E0B\u8F93\u5165\u6CD5\u7684\u8BED\u97F3\u952E\uFF0C\u6211\u4EEC\u505A\u7684\u6B63\u662F\n * \"\u70B9\u4E00\u4E0B\u90A3\u4E2A\u6D6E\u6807\"\u90A3\u4EF6\u4E8B\uFF1A\u628A\u9009\u4E2D\u7684\u6587\u5B57\u6302\u8FDB\u5C0F\u7A97\u3001\u5E76\u628A\u5149\u6807\u79FB\u5230\u5C0F\u7A97\u8F93\u5165\u6846 \u2014\u2014\n * \u4E8E\u662F\u8F93\u5165\u6CD5\u4E0A\u5C4F\u7684\u5B57\u76F4\u63A5\u843D\u8FDB\u5C0F\u7A97\uFF0C\u548C\u5F15\u7528\u4E00\u8D77\u6210\u4E3A\u4E0B\u4E00\u6761\u8FFD\u95EE\u3002\n *\n * \u4E3A\u4EC0\u4E48\u5FC5\u987B\u5728**\u5F00\u9EA6\u90A3\u4E00\u523B**\u505A\uFF1A\u8F93\u5165\u6CD5\u4E0A\u5C4F\u53D1\u751F\u5728\u677E\u624B\u90A3\u4E00\u523B\uFF0C\u7126\u70B9\u5F97\u63D0\u524D\u632A\u597D\n * \uFF08\u4E0E\u8BED\u97F3\u5361\u62A2\u7126\u70B9\u540C\u4E00\u6761\u65F6\u5E8F\uFF0C\u89C1\u6587\u4EF6\u4E0A\u65B9\u90A3\u6BB5\u6CE8\u91CA\uFF09\u3002\u68C0\u6D4B\u5EF6\u8FDF\u7531\"\u63A2\u9488 125ms +\n * \u9875\u9762\u8F6E\u8BE2 200ms\"\u6784\u6210\uFF0C\u8C46\u5305\u4ECE\u6309\u4E0B\u5230\u677E\u624B\u901A\u5E38\u6709\u51E0\u79D2\uFF0C\u591F\u7528\u3002\n *\n * \u5B88\u536B\u4E0E openVCard \u5B8C\u5168\u4E00\u81F4\uFF08\u9875\u9762\u6CA1\u7126\u70B9 / \u7528\u6237\u6B63\u5728\u522B\u5904\u6253\u5B57 \u2192 \u4E0D\u62A2\uFF0C\u5426\u5219\u5C31\u662F\u628A\n * \u4EBA\u5BB6\u5728\u522B\u5904\u7684\u542C\u5199\u62FD\u8FDB\u5C0F\u7A97\uFF09\uFF0C\u53E6\u5916\u591A\u52A0\u4E00\u6761\uFF1A\u63D2\u4EF6\u81EA\u5DF1\u7684 \uD83C\uDFA4 \u6B63\u5728\u5F55\u97F3\u65F6\u4E0D\u62A2 \u2014\u2014\n * \u90A3\u5957\u8D70 host \u8BC6\u522B\u3001\u4E0E\u8F93\u5165\u6CD5\u8BED\u97F3\u662F\u4E24\u56DE\u4E8B\uFF0C\u7126\u70B9\u8BE5\u7559\u7ED9\u5B83\u3002\n * \uFF08\"\u6CA1\u7126\u70B9\"\u540C\u6837\u6309 hasFocusEvidence \u5224\uFF1A\u4FA7\u8FB9\u680F\u7F51\u9875\u91CC\u90A3\u6761\u9009\u533A\u4E5F\u5F97\u80FD\u8D70\u8FD9\u6761\u8DEF\u3002\uFF09\n *\n * \u7528\u6237\u53D6\u6D88\u8BED\u97F3\uFF08Esc\uFF09\u6216\u4E00\u4E2A\u5B57\u6CA1\u8BF4\uFF1A**\u5F15\u7528\u7559\u7740**\uFF08\u53EF\u4E00\u952E \u2715 \u5220\uFF09\u3002\u64A4\u9500\u4F1A\u8BA9\"\u5F15\u7528\u5230\u5E95\n * \u52A0\u6CA1\u52A0\"\u53D8\u5F97\u96BE\u9884\u671F\uFF0C\u800C\u4E14\u70B9\u6D6E\u6807\u90A3\u6761\u8DEF\u4E5F\u662F\u52A0\u4E86\u5C31\u52A0\u4E86\u3002\n */\n function autoQuoteFromVoice() {\n var selection = env.state.quoteSelection\n if (!env.panelOpen || !selection) return\n if (!hasFocusEvidence(selection)) return\n if (env.isTypingTarget(document.activeElement)) return\n if (env.voice && env.voice.phase !== 'idle') return\n // \u4E0E\u70B9\u6D6E\u6807\u540C\u4E00\u6761\u8DEF\uFF1A\u4E0A\u4E0B\u6587\u5728\u8FD9\u4E00\u523B\u624D\u91C7\uFF08\"\u5F15\u7528\u5F53\u65F6\u5728\u54EA\u4E00\u6BB5\u5BF9\u8BDD\u91CC\"\u6700\u6709\u7528\u7684\u5C31\u662F\u5B83\uFF09\n env.addQuote(selection.text, selection.label, env.quoteContextFor(selection))\n hideQuoteButton()\n // addQuote \u5728\"\u91CD\u590D\u5F15\u7528 / \u5230\u4E0A\u9650\"\u65F6\u4F1A\u63D0\u524D return\uFF08\u90A3\u4E24\u6761\u8DEF\u4E0D\u4F1A\u805A\u7126\uFF09\uFF0C\u4F46\"\u8BF4\u8BDD\u7684\u5B57\u8981\u843D\u8FDB\n // \u5C0F\u7A97\"\u8FD9\u4EF6\u4E8B\u4ECD\u7136\u5FC5\u987B\u6210\u7ACB \u2014\u2014 \u6240\u4EE5\u7126\u70B9\u5728\u8FD9\u91CC\u518D\u515C\u4E00\u6B21\uFF08composerVisible \u5DF2\u7531 addQuote \u4FDD\u8BC1\uFF09\u3002\n if (env.composerVisible()) env.focusAskBox()\n }\n\n function hideQuoteButton() {\n env.quoteButton.style.display = 'none'\n env.setQuotePop(false)\n // \u6D6E\u6807\u6536\u4E86\u5C31\u6CA1\u4EC0\u4E48\u53EF\u7B49\u7684\u4E86\uFF08\u4E0E hideButton \u540C\u4E00\u6761\u89C4\u5219\uFF09\uFF1B\u8BED\u97F3\u5361\u5F00\u7740\u65F6\u4E0D\u80FD\u505C\n if (!vcardState.open) stopMicWatch()\n }\n return {\n hideQuoteButton,\n get vcardState() { return vcardState },\n set vcardState(value) { vcardState = value },\n closeVCard,\n repositionVCard,\n get vcard() { return vcard },\n set vcard(value) { vcard = value },\n get vcardBox() { return vcardBox },\n set vcardBox(value) { vcardBox = value },\n openVCard,\n syncVCardText,\n sendVCard,\n startMicWatch,\n stopMicWatch,\n get vcardHandoff() { return vcardHandoff },\n set vcardHandoff(value) { vcardHandoff = value },\n prefersReducedMotion,\n get panelGrowTimer() { return panelGrowTimer },\n set panelGrowTimer(value) { panelGrowTimer = value },\n get panelGrowHandler() { return panelGrowHandler },\n set panelGrowHandler(value) { panelGrowHandler = value },\n }\n}\n", "import { MAX_QUOTE_CHARS, MAX_QUOTES, QUOTE_CONTEXT_TIMEOUT, QUOTE_CONTEXT_API, QUOTE_ONLY_QUESTION } from './constants.js'\nimport { el, listen } from './dom.js'\nimport { normalizeSpace, collectContext } from './context.js'\n\n/** quotes state and operations; dependencies are supplied as live node/callback accessors. */\nexport function createQuotesController(env) {\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u5F15\u7528\uFF08\u275D\uFF09\uFF1A\u628A\u522B\u5904\u7684\u6587\u5B57\u6302\u8FDB\u8F93\u5165\u6846 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n //\n // \u4E24\u4E2A\u5165\u53E3\uFF0C\u540C\u4E00\u4EFD\u6570\u636E\uFF08state.quotes\uFF09\uFF1A\n // \u2460 \u5212\u8BCD\u6D6E\u6807\u300C\u275D \u5F15\u7528\u300D\u2014\u2014 \u5C0F\u7A97\u5F00\u7740\u65F6\uFF0C\u5C0F\u7A97\u6B63\u6587\u91CC\u7684\u9009\u533A \u6216 \u4E3B\u754C\u9762\u4E0A\u7684\u9009\u533A\uFF1B\n // \u2461 \u52A9\u624B\u6C14\u6CE1\u672B\u5C3E\u7684\u300C\u275D \u5F15\u7528\u6574\u6761\u300D\uFF08\u9F20\u6807\u79FB\u4E0A\u53BB\u624D\u51FA\u73B0\uFF09\u2014\u2014 \u6574\u6761\u56DE\u7B54\uFF0C\u7F51\u9875\u56DE\u7B54\u5148\u6298\u6210 Markdown\u3002\n // \u5F15\u7528\u53EA\u5C5E\u4E8E**\u4E0B\u4E00\u6761**\u63D0\u95EE\uFF1A\u53D1\u9001\u65F6\u62FC\u8FDB\u8FD9\u6761\u6D88\u606F\uFF0C\u53D1\u5B8C\u6E05\u7A7A\u3002\n\n /** \u5F15\u7528\u5361\u7247\u7684 id \u8BA1\u6570\uFF08\u5185\u5BB9\u53EF\u80FD\u91CD\u590D\uFF0CDOM \u4E0E\u5220\u9664\u90FD\u9760 id \u8BA4\u4EBA\uFF09\u3002 */\n var quoteSeq = 0\n\n /** \u5361\u7247/\u6C14\u6CE1\u4E0A\u7684\u6765\u6E90\u5C0F\u5B57\u3002 */\n function quoteLabelOf(quote) {\n return quote && quote.label ? String(quote.label) : '\u5F15\u7528'\n }\n\n /** \u5361\u7247/\u6C14\u6CE1\u91CC\u7684\u5355\u884C\u6458\u8981\uFF08\u5B8C\u6574\u6587\u672C\u8FDB title \u4E0E\u53D1\u7ED9\u6A21\u578B\u7684\u90A3\u4EFD\uFF09\u3002 */\n function quoteBrief(text, max) {\n var one = String(text || '').replace(/\\s+/g, ' ').trim()\n return one.length > max ? one.slice(0, max) + '\u2026' : one\n }\n\n /**\n * \u52A0\u4E00\u6BB5\u5F15\u7528\u3002\u52A0\u4E0D\u8FDB\u53BB\u4E5F\u7ED9\u4E00\u53E5\u72B6\u6001 \u2014\u2014 \u70B9\u4E86\u6D6E\u6807\"\u4EC0\u4E48\u90FD\u6CA1\u53D1\u751F\"\u662F\u6700\u96BE\u67E5\u7684\u90A3\u79CD\u89C2\u611F\u3002\n * \u540C\u4E00\u6BB5\u5212\u4E24\u6B21\u4E0D\u518D\u52A0\uFF08\u5F15\u7528\u533A\u662F\u6750\u6599\u6E05\u5355\uFF0C\u4E0D\u662F\u8BB0\u4E8B\u672C\uFF09\uFF1B\u8D85\u8FC7 MAX_QUOTES \u6BB5\u4E5F\u4E0D\u518D\u52A0\u3002\n *\n * `extra` = { context, session }\uFF1A\u5F15\u7528**\u5F53\u65F6\u6240\u5728**\u7684\u4E0A\u4E0B\u6587\uFF08\u89C1 quoteContextFor\uFF09\uFF0C\n * session=true \u8868\u793A\"\u8FD9\u6BB5\u6587\u5B57\u6765\u81EA\u4E3B\u754C\u9762\u4F1A\u8BDD\"\uFF0C\u53D1\u9001\u524D\u4F1A\u518D\u95EE host \u8981\u4E00\u4EFD\u6309\u8F6E\u53D6\u6574\u7684\u5E72\u51C0\u4E0A\u4E0B\u6587\u3002\n */\n function addQuote(text, label, extra) {\n var clean = String(text || '').replace(/\\u00a0/g, ' ').trim()\n if (!clean) return false\n var truncated = clean.length > MAX_QUOTE_CHARS\n if (truncated) clean = clean.slice(0, MAX_QUOTE_CHARS) + '\u2026'\n for (var i = 0; i < env.state.quotes.length; i += 1) {\n if (env.state.quotes[i].text === clean) {\n env.setStatus('\u8FD9\u6BB5\u5DF2\u7ECF\u5728\u5F15\u7528\u91CC\u4E86')\n return false\n }\n }\n if (env.state.quotes.length >= MAX_QUOTES) {\n env.setStatus('\u5F15\u7528\u6700\u591A ' + MAX_QUOTES + ' \u6BB5\uFF0C\u5148\u5220\u6389\u4E00\u6761\u518D\u52A0')\n return false\n }\n quoteSeq += 1\n var context = extra && typeof extra.context === 'string' ? extra.context.trim() : ''\n env.state.quotes.push({\n id: quoteSeq,\n label: label || '\u5F15\u7528',\n text: clean,\n context: context,\n session: !!(extra && extra.session === true),\n })\n renderQuotes()\n env.refreshAskState()\n // \u8F93\u5165\u6846\u6309\u9636\u6BB5\u672C\u6765\u53EF\u80FD\u662F\u85CF\u7740\u7684\uFF08\u9996\u8F6E\u8FD8\u5728\u8DD1\uFF09\uFF1A\u5F15\u7528\u4E00\u8FDB\u6765\u5C31\u5F97\u770B\u5F97\u89C1\uFF0C\u987A\u624B\u805A\u7126\u3002\n // \u805A\u7126\u8D70**\u540C\u4E00\u4E2A** focusAskBox\uFF08preventScroll\uFF09\uFF1A\u8FD9\u91CC\u662F\u7528\u6237\u4E3B\u52A8\u70B9\u5F15\u7528\uFF0C\n // \u4E0E\"\u5F00\u7A97\u81EA\u52A8\u805A\u7126\"\u662F\u4E24\u56DE\u4E8B\uFF0C\u4E0D\u9700\u8981\u8D70 askFocusPending \u90A3\u5957\"\u522B\u62A2\u4EBA\u5BB6\u6253\u5B57\"\u7684\u5224\u5B9A\u3002\n env.askRow.style.display = ''\n if (env.composerVisible()) env.focusAskBox()\n env.setStatus(\n '\u5DF2\u52A0\u5165\u5F15\u7528\uFF08' +\n quoteLabelOf(env.state.quotes[env.state.quotes.length - 1]) +\n ' \u00B7 ' +\n clean.length +\n ' \u5B57' +\n (truncated ? '\uFF08\u539F\u6587\u66F4\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09' : '') +\n (context ? ' \u00B7 \u5E26\u4E0A\u4E0B\u6587 ' + context.length + ' \u5B57' : '') +\n '\uFF09',\n )\n return true\n }\n\n function removeQuote(id) {\n var next = []\n for (var i = 0; i < env.state.quotes.length; i += 1) {\n if (env.state.quotes[i].id !== id) next.push(env.state.quotes[i])\n }\n env.state.quotes = next\n renderQuotes()\n env.refreshAskState()\n }\n\n /** \u6E05\u7A7A\u5F85\u53D1\u9001\u7684\u5F15\u7528\uFF08\u6362\u4E86\u4E00\u6BB5\u9009\u4E2D\u6587\u5B57 / \u56DE\u653E\u4E86\u53E6\u4E00\u6761\u5386\u53F2 \u2014\u2014 \u90A3\u4E9B\u5F15\u7528\u5DF2\u7ECF\u4E0D\u5C5E\u4E8E\u8FD9\u6BB5\u5BF9\u8BDD\uFF09\u3002 */\n function clearQuotes() {\n if (env.state.quotes.length === 0) return\n env.state.quotes = []\n renderQuotes()\n env.refreshAskState()\n }\n\n /** \u91CD\u753B\u5F15\u7528\u533A\uFF08\u7A7A\u7684\u65F6\u5019\u6574\u5757\u6536\u8D77\u6765\uFF0C\u4E0D\u5360\u7248\u9762\uFF09\u3002 */\n function renderQuotes() {\n env.quotesBox.textContent = ''\n env.quotesBox.setAttribute('data-show', env.state.quotes.length > 0 ? '1' : '0')\n for (var i = 0; i < env.state.quotes.length; i += 1) {\n var quote = env.state.quotes[i]\n var chip = el('div', 'dsh-sel-quotechip')\n chip.setAttribute('data-quote', String(quote.id))\n chip.appendChild(el('span', 'dsh-sel-quotechip-src', '\u275D ' + quoteLabelOf(quote)))\n var brief = el('span', 'dsh-sel-quotechip-text', quoteBrief(quote.text, 42))\n brief.title = quote.text\n chip.appendChild(brief)\n var remove = el('button', 'dsh-sel-quotechip-x', '\u2715')\n remove.type = 'button'\n remove.title = '\u79FB\u9664\u8FD9\u6761\u5F15\u7528'\n remove.setAttribute('aria-label', '\u79FB\u9664\u8FD9\u6761\u5F15\u7528')\n wireQuoteRemove(remove, quote.id)\n chip.appendChild(remove)\n env.quotesBox.appendChild(chip)\n }\n }\n\n /** \u5361\u7247\u4E0A\u7684 \u2715\uFF08\u5361\u7247\u6BCF\u6B21\u91CD\u753B\uFF0C\u76D1\u542C\u8DDF\u7740\u8282\u70B9\u4E00\u8D77\u8D70\uFF0C\u4E0D\u9700\u8981\u5355\u72EC\u56DE\u6536\uFF09\u3002 */\n function wireQuoteRemove(node, id) {\n listen(node, 'click', function (event) {\n event.stopPropagation()\n removeQuote(id)\n })\n }\n\n // \u2500\u2500 \u5F15\u7528\u7684\u4E0A\u4E0B\u6587\uFF1A\u53EA\u6709\"\u6A21\u578B\u770B\u4E0D\u5230\u7684\u4E1C\u897F\"\u624D\u9700\u8981\u5E26 \u2500\u2500\n //\n // \u00B7 \u5C0F\u7A97\u81EA\u5DF1\u7684\u6B63\u6587\uFF08\u56DE\u7B54 / \u4E24\u8282 / \u9876\u90E8\u539F\u6587\u6761\uFF09\uFF1A**\u4E0D\u5E26\u4E0A\u4E0B\u6587** \u2014\u2014 \u5C0F\u7A97\u8FD9\u51E0\u8F6E\u5BF9\u8BDD\n // \u672C\u6765\u5C31\u4F1A\u968F history \u8FDB\u6A21\u578B\uFF0C\u518D\u8D34\u4E00\u904D\u662F\u91CD\u590D\uFF1B\u51FA\u5904\u4EA4\u7ED9\u6807\u7B7E\u8BF4\u6E05\n // \uFF08\u300C\u5C0F\u7A97\u7B2C 2 \u8F6E\u56DE\u7B54\u300D\u300C\u5C0F\u7A97\u300C\u7FFB\u8BD1\u300D\u8282\u300D\uFF09\u3002\n // \u00B7 \u4E3B\u754C\u9762\uFF08\u4F1A\u8BDD\uFF09\uFF1A\u5E26\u4E0A\"\u5F15\u7528\u6240\u5728\u90A3\u4E00\u7EC4\u5BF9\u8BDD \u00B1 \u4E00\u7EC4\"\uFF08host \u4ECE\u4F1A\u8BDD\u8BB0\u5F55\u91CC\u53D6\u5E72\u51C0\u6587\u672C\uFF09\u3002\n // \u00B7 \u4FA7\u8FB9\u680F\u7F51\u9875\uFF1A\u5E26\u4E0A\u5E27\u5185\u6865\u91C7\u7684\u5C40\u90E8\u7A97\u53E3\u3002\n // \u540E\u4E24\u6761\u90FD\u662F\u6A21\u578B\u770B\u4E0D\u5230\u7684\u6750\u6599\uFF0C\u6240\u4EE5\u5FC5\u987B\u5E26\u3002\n\n /** \u4E0A\u4E0B\u6587\u91CC\u6709\u6CA1\u6709\u5F15\u7528\u539F\u6587\uFF08\u5F52\u4E00\u5316\u540E\u5305\u542B\u5373\u53EF\uFF1A\u3010\u3011\u662F\u5957\u5728\u5916\u9762\u7684\uFF0C\u4E0D\u5F71\u54CD\u5305\u542B\u5173\u7CFB\uFF09\u3002 */\n function contextHasQuote(context, text) {\n var haystack = normalizeSpace(context)\n var needle = normalizeSpace(text)\n return needle.length > 0 && haystack.indexOf(needle) >= 0\n }\n\n /** \u9009\u533A\u843D\u5728\u5C0F\u7A97\u7684\u54EA\u4E00\u8F6E\u4E0A\uFF08\u5F80\u4E0A\u627E\u5E26 __turn \u7684\u6C14\u6CE1\uFF09\uFF1B\u4E0D\u5728\u6C14\u6CE1\u91CC\u8FD4\u56DE -1\u3002 */\n function turnIndexOfNode(node) {\n var current = node && node.nodeType === 3 ? node.parentNode : node\n for (var depth = 0; current && depth < 32; depth += 1) {\n if (current.__turn) {\n var index = env.state.turns.indexOf(current.__turn)\n if (index >= 0) return index\n }\n if (current === env.body || !env.panel.contains(current)) break\n current = current.parentNode\n }\n return -1\n }\n\n /**\n * \u70B9\u300C\u275D \u5F15\u7528\u300D\u90A3\u4E00\u523B\u624D\u91C7\u4E0A\u4E0B\u6587\uFF08\u5212\u9009\u8FC7\u7A0B\u4E2D\u6BCF\u6B21 selectionchange \u90FD\u91C7\u592A\u8D35\uFF09\u3002\n * \u4F1A\u8BDD\u91CC\u7684\u5F15\u7528\uFF08\u4E3B\u754C\u9762\uFF09\u5148\u7528**\u5C40\u90E8\u7A97\u53E3**\u515C\u5E95\uFF0C\u53D1\u9001\u524D\u518D\u95EE host \u8981\u6309\u8F6E\u53D6\u6574\u7684\u5E72\u51C0\u4E0A\u4E0B\u6587\u3002\n */\n function quoteContextFor(selection) {\n if (!selection) return { context: '', session: false }\n if (selection.source === 'panel') {\n // \u5C0F\u7A97\u6B63\u6587\uFF1A\u4E0D\u5E26\u4E0A\u6587\uFF0C\u53EA\u9760\u6807\u7B7E\u8BF4\u6E05\"\u51FA\u81EA\u54EA\u91CC\"\uFF08\u89C1 panelSourceLabel\uFF09\n return { context: '', session: false }\n }\n if (selection.source === 'iframe') {\n // \u4FA7\u8FB9\u680F\u7F51\u9875\uFF1A\u5E27\u5185\u7684\u6865\u5DF2\u7ECF\u628A\u4E0A\u4E0B\u6587\u91C7\u597D\u4E86\uFF08\u00B11500 \u5B57\u7A97\u53E3\uFF0C\u9009\u4E2D\u90E8\u5206\u7528\u3010\u3011\u6807\u51FA\uFF09\n return { context: String(selection.context || ''), session: false }\n }\n var context = String(selection.context || '')\n if (!context && selection.range) {\n try {\n context = collectContext(env.rangeSelection(selection.range)).context || ''\n } catch (error) {\n context = ''\n }\n }\n return { context: context, session: true }\n }\n\n /**\n * \u4F1A\u8BDD\u91CC\u7684\u5F15\u7528\uFF1A\u5411 host \u8981\"\u5F15\u7528\u6240\u5728\u90A3\u4E00\u7EC4\u5BF9\u8BDD \u00B1 \u4E00\u7EC4\"\uFF08\u5E72\u51C0\u6587\u672C\u53EA\u6709 host \u90A3\u8FB9\u6709\uFF1A\n * \u5DE5\u5177\u8C03\u7528/\u7ED3\u679C\u3001\u7CFB\u7EDF\u63D0\u793A\u3001harness \u6CE8\u5165\u5728 `transcriptOf` \u90A3\u5957\u89C4\u5219\u91CC\u5DF2\u7ECF\u6EE4\u6389\u4E86\uFF09\u3002\n * \u62FF\u4E0D\u5230\uFF08\u5F15\u7528\u4E0D\u5728\u4F1A\u8BDD\u91CC / host \u4E0D\u8BA4 / \u8D85\u65F6\uFF09\u5C31\u4FDD\u7559\u5BA2\u6237\u7AEF\u81EA\u5DF1\u91C7\u7684\u90A3\u4EFD\uFF0C\u4E0D\u963B\u585E\u53D1\u9001\u3002\n */\n function resolveQuoteContexts(quotes) {\n var jobs = []\n for (var i = 0; i < quotes.length; i += 1) {\n if (quotes[i].session === true) jobs.push(quotes[i])\n }\n var sessionId = env.currentSessionId()\n if (jobs.length === 0 || !sessionId) return Promise.resolve(quotes)\n return Promise.all(\n jobs.map(function (quote) {\n return fetchQuoteContext(sessionId, quote.text).then(function (context) {\n if (context) quote.context = context\n return quote\n })\n }),\n ).then(function () {\n return quotes\n })\n }\n\n /** \u53D6\u4E00\u6B21\u4F1A\u8BDD\u7248\u5F15\u7528\u4E0A\u4E0B\u6587\uFF08\u5E26\u8D85\u65F6\uFF1B\u5931\u8D25\u4E00\u5F8B\u8FD4\u56DE\u7A7A\u4E32\u8D70\u515C\u5E95\uFF09\u3002 */\n function fetchQuoteContext(sessionId, text) {\n var controller = typeof AbortController === 'function' ? new AbortController() : null\n var timer = setTimeout(function () {\n if (controller) {\n try {\n controller.abort()\n } catch (error) {\n /* noop */\n }\n }\n }, QUOTE_CONTEXT_TIMEOUT)\n env.timers.push(timer)\n return fetch(QUOTE_CONTEXT_API, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ sessionId: sessionId, text: text }),\n ...(controller ? { signal: controller.signal } : {}),\n })\n .then(function (response) {\n return response.ok ? response.json() : null\n })\n .then(function (data) {\n clearTimeout(timer)\n if (data && data.ok === true && data.matched === true && typeof data.context === 'string') return data.context\n return ''\n })\n .catch(function () {\n clearTimeout(timer)\n return ''\n })\n }\n\n /**\n * \u5F15\u7528 + \u63D0\u95EE \u2192 **\u771F\u6B63\u53D1\u7ED9\u6A21\u578B**\u7684\u90A3\u6761\u6D88\u606F\u3002\n *\n * \u62FC\u5728\u5BA2\u6237\u7AEF\u800C\u4E0D\u662F host\uFF1A\u5F15\u7528\u672C\u6765\u5C31\u662F\"\u7528\u6237\u8FD9\u6761\u6D88\u606F\u7684\u4E00\u90E8\u5206\"\uFF0C\u62FC\u597D\u4E4B\u540E\n * \u8FFD\u95EE\u4E0A\u4E0B\u6587\u3001\u5386\u53F2\u56DE\u653E\u3001\u5347\u683C\u5168\u90FD\u5929\u7136\u5E26\u7740\u5B83\uFF0Chost \u53EA\u8D1F\u8D23**\u7ED9\u4E0A\u4E0B\u6587**\uFF08\u90A3\u6761\u8DEF\u7531\uFF09\u3002\n * \u6CA1\u6709\u5F15\u7528\u65F6**\u539F\u6837\u8FD4\u56DE\u63D0\u95EE** \u2014\u2014 \u8001\u8DEF\u5F84\u4E00\u4E2A\u5B57\u90FD\u4E0D\u53D8\u3002\n *\n * \u6BCF\u6BB5\u5F15\u7528\u56FA\u5B9A\u7ED9\uFF1A\u6765\u6E90 + \u3010\u5F15\u7528\u5904\u4E0A\u4E0B\u6587\u3011\uFF08\u88AB\u5F15\u7528\u7684\u90E8\u5206\u7528\u3010\u3011\u6807\u51FA\uFF09\u3002\n * \u4E0A\u4E0B\u6587\u91CC\u6CA1\u5E26\u4E0A\u539F\u6587\u65F6\uFF08\u88AB\u622A\u65AD\u3001\u6216\u6807\u8BB0\u5931\u8D25\uFF09\u518D\u8865\u4E00\u6BB5\u3010\u5F15\u7528\u539F\u6587\u3011\u2014\u2014\n * \u7EDD\u4E0D\u8BA9\u6A21\u578B\u53BB\u731C\"\u5F15\u7684\u662F\u54EA\u53E5\"\u3002\n */\n function composeQuestion(quotes, question) {\n var ask = String(question || '').trim()\n var list = quotes || []\n if (list.length === 0) return ask\n var lines = []\n for (var i = 0; i < list.length; i += 1) {\n var quote = list[i]\n var context = String(quote.context || '').trim()\n lines.push('\u3010\u5F15\u7528 ' + (i + 1) + '\u3011\uFF08\u6765\u81EA' + quoteLabelOf(quote) + '\uFF09')\n if (context) {\n lines.push('\u3010\u5F15\u7528\u5904\u4E0A\u4E0B\u6587\u3011\uFF08\u88AB\u5F15\u7528\u7684\u90E8\u5206\u7528\u3010\u3011\u6807\u51FA\uFF09')\n lines.push(context)\n if (!contextHasQuote(context, quote.text)) {\n lines.push('')\n lines.push('\u3010\u5F15\u7528\u539F\u6587\u3011')\n lines.push(quote.text)\n }\n } else {\n lines.push(quote.text)\n }\n lines.push('')\n }\n lines.push('\u3010\u6211\u7684\u95EE\u9898\u3011')\n lines.push(ask || QUOTE_ONLY_QUESTION)\n return lines.join('\\n')\n }\n\n /** \u67D0\u4E00\u8F6E\"\u5B9E\u9645\u53D1\u51FA\u53BB\"\u7684\u6587\u672C\uFF1A\u7528\u6237\u90A3\u8F6E\u5E26\u5F15\u7528\u5757\uFF0C\u52A9\u624B\u8F6E\u5C31\u662F\u6B63\u6587\u3002 */\n function sentTextOf(turn) {\n if (!turn) return ''\n if (turn.role === 'user') return turn.sent || turn.text || ''\n return turn.text || ''\n }\n\n /** \u5BFC\u51FA\u7ED9 host \u7684\u8F6E\u6B21\uFF08\u5386\u53F2\u843D\u76D8 / \u5347\u683C\uFF09\uFF1A\u7528\u6237\u90A3\u8F6E\u628A\u5F15\u7528\u5757\u4E00\u8D77\u5E26\u8D70\u3002 */\n function exportTurns() {\n var out = []\n for (var i = 0; i < env.state.turns.length; i += 1) {\n out.push({ role: env.state.turns[i].role, text: sentTextOf(env.state.turns[i]) })\n }\n return out\n }\n return {\n renderQuotes,\n addQuote,\n quoteContextFor,\n composeQuestion,\n clearQuotes,\n turnIndexOfNode,\n sentTextOf,\n exportTurns,\n quoteLabelOf,\n quoteBrief,\n resolveQuoteContexts,\n }\n}\n", "\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u4FA7\u8FB9\u680F\u7F51\u9875\uFF1Aiframe \u5212\u8BCD\u6865 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * \u4FA7\u8FB9\u680F\u7684 HTML \u9884\u89C8\u662F**\u4E0D\u900F\u660E\u6E90**\u6C99\u7BB1 iframe\uFF08`sandbox=\"allow-scripts\"`\uFF0C\n * \u523B\u610F\u4E0D\u7ED9 `allow-same-origin`\uFF09\uFF1A\u7236\u9875\u9762\u62FF\u4E0D\u5230 contentDocument\uFF0C\n * \u9876\u5C42 `window.getSelection()` \u6C38\u8FDC\u662F\u7A7A\u7684 \u2014\u2014 \u5212\u8BCD\u5728\u90A3\u91CC\u7B49\u4E8E\u778E\u7684\u3002\n *\n * \u89E3\u6CD5\u53EA\u6709\u4E00\u4E2A\u65B9\u5411\uFF1A**\u8BA9\u5E27\u5185\u81EA\u5DF1\u4E0A\u62A5**\u3002\u4E0B\u9762\u8FD9\u6BB5\u811A\u672C\u88AB\u6CE8\u5165\u8FDB\u88AB\u9884\u89C8\u7684\u6587\u6863\uFF0C\n * \u5728\u5E27\u5185\u8BFB\u9009\u533A\u3001\u5C31\u5730\u91C7\u96C6\u4E0A\u4E0B\u6587\uFF08\u7B97\u6CD5\u4E0E\u7236\u9875\u9762 `collectContext` \u5B8C\u5168\u4E00\u81F4\uFF09\uFF0C\n * \u518D\u7528 postMessage \u62A5\u51FA\u6765\uFF1B\u7236\u9875\u9762\u628A\"\u5E27\u5185\u5750\u6807 + iframe \u7684 getBoundingClientRect()\"\n * \u6362\u7B97\u6210\u89C6\u53E3\u5750\u6807\uFF0C\u590D\u7528\u540C\u4E00\u5957\u6D6E\u6807\u4E0E\u9762\u677F\u3002\n *\n * \u5B89\u5168\u8FB9\u754C\uFF08\u4E0D\u80FD\u9000\u8BA9\uFF09\uFF1A**\u4E0D\u52A0 `allow-same-origin`**\uFF0C\u5E27\u4ECD\u662F\u4E0D\u900F\u660E\u6E90 \u2014\u2014\n * \u9884\u89C8\u9875\u7167\u6837\u8BFB\u4E0D\u5230 GUI \u7684 DOM / Cookie / localStorage\uFF0C\u4E5F\u7167\u6837\u4E0D\u80FD\u5BFC\u822A\u9876\u5C42\u7A97\u53E3\u3002\n * \u6865\u53EA\u5F80\u5916\u62A5\"\u9009\u4E2D\u4E86\u4EC0\u4E48 + \u5468\u56F4\u90A3\u70B9\u6587\u672C\"\uFF0C\u522B\u7684\u4EC0\u4E48\u90FD\u4E0D\u7ED9\u3002\n *\n * \u4E24\u5904\u7EC6\u8282\u4E0D\u80FD\u7701\uFF1A\n * \u2460 \u76D1\u542C\u6302\u5728 **window** \u4E0A\u3001\u5E76\u4E14\u7528\u8F6E\u8BE2\u515C\u5E95 \u2014\u2014 \u4EA4\u4E92\u5F0F\u9884\u89C8\u7684\u5916\u5C42\u6587\u6863\u662F bootstrap\uFF0C\n * \u5B83 `document.open()/write()/close()` \u4F1A\u628A document \u4E0A\u7684\u76D1\u542C\u5168\u90E8\u51B2\u6389\uFF0C\n * \u53EA\u6709 window \u4E0A\u7684\u76D1\u542C\u80FD\u6D3B\u4E0B\u6765\uFF08\u89C1\u5BBF\u4E3B ui-sidebar-documentpreview \u7684 createHtmlDocument\uFF09\u3002\n * \u2461 \u62A5\u7684\u662F**\u5E27\u5185\u89C6\u53E3\u5750\u6807**\uFF08range.getClientRects \u7684\u6700\u540E\u4E00\u6BB5\uFF09\uFF0C\u7236\u9875\u9762\u518D\u52A0\u504F\u79FB\u3002\n */\nexport function bridgeBody() {\n if (window.__dshSelBridge) return\n window.__dshSelBridge = 1\n var WINDOW_CHARS = 1500\n var KEY_CHARS = 300\n // \u5E27\u5185\u53EA\u5B88\u8BBE\u7F6E\u5141\u8BB8\u7684\u6700\u9AD8\u8FB9\u754C\uFF1B\u7236\u9875\u9762\u6309\u5F53\u524D\u8BBE\u7F6E\u51B3\u5B9A\u662F\u5426\u663E\u793A\u5165\u53E3\u3002\n var MAX_SELECTION = 20000\n /** \u9F20\u6807\u6309\u7740\u8D85\u8FC7\u8FD9\u4E48\u4E45\u8FD8\u6CA1\u7B49\u5230 mouseup\uFF0C\u5C31\u5F53\u677E\u624B\u843D\u5728\u5E27\u5916\u4E86\uFF08\u522B\u6C38\u4E45\u5361\u4F4F\u4E0A\u62A5\uFF09\u3002 */\n var STALE_PRESS_MS = 6000\n /** \u8F6E\u8BE2\u8FDE\u7EED\u8FD9\u4E48\u591A\u62CD\u90FD\u8BFB\u4E0D\u5230\u9009\u533A\uFF0C\u624D\u8BA4\u4E3A\u9009\u533A\u771F\u6CA1\u4E86\uFF08\u7EA6 1.5s\uFF1B\u77AC\u65F6\u8BFB\u4E0D\u5230\u4E0D\u6E05\uFF09\u3002 */\n var NULL_TICKS_TO_CLEAR = 6\n /** \u4E0A\u4E00\u6B21\u62A5\u51FA\u53BB\u7684\u9009\u533A\u6307\u7EB9\uFF08\u6587\u5B57 + \u4F4D\u7F6E\uFF09\uFF0C\u7528\u6765\u53BB\u91CD\u3002 */\n var last = ''\n /** \u9F20\u6807\u662F\u4E0D\u662F\u6309\u7740\uFF08\u62D6\u62FD\u5212\u8BCD\u8FDB\u884C\u4E2D\uFF09\u3002 */\n var pressed = false\n var pressedAt = 0\n /** \u4E0A\u4E00\u62CD\u8F6E\u8BE2\u770B\u5230\u7684\u6307\u7EB9\uFF1A\u7528\u4E8E\"\u7A33\u5B9A\u4E00\u62CD\u518D\u62A5\"\u3002 */\n var pollKey = ''\n /** \u8F6E\u8BE2\u8FDE\u7EED\u8BFB\u4E0D\u5230\u9009\u533A\u7684\u62CD\u6570\u3002 */\n var nullTicks = 0\n\n function norm(text) {\n return String(text || '').replace(/\\s+/g, ' ').trim()\n }\n\n function send(kind, sel) {\n try {\n parent.postMessage({ __dshSel: 1, kind: kind, sel: sel || null }, '*')\n } catch (error) {\n /* \u9876\u5C42\u88AB\u5BFC\u822A\u8D70\u4E86\u4E4B\u7C7B\uFF1A\u62A5\u4E0D\u51FA\u53BB\u5C31\u7B97\u4E86\uFF0C\u4E0D\u80FD\u56E0\u4E3A\u62A5\u9519\u628A\u9884\u89C8\u9875\u641E\u574F */\n }\n }\n\n /** \u9009\u533A\u6240\u5728\u7684\u8BED\u4E49\u5BB9\u5668\uFF1A\u4E0E\u7236\u9875\u9762 pickContainer \u540C\u4E00\u5957\u89C4\u5219\uFF08\u5F80\u4E0A\u627E\u5230\u7B2C\u4E00\u4E2A\u591F\u957F\u7684\u5143\u7D20\uFF09\u3002 */\n function containerOf(node) {\n var element = node && node.nodeType === 1 ? node : node && node.parentElement\n while (element && element !== document.body) {\n var length = (element.innerText || '').length\n if (length >= 120) return element\n element = element.parentElement\n }\n return element || document.body\n }\n\n function labelOf(element) {\n try {\n if (element && element.closest && element.closest('pre,code')) return '\u4EE3\u7801\u5757'\n if (element && element.closest && element.closest('table')) return '\u8868\u683C'\n } catch (error) {\n /* \u5B64\u7ACB\u8282\u70B9\u4E0A closest \u4F1A\u629B\uFF0C\u5FFD\u7565 */\n }\n return ''\n }\n\n /** \u8FD9\u4E9B\u6807\u7B7E\u7684\u6587\u672C\u4E0D\u7B97\u6B63\u6587\uFF08\u811A\u672C\u6E90\u7801 / \u6837\u5F0F / \u6A21\u677F / \u6587\u6863\u5934\uFF09\u3002 */\n var SKIP_TAGS = { SCRIPT: 1, STYLE: 1, NOSCRIPT: 1, TEMPLATE: 1, HEAD: 1, TITLE: 1, META: 1, LINK: 1 }\n\n /**\n * \u8D70 DOM \u6536\u96C6\u5BB9\u5668\u7684\u53EF\u89C1\u6587\u672C\uFF0C\u5E76\u7ED9\u51FA `target`\uFF08\u9009\u533A\u8D77\u70B9\uFF09\u5728\u8FD9\u6BB5\u6587\u672C\u91CC\u7684\u504F\u79FB\u3002\n * \u6BD4 `Range.toString()` \u591A\u4E00\u6B65\uFF1A\u8DF3\u8FC7 script/style \u7B49\u2014\u2014\u5426\u5219\u9875\u9762\u91CC\u7684 JS \u6E90\u7801\u4F1A\u6DF7\u8FDB\u4E0A\u4E0B\u6587\u3002\n * target \u662F\u5143\u7D20\u8282\u70B9\uFF08\u6574\u6BB5\u9009\u4E2D\u7684\u60C5\u51B5\uFF09\u65F6\uFF0C\u53D6\"\u8FDB\u5165\u8BE5\u5143\u7D20\u90A3\u4E00\u523B\"\u7684\u957F\u5EA6\u4F5C\u4E3A\u504F\u79FB\uFF1B\n * \u662F\u6587\u672C\u8282\u70B9\u65F6\u8FD8\u8981\u52A0\u4E0A `targetOffset`\uFF08\u9009\u533A\u5728\u6587\u672C\u8282\u70B9\u5185\u7684\u5B57\u7B26\u504F\u79FB\uFF09\u3002\n */\n function collectText(root, target, targetOffset) {\n var text = ''\n var offset = -1\n function walk(node) {\n if (!node) return\n if (node.nodeType === 3) {\n if (node === target) offset = text.length + (targetOffset || 0)\n text += node.nodeValue || ''\n return\n }\n if (node.nodeType !== 1) return\n if (SKIP_TAGS[node.tagName]) return\n if (node === target) offset = text.length\n var kids = node.childNodes || []\n for (var i = 0; i < kids.length; i += 1) walk(kids[i])\n }\n walk(root)\n return { text: text, offset: offset }\n }\n\n /** \u8BFB\u4E00\u6B21\u9009\u533A\uFF1A\u6587\u5B57 + \u4E0A\u4E0B\u6587\u7A97\u53E3 + \u5E27\u5185\u5750\u6807\uFF1B\u6CA1\u6709\u6709\u6548\u9009\u533A\u8FD4\u56DE null\u3002 */\n function read() {\n var selection = window.getSelection && window.getSelection()\n if (!selection || selection.rangeCount === 0 || selection.isCollapsed) return null\n var text = String(selection.toString() || '')\n if (!text.trim() || text.length > MAX_SELECTION) return null\n var range\n try {\n range = selection.getRangeAt(0)\n } catch (error) {\n return null\n }\n var start = range.startContainer\n var startElement = /** @type {Element | null} */ (start && start.nodeType === 1 ? start : start && start.parentElement)\n try {\n if (startElement && startElement.closest && startElement.closest('input,textarea')) return null\n } catch (error) {\n /* \u8F93\u5165\u6846\u5224\u65AD\u5931\u8D25\u4E0D\u81F4\u547D */\n }\n var container = containerOf(startElement)\n var out = { text: text.trim(), context: '', keyContext: '', label: labelOf(container) }\n try {\n // \u5BB9\u5668\u6B63\u6587\uFF1A**\u8D70 DOM \u53D6\u6587\u672C**\uFF0C\u8DF3\u8FC7 script / style / noscript / template / head\u3002\n // \u4E0D\u80FD\u7528 Range.toString()\uFF1A\u5B83\u628A <script> \u91CC\u7684\u6E90\u7801\u4E5F\u7B97\u8FDB\u6B63\u6587\u2014\u2014\u5B9E\u6D4B\uFF08\u771F\u6D4F\u89C8\u5668\u5192\u70DF\uFF09\n // \u4EA4\u4E92\u5F0F\u9884\u89C8\u91CC\u7684\u4E0A\u4E0B\u6587\u4F1A\u5E26\u4E0A\u6574\u6BB5\u9875\u9762 JS\uFF0C\u5582\u7ED9\u6A21\u578B\u7EAF\u5C5E\u566A\u97F3\u3002\n var walked = collectText(container, range.startContainer, range.startOffset)\n var rawFull = walked.text\n var offset = walked.offset\n if (offset < 0) {\n // \u9009\u533A\u8D77\u70B9\u4E0D\u5728\u8FD9\u4E2A\u5BB9\u5668\u91CC\uFF08\u8DE8\u5BB9\u5668\u9009\u533A\u4E4B\u7C7B\uFF09\uFF1A\u9000\u56DE Range \u7684\u7B97\u6CD5\uFF0C\u81F3\u5C11\u522B\u4E22\u4E0A\u4E0B\u6587\n var prefix = document.createRange()\n prefix.selectNodeContents(container)\n prefix.setEnd(range.startContainer, range.startOffset)\n offset = prefix.toString().length\n }\n var from = Math.max(0, offset - WINDOW_CHARS)\n var to = Math.min(rawFull.length, offset + text.length + WINDOW_CHARS)\n var windowText = rawFull.slice(from, to)\n var relative = offset - from\n var probe = windowText.slice(relative, relative + text.length)\n var marked\n if (norm(probe) === norm(text)) {\n marked = windowText.slice(0, relative) + '\u3010' + probe + '\u3011' + windowText.slice(relative + text.length)\n } else {\n var found = rawFull.indexOf(text)\n if (found >= 0) {\n var f2 = Math.max(0, found - WINDOW_CHARS)\n var t2 = Math.min(rawFull.length, found + text.length + WINDOW_CHARS)\n var w2 = rawFull.slice(f2, t2)\n var r2 = found - f2\n marked = w2.slice(0, r2) + '\u3010' + w2.slice(r2, r2 + text.length) + '\u3011' + w2.slice(r2 + text.length)\n } else {\n marked = text + '\\n---\\n' + windowText\n }\n }\n out.context = marked\n .replace(/\\u00a0/g, ' ')\n .replace(/[ \\t]+/g, ' ')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim()\n out.keyContext = rawFull\n .slice(Math.max(0, offset - KEY_CHARS), offset)\n .replace(/\\u00a0/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n } catch (error) {\n /* \u53D6\u4E0D\u5230\u4E0A\u4E0B\u6587\u5C31\u7ED9\u7A7A\u4E32\uFF1A\u7236\u9875\u9762\u7167\u6837\u80FD\u5F00\u9762\u677F\uFF0C\u53EA\u662F\u5C11\u4E86\u80CC\u666F */\n }\n var rect = null\n try {\n var rects = range.getClientRects()\n rect = rects && rects.length > 0 ? rects[rects.length - 1] : null\n } catch (error) {\n rect = null\n }\n if (!rect) {\n try {\n rect = range.getBoundingClientRect()\n } catch (error) {\n rect = null\n }\n }\n if (!rect || (!rect.width && !rect.height)) return null\n out.rect = {\n x: rect.left,\n y: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n w: rect.width,\n h: rect.height,\n }\n return out\n }\n\n /** \u9009\u533A\u6307\u7EB9\uFF1A\u6587\u5B57 + \u5E27\u5185\u4F4D\u7F6E\uFF08\u4F4D\u7F6E\u53D8\u4E86\u4E5F\u8981\u91CD\u62A5\uFF0C\u7236\u9875\u9762\u636E\u6B64\u632A\u6D6E\u6807\uFF09\u3002 */\n function fingerprint(now) {\n if (!now) return ''\n return now.text + '\\u0000' + now.rect.x + ',' + now.rect.y + ',' + now.rect.bottom + ',' + now.rect.right\n }\n\n /**\n * \u8BFB\u4E00\u6B21\u5E76\u4E0A\u62A5\u3002\n *\n * `allowClear === false` \u65F6**\u53EA\u62A5\u9009\u533A\u3001\u4E0D\u62A5\"\u9009\u533A\u6CA1\u4E86\"**\uFF1A\u6EDA\u52A8/\u6539\u5C3A\u5BF8/\u8F6E\u8BE2\u8FD9\u4E9B\n * \"\u987A\u624B\u91CD\u62A5\u4E00\u4E0B\u4F4D\u7F6E\"\u7684\u8DEF\u5F84\u4E0D\u8BE5\u6709\u6E05\u7A7A\u6743 \u2014\u2014 \u9875\u9762\u91CD\u7ED8\u3001\u52A8\u753B\u3001\u5B57\u4F53\u56DE\u6D41\u65F6\n * `getClientRects()` \u4F1A\u77ED\u6682\u62FF\u4E0D\u5230\u77E9\u5F62\uFF0C\u4E00\u6296\u5C31 clear \u4F1A\u628A\u6D6E\u6807\u8BEF\u6536\u6389\n * \uFF08\u7528\u6237\u770B\u5230\u7684\u5C31\u662F\"\u6D6E\u6807\u81EA\u5DF1\u6D88\u5931\u4E86\"\uFF09\u3002\u771F\u6B63\u7684\u6E05\u7A7A\u4FE1\u53F7\u6765\u81EA mouseup / keyup /\n * selectionchange \u8FD9\u4E9B**\u7528\u6237\u52A8\u4F5C**\u3002\n */\n function report(allowClear) {\n var now = read()\n if (!now) {\n if (last && allowClear !== false) {\n last = ''\n send('clear', null)\n }\n return\n }\n var key = fingerprint(now)\n if (key === last) return\n last = key\n send('selection', now)\n }\n\n /**\n * \u8F6E\u8BE2\u515C\u5E95\uFF08250ms\uFF09\uFF1A\u53EA\u8D1F\u8D23\"\u6CA1\u4EBA\u901A\u77E5\u6211\u4EEC\"\u7684\u60C5\u51B5\u3002\n *\n * \u4E09\u9053\u95F8\u95E8\u90FD\u662F\u4E3A\u4E86**\u65F6\u673A**\u8DDF\u4E3B\u4F1A\u8BDD\u4E00\u81F4\uFF08\u4E3B\u4F1A\u8BDD\u53EA\u5728 mouseup / keyup \u540E\u5F39\uFF09\uFF1A\n * \u2460 \u9F20\u6807\u6309\u7740\uFF08\u62D6\u62FD\u5212\u8BCD\u8FDB\u884C\u4E2D\uFF09\u4E00\u5F8B\u4E0D\u62A5 \u2014\u2014 \u5426\u5219\u62D6\u5230\u4E00\u534A\u6D6E\u6807\u5C31\u5192\u51FA\u6765\uFF0C\u8FD8\u8DDF\u7740\u624B\u6307\u8DD1\uFF1B\n * \u2461 \u9009\u533A\u8FD8\u5728\u53D8\uFF08\u8FD9\u4E00\u62CD\u4E0E\u4E0A\u4E00\u62CD\u6307\u7EB9\u4E0D\u540C\uFF09\u5148\u8BB0\u8D26\uFF0C**\u7A33\u5B9A\u4E00\u62CD**\u518D\u62A5\uFF1B\n * \u2462 \u8FDE\u7EED NULL_TICKS_TO_CLEAR \u62CD\u90FD\u8BFB\u4E0D\u5230\u9009\u533A\u624D\u8BA4\u4E3A\u5B83\u771F\u6CA1\u4E86 \u2014\u2014 \u4E00\u6B21\u77AC\u65F6\u8BFB\u4E0D\u5230\n * \u53EA\u5F53\u9875\u9762\u5728\u91CD\u7ED8\uFF0C\u4E0D\u6E05\u6D6E\u6807\uFF08\u77AC\u65F6\u8BEF\u6E05\u7684\u8868\u73B0\u5C31\u662F\"\u6D6E\u6807\u81EA\u5DF1\u6D88\u5931\"\uFF09\u3002\n * \u677E\u624B\u843D\u5728\u5E27\u5916\u65F6\u4E0D\u4F1A\u6709 mouseup\uFF1A\u8D85\u8FC7 STALE_PRESS_MS \u5C31\u5F53\u5DF2\u7ECF\u677E\u5F00\uFF0C\u522B\u628A\u4E0A\u62A5\u6C38\u4E45\u5361\u6B7B\u3002\n */\n function tick() {\n if (pressed) {\n if (Date.now() - pressedAt < STALE_PRESS_MS) return\n pressed = false\n }\n var now = read()\n if (!now) {\n pollKey = ''\n nullTicks += 1\n if (nullTicks >= NULL_TICKS_TO_CLEAR && last) {\n last = ''\n send('clear', null)\n }\n return\n }\n nullTicks = 0\n var key = fingerprint(now)\n if (key !== pollKey) {\n pollKey = key\n return\n }\n if (key === last) return\n last = key\n send('selection', now)\n }\n\n window.addEventListener('mousedown', function () {\n pressed = true\n pressedAt = Date.now()\n // \u5E27\u5185\u6309\u4E0B = \u7528\u6237\u5F00\u59CB\u65B0\u52A8\u4F5C \u2192 \u8BA9\u7236\u9875\u9762\u5148\u628A\u6D6E\u6807\u6536\u6389\u3002\n // \u4E3B\u4F1A\u8BDD\u90A3\u8FB9 document \u7684 mousedown \u5C31\u662F\"\u70B9\u54EA\u90FD\u5148\u6536\u8D77\u6D6E\u6807\"\uFF1B\u5E27\u5185\u7684\u70B9\u51FB\u7236\u9875\u9762\u6536\u4E0D\u5230\uFF0C\n // \u4E0D\u8865\u8FD9\u4E00\u6761\u7684\u8BDD\uFF1A\u5728\u7F51\u9875\u91CC\u70B9\u4E00\u4E0B\uFF08\u53D6\u6D88\u9009\u533A/\u70B9\u522B\u5904\uFF09\u6D6E\u6807\u4F1A\u8D56\u7740\u4E0D\u8D70\u3002\n send('press', null)\n }, true)\n // \u677E\u624B\u624D\u662F\"\u5212\u5B8C\u4E86\"\uFF1A\u4E0E\u4E3B\u4F1A\u8BDD\u4E00\u81F4\uFF08\u90A3\u8FB9\u4E5F\u662F mouseup \u4E4B\u540E\u624D\u5F39\u6D6E\u6807\uFF09\n window.addEventListener('mouseup', function () {\n pressed = false\n setTimeout(report, 0)\n }, true)\n window.addEventListener('keyup', function () { setTimeout(report, 0) }, true)\n // \u7126\u70B9\u79BB\u5F00\u8FD9\u4E00\u5E27\uFF08\u70B9\u53BB\u522B\u5904\uFF09\uFF1D \u62D6\u62FD\u72B6\u6001\u4F5C\u5E9F\uFF0C\u514D\u5F97 pressed \u5361\u4F4F\n window.addEventListener('blur', function () { pressed = false }, true)\n // \u5E27\u5185\u6EDA\u52A8/\u6539\u5C3A\u5BF8 \u2192 \u4F4D\u7F6E\u53D8\u4E86\uFF0C\u91CD\u62A5\u4E00\u6B21\uFF08\u7236\u9875\u9762\u636E\u6B64\u632A\u6D6E\u6807\uFF09\u3002\u8FD9\u4E24\u6761\u4E0D\u8BB8 clear\n window.addEventListener('scroll', function () {\n if (pressed) return\n setTimeout(function () {\n report(false)\n }, 60)\n }, true)\n window.addEventListener('resize', function () {\n if (!pressed) report(false)\n })\n window.addEventListener('message', function (event) {\n var data = event && event.data\n if (!data || data.__dshSel !== 1) return\n if (data.kind === 'ping') {\n send('hello', null)\n report()\n }\n if (data.kind === 'rescan') report()\n })\n try {\n document.addEventListener('selectionchange', function () {\n // \u62D6\u62FD\u4E2D\u4E0D\u62A5\uFF1B\u952E\u76D8\u6269\u9009\uFF08Shift+\u65B9\u5411\u952E\uFF09\u6CA1\u6709 mousedown\uFF0C\u7167\u65E7\u5373\u65F6\u4E0A\u62A5\n if (!pressed) report()\n })\n } catch (error) {\n /* \u8001\u73AF\u5883\u6CA1\u6709 selectionchange\uFF1A\u8F6E\u8BE2\u515C\u7740 */\n }\n setInterval(tick, 250)\n setTimeout(report, 60)\n}\n\n/** \u6CE8\u5165\u6807\u8BB0\uFF1A\u65E2\u7528\u6765\u8BA4\"\u8FD9\u4EFD HTML \u5DF2\u7ECF\u6865\u8FC7\"\uFF0C\u4E5F\u662F iframe \u5143\u7D20\u4E0A\u7684\u8BB0\u53F7\u3002 */\nexport var BRIDGE_MARK = 'data-dsh-sel-bridge'\n\n/**\n * \u628A\u6865\u811A\u672C\u63D2\u8FDB\u4E00\u4EFD HTML\uFF08\u8FD4\u56DE\u65B0\u4E32\uFF1B\u6CA1\u6709\u53EF\u63D2\u7684\u5730\u65B9 / \u5DF2\u7ECF\u63D2\u8FC7 \u2192 null\uFF09\u3002\n *\n * \u57FA\u7840\u9884\u89C8\uFF08srcdoc\uFF09\u90A3\u4EFD HTML \u5DF2\u7ECF\u8FC7\u5BBF\u4E3B DOMPurify \u6E05\u6D17\uFF1A\u65E0\u811A\u672C\u3001\u65E0\u5916\u94FE\uFF0C\n * \u4E14\u5E26\u4E00\u6761 `script-src 'none'` \u7684 CSP\u3002\u6211\u4EEC**\u53EA\u653E\u5BBD\u8FD9\u4E00\u6761**\u5230 'unsafe-inline'\n * \uFF08\u597D\u8BA9\u6865\u8DD1\u8D77\u6765\uFF09\uFF0C`default-src 'none'` / `connect-src 'none'` / `img-src data:`\n * \u7B49\u5176\u4F59\u9650\u5236\u539F\u6837\u4FDD\u7559 \u2014\u2014 \u9884\u89C8\u9875\u4F9D\u7136\u8054\u4E0D\u4E86\u7F51\u3001\u52A0\u8F7D\u4E0D\u4E86\u5916\u90E8\u8D44\u6E90\u3002\n */\nexport function bridgeIntoHtml(html) {\n var text = String(html || '')\n if (!text || text.indexOf(BRIDGE_MARK) >= 0) return null\n text = text.replace(/script-src\\s+'none'/i, \"script-src 'unsafe-inline'\")\n var tag = '<scr' + 'ipt ' + BRIDGE_MARK + '>(' + String(bridgeBody) + ')();</scr' + 'ipt>'\n return insertIntoHtml(text, tag)\n}\n\n/**\n * \u63D2\u5165\u4F4D\u7F6E\u6309\"\u5C3D\u91CF\u9760\u524D\u3001\u4F46\u522B\u7834\u574F\u6587\u6863\"\u6392\u5E8F\uFF1A\n * charset\uFF08\u4E2D\u6587\u6807\u7B7E\u4E0D\u80FD\u53D8\u4E71\u7801\uFF09\u2192 head \u2192 html \u2192 \u7B2C\u4E00\u4E2A script \u4E4B\u524D \u2192 doctype \u4E4B\u540E \u2192 \u6700\u524D\u3002\n */\nexport function insertIntoHtml(html, tag) {\n var anchors = [/<meta[^>]+charset[^>]*>/i, /<head[^>]*>/i, /<html[^>]*>/i]\n for (var i = 0; i < anchors.length; i += 1) {\n var hit = anchors[i].exec(html)\n if (hit) {\n var cut = hit.index + hit[0].length\n return html.slice(0, cut) + tag + html.slice(cut)\n }\n }\n var script = /<script/i.exec(html)\n if (script) return html.slice(0, script.index) + tag + html.slice(script.index)\n var doctype = /^\\s*<!doctype[^>]*>/i.exec(html)\n if (doctype) {\n var end = doctype.index + doctype[0].length\n return html.slice(0, end) + tag + html.slice(end)\n }\n return tag + html\n}", "import { clamp } from './dom.js'\nimport { BRIDGE_MARK, bridgeIntoHtml } from './bridge.js'\n\n/** preview state and operations; dependencies are supplied as live node/callback accessors. */\nexport function createPreviewController(env) {\n\n // \u2014\u2014 \u4FA7\u8FB9\u680F\u7F51\u9875\uFF08iframe\uFF09\u5212\u8BCD\u6865\u7684\u7236\u4FA7\u63A5\u7EBF \u2014\u2014\n\n /**\n * \u6211\u4EEC\u6865\u8FC7\u7684\u5E27\uFF1Aframe \u2192 \u81EA\u5DF1\u5EFA\u7684 blob url\uFF08'' = srcdoc \u5E27\uFF0C\u6CA1\u6709 blob \u8981\u56DE\u6536\uFF09\u3002\n * \u7528 Map \u800C\u4E0D\u662F\u6570\u7EC4\uFF1A\u65E2\u8981\u6309\u5E27\u67E5\u81EA\u5DF1\u7684 url\uFF0C\u4E5F\u8981\u904D\u5386\u627E\u56DE\u6D88\u606F\u6765\u6E90\u5BF9\u5E94\u7684\u5E27\u3002\n */\n var bridged = new Map()\n\n /**\n * \u5E27 \u2192 \u6700\u540E\u4E00\u6B21\u6536\u5230\u5B83\u7684\u6D88\u606F\u7684\u65F6\u95F4\u6233\u3002\n *\n * \u53EA\u4E3A\u4E00\u4EF6\u4E8B\uFF1A\u5224\u65AD\"\u7528\u6237\u6B64\u523B\u662F\u4E0D\u662F\u5C31\u5728\u90A3\u4E2A\u4FA7\u8FB9\u680F\u7F51\u9875\u91CC\"\uFF08\u89C1 hasFocusEvidence\uFF09\u3002\n * \u7126\u70B9\u843D\u5728\u4E0D\u900F\u660E\u6E90\u5B50\u6846\u67B6\u91CC\u65F6\uFF0C\u7236\u6587\u6863\u7684 `document.hasFocus()` \u672A\u5FC5\u4E3A\u771F\uFF0C\n * \u800C\u6865\u62A5\u4E0A\u6765\u7684\u6BCF\u6761\u6D88\u606F\u672C\u8EAB\u5C31\u662F\"\u7528\u6237\u521A\u5728\u90A3\u513F\u52A8\u8FC7\"\u7684\u8BC1\u636E\u3002\n */\n var frameTouchedAt = new Map()\n\n /** \u603B\u5F00\u5173\uFF1Ahost \u7684 bridgeSidebarPreview \u8BF4\u5173\u5C31\u5173\uFF08\u89C1\u4E0B\u9762 ping \u5206\u652F\uFF09\u3002 */\n var bridgeOn = true\n\n /** \u626B\u63CF\u8282\u6D41\u7528\u7684\u5B9A\u65F6\u5668 id\u3002 */\n var bridgeScanId = 0\n\n var bridgeObserver = null\n\n function ownedUrl(frame) {\n var url = bridged.get(frame)\n return url === undefined ? '' : url\n }\n\n /** \u6D88\u606F\u6765\u6E90 \u2192 \u5E27\uFF08\u53EA\u8BA4\u6211\u4EEC\u6865\u8FC7\u7684\u5E27\uFF0C\u522B\u7684\u7A97\u53E3\u53D1\u6765\u7684\u6D88\u606F\u4E00\u6982\u4E0D\u7406\uFF09\u3002 */\n function frameBySource(source) {\n var found = null\n bridged.forEach(function (url, frame) {\n if (found) return\n try {\n if (frame.contentWindow && frame.contentWindow === source) found = frame\n } catch (error) {\n /* \u8DE8\u6E90\u53D6 contentWindow \u53EF\u80FD\u629B\uFF0C\u5FFD\u7565 */\n }\n })\n return found\n }\n\n /** \u6C99\u7BB1\u8865\u4E00\u4E2A allow-scripts\uFF08**\u7EDD\u4E0D\u8865 allow-same-origin**\uFF09\uFF1A\u6865\u8981\u8DD1\u8D77\u6765\u3002 */\n function ensureScriptsAllowed(frame) {\n var sandbox = frame.getAttribute('sandbox')\n if (sandbox === null) return // \u6CA1\u6709 sandbox \u5C5E\u6027 = \u540C\u6E90\u5E27\uFF0C\u4E0D\u5F52\u8FD9\u6761\u8DEF\u7BA1\n if (!/(^|\\s)allow-scripts(\\s|$)/.test(sandbox)) {\n frame.setAttribute('sandbox', (sandbox + ' allow-scripts').trim())\n }\n }\n\n /** \u5E27\u5185\u5750\u6807 \u2192 \u89C6\u53E3\u5750\u6807\uFF1B\u9009\u533A\u6EDA\u51FA\u5E27\u7684\u53EF\u89C6\u533A\u5C31\u8FD4\u56DE null\uFF08\u514D\u5F97\u6D6E\u6807\u98D8\u5230\u4E3B\u4F1A\u8BDD\u4E0A\uFF09\u3002 */\n function mapFrameRect(frame, reported) {\n if (!reported) return null\n var box\n try {\n box = frame.getBoundingClientRect()\n } catch (error) {\n return null\n }\n if (!box || (!box.width && !box.height)) return null\n var left = box.left + Number(reported.x || 0)\n var top = box.top + Number(reported.y || 0)\n var right = box.left + Number(reported.right || 0)\n var bottom = box.top + Number(reported.bottom || 0)\n if (!(right > left)) right = left + Number(reported.w || 0)\n if (!(bottom > top)) bottom = top + Number(reported.h || 0)\n if (bottom < box.top + 2 || top > box.bottom - 2) return null\n top = clamp(top, box.top, box.bottom)\n bottom = clamp(bottom, box.top, box.bottom)\n left = clamp(left, box.left, box.right)\n right = clamp(right, box.left, box.right)\n return {\n left: left,\n top: top,\n right: right,\n bottom: bottom,\n width: Math.max(0, right - left),\n height: Math.max(0, bottom - top),\n }\n }\n\n /** \u9762\u677F\u91CC\u7684\u4F4D\u7F6E\u6807\u7B7E\uFF1A\u5E27\u5185\u8BA4\u51FA\u6765\u7684\uFF08\u4EE3\u7801\u5757/\u8868\u683C\uFF09\u4F18\u5148\uFF0C\u5426\u5219\u6309\u5E27\u7684\u6765\u6E90\u7ED9\u3002 */\n function labelForFrame(frame, frameLabel) {\n if (frameLabel === '\u4EE3\u7801\u5757' || frameLabel === '\u8868\u683C') return frameLabel\n if (frame.getAttribute('data-html-preview') !== null) return '\u4FA7\u8FB9\u680F\u7F51\u9875'\n // \u5176\u4ED6\u63D2\u4EF6\u7684\u7F51\u9875\uFF08\u4F8B\u5982\u300C\u56FE\u89E3\u300D\uFF09\uFF1A\u7528\u5E27\u81EA\u5DF1\u7684 title \u5F53\u4F4D\u7F6E\u6807\u7B7E\uFF0C\u6BD4\u7B3C\u7EDF\u7684\"\u7F51\u9875\u5185\u5BB9\"\u6709\u7528\n var title = String(frame.getAttribute('title') || '')\n .replace(/\\s+/g, ' ')\n .trim()\n return title ? title.slice(0, 24) : '\u7F51\u9875\u5185\u5BB9'\n }\n\n /**\n * \u8FD9\u4E00\u5E27\u80FD\u4E0D\u80FD\u6865\u3002\n *\n * \u53EA\u8BA4\"\u6587\u6863\u786E\u5B9E\u662F\u6211\u4EEC\u80FD\u6539\u5199\u7684\u90A3\u4E24\u79CD\"\uFF1A`srcdoc` \u6216 `blob:` \u2014\u2014 \u8FDC\u7AEF\u7AD9\u70B9 iframe \u4E0E\n * \u8DEF\u7531 URL \u7684\u9884\u89C8\u5668\uFF08\u5982 better-sidebar \u7684 HTML \u9884\u89C8\uFF09\u4E00\u6982\u4E0D\u52A8\uFF0C\u5B83\u4EEC\u7684\u8D44\u6E90\u6539\u5199\n * \u4E0E\u751F\u547D\u5468\u671F\u5F52\u5B83\u4EEC\u81EA\u5DF1\u3002\n *\n * \u6C99\u7BB1\u4E0A\u5206\u4E24\u6863\uFF0C\u56E0\u4E3A\"\u8865 allow-scripts\"\u662F\u6709\u4EE3\u4EF7\u7684\uFF1A\n * \u00B7 \u5BBF\u4E3B\u81EA\u5DF1\u7684 HTML \u9884\u89C8\uFF08`data-html-preview`\uFF09\uFF1A\u5185\u5BB9\u5DF2\u7531\u5BBF\u4E3B DOMPurify \u6E05\u6D17\u6210\n * \"\u65E0\u811A\u672C\u3001\u65E0\u5916\u94FE\"\uFF0C\u8865 allow-scripts \u4E4B\u540E\u771F\u6B63\u4F1A\u8DD1\u7684\u53EA\u6709\u6865\u81EA\u5DF1\uFF0C\u53EF\u4EE5\u8865\uFF1B\n * \u00B7 \u5176\u4ED6\u63D2\u4EF6\u7684\u7F51\u9875\uFF08\u5982\u300C\u56FE\u89E3\u300D\u7684 `blob:` \u5E27\uFF09\uFF1A**\u53EA\u6865\u672C\u6765\u5C31\u5141\u8BB8\u811A\u672C\u7684**\u2014\u2014\n * \u4E0D\u7ED9\u522B\u4EBA\u7684\u6C99\u7BB1\u52A0\u6743\u9650\uFF0C\u514D\u5F97\u628A\u4E00\u4EFD\u523B\u610F\u4E0D\u8DD1\u811A\u672C\u7684\u6587\u6863\u53D8\u6210\u4F1A\u8DD1\u811A\u672C\u3002\n */\n function bridgeableFrame(frame) {\n if (!frame || frame.nodeType !== 1 || !frame.isConnected) return false\n if (env.panel.contains(frame)) return false // \u6211\u4EEC\u81EA\u5DF1\u7684\u5C0F\u7A97\uFF08\u542B\u7F51\u9875\u7B54\u6848\u9884\u89C8\uFF09\u4E0D\u6865\n var hasSrcdoc = frame.getAttribute('srcdoc') !== null\n var src = frame.getAttribute('src') || ''\n if (!hasSrcdoc && !/^blob:/i.test(src)) return false\n var sandbox = frame.getAttribute('sandbox')\n if (sandbox === null) return false\n if (frame.getAttribute('data-html-preview') !== null) return true\n return /(^|\\s)allow-scripts(\\s|$)/.test(sandbox)\n }\n\n function bridgeFrame(frame) {\n if (!bridgeOn || !bridgeableFrame(frame)) return\n var srcdoc = frame.getAttribute('srcdoc')\n if (srcdoc !== null && srcdoc !== undefined) {\n if (srcdoc.indexOf(BRIDGE_MARK) >= 0) return // \u5DF2\u7ECF\u6865\u8FC7\uFF08\u6211\u4EEC\u81EA\u5DF1\u5199\u56DE\u53BB\u7684\u90A3\u4EFD\uFF09\n var next = bridgeIntoHtml(srcdoc)\n if (!next) return\n // \u987A\u5E8F\u6709\u8BB2\u7A76\uFF08Chrome 153 \u5B9E\u6D4B\uFF09\uFF1A**\u5148\u8865\u6C99\u7BB1\u3001\u518D\u6539 srcdoc\uFF0C\u4E14\u5FC5\u987B\u5728\u540C\u4E00\u4E2A\u4EFB\u52A1\u91CC**\u3002\n // \u5148\u6539 srcdoc \u518D\u8865\u6C99\u7BB1\u3001\u6216\u8005\u5206\u4E24\u4E2A\u4EFB\u52A1\u6539\uFF0C\u5E27\u90FD\u4E0D\u4F1A\u5E26\u7740 allow-scripts \u91CD\u65B0\u52A0\u8F7D\n // \uFF08\u811A\u672C\u9759\u9ED8\u4E0D\u8DD1\uFF0C\u8868\u73B0\u4E3A\"\u6CE8\u5165\u4E86\u4F46\u6CA1\u53CD\u5E94\"\uFF09\u3002\n ensureScriptsAllowed(frame)\n frame.setAttribute('data-dsh-sel-bridged', '1')\n frame.setAttribute('srcdoc', next)\n bridged.set(frame, '')\n return\n }\n var src = frame.getAttribute('src') || ''\n // \u53EA\u52A8 blob:\uFF08\u5BBF\u4E3B\u4E0E\u300C\u56FE\u89E3\u300D\u8FD9\u7C7B\u63D2\u4EF6\u90FD\u662F\u7528\u5B83\u88C5\u751F\u6210\u9875\u7684\uFF09\u3002\n // \u8DEF\u7531 URL / \u8FDC\u7AEF\u5730\u5740\u4E00\u6982\u4E0D\u78B0\uFF1A\u90A3\u4E9B\u7684\u8D44\u6E90\u6539\u5199\u4E0E\u751F\u547D\u5468\u671F\u5F52\u5BBF\u4E3B\uFF0C\u63D2\u624B\u53EA\u4F1A\u5F04\u574F\u9884\u89C8\u3002\n if (!/^blob:/i.test(src)) return\n if (src === ownedUrl(frame)) return // \u5DF2\u7ECF\u662F\u6211\u4EEC\u6362\u4E0A\u53BB\u7684\u90A3\u4EFD\n fetch(src)\n .then(function (response) {\n // \u539F blob \u7684 MIME **\u8981\u8DDF\u7740\u642C**\uFF1Ablob: \u6587\u6863\u6CA1\u6709\"\u7236\u6587\u6863\u7F16\u7801\"\u53EF\u7EE7\u627F\uFF0C\n // \u7F16\u7801\u53EA\u6765\u81EA\u8FD9\u4E2A content-type\uFF08\u6216\u9875\u9762\u91CC\u7684 meta\uFF09\u3002\u300C\u56FE\u89E3\u300D\u5EFA blob \u65F6\u5199\u7684\u662F\n // `text/html;charset=utf-8`\uFF0C\u6211\u4EEC\u82E5\u9000\u56DE\u88F8 `text/html`\uFF0C\u9875\u9762\u53C8\u6CA1\u5199 meta charset \u7684\u8BDD\uFF0C\n // \u6574\u9875\u4E2D\u6587\u4F1A\u53D8\u6210\u4E71\u7801\uFF08\u5B9E\u6D4B\u8FC7\uFF1A`\u9365\u6350\u0412\u6924?`\uFF09\u3002\n var type = 'text/html'\n try {\n var header = response.headers && response.headers.get && response.headers.get('content-type')\n if (header) type = header\n } catch (error) {\n /* \u53D6\u4E0D\u5230\u5C31\u9000\u56DE text/html\uFF1A\u4E0E\u539F\u884C\u4E3A\u4E00\u81F4 */\n }\n return response.text().then(function (text) {\n return { text: text, type: type }\n })\n })\n .then(function (loaded) {\n if (!bridgeOn || !frame.isConnected) return\n var bridgedHtml = bridgeIntoHtml(loaded.text)\n if (!bridgedHtml) return\n var url = URL.createObjectURL(new Blob([bridgedHtml], { type: loaded.type }))\n var previous = ownedUrl(frame)\n bridged.set(frame, url)\n ensureScriptsAllowed(frame)\n frame.setAttribute('data-dsh-sel-bridged', '1')\n frame.setAttribute('src', url)\n if (previous) {\n try {\n URL.revokeObjectURL(previous)\n } catch (error) {\n /* \u56DE\u6536\u5931\u8D25\u4E0D\u81F4\u547D */\n }\n }\n })\n .catch(function () {\n /* \u8BFB\u4E0D\u5230\u5C31\u653E\u7740\uFF1A\u539F\u9884\u89C8\u7167\u5E38\u663E\u793A\uFF0C\u53EA\u662F\u8FD9\u4E00\u5E27\u6CA1\u6709\u5212\u8BCD\u6865 */\n })\n }\n\n /** \u5E27\u6CA1\u4E86\uFF08\u5173\u6807\u7B7E\u9875/\u5207\u6E90\u7801\u89C6\u56FE\uFF09\u5C31\u987A\u624B\u56DE\u6536\u6211\u4EEC\u81EA\u5DF1\u5EFA\u7684 blob\uFF0C\u522B\u6F0F\u3002 */\n function pruneBridged() {\n var dead = []\n bridged.forEach(function (url, frame) {\n if (!frame.isConnected) dead.push(frame)\n })\n for (var i = 0; i < dead.length; i += 1) {\n var url = bridged.get(dead[i])\n if (url) {\n try {\n URL.revokeObjectURL(url)\n } catch (error) {\n /* \u56DE\u6536\u5931\u8D25\u4E0D\u81F4\u547D */\n }\n }\n // \u5E27\u6CA1\u4E86\u5C31\u4E0D\u4F1A\u518D\u6709 clear \u6D88\u606F\u4E86\uFF1A\u628A\u5B83\u5360\u7740\u7684\u90A3\u6761\u9009\u533A\u4E00\u8D77\u6E05\u6389\uFF0C\n // \u5426\u5219 `bridgeActive` \u4F1A\u4E00\u76F4\u6302\u7740\uFF08\u8868\u73B0\u4E3A\u9876\u5C42\u9009\u533A\u584C\u6389\u4E5F\u4E0D\u6536\u6D6E\u6807\uFF09\u3002\n // \u5361\u7247\u5F00\u7740\u65F6\u4E5F\u4E0D\u6E05\uFF1A\u5E27\u6CA1\u4E86\u4F46\u5B83\u5360\u7740\u7684\u9009\u533A\u4ECD\u662F\"\u8FD9\u4E00\u8F6E\u7684\u89E3\u8BFB\u5BF9\u8C61\"\uFF08\u53D1\u9001\u8981\u7528\uFF09\uFF0C\n // \u4E0E\u4E0B\u9762 clear \u5206\u652F\u540C\u4E00\u6761\u89C4\u5219\u3002\n if (env.state.selection && env.state.selection.frame === dead[i]) {\n env.state.bridgeActive = false\n if (!env.vcardState.open) env.state.selection = null\n env.hideButton()\n }\n frameTouchedAt.delete(dead[i])\n bridged.delete(dead[i])\n }\n }\n\n function scanPreviewFrames() {\n if (!bridgeOn) return\n // \u65E0\u6D4F\u89C8\u5668\u6D4B\u8BD5\u7684\u6869 DOM \u6CA1\u6709 querySelectorAll\uFF1A\u6865\u6574\u4F53\u9759\u9ED8\u8DF3\u8FC7\n if (typeof document.querySelectorAll !== 'function') return\n pruneBridged()\n // \u626B\u5168\u90E8 iframe \u518D\u6309 bridgeableFrame \u8FC7\u6EE4\uFF1A\u5BBF\u4E3B\u7684 HTML \u9884\u89C8\u3001\u4EE5\u53CA\u522B\u7684\u63D2\u4EF6\n // \u5728\u4FA7\u8FB9\u680F\u6E32\u67D3\u7684\u751F\u6210\u7F51\u9875\uFF08\u300C\u56FE\u89E3\u300D\u90A3\u79CD blob: \u5E27\uFF09\u90FD\u5728\u8FD9\u6761\u8DEF\u4E0A\uFF0C\n // \u4E0D\u80FD\u53EA\u770B\u5BBF\u4E3B\u7684 data-html-preview \u6807\u8BB0\u3002\n var frames = document.querySelectorAll('iframe')\n for (var i = 0; i < frames.length; i += 1) bridgeFrame(frames[i])\n }\n\n function scheduleBridgeScan() {\n if (bridgeScanId) return\n bridgeScanId = env.later(function () {\n bridgeScanId = 0\n scanPreviewFrames()\n }, 120)\n }\n return {\n get bridgeOn() { return bridgeOn },\n set bridgeOn(value) { bridgeOn = value },\n frameBySource,\n get frameTouchedAt() { return frameTouchedAt },\n set frameTouchedAt(value) { frameTouchedAt = value },\n mapFrameRect,\n labelForFrame,\n get bridgeObserver() { return bridgeObserver },\n set bridgeObserver(value) { bridgeObserver = value },\n scheduleBridgeScan,\n get bridged() { return bridged },\n set bridged(value) { bridged = value },\n scanPreviewFrames,\n get bridgeScanId() { return bridgeScanId },\n set bridgeScanId(value) { bridgeScanId = value },\n }\n}\n", "import { normalizeSpace, collectContext } from './context.js'\nimport { PANEL_SIZE, PANEL_GROW_MS, PANEL_GROW_EASE } from './constants.js'\nimport { listen, el, formatDuration, clamp } from './dom.js'\nimport { splitSections, stripEchoPrefix, renderRich } from './render.js'\n\n/** panel state and operations; dependencies are supplied as live node/callback accessors. */\nexport function createPanelController(env) {\n\n // \u2014\u2014 \u9762\u677F \u2014\u2014\n\n /** \u5F53\u524D\u4F1A\u8BDD id\uFF08\u5BA2\u6237\u7AEF sessions \u5FEB\u7167\uFF1B\u53D6\u4E0D\u5230\u5C31\u7559\u7A7A\uFF0Chost \u4F1A\u8DF3\u8FC7\u4F1A\u8BDD\u80CC\u666F\uFF09\u3002 */\n /**\n * \u5C0F\u7A97\u76F8\u5173\u8BF7\u6C42\u8BE5\u5E26\u7684\u4F1A\u8BDD id\u3002\n *\n * \u7528 `panelSessionId`\uFF08\u5212\u8BCD\u90A3\u4E00\u523B\u7684\u4F1A\u8BDD\uFF09\u800C\u4E0D\u662F `currentSessionId()`\uFF08\u5F53\u524D\u6B63\u5728\u770B\u7684\u4F1A\u8BDD\uFF09\uFF1A\n * \u5C0F\u7A97\u5F00\u7740\u65F6\u7528\u6237\u53EF\u80FD\u5207\u8D70\uFF0C\u82E5\u8FD8\u7528\u540E\u8005\uFF0C\u89E3\u8BFB/\u8FFD\u95EE/\u5347\u683C\u90FD\u4F1A\u8DD1\u5230**\u53E6\u4E00\u4E2A\u4F1A\u8BDD**\u4E0A \u2014\u2014\n * \u80CC\u666F\u53D6\u9519\u3001\u6A21\u578B\u4E5F\u8DDF\u7740\u6362\u6210\u53E6\u4E00\u4E2A\u4F1A\u8BDD\u7684\uFF08\u8BBE\u7F6E\u9875\u62EC\u53F7\u91CC\u663E\u793A\u7684\u4E5F\u4F1A\u4E0E\u5B9E\u9645\u7528\u7684\u5BF9\u4E0D\u4E0A\uFF09\u3002\n * \u8FD8\u6CA1\u5212\u8FC7\u8BCD\uFF08panelSessionId \u4E3A\u7A7A\uFF0C\u6BD4\u5982\u542F\u52A8\u65F6\u7684 ping\uFF09\u81EA\u7136\u843D\u56DE\u5F53\u524D\u4F1A\u8BDD\u3002\n */\n function panelOrCurrentSessionId() {\n return env.panelSessionId || currentSessionId()\n }\n\n function currentSessionId() {\n try {\n // \u65B0\u7248 DSH \u7684\u5217\u8868\u53EA\u4FDD\u5B58\u76EE\u5F55\uFF1B\u5BFC\u822A\u8EAB\u4EFD\u5728 uiSession \u7684\u4E3B\u89C6\u56FE\u7ED1\u5B9A\u4E2D\u3002\n var uiSession = env.ctx.get('uiSession')\n var bindingSource = uiSession && uiSession.adapter && uiSession.adapter.current\n if (bindingSource && typeof bindingSource.getSnapshot === 'function') {\n var binding = bindingSource.getSnapshot()\n var boundId = binding && binding.props && binding.props.sessionId\n return typeof boundId === 'string' ? boundId : ''\n }\n // \u517C\u5BB9\u5C1A\u672A\u63D0\u4F9B\u4E3B\u89C6\u56FE\u7ED1\u5B9A\u7684\u65E7\u7248 DSH\u3002\n var sessions = env.ctx.get('sessions')\n var store = sessions && sessions.list\n var snapshot = store && typeof store.getSnapshot === 'function' ? store.getSnapshot() : null\n var id = snapshot && snapshot.current\n return typeof id === 'string' ? id : ''\n } catch (error) {\n return ''\n }\n }\n\n /**\n * \u7F13\u5B58 key\uFF1A\u9009\u4E2D\u6587\u5B57 + \u5C40\u90E8\u4E0A\u4E0B\u6587\u7247\u6BB5\uFF08\u7A7A\u767D\u5F52\u4E00\uFF0C\u907F\u514D\u591A\u9009/\u5C11\u9009\u4E00\u4E2A\u7A7A\u683C\u5C31\u6362 key\uFF09\u3002\n * \u6CE8\u610F key \u91CC**\u4E0D\u542B**\u4F1A\u8BDD\u80CC\u666F\u2014\u2014\u672C\u5730\u7F13\u5B58\u7684\u4F5C\u7528\u5C31\u662F\"\u540C\u4E00\u4E2A\u8BCD\u518D\u70B9\u4E00\u6B21\u7ACB\u523B\u56DE\u653E\"\u3002\n */\n function cacheKeyOf(text, context) {\n return normalizeSpace(text) + '\\u0000' + normalizeSpace(context)\n }\n\n /** \u7F13\u5B58\u91CC\u6709\u6CA1\u6709\"\u540C\u4E00\u4E2A\u8BCD\u3001\u4F46\u4E0A\u4E0B\u6587\u4E0D\u540C\"\u7684\u65E7\u7ED3\u679C\uFF08\u7528\u6765\u89E3\u91CA\u8FD9\u6B21\u4E3A\u4EC0\u4E48\u6CA1\u547D\u4E2D\uFF09\u3002 */\n function hasSameTextElsewhere(text) {\n var prefix = normalizeSpace(text) + '\\u0000'\n var keys = env.cache.keys()\n for (var step = keys.next(); !step.done; step = keys.next()) {\n if (step.value.indexOf(prefix) === 0) return true\n }\n return false\n }\n\n /**\n * \u9009\u4E2D\u6587\u5B57\u662F\u4E0D\u662F**\u4EE3\u7801**\u3002\n * \u5148\u770B\u5BB9\u5668\uFF08<pre>/<code> \u76F4\u63A5\u5224\u4EE3\u7801\uFF09\uFF0C\u5BB9\u5668\u770B\u4E0D\u51FA\u6765\u518D\u6309\u6587\u672C\u7279\u5F81\u6253\u5206\uFF1A\n * \u884C\u9996\u8D4B\u503C/\u8C03\u7528\u3001\u82B1\u62EC\u53F7\u5206\u53F7\u6536\u5C3E\u3001\u7F29\u8FDB\u5757\u3001\u5173\u952E\u5B57\u3001\u8FD0\u7B97\u7B26\u3001\u6CE8\u91CA\u884C\u2026\u2026\n * \u9608\u503C\u523B\u610F\u504F\u9AD8\u2014\u2014\u5B81\u53EF\u628A\u4E00\u6BB5\u82F1\u6587\u5F53\u6563\u6587\uFF0C\u4E5F\u4E0D\u8981\u628A\u6563\u6587\u5F53\u4EE3\u7801\u53BB\"\u9010\u53E5\u6CE8\u91CA\"\u3002\n */\n function looksLikeCode(text) {\n var t = String(text || '')\n if (!t.trim()) return false\n if (t.indexOf('\\n') < 0 && t.trim().length < 24) return false // \u5355\u4E2A\u77ED\u8BCD\u51E0\u4E4E\u4E0D\u53EF\u80FD\u662F\u4EE3\u7801\u5757\n var strong = 0\n if (/^\\s*(?:[\\w$.]+\\s*[=(]|\\}|\\{|<[a-zA-Z/!])/m.test(t)) strong += 1\n if (/\\{\\s*$|\\}\\s*$|;\\s*$/m.test(t)) strong += 1\n if (/^\\s{2,}\\S/m.test(t)) strong += 1\n if (/\\b(function|def|class|import|export|const|let|var|return|async|await|public|private|static|interface|SELECT|INSERT|UPDATE|DELETE|FROM|WHERE|npm|pnpm|yarn|git|docker|curl)\\b/.test(t)) strong += 1\n if (/=>|->|::|!=|===?|\\+=|&&|\\|\\||<\\/[a-zA-Z]/.test(t)) strong += 1\n if (/^\\s*(#|\\/\\/|\\/\\*|\\*|--|<!--)/m.test(t)) strong += 1\n var lines = t.split('\\n').filter(function (line) { return line.trim() })\n if (strong >= 2) return true\n return lines.length >= 3 && strong >= 1 && /[{};=()]/.test(t)\n }\n\n /** 'code' | 'text'\uFF1A\u4EE3\u7801\u8D70\u300C\u6CE8\u91CA\u300D\uFF0C\u6587\u672C\u8D70\u300C\u7FFB\u8BD1 / \u89E3\u8BFB\u300D\u3002 */\n function selectionKind(text, label) {\n if (label === '\u4EE3\u7801\u5757') return 'code'\n return looksLikeCode(text) ? 'code' : 'text'\n }\n\n /**\n * \u9009\u4E2D\u6587\u5B57\u91CC\u6709\u6CA1\u6709\"\u9700\u8981\u7FFB\u8BD1\u7684\u82F1\u6587\"\uFF08\u62C9\u4E01\u5B57\u6BCD\u7EC4\u6210\u7684\u8BCD/\u53E5\uFF09\u3002\n * \u51B3\u5B9A\u4E86\u7B2C\u4E00\u8282\u7684\u6807\u9898\uFF1A\u6709\u82F1\u6587 \u2192 \u300C\u7FFB\u8BD1\u300D\uFF0C\u7EAF\u4E2D\u6587 \u2192 \u300C\u89E3\u8BFB\u300D\uFF08\u7EAF\u6C49\u5B57\u4E0D\u7FFB\u8BD1\uFF09\u3002\n * \u89C4\u5219\u8981\u548C host \u4FA7\u63D0\u793A\u8BCD\u4E00\u81F4\uFF1A\u81F3\u5C11\u4E24\u4E2A\u8FDE\u7EED\u62C9\u4E01\u5B57\u6BCD\u624D\u7B97\u3002\n */\n function hasEnglishToTranslate(text) {\n return /[A-Za-z]{2,}/.test(String(text || ''))\n }\n\n function applySectionTitle(kind, text) {\n var title = kind === 'code' ? '\u6CE8\u91CA' : hasEnglishToTranslate(text) ? '\u7FFB\u8BD1' : '\u89E3\u8BFB'\n env.state.sectionTitle = title\n env.translationSection.title.textContent = title\n env.expandButton.title = '\u5F53\u524D\u53EA\u7ED9\u4E86' + title + '\uFF08\u80CC\u666F 8 \u6761\uFF0C\u9996\u5B57\u66F4\u5FEB\uFF09\u3002\u70B9\u8FD9\u91CC\u52A0\u8F7D\u5B8C\u6574\u4F1A\u8BDD\u80CC\u666F\u5E76\u751F\u6210\u8BE6\u89E3\u3002'\n }\n\n /** \u4E00\u6B21\u89E3\u8BFB\u8BF7\u6C42\u7684\u8F7D\u8377\uFF08\u4F1A\u8BDD id \u8BA9 host \u80FD\u62C9\u53D6\u4F1A\u8BDD\u80CC\u666F\uFF09\u3002 */\n function buildPayload(text, context, label, refresh, stage) {\n return {\n text: text,\n context: context,\n label: label,\n title: document.title,\n url: location.href,\n sessionId: panelOrCurrentSessionId(),\n kind: selectionKind(text, label),\n stage: stage === 'detail' ? 'detail' : 'translation',\n ...(refresh ? { refresh: true } : {}),\n // \u6A21\u578B\u5BF9\u4E09\u4E2A\u9636\u6BB5\u4E00\u81F4\uFF1B\u6B64\u5904\u4E0D\u643A\u5E26\u8FFD\u95EE\u601D\u8003\u6863\u4F4D\u3002\n ...(env.state.modelChoice ? { provider: env.state.modelChoice.provider, model: env.state.modelChoice.model } : {}),\n }\n }\n\n /**\n * \u70B9\u5B8C\u300C\u2726 \u89E3\u8BFB\u300D\u5C31\u628A**\u672C\u6587\u6863**\u90A3\u6B21\u9009\u533A\u6536\u6389\u3002\n *\n * \u4E3A\u4EC0\u4E48\u5FC5\u987B\u6536\uFF1A\u5C0F\u7A97\u4E00\u5F00\uFF0C\u6D6E\u6807\u5C31\u5207\u6210\u300C\u275D \u5F15\u7528\u300D\uFF0C\u800C\u5F15\u7528\u6D6E\u6807\u662F\u6309\"\u6709\u6CA1\u6709\u6D3B\u9009\u533A\"\u5224\u5B9A\u7684 \u2014\u2014\n * \u7559\u7740\u89E3\u8BFB\u7528\u7684\u90A3\u6B21\u9009\u533A\uFF0C\u7528\u6237\u5728\u5C0F\u7A97\u91CC\u6572\u5B57\u3001\u6309\u4E00\u4E0B\u65B9\u5411\u952E\uFF08keyup \u4F1A\u89E6\u53D1\u4E00\u6B21\u68C0\u67E5\uFF09\uFF0C\n * \u5C31\u4F1A\u5728\u5C0F\u7A97\u4E0A\u65B9\u53C8\u5192\u51FA\u4E00\u4E2A\u300C\u275D \u5F15\u7528\u300D\uFF0C\u6307\u7684\u662F\u4ED6\u521A\u624D\u89E3\u8BFB\u7684\u90A3\u6BB5\u6587\u5B57\uFF0C\u83AB\u540D\u5176\u5999\u3002\n *\n * \u4E3A\u4EC0\u4E48\u80FD\u5B89\u5168\u6536\u6389\uFF1A\u89E3\u8BFB\u8981\u7684\u4E1C\u897F**\u5728 mouseup \u90A3\u4E00\u523B\u5C31\u90FD\u6293\u597D\u4E86** \u2014\u2014\n * `state.selection` \u91CC\u5B58\u7684\u662F\u6587\u5B57\u526F\u672C + **\u514B\u9686\u7684 Range**\uFF0C\u4E0A\u4E0B\u6587\u4E5F\u662F\u4ECE\u514B\u9686 Range \u91C7\u7684\n * \uFF08checkSelection \u2192 openForSelection\uFF09\uFF0C\u4E4B\u540E\u7684\u8BF7\u6C42\u3001\u7F13\u5B58 key\u3001\u5C55\u5F00\u8BE6\u89E3\u3001\u5386\u53F2\u56DE\u653E\u3001\n * \u5347\u683C\u90FD\u4E0D\u518D\u8BFB\u6D3B\u9009\u533A\u3002\u552F\u4E00\u7684\u4EE3\u4EF7\u662F\u90A3\u884C\u5B57\u7684\u9AD8\u4EAE\u6CA1\u4E86 \u2014\u2014 \u800C\u5C0F\u7A97\u9876\u90E8\u672C\u6765\u5C31\u5199\u7740\u9009\u4E2D\u6587\u5B57\u3002\n *\n * \u987A\u5E8F\u8981\u7D27\uFF1A\u5FC5\u987B\u5728 openForSelection **\u91C7\u5B8C\u4E0A\u4E0B\u6587\u4E4B\u540E**\u8C03\u7528 \u2014\u2014 \u4E07\u4E00\u73AF\u5883\u6CA1\u6709 cloneRange\uFF0C\n * \u90A3\u8FB9\u4F1A\u9000\u56DE\u8BFB\u6D3B\u9009\u533A\uFF08\u8001\u6D4F\u89C8\u5668\uFF09\uFF0C\u5148\u6E05\u5C31\u91C7\u4E0D\u5230\u4E86\u3002\n */\n function clearDocSelection() {\n try {\n var selection = window.getSelection && window.getSelection()\n if (selection && typeof selection.removeAllRanges === 'function' && selection.rangeCount > 0) {\n selection.removeAllRanges()\n }\n } catch (error) {\n /* \u6869\u73AF\u5883/\u8001\u6D4F\u89C8\u5668\u6CA1\u6709 removeAllRanges\uFF1A\u7559\u7740\u5C31\u7559\u7740\uFF0C\u4E0D\u5F71\u54CD\u4E3B\u6D41\u7A0B */\n }\n }\n\n function openForSelection(selection) {\n // \u4FA7\u8FB9\u680F\u7F51\u9875\u91CC\u7684\u9009\u533A\uFF1A\u7236\u9875\u9762\u8BFB\u4E0D\u5230\u90A3\u4E2A\u6587\u6863\uFF0C\u4E0A\u4E0B\u6587\u53EA\u80FD\u7531\u5E27\u5185\u6865\u5C31\u5730\u91C7\u597D\u5E26\u8FC7\u6765\n if (selection.source === 'iframe') {\n openPanelWith(selection.text, selection.context || '', selection.label, selection.rect, selection.keyContext)\n // \u5E27\u5185\u90A3\u6761\u9AD8\u4EAE\u6E05\u4E0D\u6389\uFF08\u4E0D\u900F\u660E\u6E90\uFF0C\u7236\u9875\u9762\u78B0\u4E0D\u5230\u5B83\u7684\u9009\u533A\uFF09\u2014\u2014\u53EA\u80FD\u8BA9\u6D6E\u6807\u81EA\u5DF1\u6536\u7740\uFF1B\n // \u597D\u5728\u5E27\u5185\u7684\u6865\u6309\u6307\u7EB9\u53BB\u91CD\uFF0C\u540C\u4E00\u6761\u9009\u533A\u4E0D\u4F1A\u53CD\u590D\u4E0A\u62A5\u3002\n return\n }\n var contextInfo = collectContext(selection.range ? rangeSelection(selection.range) : window.getSelection())\n openPanelWith(selection.text, contextInfo.context, contextInfo.label, selection.rect, contextInfo.keyContext)\n clearDocSelection()\n // \u9009\u533A\u8FDE\u540C\u5B83\u7684\u8BB0\u5F55\u4E00\u8D77\u4F5C\u5E9F\uFF1A\u4E4B\u540E\u8981\u5F15\u7528\u5C31\u91CD\u65B0\u5212\u4E00\u6BB5\uFF08\u90A3\u4F1A\u8D70 checkQuoteSelection\uFF09\n env.state.selection = null\n }\n\n /**\n * \u6253\u5F00\u9762\u677F\u7684\u516C\u5171\u8DEF\u5F84\uFF1A\u771F\u5B9E\u9009\u533A\u4E0E\u81EA\u68C0\u94A9\u5B50**\u5171\u7528**\u8FD9\u4E00\u6761\uFF0C\n * \u5426\u5219\u94A9\u5B50\u4F1A\u7ED5\u8FC7\u7F13\u5B58\uFF08\u7F13\u5B58\u884C\u4E3A\u53EA\u80FD\u9760\u4EBA\u5DE5\u70B9\u9009\u624D\u80FD\u9A8C\u8BC1\uFF09\u3002\n */\n function openPanelWithInner(text, context, label, anchor, keyContext, options) {\n // \u8FD9\u4E00\u8F6E\u662F\u4E0D\u662F\"\u4ECE\u8BED\u97F3\u5361\u76F4\u63A5\u8FDB\u8FFD\u95EE\"\uFF1Apaint() \u9760\u5B83\u51B3\u5B9A\u4E0D\u753B\u7FFB\u8BD1/\u8BE6\u89E3\u4E24\u8282\u3001\n // \u5E76\u4E14\u8BA9\u8FFD\u95EE\u8F93\u5165\u6846\u76F4\u63A5\u53EF\u89C1\uFF08\u89C1 state.voiceAsk \u7684\u51E0\u5904\u7528\u6CD5\uFF09\n env.state.voiceAsk = !!(options && options.askFirst)\n // \u8BB0\u4E0B\"\u8FD9\u6B21\u5212\u8BCD\u53D1\u751F\u5728\u54EA\u4E2A\u4F1A\u8BDD\"\u2014\u2014\u5C0F\u7A97\u540E\u7EED\u6240\u6709\u6309\u4F1A\u8BDD\u89E3\u6790\u7684\u4E1C\u897F\u90FD\u7528\u5B83\n env.panelSessionId = currentSessionId()\n env.state.payload = buildPayload(text, context, label)\n env.state.kind = env.state.payload.kind\n env.hideButton()\n showPanel(anchor)\n env.quote.textContent = text.length > 240 ? text.slice(0, 240) + ' \u2026' : text\n applySectionTitle(env.state.kind, text)\n // key \u7528\u7A33\u5B9A\u4E0A\u4E0B\u6587\uFF08\u9009\u4E2D\u6587\u5B57**\u4E4B\u524D**\u90A3\u6BB5\uFF09\uFF1B\u771F\u6B63\u5582\u6A21\u578B\u65F6\u4ECD\u7136\u7528\u5B8C\u6574\u4E0A\u4E0B\u6587\n var cacheKey = cacheKeyOf(text, keyContext === undefined ? context : keyContext)\n var cached = env.cache.get(cacheKey)\n env.state.cacheKey = cacheKey\n env.state.turns = []\n // \u6362\u4E86\u4E00\u6BB5\u9009\u4E2D\u6587\u5B57 = \u6362\u4E86\u4E00\u6B21\u5BF9\u8BDD\uFF1A\u4E0A\u4E00\u6BB5\u6512\u7684\u5F15\u7528**\u548C\u68C0\u7D22\u7ED3\u679C**\u90FD\u4E0D\u8BE5\u8DDF\u8FC7\u6765\u3002\n //\n // \u26A0\uFE0F toolDigest \u539F\u6765\u6F0F\u5728\u8FD9\u4E00\u6B65\uFF08\u5C5E\u9057\u6F0F\uFF0C\u4E0D\u662F\u6709\u610F\u4FDD\u7559\uFF09\u3002\u5B83\u7684\u8BED\u4E49\u5355\u4F4D\u5C31\u662F\"\u4E00\u6B21\u5BF9\u8BDD\"\uFF1A\n // \u6309\u5386\u53F2\u6761\u76EE\u843D\u76D8\u3001\u6309\u6761\u76EE\u6062\u590D\uFF0C\u5BBF\u4E3B\u53D1\u7ED9\u6A21\u578B\u7684\u63AA\u8F9E\u4E5F\u662F\u300C\u672C\u4F1A\u8BDD\u5DF2\u7ECF\u67E5\u5230\u7684\u7ED3\u679C\u300D\u3002\n // \u4F46 state \u662F\u6574\u9875\u53EA\u5EFA\u4E00\u6B21\u7684\uFF0C\u800C\u5B83**\u53EA\u5728\u5386\u53F2\u56DE\u653E\u65F6\u88AB\u6062\u590D\u3001\u522B\u5904\u4ECE\u4E0D\u590D\u4F4D** \u2014\u2014\n // \u4E8E\u662F\u53EA\u8981\u67D0\u6BB5\u5BF9\u8BDD\u641C\u8FC7\u4E1C\u897F\uFF08\u6BD4\u5982\u95EE\u8FC7\u4E00\u6B21\u65B0\u95FB\uFF09\uFF0C\u4E4B\u540E**\u6BCF\u4E00\u6BB5\u65B0\u9009\u533A**\u7684\u8FFD\u95EE\n // \u90FD\u4F1A\u628A\u90A3\u6BB5\u7ED3\u679C\u4E00\u5E76\u5E26\u7ED9\u6A21\u578B\uFF08\u7528\u6237\u5B9E\u6D4B\uFF1A\"\u6BCF\u6B21\u540E\u9762\u90FD\u5E26\u7740\u6211\u4E4B\u524D\u641C\u7684\u65B0\u95FB\"\uFF09\u3002\n //\n // \u53EA\u6E05 digest\u3001\u4E0D\u52A8 tools/thought\uFF1A\u90A3\u51E0\u4E2A\u5728\u8BF7\u6C42\u5F00\u59CB\u5904\u53E6\u6709\u4E00\u4EFD\u590D\u4F4D\uFF0C\n // digest \u5219\u8BE5\u5728\u8FD9\u91CC\uFF08\u4EE5\u53CA\u5386\u53F2\u56DE\u653E\uFF09\u52A8\u3002\n env.state.toolDigest = ''\n env.clearQuotes()\n env.state.parts = (cached && cached.parts) || { translation: '', detail: '' }\n env.state.stage = ''\n env.state.raw = ''\n // \u8BED\u97F3\u5361\u90A3\u6761\u8DEF\uFF08options.askFirst\uFF09\uFF1A**\u4E0D\u8BF7\u6C42 /analyze**\uFF0C\u76F4\u63A5\u628A\u8BF4\u7684\u8BDD\u5F53\u7B2C\u4E00\u6761\u8FFD\u95EE\u53D1\u51FA\u53BB\u3002\n // \u9762\u677F\u505C\u5728\"\u8FFD\u95EE\"\u9636\u6BB5\u3001\u7FFB\u8BD1\u4E0E\u8BE6\u89E3\u4E24\u8282\u662F\u7A7A\u7684 \u2014\u2014 \u8FD9\u6B63\u662F\"\u8DF3\u8FC7\u89E3\u8BFB\"\u7684\u5B57\u9762\u610F\u601D\u3002\n // \u7F13\u5B58\u4E0E\u5386\u53F2\u56DE\u653E\u4E00\u5F8B\u4E0D\u53C2\u4E0E\uFF1A\u7528\u6237\u8981\u7684\u662F\"\u73B0\u5728\u8FD9\u53E5\"\uFF0C\u4E0D\u662F\"\u8FD9\u6BB5\u6587\u5B57\u4E0A\u6B21\u7684\u89E3\u8BFB\"\u3002\n if (options && options.askFirst) {\n env.state.parts = { translation: '', detail: '' }\n env.state.phase = 'done'\n env.state.chars = 0\n env.state.error = ''\n env.state.fromCache = false\n env.state.sharedCache = false\n env.state.elapsed = 0\n env.state.toolBusy = false\n env.state.cacheState = ''\n env.renderTurns()\n paint()\n env.sendAsk(options.askFirst)\n return\n }\n env.renderTurns()\n if (cached) {\n env.state.turns = (cached.turns || []).slice()\n env.state.phase = 'done'\n env.state.stage = ''\n env.state.chars = (env.state.parts.translation || '').length + (env.state.parts.detail || '').length\n env.state.error = ''\n env.state.sharedCache = false\n env.state.fromCache = true\n env.state.sameTextHint = false\n env.state.elapsed = 0\n env.state.toolBusy = false\n env.state.cacheState = 'local'\n paint()\n env.renderTurns()\n return\n }\n // \u672A\u547D\u4E2D\uFF1A\u5982\u679C\u7F13\u5B58\u91CC\u8EBA\u8FC7\"\u540C\u4E00\u4E2A\u8BCD\"\uFF0C\u591A\u534A\u662F\u4E0A\u4E0B\u6587\u4E0D\u540C\u2014\u2014\u8BF4\u6E05\u695A\uFF0C\u522B\u8BA9\u4EBA\u4EE5\u4E3A\u7F13\u5B58\u574F\u4E86\n env.state.sameTextHint = hasSameTextElsewhere(text)\n // \u5148\u95EE host \u6709\u6CA1\u6709\u8FD9\u6BB5\u5BF9\u8BDD\u7684\u5386\u53F2\uFF1A\u547D\u4E2D\u5C31\u76F4\u63A5\u56DE\u653E\uFF0C\u4E0D\u8C03\u6A21\u578B\uFF1B\u6CA1\u6709\u624D\u53D1\u8BF7\u6C42\n env.state.phase = 'loading'\n env.state.startedAt = Date.now()\n paint()\n env.restoreFromHistory(cacheKey, function () {\n env.runRequest(env.state.payload, cacheKey)\n })\n }\n\n /**\n * \u5F00\u7A97\uFF08\u5E26\"\u5361\u7247 \u2192 \u5C0F\u7A97\"\u7684\u4EA4\u63A5\u52A8\u753B\uFF09\u3002\n *\n * \u4E3A\u4EC0\u4E48\u52A8\u753B\u653E\u5728**\u5185\u5BB9\u753B\u5B8C\u4E4B\u540E**\u3001\u800C\u4E0D\u662F showPanel \u91CC\u9762\uFF1AshowPanel \u90A3\u4E00\u523B\u9762\u677F\u8FD8\u6302\u7740\n * \u4E0A\u4E00\u8F6E\u7684 DOM\uFF08\u65B0\u5185\u5BB9\u8981\u5230\u540E\u9762\u7684 renderTurns / paint \u624D\u6362\u4E0A\u53BB\uFF09\uFF0C\u5728\u90A3\u91CC\u91CF\u9AD8\u5EA6\u91CF\u5230\u7684\u662F\u65E7\u7684 \u2014\u2014\n * \u5B9E\u6D4B\u8D77\u70B9 scaleY \u7528\u7684\u662F\u4E0A\u4E00\u8F6E\u7684 398px \u9AD8\u5EA6\uFF0C\u800C\u8FD9\u4E00\u8F6E\u5185\u5BB9\u662F 354px\u3002\n * \u8D77\u70B9\u672C\u6765\u5C31\u8981\u628A\u9762\u677F\u538B\u5230\u5361\u7247\u90A3\u4E00\u683C\uFF08\u89C6\u89C9\u4E0A\u4E00\u6837\uFF09\uFF0C\u4F46\u62FF\u65E7\u9AD8\u5EA6\u7B97\u7F29\u653E\u4F1A\u8BA9\u4E2D\u6BB5\u591A\u4E00\u6298\u3002\n *\n * \u53EA\u6709\"\u4ECE\u8BED\u97F3\u5361\u53D1\u9001\"\u90A3\u6761\u8DEF\u4F1A\u7559\u4E0B\u8D77\u70B9\uFF08vcardHandoff\uFF09\uFF1B\u5176\u4F59\u5F00\u7A97\u8DEF\u5F84\u8FD9\u91CC\u662F null\uFF0C\n * \u884C\u4E3A\u4E0E\u4EE5\u524D\u5B8C\u5168\u4E00\u81F4\uFF08\u77AC\u5F00\uFF09\u3002\n */\n function openPanelWith(text, context, label, anchor, keyContext, options) {\n openPanelWithInner(text, context, label, anchor, keyContext, options)\n var handoff = env.vcardHandoff\n env.vcardHandoff = null\n growPanelFromCard(handoff)\n }\n\n /** \u7531 Range \u8FD8\u539F\u4E00\u4E2A selection \u5F62\u72B6\u7684\u5BF9\u8C61\uFF08collectContext \u53EA\u7528\u5230\u8FD9\u4E24\u4E2A\u65B9\u6CD5\uFF09\u3002 */\n function rangeSelection(range) {\n return {\n rangeCount: 1,\n getRangeAt: function () {\n return range\n },\n toString: function () {\n return range.toString()\n },\n }\n }\n\n /**\n * \u5C0F\u7A97\u7684\u5C3A\u5BF8\uFF08\u7528\u6237\u62D6\u89D2\u6539\u8FC7\u4E4B\u540E\u624D\u6709\u503C\uFF1Bnull = \u7528 CSS \u91CC\u7684\u9ED8\u8BA4\u5C3A\u5BF8\uFF09\u3002\n *\n * **\u53EA\u8BB0\u5C3A\u5BF8\uFF0C\u4E0D\u8BB0\u4F4D\u7F6E**\uFF1A\u5C0F\u7A97\u6BCF\u6B21\u5F00\u7A97\u90FD\u5FC5\u987B\u6309\u9009\u533A\u91CD\u65B0\u951A\u5B9A\uFF08\u89C1 showPanel\uFF09\uFF0C\n * \u8FD9\u662F\u65E2\u6709\u7684\u8BBE\u8BA1 \u2014\u2014 \u4F4D\u7F6E\u4E00\u65E6\u88AB\u8BB0\u4F4F\uFF0C\u5F00\u7A97\u5C31\u4E0D\u518D\u8DDF\u7740\u5212\u8BCD\u7684\u5730\u65B9\u8D70\uFF0C\u7B49\u4E8E\u628A\u90A3\u5957\u951A\u5B9A\u67B6\u7A7A\u4E86\u3002\n * \u5C3A\u5BF8\u662F\u7528\u6237\u660E\u786E\u8C03\u8FC7\u7684\u4E1C\u897F\uFF0C\u8DE8\u5F00\u7A97\u4FDD\u7559\u624D\u5408\u7406\u3002\n */\n var panelSize = null\n\n var panelSizeAsked = false\n\n var panelSizeTimer = 0\n\n /** \u6B63\u5728\u62D6\u624B\u67C4 / \u62D6\u6807\u9898\u680F\u65F6\uFF0C\u522B\u8BA9 window resize \u7684\u5939\u53D6\u63D2\u4E00\u811A\u3002 */\n var panelInteracting = false\n\n /**\n * \u5C3A\u5BF8\u4E0B\u9650\uFF1A\u6BD4\"\u8BBE\u7F6E\u9875\u8981\u653E\u5F97\u4E0B\"\u4F4E\u4E00\u70B9\u5C31\u884C\u3002\u771F\u5B9E\u7EA6\u675F\u5728 CSS/JS \u91CC\uFF1A\n * \u592A\u7A84\u4E86\u6A21\u578B\u4E0B\u62C9\u548C\u63D0\u793A\u6587\u6848\u4F1A\u6324\u6210\u4E00\u56E2\uFF0C\u592A\u77EE\u4E86\u6B63\u6587\u6CA1\u5F97\u770B\u3002\n */\n var PANEL_MIN_W = 320\n\n var PANEL_MIN_H = 240\n\n /**\n * \u5F00\u7A97\u65F6\u5E94\u7528\"\u8BB0\u4F4F\u7684\u5C3A\u5BF8\"\u3002\n *\n * \u26A0\uFE0F \u5BBD\u5EA6\u662F**\u56FA\u5B9A\u503C**\uFF0C\u9AD8\u5EA6\u53EA\u80FD\u662F**\u4E0A\u9650**\uFF08max-height\uFF09\u3002\n *\n * \u9AD8\u5EA6\u8981\u662F\u5199\u6210\u56FA\u5B9A\u503C\uFF0C\u65B0\u5F00\u4E00\u4E2A\u4F1A\u8BDD\uFF08\u5185\u5BB9\u53EA\u6709\u4E00\u5C0F\u6BB5\u7FFB\u8BD1\uFF09\u65F6\u9762\u677F\u4F1A\u786C\u6491\u5230\u4E0A\u6B21\u90A3\u4E48\u5927\uFF0C\n * \u4E0B\u9762\u7559\u4E00\u5927\u7247\u7A7A\u767D \u2014\u2014 \u90A3\u662F\u56DE\u9000\u3002\u4EE5\u524D\u9AD8\u5EA6\u4E00\u76F4\u662F\u5185\u5BB9\u6491\u7684\uFF08`max-height` \u53EA\u662F\u4E2A\u5929\u82B1\u677F\uFF09\uFF0C\n * \u8FD9\u4E2A\u624B\u611F\u5FC5\u987B\u4FDD\u4F4F\uFF1A\u5185\u5BB9\u77ED\u5C31\u77ED\uFF0C\u5185\u5BB9\u957F\u624D\u957F\u5230\u4E0A\u9650\u3001\u518D\u6EDA\u52A8\u3002\n *\n * \u6240\u4EE5\u6BCF\u6B21\u5F00\u7A97\u90FD\u628A `height` **\u6E05\u6389**\uFF08\u56DE\u5230\u81EA\u9002\u5E94\uFF09\uFF0C\u53EA\u628A\u7528\u6237\u8C03\u8FC7\u7684\u9AD8\u5EA6\u5F53\u4F5C\u65B0\u7684\u5929\u82B1\u677F\u3002\n * \u7528\u6237\u5F53\u573A\u62D6\u51FA\u6765\u7684\u5C3A\u5BF8\u5728**\u672C\u6B21**\u6253\u5F00\u91CC\u7167\u65E7\u751F\u6548\uFF08\u62D6\u52A8\u65F6\u76F4\u63A5\u5199 inline height\uFF09\uFF0C\n * \u53EA\u662F\u4E0B\u6B21\u5F00\u7A97\u4F1A\u91CD\u65B0\u6309\u5185\u5BB9\u81EA\u9002\u5E94 \u2014\u2014 \u65E2\u6CA1\u6709\u7A7A\u767D\uFF0C\u62D6\u52A8\u4E5F\u770B\u5F97\u89C1\u53CD\u9988\u3002\n */\n function applyPanelSizeOnOpen() {\n // \u5148\u8FD8\u539F\u6210\"\u5185\u5BB9\u6491\u9AD8 + CSS \u9ED8\u8BA4\u5929\u82B1\u677F\"\n env.panel.style.height = ''\n env.panel.style.maxHeight = ''\n if (!panelSize) {\n env.panel.style.width = ''\n env.panel.removeAttribute('data-resized')\n return\n }\n env.panel.style.width = Math.round(panelSize.w) + 'px'\n env.panel.style.maxHeight = Math.round(panelSize.h) + 'px'\n // \u6253\u8FC7\u6807\u8BB0\uFF1A\u8BBE\u7F6E\u9875\u90A3\u6761\u7EA6 560 \u7684 min-height \u5C31\u522B\u518D\u63D2\u624B\u4E86\uFF08\u7528\u6237\u5DF2\u7ECF\u81EA\u5DF1\u5B9A\u4E86\u9AD8\uFF09\n env.panel.setAttribute('data-resized', '1')\n }\n\n /**\n * \u9762\u677F\u7684**\u5E03\u5C40**\u77E9\u5F62\uFF08\u4E0D\u53D7\"\u5361\u7247 \u2192 \u5C0F\u7A97\"\u4EA4\u63A5\u52A8\u753B\u7684 transform \u5F71\u54CD\uFF09\u3002\n *\n * \u4E3A\u4EC0\u4E48\u9700\u8981\u5B83\uFF1A\u4EA4\u63A5\u90A3 260ms \u91CC\u9762\u677F\u5E26\u7740 `translate+scale`\uFF0C\u8FD9\u65F6 `getBoundingClientRect()`\n * \u7ED9\u7684\u662F**\u7F29\u653E\u540E**\u7684\u6846 \u2014\u2014 \u8C01\u5728\u8FD9\u6BB5\u65F6\u95F4\u91CC\u91CF\u5B83\uFF08\u62D6\u62FD\u3001\u5939\u8FDB\u89C6\u53E3\u3001\u5386\u53F2\u5217\u8868\u5B9A\u4F4D\u3001\u6D4B\u8BD5\u94A9\u5B50\uFF09\uFF0C\n * \u62FF\u5230\u7684\u90FD\u662F\u9519\u7684\uFF08\u6BD4\u5982\u628A\u9762\u677F\u62D6\u5230\u5361\u7247\u90A3\u4E2A\u5C0F\u683C\u5B50\u7684\u4F4D\u7F6E\u4E0A\u53BB\uFF09\u3002\n * `offsetLeft/Top/Width/Height` \u662F\u5E03\u5C40\u503C\uFF0C\u4E0D\u53D7 transform \u5F71\u54CD\uFF1B\u9762\u677F\u662F position:fixed\uFF0C\n * \u6240\u4EE5\u5B83\u4EEC\u672C\u6765\u5C31\u662F\u89C6\u53E3\u5750\u6807\uFF0C\u4E0E getBoundingClientRect \u540C\u6E90\u3002\n */\n function panelLayoutRect() {\n var width = env.panel.offsetWidth\n var height = env.panel.offsetHeight\n var left = env.panel.offsetLeft\n var top = env.panel.offsetTop\n // \u62FF\u4E0D\u5230\u5E03\u5C40\u503C\u65F6\uFF08\u5355\u6D4B\u7684\u6869 DOM\u3001\u9762\u677F\u9690\u85CF\u7740\u91CF\u5230 0\u00D70\uFF09\u9000\u56DE\u6E32\u67D3\u77E9\u5F62\uFF1A\n // \u90A3\u4E24\u79CD\u60C5\u51B5\u4E0B\u4E5F\u4E0D\u53EF\u80FD\u6709\u4EA4\u63A5\u52A8\u753B\uFF0C\u9000\u56DE\u662F\u5B89\u5168\u7684\uFF0C\u800C\u4E14\u4E0E\u6539\u52A8\u524D\u7684\u884C\u4E3A\u4E00\u81F4\u3002\n if (!isFinite(width) || !isFinite(height) || !isFinite(left) || !isFinite(top) || (width === 0 && height === 0)) {\n var rect = env.panel.getBoundingClientRect()\n return { left: rect.left, top: rect.top, width: rect.width, height: rect.height, right: rect.right, bottom: rect.bottom }\n }\n return { left: left, top: top, width: width, height: height, right: left + width, bottom: top + height }\n }\n\n /** \u5F53\u524D\u5C3A\u5BF8\uFF08\u8BFB\u5B9E\u9645\u6E32\u67D3\u503C\uFF0C\u6BD4\u62FF\u53D8\u91CF\u7B97\u66F4\u7A33 \u2014\u2014 \u62D6\u62FD\u8FC7\u7A0B\u4E2D\u53D8\u91CF\u4F1A\u6F02\uFF09\u3002 */\n function currentPanelSize() {\n return { w: env.panel.offsetWidth, h: env.panel.offsetHeight }\n }\n\n /** \u5939\u8FDB\u89C6\u53E3\uFF1A\u6539\u5927\u5C0F/\u7A97\u53E3\u53D8\u5316\u540E\u90FD\u8C03\uFF0C\u4FDD\u8BC1\u624B\u67C4\u8FD8\u5728\u5C4F\u5E55\u91CC\u3001\u5C0F\u7A97\u4E0D\u4F1A\u8D85\u51FA\u53EF\u89C6\u533A\u3002 */\n function clampPanelSize(size) {\n var maxW = Math.max(PANEL_MIN_W, window.innerWidth - 8)\n var maxH = Math.max(PANEL_MIN_H, window.innerHeight - 8)\n return {\n w: Math.min(maxW, Math.max(PANEL_MIN_W, size.w)),\n h: Math.min(maxH, Math.max(PANEL_MIN_H, size.h)),\n }\n }\n\n /**\n * \u628A\u9762\u677F\u5939\u56DE\u53EF\u89C6\u533A\u3002\n *\n * **\u6BCF\u6B21\u5C3A\u5BF8\u53D8\u5316\u4E4B\u540E\u90FD\u8981\u8C03**\uFF1A\u4F4D\u7F6E\u662F\u5F53\u521D\u6309\u65E7\u5C3A\u5BF8\u7B97\u597D\u7684\uFF0C\u5C3A\u5BF8\u4E00\u53D8\u5C31\u53EF\u80FD\u628A\u9762\u677F\u9876\u51FA\u5C4F\u5E55\u3002\n * \u7528\u6237\u62A5\u7684\u5C31\u662F\u8FD9\u4E2A \u2014\u2014 \u5C0F\u7A97\u8D34\u7740\u5C4F\u5E55\u8FB9\u7F18\u65F6\u53CC\u51FB\u89D2\u6807\u6062\u590D\u9ED8\u8BA4\u5C3A\u5BF8\uFF0C\u4E00\u90E8\u5206\u76F4\u63A5\u8DD1\u5230\u5C4F\u5E55\u5916\u3002\n * \u4F18\u5148\u4FDD\u4F4F\u5DE6\u4E0A\u89D2\uFF08\u90A3\u662F\u7528\u6237\u770B\u5230\u7684\u951A\u70B9\uFF09\uFF0C\u53F3\u8FB9/\u4E0B\u8FB9\u653E\u4E0D\u4E0B\u624D\u5F80\u56DE\u6536\u3002\n */\n function clampPanelPosition() {\n var rect = panelLayoutRect()\n var maxLeft = Math.max(4, window.innerWidth - rect.width - 4)\n var maxTop = Math.max(4, window.innerHeight - rect.height - 4)\n env.panel.style.left = Math.round(Math.min(Math.max(rect.left, 4), maxLeft)) + 'px'\n env.panel.style.top = Math.round(Math.min(Math.max(rect.top, 4), maxTop)) + 'px'\n if (env.historyList.style.display === 'flex') env.placeHistoryList()\n }\n\n /** \u5B58\u5230 host\uFF08\u9632\u6296\uFF1A\u62D6\u52A8\u8FC7\u7A0B\u4E2D\u6BCF\u5E27\u90FD\u5B58\u4F1A\u628A\u63A5\u53E3\u6253\u7206\uFF09\u3002 */\n function savePanelSize() {\n if (panelSizeTimer) clearTimeout(panelSizeTimer)\n panelSizeTimer = setTimeout(function () {\n panelSizeTimer = 0\n var size = clampPanelSize(currentPanelSize())\n panelSize = size\n fetch(PANEL_SIZE, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ size: size }),\n }).catch(function () { /* \u5B58\u4E0D\u4E0A\u4E0D\u5F71\u54CD\u4F7F\u7528\uFF0C\u4E0B\u6B21\u518D\u6539\u8FD8\u4F1A\u5B58 */ })\n }, 300)\n }\n\n /** \u6302\u8F7D\u65F6\u95EE\u4E00\u6B21\uFF08\u5F02\u6B65\uFF0C\u56DE\u6765\u518D\u6446\uFF1B\u7528\u6237\u5DF2\u7ECF\u52A8\u8FC7\u5C31\u4EE5\u7528\u6237\u7684\u4E3A\u51C6\uFF09\u3002 */\n function loadPanelSize() {\n if (panelSizeAsked) return\n panelSizeAsked = true\n fetch(PANEL_SIZE)\n .then(function (res) { return res.json() })\n .then(function (data) {\n var size = data && data.size\n if (!size || panelInteracting) return\n if (typeof size.w !== 'number' || typeof size.h !== 'number') return\n panelSize = clampPanelSize(size)\n if (env.panelOpen) {\n applyPanelSizeOnOpen()\n clampPanelPosition()\n }\n })\n .catch(function () {})\n }\n\n /**\n * \u6062\u590D\u9ED8\u8BA4\u5C3A\u5BF8\uFF08\u53CC\u51FB\u53F3\u4E0B\u89D2\uFF09\u3002\n *\n * \u548C\"\u9AD8\u5EA6\u81EA\u9002\u5E94\"\u662F**\u540C\u4E00\u4E2A\u52A8\u4F5C**\uFF1A\u628A\u6574\u4EFD\u5B58\u6863\u6E05\u6389 \u2014\u2014\n * \u5BBD\u5EA6\u56DE\u5230 CSS \u9ED8\u8BA4\uFF08540 / \u9996\u8F6E\u9636\u6BB5 440\uFF09\uFF0C\u9AD8\u5EA6\u6E05\u6210 auto \u7531\u5185\u5BB9\u6491\uFF08\u4E5F\u5C31\u662F\u81EA\u9002\u5E94\uFF09\u3002\n *\n * \u26A0\uFE0F \u5FC5\u987B\u8D70 applyPanelSizeOnOpen() \u6765\u6E05\uFF0C\u800C\u4E0D\u662F\u624B\u5199\u4E24\u884C `style.width = ''`\uFF1A\n * \u9AD8\u5EA6\u4E0A\u9650\u662F\u5199\u5728 `style.maxHeight` \u4E0A\u7684\uFF0C\u53EA\u6E05 width/height \u4F1A\u628A\u5B83\u7559\u4E0B \u2014\u2014\n * \u7528\u6237\u5148\u524D\u628A\u7A97\u53E3**\u62C9\u5C0F**\u8FC7\u7684\u8BDD\uFF0C\u53CC\u51FB\u4E4B\u540E\u9AD8\u5EA6\u4ECD\u88AB\u65E7\u4E0A\u9650\u5361\u7740\uFF0C\u770B\u7740\u5C31\u4E0D\u50CF\"\u6062\u590D\u9ED8\u8BA4\"\u3002\n */\n function resetPanelSize() {\n panelSize = null\n // \u26A0\uFE0F \u5148\u6390\u6389\u8FD8\u6CA1\u843D\u76D8\u7684\u90A3\u6B21\u4FDD\u5B58\u3002\n // savePanelSize \u662F\u9632\u6296\u7684\uFF0C\u800C\u4E14**\u5728\u5B9A\u65F6\u5668\u89E6\u53D1\u65F6**\u624D\u53BB\u8BFB\u5F53\u524D\u5C3A\u5BF8 \u2014\u2014\n // \u521A\u62D6\u5B8C\u89D2\u6807\u9A6C\u4E0A\u53CC\u51FB\u8FD8\u539F\u65F6\uFF0C\u8FD9\u4E00\u6B21\u6765\u4E0D\u53CA\u53D6\u6D88\u7684\u4FDD\u5B58\u4F1A\u5728 300ms \u540E\u8BFB\u5230\n // \"\u5DF2\u7ECF\u8FD8\u539F\u597D\u7684\u9ED8\u8BA4\u5C3A\u5BF8\"\uFF0C\u53C8\u628A\u5B83\u5F53\u6210\"\u7528\u6237\u9009\u7684\u5C3A\u5BF8\"\u5199\u56DE\u53BB\uFF1A\n // \u8FD8\u539F\u88AB\u65E0\u58F0\u64A4\u9500\uFF0C\u5BBD\u5EA6\u8FD8\u88AB\u9489\u6B7B\u5728\u90A3\u4E00\u523B\uFF08\u8FDE\u5E26\u628A\u6309\u9636\u6BB5\u6536\u7A84\u90A3\u5957\u4E5F\u5E9F\u6389\uFF09\u3002\n if (panelSizeTimer) {\n clearTimeout(panelSizeTimer)\n panelSizeTimer = 0\n }\n applyPanelSizeOnOpen() // \u5BBD\u5EA6 / \u9AD8\u5EA6 / \u9AD8\u5EA6\u4E0A\u9650 \u4E00\u6B21\u5168\u8FD8\u539F\n fetch(PANEL_SIZE, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ clear: true }),\n }).catch(function () {})\n // \u5BBD\u5EA6/\u9AD8\u5EA6\u90FD\u53D8\u4E86 \u2192 \u4F4D\u7F6E\u5F97\u91CD\u5939\uFF0C\u5426\u5219\u8D34\u7740\u5C4F\u5E55\u8FB9\u7F18\u65F6\u4F1A\u88AB\u9876\u51FA\u53BB\n clampPanelPosition()\n env.autoGrowAskBox()\n }\n\n /**\n * \u62D6\u624B\u67C4\u6539\u5927\u5C0F\u3002\n *\n * edge \u51B3\u5B9A\u8FD9\u6B21\u52A8\u54EA\u51E0\u4E2A\u65B9\u5411\uFF1A'se' \u89D2\u6807\u4E24\u4E2A\u65B9\u5411\u90FD\u80FD\u52A8\uFF0C'e' \u53EA\u52A8\u5BBD\uFF0C's' \u53EA\u52A8\u9AD8\u3002\n * \u7528 pointer \u4E8B\u4EF6\uFF08\u4E0D\u662F mouse\uFF09\uFF1A\u89E6\u63A7\u677F/\u89E6\u5C4F\u4E00\u6837\u80FD\u62D6\uFF0C\u800C\u4E14\u80FD setPointerCapture\uFF0C\n * \u9F20\u6807\u5212\u51FA\u7A97\u53E3\u4E5F\u4E0D\u4F1A\u4E22\u6389\u8FD9\u4E00\u8F6E\uFF08mouse \u7248\u672C\u4F1A\u5361\u5728\u4E2D\u9014\uFF09\u3002\n */\n function bindResizeGrip(node, edge) {\n listen(node, 'pointerdown', function (event) {\n if (event.button !== undefined && event.button !== 0) return\n event.preventDefault()\n event.stopPropagation()\n var startSize = currentPanelSize()\n var startX = event.clientX\n var startY = event.clientY\n panelInteracting = true\n var layer = env.panel.parentNode\n if (layer) layer.setAttribute('data-resizing', '1')\n try { node.setPointerCapture(event.pointerId) } catch (error) { /* \u8001\u6D4F\u89C8\u5668\u6CA1\u6709\u5C31\u7B97\u4E86 */ }\n var changed = 0\n var move = function (moveEvent) {\n var next = { w: startSize.w, h: startSize.h }\n if (edge.indexOf('e') >= 0) next.w = startSize.w + (moveEvent.clientX - startX)\n if (edge.indexOf('s') >= 0) next.h = startSize.h + (moveEvent.clientY - startY)\n var clamped = clampPanelSize(next)\n changed = Math.abs(clamped.w - startSize.w) + Math.abs(clamped.h - startSize.h)\n env.panel.style.width = Math.round(clamped.w) + 'px'\n env.panel.style.height = Math.round(clamped.h) + 'px'\n // \u26A0\uFE0F **\u5FC5\u987B\u540C\u6B65\u62AC\u9AD8 max-height**\u3002\n // \u5F00\u7A97\u65F6 applyPanelSizeOnOpen() \u4F1A\u628A\"\u4E0A\u6B21\u8BB0\u4F4F\u7684\u9AD8\u5EA6\"\u5199\u6210 max-height \u5F53\u5929\u82B1\u677F\uFF1B\n // \u62D6\u62FD\u5982\u679C\u53EA\u5199 height\uFF0C\u5199\u5927\u7684\u90E8\u5206\u4F1A\u88AB\u90A3\u6761\u65E7\u5929\u82B1\u677F\u76F4\u63A5\u622A\u6389 \u2014\u2014\n // \u7528\u6237\u5B9E\u6D4B\u5C31\u662F\"\u62D6\u62FD\u7684\u4E0A\u9650\u4E0D\u662F\u89C6\u53E3\u9AD8\u5EA6\u51CF 8\uFF0C\u800C\u662F\u4E0A\u6B21\u5173\u95ED\u5C0F\u7A97\u4E4B\u524D\u7684\u9AD8\u5EA6\"\u3002\n // \uFF08\u53CD\u8FC7\u6765\u62D6\u5C0F\u6CA1\u95EE\u9898\uFF1Aheight \u5C0F\u4E8E\u65E7\u5929\u82B1\u677F\uFF0C\u770B\u4E0D\u51FA\u6765\u3002\uFF09\n env.panel.style.maxHeight = Math.round(clamped.h) + 'px'\n panelSize = clamped\n env.panel.setAttribute('data-resized', '1')\n if (env.historyList.style.display === 'flex') env.placeHistoryList()\n }\n var up = function () {\n window.removeEventListener('pointermove', move, true)\n window.removeEventListener('pointerup', up, true)\n panelInteracting = false\n if (layer) layer.removeAttribute('data-resizing')\n // \u5C3A\u5BF8\u5B9A\u4E0B\u6765\u540E\uFF0C\u6B63\u6587/\u8F93\u5165\u6846\u8981\u6309\u65B0\u9AD8\u5EA6\u91CD\u65B0\u5206\u914D\uFF08composer \u81EA\u52A8\u6491\u9AD8\u90A3\u5957\uFF09\n env.autoGrowAskBox()\n // \u5C3A\u5BF8\u53D8\u4E86 \u2192 \u4F4D\u7F6E\u91CD\u5939\uFF0C\u522B\u8BA9\u9762\u677F\u88AB\u9876\u51FA\u5C4F\u5E55\n if (changed >= 2) {\n clampPanelPosition()\n savePanelSize()\n }\n }\n window.addEventListener('pointermove', move, true)\n window.addEventListener('pointerup', up, true)\n })\n // \u53CC\u51FB\u89D2\u6807 = \u6062\u590D\u9ED8\u8BA4\u5927\u5C0F\n if (edge === 'se') {\n listen(node, 'dblclick', function (event) {\n event.preventDefault()\n event.stopPropagation()\n resetPanelSize()\n })\n }\n }\n\n function showPanel(anchor) {\n env.panelOpen = true\n // \u952E\u76D8\u7528\u6237\u5F00\u7A97\u5373\u53EF\u6253\u5B57\uFF1A\u8FD9\u4E00\u8F6E\u7684\u8F93\u5165\u6846\u4E00\u65E6\u53EF\u89C1\u5C31\u805A\u7126\u4E00\u6B21\uFF08\u89C1 focusComposerOnce\uFF09\n env.askFocusPending = true\n // \u5C0F\u7A97\u4E00\u5F00\uFF0C\u6D6E\u6807\u5C31\u6362\u6210\u300C\u275D \u5F15\u7528\u300D\u90A3\u4E00\u5957\uFF08\u89E3\u8BFB\u6D6E\u6807\u6536\u6389\uFF0C\u5F15\u7528\u6D6E\u6807\u7B49\u65B0\u9009\u533A\uFF09\n env.hideButton()\n env.hideQuoteButton()\n env.state.quoteSelection = null\n env.panel.style.display = 'flex'\n env.panel.style.left = '0px'\n env.panel.style.top = '0px'\n // \u6BCF\u6B21\u90FD\u6309\u9009\u533A\u91CD\u65B0\u951A\u5B9A \u2014\u2014 **\u4E0D\u8981**\u5728\u8FD9\u91CC\u63D2\"\u7528\u4E0A\u6B21\u7684\u4F4D\u7F6E\"\u7684\u5206\u652F\uFF1A\n // \u4F4D\u7F6E\u4E00\u65E6\u88AB\u8BB0\u4F4F\uFF0C\u5F00\u7A97\u5C31\u4E0D\u518D\u8DDF\u7740\u5212\u8BCD\u7684\u5730\u65B9\u8D70\uFF0C\u8FD9\u5957\u951A\u5B9A\u903B\u8F91\u7B49\u4E8E\u88AB\u67B6\u7A7A\u3002\n // \u5C3A\u5BF8\u662F\u53E6\u4E00\u56DE\u4E8B\uFF1A\u5BBD\u5EA6\u6CBF\u7528\u7528\u6237\u8C03\u8FC7\u7684\uFF0C\u9AD8\u5EA6**\u6BCF\u6B21\u5F00\u7A97\u90FD\u56DE\u5230\u81EA\u9002\u5E94**\uFF08\u53EA\u4FDD\u7559\u5929\u82B1\u677F\uFF09\uFF0C\n // \u5426\u5219\u65B0\u4F1A\u8BDD\u5185\u5BB9\u77ED\u3001\u9762\u677F\u5374\u786C\u6491\u6210\u4E0A\u6B21\u90A3\u4E48\u9AD8\uFF0C\u4E0B\u9762\u7559\u4E00\u5927\u7247\u7A7A\u767D\u3002\n applyPanelSizeOnOpen()\n // \u9762\u677F\u521A\u663E\u793A\u51FA\u6765\u624D\u91CF\u5F97\u5230 scrollHeight\uFF1A\u8349\u7A3F\u91CC\u539F\u6765\u7684\u51E0\u884C\u8981\u7ACB\u523B\u6491\u5F00\n env.autoGrowAskBox()\n var width = env.panel.offsetWidth\n var height = env.panel.offsetHeight\n var left = anchor ? anchor.left : window.innerWidth / 2 - width / 2\n var top = anchor ? anchor.bottom + 10 : 80\n if (left + width > window.innerWidth - 10) left = window.innerWidth - width - 10\n if (top + height > window.innerHeight - 10) {\n top = anchor ? anchor.top - height - 10 : Math.max(10, window.innerHeight - height - 10)\n }\n env.panel.style.left = Math.round(Math.max(10, left)) + 'px'\n env.panel.style.top = Math.round(Math.max(10, top)) + 'px'\n env.paintPill()\n // \u8DDF\u968F\u6001\u4E0B\u8F93\u5165\u6846\u90A3\u679A\u80F6\u56CA\u62A5\u7684\u662F\"\u672C\u4F1A\u8BDD\u5728\u7528\u7684\u6A21\u578B\"\uFF1A\u5F00\u7A97\u5148\u5BF9\u9F50\u4E00\u6B21\uFF0C\n // \u4E4B\u540E\u4EA4\u7ED9 2 \u79D2\u7684\u8F6E\u8BE2\uFF08\u4E3B\u4F1A\u8BDD\u91CC\u6362\u4E86\u6A21\u578B\uFF0C\u8FD9\u91CC\u81EA\u5DF1\u5C31\u8DDF\u7740\u53D8\uFF0C\u4E0D\u7528\u7B49\u5F00\u4E00\u6B21\u8BBE\u7F6E\u9875\uFF09\u3002\n env.refreshFollowRoute()\n env.syncRouteWatch()\n // \u80F6\u56CA\u4E0A\u7684\u6A21\u578B\u540D\u8981\u6309 provider + model \u4ECE\u6E05\u5355\u91CC\u6362\uFF08\u5426\u5219\u663E\u793A\u88F8 id\uFF09\uFF0C\u987A\u624B\u62C9\u4E00\u6B21\u6E05\u5355\n env.warmModelCatalog()\n }\n\n /**\n * \u8BA9\u5C0F\u7A97\"\u4ECE\u5361\u7247\u90A3\u4E00\u683C\u957F\u51FA\u6765\"\uFF08260ms\uFF0C\u53EA\u52A8 transform\uFF09\u3002\n *\n * \u8D77\u624B\u628A\u9762\u677F\u7528 transform \u538B\u5230\u5361\u7247\u77E9\u5F62\u4E0A\uFF08`translate(dx,dy) scale(sx,sy)`\uFF0C\u539F\u70B9\u53D6\u5DE6\u4E0A\u89D2\uFF09\uFF0C\n * \u518D\u56DE\u5230 `transform:none` \u2014\u2014 \u4E8E\u662F\"\u5361\u7247 \u2192 \u5C0F\u7A97\"\u662F\u4E00\u6BB5\u8FDE\u7EED\u7684\u91CF\u53D8\uFF0C\u800C\u4E0D\u662F\u4E24\u6B21 display \u5207\u6362\u3002\n *\n * \u51E0\u4E2A\u5FC5\u987B\u8FD9\u4E48\u5199\u7684\u70B9\uFF1A\n * \u00B7 \u91CF `to` \u4E4B\u524D\u5148**\u6E05\u6389\u6B8B\u7559\u7684 transform**\uFF1A\u5426\u5219\u91CF\u5230\u7684\u662F\u4E0A\u4E00\u6B21\u52A8\u753B\u7684\u534A\u622A\u51E0\u4F55\uFF1B\n * \u00B7 \u5148 `transition:none` \u6446\u597D\u8D77\u70B9\u3001\u5F3A\u5236\u91CD\u6392\uFF0C\u518D\u5F00\u8FC7\u6E21 \u2014\u2014 \u5426\u5219\u6D4F\u89C8\u5668\u4F1A\u628A\"\u8BBE\u8D77\u70B9\"\u548C\n * \"\u8BBE\u7EC8\u70B9\"\u5408\u5E76\u6210\u4E00\u6B21\u6837\u5F0F\u53D8\u66F4\uFF0C\u52A8\u753B\u6839\u672C\u4E0D\u64AD\uFF08\u63D2\u4EF6\u5728 openVCard \u91CC\u8E29\u8FC7\u540C\u4E00\u4E2A\u5751\uFF09\uFF1B\n * \u00B7 \u6536\u5C3E\u5FC5\u987B\u628A\u5185\u8054\u7684 `transform/transition/transformOrigin` \u6E05\u5E72\u51C0 \u2014\u2014 \u9762\u677F\u4E4B\u540E\u8FD8\u8981\u88AB\n * \u62D6\u62FD\u6539\u5927\u5C0F\u3001\u8FD8\u8981\u5F00\u8BBE\u7F6E\u62BD\u5C49\uFF08\u62BD\u5C49\u662F inset:0 \u8D34\u5728\u9762\u677F\u4E0A\u7684\uFF09\uFF0C\u7559\u7740 transform \u4F1A\u8FDE\u7D2F\u5B83\u4EEC\uFF1B\n * \u00B7 \u7CFB\u7EDF\u8981\u6C42\u51CF\u5C11\u52A8\u6548\u65F6**\u4E0D\u505A**\uFF08\u4E0E playCrtOff \u540C\u4E00\u6761\u89C4\u77E9\uFF09\u3002\n */\n function growPanelFromCard(from) {\n if (!from || !env.panel || !from.width || !from.height) return\n if (env.prefersReducedMotion()) return\n env.panel.style.transition = 'none'\n env.panel.style.transform = ''\n env.panel.style.transformOrigin = ''\n var to = env.panel.getBoundingClientRect()\n if (!to.width || !to.height) return\n var sx = from.width / to.width\n var sy = from.height / to.height\n var dx = from.left - to.left\n var dy = from.top - to.top\n // \u5361\u7247\u6B63\u597D\u5728\u9762\u677F\u4F4D\u7F6E\u4E0A\uFF08\u5DEE\u4E0D\u5230 1px\uFF09\u5C31\u6CA1\u5FC5\u8981\u505A \u2014\u2014 \u90A3\u662F\"\u6CA1\u52A8\"\uFF0C\u522B\u767D\u64AD\u4E00\u6BB5\n if (Math.abs(dx) < 1 && Math.abs(dy) < 1 && Math.abs(1 - sx) < 0.02 && Math.abs(1 - sy) < 0.02) return\n env.panel.style.transformOrigin = '0 0'\n env.panel.style.transform = 'translate(' + dx.toFixed(1) + 'px,' + dy.toFixed(1) + 'px) scale(' + sx.toFixed(4) + ',' + sy.toFixed(4) + ')'\n void env.panel.offsetWidth\n env.panel.style.transition = 'transform ' + PANEL_GROW_MS + 'ms ' + PANEL_GROW_EASE\n env.panel.style.transform = 'none'\n if (env.panelGrowTimer) {\n clearTimeout(env.panelGrowTimer)\n env.panelGrowTimer = null\n }\n var settle = function () {\n if (env.panelGrowTimer) {\n clearTimeout(env.panelGrowTimer)\n env.panelGrowTimer = null\n }\n if (env.panelGrowHandler) {\n env.panel.removeEventListener('transitionend', env.panelGrowHandler)\n env.panelGrowHandler = null\n }\n env.panel.style.transition = ''\n env.panel.style.transform = ''\n env.panel.style.transformOrigin = ''\n }\n env.panelGrowHandler = function (event) {\n if (event.target === env.panel && event.propertyName === 'transform') settle()\n }\n env.panel.addEventListener('transitionend', env.panelGrowHandler)\n // transitionend \u662F\u4E3B\u8DEF\u5F84\uFF1B\u6807\u7B7E\u9875\u5728\u540E\u53F0\u65F6\u52A8\u753B\u4E0D\u8DD1\u3001\u4E8B\u4EF6\u4E5F\u5C31\u4E0D\u4F1A\u6765\uFF0C\u6240\u4EE5\u53E6\u6302\u515C\u5E95\n env.panelGrowTimer = env.later(settle, PANEL_GROW_MS + 140)\n }\n\n function closePanel() {\n env.closeModelMenu()\n // \u5C0F\u7A97\u5173\u6389\u65F6\u8BBE\u7F6E\u62BD\u5C49\u4E5F\u4E00\u8D77\u6536\uFF1A\u5426\u5219\u4E0B\u6B21\u5F00\u7A97\u4F1A\u76F4\u63A5\u505C\u5728\u8BBE\u7F6E\u9875\u4E0A\n // \uFF08\u7528\u6237\u4E0A\u6B21\u662F\u5728\u5173\u7A97\u524D\u6539\u7684\u8BBE\u7F6E\uFF0C\u56DE\u6765\u60F3\u770B\u7684\u662F\u89E3\u8BFB\uFF0C\u4E0D\u662F\u8BBE\u7F6E\uFF09\u3002\n // closeSettings \u987A\u624B\u628A\u8FD8\u6CA1\u843D\u76D8\u7684\u6539\u52A8\u8865\u53D1\u6389\uFF0C\u4E0D\u4F1A\"\u5173\u6389\u5C31\u8D70\"\u4E22\u6539\u52A8\u3002\n env.closeSettings()\n env.panelOpen = false\n env.panel.style.display = 'none'\n // \u4EA4\u63A5\u52A8\u753B\u8FD8\u6CA1\u8DD1\u5B8C\u5C31\u88AB\u5173\u6389\uFF1A\u8FDE\u540C\u5B83\u7684\u5B9A\u65F6\u5668\u4E00\u8D77\u6536\u5E72\u51C0\uFF0C\u522B\u628A\u534A\u622A transform \u7559\u5728\u9762\u677F\u4E0A\n // \uFF08\u4E0B\u6B21\u5F00\u7A97\u91CF\u51E0\u4F55\u4F1A\u91CF\u5230\u5B83\uFF0C\u62D6\u62FD\u6539\u5927\u5C0F\u4E5F\u4F1A\u88AB\u5B83\u5E26\u504F\uFF09\n if (env.panelGrowTimer) {\n clearTimeout(env.panelGrowTimer)\n env.panelGrowTimer = null\n }\n if (env.panelGrowHandler) {\n env.panel.removeEventListener('transitionend', env.panelGrowHandler)\n env.panelGrowHandler = null\n }\n env.panel.style.transition = ''\n env.panel.style.transform = ''\n env.panel.style.transformOrigin = ''\n env.vcardHandoff = null\n env.hideHistoryList()\n // \u5C0F\u7A97\u6536\u8D77\u6765\u4E86\uFF1A\u5F15\u7528\u6D6E\u6807\u8DDF\u7740\u8D70\uFF08\u5B83\u53EA\u5728\"\u5C0F\u7A97\u5F00\u7740\"\u65F6\u6709\u610F\u4E49\uFF09\n env.hideQuoteButton()\n env.state.quoteSelection = null\n // \u6B63\u5728\u5F55\u97F3/\u8BC6\u522B\u5C31\u5230\u6B64\u4E3A\u6B62\uFF1A\u9EA6**\u4E00\u5B9A\u8981\u677E\u5F00**\uFF08\u4E0D\u80FD\u8BA9\u6807\u7B7E\u9875\u4E00\u76F4\u663E\u793A\"\u6B63\u5728\u4F7F\u7528\u9EA6\u514B\u98CE\"\uFF09\uFF0C\n // \u8BC6\u522B\u51FA\u6765\u7684\u6587\u5B57\u4E5F\u6CA1\u5730\u65B9\u653E\u4E86 \u2014\u2014 \u8FDE\u540C\u63D0\u793A\u4E00\u8D77\u9759\u9ED8\u6536\u6389\u3002\n env.cancelVoice()\n // \u6536\u8D77\u5C0F\u7A97\u4E0D\u8BE5\u88AB\u8BB0\u6210\"\u5931\u8D25\"\uFF1A\u6253\u4E2A\u6807\u8BB0\uFF0C\u8BA9 fail() \u8D70\u300C\u5DF2\u505C\u6B62\u300D\u800C\u4E0D\u662F\u300C\u89E3\u8BFB\u5931\u8D25\u300D\n if (env.state.request) env.state.aborted = true\n if (env.state.request) env.state.request.abort()\n env.state.request = null\n env.paintPill()\n // \u5C0F\u7A97\u6536\u4E86\uFF1A\u62BD\u5C49\u82E5\u4E5F\u5173\u7740\u5C31\u628A\u8F6E\u8BE2\u505C\u6389\uFF08\u4E24\u5904\u90FD\u4E0D\u9700\u8981\u8FD9\u4E2A\u503C\u4E86\uFF09\n env.syncRouteWatch()\n }\n\n /**\n * \u72B6\u6001\u63D0\u793A\uFF1A**\u754C\u9762\u4E0A\u4E0D\u663E\u793A**\uFF08\u9875\u811A\u90A3\u6761\u548C\u540E\u6765\u7684\u6D6E\u5C42\u90FD\u53BB\u6389\u4E86\uFF09\u3002\n * \u4FDD\u7559\u51FD\u6570\u662F\u4E3A\u4E86\u8BED\u4E49\u4E0D\u4E22\u2014\u2014\u6700\u8FD1\u4E00\u6761\u8BB0\u8FDB state.lastStatus\uFF0C\u81EA\u68C0\u94A9\u5B50\u53EF\u8BFB\uFF0C17 \u5904\u8C03\u7528\u70B9\u4E5F\u4E0D\u7528\u6539\u3002\n */\n function setStatus(text) {\n env.state.lastStatus = String(text || '')\n }\n\n /**\n * \u9762\u677F\u7528\"\u5BBD\u7248\"\u8FD8\u662F\"\u7A84\u7248\"\uFF1A\u8BE6\u89E3\u5DF2\u51FA\u3001\u6216\u5DF2\u6709\u5BF9\u8BDD\uFF08\u542B\u6B63\u5728\u8FFD\u95EE\uFF09\u65F6\u5BBD\u7248\u3002\n *\n * \u5355\u72EC\u62BD\u51FA\u6765\u662F\u56E0\u4E3A\u8FFD\u95EE\u8DEF\u5F84\uFF08ask \u5F00\u59CB / finish\uFF09\u4E0D\u7ECF\u8FC7 paint()\uFF0C\n * \u4E0D\u5728\u8FD9\u91CC\u540C\u6B65\u7684\u8BDD\"\u7FFB\u8BD1\u51FA\u5B8C\u76F4\u63A5\u8FFD\u95EE\"\u4F1A\u4E00\u76F4\u5361\u5728\u7A84\u9762\u677F\u91CC\uFF0C\u6D88\u606F\u533A\u6324\u6210\u4E00\u5217\u3002\n */\n /**\n * \u300C\u5C55\u5F00\u8BE6\u89E3\u300D\u4EC0\u4E48\u65F6\u5019\u9732\u9762\uFF1A\u7FFB\u8BD1\u521A\u51FA\u5B8C\u3001\u8FD8\u6CA1\u8FFD\u95EE\u8FC7\u3001\u4E5F\u8FD8\u6CA1\u5C55\u5F00\u8FC7\u3002\n * \u4E00\u65E6\u53D1\u8FC7\u8FFD\u95EE\uFF08\u6709\u7528\u6237\u8F6E\u6B21\uFF09\u5C31\u6536\u8D77\u6765\u2014\u2014\u5DF2\u7ECF\u5728\u5BF9\u8BDD\u91CC\u4E86\uFF0C\u518D\u6446\u4E00\u4E2A\"\u5C55\u5F00\u8BE6\u89E3\"\u662F\u591A\u4F59\u7684\u3002\n */\n function syncExpandCta() {\n var hasDetail = !!(env.state.parts.detail || env.state.stage === 'detail')\n var translationReady = env.state.phase === 'done' && !!env.state.parts.translation\n var asked = false\n for (var i = 0; i < env.state.turns.length; i += 1) {\n if (env.state.turns[i].role === 'user') asked = true\n }\n // \u8BED\u97F3\u5361\u90A3\u6761\u8DEF\u6CA1\u6709\u89E3\u8BFB\u53EF\u5C55\u5F00\uFF0C\u522B\u6446\u4E00\u4E2A\u70B9\u4E86\u6CA1\u53CD\u5E94\u7684\u6309\u94AE\n env.expandButton.style.display = !hasDetail && translationReady && !asked && !env.state.voiceAsk ? '' : 'none'\n env.expandButton.disabled = false\n return asked\n }\n\n function syncPanelStage() {\n var hasDetail = !!(env.state.parts.detail || env.state.stage === 'detail')\n var wide = hasDetail || env.state.turns.length > 0 || env.state.asking\n env.panel.setAttribute('data-stage', wide ? 'detail' : 'translation')\n return wide\n }\n\n /**\n * \u9875\u811A\u8FDB\u5EA6\u6587\u6848\uFF1A**\u53EA\u6709\u9636\u6BB5\u548C\u79D2\u6570**\uFF0C\u4E0D\u542B\u4EFB\u4F55\u5DE5\u5177\u7EC6\u8282\u3002\n * \u68C0\u7D22\u9636\u6BB5\u8BF4\"\u6B63\u5728\u68C0\u7D22\u8D44\u6599\"\uFF0C\u5176\u4F59\u6309\u6D41\u5F0F\u9636\u6BB5\u8BF4\u8BDD\u2014\u2014\u51E0\u5341\u79D2\u7684\u68C0\u7D22\u603B\u5F97\u6709\u4E2A\u4EA4\u4EE3\uFF0C\n * \u4F46\"\u67E5\u4E86\u4EC0\u4E48\u3001\u547D\u4E2D\u591A\u5C11\u3001\u62FF\u4E86\u54EA\u4E9B\u94FE\u63A5\"\u5C5E\u4E8E\u6A21\u578B\u7684\u539F\u6599\uFF0C\u4E0D\u5F80\u5C0F\u7A97\u91CC\u53D1\u3002\n */\n function progressText() {\n var seconds = ((Date.now() - env.state.startedAt) / 1000).toFixed(1)\n var what = env.state.toolBusy ? '\u6B63\u5728\u68C0\u7D22\u8D44\u6599\u2026' : env.state.phase === 'loading' ? '\u6B63\u5728\u5206\u6790\u2026' : '\u751F\u6210\u4E2D\u2026'\n return what + ' ' + seconds + 's'\n }\n\n function paint() {\n var streaming = env.state.phase === 'loading' || env.state.phase === 'streaming'\n var stage = env.state.stage\n var selected = env.state.payload && env.state.payload.text ? env.state.payload.text : env.state.selection ? env.state.selection.text : ''\n var sections = splitSections(env.visibleRaw())\n // \u8BED\u97F3\u5361\u90A3\u6761\u8DEF\uFF08\u9009\u4E2D\u6587\u5B57 + \u8F93\u5165\u6CD5\u8BED\u97F3 \u2192 \u76F4\u63A5\u8FFD\u95EE\uFF09\uFF1A\u8FD9\u4E00\u8F6E**\u6CA1\u6709\u89E3\u8BFB**\uFF0C\n // \u6240\u4EE5\u7FFB\u8BD1\u8282\u6574\u8282\u4E0D\u753B \u2014\u2014 \u4E0D\u662F\"\u753B\u4E2A\u7A7A\u8282\u3001\u91CC\u9762\u5199\u8FD9\u6B21\u6CA1\u6709\u8FD4\u56DE\u5185\u5BB9\"\uFF08\u7528\u6237\u5426\u6389\u7684\u6B63\u662F\u5B83\uFF09\u3002\n env.translationSection.root.style.display = env.state.voiceAsk ? 'none' : ''\n\n // \u7FFB\u8BD1\u8282\uFF1A\u9996\u8F6E\u6D41\u5F0F\u671F\u95F4\u9010\u5B57\u6E32\u67D3\uFF1B\u5DF2\u6709\u7ED3\u679C\u5C31\u7528\u7ED3\u679C\uFF1B\u4E00\u4E2A\u5B57\u90FD\u8FD8\u6CA1\u6709\u65F6\u7ED9\u7B49\u5F85\u7279\u6548\n var live = stripEchoPrefix(stage === 'detail' ? '' : sections.translation || sections.other, selected)\n var liveDetail = (sections.detail || sections.other || '').trim()\n if (env.state.parts.translation) {\n renderRich(env.translationSection.content, stripEchoPrefix(env.state.parts.translation, selected), { callout: true, settled: true })\n } else if (stage !== 'detail' && live.trim()) {\n renderRich(env.translationSection.content, live, { callout: true, settled: env.state.phase === 'done' })\n } else if (stage !== 'detail' && streaming) {\n // \u9996\u8F6E\uFF1A\u8BF7\u6C42\u521A\u53D1\u51FA\u5230\u7B2C\u4E00\u4E2A\u5B57\u4E4B\u95F4\uFF08\u542B\u6A21\u578B\u601D\u8003\u671F\uFF0C\u53EF\u80FD\u597D\u51E0\u79D2\uFF09\u5FC5\u987B\u6709\u52A8\u9759\n env.showWaiting(env.translationSection.content, '\u6B63\u5728\u7FFB\u8BD1\u2026', {\n startedAt: env.state.startedAt,\n effort: env.state.effort,\n // \u521B\u5EFA\u65F6 start \u4E8B\u4EF6\u8FD8\u6CA1\u5230\uFF0Cstate.effort \u662F\u7A7A\u7684\uFF1B\u7528\u51FD\u6570\u5B9E\u65F6\u8BFB\uFF0C\u6863\u4F4D\u624D\u4E0D\u4F1A\u663E\u793A\u6210\u515C\u5E95\u503C\n effortOf: function () { return env.state.stageEffort || 'low' },\n thoughtOf: function () { return env.state.thought },\n noticeOf: function () { return env.state.notice },\n })\n } else if (env.state.phase === 'error') {\n env.translationSection.content.textContent = ''\n } else if (env.state.phase === 'done') {\n // \u6D41\u7ED3\u675F\u4E86\u5374\u4E00\u4E2A\u5B57\u90FD\u6CA1\u6709\uFF1A\u522B\u7559\u7A7A\u767D\uFF0C\u660E\u786E\u8BF4\u4E00\u58F0\uFF08\u5426\u5219\u770B\u8D77\u6765\u548C\"\u8FD8\u5728\u52A0\u8F7D\"\u4E00\u6837\uFF09\n env.translationSection.content.textContent = '\uFF08\u8FD9\u6B21\u6CA1\u6709\u8FD4\u56DE\u5185\u5BB9\uFF09'\n env.translationSection.content.appendChild(env.retryButton)\n env.retryButton.style.display = ''\n }\n\n // \u5DF2\u505C\u6B62\uFF08\u6536\u8D77\u5C0F\u7A97 / \u6309\u4E86\u505C\u6B62\uFF09\uFF1A**\u4E0D\u7BA1\u6709\u6CA1\u6709\u534A\u622A\u5185\u5BB9**\u90FD\u8981\u4EA4\u4EE3\u6E05\u695A\uFF0C\u5E76\u628A\u300C\u91CD\u65B0\u751F\u6210\u300D\u653E\u5230\u4E0B\u9762\n if (env.state.phase === 'paused') {\n env.translationSection.content.appendChild(\n el('div', 'dsh-sel-note', '\uFF08\u5DF2\u505C\u6B62\uFF1A\u8FD9\u4E00\u8F6E\u88AB\u4E2D\u65AD\u4E86\uFF0C\u4E0A\u9762\u662F\u5DF2\u7ECF\u751F\u6210\u7684\u90E8\u5206\uFF09'),\n )\n env.translationSection.content.appendChild(env.retryButton)\n env.retryButton.style.display = ''\n }\n\n // \u8BE6\u89E3\u8282\uFF1A\u53EA\u5728\u7B2C\u4E8C\u9636\u6BB5\u51FA\u73B0\uFF08\u6216\u5DF2\u7F13\u5B58\u8FC7\uFF09\n var wantDetail = !!(env.state.parts.detail || stage === 'detail')\n env.detailSection.root.style.display = wantDetail ? '' : 'none'\n if (env.state.parts.detail) {\n renderRich(env.detailSection.content, env.state.parts.detail, { callout: true, settled: true })\n } else if (stage === 'detail' && liveDetail) {\n renderRich(env.detailSection.content, liveDetail, { callout: true, settled: env.state.phase === 'done' })\n } else if (wantDetail && streaming) {\n env.showWaiting(env.detailSection.content, '\u6B63\u5728\u8BFB\u5B8C\u6574\u4F1A\u8BDD\u80CC\u666F\u2026', {\n startedAt: env.state.startedAt,\n effort: env.state.effort,\n effortOf: function () { return env.state.stageEffort || 'high' },\n thoughtOf: function () { return env.state.thought },\n noticeOf: function () { return env.state.notice },\n })\n }\n\n // \u2014\u2014 \u6309\u9636\u6BB5\u91CD\u6392 \u2014\u2014\n // \u53EA\u6709\u7FFB\u8BD1\u65F6\uFF1A\u4E0D\u663E\u793A\u5C0F\u8282\u5E8F\u53F7\uFF08\u8F7B\u91CF\u5361\u7247\u5F62\u6001\uFF09\u3002\u5BBD\u5EA6**\u4E0D\u968F\u9636\u6BB5\u53D8**\uFF08\u6052 540\uFF09\u2014\u2014\n // \u4EE5\u524D\u8FD9\u91CC\u8FD8\u987A\u624B\u6536\u7A84\u5230 440\uFF0C\u8FFD\u95EE\u4E00\u4E0B\u53C8\u8DF3\u56DE 540\uFF0C\u7528\u6237\u770B\u7740\u50CF\u7A97\u53E3\u81EA\u5DF1\u6296\u4E86\u4E00\u4E0B\u3002\n var hasDetail = !!(env.state.parts.detail || stage === 'detail')\n // \u8FFD\u95EE\u8F93\u5165\u6846\uFF1A**\u7FFB\u8BD1\u4E00\u51FA\u6765\u5C31\u80FD\u95EE\uFF0C\u4E0D\u5FC5\u5148\u5C55\u5F00\u8BE6\u89E3**\n var translationReady = env.state.phase === 'done' && !!env.state.parts.translation\n var wide = syncPanelStage()\n // \u914D\u8272\u6309**\u9762\u677F\u5B9E\u9645\u5E95\u8272**\u9009\uFF08\u4E0D\u770B\u7CFB\u7EDF\u504F\u597D\uFF09\uFF1A\u4E3B\u9898\u5B9E\u73B0\u65B9\u5F0F\u600E\u4E48\u53D8\u90FD\u4E0D\u5F71\u54CD\n var surfaceTheme = env.currentSurfaceTheme()\n env.layer.setAttribute('data-theme', surfaceTheme)\n env.panel.setAttribute('data-theme', surfaceTheme)\n env.askRow.style.display = wide || translationReady || env.state.voiceAsk || env.state.quotes.length > 0 ? '' : 'none'\n // \u5C55\u5F00 CTA\uFF1A\u7FFB\u8BD1\u8FD8\u5728\u8DD1\uFF08\u542B\u601D\u8003\u671F\uFF09\u65F6\u5148\u4E0D\u51FA\u73B0\u2014\u2014\u90A3\u65F6\u5019\u8BE5\u770B\u7684\u662F\u7B49\u5F85\u7279\u6548\uFF0C\n // \u6446\u5728\u4E0B\u9762\u53EA\u4F1A\u662F\u4E2A\u7070\u7740\u7684\u6309\u94AE\uFF0C\u53CD\u800C\u50CF\"\u6CA1\u53CD\u5E94\"\uFF1B\u53D1\u8FC7\u8FFD\u95EE\u4E4B\u540E\u4E5F\u6536\u8D77\uFF08\u89C1 syncExpandCta\uFF09\u3002\n syncExpandCta()\n env.closeButton.title = '\u5173\u95ED\uFF08Esc\uFF09'\n // \u300C\u91CD\u65B0\u751F\u6210\u300D\u662F\u5185\u5BB9\u533A\u91CC\u7684\u4E34\u65F6\u6309\u94AE\uFF1A\u6B63\u5E38\u8DEF\u5F84\u4E0A\u5148\u6536\u56DE\uFF0C\u907F\u514D\u88AB\u4E0A\u4E00\u6B21\u8FFD\u52A0\u540E\u7559\u5728\u6B63\u6587\u91CC\n if (env.state.phase !== 'error' && env.state.phase !== 'paused' && env.retryButton.parentNode) {\n env.retryButton.parentNode.removeChild(env.retryButton)\n }\n if (env.state.phase === 'loading' || env.state.phase === 'streaming') {\n setStatus(progressText())\n env.retryButton.style.display = 'none'\n } else if (env.state.phase === 'paused') {\n setStatus('\u5DF2\u505C\u6B62\uFF08\u6536\u8D77\u5C0F\u7A97\u65F6\u4E2D\u6B62\uFF09')\n env.retryButton.style.display = ''\n } else if (env.state.phase === 'error') {\n setStatus('')\n env.translationSection.content.textContent = ''\n env.detailSection.content.textContent = ''\n var err = el('div', 'dsh-sel-err', '\u89E3\u8BFB\u5931\u8D25\uFF1A' + env.state.error)\n env.translationSection.content.appendChild(err)\n env.translationSection.content.appendChild(env.retryButton)\n env.detailSection.root.style.display = 'none'\n env.retryButton.style.display = ''\n } else if (env.state.phase === 'done') {\n setStatus(\n '\u5B8C\u6210 \u00B7 \u8017\u65F6 ' +\n formatDuration(env.state.elapsed) +\n ' \u00B7 ' +\n env.state.chars +\n ' \u5B57' +\n (env.state.fromHistory\n ? ' \u00B7 \u5386\u53F2\u56DE\u653E\uFF08\u4E0A\u6B21\u7684\u5BF9\u8BDD\uFF09'\n : env.state.fromCache\n ? ' \u00B7 \u672C\u5730\u7F13\u5B58\uFF08\u672A\u91CD\u65B0\u8BF7\u6C42\uFF09'\n : env.state.sharedCache\n ? ' \u00B7 \u7ED3\u679C\u7F13\u5B58\uFF08host \u56DE\u653E\uFF09'\n : env.state.sameTextHint\n ? ' \u00B7 \u540C\u8BCD\u4F46\u4E0A\u4E0B\u6587\u4E0D\u540C\uFF0C\u91CD\u65B0\u751F\u6210'\n : ''),\n )\n env.retryButton.style.display = ''\n }\n env.renderTurns()\n // \u9996\u8F6E\u89E3\u8BFB\u8FD8\u5728\u6D41\u5F0F\u65F6\u4E0D\u8BA9\u8FFD\u95EE\uFF08\u5386\u53F2\u91CC\u8FD8\u6CA1\u6709\u5B8C\u6574\u7ED3\u8BBA\uFF09\n env.refreshAskState()\n env.paintPill()\n keepInsideViewport()\n focusComposerOnce()\n }\n\n /**\n * \u5F00\u7A97\u540E**\u53EA\u805A\u7126\u4E00\u6B21**\u8F93\u5165\u6846\uFF08\u952E\u76D8\u7528\u6237\u4E0D\u7528\u5148 Tab \u4E24\u4E0B\uFF09\u3002\n *\n * \u4E09\u4E2A\u514B\u5236\u7684\u5730\u65B9\uFF1A\n * \u00B7 \u7B49\u8F93\u5165\u6846\u771F\u7684\u53EF\u89C1\u624D\u805A\u7126\uFF08\u9996\u8F6E\u7FFB\u8BD1\u8FD8\u5728\u8DD1\u65F6\u5B83\u662F\u85CF\u7740\u7684\uFF0C\u805A\u7126\u85CF\u7740\u7684\u5143\u7D20\u6CA1\u610F\u4E49\uFF09\uFF1B\n * \u00B7 \u7528\u6237\u5DF2\u7ECF\u5728\u522B\u5904\u6253\u5B57\uFF08\u4E3B\u4F1A\u8BDD\u8F93\u5165\u6846\u3001\u4FA7\u8FB9\u680F\u2026\uFF09\u5C31**\u4E0D\u62A2**\u7126\u70B9\uFF0C\u5E76\u5C31\u6B64\u4F5C\u7F62\uFF1B\n * \u00B7 preventScroll\uFF1A\u522B\u56E0\u4E3A\u805A\u7126\u628A\u9875\u9762\u6EDA\u4E00\u4E0B\uFF08\u5212\u5B8C\u8BCD\u9875\u9762\u8DF3\u8D70\u6700\u96BE\u53D7\uFF09\u3002\n */\n function focusComposerOnce() {\n env.focusBail = 'pending=' + String(env.askFocusPending) + ' panel=' + String(env.panelOpen)\n if (!env.askFocusPending || !env.panelOpen) return\n env.focusBail = 'composerVisible=' + String(composerVisible()) + ' panelSel=' + String(hasPanelSelection())\n if (!composerVisible()) return\n // \u5C0F\u7A97\u91CC\u6B63\u6709\u4E00\u6BB5\u9009\u4E2D\u6587\u5B57\uFF08\u7528\u6237\u6B63\u5728\u5212\u8BCD\u3001\u51C6\u5907\u70B9\u300C\u275D \u5F15\u7528\u300D\uFF09\uFF1A**\u8FD9\u4E00\u4E0B\u805A\u7126\u4F1A\u628A\u9009\u533A\u6E05\u6389**\u3002\n // \u8BA9\u4F4D\u7ED9\u7528\u6237\uFF0C\u5E76\u4E14\u4E0D\u518D\u8865\u7126 \u2014\u2014 \u5F15\u7528\u6D6E\u6807\u662F\u8FD9\u4E2A\u529F\u80FD\u7684\u4E3B\u5165\u53E3\uFF0C\u4E0D\u80FD\u56E0\u4E3A\u62A2\u7126\u70B9\u800C\u8BA9\u5B83\u6D88\u5931\u3002\n //\uFF08\u5B9E\u6D4B\uFF1A\u5F00\u7A97\u540E\u90A3\u4E00\u5E27\u6070\u597D\u843D\u5728\"\u9996\u8F6E\u521A\u51FA\u5B8C\"\u7684\u81EA\u52A8\u805A\u7126\u4E0A\uFF0C\u5212\u597D\u7684\u8BCD\u4F1A\u77AC\u95F4\u6CA1\u4E86\u3002\uFF09\n if (hasPanelSelection()) {\n env.focusBail = '\u8BA9\u4F4D\u7ED9\u5C0F\u7A97\u91CC\u7684\u9009\u533A'\n env.askFocusPending = false\n return\n }\n var active = document.activeElement\n var inside = active && (active === env.panel || active === env.askBox || (env.panel.contains && env.panel.contains(active)))\n env.focusBail = 'active=' + String((active && active.className) || active) + ' typing=' + String(isTypingTarget(active))\n // \u53EA\u6709\"\u4EBA\u5BB6\u6B63\u5728\u522B\u5904\u6253\u5B57\"\u624D\u503C\u5F97\u8BA9\u8DEF\u3002\n // \u6CE8\u610F\u522B\u628A\u666E\u901A\u7684\u6309\u94AE\u7126\u70B9\u4E5F\u7B97\u8FDB\u53BB\uFF1A\u70B9\u6D6E\u6807\u65F6\u7126\u70B9\u6B63\u597D\u843D\u5728\u6D6E\u6807\u90A3\u4E2A <button> \u4E0A\n //\uFF08Chrome \u70B9\u6309\u94AE\u4F1A\u7ED9\u5B83\u7126\u70B9\uFF09\uFF0C\u7167\"\u975E body \u5C31\u4E0D\u62A2\"\u7684\u8001\u5199\u6CD5\u4F1A\u628A\u6211\u4EEC\u81EA\u5DF1\u6321\u5728\u95E8\u5916 \u2014\u2014\n // \u8FD9\u6B63\u662F\"\u5F00\u7A97\u540E\u6CA1\u6709\u81EA\u52A8\u805A\u7126\"\u7684\u539F\u56E0\u3002\n if (!inside && isTypingTarget(active)) {\n env.focusBail = '\u8BA9\u4F4D\u7ED9\u522B\u5904\u6B63\u5728\u6253\u5B57\uFF08' + String((active && active.tagName) || active) + '.' + String((active && active.className) || '')\n + ' \u94FE=' + (function(){ var n=/** @type {HTMLElement | null} */ (active), out=[]; while(n && out.length<5){ out.push(String(n.className||n.tagName)+':'+String((n.style&&n.style.display)||'')); n=n.parentElement } return out.join('>') })() + '\uFF09'\n env.askFocusPending = false // \u4EBA\u5BB6\u771F\u7684\u5728\u522B\u5904\u6253\u5B57\uFF0C\u8FD9\u6B21\u5F00\u7A97\u5C31\u4E0D\u518D\u62A2\n return\n }\n env.askFocusPending = false\n env.focusBail = 'ok'\n focusAskBox()\n }\n\n /** \u5C0F\u7A97\u6B63\u6587\u91CC\u8FD9\u4F1A\u513F\u6709\u6CA1\u6709\u4E00\u6BB5\u6D3B\u9009\u533A\uFF08\u5212\u8BCD\u4E2D/\u9009\u597D\u4E86\u8FD8\u6CA1\u70B9\u5F15\u7528\uFF09\u3002 */\n function hasPanelSelection() {\n try {\n var selection = window.getSelection && window.getSelection()\n if (!selection || selection.rangeCount === 0 || selection.isCollapsed) return false\n var range = selection.getRangeAt(0)\n return env.insidePanelContent(range.startContainer) || env.insidePanelContent(range.endContainer)\n } catch (error) {\n return false\n }\n }\n\n /** \u6B63\u5728\u6253\u5B57\u7684\u5730\u65B9\uFF08input / textarea / \u53EF\u7F16\u8F91\u533A\uFF09\u2014\u2014 \u53EA\u6709\u8FD9\u79CD\u7126\u70B9\u503C\u5F97\u8BA9\u8DEF\u3002 */\n function isTypingTarget(node) {\n if (!node || node === env.askBox) return false\n var tag = String(node.tagName || '').toLowerCase()\n var editable = tag === 'input' || tag === 'textarea' || tag === 'select' || node.isContentEditable === true\n if (!editable) return false\n // \u5DF2\u7ECF\u9690\u85CF\u8D77\u6765\u7684\u8F93\u5165\u6846\u4E0D\u7B97\"\u4EBA\u5BB6\u6B63\u5728\u6253\u5B57\"\uFF1A\u5B83\u65E2\u6536\u4E0D\u5230\u952E\u76D8\uFF0C\u4E5F\u4E0D\u8BE5\u6321\u4F4F\u6211\u4EEC\u805A\u7126\u3002\n // \u5178\u578B\u573A\u666F\u5C31\u662F\u4E34\u65F6\u8BED\u97F3\u5361\u6536\u8D77\u540E\u7126\u70B9\u8FD8\u6302\u5728\u5B83\u7684 textarea \u4E0A\uFF08display:none \u7684\u5143\u7D20\n // \u5728\u90E8\u5206\u6D4F\u89C8\u5668\u91CC\u4ECD\u7136\u662F activeElement\uFF09\u3002\n if (typeof node.getClientRects === 'function' && node.getClientRects().length === 0) return false\n return true\n }\n\n /**\n * \u5C0F\u7A97\u81EA\u5DF1\u7684\u89C4\u5219\uFF1A**\u4E00\u8F6E\u8F93\u51FA\u7ED3\u675F\uFF08\u6210\u529F\u6216\u5931\u8D25\uFF09\u540E\uFF0C\u628A\u5149\u6807\u4EA4\u56DE\u8F93\u5165\u6846**\u3002\n *\n * \u4E3A\u4EC0\u4E48\u662F\u89C4\u5219\u800C\u4E0D\u662F\u67D0\u4E2A\u5165\u53E3\u7684\u7279\u4F8B\uFF1A\u4E0D\u7BA1\u662F\u5212\u8BCD\u89E3\u8BFB\u3001\u8BED\u97F3\u5361\u76F4\u63A5\u8FFD\u95EE\u3001\u8FD8\u662F\u6253\u5F00\u5386\u53F2\uFF0C\n * \u7528\u6237\u770B\u5B8C\u4E00\u8F6E\u7ED3\u679C\u4E4B\u540E\uFF0C\u4E0B\u4E00\u6B65\u5341\u6709\u516B\u4E5D\u662F\u63A5\u7740\u8FFD\u95EE \u2014\u2014 \u5149\u6807\u672C\u6765\u5C31\u8BE5\u5728\u90A3\u513F\u3002\n *\n * \u4E0E\"\u5F00\u7A97\u65F6\u805A\u7126\u4E00\u6B21\"\uFF08focusComposerOnce \u7684\u9996\u6B21\u8C03\u7528\uFF09\u7684\u533A\u522B\uFF1A\n * \u90A3\u6B21\u53EF\u80FD\u56E0\u4E3A\"\u4EBA\u5BB6\u6B63\u5728\u522B\u5904\u6253\u5B57\"\u800C\u4F5C\u5E9F\u5E76\u5C31\u6B64\u4F5C\u7F62\uFF1B\u8FD9\u6B21\u662F\u6BCF\u8F6E\u7ED3\u675F\u90FD\u91CD\u65B0\u7533\u8BF7\uFF0C\n * \u4ECD\u7136\u5C0A\u91CD\u540C\u4E00\u6761\u793C\u8C8C\u89C4\u5219\uFF08\u4E0D\u62A2\u6B63\u5728\u522B\u5904\u6253\u5B57\u7684\u4EBA\u7684\u7126\u70B9\uFF09\u3002\n */\n function askFocusAfterTurn() {\n env.focusBail = 'panelOpen=' + String(env.panelOpen)\n if (!env.panelOpen) return\n env.askFocusPending = true\n focusComposerOnce()\n }\n\n /**\n * \u628A\u5149\u6807\u4EA4\u7ED9\u8F93\u5165\u6846\uFF08preventScroll\uFF1A\u522B\u56E0\u4E3A\u805A\u7126\u628A\u9875\u9762\u6EDA\u4E00\u4E0B\uFF09\u3002\n *\n * \u5148 blur \u518D focus\uFF1A\u5982\u679C\u8F93\u5165\u6CD5\u7684\u8F93\u5165\u4E0A\u4E0B\u6587\u8FD8\u7ED1\u5728\u522B\u5904\uFF08\u89C1 closeVCard \u91CC\u7684\u6CE8\u91CA \u2014\u2014\n * \u5178\u578B\u5C31\u662F\u521A\u6536\u8D77\u7684\u4E34\u65F6\u5361\u7247\uFF09\uFF0C\u5355\u53EB focus() \u4E0D\u8DB3\u4EE5\u8BA9\u5B83\u91CD\u65B0\u7ED1\u5B9A\u5230\u8FD9\u4E2A\u8F93\u5165\u6846\uFF1B\n * \u8D70\u4E00\u6B21 blur \u2192 focus \u624D\u80FD\u628A\u8F93\u5165\u6CD5\u91CD\u65B0\u6302\u8FC7\u6765\u3002\u5DF2\u7ECF\u662F\u5F53\u524D\u7126\u70B9\u65F6\uFF0Cblur \u662F\u65E0\u5BB3\u7684\u3002\n */\n function focusAskBox() {\n try {\n env.askBox.blur()\n } catch (error) {\n /* \u6869\u73AF\u5883 */\n }\n try {\n env.askBox.focus({ preventScroll: true })\n } catch (error) {\n try {\n env.askBox.focus()\n } catch (ignored) {\n /* \u6869\u73AF\u5883 */\n }\n }\n }\n\n /** \u8F93\u5165\u6846\u8FD9\u4F1A\u513F\u771F\u7684\u770B\u5F97\u89C1\u5417\uFF08\u85CF\u7740\u7684\u5143\u7D20\u805A\u7126\u6CA1\u6709\u610F\u4E49\uFF09\u3002 */\n function composerVisible() {\n if (!env.askRow || env.askRow.style.display === 'none') return false\n if (typeof env.askBox.getBoundingClientRect !== 'function') return true\n try {\n var rect = env.askBox.getBoundingClientRect()\n if (rect && rect.width === 0 && rect.height === 0) return false\n } catch (error) {\n /* noop */\n }\n return true\n }\n\n /** \u5185\u5BB9\u53D8\u9AD8\u540E\u628A\u9762\u677F\u62C9\u56DE\u89C6\u53E3\u5185\u3002 */\n function keepInsideViewport() {\n if (!env.panelOpen) return\n var rect = panelLayoutRect()\n var width = Math.min(rect.width, window.innerWidth - 12)\n var left = clamp(rect.left, 6, Math.max(6, window.innerWidth - width - 6))\n var top = clamp(rect.top, 6, Math.max(6, window.innerHeight - 64))\n env.panel.style.left = Math.round(left) + 'px'\n env.panel.style.top = Math.round(top) + 'px'\n }\n return {\n openForSelection,\n currentSessionId,\n loadPanelSize,\n keepInsideViewport,\n closePanel,\n panelLayoutRect,\n get panelInteracting() { return panelInteracting },\n set panelInteracting(value) { panelInteracting = value },\n bindResizeGrip,\n get panelSize() { return panelSize },\n set panelSize(value) { panelSize = value },\n clampPanelSize,\n applyPanelSizeOnOpen,\n clampPanelPosition,\n savePanelSize,\n get panelSizeAsked() { return panelSizeAsked },\n set panelSizeAsked(value) { panelSizeAsked = value },\n openPanelWith,\n paint,\n isTypingTarget,\n rangeSelection,\n clearDocSelection,\n composerVisible,\n focusAskBox,\n setStatus,\n showPanel,\n buildPayload,\n askFocusAfterTurn,\n applySectionTitle,\n progressText,\n syncPanelStage,\n syncExpandCta,\n panelOrCurrentSessionId,\n }\n}\n", "import { PILL_POS, PILL_BALL_SIZE, PILL_FALLBACK_MAX, PILL_STAR_EASE, PILL_STAR_TIP_END, PILL_STAR_BODY_START, PILL_STAR_SAMPLES, PILL_STAR_POP, PILL_STAR_TWIST, PILL_MORPH_MS, preferences, PILL_DRAG_SLOP, PILL_SNAP_RADIUS, PILL_SNAP_MS, HISTORY } from './constants.js'\nimport { clamp } from './dom.js'\n\n/** pill state and operations; dependencies are supplied as live node/callback accessors. */\nexport function createPillController(env) {\n\n /** \u80F6\u56CA\u5DE6\u4FA7\u90A3\u622A\"\u6700\u8FD1\u4E00\u6B21\u5212\u7684\u662F\u4EC0\u4E48\"\uFF08\u592A\u957F\u5C31\u622A\u65AD\uFF09\u3002 */\n function pillSnippet() {\n var text = env.state.payload && env.state.payload.text ? String(env.state.payload.text) : ''\n text = text.replace(/\\s+/g, ' ').trim()\n if (!text) return ''\n return text.length > 12 ? text.slice(0, 12) + '\u2026' : text\n }\n\n /** \u80F6\u56CA\u72B6\u6001\uFF1A\u8FDB\u884C\u4E2D\u62A5\u9636\u6BB5 + \u79D2\u6570\uFF0C\u5176\u4F59\u62A5\u7ED3\u679C\u72B6\u6001\u3002tone \u51B3\u5B9A\u5706\u70B9\u989C\u8272\u3002 */\n function pillStatus() {\n if (env.state.asking) {\n var askingFor = env.state.askingStartedAt ? ((Date.now() - env.state.askingStartedAt) / 1000).toFixed(1) + 's' : ''\n return { tone: 'busy', text: '\u8FFD\u95EE\u4E2D ' + askingFor }\n }\n if (env.state.phase === 'loading' || env.state.phase === 'streaming') {\n var label = env.state.toolBusy ? '\u68C0\u7D22\u4E2D' : env.state.stage === 'detail' ? '\u8BE6\u89E3\u4E2D' : env.state.chars > 0 ? '\u751F\u6210\u4E2D' : '\u7FFB\u8BD1\u4E2D'\n var seconds = env.state.startedAt ? ((Date.now() - env.state.startedAt) / 1000).toFixed(1) + 's' : ''\n return { tone: 'busy', text: label + ' ' + seconds }\n }\n if (env.state.phase === 'error') return { tone: 'error', text: '\u5931\u8D25' }\n if (env.state.phase === 'paused') return { tone: 'paused', text: '\u5DF2\u505C\u6B62' }\n if (env.state.phase === 'done') {\n var rounds = 0\n for (var i = 0; i < env.state.turns.length; i += 1) if (env.state.turns[i].role === 'user') rounds += 1\n return { tone: 'done', text: rounds > 0 ? '\u5B8C\u6210 \u00B7 ' + rounds + ' \u8F6E' : '\u5B8C\u6210' }\n }\n return { tone: 'idle', text: '\u5C31\u7EEA' }\n }\n\n /** \u753B\u80F6\u56CA\uFF08\u53EA\u5728\u6587\u672C\u771F\u7684\u53D8\u4E86\u624D\u5199 DOM\uFF0C\u907F\u514D\u6BCF\u5E27\u52A8\u5E03\u5C40\uFF09\u3002 */\n function paintPill() {\n var status = pillStatus()\n var snippet = pillSnippet()\n var name = snippet || '\u5212\u8BCD\u89E3\u8BFB'\n var meta = '\u00B7 ' + status.text\n if (env.pillName.textContent !== name) env.pillName.textContent = name\n if (env.pillMeta.textContent !== meta) env.pillMeta.textContent = meta\n if (env.pill.getAttribute('data-tone') !== status.tone) env.pill.setAttribute('data-tone', status.tone)\n env.pill.setAttribute('data-open', env.panelOpen ? '1' : '0')\n // \u548C\u8D39\u7528\u80F6\u56CA\u4E00\u6837\u7684\u5C0F\u4E09\u89D2\uFF1A\u25B4 \u6536\u8D77\u72B6\u6001\u53EF\u5C55\u5F00\uFF0C\u25BE \u5DF2\u5C55\u5F00\n var caret = env.panelOpen ? '\u25BE' : '\u25B4'\n if (env.pillCaret.textContent !== caret) env.pillCaret.textContent = caret\n env.pill.title = [\n snippet ? '\u6700\u8FD1\u4E00\u6B21\u5212\u8BCD\uFF1A' + snippet : '\u8FD8\u6CA1\u6709\u5212\u8FC7\u8BCD',\n status.text,\n env.panelOpen ? '\u70B9\u51FB\u6536\u8D77\u5C0F\u7A97' : '\u70B9\u51FB\u56DE\u5230\u8FD9\u4E2A\u5C0F\u7A97',\n '\u53EF\u62D6\u52A8\uFF08\u62D6\u5230\u53F3\u4E0B\u89D2\u9644\u8FD1\u4F1A\u5438\u9644\u56DE\u53BB\uFF09',\n ].join('\uFF5C')\n // \u753B\u4E00\u6B21\u5C31\u7B97\u4E00\u6B21\u6D3B\u52A8\uFF1A\u72B6\u6001\u5728\u53D8\uFF08\u7FFB\u8BD1\u4E2D/\u751F\u6210\u4E2D/\u5B8C\u6210\uFF09\u65F6\u4E0D\u8BE5\u88AB\u6536\u6210\u5C0F\u7403\uFF0C\u4E5F\u987A\u4FBF\u91CD\u7F6E\u9759\u7F6E\u8BA1\u65F6\n notePillActivity()\n }\n\n /**\n * \u627E dsh-spend \u90A3\u679A\u8D39\u7528\u80F6\u56CA\u7684\u5BB9\u5668\u3002\n *\n * \u771F\u5B9E DOM\uFF080.19.x \u5B9E\u6D4B\uFF09\uFF1A\u5916\u5C42 `<div id=\"dsh-spend-widget\">` **\u6CA1\u6709 class**\uFF0C\n * \u91CC\u9762\u624D\u662F\u5E26 `.dsu-widget` \u7684\u90A3\u5C42\uFF08position:fixed \u7684\u5C31\u662F\u5B83\uFF09\uFF0C\u80F6\u56CA\u672C\u8EAB\u662F `.dsu-pill`\u3002\n * \u4E4B\u524D\u53EA\u6309 class `.dsh-spend-widget` \u627E\u2014\u2014\u771F\u5B9E\u9875\u9762\u91CC**\u6C38\u8FDC\u627E\u4E0D\u5230**\uFF0C\n * \u4E8E\u662F\u4F4D\u7F6E\u9000\u5316\u6210\u515C\u5E95\u503C\u3001\u5BBD\u5EA6\u4E5F\u56FA\u5B9A\u4E0D\u4E86\uFF08\u8868\u73B0\uFF1A\u80F6\u56CA\u968F\u6587\u5B57\u4F38\u7F29\u3001\u548C\u8D39\u7528\u80F6\u56CA\u5DEE 2px \u6CA1\u5BF9\u9F50\uFF09\u3002\n */\n function spendHost() {\n var outer = null\n try {\n if (typeof document.getElementById === 'function') outer = document.getElementById('dsh-spend-widget')\n } catch (error) {\n /* noop */\n }\n if (!outer) outer = document.querySelector('.dsu-widget') || document.querySelector('.dsh-spend-widget')\n if (!outer) return null\n // \u771F\u6B63\u5B9A\u4F4D/\u5B9A\u5BBD\u7684\u662F\u91CC\u5C42\u90A3\u5C42\uFF1B\u5916\u5C42\u53EA\u662F\u6302\u8F7D\u70B9\n var inner = outer.querySelector ? outer.querySelector('.dsu-widget') : null\n return inner || outer\n }\n\n /**\n * \u91CF\u4E00\u6B21\"\u8D34\u54EA\u513F\u3001\u591A\u5BBD\"\u3002\n * \u90A3\u4E2A\u63D2\u4EF6\u4E0D\u4E00\u5B9A\u88C5\u7740\u3001\u4E5F\u4E0D\u4E00\u5B9A\u4EC0\u4E48\u65F6\u5019\u51FA\u73B0\uFF0C\u6240\u4EE5\u6BCF\u6B21\u90FD\u7528\u5B9E\u6D4B\u4F4D\u7F6E\uFF0C\u53D6\u4E0D\u5230\u624D\u7528\u515C\u5E95\u504F\u79FB\u3002\n * \u8FD4\u56DE { right, bottom, width }\uFF1Aright/bottom \u662F\u89C6\u53E3\u53F3/\u4E0B\u8FB9\u8DDD\uFF1Bwidth \u662F\u90A3\u679A\u80F6\u56CA\u7684\u5B9E\u6D4B\u5BBD\u5EA6\n * \uFF080 = \u6CA1\u91CF\u5230 \u2014\u2014 \u8C03\u7528\u65B9\u636E\u6B64\u51B3\u5B9A\"\u8DDF\u968F\u5B83\"\u8FD8\u662F\"\u8D70\u515C\u5E95\"\uFF09\u3002\n */\n function measurePillAnchor() {\n // \u515C\u5E95\u4F4D\u7F6E\uFF1A**\u8D34\u9875\u9762\u5E95\u90E8**\uFF08\u548C\u8D39\u7528\u80F6\u56CA\u81EA\u5DF1\u7684 right:20/bottom:20 \u540C\u9AD8\uFF09\u3002\n // \u4EE5\u524D\u515C\u5E95\u662F 64\uFF0C\u7B49\u4E8E\u6C38\u8FDC\u7ED9\"\u4E0B\u9762\u90A3\u679A\u80F6\u56CA\"\u7559\u4F4D\u7F6E\u2014\u2014\u6CA1\u88C5\u90A3\u4E2A\u63D2\u4EF6\u65F6\u5C31\u60AC\u5728\u534A\u7A7A\uFF08\u5B9E\u6D4B\u88AB\u5410\u69FD\uFF09\u3002\n var right = 20\n var bottom = 20\n var width = 0\n try {\n var host = spendHost()\n env.pillHost = host || null\n if (host) {\n var rect = host.getBoundingClientRect()\n if (rect.width > 0 || rect.height > 0) {\n right = Math.max(8, Math.round(window.innerWidth - rect.right))\n // \u7EB5\u5411\u6309\u6574\u4E2A\u5BB9\u5668\u7B97\uFF1A\u8D39\u7528\u9762\u677F\u5C55\u5F00\u65F6\uFF0C\u80F6\u56CA\u8981\u5F85\u5728\u9762\u677F**\u4E0A\u65B9**\u800C\u4E0D\u662F\u538B\u4F4F\u5B83\n bottom = Math.max(8, Math.round(window.innerHeight - rect.top + 10))\n }\n // \u5BBD\u5EA6\u53EA\u8BA4\u90A3\u679A\u80F6\u56CA\u672C\u8EAB\uFF08\u5BB9\u5668\u5C55\u5F00\u6210\u9762\u677F\u65F6\u4F1A\u53D8\u5BBD\uFF0C\u4E0D\u80FD\u8DDF\u7740\u8D70\uFF09\n var capsule = host.querySelector('.dsu-pill') || host.firstElementChild\n if (capsule) {\n var capsuleRect = capsule.getBoundingClientRect()\n if (capsuleRect.width > 0) {\n right = Math.max(8, Math.round(window.innerWidth - capsuleRect.right))\n width = Math.round(capsuleRect.width)\n }\n }\n }\n } catch (error) {\n /* noop\uFF1A\u91CF\u4E0D\u5230\u5C31\u7559\u5728\u515C\u5E95\u4F4D\u7F6E */\n }\n return { right: right, bottom: bottom, width: width }\n }\n\n /* \u2500\u2500 \u4F4D\u7F6E\u8BB0\u5FC6\uFF08host \u5B58\u50A8\uFF09\uFF1A\u62D6\u5230\u522B\u5904\u5C31\u5B58\uFF0C\u5438\u9644\u56DE\u53F3\u4E0B\u89D2\u5C31\u6E05\uFF0C\u6302\u8F7D\u65F6\u8BFB\u56DE\u6765 \u2500\u2500 */\n\n function savePillPos() {\n if (!env.pillFreeRight) return\n fetch(PILL_POS, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ right: Math.round(env.pillFreeRight.right), y: Math.round(env.pillFreeRight.y) }),\n }).catch(function () {})\n }\n\n function clearPillPos() {\n fetch(PILL_POS, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ clear: true }),\n }).catch(function () {})\n }\n\n var pillPosAsked = false\n\n /** \u7528\u6237\u81EA\u5DF1\u62D6\u8FC7\u4F4D\u7F6E\uFF08\u62D6\u8FC7\u5C31\u4E0D\u518D\u7528 host \u4E0A\u7684\u5B58\u6863\u8986\u76D6\uFF09 */\n var pillUserPlaced = false\n\n /** \u6302\u8F7D\u65F6\u8BFB\u56DE\u4E0A\u6B21\u62D6\u5230\u7684\u4F4D\u7F6E\uFF1A\u6709\u5C31\u5207\u6210\u81EA\u7531\u6446\u653E\u3001\u6309\u53F3\u8FB9\u7F18\u6446\u56DE\u53BB\uFF08host \u4E0D\u53EF\u8FBE\u65F6\u9759\u9ED8\u5FFD\u7565\uFF09\u3002 */\n function loadPillPos() {\n if (pillPosAsked) return\n pillPosAsked = true\n fetch(PILL_POS)\n .then(function (res) {\n return res.json()\n })\n .then(function (data) {\n var pos = data && data.position\n if (!pos || typeof pos.right !== 'number' || typeof pos.y !== 'number') return\n if (pillUserPlaced) return // \u7528\u6237\u5DF2\u7ECF\u81EA\u5DF1\u62D6\u8FC7\u4E86\uFF0C\u522B\u7528\u5B58\u6863\u8986\u76D6\u4ED6\n env.pillDock = 'free'\n env.pillFreeRight = { right: pos.right, y: pos.y }\n applyFreePill()\n clampFreePill()\n placePill()\n })\n .catch(function () {})\n }\n\n /** \u81EA\u7531\u6446\u653E\uFF1A\u7528 CSS right \u9489\u4F4F\u53F3\u8FB9\u7F18\uFF0C\u5BBD\u5EA6\u8FC7\u6E21\u7684\u6BCF\u4E00\u5E27\u90FD\u5F80\u5DE6\u957F/\u5F80\u5DE6\u6536\u3002 */\n function applyFreePill() {\n if (!env.pillFreeRight) return\n var h = env.pill.offsetHeight || 0\n env.pill.style.left = 'auto'\n env.pill.style.right = Math.round(window.innerWidth - env.pillFreeRight.right) + 'px'\n env.pill.style.top = Math.round(env.pillFreeRight.y - h / 2) + 'px'\n env.pill.style.bottom = 'auto'\n }\n\n /**\n * \u81EA\u7531\u6446\u653E\u65F6\u4E5F\u5FC5\u987B\u8FD8\u5728\u89C6\u53E3\u91CC\uFF08\u7528\u6237\u62D6\u51FA\u53BB\u8FC7 / \u7A97\u53E3\u53D8\u5C0F\u4E86\uFF09\u3002\n * \u53F3\u8FB9\u7F18\u4E3A\u951A\uFF1A\u5148\u628A\u53F3\u8FB9\u7F18\u5939\u8FDB\u89C6\u53E3\uFF0C\u518D\u4FDD\u8BC1\u5DE6\u8FB9\u7F18\u4E0D\u51FA\u754C\uFF08\u5C55\u5F00\u53D8\u5BBD\u65F6\u53F3\u8FB9\u7F18\u53EF\u80FD\u88AB\u63A8\u53F3\u4E00\u70B9\uFF09\u3002\n * \u4F4D\u7F6E\u6CA1\u53D8\u5C31\u4E00\u4E2A\u50CF\u7D20\u90FD\u4E0D\u5199\u3002\n */\n function clampFreePill() {\n if (!env.pillFreeRight) return false\n var w = env.pill.offsetWidth || 0\n var h = env.pill.offsetHeight || 0\n var right = clamp(env.pillFreeRight.right, w + 4, Math.max(w + 4, window.innerWidth - 4))\n var top = clamp(env.pillFreeRight.y - h / 2, 4, Math.max(4, window.innerHeight - h - 4))\n var y = top + h / 2\n if (Math.abs(right - env.pillFreeRight.right) < 0.5 && Math.abs(y - env.pillFreeRight.y) < 0.5) return false\n env.pillFreeRight = { right: right, y: y }\n applyFreePill()\n return true\n }\n\n /** \u8D34\u89D2/\u8DDF\u968F\u65F6\u90A3\u679A\u80F6\u56CA\u4F1A\u843D\u5728\u54EA\uFF08\u89C6\u53E3\u5750\u6807\uFF09\u2014\u2014 \u677E\u624B\u65F6\u62FF\u5B83\u5224\"\u8981\u4E0D\u8981\u5438\u9644\u56DE\u53BB\"\u3002 */\n function pillAnchorRect() {\n var anchor = measurePillAnchor()\n var w = anchor.width > 0 ? anchor.width : env.pill.offsetWidth || 0\n var h = env.pill.offsetHeight || 0\n return {\n left: window.innerWidth - anchor.right - w,\n top: window.innerHeight - anchor.bottom - h,\n width: w,\n height: h,\n }\n }\n\n /**\n * \u628A\u80F6\u56CA\u6446\u5230\u53F3\u4E0B\u89D2\"\u8D39\u7528\u80F6\u56CA\"\u4E0A\u65B9\u3002\n *\n * \u4E09\u79CD\u5904\u5883\uFF1A\n * \u00B7 anchor\uFF08\u9ED8\u8BA4\uFF09\uFF1A\u8D34\u8D39\u7528\u80F6\u56CA\uFF1B\u91CF\u4E0D\u5230\u5C31\u8D34\u53F3\u4E0B\u89D2 20/20\uFF0C\u5BBD\u5EA6\u6536\u5230 PILL_FALLBACK_MAX\uFF1B\n * \u00B7 free\uFF1A\u7528\u6237\u628A\u5B83\u62D6\u5230\u522B\u5904\u4E86 \u2014\u2014 \u4F4D\u7F6E\u5F52\u7528\u6237\uFF08**\u53F3\u8FB9\u7F18**\u4E3A\u951A\uFF0C\u89C1 applyFreePill\uFF09\uFF0C\n * \u8FD9\u91CC\u53EA\u4FDD\u8BC1\"\u522B\u6389\u51FA\u89C6\u53E3\"\uFF1B\n * \u00B7 ball\uFF1A\u9759\u7F6E\u592A\u4E45\u6536\u6210\u5C0F\u7403 \u2014\u2014 \u4E0A\u9650\u6536\u5230 PILL_BALL_SIZE\uFF08\u89C1 collapsePill\uFF09\u3002\n * \u5BBD\u5EA6\u548C\u4E0A\u9650\u4E09\u79CD\u5904\u5883\u90FD\u4E00\u6837\u7B97\uFF08\u62D6\u52A8\u4E0D\u8BE5\u987A\u624B\u6539\u5BBD\u5EA6\uFF09\uFF0C\u53EA\u6709\u4F4D\u7F6E\u5206\u5BB6\u3002\n */\n function placePill() {\n // \u5173\u6389\u80F6\u56CA\u65F6\u4E0D\u505A\u4EFB\u4F55\u5B9A\u4F4D\u5DE5\u4F5C\uFF1A\u5B83\u5DF2\u7ECF display:none\uFF0C\u91CF\u4F4D\u7F6E\u7EAF\u5C5E\u767D\u8D39\uFF08\u800C\u4E14\u4F1A\u4E00\u76F4\u8F6E\u8BE2\uFF09\n if (env.pillHidden) return\n var anchor = measurePillAnchor()\n env.pillAnchorWidth = anchor.width\n // \u8D39\u7528\u80F6\u56CA**\u51FA\u73B0**\u4E86\uFF1A\u5C0F\u7403\u6CA1\u6709\u5B58\u5728\u7684\u610F\u4E49\uFF08\u6536\u7403\u7684\u524D\u63D0\u5C31\u662F\"\u6CA1\u6709\u53EF\u8DDF\u968F\u7684\u80F6\u56CA\"\uFF09\u2192 \u7ACB\u523B\u5C55\u5F00\n if (env.pillAnchorWidth > 0 && env.pillBall) expandPill()\n // \u53EA\u5728\u771F\u7684\u53D8\u4E86\u624D\u5199 style\uFF08\u6BCF\u5E27\u65E0\u8111\u8D4B\u503C\u4F1A\u8BA9\u6D4F\u89C8\u5668\u53CD\u590D\u6807\u810F\u6837\u5F0F\uFF09\n var changed = false\n function write(prop, value) {\n if (env.pill.style[prop] !== value) {\n env.pill.style[prop] = value\n changed = true\n }\n }\n // \u5BBD\u5EA6**\u5199\u6B7B**\u6210\u8D39\u7528\u80F6\u56CA\u7684\u5BBD\u5EA6\uFF1A\u6587\u5B57\u957F\u77ED\u4E0D\u518D\u8BA9\u5B83\u4F38\u7F29\uFF08\u957F\u6587\u5B57\u81EA\u5DF1\u7701\u7565\u53F7\u6536\u5C3E\uFF09\n write('width', anchor.width > 0 ? anchor.width + 'px' : '')\n // \u4E0A\u9650\u5206\u4E09\u79CD\u60C5\u51B5\uFF08\u524D\u4E24\u6761\u662F\u7528\u6237\u5B9A\u7684\u89C4\u5219\uFF09\uFF1A\n // \u00B7 \u6536\u6210\u5C0F\u7403 \u2192 \u7403\u7684\u5C3A\u5BF8\uFF08max-width \u53C2\u4E0E\u8FC7\u6E21\uFF0C\u6536/\u653E\u624D\u662F\u52A8\u753B\u800C\u4E0D\u662F\u8DF3\u53D8\uFF09\uFF1B\n // \u00B7 \u91CF\u5230\u4E86\u8D39\u7528\u80F6\u56CA \u2192 \u6E05\u6389\u5185\u8054\u4E0A\u9650\uFF0C\u56DE\u5230 CSS \u90A3\u6761 280 \u2014\u2014 \u548C\u5B83\u5E76\u6392\u65F6\u540C\u5BBD\uFF1B\n // \u00B7 \u91CF\u4E0D\u5230\uFF08\u6CA1\u88C5 dsh-spend / \u5B83\u7684\u80F6\u56CA\u6B64\u523B\u5BBD\u9AD8\u4E3A 0\uFF09\u2192 \u6536\u5230 PILL_FALLBACK_MAX\u3002\n // \u5224\u636E\u662F**\u672C\u6B21\u91CF\u5230\u7684\u5BBD\u5EA6**\u800C\u4E0D\u662F\"\u6709\u6CA1\u6709\u627E\u5230\u5BB9\u5668\"\uFF1A\u5BB9\u5668\u5728\u4F46\u80F6\u56CA\u88AB\u6298\u53E0/\u9690\u85CF\u65F6\u540C\u6837\u8DDF\u4E0D\u4E86\uFF0C\n // \u90A3\u79CD\u60C5\u51B5\u4E5F\u8BE5\u8D70\u515C\u5E95\u3002\n write('maxWidth', env.pillBall ? PILL_BALL_SIZE + 'px' : anchor.width > 0 ? '' : PILL_FALLBACK_MAX + 'px')\n // min-width \u4E5F\u4E00\u8D77\u8FC7\u6E21\uFF1A\u7403\u662F 32\u00D732 \u7684\u5706\uFF0C\u5C55\u5F00\u65F6\u8981**\u5E73\u6ED1\u56DE\u5230 0**\u3002\n // \u4E4B\u524D\u5B83\u6302\u5728 [data-ball=\"1\"] \u4E0A\uFF0C\u4E00\u6458\u5C5E\u6027\u5C31\u77AC\u95F4\u5931\u6548 \u2192 \u5C55\u5F00\u7B2C\u4E00\u5E27\u5BBD\u5EA6\u584C\u5230\u5185\u5BB9\u5BBD\uFF0810px\uFF09\n // \u518D\u957F\u56DE\u6765\uFF0C\u770B\u7740\u5C31\u662F\u5148\u62BD\u4E00\u4E0B\uFF08\u771F\u65F6\u95F4\u8F74\u91C7\u6837\u5230\u7684 0:10\uFF09\u3002\n write('minWidth', env.pillBall ? PILL_BALL_SIZE + 'px' : '0px')\n if (env.pillDock === 'free') {\n // \u4F4D\u7F6E\u5F52\u7528\u6237\uFF1ACSS right \u6301\u7EED\u9489\u4F4F\u53F3\u8FB9\u7F18\uFF0C\u53EA\u4FDD\u8BC1\u80F6\u56CA\u8FD8\u5728\u89C6\u53E3\u91CC\u3002\n clampFreePill()\n return changed\n }\n if (Date.now() < env.pillSnapUntil) {\n // \u5438\u9644\u90A3\u4E00\u4E0B\u7684\"\u6ED1\u56DE\u53BB\"\u7A97\u53E3\uFF08\u89C1 settlePillDrop\uFF09\uFF1A\u8FD9\u671F\u95F4\u4F4D\u7F6E\u4ECD\u6309 left/top \u7EF4\u6301 \u2014\u2014\n // left/top \u4E0E right/bottom \u4E4B\u95F4**\u4E0D\u53EF\u63D2\u503C**\uFF08left:124px \u2192 auto \u4F1A\u76F4\u63A5\u77AC\u79FB\uFF09\uFF0C\n // \u6240\u4EE5\u6ED1\u884C\u5FC5\u987B\u9760 left/top \u8D70\u5B8C\uFF0C\u4E4B\u540E\u518D\u4EA4\u8FD8\u7ED9 right/bottom \u90A3\u5957\u7A33\u6001\u5B9A\u4F4D\u3002\n var snapWidth = anchor.width > 0 ? anchor.width : env.pill.offsetWidth || 0\n write('left', Math.round(window.innerWidth - anchor.right - snapWidth) + 'px')\n write('top', Math.round(window.innerHeight - anchor.bottom - (env.pill.offsetHeight || 0)) + 'px')\n write('right', 'auto')\n write('bottom', 'auto')\n return changed\n }\n // \u7A33\u6001\uFF1Aright/bottom \u5B9A\u4F4D\uFF08\u5BBD\u5EA6\u4E00\u53D8\uFF0C\u53F3\u8FB9\u7F18\u4ECD\u548C\u8D39\u7528\u80F6\u56CA\u5BF9\u9F50\uFF09\n write('left', '')\n write('top', '')\n write('right', anchor.right + 'px')\n write('bottom', anchor.bottom + 'px')\n return changed\n }\n\n /**\n * \u9759\u7F6E\u6536\u7403\u3002\n *\n * \u89C4\u5219\uFF08\u7528\u6237\u5B9A\u7684\uFF09\uFF1A**\u53EA\u6709\u91CF\u4E0D\u5230\u8D39\u7528\u80F6\u56CA\u65F6**\u624D\u6536\u7403 \u2014\u2014 \u6709\u8D39\u7528\u80F6\u56CA\u65F6\u5B83\u662F\u8981\u8DDF\u4EBA\u5BB6\u5E76\u6392\u7684\uFF0C\n * \u6536\u6210\u7403\u53CD\u800C\u7A81\u5140\u3002\u4E0B\u9762\u51E0\u79CD\u60C5\u51B5\u4E00\u5F8B\u4E0D\u6536\uFF1A\u5C0F\u7A97\u5F00\u7740\u3001\u6B63\u5728\u7FFB\u8BD1/\u8FFD\u95EE\u3001\u9F20\u6807\u505C\u5728\u4E0A\u9762\u3001\u6B63\u5728\u62D6\u3002\n * \u52A8\u753B\u9760 max-width \u8FC7\u6E21\uFF08\u6536\u7403 = \u628A\u4E0A\u9650\u6536\u5230 PILL_BALL_SIZE\uFF09\uFF0C\u6240\u4EE5\u6536/\u653E\u662F\u540C\u4E00\u6761\u5E73\u6ED1\u66F2\u7EBF\uFF0C\n * \u4E0D\u9700\u8981\u9884\u5148\u91CF\u5BBD\u5EA6\uFF0C\u4E5F\u4E0D\u4F1A\u6709\u8DF3\u53D8\u3002\n */\n function pillCanBall() {\n return (\n env.pillAnchorWidth === 0 &&\n !env.pillBall &&\n !env.panelOpen &&\n !env.pillHover &&\n !env.pillDrag &&\n pillStatus().tone !== 'busy'\n )\n }\n\n /* \u2500\u2500 \u7403\u5FC3\u56FE\u5F62\u7684\u5F62\u53D8\uFF1A\u4E00\u4E2A\u7EAF\u51FD\u6570 f(p) + \u4E00\u6761\u65F6\u95F4\u5BF9\u79F0\u66F2\u7EBF \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n \u26A0\uFE0F \u8FD9\u91CC**\u4E0D\u80FD**\u7528 CSS \u7684 `transition:d`\uFF1A\u4E24\u6761\u9759\u6001 path \u4E4B\u95F4 CSS \u53EA\u80FD**\u7EBF\u6027**\u63D2\u503C\uFF0C\n \u4E8E\u662F\u4E2D\u9014\u4F1A\u7ECF\u8FC7\u4E00\u4E2A\u6B63\u83F1\u5F62\uFF08\u8C37\u8DDF\u7740\u5C16\u4E00\u8D77\u52A8\uFF09\u2014\u2014\u6B63\u662F\u8BBE\u8BA1\u9636\u6BB5\u5426\u6389\u7684\u90A3\u7248\u3002\n \u5FC5\u987B\u5728 JS \u91CC\u6309 p \u73B0\u7B97\u8DEF\u5F84\uFF0C\u624D\u80FD\u8BA9\"\u5C16\u5148\u62BD\u51FA\u6765\u3001\u8EAB\u518D\u6536\u8FDB\u53BB\"\u8FD9\u4E2A\u975E\u7EBF\u6027\u8F68\u8FF9\u6210\u7ACB\u3002\n \u53E6\uFF1Af(p) \u53EA\u4F9D\u8D56 p\uFF0Cp \u53C8\u7531\u65F6\u95F4\u5BF9\u79F0\u66F2\u7EBF\u7ED9\u51FA\uFF0C\u6240\u4EE5\u6536/\u653E\u5929\u7136\u4E92\u4E3A\u5012\u653E\uFF08\u955C\u50CF\uFF09\u3002 */\n\n /** \u65F6\u95F4\u5BF9\u79F0\u66F2\u7EBF\u7684 y(x)\uFF1A\u548C CSS \u7684 cubic-bezier \u540C\u4E00\u5957\u89E3\u6CD5\uFF08\u4E8C\u5206 24 \u6B21\u8DB3\u591F\uFF09\u3002 */\n function pillStarEase(x) {\n var c = PILL_STAR_EASE\n var cx = 3 * c[0]\n var bx = 3 * (c[2] - c[0]) - cx\n var ax = 1 - cx - bx\n var cy = 3 * c[1]\n var by = 3 * (c[3] - c[1]) - cy\n var ay = 1 - cy - by\n var lo = 0\n var hi = 1\n var t = x\n for (var i = 0; i < 24; i += 1) {\n t = (lo + hi) / 2\n if (((ax * t + bx) * t + cx) * t < x) lo = t\n else hi = t\n }\n t = (lo + hi) / 2\n return ((ay * t + by) * t + cy) * t\n }\n\n /** smoothstep\uFF1A\u4E24\u7AEF\u901F\u5EA6\u90FD\u4E3A 0 \u2014\u2014 \u6BB5\u4E0E\u6BB5\u4EA4\u754C\u5904\u4E0D\u4F1A\u6709\u901F\u5EA6\u65AD\u70B9\uFF08\u90A3\u6B63\u662F\"\u751F\u786C\"\u7684\u6765\u6E90\uFF09\u3002 */\n function pillStarSmooth(x) {\n var c = x < 0 ? 0 : x > 1 ? 1 : x\n return c * c * (3 - 2 * c)\n }\n\n /** \u661F\u7684\u591A\u8FB9\u5F62\u9876\u70B9\uFF088 \u4E2A\uFF1A\u5C16\u8C37\u4EA4\u66FF\uFF0C\u4E0E\u300C\u2726 \u89E3\u8BFB\u300D\u90A3\u9897\u661F\u540C\u4E00\u6761\u51E0\u4F55\uFF09\u3002 */\n function pillStarPolygon() {\n var tip = 6.0 // \u58A8\u8FF9 12.0px\uFF1A\u4E0E\u80F6\u56CA\u91CC 12px \u7684\u6587\u5B57\u540C\u9AD8\n var valley = tip * 0.3788\n var pts = []\n for (var k = 0; k < 4; k += 1) {\n pts.push([tip * Math.cos(k * Math.PI / 2), tip * Math.sin(k * Math.PI / 2)])\n pts.push([valley * Math.cos((k * 90 + 45) * Math.PI / 180), valley * Math.sin((k * 90 + 45) * Math.PI / 180)])\n }\n return pts\n }\n\n /** \u4ECE\u539F\u70B9\u6CBF angDeg \u6253\u5C04\u7EBF\uFF0C\u548C\u591A\u8FB9\u5F62\u6C42\u4EA4 \u2192 \u8BE5\u89D2\u5EA6\u7684\u8FB9\u754C\u534A\u5F84\u3002 */\n function pillStarBoundaryRadius(poly, angDeg) {\n var a = angDeg * Math.PI / 180\n var dx = Math.cos(a)\n var dy = Math.sin(a)\n var best = Infinity\n for (var i = 0; i < poly.length; i += 1) {\n var p0 = poly[i]\n var p1 = poly[(i + 1) % poly.length]\n var ex = p1[0] - p0[0]\n var ey = p1[1] - p0[1]\n var den = dx * ey - dy * ex\n if (Math.abs(den) < 1e-9) continue\n var t = (p0[0] * ey - p0[1] * ex) / den\n var u = (p0[0] * dy - p0[1] * dx) / den\n if (t > 0 && u >= -1e-6 && u <= 1 + 1e-6 && t < best) best = t\n }\n return best === Infinity ? 4 : best\n }\n\n var pillStarPoly = pillStarPolygon()\n\n /**\n * p=0 \u2192 32 \u4E2A\u9876\u70B9\u540C\u534A\u5F84 4\uFF088px \u5706\u70B9\uFF0C\u4E0E\u6B63\u5706\u6700\u5927\u504F\u5DEE 0.02px\uFF09\uFF1B\n * p=1 \u2192 32 \u4E2A\u9876\u70B9\u6B63\u597D\u843D\u5728\u6309\u94AE\u90A3\u9897\u661F\u7684\u8FB9\u754C\u4E0A\uFF08\u5C16\u4E0E\u8C37\u4ECD\u662F\u7CBE\u786E\u9876\u70B9\uFF09\u3002\n * \u5C16\u8D70 p/.62 \u7684 smoothstep\u3001\u8EAB\u8D70 (p-.38)/.62 \u7684 smoothstep \u2014\u2014 \u4E24\u6761\u90FD\u4E24\u7AEF\u901F\u5EA6\u4E3A 0\uFF0C\n * \u4E8E\u662F\u6574\u4E2A 280ms \u91CC\u56FE\u5F62\u4E00\u76F4\u5728\u52A8\u3001\u4E14\u6CA1\u6709\u901F\u5EA6\u65AD\u70B9\uFF08\u5B9E\u6D4B\uFF1A\u65E7\u7248\u5C16\u5728 160ms \u901F\u5EA6\u4ECE 4.98 \u76F4\u63A5\u6389\u5230 0\uFF09\u3002\n * p \u5141\u8BB8\u7565\u5FAE\u8D8A\u754C\uFF08\u8FC7\u51B2\u66F2\u7EBF\u4F1A\u7ED9\u5230 -0.03\u20261.06\uFF09\uFF0C\u534A\u5F84\u6309\u540C\u4E00\u5F0F\u5B50\u5916\u63A8 \u2014\u2014 \u4E8E\u662F\"\u51B2\u51FA\u53BB\u4E00\u70B9\u518D\u6536\u56DE\"\u3002\n */\n function pillStarPathAt(p) {\n var pTip = pillStarSmooth(p / PILL_STAR_TIP_END)\n var pBody = pillStarSmooth((p - PILL_STAR_BODY_START) / (1 - PILL_STAR_BODY_START))\n var popEnv = pillStarPopEnvelope(p)\n var out = []\n for (var i = 0; i < PILL_STAR_SAMPLES; i += 1) {\n var ang = i * 360 / PILL_STAR_SAMPLES\n var rStar = pillStarBoundaryRadius(pillStarPoly, ang)\n // \u9876\u70B9\u6309\"\u8981\u5F80\u5916\u957F\u8FD8\u662F\u8981\u5F80\u91CC\u6536\"\u5206\u6D41\uFF1A\n // \u76EE\u6807\u534A\u5F84 \u2265 4\uFF08\u5C16\u548C\u7D27\u90BB\u7684\u9876\u70B9\uFF09\u8DDF\"\u5C16\"\u7684\u8FDB\u5EA6 pTip\uFF1B< 4\uFF08\u5F80\u5185\u6536\u7684\u9876\u70B9\uFF09\u8DDF\"\u8EAB\"\u7684\u8FDB\u5EA6 pBody\u3002\n // \u4E3A\u4EC0\u4E48\u4E0D\u80FD\u6309\"\u79BB\u5C16\u7684\u89D2\u5EA6\u6743\u91CD w\"\u6DF7\u5408\uFF08\u8BD5\u8FC7\uFF09\uFF1A22.5\u00B0 \u90A3\u4E2A\u9876\u70B9\u76EE\u6807\u534A\u5F84\u5DF2 < 4\uFF08\u8981\u5F80\u91CC\u6536\uFF09\uFF0C\u5374\u56E0\u4E3A\n // w \u4E0D\u5C0F\u800C\u8DDF\u7740\u5C16\u7684\u8FDB\u5EA6**\u63D0\u524D**\u5185\u6536 \u2192 \u6BD4\u8C37\u8FD8\u6DF1\uFF0C\u8FB9\u4E0A\u51FA\u73B0\u4E00\u9053\u6CE2\u6D6A\uFF08\u7F29\u5C0F\u5C3A\u5BF8\u540E 22.5\u00B0 \u6BD4 33.75\u00B0\n // \u8FD8\u6DF1 0.11px\uFF0C\u88AB\u5192\u70DF\u6293\u5230\uFF09\u3002\u5206\u6D41\u4E4B\u540E\u5355\u8C03\u6027\u53EF\u8BC1\uFF1A\n // \u5916\u6269\u9876\u70B9 r = 4 + (rStar-4)\u00B7pTip \u2265 4 \u2265 4 + (rStar-4)\u00B7pBody = \u5185\u6536\u9876\u70B9\u3002\n var prog = rStar >= 4 ? pTip : pBody\n // \u8FC7\u51B2\u53EA\u52A0\u5728\"\u5C16\"\u4E0A\uFF08\u5916\u6269\u9876\u70B9\uFF09\uFF1A\u5C16\u5148\u51B2\u51FA\u53BB\u4E00\u70B9\u3001\u8C37\u6309\u90E8\u5C31\u73ED\u6536 \u2014\u2014 \u547C\u5438\u611F\u6765\u81EA\u8FD9\u91CC\n if (rStar >= 4) prog += PILL_STAR_POP * popEnv\n var r = 4 + (rStar - 4) * prog\n var rad = ang * Math.PI / 180\n var x = Math.round(r * Math.cos(rad) * 100) / 100\n var y = Math.round(r * Math.sin(rad) * 100) / 100\n out.push((i ? 'L' : 'M') + x + ' ' + y)\n }\n return out.join('') + 'Z'\n }\n\n /** \u8FC7\u51B2\u7684\u5305\u7EDC\uFF1Ap\u2264.55 \u4E3A 0\uFF0Cp\u2248.8 \u5230\u9876\uFF0Cp=1 \u5F52\u96F6\uFF08\u4E24\u7AEF\u4E3A 0 \u2192 \u4E0D\u7834\u574F\u7AEF\u70B9\uFF09\u3002 */\n function pillStarPopEnvelope(p) {\n if (p <= 0.55 || p >= 1) return 0\n return Math.sin(Math.PI * (p - 0.55) / 0.45)\n }\n\n /** \u5FAE\u8F6C\uFF1A\u5706\u70B9\u6001 -8\u00B0 \u2192 \u661F\u8292\u6001 0\u00B0\u3002 */\n function pillStarTwistAt(p) {\n return PILL_STAR_TWIST * (1 - p)\n }\n\n var pillStarP = 0\n\n var pillStarTargetP = 0\n\n var pillStarTimer = 0\n\n var pillStarStarts = 0\n\n var pillStarLog = ''\n\n /** \u6309 p \u753B\u4E00\u5E27\uFF08\u8DEF\u5F84 + \u5FAE\u8F6C\uFF09\u3002 */\n function paintPillStar(p) {\n pillStarP = p\n env.pillStar.setAttribute('d', pillStarPathAt(p))\n env.pillStar.style.transform = 'rotate(' + (Math.round(pillStarTwistAt(p) * 100) / 100) + 'deg)'\n }\n\n /**\n * \u4ECE\u5F53\u524D p \u8D70\u5230 to\uFF081=\u6536\u7403\u6210\u661F\uFF0C0=\u5C55\u5F00\u56DE\u5706\u70B9\uFF09\u3002\n * \u65F6\u957F\u4E0E\u80F6\u56CA\u90A3\u6761 CSS \u8FC7\u6E21\u4E00\u81F4\uFF08PILL_MORPH_MS / PILL_MORPH\uFF09\uFF0C\u4E24\u8005\u540C\u62CD\uFF1B\n * \u88AB\u6253\u65AD\uFF08\u6BD4\u5982\u6536\u7403\u9014\u4E2D\u9F20\u6807\u79FB\u4E0A\u53BB\uFF09\u5C31\u4ECE\u5F53\u524D p \u63A5\u7740\u8D70\uFF0C\u4E0D\u4F1A\u8DF3\u3002\n *\n * \u4E3A\u4EC0\u4E48\u7528 setTimeout \u800C\u4E0D\u662F requestAnimationFrame\uFF1A\n * \u00B7 \u8FDB\u5EA6\u662F**\u6309\u65F6\u95F4\u7B97\u7684**\uFF08Date.now()\uFF09\uFF0C\u4E0D\u662F\u6309\u5E27\u7D2F\u52A0\u7684 \u2014\u2014 \u6240\u4EE5\u8282\u594F\u7528\u4EC0\u4E48\u9A71\u52A8\u4E0D\u5F71\u54CD\u4FDD\u771F\u5EA6\uFF1B\n * \u00B7 \u5192\u70DF\u811A\u672C\u8DD1\u5728 --virtual-time-budget \u4E0B\uFF0C\u90A3\u4E2A\u73AF\u5883**\u4E0D\u6D3E\u53D1 rAF**\uFF08\u5B9A\u65F6\u5668\u7167\u8D70\uFF09\uFF0C\n * \u7528 rAF \u7684\u8BDD\u6574\u6BB5\u52A8\u753B\u5728\u6D4B\u8BD5\u91CC\u6839\u672C\u89C2\u5BDF\u4E0D\u5230\uFF08\u4E5F\u5C31\u4F1A\u6F0F\u6389\"\u4E2D\u9014\u5F62\u72B6\u4E0D\u5BF9\"\u8FD9\u7C7B bug\uFF09\uFF1B\n * \u00B7 \u7528 Date.now() \u800C\u4E0D\u662F performance.now()\uFF1A\u865A\u62DF\u65F6\u949F\u4E0B\u540E\u8005\u662F\u51BB\u4F4F\u7684\u3002\n * 16ms \u2248 60fps\uFF0C\u548C rAF \u540C\u6863\uFF1B\u540E\u53F0\u6807\u7B7E\u91CC\u88AB\u8282\u6D41\u4E5F\u53EA\u662F\u76F4\u63A5\u8DF3\u5230\u7EC8\u503C\uFF0C\u65E0\u526F\u4F5C\u7528\u3002\n */\n function animatePillStar(to) {\n // \u2460 \u540C\u76EE\u6807\u7684\u91CD\u590D\u8C03\u7528 = \u7A7A\u64CD\u4F5C\u3002**\u4E0D\u8981**\u91CD\u7F6E\u5DF2\u7ECF\u8DD1\u4E86\u4E00\u534A\u7684\u52A8\u753B \u2014\u2014\n // \u5426\u5219\"\u53CD\u590D\u6536\u5230\u540C\u4E00\u6761\u6307\u4EE4\"\u4F1A\u8BA9\u5B83\u6C38\u8FDC\u505C\u5728\u534A\u8DEF\uFF08\u5B9E\u6D4B\u8E29\u8FC7\uFF1A\u5E8F\u5217 10101010\u3001\u8FDB\u5EA6\u5361\u5728 0.158\uFF09\u3002\n if (to === pillStarTargetP && (pillStarTimer || pillStarP === to)) return\n if (pillStarTimer) {\n clearTimeout(pillStarTimer)\n pillStarTimer = 0\n }\n pillStarTargetP = to\n pillStarStarts += 1\n pillStarLog = (pillStarLog + (to ? '1' : '0')).slice(-40)\n var from = pillStarP\n if (from === to) {\n paintPillStar(to)\n return\n }\n // \u2461 \u6253\u65AD\u540E\u63A5\u7740\u8D70\uFF1A\u65F6\u957F\u6309**\u5269\u4F59\u8DDD\u79BB**\u7B49\u6BD4\u7F29\u77ED \u2192 \u901F\u5EA6\u4E0D\u53D8\uFF0C\u800C\u4E14\u4E00\u5B9A\u4F1A\u8D70\u5230\u7EC8\u70B9\u3002\n // \u5426\u5219\"\u6536\u7403\u9014\u4E2D\u88AB\u5C55\u5F00\"\u8FD9\u79CD\u6765\u56DE\u6253\u65AD\u4F1A\u8BA9\u6BCF\u4E00\u6BB5\u90FD\u8DD1\u6EE1 280ms\uFF0C\u6C38\u8FDC\u8FFD\u4E0D\u4E0A\u76EE\u6807\u3002\n var span = Math.max(60, PILL_MORPH_MS * Math.abs(to - from))\n var done = 0\n var last = Date.now()\n function step() {\n var now = Date.now()\n var elapsed = now - last\n // \u65F6\u949F\u88AB\u51BB\u4F4F\u65F6\uFF08--virtual-time-budget \u90A3\u79CD\u865A\u62DF\u65F6\u949F\uFF1A\u5B9A\u65F6\u5668\u7167\u8D70\u3001Date.now() \u4E0D\u52A8\uFF09\n // \u6309\"\u4E00\u62CD 16ms\"\u63A8\u8FDB \u2014\u2014 \u5426\u5219\u52A8\u753B\u6C38\u8FDC\u505C\u5728\u7B2C\u4E00\u5E27\uFF0C\u6D4B\u8BD5\u4E5F\u5C31\u770B\u4E0D\u5230\u4E2D\u9014\u5F62\u72B6\n //\uFF08\u800C\"\u4E2D\u9014\u5F62\u72B6\u4E0D\u5BF9\"\u6B63\u662F\u4E0A\u4E00\u7248\u6F0F\u6389\u7684\u90A3\u4E2A bug\uFF09\u3002\u771F\u5B9E\u73AF\u5883\u91CC elapsed \u5C31\u662F\u771F\u5B9E\u95F4\u9694\u3002\n if (elapsed <= 0) elapsed = 16\n last = now\n done += elapsed\n var x = done / span\n if (x >= 1) {\n pillStarTimer = 0\n paintPillStar(to)\n return\n }\n paintPillStar(from + (to - from) * pillStarEase(x))\n pillStarTimer = setTimeout(step, 16)\n }\n step()\n }\n\n /** \u7403\u5FC3\u91CC\u7684\u56FE\u5F62\u5207\u5230\"\u5706\u70B9\"\uFF08\u5C55\u5F00\uFF09\u6216\"\u661F\u8292\"\uFF08\u6536\u7403\uFF09\u3002 */\n function setPillStar(ball) {\n animatePillStar(ball ? 1 : 0)\n }\n\n function collapsePill() {\n if (env.pillBall) return false\n env.pillBall = true\n env.pill.setAttribute('data-ball', '1')\n setPillStar(true)\n placePill() // \u4E0A\u9650 \u2192 \u7403\u7684\u5C3A\u5BF8\uFF08\u8FC7\u6E21\u52A8\u753B\u4EA4\u7ED9 CSS \u7684 max-width\uFF09\n if (env.pillDock === 'free') applyFreePill()\n return true\n }\n\n function expandPill() {\n if (!env.pillBall) return false\n env.pillBall = false\n env.pill.removeAttribute('data-ball')\n setPillStar(false)\n placePill() // \u4E0A\u9650\u4EA4\u56DE 200 / \u8D39\u7528\u80F6\u56CA\u90A3\u6761\n if (env.pillDock === 'free') applyFreePill()\n return true\n }\n\n /**\n * \u9759\u7F6E\u8BA1\u65F6\uFF1A\u4EFB\u4F55\"\u6D3B\u52A8\"\u90FD\u628A\u5B83\u91CD\u65B0\u62E8\u6EE1\uFF08\u89C1 notePillActivity\uFF09\u3002\n * \u7528\u88F8 setTimeout \u800C\u4E0D\u662F later()\uFF1A\u8FD9\u4E2A\u8BA1\u65F6\u5668\u6BCF\u5E27\u90FD\u53EF\u80FD\u88AB\u91CD\u7F6E\uFF0C\u585E\u8FDB timers \u6570\u7EC4\u4F1A\u4E00\u76F4\u957F\u3002\n */\n function schedulePillIdle() {\n if (env.pillIdleId) clearTimeout(env.pillIdleId)\n env.pillIdleId = setTimeout(function () {\n env.pillIdleId = 0\n if (pillCanBall()) collapsePill()\n }, preferences.pillIdleMs)\n }\n\n /** \u6709\u6D3B\u52A8\uFF08\u70B9/\u5212\u8FC7/\u5C0F\u7A97\u5728\u52A8/\u72B6\u6001\u5728\u53D8\uFF09\u2192 \u6536\u7740\u7403\u5C31\u5C55\u5F00\uFF0C\u5E76\u628A\u9759\u7F6E\u8BA1\u65F6\u91CD\u65B0\u62E8\u6EE1\u3002 */\n function notePillActivity() {\n if (env.pillBall) expandPill()\n schedulePillIdle()\n }\n\n /**\n * \u5F00\u59CB\u62D6\u80F6\u56CA\uFF08\u9F20\u6807\uFF1B\u548C\u9762\u677F\u62D6\u52A8\u540C\u4E00\u5957\u5199\u6CD5\uFF09\u3002\n *\n * \u4E09\u4E2A\u8981\u70B9\uFF1A\n * \u00B7 \u4F4D\u79FB\u8D85\u8FC7 PILL_DRAG_SLOP \u624D\u7B97\"\u62D6\"\uFF0C\u5426\u5219\u4ECD\u6309\u70B9\u51FB\u5904\u7406\uFF08\u70B9\u4E00\u4E0B\u8981\u80FD\u5F00\u5173\u5C0F\u7A97\uFF09\uFF1B\n * \u00B7 \u4E00\u5F00\u62D6\u5C31\u5207\u5230 free \u2014\u2014 \u8D34\u89D2\u7684\u8F6E\u8BE2\u4ECE\u6B64\u4E0D\u8BB8\u518D\u52A8\u5B83\uFF08\u5426\u5219\u62D6\u5230\u4E00\u534A\u4F1A\u88AB\u62FD\u56DE\u53BB\uFF09\uFF1B\n * \u00B7 \u62D6\u52A8\u671F\u95F4\u5173\u6389\u8FC7\u6E21\uFF08data-drag\uFF09\uFF0C\u677E\u624B\u518D\u6253\u5F00\uFF1A\u5438\u9644\u90A3\u4E00\u4E0B\u624D\u6709\u52A8\u753B\uFF0C\u62D6\u7684\u65F6\u5019\u4E0D\u9ECF\u624B\u3002\n */\n function beginPillDrag(event) {\n if (event.button !== undefined && event.button !== 0) return\n if (env.pillBall) expandPill() // \u7403\u4E5F\u80FD\u76F4\u63A5\u62D6\uFF1A\u5148\u5C55\u5F00\uFF08hover \u90A3\u6761\u8DEF\u901A\u5E38\u5DF2\u7ECF\u5C55\u5F00\u4E86\uFF09\n var rect = env.pill.getBoundingClientRect()\n var drag = {\n offsetX: event.clientX - rect.left,\n offsetY: event.clientY - rect.top,\n startX: event.clientX,\n startY: event.clientY,\n moved: false,\n }\n env.pillDrag = drag\n env.pillDragMoved = false\n env.pillSnapUntil = 0\n var move = function (moveEvent) {\n if (env.pillDrag !== drag) return\n if (!drag.moved) {\n var travelled = Math.abs(moveEvent.clientX - drag.startX) + Math.abs(moveEvent.clientY - drag.startY)\n if (travelled < PILL_DRAG_SLOP) return\n drag.moved = true\n env.pillDragMoved = true\n env.pill.setAttribute('data-drag', '1')\n }\n var w = env.pill.offsetWidth\n var h = env.pill.offsetHeight\n var left = clamp(moveEvent.clientX - drag.offsetX, 4, Math.max(4, window.innerWidth - w - 4))\n var top = clamp(moveEvent.clientY - drag.offsetY, 4, Math.max(4, window.innerHeight - h - 4))\n // \u771F\u7684\u62D6\u4E86 \u2192 \u4ECE\"\u8D34\u89D2/\u8DDF\u968F\"\u5207\u6210\u81EA\u7531\u6446\u653E\uFF1A\u4F4D\u7F6E\u5F52\u7528\u6237\uFF0C\u8F6E\u8BE2\u4E0D\u518D\u52A8\u5B83\n env.pillDock = 'free'\n env.pillFreeRight = { right: left + w, y: top + h / 2 }\n applyFreePill()\n }\n var up = function () {\n window.removeEventListener('mousemove', move, true)\n window.removeEventListener('mouseup', up, true)\n if (env.pillDrag !== drag) return\n var dropRect = drag.moved ? env.pill.getBoundingClientRect() : null\n env.pillDrag = null\n if (!drag.moved) {\n env.pill.removeAttribute('data-drag')\n return // \u6CA1\u52A8 = \u70B9\u51FB\uFF1A\u4EA4\u7ED9 click \u5904\u7406\uFF08\u4E0D\u5728\u8FD9\u91CC reopen\uFF09\n }\n settlePillDrop(dropRect)\n notePillActivity()\n }\n window.addEventListener('mousemove', move, true)\n window.addEventListener('mouseup', up, true)\n }\n\n /**\n * \u677E\u624B\uFF1A\u62D6\u5230\u8D34\u89D2\u4F4D\u7F6E\u9644\u8FD1\u5C31\u5438\u9644\u56DE\u53BB \u2014\u2014 \u6709\u8D39\u7528\u80F6\u56CA\u5C31\u5438\u9644\u5230\"\u8DDF\u968F\u5B83\u7684\u4F4D\u7F6E\"\uFF0C\n * \u6CA1\u6709\u5C31\u5438\u9644\u5230\u53F3\u4E0B\u89D2 20/20\uFF1B\u79BB\u5F97\u8FDC\u5C31\u7559\u5728\u539F\u5730\uFF08\u4F4D\u7F6E\u5F52\u7528\u6237\uFF09\u3002\n */\n function settlePillDrop(rect) {\n var target = pillAnchorRect()\n var near =\n Math.abs(rect.left - target.left) <= PILL_SNAP_RADIUS && Math.abs(rect.top - target.top) <= PILL_SNAP_RADIUS\n if (!near) {\n env.pillDock = 'free'\n pillUserPlaced = true\n clampFreePill()\n savePillPos() // \u4F4D\u7F6E\u5F52\u7528\u6237\uFF1A\u8BB0\u4F4F\u5B83\uFF08\u5B58 host \u4E0A\uFF09\n env.pill.removeAttribute('data-drag')\n return false\n }\n // \u5438\u9644\uFF1A\u8981\"\u6ED1\u56DE\u53BB\"\u800C\u4E0D\u662F\u77AC\u79FB\u3002\n // left/top \u4E0E right/bottom \u4E4B\u95F4\u4E0D\u53EF\u63D2\u503C\uFF08left:124px \u2192 auto \u4F1A\u76F4\u63A5\u8DF3\uFF09\uFF0C\u6240\u4EE5\u5148\u628A\u76EE\u6807\u4F4D\u7F6E\n // \u5199\u6210 left/top \u8BA9\u8FC7\u6E21\u8DD1\u5B8C\uFF0C\u7A97\u53E3\u7ED3\u675F\uFF08PILL_SNAP_MS\uFF09\u518D\u4EA4\u8FD8\u7ED9 right/bottom \u90A3\u5957\u7A33\u6001\u5B9A\u4F4D\u3002\n var snappedTo = pillAnchorRect()\n env.pillDock = 'anchor'\n env.pillFreeRight = null\n clearPillPos() // \u5438\u9644\u56DE\u53F3\u4E0B\u89D2 = \u9ED8\u8BA4\u4F4D\u7F6E\uFF0C\u4E0D\u7528\u8BB0\u4E86\n env.pillSnapUntil = Date.now() + PILL_SNAP_MS\n // \u62D6\u52A8\u65F6\u4F4D\u7F6E\u7531 right \u63A7\u5236\uFF1B\u5438\u9644\u6ED1\u884C\u7531 left \u63A7\u5236\u3002\u5148\u5728\u7981\u7528\u8FC7\u6E21\u65F6\n // \u628A\u5F53\u524D\u51E0\u4F55\u4F4D\u7F6E\u4EA4\u7ED9 left\uFF0C\u518D\u542F\u7528\u8FC7\u6E21\u5199\u76EE\u6807\u4F4D\u7F6E\uFF0C\u907F\u514D auto \u5C5E\u6027\u77AC\u8DF3\u3002\n env.pill.style.left = Math.round(rect.left) + 'px'\n env.pill.style.top = Math.round(rect.top) + 'px'\n env.pill.style.right = 'auto'\n env.pill.style.bottom = 'auto'\n void env.pill.offsetWidth\n env.pill.removeAttribute('data-drag')\n env.pill.style.left = Math.round(snappedTo.left) + 'px'\n env.pill.style.top = Math.round(snappedTo.top) + 'px'\n env.later(function () {\n env.pillSnapUntil = 0\n if (env.pillDock === 'anchor') placePill()\n }, PILL_SNAP_MS)\n return true\n }\n\n /**\n * \u8D34\u4F4D\u7F6E\u7684\u8282\u594F\uFF1A**\u81EA\u9002\u5E94\u9000\u907F**\u3002\n *\n * \u91CF\u4E00\u6B21\u5F88\u4FBF\u5B9C\uFF08\u5B9E\u6D4B 500 \u6B21\u5171 2ms \u2248 4\u00B5s/\u6B21\uFF0C\u4E14 0 \u6B21 DOM \u5199\u5165\uFF09\uFF0C\u4F46\u4E0D\u8BE5\u6C38\u8FDC\u6309\u56FA\u5B9A\u9891\u7387\u7A7A\u8F6C\uFF1A\n * \u4F4D\u7F6E/\u5BBD\u5EA6\u6CA1\u53D8\u5C31\u9010\u6B21\u62C9\u957F\u95F4\u9694\uFF082s \u2192 3s \u2192 4.5s \u2026 \u5C01\u9876 60s\uFF09\uFF0C\u4E00\u65E6\u53D1\u73B0\u53D8\u5316\u7ACB\u523B\u56DE\u5230 2s\u3002\n * \u8FD9\u6837\"\u8D39\u7528\u6570\u5B57\u5728\u6DA8\u3001\u9762\u677F\u5728\u5F00\u5408\"\u65F6\u8DDF\u5F97\u7D27\uFF0C\u957F\u65F6\u95F4\u4E0D\u52A8\u65F6\u51E0\u4E4E\u4E0D\u5360\u4EFB\u4F55\u4E1C\u897F\u3002\n */\n /**\n * \u8D39\u7528\u80F6\u56CA\u5C3A\u5BF8\u4E00\u53D8\u5C31\u7ACB\u523B\u91CD\u8D34\uFF08\u6D4F\u89C8\u5668\u6709 ResizeObserver \u5C31\u7528\u5B83\uFF0C\u4E8B\u4EF6\u9A71\u52A8\u3001\u96F6\u7A7A\u8F6C\uFF09\u3002\n *\n * \u5149\u9760\u8F6E\u8BE2\u7684\u8BDD\uFF0C\"\u8D39\u7528\u6570\u5B57\u53D8\u957F\"\u8981\u7B49\u4E0B\u4E00\u6B21 tick \u624D\u88AB\u53D1\u73B0\u2014\u2014\u9000\u907F\u5230 15s \u65F6\u5C31\u662F\u6700\u591A 15s \u7684\u9519\u4F4D\u3002\n * \u89C2\u5BDF\u5668\u8D1F\u8D23\"\u7ACB\u523B\"\uFF0C\u8F6E\u8BE2\u9000\u5316\u6210\u515C\u5E95\uFF08\u53D1\u73B0\u8FDF\u5230\u6302\u8F7D\u7684\u63D2\u4EF6\u3001\u4EE5\u53CA\u6CA1\u6709 ResizeObserver \u7684\u73AF\u5883\uFF09\u3002\n */\n function ensureResizeWatch() {\n if (typeof ResizeObserver !== 'function' || !env.pillHost || env.pillHost === env.pillWatched) return\n if (env.pillObserver) {\n try {\n env.pillObserver.disconnect()\n } catch (error) {\n /* noop */\n }\n }\n env.pillWatched = env.pillHost\n try {\n env.pillObserver = new ResizeObserver(function () {\n env.pillPollDelay = env.PILL_POLL_MIN\n placePill()\n })\n env.pillObserver.observe(env.pillHost)\n } catch (error) {\n env.pillObserver = null\n }\n }\n\n function pillPollStep() {\n var changed = placePill()\n ensureResizeWatch()\n env.pillPollDelay = changed ? env.PILL_POLL_MIN : Math.min(env.PILL_POLL_MAX, Math.round(env.pillPollDelay * 1.5))\n return env.pillPollDelay\n }\n\n function schedulePillPlacer() {\n env.pillPlacerId = setTimeout(function () {\n pillPollStep()\n schedulePillPlacer()\n }, env.pillPollDelay)\n }\n\n /**\n * \u70B9\u80F6\u56CA\uFF1A**\u5F00\u5173\u5C0F\u7A97**\u3002\n * \u5173\u7740 \u2192 \u56DE\u5230\"\u6700\u8FD1\u4E00\u6B21\u5C0F\u7A97\"\u7684\u72B6\u6001\uFF08\u5185\u5B58\u91CC\u6CA1\u6709\u4E86\u5C31\u56DE\u653E host \u4E0A\u7684\u6700\u8FD1\u4E00\u6761\uFF09\uFF1B\n * \u5F00\u7740 \u2192 \u6536\u8D77\uFF08\u518D\u70B9\u4E00\u6B21\u53C8\u80FD\u539F\u6837\u6253\u5F00\uFF0C\u4E0D\u4F1A\u91CD\u65B0\u8BF7\u6C42\uFF09\u3002\n */\n function reopenLast() {\n if (env.panelOpen) {\n // \u518D\u70B9\u4E00\u6B21 = \u6536\u8D77\uFF08\u548C\u53F3\u4E0A\u89D2 \u2715 \u540C\u4E00\u6761\u8DEF\u5F84\uFF1A\u8FD8\u5728\u98DE\u7684\u8BF7\u6C42\u4F1A\u88AB\u4E2D\u6B62\u5E76\u8BB0\u6210\u300C\u5DF2\u505C\u6B62\u300D\uFF09\n env.closePanel()\n return\n }\n var hasLive = !!(\n env.state.payload &&\n (env.state.parts.translation ||\n env.state.parts.detail ||\n env.state.turns.length > 0 ||\n env.state.phase === 'error' ||\n env.state.phase === 'paused' ||\n env.state.phase === 'loading' ||\n env.state.phase === 'streaming')\n )\n if (hasLive) {\n // \u539F\u4F4D\u91CD\u5F00\uFF1A\u4E00\u4E2A\u5B57\u90FD\u4E0D\u91CD\u65B0\u8BF7\u6C42\uFF0C\u8FDE\u8FDB\u5EA6\u90FD\u662F\u521A\u624D\u90A3\u4E2A\n env.showPanel(rectOfPill())\n env.paint()\n env.renderTurns()\n return\n }\n // \u5185\u5B58\u91CC\u6CA1\u6709\uFF1A\u95EE host \u8981\u6700\u8FD1\u4E00\u6761\u5C0F\u7A97\u8BB0\u5F55\uFF08A\u2032 \u843D\u76D8\u7684\u5386\u53F2\uFF09\uFF0C\u56DE\u653E\u5B83\n env.setStatus('\u6B63\u5728\u53D6\u56DE\u6700\u8FD1\u4E00\u6B21\u5C0F\u7A97\u2026')\n fetch(HISTORY)\n .then(function (response) {\n return response.json()\n })\n .then(function (data) {\n var entry = data && data.ok === true && data.entries && data.entries[0] ? data.entries[0] : null\n if (!entry) {\n env.setStatus('\u8FD8\u6CA1\u6709\u53EF\u56DE\u653E\u7684\u5C0F\u7A97\uFF1A\u5148\u9009\u4E00\u6BB5\u6587\u5B57\u8BD5\u8BD5')\n return\n }\n env.loadHistoryEntry(entry.key, rectOfPill())\n })\n .catch(function () {\n env.setStatus('\u53D6\u56DE\u6700\u8FD1\u4E00\u6B21\u5C0F\u7A97\u5931\u8D25')\n })\n }\n\n /** \u80F6\u56CA\u7684\u5C4F\u5E55\u77E9\u5F62\uFF08\u5F53\u4F5C\u9762\u677F\u7684\u951A\u70B9\uFF1A\u9762\u677F\u4F1A\u843D\u5728\u5B83\u4E0A\u65B9\uFF09\u3002 */\n function rectOfPill() {\n var rect = env.pill.getBoundingClientRect()\n return { left: rect.left, top: rect.top, right: rect.right, bottom: rect.bottom, width: rect.width, height: rect.height }\n }\n return {\n beginPillDrag,\n reopenLast,\n notePillActivity,\n loadPillPos,\n placePill,\n ensureResizeWatch,\n schedulePillPlacer,\n paintPill,\n get pillPosAsked() { return pillPosAsked },\n set pillPosAsked(value) { pillPosAsked = value },\n get pillUserPlaced() { return pillUserPlaced },\n set pillUserPlaced(value) { pillUserPlaced = value },\n pillStarPathAt,\n get pillStarP() { return pillStarP },\n set pillStarP(value) { pillStarP = value },\n get pillStarTargetP() { return pillStarTargetP },\n set pillStarTargetP(value) { pillStarTargetP = value },\n get pillStarStarts() { return pillStarStarts },\n set pillStarStarts(value) { pillStarStarts = value },\n get pillStarLog() { return pillStarLog },\n set pillStarLog(value) { pillStarLog = value },\n animatePillStar,\n get pillStarTimer() { return pillStarTimer },\n set pillStarTimer(value) { pillStarTimer = value },\n paintPillStar,\n pillStarEase,\n pillCanBall,\n collapsePill,\n pillPollStep,\n schedulePillIdle,\n rectOfPill,\n }\n}\n", "import { isDarkSurface, renderRich, splitSections } from './render.js'\nimport { HISTORY } from './constants.js'\nimport { el, listen } from './dom.js'\n\n/** history state and operations; dependencies are supplied as live node/callback accessors. */\nexport function createHistoryController(env) {\n\n /**\n * \u5265\u6389\u6A21\u578B\u4F2A\u9020\u7684\u5DE5\u5177\u8C03\u7528\u6B8B\u6E23\u3002\n *\n * \u6CA1\u6709\u5DE5\u5177\u53EF\u7528\u65F6\uFF0C\u6A21\u578B\u4F1A\u7167\u7740\u81EA\u5DF1\u7684\u4E60\u60EF\u628A\u8C03\u7528\"\u5199\"\u6210\u6B63\u6587\uFF08\u5B9E\u6D4B\u89C1\u8FC7\n * `<ds_safety_tool_call><tool_name>web_search</tool_name>\u2026` \u6574\u6BB5\u55B7\u51FA\u6765\uFF09\u3002\n * \u8FD9\u91CC\u5728**\u6E32\u67D3\u65F6**\u6E05\u7406\uFF08\u4E0D\u6539 state.raw\uFF0C\u6D41\u5F0F\u671F\u95F4\u534A\u622A\u6807\u7B7E\u4E5F\u4E0D\u4F1A\u4E22\u5185\u5BB9\uFF09\u3002\n */\n /**\n * \u2500\u2500 \u5386\u53F2\u6298\u53E0 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * \u8FFD\u95EE\u65F6\u5386\u53F2\u662F\"\u539F\u6587\u9010\u5B57\u5E26\u4E0A\"\uFF0C\u4E8E\u662F\u6574\u9875 HTML\uFF08\u5B9E\u6D4B 8k \u5B57 \u2248 2,150 tokens\uFF09\n * \u4F1A\u5728\u4E4B\u540E**\u6BCF\u4E00\u8F6E**\u91CD\u53D1\u4E00\u6B21\uFF0C\u8FD8\u5360\u6389 20 \u6761\u7A97\u53E3\u91CC\u7684\u4F4D\u7F6E\u3002\n *\n * \u8FD9\u91CC\u628A\u5B83\u6298\u53E0\u6210**\u7ED3\u6784\u5316 Markdown**\uFF08\u6807\u9898/\u8868\u683C\u884C\u5217/\u5217\u8868/\u5F3A\u8C03/\u4EE3\u7801\u90FD\u4FDD\u7559\uFF0C\n * \u53EA\u4E22 <style>\u3001class\u3001\u5185\u8054 style\u3001SVG \u8DEF\u5F84\u8FD9\u4E9B\"\u6E32\u67D3\u5B9E\u73B0\u7EC6\u8282\"\uFF09\uFF0C\n * \u5B9E\u6D4B\uFF1A8,021 \u5B57 \u2192 1,146 \u5B57\uFF0C\u53EF\u89C1\u6587\u672C\u8986\u76D6\u7387 100.0%\uFF0C\u22482,150 \u2192 \u2248860 tokens\u3002\n *\n * \u4E09\u6761\u8FB9\u754C\uFF1A\n * \u2460 \u53EA\u4F5C\u7528\u4E8E**\u53D1\u5386\u53F2**\u8FD9\u4E00\u6B65 \u2014\u2014 \u9762\u677F\u91CC\u6E32\u67D3\u7684\u3001\u4EE3\u7801\u89C6\u56FE\u590D\u5236\u7684\u6C38\u8FDC\u662F\u539F\u6587\uFF1B\n * \u2461 \u6298\u4E00\u6B21\u5C31\u7F13\u5B58\u5728\u90A3\u4E00\u8F6E\uFF08`turn.foldedCache`\uFF09\uFF0C\u4E4B\u540E\u6BCF\u8F6E\u76F4\u63A5\u590D\u7528\uFF0C\u4E0D\u91CD\u6298\uFF1B\n * \u2462 **\u6700\u8FD1\u4E00\u8F6E\u4FDD\u6301\u539F\u6837** \u2014\u2014 \u7528\u6237\u8BF4\"\u628A\u4E0A\u4E00\u9875\u7684\u9AD8\u4EAE\u6539\u6210\u84DD\u8272\"\u65F6\u4ECD\u80FD\u6539\u5230\u7248\u5F0F\u3002\n */\n var FOLD_HISTORY_KEEP_LATEST = true\n\n var foldCount = 0\n\n var HTML_VOID_TAGS = {\n area: 1, base: 1, br: 1, col: 1, embed: 1, hr: 1, img: 1, input: 1,\n link: 1, meta: 1, param: 1, source: 1, track: 1, wbr: 1,\n }\n\n /**\n * \u6781\u7B80 HTML \u89E3\u6790\uFF08\u6B63\u5219\u5207\u8BCD + \u6808\u5EFA\u6811\uFF09\u3002\n *\n * \u6545\u610F**\u4E0D\u7528 DOMParser**\uFF1A\u90A3\u6837\u5728 Node \u5355\u6D4B\u91CC\u53EA\u80FD\u8D70\u964D\u7EA7\u8DEF\u5F84\uFF0C\"\u6D4B\u8BD5\u901A\u8FC7\"\u548C\"\u7EBF\u4E0A\u884C\u4E3A\"\u5C31\u6210\u4E86\u4E24\u5957\u4EE3\u7801\u3002\n * \u81EA\u5DF1\u89E3\u6790\u4E4B\u540E\uFF0C\u6D4F\u89C8\u5668\u4E0E\u5355\u6D4B\u8DD1\u7684\u662F\u540C\u4E00\u4EFD\u5B9E\u73B0\uFF08\u4EE3\u4EF7\u662F\u5BF9\u7578\u5F62 HTML \u7684\u5BB9\u9519\u4E0D\u5982\u6D4F\u89C8\u5668\uFF0C\u53EF\u63A5\u53D7\uFF09\u3002\n */\n function parseHtmlLite(html) {\n var root = { tag: '#root', attrs: {}, children: [] }\n var stack = [root]\n var re = /<!--[\\s\\S]*?-->|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>|<[^>]+>|[^<]+/g\n var token\n while ((token = re.exec(String(html || ''))) !== null) {\n var chunk = token[0]\n if (chunk.charAt(0) !== '<') {\n stack[stack.length - 1].children.push({ tag: '#text', text: chunk, attrs: {}, children: [] })\n continue\n }\n if (chunk.charAt(1) === '!') continue // \u6CE8\u91CA / doctype\n if (chunk.charAt(1) === '/') {\n var closing = chunk.slice(2, -1).replace(/\\s+/g, '').toLowerCase()\n for (var i = stack.length - 1; i > 0; i -= 1) {\n if (stack[i].tag === closing) {\n stack.length = i\n break\n }\n }\n continue\n }\n var nameMatch = /^<([a-zA-Z][-a-zA-Z0-9:]*)/.exec(chunk)\n if (!nameMatch) continue\n var tag = nameMatch[1].toLowerCase()\n var node = { tag: tag, attrs: parseHtmlAttrs(chunk), children: [] }\n stack[stack.length - 1].children.push(node)\n if (!/\\/>$/.test(chunk) && !HTML_VOID_TAGS[tag]) stack.push(node)\n }\n return root\n }\n\n function parseHtmlAttrs(chunk) {\n var attrs = {}\n var re = /([a-zA-Z_:][-a-zA-Z0-9_:.]*)\\s*=\\s*(\"([^\"]*)\"|'([^']*)'|([^\\s\"'>]+))/g\n var m\n while ((m = re.exec(chunk)) !== null) {\n attrs[m[1].toLowerCase()] = m[3] !== undefined ? m[3] : m[4] !== undefined ? m[4] : m[5]\n }\n if (/\\shidden(\\s|>|\\/)/i.test(chunk)) attrs.hidden = ''\n return attrs\n }\n\n function elementChildren(node) {\n var out = []\n var kids = node.children || []\n for (var i = 0; i < kids.length; i += 1) if (kids[i].tag !== '#text') out.push(kids[i])\n return out\n }\n\n /** \u6536\u96C6\u5B50\u6811\u91CC\u6240\u6709\u6307\u5B9A\u6807\u7B7E\u3002 */\n function collectByTag(node, tag) {\n var found = []\n var kids = node.children || []\n for (var i = 0; i < kids.length; i += 1) {\n var child = kids[i]\n if (child.tag === '#text') continue\n if (child.tag === tag) found.push(child)\n var deeper = collectByTag(child, tag)\n for (var d = 0; d < deeper.length; d += 1) found.push(deeper[d])\n }\n return found\n }\n\n /** \u539F\u6837\u6587\u672C\uFF08\u4EE3\u7801\u5757\u7528\uFF1A\u4FDD\u7559\u6362\u884C\uFF0C\u4E0D\u505A\u7A7A\u767D\u6298\u53E0\uFF09\u3002 */\n function textOfRaw(node) {\n var text = ''\n var kids = node.children || []\n for (var i = 0; i < kids.length; i += 1) {\n var child = kids[i]\n if (child.tag === '#text') text += String(child.text || '')\n else text += textOfRaw(child)\n }\n return text\n }\n\n /** \u6298\u53E0\u5931\u8D25\u65F6\u7684\u6700\u540E\u515C\u5E95\uFF1A\u53EA\u53BB\u6807\u7B7E\u7559\u6587\u5B57\u3002 */\n function stripTagsToText(html) {\n return String(html || '')\n .replace(/<(script|style)[\\s\\S]*?<\\/\\1>/gi, '')\n .replace(/<br\\s*\\/?>/gi, '\\n')\n .replace(/<\\/(p|div|li|tr|h[1-6]|section|blockquote)>/gi, '\\n')\n .replace(/<[^>]+>/g, '')\n .replace(/&nbsp;/g, ' ')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&amp;/g, '&')\n .replace(/[ \\t]+\\n/g, '\\n')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim()\n }\n\n /** \u628A\u6574\u9875 HTML \u6298\u6210\u7ED3\u6784\u5316 Markdown\uFF08\u89C4\u5219\u89C1 docs/fold-lab.html\uFF09\u3002 */\n function foldHtmlToMarkdown(html) {\n var root = parseHtmlLite(html)\n var out = []\n var headings = {}\n var tableCount = 0\n var chartCount = 0\n\n function clean(text) {\n return String(text || '').replace(/\\s+/g, ' ').trim()\n }\n function push(line) {\n if (clean(line)) out.push(String(line).replace(/[ \\t]+$/, ''))\n }\n function attrsOf(node) {\n return node.attrs || {}\n }\n function isHidden(node) {\n var attrs = attrsOf(node)\n var style = attrs.style || ''\n if (/display\\s*:\\s*none/i.test(style) || /visibility\\s*:\\s*hidden/i.test(style)) return true\n return attrs.hidden !== undefined || attrs['aria-hidden'] === 'true'\n }\n function looksHighlighted(node) {\n var attrs = attrsOf(node)\n return (\n /highlight|accent|strong|emph|mark\\b|hl\\b/i.test(attrs.class || '') ||\n /background(-color)?\\s*:\\s*(#|rgb|hsl|var)/i.test(attrs.style || '')\n )\n }\n /** \u884C\u5185\u5185\u5BB9\uFF1A\u4FDD\u7559\u5F3A\u8C03/\u94FE\u63A5/\u4EE3\u7801\uFF0C\u4E22\u6389\u6807\u7B7E\u672C\u8EAB\u3002 */\n function inline(node) {\n var text = ''\n var kids = node.children || []\n for (var i = 0; i < kids.length; i += 1) {\n var child = kids[i]\n if (child.tag === '#text') {\n text += String(child.text || '').replace(/\\s+/g, ' ')\n continue\n }\n var tag = child.tag\n if (tag === 'svg' || tag === 'canvas') {\n chartCount += 1\n text += '[\u56FE\u793A]'\n continue\n }\n if (tag === 'style' || tag === 'script' || tag === 'noscript' || tag === 'iframe') continue\n var inner = inline(child)\n if (!clean(inner)) continue\n if (tag === 'strong' || tag === 'b') text += '**' + clean(inner) + '**'\n else if (tag === 'em' || tag === 'i') text += '*' + clean(inner) + '*'\n else if (tag === 'code') text += '`' + clean(inner) + '`'\n else if (tag === 'br') text += ' '\n else if (tag === 'a') {\n var href = String(attrsOf(child).href || '').trim()\n text += href && href.length <= 80 && href.charAt(0) !== '#' ? '[' + clean(inner) + '](' + href + ')' : clean(inner)\n } else if (looksHighlighted(child)) text += '**' + clean(inner) + '**'\n else text += inner\n }\n return text\n }\n function textOf(node) {\n return clean(inline(node))\n }\n function walk(parent, depth) {\n var kids = elementChildren(parent)\n for (var i = 0; i < kids.length; i += 1) {\n var node = kids[i]\n var tag = node.tag\n if (tag === 'style' || tag === 'script' || tag === 'noscript' || tag === 'head' || tag === 'meta' ||\n tag === 'link' || tag === 'iframe' || tag === 'template') continue\n if (isHidden(node)) continue\n if (tag === 'svg' || tag === 'canvas') {\n chartCount += 1\n push('[\u56FE\u793A]')\n continue\n }\n if (/^h[1-6]$/.test(tag)) {\n var level = Number(tag.charAt(1))\n headings[level] = (headings[level] || 0) + 1\n push(new Array(level + 1).join('#') + ' ' + textOf(node))\n continue\n }\n if (tag === 'p') {\n push(inline(node))\n continue\n }\n if (tag === 'hr') {\n push('---')\n continue\n }\n if (tag === 'ul' || tag === 'ol') {\n var index = 0\n var items = elementChildren(node)\n for (var j = 0; j < items.length; j += 1) {\n if (items[j].tag !== 'li') continue\n index += 1\n var body = textOf(items[j])\n if (body) push(new Array(depth + 1).join(' ') + (tag === 'ol' ? index + '. ' : '- ') + body)\n }\n continue\n }\n if (tag === 'table') {\n tableCount += 1\n var rows = collectByTag(node, 'tr')\n for (var r = 0; r < rows.length; r += 1) {\n var cells = elementChildren(rows[r])\n if (!cells.length) continue\n var parts = []\n for (var c = 0; c < cells.length; c += 1) parts.push(textOf(cells[c]) || '')\n push('| ' + parts.join(' | ') + ' |')\n if (r === 0) {\n var dashes = []\n for (var d = 0; d < parts.length; d += 1) dashes.push('---')\n push('|' + dashes.join('|') + '|')\n }\n }\n continue\n }\n if (tag === 'pre') {\n var code = String(textOfRaw(node) || '').replace(/^\\n+/, '').replace(/\\s+$/, '')\n var cut = code.length > 400\n push('```\\n' + (cut ? code.slice(0, 400) + '\\n\u2026(\u5DF2\u622A\u65AD ' + (code.length - 400) + ' \u5B57)' : code) + '\\n```')\n continue\n }\n if (tag === 'blockquote') {\n var quoted = textOf(node)\n if (quoted) push('> ' + quoted)\n continue\n }\n if (tag === 'img') {\n var alt = clean(attrsOf(node).alt)\n if (alt) push('[\u56FE\u7247: ' + alt + ']')\n continue\n }\n if (tag === 'figcaption') {\n var caption = textOf(node)\n if (caption) push('\uFF08\u56FE\u6CE8\uFF1A' + caption + '\uFF09')\n continue\n }\n if (tag === 'details') {\n var summaryNode = null\n var inner = elementChildren(node)\n for (var si = 0; si < inner.length; si += 1) if (inner[si].tag === 'summary') summaryNode = inner[si]\n push('### ' + (summaryNode ? textOf(summaryNode) : '\u8BE6\u60C5'))\n walk(node, depth + 1)\n continue\n }\n if (/^(div|section|article|main|header|footer|aside|nav|figure|form|label|span|center|body|html|picture|dl|dd|dt)$/.test(tag)) {\n // \u5BB9\u5668\u91CC\u7684**\u76F4\u63A5\u6587\u672C**\u8981\u5148\u6536\u8FDB\u6765\uFF1A<div>\u53EA\u6709\u4E00\u6BB5\u6587\u5B57</div> \u975E\u5E38\u5E38\u89C1\uFF0C\n // \u800C walk() \u53EA\u904D\u5386\u5143\u7D20\u5B50\u8282\u70B9\uFF0C\u6F0F\u6389\u5B83\u4F1A\u4E22\u5185\u5BB9\uFF08\u5B9E\u6D4B\u8E29\u8FC7\uFF09\n var direct = ''\n var rawKids = node.children || []\n for (var dk = 0; dk < rawKids.length; dk += 1) {\n if (rawKids[dk].tag === '#text') direct += String(rawKids[dk].text || '')\n }\n if (clean(direct)) push(direct)\n walk(node, depth)\n continue\n }\n var rest = textOf(node)\n if (rest) push(rest)\n }\n }\n walk(root, 0)\n var body = out.join('\\n')\n\n // \u4E00\u884C\u7248\u5F0F\u6458\u8981\uFF1A\u628A\u6298\u53E0\u4E22\u6389\u7684\"\u89C6\u89C9\u8BED\u4E49\"\u8865\u56DE\u6765\uFF08\u660E\u6697/\u4E3B\u8272/\u7ED3\u6784\u89C4\u6A21\uFF09\n var raw = String(html || '')\n var colors = raw.match(/#[0-9a-f]{6}/gi) || []\n var primary = '\u2014'\n var best = -1\n for (var ci = 0; ci < colors.length; ci += 1) {\n var hits = raw.split(colors[ci]).length - 1\n if (hits > best) {\n best = hits\n primary = colors[ci].toLowerCase()\n }\n }\n var dark = /background(-color)?\\s*:\\s*#(0|1)[0-9a-f]{5}|background(-color)?\\s*:\\s*rgb\\(\\s*(1?[0-9]|2[0-9])\\s*,/i.test(raw)\n var headBits = []\n var levels = Object.keys(headings).sort()\n for (var hi = 0; hi < levels.length; hi += 1) headBits.push(levels[hi] + ' \u7EA7 \u00D7' + headings[levels[hi]])\n var highlights = Math.round((body.match(/\\*\\*/g) || []).length / 2)\n var summary = '\uFF08\u7248\u5F0F\u6458\u8981\uFF1A' + (dark ? '\u6DF1\u8272' : '\u6D45\u8272') + '\u7248\uFF1B\u4E3B\u8272 ' + primary +\n (headBits.length ? '\uFF1B\u6807\u9898 ' + headBits.join('\u3001') : '') +\n (tableCount ? '\uFF1B\u5BF9\u6BD4\u8868 ' + tableCount + ' \u5F20' : '') +\n (chartCount ? '\uFF1B\u56FE\u793A ' + chartCount + ' \u4E2A' : '') +\n (highlights ? '\uFF1B\u5F3A\u8C03/\u9AD8\u4EAE ' + highlights + ' \u5904' : '') + '\uFF09'\n return body + '\\n\\n' + summary\n }\n\n /**\n * \u4F9B**\u53D1\u5386\u53F2**\u4F7F\u7528\u7684\u6587\u672C\uFF1A\u628A ```html \u6574\u9875\u6298\u53E0\u6210 Markdown\uFF1B\u6CA1\u6709\u6574\u9875 HTML \u5C31\u539F\u6837\u8FD4\u56DE\u3002\n * \u6298\u53E0\u5931\u8D25\u5B81\u53EF\u8FD4\u56DE\u539F\u6587 \u2014\u2014 \u591A\u82B1 token \u4E5F\u6BD4\u4E22\u5185\u5BB9\u5F3A\u3002\n */\n function foldForHistory(text) {\n var src = String(text || '')\n if (src.indexOf('```html') < 0) return src\n foldCount += 1\n function one(whole, code) {\n try {\n return foldHtmlToMarkdown(code)\n } catch (error) {\n return whole\n }\n }\n src = src.replace(/```html[ \\t]*\\n([\\s\\S]*?)```/g, one)\n // \u8FD8\u6709\u6CA1\u95ED\u5408\u7684\u56F4\u680F\uFF08\u4F8B\u5982\"\u524D\u60C5\"\u91CC\u88AB\u622A\u65AD\u7684 HTML\uFF09\uFF1A\u4ECE\u56F4\u680F\u4E00\u76F4\u6298\u5230\u7ED3\u5C3E\n src = src.replace(/```html[ \\t]*\\n([\\s\\S]*)$/, one)\n return src\n }\n\n /**\n * \u53D6\u67D0\u4E00\u8F6E\"\u53D1\u5386\u53F2\"\u7528\u7684\u6587\u672C\uFF1A\u6298\u4E00\u6B21\u7F13\u5B58\u4E00\u6B21\uFF0C\u4E4B\u540E\u6BCF\u8F6E\u76F4\u63A5\u590D\u7528\uFF08\u4E0D\u91CD\u6298\uFF09\u3002\n * streaming \u4E2D\u7684\u90A3\u4E00\u8F6E\u4E0D\u6298\u4E5F\u4E0D\u7F13\u5B58\uFF08\u5386\u53F2\u672C\u6765\u4E5F\u4E0D\u542B\u6700\u540E\u4E24\u6761\uFF09\u3002\n */\n function historyTextOf(turn, keepRaw) {\n if (!turn) return ''\n // \u7528\u6237\u90A3\u8F6E\uFF1A\u53D1\u51FA\u53BB\u7684\u662F\u4EC0\u4E48\u5C31\u5E26\u56DE\u4EC0\u4E48\uFF08\u5E26\u5F15\u7528\u65F6\u662F\u62FC\u597D\u7684\u90A3\u4EFD\uFF0C\u89C1 composeQuestion\uFF09\u3002\n // \u5F15\u7528\u5757\u5FC5\u987B\u8FDB\u5386\u53F2 \u2014\u2014 \u5426\u5219\u4E0B\u4E00\u8F6E\u6A21\u578B\u53EA\u770B\u5230\"\u4E0A\u9762\u90A3\u6BB5\u5462\uFF1F\"\uFF0C\u800C\"\u90A3\u6BB5\"\u5DF2\u7ECF\u5728\u4E0A\u4E0B\u6587\u91CC\u6D88\u5931\u4E86\u3002\n if (turn.role === 'user') return env.sentTextOf(turn)\n if (keepRaw) return turn.text\n if (typeof turn.foldedCache === 'string') return turn.foldedCache\n if (turn.streaming === true) return turn.text\n var folded = foldForHistory(turn.text)\n turn.foldedCache = folded\n return folded\n }\n\n /**\n * \u5F53\u524D\u9762\u677F\u5E95\u8272\u662F\u6DF1\u8FD8\u662F\u6D45\uFF08'dark' | 'light'\uFF09\u3002\n *\n * \u7528\u9014\uFF1A\u7F51\u9875\u8F93\u51FA\u65F6\u544A\u8BC9 host \u8BE5\u6309\u54EA\u5957\u914D\u8272\u751F\u6210\u9875\u9762 \u2014\u2014 \u6DF1\u8272 Harness \u91CC\u7ED9\u4E00\u5F20\u767D\u5E95\u9875\u9762\u5F88\u523A\u773C\u3002\n * \u5224\u636E\u4F18\u5148\u7528\u9762\u677F\u81EA\u5DF1\u7684 `data-theme`\uFF08painter \u5DF2\u7ECF\u6309\u5B9E\u9645\u5E95\u8272\u8BBE\u8FC7\uFF09\uFF0C\n * \u6CA1\u6709\u5C31\u73B0\u7B97\u4E00\u6B21 `isDarkSurface`\uFF0C\u518D\u4E0D\u884C\u6309\u6D45\u8272\u515C\u5E95\u3002\n */\n function currentSurfaceTheme() {\n try {\n // \u2460 \u5148\u8BFB **DSH \u81EA\u5DF1\u7684\u4FE1\u53F7**\uFF1A`body[data-ds-dark-theme]`\u3002\n // \u8FD9\u662F DSH \u628A\"\u5F53\u524D\u914D\u8272\u65B9\u6848\"\u6295\u5F71\u5230 document \u7684\u7ED3\u679C \u2014\u2014 \u7528\u6237\u9009\u7684\u662F\n // \u300C\u6D45\u8272 / \u6DF1\u8272 / \u8DDF\u968F\u7CFB\u7EDF\u300D\u54EA\u4E00\u6863\u90FD\u65E0\u6240\u8C13\uFF0C\u8FD9\u91CC\u62FF\u5230\u7684\u90FD\u662F**\u6700\u7EC8\u7ED3\u8BBA**\u3002\n // \u8E29\u8FC7\u7684\u5751\uFF1A\u4E00\u5F00\u59CB\u53EA\u770B\u9762\u677F\u7684\u5408\u6210\u5E95\u8272\uFF08isDarkSurface\uFF09\u2014\u2014 \u9762\u677F\u5E95\u8272\u53D6\u81EA DSH \u53D8\u91CF\u3001\n // \u81EA\u8EAB\u4E0E\u7956\u5148\u7684 background-color \u5F80\u5F80\u662F\u900F\u660E\u7684\uFF0C\u4E8E\u662F\u88AB\u7B97\u6210\u6D45\u8272\u3002\n // \u7528\u6237\u5B9E\u6D4B\uFF1A\u5916\u89C2\u8BBE\u4E3A\"\u8DDF\u968F\u7CFB\u7EDF\uFF08\u6697\uFF09\"\u65F6\uFF0C\u751F\u6210\u7684\u7F51\u9875\u5374\u662F\u4EAE\u8272\u3002\n var bodyEl = document.body\n if (bodyEl && bodyEl.getAttribute && bodyEl.getAttribute('data-ds-dark-theme') !== null) return 'dark'\n // \u2461 html \u7684 color-scheme\uFF1ADSH \u540C\u65F6\u7528\u5B83\u9A71\u52A8\u539F\u751F\u63A7\u4EF6\uFF0C\u6D45/\u6DF1\u90FD\u4F1A\u5199\u4E0A\n var rootEl = document.documentElement\n if (rootEl) {\n var scheme = ''\n try {\n scheme = String((window.getComputedStyle(rootEl) || {}).colorScheme || '')\n } catch (error) {\n scheme = ''\n }\n if (!scheme && rootEl.style) scheme = String(rootEl.style.colorScheme || '')\n if (scheme.indexOf('dark') >= 0) return 'dark'\n if (scheme.indexOf('light') >= 0) return 'light'\n }\n // \u2462 \u9762\u677F\u81EA\u5DF1\u7684 data-theme\uFF08painter \u8BBE\u8FC7\uFF09\n var attr = env.panel && env.panel.getAttribute ? env.panel.getAttribute('data-theme') : ''\n if (attr === 'dark' || attr === 'light') return attr\n // \u2463 \u5408\u6210\u5E95\u8272\u515C\u5E95\uFF08\u53EF\u80FD\u8BEF\u5224\uFF0C\u6240\u4EE5\u653E\u5728\u540E\u9762\uFF09\n if (isDarkSurface(env.panel)) return 'dark'\n // \u2464 \u6700\u540E\u624D\u95EE\u7CFB\u7EDF\u504F\u597D\uFF08\"\u8DDF\u968F\u7CFB\u7EDF\"\u4E14\u4E0A\u9762\u90FD\u8BFB\u4E0D\u5230\u65F6\u7684\u515C\u5E95\uFF09\n if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) return 'dark'\n return 'light'\n } catch (error) {\n return 'light'\n }\n }\n\n /** \u5F53\u524D\u53EF\u89C1\u7684\u539F\u6587\u3002\n *\n * \u4EE5\u524D\u8FD9\u91CC\u4F1A\u5265\u6389\"\u4F2A\u9020\u7684\u5DE5\u5177\u8C03\u7528\"\u6587\u672C\uFF08DSML / ds_safety_tool_call\uFF09\uFF0C\n * \u73B0\u5728**\u4E0D\u518D\u505A\u4EFB\u4F55\u6587\u672C\u6E05\u6D17** \u2014\u2014 \u7167\u4E3B\u4F1A\u8BDD\u7684\u505A\u6CD5\uFF1A\u5DE5\u5177\u6BCF\u8F6E\u90FD\u5728\u8BF7\u6C42\u91CC\uFF0C\n * \u6A21\u578B\u8D70\u534F\u8BAE\u5C42\u8868\u8FBE\u8C03\u7528\uFF0C\u6B63\u6587\u91CC\u6839\u672C\u4E0D\u8BE5\u51FA\u73B0\u8FD9\u79CD\u6807\u8BB0\u3002\n * \u6E05\u6D17\u7559\u5728\u90A3\u513F\u53EA\u4F1A\u518D\u5403\u4E00\u6B21\u6B63\u6587\uFF08\u672A\u95ED\u5408\u5C31\u5220\u5230\u7ED3\u5C3E\uFF09\u3002 */\n function visibleRaw() {\n return env.state.raw\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u5C0F\u7A97\u5BF9\u8BDD\u5386\u53F2\uFF08A\u2032\uFF09 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n //\n // \u4E0D\u5EFA\u4F1A\u8BDD\uFF1A\u6761\u76EE\u5B58\u5728\u63D2\u4EF6\u81EA\u5DF1\u7684\u76EE\u5F55\u91CC\uFF08host \u4FA7 LRU 20 \u6761\uFF09\u3002\u8FD9\u91CC\u8D1F\u8D23\u4E09\u4EF6\u4E8B\uFF1A\n // \u2460 \u6BCF\u8F6E\u7ED3\u675F\u628A\u6574\u6BB5\u5BF9\u8BDD\u5199\u56DE\u53BB\uFF08\u7FFB\u8BD1/\u8BE6\u89E3/\u8FFD\u95EE/\u5347\u683C\uFF09\n // \u2461 \u6253\u5F00\u540C\u4E00\u4E2A\u8BCD\u65F6\u5148\u95EE host \u8981\u5386\u53F2\uFF0C\u547D\u4E2D\u5C31\u76F4\u63A5\u56DE\u653E\uFF08\u4E0D\u8C03\u6A21\u578B\uFF09\n // \u2462 \u300C\u6700\u8FD1\u804A\u8FC7\u7684\u300D\u5217\u8868\uFF0C\u70B9\u4E00\u6761\u628A\u90A3\u6BB5\u5BF9\u8BDD\u6574\u4E2A\u8C03\u56DE\u6765\n\n /** \u628A\u5F53\u524D\u72B6\u6001\u5B58\u6210\u4E00\u6761\u5386\u53F2\uFF08\u6574\u6BB5\u8986\u76D6\uFF09\u3002 */\n function saveHistory(options) {\n var payload = env.state.payload\n if (!payload || !env.state.cacheKey) return\n var turns = []\n var exported = env.exportTurns()\n for (var i = 0; i < env.state.turns.length; i += 1) {\n var turn = env.state.turns[i]\n if (turn.hidden === true) continue\n // \u843D\u76D8\u7684\u662F\"\u5B9E\u9645\u53D1\u51FA\u53BB\u7684\u90A3\u4EFD\"\uFF08\u7528\u6237\u90A3\u8F6E\u5E26\u5F15\u7528\u5757\uFF09\uFF1A\u56DE\u653E\u51FA\u6765\u65F6\u8FD9\u8F6E\u5BF9\u8BDD\u662F\u81EA\u6D3D\u7684\n turns.push(exported[i])\n }\n try {\n fetch(HISTORY, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n key: env.state.cacheKey,\n text: payload.text,\n context: payload.context,\n label: payload.label,\n parts: env.state.parts,\n turns: turns,\n toolDigest: env.state.toolDigest,\n pinned: !!(options && options.pinned),\n }),\n }).catch(function () {\n /* \u5386\u53F2\u5199\u5931\u8D25\u4E0D\u5F71\u54CD\u4E3B\u6D41\u7A0B */\n })\n } catch (error) {\n /* noop */\n }\n }\n\n /** \u7528\u4E00\u6761\u5386\u53F2\uFF08\u6216 host \u56DE\u653E\u7ED3\u679C\uFF09\u6062\u590D\u9762\u677F\u3002 */\n function applyHistoryEntry(entry, source) {\n var parts = entry.parts || {}\n env.state.parts = { translation: parts.translation || '', detail: parts.detail || '' }\n env.state.turns = Array.isArray(entry.turns) ? entry.turns.slice() : []\n // \u56DE\u653E\u7684\u662F**\u53E6\u4E00\u6BB5**\u5BF9\u8BDD\uFF1A\u8F93\u5165\u6846\u91CC\u6512\u7684\u5F15\u7528\u8DDF\u7740\u6E05\u6389\n env.clearQuotes()\n env.state.toolDigest = typeof entry.toolDigest === 'string' ? entry.toolDigest : ''\n env.state.cacheKey = entry.key\n env.state.payload = env.buildPayload(entry.text, entry.context, entry.label)\n env.state.kind = env.state.payload.kind\n env.state.stage = ''\n env.state.raw = ''\n env.state.phase = 'done'\n env.state.error = ''\n // \u6253\u5F00\u5386\u53F2/\u547D\u4E2D\u7F13\u5B58\u4E5F\u662F\"\u5DF2\u5B8C\u6210\"\u72B6\u6001 \u2192 \u5149\u6807\u4EA4\u56DE\u8F93\u5165\u6846\n env.askFocusAfterTurn()\n env.state.sharedCache = false\n env.state.fromCache = source === 'local'\n env.state.fromHistory = source !== 'local'\n env.state.elapsed = 0\n env.state.toolBusy = false\n env.state.cacheState = source === 'local' ? 'local' : 'history'\n env.state.chars = (env.state.parts.translation || '').length + (env.state.parts.detail || '').length\n env.quote.textContent = entry.text.length > 240 ? entry.text.slice(0, 240) + ' \u2026' : entry.text\n env.applySectionTitle(env.state.kind, entry.text)\n hideHistoryList()\n env.paint()\n renderTurns()\n }\n\n /**\n * \u6253\u5F00\u67D0\u4E2A\u9009\u533A\u65F6\uFF0C\u5148\u95EE host \u6709\u6CA1\u6709\u8FD9\u6BB5\u5BF9\u8BDD\u7684\u5386\u53F2\uFF1A\n * **\u547D\u4E2D\u5C31\u76F4\u63A5\u56DE\u653E\uFF08\u4E0D\u8C03\u6A21\u578B\uFF09**\uFF0C\u6CA1\u6709\u624D\u56DE\u8C03\u53D1\u8BF7\u6C42\u3002\n * \u8BFB\u5386\u53F2\u8D85\u65F6/\u5931\u8D25\u4E5F\u7167\u6837\u53D1\u8BF7\u6C42\uFF0C\u4E0D\u80FD\u56E0\u4E3A\u5386\u53F2\u63A5\u53E3\u5361\u4F4F\u5C31\u4E0D\u5E72\u6D3B\u3002\n */\n function restoreFromHistory(cacheKey, onMiss) {\n var settled = false\n function miss() {\n if (settled) return\n settled = true\n if (env.state.cacheKey === cacheKey && onMiss) onMiss()\n }\n var timer = setTimeout(miss, 1500)\n env.timers.push(timer)\n try {\n fetch(HISTORY + '?key=' + encodeURIComponent(cacheKey))\n .then(function (response) {\n return response.json()\n })\n .then(function (data) {\n if (settled) return\n // \u671F\u95F4\u7528\u6237\u6362\u4E86\u9009\u533A\uFF1A\u4E22\u5F03\n if (env.state.cacheKey !== cacheKey || env.panelOpen !== true) {\n settled = true\n return\n }\n if (data && data.ok === true && data.entry) {\n settled = true\n clearTimeout(timer)\n applyHistoryEntry(data.entry, 'history')\n return\n }\n miss()\n })\n .catch(miss)\n } catch (error) {\n miss()\n }\n }\n\n /** \u300C\u6700\u8FD1\u804A\u8FC7\u7684\u300D\u5217\u8868\u3002 */\n function hideHistoryList() {\n env.historyList.style.display = 'none'\n env.historyButton.removeAttribute('data-on')\n }\n\n /**\n * \u628A\u5217\u8868\u6446\u5230\u9762\u677F\u65C1\u8FB9\uFF08B \u65B9\u6848\uFF09\uFF1A\n * \u2460 \u4F18\u5148\u53F3\u4FA7\uFF08\u9762\u677F\u53F3\u8FB9\u8FD8\u6709 220px \u7A7A\u95F4\uFF09\n * \u2461 \u653E\u4E0D\u4E0B\u5C31\u7FFB\u5230\u5DE6\u4FA7\n * \u2462 \u4E24\u4FA7\u90FD\u653E\u4E0D\u4E0B\uFF08\u7A84\u5C4F\uFF09\u2192 \u8986\u76D6\u5728\u9762\u677F\u6B63\u6587\u4E0A\uFF0C\u4ECD\u7136**\u4E0D**\u8FDB\u6D88\u606F\u6EDA\u52A8\u533A\n * \u9AD8\u5EA6\u8DDF\u9762\u677F\u5BF9\u9F50\uFF08\u4E0A\u9650\u89C6\u53E3\u9AD8\u5EA6\uFF09\uFF0C\u81EA\u5E26\u6EDA\u52A8\u6761\u3002\n */\n function placeHistoryList() {\n var rect = env.panelLayoutRect()\n var width = 250\n var gap = 10\n var viewportW = window.innerWidth || 1200\n var viewportH = window.innerHeight || 800\n var left = rect.right + gap\n var side = 'right'\n if (left + width > viewportW - 8) {\n left = rect.left - width - gap\n side = 'left'\n }\n if (left < 8) {\n // \u7A84\u5C4F\uFF1A\u8986\u76D6\u5728\u6B63\u6587\u4E0A\uFF08\u5DE6\u5BF9\u9F50\u9762\u677F\u3001\u907F\u5F00\u5934\u90E8\uFF09\n side = 'overlay'\n left = Math.max(8, rect.left + 8)\n width = Math.max(180, Math.min(rect.width - 16, 320))\n }\n var top = Math.max(8, Math.min(rect.top, viewportH - 120))\n var height = Math.max(160, Math.min(rect.height, viewportH - top - 8))\n if (side === 'overlay') {\n top = rect.top + 46\n height = Math.max(160, Math.min(rect.height - 56, viewportH - top - 8))\n }\n env.historyList.setAttribute('data-side', side)\n env.historyList.style.left = Math.round(left) + 'px'\n env.historyList.style.top = Math.round(top) + 'px'\n env.historyList.style.width = Math.round(width) + 'px'\n env.historyList.style.maxHeight = Math.round(height) + 'px'\n }\n\n function toggleHistoryList() {\n if (env.historyList.style.display === 'flex') {\n hideHistoryList()\n return\n }\n env.historyList.style.display = 'flex'\n env.historyButton.setAttribute('data-on', '1')\n placeHistoryList()\n openHistoryList()\n }\n\n /** \u62C9\u53D6\u5E76\u6E32\u67D3\u5386\u53F2\u5217\u8868\uFF08\u5F00\u5173\u6253\u5F00\u65F6\u3001\u4EE5\u53CA\u64A4\u9500\u4E4B\u540E\u90FD\u8D70\u8FD9\u91CC\uFF09\u3002 */\n function openHistoryList() {\n env.historyList.textContent = ''\n env.historyList.appendChild(el('div', 'dsh-sel-historytitle', '\u6700\u8FD1\u804A\u8FC7\u7684\uFF08\u70B9\u4E00\u6761\u8C03\u56DE\u90A3\u6BB5\u5BF9\u8BDD\uFF09'))\n var loading = el('div', 'dsh-sel-historyempty', '\u8BFB\u53D6\u4E2D\u2026')\n env.historyList.appendChild(loading)\n fetch(HISTORY)\n .then(function (response) {\n return response.json()\n })\n .then(function (data) {\n var entries = data && Array.isArray(data.entries) ? data.entries : []\n env.historyList.textContent = ''\n env.historyList.appendChild(el('div', 'dsh-sel-historytitle', '\u6700\u8FD1\u804A\u8FC7\u7684\uFF08\u70B9\u4E00\u6761\u8C03\u56DE\u90A3\u6BB5\u5BF9\u8BDD\uFF09'))\n if (entries.length === 0) {\n env.historyList.appendChild(el('div', 'dsh-sel-historyempty', '\u8FD8\u6CA1\u6709\u5386\u53F2\u2014\u2014\u95EE\u8FC7\u7684\u95EE\u9898\u4F1A\u7559\u5728\u8FD9\u91CC'))\n return\n }\n for (var i = 0; i < entries.length; i += 1) {\n env.historyList.appendChild(historyRow(entries[i]))\n }\n })\n .catch(function () {\n env.historyList.textContent = ''\n env.historyList.appendChild(el('div', 'dsh-sel-historyempty', '\u8BFB\u4E0D\u5230\u5386\u53F2'))\n })\n }\n\n /** \u4F4D\u7F6E\u6807\u7B7E\u538B\u7F29\uFF1A\u5217\u8868\u91CC\u4E0D\u9700\u8981\u300C\u9875\u9762\u5185\u5BB9\u300D\u8FD9\u4E48\u957F\u3002 */\n function shortLabel(label) {\n var text = String(label || '').replace(/\uFF08[^\uFF09]*\uFF09/g, '')\n if (text === '\u9875\u9762\u5185\u5BB9') return '\u9875\u9762'\n if (text === '\u5BF9\u8BDD\u6D88\u606F') return '\u6D88\u606F'\n if (text === '\u4EE3\u7801\u5757') return '\u4EE3\u7801'\n return text\n }\n\n function historyRow(item) {\n var row = el('div', 'dsh-sel-historyrow')\n // \u6807\u9898\u72EC\u5360\u4E00\u884C\uFF08\u4E0D\u518D\u88AB\u53F3\u8FB9\u7684\u5C0F\u5B57\u6324\u6389\uFF09\uFF0C\u7A7A\u6807\u9898\u4E5F\u7ED9\u4E2A\u4EA4\u4EE3\n var title = String(item.text || '').trim()\n row.appendChild(el('div', 'dsh-sel-historytext', title || '\uFF08\u8FD9\u6B21\u6CA1\u9009\u4E2D\u6587\u5B57\uFF09'))\n // \u5220\u9664\u952E\uFF1AstopPropagation \u5F88\u91CD\u8981 \u2014\u2014 \u5426\u5219\u70B9\u5B83\u4F1A\u88AB\u5F53\u6210\"\u70B9\u8FD9\u4E00\u884C\u53BB\u56DE\u653E\"\n var del = el('button', 'dsh-sel-historydel', '\u2715')\n del.type = 'button'\n del.title = '\u5220\u9664\u8FD9\u6761\u8BB0\u5F55'\n del.setAttribute('aria-label', '\u5220\u9664\u8FD9\u6761\u8BB0\u5F55')\n listen(del, 'click', function (event) {\n event.preventDefault()\n event.stopPropagation()\n deleteHistoryEntry(item, row)\n })\n row.appendChild(del)\n var meta =\n (item.label ? shortLabel(item.label) + ' \u00B7 ' : '') +\n (item.turns > 0 ? item.turns + ' \u8F6E \u00B7 ' : '') +\n formatWhen(item.at)\n var metaNode = el('div', 'dsh-sel-historymeta')\n metaNode.appendChild(el('span', null, meta))\n if (item.pinned) metaNode.appendChild(el('span', 'dsh-sel-historypin', '\u5DF2\u5347\u683C'))\n row.appendChild(metaNode)\n listen(row, 'click', function (event) {\n event.stopPropagation()\n loadHistoryEntry(String(item.key))\n })\n return row\n }\n\n /**\n * \u5220\u9664\u4E00\u6761\u5386\u53F2\uFF08\u884C\u5185 \u2715\uFF09\u3002\n * \u5148\u6253 DELETE \u62FF\u56DE\u88AB\u5220\u6761\u76EE\u7684\u5FEB\u7167\uFF0C\u518D\u4ECE\u5217\u8868\u91CC\u79FB\u9664\u90A3\u4E00\u884C\u5E76\u6302\u4E00\u6761\"\u64A4\u9500\"\uFF1B\n * \u64A4\u9500\u5C31\u662F\u628A\u5FEB\u7167 POST \u56DE /history?restore=1 \u2014\u2014 \u670D\u52A1\u7AEF\u53EA\u5B58\u5FEB\u7167\uFF0C\u4E0D\u505A\u590D\u6742\u7684\u72B6\u6001\u56DE\u6EDA\u3002\n */\n function deleteHistoryEntry(item, row) {\n fetch(HISTORY + '?key=' + encodeURIComponent(String(item.key)), { method: 'DELETE' })\n .then(function (response) {\n return response.json()\n })\n .then(function (data) {\n if (!data || data.ok !== true) {\n env.setStatus('\u5220\u9664\u5931\u8D25')\n return\n }\n if (!data.entry) {\n // \u670D\u52A1\u7AEF\u5DF2\u7ECF\u6CA1\u6709\u8FD9\u6761\u4E86\uFF08\u6BD4\u5982\u53E6\u4E00\u4E2A\u7A97\u53E3\u5220\u8FC7\uFF09\uFF1A\u628A\u5B83\u4ECE\u754C\u9762\u4E0A\u62FF\u6389\u5C31\u884C\n if (row.parentNode) row.parentNode.removeChild(row)\n return\n }\n var snapshot = data.entry\n if (row.parentNode) row.parentNode.removeChild(row)\n showUndoBar(snapshot)\n })\n .catch(function (error) {\n env.setStatus('\u5220\u9664\u5931\u8D25\uFF1A' + String((error && error.message) || error))\n })\n }\n\n /** \u5E95\u90E8\"\u5DF2\u5220\u9664 \u00B7 \u64A4\u9500\"\uFF0C5 \u79D2\u540E\u81EA\u5DF1\u6D88\u5931\u3002 */\n function showUndoBar(snapshot) {\n var existing = null\n for (var i = 0; i < env.historyList.children.length; i += 1) {\n if (String(env.historyList.children[i].className).indexOf('dsh-sel-undo') >= 0) existing = env.historyList.children[i]\n }\n if (existing) env.historyList.removeChild(existing)\n var bar = el('div', 'dsh-sel-undo')\n bar.appendChild(el('span', null, '\u5DF2\u5220\u9664\u300C' + String(snapshot.text || '').slice(0, 12) + '\u2026\u300D'))\n var undo = el('button', null, '\u64A4\u9500')\n undo.type = 'button'\n listen(undo, 'click', function (event) {\n event.preventDefault()\n event.stopPropagation()\n fetch(HISTORY + '?restore=1', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ entry: snapshot }),\n })\n .then(function (response) {\n return response.json()\n })\n .then(function () {\n env.setStatus('\u5DF2\u6062\u590D')\n openHistoryList()\n })\n .catch(function () {\n env.setStatus('\u6062\u590D\u5931\u8D25')\n })\n })\n bar.appendChild(undo)\n env.historyList.appendChild(bar)\n setTimeout(function () {\n if (bar.parentNode) bar.parentNode.removeChild(bar)\n }, 5000)\n }\n\n function formatWhen(at) {\n if (!at) return ''\n var date = new Date(at)\n var now = new Date()\n var hh = ('0' + String(date.getHours())).slice(-2) + ':' + ('0' + String(date.getMinutes())).slice(-2)\n if (date.toDateString() === now.toDateString()) return hh\n var yesterday = new Date(now.getTime() - 86400000)\n if (date.toDateString() === yesterday.toDateString()) return '\u6628\u5929 ' + hh\n return date.getMonth() + 1 + '\u6708' + date.getDate() + '\u65E5 ' + hh\n }\n\n /**\n * \u53D6\u4E00\u6761\u5386\u53F2\u56DE\u653E\u3002anchor \u7701\u7565\u65F6\uFF1A\n * \u00B7 \u4ECE\u300C\u6700\u8FD1\u300D\u5217\u8868\u91CC\u70B9\u4E00\u6761 \u2192 **\u9762\u677F\u4E0D\u632A\u4F4D\u7F6E**\uFF1A\u5217\u8868\u672C\u6765\u5C31\u8D34\u7740\u9762\u677F\u6446\uFF0C\n * \u628A\u9762\u677F\u91CD\u65B0\u951A\u5230\u80F6\u56CA\u4E0A\u4F1A\u8BA9\u4EBA\u773C\u770B\u7740\u9762\u677F\"\u8DF3\u5230\u53F3\u4E0B\u89D2\u80F6\u56CA\u4E0A\u65B9\"\uFF08\u5B9E\u6D4B\u53CD\u9988\u7684 bug\uFF09\u3002\n * \u00B7 \u5C31\u7EEA\u72B6\u6001\u70B9\u80F6\u56CA\u56DE\u653E \u2192 \u951A\u5230\u80F6\u56CA\u4E0A\u65B9\uFF1B\u5426\u5219\u9762\u677F\u4ECE\u6CA1\u88AB\u6446\u8FC7\u4F4D\u7F6E\uFF0C\u4F1A\u8DD1\u5230\u5C4F\u5E55\u5DE6\u4E0A\u89D2\u3002\n *\n * \u6CE8\u610F\uFF1A`applyHistoryEntry` \u5185\u90E8\u4F1A\u6536\u8D77\u5217\u8868\uFF0C\u6240\u4EE5\"\u662F\u5426\u4ECE\u5217\u8868\u8FDB\u5165\"\u5FC5\u987B\u5728\u8C03\u7528**\u4E4B\u524D**\u5224\u65AD\u3002\n */\n function loadHistoryEntry(key, anchor) {\n var fromList = env.historyList.style.display === 'flex'\n fetch(HISTORY + '?key=' + encodeURIComponent(key))\n .then(function (response) {\n return response.json()\n })\n .then(function (data) {\n if (!data || data.ok !== true || !data.entry) return\n env.panelOpen = true\n env.panel.style.display = 'flex'\n applyHistoryEntry(data.entry, 'history')\n // \u5148\u753B\u5185\u5BB9\u518D\u6446\u4F4D\u7F6E\uFF1AshowPanel \u8981\u91CF\u9762\u677F\u9AD8\u5EA6\u624D\u80FD\u51B3\u5B9A\u653E\u4E0A\u9762\u8FD8\u662F\u4E0B\u9762\n if (!fromList) env.showPanel(anchor || env.rectOfPill())\n // \u4ECE\u5217\u8868\u8FDB\u5165\u65F6**\u4E0D\u8D70 showPanel**\uFF08\u9762\u677F\u4E0D\u632A\u4F4D\u7F6E\uFF09\u2014\u2014 \u8F6E\u8BE2\u4E0E\u8DDF\u968F\u503C\u8FD9\u91CC\u81EA\u5DF1\u8865\u4E0A\n else { env.refreshFollowRoute(); env.syncRouteWatch(); env.warmModelCatalog() }\n // \u5185\u5BB9\u6362\u4E86\u3001\u9762\u677F\u9AD8\u5EA6\u53EF\u80FD\u53D8 \u2192 \u5217\u8868\u8DDF\u7740\u91CD\u6446\uFF08\u5217\u8868\u6B64\u65F6\u5DF2\u88AB applyHistoryEntry \u6536\u8D77\uFF0C\u6309\u9700\u518D\u5F00\uFF09\n if (env.historyList.style.display === 'flex') placeHistoryList()\n })\n .catch(function () {\n /* noop */\n })\n }\n\n /**\n * \u64A4\u6389\"\u8FDB\u884C\u4E2D\"\u7C7B\u63D0\u793A\uFF1A`conclusion-retry`\uFF08\"\u67E5\u8BE2\u5DF2\u5B8C\u6210\uFF0C\u6B63\u5728\u6574\u7406\u7ED3\u8BBA\u2026\"\uFF09\u662F**\u8FC7\u7A0B\u72B6\u6001** \u2014\u2014\n * \u6B63\u6587\u4E00\u5F00\u59CB\u5230\u8FBE\u3001\u6216\u8005\u672C\u8F6E\u7ED3\u675F\uFF0C\u5B83\u5C31\u8BE5\u6D88\u5931\u3002\n *\n * \u8E29\u8FC7\u7684\u5751\uFF1A\u8FD9\u6761\u63D0\u793A\u5199\u8FDB answerTurn.notice \u4E4B\u540E\uFF0C**\u5168\u4EE3\u7801\u6CA1\u6709\u4EFB\u4F55\u5730\u65B9\u6E05\u6389\u5B83** \u2014\u2014\n * \u56DE\u7B54\u65E9\u5C31\u5199\u5B8C\u4E86\uFF0C\u9EC4\u6761\u8FD8\u6302\u5728\u6C14\u6CE1\u4E0A\uFF08\u7528\u6237\u622A\u56FE\u62A5\u7684\u73B0\u8C61\uFF09\u3002\n * \u5176\u4F59 notice\uFF08effort-clamped / effort-rejected / reasoning-leak\uFF09\u662F\"\u8FD9\u6761\u56DE\u7B54\u53D1\u751F\u4E86\u4EC0\u4E48\"\u7684\n * \u8BF4\u660E\uFF0C\u5C5E\u4E8E\u8BE5\u7559\u4E0B\u7684\u4FE1\u606F\uFF0C\u4E0D\u5728\u8FD9\u91CC\u6E05\u3002\n */\n function clearTransientNotice(turn) {\n if (!turn) return false\n var code = String(turn.noticeCode || '')\n // conclusion-retry\uFF1A\u8FDB\u884C\u4E2D\u72B6\u6001\uFF0C\u6B63\u6587\u5230\u4E86\u5C31\u64A4\uFF1B\n // upstream-retry\uFF1A\u4E0A\u6E38\u5076\u53D1\u9519\u8BEF\uFF08host \u5DF2\u6362\u6863\u91CD\u8BD5\uFF09\uFF0C\u91CD\u8BD5\u6210\u529F\u65F6\u6B63\u6587\u4F1A\u5230\u3001\u5931\u8D25\u65F6\u8D70 error\uFF0C\n // \u4E24\u79CD\u60C5\u51B5\u90FD\u4E0D\u8BE5\u628A\u8FD9\u53E5\u4E00\u76F4\u6302\u5728\u56DE\u7B54\u4E0A\u9762\u3002\n // effort-rejected / reasoning-leak \u662F\"\u8FD9\u4E2A\u6A21\u578B\u8FD9\u4E00\u6863\u6709\u95EE\u9898\"\u7684\u7ED3\u8BBA\u6027\u8BF4\u660E\uFF0C\u7559\u7740\u3002\n if (code !== 'conclusion-retry' && code !== 'upstream-retry') return false\n turn.notice = ''\n turn.noticeCode = ''\n return true\n }\n\n /** \u5DE5\u5177\u540D \u2192 \u4E2D\u6587\u6807\u7B7E\uFF08\u53EA\u7528\u4E8E\u5185\u90E8\u6458\u8981\uFF0C\u4E0D\u4E0A\u754C\u9762\uFF09\u3002 */\n function toolLabel(name) {\n // \u5C0F\u7A97\u9ED8\u8BA4\u7528\u7684\u662F free-search \u63D2\u4EF6\u7684\u5DE5\u5177\uFF08\u89C1 host \u4FA7 toolNames \u6CE8\u91CA\uFF09\n if (name === 'advanced_search') return '\u8054\u7F51\u641C\u7D22'\n if (name === 'platform_search') return '\u7AD9\u5185\u641C\u7D22'\n if (name === 'web_search') return '\u8054\u7F51\u641C\u7D22' // \u4E07\u4E00\u914D\u6210\u5B98\u65B9\u641C\u7D22\uFF0C\u6807\u7B7E\u4E0D\u53D8\n if (name === 'web_fetch') return '\u6293\u53D6\u7F51\u9875'\n return String(name || '\u5DE5\u5177')\n }\n\n /** \u5DE5\u5177\u7ED3\u679C \u2192 \u8FFD\u95EE\u7528\u7684\u6458\u8981\uFF08\u4E0B\u4E00\u8F6E\u4E0D\u518D\u91CD\u67E5\u540C\u6837\u7684\u5185\u5BB9\uFF09\u3002 */\n function rememberToolDigest(tool) {\n var line =\n '- ' +\n toolLabel(tool.name) +\n '\u300C' +\n String(tool.detail || '').slice(0, 60) +\n '\u300D\u2192 ' +\n (tool.ok === false ? '\u5931\u8D25' : tool.chars ? tool.chars + ' \u5B57\u7ED3\u679C' : '\u5B8C\u6210') +\n (tool.urls && tool.urls.length > 0 ? '\uFF0C\u94FE\u63A5\uFF1A' + tool.urls.slice(0, 3).join(' ') : '') +\n (tool.preview ? '\uFF1B\u6458\u8981\uFF1A' + String(tool.preview).replace(/\\s+/g, ' ').slice(0, 220) : '')\n env.state.toolDigest = (env.state.toolDigest ? env.state.toolDigest + '\\n' : '') + line\n if (env.state.toolDigest.length > 1800) env.state.toolDigest = env.state.toolDigest.slice(-1800)\n }\n\n /**\n * \u5904\u7406\u4E00\u4E2A tool \u4E8B\u4EF6\uFF08start / done \u4E24\u6BB5\uFF09\u3002\n *\n * \u53EA\u505A\u4E24\u4EF6\u4E8B\uFF0C**\u4E00\u4E2A DOM \u8282\u70B9\u90FD\u4E0D\u5EFA**\uFF1A\n * 1. done \u65F6\u628A\u7ED3\u679C\u6458\u8981\u7D2F\u8FDB state.toolDigest \u2014\u2014 \u8FFD\u95EE\u65F6\u5E26\u7ED9\u6A21\u578B\uFF0C\u544A\u8BC9\u5B83\"\u5DF2\u7ECF\u67E5\u8FC7\u4EC0\u4E48\uFF0C\u522B\u91CD\u67E5\"\uFF1B\n * 2. \u7EF4\u62A4 state.toolBusy \u2014\u2014 \u7B49\u5F85\u63D0\u793A\u91CC\u5199\u4E00\u53E5\"\u6B63\u5728\u68C0\u7D22\u8D44\u6599\"\uFF0C\u514D\u5F97\u51E0\u5341\u79D2\u7684\u68C0\u7D22\u770B\u7740\u50CF\u5361\u6B7B\u3002\n * \u67E5\u8BE2\u8BCD\u3001\u547D\u4E2D\u5B57\u6570\u3001\u9884\u89C8\u6B63\u6587\u3001\u94FE\u63A5\u3001\u8017\u65F6\u4E00\u5F8B\u4E0D\u8FDB\u5C0F\u7A97\uFF1A\u5C0F\u7A97\u53EA\u653E\u6A21\u578B\u5904\u7406\u540E\u7684\u7ED3\u679C\u3002\n */\n function applyToolEvent(message) {\n var phase = message.phase === 'done' ? 'done' : 'start'\n var callId = String(message.callId || message.name || 'tool')\n var item = null\n for (var i = 0; i < env.state.tools.length; i += 1) {\n if (env.state.tools[i].callId === callId && env.state.tools[i].phase === 'running' && phase === 'done') {\n item = env.state.tools[i]\n break\n }\n }\n if (!item) {\n item = { callId: callId, name: message.name, detail: message.detail, phase: 'running' }\n env.state.tools.push(item)\n }\n item.name = message.name || item.name\n item.detail = message.detail || item.detail\n if (phase === 'done') {\n item.phase = 'done'\n item.ok = message.ok !== false\n item.ms = typeof message.ms === 'number' ? message.ms : 0\n item.chars = typeof message.chars === 'number' ? message.chars : 0\n item.preview = typeof message.preview === 'string' ? message.preview : ''\n item.urls = Array.isArray(message.urls) ? message.urls : []\n rememberToolDigest(item)\n } else {\n item.phase = 'running'\n }\n env.state.toolBusy = phase !== 'done'\n if (env.state.toolBusy) env.setStatus(env.progressText())\n }\n\n /**\n * \u5185\u5BB9\u53D8\u5316\u524D\u5148\u91CF\u4E00\u6B21\"\u73B0\u5728\u662F\u4E0D\u662F\u8D34\u7740\u5E95\"\u3002\n *\n * \u4E4B\u524D\u7528 scroll \u4E8B\u4EF6\u7EF4\u62A4 followScroll \u5F00\u5173\uFF1A\u7A0B\u5E8F\u5316 scrollTop \u8D4B\u503C\u672C\u8EAB\u4E5F\u4F1A\u6D3E\u53D1 scroll\uFF0C\n * \u53E0\u4E0A\u6D41\u5F0F\u8FFD\u52A0\uFF0C\u5F88\u5BB9\u6613\u7B97\u51FA\u4E00\u6B21\u5047\u7684\"\u7528\u6237\u5F80\u4E0A\u7FFB\u4E86\"\uFF0C\u5F00\u5173\u4E00\u65E6\u7FFB\u6210 false \u5C31\u518D\u4E5F\u4E0D\u8DDF\u4E86\u2014\u2014\n * \u8868\u73B0\u5C31\u662F\"\u8FFD\u95EE\u540E\u6D88\u606F\u4E0D\u56DE\u5230\u5E95\u90E8\"\u3002\u6539\u6210\u53D8\u5316\u524D\u6D4B\u91CF\uFF0C\u7A33\u3002\n */\n function nearBottom() {\n return env.body.scrollHeight - env.body.scrollTop - env.body.clientHeight < 40\n }\n\n var stickAt = 0\n\n function stickToBottom() {\n stickAt = Date.now()\n env.body.scrollTop = env.body.scrollHeight\n }\n\n /**\n * \u53D1\u5B8C\u6D88\u606F\u540E**\u6301\u7EED**\u8D34\u5E95\uFF1A\u5185\u5BB9\u4F1A\u5728\u4E4B\u540E\u5F02\u6B65\u957F\u9AD8\u2014\u2014\u7B49\u5F85\u7279\u6548\u7684\u601D\u8003\u5C3E\u5DF4\u3001\u4E0A\u4E00\u8F6E\u7684\u9884\u89C8 iframe\n * \u4E0A\u62A5\u65B0\u9AD8\u5EA6\u3001\u9762\u677F\u4ECE\u7A84\u7248\u5207\u5BBD\u7248\u5F15\u8D77\u91CD\u6392\u2026\u2026\u53EA\u5728 renderTurns \u91CC\u8D34\u4E00\u6B21\u662F\u4E0D\u591F\u7684\n * \uFF08\u7528\u6237\u770B\u5230\u7684\u5C31\u662F\"\u70B9\u4E86\u53D1\u9001\uFF0C\u6D88\u606F\u6CA1\u8DDF\u5230\u6700\u65B0\u4F4D\u7F6E\"\uFF09\u3002\u6240\u4EE5\u751F\u6210\u671F\u95F4\u7528 ResizeObserver \u76EF\u7740\u6D88\u606F\u533A\uFF0C\n * \u53EA\u8981\"\u8FD8\u5728\u8DDF\u968F\"\u5C31\u518D\u8D34\u4E00\u6B21\u3002\n */\n var chatGrowWatch = null\n\n function ensureChatFollow() {\n if (chatGrowWatch || typeof ResizeObserver !== 'function') return null\n chatGrowWatch = new ResizeObserver(function () {\n if (env.state.follow) stickToBottom()\n })\n chatGrowWatch.observe(env.chatLog)\n return function () {\n if (chatGrowWatch) chatGrowWatch.disconnect()\n chatGrowWatch = null\n }\n }\n\n /**\n * \u9762\u677F\u88AB\u5185\u5BB9\u9876\u51FA\u5C4F\u5E55 \u2192 \u6536\u56DE\u53EF\u89C6\u533A\u3002\n *\n * \u4E3A\u4EC0\u4E48\u9700\u8981\uFF1A\u5F00\u7A97\u65F6\"\u653E\u5F97\u4E0B\u5417\"\u662F\u6309**\u5F53\u65F6**\u7684\u9AD8\u5EA6\u7B97\u7684\uFF08\u90A3\u4F1A\u513F\u5F80\u5F80\u53EA\u6709\u4E00\u884C\u7FFB\u8BD1\u5728\u6D41\uFF09\uFF0C\n * \u4E4B\u540E\u6B63\u6587\u957F\u9AD8\uFF08\u4E0A\u9650 78vh \u6216 720px\uFF09\uFF0C\u9762\u677F\u4ECE\u56FA\u5B9A\u7684 top \u5F80\u4E0B\u957F \u2014\u2014 \u800C\u5B83\u662F position:fixed\u3001\n * \u9875\u9762\u4E0D\u6EDA\uFF0C\u88AB\u9876\u51FA\u89C6\u53E3\u7684\u90A3\u90E8\u5206\uFF08\u901A\u5E38\u662F\u56DE\u590D\u6846\uFF09\u5C31\u70B9\u4E0D\u5230\u4E86\uFF08\u5B9E\u6D4B\u80FD\u6302\u51FA\u53BB 287px\uFF09\u3002\n *\n * \u7528\u9762\u677F**\u81EA\u5DF1**\u7684 ResizeObserver\uFF1A\u53EA\u5728\u5C3A\u5BF8\u53D8\u5316\u65F6\u89E6\u53D1\uFF08\u5185\u5BB9\u957F\u9AD8\u3001\u62D6\u62FD\u3001\u9636\u6BB5\u5207\u6362\u90FD\u7B97\uFF09\uFF0C\n * \u800C\u632A\u4F4D\u7F6E\uFF08left/top\uFF09\u4E0D\u6539\u53D8\u5C3A\u5BF8 \u2192 \u4E0D\u5B58\u5728\"\u5199\u56DE\u81EA\u8EAB\"\u7684\u5FAA\u73AF\u3002\n * \u6BCF\u5E27\u53EA\u591A\u4E00\u6B21 getBoundingClientRect\uFF0C\u4E14\u53EA\u5728\u771F\u7684\u6EA2\u51FA\u65F6\u624D\u5199\u6837\u5F0F\u3002\n */\n var panelGrowWatch = null\n\n /**\n * \u590D\u6838\u4E00\u6B21\uFF1A\u9762\u677F\u88AB\u9876\u51FA\u89C6\u53E3\u5C31\u6536\u56DE\u6765\uFF08\u53EA\u5728\u771F\u7684\u6EA2\u51FA\u65F6\u624D\u5199\u6837\u5F0F\uFF09\u3002\n *\n * \u4E24\u6761\u5165\u53E3\u90FD\u4F1A\u8C03\u5B83\uFF1A\n * \u00B7 paint() \u2014\u2014 \u6D41\u5F0F/\u5185\u5BB9\u53D8\u5316\u65F6\u7684**\u4E3B\u529B**\uFF08\u6E32\u67D3\u672C\u6765\u5C31\u8282\u6D41\u5728 90ms\uFF0C\u4E00\u6B21 rect \u8BFB\u7EA6 0.02ms\uFF09\uFF1B\n * \u00B7 \u9762\u677F\u81EA\u5DF1\u7684 ResizeObserver \u2014\u2014 \u515C\u4F4F\u4E0D\u7ECF\u8FC7 paint \u7684\u5C3A\u5BF8\u53D8\u5316\uFF08\u9636\u6BB5\u5207\u6362\u3001composer \u957F\u9AD8\uFF09\u3002\n *\n * \u26A0\uFE0F \u66FE\u7ECF\u53EA\u6302 ResizeObserver\uFF0C\u5B9E\u6D4B**\u4E0D\u751F\u6548**\uFF1A\u5185\u5BB9\u957F\u9AD8\u65F6\u9762\u677F\u5F80\u5F80\u5DF2\u7ECF\u9876\u5230 max-height\uFF0C\n * \u4F38\u957F\u7684\u662F\u5185\u90E8\u6EDA\u52A8\u533A \u2014\u2014 \u9762\u677F\u5C3A\u5BF8\u4E0D\u53D8\uFF0C\u89C2\u5BDF\u5668\u6839\u672C\u4E0D\u89E6\u53D1\uFF08\u5192\u70DF\u7528\u4F8B\u91CC\u63A2\u9488\u663E\u793A open:false\u3001\n * \u4E14\u704C\u5185\u5BB9\u540E\u96F6\u5524\u9192\uFF09\u3002\u6240\u4EE5\u4E3B\u529B\u5FC5\u987B\u662F\u7ED8\u5236\u8DEF\u5F84\u4E0A\u7684\u590D\u6838\u3002\n */\n function ensurePanelInsideViewportNow() {\n if (!env.panelOpen || env.panelInteracting) return\n var rect = env.panelLayoutRect()\n if (rect.bottom <= window.innerHeight - 4) return\n env.clampPanelPosition()\n }\n\n function ensurePanelInsideViewport() {\n if (panelGrowWatch || typeof ResizeObserver !== 'function') return null\n panelGrowWatch = new ResizeObserver(function () {\n ensurePanelInsideViewportNow()\n })\n panelGrowWatch.observe(env.panel)\n return function () {\n if (panelGrowWatch) {\n panelGrowWatch.disconnect()\n panelGrowWatch = null\n }\n }\n }\n\n /** \u6EDA\u8F6E/\u89E6\u6478\uFF1A\u7528\u6237\u81EA\u5DF1\u6EDA = \u7ACB\u523B\u6536\u56DE\u8DDF\u968F\u6743\uFF1B\u6EDA\u56DE\u5E95\u90E8\u518D\u4EA4\u8FD8\u3002 */\n function noteUserScroll(event) {\n var up = event && typeof event.deltaY === 'number' && event.deltaY < 0\n if (up) env.state.follow = false\n else env.state.follow = nearBottom()\n }\n\n /**\n * \u666E\u901A scroll\uFF08\u62D6\u52A8\u6EDA\u52A8\u6761\u3001\u952E\u76D8\u3001\u60EF\u6027\u6EDA\u52A8\u90FD\u4F1A\u8D70\u5230\u8FD9\u91CC\uFF09\u3002\n * \u7A0B\u5E8F\u5316\u8D4B\u503C scrollTop \u540C\u6837\u4F1A\u6D3E\u53D1 scroll \u2014\u2014 \u7528 stickAt \u65F6\u95F4\u6233\u628A\"\u81EA\u5DF1\u8D34\u7684\u5E95\"\u6392\u9664\uFF0C\n * \u5426\u5219\u4F1A\u88AB\u8BEF\u5224\u6210\"\u7528\u6237\u5F80\u4E0A\u7FFB\"\uFF0C\u5F00\u5173\u7FFB\u6389\u540E\u518D\u4E5F\u4E0D\u8DDF\uFF08\u8FD9\u4E2A\u5751\u4E4B\u524D\u8E29\u8FC7\uFF09\u3002\n */\n function noteBodyScroll() {\n if (Date.now() - stickAt < 150) return\n env.state.follow = nearBottom()\n }\n\n /** \u6E32\u67D3\u8FFD\u95EE\u6C14\u6CE1\uFF08\u7528\u6237\u53F3\u4FA7\u3001\u52A9\u624B\u5DE6\u4FA7\uFF09\u3002\n * \u53EA\u66F4\u65B0\u6700\u540E\u4E00\u6761\u6C14\u6CE1\uFF1A\u5168\u91CF\u91CD\u5EFA\u4F1A\u8BA9\u6EDA\u52A8\u5BB9\u5668\u5148\u584C\u518D\u957F\uFF0C\u6EDA\u52A8\u4F4D\u7F6E\u88AB\u5939\u56DE\u9876\u90E8\u3002 */\n function renderTurns(options) {\n var force = !!(options && options.stick === true)\n // \u6CE8\u610F\uFF1A\u8FD9\u91CC\u4ECD\u7528 nearBottom()\uFF08\u4E0D\u7BA1\u7528\u6237\u662F\u6EDA\u8F6E\u8FD8\u662F\u522B\u7684\u9014\u5F84\u79BB\u5F00\u5E95\u90E8\u90FD\u6210\u7ACB\uFF09\uFF1B\n // state.follow \u53EA\u670D\u52A1\u4E8E\u4E0B\u9762\u7684 ResizeObserver \u2014\u2014 \u5185\u5BB9\"\u957F\u9AD8\"\u4E4B\u540E\u518D\u91CF nearBottom \u5FC5\u7136\u662F false\uFF0C\n // \u6240\u4EE5\u5FC5\u987B\u6709\u4E00\u4E2A\"\u957F\u9AD8\u4E4B\u524D\u662F\u5426\u8D34\u5E95\"\u7684\u8BB0\u5FC6\u3002\n var stick = force || nearBottom()\n var visible = []\n for (var i = 0; i < env.state.turns.length; i++) {\n // \u79CD\u5B50\u8F6E\uFF08\u524D\u60C5\u63D0\u8981\uFF09\u53EA\u53D1\u7ED9\u6A21\u578B\u5F53\u4E0A\u4E0B\u6587\uFF0C\u4E0D\u5728\u5C0F\u7A97\u91CC\u518D\u663E\u793A\u4E00\u904D\n if (env.state.turns[i].hidden !== true) visible.push(env.state.turns[i])\n }\n if (env.chatLog.children.length !== visible.length) {\n env.clearWaiting(env.chatLog)\n env.chatLog.textContent = ''\n for (var j = 0; j < visible.length; j++) {\n var bubble = bubbleFor(visible[j])\n // \u6C14\u6CE1\u8BB0\u4E0B\u81EA\u5DF1\u5C5E\u4E8E\u54EA\u4E00\u8F6E\uFF1A\u5F15\u7528\u65F6\u8981\u636E\u6B64\u53D6\"\u8FD9\u4E00\u8F6E \u00B1 \u4E00\u8F6E\"\u7684\u4E0A\u4E0B\u6587\n bubble.__turn = visible[j]\n env.chatLog.appendChild(bubble)\n }\n // \u521A\u5165\u5217\u7684\"\u5F85\u7B54\"\u6C14\u6CE1\uFF1A\u6B64\u65F6\u624D\u6302\u8FDB DOM\uFF0C\u53EF\u4EE5\u753B\u7B49\u5F85\u7279\u6548\u4E86\n var fresh = visible[visible.length - 1]\n if (fresh && fresh.role === 'assistant' && fresh.asking === true && !fresh.text) {\n env.showWaiting(env.chatLog.children[visible.length - 1], '\u6B63\u5728\u56DE\u7B54\u2026', {\n startedAt: fresh.startedAt,\n effort: fresh.effort,\n effortOf: function () { return fresh.effort || 'high' },\n thoughtOf: function () { return fresh.thought },\n })\n }\n } else if (visible.length > 0) {\n var node = env.chatLog.children[visible.length - 1]\n var turn = visible[visible.length - 1]\n var painted = false\n node.className = 'dsh-sel-bubble ' + (turn.role === 'user' ? 'dsh-sel-bubble-user' : 'dsh-sel-bubble-bot') + (turn.error ? ' dsh-sel-bubble-err' : '')\n if (turn.role === 'user') {\n // \u7528\u6237\u6C14\u6CE1\u53EF\u80FD\u5E26\u5F15\u7528\u5757\uFF1A\u7B7E\u540D\u5305\u542B\u5F15\u7528\uFF0C\u522B\u6BCF\u6B21\u91CD\u7ED8\u90FD\u767D\u91CD\u5EFA\u4E00\u904D\n var usig = (turn.text || '') + '|' + (turn.quotes || []).map(function (item) { return item.text }).join('\\u0000')\n if (node.__sig !== usig) {\n node.__sig = usig\n fillUserBubble(node, turn)\n }\n } else if (turn.error) {\n node.textContent = turn.text\n } else if (turn.asking === true && !turn.text) {\n // \u8FFD\u95EE\u7B49\u5F85\u671F\uFF1A\u548C\u9996\u8F6E\u540C\u4E00\u5957\u7B49\u5F85\u7279\u6548\uFF08\u547C\u5438\u70B9 + \u5B9E\u65F6\u79D2\u6570 + \uD83D\uDCAD \u601D\u8003\u5C3E\u5DF4\uFF09\n env.showWaiting(node, '\u6B63\u5728\u56DE\u7B54\u2026', {\n startedAt: turn.startedAt,\n effort: turn.effort,\n effortOf: function () { return turn.effort || 'high' },\n thoughtOf: function () { return turn.thought },\n })\n } else {\n env.clearWaiting(node)\n // \u8FFD\u95EE\u8FD8\u5728\u6D41\u5F0F\u65F6\u5148\u7ED9\u6E90\u7801\uFF1B\u8FD9\u4E00\u8F6E\u771F\u7684\u5199\u5B8C\uFF08streaming=false\uFF09\u518D\u6E32\u67D3\u6210\u7F51\u9875\n var sig = (turn.text || '') + '|' + (turn.streaming === true ? '1' : '0') + '|' + (turn.error ? '1' : '0')\n if (node.__sig !== sig) {\n // \u5185\u5BB9\u6CA1\u53D8\u5C31\u522B\u91CD\u5EFA\uFF1A\u91CD\u5EFA\u4F1A\u628A\u9884\u89C8 iframe \u4E00\u8D77\u6362\u6389\uFF08\u591A\u5EFA\u4E00\u6B21 = \u767D\u95EA\u4E00\u6B21\uFF09\n node.__sig = sig\n renderRich(node, turn.text || '\u2026', { settled: turn.streaming !== true })\n }\n paintNotice(node, turn)\n paintQuoteAll(node, turn)\n painted = true\n }\n if (!painted && turn.role !== 'user') paintNotice(node, turn)\n if (!painted && turn.role !== 'user') paintQuoteAll(node, turn)\n }\n // \u53EF\u89C1\u6027\u5FC5\u987B\u5728\u8FD9\u91CC\u5B9A\uFF1A\u8FFD\u95EE\u8DEF\u5F84\u53EA\u8C03 renderTurns()\uFF0C\u4E0D\u4F1A\u89E6\u53D1 paint()\uFF0C\n // \u4E4B\u524D\u628A\u5B83\u632A\u8FDB paint() \u5BFC\u81F4\"\u53D1\u9001\u540E\u6C14\u6CE1\u753B\u8FDB\u4E86 display:none \u7684\u5BB9\u5668\u91CC\uFF0C\u5C0F\u7A97\u6CA1\u53CD\u5E94\"\n env.chatLog.style.display = visible.length > 0 ? 'flex' : 'none'\n if (stick) stickToBottom()\n }\n\n /** \u8F6E\u6B21\u4E0A\u7684\u9EC4\u8272\u63D0\u793A\u884C\uFF08\u76EE\u524D\u7528\u5728\"\u6863\u4F4D\u88AB\u4E0A\u6E38\u62D2\u7EDD\u3001\u5DF2\u81EA\u52A8\u56DE\u9000\"\uFF09\u3002 */\n function paintNotice(node, turn) {\n var existing = null\n for (var i = 0; i < node.children.length; i += 1) {\n if (String(node.children[i].className).indexOf('dsh-sel-notice') >= 0) existing = node.children[i]\n }\n var text = turn && turn.notice ? String(turn.notice) : ''\n if (!text) {\n if (existing) node.removeChild(existing)\n return\n }\n if (!existing) {\n existing = el('p', 'dsh-sel-notice')\n node.appendChild(existing)\n }\n existing.textContent = text\n }\n\n /**\n * \u7528\u6237\u6C14\u6CE1\uFF1A\u6709\u5F15\u7528\u65F6**\u5148\u753B\u5F15\u7528\u5757\u3001\u518D\u753B\u95EE\u9898**\uFF08\u548C\u53D1\u7ED9\u6A21\u578B\u7684\u90A3\u4EFD\u987A\u5E8F\u4E00\u81F4\uFF09\u3002\n * \u53EA\u5199 textContent \u7684\u8BDD\u5F15\u7528\u5C31\u770B\u4E0D\u89C1\u4E86 \u2014\u2014 \u6A21\u578B\u7B54\u7684\u662F\"\u4E0A\u9762\u90A3\u6BB5\"\uFF0C\n * \u800C\"\u4E0A\u9762\u90A3\u6BB5\"\u5728\u6C14\u6CE1\u91CC\u6839\u672C\u4E0D\u5B58\u5728\uFF0C\u56DE\u5934\u770B\u4F1A\u4E00\u5934\u96FE\u6C34\u3002\n */\n function fillUserBubble(node, turn) {\n node.textContent = ''\n var quotes = turn.quotes || []\n if (quotes.length > 0) {\n var box = el('div', 'dsh-sel-bq')\n for (var i = 0; i < quotes.length; i += 1) {\n var item = el('div', 'dsh-sel-bqitem')\n item.appendChild(el('b', null, '\u275D ' + env.quoteLabelOf(quotes[i])))\n item.appendChild(document.createTextNode(env.quoteBrief(quotes[i].text, 60)))\n item.title = quotes[i].text\n box.appendChild(item)\n }\n node.appendChild(box)\n }\n if (turn.text) node.appendChild(el('div', null, turn.text))\n }\n\n function bubbleFor(turn) {\n var bubble = el('div', 'dsh-sel-bubble ' + (turn.role === 'user' ? 'dsh-sel-bubble-user' : 'dsh-sel-bubble-bot'))\n if (turn.role === 'user') {\n fillUserBubble(bubble, turn)\n } else if (turn.error) {\n bubble.className += ' dsh-sel-bubble-err'\n bubble.textContent = turn.text\n } else {\n renderRich(bubble, turn.text || '\u2026', { settled: turn.streaming !== true })\n }\n if (turn.role !== 'user') {\n paintNotice(bubble, turn)\n paintQuoteAll(bubble, turn)\n }\n return bubble\n }\n\n /**\n * \u52A9\u624B\u6C14\u6CE1\u672B\u5C3E\u7684\u300C\u275D \u5F15\u7528\u6574\u6761\u300D\uFF08\u9F20\u6807\u79FB\u5230\u8FD9\u6761\u6D88\u606F\u4E0A\u624D\u6D6E\u51FA\u6765\uFF09\u3002\n *\n * \u6BCF\u6B21\u91CD\u753B\u90FD\u8981\u8865\u4E00\u904D\uFF1ArenderRich() \u4F1A\u5148\u6E05\u7A7A\u6C14\u6CE1\uFF0C\u6309\u94AE\u8DDF\u7740\u4E00\u8D77\u6CA1\u4E86\u3002\n * \u70B9\u7684\u65F6\u5019\u73B0\u8BFB `source.text`\uFF08\u4E00\u8F6E\u8FD8\u5728\u6D41\u5F0F\u65F6\u6587\u672C\u4E00\u76F4\u5728\u957F\uFF09\uFF0C\u5E76\u6298\u6389\u7F51\u9875\u56DE\u7B54\u91CC\u7684 HTML\n * \u2014\u2014 \u5F15\u7528\u4E00\u6574\u9875 HTML \u6E90\u7801\u65E2\u957F\u53C8\u6CA1\u6709\u63D0\u95EE\u4EF7\u503C\uFF0C\u5386\u53F2\u91CC\u672C\u6765\u4E5F\u662F\u6298\u6210 Markdown \u7684\u3002\n */\n function paintQuoteAll(node, turn) {\n var existing = null\n for (var i = 0; i < node.children.length; i += 1) {\n if (String(node.children[i].className).indexOf('dsh-sel-bubquote') >= 0) existing = node.children[i]\n }\n var ready = turn && turn.error !== true && turn.streaming !== true && String(turn.text || '').trim()\n if (!ready) {\n if (existing) node.removeChild(existing)\n return\n }\n if (!existing) {\n existing = el('button', 'dsh-sel-bubquote')\n existing.type = 'button'\n existing.appendChild(el('span', null, '\u275D \u5F15\u7528\u6574\u6761'))\n node.appendChild(existing)\n }\n existing.title = '\u628A\u8FD9\u4E00\u6574\u6761\u56DE\u7B54\u52A0\u8FDB\u8FFD\u95EE\u7684\u5F15\u7528'\n existing.__turn = turn\n if (existing.__wired !== true) {\n existing.__wired = true\n listen(existing, 'click', function (event) {\n event.stopPropagation()\n var source = existing.__turn\n if (!source) return\n var body = foldForHistory(source.text)\n // \u6574\u6761\u5F15\u7528\u540C\u6837\u4E0D\u5E26\u4E0A\u4E0B\u6587\uFF1A\u51FA\u5904\u5199\u8FDB\u6807\u7B7E\uFF08\u300C\u5C0F\u7A97\u7B2C N \u8F6E\u56DE\u7B54\u300D\uFF09\uFF0C\u5BF9\u8BDD\u672C\u8EAB\u5728\u5386\u53F2\u91CC\n env.addQuote(body, env.turnLabelOf(source), { context: '', session: false })\n })\n }\n }\n\n /** \u628A\u9996\u8F6E\u89E3\u8BFB\u7ED3\u679C\u4F5C\u4E3A\u8FFD\u95EE\u7684\u7B2C\u4E00\u6761\u52A9\u624B\u4E0A\u4E0B\u6587\uFF08\u622A\u65AD\uFF0C\u907F\u514D\u8FC7\u957F\uFF09\u3002 */\n function seedHistoryFromExplanation() {\n var fallback = splitSections(env.state.raw)\n var translation = (env.state.parts.translation || fallback.translation || '').trim()\n var detail = (env.state.parts.detail || fallback.detail || '').trim()\n // \u5199\u6210\"\u524D\u60C5\u63D0\u8981\"\u800C\u4E0D\u662F\"\u6211\u4E0A\u4E00\u8F6E\u7684\u56DE\u7B54\"\uFF1A\u5426\u5219\u6A21\u578B\u4F1A\u987A\u7740\u628A\u4E24\u8282\u5185\u5BB9\u518D\u590D\u8FF0\u4E00\u904D\n var seed =\n '\uFF08\u524D\u60C5\uFF1A\u5DF2\u5C31\u8FD9\u6BB5\u9009\u4E2D\u6587\u5B57\u7ED9\u51FA\u89E3\u8BFB\u2014\u2014' +\n (env.state.sectionTitle || '\u7FFB\u8BD1') +\n '\uFF1A' +\n translation +\n (detail ? '\uFF1B\u8BE6\u89E3\uFF1A' + detail : '') +\n '\uFF09'\n return seed.length > 1500 ? seed.slice(0, 1500) + '\u2026' : seed\n }\n return {\n hideHistoryList,\n placeHistoryList,\n toggleHistoryList,\n noteUserScroll,\n noteBodyScroll,\n ensurePanelInsideViewport,\n get foldCount() { return foldCount },\n set foldCount(value) { foldCount = value },\n foldForHistory,\n renderTurns,\n get chatGrowWatch() { return chatGrowWatch },\n set chatGrowWatch(value) { chatGrowWatch = value },\n get panelGrowWatch() { return panelGrowWatch },\n set panelGrowWatch(value) { panelGrowWatch = value },\n currentSurfaceTheme,\n restoreFromHistory,\n visibleRaw,\n loadHistoryEntry,\n seedHistoryFromExplanation,\n ensureChatFollow,\n get FOLD_HISTORY_KEEP_LATEST() { return FOLD_HISTORY_KEEP_LATEST },\n set FOLD_HISTORY_KEEP_LATEST(value) { FOLD_HISTORY_KEEP_LATEST = value },\n historyTextOf,\n clearTransientNotice,\n saveHistory,\n applyToolEvent,\n ensurePanelInsideViewportNow,\n }\n}\n", "import { stopIcon, sendIcon } from './icons.js'\nimport { QUOTE_ONLY_QUESTION, API, PROMOTE } from './constants.js'\nimport { el } from './dom.js'\nimport { splitSections } from './render.js'\n\n/** conversation state and operations; dependencies are supplied as live node/callback accessors. */\nexport function createConversationController(env) {\n\n /** \u53D1\u9001\u6309\u94AE/\u8F93\u5165\u6846\u7684\u53EF\u7528\u72B6\u6001\uFF1A\u7A7A\u5185\u5BB9\u6216\u6B63\u5728\u751F\u6210\u65F6\u4E0D\u53EF\u53D1\u3002 */\n /** \u5F53\u524D\u6709\u6CA1\u6709\u4E00\u8F6E\u5728\u8DD1\uFF08\u9996\u8F6E/\u8BE6\u89E3 \u6216 \u8FFD\u95EE\uFF09\u3002 */\n function isGenerating() {\n return env.state.asking || env.state.phase === 'loading' || env.state.phase === 'streaming'\n }\n\n /**\n * \u53D1\u9001\u952E = \u300C\u53D1\u9001\u300D\u8FD8\u662F\u300C\u505C\u6B62\u300D\uFF1A\u751F\u6210\u4E2D\u53D8\u6210\u65B9\u5F62\u505C\u6B62\u952E\uFF08\u70B9\u4E86\u6253\u65AD\u8FD9\u6B21\u8F93\u51FA\uFF09\uFF0C\n * \u7A7A\u95F2\u65F6\u662F\u4E0A\u7BAD\u5934\u53D1\u9001\u952E\uFF08\u7A7A\u8F93\u5165\u624D\u7981\u7528\uFF09\u3002\n */\n /**\n * \u8F93\u5165\u6846\u8DDF\u7740\u5185\u5BB9\u957F\u9AD8\uFF08\u5230 132px \u4E3A\u6B62\uFF0C\u518D\u9AD8\u5C31\u5185\u90E8\u6EDA\u52A8\uFF09\u3002\n *\n * textarea \u7684**\u9AD8\u5EA6\u7531 rows \u51B3\u5B9A**\uFF0C\u5185\u5BB9\u6362\u884C\u5B83\u4E0D\u4F1A\u81EA\u5DF1\u957F \u2014\u2014 \u4E0D\u8865\u8FD9\u4E00\u6B65\uFF0C\u7B2C\u4E8C\u884C\u8D77\n * \u4E0B\u9762\u7684\u5B57\u5C31\u88AB\u88C1\u6389\u4E86\u3002\u8BED\u97F3\u8F93\u5165\u7684\u5B9E\u65F6\u5B57\u5E55\u6700\u5403\u4E8F\uFF1A\u5B57\u662F\u8FB9\u8BF4\u8FB9\u81EA\u5DF1\u957F\u51FA\u6765\u7684\uFF0C\n * \u7528\u6237\u6839\u672C\u6CA1\u5728\u6572\u952E\u76D8\uFF0C\u4E5F\u5C31\u4E0D\u4F1A\u60F3\u5230\u53BB\u62D6\u90A3\u4E2A\u6846\u3002\n * \u8D85\u8FC7\u4E0A\u9650\u65F6\u628A\u6700\u65B0\u90A3\u51E0\u884C\u6EDA\u8FDB\u89C6\u91CE\uFF08\u5B9E\u65F6\u843D\u5B57\u65F6\u5149\u6807\u4E00\u76F4\u5728\u672B\u5C3E\uFF09\u3002\n */\n function autoGrowAskBox() {\n if (!env.askBox || !env.askBox.style) return\n var cap = 132\n // \u5148\u677E\u5F00\u9AD8\u5EA6\u518D\u91CF\uFF0C\u5426\u5219\u91CF\u5230\u7684\u662F\u4E0A\u4E00\u6B21\u7684\u9AD8\u5EA6\uFF08\u7ECF\u5178\u9012\u5F52\u5F0F\u53D8\u9AD8\uFF09\n env.askBox.style.height = 'auto'\n var content = typeof env.askBox.scrollHeight === 'number' ? env.askBox.scrollHeight : 0\n if (content > 0) {\n env.askBox.style.height = Math.min(content, cap) + 'px'\n env.askBox.style.overflowY = content > cap ? 'auto' : 'hidden'\n } else {\n // \u91CF\u4E0D\u5230\u5185\u5BB9\uFF08\u9762\u677F\u6536\u7740 / DOM \u6869\uFF09\uFF1A\u4EA4\u56DE CSS \u7684 min-height\n env.askBox.style.height = ''\n env.askBox.style.overflowY = ''\n }\n try {\n if (content > cap) env.askBox.scrollTop = env.askBox.scrollHeight\n } catch (error) {\n /* \u6869\u73AF\u5883\u6CA1\u6709 scrollTop \u8BED\u4E49 */\n }\n // \u957F\u9AD8\u4E4B\u540E\u9762\u677F\u53EF\u80FD\u9876\u51FA\u89C6\u53E3\uFF1A\u62C9\u56DE\u6765\uFF08\u9762\u677F\u6CA1\u5F00\u65F6\u5B83\u81EA\u5DF1\u4F1A\u65E9\u9000\uFF09\n env.keepInsideViewport()\n }\n\n function refreshAskState() {\n autoGrowAskBox()\n var generating = isGenerating()\n var mode = generating ? 'stop' : 'send'\n if (env.askSend.getAttribute('data-mode') !== mode) {\n env.askSend.textContent = ''\n env.askSend.appendChild(generating ? stopIcon() : sendIcon())\n env.askSend.setAttribute('data-mode', mode)\n env.askSend.setAttribute('aria-label', generating ? '\u505C\u6B62' : '\u53D1\u9001')\n env.askSend.title = generating ? '\u505C\u6B62\u751F\u6210\uFF08\u70B9\u4E00\u4E0B\u6253\u65AD\u8FD9\u6B21\u8F93\u51FA\uFF09' : '\u53D1\u9001\uFF08Enter\uFF09'\n }\n env.askSend.disabled = generating ? false : !String(env.askBox.value || '').trim() && env.state.quotes.length === 0\n }\n\n /** \u505C\u6B62\u5F53\u524D\u8FD9\u4E00\u8F6E\uFF1A\u8FFD\u95EE\u8D70\u81EA\u5DF1\u7684 abort\uFF1B\u9996\u8F6E/\u8BE6\u89E3\u590D\u7528\"\u7528\u6237\u4E2D\u6B62\"\u90A3\u6761\u8DEF\u5F84\u3002 */\n function stopCurrent() {\n if (env.state.askRequest) {\n env.state.stopped = true\n try {\n env.state.askRequest.abort()\n } catch (error) {\n /* noop */\n }\n return true\n }\n if (env.state.request) {\n env.state.aborted = true // \u8BA9 fail() \u8D70\"\u5DF2\u505C\u6B62\"\u800C\u4E0D\u662F\"\u89E3\u8BFB\u5931\u8D25\"\n try {\n env.state.request.abort()\n } catch (error) {\n /* noop */\n }\n env.state.request = null\n return true\n }\n return false\n }\n\n /**\n * \u53D1\u9001\u4E00\u4E2A\u8FFD\u95EE\uFF08\u591A\u8F6E\uFF0C\u5E26\u5386\u53F2\uFF1B\u8D70 host \u7684 chat \u6A21\u5F0F\uFF09\u3002\n *\n * \u4E24\u6BB5\u5F0F\uFF1A\u5148**\u53D6\u5F15\u7528\u7684\u4E0A\u4E0B\u6587**\uFF08\u4F1A\u8BDD\u91CC\u90A3\u51E0\u6BB5\u8981\u95EE host \u8981\uFF0C\u89C1 resolveQuoteContexts\uFF09\uFF0C\n * \u518D\u771F\u6B63\u53D1\u3002\u53D6\u4E0A\u4E0B\u6587\u671F\u95F4\u7528 state.resolvingQuotes \u6321\u4F4F\u91CD\u590D\u53D1\u9001 \u2014\u2014\n * \u90A3\u4E00\u523B\u8F93\u5165\u6846\u548C\u5F15\u7528\u533A\u90FD\u5DF2\u7ECF\u6E05\u7A7A\u4E86\uFF0C\u518D\u6309\u4E00\u6B21 Enter \u4F1A\u53D8\u6210\"\u7A7A\u53D1\u4E00\u6761\"\u3002\n */\n function ask(question) {\n var generating = env.state.asking || env.state.phase === 'loading' || env.state.phase === 'streaming'\n if (generating) {\n // \u4EE5\u524D\u8FD9\u91CC\u662F\u9759\u9ED8 return \u2014\u2014 \u70B9\u4E86\u6CA1\u53CD\u5E94\uFF0C\u7528\u6237\u4E0D\u77E5\u9053\u5728\u7B49\u4EC0\u4E48\n env.setStatus('\u8FD8\u5728\u751F\u6210\uFF0C\u8BF7\u7A0D\u5019\u2026\uFF08\u751F\u6210\u5B8C\u5C31\u80FD\u8FFD\u95EE\uFF09')\n return\n }\n // \u8FD9\u6761\u6D88\u606F\u53D1\u51FA\u53BB\u4E86\uFF0C\u6B63\u5728\u5F55\u7684\u90A3\u4E00\u6BB5\u5C31\u4E0D\u518D\u662F\"\u4E0B\u4E00\u6761\u63D0\u95EE\"\u4E86\uFF1A\n // \u6536\u6389\u5B83\u53EF\u4EE5\u907F\u514D\"\u53D1\u9001\u540E\u9EA6\u514B\u98CE\u8FD8\u7EA2\u7740\"\uFF08\u7528\u6237\u4F1A\u4EE5\u4E3A\u8FD8\u5728\u5F55\uFF09\u3002\n // \u5DF2\u7ECF\u8BC6\u522B\u51FA\u6765\u7684\u6587\u5B57\u5728\u8F93\u5165\u6846\u91CC\uFF0C\u4E0D\u53D7\u5F71\u54CD\u3002\n if (env.voice.phase === 'recording' || env.voice.phase === 'requesting' || env.voice.phase === 'transcribing') {\n env.cancelVoice({ note: '\u5DF2\u505C\u6B62\u5F55\u97F3\uFF08\u8FD9\u6761\u5148\u53D1\u51FA\u53BB\uFF09' })\n }\n var asked = String(question || '').trim()\n // \u5F15\u7528\u5148\u53D6\u51FA\u6765\uFF1A\u53EA\u6302\u5F15\u7528\u3001\u6CA1\u5199\u95EE\u9898\u4E5F\u5141\u8BB8\u53D1\uFF08\u8FD9\u65F6\u7528\u4E00\u53E5\u515C\u5E95\u63D0\u95EE\uFF09\n var quotes = env.state.quotes.slice()\n if ((!asked && quotes.length === 0) || !env.state.payload) return\n if (env.state.resolvingQuotes) {\n env.setStatus('\u6B63\u5728\u53D6\u5F15\u7528\u7684\u4E0A\u4E0B\u6587\u2026')\n return\n }\n // \u26A0\uFE0F \u5230\u8FD9\u91CC\u624D\u7B97\"\u6536\u4E0B\u4E86\u8FD9\u6761\u63D0\u95EE\"\uFF0C\u6B64\u523B\u624D\u6E05\u7A7A\u8F93\u5165\u6846\u3002\n //\n // \u4EE5\u524D\u662F**\u8C03\u7528\u65B9\u5148\u6E05\u7A7A\u3001\u518D\u8C03 ask()**\uFF1A\u4E8E\u662F\"\u751F\u6210\u4E2D\u6309 Enter\"\u8FD9\u79CD\u88AB ask() \u62D2\u6389\u7684\u60C5\u51B5\uFF0C\n // \u8F93\u5165\u6846\u5DF2\u7ECF\u88AB\u6E05\u7A7A \u2014\u2014 \u7528\u6237\u6253\u7684\u5B57\u76F4\u63A5\u4E22\u4E86\uFF08\u53EA\u5269\u4E00\u53E5\"\u8FD8\u5728\u751F\u6210\uFF0C\u8BF7\u7A0D\u5019\u2026\"\uFF09\u3002\n // \u6E05\u7A7A\u653E\u5728\u8FD9\u91CC\uFF0C\u5C31\u4E0D\u4F1A\u518D\u51FA\u73B0\"\u6CA1\u9001\u51FA\u53BB\u5374\u6E05\u6389\u4E86\"\u3002\n // \u53EA\u6E05\"\u786E\u5B9E\u662F\u8FD9\u6761\u63D0\u95EE\u7684\u5185\u5BB9\"\uFF1Aask() \u4E5F\u53EF\u80FD\u88AB\u7A0B\u5E8F\u7528\u522B\u7684\u6587\u672C\u8C03\u7528\uFF08\u6D4B\u8BD5\u94A9\u5B50\u7B49\uFF09\uFF0C\n // \u90A3\u79CD\u60C5\u51B5\u4E0B\u8F93\u5165\u6846\u91CC\u7684\u4E1C\u897F\u4E0D\u8BE5\u88AB\u62B9\u6389\u3002\n if (env.askBox.value && String(env.askBox.value).trim() === asked) {\n env.askBox.value = ''\n refreshAskState()\n }\n // \u5F15\u7528\u662F\"\u4E0B\u4E00\u6761\u63D0\u95EE\"\u7684\uFF1A\u7ACB\u523B\u6E05\u7A7A\uFF08\u63D0\u95EE\u5DF2\u7ECF\u5728\u624B\u4E0A\uFF0C\u522B\u8BA9\u4E0B\u4E00\u8F6E\u53C8\u5E26\u4E0A\uFF09\n if (quotes.length > 0) {\n env.state.quotes = []\n env.renderQuotes()\n refreshAskState()\n }\n if (quotes.length === 0) {\n sendAsk(asked, quotes)\n return\n }\n env.state.resolvingQuotes = true\n env.resolveQuoteContexts(quotes).then(function (resolved) {\n env.state.resolvingQuotes = false\n sendAsk(asked, resolved)\n })\n }\n\n /** \u771F\u6B63\u628A\u8FD9\u4E00\u8F6E\u53D1\u51FA\u53BB\uFF08\u5F15\u7528\u5DF2\u7ECF\u5E26\u4E0A\u4E0A\u4E0B\u6587\u4E86\uFF09\u3002 */\n function sendAsk(asked, quotes) {\n var payload = env.state.payload\n if (!payload) return\n // \u5F15\u7528\u62FC\u8FDB**\u8FD9\u4E00\u6761**\u6D88\u606F\uFF1A\u53D1\u7ED9\u6A21\u578B\u3001\u8FDB\u5386\u53F2\u3001\u5347\u683C\u7528\u7684\u90FD\u662F\u62FC\u597D\u7684\u90A3\u4EFD\n var sent = env.composeQuestion(quotes, asked)\n if (env.state.turns.length === 0 && (env.state.raw.trim() || env.state.parts.translation || env.state.parts.detail)) {\n env.state.turns.push({ role: 'assistant', text: env.seedHistoryFromExplanation(), seed: true, hidden: true })\n }\n env.state.turns.push({ role: 'user', text: asked || QUOTE_ONLY_QUESTION, quotes: quotes, sent: sent })\n // asking \u53EA\u7BA1\"\u7B49\u5F85\u7279\u6548\u8981\u4E0D\u8981\u663E\u793A\"\uFF08\u9996\u5B57\u4E00\u5230\u5C31\u7F6E false\uFF09\uFF0C\n // streaming \u624D\u662F\"\u8FD9\u4E00\u8F6E\u8FD8\u6CA1\u5199\u5B8C\"\u3002\u4E24\u8005\u5FC5\u987B\u5206\u5F00\uFF1A\u4EE5\u524D\u62FF asking \u5F53\u5B9A\u7A3F\u5224\u636E\uFF0C\n // \u7ED3\u679C\u662F\u9996\u5B57\u4E00\u5230\u5C31\u8BA4\u5B9A\"\u5B9A\u7A3F\u4E86\"\u2192 \u6BCF\u4E2A delta \u90FD\u91CD\u5EFA\u4E00\u4E2A iframe\uFF08\u5B9E\u6D4B\u4E00\u6761\u56DE\u7B54\u5EFA\u4E86 24 \u4E2A\uFF09\uFF0C\n // \u65E2\u770B\u4E0D\u5230\u6E90\u7801\uFF0C\u6700\u540E\u4E00\u5E27\u8FD8\u56E0\u4E3A\u8FDE\u7EED\u9500\u6BC1/\u52A0\u8F7D\u800C\u5361\u6210\u7A7A\u767D\uFF0C\u5F97\u5173\u6389\u5C0F\u7A97\u91CD\u5F00\u624D\u6E32\u67D3\u3002\n var answerTurn = {\n role: 'assistant',\n text: '',\n asking: true,\n streaming: true,\n startedAt: Date.now(),\n thought: '',\n effort: env.state.chatEffort || 'high',\n }\n env.state.turns.push(answerTurn)\n env.state.asking = true\n env.state.askingStartedAt = Date.now()\n env.syncPanelStage()\n // \u53D1\u8FC7\u8FFD\u95EE\u4E86\uFF1A\u628A\u300C\u5C55\u5F00\u8BE6\u89E3\u300D\u6536\u8D77\u6765\n env.syncExpandCta()\n refreshAskState()\n // \u521A\u53D1\u51FA\u7684\u95EE\u9898\u5FC5\u987B\u7ACB\u523B\u53EF\u89C1\uFF08\u7528\u6237\u4E3B\u52A8\u53D1\u7684\u8BDD\uFF0C\u8DDF\u5230\u5E95\uFF09\n env.state.follow = true\n env.ensureChatFollow()\n env.renderTurns({ stick: true })\n // \u4E4B\u540E\u4E0D\u518D\"\u5B9A\u65F6\u786C\u8D34\"\uFF1A\u9762\u677F\u5207\u5BBD\u7248\u7684\u91CD\u6392\u3001\u601D\u8003\u5C3E\u5DF4\u3001\u9884\u89C8 iframe \u4E0A\u62A5\u9AD8\u5EA6\u2026\u2026\n // \u90FD\u4F1A\u8BA9\u6D88\u606F\u533A\u957F\u9AD8\uFF0C\u7531 ResizeObserver \u8D1F\u8D23\u7EED\u8D34\uFF1B\u5B9A\u65F6\u786C\u8D34\u4F1A\u5728\u7528\u6237\u7FFB\u770B\u4E0A\u6587\u65F6\u628A\u4ED6\u62FD\u56DE\u5E95\u90E8\u3002\n if (env.state.sessionOpen !== undefined) { /* noop */ }\n var startedAt = Date.now()\n var timer = setInterval(function () {\n env.paintPill()\n // \u8FFD\u95EE\u671F\u95F4\u4E5F\u4E00\u6837\uFF1A\u53EA\u62A5\"\u5728\u68C0\u7D22/\u5728\u751F\u6210\"\uFF0C\u4E0D\u62A5\u5DE5\u5177\u7EC6\u8282\n env.setStatus(\n (env.state.toolBusy ? '\u6B63\u5728\u68C0\u7D22\u8D44\u6599\u2026 ' : '\u8FFD\u95EE\u4E2D\u2026 ') + ((Date.now() - startedAt) / 1000).toFixed(1) + 's',\n )\n updateWaitClocks()\n }, 200)\n env.timers.push(timer)\n\n var historyTurns = env.state.turns.slice(0, env.state.turns.length - 2)\n var history = historyTurns.map(function (turn, index) {\n // \u6700\u8FD1\u4E00\u8F6E\u4FDD\u6301\u539F\u6837\uFF08\u53EF\u80FD\u8FD8\u8981\"\u6539\u8FD9\u4E00\u9875\u7684\u7248\u5F0F\"\uFF09\uFF0C\u66F4\u65E9\u7684\u6574\u9875 HTML \u6298\u53E0\u6210 Markdown\u3002\n // \u6298\u53E0\u7ED3\u679C\u7F13\u5B58\u5728 turn \u4E0A\uFF1A\u540C\u4E00\u8F6E\u53EA\u6298\u4E00\u6B21\uFF0C\u4E4B\u540E\u6BCF\u8F6E\u76F4\u63A5\u590D\u7528\u3002\n var keepRaw = env.FOLD_HISTORY_KEEP_LATEST && index === historyTurns.length - 1\n return { role: turn.role, text: env.historyTextOf(turn, keepRaw) }\n })\n\n // \u8FD9\u4E00\u8F6E\u7684 abort \u53E5\u67C4\uFF1A\u751F\u6210\u4E2D\u6309\u300C\u505C\u6B62\u300D\u4F1A\u6253\u65AD\u5B83\uFF08\u4E0D\u662F\u5931\u8D25\uFF0C\u4FDD\u7559\u5DF2\u6D41\u51FA\u7684\u5185\u5BB9\uFF09\n env.state.stopped = false\n var askController = new AbortController()\n env.state.askRequest = {\n abort: function () {\n try {\n askController.abort()\n } catch (error) {\n /* noop */\n }\n },\n }\n\n function finish(error) {\n clearInterval(timer)\n env.state.asking = false\n env.state.toolBusy = false\n // \u672C\u8F6E\u7ED3\u675F\u4E86\uFF1A\"\u6B63\u5728\u6574\u7406\u7ED3\u8BBA\u2026\"\u8FD9\u7C7B\u8FC7\u7A0B\u63D0\u793A\u4E00\u5F8B\u64A4\u6389\uFF08\u7ED3\u8BBA\u8F6E\u4E00\u4E2A\u5B57\u6CA1\u5410\u65F6\u4E5F\u522B\u7559\u7740\uFF09\n env.clearTransientNotice(answerTurn)\n answerTurn.asking = false\n answerTurn.streaming = false\n clearWaiting(env.chatLog)\n env.saveHistory()\n env.syncPanelStage()\n refreshAskState()\n env.state.askRequest = null\n if (env.state.stopped) {\n // \u7528\u6237\u70B9\u4E86\u300C\u505C\u6B62\u300D\uFF1A\u4E0D\u7B97\u5931\u8D25\uFF0C\u4FDD\u7559\u5DF2\u7ECF\u6D41\u51FA\u6765\u7684\u5185\u5BB9\n answerTurn.stopped = true\n env.state.stopped = false\n } else if (error) {\n answerTurn.error = true\n answerTurn.text = '\u8FFD\u95EE\u5931\u8D25\uFF1A' + error\n }\n env.renderTurns()\n env.setStatus(\n answerTurn.stopped\n ? '\u5DF2\u505C\u6B62\uFF08\u4F60\u6253\u65AD\u4E86\u8FD9\u6B21\u8F93\u51FA\uFF09'\n : error\n ? ''\n : '\u8FFD\u95EE\u5B8C\u6210 \u00B7 \u8017\u65F6 ' + ((Date.now() - startedAt) / 1000).toFixed(1) + 's',\n )\n // \u4E00\u8F6E**\u8FFD\u95EE**\u7ED3\u675F\uFF08\u6210\u529F / \u5931\u8D25 / \u88AB\u505C\u6B62\uFF09\u2014\u2014 \u4E0E\u5C0F\u7A97\u5176\u5B83\u8F6E\u540C\u4E00\u6761\u89C4\u5219\uFF1A\u5149\u6807\u4EA4\u56DE\u8F93\u5165\u6846\u3002\n // \u26A0\uFE0F \u8FD9\u91CC\u539F\u6765\u662F\u6F0F\u7684\uFF1A\u9996\u8F6E\u7684 succeed/fail \u6709\u89C4\u5219\uFF0C\u8FFD\u95EE\u8FD9\u6761\u8DEF\u5F84\u6CA1\u6709\uFF0C\n // \u6240\u4EE5\"\u8FFD\u95EE\u5931\u8D25\"\u4E4B\u540E\u8F93\u5165\u6846\u91CC\u4E0D\u51FA\u73B0\u5149\u6807\uFF08\u7528\u6237\u5B9E\u6D4B\uFF09\u3002\n env.askFocusAfterTurn()\n }\n\n fetch(API, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n text: payload.text,\n context: payload.context,\n label: payload.label,\n sessionId: env.panelOrCurrentSessionId(),\n question: sent,\n history: history,\n // \u7F51\u9875\u8F93\u51FA\u8981\u8DDF\u7740\u5F53\u524D\u6DF1\u6D45\u8D70\uFF1A\u6DF1\u8272 Harness \u91CC\u7ED9\u4E00\u5F20\u767D\u5E95\u9875\u9762\u4F1A\u5F88\u523A\u773C\n ...(env.state.webAnswer ? { webAnswer: true, theme: env.currentSurfaceTheme() } : {}),\n ...(env.state.modelChoice ? { provider: env.state.modelChoice.provider, model: env.state.modelChoice.model } : {}),\n ...(env.state.effort ? { effort: env.state.effort } : {}),\n ...(env.state.toolDigest ? { toolDigest: env.state.toolDigest } : {}),\n }),\n signal: askController.signal,\n })\n .then(function (response) {\n if (!response.ok) {\n return response\n .json()\n .catch(function () {\n return {}\n })\n .then(function (data) {\n throw new Error(data && data.error ? data.error : 'HTTP ' + response.status)\n })\n }\n var reader = response.body.getReader()\n var decoder = new TextDecoder()\n var buffer = ''\n function handle(block) {\n var lines = block.split('\\n')\n for (var i = 0; i < lines.length; i++) {\n var line = lines[i]\n if (line.indexOf('data:') !== 0) continue\n var json = line.slice(5).trim()\n if (!json) continue\n var message\n try {\n message = JSON.parse(json)\n } catch (error) {\n continue\n }\n if (message.type === 'delta') {\n // \u6B63\u6587\u5F00\u59CB\u5230\u8FBE \u2192 \u64A4\u6389\"\u6B63\u5728\u6574\u7406\u7ED3\u8BBA\u2026\"\u8FD9\u7C7B\u8FC7\u7A0B\u63D0\u793A\uFF08\u4EE5\u524D\u5B83\u6C38\u8FDC\u6302\u7740\uFF09\n env.clearTransientNotice(answerTurn)\n if (!answerTurn.text.trim()) answerTurn.asking = false\n answerTurn.text += message.text\n scheduleTurnsRender()\n } else if (message.type === 'thought') {\n // \u8FFD\u95EE\u4E5F\u80FD\u770B\u5230\"\u5728\u60F3\u4EC0\u4E48\"\uFF1B\u53EA\u6539\u6587\u672C\uFF0C\u4E0D\u91CD\u7ED8\n answerTurn.thought = (answerTurn.thought + message.text).slice(-400)\n } else if (message.type === 'start') {\n if (message.effort) answerTurn.effort = String(message.effort)\n } else if (message.type === 'drop') {\n // \u540C\u9996\u8F6E\uFF1A\u5DE5\u5177\u8F6E\u91CC\u7684\u65C1\u767D\u4E0D\u7B97\u7B54\u6848\uFF0C\u64A4\u56DE\u53BB\u5E76\u6302\u5230\u601D\u8003\u5C3E\u5DF4\u4E0A\n var askDrop = typeof message.chars === 'number' ? message.chars : 0\n var askDropText = typeof message.text === 'string' ? message.text : ''\n var askDropped = ''\n if (askDropText && answerTurn.text.length >= askDropText.length && answerTurn.text.slice(-askDropText.length) === askDropText) {\n askDropped = askDropText\n answerTurn.text = answerTurn.text.slice(0, answerTurn.text.length - askDropText.length)\n } else if (askDrop > 0 && answerTurn.text.length > 0) {\n askDropped = answerTurn.text.slice(Math.max(0, answerTurn.text.length - askDrop))\n answerTurn.text = answerTurn.text.slice(0, Math.max(0, answerTurn.text.length - askDrop))\n }\n if (askDropped.trim()) answerTurn.thought = (answerTurn.thought + ' ' + askDropped.replace(/\\s+/g, ' ')).slice(-400)\n env.renderTurns()\n } else if (message.type === 'tool') {\n // \u8FFD\u95EE\u91CC\u7684\u68C0\u7D22\u540C\u6837\u53EA\u7559\u72B6\u6001\uFF0C\u4E0D\u7559\u65E5\u5FD7\n env.applyToolEvent(message)\n } else if (message.type === 'strip') {\n // host \u5224\u5B9A\"\u8FD9\u6BB5\u662F\u6A21\u578B\u5199\u8FDB\u6B63\u6587\u7684\u601D\u8003\"\uFF1A\u4ECE\u5DF2\u6D41\u51FA\u7684\u6B63\u6587\u91CC\u628A\u8FD9\u6BB5\u524D\u7F00\u64A4\u6389\n var stripText = typeof message.text === 'string' ? message.text : ''\n if (stripText && answerTurn.text.indexOf(stripText) === 0) {\n answerTurn.text = answerTurn.text.slice(stripText.length)\n env.renderTurns()\n }\n } else if (message.type === 'notice') {\n // host \u53D1\u73B0\u6863\u4F4D\u88AB\u4E0A\u6E38\u62D2\u7EDD\uFF08400/401/500\uFF09\u4F1A\u81EA\u52A8\u53BB\u6389\u6863\u4F4D\u91CD\u8BD5\uFF0C\u8FD9\u91CC\u5982\u5B9E\u544A\u8BC9\u7528\u6237\uFF0C\n // \u5E76\u628A\"\u8FD9\u4E2A\u6A21\u578B\u4E0D\u5403\u8FD9\u4E2A\u6863\u4F4D\"\u8BB0\u4E0B\u6765 \u2014\u2014 \u4E0B\u6B21\u4E0D\u518D\u62FF\u540C\u4E00\u4E2A\u7EC4\u5408\u53BB\u649E\u5899\n answerTurn.notice = String(message.text || '')\n // \u8BB0\u4E0B code\uFF1A'conclusion-retry' \u662F\"\u8FDB\u884C\u4E2D\"\u72B6\u6001\uFF0C\u6B63\u6587\u5230\u4E86/\u672C\u8F6E\u7ED3\u675F\u5C31\u8BE5\u64A4\n answerTurn.noticeCode = String(message.code || '')\n if ((message.code === 'effort-rejected' || message.code === 'reasoning-leak') && message.tier) {\n // \u8BB0\u4E0B\"\u8FD9\u4E2A\u6A21\u578B\u7684\u8FD9\u4E00\u6863\u88AB\u62D2 / \u4F1A\u6CC4\u6F0F\"\uFF0C\u83DC\u5355\u91CC\u7ED9\u5B83\u5212\u4E00\u9053\u659C\u7EBF\uFF08\u4E0B\u6B21\u4E0D\u518D\u649E\uFF09\n env.rememberBadTier(message.tier, message.code === 'reasoning-leak' ? 'leak' : 'rejected')\n // **\u4E0D\u52A8**\u7528\u6237\u9009\u7684\u90A3\u4E00\u683C\uFF1A\u8BBE\u7F6E\u9875\u4E0E\u83DC\u5355\u8BFB\u7684\u5C31\u662F\u5B83\uFF08\u552F\u4E00\u4E00\u4EFD\u6570\u636E\uFF09\uFF0C\n // \u6084\u6084\u6E05\u6389\u4F1A\u8BA9\u4EBA\u4EE5\u4E3A\u81EA\u5DF1\u6CA1\u9009\u8FC7\uFF1B\u8FD9\u4E00\u8F6E\u8BE5\u53D1\u4EC0\u4E48\u7531 host \u7684\u6362\u6863\u91CD\u8BD5\u515C\u3002\n env.paintModelPill()\n }\n scheduleTurnsRender() } else if (message.type === 'error') {\n finish(message.message || '\u6A21\u578B\u8FD4\u56DE\u9519\u8BEF')\n }\n }\n }\n function pump() {\n return reader.read().then(function (result) {\n if (result.done) {\n if (buffer.trim()) handle(buffer)\n if (!answerTurn.error) finish(null)\n return\n }\n buffer += decoder.decode(result.value, { stream: true })\n var index\n while ((index = buffer.indexOf('\\n\\n')) >= 0) {\n var block = buffer.slice(0, index)\n buffer = buffer.slice(index + 2)\n handle(block)\n }\n return pump()\n })\n }\n return pump()\n })\n .catch(function (error) {\n finish(String((error && error.message) || error))\n })\n }\n\n /** \u7B49\u5F85\u63D0\u793A\u8981\u4E0D\u8981\u663E\u793A\"\u6B63\u5728\u68C0\u7D22\u8D44\u6599\"\uFF08\u9ED8\u8BA4\u5171\u7528\u5168\u5C40\u7684\u68C0\u7D22\u5F00\u5173\uFF09\u3002 */\n function toolBusyNow() {\n return !!env.state.toolBusy\n }\n\n /**\n * \u7B49\u5F85\u7279\u6548\uFF1A\u547C\u5438\u70B9 + \u6587\u6848 + \u5B9E\u65F6\u79D2\u6570 + \u6162\u901F\u6D41\u5149\u6761\u3002\n *\n * \u7528**\u6CE8\u518C\u8868**\u800C\u4E0D\u662F\u5355\u4E2A\u5F15\u7528\uFF1A\u9996\u8F6E\u89E3\u8BFB\u548C\u8FFD\u95EE\u53EF\u80FD\u540C\u65F6\u5728\u8DD1\uFF0C\u5404\u81EA\u6709\u81EA\u5DF1\u7684\u8D77\u59CB\u65F6\u95F4\u3001\n * \u63A8\u7406\u6863\u4F4D\u548C\u601D\u8003\u5C3E\u5DF4\uFF0C\u4E0D\u80FD\u4E92\u76F8\u76D6\u3002\u5173\u952E\u4ECD\u7136\u662F**\u540C\u5904\u540C\u6587\u6848\u590D\u7528\u8282\u70B9**\u2014\u2014\u6BCF\u5E27\u91CD\u5EFA\u4F1A\u8BA9\n * CSS \u52A8\u753B\u4ECE 0% \u91CD\u6765\uFF0C\u770B\u8D77\u6765\u5C31\u662F\"\u4E00\u76F4\u5728\u95EA\"\u3002\n */\n /**\n * \u8FFD\u95EE\u6D41\u5F0F\u671F\u95F4**\u9650\u901F\u91CD\u7ED8**\uFF1A\u6574\u5757\u91CD\u5EFA\u6C14\u6CE1 + \u91CD\u65B0\u8BED\u6CD5\u9AD8\u4EAE\u5F88\u8D35\uFF0C\n * \u4E00\u6761 6KB \u7F51\u9875\u56DE\u7B54\u6309\u6BCF delta \u91CD\u7ED8\u4F1A\u9020 **22 \u4E07\u4E2A DOM \u8282\u70B9**\uFF08\u5B9E\u6D4B\uFF09\uFF0C\u5C0F\u7A97\u5C31\u662F\u5361\u5728\u8FD9\u91CC\u3002\n * \u9650\u5230 ~11 \u6B21/\u79D2\uFF1A\u89C2\u611F\u4E0A\u4ECD\u662F\u6D41\u5F0F\uFF0C\u8282\u70B9\u91CF\u964D\u4E00\u4E2A\u6570\u91CF\u7EA7\uFF1B\u6536\u5C3E\u90A3\u4E00\u6B21\u7167\u65E7\u7ACB\u523B\u91CD\u7ED8\u3002\n */\n function scheduleTurnsRender() {\n if (env.turnsRenderPending) return\n var wait = Math.max(0, env.lastTurnsRenderAt + env.STREAM_RENDER_MS - Date.now())\n env.turnsRenderPending = true\n env.later(function () {\n env.turnsRenderPending = false\n env.lastTurnsRenderAt = Date.now()\n env.renderTurns()\n }, wait)\n }\n\n function showWaiting(container, label, options) {\n var text = label || '\u6B63\u5728\u751F\u6210\u2026'\n var opts = options || {}\n var entry = null\n for (var i = 0; i < env.waitList.length; i += 1) {\n if (env.waitList[i].host === container) {\n entry = env.waitList[i]\n break\n }\n }\n if (\n entry &&\n entry.label === text &&\n entry.node &&\n entry.node.parentNode === container &&\n container.children.length === 1\n ) {\n entry.startedAt = opts.startedAt || entry.startedAt\n updateWaitClocks()\n return entry\n }\n container.textContent = ''\n var wrap = el('div', 'dsh-sel-wait')\n var line = el('div', 'dsh-sel-waitline')\n var dots = el('span', 'dsh-sel-dots')\n dots.appendChild(el('i'))\n dots.appendChild(el('i'))\n dots.appendChild(el('i'))\n line.appendChild(dots)\n line.appendChild(el('span', null, text))\n var clock = el('span', 'dsh-sel-waitclock', '')\n line.appendChild(clock)\n wrap.appendChild(line)\n var hint = el('div', 'dsh-sel-waithint', '')\n wrap.appendChild(hint)\n var row = el('div', 'dsh-sel-skrow')\n var widths = ['100%', '66%']\n for (var b = 0; b < widths.length; b += 1) {\n var bar = el('div', 'dsh-sel-sk')\n bar.style.width = widths[b]\n row.appendChild(bar)\n }\n wrap.appendChild(row)\n container.appendChild(wrap)\n if (!entry) {\n entry = { host: container }\n env.waitList.push(entry)\n }\n entry.node = wrap\n entry.label = text\n entry.clock = clock\n entry.hint = hint\n entry.startedAt = opts.startedAt || Date.now()\n entry.effort = opts.effort || ''\n entry.effortOf = opts.effortOf || null\n entry.thoughtOf = opts.thoughtOf || null\n entry.noticeOf = opts.noticeOf || null\n entry.busyOf = opts.busyOf || toolBusyNow\n updateWaitClocks()\n return entry\n }\n\n /** \u6E05\u6389\u7B49\u5F85\u8282\u70B9\uFF08\u53EF\u6309\u5BB9\u5668\u6E05\uFF0C\u4E5F\u53EF\u5168\u6E05\uFF09\u3002\u8282\u70B9\u88AB\u522B\u7684\u6E32\u67D3\u9876\u6389\u65F6 entry \u4F1A\u88AB\u81EA\u52A8\u56DE\u6536\u3002 */\n function clearWaiting(container) {\n for (var i = env.waitList.length - 1; i >= 0; i -= 1) {\n var entry = env.waitList[i]\n if (container && entry.host !== container) continue\n if (entry.node && entry.node.parentNode) entry.node.parentNode.removeChild(entry.node)\n env.waitList.splice(i, 1)\n }\n }\n\n /** \u79D2\u6570/\u601D\u8003\u5C3E\u5DF4\u7531 200ms \u7684 ticker \u76F4\u63A5\u5199\u5B57\uFF08\u4E0D\u91CD\u5EFA DOM\uFF0C\u52A8\u753B\u4E0D\u4E2D\u65AD\uFF09\u3002 */\n function updateWaitClocks() {\n for (var i = env.waitList.length - 1; i >= 0; i -= 1) {\n var entry = env.waitList[i]\n if (!entry.node || !entry.node.parentNode) {\n // \u5BBD\u9650\u51E0\u62CD\u518D\u56DE\u6536\uFF1A\u65B0\u5EFA\u7684\u8282\u70B9\u53EF\u80FD\u8FD8\u6CA1\u6302\u8FDB DOM\uFF08\u6302\u8F7D\u4E0E\u6E32\u67D3\u662F\u4E24\u6B65\uFF09\n entry.missed = (entry.missed || 0) + 1\n if (entry.missed > 3) env.waitList.splice(i, 1)\n continue\n }\n entry.missed = 0\n var seconds = entry.startedAt ? (Date.now() - entry.startedAt) / 1000 : 0\n if (entry.clock) entry.clock.textContent = seconds >= 0.3 ? seconds.toFixed(1) + 's' : ''\n if (!entry.hint) continue\n var thinking = entry.thoughtOf ? String(entry.thoughtOf() || '') : ''\n thinking = thinking.replace(/\\s+/g, ' ').trim()\n var notice = entry.noticeOf ? String(entry.noticeOf() || '') : ''\n notice = notice.replace(/\\s+/g, ' ').trim()\n if (entry.busyOf && entry.busyOf()) {\n // \u68C0\u7D22\u9636\u6BB5\uFF1A\u53EA\u8BF4\"\u5728\u67E5\u8D44\u6599\"\u3002\u67E5\u8BE2\u8BCD/\u547D\u4E2D/\u94FE\u63A5\u90FD\u4E0D\u8FDB\u5C0F\u7A97\uFF08\u90A3\u662F\u6A21\u578B\u7684\u539F\u6599\uFF0C\u4E0D\u662F\u7ED3\u679C\uFF09\n entry.hint.textContent = '\uD83D\uDD0D \u6B63\u5728\u68C0\u7D22\u8D44\u6599\u2026'\n } else if (notice) {\n // host \u7684\"\u6B63\u5728\u6362\u6863\u91CD\u8BD5 / \u4E0A\u6E38\u5076\u53D1\u9519\u8BEF\"\u6BD4\u601D\u8003\u5C3E\u5DF4\u66F4\u8BE5\u8BA9\u4EBA\u770B\u89C1\uFF08\u5B83\u89E3\u91CA\u4E86\u8FD9\u6BB5\u65F6\u95F4\u53BB\u54EA\u4E86\uFF09\n entry.hint.textContent = '\u21BB ' + notice.slice(-72)\n } else if (thinking) {\n // \u770B\u5F97\u89C1\u5B83\u5728\u60F3\u4EC0\u4E48\uFF0C\u5C31\u4E0D\u4F1A\u4EE5\u4E3A\"\u6CA1\u53CD\u5E94\"\u4E86\n entry.hint.textContent = '\uD83D\uDCAD ' + thinking.slice(-72)\n } else {\n // \u7B49\u8FC7 6 \u79D2\u5C31\u8BF4\u660E\u4E00\u53E5\"\u8FD9\u662F\u6B63\u5E38\u7684\"\uFF0C\u5426\u5219\u7528\u6237\u53EA\u4F1A\u89C9\u5F97\u5361\u4F4F\u4E86\n var effort = entry.effortOf ? String(entry.effortOf() || '') : entry.effort\n entry.hint.textContent = seconds >= 6 ? '\u63A8\u7406\u6863\u4F4D ' + (effort || 'high') + '\uFF1A\u9996\u5B57\u901A\u5E38 4\u20138 \u79D2' : ''\n }\n }\n }\n\n function runRequest(payload, cacheKey, options) {\n env.state.cacheState = 'miss'\n if (env.state.request) env.state.request.abort()\n var controller = new AbortController()\n env.state.request = {\n abort: function () {\n try {\n controller.abort()\n } catch (error) {\n /* noop */\n }\n },\n }\n env.state.raw = ''\n env.state.phase = 'loading'\n env.state.error = ''\n env.state.chars = 0\n env.state.fromCache = false\n env.state.sharedCache = false\n env.state.toolBusy = false\n env.state.aborted = false\n env.state.stageEffort = ''\n env.state.thought = ''\n env.state.notice = ''\n env.state.tools = []\n env.state.startedAt = Date.now()\n env.state.elapsed = 0\n env.paint()\n\n var ticker = setInterval(function () {\n env.paintPill()\n if (env.state.phase === 'loading' || env.state.phase === 'streaming') {\n env.setStatus(env.progressText())\n // \u5361\u7247\u91CC\u7684\u7B49\u5F85\u7279\u6548\u4E5F\u8D70\u79D2\uFF08\u53EA\u6539\u6587\u672C\u3001\u4E0D\u91CD\u5EFA\u8282\u70B9 \u2192 \u52A8\u753B\u4E0D\u4E2D\u65AD\uFF09\n updateWaitClocks()\n }\n }, 200)\n env.timers.push(ticker)\n\n function stopTicker() {\n clearInterval(ticker)\n }\n\n function fail(message) {\n if (env.state.phase === 'done') return\n // \u7528\u6237\u6536\u8D77\u5C0F\u7A97\u5BFC\u81F4\u7684\u4E2D\u6B62\uFF1A\u4E0D\u7B97\u5931\u8D25\uFF0C\u8BB0\u6210\"\u5DF2\u505C\u6B62\"\uFF0C\u91CD\u5F00\u8FD8\u80FD\u63A5\u7740\u770B\n env.state.phase = env.state.aborted ? 'paused' : 'error'\n env.state.error = env.state.aborted ? '' : message\n // \u4E00\u8F6E\u5931\u8D25/\u4E2D\u6B62\u7ED3\u675F \u2192 \u540C\u6837\u628A\u5149\u6807\u4EA4\u56DE\u8F93\u5165\u6846\uFF0C\u7528\u6237\u53EF\u4EE5\u76F4\u63A5\u91CD\u8BD5\u6216\u6362\u4E2A\u95EE\u6CD5\n env.askFocusAfterTurn()\n env.state.toolBusy = false\n env.state.elapsed = Date.now() - env.state.startedAt\n stopTicker()\n env.state.request = null\n clearWaiting()\n env.paint()\n }\n\n function succeed() {\n env.state.phase = 'done'\n // \u4E00\u8F6E\u6210\u529F\u7ED3\u675F \u2192 \u5149\u6807\u4EA4\u56DE\u8F93\u5165\u6846\uFF08\u5C0F\u7A97\u81EA\u5DF1\u7684\u89C4\u5219\uFF0C\u89C1 askFocusAfterTurn\uFF09\n env.askFocusAfterTurn()\n // \u6309\u5185\u5BB9\u5F52\u5E76\uFF08stage \u53EA\u51B3\u5B9A\"\u8BF7\u6C42\u54EA\u4E00\u8282\"\uFF0C\u4E0D\u51B3\u5B9A\u7ED3\u679C\u843D\u5230\u54EA\u4E2A\u683C\u5B50\uFF09\uFF1A\n // \u6A21\u578B\u5076\u5C14\u4F1A\u4E24\u8282\u90FD\u5199\uFF0C\u6216\u6CA1\u5199\u6807\u9898\uFF0C\u8FD9\u91CC\u90FD\u8981\u63A5\u4F4F\n var parsed = splitSections(env.visibleRaw())\n var translation = parsed.translation.trim()\n var detail = parsed.detail.trim()\n var loose = parsed.other.trim()\n if (!translation && !detail && loose) {\n if (env.state.stage === 'detail') detail = loose\n else translation = loose\n }\n if (translation) env.state.parts.translation = translation\n if (detail) env.state.parts.detail = detail\n env.state.elapsed = Date.now() - env.state.startedAt\n env.state.chars = env.state.raw.length\n env.state.toolBusy = false\n stopTicker()\n env.state.request = null\n clearWaiting()\n if (cacheKey) env.cache.set(cacheKey, { parts: { ...env.state.parts }, turns: env.state.turns.slice() })\n env.saveHistory()\n env.paint()\n }\n\n /** \u672C\u6B21 read \u662F\u5426\u5E26\u6765\u4F1A\u6539\u53D8\u753B\u9762\u7684\u5185\u5BB9\uFF08\u601D\u8003\u6D41\u4E0D\u6539\u53D8\u753B\u9762 \u2192 \u4E0D\u89E6\u53D1\u91CD\u7ED8\uFF09\u3002 */\n var dirty = false\n\n function handleEvent(block) {\n var lines = block.split('\\n')\n for (var i = 0; i < lines.length; i++) {\n var line = lines[i]\n if (line.indexOf('data:') !== 0) continue\n var json = line.slice(5).trim()\n if (!json) continue\n var message\n try {\n message = JSON.parse(json)\n } catch (error) {\n continue\n }\n if (message.type === 'start') {\n env.state.model = message.model ? message.provider + ' \u00B7 ' + message.model : message.provider || ''\n if (message.stage) env.state.stage = message.stage\n if (message.effort) env.state.stageEffort = String(message.effort)\n if (message.cached) {\n env.state.sharedCache = true\n env.state.cacheState = 'shared'\n }\n if (env.state.phase === 'loading') env.state.phase = 'streaming'\n dirty = true\n updateWaitClocks()\n } else if (message.type === 'delta') {\n env.state.raw += message.text\n env.state.phase = 'streaming'\n // \u6B63\u6587\u5230\u4E86 = \u90A3\u6B21\u6362\u6863\u91CD\u8BD5\u6210\u529F\u4E86\uFF0C\u7B49\u5F85\u63D0\u793A\u91CC\u90A3\u53E5\"\u5DF2\u81EA\u52A8\u91CD\u8BD5\"\u4E0D\u5FC5\u518D\u6302\u7740\n env.state.notice = ''\n dirty = true\n } else if (message.type === 'notice') {\n // host \u7684\"\u6B63\u5728\u6362\u6863\u91CD\u8BD5 / \u4E0A\u6E38\u5076\u53D1\u9519\u8BEF\"\uFF1A\u4EE5\u524D\u8FD9\u6761\u5206\u652F\u4E0D\u5B58\u5728\uFF0C\u5168\u88AB\u4E22\u6389\u3002\n // \u4E0D schedulePaint\uFF1A\u7531 200ms \u7684 ticker \u5199\u5B57\uFF0C\u548C thought \u540C\u4E00\u6761\u8DEF\u3002\n env.state.notice = String(message.text || '')\n } else if (message.type === 'thought') {\n // \u53EA\u7559\u5C3E\u5DF4\uFF1A\u7B49\u5F85\u63D0\u793A\u91CC\u663E\u793A\"\u6B63\u5728\u60F3\u4EC0\u4E48\"\uFF0C\u4E0D\u7ED9\u6B63\u6587\u6DFB\u4E71\uFF1B\n // \u523B\u610F\u4E0D schedulePaint \u2014\u2014 \u7531 200ms \u7684 ticker \u5199\u5B57\uFF0C\u601D\u8003\u6D41\u4E0D\u4F1A\u628A\u754C\u9762\u5237\u7206\n env.state.thought = (env.state.thought + message.text).slice(-400)\n } else if (message.type === 'drop') {\n // \u8FD9\u4E00\u8F6E\u7684\u6B63\u6587\u672C\u662F\"\u8FC7\u7A0B\u65C1\u767D\"\uFF08\u8981\u8C03\u5DE5\u5177\u4E4B\u524D\u5148\u5FF5\u53E8\u7684\u90A3\u6BB5\uFF09\u2192 \u4ECE\u6B63\u6587\u91CC\u64A4\u56DE\uFF0C\n // \u632A\u5230\u7B49\u5F85\u63D0\u793A\u7684\u601D\u8003\u5C3E\u5DF4\u4E0A\uFF08\u5B83\u786E\u5B9E\u662F\u6A21\u578B\u5728\u60F3\u4EC0\u4E48\uFF0C\u53EA\u662F\u4E0D\u8BE5\u5F53\u7B54\u6848\uFF09\n var dropChars = typeof message.chars === 'number' ? message.chars : 0\n var dropText = typeof message.text === 'string' ? message.text : ''\n var dropped = ''\n // \u4F18\u5148\u6309\"\u7CBE\u786E\u540E\u7F00\"\u64A4\uFF1Ahost \u7ED9\u7684\u5C31\u662F\u8FD9\u4E00\u8F6E\u6D41\u51FA\u6765\u7684\u539F\u6587\uFF0C\u4E0D\u4F9D\u8D56\u5B57\u6570\u7B97\u5F97\u51C6\u4E0D\u51C6\uFF1B\n // \u5BF9\u4E0D\u4E0A\uFF08\u6BD4\u5982\u5BA2\u6237\u7AEF\u7F13\u5B58\u8FC7\u7684\u8001\u4F1A\u8BDD\uFF09\u518D\u9000\u5316\u6210\u6309\u5B57\u6570\u622A\n if (dropText && env.state.raw.length >= dropText.length && env.state.raw.slice(-dropText.length) === dropText) {\n dropped = dropText\n env.state.raw = env.state.raw.slice(0, env.state.raw.length - dropText.length)\n } else if (dropChars > 0 && env.state.raw.length > 0) {\n dropped = env.state.raw.slice(Math.max(0, env.state.raw.length - dropChars))\n env.state.raw = env.state.raw.slice(0, Math.max(0, env.state.raw.length - dropChars))\n }\n if (dropped.trim()) env.state.thought = (env.state.thought + ' ' + dropped.replace(/\\s+/g, ' ')).slice(-400)\n dirty = true\n } else if (message.type === 'tool') {\n // \u5DE5\u5177\u4E8B\u4EF6\u53EA\u66F4\u65B0\u5185\u90E8\u72B6\u6001\uFF08digest + \u68C0\u7D22\u4E2D\u6807\u8BB0\uFF09\uFF0C\u4E0D\u843D DOM\n env.applyToolEvent(message)\n dirty = true\n } else if (message.type === 'error') {\n fail(message.message || '\u6A21\u578B\u8FD4\u56DE\u9519\u8BEF')\n } else if (message.type === 'done') {\n succeed()\n }\n }\n }\n\n var lastPaintAt = 0\n\n function schedulePaint() {\n if (env.rafPending) return\n env.rafPending = true\n var run = function () {\n requestAnimationFrame(function () {\n env.rafPending = false\n lastPaintAt = Date.now()\n if (env.state.phase === 'streaming' || env.state.phase === 'loading') {\n env.state.elapsed = Date.now() - env.state.startedAt\n env.state.chars = env.state.raw.length\n }\n env.paint()\n // \u590D\u6838\u653E\u5728**\u7ED8\u5236\u4E4B\u540E**\uFF1A\u5185\u5BB9\u8FD9\u65F6\u5019\u624D\u5728 DOM \u91CC\uFF0C\u9762\u677F\u8FD9\u4E00\u5E27\u957F\u9AD8\u7684\u91CF\u5F53\u573A\u5C31\u80FD\u5939\u4F4F\n //\uFF08\u653E\u5728 paint \u5F00\u5934\u4F1A\u665A\u4E00\u5E27\u2014\u2014\u90A3\u5E27\u91CF\u5230\u7684\u8FD8\u662F\u65E7\u9AD8\u5EA6\uFF0C\u5B9E\u6D4B\u8FC7\uFF09\u3002\n // \u4F4D\u7F6E\u53EA\u5728\u5F00\u7A97/\u62D6\u62FD/\u7A97\u53E3 resize \u65F6\u5939\u8FC7\uFF0C\u5185\u5BB9\u957F\u9AD8\u8FD9\u6761\u8DEF\u5F84\u539F\u5148\u6CA1\u4EBA\u7BA1 \u2014\u2014\n // \u9762\u677F\u662F position:fixed\u3001\u9875\u9762\u4E0D\u6EDA\uFF0C\u9876\u51FA\u53BB\u90A3\u622A\uFF08\u56DE\u590D\u6846\uFF09\u5C31\u70B9\u4E0D\u5230\u4E86\u3002\n env.ensurePanelInsideViewportNow()\n })\n }\n // \u6D41\u5F0F\u671F\u95F4\u9650\u901F\uFF08\u540C scheduleTurnsRender\uFF09\uFF1A\u957F\u5185\u5BB9\u6BCF\u5E27\u6574\u5757\u91CD\u5EFA\u4F1A\u628A\u5C0F\u7A97\u62D6\u5361\n var wait = env.state.phase === 'streaming' ? Math.max(0, lastPaintAt + env.STREAM_RENDER_MS - Date.now()) : 0\n if (wait > 0) env.later(run, wait)\n else run()\n }\n\n fetch(API, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n signal: controller.signal,\n })\n .then(function (response) {\n if (!response.ok) {\n return response\n .json()\n .catch(function () {\n return {}\n })\n .then(function (data) {\n throw new Error(data && data.error ? data.error : 'HTTP ' + response.status)\n })\n }\n if (!response.body || !response.body.getReader) {\n return response.text().then(function (text) {\n text.split('\\n\\n').forEach(handleEvent)\n succeed()\n })\n }\n var reader = response.body.getReader()\n var decoder = new TextDecoder()\n var buffer = ''\n function pump() {\n return reader.read().then(function (result) {\n if (result.done) {\n if (buffer.trim()) handleEvent(buffer)\n if (env.state.phase !== 'done' && env.state.phase !== 'error') succeed()\n return\n }\n buffer += decoder.decode(result.value, { stream: true })\n var index\n dirty = false\n while ((index = buffer.indexOf('\\n\\n')) >= 0) {\n var block = buffer.slice(0, index)\n buffer = buffer.slice(index + 2)\n handleEvent(block)\n }\n // \u601D\u8003\u6D41\u6BCF\u79D2\u51E0\u767E\u4E2A\u4E8B\u4EF6\uFF1A\u5B83\u53EA\u66F4\u65B0 ticker \u5199\u7684\u63D0\u793A\u884C\uFF0C\u4E0D\u8BE5\u628A\u6B63\u6587\u91CD\u7ED8\u5237\u7206\n if (dirty) schedulePaint()\n return pump()\n })\n }\n return pump()\n })\n .catch(function (error) {\n if (error && error.name === 'AbortError') {\n // \u4E24\u79CD\u4E2D\u6B62\u8981\u5206\u5F00\uFF1A\n // \u2460 \u88AB\"\u91CD\u65B0\u751F\u6210\"\u9876\u6389 \u2014\u2014 state.request \u5DF2\u7ECF\u6307\u5411\u65B0\u8BF7\u6C42\uFF0C\u4EC0\u4E48\u90FD\u522B\u505A\uFF0C\u65B0\u8BF7\u6C42\u4F1A\u63A5\u7BA1\u753B\u9762\uFF1B\n // \u2461 \u7528\u6237\u6536\u8D77\u5C0F\u7A97 \u2014\u2014 state.request \u5DF2\u88AB closePanel \u6E05\u7A7A\uFF0C\u8BB0\u6210\u300C\u5DF2\u505C\u6B62\u300D\uFF0C\n // \u8FD9\u6837\u70B9\u80F6\u56CA\u56DE\u6765\u8FD8\u80FD\u770B\u5230\u8FDB\u5EA6\u5E76\u5728\u539F\u5730\u91CD\u65B0\u751F\u6210\uFF08\u4EE5\u524D\u8FD9\u91CC\u4E00\u5F8B return\uFF0C\n // \u7ED3\u679C\u6536\u8D77\u5C0F\u7A97\u540E\u72B6\u6001\u6C38\u8FDC\u505C\u5728 streaming\uFF0C\u91CD\u5F00\u662F\u4E2A\u6C38\u4E0D\u7ED3\u675F\u7684\u7B49\u5F85\u52A8\u753B\uFF09\u3002\n if (env.state.aborted) fail('\u4E2D\u6B62')\n return\n }\n fail(String((error && error.message) || error))\n })\n }\n\n /** \u628A\u8FD9\u6B21\u89E3\u8BFB\uFF08\u9009\u4E2D\u6587\u5B57 + \u4E24\u8282\u7ED3\u8BBA + \u8FFD\u95EE\uFF09\u5347\u683C\u6210\u6B63\u5F0F\u4F1A\u8BDD\uFF0C\u5EFA\u5728\u6765\u6E90\u4F1A\u8BDD\u540C\u4E00\u4E2A\u9879\u76EE\u4E0B\u3002 */\n function promote() {\n if (env.state.promoting) return\n var payload = env.state.payload\n if (!payload) return\n // \u7528\u5206\u9636\u6BB5\u4FDD\u5B58\u7684\u7ED3\u679C\uFF1A\u5C55\u5F00\u8BE6\u89E3\u540E state.raw \u91CC\u53EA\u6709\u8BE6\u89E3\u90A3\u4E00\u6BB5\uFF0C\n // \u76F4\u63A5\u62FF raw \u89E3\u6790\u4F1A\u5BFC\u81F4\u7FFB\u8BD1\u4E22\u5931\uFF08\u5347\u683C\u51FA\u6765\u7684\u4F1A\u8BDD\u91CC\u7FFB\u8BD1\u53D8\u6210\u300C\u672A\u8BB0\u5F55\u300D\uFF09\n var sections = {\n translation: env.state.parts.translation || splitSections(env.state.raw).translation,\n detail: env.state.parts.detail || splitSections(env.state.raw).detail,\n }\n env.state.promoting = true\n env.promoteButton.disabled = true\n env.setStatus('\u6B63\u5728\u5347\u683C\u4E3A\u4F1A\u8BDD\u2026')\n fetch(PROMOTE, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n sessionId: env.panelOrCurrentSessionId(),\n text: payload.text,\n context: payload.context,\n label: payload.label,\n translation: (sections.translation || '').trim(),\n detail: (sections.detail || '').trim(),\n // \u5E26\u5F15\u7528\u5757\u7684\u8F6E\u6B21\uFF1A\u5347\u683C\u51FA\u6765\u7684\u4F1A\u8BDD\u91CC\uFF0C\u7528\u6237\u5F53\u65F6\u53D1\u7684\u5C31\u662F\u62FC\u597D\u7684\u90A3\u4EFD\n turns: env.exportTurns(),\n }),\n })\n .then(function (response) {\n return response.json().then(function (data) {\n if (!response.ok || !data || data.ok !== true) {\n throw new Error((data && data.error) || 'HTTP ' + response.status)\n }\n return data\n })\n })\n .then(function (data) {\n env.state.promoting = false\n env.promoteButton.disabled = false\n var newId = String(data.sessionId || '')\n env.saveHistory({ pinned: true })\n env.setStatus('\u5DF2\u5347\u683C\u4E3A\u4F1A\u8BDD\uFF1A' + newId.slice(0, 18) + '\u2026')\n // \u8DF3\u5230\u65B0\u4F1A\u8BDD\uFF08\u540C\u9879\u76EE\uFF09\uFF0C\u5E76\u628A\u5C0F\u7A97\u6536\u8D77\u6765\n openSession(newId)\n env.later(function () {\n env.closePanel()\n }, 120)\n })\n .catch(function (error) {\n env.state.promoting = false\n env.promoteButton.disabled = false\n env.setStatus('\u5347\u683C\u5931\u8D25\uFF1A' + String((error && error.message) || error))\n })\n }\n\n /** \u8BA9\u524D\u7AEF\u8DF3\u5230\u65B0\u4F1A\u8BDD\uFF08GUI \u4F1A\u5207\u6210\u90A3\u4E2A\u4F1A\u8BDD\uFF09\u3002 */\n function openSession(sessionId) {\n if (!sessionId) return\n try {\n var sessions = env.ctx.get('sessions')\n if (sessions && typeof sessions.open === 'function') {\n sessions.open(sessionId)\n return\n }\n var workspace = env.ctx.get('uiWorkspace')\n if (workspace && typeof workspace.openSession === 'function') workspace.openSession(sessionId)\n } catch (error) {\n /* \u8DF3\u8F6C\u5931\u8D25\u4E0D\u5F71\u54CD\u4F1A\u8BDD\u5DF2\u521B\u5EFA\u7684\u4E8B\u5B9E */\n }\n }\n\n /** \u7B2C\u4E8C\u9636\u6BB5\uFF1A\u52A0\u8F7D\u5B8C\u6574\u4F1A\u8BDD\u80CC\u666F\uFF0824 \u6761\uFF09\u5E76\u751F\u6210\u8BE6\u89E3\u3002 */\n function expandDetail() {\n var payload = env.state.payload\n if (!payload || env.state.parts.detail) return\n env.state.stage = 'detail'\n env.state.raw = ''\n // \u4E0D\u518D\u5E26 refresh\uFF1A\u8BE6\u89E3\u8BF7\u6C42\u4E5F\u5141\u8BB8\u547D\u4E2D host \u7ED3\u679C\u7F13\u5B58\uFF08\u80CC\u666F\u53D8\u4E86 key \u81EA\u7136\u5C31\u53D8\u4E86\uFF09\uFF1B\n // \u5E76\u4E14\u628A\u7ED3\u679C\u5199\u56DE\u672C\u5730\u7F13\u5B58 \u2014\u2014 \u4EE5\u524D\u4F20 null\uFF0C\u5BFC\u81F4\"\u540C\u4E00\u4E2A\u8BCD\u6BCF\u6B21\u5C55\u5F00\u8BE6\u89E3\u90FD\u8981\u91CD\u8DD1\u4E00\u904D\"\n env.state.payload = env.buildPayload(payload.text, payload.context, payload.label, false, 'detail')\n runRequest(env.state.payload, env.state.cacheKey)\n }\n\n function regenerate() {\n var payload = env.state.payload\n if (!payload) return\n env.state.fromCache = false\n // \u91CD\u65B0\u751F\u6210\uFF1A\u56DE\u5230\u7B2C\u4E00\u9636\u6BB5\uFF08\u4EC5\u7FFB\u8BD1\uFF09\uFF0C\u5E76\u6E05\u6389\u5DF2\u751F\u6210\u7684\u8BE6\u89E3\n env.state.parts = { translation: '', detail: '' }\n env.state.stage = 'translation'\n env.state.payload = env.buildPayload(payload.text, payload.context, payload.label, true, 'translation')\n runRequest(env.state.payload, env.state.cacheKey)\n }\n return {\n autoGrowAskBox,\n promote,\n regenerate,\n expandDetail,\n ask,\n refreshAskState,\n isGenerating,\n stopCurrent,\n sendAsk,\n runRequest,\n showWaiting,\n clearWaiting,\n }\n}\n", "import { MODELS } from './constants.js'\nimport { el, listen } from './dom.js'\n\n/** models state and operations; dependencies are supplied as live node/callback accessors. */\nexport function createModelsController(env) {\n\n // \u2014\u2014 \u60AC\u6D6E\u72B6\u6001\u80F6\u56CA\uFF1A\u70B9\u4E00\u4E0B\u56DE\u5230\u6700\u8FD1\u4E00\u6B21\u5C0F\u7A97 \u2014\u2014\n // \u2014\u2014 \u6A21\u578B + \u63A8\u7406\u7B49\u7EA7\uFF08\u8FFD\u95EE\u6863\uFF09 \u2014\u2014\n var MODEL_KEY = 'dsh-selection-explain:model'\n // \u5B58 \"provider\\tmodel\"\n /** \u56DB\u4E2A\u683C\u5B50\u7684\u4E2D\u6587\u540D\uFF08\u8BBE\u7F6E\u9875\u4E0E\u5C0F\u7A97\u5171\u7528\u4E00\u5957\u8BCD\uFF1B`medium` \u53EA\u5728\u6807\u6CE8\u6A21\u578B\u81EA\u5DF1\u7684\u6863\u4F4D\u65F6\u51FA\u73B0\uFF09\u3002 */\n var TIER_LABEL = { off: '\u5173', low: '\u4F4E', medium: '\u4E2D', high: '\u9AD8', max: '\u6700\u9AD8' }\n\n /**\n * \u6A21\u578B\u6E05\u5355\u7F13\u5B58\u3002\n *\n * `pending` \u662F**\u6B63\u5728\u98DE\u7684\u90A3\u6B21\u8BF7\u6C42**\uFF1A\u5E76\u53D1\u8C03\u7528\u5FC5\u987B\u5171\u4EAB\u5B83\u3002\n * \u4EE5\u524D loading=true \u65F6\u76F4\u63A5 `Promise.resolve(modelCatalog)` \u628A**\u5F53\u524D\u8FD8\u7A7A\u7740\u7684**\u7F13\u5B58\u8FD4\u56DE\uFF0C\n * \u4E8E\u662F\"\u83DC\u5355\u521A\u6253\u5F00\u3001\u8BBE\u7F6E\u9875\u4E5F\u6765\u8981\u6E05\u5355\"\u8FD9\u79CD\u5E76\u53D1\u573A\u666F\u4E0B\uFF0C\u540E\u5230\u7684\u90A3\u4E2A\u62FF\u5230 0 \u4E2A\u6A21\u578B\n * \uFF08\u5B9E\u6D4B\uFF1A\u8BBE\u7F6E\u9875\u7684\u6A21\u578B\u4E0B\u62C9\u7A7A\u7740\uFF0C\u53EA\u6709\u4E00\u884C\u300C\u8DDF\u968F\u4E3B\u4F1A\u8BDD\u300D\uFF09\u3002\n */\n var modelCatalog = { at: 0, items: [], current: null, stages: null, loading: false, pending: null, error: '', leakyOff: [], sessionId: null }\n\n var modelCatalogRequestSeq = 0\n\n var modelPillClicks = 0\n\n var BAD_TIER_KEY = 'dsh-selection-explain:badTiers'\n\n function badTierKeyOf() {\n if (!env.state.modelChoice) return ''\n return env.state.modelChoice.provider + '/' + env.state.modelChoice.model\n }\n\n /** \u8BB0\u4E0B\"\u8FD9\u4E2A\u6A21\u578B\u7684\u8FD9\u4E2A\u6863\u4F4D\u88AB\u4E0A\u6E38\u62D2\u8FC7\"\uFF0C\u7528\u6765\u5728\u83DC\u5355\u91CC\u6807\u51FA\u6765\u3002 */\n function rememberBadTier(tier, reason) {\n var key = badTierKeyOf()\n if (!key || !tier) return\n var all = {}\n try {\n all = JSON.parse(readStore(BAD_TIER_KEY, '{}')) || {}\n } catch (error) {\n all = {}\n }\n var list = all[key]\n if (!list || !list.length) list = []\n // \u8001\u683C\u5F0F\u662F [\"max\"]\uFF0C\u65B0\u683C\u5F0F\u662F [{tier, reason}]\uFF1B\u4E24\u79CD\u90FD\u8BA4\n var found = false\n for (var i = 0; i < list.length; i += 1) {\n var item = list[i]\n var id = typeof item === 'string' ? item : item && item.tier\n if (id === tier) {\n found = true\n if (typeof item === 'string') list[i] = { tier: tier, reason: reason || 'rejected' }\n else if (reason) item.reason = reason\n }\n }\n if (!found) list.push({ tier: tier, reason: reason || 'rejected' })\n all[key] = list\n writeStore(BAD_TIER_KEY, JSON.stringify(all))\n }\n\n /** \u8BE5\u6A21\u578B\u54EA\u4E9B\u6863\u4F4D\u6709\u95EE\u9898 \u2192 { tier: reason }\uFF08\u83DC\u5355\u91CC\u6807\u6CE8\uFF0Creason=rejected \u4E0D\u652F\u6301 / leak \u4F1A\u6CC4\u6F0F\u601D\u8003\uFF09\u3002 */\n function badTiersOf() {\n var key = badTierKeyOf()\n var out = {}\n if (!key) return out\n try {\n var all = JSON.parse(readStore(BAD_TIER_KEY, '{}')) || {}\n var list = all[key]\n if (!Array.isArray(list)) return out\n for (var i = 0; i < list.length; i += 1) {\n var item = list[i]\n if (typeof item === 'string') out[item] = 'rejected'\n else if (item && item.tier) out[item.tier] = item.reason || 'rejected'\n }\n } catch (error) {\n /* \u574F\u4E86\u5C31\u5F53\u6CA1\u6709 */\n }\n return out\n }\n\n function readStore(key, fallback) {\n try {\n var value = window.localStorage ? window.localStorage.getItem(key) : null\n return value === null || value === undefined ? fallback : value\n } catch (error) {\n return fallback\n }\n }\n\n function writeStore(key, value) {\n try {\n if (window.localStorage) window.localStorage.setItem(key, value)\n } catch (error) {\n /* \u65E0\u75D5\u6A21\u5F0F\uFF1A\u53EA\u5F53\u6B21\u751F\u6548 */\n }\n }\n\n /** \u6863\u4F4D\u663E\u793A\u540D\uFF1A\u4F18\u5148\u7528\u76EE\u5F55\u91CC\u58F0\u660E\u7684\u540D\u5B57\uFF08Off/Low/High/Max\uFF09\uFF0C\u5426\u5219\u9000\u56DE\u4E2D\u6587\u6620\u5C04\u3002 */\n function tierLabel(id) {\n if (!id) return ''\n // \u6309**\u5F53\u524D\u5728\u7528**\u90A3\u4E2A\u6A21\u578B\u58F0\u660E\u7684\u6863\u4F4D\u53D6\u540D\uFF08\u8DDF\u968F\u6001\u4E5F\u7B97\uFF0C\u89C1 effectiveItem\uFF09\n var item = effectiveItem()\n var efforts = (item && item.efforts) || []\n for (var j = 0; j < efforts.length; j += 1) {\n if (efforts[j].id === id) return TIER_LABEL[id] || efforts[j].name || id\n }\n return TIER_LABEL[id] || id\n }\n\n /**\n * \u6E05\u5355\u91CC\u6309 **provider + model \u4E24\u4E2A\u952E**\u627E\u90A3\u4E00\u9879\u3002\n *\n * \u4E24\u4E2A\u952E\u7F3A\u4E00\u4E0D\u53EF\uFF1A\u540C\u4E00\u4E2A model id \u5728\u591A\u4E2A provider \u4E0B\u662F**\u4E0D\u540C\u6A21\u578B\u3001\u4E0D\u540C\u540D\u5B57** \u2014\u2014\n * \u5B9E\u6D4B `deepseek-flash` \u5728 opencode-go \u53EB\u300CDeepSeek Flash\u300D\u3001\u5728 deepseek-official /\n * deepseek-account \u53EB\u300CDeepSeek-V41-Flash\u300D\u3002\u53EA\u6309 model \u67E5\u4F1A\u5F20\u51A0\u674E\u6234\u3002\n */\n function catalogItemOf(provider, model) {\n var items = modelCatalog.items || []\n for (var i = 0; i < items.length; i += 1) {\n if (items[i].provider === provider && items[i].model === model) return items[i]\n }\n return null\n }\n\n /**\n * \u73B0\u5728**\u5B9E\u9645\u5728\u7528**\u7684\u90A3\u4E2A\u6A21\u578B\uFF1A\u663E\u5F0F\u9009\u8FC7\u5C31\u662F\u90A3\u4E2A\uFF1B\u6CA1\u9009\u8FC7\uFF08\u8DDF\u968F\u4E3B\u4F1A\u8BDD\uFF09\u5C31\u662F\u4F1A\u8BDD\u89E3\u6790\u51FA\u6765\u7684\n * `modelCatalog.current`\u3002\n *\n * \u83DC\u5355\u91CC\"\u54EA\u4E00\u884C\u6253\u52FE\"\"\u6863\u4F4D\u6309\u94AE\u5217\u54EA\u51E0\u6863\"\"\u54EA\u4E2A\u6A21\u578B\u5173\u6863\u4F1A\u6CC4\u6F0F\"\u90FD\u8BE5\u6309\u5B83\u7B97 \u2014\u2014\n * \u8FD9\u51E0\u5904\u4EE5\u524D\u53EA\u8BA4 `state.modelChoice`\uFF0C\u8DDF\u968F\u6001\u4E8E\u662F**\u4E00\u884C\u90FD\u4E0D\u6253\u52FE**\uFF08\u7528\u6237\u62A5\u7684\n * \"\u6A21\u578B\u5217\u8868\u4E0A\u6CA1\u6709\u6807\u793A\u5F53\u524D\u6B63\u5728\u4F7F\u7528\u7684\u6A21\u578B\"\uFF09\u3002\n */\n function effectiveChoice() {\n if (env.state.modelChoice) return env.state.modelChoice\n if (modelCatalog.current && modelCatalog.current.provider && modelCatalog.current.model) {\n return { provider: String(modelCatalog.current.provider), model: String(modelCatalog.current.model) }\n }\n return null\n }\n\n /** \u6E05\u5355\u91CC\u5F53\u524D\u5728\u7528\u7684\u90A3\u4E00\u9879\uFF08\u663E\u5F0F\u9009\u7684 / \u8DDF\u968F\u4F1A\u8BDD\u7684\uFF09\uFF1B\u6E05\u5355\u91CC\u6CA1\u6709\u5C31\u8FD4\u56DE null\u3002 */\n function effectiveItem() {\n var choice = effectiveChoice()\n return choice ? catalogItemOf(choice.provider, choice.model) : null\n }\n\n /** \u80F6\u56CA\u6587\u6848\uFF1A\u6A21\u578B\u77ED\u540D + \u5F53\u524D\u6863\u4F4D\u3002 */\n function paintModelPill() {\n var name = ''\n var provider = ''\n // \u7528\u6237\u9009\u5B9A\u7684\u90A3\u4E2A\u6A21\u578B\uFF1A\u6309 provider + model \u6362\u6210\u6E05\u5355\u91CC\u7684\u663E\u793A\u540D\n var chosen = env.state.modelChoice ? catalogItemOf(env.state.modelChoice.provider, env.state.modelChoice.model) : null\n if (chosen) {\n name = chosen.name || chosen.model\n provider = chosen.providerName || chosen.provider\n }\n if (!name && env.state.modelChoice) name = env.state.modelChoice.model\n // \u8DDF\u968F\u4E3B\u4F1A\u8BDD\uFF1A`current` \u62A5\u7684\u662F { provider, model } \u4E24\u4E2A id\uFF0C\u540C\u6837\u8981\u6362\u6210\u663E\u793A\u540D \u2014\u2014\n // \u76F4\u63A5\u663E\u793A\u88F8 id \u5C31\u4F1A\u662F \"deepseek-flash\"\uFF0C\u800C\u4E3B\u4F1A\u8BDD\u91CC\u90A3\u4E2A\u6A21\u578B\u53EB\u300CDeepSeek-V41-Flash\u300D\n // \uFF08\u7528\u6237\u62A5\u7684\uFF09\u3002\u6E05\u5355\u6CA1\u52A0\u8F7D\u51FA\u6765\u65F6\u53EA\u80FD\u5148\u663E\u793A id\uFF0C\u52A0\u8F7D\u5B8C\u4F1A\u91CD\u753B\uFF08\u89C1 warmModelCatalog\uFF09\u3002\n if (!name && modelCatalog.current) {\n var followed = catalogItemOf(modelCatalog.current.provider, modelCatalog.current.model)\n name = (followed && (followed.name || followed.model)) || String(modelCatalog.current.model || '')\n provider = (followed && (followed.providerName || followed.provider)) || String(modelCatalog.current.provider || '')\n }\n if (!name) name = '\u6A21\u578B'\n // \u77ED\u540D\uFF1A\u53BB\u6389 provider \u524D\u7F00\u90A3\u79CD\u5F88\u957F\u7684\u5199\u6CD5\uFF08\"DeepSeek V4.1 Flash\" \u2192 \u4FDD\u7559\u539F\u6837\uFF0C\u53EA\u622A\u65AD\uFF09\n env.modelPillName.textContent = name.length > 22 ? name.slice(0, 21) + '\u2026' : name\n var tier = env.state.effort || (modelCatalog.stages && modelCatalog.stages.chat) || ''\n env.modelPillTier.textContent = tier ? '\u00B7 ' + tierLabel(tier) : ''\n env.modelPill.title = (provider ? provider + ' \u00B7 ' : '') + name + (tier ? ' \u00B7 \u63A8\u7406\u7B49\u7EA7 ' + tierLabel(tier) : '') +\n '\uFF08\u6A21\u578B\u4E0E\u8FFD\u95EE\u601D\u8003\u5F3A\u5EA6\uFF09'\n // \u80F6\u56CA\u662F\"\u5F53\u524D\u6A21\u578B\"\u7684**\u552F\u4E00**\u7EDF\u4E00\u843D\u70B9\uFF1A\u6362\u6A21\u578B\u7684\u6240\u6709\u8DEF\u5F84\u6700\u540E\u90FD\u4F1A\u8D70\u5230\u8FD9\u91CC\n //\uFF08\u8BBE\u7F6E\u62BD\u5C49\u7684\u6A21\u578B\u4E0B\u62C9\u3001\u5C0F\u7A97\u7684\u6A21\u578B\u83DC\u5355\u3001\u8DDF\u968F\u4E3B\u4F1A\u8BDD\u65F6\u4E3B\u754C\u9762\u6362\u6A21\u578B\u2026\uFF09\uFF0C\n // \u8BBE\u7F6E\u9875\u90A3\u884C\"\u56DB\u683C \u2192 \u771F\u5B9E\u6863\u4F4D\"\u4E5F\u5728\u8FD9\u91CC\u8DDF\u7740\u91CD\u753B \u2014\u2014 \u65E9\u5148\u53EA\u5728 chooseSharedModel \u91CC\u753B\uFF0C\n // \u4E8E\u662F\"\u4ECE\u62BD\u5C49\u7684\u4E0B\u62C9\u91CC\u6362\u6A21\u578B\"\u90A3\u884C\u7EB9\u4E1D\u4E0D\u52A8\uFF08\u7528\u6237\u62A5\u7684\u6B63\u662F\u8FD9\u4E2A\uFF09\u3002\n env.paintEffortMapHint()\n }\n\n /**\n * \u987A\u624B\u628A\u6A21\u578B\u6E05\u5355\u62C9\u8D77\u6765\uFF0860 \u79D2\u7F13\u5B58\uFF09\u3002\n *\n * \u80F6\u56CA\u4E0A\u7684\u6A21\u578B\u540D\u8981\u6309 provider + model \u4ECE\u6E05\u5355\u91CC\u6362\uFF08\u89C1 paintModelPill\uFF09\u2014\u2014 \u6E05\u5355\u6CA1\u52A0\u8F7D\u65F6\n * \u53EA\u80FD\u663E\u793A\u88F8 id\uFF08\"deepseek-flash\"\uFF09\uFF0C\u8DDF\u4E3B\u4F1A\u8BDD\u91CC\u90A3\u4E2A\u540D\u5B57\u5BF9\u4E0D\u4E0A\u3002\n * \u4EE5\u524D\u53EA\u6709\"\u6253\u5F00\u6A21\u578B\u83DC\u5355 / \u5F00\u8BBE\u7F6E\u62BD\u5C49\"\u624D\u4F1A\u62C9\u6E05\u5355\uFF0C\u6240\u4EE5\u6B63\u5E38\u7528\u4E0B\u6765\u80F6\u56CA\u4E00\u76F4\u662F\u88F8 id\u3002\n */\n function warmModelCatalog() {\n loadModelCatalog(false, env.panelSessionId || env.currentSessionId()).then(function () { paintModelPill() })\n }\n\n /**\n * \u62C9\u6A21\u578B\u6E05\u5355\uFF0860 \u79D2\u7F13\u5B58\uFF09\u3002\n *\n * \u8C03\u7528\u70B9\uFF1A\u6253\u5F00\u6A21\u578B\u83DC\u5355 / \u5F00\u8BBE\u7F6E\u62BD\u5C49\uFF08\u5F3A\u5236\uFF09/ **\u5F00\u7A97\uFF08warmModelCatalog\uFF0C\u4E3A\u4E86\u80F6\u56CA\u4E0A\u7684\u663E\u793A\u540D\uFF09**\u3002\n * \u4E0D\u8FDB ping / analyze \u90A3\u79CD\u6BCF\u8F6E\u90FD\u8D70\u7684\u70ED\u8DEF\u5F84\u3002\n */\n function loadModelCatalog(force, sessionId) {\n // \u4F1A\u8BDD\u6362\u4E86\u5C31\u5F97\u91CD\u53D6\uFF1A`current` \u662F**\u6309\u4F1A\u8BDD**\u89E3\u6790\u7684\uFF0C\u6CBF\u7528\u4E0A\u4E00\u4E2A\u4F1A\u8BDD\u7684\u7F13\u5B58\n // \u4F1A\u8BA9\u300C\u8DDF\u968F\u4E3B\u4F1A\u8BDD\uFF08\u5F53\u524D\uFF1A\u2026\uFF09\u300D\u62A5\u51FA\u522B\u7684\u4F1A\u8BDD\u5728\u7528\u7684\u6A21\u578B\u3002\n // sessionId \u7531\u8C03\u7528\u65B9\u7ED9\uFF08\u5C0F\u7A97\u7528\u5B83\u81EA\u5DF1\u6240\u5C5E\u7684\u4F1A\u8BDD\uFF0C\u4E0D\u662F\"\u5F53\u524D\u6B63\u5728\u770B\"\u7684\u90A3\u4E2A\uFF09\u3002\n var sessionNow = sessionId === undefined ? env.panelOrCurrentSessionId() : sessionId\n var sameSession = modelCatalog.sessionId === sessionNow\n // \u53EA\u590D\u7528\u540C\u4E00\u4F1A\u8BDD\u7684\u8BF7\u6C42\uFF1BA \u7684\u54CD\u5E94\u4E0D\u80FD\u5192\u5145\u521A\u5207\u5230\u7684 B\u3002\n if (sameSession && modelCatalog.loading && modelCatalog.pending) return modelCatalog.pending\n if (sameSession && !force && modelCatalog.items.length > 0 && Date.now() - modelCatalog.at < 60000) return Promise.resolve(modelCatalog)\n var requestSeq = ++modelCatalogRequestSeq\n if (!sameSession) {\n force = true\n modelCatalog.current = null\n modelCatalog.items = []\n modelCatalog.at = 0\n }\n modelCatalog.sessionId = sessionNow\n modelCatalog.loading = true\n // \u5E26 sessionId\uFF1A`current` \u8981\u6309**\u5F53\u524D\u4F1A\u8BDD**\u89E3\u6790\uFF08\u5426\u5219\u62EC\u53F7\u91CC\u62A5\u7684\u662F\u5168\u5C40\u9ED8\u8BA4\uFF0C\u8DDF\u4F1A\u8BDD\u5BF9\u4E0D\u4E0A\uFF09\n var modelQuery = []\n if (force) modelQuery.push('refresh=1')\n if (sessionNow) modelQuery.push('sessionId=' + encodeURIComponent(sessionNow))\n modelCatalog.pending = fetch(MODELS + (modelQuery.length ? '?' + modelQuery.join('&') : ''), { headers: { accept: 'application/json' } })\n .then(function (response) {\n return response.json()\n })\n .then(function (data) {\n return {\n sessionId: sessionNow,\n items: Array.isArray(data && data.models) ? data.models : [],\n current: (data && data.current) || null,\n stages: (data && data.stages) || null,\n error: String((data && data.error) || ''),\n leakyOff: Array.isArray(data && data.leakyOff) ? data.leakyOff : [],\n at: Date.now(), loading: false, pending: null,\n }\n })\n .catch(function (error) {\n return { sessionId: sessionNow, at: 0, items: [], current: null, stages: null,\n error: String((error && error.message) || error), leakyOff: [], loading: false, pending: null }\n })\n .then(function (result) {\n // \u8C03\u7528\u8005\u5F97\u5230\u81EA\u5DF1\u7684\u5FEB\u7167\uFF1B\u8F83\u65E9\u7684\u8BF7\u6C42\u4E0D\u5F97\u8986\u76D6\u8F83\u65B0\u7684\u4F1A\u8BDD\u7F13\u5B58\u3002\n if (requestSeq === modelCatalogRequestSeq) modelCatalog = result\n return result\n })\n return modelCatalog.pending\n }\n\n function renderModelMenu() {\n env.modelMenu.textContent = ''\n var items = modelCatalog.items || []\n var head = el('div', 'dsh-sel-pickergroup', '\u6A21\u578B')\n env.modelMenu.appendChild(head)\n if (modelCatalog.loading) {\n env.modelMenu.appendChild(el('div', 'dsh-sel-pickerhint', '\u6B63\u5728\u8BFB\u53D6\u53EF\u7528\u6A21\u578B\u2026'))\n return\n }\n if (items.length === 0) {\n env.modelMenu.appendChild(\n el('div', 'dsh-sel-pickerhint', modelCatalog.error ? '\u8BFB\u53D6\u5931\u8D25\uFF1A' + modelCatalog.error : '\u6CA1\u6709\u53D6\u5230\u53EF\u7528\u6A21\u578B\u6E05\u5355'),\n )\n } else {\n var list = el('div', 'dsh-sel-pickerlist')\n // \u6253\u52FE\u7684\u662F**\u5F53\u524D\u5728\u7528**\u90A3\u4E2A\uFF1A\u663E\u5F0F\u9009\u8FC7\u5C31\u662F\u5B83\uFF0C\u8DDF\u968F\u4E3B\u4F1A\u8BDD\u65F6\u5C31\u662F\u4F1A\u8BDD\u5728\u7528\u7684\u90A3\u4E2A\n var inUse = effectiveChoice()\n for (var i = 0; i < items.length; i += 1) {\n ;(function (item) {\n var on = !!inUse && item.provider === inUse.provider && item.model === inUse.model\n var row = el('button', 'dsh-sel-pickerrow')\n row.type = 'button'\n row.setAttribute('role', 'menuitemradio')\n row.setAttribute('data-on', on ? '1' : '0')\n row.title = (item.name || item.model) + ' \u00B7 ' + (item.providerName || item.provider)\n row.appendChild(el('span', 'dsh-sel-pickercheck', on ? '\u2713' : ''))\n // \u540D\u5B57\u81EA\u5DF1\u5E26\u7701\u7565\u53F7\uFF1A\u4E00\u884C\u91CC\u8981\u585E\u4E0B \u52FE + \u540D\u5B57 + \u300C\u8DDF\u968F\u300D\u5C0F\u6807 + provider\uFF0C\n // \u957F\u540D\u5B57\uFF08\"DeepSeek V4.1 Flash\"\uFF09\u6324\u4E0D\u4E0B\u65F6**\u6536\u7A84\u540D\u5B57**\uFF0C\u522B\u8BA9\u6574\u884C\u6298\u6210\u4E24\u884C\u3002\n row.appendChild(el('span', 'dsh-sel-pickername', item.name || item.model))\n // \u8DDF\u968F\u6001\u8865\u4E00\u679A\u300C\u8DDF\u968F\u300D\u5C0F\u6807\uFF1A\u8FD9\u4E2A\u52FE\u4E0D\u662F\u4F60\u9009\u8FC7\uFF0C\u800C\u662F\u4E3B\u4F1A\u8BDD\u6B63\u5728\u7528\u5B83 \u2014\u2014\n // \u5426\u5219\u4E00\u4E2A\u6CA1\u70B9\u8FC7\u7684\u6A21\u578B\u6253\u7740\u52FE\uFF0C\u4F1A\u8BA9\u4EBA\u4EE5\u4E3A\u662F\u81EA\u5DF1\u9009\u7684\u3002\n if (on && !env.state.modelChoice) {\n row.appendChild(el('span', 'dsh-sel-pickerfollow', '\u8DDF\u968F'))\n row.title = '\u8DDF\u968F\u4E3B\u4F1A\u8BDD\uFF1A\u4E3B\u4F1A\u8BDD\u6B63\u5728\u7528\u8FD9\u4E2A\u6A21\u578B \u00B7 ' + (item.providerName || item.provider)\n }\n row.appendChild(el('span', 'dsh-sel-pickerprov', item.providerName || item.provider))\n listen(row, 'click', function (event) {\n event.preventDefault()\n event.stopPropagation()\n env.chooseSharedModel({ provider: item.provider, model: item.model })\n paintModelPill()\n renderModelMenu()\n closeModelMenu()\n env.setStatus('\u6A21\u578B\u5DF2\u5207\u5230 ' + (item.name || item.model))\n })\n list.appendChild(row)\n })(items[i])\n }\n env.modelMenu.appendChild(list)\n }\n env.modelMenu.appendChild(el('div', 'dsh-sel-pickersplit'))\n env.modelMenu.appendChild(el('div', 'dsh-sel-pickergroup', '\u63A8\u7406\u7B49\u7EA7\uFF08\u8FFD\u95EE\u6863\uFF09'))\n var tiers = el('div', 'dsh-sel-tiers')\n /**\n * \u6863\u4F4D\u6309\u94AE = \u4E0E\u8BBE\u7F6E\u9875**\u540C\u4E00\u5957\u56DB\u4E2A\u683C\u5B50**\uFF08\u5173/\u4F4E/\u9AD8/\u6700\u9AD8\uFF09\u3002\n *\n * \u4EE5\u524D\u8FD9\u91CC\u5217\u7684\u662F\"\u8BE5\u6A21\u578B\u81EA\u5DF1\u58F0\u660E\u7684\u6863\u4F4D\"\uFF08\u53EF\u80FD\u662F minimal/medium/xhigh \u8FD9\u79CD\uFF09\uFF0C\u4E8E\u662F\n * \u4E24\u8FB9\u8BCD\u6C47\u4E0D\u540C\u3001\u8FD8\u8981\u628A\u6A21\u578B\u6863\u4F4D\u53CD\u5411\u6298\u56DE\u683C\u5B50\uFF1B\u73B0\u5728\u4E24\u8FB9\u540C\u8BCD\u540C\u6E90\uFF1A\u8FD9\u91CC\u7684\u9009\u4E2D\u503C\u5C31\u662F\n * \u914D\u7F6E\u91CC\u7684 `chatReasoningEffort`\uFF0C\u6539\u4E00\u8FB9\u53E6\u4E00\u8FB9\u8DDF\u7740\u53D8\uFF0C\u6CA1\u6709\u4EFB\u4F55\u6620\u5C04\u3002\n * \u683C\u5B50\u843D\u5230\u6A21\u578B\u54EA\u4E2A\u771F\u5B9E\u6863\u4F4D\u7531 host \u7B97\uFF08\u89C1\u8BBE\u7F6E\u9875\u90A3\u884C\"\u5F53\u524D\u6A21\u578B\uFF1A\u5173 \u2192 \u2026\"\uFF09\u3002\n */\n var tierItem = effectiveItem()\n var tierMap = (tierItem && tierItem.effortMap) || null\n var badTiers = badTiersOf()\n // host \u5728\u8FDB\u7A0B\u5185\u5B66\u5230\u7684\uFF1A\u8FD9\u4E2A\u6A21\u578B\"\u5173\"\u6863\u4F1A\u628A\u601D\u8003\u5199\u8FDB\u6B63\u6587\n var leaky = effectiveChoice()\n if (leaky && modelCatalog.leakyOff.indexOf(leaky.provider + '/' + leaky.model) >= 0) {\n badTiers = { ...badTiers, off: 'leak' }\n }\n var activeSlot = env.chatSlot()\n for (var t = 0; t < env.SLOT_ORDER.length; t += 1) {\n ;(function (slot) {\n // \u8FD9\u4E00\u683C\u7684\u843D\u70B9\uFF08\u6A21\u578B\u771F\u5B9E\u6863\u4F4D\uFF09\uFF1A\u7528\u6765\u628A\"\u5B9E\u6D4B\u88AB\u62D2/\u4F1A\u6CC4\u6F0F\"\u7684\u6807\u6CE8\u5BF9\u4E0A\u6765\n var target = (tierMap && tierMap[slot]) || slot\n var bad = badTiers[slot] || (target !== slot ? badTiers[target] : '')\n var button = el('button', 'dsh-sel-tierbtn', env.SLOT_LABEL[slot])\n button.type = 'button'\n button.setAttribute('data-on', slot === activeSlot ? '1' : '0')\n button.setAttribute('data-slot', slot)\n if (bad) {\n button.setAttribute('data-bad', '1')\n button.title =\n bad === 'leak'\n ? '\u5B9E\u6D4B\u8BE5\u6A21\u578B\u5728\u8FD9\u4E00\u6863\u4F1A\u628A\u601D\u8003\u5199\u8FDB\u6B63\u6587\uFF1A\u5DF2\u81EA\u52A8\u6539\u7528\u300C\u4F4E\u300D\u6863'\n : '\u5B9E\u6D4B\u8BE5\u6A21\u578B\u4E0D\u652F\u6301\u8FD9\u4E00\u6863\uFF1A\u9009\u5B83\u4F1A\u81EA\u52A8\u56DE\u9000\u5230\u9ED8\u8BA4\u6863'\n }\n if (target !== slot) button.title = (button.title ? button.title + ' \u00B7 ' : '') + '\u8BE5\u6A21\u578B\u53D1 ' + target\n listen(button, 'click', function (event) {\n event.preventDefault()\n event.stopPropagation()\n // \u552F\u4E00\u5199\u5165\u53E3\uFF1A\u5199\u7684\u5C31\u662F\u8BBE\u7F6E\u9875\u90A3\u4E00\u884C\u8BFB\u7684\u90A3\u4E2A\u503C\n env.setChatSlot(slot)\n paintModelPill()\n renderModelMenu()\n env.setStatus('\u8FFD\u95EE\u6863\u4F4D\uFF1A' + env.SLOT_LABEL[slot] + (target !== slot ? '\uFF08\u8BE5\u6A21\u578B\u53D1 ' + target + '\uFF09' : ''))\n })\n tiers.appendChild(button)\n })(env.SLOT_ORDER[t])\n }\n env.modelMenu.appendChild(tiers)\n env.modelMenu.appendChild(\n el('div', 'dsh-sel-pickerhint', '\u601D\u8003\u5F3A\u5EA6\u4EC5\u5F71\u54CD\u8FFD\u95EE\u3002'),\n )\n }\n\n function closeModelMenu() {\n env.modelMenu.setAttribute('data-open', '0')\n env.modelMenu.removeAttribute('role')\n env.modelPill.setAttribute('aria-expanded', 'false')\n }\n\n function openModelMenu() {\n env.modelMenu.setAttribute('data-open', '1')\n env.modelMenu.setAttribute('role', 'menu')\n env.modelPill.setAttribute('aria-expanded', 'true')\n renderModelMenu()\n loadModelCatalog(false).then(function () {\n if (env.modelMenu.getAttribute('data-open') === '1') {\n renderModelMenu()\n paintModelPill()\n }\n })\n }\n\n // \u2014\u2014 \u7F51\u9875\u6A21\u5F0F\u5F00\u5173 \u2014\u2014\n var WEB_MODE_KEY = 'dsh-selection-explain:webAnswer'\n\n function readWebMode() {\n try {\n return window.localStorage && window.localStorage.getItem(WEB_MODE_KEY) === '1'\n } catch (error) {\n return false\n }\n }\n\n function paintWebMode() {\n var on = env.state.webAnswer === true\n env.webMode.setAttribute('data-on', on ? '1' : '0')\n // \u4E24\u683C\u5404\u81EA\u62A5\u81EA\u5DF1\u7684\u9009\u4E2D\u6001\uFF08radiogroup \u8BED\u4E49\uFF09\uFF1B\u836F\u4E38\u9760 data-on \u6ED1\u8FC7\u53BB\n env.cellMd.setAttribute('aria-checked', on ? 'false' : 'true')\n env.cellWeb.setAttribute('aria-checked', on ? 'true' : 'false')\n env.cellMd.title = '\u8F93\u51FA\u504F\u597D\uFF1AMarkdown \u2014\u2014 \u9ED8\u8BA4\u7528\u6587\u5B57\u56DE\u7B54\uFF0C\u5FC5\u8981\u65F6\u4ECD\u53EF\u7528\u7F51\u9875'\n env.cellWeb.title = '\u8F93\u51FA\u504F\u597D\uFF1A\u7F51\u9875 \u2014\u2014 \u590D\u6742\u95EE\u9898\u7528 HTML \u9875\u9762\u8BB2\u6E05\u695A\uFF0C\u7B80\u5355\u95EE\u9898\u4ECD\u76F4\u63A5\u6587\u5B57\u56DE\u7B54'\n }\n\n /** \u8BBE\u7F6E\u6863\u4F4D\uFF08\u70B9\u683C\u5B50 / \u5FEB\u6377\u952E\u90FD\u8D70\u8FD9\u91CC\uFF09\u3002 */\n function setPref(on, focus) {\n env.state.webAnswer = on === true\n try {\n if (window.localStorage) window.localStorage.setItem(WEB_MODE_KEY, env.state.webAnswer ? '1' : '0')\n } catch (error) {\n /* \u65E0\u75D5\u6A21\u5F0F\u7B49\u573A\u666F\uFF1A\u53EA\u5F53\u6B21\u751F\u6548 */\n }\n paintWebMode()\n if (focus) (env.state.webAnswer ? env.cellWeb : env.cellMd).focus()\n env.setStatus(env.state.webAnswer ? '\u8F93\u51FA\u504F\u597D\uFF1A\u7F51\u9875' : '\u8F93\u51FA\u504F\u597D\uFF1AMarkdown')\n return env.state.webAnswer\n }\n return {\n closeModelMenu,\n get modelPillClicks() { return modelPillClicks },\n set modelPillClicks(value) { modelPillClicks = value },\n openModelMenu,\n readWebMode,\n paintWebMode,\n paintModelPill,\n get modelCatalog() { return modelCatalog },\n set modelCatalog(value) { modelCatalog = value },\n setPref,\n loadModelCatalog,\n renderModelMenu,\n catalogItemOf,\n warmModelCatalog,\n rememberBadTier,\n }\n}\n", "import { VOICE_FALLBACK_SECONDS, VOICE_CATALOG_TTL, SPEECH_API, VOICE_SILENCE_RMS, SPEECH_TRANSCRIBE, VOICE_COMMIT_MAX_SECONDS, VOICE_PREVIEW_WINDOW, VOICE_PAUSE_MS, VOICE_PAUSE_MIN_MS, VOICE_PREVIEW_EVERY, VOICE_MAX_BYTES, SPEECH_PREPARE } from './constants.js'\nimport { el, listen, clamp } from './dom.js'\nimport { micIcon } from './icons.js'\nimport { encodeWave, bytesToBase64, recordingSupported } from './audio.js'\n\n/** voice state and operations; dependencies are supplied as live node/callback accessors. */\nexport function createVoiceController(env) {\n\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 \u8BED\u97F3\u8F93\u5165\uFF08\u9EA6\u514B\u98CE\uFF09 \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n //\n // \u8981\u89E3\u51B3\u7684\u95EE\u9898\uFF1A\u8FFD\u95EE\u5F80\u5F80\u53EA\u6709\u4E00\u4E24\u53E5\u8BDD\uFF08\"\u8FD9\u8BCD\u5728\u8FD9\u91CC\u662F\u4E0D\u662F\u8D2C\u4E49\uFF1F\"\uFF09\uFF0C\n // \u4F46**\u6253\u5B57**\u8FD9\u4EF6\u4E8B\u672C\u8EAB\u5C31\u8981\u628A\u624B\u4ECE\u9F20\u6807\u632A\u5230\u952E\u76D8\u2014\u2014\u548C\"\u5212\u8BCD\"\u8FD9\u4E2A\u52A8\u4F5C\u662F\u77DB\u76FE\u7684\u3002\n //\n // **UI \u4E0E\u4E3B\u4F1A\u8BDD\u540C\u4E00\u5957**\uFF08\u5B98\u65B9 @deepseek-ai/dsh-experimental-client-ui-voice-input\uFF09\uFF1A\n // \u5E73\u65F6\u662F\u8F93\u5165\u6846\u53F3\u8FB9\u7684 \uD83C\uDFA4\uFF1B\u5F00\u59CB\u5F55\u4E4B\u540E\u5DE5\u5177\u884C\u6362\u6210\u5F55\u97F3\u884C \u2014\u2014`\u2715` | \u5B9E\u65F6\u6CE2\u5F62 | `\u25A0`\uFF0C\n // \u8BF7\u6C42\u6743\u9650/\u8BC6\u522B\u4E2D\u662F\u300C\u547C\u5438\u70B9 + \u8BF7\u5141\u8BB8\u4F7F\u7528\u9EA6\u514B\u98CE\u2026/\u8BC6\u522B\u4E2D\u2026\u300D\uFF0C\u51FA\u9519\u662F\u300C\u539F\u56E0 + \u884C\u5185\u52A8\u4F5C\u300D\u3002\n // \u6CE2\u5F62\u7B97\u6CD5\uFF0880 \u6839\u7EBF / 50ms \u91C7\u6837 / 1+min(1,amp*5)*17 / \u53F3\u4FA7\u6700\u65B0\uFF09\u9010\u884C\u7167\u6284\uFF0C\n // \u53EA\u6709\u5C3A\u5BF8\u6309\u5C0F\u7A97\u7684 composer \u6536\u6210 26px\uFF08\u4E3B\u4F1A\u8BDD 32px\uFF09\u2014\u2014\u4E24\u5904\u770B\u8D77\u6765\u624D\u662F\u540C\u4E00\u4E2A\u4E1C\u897F\u3002\n //\n // \u8BC6\u522B\u51FA\u6765\u7684\u6587\u5B57**\u63D2\u8FDB\u8F93\u5165\u6846**\uFF08\u4E0D\u662F\u76F4\u63A5\u53D1\u9001\uFF1A\u8BC6\u522B\u6709\u9519\u5B57\uFF0C\u63D2\u8FDB\u53BB\u8FD8\u80FD\u6539\uFF0C\n // \u4E5F\u80FD\u5728\u540C\u4E00\u6761\u91CC\u63A5\u7740\u8BF4\u7B2C\u4E8C\u6BB5\uFF09\u3002\u5F55\u97F3\u4E2D\u5207\u8D70/\u6536\u8D77\u5C0F\u7A97/\u8FD9\u6761\u6D88\u606F\u53D1\u51FA\u53BB/\u505C\u7528\u63D2\u4EF6\n // \u90FD\u4F1A\u7ACB\u523B\u677E\u5F00\u9EA6\u514B\u98CE\uFF08\u4E0D\u7559\u4E0B\u4E00\u76F4\u4EAE\u7740\u7684\u5F55\u97F3\u6807\u8BC6\uFF09\u3002\n\n /** \u72B6\u6001\u673A\uFF1Aidle \u2192 requesting \u2192 recording \u2192 transcribing \u2192\uFF08feedback | idle\uFF09\u2192 idle\u3002 */\n var voice = {\n phase: 'idle',\n /**\n * \u7B2C\u51E0\u8F6E\u3002\u505C/\u53D6\u6D88/\u5173\u9762\u677F\u90FD\u4F1A +1 \u2014\u2014 \u665A\u5230\u7684\u56DE\u8C03\u636E\u6B64\u4E22\u5F03\u81EA\u5DF1\u3002\n * \u6CA1\u6709\u5B83\u5C31\u4F1A\u51FA\u73B0\"\u660E\u660E\u53D6\u6D88\u4E86\uFF0C\u8FC7\u4E24\u79D2\u5374\u5192\u51FA\u4E00\u6BB5\u6587\u5B57\"\uFF08\u5F02\u6B65\u7684\u6743\u9650\u3001\u8BC6\u522B\u90FD\u53EF\u80FD\u665A\u5230\uFF09\u3002\n */\n generation: 0,\n capture: null,\n abort: null,\n ticker: 0,\n waveFrame: 0,\n waveAt: 0,\n startedAt: 0,\n maxSeconds: VOICE_FALLBACK_SECONDS,\n catalog: null,\n catalogAt: 0,\n idleTimer: 0,\n pollTimer: 0,\n lastClock: -1,\n level: 0,\n lastText: '',\n /** feedback \u9636\u6BB5\u7684\u884C\u5185\u52A8\u4F5C\uFF08null = \u53EA\u663E\u793A\u539F\u56E0\uFF0C\u4E0D\u7ED9\u6309\u94AE\uFF09\u3002 */\n action: null,\n /**\n * \u5B9E\u65F6\u5B57\u5E55\uFF08\u534A\u53E5\u9884\u89C8 + \u505C\u987F\u5B9A\u7A3F\uFF09\u7684\u8FD0\u884C\u65F6\u72B6\u6001\u3002\n * text/committed/preview \u90FD\u662F\u8F93\u5165\u6846\u91CC\u90A3\u4E00\u6BB5\u7684\u4E00\u90E8\u5206\uFF0Cstart \u662F\u5B83\u5728 value \u91CC\u7684\u8D77\u70B9\u3002\n */\n live: {\n active: false,\n disabled: false,\n reason: '',\n separator: '',\n start: -1,\n text: '',\n committed: '',\n preview: '',\n boundary: 0,\n phraseStart: 0,\n inflight: false,\n controller: null,\n timer: 0,\n tickAt: 0,\n startedAt: 0,\n previewFails: 0,\n passes: { preview: 0, commit: 0 },\n rewritten: false,\n },\n }\n\n /** \u5F55\u97F3\u5931\u8D25\u7684\u7EDF\u4E00\u8BDD\u672F\uFF08\u6D4F\u89C8\u5668\u629B\u7684\u662F DOMException\uFF0C\u7528\u6237\u770B\u4E0D\u61C2\uFF09\u3002 */\n var VOICE_ERRORS = {\n unavailable: '\u5F53\u524D\u6D4F\u89C8\u5668\u4E0D\u652F\u6301\u5F55\u97F3\uFF0C\u8BF7\u4F7F\u7528\u652F\u6301\u9EA6\u514B\u98CE\u7684\u6D4F\u89C8\u5668\u3002',\n permission: '\u9EA6\u514B\u98CE\u6743\u9650\u672A\u5F00\u542F\uFF0C\u8BF7\u5728\u6D4F\u89C8\u5668\u548C\u7CFB\u7EDF\u8BBE\u7F6E\u4E2D\u5141\u8BB8\u8BBF\u95EE\u3002',\n missing: '\u6CA1\u6709\u627E\u5230\u9EA6\u514B\u98CE\u8BBE\u5907\u3002',\n interrupted: '\u5F55\u97F3\u4E2D\u65AD\uFF0C\u8BF7\u91CD\u8BD5\u3002',\n empty: '\u672A\u8BC6\u522B\u5230\u8BED\u97F3',\n cancelled: '\u5DF2\u53D6\u6D88\u8BED\u97F3\u8F93\u5165\u3002',\n }\n\n function voiceError(kind, extra) {\n var error = /** @type {Error & { voiceKind?: string }} */ (new Error(VOICE_ERRORS[kind] || '\u5F55\u97F3\u5931\u8D25'))\n error.voiceKind = kind\n if (extra) error.cause = extra\n return error\n }\n\n /** \u51FA\u9519\u4FE1\u606F \u2192 \u4E00\u53E5\u4EBA\u8BDD\u3002 */\n function voiceMessageOf(error) {\n if (!error) return '\u672A\u77E5\u9519\u8BEF'\n if (error.voiceKind) return VOICE_ERRORS[error.voiceKind] || '\u5F55\u97F3\u5931\u8D25'\n return String(error.message || error)\n }\n\n /**\n * \u72B6\u6001\u884C\u6587\u6848\uFF1A\n * @param text \u6587\u6848\n * @param {{ dot?: boolean, tone?: string }} options \u72B6\u6001\u884C\u663E\u793A\u9009\u9879\n */\n function setVoiceActivity(text, options) {\n var opts = options || {}\n env.voiceActivityText.textContent = String(text || '')\n env.voiceActivity.setAttribute('data-tone', opts.tone || '')\n env.voiceDot.style.display = opts.dot ? '' : 'none'\n }\n\n /** \u884C\u5185\u52A8\u4F5C\u4F4D\uFF1A'prepare'\uFF08\u51C6\u5907\u6A21\u578B\u6587\u5B57\u952E\uFF09/ null\uFF08\u7528 \uD83C\uDFA4 \u91CD\u5F55\uFF09/ 'none'\uFF08\u4EC0\u4E48\u90FD\u4E0D\u8981\uFF09\u3002 */\n function setVoiceAction(kind) {\n while (env.voiceActionSlot.firstChild) env.voiceActionSlot.removeChild(env.voiceActionSlot.firstChild)\n voice.action = kind || null\n if (kind === 'prepare') {\n var prepareBtn = el('button', 'dsh-sel-vact', '\u51C6\u5907\u6A21\u578B')\n prepareBtn.type = 'button'\n prepareBtn.title = '\u5728\u672C\u673A\u4E0B\u8F7D\u5E76\u51C6\u5907\u8BC6\u522B\u6A21\u578B\uFF08\u9996\u6B21\u8981\u4E0B\u8F7D\uFF0C\u4E4B\u540E\u4E00\u76F4\u53EF\u7528\uFF09'\n listen(prepareBtn, 'click', function (event) {\n event.stopPropagation()\n prepareVoice()\n })\n env.voiceActionSlot.appendChild(prepareBtn)\n return prepareBtn\n }\n if (kind === 'retry') {\n var retryMic = el('button', 'dsh-sel-round')\n retryMic.type = 'button'\n retryMic.setAttribute('aria-label', '\u91CD\u65B0\u5F55\u97F3')\n retryMic.title = '\u91CD\u65B0\u5F55\u97F3'\n retryMic.appendChild(micIcon())\n listen(retryMic, 'click', function (event) {\n event.stopPropagation()\n startVoice()\n })\n env.voiceActionSlot.appendChild(retryMic)\n return retryMic\n }\n return null\n }\n\n /**\n * \u51FA\u9519/\u63D0\u793A\uFF1A\u5F55\u97F3\u884C\u91CC\u7ED9\u4E00\u53E5\u539F\u56E0 +\uFF08\u6709\u6551\u7684\uFF09\u4E00\u4E2A\u52A8\u4F5C\u3002`retryable` \u4E3A\u771F\u65F6\u7ED9 \uD83C\uDFA4 \u91CD\u5F55\u952E\u3002\n * \u8FD9\u662F\u4E3B\u4F1A\u8BDD\u7684 feedback \u9636\u6BB5\uFF1A\u5B83\u5C31\u4E00\u76F4\u505C\u5728\u90A3\u513F\uFF0C\u76F4\u5230\u7528\u6237\u70B9 \u2715\uFF08\u6216\u884C\u5185\u52A8\u4F5C\uFF09\u3002\n */\n function voiceFeedback(text, tone, action) {\n voice.phase = 'feedback'\n setVoiceActivity(text, { tone: tone || '' })\n setVoiceAction(action)\n paintVoice()\n }\n\n /** \u6309\u72B6\u6001\u6446\u597D\u5F55\u97F3\u884C\uFF1Aidle \u663E \uD83C\uDFA4\uFF0C\u5176\u4F59\u663E\u5F55\u97F3\u884C\uFF08\u2715 / \u6CE2\u5F62\u6216\u6587\u6848 / \u25A0 \u6216\u884C\u5185\u52A8\u4F5C\uFF09\u3002 */\n function paintVoice() {\n var phase = voice.phase\n var capturing = phase !== 'idle'\n env.captureRow.setAttribute('data-show', capturing ? '1' : '0')\n env.captureRow.style.display = capturing ? 'flex' : 'none'\n // \u5DE5\u5177\u884C\u4E5F\u6807\u8BB0\u4E00\u4E0B\uFF1A\u5F55\u97F3\u65F6 flex-wrap \u9501\u6B7B\uFF08\u53D1\u9001\u952E\u5FC5\u987B\u8FD8\u5728\u8FD9\u4E00\u884C\uFF09\n env.askTools.setAttribute('data-capturing', capturing ? '1' : '0')\n // \u5F55\u97F3\u884C\u51FA\u73B0\u65F6\uFF0C\u5DE5\u5177\u884C\u5DE6\u8FB9\u90A3\u4E09\u6837\uFF08\u8F93\u51FA\u504F\u597D / \u6A21\u578B / \uD83C\uDFA4\uFF09\u8BA9\u4F4D\u2014\u2014\u548C\u4E3B\u4F1A\u8BDD\u4E00\u6837\uFF0C\n // \u5F55\u97F3\u65F6\u90A3\u884C\u53EA\u8BB2\u4E00\u4EF6\u4E8B\uFF1A\u600E\u4E48\u7ED3\u675F\u3001\u7ED3\u675F\u4E4B\u540E\u4F1A\u5F97\u5230\u4EC0\u4E48\u3002\n env.webMode.style.display = capturing ? 'none' : ''\n env.askSpacer.style.display = capturing ? 'none' : ''\n env.modelPill.style.display = capturing ? 'none' : ''\n env.micButton.style.display = capturing ? 'none' : ''\n // \u4E2D\u95F4\u90A3\u683C\uFF1A\u5F55\u97F3\u65F6\u662F\u6CE2\u5F62\uFF0C\u5176\u4F59\u662F\u6587\u6848\uFF1B\u25A0 \u53EA\u5728\u5F55\u97F3\u65F6\u51FA\u73B0\n var recording = phase === 'recording'\n env.waveSvg.style.display = recording ? '' : 'none'\n env.voiceActivity.style.display = recording ? 'none' : 'flex'\n env.voiceStop.style.display = recording ? 'inline-grid' : 'none'\n env.voiceCancel.title = phase === 'feedback' ? '\u5173\u95ED\uFF08Esc\uFF09' : '\u53D6\u6D88\u8FD9\u6B21\u8BED\u97F3\uFF08Esc\uFF0C\u5DF2\u7ECF\u8BF4\u51FA\u6765\u7684\u5B57\u7559\u7740\uFF09'\n env.voiceCancel.setAttribute('aria-label', env.voiceCancel.title)\n // \uD83C\uDFA4 \u89E6\u53D1\u952E\u7684\u72B6\u6001\uFF1A\u53EA\u5728\"\u8BF7\u6C42\u6743\u9650\"\u65F6\u8F6C\u5708\uFF08\u5176\u4F59\u90FD\u662F\u666E\u901A\u56FE\u6807 \u2014\u2014 \u548C\u4E3B\u4F1A\u8BDD\u4E00\u81F4\uFF09\n env.micButton.setAttribute('data-state', phase === 'requesting' ? 'requesting' : 'idle')\n env.micButton.setAttribute('aria-pressed', capturing ? 'true' : 'false')\n env.micButton.title = '\u8BED\u97F3\u8F93\u5165\uFF08\u70B9\u4E00\u4E0B\u5F00\u59CB\u8BF4\uFF0C\u518D\u70B9\u4E00\u4E0B\u7ED3\u675F\u5E76\u8F6C\u6210\u6587\u5B57\uFF09'\n }\n\n /** \u8BC6\u522B\u5668\uFF1A\u76EE\u5F55\u91CC\u9ED8\u8BA4\u90A3\u4E2A\uFF08\u6CA1\u6709\u5C31\u7B2C\u4E00\u4E2A\uFF09\u3002 */\n function voiceProvider(catalog) {\n if (!catalog || !catalog.providers || !catalog.providers.length) return null\n var id = catalog.selection && catalog.selection.providerId\n for (var i = 0; i < catalog.providers.length; i += 1) {\n if (catalog.providers[i].id === id) return catalog.providers[i]\n }\n return catalog.providers[0]\n }\n\n /** \u76EE\u5F55\uFF08\u6709\u54EA\u4E9B\u8BC6\u522B\u5668\u3001\u80FD\u4E0D\u80FD\u5F55\u3001\u80FD\u5F55\u591A\u4E45\uFF09\uFF1A\u77ED\u6682\u7F13\u5B58\uFF0C\u522B\u6BCF\u70B9\u4E00\u6B21\u90FD\u95EE\u4E00\u904D host\u3002 */\n function fetchSpeechCatalog(force) {\n var now = Date.now()\n if (!force && voice.catalog && now - voice.catalogAt < VOICE_CATALOG_TTL) {\n return Promise.resolve(voice.catalog)\n }\n return fetch(SPEECH_API)\n .then(function (response) {\n return response.json()\n })\n .then(function (data) {\n voice.catalog = data\n voice.catalogAt = Date.now()\n return data\n })\n }\n\n /**\n * \u6CE2\u5F62\u63A8\u8FDB\u4E00\u5E27\uFF08\u7B97\u6CD5\u7167\u6284\u4E3B\u4F1A\u8BDD\u7684 Waveform\uFF09\uFF1A\n * \u65B0\u7684\u7535\u5E73\u4ECE\u53F3\u8FB9\u6324\u8FDB\u6765\uFF0C\u6574\u6392\u5F80\u5DE6\u63A8\uFF1B\u9759\u97F3\u65F6\u6BCF\u6761\u7EBF\u53EA\u6709 2px \u9AD8 \u2014\u2014 \u5C31\u662F\u90A3\u6761\u865A\u7EBF\u3002\n * @param level \u672C\u5E27\u7535\u5E73\uFF080 = \u4E0D\u91C7\u6837\uFF0C\u53EA\u628A\u5C3A\u5BF8\u6446\u6B63\uFF09\n */\n function repaintWave(level) {\n var next = level\n for (var i = 0; i < env.waveBars.length; i += 1) {\n var bar = env.waveBars[i]\n var previous = bar.level\n bar.level = next\n next = previous\n var height = 1 + Math.min(1, bar.level * 5) * 17\n bar.node.setAttribute('y1', String(20 - height))\n bar.node.setAttribute('y2', String(20 + height))\n }\n }\n\n /** \u628A\u6CE2\u5F62\u6E05\u56DE\u9759\u97F3\u57FA\u7EBF\uFF08\u65B0\u4E00\u6B21\u5F55\u97F3\u4ECE\u5934\u5F00\u59CB\u753B\uFF1B\u4E3B\u4F1A\u8BDD\u662F\u91CD\u5EFA SVG\uFF0C\u6548\u679C\u4E00\u6837\uFF09\u3002 */\n function resetWave() {\n for (var i = 0; i < env.waveBars.length; i += 1) {\n env.waveBars[i].level = 0\n env.waveBars[i].node.setAttribute('y1', '19')\n env.waveBars[i].node.setAttribute('y2', '21')\n }\n }\n\n function stopWaveLoop() {\n if (voice.waveFrame && typeof cancelAnimationFrame === 'function') cancelAnimationFrame(voice.waveFrame)\n voice.waveFrame = 0\n voice.waveAt = 0\n }\n\n /** \u5F55\u97F3\u65F6\u7684\u6CE2\u5F62\u5FAA\u73AF\uFF1A50ms \u91C7\u4E00\u6B21\u97F3\u91CF\uFF08\u548C\u4E3B\u4F1A\u8BDD\u540C\u4E00\u4E2A\u8282\u62CD\uFF09\u3002 */\n function startWaveLoop() {\n stopWaveLoop()\n if (typeof requestAnimationFrame !== 'function') return\n var draw = function (now) {\n if (voice.phase !== 'recording') return\n // rAF \u4F1A\u7ED9\u65F6\u95F4\u6233\uFF0C\u4F46\u4E0D\u662F\u6240\u6709\u73AF\u5883\u90FD\u7ED9\uFF08\u6869\u3001\u8001\u5B9E\u73B0\uFF09\u2014\u2014\u7F3A\u4E86\u5C31\u7528\u5F53\u524D\u65F6\u95F4\uFF0C\u522B\u8BA9\u6CE2\u5F62\u5361\u4F4F\n var at = typeof now === 'number' ? now : Date.now()\n if (at - voice.waveAt >= 50) {\n voice.waveAt = at\n var level = 0\n try {\n level = voice.capture ? voice.capture.level() : 0\n } catch (error) {\n level = 0\n }\n voice.level = level\n repaintWave(level)\n }\n voice.waveFrame = requestAnimationFrame(draw)\n }\n voice.waveFrame = requestAnimationFrame(draw)\n }\n\n function stopVoiceTicker() {\n if (voice.ticker) clearInterval(voice.ticker)\n voice.ticker = 0\n voice.lastClock = -1\n stopWaveLoop()\n }\n\n /**\n * \u4E00\u6B21\u5F55\u97F3\u7684\u5168\u90E8\u8D44\u6E90\uFF1A\u9EA6\u514B\u98CE\u6D41\u3001MediaRecorder\u3001AudioContext\u3001\u5206\u6790\u5668\u3002\n *\n * \u8FD9\u51E0\u4E2A\u4E1C\u897F**\u5FC5\u987B\u4E00\u8D77\u91CA\u653E**\uFF1A\u53EA\u505C MediaRecorder \u7684\u8BDD\uFF0C\u6807\u7B7E\u9875\u4E0A\u4F1A\u4E00\u76F4\u6302\u7740\n * \"\u6B63\u5728\u4F7F\u7528\u9EA6\u514B\u98CE\"\u7684\u6807\u8BC6\uFF08\u7528\u6237\u4F1A\u4EE5\u4E3A\u5728\u5077\u542C\uFF09\uFF0CAudioContext \u4E5F\u4F1A\u4E00\u76F4\u5360\u7740\u97F3\u9891\u7EBF\u7A0B\u3002\n */\n function createCapture(onError) {\n var stream = null\n var recorder = null\n var context = null\n var analyser = null\n var samples = new Float32Array(256)\n var chunks = []\n var lifetime = new AbortController()\n var disposal = null\n // \u2500\u2500 \u91C7\u6837\u6C34\u9F99\u5934\uFF08\u5B9E\u65F6\u5B57\u5E55\u7528\uFF09\u2500\u2500\n var tap = null\n var tapGain = null\n /** 16k \u91C7\u6837\u7684\u5206\u7247\u8868\uFF08\u6309\u65F6\u5E8F\uFF09\uFF0CtapLength \u662F\u603B\u91C7\u6837\u6570\u3002 */\n var tapChunks = []\n var tapLength = 0\n /** \u7EBF\u6027\u91CD\u91C7\u6837\u7684\u5206\u6570\u4F4D\u7F6E\uFF1A\u8DE8\u56DE\u8C03\u8FDE\u7EED\uFF0C\u63A5\u7F1D\u5904\u624D\u4E0D\u4F1A\u6BCF 93ms \u4E22\u4E00\u4E2A\u70B9\u3002 */\n var tapPos = 0\n /** \u6700\u8FD1\u4E00\u6B21\"\u6709\u58F0\"\u7684\u91C7\u6837\u4F4D\u7F6E\u4E0E\u5899\u949F\u65F6\u95F4\uFF08\u505C\u987F\u5B9A\u7A3F\u9760\u5B83\u5207\u8FB9\u754C\uFF09\u3002 */\n var tapLoudIndex = -1\n var tapLoudAt = 0\n\n /** \u628A\u4E00\u5757\u539F\u59CB\u91C7\u6837\uFF08context \u91C7\u6837\u7387\uFF09\u91CD\u91C7\u6837\u5230 16k \u6512\u8D77\u6765\uFF0C\u540C\u65F6\u5224\"\u6709\u58F0/\u9759\u97F3\"\u3002 */\n function acceptChunk(input) {\n var rate = context && context.sampleRate ? context.sampleRate : 48000\n var step = rate / 16000\n var out = []\n var pos = tapPos\n while (pos + 1 < input.length) {\n var index = Math.floor(pos)\n var frac = pos - index\n out.push(input[index] * (1 - frac) + input[index + 1] * frac)\n pos += step\n }\n tapPos = pos - input.length\n if (out.length) {\n var piece = Float32Array.from(out)\n tapChunks.push(piece)\n tapLength += piece.length\n }\n var sum = 0\n for (var i = 0; i < input.length; i += 1) sum += input[i] * input[i]\n if (Math.sqrt(sum / input.length) >= VOICE_SILENCE_RMS) {\n tapLoudIndex = tapLength\n tapLoudAt = Date.now()\n }\n }\n\n /** \u53D6 [from, to) \u7684 16k \u91C7\u6837\uFF08\u8D8A\u754C\u81EA\u52A8\u5939\u4F4F\uFF09\u3002 */\n function readSamples(from, to) {\n var a = Math.max(0, Math.floor(from))\n var b = Math.min(tapLength, Math.ceil(to))\n if (b <= a) return new Float32Array(0)\n var out = new Float32Array(b - a)\n var cursor = 0\n for (var i = 0; i < tapChunks.length; i += 1) {\n var piece = tapChunks[i]\n var end = cursor + piece.length\n if (end > a && cursor < b) {\n var s = Math.max(0, a - cursor)\n var e = Math.min(piece.length, b - cursor)\n out.set(piece.subarray(s, e), cursor + s - a)\n }\n cursor = end\n if (cursor >= b) break\n }\n return out\n }\n\n function release() {\n try {\n lifetime.abort()\n } catch (error) {\n /* noop */\n }\n if (tap) {\n try {\n tap.onaudioprocess = null\n tap.disconnect()\n } catch (error) {\n /* noop */\n }\n }\n if (tapGain) {\n try {\n tapGain.disconnect()\n } catch (error) {\n /* noop */\n }\n }\n try {\n if (recorder && recorder.state === 'recording') recorder.stop()\n } catch (error) {\n /* noop */\n }\n if (stream) {\n var tracks = stream.getTracks ? stream.getTracks() : []\n for (var i = 0; i < tracks.length; i += 1) {\n try {\n tracks[i].stop()\n } catch (error) {\n /* noop */\n }\n }\n }\n if (context && typeof context.close === 'function') {\n try {\n context.close()\n } catch (error) {\n /* noop */\n }\n }\n return Promise.resolve()\n }\n\n function dispose() {\n if (!disposal) disposal = release()\n return disposal\n }\n\n /** decodeAudioData\uFF1A\u65B0\u6D4F\u89C8\u5668\u8FD4\u56DE Promise\uFF0C\u8001 Safari \u53EA\u8BA4\u56DE\u8C03 \u2014\u2014 \u4E24\u79CD\u90FD\u63A5\u4F4F\u3002 */\n function decode(buffer) {\n return new Promise(function (resolve, reject) {\n var pending = context.decodeAudioData(buffer, resolve, reject)\n if (pending && typeof pending.then === 'function') pending.then(resolve, reject)\n })\n }\n\n return {\n /** \u62FF\u9EA6\u514B\u98CE\u5E76\u5F00\u59CB\u5F55\uFF08\u6743\u9650\u5F39\u7A97\u53EF\u80FD\u5F88\u4E45\uFF0C\u665A\u5230\u7684\u6388\u6743\u8981\u80FD\u4F5C\u5E9F\uFF09\u3002 */\n start: function () {\n var devices = navigator.mediaDevices\n if (!devices || typeof devices.getUserMedia !== 'function' || typeof window.MediaRecorder === 'undefined') {\n return Promise.reject(voiceError('unavailable'))\n }\n return devices\n .getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true }, video: false })\n .then(\n function (got) {\n stream = got\n if (lifetime.signal.aborted) {\n var granted = got.getTracks ? got.getTracks() : []\n for (var i = 0; i < granted.length; i += 1) granted[i].stop()\n throw voiceError('cancelled')\n }\n var Ctx = window.AudioContext || window.webkitAudioContext\n try {\n context = new Ctx()\n // \u6CA1\u6709\u7528\u6237\u624B\u52BF\u65F6\u6D4F\u89C8\u5668\u4F1A\u628A AudioContext \u6302\u8D77\uFF1A\u6CE2\u5F62\u8981\u52A8\u5C31\u5F97\u5524\u9192\u5B83\n if (context.state === 'suspended' && typeof context.resume === 'function') {\n var resumed = context.resume()\n if (resumed && typeof resumed.catch === 'function') resumed.catch(function () {})\n }\n analyser = context.createAnalyser()\n analyser.fftSize = samples.length\n var source = context.createMediaStreamSource(stream)\n source.connect(analyser)\n // \u539F\u59CB\u91C7\u6837\u6C34\u9F99\u5934\uFF08\u53EA\u670D\u52A1\u4E8E\u5B9E\u65F6\u5B57\u5E55\uFF09\uFF1A\n // MediaRecorder \u90A3\u6761\u8DEF\u4E0D\u53D8\uFF0C\u6700\u7EC8\u90A3\u4EFD\u89C4\u8303 WAV \u8FD8\u662F\u5B83\u51FA\u7684\uFF1B\u8FD9\u91CC\u591A\u63A5\u4E00\u8DEF\uFF0C\n // \u76F4\u63A5\u628A\u9EA6\u514B\u98CE\u7684\u91C7\u6837\u6309 16k \u6512\u8D77\u6765 \u2014\u2014 \u5207\u7A97\u53E3\u65F6\u4E0D\u7528\u6BCF\u4E2A tick \u53BB decode \u6574\u4E2A blob\u3002\n // ScriptProcessorNode \u5DF2\u5E9F\u5F03\u4F46\u4ECD\u5728\uFF08\u5B9E\u6D4B Chrome 153 \u53EF\u7528\uFF09\uFF1B\u6CA1\u6709\u5C31\u5173\u6389\u5B9E\u65F6\u5C42\u3002\n try {\n if (typeof context.createScriptProcessor === 'function') {\n tap = context.createScriptProcessor(4096, 1, 1)\n tapGain = context.createGain()\n tapGain.gain.value = 0 // \u9759\u97F3\uFF1A\u522B\u628A\u9EA6\u514B\u98CE\u56DE\u704C\u5230\u626C\u58F0\u5668\uFF08\u4F1A\u5578\u53EB\uFF09\n tap.onaudioprocess = function (event) {\n var input = event && event.inputBuffer ? event.inputBuffer.getChannelData(0) : null\n if (input) acceptChunk(input)\n }\n source.connect(tap)\n tap.connect(tapGain)\n tapGain.connect(context.destination)\n }\n } catch (error) {\n tap = null\n }\n recorder = new window.MediaRecorder(stream)\n recorder.ondataavailable = function (event) {\n if (!lifetime.signal.aborted && event.data && event.data.size > 0) chunks.push(event.data)\n }\n recorder.onerror = function () {\n if (lifetime.signal.aborted) return\n dispose()\n if (onError) onError(voiceError('interrupted'))\n }\n recorder.start()\n return true\n } catch (error) {\n return dispose().then(function () {\n throw error\n })\n }\n },\n function (error) {\n if (error && error.name === 'NotAllowedError') throw voiceError('permission')\n if (error && error.name === 'NotFoundError') throw voiceError('missing')\n throw error\n },\n )\n },\n\n /** \u5B9E\u65F6\u97F3\u91CF\uFF080..1 \u5DE6\u53F3\uFF09\uFF1A\u53EA\u7528\u6765\u9A71\u52A8\u6CE2\u5F62\u3002 */\n level: function () {\n if (!analyser) return 0\n try {\n analyser.getFloatTimeDomainData(samples)\n } catch (error) {\n return 0\n }\n var sum = 0\n for (var i = 0; i < samples.length; i += 1) sum += samples[i] * samples[i]\n return Math.sqrt(sum / samples.length)\n },\n\n /**\n * \u7ED3\u675F\u5F55\u97F3 \u2192 \u89C4\u8303 WAV\u3002\n * \u91CD\u91C7\u6837\u4EA4\u7ED9 OfflineAudioContext\uFF08\u6D4F\u89C8\u5668\u81EA\u5E26\u7684\u91CD\u91C7\u6837\u8D28\u91CF\u6BD4\u81EA\u5DF1\u5199\u7684\u7EBF\u6027\u63D2\u503C\u597D\u5F97\u591A\uFF09\uFF0C\n * \u91C7\u6837\u7387\u56FA\u5B9A 16kHz \u2014\u2014 host \u53EA\u6536\u8FD9\u4E00\u79CD\uFF08\u89C1 host \u7684 validateWave\uFF09\u3002\n */\n stop: function (maxSeconds) {\n return new Promise(function (resolve, reject) {\n if (!recorder || !context || recorder.state !== 'recording') {\n dispose().then(function () {\n reject(voiceError('empty'))\n })\n return\n }\n var settled = false\n function giveUp(error) {\n if (settled) return\n settled = true\n dispose().then(function () {\n reject(error)\n })\n }\n recorder.onstop = function () {\n if (settled) return\n settled = true\n var blob\n try {\n var tracks = stream && stream.getTracks ? stream.getTracks() : []\n for (var i = 0; i < tracks.length; i += 1) tracks[i].stop()\n blob = new Blob(chunks, { type: recorder.mimeType || 'audio/webm' })\n if (!blob.size) throw voiceError('empty')\n } catch (error) {\n dispose().then(function () {\n reject(error)\n })\n return\n }\n blob\n .arrayBuffer()\n .then(function (buffer) {\n return decode(buffer)\n })\n .then(function (decoded) {\n if (lifetime.signal.aborted) throw voiceError('cancelled')\n var rate = 16000\n var seconds = Math.min(decoded.duration || 0, maxSeconds)\n var frames = Math.max(1, Math.floor(seconds * rate))\n var Offline = window.OfflineAudioContext || window.webkitOfflineAudioContext\n var offline = new Offline(1, frames, rate)\n var source = offline.createBufferSource()\n source.buffer = decoded\n source.connect(offline.destination)\n source.start()\n return offline.startRendering()\n })\n .then(function (rendered) {\n return encodeWave(rendered.getChannelData(0))\n })\n .then(resolve, function (error) {\n reject(error)\n })\n }\n recorder.onerror = function () {\n giveUp(voiceError('empty'))\n }\n try {\n recorder.stop()\n } catch (error) {\n giveUp(error)\n }\n }).then(\n function (bytes) {\n return dispose().then(function () {\n return bytes\n })\n },\n function (error) {\n return dispose().then(function () {\n throw error\n })\n },\n )\n },\n\n dispose: dispose,\n /** \u5B9E\u65F6\u5B57\u5E55\u7684\u6C34\u9F99\u5934\uFF1A\u6CA1\u63A5\u4E0A\uFF08\u6D4F\u89C8\u5668\u6CA1\u6709 ScriptProcessor\uFF09\u65F6\u4E3A null\u3002 */\n tap: {\n supported: function () {\n return !!tap\n },\n length: function () {\n return tapLength\n },\n loudIndex: function () {\n return tapLoudIndex\n },\n loudAt: function () {\n return tapLoudAt\n },\n read: readSamples,\n /** \u81EA\u68C0/\u5355\u6D4B\u7528\uFF1A\u76F4\u63A5\u5582\u4E00\u5757\u539F\u59CB\u91C7\u6837\uFF08\u771F\u6D4F\u89C8\u5668\u91CC\u7531 onaudioprocess \u8C03\uFF09\u3002 */\n accept: acceptChunk,\n },\n }\n }\n\n /** \u5F55\u97F3\u4E2D\u7684\u5FC3\u8DF3\uFF1A\u5230\u70B9\u81EA\u52A8\u6536\u5C3E + \u8BB0\u4E00\u6B21\u7535\u5E73\uFF08\u6CE2\u5F62\u53E6\u6709\u81EA\u5DF1\u7684 50ms \u5FAA\u73AF\uFF09\u3002 */\n /** \u5F55\u97F3\u5F00\u59CB\u65F6\u628A\u5149\u6807\u4EA4\u7ED9\u8F93\u5165\u6846\uFF1A\u9884\u89C8\u843D\u5B57\u65F6\u5149\u6807\u8981\u5728\u672B\u5C3E\u8DF3\uFF08textarea \u6CA1\u7126\u70B9\u5C31\u4E0D\u663E\u793A\u5149\u6807\uFF09\u3002 */\n function focusAskForRecording() {\n env.focusAskBox()\n }\n\n function startVoiceTicker() {\n stopVoiceTicker()\n voice.ticker = setInterval(function () {\n if (voice.phase !== 'recording') return\n var elapsed = Date.now() - voice.startedAt\n var limit = voice.maxSeconds || VOICE_FALLBACK_SECONDS\n if (elapsed >= limit * 1000) {\n finishVoice()\n return\n }\n voice.lastClock = Math.floor(elapsed / 1000)\n }, 200)\n startWaveLoop()\n }\n\n /** \u8BC6\u522B\u51FA\u6765\u7684\u6587\u5B57 \u2192 \u8F93\u5165\u6846\uFF08\u63D2\u5728\u5149\u6807\u5904\uFF0C\u524D\u540E\u8865\u7A7A\u683C\uFF0C\u5149\u6807\u843D\u5728\u672B\u5C3E\uFF0C\u63A5\u7740\u8FD8\u80FD\u6253\u5B57\uFF09\u3002 */\n function insertTranscript(text) {\n var current = String(env.askBox.value || '')\n var start = typeof env.askBox.selectionStart === 'number' && env.askBox.selectionStart >= 0 ? env.askBox.selectionStart : current.length\n var end = typeof env.askBox.selectionEnd === 'number' && env.askBox.selectionEnd >= start ? env.askBox.selectionEnd : start\n var before = current.slice(0, start)\n var after = current.slice(end)\n var prefix = before && !/\\s$/.test(before) ? ' ' : ''\n var suffix = after && !/^\\s/.test(after) ? ' ' : ''\n env.askBox.value = before + prefix + text + suffix + after\n var caret = (before + prefix + text).length\n try {\n env.askBox.setSelectionRange(caret, caret)\n } catch (error) {\n /* \u6869\u73AF\u5883\u6CA1\u6709\u8FD9\u4E2A\u65B9\u6CD5 */\n }\n try {\n env.askBox.focus()\n } catch (error) {\n /* noop */\n }\n voice.lastText = text\n env.refreshAskState()\n return env.askBox.value\n }\n\n function failVoice(generation, error) {\n if (generation !== voice.generation) return\n voice.generation += 1\n var capture = voice.capture\n voice.capture = null\n stopVoiceTicker()\n if (capture) capture.dispose()\n // \"\u7528\u6237\u53D6\u6D88\"\u4E0D\u662F\u9519\uFF08\u70B9\u4E86 \u2715\u3001\u6536\u4E86\u5C0F\u7A97\u3001\u63D2\u4EF6\u505C\u7528\u90FD\u8D70\u8FD9\u91CC\uFF09\uFF0C\u4E0D\u7ED9\u9519\u8BEF\u63D0\u793A\n var kind = error && error.voiceKind\n if (kind === 'cancelled') {\n resetVoiceRow()\n return\n }\n // \u6CA1\u542C\u6E05 / \u4E2D\u65AD / \u5931\u8D25\uFF1A\u7559\u5728 feedback \u91CC\u7ED9\u539F\u56E0 + \uD83C\uDFA4 \u91CD\u5F55\uFF08\u548C\u4E3B\u4F1A\u8BDD\u4E00\u81F4\uFF09\n voiceFeedback(voiceMessageOf(error), kind === 'empty' || kind === 'interrupted' ? 'warn' : 'error', 'retry')\n }\n\n /** \u56DE\u5230 idle\uFF1A\u5DE5\u5177\u884C\u539F\u6837\u8FD8\u56DE\u53BB\u3002 */\n function resetVoiceRow() {\n stopVoiceTicker()\n stopLive()\n if (voice.idleTimer) clearTimeout(voice.idleTimer)\n voice.idleTimer = 0\n voice.phase = 'idle'\n voice.action = null\n while (env.voiceActionSlot.firstChild) env.voiceActionSlot.removeChild(env.voiceActionSlot.firstChild)\n setVoiceActivity('', {})\n paintVoice()\n }\n\n // \u2500\u2500 \u5B9E\u65F6\u5B57\u5E55\uFF08\u534A\u53E5\u9884\u89C8 + \u505C\u987F\u5B9A\u7A3F\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n //\n // \u8BF4\u8BDD\u65F6\u5B57\u5C31\u5F80\u8F93\u5165\u6846\u91CC\u957F\uFF1A\u6BCF ~1.3s \u628A\"\u8FD8\u6CA1\u5B9A\u7A3F\u7684\u8FD9\u534A\u53E5\"\u9001\u53BB\u8BC6\u522B\u4E00\u6B21\uFF0C\u6574\u6BB5\u66FF\u6362\u4E0A\u4E00\u62CD\n // \u7684\u9884\u89C8\uFF1B\u68C0\u6D4B\u5230 ~0.6s \u9759\u97F3\uFF08\u8FD9\u53E5\u8BF4\u5B8C\u4E86\uFF09\u5C31\u628A\u8FD9\u53E5\u9001\u53BB\u8BC6\u522B\u5E76**\u5B9A\u7A3F**\uFF0C\u4E4B\u540E\u4E0D\u518D\u53D8\u3002\n // \u505C\u6B62\uFF08\u25A0\uFF09\u65F6\u4ECD\u7136\u8D70\u539F\u6765\u90A3\u6761\"\u6574\u6BB5\u89C4\u8303 WAV\"\u7684\u8DEF\uFF0C\u56DE\u6765\u7684\u7ED3\u679C\u7ED9\u8FD9\u4E00\u6574\u6BB5\u6536\u53E3\uFF1A\n // \u00B7 \u6574\u6BB5\u8BC6\u522B**\u4EE5\u5DF2\u5B9A\u7A3F\u7684\u6587\u5B57\u5F00\u5934**\uFF08\u6B63\u5E38\u60C5\u51B5\uFF09\u2192 \u53EA\u8865\u540E\u534A\u53E5\uFF0C\u5B9A\u7A3F\u7684\u5B57\u4E00\u4E2A\u4E0D\u52A8\uFF1B\n // \u00B7 \u5BF9\u4E0D\u4E0A\uFF08\u6574\u6BB5\u4E0A\u4E0B\u6587\u8BA9\u5F15\u64CE\u6539\u4E86\u524D\u9762\uFF09\u2192 \u4EE5\u6574\u6BB5\u4E3A\u51C6\u6574\u5757\u66FF\u6362\uFF0C\u5E76\u5728\u81EA\u68C0\u91CC\u8BB0\u4E00\u7B14\u3002\n // \u2715 \u53D6\u6D88 = \u628A\u8FD9\u6B21\u63D2\u8FDB\u53BB\u7684\u6587\u5B57\u6574\u5757\u64A4\u6389\uFF08\u5BF9\u5E94\u4E3B\u4F1A\u8BDD\u90A3\u4E2A aria-label\u300C\u4E22\u5F03\u8BC6\u522B\u6587\u5B57\u300D\uFF09\u3002\n //\n // \u4E3A\u4EC0\u4E48\u9884\u89C8\u7528**\u91C7\u6837\u6C34\u9F99\u5934**\u800C\u4E0D\u662F MediaRecorder \u7684 blob\uFF1A\u5207\u7A97\u53E3\u53EA\u8981\u4E00\u6BB5\u8FDE\u7EED\u91C7\u6837\uFF0C\n // \u800C\u6BCF\u4E2A tick \u53BB decode \u6574\u4E2A blob \u662F O(\u603B\u65F6\u957F) \u7684\u767D\u6D3B\uFF08\u8BF4\u5230 60 \u79D2\u5C31\u662F\u6BCF\u79D2 decode 60 \u79D2\u97F3\u9891\uFF09\u3002\n\n /** \u5B9A\u7A3F\u4E0E\u9884\u89C8\u62FC\u8D77\u6765\u65F6\u7684\u8FDE\u63A5\u5904\uFF08\u4E2D\u6587\u76F4\u63A5\u63A5\uFF0C\u82F1\u6587\u8865\u4E00\u4E2A\u7A7A\u683C\uFF09\u3002 */\n function liveJoin(left, right) {\n if (!left) return right\n if (!right) return left\n if (/[\\s]$/.test(left) || /^[\\s\uFF0C\u3002\uFF1B\uFF1A\uFF01\uFF1F\u3001,.!?;:]/.test(right)) return left + right\n return left + ' ' + right\n }\n\n /** \u5149\u6807\u4F4D\u7F6E\uFF08\u62FF\u4E0D\u5230\u5C31\u5F53\u4F5C\u672B\u5C3E\uFF09\u3002 */\n function caretIndex() {\n var value = String(env.askBox.value || '')\n return typeof env.askBox.selectionStart === 'number' && env.askBox.selectionStart >= 0\n ? Math.min(env.askBox.selectionStart, value.length)\n : value.length\n }\n\n /** \u8FD9\u4E00\u6BB5\uFF08\u5206\u9694\u7A7A\u683C + \u5B9A\u7A3F + \u9884\u89C8\uFF09\u5728\u8F93\u5165\u6846\u91CC\u8BE5\u957F\u4EC0\u4E48\u6837\u3002 */\n function liveCompose() {\n var live = voice.live\n var body = liveJoin(live.committed, live.preview)\n live.text = body ? live.separator + body : ''\n return live.text\n }\n\n /**\n * \u628A\u8FD9\u4E00\u6BB5\u843D\u5230\u8F93\u5165\u6846\u91CC\uFF08\u539F\u4F4D\u66FF\u6362\uFF09\u3002\n * \u7528\u6237\u5728\u6211\u4EEC\u8FD9\u6BB5**\u91CC\u9762**\u6539\u8FC7\u5B57\u5C31\u4E0D\u62A2\u4ED6\u7684\u7F16\u8F91\uFF1A\u505C\u6389\u5B9E\u65F6\u5C42\uFF0C\u4EE5\u540E\u6309\"\u505C\u6B62\u540E\u518D\u51FA\u5B57\"\u8D70\u3002\n */\n function liveWrite() {\n var live = voice.live\n var value = String(env.askBox.value || '')\n var previous = live.text\n var start = live.start\n if (previous) {\n if (value.indexOf(previous) >= 0) start = value.indexOf(previous)\n else if (start >= 0 && value.slice(start, start + previous.length) === previous) {\n /* \u4F4D\u7F6E\u6CA1\u53D8 */\n } else {\n live.disabled = true\n live.reason = 'edited'\n stopLive()\n return false\n }\n }\n if (start < 0) start = caretIndex()\n var end = previous ? start + previous.length : start\n var caret = typeof env.askBox.selectionStart === 'number' ? env.askBox.selectionStart : end\n // \u5149\u6807\u539F\u672C\u5C31\u8D34\u5728\u8FD9\u6BB5\u6587\u5B57\u7684\u672B\u5C3E\uFF08= \u7528\u6237\u6CA1\u5728\u6539\u8FD9\u6BB5\uFF0C\u53EA\u662F\u5728\u770B\uFF09\u2192 \u8DDF\u7740\u6700\u65B0\u6587\u5B57\u8D70\uFF0C\n // \u8FD9\u6837\u5149\u6807\u4E00\u76F4\u5728\u65B0\u5192\u51FA\u6765\u7684\u5B57\u540E\u9762\u8DF3\uFF1B\u7528\u6237\u628A\u5149\u6807\u632A\u5230\u522B\u5904\uFF08\u6216\u5728\u540E\u9762\u6253\u5B57\uFF09\u5C31\u539F\u4F4D\u4FDD\u7559\u3002\n var atBlockEnd = previous ? caret === end : caret === start\n var next = liveCompose()\n env.askBox.value = value.slice(0, start) + next + value.slice(end)\n live.start = next ? start : -1\n live.text = next\n var moved = next.length - previous.length\n var nextCaret = atBlockEnd ? start + next.length : caret > end ? caret + moved : caret\n if (nextCaret < 0) nextCaret = 0\n if (nextCaret > env.askBox.value.length) nextCaret = env.askBox.value.length\n try {\n env.askBox.setSelectionRange(nextCaret, nextCaret)\n } catch (error) {\n /* \u6869\u73AF\u5883\u6CA1\u6709\u8FD9\u4E2A\u65B9\u6CD5 */\n }\n env.refreshAskState()\n return true\n }\n\n function stopLive() {\n var live = voice.live\n live.active = false\n live.inflight = false\n if (live.timer) clearInterval(live.timer)\n live.timer = 0\n if (live.controller) {\n try {\n live.controller.abort()\n } catch (error) {\n /* noop */\n }\n }\n live.controller = null\n }\n\n /** \u5F00\u5B9E\u65F6\u5C42\uFF08\u62FF\u4E0D\u5230\u91C7\u6837\u6C34\u9F99\u5934\u5C31\u4E0D\u5F00\uFF1A\u529F\u80FD\u9000\u56DE\"\u8BF4\u5B8C\u70B9 \u25A0 \u518D\u51FA\u5B57\"\uFF09\u3002 */\n function startLive(capture) {\n var live = voice.live\n stopLive()\n live.committed = ''\n live.preview = ''\n live.text = ''\n live.start = -1\n live.inflight = false\n live.passes = { preview: 0, commit: 0 }\n live.rewritten = false\n live.disabled = false\n live.reason = ''\n if (!capture || !capture.tap || !capture.tap.supported()) {\n live.disabled = true\n live.reason = 'no-tap'\n return false\n }\n // \u4E91\u7AEF\u8BC6\u522B\u5668\uFF1A\u6BCF\u4E00\u62CD\u90FD\u662F\u4E00\u6B21**\u4ED8\u8D39**\u8C03\u7528\uFF081.3 \u79D2\u4E00\u62CD \u2248 46 \u6B21/\u5206\u949F\uFF09\uFF0C\u4E0D\u505A\u9884\u89C8\u3002\n // \u672C\u673A\u6A21\u578B\u4E0D\u82B1\u94B1\u3001\u53EA\u5360\u70B9 CPU\uFF0C\u624D\u662F\u5B9E\u65F6\u5B57\u5E55\u8BE5\u5F85\u7684\u5730\u65B9\u3002\n var provider = voiceProvider(voice.catalog)\n if (provider && provider.location === 'cloud') {\n live.disabled = true\n live.reason = 'cloud'\n return false\n }\n // \u6211\u4EEC\u8FD9\u6BB5\u6587\u5B57\u4ECE**\u5F53\u524D\u5149\u6807\u5904**\u5F00\u59CB\u957F\uFF1B\u524D\u9762\u4E0D\u662F\u7A7A\u767D\u5C31\u8865\u4E00\u4E2A\u5206\u9694\u7A7A\u683C\n var value = String(env.askBox.value || '')\n var caret = caretIndex()\n live.separator = caret > 0 && !/\\s$/.test(value.slice(0, caret)) ? ' ' : ''\n live.start = -1\n live.boundary = capture.tap.length()\n live.phraseStart = live.boundary\n live.startedAt = Date.now()\n live.tickAt = 0\n live.active = true\n live.timer = setInterval(liveTick, 200)\n return true\n }\n\n /**\n * \u9001\u4E00\u6BB5\uFF0816k \u91C7\u6837\uFF0C[from,to)\uFF09\u53BB\u8BC6\u522B\u3002\n * **\"\u6CA1\u542C\u6E05\"\u4E0D\u662F\u6545\u969C**\uFF1A\u505C\u987F\u90A3\u51E0\u79D2\u91CC\u7A97\u53E3\u662F\u7EAF\u9759\u97F3\uFF0C\u8BC6\u522B\u672C\u6765\u5C31\u8BE5\u8FD4\u56DE\u7A7A\n *\uFF08\u66FE\u7ECF\u628A\u7A7A\u7ED3\u679C\u5F53\u5931\u8D25\u8BA1\u6570\uFF0C\u8FDE\u6302 3 \u6B21\u5C31\u628A\u6574\u4E2A\u5B9E\u65F6\u5C42\u5173\u4E86 \u2014\u2014 \u8868\u73B0\u662F\"\u53EA\u8DDF\u7B2C\u4E00\u53E5\uFF0C\u540E\u9762\u4E0D\u5410\u5B57\"\uFF09\u3002\n * @returns \u8BC6\u522B\u5230\u7684\u6587\u5B57\uFF08\u53EF\u80FD\u662F ''\uFF09\n */\n function liveSend(from, to) {\n var live = voice.live\n var capture = voice.capture\n if (!capture || !capture.tap) return Promise.reject(new Error('\u6CA1\u6709\u91C7\u6837\u6C34\u9F99\u5934'))\n var samples = capture.tap.read(from, to)\n if (samples.length < 1600) return Promise.reject(new Error('\u8FD9\u6BB5\u592A\u77ED\u4E86'))\n var controller = typeof AbortController === 'function' ? new AbortController() : null\n live.controller = controller\n return fetch(SPEECH_TRANSCRIBE, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ audioBase64: bytesToBase64(encodeWave(samples)), partial: true }),\n signal: controller ? controller.signal : undefined,\n })\n .then(function (response) {\n return response.json()\n })\n .then(function (data) {\n if (data && data.ok === true) return String(data.text || '').trim()\n if (data && data.code === 'empty-transcript') return ''\n throw new Error(String((data && data.error) || '\u8BC6\u522B\u5931\u8D25'))\n })\n }\n\n /** \u4E00\u53E5\u8BDD\u8BF4\u5B8C\u4E86\uFF08\u9759\u97F3\u591F\u4E45\uFF09\uFF1A\u628A\u5B83\u9001\u53BB\u8BC6\u522B\u5E76\u5B9A\u7A3F\u3002 */\n function liveCommit(boundary) {\n var live = voice.live\n var from = live.phraseStart\n var to = Math.min(boundary, from + 16000 * VOICE_COMMIT_MAX_SECONDS)\n if (to - from < 1600) return\n live.inflight = true\n live.passes.commit += 1\n liveSend(from, to)\n .then(function (text) {\n if (!live.active) return\n live.previewFails = 0\n if (text) {\n live.committed = liveJoin(live.committed, text)\n live.preview = ''\n liveWrite()\n }\n live.boundary = to\n live.phraseStart = to\n })\n .catch(function () {\n /* \u8FD9\u4E00\u53E5\u6CA1\u8F6C\u51FA\u6765\uFF1A\u4E0D\u6253\u65AD\u5F55\u97F3\uFF0C\u7B49\u505C\u6B62\u65F6\u6574\u6BB5\u518D\u8BD5\u4E00\u6B21 */\n })\n .then(function () {\n live.inflight = false\n live.controller = null\n })\n }\n\n /**\n * \u534A\u53E5\u9884\u89C8\uFF1A\u628A\"\u6700\u540E 10 \u79D2\u8FD8\u6CA1\u5B9A\u7A3F\u7684\u90A3\u534A\u53E5\"\u9001\u53BB\u8BC6\u522B\uFF0C\u6574\u6BB5\u66FF\u6362\u4E0A\u4E00\u62CD\u7684\u9884\u89C8\u3002\n * @returns \u8FD9\u4E00\u62CD\u771F\u7684\u53D1\u51FA\u53BB\u4E86\u6CA1\u6709\uFF08\u6CA1\u53D1\u5C31\u4E0D\u8BE5\u5403\u6389\u8282\u6D41\u7A97\u53E3 \u2014\u2014 \u5426\u5219\u5F55\u5230 0.2 \u79D2\u65F6\u90A3\u6B21\u7A7A\u8F6C\n * \u4F1A\u628A\u7B2C\u4E00\u62CD\u9884\u89C8\u63A8\u5230 1.5 \u79D2\u4E4B\u540E\uFF0C\u7528\u6237\u4F1A\u89C9\u5F97\"\u600E\u4E48\u534A\u5929\u4E0D\u51FA\u5B57\"\uFF09\u3002\n */\n function livePreview() {\n var live = voice.live\n var capture = voice.capture\n if (!capture || !capture.tap) return false\n // \u4E0A\u6B21\u5B9A\u7A3F\u4E4B\u540E\u8FD8\u6CA1\u5F00\u53E3\uFF08\u4E00\u76F4\u662F\u9759\u97F3\uFF09\u2192 \u4E0D\u6D6A\u8D39\u8C03\u7528\uFF0C\u4E5F\u522B\u628A\u4E0A\u4E00\u62CD\u9884\u89C8\u62B9\u6389\n var loudIndex = capture.tap.loudIndex()\n if (loudIndex < 0 || loudIndex <= live.phraseStart) return false\n var length = capture.tap.length()\n var from = Math.max(live.phraseStart, length - 16000 * VOICE_PREVIEW_WINDOW)\n if (length - from < 16000 * 0.5) return false\n live.inflight = true\n live.passes.preview += 1\n liveSend(from, length)\n .then(function (text) {\n if (!live.active) return\n live.previewFails = 0\n if (text === live.preview) return\n // \u8FD9\u4E00\u62CD\u6CA1\u8BC6\u522B\u5230\u5185\u5BB9\uFF08\u7A97\u53E3\u91CC\u6B63\u597D\u90FD\u662F\u9759\u97F3\uFF09\uFF1A\u7559\u7740\u4E0A\u4E00\u62CD\u7684\u9884\u89C8\uFF0C\u522B\u95EA\u6CA1\n if (!text) return\n live.preview = text\n liveWrite()\n })\n .catch(function (error) {\n if (!live.active) return\n // \u9884\u89C8\u8FDE\u7EED\u5931\u8D25\u5C31\u4E0D\u518D\u6253\u6270\u7528\u6237\uFF08\u505C\u6B62\u65F6\u90A3\u6761\u8DEF\u4ECD\u7136\u4F1A\u51FA\u5B57\uFF09\uFF1B\n // \u9608\u503C\u7ED9\u5BBD\u4E00\u70B9\uFF1A\u5076\u53D1\u4E00\u6B21\u8D85\u65F6\u4E0D\u8BE5\u628A\u5B9E\u65F6\u5B57\u5E55\u6574\u4E2A\u5173\u6389\n if (error && error.name === 'AbortError') return\n live.previewFails = (live.previewFails || 0) + 1\n if (live.previewFails >= 5) {\n live.disabled = true\n live.reason = 'preview-failed'\n stopLive()\n }\n })\n .then(function () {\n live.inflight = false\n live.controller = null\n })\n return true\n }\n\n /** \u5B9E\u65F6\u5C42\u7684\u8282\u62CD\uFF1A\u5148\u770B\u6709\u6CA1\u6709\"\u4E00\u53E5\u8BDD\u8BF4\u5B8C\u4E86\"\uFF0C\u518D\u770B\u8981\u4E0D\u8981\u5237\u534A\u53E5\u9884\u89C8\u3002 */\n function liveTick() {\n var live = voice.live\n if (!live.active || live.disabled || voice.phase !== 'recording') return\n var capture = voice.capture\n if (!capture || !capture.tap || !capture.tap.supported()) return\n if (live.inflight) return\n var now = Date.now()\n var length = capture.tap.length()\n var loudIndex = capture.tap.loudIndex()\n var loudAt = capture.tap.loudAt()\n // \u2460 \u505C\u987F\u5B9A\u7A3F\uFF1A\u6700\u8FD1\u4E00\u6B21\u6709\u58F0\u5DF2\u7ECF\u8FC7\u53BB 600ms \u4EE5\u4E0A\uFF0C\u4E14\u8FD9\u53E5\u591F\u957F\n if (loudIndex >= 0 && now - loudAt >= VOICE_PAUSE_MS && now - loudAt < 5000) {\n var boundary = Math.min(length, loudIndex + Math.round(16000 * 0.25))\n if (boundary - live.phraseStart >= (16000 * VOICE_PAUSE_MIN_MS) / 1000) {\n live.pendingReady = true\n liveCommit(boundary)\n return\n }\n }\n // \u2461 \u534A\u53E5\u9884\u89C8\uFF1A\u6BCF 1.3 \u79D2\u5237\u4E00\u6B21\uFF08\u53EA\u6709\u771F\u53D1\u51FA\u53BB\u624D\u7B97\u7528\u6389\u8FD9\u4E00\u62CD\uFF09\n if (now - live.tickAt < VOICE_PREVIEW_EVERY) return\n if (livePreview()) live.tickAt = now\n }\n\n /**\n * \u25A0 \u505C\u6B62\u540E\u7684\u6536\u53E3\uFF1A\u6574\u6BB5\u8BC6\u522B\u5DF2\u7ECF\u62FF\u5230 fullText\uFF0C\u628A\u5B83\u548C\u5DF2\u7ECF\u63D2\u8FDB\u53BB\u7684\u90A3\u6BB5\u5BF9\u9F50\u3002\n * \u6B63\u5E38\u60C5\u51B5\uFF08\u6574\u6BB5\u4EE5\u5B9A\u7A3F\u5F00\u5934\uFF09\u53EA\u8865\u540E\u534A\u53E5\uFF1B\u5BF9\u4E0D\u4E0A\u5C31\u6574\u5757\u66FF\u6362\uFF08\u4EE5\u6574\u6BB5\u4E3A\u51C6\uFF09\u3002\n */\n function liveFinalize(fullText) {\n var live = voice.live\n var committed = live.committed\n var text = String(fullText || '').trim()\n stopLive()\n if (!text) {\n // \u6574\u6BB5\u4E00\u4E2A\u90FD\u6CA1\u8BC6\u522B\u51FA\u6765\uFF1A\u5DF2\u7ECF\u5B9A\u7A3F\u7684\u90E8\u5206\u7559\u7740\uFF08\u7528\u6237\u770B\u5F97\u89C1\uFF09\uFF0C\u9884\u89C8\u4E22\u6389\n live.preview = ''\n liveWrite()\n return live.committed\n }\n var merged = text\n if (committed) {\n var rest = liveTailAfterCommitted(committed, text)\n if (rest === null) {\n live.rewritten = true\n merged = text\n } else {\n merged = liveJoin(committed, rest)\n }\n }\n live.committed = merged\n live.preview = ''\n liveWrite()\n return merged\n }\n\n /**\n * \u6574\u6BB5\u8BC6\u522B\u91CC\"\u5DF2\u5B9A\u7A3F\u90A3\u90E8\u5206\"\u4E4B\u540E\u8FD8\u5269\u4EC0\u4E48\u3002\n * \u5F52\u4E00\u5316\uFF08\u53BB\u7A7A\u767D\u4E0E\u6807\u70B9\uFF09\u4E4B\u540E\u6BD4\u524D\u7F00\uFF1A\u5BF9\u5F97\u4E0A \u2192 \u8FD4\u56DE\u5269\u4F59\u539F\u6587\uFF1B\u5BF9\u4E0D\u4E0A \u2192 null\u3002\n */\n function liveTailAfterCommitted(committed, full) {\n var norm = function (text) {\n var out = []\n for (var i = 0; i < text.length; i += 1) {\n var ch = text[i]\n if (/[\\s\uFF0C\u3002\uFF1B\uFF1A\uFF01\uFF1F\u3001,.!?;:'\"\uFF08\uFF09()\\[\\]\u3010\u3011\u2026\u2014-]/.test(ch)) continue\n out.push({ ch: ch, at: i })\n }\n return out\n }\n var want = norm(committed)\n var got = norm(full)\n if (!want.length || got.length < want.length) return null\n for (var i = 0; i < want.length; i += 1) {\n if (want[i].ch !== got[i].ch) return null\n }\n return full.slice(got[want.length - 1].at + 1).trim()\n }\n\n /** \u5F00\u59CB\u4E00\u6BB5\u5F55\u97F3\uFF08\u5148\u95EE host \u8981\u76EE\u5F55\uFF1A\u80FD\u4E0D\u80FD\u5F55\u3001\u6700\u957F\u591A\u4E45\uFF09\u3002 */\n function startVoice() {\n if (!recordingSupported()) {\n voiceFeedback(VOICE_ERRORS.unavailable, 'error', null)\n return\n }\n var generation = ++voice.generation\n voice.phase = 'requesting'\n setVoiceActivity('\u8BF7\u5141\u8BB8\u4F7F\u7528\u9EA6\u514B\u98CE\u2026', { dot: true })\n setVoiceAction(null)\n paintVoice()\n fetchSpeechCatalog(true)\n .then(function (catalog) {\n if (generation !== voice.generation) return null\n if (!catalog || catalog.available !== true) {\n var provider = voiceProvider(catalog)\n var reason = catalog ? catalog.reason : ''\n var text =\n reason === 'unprepared' || (provider && provider.phase !== 'ready' && provider.phase !== 'standby')\n ? '\u8BED\u97F3\u6A21\u578B\u8FD8\u6CA1\u51C6\u5907\u597D' + (provider && provider.name ? '\uFF08' + provider.name + '\uFF09' : '')\n : catalog && catalog.error\n ? catalog.error\n : '\u8FD9\u4E2A\u90E8\u7F72\u6CA1\u6709\u53EF\u7528\u7684\u8BED\u97F3\u8BC6\u522B\u670D\u52A1'\n // \u6709\u6551\u7684\uFF08\u6A21\u578B\u6CA1\u88C5\uFF09\u7ED9\u4E00\u4E2A\u300C\u51C6\u5907\u6A21\u578B\u300D\u6309\u94AE\uFF1A\u4E0B\u8F7D\u5728 host \u4E0A\u8DD1\uFF0C\u51E0\u767E MB \u5230 1G\uFF0C\u5F97\u7528\u6237\u81EA\u5DF1\u70B9\n voiceFeedback(text, 'warn', provider ? 'prepare' : 'retry')\n return null\n }\n var limits = catalog.limits || {}\n voice.maxSeconds = clamp(Number(limits.maxSeconds) || VOICE_FALLBACK_SECONDS, 5, 600)\n var capture = createCapture(function (error) {\n failVoice(generation, error)\n })\n voice.capture = capture\n return capture.start().then(function () {\n if (generation !== voice.generation) {\n capture.dispose()\n return null\n }\n voice.phase = 'recording'\n voice.startedAt = Date.now()\n resetWave()\n setVoiceActivity('', {})\n paintVoice()\n // \u5149\u6807\u4EA4\u7ED9\u8F93\u5165\u6846\uFF1A\u5B9E\u65F6\u5B57\u5E55\u843D\u5B57\u65F6\u8981\u770B\u89C1\u5149\u6807\u5728\u672B\u5C3E\u8DF3\uFF08textarea \u6CA1\u7126\u70B9\u5C31\u4E0D\u753B\u5149\u6807\uFF09\n focusAskForRecording()\n startVoiceTicker()\n // \u5B9E\u65F6\u5B57\u5E55\uFF1A\u8BF4\u8BDD\u65F6\u5B57\u5C31\u5F80\u8F93\u5165\u6846\u91CC\u957F\uFF08\u62FF\u4E0D\u5230\u91C7\u6837\u6C34\u9F99\u5934\u5C31\u81EA\u52A8\u9000\u56DE\"\u505C\u6B62\u540E\u51FA\u5B57\"\uFF09\n startLive(capture)\n return true\n })\n })\n .catch(function (error) {\n failVoice(generation, error)\n })\n }\n\n /** \u7ED3\u675F\u5F55\u97F3 \u2192 \u9001\u53BB\u8BC6\u522B \u2192 \u6587\u5B57\u63D2\u8FDB\u8F93\u5165\u6846\u3002 */\n function finishVoice() {\n if (voice.phase !== 'recording') return\n var generation = voice.generation\n var capture = voice.capture\n var maxSeconds = voice.maxSeconds || VOICE_FALLBACK_SECONDS\n stopVoiceTicker()\n voice.phase = 'transcribing'\n setVoiceActivity('\u8BC6\u522B\u4E2D\u2026', { dot: true })\n setVoiceAction(null)\n paintVoice()\n var abort = typeof AbortController === 'function' ? new AbortController() : null\n voice.abort = abort\n capture\n .stop(maxSeconds)\n .then(function (bytes) {\n if (generation !== voice.generation) return null\n if (!bytes || !bytes.length) throw voiceError('empty')\n if (bytes.length > VOICE_MAX_BYTES) throw new Error('\u5F55\u97F3\u8D85\u8FC7\u670D\u52A1\u9650\u5236\uFF0C\u8BF7\u7F29\u77ED\u5F55\u97F3\u540E\u91CD\u8BD5\u3002')\n return fetch(SPEECH_TRANSCRIBE, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ audioBase64: bytesToBase64(bytes) }),\n signal: abort ? abort.signal : undefined,\n })\n })\n .then(function (response) {\n if (generation !== voice.generation || !response) return null\n return response.json().then(function (data) {\n if (generation !== voice.generation) return null\n if (!data || data.ok !== true) {\n var error = String((data && data.error) || '\u8BC6\u522B\u5931\u8D25')\n if (data && data.code === 'unprepared') {\n voiceFeedback(error, 'warn', 'prepare')\n } else if (data && data.code === 'empty-transcript') {\n voiceFeedback(VOICE_ERRORS.empty, 'warn', 'retry')\n } else {\n voiceFeedback('\u8BED\u97F3\u8BC6\u522B\u5931\u8D25\uFF1A' + error, 'error', 'retry')\n }\n return null\n }\n var text = String(data.text || '').trim()\n var liveHasText = voice.live.active && !!(voice.live.committed || voice.live.preview || voice.live.text)\n if (!text) {\n if (liveHasText) {\n // \u6574\u6BB5\u6CA1\u8F6C\u51FA\u6765\uFF0C\u4F46\u5B9E\u65F6\u90A3\u51E0\u6BB5\u5DF2\u7ECF\u843D\u8FDB\u8F93\u5165\u6846\u4E86\uFF1A\u7559\u7740\u4ED6\u770B\u5F97\u89C1\u7684\u90A3\u4EFD\n voice.lastText = liveFinalize('')\n voice.capture = null\n voice.abort = null\n resetVoiceRow()\n return null\n }\n voiceFeedback(VOICE_ERRORS.empty, 'warn', 'retry')\n return null\n }\n if (liveHasText) {\n // \u5B9E\u65F6\u5B57\u5E55\u5DF2\u7ECF\u5728\u8F93\u5165\u6846\u91CC\u5199\u4E86\u5B57\uFF1A\u7528\u5B83\u7ED9\u6574\u6BB5\u6536\u53E3\uFF08\u5B9A\u7A3F\u90E8\u5206\u5C3D\u91CF\u4E0D\u52A8\uFF09\n voice.lastText = liveFinalize(text)\n } else {\n insertTranscript(text)\n }\n // \u63D2\u5165\u6210\u529F = **\u76F4\u63A5\u56DE idle**\uFF1A\u6587\u5B57\u5C31\u6446\u5728\u4E0A\u9762\u90A3\u884C\uFF0C\u4E0D\u5FC5\u518D\u62A5\u4E00\u6B21\n //\uFF08\u4E3B\u4F1A\u8BDD\u4E5F\u662F\u8FD9\u6837\uFF1A\u6210\u529F\u4E0D\u989D\u5916\u8BF4\u8BDD\uFF0C\u5F55\u97F3\u884C\u6536\u8D77\u3001\uD83C\uDFA4 \u56DE\u4F4D\uFF09\u3002\n voice.capture = null\n voice.abort = null\n resetVoiceRow()\n return text\n })\n })\n .catch(function (error) {\n if (generation !== voice.generation) return\n // \u7528\u6237\u70B9\u4E86 \u2715 / \u6536\u8D77\u5C0F\u7A97\uFF1A\u9759\u9ED8\uFF08\u8FD9\u4E0D\u662F\u5931\u8D25\uFF0C\u662F\u4ED6\u81EA\u5DF1\u4E0D\u8981\u4E86\uFF09\n if (error && error.name === 'AbortError') return\n var kind = error && error.voiceKind\n if (kind === 'cancelled') return\n if (kind === 'empty') {\n voiceFeedback(VOICE_ERRORS.empty, 'warn', 'retry')\n return\n }\n voiceFeedback('\u8BED\u97F3\u8BC6\u522B\u5931\u8D25\uFF1A' + voiceMessageOf(error), 'error', 'retry')\n })\n .then(function () {\n if (generation !== voice.generation) return\n voice.capture = null\n voice.abort = null\n })\n }\n\n /**\n * \u53D6\u6D88\u5F53\u524D\u8FD9\u4E00\u8F6E\uFF08\u5F55\u97F3\u6216\u8BC6\u522B\uFF09\u2192 \u56DE\u5230 idle\u3002\u2715 / Esc / \u5173\u9762\u677F / \u505C\u7528\u63D2\u4EF6\u90FD\u8D70\u5B83\u3002\n * \u4E00\u5B9A\u4F1A\u677E\u5F00\u9EA6\u514B\u98CE\u3001\u5E76\u4E14\u8BA9\u665A\u5230\u7684\u56DE\u8C03\u5168\u90E8\u4F5C\u5E9F\uFF08generation + 1\uFF09\u3002\n */\n function cancelVoice(options) {\n if (!voice) return\n var opts = typeof options === 'string' ? { note: options } : options || {}\n var capture = voice.capture\n voice.generation += 1\n voice.capture = null\n if (voice.abort) {\n try {\n voice.abort.abort()\n } catch (error) {\n /* noop */\n }\n }\n voice.abort = null\n if (voice.pollTimer) clearTimeout(voice.pollTimer)\n voice.pollTimer = 0\n // \u53D6\u6D88 = \u53EA\u505C\uFF08\u4E0D\u518D\u66F4\u65B0\u90A3\u6BB5\u5B9E\u65F6\u6587\u5B57\uFF09\uFF0C**\u5DF2\u7ECF\u8BF4\u51FA\u6765\u7684\u5B57\u4E00\u5F8B\u7559\u7740**\u3002\n // \u65E9\u5148\u8DDF\u7740\u4E3B\u4F1A\u8BDD\u7684 \u2715 \u505A\u8FC7\"\u4E22\u5F03\u8BC6\u522B\u6587\u5B57\"\uFF0C\u5B9E\u9645\u7528\u8D77\u6765\u662F\"\u6211\u6309\u4E86\u53D6\u6D88\uFF0C\u5B57\u6CA1\u4E86\" \u2014\u2014\n // \u5F55\u5230\u4E00\u534A\u53CD\u6094\u65F6\u66F4\u5E38\u89C1\u7684\u8BC9\u6C42\u662F\"\u7559\u7740\u6211\u5DF2\u7ECF\u8BF4\u51FA\u6765\u7684\"\uFF0C\u6240\u4EE5\u7EDF\u4E00\u6210\u90FD\u7559\u3002\n stopLive()\n if (capture) capture.dispose()\n resetVoiceRow()\n // \u5C11\u6570\u60C5\u51B5\u4E0B\u8981\u4EA4\u4EE3\u4E00\u53E5\uFF08\u4F8B\u5982\"\u8FD9\u6761\u6D88\u606F\u5148\u53D1\u51FA\u53BB\u4E86\"\uFF09\uFF1A\u7559\u5728 feedback \u91CC\uFF0C2 \u79D2\u540E\u81EA\u5DF1\u56DE idle\n if (opts.note) {\n voiceFeedback(opts.note, '', null)\n voice.idleTimer = setTimeout(function () {\n if (voice.phase !== 'feedback') return\n resetVoiceRow()\n }, 2200)\n }\n }\n\n /** \u8BA9 host \u53BB\u51C6\u5907\u8BC6\u522B\u6A21\u578B\uFF08\u9996\u6B21\u8981\u4E0B\u8F7D\uFF09\uFF1B\u4E0B\u8F7D\u5728 host \u4E0A\u8DD1\uFF0C\u5173\u6389\u9762\u677F\u4E5F\u7EE7\u7EED\u3002 */\n function prepareVoice() {\n voice.phase = 'transcribing' // \u590D\u7528\"\u8FDB\u884C\u4E2D\"\u7684\u5F62\u6001\uFF1A\u2715 + \u547C\u5438\u70B9 + \u6587\u6848\n setVoiceActivity('\u6B63\u5728\u51C6\u5907\u8BED\u97F3\u6A21\u578B\u2026', { dot: true })\n setVoiceAction(null)\n paintVoice()\n fetch(SPEECH_PREPARE, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({}),\n })\n .then(function (response) {\n return response.json()\n })\n .then(function (data) {\n if (!data || data.ok !== true) {\n voiceFeedback('\u51C6\u5907\u5931\u8D25\uFF1A' + ((data && data.error) || '\u672A\u77E5\u539F\u56E0'), 'error', 'prepare')\n return\n }\n voice.catalog = data.catalog || null\n voice.catalogAt = 0 // \u72B6\u6001\u53D8\u4E86\uFF0C\u4E0B\u4E00\u6B21\u70B9\u51FB\u91CD\u65B0\u95EE host\n pollPrepare(0)\n })\n .catch(function (error) {\n voiceFeedback('\u51C6\u5907\u5931\u8D25\uFF1A' + voiceMessageOf(error), 'error', 'prepare')\n })\n }\n\n /** \u8F6E\u8BE2\u51C6\u5907\u8FDB\u5EA6\uFF08\u4E0B\u8F7D\u5728 host \u4E0A\uFF0C\u8FD9\u91CC\u53EA\u662F\u64AD\u62A5\uFF09\u3002 */\n function pollPrepare(round) {\n if (round > 480) return // \u6700\u591A\u770B ~12 \u5206\u949F\uFF0C\u4E4B\u540E\u4EA4\u7ED9\u7528\u6237\u81EA\u5DF1\u518D\u6765\n if (voice.pollTimer) clearTimeout(voice.pollTimer)\n voice.pollTimer = setTimeout(function () {\n fetchSpeechCatalog(true)\n .then(function (catalog) {\n if (catalog && catalog.available) {\n voiceFeedback('\u8BED\u97F3\u6A21\u578B\u5DF2\u5C31\u7EEA\uFF0C\u53EF\u4EE5\u5F00\u59CB\u8BF4\u8BDD', '', 'retry')\n return\n }\n var provider = voiceProvider(catalog)\n if (provider && provider.phase === 'failed') {\n voiceFeedback('\u51C6\u5907\u5931\u8D25\uFF1A' + (provider.message || '\u6A21\u578B\u4E0B\u8F7D\u51FA\u9519'), 'error', 'prepare')\n return\n }\n var total = provider && provider.totalBytes ? provider.totalBytes : 0\n var done = provider && provider.completedBytes ? provider.completedBytes : 0\n var progress = total > 0 ? '\uFF08' + Math.round((done / total) * 100) + '%\uFF09' : ''\n setVoiceActivity('\u6B63\u5728\u51C6\u5907\u8BED\u97F3\u6A21\u578B' + progress + '\u2026\uFF08\u53EF\u4EE5\u5148\u53BB\u5FD9\u522B\u7684\uFF0C\u4E0B\u8F7D\u5728\u540E\u53F0\u7EE7\u7EED\uFF09', { dot: true })\n voice.phase = 'transcribing'\n paintVoice()\n pollPrepare(round + 1)\n })\n .catch(function () {\n pollPrepare(round + 1)\n })\n }, 1500)\n }\n return {\n cancelVoice,\n startVoice,\n get voice() { return voice },\n set voice(value) { voice = value },\n finishVoice,\n paintVoice,\n liveTick,\n }\n}\n"],
5
+ "mappings": "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AAAA;AAAA,EAMA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA,EACA;AAAA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,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",
6
+ "names": ["window", "parent", "cls", "i", "url", "parent", "body", "i", "React", "quote"]
7
+ }