@opengeni/react 6.5.2-canary.41607687019001 → 6.7.0

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 (1154) hide show
  1. package/dist/app/app-state.d.ts +4 -0
  2. package/dist/app/app-state.js +19 -14
  3. package/dist/app/components/Composer.js +25 -23
  4. package/dist/app/components/agent/agent-capability-picker.js +10 -8
  5. package/dist/app/components/artifacts/artifact-browse-controls.js +4 -4
  6. package/dist/app/components/artifacts/artifact-library.js +21 -19
  7. package/dist/app/components/artifacts/artifact-page-chrome.js +3 -3
  8. package/dist/app/components/artifacts/artifact-viewer.js +23 -22
  9. package/dist/app/components/artifacts/artifact-viewer.js.map +1 -1
  10. package/dist/app/components/artifacts/chat-interactive-block.js +12 -12
  11. package/dist/app/components/artifacts/copy-artifact-link.js +7 -5
  12. package/dist/app/components/artifacts/file-reach-dialog.js +11 -9
  13. package/dist/app/components/artifacts/inline-chat-image.js +18 -18
  14. package/dist/app/components/artifacts/retained-file-preview.js +24 -23
  15. package/dist/app/components/artifacts/retained-text-preview.js +3 -3
  16. package/dist/app/components/artifacts/site-audience.js +6 -5
  17. package/dist/app/components/artifacts/site-conversations.js +16 -14
  18. package/dist/app/components/artifacts/site-data.js +18 -16
  19. package/dist/app/components/artifacts/site-public-link.js +3 -2
  20. package/dist/app/components/artifacts/site-publishing-page.js +39 -37
  21. package/dist/app/components/artifacts/site-publishing.js +34 -32
  22. package/dist/app/components/artifacts/site-settings.js +38 -36
  23. package/dist/app/components/artifacts/site-version-menu.js +8 -7
  24. package/dist/app/components/billing-class-mark.js +3 -3
  25. package/dist/app/components/bots/bot-launch-strip.js +17 -17
  26. package/dist/app/components/bots/bot-template-dialog.js +30 -28
  27. package/dist/app/components/bots/bot-template-shortcuts.js +19 -19
  28. package/dist/app/components/bots/bot-templates-page.js +38 -36
  29. package/dist/app/components/bots/bot-templates-page.js.map +1 -1
  30. package/dist/app/components/capabilities/capability-detail-sheet.js +13 -11
  31. package/dist/app/components/capabilities/capability-logo-source.js +13 -13
  32. package/dist/app/components/capabilities/capability-logo.js +4 -3
  33. package/dist/app/components/capabilities/connector-tool-permissions.js +8 -6
  34. package/dist/app/components/capabilities/native-connect-setup.js +14 -14
  35. package/dist/app/components/capabilities/own-logins-shared-heads-up.js +7 -6
  36. package/dist/app/components/capabilities/perform-capability-action.js +7 -6
  37. package/dist/app/components/capabilities/prepared-mcp-setup-card.js +17 -17
  38. package/dist/app/components/capabilities/session-capability-card.js +72 -70
  39. package/dist/app/components/capabilities/session-capability-card.js.map +1 -1
  40. package/dist/app/components/capabilities/session-chrome-card.js +28 -26
  41. package/dist/app/components/capabilities/session-connection-accounts.js +4 -3
  42. package/dist/app/components/capabilities/session-custom-mcp-card.js +20 -19
  43. package/dist/app/components/capabilities/session-github-card.js +22 -20
  44. package/dist/app/components/capabilities/session-machine-card.js +27 -25
  45. package/dist/app/components/capabilities/session-personal-github-card.js +16 -16
  46. package/dist/app/components/capabilities/session-plugin-card.js +10 -9
  47. package/dist/app/components/capabilities/use-capabilities-catalog.js +4 -3
  48. package/dist/app/components/capabilities/use-connection-accounts.js +5 -4
  49. package/dist/app/components/command-menu/chat-status.js +15 -13
  50. package/dist/app/components/command-menu/chat-switcher.js +35 -33
  51. package/dist/app/components/command-menu/chat-switcher.js.map +1 -1
  52. package/dist/app/components/command-menu/command-menu.js +53 -50
  53. package/dist/app/components/command-menu/command-menu.js.map +1 -1
  54. package/dist/app/components/command-menu/shortcut-sheet.js +18 -16
  55. package/dist/app/components/command-menu/shortcut-sheet.js.map +1 -1
  56. package/dist/app/components/common.js +4 -3
  57. package/dist/app/components/composer-capabilities-menu-body.js +4 -4
  58. package/dist/app/components/composer-mobile-plus-panel.js +8 -8
  59. package/dist/app/components/composer-mobile-plus.js +1 -1
  60. package/dist/app/components/credit-required-gate.js +3 -3
  61. package/dist/app/components/credit-required-prompt.js +10 -8
  62. package/dist/app/components/credit-required-prompt.js.map +1 -1
  63. package/dist/app/components/credits/checkout-credits-celebration.js +3 -2
  64. package/dist/app/components/credits/checkout-return.js +3 -2
  65. package/dist/app/components/credits/checkout-return.js.map +1 -1
  66. package/dist/app/components/credits/coupon-redeem.js +5 -4
  67. package/dist/app/components/credits/credit-refusal-notice.js +7 -5
  68. package/dist/app/components/cross-slot-deep-link-recovery.js +5 -4
  69. package/dist/app/components/desktop/app-shots.js +13 -11
  70. package/dist/app/components/desktop/computer-use.js +6 -4
  71. package/dist/app/components/desktop/this-computer.js +9 -7
  72. package/dist/app/components/feedback.js +5 -4
  73. package/dist/app/components/follow-up-repository-menu-body.js +8 -6
  74. package/dist/app/components/follow-up-repository-menu-body.js.map +1 -1
  75. package/dist/app/components/follow-up-repository-picker.js +1 -1
  76. package/dist/app/components/github-app-connect-launcher.js +5 -4
  77. package/dist/app/components/in-app-help-link.js +3 -3
  78. package/dist/app/components/knowledge/agent-learning-settings.js +3 -2
  79. package/dist/app/components/knowledge/agent-learning-settings.js.map +1 -1
  80. package/dist/app/components/machines/connect-machine-dialog.js +18 -16
  81. package/dist/app/components/manual-repository-editor.js +3 -2
  82. package/dist/app/components/markdown.js +6 -6
  83. package/dist/app/components/models/models-ui.js +12 -10
  84. package/dist/app/components/my-things.js +12 -10
  85. package/dist/app/components/my-things.js.map +1 -1
  86. package/dist/app/components/new-session-starters.js +3 -3
  87. package/dist/app/components/own-where-it-works.js +9 -7
  88. package/dist/app/components/personal-resource-attachment-surface.js +4 -4
  89. package/dist/app/components/pickers.js +5 -5
  90. package/dist/app/components/rail/channel-create-dialog.js +7 -5
  91. package/dist/app/components/rail/project-glyph.js +17 -17
  92. package/dist/app/components/rail/project-profile.js +31 -29
  93. package/dist/app/components/rail/rail-context.js +3 -3
  94. package/dist/app/components/rail/rail-sections.js +68 -66
  95. package/dist/app/components/rail/session-header.js +59 -57
  96. package/dist/app/components/rail/session-list.js +66 -64
  97. package/dist/app/components/rail/session-row-content.js +4 -4
  98. package/dist/app/components/rail/session-row-hover-details.js +14 -12
  99. package/dist/app/components/rail/session-shell.js +90 -88
  100. package/dist/app/components/rail/site-session-group-heading.js +8 -8
  101. package/dist/app/components/repository-picker.js +8 -6
  102. package/dist/app/components/secrets/session-secrets-panel.js +4 -3
  103. package/dist/app/components/secrets/vault-model.js +3 -2
  104. package/dist/app/components/session/agent-configuration-panel.js +25 -23
  105. package/dist/app/components/session/agent-configuration-panel.js.map +1 -1
  106. package/dist/app/components/session/artifact-link-boundary.js +3 -3
  107. package/dist/app/components/session/artifact-session-page.js +11 -9
  108. package/dist/app/components/session/banners.js +8 -8
  109. package/dist/app/components/session/codex-usage-notice.js +5 -3
  110. package/dist/app/components/session/console-new-conversation.js +42 -40
  111. package/dist/app/components/session/context-text-reader.js +3 -2
  112. package/dist/app/components/session/descendant-requests.js +39 -37
  113. package/dist/app/components/session/descendant-requests.js.map +1 -1
  114. package/dist/app/components/session/editable-artifacts-workspace.js +36 -34
  115. package/dist/app/components/session/editable-artifacts-workspace.js.map +1 -1
  116. package/dist/app/components/session/failed-session-banner.js +13 -11
  117. package/dist/app/components/session/failed-session-banner.js.map +1 -1
  118. package/dist/app/components/session/failure-recovery-boundary.js +3 -3
  119. package/dist/app/components/session/human-input-delegation-record.js +2 -2
  120. package/dist/app/components/session/human-input.js +33 -31
  121. package/dist/app/components/session/inspector.js +57 -55
  122. package/dist/app/components/session/inspector.js.map +1 -1
  123. package/dist/app/components/session/message-actions.js +5 -4
  124. package/dist/app/components/session/message-actions.js.map +1 -1
  125. package/dist/app/components/session/message-resource-attachments.js +12 -11
  126. package/dist/app/components/session/message-resource-attachments.js.map +1 -1
  127. package/dist/app/components/session/model-context-inspector.js +6 -4
  128. package/dist/app/components/session/model-recovery-notice.js +3 -3
  129. package/dist/app/components/session/new-session-settings-menu.js +11 -9
  130. package/dist/app/components/session/new-session-setup-strip.js +18 -18
  131. package/dist/app/components/session/sandbox-recovery-actions.js +3 -3
  132. package/dist/app/components/session/sandbox-switcher.js +10 -9
  133. package/dist/app/components/session/sandbox-workspace.js +47 -46
  134. package/dist/app/components/session/search-markdown-highlight.js +7 -7
  135. package/dist/app/components/session/search-results-view.js +8 -8
  136. package/dist/app/components/session/session-admin-access.js +13 -11
  137. package/dist/app/components/session/session-admission-notice.js +7 -5
  138. package/dist/app/components/session/session-avatar-picker.js +22 -20
  139. package/dist/app/components/session/session-avatar.js +16 -16
  140. package/dist/app/components/session/session-machine-access-notice.js +7 -5
  141. package/dist/app/components/session/session-profile-dialog.js +29 -27
  142. package/dist/app/components/session/session-profile-editor.js +30 -28
  143. package/dist/app/components/session/session-retention.js +10 -8
  144. package/dist/app/components/session/session-search-dialog.js +10 -10
  145. package/dist/app/components/session/session-skill-reviews.js +2 -1
  146. package/dist/app/components/session/session-skill-reviews.js.map +1 -1
  147. package/dist/app/components/session/session-tenancy-control.js +13 -11
  148. package/dist/app/components/session/session-tenancy-control.js.map +1 -1
  149. package/dist/app/components/session/session-unattended-setting.js +7 -5
  150. package/dist/app/components/session/session-usage-limit-section.js +11 -9
  151. package/dist/app/components/session/share-chat-dialog.js +9 -7
  152. package/dist/app/components/session/site-origin-link.js +3 -3
  153. package/dist/app/components/session/subagents.js +8 -8
  154. package/dist/app/components/session/subscription-account-indicator.js +6 -6
  155. package/dist/app/components/session-connectors-menu-body.js +4 -3
  156. package/dist/app/components/session-connectors-menu-body.js.map +1 -1
  157. package/dist/app/components/settings/row-select.js +7 -5
  158. package/dist/app/components/toaster.js +3 -2
  159. package/dist/app/components/transcription-settings.js +11 -9
  160. package/dist/app/components/ui/destructive-confirm.js +11 -9
  161. package/dist/app/components/usage/usage-entry.js +5 -5
  162. package/dist/app/components/window-bar.js +16 -14
  163. package/dist/app/components/workspace-composer-plus.js +22 -21
  164. package/dist/app/components/workspace-reach.js +6 -4
  165. package/dist/app/components/workspace-tenant-boundary.js +5 -4
  166. package/dist/app/embed/memory-navigation.js +3 -3
  167. package/dist/app/embed/session-app.js +211 -209
  168. package/dist/app/lib/actions/actions-provider.js +15 -13
  169. package/dist/app/lib/agent-capabilities.js +3 -3
  170. package/dist/app/lib/app-surfaces.js +7 -6
  171. package/dist/app/lib/archive-session.d.ts +9 -4
  172. package/dist/app/lib/archive-session.js +4 -2
  173. package/dist/app/lib/bot-templates.js +3 -2
  174. package/dist/app/lib/capabilities.js +3 -2
  175. package/dist/app/lib/codex-usage-query.js +2 -2
  176. package/dist/app/lib/composer-connectors.js +17 -16
  177. package/dist/app/lib/console-site.js +2 -2
  178. package/dist/app/lib/console-text.js +2 -2
  179. package/dist/app/lib/events.js +9 -9
  180. package/dist/app/lib/failed-session-copy.js +3 -3
  181. package/dist/app/lib/inbox.js +4 -2
  182. package/dist/app/lib/model-access-onboarding.js +3 -3
  183. package/dist/app/lib/move-chat-to-machine.js +3 -3
  184. package/dist/app/lib/navigation.js +2 -2
  185. package/dist/app/lib/session-branch-cache.js +6 -6
  186. package/dist/app/lib/session-create.js +4 -4
  187. package/dist/app/lib/session-group-pagination.js +6 -6
  188. package/dist/app/lib/session-hover-facts.js +13 -11
  189. package/dist/app/lib/session-model.js +2 -2
  190. package/dist/app/lib/session-rail.js +3 -3
  191. package/dist/app/lib/session-rename.js +3 -3
  192. package/dist/app/lib/session-restart-operation-controller.js +4 -3
  193. package/dist/app/lib/session-tenancy.js +3 -2
  194. package/dist/app/lib/session-usage-limit.js +3 -2
  195. package/dist/app/lib/sessions-group.js +5 -5
  196. package/dist/app/lib/site-publishing.js +3 -2
  197. package/dist/app/lib/site-tool-consent-dialog.js +9 -7
  198. package/dist/app/lib/site-tool-consent-dialog.js.map +1 -1
  199. package/dist/app/lib/site-tool-consent.js +1 -1
  200. package/dist/app/lib/subscription-plans.js +3 -2
  201. package/dist/app/lib/toast.js +2 -1
  202. package/dist/app/lib/turn-failure-analytics.js +4 -4
  203. package/dist/app/lib/use-duplicate-site.js +6 -5
  204. package/dist/app/lib/use-follow-up-repositories.js +6 -5
  205. package/dist/app/lib/use-workspace-integrations.js +4 -3
  206. package/dist/app/lib/use-workspace-machines.js +4 -4
  207. package/dist/app/lib/use-workspace-model-catalog.js +5 -4
  208. package/dist/app/lib/use-workspace-rigs.js +2 -2
  209. package/dist/app/lib/workspace-navigation-preference.js +4 -4
  210. package/dist/app/lib/workspace-scope-context.js +3 -3
  211. package/dist/app/routes/artifacts.js +67 -66
  212. package/dist/app/routes/artifacts.js.map +1 -1
  213. package/dist/app/routes/retained-artifact.js +42 -40
  214. package/dist/app/routes/retained-artifact.js.map +1 -1
  215. package/dist/app/routes/session-unavailable.js +8 -7
  216. package/dist/app/routes/session.js +119 -117
  217. package/dist/app/routes/sessions-index-hydration.js +5 -5
  218. package/dist/app/routes/sessions-index.js +104 -102
  219. package/dist/app/routes/site-view.js +67 -65
  220. package/dist/app/routes/site-view.js.map +1 -1
  221. package/dist/artifacts-document.js +4 -4
  222. package/dist/artifacts-presentation.js +4 -4
  223. package/dist/artifacts-spreadsheet.js +4 -4
  224. package/dist/artifacts.js +10 -10
  225. package/dist/automations.js +17 -15
  226. package/dist/automations.js.map +1 -1
  227. package/dist/browser-viewer-TC27OCIP.js +23 -0
  228. package/dist/chat-interactive-block-RWPQBHVS.js +18 -0
  229. package/dist/chunk-2BDT3UZQ.js +229 -0
  230. package/dist/chunk-2CLNIEK4.js +373 -0
  231. package/dist/chunk-2FSBSCZJ.js +451 -0
  232. package/dist/chunk-2I7HDP53.js +199 -0
  233. package/dist/chunk-2INLDVK3.js +15 -0
  234. package/dist/chunk-2KALVELR.js +126 -0
  235. package/dist/chunk-2M3J7ZWQ.js +418 -0
  236. package/dist/chunk-2OP6WLGV.js +708 -0
  237. package/dist/chunk-2RG7NIAS.js +2936 -0
  238. package/dist/chunk-2STUPWEL.js +135 -0
  239. package/dist/chunk-2YUOVM3G.js +271 -0
  240. package/dist/chunk-2Z3NQNTM.js +3670 -0
  241. package/dist/chunk-3CPWWGNK.js +920 -0
  242. package/dist/chunk-3ED2U6XE.js +37 -0
  243. package/dist/chunk-3GZA4BUW.js +216 -0
  244. package/dist/chunk-3IK6UYO6.js +1022 -0
  245. package/dist/chunk-3PZ7JZI2.js +431 -0
  246. package/dist/chunk-4DVJ6ONS.js +50 -0
  247. package/dist/chunk-4DVNUCRR.js +2386 -0
  248. package/dist/chunk-4DVNUCRR.js.map +1 -0
  249. package/dist/chunk-4E3ZJRTZ.js +41 -0
  250. package/dist/chunk-4SAWSRAA.js +141 -0
  251. package/dist/chunk-53AGXXZM.js +307 -0
  252. package/dist/chunk-54YW6SZZ.js +818 -0
  253. package/dist/chunk-57AZS3IE.js +2317 -0
  254. package/dist/chunk-5CPEEAFD.js +143 -0
  255. package/dist/chunk-5EWSRZ2Y.js +340 -0
  256. package/dist/chunk-5IE76VCY.js +387 -0
  257. package/dist/chunk-5NWEKLDZ.js +170 -0
  258. package/dist/chunk-5O2FCCHZ.js +198 -0
  259. package/dist/chunk-5QAY6K77.js +399 -0
  260. package/dist/chunk-5YKW2K6I.js +625 -0
  261. package/dist/chunk-5YKW2K6I.js.map +1 -0
  262. package/dist/chunk-6BCXNDEI.js +4116 -0
  263. package/dist/chunk-6BCXNDEI.js.map +1 -0
  264. package/dist/chunk-6DK6Z4UN.js +2599 -0
  265. package/dist/chunk-6DVCC7QS.js +702 -0
  266. package/dist/chunk-6JHU2UBS.js +2058 -0
  267. package/dist/chunk-6PZ7OBYU.js +490 -0
  268. package/dist/chunk-6WD2INST.js +539 -0
  269. package/dist/chunk-6WD2INST.js.map +1 -0
  270. package/dist/chunk-6WGRDRMA.js +163 -0
  271. package/dist/chunk-77WAKEAH.js +186 -0
  272. package/dist/chunk-7T2ZE3VT.js +5558 -0
  273. package/dist/chunk-7T2ZE3VT.js.map +1 -0
  274. package/dist/chunk-7TDO3CUM.js +393 -0
  275. package/dist/chunk-7TIX2UAR.js +247 -0
  276. package/dist/chunk-7V5REBCP.js +148 -0
  277. package/dist/chunk-7VMZGLYI.js +339 -0
  278. package/dist/chunk-7W37NS3I.js +236 -0
  279. package/dist/chunk-7X6SDK2C.js +111 -0
  280. package/dist/chunk-7ZNUHRP5.js +95 -0
  281. package/dist/chunk-A36PZALD.js +84 -0
  282. package/dist/chunk-AUI6VA63.js +107 -0
  283. package/dist/chunk-AW2MQB37.js +24 -0
  284. package/dist/chunk-AWKES45Y.js +198 -0
  285. package/dist/chunk-AXHZYXUV.js +132 -0
  286. package/dist/chunk-BHNSJVBC.js +129 -0
  287. package/dist/chunk-BJEJFISW.js +50 -0
  288. package/dist/chunk-BJFH6JI5.js +422 -0
  289. package/dist/chunk-BMICEQZQ.js +960 -0
  290. package/dist/chunk-BTLBYBLU.js +29 -0
  291. package/dist/chunk-BXBDYNRP.js +89 -0
  292. package/dist/chunk-C372BFOV.js +357 -0
  293. package/dist/chunk-C43KRXGA.js +234 -0
  294. package/dist/chunk-C43KRXGA.js.map +1 -0
  295. package/dist/chunk-CMKGILJK.js +4824 -0
  296. package/dist/chunk-CRAOSVHC.js +50 -0
  297. package/dist/chunk-CRU35QQH.js +281 -0
  298. package/dist/chunk-CUIWCGMA.js +172 -0
  299. package/dist/chunk-D5TWNFFE.js +38 -0
  300. package/dist/chunk-DF5EAHDN.js +4461 -0
  301. package/dist/chunk-DJAXC5OK.js +56 -0
  302. package/dist/chunk-DXBYWSL5.js +3550 -0
  303. package/dist/chunk-DXR5PDFP.js +84 -0
  304. package/dist/chunk-DZWARC4M.js +267 -0
  305. package/dist/chunk-DZXEDSQI.js +106 -0
  306. package/dist/chunk-E7XERZWC.js +48 -0
  307. package/dist/chunk-ECJBYNLJ.js +79 -0
  308. package/dist/chunk-EDI6SJ2N.js +43 -0
  309. package/dist/chunk-EWSOC6WF.js +114 -0
  310. package/dist/chunk-F2OPHAUN.js +103 -0
  311. package/dist/chunk-F4ISQGGM.js +81 -0
  312. package/dist/chunk-FO4LYKJL.js +197 -0
  313. package/dist/chunk-FPXASDG5.js +73 -0
  314. package/dist/chunk-FSOQDUCG.js +117 -0
  315. package/dist/chunk-FSOQDUCG.js.map +1 -0
  316. package/dist/chunk-FVXBNBHO.js +157 -0
  317. package/dist/chunk-FYWT2O76.js +34 -0
  318. package/dist/chunk-FYWT2O76.js.map +1 -0
  319. package/dist/chunk-FZC5N55X.js +981 -0
  320. package/dist/chunk-GAVYGBFI.js +99 -0
  321. package/dist/chunk-GFIMOUDT.js +846 -0
  322. package/dist/chunk-GFIMOUDT.js.map +1 -0
  323. package/dist/chunk-GKVJIDHF.js +33 -0
  324. package/dist/chunk-GVN5SZLX.js +212 -0
  325. package/dist/chunk-H3T7IWNA.js +134 -0
  326. package/dist/chunk-HAX4LCR5.js +261 -0
  327. package/dist/chunk-HC4JFZVU.js +121 -0
  328. package/dist/chunk-HEFPPMBQ.js +581 -0
  329. package/dist/chunk-HGKTHF2U.js +1356 -0
  330. package/dist/chunk-HGKTHF2U.js.map +1 -0
  331. package/dist/chunk-HNLR7Q4Z.js +83 -0
  332. package/dist/chunk-HSOXMJOT.js +12 -0
  333. package/dist/chunk-I4MRDSUF.js +281 -0
  334. package/dist/chunk-I4QEJ62Y.js +202 -0
  335. package/dist/chunk-I5B5L6Q4.js +56 -0
  336. package/dist/chunk-I5QZJODL.js +264 -0
  337. package/dist/chunk-I7ITSXSJ.js +603 -0
  338. package/dist/chunk-I7XIZRFD.js +390 -0
  339. package/dist/chunk-IDANQPRH.js +82 -0
  340. package/dist/chunk-IFB3WJ36.js +212 -0
  341. package/dist/chunk-IHTAKKTK.js +264 -0
  342. package/dist/chunk-IKXNLWAL.js +205 -0
  343. package/dist/chunk-IKXNLWAL.js.map +1 -0
  344. package/dist/chunk-ILDXWY37.js +173 -0
  345. package/dist/chunk-IMDQUHBJ.js +570 -0
  346. package/dist/chunk-IMZCQBOT.js +119 -0
  347. package/dist/chunk-IXPTECSC.js +403 -0
  348. package/dist/chunk-J255A3N5.js +71 -0
  349. package/dist/chunk-J5F5HPPW.js +141 -0
  350. package/dist/chunk-JDTGRRNU.js +5045 -0
  351. package/dist/chunk-JDTGRRNU.js.map +1 -0
  352. package/dist/chunk-JEA3QDX7.js +2469 -0
  353. package/dist/chunk-JEUPAVYY.js +156 -0
  354. package/dist/chunk-JKHKLL5W.js +194 -0
  355. package/dist/chunk-JQL7ZH6C.js +650 -0
  356. package/dist/chunk-JWB44UGJ.js +57 -0
  357. package/dist/chunk-JZ4NLCAP.js +333 -0
  358. package/dist/chunk-K2A5PXQ5.js +412 -0
  359. package/dist/chunk-K56XV3C3.js +623 -0
  360. package/dist/chunk-K6GAXXVA.js +23 -0
  361. package/dist/chunk-KCBMFSMS.js +199 -0
  362. package/dist/chunk-KF2FV3ZJ.js +268 -0
  363. package/dist/chunk-KJD65EJP.js +278 -0
  364. package/dist/chunk-KLEUWIMZ.js +386 -0
  365. package/dist/chunk-KODELWYT.js +309 -0
  366. package/dist/chunk-KRDR5RJD.js +83 -0
  367. package/dist/chunk-KUDGXAF7.js +914 -0
  368. package/dist/chunk-KY2R73CG.js +171 -0
  369. package/dist/chunk-KY2R73CG.js.map +1 -0
  370. package/dist/chunk-KYS77RPN.js +85 -0
  371. package/dist/chunk-L7YTNTIK.js +368 -0
  372. package/dist/chunk-LHPNABDH.js +686 -0
  373. package/dist/chunk-MFROMEKA.js +401 -0
  374. package/dist/chunk-MIHN76LX.js +2656 -0
  375. package/dist/chunk-MIYFS2XN.js +42 -0
  376. package/dist/chunk-MJUCFQMS.js +65 -0
  377. package/dist/chunk-MM4FNWI4.js +3064 -0
  378. package/dist/chunk-MNZG4OHU.js +790 -0
  379. package/dist/chunk-MVW6HNPI.js +250 -0
  380. package/dist/chunk-MVW6HNPI.js.map +1 -0
  381. package/dist/chunk-N6AACDUW.js +200 -0
  382. package/dist/chunk-NC55IFN3.js +781 -0
  383. package/dist/chunk-NC7PVOEK.js +98 -0
  384. package/dist/chunk-NCYMNCJO.js +70 -0
  385. package/dist/chunk-ND2BXV3P.js +259 -0
  386. package/dist/chunk-NDBTFUO6.js +272 -0
  387. package/dist/chunk-NDQJZ7HF.js +206 -0
  388. package/dist/chunk-NGJJJPZZ.js +162 -0
  389. package/dist/chunk-NJTSNNE7.js +251 -0
  390. package/dist/chunk-NPGISCU6.js +4159 -0
  391. package/dist/chunk-NPGISCU6.js.map +1 -0
  392. package/dist/chunk-NRTE7DNV.js +1270 -0
  393. package/dist/chunk-NULUNM7H.js +290 -0
  394. package/dist/chunk-NUNZS36W.js +227 -0
  395. package/dist/chunk-NW53H5RW.js +2424 -0
  396. package/dist/chunk-NXCMHIKI.js +263 -0
  397. package/dist/chunk-O3LKCBP5.js +159 -0
  398. package/dist/chunk-O4EA4F3W.js +103 -0
  399. package/dist/chunk-O4EA4F3W.js.map +1 -0
  400. package/dist/chunk-O4OOG3D6.js +116 -0
  401. package/dist/chunk-O4OOG3D6.js.map +1 -0
  402. package/dist/chunk-O6N4ABCA.js +376 -0
  403. package/dist/chunk-O732GAFC.js +112 -0
  404. package/dist/chunk-OF4TIKYC.js +690 -0
  405. package/dist/chunk-OMPVOMPP.js +70 -0
  406. package/dist/chunk-OPJJSKUK.js +118 -0
  407. package/dist/chunk-OPWCMA4D.js +196 -0
  408. package/dist/chunk-ORJPS5VN.js +1193 -0
  409. package/dist/chunk-OSY5K7L7.js +187 -0
  410. package/dist/chunk-OV6QJRT4.js +45 -0
  411. package/dist/chunk-OVKYVZMW.js +108 -0
  412. package/dist/chunk-OZCBM3UC.js +171 -0
  413. package/dist/chunk-P3A2EINJ.js +61 -0
  414. package/dist/chunk-PTAG4PDC.js +27 -0
  415. package/dist/chunk-PTF5B7TJ.js +298 -0
  416. package/dist/chunk-Q3DPEYX4.js +848 -0
  417. package/dist/chunk-Q6CGOPJD.js +215 -0
  418. package/dist/chunk-Q6CGOPJD.js.map +1 -0
  419. package/dist/chunk-QB2KMIDP.js +100 -0
  420. package/dist/chunk-QCSJ4CWE.js +1067 -0
  421. package/dist/chunk-QIOQ2NPQ.js +414 -0
  422. package/dist/chunk-QK5EFEUT.js +353 -0
  423. package/dist/chunk-QPQBLYQJ.js +41 -0
  424. package/dist/chunk-QPSGCC5D.js +184 -0
  425. package/dist/chunk-QZAAUQRN.js +474 -0
  426. package/dist/chunk-QZM6YDJW.js +489 -0
  427. package/dist/chunk-QZM6YDJW.js.map +1 -0
  428. package/dist/chunk-RGBI63KJ.js +188 -0
  429. package/dist/chunk-RLBKLAEY.js +138 -0
  430. package/dist/chunk-RMFKVOM7.js +304 -0
  431. package/dist/chunk-ROKQU7WG.js +258 -0
  432. package/dist/chunk-RPVREAU7.js +251 -0
  433. package/dist/chunk-RQKLF42C.js +723 -0
  434. package/dist/chunk-SC6RRD2D.js +38 -0
  435. package/dist/chunk-SC6RRD2D.js.map +1 -0
  436. package/dist/chunk-SEO7TICN.js +94 -0
  437. package/dist/chunk-SHHJCL7X.js +432 -0
  438. package/dist/chunk-SIRLACNZ.js +114 -0
  439. package/dist/chunk-SKPHMYAA.js +237 -0
  440. package/dist/chunk-SODC7T6L.js +1583 -0
  441. package/dist/chunk-SQJIKMN3.js +366 -0
  442. package/dist/chunk-SVINDKVW.js +26 -0
  443. package/dist/chunk-SYCDHPZF.js +335 -0
  444. package/dist/chunk-T2QX3FDP.js +133 -0
  445. package/dist/chunk-T3OWFVMS.js +1187 -0
  446. package/dist/chunk-T6XI5FLY.js +61 -0
  447. package/dist/chunk-T7OXJZCX.js +62 -0
  448. package/dist/chunk-TAT5USZN.js +353 -0
  449. package/dist/chunk-TPQTRNER.js +172 -0
  450. package/dist/chunk-TUIN4MB7.js +266 -0
  451. package/dist/chunk-TX3VECZU.js +71 -0
  452. package/dist/chunk-TXLIEOJX.js +9624 -0
  453. package/dist/chunk-U3DN4HEY.js +27 -0
  454. package/dist/chunk-U7XM7CB4.js +191 -0
  455. package/dist/chunk-UJK53QFL.js +140 -0
  456. package/dist/chunk-UMTXA2TH.js +319 -0
  457. package/dist/chunk-UPDSXFK5.js +199 -0
  458. package/dist/chunk-UTIAXH52.js +269 -0
  459. package/dist/chunk-UVN5TMHU.js +1184 -0
  460. package/dist/chunk-V4Z4B2E3.js +52 -0
  461. package/dist/chunk-V4Z4B2E3.js.map +1 -0
  462. package/dist/chunk-VGYXW3VG.js +246 -0
  463. package/dist/chunk-VS7AHPCZ.js +255 -0
  464. package/dist/chunk-VTTAJOQ7.js +121 -0
  465. package/dist/chunk-VWPOLUAO.js +99 -0
  466. package/dist/chunk-X3MWB2QU.js +3851 -0
  467. package/dist/chunk-X6KAJI3V.js +211 -0
  468. package/dist/chunk-XBLRHV5R.js +50 -0
  469. package/dist/chunk-XDFP2LMW.js +605 -0
  470. package/dist/chunk-XEQMZB3C.js +525 -0
  471. package/dist/chunk-XEYLT5VA.js +223 -0
  472. package/dist/chunk-XHIQ5I6N.js +918 -0
  473. package/dist/chunk-XLH7QY2R.js +378 -0
  474. package/dist/chunk-XWFAMUZQ.js +113 -0
  475. package/dist/chunk-Y4BB2KS2.js +294 -0
  476. package/dist/chunk-Y4BB2KS2.js.map +1 -0
  477. package/dist/chunk-Y4OBB2VN.js +84 -0
  478. package/dist/chunk-YCVD6CI3.js +234 -0
  479. package/dist/chunk-YENLNISG.js +270 -0
  480. package/dist/chunk-YIRVLKAX.js +351 -0
  481. package/dist/chunk-YL73CVNK.js +390 -0
  482. package/dist/chunk-YLS6QE5G.js +288 -0
  483. package/dist/chunk-YNF2OC54.js +366 -0
  484. package/dist/chunk-YNF2OC54.js.map +1 -0
  485. package/dist/chunk-YPWU5KPE.js +147 -0
  486. package/dist/chunk-YQXTDZSU.js +2984 -0
  487. package/dist/chunk-YSJEAAOL.js +178 -0
  488. package/dist/chunk-YWIFM7D7.js +499 -0
  489. package/dist/chunk-YWVI6ZMK.js +103 -0
  490. package/dist/chunk-Z4FMAFNH.js +847 -0
  491. package/dist/chunk-Z654FWNU.js +136 -0
  492. package/dist/chunk-Z7Y523PS.js +130 -0
  493. package/dist/chunk-ZD67RM6G.js +60 -0
  494. package/dist/chunk-ZEG4VPBL.js +187 -0
  495. package/dist/chunk-ZHDFQITM.js +283 -0
  496. package/dist/chunk-ZHDFQITM.js.map +1 -0
  497. package/dist/chunk-ZLYCOBHW.js +75 -0
  498. package/dist/chunk-ZNJ5MTXV.js +89 -0
  499. package/dist/chunk-ZSGY3H53.js +155 -0
  500. package/dist/chunk-ZTPXACWB.js +1788 -0
  501. package/dist/chunk-ZUA3JMI6.js +107 -0
  502. package/dist/chunk-ZYAZUPPV.js +559 -0
  503. package/dist/composer.js +8 -8
  504. package/dist/computer-viewer-TDDO25AV.js +21 -0
  505. package/dist/connect.js +12 -12
  506. package/dist/desktop-dictation.js +12 -10
  507. package/dist/desktop-dictation.js.map +1 -1
  508. package/dist/desktop.js +2 -2
  509. package/dist/editor.js +2 -2
  510. package/dist/embedded-new-voice-2G3VLPVQ.js +24 -0
  511. package/dist/embedded-voice-T5IWOWGD.js +24 -0
  512. package/dist/fleet-decision-row-WM64KXP3.js +361 -0
  513. package/dist/in-chat-connect-model.js +5 -5
  514. package/dist/index.js +51 -51
  515. package/dist/interaction.js +5 -5
  516. package/dist/machines.js +3 -3
  517. package/dist/meetings-recorder.js +1 -1
  518. package/dist/meetings.js +40 -32
  519. package/dist/meetings.js.map +1 -1
  520. package/dist/messages/en.d.ts +3 -0
  521. package/dist/messages.js +1 -1
  522. package/dist/model-policy-picker-menu-SMC6J6QN.js +22 -0
  523. package/dist/payment-page-card-G4U63KUV.js +223 -0
  524. package/dist/platform-activity-row-BUZGZAKZ.js +128 -0
  525. package/dist/queue-surface-implementation-4KUZ4PJV.js +908 -0
  526. package/dist/realtime.js +4 -4
  527. package/dist/recorder-host-WF2RRR56.js +69 -0
  528. package/dist/recorder-host-WF2RRR56.js.map +1 -0
  529. package/dist/recordings.js +3 -3
  530. package/dist/sandbox-files-ESDMOFSD.js +27 -0
  531. package/dist/session-app.js +211 -209
  532. package/dist/session-connect-cards-Q53KMMYY.js +25 -0
  533. package/dist/session-list-model.js +2 -2
  534. package/dist/session-realtime-CF3I35WJ.js +30 -0
  535. package/dist/session-realtime.js +2 -2
  536. package/dist/session-ui.js +33 -31
  537. package/dist/session.js +5 -5
  538. package/dist/sites.js +2 -2
  539. package/dist/terminal.js +2 -2
  540. package/dist/this-computer.js +3 -3
  541. package/dist/timeline-annotation-markers-CJK4RYZ4.js +157 -0
  542. package/dist/timeline-annotation-selection-67GF5H26.js +208 -0
  543. package/dist/timeline-annotations-dialog-ONJPQDJQ.js +283 -0
  544. package/dist/ui/access-list.js +11 -9
  545. package/dist/ui/access-list.js.map +1 -1
  546. package/dist/ui/api-error.d.ts +6 -3
  547. package/dist/ui/api-error.js +2 -1
  548. package/dist/ui/cadence-picker.js +6 -4
  549. package/dist/ui/choice-cards.js +5 -3
  550. package/dist/ui/confirm-dialog.js +2 -2
  551. package/dist/ui/copy-field.js +5 -3
  552. package/dist/ui/detail-page.js +2 -2
  553. package/dist/ui/detail-sheet.js +2 -2
  554. package/dist/ui/diff-view.js +4 -3
  555. package/dist/ui/disclosure.js +3 -3
  556. package/dist/ui/email-chips-input.js +5 -3
  557. package/dist/ui/error-message.js +2 -1
  558. package/dist/ui/error-reference.d.ts +15 -0
  559. package/dist/ui/error-text.d.ts +10 -0
  560. package/dist/ui/error-text.js +9 -0
  561. package/dist/ui/error-text.js.map +1 -0
  562. package/dist/ui/field.js +4 -2
  563. package/dist/ui/flush-form-page.js +8 -6
  564. package/dist/ui/form-dialog.js +7 -5
  565. package/dist/ui/list-row.js +3 -3
  566. package/dist/ui/load-failure.js +3 -2
  567. package/dist/ui/load-failure.js.map +1 -1
  568. package/dist/ui/notice.js +3 -1
  569. package/dist/ui/relative-time.js +2 -2
  570. package/dist/ui/revision-history.js +9 -7
  571. package/dist/ui/revision-history.js.map +1 -1
  572. package/dist/ui/role-select.js +10 -8
  573. package/dist/ui/segmented-control.js +4 -2
  574. package/dist/ui/select-menu.js +5 -3
  575. package/dist/ui/setting-row.js +3 -1
  576. package/dist/ui/switch.js +4 -2
  577. package/dist/ui/usage-meter.js +3 -3
  578. package/dist/ui/word-list-row.js +4 -2
  579. package/dist/usage.js +2 -2
  580. package/dist/workbench.js +4 -4
  581. package/package.json +5 -6
  582. package/src/app/app-state.tsx +126 -14
  583. package/src/app/components/artifacts/site-data.tsx +2 -2
  584. package/src/app/components/artifacts/site-settings.tsx +2 -2
  585. package/src/app/components/rail/session-list.tsx +7 -8
  586. package/src/app/components/rail/session-shell.tsx +3 -3
  587. package/src/app/components/repository-picker.tsx +8 -1
  588. package/src/app/components/session/model-context-inspector.tsx +2 -1
  589. package/src/app/components/session/session-admin-access.tsx +2 -2
  590. package/src/app/lib/actions/chat-operations.ts +4 -4
  591. package/src/app/lib/archive-session.test.tsx +265 -2
  592. package/src/app/lib/archive-session.tsx +175 -9
  593. package/src/app/lib/copy-link.ts +2 -2
  594. package/src/app/lib/inbox.tsx +2 -2
  595. package/src/app/lib/session-failure-toasts.ts +3 -2
  596. package/src/app/lib/toast.test.tsx +215 -0
  597. package/src/app/lib/toast.tsx +67 -2
  598. package/src/app/personal-github-reconnect.test.tsx +356 -0
  599. package/src/app/routes/artifacts.tsx +1 -2
  600. package/src/components/tool-action-review.tsx +14 -1
  601. package/src/meetings/delete-meeting-dialog.tsx +2 -1
  602. package/src/meetings/meeting-ask.tsx +2 -1
  603. package/src/meetings/meeting-detail-page.tsx +2 -1
  604. package/src/meetings/meeting-notes.tsx +2 -1
  605. package/src/meetings/meeting-settings.tsx +4 -1
  606. package/src/meetings/meeting-transcript.tsx +4 -1
  607. package/src/meetings/recorder-context.tsx +10 -0
  608. package/src/meetings/recorder-host.test.tsx +60 -2
  609. package/src/meetings/recorder-host.tsx +16 -3
  610. package/src/meetings/recorder-panel.tsx +2 -1
  611. package/src/meetings/recorder-workspace.test.tsx +26 -1
  612. package/src/messages/en.ts +6 -0
  613. package/src/ui/api-error.test.ts +29 -5
  614. package/src/ui/api-error.tsx +10 -4
  615. package/src/ui/error-message.tsx +8 -0
  616. package/src/ui/error-reference.test.ts +54 -0
  617. package/src/ui/error-reference.ts +51 -0
  618. package/src/ui/error-text.test.tsx +66 -0
  619. package/src/ui/error-text.tsx +49 -0
  620. package/src/ui/field.tsx +4 -1
  621. package/src/ui/notice.tsx +7 -2
  622. package/src/ui/setting-row.tsx +4 -1
  623. package/styles/app.css +12 -0
  624. package/styles/compiled.css +9 -0
  625. package/dist/browser-viewer-NOP5EAUO.js +0 -23
  626. package/dist/chat-interactive-block-G7O44JHR.js +0 -18
  627. package/dist/chunk-26RWVLRD.js +0 -135
  628. package/dist/chunk-2AHTY7OT.js +0 -247
  629. package/dist/chunk-2GDNWKSC.js +0 -3670
  630. package/dist/chunk-2JENKGCE.js +0 -339
  631. package/dist/chunk-2KYQC4T5.js +0 -155
  632. package/dist/chunk-2RREGDQH.js +0 -708
  633. package/dist/chunk-2T7DX6KR.js +0 -353
  634. package/dist/chunk-2VB2O4FQ.js +0 -920
  635. package/dist/chunk-2VTTKH23.js +0 -94
  636. package/dist/chunk-2XNG2KNT.js +0 -172
  637. package/dist/chunk-2YC6JQRO.js +0 -399
  638. package/dist/chunk-2ZVRJRXC.js +0 -27
  639. package/dist/chunk-35737UT4.js +0 -162
  640. package/dist/chunk-366XZ4PM.js +0 -41
  641. package/dist/chunk-36MIDGAH.js +0 -199
  642. package/dist/chunk-3FD76LXM.js +0 -212
  643. package/dist/chunk-3OVIXY4O.js +0 -213
  644. package/dist/chunk-3OVIXY4O.js.map +0 -1
  645. package/dist/chunk-3QNRBEYH.js +0 -432
  646. package/dist/chunk-3QX55WLC.js +0 -15
  647. package/dist/chunk-3USJPT2S.js +0 -1022
  648. package/dist/chunk-42CMQ5VR.js +0 -251
  649. package/dist/chunk-4LPOWQJY.js +0 -42
  650. package/dist/chunk-4NBTZRKT.js +0 -79
  651. package/dist/chunk-4OXI6HCV.js +0 -118
  652. package/dist/chunk-4SZZAFYQ.js +0 -2317
  653. package/dist/chunk-4TQL3WP2.js +0 -140
  654. package/dist/chunk-4Y6BK7IU.js +0 -196
  655. package/dist/chunk-4YD7YZC5.js +0 -373
  656. package/dist/chunk-5DTST3TP.js +0 -81
  657. package/dist/chunk-5FH5LQVS.js +0 -130
  658. package/dist/chunk-5KWMYPJV.js +0 -847
  659. package/dist/chunk-5MUJDC6C.js +0 -84
  660. package/dist/chunk-5QM2WPKV.js +0 -41
  661. package/dist/chunk-5WUN7XPD.js +0 -1184
  662. package/dist/chunk-64PO2WXU.js +0 -1067
  663. package/dist/chunk-6AHATAAY.js +0 -431
  664. package/dist/chunk-6ED2YWBT.js +0 -56
  665. package/dist/chunk-6GXVYAGR.js +0 -170
  666. package/dist/chunk-6H4SJBPE.js +0 -85
  667. package/dist/chunk-6MT3HHUB.js +0 -84
  668. package/dist/chunk-6UHCBH4G.js +0 -198
  669. package/dist/chunk-6WLX3NR3.js +0 -198
  670. package/dist/chunk-73NXYYWE.js +0 -112
  671. package/dist/chunk-76ERNKIZ.js +0 -603
  672. package/dist/chunk-776QZ573.js +0 -57
  673. package/dist/chunk-7BYWOFVH.js +0 -171
  674. package/dist/chunk-7O5CGGIQ.js +0 -108
  675. package/dist/chunk-7QOHRZ67.js +0 -251
  676. package/dist/chunk-7WIDB4PL.js +0 -2058
  677. package/dist/chunk-7WKP3DYJ.js +0 -37
  678. package/dist/chunk-7XOVTPDI.js +0 -227
  679. package/dist/chunk-AB5MBIXY.js +0 -281
  680. package/dist/chunk-ADNMXBCX.js +0 -1193
  681. package/dist/chunk-AFBJTUFK.js +0 -202
  682. package/dist/chunk-ALVRWCXE.js +0 -61
  683. package/dist/chunk-AOHU6O3M.js +0 -247
  684. package/dist/chunk-AOHU6O3M.js.map +0 -1
  685. package/dist/chunk-APW4T4SW.js +0 -270
  686. package/dist/chunk-AXBSYWKX.js +0 -2656
  687. package/dist/chunk-B2I5ZW35.js +0 -422
  688. package/dist/chunk-B3LMRTRF.js +0 -223
  689. package/dist/chunk-BE2XENG2.js +0 -292
  690. package/dist/chunk-BE2XENG2.js.map +0 -1
  691. package/dist/chunk-BF4SADKX.js +0 -29
  692. package/dist/chunk-BKP43KK4.js +0 -1788
  693. package/dist/chunk-BM3NEZ6X.js +0 -781
  694. package/dist/chunk-BT3BAGB5.js +0 -216
  695. package/dist/chunk-BTSYDIVJ.js +0 -357
  696. package/dist/chunk-BUBNGKWG.js +0 -70
  697. package/dist/chunk-BVUJV5WR.js +0 -126
  698. package/dist/chunk-BZO5ZMUP.js +0 -27
  699. package/dist/chunk-C3HUF3M2.js +0 -157
  700. package/dist/chunk-C5QCAOES.js +0 -264
  701. package/dist/chunk-CGK6ALQU.js +0 -159
  702. package/dist/chunk-CPYGO76Q.js +0 -335
  703. package/dist/chunk-CQH4FWYA.js +0 -490
  704. package/dist/chunk-CZP5QXNB.js +0 -234
  705. package/dist/chunk-D2TOWEYH.js +0 -266
  706. package/dist/chunk-D6L4GHRH.js +0 -340
  707. package/dist/chunk-DKT3N37I.js +0 -50
  708. package/dist/chunk-DMMJIFKA.js +0 -84
  709. package/dist/chunk-DO74DQC7.js +0 -26
  710. package/dist/chunk-DOFJZ2JU.js +0 -83
  711. package/dist/chunk-DSXVY5WZ.js +0 -119
  712. package/dist/chunk-E337C2VK.js +0 -82
  713. package/dist/chunk-E6NRSRBE.js +0 -114
  714. package/dist/chunk-E6SQKHAU.js +0 -114
  715. package/dist/chunk-E7UIVD7F.js +0 -236
  716. package/dist/chunk-EGBII4CP.js +0 -229
  717. package/dist/chunk-EILSAQVJ.js +0 -200
  718. package/dist/chunk-ELL6HSYR.js +0 -307
  719. package/dist/chunk-EUBGLFFR.js +0 -73
  720. package/dist/chunk-EW6RNWSH.js +0 -212
  721. package/dist/chunk-EYUT5Y6V.js +0 -2599
  722. package/dist/chunk-F7U3QPZ3.js +0 -304
  723. package/dist/chunk-FBTJKSTM.js +0 -1270
  724. package/dist/chunk-FC2FTSK3.js +0 -2424
  725. package/dist/chunk-FOGNA3BU.js +0 -148
  726. package/dist/chunk-FQFKHNC7.js +0 -650
  727. package/dist/chunk-FTCHM755.js +0 -50
  728. package/dist/chunk-FXSHP4JZ.js +0 -3550
  729. package/dist/chunk-G6ZZC543.js +0 -818
  730. package/dist/chunk-G7FU6PUA.js +0 -100
  731. package/dist/chunk-GA4YEAMX.js +0 -3851
  732. package/dist/chunk-GE33BGB7.js +0 -12
  733. package/dist/chunk-GQ67HSJY.js +0 -570
  734. package/dist/chunk-GXXZ3WAK.js +0 -106
  735. package/dist/chunk-H2TCRX3H.js +0 -237
  736. package/dist/chunk-HLL4PBO7.js +0 -60
  737. package/dist/chunk-HLOEPV5C.js +0 -259
  738. package/dist/chunk-HUAGBS4O.js +0 -56
  739. package/dist/chunk-I36GSRUJ.js +0 -211
  740. package/dist/chunk-I6VBHT7S.js +0 -261
  741. package/dist/chunk-ICNNNOXE.js +0 -333
  742. package/dist/chunk-ICX64J4U.js +0 -172
  743. package/dist/chunk-ID36Y46W.js +0 -5046
  744. package/dist/chunk-ID36Y46W.js.map +0 -1
  745. package/dist/chunk-IGVVXLKJ.js +0 -559
  746. package/dist/chunk-IKJLSBUI.js +0 -2984
  747. package/dist/chunk-IKMUFDVS.js +0 -50
  748. package/dist/chunk-IKUNOX7F.js +0 -255
  749. package/dist/chunk-ILKDYBON.js +0 -288
  750. package/dist/chunk-IVYJX3OY.js +0 -187
  751. package/dist/chunk-JCY4CMDH.js +0 -107
  752. package/dist/chunk-JJZPLGIP.js +0 -474
  753. package/dist/chunk-JW33RV4V.js +0 -143
  754. package/dist/chunk-JWPA6ZPZ.js +0 -351
  755. package/dist/chunk-JZ4QXS6D.js +0 -50
  756. package/dist/chunk-K42OUZQ3.js +0 -386
  757. package/dist/chunk-K5TOVX5A.js +0 -206
  758. package/dist/chunk-K63HGHZX.js +0 -99
  759. package/dist/chunk-K6R5T44I.js +0 -75
  760. package/dist/chunk-KHJ5PXFM.js +0 -914
  761. package/dist/chunk-KJZRQ55O.js +0 -2319
  762. package/dist/chunk-KJZRQ55O.js.map +0 -1
  763. package/dist/chunk-KKI55ZMW.js +0 -65
  764. package/dist/chunk-KRPLAAFP.js +0 -199
  765. package/dist/chunk-KVFEZDBO.js +0 -134
  766. package/dist/chunk-L4I665WK.js +0 -45
  767. package/dist/chunk-L4OF77LE.js +0 -110
  768. package/dist/chunk-L4OF77LE.js.map +0 -1
  769. package/dist/chunk-LA5T52RM.js +0 -70
  770. package/dist/chunk-LM2W5YAT.js +0 -401
  771. package/dist/chunk-LQ62ECE6.js +0 -390
  772. package/dist/chunk-LQDUHU3Y.js +0 -71
  773. package/dist/chunk-LRJIYTZW.js +0 -4157
  774. package/dist/chunk-LRJIYTZW.js.map +0 -1
  775. package/dist/chunk-LRN6GYAZ.js +0 -138
  776. package/dist/chunk-M4SDVTKJ.js +0 -790
  777. package/dist/chunk-MA6O7CM6.js +0 -99
  778. package/dist/chunk-MBIBB6GI.js +0 -197
  779. package/dist/chunk-MF3ZFB4H.js +0 -199
  780. package/dist/chunk-MJJGJMYJ.js +0 -98
  781. package/dist/chunk-MLJADQFI.js +0 -4824
  782. package/dist/chunk-MQG7RV3B.js +0 -62
  783. package/dist/chunk-MTTGSQA5.js +0 -186
  784. package/dist/chunk-MW7Y3T55.js +0 -525
  785. package/dist/chunk-MYUFMVCH.js +0 -121
  786. package/dist/chunk-N3OARGH2.js +0 -61
  787. package/dist/chunk-NB2HMRT2.js +0 -353
  788. package/dist/chunk-NFDFYWMV.js +0 -141
  789. package/dist/chunk-NWGNFN3N.js +0 -1187
  790. package/dist/chunk-NWJRPDIO.js +0 -840
  791. package/dist/chunk-NWJRPDIO.js.map +0 -1
  792. package/dist/chunk-NXWBBZJV.js +0 -267
  793. package/dist/chunk-NY2QWROL.js +0 -71
  794. package/dist/chunk-O2IOPP3R.js +0 -848
  795. package/dist/chunk-O2UWH5RG.js +0 -141
  796. package/dist/chunk-O5YWDLYF.js +0 -393
  797. package/dist/chunk-OBMCZO7E.js +0 -121
  798. package/dist/chunk-OD3DCCCB.js +0 -132
  799. package/dist/chunk-OMH7R6I3.js +0 -390
  800. package/dist/chunk-OSA5EQG5.js +0 -113
  801. package/dist/chunk-OSJ3MUTZ.js +0 -2936
  802. package/dist/chunk-OWAYJ2OV.js +0 -368
  803. package/dist/chunk-OYXBFSGK.js +0 -269
  804. package/dist/chunk-PC2EBA5G.js +0 -4116
  805. package/dist/chunk-PC2EBA5G.js.map +0 -1
  806. package/dist/chunk-PC2MVXIP.js +0 -363
  807. package/dist/chunk-PC2MVXIP.js.map +0 -1
  808. package/dist/chunk-PENGLDR5.js +0 -309
  809. package/dist/chunk-PSMAWRPL.js +0 -191
  810. package/dist/chunk-PW4IMTYR.js +0 -702
  811. package/dist/chunk-PW54V7T5.js +0 -387
  812. package/dist/chunk-Q2EXYSMO.js +0 -24
  813. package/dist/chunk-Q2XJK5I4.js +0 -51
  814. package/dist/chunk-Q2XJK5I4.js.map +0 -1
  815. package/dist/chunk-Q4EFRI6X.js +0 -258
  816. package/dist/chunk-Q52CXW6C.js +0 -48
  817. package/dist/chunk-Q6XQ2R37.js +0 -184
  818. package/dist/chunk-QAJ53XBW.js +0 -23
  819. package/dist/chunk-QDTKECT4.js +0 -129
  820. package/dist/chunk-QE3ZFGI3.js +0 -43
  821. package/dist/chunk-QHHSUR2Y.js +0 -298
  822. package/dist/chunk-QHNVNR7B.js +0 -173
  823. package/dist/chunk-QIK2Q6N5.js +0 -376
  824. package/dist/chunk-QWL4L366.js +0 -38
  825. package/dist/chunk-R3J2PTVQ.js +0 -690
  826. package/dist/chunk-RBRX5ZS3.js +0 -319
  827. package/dist/chunk-REX6JIC7.js +0 -33
  828. package/dist/chunk-RGZ7EEC3.js +0 -537
  829. package/dist/chunk-RGZ7EEC3.js.map +0 -1
  830. package/dist/chunk-RIPS7GFR.js +0 -960
  831. package/dist/chunk-RTBZNFNV.js +0 -1354
  832. package/dist/chunk-RTBZNFNV.js.map +0 -1
  833. package/dist/chunk-SKMNW4SW.js +0 -187
  834. package/dist/chunk-SRFARKXC.js +0 -623
  835. package/dist/chunk-SWIHWCTW.js +0 -4461
  836. package/dist/chunk-TA5CFTO4.js +0 -103
  837. package/dist/chunk-TF4ZVJLI.js +0 -156
  838. package/dist/chunk-TG7DADJR.js +0 -9624
  839. package/dist/chunk-TI4R2ZD5.js +0 -623
  840. package/dist/chunk-TI4R2ZD5.js.map +0 -1
  841. package/dist/chunk-TNKWOUWP.js +0 -412
  842. package/dist/chunk-TNUSPXPW.js +0 -5555
  843. package/dist/chunk-TNUSPXPW.js.map +0 -1
  844. package/dist/chunk-TNYFHKVV.js +0 -366
  845. package/dist/chunk-TPMZBOFH.js +0 -178
  846. package/dist/chunk-TW3LKRJF.js +0 -263
  847. package/dist/chunk-TZAO65I4.js +0 -83
  848. package/dist/chunk-U5EFEMYU.js +0 -89
  849. package/dist/chunk-U6M4LS3M.js +0 -378
  850. package/dist/chunk-UI4HI5QK.js +0 -918
  851. package/dist/chunk-UJDOWCQ3.js +0 -272
  852. package/dist/chunk-UJUQ2QOX.js +0 -581
  853. package/dist/chunk-UQ3IM6FY.js +0 -133
  854. package/dist/chunk-UYE47LO6.js +0 -246
  855. package/dist/chunk-VADHIT26.js +0 -89
  856. package/dist/chunk-VFQ3H6CO.js +0 -163
  857. package/dist/chunk-VGUN6VB2.js +0 -188
  858. package/dist/chunk-VGWWEVSD.js +0 -723
  859. package/dist/chunk-VIEFJ2DM.js +0 -2469
  860. package/dist/chunk-VLXM36VS.js +0 -268
  861. package/dist/chunk-W3BFRR2G.js +0 -499
  862. package/dist/chunk-W5MPXR3A.js +0 -981
  863. package/dist/chunk-W5OWKVZG.js +0 -136
  864. package/dist/chunk-W6FRORMX.js +0 -486
  865. package/dist/chunk-W6FRORMX.js.map +0 -1
  866. package/dist/chunk-W7XROSZO.js +0 -232
  867. package/dist/chunk-W7XROSZO.js.map +0 -1
  868. package/dist/chunk-WEZ5PXZP.js +0 -403
  869. package/dist/chunk-WHWUWN2X.js +0 -197
  870. package/dist/chunk-WHWUWN2X.js.map +0 -1
  871. package/dist/chunk-WLEDGIVS.js +0 -114
  872. package/dist/chunk-WLEDGIVS.js.map +0 -1
  873. package/dist/chunk-WNDAKLHG.js +0 -281
  874. package/dist/chunk-WTJ4PLMU.js +0 -103
  875. package/dist/chunk-WV2KPJUW.js +0 -107
  876. package/dist/chunk-X3VY5EGY.js +0 -277
  877. package/dist/chunk-X3VY5EGY.js.map +0 -1
  878. package/dist/chunk-XDBYWVCW.js +0 -418
  879. package/dist/chunk-XF7MA4U5.js +0 -36
  880. package/dist/chunk-XF7MA4U5.js.map +0 -1
  881. package/dist/chunk-XOSQP3YA.js +0 -605
  882. package/dist/chunk-XYBV4ZJQ.js +0 -271
  883. package/dist/chunk-YBKVGLQR.js +0 -147
  884. package/dist/chunk-YDCUBUWH.js +0 -1583
  885. package/dist/chunk-YG6NARQY.js +0 -51
  886. package/dist/chunk-YG6NARQY.js.map +0 -1
  887. package/dist/chunk-YSVD5HI4.js +0 -278
  888. package/dist/chunk-YT3WGNG6.js +0 -290
  889. package/dist/chunk-YYICQDK4.js +0 -414
  890. package/dist/chunk-YYLMZLI6.js +0 -686
  891. package/dist/chunk-ZAMTKG5U.js +0 -95
  892. package/dist/chunk-ZDLYSXKN.js +0 -111
  893. package/dist/chunk-ZG447FSS.js +0 -194
  894. package/dist/chunk-ZIT5KD4Q.js +0 -264
  895. package/dist/chunk-ZUDOVDKR.js +0 -3064
  896. package/dist/chunk-ZW2ECJ3A.js +0 -451
  897. package/dist/computer-viewer-LPZ763KF.js +0 -21
  898. package/dist/embedded-new-voice-YVMKSLKJ.js +0 -24
  899. package/dist/embedded-voice-BJPQFXSU.js +0 -24
  900. package/dist/fleet-decision-row-AA4H5CDT.js +0 -361
  901. package/dist/model-policy-picker-menu-HSMWVO4P.js +0 -22
  902. package/dist/payment-page-card-3LTSFJGN.js +0 -223
  903. package/dist/platform-activity-row-5VYV6TX4.js +0 -128
  904. package/dist/queue-surface-implementation-NXHZUKD2.js +0 -908
  905. package/dist/recorder-host-ZKRWTDBM.js +0 -57
  906. package/dist/recorder-host-ZKRWTDBM.js.map +0 -1
  907. package/dist/sandbox-files-YCMLQUFU.js +0 -27
  908. package/dist/session-connect-cards-KSQLMRM5.js +0 -25
  909. package/dist/session-realtime-ZR6JLG3Y.js +0 -30
  910. package/dist/timeline-annotation-markers-YAHDPWVG.js +0 -157
  911. package/dist/timeline-annotation-selection-KHXNCEJP.js +0 -208
  912. package/dist/timeline-annotations-dialog-Y4XD3N7B.js +0 -283
  913. /package/dist/{browser-viewer-NOP5EAUO.js.map → browser-viewer-TC27OCIP.js.map} +0 -0
  914. /package/dist/{chat-interactive-block-G7O44JHR.js.map → chat-interactive-block-RWPQBHVS.js.map} +0 -0
  915. /package/dist/{chunk-EGBII4CP.js.map → chunk-2BDT3UZQ.js.map} +0 -0
  916. /package/dist/{chunk-4YD7YZC5.js.map → chunk-2CLNIEK4.js.map} +0 -0
  917. /package/dist/{chunk-ZW2ECJ3A.js.map → chunk-2FSBSCZJ.js.map} +0 -0
  918. /package/dist/{chunk-KRPLAAFP.js.map → chunk-2I7HDP53.js.map} +0 -0
  919. /package/dist/{chunk-3QX55WLC.js.map → chunk-2INLDVK3.js.map} +0 -0
  920. /package/dist/{chunk-BVUJV5WR.js.map → chunk-2KALVELR.js.map} +0 -0
  921. /package/dist/{chunk-XDBYWVCW.js.map → chunk-2M3J7ZWQ.js.map} +0 -0
  922. /package/dist/{chunk-2RREGDQH.js.map → chunk-2OP6WLGV.js.map} +0 -0
  923. /package/dist/{chunk-OSJ3MUTZ.js.map → chunk-2RG7NIAS.js.map} +0 -0
  924. /package/dist/{chunk-26RWVLRD.js.map → chunk-2STUPWEL.js.map} +0 -0
  925. /package/dist/{chunk-XYBV4ZJQ.js.map → chunk-2YUOVM3G.js.map} +0 -0
  926. /package/dist/{chunk-2GDNWKSC.js.map → chunk-2Z3NQNTM.js.map} +0 -0
  927. /package/dist/{chunk-2VB2O4FQ.js.map → chunk-3CPWWGNK.js.map} +0 -0
  928. /package/dist/{chunk-7WKP3DYJ.js.map → chunk-3ED2U6XE.js.map} +0 -0
  929. /package/dist/{chunk-BT3BAGB5.js.map → chunk-3GZA4BUW.js.map} +0 -0
  930. /package/dist/{chunk-3USJPT2S.js.map → chunk-3IK6UYO6.js.map} +0 -0
  931. /package/dist/{chunk-6AHATAAY.js.map → chunk-3PZ7JZI2.js.map} +0 -0
  932. /package/dist/{chunk-JZ4QXS6D.js.map → chunk-4DVJ6ONS.js.map} +0 -0
  933. /package/dist/{chunk-5QM2WPKV.js.map → chunk-4E3ZJRTZ.js.map} +0 -0
  934. /package/dist/{chunk-NFDFYWMV.js.map → chunk-4SAWSRAA.js.map} +0 -0
  935. /package/dist/{chunk-ELL6HSYR.js.map → chunk-53AGXXZM.js.map} +0 -0
  936. /package/dist/{chunk-G6ZZC543.js.map → chunk-54YW6SZZ.js.map} +0 -0
  937. /package/dist/{chunk-4SZZAFYQ.js.map → chunk-57AZS3IE.js.map} +0 -0
  938. /package/dist/{chunk-JW33RV4V.js.map → chunk-5CPEEAFD.js.map} +0 -0
  939. /package/dist/{chunk-D6L4GHRH.js.map → chunk-5EWSRZ2Y.js.map} +0 -0
  940. /package/dist/{chunk-PW54V7T5.js.map → chunk-5IE76VCY.js.map} +0 -0
  941. /package/dist/{chunk-6GXVYAGR.js.map → chunk-5NWEKLDZ.js.map} +0 -0
  942. /package/dist/{chunk-6UHCBH4G.js.map → chunk-5O2FCCHZ.js.map} +0 -0
  943. /package/dist/{chunk-2YC6JQRO.js.map → chunk-5QAY6K77.js.map} +0 -0
  944. /package/dist/{chunk-EYUT5Y6V.js.map → chunk-6DK6Z4UN.js.map} +0 -0
  945. /package/dist/{chunk-PW4IMTYR.js.map → chunk-6DVCC7QS.js.map} +0 -0
  946. /package/dist/{chunk-7WIDB4PL.js.map → chunk-6JHU2UBS.js.map} +0 -0
  947. /package/dist/{chunk-CQH4FWYA.js.map → chunk-6PZ7OBYU.js.map} +0 -0
  948. /package/dist/{chunk-VFQ3H6CO.js.map → chunk-6WGRDRMA.js.map} +0 -0
  949. /package/dist/{chunk-MTTGSQA5.js.map → chunk-77WAKEAH.js.map} +0 -0
  950. /package/dist/{chunk-O5YWDLYF.js.map → chunk-7TDO3CUM.js.map} +0 -0
  951. /package/dist/{chunk-2AHTY7OT.js.map → chunk-7TIX2UAR.js.map} +0 -0
  952. /package/dist/{chunk-FOGNA3BU.js.map → chunk-7V5REBCP.js.map} +0 -0
  953. /package/dist/{chunk-2JENKGCE.js.map → chunk-7VMZGLYI.js.map} +0 -0
  954. /package/dist/{chunk-E7UIVD7F.js.map → chunk-7W37NS3I.js.map} +0 -0
  955. /package/dist/{chunk-ZDLYSXKN.js.map → chunk-7X6SDK2C.js.map} +0 -0
  956. /package/dist/{chunk-ZAMTKG5U.js.map → chunk-7ZNUHRP5.js.map} +0 -0
  957. /package/dist/{chunk-DMMJIFKA.js.map → chunk-A36PZALD.js.map} +0 -0
  958. /package/dist/{chunk-WV2KPJUW.js.map → chunk-AUI6VA63.js.map} +0 -0
  959. /package/dist/{chunk-Q2EXYSMO.js.map → chunk-AW2MQB37.js.map} +0 -0
  960. /package/dist/{chunk-6WLX3NR3.js.map → chunk-AWKES45Y.js.map} +0 -0
  961. /package/dist/{chunk-OD3DCCCB.js.map → chunk-AXHZYXUV.js.map} +0 -0
  962. /package/dist/{chunk-QDTKECT4.js.map → chunk-BHNSJVBC.js.map} +0 -0
  963. /package/dist/{chunk-FTCHM755.js.map → chunk-BJEJFISW.js.map} +0 -0
  964. /package/dist/{chunk-B2I5ZW35.js.map → chunk-BJFH6JI5.js.map} +0 -0
  965. /package/dist/{chunk-RIPS7GFR.js.map → chunk-BMICEQZQ.js.map} +0 -0
  966. /package/dist/{chunk-BF4SADKX.js.map → chunk-BTLBYBLU.js.map} +0 -0
  967. /package/dist/{chunk-U5EFEMYU.js.map → chunk-BXBDYNRP.js.map} +0 -0
  968. /package/dist/{chunk-BTSYDIVJ.js.map → chunk-C372BFOV.js.map} +0 -0
  969. /package/dist/{chunk-MLJADQFI.js.map → chunk-CMKGILJK.js.map} +0 -0
  970. /package/dist/{chunk-DKT3N37I.js.map → chunk-CRAOSVHC.js.map} +0 -0
  971. /package/dist/{chunk-WNDAKLHG.js.map → chunk-CRU35QQH.js.map} +0 -0
  972. /package/dist/{chunk-2XNG2KNT.js.map → chunk-CUIWCGMA.js.map} +0 -0
  973. /package/dist/{chunk-QWL4L366.js.map → chunk-D5TWNFFE.js.map} +0 -0
  974. /package/dist/{chunk-SWIHWCTW.js.map → chunk-DF5EAHDN.js.map} +0 -0
  975. /package/dist/{chunk-HUAGBS4O.js.map → chunk-DJAXC5OK.js.map} +0 -0
  976. /package/dist/{chunk-FXSHP4JZ.js.map → chunk-DXBYWSL5.js.map} +0 -0
  977. /package/dist/{chunk-5MUJDC6C.js.map → chunk-DXR5PDFP.js.map} +0 -0
  978. /package/dist/{chunk-NXWBBZJV.js.map → chunk-DZWARC4M.js.map} +0 -0
  979. /package/dist/{chunk-GXXZ3WAK.js.map → chunk-DZXEDSQI.js.map} +0 -0
  980. /package/dist/{chunk-Q52CXW6C.js.map → chunk-E7XERZWC.js.map} +0 -0
  981. /package/dist/{chunk-4NBTZRKT.js.map → chunk-ECJBYNLJ.js.map} +0 -0
  982. /package/dist/{chunk-QE3ZFGI3.js.map → chunk-EDI6SJ2N.js.map} +0 -0
  983. /package/dist/{chunk-E6NRSRBE.js.map → chunk-EWSOC6WF.js.map} +0 -0
  984. /package/dist/{chunk-TA5CFTO4.js.map → chunk-F2OPHAUN.js.map} +0 -0
  985. /package/dist/{chunk-5DTST3TP.js.map → chunk-F4ISQGGM.js.map} +0 -0
  986. /package/dist/{chunk-MBIBB6GI.js.map → chunk-FO4LYKJL.js.map} +0 -0
  987. /package/dist/{chunk-EUBGLFFR.js.map → chunk-FPXASDG5.js.map} +0 -0
  988. /package/dist/{chunk-C3HUF3M2.js.map → chunk-FVXBNBHO.js.map} +0 -0
  989. /package/dist/{chunk-W5MPXR3A.js.map → chunk-FZC5N55X.js.map} +0 -0
  990. /package/dist/{chunk-MA6O7CM6.js.map → chunk-GAVYGBFI.js.map} +0 -0
  991. /package/dist/{chunk-REX6JIC7.js.map → chunk-GKVJIDHF.js.map} +0 -0
  992. /package/dist/{chunk-EW6RNWSH.js.map → chunk-GVN5SZLX.js.map} +0 -0
  993. /package/dist/{chunk-KVFEZDBO.js.map → chunk-H3T7IWNA.js.map} +0 -0
  994. /package/dist/{chunk-I6VBHT7S.js.map → chunk-HAX4LCR5.js.map} +0 -0
  995. /package/dist/{chunk-OBMCZO7E.js.map → chunk-HC4JFZVU.js.map} +0 -0
  996. /package/dist/{chunk-UJUQ2QOX.js.map → chunk-HEFPPMBQ.js.map} +0 -0
  997. /package/dist/{chunk-DOFJZ2JU.js.map → chunk-HNLR7Q4Z.js.map} +0 -0
  998. /package/dist/{chunk-GE33BGB7.js.map → chunk-HSOXMJOT.js.map} +0 -0
  999. /package/dist/{chunk-AB5MBIXY.js.map → chunk-I4MRDSUF.js.map} +0 -0
  1000. /package/dist/{chunk-AFBJTUFK.js.map → chunk-I4QEJ62Y.js.map} +0 -0
  1001. /package/dist/{chunk-6ED2YWBT.js.map → chunk-I5B5L6Q4.js.map} +0 -0
  1002. /package/dist/{chunk-C5QCAOES.js.map → chunk-I5QZJODL.js.map} +0 -0
  1003. /package/dist/{chunk-76ERNKIZ.js.map → chunk-I7ITSXSJ.js.map} +0 -0
  1004. /package/dist/{chunk-OMH7R6I3.js.map → chunk-I7XIZRFD.js.map} +0 -0
  1005. /package/dist/{chunk-E337C2VK.js.map → chunk-IDANQPRH.js.map} +0 -0
  1006. /package/dist/{chunk-3FD76LXM.js.map → chunk-IFB3WJ36.js.map} +0 -0
  1007. /package/dist/{chunk-ZIT5KD4Q.js.map → chunk-IHTAKKTK.js.map} +0 -0
  1008. /package/dist/{chunk-QHNVNR7B.js.map → chunk-ILDXWY37.js.map} +0 -0
  1009. /package/dist/{chunk-GQ67HSJY.js.map → chunk-IMDQUHBJ.js.map} +0 -0
  1010. /package/dist/{chunk-DSXVY5WZ.js.map → chunk-IMZCQBOT.js.map} +0 -0
  1011. /package/dist/{chunk-WEZ5PXZP.js.map → chunk-IXPTECSC.js.map} +0 -0
  1012. /package/dist/{chunk-NY2QWROL.js.map → chunk-J255A3N5.js.map} +0 -0
  1013. /package/dist/{chunk-O2UWH5RG.js.map → chunk-J5F5HPPW.js.map} +0 -0
  1014. /package/dist/{chunk-VIEFJ2DM.js.map → chunk-JEA3QDX7.js.map} +0 -0
  1015. /package/dist/{chunk-TF4ZVJLI.js.map → chunk-JEUPAVYY.js.map} +0 -0
  1016. /package/dist/{chunk-ZG447FSS.js.map → chunk-JKHKLL5W.js.map} +0 -0
  1017. /package/dist/{chunk-FQFKHNC7.js.map → chunk-JQL7ZH6C.js.map} +0 -0
  1018. /package/dist/{chunk-776QZ573.js.map → chunk-JWB44UGJ.js.map} +0 -0
  1019. /package/dist/{chunk-ICNNNOXE.js.map → chunk-JZ4NLCAP.js.map} +0 -0
  1020. /package/dist/{chunk-TNKWOUWP.js.map → chunk-K2A5PXQ5.js.map} +0 -0
  1021. /package/dist/{chunk-SRFARKXC.js.map → chunk-K56XV3C3.js.map} +0 -0
  1022. /package/dist/{chunk-QAJ53XBW.js.map → chunk-K6GAXXVA.js.map} +0 -0
  1023. /package/dist/{chunk-MF3ZFB4H.js.map → chunk-KCBMFSMS.js.map} +0 -0
  1024. /package/dist/{chunk-VLXM36VS.js.map → chunk-KF2FV3ZJ.js.map} +0 -0
  1025. /package/dist/{chunk-YSVD5HI4.js.map → chunk-KJD65EJP.js.map} +0 -0
  1026. /package/dist/{chunk-K42OUZQ3.js.map → chunk-KLEUWIMZ.js.map} +0 -0
  1027. /package/dist/{chunk-PENGLDR5.js.map → chunk-KODELWYT.js.map} +0 -0
  1028. /package/dist/{chunk-TZAO65I4.js.map → chunk-KRDR5RJD.js.map} +0 -0
  1029. /package/dist/{chunk-KHJ5PXFM.js.map → chunk-KUDGXAF7.js.map} +0 -0
  1030. /package/dist/{chunk-6H4SJBPE.js.map → chunk-KYS77RPN.js.map} +0 -0
  1031. /package/dist/{chunk-OWAYJ2OV.js.map → chunk-L7YTNTIK.js.map} +0 -0
  1032. /package/dist/{chunk-YYLMZLI6.js.map → chunk-LHPNABDH.js.map} +0 -0
  1033. /package/dist/{chunk-LM2W5YAT.js.map → chunk-MFROMEKA.js.map} +0 -0
  1034. /package/dist/{chunk-AXBSYWKX.js.map → chunk-MIHN76LX.js.map} +0 -0
  1035. /package/dist/{chunk-4LPOWQJY.js.map → chunk-MIYFS2XN.js.map} +0 -0
  1036. /package/dist/{chunk-KKI55ZMW.js.map → chunk-MJUCFQMS.js.map} +0 -0
  1037. /package/dist/{chunk-ZUDOVDKR.js.map → chunk-MM4FNWI4.js.map} +0 -0
  1038. /package/dist/{chunk-M4SDVTKJ.js.map → chunk-MNZG4OHU.js.map} +0 -0
  1039. /package/dist/{chunk-EILSAQVJ.js.map → chunk-N6AACDUW.js.map} +0 -0
  1040. /package/dist/{chunk-BM3NEZ6X.js.map → chunk-NC55IFN3.js.map} +0 -0
  1041. /package/dist/{chunk-MJJGJMYJ.js.map → chunk-NC7PVOEK.js.map} +0 -0
  1042. /package/dist/{chunk-LA5T52RM.js.map → chunk-NCYMNCJO.js.map} +0 -0
  1043. /package/dist/{chunk-HLOEPV5C.js.map → chunk-ND2BXV3P.js.map} +0 -0
  1044. /package/dist/{chunk-UJDOWCQ3.js.map → chunk-NDBTFUO6.js.map} +0 -0
  1045. /package/dist/{chunk-K5TOVX5A.js.map → chunk-NDQJZ7HF.js.map} +0 -0
  1046. /package/dist/{chunk-35737UT4.js.map → chunk-NGJJJPZZ.js.map} +0 -0
  1047. /package/dist/{chunk-42CMQ5VR.js.map → chunk-NJTSNNE7.js.map} +0 -0
  1048. /package/dist/{chunk-FBTJKSTM.js.map → chunk-NRTE7DNV.js.map} +0 -0
  1049. /package/dist/{chunk-YT3WGNG6.js.map → chunk-NULUNM7H.js.map} +0 -0
  1050. /package/dist/{chunk-7XOVTPDI.js.map → chunk-NUNZS36W.js.map} +0 -0
  1051. /package/dist/{chunk-FC2FTSK3.js.map → chunk-NW53H5RW.js.map} +0 -0
  1052. /package/dist/{chunk-TW3LKRJF.js.map → chunk-NXCMHIKI.js.map} +0 -0
  1053. /package/dist/{chunk-CGK6ALQU.js.map → chunk-O3LKCBP5.js.map} +0 -0
  1054. /package/dist/{chunk-QIK2Q6N5.js.map → chunk-O6N4ABCA.js.map} +0 -0
  1055. /package/dist/{chunk-73NXYYWE.js.map → chunk-O732GAFC.js.map} +0 -0
  1056. /package/dist/{chunk-R3J2PTVQ.js.map → chunk-OF4TIKYC.js.map} +0 -0
  1057. /package/dist/{chunk-BUBNGKWG.js.map → chunk-OMPVOMPP.js.map} +0 -0
  1058. /package/dist/{chunk-4OXI6HCV.js.map → chunk-OPJJSKUK.js.map} +0 -0
  1059. /package/dist/{chunk-4Y6BK7IU.js.map → chunk-OPWCMA4D.js.map} +0 -0
  1060. /package/dist/{chunk-ADNMXBCX.js.map → chunk-ORJPS5VN.js.map} +0 -0
  1061. /package/dist/{chunk-SKMNW4SW.js.map → chunk-OSY5K7L7.js.map} +0 -0
  1062. /package/dist/{chunk-L4I665WK.js.map → chunk-OV6QJRT4.js.map} +0 -0
  1063. /package/dist/{chunk-7O5CGGIQ.js.map → chunk-OVKYVZMW.js.map} +0 -0
  1064. /package/dist/{chunk-7BYWOFVH.js.map → chunk-OZCBM3UC.js.map} +0 -0
  1065. /package/dist/{chunk-ALVRWCXE.js.map → chunk-P3A2EINJ.js.map} +0 -0
  1066. /package/dist/{chunk-BZO5ZMUP.js.map → chunk-PTAG4PDC.js.map} +0 -0
  1067. /package/dist/{chunk-QHHSUR2Y.js.map → chunk-PTF5B7TJ.js.map} +0 -0
  1068. /package/dist/{chunk-O2IOPP3R.js.map → chunk-Q3DPEYX4.js.map} +0 -0
  1069. /package/dist/{chunk-G7FU6PUA.js.map → chunk-QB2KMIDP.js.map} +0 -0
  1070. /package/dist/{chunk-64PO2WXU.js.map → chunk-QCSJ4CWE.js.map} +0 -0
  1071. /package/dist/{chunk-YYICQDK4.js.map → chunk-QIOQ2NPQ.js.map} +0 -0
  1072. /package/dist/{chunk-NB2HMRT2.js.map → chunk-QK5EFEUT.js.map} +0 -0
  1073. /package/dist/{chunk-366XZ4PM.js.map → chunk-QPQBLYQJ.js.map} +0 -0
  1074. /package/dist/{chunk-Q6XQ2R37.js.map → chunk-QPSGCC5D.js.map} +0 -0
  1075. /package/dist/{chunk-JJZPLGIP.js.map → chunk-QZAAUQRN.js.map} +0 -0
  1076. /package/dist/{chunk-VGUN6VB2.js.map → chunk-RGBI63KJ.js.map} +0 -0
  1077. /package/dist/{chunk-LRN6GYAZ.js.map → chunk-RLBKLAEY.js.map} +0 -0
  1078. /package/dist/{chunk-F7U3QPZ3.js.map → chunk-RMFKVOM7.js.map} +0 -0
  1079. /package/dist/{chunk-Q4EFRI6X.js.map → chunk-ROKQU7WG.js.map} +0 -0
  1080. /package/dist/{chunk-7QOHRZ67.js.map → chunk-RPVREAU7.js.map} +0 -0
  1081. /package/dist/{chunk-VGWWEVSD.js.map → chunk-RQKLF42C.js.map} +0 -0
  1082. /package/dist/{chunk-2VTTKH23.js.map → chunk-SEO7TICN.js.map} +0 -0
  1083. /package/dist/{chunk-3QNRBEYH.js.map → chunk-SHHJCL7X.js.map} +0 -0
  1084. /package/dist/{chunk-E6SQKHAU.js.map → chunk-SIRLACNZ.js.map} +0 -0
  1085. /package/dist/{chunk-H2TCRX3H.js.map → chunk-SKPHMYAA.js.map} +0 -0
  1086. /package/dist/{chunk-YDCUBUWH.js.map → chunk-SODC7T6L.js.map} +0 -0
  1087. /package/dist/{chunk-TNYFHKVV.js.map → chunk-SQJIKMN3.js.map} +0 -0
  1088. /package/dist/{chunk-DO74DQC7.js.map → chunk-SVINDKVW.js.map} +0 -0
  1089. /package/dist/{chunk-CPYGO76Q.js.map → chunk-SYCDHPZF.js.map} +0 -0
  1090. /package/dist/{chunk-UQ3IM6FY.js.map → chunk-T2QX3FDP.js.map} +0 -0
  1091. /package/dist/{chunk-NWGNFN3N.js.map → chunk-T3OWFVMS.js.map} +0 -0
  1092. /package/dist/{chunk-N3OARGH2.js.map → chunk-T6XI5FLY.js.map} +0 -0
  1093. /package/dist/{chunk-MQG7RV3B.js.map → chunk-T7OXJZCX.js.map} +0 -0
  1094. /package/dist/{chunk-2T7DX6KR.js.map → chunk-TAT5USZN.js.map} +0 -0
  1095. /package/dist/{chunk-ICX64J4U.js.map → chunk-TPQTRNER.js.map} +0 -0
  1096. /package/dist/{chunk-D2TOWEYH.js.map → chunk-TUIN4MB7.js.map} +0 -0
  1097. /package/dist/{chunk-LQDUHU3Y.js.map → chunk-TX3VECZU.js.map} +0 -0
  1098. /package/dist/{chunk-TG7DADJR.js.map → chunk-TXLIEOJX.js.map} +0 -0
  1099. /package/dist/{chunk-2ZVRJRXC.js.map → chunk-U3DN4HEY.js.map} +0 -0
  1100. /package/dist/{chunk-PSMAWRPL.js.map → chunk-U7XM7CB4.js.map} +0 -0
  1101. /package/dist/{chunk-4TQL3WP2.js.map → chunk-UJK53QFL.js.map} +0 -0
  1102. /package/dist/{chunk-RBRX5ZS3.js.map → chunk-UMTXA2TH.js.map} +0 -0
  1103. /package/dist/{chunk-36MIDGAH.js.map → chunk-UPDSXFK5.js.map} +0 -0
  1104. /package/dist/{chunk-OYXBFSGK.js.map → chunk-UTIAXH52.js.map} +0 -0
  1105. /package/dist/{chunk-5WUN7XPD.js.map → chunk-UVN5TMHU.js.map} +0 -0
  1106. /package/dist/{chunk-UYE47LO6.js.map → chunk-VGYXW3VG.js.map} +0 -0
  1107. /package/dist/{chunk-IKUNOX7F.js.map → chunk-VS7AHPCZ.js.map} +0 -0
  1108. /package/dist/{chunk-MYUFMVCH.js.map → chunk-VTTAJOQ7.js.map} +0 -0
  1109. /package/dist/{chunk-K63HGHZX.js.map → chunk-VWPOLUAO.js.map} +0 -0
  1110. /package/dist/{chunk-GA4YEAMX.js.map → chunk-X3MWB2QU.js.map} +0 -0
  1111. /package/dist/{chunk-I36GSRUJ.js.map → chunk-X6KAJI3V.js.map} +0 -0
  1112. /package/dist/{chunk-IKMUFDVS.js.map → chunk-XBLRHV5R.js.map} +0 -0
  1113. /package/dist/{chunk-XOSQP3YA.js.map → chunk-XDFP2LMW.js.map} +0 -0
  1114. /package/dist/{chunk-MW7Y3T55.js.map → chunk-XEQMZB3C.js.map} +0 -0
  1115. /package/dist/{chunk-B3LMRTRF.js.map → chunk-XEYLT5VA.js.map} +0 -0
  1116. /package/dist/{chunk-UI4HI5QK.js.map → chunk-XHIQ5I6N.js.map} +0 -0
  1117. /package/dist/{chunk-U6M4LS3M.js.map → chunk-XLH7QY2R.js.map} +0 -0
  1118. /package/dist/{chunk-OSA5EQG5.js.map → chunk-XWFAMUZQ.js.map} +0 -0
  1119. /package/dist/{chunk-6MT3HHUB.js.map → chunk-Y4OBB2VN.js.map} +0 -0
  1120. /package/dist/{chunk-CZP5QXNB.js.map → chunk-YCVD6CI3.js.map} +0 -0
  1121. /package/dist/{chunk-APW4T4SW.js.map → chunk-YENLNISG.js.map} +0 -0
  1122. /package/dist/{chunk-JWPA6ZPZ.js.map → chunk-YIRVLKAX.js.map} +0 -0
  1123. /package/dist/{chunk-LQ62ECE6.js.map → chunk-YL73CVNK.js.map} +0 -0
  1124. /package/dist/{chunk-ILKDYBON.js.map → chunk-YLS6QE5G.js.map} +0 -0
  1125. /package/dist/{chunk-YBKVGLQR.js.map → chunk-YPWU5KPE.js.map} +0 -0
  1126. /package/dist/{chunk-IKJLSBUI.js.map → chunk-YQXTDZSU.js.map} +0 -0
  1127. /package/dist/{chunk-TPMZBOFH.js.map → chunk-YSJEAAOL.js.map} +0 -0
  1128. /package/dist/{chunk-W3BFRR2G.js.map → chunk-YWIFM7D7.js.map} +0 -0
  1129. /package/dist/{chunk-WTJ4PLMU.js.map → chunk-YWVI6ZMK.js.map} +0 -0
  1130. /package/dist/{chunk-5KWMYPJV.js.map → chunk-Z4FMAFNH.js.map} +0 -0
  1131. /package/dist/{chunk-W5OWKVZG.js.map → chunk-Z654FWNU.js.map} +0 -0
  1132. /package/dist/{chunk-5FH5LQVS.js.map → chunk-Z7Y523PS.js.map} +0 -0
  1133. /package/dist/{chunk-HLL4PBO7.js.map → chunk-ZD67RM6G.js.map} +0 -0
  1134. /package/dist/{chunk-IVYJX3OY.js.map → chunk-ZEG4VPBL.js.map} +0 -0
  1135. /package/dist/{chunk-K6R5T44I.js.map → chunk-ZLYCOBHW.js.map} +0 -0
  1136. /package/dist/{chunk-VADHIT26.js.map → chunk-ZNJ5MTXV.js.map} +0 -0
  1137. /package/dist/{chunk-2KYQC4T5.js.map → chunk-ZSGY3H53.js.map} +0 -0
  1138. /package/dist/{chunk-BKP43KK4.js.map → chunk-ZTPXACWB.js.map} +0 -0
  1139. /package/dist/{chunk-JCY4CMDH.js.map → chunk-ZUA3JMI6.js.map} +0 -0
  1140. /package/dist/{chunk-IGVVXLKJ.js.map → chunk-ZYAZUPPV.js.map} +0 -0
  1141. /package/dist/{computer-viewer-LPZ763KF.js.map → computer-viewer-TDDO25AV.js.map} +0 -0
  1142. /package/dist/{embedded-new-voice-YVMKSLKJ.js.map → embedded-new-voice-2G3VLPVQ.js.map} +0 -0
  1143. /package/dist/{embedded-voice-BJPQFXSU.js.map → embedded-voice-T5IWOWGD.js.map} +0 -0
  1144. /package/dist/{fleet-decision-row-AA4H5CDT.js.map → fleet-decision-row-WM64KXP3.js.map} +0 -0
  1145. /package/dist/{model-policy-picker-menu-HSMWVO4P.js.map → model-policy-picker-menu-SMC6J6QN.js.map} +0 -0
  1146. /package/dist/{payment-page-card-3LTSFJGN.js.map → payment-page-card-G4U63KUV.js.map} +0 -0
  1147. /package/dist/{platform-activity-row-5VYV6TX4.js.map → platform-activity-row-BUZGZAKZ.js.map} +0 -0
  1148. /package/dist/{queue-surface-implementation-NXHZUKD2.js.map → queue-surface-implementation-4KUZ4PJV.js.map} +0 -0
  1149. /package/dist/{sandbox-files-YCMLQUFU.js.map → sandbox-files-ESDMOFSD.js.map} +0 -0
  1150. /package/dist/{session-connect-cards-KSQLMRM5.js.map → session-connect-cards-Q53KMMYY.js.map} +0 -0
  1151. /package/dist/{session-realtime-ZR6JLG3Y.js.map → session-realtime-CF3I35WJ.js.map} +0 -0
  1152. /package/dist/{timeline-annotation-markers-YAHDPWVG.js.map → timeline-annotation-markers-CJK4RYZ4.js.map} +0 -0
  1153. /package/dist/{timeline-annotation-selection-KHXNCEJP.js.map → timeline-annotation-selection-67GF5H26.js.map} +0 -0
  1154. /package/dist/{timeline-annotations-dialog-Y4XD3N7B.js.map → timeline-annotations-dialog-ONJPQDJQ.js.map} +0 -0
@@ -0,0 +1,2317 @@
1
+ "use client";
2
+ import {
3
+ useLatestTaskRunner
4
+ } from "./chunk-2DDJ6YH6.js";
5
+ import {
6
+ ArtifactSubmissionProvider,
7
+ ArtifactSurface,
8
+ EditableArtifactDownloadButton,
9
+ EditableArtifactMessage,
10
+ artifactSubmissionSessionKey,
11
+ asEditableArtifactError,
12
+ editableArtifactAccessRevoked,
13
+ editableArtifactProjectionKey,
14
+ editableArtifactStatusLabel,
15
+ useArtifactSubmissions,
16
+ useEditableArtifactView
17
+ } from "./chunk-7VMZGLYI.js";
18
+ import {
19
+ cn
20
+ } from "./chunk-TXS65BB2.js";
21
+ import {
22
+ useOpenGeniText
23
+ } from "./chunk-7T2ZE3VT.js";
24
+
25
+ // src/components/artifacts/document-editor.tsx
26
+ import {
27
+ BoldIcon,
28
+ Columns2Icon,
29
+ ItalicIcon,
30
+ MessageSquareTextIcon,
31
+ PilcrowIcon,
32
+ Rows3Icon,
33
+ UnderlineIcon
34
+ } from "lucide-react";
35
+ import {
36
+ memo,
37
+ useCallback,
38
+ useEffect,
39
+ useLayoutEffect,
40
+ useMemo,
41
+ useRef,
42
+ useState
43
+ } from "react";
44
+ import { jsx, jsxs } from "react/jsx-runtime";
45
+ var POINT_TO_CSS_PIXEL = 4 / 3;
46
+ var DEFAULT_VIEWPORT_HEIGHT = 640;
47
+ var RESPONSIVE_CONTINUOUS_LAYOUT_WIDTH = 640;
48
+ var PAGINATED_GAP = 24;
49
+ var CONTINUOUS_GAP = 1;
50
+ var MAX_PLAIN_TEXT_TRANSFER = 1e6;
51
+ var MAX_PROJECTION_BLOCKS = 1e5;
52
+ var MAX_PROJECTION_TABLE_CELLS = 1e6;
53
+ var MAX_PROJECTION_ANNOTATIONS = 1e5;
54
+ var MAX_PROJECTION_TEXT = 1e6;
55
+ var EMPTY_COMMENTS = [];
56
+ var EMPTY_CHANGES = [];
57
+ function DocumentEditor(props) {
58
+ return /* @__PURE__ */ jsx(DocumentEditorCore, { ...props, document: asDocumentView(props.document) });
59
+ }
60
+ function DocumentProjectionEditor({
61
+ projection,
62
+ commit,
63
+ onCommandError,
64
+ onSelectionChange,
65
+ readOnly = false,
66
+ ...props
67
+ }) {
68
+ const view = useMemo(() => documentViewFromProjection(projection), [projection]);
69
+ return /* @__PURE__ */ jsx(
70
+ DocumentEditorCore,
71
+ {
72
+ ...props,
73
+ document: view.document,
74
+ revisionToken: projection.revision,
75
+ readOnly: readOnly || !commit,
76
+ onCommandError,
77
+ blockIdForView: (blockId) => view.externalIdByInternal.get(blockId) ?? blockId,
78
+ onSelectionChange: (selection) => onSelectionChange?.({
79
+ ...selection,
80
+ blockId: view.externalIdByInternal.get(selection.blockId) ?? selection.blockId
81
+ }),
82
+ onCommit: (command) => commit?.(mapDocumentCommit(command, view.externalIdByInternal))
83
+ }
84
+ );
85
+ }
86
+ function DocumentEditorCore({
87
+ document: document2,
88
+ revisionToken,
89
+ layout: controlledLayout,
90
+ defaultLayout,
91
+ onLayoutChange,
92
+ onSelectionChange,
93
+ onCommit,
94
+ onCommandError,
95
+ blockIdForView = identity,
96
+ readOnly = false,
97
+ ariaLabel: ariaLabelProp,
98
+ viewportHeight = DEFAULT_VIEWPORT_HEIGHT,
99
+ overscanPages = 1,
100
+ className
101
+ }) {
102
+ const t = useOpenGeniText();
103
+ const ariaLabel = ariaLabelProp === void 0 ? t("artifacts.documentEditor.documentEditor") : ariaLabelProp;
104
+ const [uncontrolledLayout, setUncontrolledLayout] = useState(
105
+ defaultLayout ?? "paginated"
106
+ );
107
+ const [scrollTop, setScrollTop] = useState(0);
108
+ const [measuredViewport, setMeasuredViewport] = useState({ width: 0, height: 0 });
109
+ const [localRevision, setLocalRevision] = useState(document2.revision);
110
+ const [measuredPageHeights, setMeasuredPageHeights] = useState(
111
+ () => /* @__PURE__ */ new Map()
112
+ );
113
+ const [selectedBlockId, setSelectedBlockId] = useState(null);
114
+ const [hasTextSelection, setHasTextSelection] = useState(false);
115
+ const selectionRef = useRef(null);
116
+ const [openThreadId, setOpenThreadId] = useState(null);
117
+ const [pendingCommands, setPendingCommands] = useState(0);
118
+ const [commandFailure, setCommandFailure] = useState(null);
119
+ const editorNodes = useRef(/* @__PURE__ */ new Map());
120
+ const viewportRef = useRef(null);
121
+ const pendingScrollTop = useRef(0);
122
+ const scrollFrame = useRef(null);
123
+ const pendingMeasurementAnchor = useRef(null);
124
+ const responsiveLayoutInitialized = useRef(false);
125
+ const measuredPageHeightsRef = useRef(/* @__PURE__ */ new Map());
126
+ const mountedRef = useRef(true);
127
+ const commandScopeRef = useRef(0);
128
+ const commandVersionsRef = useRef(/* @__PURE__ */ new Map());
129
+ const layout = controlledLayout ?? uncontrolledLayout;
130
+ const documentRevision = revisionToken ?? document2.revision;
131
+ const pageGap = layout === "paginated" ? PAGINATED_GAP : CONTINUOUS_GAP;
132
+ const basePages = useMemo(
133
+ () => projectPages(document2, layout),
134
+ // The revision values intentionally invalidate projections over the mutable public model.
135
+ // oxlint-disable-next-line react-hooks/exhaustive-deps
136
+ [document2, documentRevision, layout, localRevision]
137
+ );
138
+ const naturalPages = useMemo(
139
+ () => basePages.map((page) => ({
140
+ ...page,
141
+ // Estimates seed unmounted pages only. Once mounted, intrinsic content
142
+ // may correct the page in either direction while preserving paper size.
143
+ height: measuredPageHeights.has(page.key) ? Math.max(page.minimumHeight, measuredPageHeights.get(page.key) ?? page.height) : page.height
144
+ })),
145
+ [basePages, measuredPageHeights]
146
+ );
147
+ const pages = useMemo(
148
+ () => naturalPages.map((page) => {
149
+ const renderScale = layout === "paginated" ? responsiveDocumentPageScale(page.page, measuredViewport.width) : 1;
150
+ return {
151
+ ...page,
152
+ naturalHeight: page.height,
153
+ renderScale,
154
+ height: page.height * renderScale,
155
+ minimumHeight: page.minimumHeight * renderScale
156
+ };
157
+ }),
158
+ [layout, measuredViewport.width, naturalPages]
159
+ );
160
+ const annotations = useMemo(
161
+ () => indexAnnotations(document2),
162
+ // The revision values intentionally invalidate indexes over the mutable public model.
163
+ // oxlint-disable-next-line react-hooks/exhaustive-deps
164
+ [document2, documentRevision, localRevision]
165
+ );
166
+ const axis = useMemo(() => buildPageAxis(pages, pageGap), [pages, pageGap]);
167
+ const pagesRef = useRef(pages);
168
+ const axisRef = useRef(axis);
169
+ pagesRef.current = pages;
170
+ axisRef.current = axis;
171
+ const blockPageIndex = useMemo(() => {
172
+ const index = /* @__PURE__ */ new Map();
173
+ pages.forEach((page, pageIndex) => {
174
+ for (const { block } of page.blocks) index.set(block.id, pageIndex);
175
+ });
176
+ return index;
177
+ }, [pages]);
178
+ const activePage = selectedBlockId ? blockPageIndex.get(selectedBlockId) ?? -1 : -1;
179
+ const mountedIndexes = useMemo(
180
+ () => visiblePageIndexes(
181
+ axis,
182
+ pages.length,
183
+ scrollTop,
184
+ Math.max(1, measuredViewport.height || viewportHeight),
185
+ Math.max(0, Math.floor(overscanPages)),
186
+ activePage
187
+ ),
188
+ [
189
+ activePage,
190
+ axis,
191
+ measuredViewport.height,
192
+ overscanPages,
193
+ pages.length,
194
+ scrollTop,
195
+ viewportHeight
196
+ ]
197
+ );
198
+ useLayoutEffect(() => {
199
+ const element = viewportRef.current;
200
+ if (!element) return;
201
+ const measure = () => {
202
+ const width = element.clientWidth;
203
+ const height = element.clientHeight;
204
+ if (width <= 0 && height <= 0) return;
205
+ setMeasuredViewport(
206
+ (current) => current.width === width && current.height === height ? current : { width, height }
207
+ );
208
+ };
209
+ measure();
210
+ const observer = globalThis.ResizeObserver ? new globalThis.ResizeObserver(measure) : null;
211
+ observer?.observe(element);
212
+ globalThis.addEventListener?.("resize", measure);
213
+ return () => {
214
+ observer?.disconnect();
215
+ globalThis.removeEventListener?.("resize", measure);
216
+ };
217
+ }, []);
218
+ useLayoutEffect(() => {
219
+ if (responsiveLayoutInitialized.current || controlledLayout !== void 0 || defaultLayout !== void 0 || measuredViewport.width <= 0) {
220
+ return;
221
+ }
222
+ responsiveLayoutInitialized.current = true;
223
+ if (measuredViewport.width < RESPONSIVE_CONTINUOUS_LAYOUT_WIDTH) {
224
+ setUncontrolledLayout("continuous");
225
+ onLayoutChange?.("continuous");
226
+ }
227
+ }, [controlledLayout, defaultLayout, measuredViewport.width, onLayoutChange]);
228
+ useEffect(() => {
229
+ commandScopeRef.current += 1;
230
+ commandVersionsRef.current.clear();
231
+ selectionRef.current = null;
232
+ setSelectedBlockId(null);
233
+ setHasTextSelection(false);
234
+ setOpenThreadId(null);
235
+ setLocalRevision(document2.revision);
236
+ setPendingCommands(0);
237
+ setCommandFailure(null);
238
+ }, [document2, revisionToken]);
239
+ useEffect(() => {
240
+ mountedRef.current = true;
241
+ return () => {
242
+ mountedRef.current = false;
243
+ if (scrollFrame.current !== null && globalThis.cancelAnimationFrame) {
244
+ globalThis.cancelAnimationFrame(scrollFrame.current);
245
+ }
246
+ };
247
+ }, []);
248
+ const handleScroll = useCallback((event) => {
249
+ pendingScrollTop.current = event.currentTarget.scrollTop;
250
+ if (scrollFrame.current !== null) return;
251
+ if (!globalThis.requestAnimationFrame) {
252
+ scrollFrame.current = -1;
253
+ queueMicrotask(() => {
254
+ scrollFrame.current = null;
255
+ setScrollTop(pendingScrollTop.current);
256
+ });
257
+ return;
258
+ }
259
+ scrollFrame.current = globalThis.requestAnimationFrame(() => {
260
+ scrollFrame.current = null;
261
+ setScrollTop(pendingScrollTop.current);
262
+ });
263
+ }, []);
264
+ const clearSelection = useCallback(() => {
265
+ selectionRef.current = null;
266
+ setSelectedBlockId(null);
267
+ setHasTextSelection(false);
268
+ }, []);
269
+ const recordPageHeight = useCallback((key, height) => {
270
+ if (!Number.isFinite(height) || height <= 0) return;
271
+ const rounded = Math.ceil(height);
272
+ const current = measuredPageHeightsRef.current;
273
+ if (Math.abs((current.get(key) ?? 0) - rounded) <= 1) return;
274
+ const currentPages = pagesRef.current;
275
+ if (!currentPages.some((page) => page.key === key)) return;
276
+ const viewport = viewportRef.current;
277
+ if (viewport && pendingMeasurementAnchor.current === null) {
278
+ const currentAxis = axisRef.current;
279
+ const anchorIndex = pageAtOffset(currentAxis, currentPages.length, viewport.scrollTop);
280
+ const anchorPage = currentPages[anchorIndex];
281
+ if (anchorPage) {
282
+ pendingMeasurementAnchor.current = {
283
+ axis: currentAxis,
284
+ key: anchorPage.key,
285
+ offset: viewport.scrollTop - currentAxis.offsets[anchorIndex],
286
+ scrollTop: viewport.scrollTop
287
+ };
288
+ }
289
+ }
290
+ const next = /* @__PURE__ */ new Map();
291
+ for (const page of currentPages) {
292
+ const measured = current.get(page.key);
293
+ if (measured !== void 0) next.set(page.key, measured);
294
+ }
295
+ next.set(key, rounded);
296
+ measuredPageHeightsRef.current = next;
297
+ setMeasuredPageHeights(next);
298
+ }, []);
299
+ useLayoutEffect(() => {
300
+ const anchor = pendingMeasurementAnchor.current;
301
+ if (!anchor || anchor.axis === axis) return;
302
+ pendingMeasurementAnchor.current = null;
303
+ const viewport = viewportRef.current;
304
+ if (!viewport || Math.abs(viewport.scrollTop - anchor.scrollTop) > 1) return;
305
+ const anchorIndex = pages.findIndex((page) => page.key === anchor.key);
306
+ if (anchorIndex < 0) return;
307
+ const nextScrollTop = Math.max(0, axis.offsets[anchorIndex] + anchor.offset);
308
+ if (Math.abs(viewport.scrollTop - nextScrollTop) > 0.5) {
309
+ viewport.scrollTop = nextScrollTop;
310
+ }
311
+ const correctedScrollTop = viewport.scrollTop;
312
+ pendingScrollTop.current = correctedScrollTop;
313
+ setScrollTop(
314
+ (current) => Math.abs(current - correctedScrollTop) > 0.5 ? correctedScrollTop : current
315
+ );
316
+ }, [axis, pages]);
317
+ const publishSelection = useCallback(
318
+ (next) => {
319
+ selectionRef.current = next;
320
+ setSelectedBlockId((current) => current === next.blockId ? current : next.blockId);
321
+ const nextHasTextSelection = next.end > next.start;
322
+ setHasTextSelection(
323
+ (current) => current === nextHasTextSelection ? current : nextHasTextSelection
324
+ );
325
+ onSelectionChange?.(next);
326
+ },
327
+ [onSelectionChange]
328
+ );
329
+ const readDomSelection = useCallback(
330
+ (blockId) => {
331
+ const node = editorNodes.current.get(blockId);
332
+ const offsets = node ? selectionOffsets(node) : null;
333
+ const next = {
334
+ blockId,
335
+ start: offsets?.start ?? 0,
336
+ end: offsets?.end ?? 0
337
+ };
338
+ publishSelection(next);
339
+ return next;
340
+ },
341
+ [publishSelection]
342
+ );
343
+ const runCommit = useCallback(
344
+ (command) => {
345
+ if (!onCommit) return;
346
+ const scope = commandScopeRef.current;
347
+ const submit = () => {
348
+ const key = command.blockId;
349
+ const version = (commandVersionsRef.current.get(key) ?? 0) + 1;
350
+ commandVersionsRef.current.set(key, version);
351
+ setCommandFailure(null);
352
+ const fail = (cause) => {
353
+ if (!mountedRef.current || commandScopeRef.current !== scope || commandVersionsRef.current.get(key) !== version) {
354
+ return;
355
+ }
356
+ const error = asDocumentError(cause);
357
+ setCommandFailure({ message: error.message, retry: submit });
358
+ onCommandError?.(error);
359
+ };
360
+ let result;
361
+ try {
362
+ result = onCommit(command);
363
+ } catch (cause) {
364
+ fail(cause);
365
+ return;
366
+ }
367
+ if (!result || typeof result.then !== "function") return;
368
+ setPendingCommands((current) => current + 1);
369
+ void Promise.resolve(result).then(
370
+ () => {
371
+ if (!mountedRef.current || commandScopeRef.current !== scope) return;
372
+ setPendingCommands((current) => Math.max(0, current - 1));
373
+ },
374
+ (cause) => {
375
+ if (!mountedRef.current || commandScopeRef.current !== scope) return;
376
+ setPendingCommands((current) => Math.max(0, current - 1));
377
+ fail(cause);
378
+ }
379
+ );
380
+ };
381
+ submit();
382
+ },
383
+ [onCommandError, onCommit]
384
+ );
385
+ const commitText = useCallback(
386
+ (paragraph, text) => {
387
+ if (readOnly || paragraph.text === text) return;
388
+ paragraph.text = text;
389
+ runCommit({
390
+ kind: "text",
391
+ blockId: paragraph.id,
392
+ text,
393
+ revision: revisionToken ?? document2.revision
394
+ });
395
+ },
396
+ [document2, readOnly, revisionToken, runCommit]
397
+ );
398
+ const applyFormat = useCallback(
399
+ (property) => {
400
+ const selection = selectionRef.current;
401
+ if (readOnly || !selection) return;
402
+ let block;
403
+ try {
404
+ block = document2.resolve(selection.blockId);
405
+ } catch {
406
+ clearSelection();
407
+ return;
408
+ }
409
+ if (!isDocumentParagraph(block)) return;
410
+ const node = editorNodes.current.get(block.id);
411
+ if (node) commitText(block, node.textContent ?? "");
412
+ const current = selectionOffsets(node) ?? selection;
413
+ const start = Math.max(0, Math.min(current.start, block.text.length));
414
+ const end = Math.max(start, Math.min(current.end, block.text.length));
415
+ if (end <= start) return;
416
+ const effectiveEnd = end;
417
+ const effectiveStart = start;
418
+ const style = toggledTextStyle(block, effectiveStart, effectiveEnd, property);
419
+ block.format({ start: effectiveStart, end: effectiveEnd, style });
420
+ runCommit({
421
+ kind: "format",
422
+ blockId: block.id,
423
+ range: { start: effectiveStart, end: effectiveEnd },
424
+ style,
425
+ revision: revisionToken ?? document2.revision
426
+ });
427
+ queueMicrotask(() => restoreSelection(editorNodes.current.get(block.id), start, end));
428
+ },
429
+ [clearSelection, commitText, document2, readOnly, revisionToken, runCommit]
430
+ );
431
+ const handleEditorKeyDown = useCallback(
432
+ (event, paragraph) => {
433
+ const modifier = event.metaKey || event.ctrlKey;
434
+ if (!modifier) return;
435
+ const key = event.key.toLowerCase();
436
+ if (key !== "b" && key !== "i" && key !== "u") return;
437
+ event.preventDefault();
438
+ const current = readDomSelection(paragraph.id);
439
+ selectionRef.current = current;
440
+ const property = key === "b" ? "bold" : key === "i" ? "italic" : "underline";
441
+ const start = current.start;
442
+ const end = current.end;
443
+ if (end <= start || readOnly) return;
444
+ const effectiveStart = start;
445
+ const effectiveEnd = end;
446
+ const style = toggledTextStyle(paragraph, effectiveStart, effectiveEnd, property);
447
+ paragraph.format({ start: effectiveStart, end: effectiveEnd, style });
448
+ runCommit({
449
+ kind: "format",
450
+ blockId: paragraph.id,
451
+ range: { start: effectiveStart, end: effectiveEnd },
452
+ style,
453
+ revision: revisionToken ?? document2.revision
454
+ });
455
+ queueMicrotask(() => restoreSelection(editorNodes.current.get(paragraph.id), start, end));
456
+ },
457
+ [document2, readDomSelection, readOnly, revisionToken, runCommit]
458
+ );
459
+ const changeLayout = (next) => {
460
+ if (controlledLayout === void 0) setUncontrolledLayout(next);
461
+ onLayoutChange?.(next);
462
+ };
463
+ const addFirstParagraph = () => {
464
+ if (readOnly) return;
465
+ const paragraph = document2.blocks.addParagraph("");
466
+ setLocalRevision(document2.revision);
467
+ publishSelection({ blockId: paragraph.id, start: 0, end: 0 });
468
+ runCommit({
469
+ kind: "insert-paragraph",
470
+ blockId: paragraph.id,
471
+ revision: revisionToken ?? document2.revision
472
+ });
473
+ };
474
+ return /* @__PURE__ */ jsxs(
475
+ "div",
476
+ {
477
+ "data-og-document-editor": "",
478
+ "data-og-document-layout": layout,
479
+ "data-og-command-state": commandFailure ? "error" : pendingCommands > 0 ? "pending" : "idle",
480
+ "aria-busy": pendingCommands > 0 ? "true" : void 0,
481
+ className: cn("flex h-full min-h-0 min-w-0 flex-col bg-og-surface-2", className),
482
+ children: [
483
+ /* @__PURE__ */ jsxs(
484
+ "div",
485
+ {
486
+ role: "toolbar",
487
+ "aria-label": t("artifacts.documentEditor.documentFormatting"),
488
+ className: "flex min-h-10 shrink-0 items-center gap-1 border-b border-og-border bg-og-surface-1 px-2",
489
+ children: [
490
+ /* @__PURE__ */ jsx(
491
+ ToolbarButton,
492
+ {
493
+ label: t("artifacts.documentEditor.bold"),
494
+ shortcut: "\u2318B",
495
+ disabled: readOnly || !selectedBlockId || !hasTextSelection,
496
+ onPress: () => applyFormat("bold"),
497
+ children: /* @__PURE__ */ jsx(BoldIcon, { className: "size-4" })
498
+ }
499
+ ),
500
+ /* @__PURE__ */ jsx(
501
+ ToolbarButton,
502
+ {
503
+ label: t("artifacts.documentEditor.italic"),
504
+ shortcut: "\u2318I",
505
+ disabled: readOnly || !selectedBlockId || !hasTextSelection,
506
+ onPress: () => applyFormat("italic"),
507
+ children: /* @__PURE__ */ jsx(ItalicIcon, { className: "size-4" })
508
+ }
509
+ ),
510
+ /* @__PURE__ */ jsx(
511
+ ToolbarButton,
512
+ {
513
+ label: t("artifacts.documentEditor.underline"),
514
+ shortcut: "\u2318U",
515
+ disabled: readOnly || !selectedBlockId || !hasTextSelection,
516
+ onPress: () => applyFormat("underline"),
517
+ children: /* @__PURE__ */ jsx(UnderlineIcon, { className: "size-4" })
518
+ }
519
+ ),
520
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "mx-1 h-5 w-px bg-og-border" }),
521
+ /* @__PURE__ */ jsx(
522
+ ToolbarButton,
523
+ {
524
+ label: t("artifacts.documentEditor.continuousLayout"),
525
+ pressed: layout === "continuous",
526
+ onPress: () => changeLayout("continuous"),
527
+ children: /* @__PURE__ */ jsx(Rows3Icon, { className: "size-4" })
528
+ }
529
+ ),
530
+ /* @__PURE__ */ jsx(
531
+ ToolbarButton,
532
+ {
533
+ label: t("artifacts.documentEditor.paginatedLayout"),
534
+ pressed: layout === "paginated",
535
+ onPress: () => changeLayout("paginated"),
536
+ children: /* @__PURE__ */ jsx(Columns2Icon, { className: "size-4" })
537
+ }
538
+ ),
539
+ /* @__PURE__ */ jsxs("span", { className: "ml-auto truncate text-og-xs text-og-fg-muted", children: [
540
+ commandFailure ? t("artifacts.documentEditor.changeNotSaved") : pendingCommands > 0 ? t("artifacts.documentEditor.saving") : readOnly ? t("artifacts.documentEditor.readOnly") : t("artifacts.documentEditor.editing"),
541
+ " ",
542
+ t("artifacts.documentEditor.localestringBlocks", {
543
+ localeString: document2.blocks.items.length.toLocaleString(t.locale)
544
+ })
545
+ ] })
546
+ ]
547
+ }
548
+ ),
549
+ /* @__PURE__ */ jsx("div", { role: "status", "aria-live": "polite", className: "sr-only", children: commandFailure?.message ?? (pendingCommands > 0 ? t("artifacts.documentEditor.savingDocumentChanges") : "") }),
550
+ /* @__PURE__ */ jsxs(
551
+ "div",
552
+ {
553
+ ref: viewportRef,
554
+ role: "document",
555
+ "aria-label": ariaLabel,
556
+ "aria-readonly": readOnly,
557
+ tabIndex: -1,
558
+ onPointerDown: (event) => {
559
+ const target = event.target;
560
+ if (target instanceof Element && !target.closest("[data-og-paragraph]")) {
561
+ clearSelection();
562
+ }
563
+ },
564
+ onScroll: handleScroll,
565
+ className: cn(
566
+ "relative min-h-0 min-w-0 flex-1 overflow-auto overscroll-contain outline-hidden [overflow-anchor:none]",
567
+ layout === "paginated" ? "bg-og-surface-3" : "bg-og-surface-1"
568
+ ),
569
+ style: { height: Math.max(1, viewportHeight) },
570
+ children: [
571
+ commandFailure ? /* @__PURE__ */ jsxs(
572
+ "div",
573
+ {
574
+ role: "alert",
575
+ className: "absolute left-2 top-2 z-30 flex w-fit items-center gap-2 rounded-og-sm border border-og-status-failed/30 bg-og-surface-1/95 px-2 py-1 text-og-xs text-og-status-failed shadow-og-sm",
576
+ style: { maxWidth: "calc(100% - 1rem)" },
577
+ children: [
578
+ /* @__PURE__ */ jsx("span", { className: "truncate", children: commandFailure.message }),
579
+ /* @__PURE__ */ jsx(
580
+ "button",
581
+ {
582
+ type: "button",
583
+ onClick: commandFailure.retry,
584
+ className: "shrink-0 rounded-og-xs px-1.5 py-0.5 font-medium outline-hidden hover:bg-og-surface-3 focus-visible:ring-2 focus-visible:ring-og-accent",
585
+ children: t("artifacts.documentEditor.retry")
586
+ }
587
+ )
588
+ ]
589
+ }
590
+ ) : null,
591
+ pages.length === 0 ? /* @__PURE__ */ jsx("div", { className: "grid h-full place-items-center p-8 text-center", children: /* @__PURE__ */ jsxs("div", { children: [
592
+ /* @__PURE__ */ jsx(PilcrowIcon, { "aria-hidden": true, className: "mx-auto mb-3 size-7 text-og-fg-subtle" }),
593
+ /* @__PURE__ */ jsx("p", { className: "text-og-sm text-og-fg-muted", children: t("artifacts.documentEditor.thisDocumentIsEmpty") }),
594
+ !readOnly ? /* @__PURE__ */ jsx(
595
+ "button",
596
+ {
597
+ type: "button",
598
+ onClick: addFirstParagraph,
599
+ className: "mt-3 rounded-og-md border border-og-primary-border bg-og-primary px-3 py-1.5 text-og-sm text-og-primary-fg hover:bg-og-primary-hover focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent",
600
+ children: t("artifacts.documentEditor.startWriting")
601
+ }
602
+ ) : null
603
+ ] }) }) : /* @__PURE__ */ jsx(
604
+ "div",
605
+ {
606
+ className: "relative min-w-full",
607
+ style: {
608
+ height: axis.total,
609
+ minWidth: layout === "paginated" ? pages.reduce(
610
+ (width, page) => Math.max(
611
+ width,
612
+ page.page.widthPt * POINT_TO_CSS_PIXEL * page.renderScale + 32
613
+ ),
614
+ 0
615
+ ) : void 0
616
+ },
617
+ children: mountedIndexes.map((pageIndex) => {
618
+ const page = pages[pageIndex];
619
+ const top = axis.offsets[pageIndex];
620
+ const pageWidth = page.page.widthPt * POINT_TO_CSS_PIXEL * page.renderScale;
621
+ return /* @__PURE__ */ jsx(
622
+ "article",
623
+ {
624
+ "aria-label": `${layout === "paginated" ? t("artifacts.documentEditor.page") : t("artifacts.documentEditor.section")} ${pageIndex + 1} of ${pages.length}`,
625
+ "aria-posinset": pageIndex + 1,
626
+ "aria-setsize": pages.length,
627
+ "data-og-document-page": pageIndex + 1,
628
+ "data-og-page-width-pt": page.page.widthPt,
629
+ "data-og-page-height-pt": page.page.heightPt,
630
+ className: cn(
631
+ "absolute overflow-hidden",
632
+ layout === "paginated" ? "border shadow-og-sm" : "left-0 right-0 border-b border-og-border bg-og-surface-1 text-og-fg"
633
+ ),
634
+ style: {
635
+ top,
636
+ // Center against the visible viewport, not the shared width
637
+ // reserved for the widest section in this document.
638
+ left: layout === "paginated" ? Math.max(16, (measuredViewport.width - pageWidth) / 2) : void 0,
639
+ color: layout === "paginated" ? "#171717" : void 0,
640
+ backgroundColor: layout === "paginated" ? "#fff" : void 0,
641
+ borderColor: layout === "paginated" ? "#0000001a" : void 0,
642
+ width: layout === "paginated" ? pageWidth : void 0,
643
+ height: page.height,
644
+ containerType: layout === "continuous" ? "inline-size" : void 0
645
+ },
646
+ children: /* @__PURE__ */ jsx(
647
+ MeasuredPageBody,
648
+ {
649
+ pageKey: page.key,
650
+ measureToken: documentRevision,
651
+ onHeight: recordPageHeight,
652
+ className: cn(
653
+ layout === "paginated" ? "absolute left-0 top-0 overflow-hidden" : "mx-auto"
654
+ ),
655
+ style: {
656
+ ...pageContentStyle(page.page, layout),
657
+ maxWidth: layout === "continuous" ? "68rem" : void 0,
658
+ ...layout === "paginated" ? {
659
+ width: page.page.widthPt * POINT_TO_CSS_PIXEL,
660
+ minHeight: page.naturalHeight,
661
+ transform: `scale(${page.renderScale})`,
662
+ transformOrigin: "top left"
663
+ } : {}
664
+ },
665
+ children: page.blocks.map(({ block, listOrdinal }) => /* @__PURE__ */ jsx(
666
+ DocumentBlockView,
667
+ {
668
+ block,
669
+ viewBlockId: blockIdForView(block.id),
670
+ comments: annotations.comments.get(block.id) ?? EMPTY_COMMENTS,
671
+ changes: annotations.changes.get(block.id) ?? EMPTY_CHANGES,
672
+ projectionRevision: localRevision,
673
+ listOrdinal,
674
+ readOnly,
675
+ selected: selectedBlockId === block.id,
676
+ openThreadId,
677
+ registerEditor: (node) => {
678
+ if (node) editorNodes.current.set(block.id, node);
679
+ else editorNodes.current.delete(block.id);
680
+ },
681
+ onThreadToggle: (threadId) => setOpenThreadId((current) => current === threadId ? null : threadId),
682
+ onInput: (paragraph, text) => commitText(paragraph, text),
683
+ onBlur: () => setLocalRevision(document2.revision),
684
+ onSelection: (paragraph) => readDomSelection(paragraph.id),
685
+ onKeyDown: handleEditorKeyDown
686
+ },
687
+ block.id
688
+ ))
689
+ }
690
+ )
691
+ },
692
+ page.key
693
+ );
694
+ })
695
+ }
696
+ )
697
+ ]
698
+ }
699
+ )
700
+ ]
701
+ }
702
+ );
703
+ }
704
+ function DocumentArtifactSurface({
705
+ document: document2,
706
+ title,
707
+ showHeader,
708
+ subtitle,
709
+ busy,
710
+ className,
711
+ editorClassName,
712
+ ...editorProps
713
+ }) {
714
+ const t = useOpenGeniText();
715
+ return /* @__PURE__ */ jsx(
716
+ ArtifactSurface,
717
+ {
718
+ modality: "document",
719
+ title,
720
+ showHeader,
721
+ subtitle,
722
+ busy,
723
+ className,
724
+ children: /* @__PURE__ */ jsx(
725
+ DocumentEditor,
726
+ {
727
+ ...editorProps,
728
+ document: document2,
729
+ ariaLabel: t("artifacts.documentEditor.titleDocument", { title }),
730
+ className: editorClassName
731
+ }
732
+ )
733
+ }
734
+ );
735
+ }
736
+ function DocumentProjectionArtifactSurface({
737
+ projection,
738
+ title,
739
+ showHeader,
740
+ subtitle,
741
+ actions,
742
+ busy,
743
+ className,
744
+ editorClassName,
745
+ ...editorProps
746
+ }) {
747
+ const t = useOpenGeniText();
748
+ return /* @__PURE__ */ jsx(
749
+ ArtifactSurface,
750
+ {
751
+ modality: "document",
752
+ title,
753
+ showHeader,
754
+ subtitle,
755
+ actions,
756
+ busy,
757
+ className,
758
+ children: /* @__PURE__ */ jsx(
759
+ DocumentProjectionEditor,
760
+ {
761
+ ...editorProps,
762
+ projection,
763
+ ariaLabel: t("artifacts.documentEditor.titleDocument", { title }),
764
+ className: editorClassName
765
+ }
766
+ )
767
+ }
768
+ );
769
+ }
770
+ function MeasuredPageBody({
771
+ pageKey,
772
+ measureToken,
773
+ onHeight,
774
+ className,
775
+ style,
776
+ children
777
+ }) {
778
+ const nodeRef = useRef(null);
779
+ useLayoutEffect(() => {
780
+ const node = nodeRef.current;
781
+ if (!node) return;
782
+ const report = () => onHeight(pageKey, Math.max(node.clientHeight, node.scrollHeight));
783
+ report();
784
+ if (!globalThis.ResizeObserver) return;
785
+ const observer = new globalThis.ResizeObserver(report);
786
+ observer.observe(node);
787
+ return () => observer.disconnect();
788
+ }, [measureToken, onHeight, pageKey]);
789
+ return /* @__PURE__ */ jsx("div", { ref: nodeRef, className, style, children });
790
+ }
791
+ function DocumentBlockView({
792
+ block,
793
+ viewBlockId,
794
+ comments,
795
+ changes,
796
+ projectionRevision,
797
+ listOrdinal,
798
+ readOnly,
799
+ selected,
800
+ openThreadId,
801
+ registerEditor,
802
+ onThreadToggle,
803
+ onInput,
804
+ onBlur,
805
+ onSelection,
806
+ onKeyDown
807
+ }) {
808
+ const t = useOpenGeniText();
809
+ if (isDocumentTable(block)) {
810
+ return /* @__PURE__ */ jsx(DocumentTableView, { table: block, viewBlockId });
811
+ }
812
+ const unresolved = comments.filter((thread) => !thread.resolved);
813
+ const commentPanelOpen = comments.some((thread) => thread.id === openThreadId);
814
+ const paragraphStyle = toParagraphStyle(block);
815
+ const segments = annotateRuns(block, unresolved, changes);
816
+ const marker = block.style.list ? block.style.list.kind === "number" ? `${listOrdinal ?? 1}.` : "\u2022" : null;
817
+ return /* @__PURE__ */ jsxs(
818
+ "div",
819
+ {
820
+ "data-og-document-block": viewBlockId,
821
+ "data-og-block-kind": "paragraph",
822
+ className: cn(
823
+ "group relative flex min-h-7 min-w-0 gap-2 rounded-sm px-1 transition-colors",
824
+ selected && "bg-og-accent-soft ring-1 ring-inset ring-og-accent"
825
+ ),
826
+ children: [
827
+ marker ? /* @__PURE__ */ jsx(
828
+ "span",
829
+ {
830
+ "aria-hidden": true,
831
+ className: "w-7 shrink-0 select-none text-right opacity-70",
832
+ style: {
833
+ paddingLeft: `${(block.style.list?.level ?? 0) * 12}px`,
834
+ paddingTop: "0.1em"
835
+ },
836
+ children: marker
837
+ }
838
+ ) : null,
839
+ /* @__PURE__ */ jsx(
840
+ ParagraphLeaf,
841
+ {
842
+ paragraph: block,
843
+ viewBlockId,
844
+ segments,
845
+ paragraphStyle,
846
+ listOrdinal,
847
+ readOnly,
848
+ registerEditor,
849
+ onInput,
850
+ onBlur,
851
+ onSelection,
852
+ onKeyDown
853
+ },
854
+ `${block.id}:${projectionRevision}`
855
+ ),
856
+ comments.length > 0 || changes.length > 0 ? /* @__PURE__ */ jsxs("div", { className: "relative flex w-7 shrink-0 flex-col items-center gap-1 pt-0.5", children: [
857
+ comments.length > 0 ? /* @__PURE__ */ jsx(
858
+ "button",
859
+ {
860
+ type: "button",
861
+ "aria-label": unresolved.length > 0 ? t("artifacts.documentEditor.unresolvedComments", { count: unresolved.length }) : t("artifacts.documentEditor.resolvedComments", { count: comments.length }),
862
+ "aria-expanded": commentPanelOpen,
863
+ onClick: () => onThreadToggle((unresolved[0] ?? comments[0]).id),
864
+ className: cn(
865
+ "grid size-6 place-items-center rounded-full focus-visible:outline-hidden focus-visible:ring-2",
866
+ unresolved.length > 0 ? "bg-og-accent-soft text-og-status-waiting hover:bg-og-surface-3 focus-visible:ring-og-status-waiting" : "bg-og-surface-3 text-og-fg-muted hover:text-og-fg focus-visible:ring-og-accent"
867
+ ),
868
+ children: /* @__PURE__ */ jsx(MessageSquareTextIcon, { className: "size-3.5" })
869
+ }
870
+ ) : null,
871
+ changes.length > 0 ? /* @__PURE__ */ jsx(
872
+ "span",
873
+ {
874
+ role: "img",
875
+ "aria-label": t("artifacts.documentEditor.trackedChanges", { count: changes.length }),
876
+ className: "mt-1 h-4 w-1 rounded-full bg-og-status-idle"
877
+ }
878
+ ) : null,
879
+ commentPanelOpen ? /* @__PURE__ */ jsxs(
880
+ "aside",
881
+ {
882
+ "aria-label": t("artifacts.documentEditor.commentThread"),
883
+ className: "absolute right-0 top-8 z-20 w-64 rounded-og-md border border-og-border bg-og-surface-1 p-3 text-og-xs text-og-fg shadow-og-lg",
884
+ children: [
885
+ /* @__PURE__ */ jsx("div", { className: "mb-2 font-medium", children: comments.length === 1 ? t("artifacts.documentEditor.comment") : t("artifacts.documentEditor.lengthComments", { length: comments.length }) }),
886
+ /* @__PURE__ */ jsx("ol", { className: "max-h-72 space-y-3 overflow-y-auto", children: comments.map((thread) => /* @__PURE__ */ jsxs("li", { className: "space-y-2", children: [
887
+ /* @__PURE__ */ jsx("div", { className: "text-og-fg-muted", children: thread.resolved ? t("artifacts.documentEditor.resolved") : t("artifacts.documentEditor.open") }),
888
+ thread.replies.map((reply, index) => (
889
+ // Reply position is stable within the append-only comment thread.
890
+ // oxlint-disable-next-line react/no-array-index-key
891
+ /* @__PURE__ */ jsxs("div", { children: [
892
+ /* @__PURE__ */ jsx("div", { className: "text-og-fg-muted", children: reply.author }),
893
+ /* @__PURE__ */ jsx("div", { className: "whitespace-pre-wrap", children: reply.text })
894
+ ] }, `${reply.createdAt}:${index}`)
895
+ ))
896
+ ] }, thread.id)) })
897
+ ]
898
+ }
899
+ ) : null
900
+ ] }) : null
901
+ ]
902
+ }
903
+ );
904
+ }
905
+ var ParagraphLeaf = memo(
906
+ function ParagraphLeaf2({
907
+ paragraph,
908
+ viewBlockId,
909
+ segments,
910
+ paragraphStyle,
911
+ listOrdinal,
912
+ readOnly,
913
+ registerEditor,
914
+ onInput,
915
+ onBlur,
916
+ onSelection,
917
+ onKeyDown
918
+ }) {
919
+ const t = useOpenGeniText();
920
+ const composing = useRef(false);
921
+ const suppressNextEnter = useRef(false);
922
+ const Tag = headingTag(paragraph.style.headingLevel);
923
+ const label = paragraph.style.list?.kind === "number" ? t("artifacts.documentEditor.numberedListItemListordinal", {
924
+ listOrdinal: listOrdinal ?? 1
925
+ }) : paragraph.style.list?.kind === "bullet" ? t("artifacts.documentEditor.bulletListItem") : paragraph.style.headingLevel ? t("artifacts.documentEditor.headingHeadinglevel", {
926
+ headingLevel: paragraph.style.headingLevel
927
+ }) : t("artifacts.documentEditor.paragraph");
928
+ return /* @__PURE__ */ jsxs(
929
+ Tag,
930
+ {
931
+ ref: registerEditor,
932
+ contentEditable: !readOnly,
933
+ suppressContentEditableWarning: true,
934
+ tabIndex: readOnly ? 0 : void 0,
935
+ role: !readOnly && !paragraph.style.headingLevel ? "textbox" : void 0,
936
+ "aria-label": label,
937
+ "aria-multiline": !readOnly || void 0,
938
+ "aria-readonly": readOnly,
939
+ spellCheck: !readOnly,
940
+ "data-og-paragraph": viewBlockId,
941
+ onFocus: () => onSelection(paragraph),
942
+ onSelect: () => onSelection(paragraph),
943
+ onKeyUp: () => onSelection(paragraph),
944
+ onMouseUp: () => onSelection(paragraph),
945
+ onCompositionStart: () => {
946
+ composing.current = true;
947
+ },
948
+ onCompositionEnd: (event) => {
949
+ composing.current = false;
950
+ suppressNextEnter.current = true;
951
+ queueMicrotask(() => {
952
+ suppressNextEnter.current = false;
953
+ });
954
+ syncTrailingBreak(event.currentTarget);
955
+ stabilizeCaretAfterTrailingNewline(event.currentTarget);
956
+ onInput(paragraph, event.currentTarget.textContent ?? "");
957
+ onSelection(paragraph);
958
+ },
959
+ onPaste: (event) => {
960
+ if (readOnly) return;
961
+ event.preventDefault();
962
+ const text = event.clipboardData.getData("text/plain").slice(0, MAX_PLAIN_TEXT_TRANSFER);
963
+ if (!text) return;
964
+ insertPlainText(event.currentTarget, text);
965
+ onInput(paragraph, event.currentTarget.textContent ?? "");
966
+ onSelection(paragraph);
967
+ },
968
+ onDragOver: (event) => {
969
+ if (!readOnly) event.preventDefault();
970
+ },
971
+ onDrop: (event) => {
972
+ if (!readOnly) event.preventDefault();
973
+ },
974
+ onKeyDown: (event) => {
975
+ onKeyDown(event, paragraph);
976
+ if (event.defaultPrevented || readOnly) return;
977
+ if (event.key !== "Enter" || event.metaKey || event.ctrlKey || event.altKey) return;
978
+ if (isDocumentImeComposing(event, composing.current)) return;
979
+ event.preventDefault();
980
+ if (suppressNextEnter.current) return;
981
+ insertPlainText(event.currentTarget, "\n");
982
+ onInput(paragraph, event.currentTarget.textContent ?? "");
983
+ onSelection(paragraph);
984
+ },
985
+ onInput: (event) => {
986
+ if (!composing.current && !event.nativeEvent.isComposing) {
987
+ syncTrailingBreak(event.currentTarget);
988
+ stabilizeCaretAfterTrailingNewline(event.currentTarget);
989
+ onInput(paragraph, event.currentTarget.textContent ?? "");
990
+ }
991
+ },
992
+ onBlur,
993
+ className: cn(
994
+ "min-w-0 flex-1 whitespace-pre-wrap break-words rounded-sm outline-hidden",
995
+ !readOnly && "cursor-text focus-visible:ring-2 focus-visible:ring-og-accent"
996
+ ),
997
+ style: paragraphStyle,
998
+ children: [
999
+ segments.map((segment, index) => /* @__PURE__ */ jsx(
1000
+ "span",
1001
+ {
1002
+ "data-og-commented": segment.commented || void 0,
1003
+ "data-og-change": segment.changeKind,
1004
+ style: segment.style,
1005
+ children: segment.text
1006
+ },
1007
+ `${segment.start}:${index}`
1008
+ )),
1009
+ segments.at(-1)?.text.endsWith("\n") ? /* @__PURE__ */ jsx("br", { "data-og-trailing-break": "", "aria-hidden": "true" }) : null
1010
+ ]
1011
+ }
1012
+ );
1013
+ },
1014
+ (previous, next) => {
1015
+ if (next.readOnly || previous.viewBlockId !== next.viewBlockId) return false;
1016
+ const active = globalThis.document?.activeElement;
1017
+ return active instanceof HTMLElement && active.dataset.ogParagraph === next.viewBlockId;
1018
+ }
1019
+ );
1020
+ function DocumentTableView({
1021
+ table,
1022
+ viewBlockId
1023
+ }) {
1024
+ const columnWidths = table.style.columnWidthsPt;
1025
+ const headerColor = tableHeaderTextColor(table.style.headerFill);
1026
+ return /* @__PURE__ */ jsx(
1027
+ "div",
1028
+ {
1029
+ "data-og-document-block": viewBlockId,
1030
+ "data-og-block-kind": "table",
1031
+ className: "w-full max-w-full overflow-x-auto py-2",
1032
+ children: /* @__PURE__ */ jsxs(
1033
+ "table",
1034
+ {
1035
+ className: "w-full border-collapse text-left",
1036
+ style: {
1037
+ fontSize: "0.92em",
1038
+ width: table.style.widthPt ? `${table.style.widthPt}pt` : void 0
1039
+ },
1040
+ children: [
1041
+ columnWidths ? /* @__PURE__ */ jsx("colgroup", { children: columnWidths.map((width, index) => (
1042
+ // Column position is its identity in the document table model.
1043
+ // oxlint-disable-next-line react/no-array-index-key
1044
+ /* @__PURE__ */ jsx("col", { style: { width: `${width}pt` } }, index)
1045
+ )) }) : null,
1046
+ /* @__PURE__ */ jsx("tbody", { children: table.rows.map((row, rowIndex) => (
1047
+ // Row position is its identity in the document table model.
1048
+ // oxlint-disable-next-line react/no-array-index-key
1049
+ /* @__PURE__ */ jsx("tr", { children: row.map((cell, columnIndex) => {
1050
+ const header = rowIndex < (table.style.headerRows ?? 0);
1051
+ const Cell = header ? "th" : "td";
1052
+ return /* @__PURE__ */ jsx(
1053
+ Cell,
1054
+ {
1055
+ scope: header ? "col" : void 0,
1056
+ className: cn("border align-middle", header && "font-semibold"),
1057
+ style: {
1058
+ borderColor: table.style.borderColor ?? "#d1d5db",
1059
+ background: header ? table.style.headerFill ?? "#f3f4f6" : void 0,
1060
+ // An explicitly colored run still owns its authored text style.
1061
+ color: header ? headerColor : void 0,
1062
+ padding: `${table.style.cellPaddingPt ?? 6}pt`
1063
+ },
1064
+ children: cell.map((run, index) => (
1065
+ // Run position is stable within the immutable cell projection.
1066
+ // oxlint-disable-next-line react/no-array-index-key
1067
+ /* @__PURE__ */ jsx("span", { style: toRunStyle(run.style), children: run.text }, index)
1068
+ ))
1069
+ },
1070
+ columnIndex
1071
+ );
1072
+ }) }, rowIndex)
1073
+ )) })
1074
+ ]
1075
+ }
1076
+ )
1077
+ }
1078
+ );
1079
+ }
1080
+ function tableHeaderTextColor(fill) {
1081
+ if (!fill) return "#171717";
1082
+ const hex = /^#([\da-f]{3}|[\da-f]{6}|[\da-f]{8})$/i.exec(fill)?.[1];
1083
+ if (!hex) return void 0;
1084
+ const channels = hex.length === 3 ? [...hex].map((digit) => Number.parseInt(digit + digit, 16)) : [0, 2, 4].map((index) => Number.parseInt(hex.slice(index, index + 2), 16));
1085
+ const alpha = hex.length === 8 ? Number.parseInt(hex.slice(6), 16) / 255 : 1;
1086
+ const luminanceOn = (backdrop) => {
1087
+ const linear = channels.map((channel) => {
1088
+ const normalized = (channel * alpha + backdrop * (1 - alpha)) / 255;
1089
+ return normalized <= 0.04045 ? normalized / 12.92 : ((normalized + 0.055) / 1.055) ** 2.4;
1090
+ });
1091
+ return linear[0] * 0.2126 + linear[1] * 0.7152 + linear[2] * 0.0722;
1092
+ };
1093
+ const backdrops = alpha < 1 ? [luminanceOn(0), luminanceOn(255)] : [luminanceOn(255)];
1094
+ const darkTextLuminance = ((23 / 255 + 0.055) / 1.055) ** 2.4;
1095
+ const whiteContrast = Math.min(...backdrops.map((value) => 1.05 / (value + 0.05)));
1096
+ const darkContrast = Math.min(
1097
+ ...backdrops.map(
1098
+ (value) => (Math.max(value, darkTextLuminance) + 0.05) / (Math.min(value, darkTextLuminance) + 0.05)
1099
+ )
1100
+ );
1101
+ if (Math.max(whiteContrast, darkContrast) < 4.5) {
1102
+ return alpha < 1 ? void 0 : "#000";
1103
+ }
1104
+ return whiteContrast > darkContrast ? "#fff" : "#171717";
1105
+ }
1106
+ function ToolbarButton({
1107
+ label,
1108
+ shortcut,
1109
+ pressed,
1110
+ disabled,
1111
+ onPress,
1112
+ children
1113
+ }) {
1114
+ return /* @__PURE__ */ jsx(
1115
+ "button",
1116
+ {
1117
+ type: "button",
1118
+ "aria-label": label,
1119
+ "aria-pressed": pressed,
1120
+ title: shortcut ? `${label} (${shortcut})` : label,
1121
+ disabled,
1122
+ onMouseDown: (event) => event.preventDefault(),
1123
+ onClick: onPress,
1124
+ className: cn(
1125
+ "grid size-7 place-items-center rounded-og-sm text-og-fg-muted outline-hidden transition-colors hover:bg-og-surface-3 hover:text-og-fg focus-visible:ring-2 focus-visible:ring-og-accent disabled:pointer-events-none disabled:opacity-40",
1126
+ pressed && "bg-og-surface-3 text-og-fg"
1127
+ ),
1128
+ children
1129
+ }
1130
+ );
1131
+ }
1132
+ function projectPages(document2, layout) {
1133
+ const pages = [];
1134
+ const sections = document2.sections.items;
1135
+ let sectionIndex = 0;
1136
+ let pageGeometry = sections[0]?.page ?? document2.page;
1137
+ let blocks = [];
1138
+ let used = 0;
1139
+ let pageIndex = 0;
1140
+ let numberOrdinal = 0;
1141
+ const flush = (force = false) => {
1142
+ if (blocks.length === 0 && !force) return;
1143
+ const physicalPageHeight = pageGeometry.heightPt * POINT_TO_CSS_PIXEL;
1144
+ const pageVerticalChrome = (pageGeometry.marginTopPt + pageGeometry.marginBottomPt) * POINT_TO_CSS_PIXEL;
1145
+ pages.push({
1146
+ key: `${layout}:${sections[sectionIndex]?.id ?? "default"}:${pageIndex++}:${blocks[0]?.block.id ?? "blank"}`,
1147
+ blocks,
1148
+ height: layout === "paginated" ? Math.max(physicalPageHeight, used + pageVerticalChrome) : Math.max(1, used + 48),
1149
+ minimumHeight: layout === "paginated" ? physicalPageHeight : 1,
1150
+ page: { ...pageGeometry }
1151
+ });
1152
+ blocks = [];
1153
+ used = 0;
1154
+ };
1155
+ for (let blockIndex = 0; blockIndex < document2.blocks.items.length; blockIndex += 1) {
1156
+ while (sectionIndex + 1 < sections.length && sections[sectionIndex + 1].startBlockIndex <= blockIndex) {
1157
+ flush();
1158
+ sectionIndex += 1;
1159
+ pageGeometry = sections[sectionIndex].page;
1160
+ }
1161
+ const block = document2.blocks.items[blockIndex];
1162
+ if (isDocumentPageBreak(block)) {
1163
+ flush(true);
1164
+ numberOrdinal = 0;
1165
+ continue;
1166
+ }
1167
+ if (isDocumentParagraph(block) && block.style.pageBreakBefore) flush();
1168
+ const height = estimateBlockHeight(block);
1169
+ const physicalPageHeight = pageGeometry.heightPt * POINT_TO_CSS_PIXEL;
1170
+ const usableHeight = Math.max(
1171
+ 120,
1172
+ physicalPageHeight - (pageGeometry.marginTopPt + pageGeometry.marginBottomPt) * POINT_TO_CSS_PIXEL
1173
+ );
1174
+ const targetHeight = layout === "paginated" ? usableHeight : Math.max(560, usableHeight);
1175
+ if (blocks.length > 0 && used + height > targetHeight) flush();
1176
+ if (isDocumentParagraph(block) && block.style.list?.kind === "number") {
1177
+ numberOrdinal += 1;
1178
+ } else {
1179
+ numberOrdinal = 0;
1180
+ }
1181
+ blocks.push({
1182
+ block,
1183
+ height,
1184
+ listOrdinal: isDocumentParagraph(block) && block.style.list?.kind === "number" ? numberOrdinal : void 0
1185
+ });
1186
+ used += height;
1187
+ }
1188
+ flush();
1189
+ return pages;
1190
+ }
1191
+ function indexAnnotations(document2) {
1192
+ const comments = /* @__PURE__ */ new Map();
1193
+ const changes = /* @__PURE__ */ new Map();
1194
+ for (const thread of document2.comments.items) {
1195
+ const items = comments.get(thread.blockId);
1196
+ if (items) items.push(thread);
1197
+ else comments.set(thread.blockId, [thread]);
1198
+ }
1199
+ for (const change of document2.changes.items) {
1200
+ const items = changes.get(change.blockId);
1201
+ if (items) items.push(change);
1202
+ else changes.set(change.blockId, [change]);
1203
+ }
1204
+ return { comments, changes };
1205
+ }
1206
+ function estimateBlockHeight(block) {
1207
+ if (isDocumentTable(block)) {
1208
+ return Math.max(48, block.rows.length * 38 + 16);
1209
+ }
1210
+ const fontSize = block.runs.reduce(
1211
+ (largest, run) => Math.max(largest, run.style.fontSizePt ?? 11),
1212
+ block.style.headingLevel ? Math.max(14, 26 - block.style.headingLevel * 2) : 11
1213
+ );
1214
+ const lineHeight = fontSize * POINT_TO_CSS_PIXEL * (block.style.lineHeight ?? 1.35);
1215
+ const lines = Math.max(
1216
+ 1,
1217
+ block.text.split("\n").reduce((total, line) => total + Math.max(1, Math.ceil(line.length / 72)), 0)
1218
+ );
1219
+ return Math.max(
1220
+ 28,
1221
+ lines * lineHeight + ((block.style.spaceBeforePt ?? 2) + (block.style.spaceAfterPt ?? 6)) * POINT_TO_CSS_PIXEL
1222
+ );
1223
+ }
1224
+ function buildPageAxis(pages, gap) {
1225
+ const offsets = new Float64Array(pages.length + 1);
1226
+ for (let index = 0; index < pages.length; index += 1) {
1227
+ offsets[index + 1] = offsets[index] + pages[index].height + gap;
1228
+ }
1229
+ return { offsets, total: Math.max(1, (offsets[pages.length] ?? 0) - gap) };
1230
+ }
1231
+ function pageAtOffset(axis, count, offset) {
1232
+ if (count <= 1) return 0;
1233
+ let low = 0;
1234
+ let high = count;
1235
+ while (low < high) {
1236
+ const middle = low + high >>> 1;
1237
+ if (axis.offsets[middle + 1] <= offset) low = middle + 1;
1238
+ else high = middle;
1239
+ }
1240
+ return Math.max(0, Math.min(count - 1, low));
1241
+ }
1242
+ function visiblePageIndexes(axis, count, scrollTop, viewportHeight, overscan, required) {
1243
+ if (count === 0) return [];
1244
+ const start = Math.max(0, pageAtOffset(axis, count, scrollTop) - overscan);
1245
+ const end = Math.min(count, pageAtOffset(axis, count, scrollTop + viewportHeight) + overscan + 1);
1246
+ const indexes = Array.from({ length: end - start }, (_, index) => start + index);
1247
+ if (required >= 0 && (required < start || required >= end)) indexes.push(required);
1248
+ return indexes.sort((left, right) => left - right);
1249
+ }
1250
+ function responsiveDocumentPageScale(page, viewportWidth) {
1251
+ if (viewportWidth <= 0) return 1;
1252
+ const naturalWidth = page.widthPt * POINT_TO_CSS_PIXEL;
1253
+ return Math.min(1, Math.max(0.75, (viewportWidth - 32) / naturalWidth));
1254
+ }
1255
+ function pageContentStyle(page, layout) {
1256
+ if (layout === "continuous") {
1257
+ return {
1258
+ padding: "24px clamp(12px, 4cqw, 72px)"
1259
+ };
1260
+ }
1261
+ return {
1262
+ paddingTop: `${page.marginTopPt * POINT_TO_CSS_PIXEL}px`,
1263
+ paddingRight: `${page.marginRightPt * POINT_TO_CSS_PIXEL}px`,
1264
+ paddingBottom: `${page.marginBottomPt * POINT_TO_CSS_PIXEL}px`,
1265
+ paddingLeft: `${page.marginLeftPt * POINT_TO_CSS_PIXEL}px`
1266
+ };
1267
+ }
1268
+ function headingTag(level) {
1269
+ if (!level) return "p";
1270
+ return `h${Math.max(1, Math.min(6, level))}`;
1271
+ }
1272
+ function toParagraphStyle(paragraph) {
1273
+ const firstRun = paragraph.runs[0];
1274
+ return {
1275
+ textAlign: paragraph.style.alignment,
1276
+ marginTop: `${paragraph.style.spaceBeforePt ?? 0}pt`,
1277
+ marginBottom: `${paragraph.style.spaceAfterPt ?? 0}pt`,
1278
+ lineHeight: paragraph.style.lineHeight ?? 1.35,
1279
+ breakBefore: paragraph.style.pageBreakBefore ? "page" : void 0,
1280
+ fontFamily: firstRun?.style.fontFamily,
1281
+ fontSize: firstRun?.style.fontSizePt ? `${firstRun.style.fontSizePt}pt` : void 0,
1282
+ fontWeight: paragraph.style.headingLevel ? 650 : void 0
1283
+ };
1284
+ }
1285
+ function toRunStyle(style) {
1286
+ return {
1287
+ fontFamily: style.fontFamily,
1288
+ fontSize: style.fontSizePt ? `${style.fontSizePt}pt` : void 0,
1289
+ color: style.color,
1290
+ fontWeight: style.bold ? 700 : void 0,
1291
+ fontStyle: style.italic ? "italic" : void 0,
1292
+ textDecoration: [style.underline ? "underline" : "", style.strike ? "line-through" : ""].filter(Boolean).join(" ") || void 0
1293
+ };
1294
+ }
1295
+ function annotateRuns(paragraph, comments, changes) {
1296
+ const segments = [];
1297
+ let runStart = 0;
1298
+ for (const run of paragraph.runs) {
1299
+ const runEnd = runStart + run.text.length;
1300
+ const boundaries = /* @__PURE__ */ new Set([runStart, runEnd]);
1301
+ for (const annotation of [...comments, ...changes]) {
1302
+ if (annotation.start > runStart && annotation.start < runEnd)
1303
+ boundaries.add(annotation.start);
1304
+ if (annotation.end > runStart && annotation.end < runEnd) boundaries.add(annotation.end);
1305
+ }
1306
+ const ordered = [...boundaries].sort((left, right) => left - right);
1307
+ for (let index = 0; index < ordered.length - 1; index += 1) {
1308
+ const start = ordered[index];
1309
+ const end = ordered[index + 1];
1310
+ const commented = comments.some((comment) => comment.start < end && comment.end > start);
1311
+ const change = changes.find((item) => item.start < end && item.end > start);
1312
+ const baseStyle = toRunStyle(run.style);
1313
+ segments.push({
1314
+ text: run.text.slice(start - runStart, end - runStart),
1315
+ start,
1316
+ commented,
1317
+ changeKind: change?.kind,
1318
+ style: {
1319
+ ...baseStyle,
1320
+ backgroundColor: commented ? "color-mix(in oklch, var(--og-color-status-waiting) 18%, transparent)" : void 0,
1321
+ textDecoration: change?.kind === "delete" ? "line-through" : change?.kind === "insert" ? "underline" : baseStyle.textDecoration,
1322
+ textDecorationColor: change?.kind === "delete" ? "var(--og-color-status-failed)" : change?.kind === "insert" ? "var(--og-color-status-idle)" : void 0
1323
+ }
1324
+ });
1325
+ }
1326
+ runStart = runEnd;
1327
+ }
1328
+ if (segments.length === 0) {
1329
+ segments.push({ text: "", start: 0, style: {}, commented: false });
1330
+ }
1331
+ return segments;
1332
+ }
1333
+ function selectionOffsets(root) {
1334
+ if (!root) return null;
1335
+ const selection = globalThis.getSelection?.();
1336
+ if (!selection || selection.rangeCount === 0) return null;
1337
+ const range = selection.getRangeAt(0);
1338
+ if (!root.contains(range.startContainer) || !root.contains(range.endContainer)) return null;
1339
+ const beforeStart = range.cloneRange();
1340
+ beforeStart.selectNodeContents(root);
1341
+ beforeStart.setEnd(range.startContainer, range.startOffset);
1342
+ const beforeEnd = range.cloneRange();
1343
+ beforeEnd.selectNodeContents(root);
1344
+ beforeEnd.setEnd(range.endContainer, range.endOffset);
1345
+ return {
1346
+ start: beforeStart.toString().length,
1347
+ end: beforeEnd.toString().length
1348
+ };
1349
+ }
1350
+ var TRAILING_BREAK_ATTR = "data-og-trailing-break";
1351
+ function isDocumentImeComposing(event, composing) {
1352
+ const native = event.nativeEvent;
1353
+ return composing || native.isComposing === true || native.keyCode === 229;
1354
+ }
1355
+ function syncTrailingBreak(root) {
1356
+ const existing = root.querySelector(`br[${TRAILING_BREAK_ATTR}]`);
1357
+ const needsBreak = (root.textContent ?? "").endsWith("\n");
1358
+ if (needsBreak && !existing) {
1359
+ const br = globalThis.document.createElement("br");
1360
+ br.setAttribute(TRAILING_BREAK_ATTR, "");
1361
+ br.setAttribute("aria-hidden", "true");
1362
+ root.appendChild(br);
1363
+ } else if (!needsBreak && existing) {
1364
+ existing.remove();
1365
+ }
1366
+ }
1367
+ function stabilizeCaretAfterTrailingNewline(root) {
1368
+ const text = root.textContent ?? "";
1369
+ if (!text.endsWith("\n")) return;
1370
+ const selection = globalThis.getSelection?.();
1371
+ if (!selection || selection.rangeCount === 0 || !selection.isCollapsed) return;
1372
+ const offsets = selectionOffsets(root);
1373
+ if (!offsets || offsets.start !== text.length) return;
1374
+ const br = root.querySelector(`br[${TRAILING_BREAK_ATTR}]`);
1375
+ if (!br) return;
1376
+ const range = globalThis.document.createRange();
1377
+ range.setStartBefore(br);
1378
+ range.collapse(true);
1379
+ selection.removeAllRanges();
1380
+ selection.addRange(range);
1381
+ }
1382
+ function insertPlainText(root, text) {
1383
+ const selection = globalThis.getSelection?.();
1384
+ if (!selection || selection.rangeCount === 0) return;
1385
+ const range = selection.getRangeAt(0);
1386
+ if (!root.contains(range.startContainer) || !root.contains(range.endContainer)) return;
1387
+ range.deleteContents();
1388
+ const node = globalThis.document.createTextNode(text);
1389
+ range.insertNode(node);
1390
+ syncTrailingBreak(root);
1391
+ range.setStartAfter(node);
1392
+ range.collapse(true);
1393
+ selection.removeAllRanges();
1394
+ selection.addRange(range);
1395
+ stabilizeCaretAfterTrailingNewline(root);
1396
+ }
1397
+ function restoreSelection(root, requestedStart, requestedEnd) {
1398
+ if (!root || !globalThis.getSelection) return;
1399
+ const textLength = root.textContent?.length ?? 0;
1400
+ const start = Math.max(0, Math.min(requestedStart, textLength));
1401
+ const end = Math.max(start, Math.min(requestedEnd, textLength));
1402
+ const startPoint = textPointAt(root, start);
1403
+ const endPoint = textPointAt(root, end);
1404
+ if (!startPoint || !endPoint) return;
1405
+ const range = document.createRange();
1406
+ range.setStart(startPoint.node, startPoint.offset);
1407
+ range.setEnd(endPoint.node, endPoint.offset);
1408
+ const domSelection = globalThis.getSelection();
1409
+ domSelection?.removeAllRanges();
1410
+ domSelection?.addRange(range);
1411
+ }
1412
+ function textPointAt(root, target) {
1413
+ const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);
1414
+ let remaining = target;
1415
+ let node = walker.nextNode();
1416
+ while (node) {
1417
+ const length = node.textContent?.length ?? 0;
1418
+ if (remaining <= length) return { node, offset: remaining };
1419
+ remaining -= length;
1420
+ node = walker.nextNode();
1421
+ }
1422
+ return { node: root, offset: root.childNodes.length };
1423
+ }
1424
+ function toggledTextStyle(paragraph, start, end, property) {
1425
+ let allEnabled = end > start;
1426
+ let offset = 0;
1427
+ for (const run of paragraph.runs) {
1428
+ const runEnd = offset + run.text.length;
1429
+ if (runEnd > start && offset < end && run.style[property] !== true) {
1430
+ allEnabled = false;
1431
+ break;
1432
+ }
1433
+ offset = runEnd;
1434
+ }
1435
+ return { [property]: !allEnabled };
1436
+ }
1437
+ function documentViewFromProjection(projection) {
1438
+ if (projection.blocks.length > MAX_PROJECTION_BLOCKS) {
1439
+ throw new Error(`Document projection exceeds ${MAX_PROJECTION_BLOCKS} blocks`);
1440
+ }
1441
+ if ((projection.comments?.length ?? 0) > MAX_PROJECTION_ANNOTATIONS || (projection.changes?.length ?? 0) > MAX_PROJECTION_ANNOTATIONS) {
1442
+ throw new Error(`Document projection exceeds ${MAX_PROJECTION_ANNOTATIONS} annotations`);
1443
+ }
1444
+ const sections = [...projection.sections ?? []].sort(
1445
+ (left, right) => left.startBlockIndex - right.startBlockIndex
1446
+ );
1447
+ if (sections.some(
1448
+ (section, index) => section.startBlockIndex < 0 || index > 0 && section.startBlockIndex <= sections[index - 1].startBlockIndex
1449
+ )) {
1450
+ throw new Error("Document projection sections must have unique increasing block indexes");
1451
+ }
1452
+ const firstPage = sections[0]?.startBlockIndex === 0 ? sections[0].page : projection.page;
1453
+ validateProjectionPage(firstPage);
1454
+ const externalIdByInternal = /* @__PURE__ */ new Map();
1455
+ const paragraphByExternal = /* @__PURE__ */ new Map();
1456
+ const objects = /* @__PURE__ */ new Map();
1457
+ const blocks = [];
1458
+ const documentSections = [];
1459
+ const comments = [];
1460
+ const changes = [];
1461
+ const seenIds = /* @__PURE__ */ new Set();
1462
+ const remember = (internalId, externalId, value) => {
1463
+ if (!externalId || seenIds.has(externalId)) {
1464
+ throw new Error(`Document projection contains an invalid or duplicate id: ${externalId}`);
1465
+ }
1466
+ seenIds.add(externalId);
1467
+ externalIdByInternal.set(internalId, externalId);
1468
+ objects.set(internalId, value);
1469
+ };
1470
+ let revision = 0;
1471
+ let localParagraphId = 0;
1472
+ const changed = () => {
1473
+ revision += 1;
1474
+ };
1475
+ const document2 = {
1476
+ get revision() {
1477
+ return revision;
1478
+ },
1479
+ page: copyDocumentPage(firstPage),
1480
+ blocks: {
1481
+ items: blocks,
1482
+ addParagraph(text = "") {
1483
+ let id;
1484
+ do {
1485
+ localParagraphId += 1;
1486
+ id = `projection-paragraph-${localParagraphId}`;
1487
+ } while (objects.has(id));
1488
+ const paragraph = new ProjectionParagraphView(id, [{ text, style: {} }], {}, changed);
1489
+ blocks.push(paragraph);
1490
+ objects.set(id, paragraph);
1491
+ changed();
1492
+ return paragraph;
1493
+ }
1494
+ },
1495
+ sections: { items: documentSections },
1496
+ comments: { items: comments },
1497
+ changes: { items: changes },
1498
+ resolve(id) {
1499
+ const value = objects.get(id);
1500
+ if (!value) throw new Error(`Unknown document object id: ${id}`);
1501
+ return value;
1502
+ }
1503
+ };
1504
+ let sectionIndex = sections[0]?.startBlockIndex === 0 ? 1 : 0;
1505
+ if (sections[0]?.startBlockIndex === 0) {
1506
+ const projectedSection = sections[0];
1507
+ validateProjectionPage(projectedSection.page);
1508
+ const section = {
1509
+ ...projectedSection,
1510
+ page: copyDocumentPage(projectedSection.page)
1511
+ };
1512
+ documentSections.push(section);
1513
+ remember(section.id, projectedSection.id, section);
1514
+ } else {
1515
+ documentSections.push({
1516
+ id: "projection-default-section",
1517
+ startBlockIndex: 0,
1518
+ page: copyDocumentPage(firstPage)
1519
+ });
1520
+ }
1521
+ for (let blockIndex = 0; blockIndex < projection.blocks.length; blockIndex += 1) {
1522
+ while (sections[sectionIndex]?.startBlockIndex === blockIndex) {
1523
+ const projectedSection = sections[sectionIndex];
1524
+ validateProjectionPage(projectedSection.page);
1525
+ const section = {
1526
+ ...projectedSection,
1527
+ page: copyDocumentPage(projectedSection.page)
1528
+ };
1529
+ documentSections.push(section);
1530
+ remember(section.id, projectedSection.id, section);
1531
+ sectionIndex += 1;
1532
+ }
1533
+ const projectedBlock = projection.blocks[blockIndex];
1534
+ if (projectedBlock.kind === "paragraph") {
1535
+ const paragraph = new ProjectionParagraphView(
1536
+ projectedBlock.id,
1537
+ projectedBlock.runs.length > 0 ? projectedBlock.runs.map((run) => ({
1538
+ text: run.text.slice(0, MAX_PROJECTION_TEXT),
1539
+ style: { ...run.style ?? {} }
1540
+ })) : [{ text: "", style: {} }],
1541
+ { ...projectedBlock.style ?? {} },
1542
+ changed
1543
+ );
1544
+ blocks.push(paragraph);
1545
+ remember(paragraph.id, projectedBlock.id, paragraph);
1546
+ paragraphByExternal.set(projectedBlock.id, paragraph);
1547
+ } else if (projectedBlock.kind === "table") {
1548
+ const columns = projectedBlock.rows.reduce(
1549
+ (maximum, row) => Math.max(maximum, row.length),
1550
+ 0
1551
+ );
1552
+ if (projectedBlock.rows.length === 0 || columns === 0 || projectedBlock.rows.some((row) => row.length !== columns)) {
1553
+ throw new Error(`Document table ${projectedBlock.id} must be a non-empty rectangle`);
1554
+ }
1555
+ if (projectedBlock.rows.length * columns > MAX_PROJECTION_TABLE_CELLS) {
1556
+ throw new Error(`Document table ${projectedBlock.id} exceeds the projected cell limit`);
1557
+ }
1558
+ const table = {
1559
+ kind: "table",
1560
+ id: projectedBlock.id,
1561
+ rows: projectedBlock.rows.map(
1562
+ (row) => row.map(
1563
+ (cell) => cell.length > 0 ? cell.map((run) => ({
1564
+ text: run.text.slice(0, MAX_PROJECTION_TEXT),
1565
+ style: { ...run.style ?? {} }
1566
+ })) : [{ text: "", style: {} }]
1567
+ )
1568
+ ),
1569
+ style: { ...projectedBlock.style ?? {} }
1570
+ };
1571
+ blocks.push(table);
1572
+ remember(table.id, projectedBlock.id, table);
1573
+ } else {
1574
+ const pageBreak = {
1575
+ kind: "pageBreak",
1576
+ id: projectedBlock.id
1577
+ };
1578
+ blocks.push(pageBreak);
1579
+ remember(pageBreak.id, projectedBlock.id, pageBreak);
1580
+ }
1581
+ }
1582
+ while (sections[sectionIndex]?.startBlockIndex === projection.blocks.length) {
1583
+ const projectedSection = sections[sectionIndex];
1584
+ validateProjectionPage(projectedSection.page);
1585
+ const section = {
1586
+ ...projectedSection,
1587
+ page: copyDocumentPage(projectedSection.page)
1588
+ };
1589
+ documentSections.push(section);
1590
+ remember(section.id, projectedSection.id, section);
1591
+ sectionIndex += 1;
1592
+ }
1593
+ if (sectionIndex < sections.length) {
1594
+ throw new Error("Document projection section starts beyond the projected blocks");
1595
+ }
1596
+ for (const projected of projection.comments ?? []) {
1597
+ const paragraph = paragraphByExternal.get(projected.blockId);
1598
+ const first = projected.replies[0];
1599
+ if (!paragraph || !first) continue;
1600
+ if (!Number.isSafeInteger(projected.start) || !Number.isSafeInteger(projected.end) || projected.start < 0 || projected.end < projected.start || projected.end > paragraph.text.length) {
1601
+ throw new Error(`Document comment ${projected.id} has an invalid range`);
1602
+ }
1603
+ const thread = {
1604
+ ...projected,
1605
+ replies: projected.replies.map((reply) => ({ ...reply }))
1606
+ };
1607
+ comments.push(thread);
1608
+ remember(thread.id, projected.id, thread);
1609
+ }
1610
+ for (const projected of projection.changes ?? []) {
1611
+ const paragraph = paragraphByExternal.get(projected.blockId);
1612
+ if (!paragraph) continue;
1613
+ if (!Number.isSafeInteger(projected.start) || !Number.isSafeInteger(projected.end) || projected.start < 0 || projected.end <= projected.start || projected.end > paragraph.text.length) {
1614
+ throw new Error(`Document tracked change ${projected.id} has an invalid range`);
1615
+ }
1616
+ const change = { ...projected };
1617
+ changes.push(change);
1618
+ remember(change.id, projected.id, change);
1619
+ }
1620
+ return { document: document2, externalIdByInternal };
1621
+ }
1622
+ function copyDocumentPage(page) {
1623
+ return {
1624
+ widthPt: page.widthPt,
1625
+ heightPt: page.heightPt,
1626
+ marginTopPt: page.marginTopPt,
1627
+ marginRightPt: page.marginRightPt,
1628
+ marginBottomPt: page.marginBottomPt,
1629
+ marginLeftPt: page.marginLeftPt,
1630
+ ...page.headerPt === void 0 ? {} : { headerPt: page.headerPt },
1631
+ ...page.footerPt === void 0 ? {} : { footerPt: page.footerPt },
1632
+ ...page.gutterPt === void 0 ? {} : { gutterPt: page.gutterPt }
1633
+ };
1634
+ }
1635
+ var ProjectionParagraphView = class {
1636
+ constructor(id, runs, style, changed) {
1637
+ this.id = id;
1638
+ this.changed = changed;
1639
+ this.runStorage = normalizeProjectionRuns(runs);
1640
+ this.style = { ...style, ...style.list ? { list: { ...style.list } } : {} };
1641
+ }
1642
+ kind = "paragraph";
1643
+ runStorage;
1644
+ style;
1645
+ get runs() {
1646
+ return this.runStorage;
1647
+ }
1648
+ get text() {
1649
+ return this.runStorage.map((run) => run.text).join("");
1650
+ }
1651
+ set text(value) {
1652
+ const current = this.text;
1653
+ if (current === value) return;
1654
+ let start = 0;
1655
+ while (start < current.length && start < value.length && current[start] === value[start]) {
1656
+ start += 1;
1657
+ }
1658
+ let currentEnd = current.length;
1659
+ let valueEnd = value.length;
1660
+ while (currentEnd > start && valueEnd > start && current[currentEnd - 1] === value[valueEnd - 1]) {
1661
+ currentEnd -= 1;
1662
+ valueEnd -= 1;
1663
+ }
1664
+ const inheritedStyle = projectionStyleAt(this.runStorage, start);
1665
+ this.runStorage = normalizeProjectionRuns([
1666
+ ...sliceProjectionRuns(this.runStorage, 0, start),
1667
+ ...valueEnd > start ? [{ text: value.slice(start, valueEnd), style: inheritedStyle }] : [],
1668
+ ...sliceProjectionRuns(this.runStorage, currentEnd, current.length)
1669
+ ]);
1670
+ this.changed();
1671
+ }
1672
+ format({
1673
+ start,
1674
+ end,
1675
+ style
1676
+ }) {
1677
+ const textLength = this.text.length;
1678
+ if (start < 0 || end <= start || end > textLength || Object.keys(style).length === 0) return;
1679
+ this.runStorage = normalizeProjectionRuns([
1680
+ ...sliceProjectionRuns(this.runStorage, 0, start),
1681
+ ...sliceProjectionRuns(this.runStorage, start, end).map((run) => ({
1682
+ text: run.text,
1683
+ style: { ...run.style, ...style }
1684
+ })),
1685
+ ...sliceProjectionRuns(this.runStorage, end, textLength)
1686
+ ]);
1687
+ this.changed();
1688
+ }
1689
+ };
1690
+ function sliceProjectionRuns(runs, start, end) {
1691
+ if (end <= start) return [];
1692
+ const result = [];
1693
+ let offset = 0;
1694
+ for (const run of runs) {
1695
+ const runEnd = offset + run.text.length;
1696
+ const overlapStart = Math.max(start, offset);
1697
+ const overlapEnd = Math.min(end, runEnd);
1698
+ if (overlapEnd > overlapStart) {
1699
+ result.push({
1700
+ text: run.text.slice(overlapStart - offset, overlapEnd - offset),
1701
+ style: { ...run.style }
1702
+ });
1703
+ }
1704
+ offset = runEnd;
1705
+ if (offset >= end) break;
1706
+ }
1707
+ return result;
1708
+ }
1709
+ function normalizeProjectionRuns(runs) {
1710
+ const normalized = [];
1711
+ for (const run of runs) {
1712
+ if (!run.text && runs.length > 1) continue;
1713
+ const style = { ...run.style };
1714
+ const previous = normalized.at(-1);
1715
+ if (previous && sameProjectionStyle(previous.style, style)) {
1716
+ normalized[normalized.length - 1] = { text: previous.text + run.text, style };
1717
+ } else {
1718
+ normalized.push({ text: run.text, style });
1719
+ }
1720
+ }
1721
+ return normalized.length > 0 ? normalized : [{ text: "", style: {} }];
1722
+ }
1723
+ function projectionStyleAt(runs, offset) {
1724
+ let cursor = 0;
1725
+ for (const run of runs) {
1726
+ const end = cursor + run.text.length;
1727
+ if (offset <= end) return { ...run.style };
1728
+ cursor = end;
1729
+ }
1730
+ return { ...runs.at(-1)?.style ?? {} };
1731
+ }
1732
+ function sameProjectionStyle(left, right) {
1733
+ return left.fontFamily === right.fontFamily && left.fontSizePt === right.fontSizePt && left.color === right.color && left.bold === right.bold && left.italic === right.italic && left.underline === right.underline && left.strike === right.strike;
1734
+ }
1735
+ function validateProjectionPage(page) {
1736
+ const values = [
1737
+ page.widthPt,
1738
+ page.heightPt,
1739
+ page.marginTopPt,
1740
+ page.marginRightPt,
1741
+ page.marginBottomPt,
1742
+ page.marginLeftPt
1743
+ ];
1744
+ if (values.some((value) => !Number.isFinite(value) || value < 0) || page.widthPt <= 0 || page.heightPt <= 0 || page.marginLeftPt + page.marginRightPt >= page.widthPt || page.marginTopPt + page.marginBottomPt >= page.heightPt) {
1745
+ throw new Error("Document projection contains invalid page geometry");
1746
+ }
1747
+ }
1748
+ function isDocumentParagraph(value) {
1749
+ return isDocumentBlockKind(value, "paragraph");
1750
+ }
1751
+ function isDocumentTable(value) {
1752
+ return isDocumentBlockKind(value, "table");
1753
+ }
1754
+ function isDocumentPageBreak(value) {
1755
+ return isDocumentBlockKind(value, "pageBreak");
1756
+ }
1757
+ function isDocumentBlockKind(value, kind) {
1758
+ return typeof value === "object" && value !== null && "kind" in value && value.kind === kind;
1759
+ }
1760
+ function asDocumentView(document2) {
1761
+ return document2;
1762
+ }
1763
+ function mapDocumentCommit(command, externalIdByInternal) {
1764
+ return {
1765
+ ...command,
1766
+ blockId: externalIdByInternal.get(command.blockId) ?? command.blockId
1767
+ };
1768
+ }
1769
+ function identity(value) {
1770
+ return value;
1771
+ }
1772
+ function asDocumentError(cause) {
1773
+ return cause instanceof Error ? cause : new Error("Document change failed");
1774
+ }
1775
+
1776
+ // src/components/artifacts/editable-document.tsx
1777
+ import {
1778
+ DOCUMENT_ARTIFACT_COMMAND_VERSION
1779
+ } from "@opengeni/sdk/editable-artifacts";
1780
+ import { useCallback as useCallback2, useEffect as useEffect2, useRef as useRef2, useState as useState2 } from "react";
1781
+ import { Fragment, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
1782
+ var DOCUMENT_PAGE_ITEMS = 512;
1783
+ var DOCUMENT_MAX_BLOCKS = 4096;
1784
+ var DOCUMENT_MAX_SECTIONS = 1024;
1785
+ var DOCUMENT_MAX_REVIEW_ITEMS = 4096;
1786
+ var DOCUMENT_MAX_TEXT_UTF16 = 1e6;
1787
+ var DOCUMENT_MAX_TABLE_CELLS = 1e5;
1788
+ var DOCUMENT_MAX_QUERY_PAGES = 64;
1789
+ var DOCUMENT_COMPOSITION_ATTEMPTS = 3;
1790
+ function EditableDocumentArtifactSurface(props) {
1791
+ return /* @__PURE__ */ jsx2(ArtifactSubmissionProvider, { children: /* @__PURE__ */ jsx2(EditableDocumentArtifactSurfaceSession, { ...props }) }, artifactSubmissionSessionKey(props.session));
1792
+ }
1793
+ function EditableDocumentArtifactSurfaceSession({
1794
+ session,
1795
+ title,
1796
+ showHeader,
1797
+ subtitle,
1798
+ readOnly = false,
1799
+ onCommit,
1800
+ onCommandError,
1801
+ download,
1802
+ actions: actionsProp,
1803
+ ...surfaceProps
1804
+ }) {
1805
+ const t = useOpenGeniText();
1806
+ const view = useEditableArtifactView(session);
1807
+ const submissions = useArtifactSubmissions();
1808
+ const invalidator = editableArtifactProjectionKey(view);
1809
+ const [retryEpoch, setRetryEpoch] = useState2(0);
1810
+ const [state, setState] = useState2({
1811
+ session,
1812
+ projection: null,
1813
+ loading: true,
1814
+ error: null
1815
+ });
1816
+ const loadGeneration = useRef2(0);
1817
+ const scheduleLoad = useLatestTaskRunner(session);
1818
+ const commandStateRef = useRef2(null);
1819
+ if (commandStateRef.current?.session !== session) {
1820
+ commandStateRef.current = {
1821
+ session,
1822
+ tail: Promise.resolve(),
1823
+ paragraphText: /* @__PURE__ */ new Map(),
1824
+ localParagraphIds: /* @__PURE__ */ new Set(),
1825
+ optimisticParagraphIds: /* @__PURE__ */ new Map()
1826
+ };
1827
+ }
1828
+ const commandState = commandStateRef.current;
1829
+ useEffect2(() => {
1830
+ const generation = ++loadGeneration.current;
1831
+ let cancelled = false;
1832
+ setState(
1833
+ (current) => current.session === session ? { ...current, loading: true, error: null } : { session, projection: null, loading: true, error: null }
1834
+ );
1835
+ const superseded = () => cancelled || generation !== loadGeneration.current || commandStateRef.current !== commandState;
1836
+ scheduleLoad(async () => {
1837
+ if (superseded()) return;
1838
+ await composeDocumentEditorProjection(t, session).then(
1839
+ (projection2) => {
1840
+ if (superseded()) return;
1841
+ const nextParagraphText = paragraphTextById(projection2);
1842
+ for (const [localId, canonicalId] of commandState.optimisticParagraphIds) {
1843
+ if (nextParagraphText.has(canonicalId)) continue;
1844
+ const optimisticText = commandState.paragraphText.get(canonicalId) ?? commandState.paragraphText.get(localId);
1845
+ if (optimisticText !== void 0) nextParagraphText.set(canonicalId, optimisticText);
1846
+ }
1847
+ commandState.paragraphText = nextParagraphText;
1848
+ setState({ session, projection: projection2, loading: false, error: null });
1849
+ },
1850
+ (cause) => {
1851
+ if (superseded()) return;
1852
+ setState({
1853
+ session,
1854
+ projection: null,
1855
+ loading: false,
1856
+ error: asEditableArtifactError(
1857
+ cause,
1858
+ t("artifacts.editableDocument.couldNotOpenThisDocument")
1859
+ )
1860
+ });
1861
+ }
1862
+ );
1863
+ });
1864
+ return () => {
1865
+ cancelled = true;
1866
+ };
1867
+ }, [commandState, invalidator, retryEpoch, scheduleLoad, session, t]);
1868
+ const refresh = useCallback2(() => setRetryEpoch((value) => value + 1), []);
1869
+ const writable = !readOnly && view.writable;
1870
+ const applyCommit = useCallback2(
1871
+ (commit) => {
1872
+ const projection2 = state.session === session ? state.projection : null;
1873
+ if (!projection2) return Promise.reject(new Error("Document projection is not ready"));
1874
+ if (!writable)
1875
+ return Promise.reject(new Error(t("artifacts.editableDocument.thisDocumentIsReadOnly")));
1876
+ if (String(commit.revision) !== String(projection2.revision)) {
1877
+ return Promise.reject(
1878
+ new Error(t("artifacts.editableDocument.theDocumentChangedRetryThis"))
1879
+ );
1880
+ }
1881
+ const execute = async () => {
1882
+ if (commandStateRef.current !== commandState) {
1883
+ throw new Error(t("artifacts.editableDocument.theDocumentSessionChangedBefore"));
1884
+ }
1885
+ const allocateLocalParagraph = async (localId) => {
1886
+ const allocated = commandState.optimisticParagraphIds.get(localId);
1887
+ if (allocated !== void 0) return allocated;
1888
+ if (!commandState.localParagraphIds.has(localId)) {
1889
+ throw new Error(t("artifacts.editableDocument.theEditedParagraphIsNo"));
1890
+ }
1891
+ const created = await session.createDocumentParagraph();
1892
+ if (commandStateRef.current !== commandState) {
1893
+ throw new Error(t("artifacts.editableDocument.theDocumentSessionChangedBefore"));
1894
+ }
1895
+ commandState.optimisticParagraphIds.set(localId, created.paragraphId);
1896
+ commandState.paragraphText.set(created.paragraphId, "");
1897
+ return created.paragraphId;
1898
+ };
1899
+ if (commit.kind === "insert-paragraph") {
1900
+ commandState.localParagraphIds.add(commit.blockId);
1901
+ await allocateLocalParagraph(commit.blockId);
1902
+ notifyDocumentCommit(t, onCommit, onCommandError, commit);
1903
+ refresh();
1904
+ return;
1905
+ }
1906
+ const targetId = commandState.localParagraphIds.has(commit.blockId) ? await allocateLocalParagraph(commit.blockId) : commit.blockId;
1907
+ let command = null;
1908
+ let rollbackText = null;
1909
+ if (commit.kind === "text") {
1910
+ const before = commandState.paragraphText.get(targetId);
1911
+ if (before === void 0) {
1912
+ throw new Error(t("artifacts.editableDocument.theEditedParagraphIsNo"));
1913
+ }
1914
+ const edit = minimalUtf16TextEdit(before, commit.text);
1915
+ if (!edit) return;
1916
+ commandState.paragraphText.set(targetId, commit.text);
1917
+ rollbackText = () => {
1918
+ if (commandState.paragraphText.get(targetId) === commit.text) {
1919
+ commandState.paragraphText.set(targetId, before);
1920
+ }
1921
+ };
1922
+ command = {
1923
+ kind: "paragraph.edit",
1924
+ id: targetId,
1925
+ range: edit.range,
1926
+ replacement: edit.replacement,
1927
+ style: null
1928
+ };
1929
+ } else if (commit.kind === "format") {
1930
+ command = {
1931
+ kind: "paragraph.format",
1932
+ id: targetId,
1933
+ range: commit.range,
1934
+ style: documentTextStylePatch(commit.style)
1935
+ };
1936
+ }
1937
+ if (!command) throw new Error("Unsupported document edit");
1938
+ try {
1939
+ await session.applyDocumentCommands({
1940
+ version: DOCUMENT_ARTIFACT_COMMAND_VERSION,
1941
+ commands: [command]
1942
+ });
1943
+ if (commandStateRef.current !== commandState) return;
1944
+ notifyDocumentCommit(t, onCommit, onCommandError, commit);
1945
+ refresh();
1946
+ } catch (cause) {
1947
+ rollbackText?.();
1948
+ throw cause;
1949
+ }
1950
+ };
1951
+ const operation = commandState.tail.then(execute, execute);
1952
+ commandState.tail = operation;
1953
+ void operation.then(
1954
+ () => {
1955
+ if (commandState.tail === operation) commandState.tail = Promise.resolve();
1956
+ },
1957
+ () => {
1958
+ if (commandState.tail === operation) commandState.tail = Promise.resolve();
1959
+ }
1960
+ );
1961
+ return operation;
1962
+ },
1963
+ [commandState, onCommandError, onCommit, refresh, session, state, writable, t]
1964
+ );
1965
+ const submitCommit = useCallback2(
1966
+ (commit) => submissions.run(() => applyCommit(commit)),
1967
+ [applyCommit, submissions]
1968
+ );
1969
+ const actions = download ? /* @__PURE__ */ jsxs2(Fragment, { children: [
1970
+ actionsProp,
1971
+ /* @__PURE__ */ jsx2(
1972
+ EditableArtifactDownloadButton,
1973
+ {
1974
+ session,
1975
+ title,
1976
+ download,
1977
+ format: "docx"
1978
+ }
1979
+ )
1980
+ ] }) : actionsProp;
1981
+ const projection = state.session === session ? state.projection : null;
1982
+ const status = editableArtifactStatusLabel(t, view);
1983
+ const accessRevoked = editableArtifactAccessRevoked(view);
1984
+ return projection && !accessRevoked ? /* @__PURE__ */ jsx2(
1985
+ DocumentProjectionArtifactSurface,
1986
+ {
1987
+ ...surfaceProps,
1988
+ title,
1989
+ showHeader,
1990
+ actions,
1991
+ subtitle: subtitle ?? writable ? t("counts.blocks", { count: projection.blocks.length }) : t("artifacts.readOnlySubtitle", {
1992
+ subtitle: t("counts.blocks", { count: projection.blocks.length })
1993
+ }),
1994
+ projection,
1995
+ commit: writable ? submitCommit : void 0,
1996
+ readOnly: !writable,
1997
+ busy: state.loading,
1998
+ onCommandError
1999
+ }
2000
+ ) : /* @__PURE__ */ jsx2(
2001
+ ArtifactSurface,
2002
+ {
2003
+ modality: "document",
2004
+ title,
2005
+ showHeader,
2006
+ subtitle: subtitle ?? status,
2007
+ actions: accessRevoked ? actionsProp : actions,
2008
+ busy: !accessRevoked && !state.error,
2009
+ className: surfaceProps.className,
2010
+ children: /* @__PURE__ */ jsx2(
2011
+ EditableArtifactMessage,
2012
+ {
2013
+ title: accessRevoked ? t("artifacts.editableDocument.accessChanged") : state.error ? t("artifacts.editableDocument.couldNotOpenThisDocument") : t("artifacts.editableDocument.openingDocument"),
2014
+ detail: accessRevoked ? status : state.error?.message ?? status,
2015
+ retry: !accessRevoked && state.error ? refresh : void 0
2016
+ }
2017
+ )
2018
+ }
2019
+ );
2020
+ }
2021
+ async function composeDocumentEditorProjection(t, session) {
2022
+ if (session.modality !== "document") throw new Error("Expected a document artifact session");
2023
+ let lastRevisionError = null;
2024
+ for (let attempt = 0; attempt < DOCUMENT_COMPOSITION_ATTEMPTS; attempt += 1) {
2025
+ try {
2026
+ return await composeDocumentAttempt(session);
2027
+ } catch (cause) {
2028
+ const error = asEditableArtifactError(
2029
+ cause,
2030
+ t("artifacts.editableDocument.couldNotProjectThisDocument")
2031
+ );
2032
+ if (!isRevisionDrift(error) || attempt === DOCUMENT_COMPOSITION_ATTEMPTS - 1) throw error;
2033
+ lastRevisionError = error;
2034
+ }
2035
+ }
2036
+ throw lastRevisionError ?? new Error("Document changed while it was opening");
2037
+ }
2038
+ async function composeDocumentAttempt(session) {
2039
+ const summaryPage = await session.queryDocument({ kind: "summary" });
2040
+ const summary = summaryItem(summaryPage);
2041
+ const revision = summaryPage.revision;
2042
+ if (summary.revision !== revision) throw new Error("Document projection revision drifted");
2043
+ if (summary.blockCount > DOCUMENT_MAX_BLOCKS) {
2044
+ throw new Error(`Document exceeds the interactive limit of ${DOCUMENT_MAX_BLOCKS} blocks`);
2045
+ }
2046
+ if (summary.sectionCount > DOCUMENT_MAX_SECTIONS) {
2047
+ throw new Error(`Document exceeds the interactive limit of ${DOCUMENT_MAX_SECTIONS} sections`);
2048
+ }
2049
+ if (summary.commentCount + summary.trackedChangeCount > DOCUMENT_MAX_REVIEW_ITEMS) {
2050
+ throw new Error(
2051
+ `Document exceeds the interactive limit of ${DOCUMENT_MAX_REVIEW_ITEMS} review items`
2052
+ );
2053
+ }
2054
+ const body = await collectDocumentPages(
2055
+ session,
2056
+ "body",
2057
+ revision,
2058
+ DOCUMENT_MAX_BLOCKS,
2059
+ DOCUMENT_MAX_TEXT_UTF16,
2060
+ DOCUMENT_MAX_TABLE_CELLS,
2061
+ (cursor, limits) => ({ kind: "body", startBlock: cursor, limits })
2062
+ );
2063
+ const sections = await collectDocumentPages(
2064
+ session,
2065
+ "sections",
2066
+ revision,
2067
+ DOCUMENT_MAX_SECTIONS,
2068
+ DOCUMENT_MAX_TEXT_UTF16 - body.text,
2069
+ DOCUMENT_MAX_TABLE_CELLS - body.cells,
2070
+ (cursor, limits) => ({ kind: "sections", startSection: cursor, limits })
2071
+ );
2072
+ const review = await collectDocumentPages(
2073
+ session,
2074
+ "review",
2075
+ revision,
2076
+ DOCUMENT_MAX_REVIEW_ITEMS,
2077
+ DOCUMENT_MAX_TEXT_UTF16 - body.text - sections.text,
2078
+ DOCUMENT_MAX_TABLE_CELLS - body.cells - sections.cells,
2079
+ (cursor, limits) => ({ kind: "review", startItem: cursor, limits })
2080
+ );
2081
+ if (body.items.length !== summary.blockCount) {
2082
+ throw new Error("Document body changed while it was opening");
2083
+ }
2084
+ if (sections.items.length !== summary.sectionCount) {
2085
+ throw new Error("Document sections changed while they were opening");
2086
+ }
2087
+ if (review.items.length !== summary.commentCount + summary.trackedChangeCount) {
2088
+ throw new Error("Document review state changed while it was opening");
2089
+ }
2090
+ const totalText = body.text + sections.text + review.text;
2091
+ const totalCells = body.cells + sections.cells + review.cells;
2092
+ if (totalText > DOCUMENT_MAX_TEXT_UTF16) {
2093
+ throw new Error(
2094
+ `Document exceeds the interactive limit of ${DOCUMENT_MAX_TEXT_UTF16} UTF-16 text units`
2095
+ );
2096
+ }
2097
+ if (totalCells > DOCUMENT_MAX_TABLE_CELLS) {
2098
+ throw new Error(
2099
+ `Document exceeds the interactive limit of ${DOCUMENT_MAX_TABLE_CELLS} table cells`
2100
+ );
2101
+ }
2102
+ return Object.freeze({
2103
+ revision: revision.toString(),
2104
+ page: projectDocumentPage(summary.page),
2105
+ blocks: Object.freeze(body.items.map(projectDocumentBlock)),
2106
+ sections: Object.freeze(sections.items.map(projectDocumentSection)),
2107
+ comments: Object.freeze(
2108
+ review.items.filter(isProjectionKind("comment")).map((item) => ({
2109
+ id: item.id,
2110
+ blockId: item.paragraphId,
2111
+ start: item.range.start,
2112
+ end: item.range.end,
2113
+ resolved: item.resolved,
2114
+ replies: item.replies.map((reply) => ({ ...reply }))
2115
+ }))
2116
+ ),
2117
+ changes: Object.freeze(
2118
+ review.items.filter(isProjectionKind("tracked-change")).map((item) => ({
2119
+ id: item.id,
2120
+ blockId: item.paragraphId,
2121
+ kind: item.changeKind,
2122
+ start: item.range.start,
2123
+ end: item.range.end,
2124
+ author: item.author,
2125
+ createdAt: item.createdAt
2126
+ }))
2127
+ )
2128
+ });
2129
+ }
2130
+ async function collectDocumentPages(session, label, revision, maxItems, maxText, maxCells, query) {
2131
+ const output = { items: [], text: 0, cells: 0 };
2132
+ let cursor = 0;
2133
+ for (let pageIndex = 0; pageIndex < DOCUMENT_MAX_QUERY_PAGES; pageIndex += 1) {
2134
+ if (output.items.length >= maxItems && cursor > 0) {
2135
+ throw new Error(`Document ${label} exceeds its interactive item limit`);
2136
+ }
2137
+ const page = await session.queryDocument(
2138
+ query(cursor, {
2139
+ maxItems: Math.min(DOCUMENT_PAGE_ITEMS, Math.max(1, maxItems - output.items.length)),
2140
+ maxTextUtf16: Math.max(1, maxText - output.text),
2141
+ maxTableCells: Math.max(1, maxCells - output.cells)
2142
+ })
2143
+ );
2144
+ assertDocumentRevision(page, revision);
2145
+ assertDocumentPageKinds(label, page.items);
2146
+ if (output.items.length + page.items.length > maxItems) {
2147
+ throw new Error(`Document ${label} exceeds its interactive item limit`);
2148
+ }
2149
+ output.items.push(...page.items);
2150
+ output.text += page.projectedTextUtf16;
2151
+ output.cells += page.projectedTableCells;
2152
+ if (output.text > maxText || output.cells > maxCells) {
2153
+ throw new Error(`Document ${label} exceeds its interactive content limit`);
2154
+ }
2155
+ if (page.nextCursor === null) return output;
2156
+ if (page.nextCursor <= cursor || page.items.length === 0) {
2157
+ throw new Error(`Document ${label} pagination did not advance`);
2158
+ }
2159
+ cursor = page.nextCursor;
2160
+ }
2161
+ throw new Error(`Document ${label} exceeds ${DOCUMENT_MAX_QUERY_PAGES} query pages`);
2162
+ }
2163
+ function summaryItem(projection) {
2164
+ if (projection.items.length !== 1 || projection.items[0]?.kind !== "summary" || projection.nextCursor !== null || projection.truncated) {
2165
+ throw new Error("Document summary projection is malformed");
2166
+ }
2167
+ return projection.items[0];
2168
+ }
2169
+ function assertDocumentRevision(page, revision) {
2170
+ if (page.revision !== revision) throw new Error("Document projection revision drifted");
2171
+ }
2172
+ function assertDocumentPageKinds(label, items) {
2173
+ const valid = label === "body" ? /* @__PURE__ */ new Set(["paragraph", "table", "page-break"]) : label === "sections" ? /* @__PURE__ */ new Set(["section"]) : /* @__PURE__ */ new Set(["comment", "tracked-change"]);
2174
+ if (items.some((item) => !valid.has(item.kind))) {
2175
+ throw new Error(`Document ${label} projection contains an unexpected item`);
2176
+ }
2177
+ }
2178
+ function projectDocumentBlock(item) {
2179
+ if (item.kind === "paragraph") {
2180
+ const { headingLevel, list, ...paragraphStyle } = item.style;
2181
+ return {
2182
+ kind: "paragraph",
2183
+ id: item.id,
2184
+ runs: item.runs.map((run) => ({ text: run.text, style: { ...run.style } })),
2185
+ style: {
2186
+ ...paragraphStyle,
2187
+ ...headingLevel === void 0 ? {} : { headingLevel: documentHeadingLevel(headingLevel) },
2188
+ ...list ? {
2189
+ list: {
2190
+ kind: list.kind,
2191
+ ...list.level === null ? {} : { level: list.level },
2192
+ ...list.instanceId === null ? {} : { instanceId: list.instanceId }
2193
+ }
2194
+ } : {}
2195
+ }
2196
+ };
2197
+ }
2198
+ if (item.kind === "table") {
2199
+ return {
2200
+ kind: "table",
2201
+ id: item.id,
2202
+ rows: item.rows.map(
2203
+ (row) => row.map((cell) => cell.map((run) => ({ text: run.text, style: { ...run.style } })))
2204
+ ),
2205
+ style: { ...item.style }
2206
+ };
2207
+ }
2208
+ if (item.kind === "page-break") return { kind: "pageBreak", id: item.id };
2209
+ throw new Error("Document body projection contains an unexpected item");
2210
+ }
2211
+ function documentHeadingLevel(value) {
2212
+ if (value < 1 || value > 6 || !Number.isInteger(value)) {
2213
+ throw new Error("Document projection contains an invalid heading level");
2214
+ }
2215
+ return value;
2216
+ }
2217
+ function projectDocumentSection(item) {
2218
+ if (item.kind !== "section") {
2219
+ throw new Error("Document section projection contains an unexpected item");
2220
+ }
2221
+ return {
2222
+ id: item.id,
2223
+ startBlockIndex: item.startBlockIndex,
2224
+ page: projectDocumentPage(item.page),
2225
+ titlePage: item.titlePage,
2226
+ headerBlockCounts: item.headerBlockCounts,
2227
+ footerBlockCounts: item.footerBlockCounts
2228
+ };
2229
+ }
2230
+ function projectDocumentPage(page) {
2231
+ const points = (value) => Number(value) / 1e3;
2232
+ return {
2233
+ widthPt: points(page.widthMillipoints),
2234
+ heightPt: points(page.heightMillipoints),
2235
+ marginTopPt: points(page.marginTopMillipoints),
2236
+ marginRightPt: points(page.marginRightMillipoints),
2237
+ marginBottomPt: points(page.marginBottomMillipoints),
2238
+ marginLeftPt: points(page.marginLeftMillipoints),
2239
+ headerPt: points(page.headerMillipoints),
2240
+ footerPt: points(page.footerMillipoints),
2241
+ gutterPt: points(page.gutterMillipoints)
2242
+ };
2243
+ }
2244
+ function isProjectionKind(kind) {
2245
+ return (item) => item.kind === kind;
2246
+ }
2247
+ function paragraphTextById(projection) {
2248
+ return new Map(
2249
+ projection.blocks.filter((block) => block.kind === "paragraph").map((paragraph) => [paragraph.id, paragraph.runs.map((run) => run.text).join("")])
2250
+ );
2251
+ }
2252
+ function minimalUtf16TextEdit(before, after) {
2253
+ if (before === after) return null;
2254
+ let start = 0;
2255
+ const maximumStart = Math.min(before.length, after.length);
2256
+ while (start < maximumStart && before.charCodeAt(start) === after.charCodeAt(start)) start += 1;
2257
+ while (start > 0 && (splitsSurrogate(before, start) || splitsSurrogate(after, start))) start -= 1;
2258
+ let suffix = 0;
2259
+ while (suffix < before.length - start && suffix < after.length - start && before.charCodeAt(before.length - suffix - 1) === after.charCodeAt(after.length - suffix - 1)) {
2260
+ suffix += 1;
2261
+ }
2262
+ while (suffix > 0 && (splitsSurrogate(before, before.length - suffix) || splitsSurrogate(after, after.length - suffix))) {
2263
+ suffix -= 1;
2264
+ }
2265
+ return {
2266
+ range: { start, end: before.length - suffix },
2267
+ replacement: after.slice(start, after.length - suffix)
2268
+ };
2269
+ }
2270
+ function splitsSurrogate(value, index) {
2271
+ if (index <= 0 || index >= value.length) return false;
2272
+ const left = value.charCodeAt(index - 1);
2273
+ const right = value.charCodeAt(index);
2274
+ return left >= 55296 && left <= 56319 && right >= 56320 && right <= 57343;
2275
+ }
2276
+ function documentTextStylePatch(style) {
2277
+ return {
2278
+ ...style.fontFamily === void 0 ? {} : { fontFamily: style.fontFamily },
2279
+ ...style.fontSizePt === void 0 ? {} : { fontSizePt: style.fontSizePt },
2280
+ ...style.color === void 0 ? {} : { color: style.color },
2281
+ ...style.bold === void 0 ? {} : { bold: style.bold },
2282
+ ...style.italic === void 0 ? {} : { italic: style.italic },
2283
+ ...style.underline === void 0 ? {} : { underline: style.underline },
2284
+ ...style.strike === void 0 ? {} : { strike: style.strike }
2285
+ };
2286
+ }
2287
+ function isRevisionDrift(error) {
2288
+ return error.message.includes("changed while") || error.message.includes("revision drifted");
2289
+ }
2290
+ function notifyDocumentCommit(t, observer, onError, commit) {
2291
+ try {
2292
+ const result = observer?.(commit);
2293
+ if (result && typeof result.then === "function") {
2294
+ void Promise.resolve(result).catch(
2295
+ (cause) => onError?.(
2296
+ asEditableArtifactError(
2297
+ cause,
2298
+ t("artifacts.editableDocument.documentCommitObserverFailed")
2299
+ )
2300
+ )
2301
+ );
2302
+ }
2303
+ } catch (cause) {
2304
+ onError?.(
2305
+ asEditableArtifactError(cause, t("artifacts.editableDocument.documentCommitObserverFailed"))
2306
+ );
2307
+ }
2308
+ }
2309
+
2310
+ export {
2311
+ DocumentEditor,
2312
+ DocumentProjectionEditor,
2313
+ DocumentArtifactSurface,
2314
+ DocumentProjectionArtifactSurface,
2315
+ EditableDocumentArtifactSurface
2316
+ };
2317
+ //# sourceMappingURL=chunk-57AZS3IE.js.map