@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
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/app/components/command-menu/command-menu.tsx","../../../../src/app/lib/actions/site-rank.ts","../../../../src/app/lib/actions/meeting-search.ts"],"sourcesContent":["/**\n * The ⌘K menu: find a chat, a Site or a meeting, or run any action, from one\n * field.\n *\n * It opens instantly from what the app already knows (chats and Sites the\n * sidebar has loaded and the chats opened recently) and merges the server's\n * title searches as they arrive. Chats in the person's other workspaces show too, tagged with\n * their workspace, and so do workspaces to switch to. Tab on a chat shows that\n * chat's actions; the chords of chat actions work on the highlighted chat\n * while the menu is open. Meetings are found by title, by who spoke, by words\n * said in them and by when they happened.\n *\n * Sub-agent chats (ones another chat started) are far more numerous than the\n * person's own, so they list only where they were asked for: the ones opened\n * recently join Recent chats, pinned ones count as the person's own, and a\n * search lists a few matching ones in a group of their own, after the chats.\n * Each says which chat it belongs to.\n */\nimport {\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n type RefObject,\n} from \"react\";\nimport { Dialog as DialogPrimitive } from \"radix-ui\";\nimport {\n ArchiveIcon,\n ArrowUpRightIcon,\n AudioLinesIcon,\n ChevronRightIcon,\n CornerDownLeftIcon,\n LockIcon,\n MessageCircleQuestionIcon,\n MessageSquareIcon,\n PanelsTopLeftIcon,\n PinIcon,\n SearchIcon,\n TextSearchIcon,\n type LucideIcon,\n} from \"lucide-react\";\nimport type { SessionListRow } from \"../../../session-list-model\";\nimport { useAppContext } from \"../../app-context\";\nimport {\n chatParentTitle,\n listsAsTopLevel,\n readChatDirectory,\n rememberChats,\n useChatDirectoryVersion,\n type ChatRecord,\n} from \"../../lib/actions/chat-directory\";\nimport { matchesChord, type Chord } from \"../../lib/actions/chords\";\nimport {\n readSidebarSites,\n siteRecords,\n useSiteDirectoryVersion,\n type SiteRecord,\n} from \"../../lib/actions/site-directory\";\nimport { rankSites, recentSites } from \"../../lib/actions/site-rank\";\nimport {\n meetingRecords,\n readRecentMeetings,\n rememberRecentMeetings,\n useMeetingDirectoryVersion,\n type MeetingRecord,\n} from \"../../lib/actions/meeting-directory\";\nimport {\n meetingDateRange,\n rankMeetings,\n recentMeetings,\n type FoundMeeting,\n} from \"../../lib/actions/meeting-search\";\nimport { useAppActions } from \"../../lib/actions/actions-provider\";\nimport {\n foldForSearch,\n LOOSE_MATCH_BELOW,\n rankLabel,\n rankWithKeywords,\n} from \"../../lib/actions/rank\";\nimport {\n appActions,\n actionIcon,\n actionTitle,\n type ActionEnv,\n type AppAction,\n type MeetingPages,\n type WorkspaceChoice,\n} from \"../../lib/actions/registry\";\nimport { cn } from \"../../lib/utils\";\nimport { DialogOverlay, DialogPortal } from \"../../../ui/dialog\";\nimport { formatRelativeTime } from \"../../../ui/relative-time\";\nimport { Keycaps } from \"./keycaps\";\nimport { ChatTitleInParent } from \"./chat-title\";\nimport { WorkspaceTag } from \"./workspace-tag\";\nimport { SessionAvatar } from \"../session/session-avatar\";\nimport { ChatStatusMarks, useChatStatusRefresh } from \"./chat-status\";\nimport { currentChatStatus, type ChatStatus } from \"../../lib/actions/chat-status\";\n\ntype Item = {\n key: string;\n group: string;\n icon: LucideIcon;\n /** A workspace's initial, drawn as the workspace picker draws it, instead of the icon. */\n tile?: string | undefined;\n title: string;\n /** Text to mark as matched in the title. */\n highlight?: string | undefined;\n /** Quiet text on the right (when, \"Archived\"). */\n meta?: string | undefined;\n /** The workspace a chat lives in, when it is not the one on screen. */\n workspaceTag?: string | undefined;\n /** The chat a sub-agent chat belongs to, said quietly after its title. */\n parentTitle?: string | undefined;\n chord?: Chord | undefined;\n /** Present on chat rows: Tab opens their actions, chat chords act on them. */\n chat?: ChatRecord | undefined;\n /** The chat's sidebar status marks, while its status is known to be current. */\n status?: ChatStatus | null | undefined;\n run(options: { newTab: boolean }): void;\n};\n\ntype Group = { label: string; items: Item[]; best: number };\n\nconst RECENT_LIMIT = 6;\nconst CHAT_RESULT_LIMIT = 8;\n/** Sub-agent chats a search lists, below the chats, so they never crowd them out. */\nconst SUBAGENT_RESULT_LIMIT = 3;\n/** The server's matches among every chat in this workspace, sub-agent chats included. */\nconst SERVER_SUBAGENT_LIMIT = 10;\nconst ACTION_RESULT_LIMIT = 6;\nconst WORKSPACE_RESULT_LIMIT = 4;\nconst SITE_RESULT_LIMIT = 5;\n/** Sites before anything is typed: a few recent ones, never the whole list. */\nconst RECENT_SITE_LIMIT = 3;\n/** Sites the server title search returns per query. */\nconst SERVER_SITE_LIMIT = 10;\n/** Shorter queries match only the Sites the sidebar has loaded. */\nconst MIN_SERVER_SITE_QUERY = 2;\nconst NO_SITES: readonly SiteRecord[] = [];\n/** Meetings before anything is typed: the newest few, never the whole list. */\nconst RECENT_MEETING_LIMIT = 3;\n/** Newest meetings the menu asks for each time it opens (one spare for the one on screen). */\nconst RECENT_MEETING_FETCH = RECENT_MEETING_LIMIT + 1;\nconst MEETING_RESULT_LIMIT = 5;\n/** Meetings the server returns per kind of match. */\nconst SERVER_MEETING_LIMIT = 8;\n/** Shorter queries match only the meetings the menu already knows. */\nconst MIN_SERVER_MEETING_QUERY = 2;\nconst NO_MEETINGS: readonly FoundMeeting[] = [];\nconst SERVER_DEBOUNCE_MS = 120;\n/** Other workspaces whose titles the server searches too, most used first. */\nconst OTHER_WORKSPACES_SEARCHED = 9;\n/** A chat in another workspace ranks just below an equal match here. */\nconst ELSEWHERE_PENALTY = 10;\n\nfunction relativeMeta(record: ChatRecord, now: number): string | undefined {\n if (record.archived) return \"Archived\";\n if (!record.updatedAt) return undefined;\n return formatRelativeTime(record.updatedAt, { now });\n}\n\nfunction chatIcon(record: ChatRecord): LucideIcon {\n if (record.archived) return ArchiveIcon;\n if (record.pinned) return PinIcon;\n return MessageSquareIcon;\n}\n\n/** Marks the query's words in a title, case- and accent-insensitively. */\nfunction Highlighted(props: { text: string; query: string | undefined }) {\n const { text, query } = props;\n const words = query ? foldForSearch(query).split(\" \").filter(Boolean) : [];\n if (words.length === 0) return <>{text}</>;\n // Fold per character so positions in the folded text map back to the title.\n const folded = Array.from(text, (character) => foldForSearch(character) || \" \");\n const joined = folded.join(\"\");\n const marked = new Array<boolean>(folded.length).fill(false);\n const offsets: number[] = [];\n let offset = 0;\n for (const piece of folded) {\n offsets.push(offset);\n offset += piece.length;\n }\n const indexAt = (position: number) => {\n let index = offsets.findIndex((start) => start > position);\n index = index < 0 ? offsets.length - 1 : index - 1;\n return index;\n };\n const phrase = words.join(\" \");\n const ranges: Array<[number, number]> = [];\n const whole = joined.indexOf(phrase);\n if (whole >= 0) ranges.push([whole, whole + phrase.length]);\n else {\n for (const word of words) {\n const at = joined.indexOf(word);\n if (at >= 0) ranges.push([at, at + word.length]);\n }\n }\n for (const [start, end] of ranges) {\n for (let index = indexAt(start); index <= indexAt(end - 1); index++) marked[index] = true;\n }\n const characters = Array.from(text);\n const parts: ReactNode[] = [];\n let run = \"\";\n let runMarked = false;\n characters.forEach((character, index) => {\n const isMarked = marked[index] ?? false;\n if (index > 0 && isMarked !== runMarked) {\n parts.push(\n runMarked ? (\n <mark key={parts.length} className=\"bg-transparent font-medium text-fg\">\n {run}\n </mark>\n ) : (\n run\n ),\n );\n run = \"\";\n }\n run += character;\n runMarked = isMarked;\n });\n if (run) {\n parts.push(\n runMarked ? (\n <mark key={parts.length} className=\"bg-transparent font-medium text-fg\">\n {run}\n </mark>\n ) : (\n run\n ),\n );\n }\n return <>{parts}</>;\n}\n\n/**\n * The server's title search: this workspace, and the person's other workspaces\n * they use most, side by side. Each workspace's matches join the list as they\n * arrive. Those searches cover top-level chats, so a workspace full of\n * sub-agent chats cannot push them out of the page; one more small search of\n * this workspace finds the sub-agent chats that match.\n */\nfunction useServerTitleSearch(\n workspaceIds: readonly string[],\n subjectId: string,\n query: string,\n open: boolean,\n) {\n const { client } = useAppContext();\n const [state, setState] = useState<{ query: string; rows: SessionListRow[]; loading: boolean }>({\n query: \"\",\n rows: [],\n loading: false,\n });\n const searchKey = workspaceIds.join(\",\");\n useEffect(() => {\n const trimmed = query.trim();\n if (!open || !trimmed || !searchKey) {\n setState({ query: \"\", rows: [], loading: false });\n return;\n }\n setState((current) => ({ ...current, loading: true }));\n const controller = new AbortController();\n const timer = window.setTimeout(() => {\n const targets = searchKey.split(\",\").map((workspaceId, index) => ({\n workspaceId,\n // This workspace first and fullest; a few from each of the others.\n limit: index === 0 ? 20 : 6,\n topLevel: true,\n }));\n targets.splice(1, 0, {\n workspaceId: targets[0]!.workspaceId,\n limit: SERVER_SUBAGENT_LIMIT,\n topLevel: false,\n });\n let pending = targets.length;\n let first = true;\n const settle = (rows: SessionListRow[]) => {\n if (controller.signal.aborted) return;\n pending -= 1;\n const replace = first;\n first = false;\n setState((current) => ({\n query: trimmed,\n rows: replace || current.query !== trimmed ? rows : [...current.rows, ...rows],\n loading: pending > 0,\n }));\n };\n for (const target of targets) {\n // The menu needs list rows, not each session's full tool/configuration payload.\n // Older embedded clients may not expose the optional summary method yet.\n const listPage = client.listSessionSummaryPage ?? client.listSessionPage;\n listPage\n .call(client, target.workspaceId, {\n search: trimmed,\n archiveStatus: \"all\",\n limit: target.limit,\n ...(target.topLevel ? { parentSessionId: null } : {}),\n signal: controller.signal,\n })\n .then((page) => {\n if (controller.signal.aborted) return;\n const rows = [...(page.pinned ?? []), ...page.sessions];\n rememberChats(subjectId, rows);\n settle(rows);\n })\n .catch(() => {\n // Local results still show; the server search is an addition.\n settle([]);\n });\n }\n }, SERVER_DEBOUNCE_MS);\n return () => {\n window.clearTimeout(timer);\n controller.abort();\n };\n }, [client, searchKey, subjectId, query, open]);\n return state;\n}\n\nfunction isAccessFailure(error: unknown): boolean {\n const status =\n error && typeof error === \"object\" && \"status\" in error\n ? (error as { status: unknown }).status\n : null;\n return status === 401 || status === 403;\n}\n\n/**\n * The server's Site title search in this workspace: the artifact catalog's\n * Sites, with its access checks (Only me Sites of other people never show).\n * A failure leaves the rest of the menu as it is; a workspace that refuses\n * access is not asked again until the menu opens next.\n */\nfunction useServerSiteSearch(workspaceId: string, query: string, open: boolean) {\n const { client } = useAppContext();\n const [state, setState] = useState<{\n key: string;\n workspaceId: string;\n sites: readonly SiteRecord[];\n loading: boolean;\n }>({\n key: \"\",\n workspaceId: \"\",\n sites: NO_SITES,\n loading: false,\n });\n const denied = useRef<string | null>(null);\n useEffect(() => {\n if (!open) denied.current = null;\n }, [open]);\n const trimmed = query.trim();\n const key = JSON.stringify([workspaceId, trimmed]);\n useEffect(() => {\n if (\n !open ||\n // One letter would scan the whole catalog on every keystroke; the Sites\n // the sidebar has loaded still match it locally.\n trimmed.length < MIN_SERVER_SITE_QUERY ||\n !workspaceId ||\n denied.current === workspaceId ||\n typeof client.listArtifactCatalog !== \"function\"\n ) {\n setState((current) =>\n current.loading || current.sites.length > 0\n ? { key: \"\", workspaceId: \"\", sites: NO_SITES, loading: false }\n : current,\n );\n return;\n }\n setState((current) => ({ ...current, loading: true }));\n const controller = new AbortController();\n const timer = window.setTimeout(() => {\n Promise.resolve()\n .then(() =>\n client.listArtifactCatalog(workspaceId, {\n kind: \"site\",\n q: trimmed,\n status: \"active\",\n sort: \"updated\",\n limit: SERVER_SITE_LIMIT,\n signal: controller.signal,\n }),\n )\n .then((page) => {\n if (controller.signal.aborted) return;\n const items = Array.isArray(page?.items) ? page.items : [];\n setState({\n key,\n workspaceId,\n sites: siteRecords(\n workspaceId,\n items.filter((item) => item?.kind === \"site\"),\n ),\n loading: false,\n });\n })\n .catch((error: unknown) => {\n if (controller.signal.aborted) return;\n if (isAccessFailure(error)) denied.current = workspaceId;\n // Chats and actions still show; Sites are an addition.\n setState({ key, workspaceId, sites: NO_SITES, loading: false });\n });\n }, SERVER_DEBOUNCE_MS);\n return () => {\n window.clearTimeout(timer);\n controller.abort();\n };\n }, [client, workspaceId, trimmed, key, open]);\n const current = state.key === key;\n return {\n sites: current ? state.sites : NO_SITES,\n // While the next answer loads, the last one's Sites stay candidates (by\n // their title alone), so a Site does not blink out on every keystroke.\n previous: !current && state.workspaceId === workspaceId ? state.sites : NO_SITES,\n loading: state.loading,\n };\n}\n\nexport default function CommandMenu(props: {\n open: boolean;\n /** Opens listing workspaces to switch to. */\n pickWorkspace: boolean;\n onOpenChange: (open: boolean) => void;\n /** Where focus goes back to after a plain close. */\n returnFocus: RefObject<HTMLElement | null>;\n}) {\n const actions = useAppActions();\n if (!actions) return null;\n return (\n <CommandMenuDialog\n {...props}\n env={actions.env}\n run={actions.run}\n chordsFor={actions.chordsFor}\n />\n );\n}\n\n/**\n * Each open asks for the workspace's newest meetings, so the empty menu lists\n * them (from the last answer at once, then this one). A failure keeps the last list.\n */\nfunction useRecentMeetingsRefresh(\n meetingPages: MeetingPages | null,\n subjectId: string,\n workspaceId: string,\n open: boolean,\n) {\n const list = meetingPages?.list;\n useEffect(() => {\n if (!open || !list) return;\n const controller = new AbortController();\n list({ limit: RECENT_MEETING_FETCH, signal: controller.signal })\n .then((recordings) => {\n if (controller.signal.aborted) return;\n rememberRecentMeetings(subjectId, workspaceId, meetingRecords(recordings));\n })\n .catch(() => {\n // The rest of the menu still works; meetings are an addition.\n });\n return () => controller.abort();\n // Once per open: a new `list` from the recorder's state changing isn't a reason to ask again.\n }, [open, subjectId, workspaceId, Boolean(list)]); // eslint-disable-line react-hooks/exhaustive-deps\n}\n\n/**\n * The server's meeting search in this workspace, three ways at once: words in\n * titles and transcripts, someone who spoke by name, and, when the query is a\n * date, the meetings that started then. Each answer joins as it arrives.\n */\nfunction useServerMeetingSearch(meetingPages: MeetingPages | null, query: string, open: boolean) {\n const list = meetingPages?.list;\n const listRef = useRef(list);\n listRef.current = list;\n const [state, setState] = useState<{\n key: string;\n found: readonly FoundMeeting[];\n loading: boolean;\n }>({ key: \"\", found: NO_MEETINGS, loading: false });\n const trimmed = query.trim();\n const enabled = open && Boolean(list) && trimmed.length >= MIN_SERVER_MEETING_QUERY;\n useEffect(() => {\n if (!enabled) {\n setState((current) =>\n current.loading || current.found.length > 0\n ? { key: \"\", found: NO_MEETINGS, loading: false }\n : current,\n );\n return;\n }\n setState((current) => ({ ...current, loading: true }));\n const controller = new AbortController();\n const timer = window.setTimeout(() => {\n const search = listRef.current;\n if (!search) return;\n const range = meetingDateRange(trimmed);\n const requests: Array<[FoundMeeting[\"match\"], Parameters<MeetingPages[\"list\"]>[0]]> = [\n [\"words\", { query: trimmed, limit: SERVER_MEETING_LIMIT }],\n [\"person\", { person: trimmed, limit: SERVER_MEETING_LIMIT }],\n ];\n if (range) {\n requests.push([\n \"date\",\n {\n startedFrom: range.from.toISOString(),\n startedTo: range.to.toISOString(),\n limit: SERVER_MEETING_LIMIT,\n },\n ]);\n }\n let pending = requests.length;\n let first = true;\n const settle = (found: FoundMeeting[]) => {\n if (controller.signal.aborted) return;\n pending -= 1;\n const replace = first;\n first = false;\n setState((current) => ({\n key: trimmed,\n found: replace || current.key !== trimmed ? found : [...current.found, ...found],\n loading: pending > 0,\n }));\n };\n for (const [match, options] of requests) {\n search({ ...options, signal: controller.signal })\n .then((recordings) =>\n settle(meetingRecords(recordings).map((meeting) => ({ meeting, match }))),\n )\n .catch(() => settle([]));\n }\n }, SERVER_DEBOUNCE_MS);\n return () => {\n window.clearTimeout(timer);\n controller.abort();\n };\n }, [enabled, trimmed]);\n const current = state.key === trimmed;\n return {\n found: current ? state.found : NO_MEETINGS,\n // While the next answer loads, the last one's meetings stay candidates (by\n // their title alone), so a meeting does not blink out on every keystroke.\n previous: current ? NO_MEETINGS : state.found,\n loading: state.loading,\n };\n}\n\nfunction CommandMenuDialog(props: {\n open: boolean;\n pickWorkspace: boolean;\n onOpenChange: (open: boolean) => void;\n returnFocus: RefObject<HTMLElement | null>;\n env: ActionEnv;\n run(action: AppAction, chat?: SessionListRow | null, chord?: Chord): void;\n chordsFor(action: AppAction): Chord[];\n}) {\n const { env, run, chordsFor, onOpenChange } = props;\n const { workspaceId, subjectId, platform, surface, workspaces } = env;\n const directoryVersion = useChatDirectoryVersion(subjectId);\n const siteDirectoryVersion = useSiteDirectoryVersion(subjectId);\n const meetingDirectoryVersion = useMeetingDirectoryVersion(subjectId);\n const meetingPages = env.meetingPages;\n const [query, setQuery] = useState(\"\");\n const [focusChat, setFocusChat] = useState<ChatRecord | null>(null);\n const [pickingWorkspace, setPickingWorkspace] = useState(props.pickWorkspace);\n const [active, setActive] = useState(0);\n const inputRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const ranAction = useRef(false);\n /** Runs right after the menu has returned focus (see `AppAction.opensDialog`). */\n const afterClose = useRef<(() => void) | null>(null);\n const listId = useId();\n const workspaceNames = useMemo(\n () => new Map(workspaces.map((workspace) => [workspace.id, workspace.name])),\n [workspaces],\n );\n /** Chats the menu may show: this workspace's, and those of other workspaces still open to the person. */\n const reachable = useCallback(\n (id: string) => id === workspaceId || workspaceNames.has(id),\n [workspaceId, workspaceNames],\n );\n // The server searches this workspace and the other workspaces used most recently.\n const searchWorkspaceIds = useMemo(() => {\n void directoryVersion;\n const directory = readChatDirectory(subjectId, workspaceId);\n const used: string[] = [];\n for (const id of directory.recent) {\n const record = directory.rows.get(id);\n if (record && !used.includes(record.workspaceId)) used.push(record.workspaceId);\n }\n const others = [...used, ...workspaces.map((workspace) => workspace.id)].filter(\n (id, index, all) => id !== workspaceId && reachable(id) && all.indexOf(id) === index,\n );\n return [workspaceId, ...others.slice(0, OTHER_WORKSPACES_SEARCHED)];\n // Which workspaces to search changes only when the menu opens.\n }, [props.open, subjectId, workspaceId, workspaces, reachable]); // eslint-disable-line react-hooks/exhaustive-deps\n const server = useServerTitleSearch(\n searchWorkspaceIds,\n subjectId,\n focusChat || pickingWorkspace ? \"\" : query,\n props.open,\n );\n const serverSites = useServerSiteSearch(\n workspaceId,\n focusChat || pickingWorkspace ? \"\" : query,\n props.open,\n );\n useRecentMeetingsRefresh(meetingPages, subjectId, workspaceId, props.open);\n const serverMeetings = useServerMeetingSearch(\n meetingPages,\n focusChat || pickingWorkspace ? \"\" : query,\n props.open,\n );\n\n // Every open starts fresh.\n useEffect(() => {\n if (!props.open) return;\n setQuery(\"\");\n setFocusChat(null);\n setPickingWorkspace(props.pickWorkspace);\n setActive(0);\n ranAction.current = false;\n afterClose.current = null;\n }, [props.open, props.pickWorkspace]);\n\n const close = useCallback(() => onOpenChange(false), [onOpenChange]);\n\n const runAction = useCallback(\n (action: AppAction, chat: SessionListRow | null, chord?: Chord) => {\n if (action.opensDialog) {\n afterClose.current = () => run(action, action.forChat ? chat : undefined, chord);\n close();\n return;\n }\n ranAction.current = true;\n close();\n run(action, action.forChat ? chat : undefined, chord);\n },\n [close, run],\n );\n\n const openChat = useCallback(\n (record: ChatRecord, newTab: boolean) => {\n ranAction.current = true;\n close();\n if (newTab && surface === \"web\") {\n window.open(env.ops.linkTo(record), \"_blank\", \"noopener\");\n return;\n }\n env.openChat(record.id, record.workspaceId);\n },\n [close, env, surface],\n );\n\n const openSite = useCallback(\n (site: SiteRecord, newTab: boolean) => {\n ranAction.current = true;\n close();\n if (newTab && surface === \"web\") {\n window.open(env.siteLink(site.id), \"_blank\", \"noopener\");\n return;\n }\n env.openSite(site.id);\n },\n [close, env, surface],\n );\n\n const openMeeting = useCallback(\n (meeting: MeetingRecord, newTab: boolean) => {\n if (!meetingPages) return;\n ranAction.current = true;\n close();\n if (newTab && surface === \"web\") {\n window.open(meetingPages.link(meeting.id), \"_blank\", \"noopener\");\n return;\n }\n meetingPages.open(meeting.id);\n },\n [close, meetingPages, surface],\n );\n\n const askAboutMeeting = useCallback(\n (question: string) => {\n const ask = meetingPages?.current?.ask;\n if (!ask) return;\n // Asked once the menu has handed focus back, as an action that opens a dialog.\n afterClose.current = () => ask(question);\n close();\n },\n [close, meetingPages],\n );\n\n const openWorkspace = useCallback(\n (id: string) => {\n ranAction.current = true;\n close();\n if (id !== workspaceId) env.openWorkspace(id);\n },\n [close, env, workspaceId],\n );\n\n const startPickingWorkspace = useCallback(() => {\n setFocusChat(null);\n setPickingWorkspace(true);\n setQuery(\"\");\n inputRef.current?.focus();\n }, []);\n\n const actionItem = useCallback(\n (action: AppAction, chat: SessionListRow | null, group: string, highlight?: string): Item => ({\n key: `action:${action.id}`,\n group,\n icon: actionIcon(action, chat),\n title: actionTitle(action, env, chat),\n highlight,\n chord: chordsFor(action)[0],\n // Switching workspace lists the workspaces right here.\n run: () =>\n action.id === \"go.switchWorkspace\" ? startPickingWorkspace() : runAction(action, chat),\n }),\n [chordsFor, env, runAction, startPickingWorkspace],\n );\n\n const groups = useMemo<Group[]>(() => {\n void directoryVersion;\n void siteDirectoryVersion;\n void meetingDirectoryVersion;\n const now = Date.now();\n const directory = readChatDirectory(subjectId, workspaceId);\n const knownSites = readSidebarSites(subjectId, workspaceId);\n const knownMeetings = meetingPages ? readRecentMeetings(subjectId, workspaceId) : [];\n const currentMeetingId = meetingPages?.current?.recordingId ?? null;\n const current = env.currentChat;\n const sidebarIds = new Set([...directory.sidebarOrder, ...directory.pinnedOrder]);\n\n const chatItem = (record: ChatRecord, group: string, highlight?: string): Item => ({\n key: `chat:${record.id}`,\n group,\n icon: chatIcon(record),\n title: record.title,\n highlight,\n meta: current?.id === record.id ? \"Open now\" : relativeMeta(record, now),\n workspaceTag:\n record.workspaceId === workspaceId ? undefined : workspaceNames.get(record.workspaceId),\n parentTitle: chatParentTitle(directory.rows, record) ?? undefined,\n chat: record,\n status: currentChatStatus(record, sidebarIds, now),\n run: ({ newTab }) => openChat(record, newTab),\n });\n\n const siteItem = (site: SiteRecord, group: string, highlight?: string): Item => ({\n key: `site:${site.id}`,\n group,\n icon: PanelsTopLeftIcon,\n title: site.title,\n highlight,\n meta:\n env.currentSiteId === site.id\n ? \"Open now\"\n : site.updatedAt\n ? formatRelativeTime(site.updatedAt, { now })\n : undefined,\n run: ({ newTab }) => openSite(site, newTab),\n });\n\n const meetingItem = (meeting: MeetingRecord, group: string, highlight?: string): Item => ({\n key: `meeting:${meeting.id}`,\n group,\n icon: AudioLinesIcon,\n title: meeting.title,\n highlight,\n meta:\n currentMeetingId === meeting.id\n ? \"Open now\"\n : meeting.startedAt\n ? formatRelativeTime(meeting.startedAt, { now })\n : undefined,\n run: ({ newTab }) => openMeeting(meeting, newTab),\n });\n\n const workspaceItem = (choice: WorkspaceChoice, group: string, highlight?: string): Item => ({\n key: `workspace:${choice.id}`,\n group,\n icon: LockIcon,\n // A Personal workspace shows its lock, as in the workspace picker.\n tile: choice.personal ? undefined : (choice.name.trim()[0] ?? \"W\").toUpperCase(),\n title: choice.name,\n highlight,\n meta: choice.id === workspaceId ? \"Current\" : undefined,\n run: () => openWorkspace(choice.id),\n });\n\n // Workspaces to switch to, by organization.\n if (pickingWorkspace) {\n const trimmed = query.trim();\n const organizations = new Set(workspaces.map((choice) => choice.organization));\n const scored = workspaces.flatMap((choice) => {\n if (!trimmed) return [{ choice, rank: 0 }];\n const rank =\n rankLabel(choice.name, trimmed) ??\n (organizations.size > 1 ? rankLabel(choice.organization, trimmed) : null);\n return rank === null ? [] : [{ choice, rank }];\n });\n const realMatch = scored.some((entry) => entry.rank >= LOOSE_MATCH_BELOW);\n const kept = scored.filter(\n (entry) => !trimmed || !realMatch || entry.rank >= LOOSE_MATCH_BELOW,\n );\n if (trimmed) {\n kept.sort((a, b) => b.rank - a.rank);\n return [\n {\n label: \"Workspaces\",\n items: kept.map((entry) => workspaceItem(entry.choice, \"Workspaces\", trimmed)),\n best: 0,\n },\n ];\n }\n const byOrganization = new Map<string, Item[]>();\n for (const { choice } of kept) {\n const label = organizations.size > 1 ? choice.organization : \"Workspaces\";\n const list = byOrganization.get(label) ?? [];\n list.push(workspaceItem(choice, label));\n byOrganization.set(label, list);\n }\n return [...byOrganization].map(([label, items]) => ({ label, items, best: 0 }));\n }\n\n // A chat's own actions (after Tab).\n if (focusChat) {\n // Chats in other workspaces offer what works from here: open and copy link.\n const sameWorkspace = focusChat.workspaceId === workspaceId;\n const row = sameWorkspace\n ? (focusChat.row ?? (current?.id === focusChat.id ? current : null))\n : null;\n const items: Array<{ item: Item; rank: number }> = [];\n const openRank = rankLabel(\"Open\", query);\n if (openRank !== null) {\n items.push({\n rank: openRank + 1,\n item: {\n key: \"open\",\n group: focusChat.title,\n icon: CornerDownLeftIcon,\n title: \"Open\",\n highlight: query,\n run: () => openChat(focusChat, false),\n },\n });\n }\n if (surface === \"web\") {\n const tabRank = rankLabel(\"Open in new tab\", query);\n if (tabRank !== null) {\n items.push({\n rank: tabRank,\n item: {\n key: \"open-tab\",\n group: focusChat.title,\n icon: ArrowUpRightIcon,\n title: \"Open in new tab\",\n highlight: query,\n run: () => openChat(focusChat, true),\n },\n });\n }\n }\n for (const action of appActions()) {\n if (!action.forChat || action.inCommandMenu === false) continue;\n // Copy link needs only the id; the rest need the chat's row.\n const target = row ?? (action.id === \"chat.copyLink\" ? pseudoRow(focusChat) : null);\n if (!target || !action.available(env, target)) continue;\n const rank = rankWithKeywords(actionTitle(action, env, target), action.keywords, query);\n if (rank === null) continue;\n items.push({ rank, item: actionItem(action, target, focusChat.title, query) });\n }\n if (query) items.sort((a, b) => b.rank - a.rank);\n return [{ label: focusChat.title, items: items.map((entry) => entry.item), best: 0 }];\n }\n\n const trimmed = query.trim();\n if (!trimmed) {\n const result: Group[] = [];\n // Chats opened recently come first; the top of the sidebar fills the\n // rest, so a fresh window still offers somewhere to go. A sub-agent\n // chat comes in only by being opened here (or pinned).\n const opened = new Set(directory.recent);\n const recentIds = [...new Set([...directory.recent, ...directory.sidebarOrder])].filter(\n (id) => id !== current?.id,\n );\n const recent = recentIds\n .map((id) => directory.rows.get(id))\n .filter((record): record is ChatRecord =>\n Boolean(\n record &&\n (opened.has(record.id) || listsAsTopLevel(record)) &&\n !record.archived &&\n reachable(record.workspaceId),\n ),\n )\n .slice(0, RECENT_LIMIT);\n if (recent.length > 0) {\n result.push({\n label: \"Recent chats\",\n items: recent.map((record) => chatItem(record, \"Recent chats\")),\n best: 0,\n });\n }\n const sites = recentSites(knownSites, env.currentSiteId, RECENT_SITE_LIMIT);\n if (sites.length > 0) {\n result.push({\n label: \"Recent Sites\",\n items: sites.map((site) => siteItem(site, \"Recent Sites\")),\n best: 0,\n });\n }\n const meetings = recentMeetings(knownMeetings, currentMeetingId, RECENT_MEETING_LIMIT);\n if (meetings.length > 0) {\n result.push({\n label: \"Recent meetings\",\n items: meetings.map((meeting) => meetingItem(meeting, \"Recent meetings\")),\n best: 0,\n });\n }\n if (current) {\n const chatActions = appActions().filter(\n (action) =>\n action.forChat &&\n action.inCommandMenu !== false &&\n action.id !== \"chat.find\" &&\n action.available(env, current),\n );\n if (chatActions.length > 0) {\n result.push({\n label: \"This chat\",\n items: chatActions.map((action) => actionItem(action, current, \"This chat\")),\n best: 0,\n });\n }\n }\n // The meeting on screen's own actions (ask about it, copy its link).\n const meetingActions = appActions().filter(\n (action) =>\n action.forMeeting && action.inCommandMenu !== false && action.available(env, null),\n );\n if (meetingActions.length > 0) {\n result.push({\n label: \"This meeting\",\n items: meetingActions.map((action) => actionItem(action, null, \"This meeting\")),\n best: 0,\n });\n }\n const general = appActions().filter(\n (action) =>\n !action.forChat &&\n !action.forMeeting &&\n action.inCommandMenu !== false &&\n action.id !== \"commandMenu.open\" &&\n action.available(env, null),\n );\n if (general.length > 0) {\n result.push({\n label: \"Go to\",\n items: general.map((action) => actionItem(action, null, \"Go to\")),\n best: 0,\n });\n }\n return result;\n }\n\n // Chats: everything the app knows, ranked by title, plus the server's\n // matches. Sub-agent chats rank the same way but list on their own.\n const recentIndex = new Map(directory.recent.map((id, index) => [id, index]));\n const serverIds = new Set(server.query === trimmed ? server.rows.map((row) => row.id) : []);\n const scored: Array<{ record: ChatRecord; rank: number; loose: boolean }> = [];\n const subagentScored: Array<{ record: ChatRecord; rank: number; loose: boolean }> = [];\n for (const record of directory.rows.values()) {\n if (!reachable(record.workspaceId)) continue;\n let rank = rankLabel(record.title, trimmed);\n const loose = rank !== null && rank < LOOSE_MATCH_BELOW;\n // The server matched every word in the title or first message.\n if (rank === null && serverIds.has(record.id)) rank = 50;\n if (rank === null) continue;\n const visited = recentIndex.get(record.id);\n if (visited !== undefined) rank += Math.max(0, 20 - visited);\n if (record.pinned) rank += 5;\n if (record.archived) rank -= 300;\n if (record.workspaceId !== workspaceId) rank -= ELSEWHERE_PENALTY;\n (listsAsTopLevel(record) ? scored : subagentScored).push({ record, rank, loose });\n }\n\n const actionScores: Array<{ item: Item; rank: number; loose: boolean }> = [];\n for (const action of appActions()) {\n if (action.inCommandMenu === false) continue;\n const target = action.forChat ? current : null;\n if (action.forChat && !target) continue;\n if (!action.available(env, target)) continue;\n const rank = rankWithKeywords(actionTitle(action, env, target), action.keywords, trimmed);\n if (rank === null) continue;\n actionScores.push({\n rank,\n loose: rank < LOOSE_MATCH_BELOW,\n item: actionItem(action, target, \"Actions\", trimmed),\n });\n }\n const workspaceScores: Array<{ item: Item; rank: number; loose: boolean }> = [];\n for (const choice of workspaces) {\n if (choice.id === workspaceId) continue;\n const rank = rankLabel(choice.name, trimmed);\n if (rank === null) continue;\n workspaceScores.push({\n rank,\n loose: rank < LOOSE_MATCH_BELOW,\n item: workspaceItem(choice, \"Workspaces\", trimmed),\n });\n }\n const knownIds = new Set(knownSites.map((site) => site.id));\n const siteScores = rankSites(\n [...knownSites, ...serverSites.previous.filter((site) => !knownIds.has(site.id))],\n serverSites.sites,\n trimmed,\n );\n const knownMeetingIds = new Set(knownMeetings.map((meeting) => meeting.id));\n const meetingScores = meetingPages\n ? rankMeetings(\n [\n ...knownMeetings,\n ...serverMeetings.previous\n .map((entry) => entry.meeting)\n .filter((meeting) => !knownMeetingIds.has(meeting.id)),\n ],\n serverMeetings.found,\n trimmed,\n meetingDateRange(trimmed, new Date(now)),\n )\n : [];\n // Letters-in-order guesses only help when nothing really matches; next to\n // real matches they are noise (\"pin\" → \"Postgres … investigation\").\n const hasRealMatch =\n scored.some((entry) => !entry.loose) ||\n siteScores.some((entry) => !entry.loose) ||\n meetingScores.some((entry) => !entry.loose) ||\n actionScores.some((entry) => !entry.loose) ||\n workspaceScores.some((entry) => !entry.loose);\n const chats = scored\n .filter((entry) => !hasRealMatch || !entry.loose)\n .sort((a, b) => b.rank - a.rank || b.record.updatedAt - a.record.updatedAt)\n .slice(0, CHAT_RESULT_LIMIT);\n // Only real matches: a letters-in-order guess among that many chats is noise.\n const subagentChats = subagentScored\n .filter((entry) => !entry.loose)\n .sort((a, b) => b.rank - a.rank || b.record.updatedAt - a.record.updatedAt)\n .slice(0, SUBAGENT_RESULT_LIMIT);\n const sitesFound = siteScores\n .filter((entry) => !hasRealMatch || !entry.loose)\n .slice(0, SITE_RESULT_LIMIT);\n const meetingsFound = meetingScores\n .filter((entry) => !hasRealMatch || !entry.loose)\n .slice(0, MEETING_RESULT_LIMIT);\n const actionsFound = actionScores\n .filter((entry) => !hasRealMatch || !entry.loose)\n .sort((a, b) => b.rank - a.rank)\n .slice(0, ACTION_RESULT_LIMIT);\n const workspacesFound = workspaceScores\n .filter((entry) => !hasRealMatch || !entry.loose)\n .sort((a, b) => b.rank - a.rank)\n .slice(0, WORKSPACE_RESULT_LIMIT);\n\n const result: Group[] = [];\n if (chats.length > 0) {\n result.push({\n label: \"Chats\",\n items: chats.map((entry) => chatItem(entry.record, \"Chats\", trimmed)),\n best: chats[0]!.rank,\n });\n }\n if (actionsFound.length > 0) {\n result.push({\n label: \"Actions\",\n items: actionsFound.map((entry) => entry.item),\n best: actionsFound[0]!.rank,\n });\n }\n if (workspacesFound.length > 0) {\n result.push({\n label: \"Workspaces\",\n items: workspacesFound.map((entry) => entry.item),\n // Chats and actions first on a tie: a workspace is a bigger jump.\n best: workspacesFound[0]!.rank - 1,\n });\n }\n // A clearly better action match (\"new\" → New chat) comes before chats.\n result.sort((a, b) => b.best - a.best);\n if (sitesFound.length > 0) {\n const sitesGroup: Group = {\n label: \"Sites\",\n items: sitesFound.map((entry) => siteItem(entry.site, \"Sites\", trimmed)),\n best: sitesFound[0]!.rank,\n };\n // Sites always follow chats; with no chats they take their place by match.\n const chatsAt = result.findIndex((group) => group.label === \"Chats\");\n const at =\n chatsAt >= 0 ? chatsAt + 1 : result.findIndex((group) => group.best < sitesGroup.best);\n result.splice(at >= 0 ? at : result.length, 0, sitesGroup);\n }\n if (subagentChats.length > 0) {\n const subagentGroup: Group = {\n label: \"Sub-agent chats\",\n items: subagentChats.map((entry) => chatItem(entry.record, \"Sub-agent chats\", trimmed)),\n best: subagentChats[0]!.rank,\n };\n // Right below the chats; with no chats, after anything that matches as well.\n const chatsAt = result.findIndex((group) => group.label === \"Chats\");\n const at =\n chatsAt >= 0 ? chatsAt + 1 : result.findIndex((group) => group.best < subagentGroup.best);\n result.splice(at >= 0 ? at : result.length, 0, subagentGroup);\n }\n if (meetingsFound.length > 0) {\n const meetingsGroup: Group = {\n label: \"Meetings\",\n items: meetingsFound.map((entry) => meetingItem(entry.meeting, \"Meetings\", trimmed)),\n best: meetingsFound[0]!.rank,\n };\n // Like Sites: after the chats and Sites; with neither, placed by match.\n const lastFound = Math.max(\n result.findIndex((group) => group.label === \"Chats\"),\n result.findIndex((group) => group.label === \"Sub-agent chats\"),\n result.findIndex((group) => group.label === \"Sites\"),\n );\n const at =\n lastFound >= 0\n ? lastFound + 1\n : result.findIndex((group) => group.best < meetingsGroup.best);\n result.splice(at >= 0 ? at : result.length, 0, meetingsGroup);\n }\n if (meetingPages?.current?.ask) {\n result.push({\n label: \"This meeting\",\n best: -Infinity,\n items: [\n {\n key: \"ask-meeting\",\n group: \"This meeting\",\n icon: MessageCircleQuestionIcon,\n title: `Ask about this meeting: “${trimmed}”`,\n run: () => askAboutMeeting(trimmed),\n },\n ],\n });\n }\n result.push({\n label: \"Messages\",\n best: -Infinity,\n items: [\n {\n key: \"search-messages\",\n group: \"Messages\",\n icon: TextSearchIcon,\n title: `Search messages for “${trimmed}”`,\n run: () => {\n afterClose.current = () => env.searchMessages(trimmed);\n close();\n },\n },\n ],\n });\n return result;\n }, [\n actionItem,\n askAboutMeeting,\n close,\n directoryVersion,\n env,\n focusChat,\n meetingDirectoryVersion,\n meetingPages,\n openChat,\n openMeeting,\n openSite,\n openWorkspace,\n pickingWorkspace,\n query,\n reachable,\n server.query,\n server.rows,\n serverMeetings.found,\n serverMeetings.previous,\n serverSites.sites,\n serverSites.previous,\n siteDirectoryVersion,\n subjectId,\n surface,\n workspaceId,\n workspaceNames,\n workspaces,\n ]);\n\n const items = useMemo(() => groups.flatMap((group) => group.items), [groups]);\n const listedChatIds = useMemo(\n () => items.flatMap((item) => (item.chat ? [item.chat.id] : [])),\n [items],\n );\n useChatStatusRefresh({ subjectId, workspaceId, ids: listedChatIds, active: props.open });\n const activeIndex = items.length === 0 ? -1 : Math.min(active, items.length - 1);\n const activeItem = activeIndex >= 0 ? items[activeIndex] : undefined;\n const searching =\n Boolean(query.trim()) &&\n !focusChat &&\n !pickingWorkspace &&\n (server.loading || serverSites.loading || serverMeetings.loading);\n\n // Typing starts at the best match; the workspace list starts at the current workspace's neighbour.\n useEffect(() => {\n if (pickingWorkspace && !query) {\n const index = workspaces.findIndex((choice) => choice.id === workspaceId);\n setActive(index >= 0 && workspaces.length > 1 ? (index + 1) % workspaces.length : 0);\n return;\n }\n setActive(0);\n }, [query, focusChat, pickingWorkspace, workspaces, workspaceId]);\n\n // Keep the highlighted row in view without scrolling the page.\n useLayoutEffect(() => {\n if (!activeItem) return;\n const element = listRef.current?.querySelector<HTMLElement>(\n `[data-item-key=\"${CSS.escape(activeItem.key)}\"]`,\n );\n element?.scrollIntoView({ block: \"nearest\" });\n }, [activeItem]);\n\n const enterChat = useCallback((record: ChatRecord) => {\n setFocusChat(record);\n setQuery(\"\");\n inputRef.current?.focus();\n }, []);\n const leaveChat = useCallback(() => {\n setFocusChat(null);\n setPickingWorkspace(false);\n setQuery(\"\");\n }, []);\n\n const onKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (event.nativeEvent.isComposing) return;\n const count = items.length;\n const mod = platform === \"mac\" ? event.metaKey : event.ctrlKey;\n switch (event.key) {\n case \"ArrowDown\":\n case \"ArrowUp\": {\n if (event.altKey || mod) break;\n event.preventDefault();\n if (count === 0) return;\n const step = event.key === \"ArrowDown\" ? 1 : -1;\n setActive((current) => (Math.min(current, count - 1) + step + count) % count);\n return;\n }\n case \"PageDown\":\n case \"PageUp\": {\n event.preventDefault();\n if (count === 0) return;\n const step = event.key === \"PageDown\" ? 5 : -5;\n setActive((current) => Math.max(0, Math.min(count - 1, current + step)));\n return;\n }\n case \"Home\":\n case \"End\": {\n // Inside the field these move the caret, unless the field is empty.\n if (query) break;\n event.preventDefault();\n setActive(event.key === \"Home\" ? 0 : Math.max(0, count - 1));\n return;\n }\n case \"Enter\": {\n event.preventDefault();\n activeItem?.run({ newTab: mod });\n return;\n }\n case \"Tab\": {\n event.preventDefault();\n if (event.shiftKey) {\n if (focusChat || pickingWorkspace) leaveChat();\n return;\n }\n if (!focusChat && activeItem?.chat) enterChat(activeItem.chat);\n return;\n }\n case \"Backspace\": {\n if ((focusChat || pickingWorkspace) && !query) {\n event.preventDefault();\n leaveChat();\n }\n return;\n }\n default:\n break;\n }\n // A chat action's chord acts on the highlighted chat, as in Linear.\n const chatRecord = focusChat ?? activeItem?.chat;\n if (!chatRecord) return;\n const sameWorkspace = chatRecord.workspaceId === workspaceId;\n for (const action of appActions()) {\n if (!action.forChat) continue;\n const chord = chordsFor(action).find((candidate) =>\n matchesChord(event.nativeEvent, candidate, platform),\n );\n if (!chord) continue;\n const row =\n (sameWorkspace\n ? (chatRecord.row ?? (env.currentChat?.id === chatRecord.id ? env.currentChat : null))\n : null) ?? (action.id === \"chat.copyLink\" ? pseudoRow(chatRecord) : null);\n event.preventDefault();\n event.stopPropagation();\n if (row && action.available(env, row)) runAction(action, row, chord);\n return;\n }\n },\n [\n activeItem,\n chordsFor,\n enterChat,\n env,\n focusChat,\n items.length,\n leaveChat,\n pickingWorkspace,\n platform,\n query,\n runAction,\n workspaceId,\n ],\n );\n\n const placeholder = focusChat\n ? \"Search actions…\"\n : pickingWorkspace\n ? \"Switch to workspace…\"\n : meetingPages\n ? \"Search chats, Sites and meetings, or run an action…\"\n : \"Search chats and Sites, or run an action…\";\n const optionId = (item: Item) => `${listId}-${item.key.replace(/[^a-zA-Z0-9_-]/g, \"_\")}`;\n\n return (\n <DialogPrimitive.Root open={props.open} onOpenChange={onOpenChange}>\n <DialogPortal>\n <DialogOverlay className=\"bg-black/25 dark:bg-black/45\" />\n <DialogPrimitive.Content\n data-og-command-menu=\"\"\n aria-label=\"Command menu\"\n aria-describedby={undefined}\n onOpenAutoFocus={(event) => {\n event.preventDefault();\n inputRef.current?.focus();\n }}\n onCloseAutoFocus={(event) => {\n // An action moves focus where it belongs (the new chat's composer,\n // the title being renamed); only a plain close returns focus.\n if (ranAction.current) {\n event.preventDefault();\n return;\n }\n const target = props.returnFocus.current;\n if (target?.isConnected) {\n event.preventDefault();\n target.focus({ preventScroll: true });\n }\n const next = afterClose.current;\n afterClose.current = null;\n next?.();\n }}\n onEscapeKeyDown={(event) => {\n // Esc steps back out of a chat's actions, or the workspace list\n // reached from the menu, before it closes the menu.\n if (!focusChat && !(pickingWorkspace && !props.pickWorkspace)) return;\n event.preventDefault();\n leaveChat();\n }}\n onKeyDown={onKeyDown}\n className={cn(\n \"fixed top-[12dvh] left-1/2 z-50 flex max-h-[min(560px,76dvh)] w-[calc(100vw-1.5rem)] max-w-[640px] -translate-x-1/2 flex-col overflow-hidden\",\n \"rounded-2xl border border-border bg-surface text-fg shadow-og-lg outline-hidden\",\n \"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-98\",\n \"data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-98\",\n \"duration-[120ms] max-sm:top-3\",\n )}\n >\n <DialogPrimitive.Title className=\"sr-only\">Command menu</DialogPrimitive.Title>\n <div className=\"flex min-h-13 shrink-0 items-center gap-2.5 border-b border-border px-4\">\n <SearchIcon aria-hidden=\"true\" className=\"size-4 shrink-0 text-fg-muted\" />\n {focusChat ? (\n <button\n type=\"button\"\n onClick={leaveChat}\n title=\"Back to all results\"\n className=\"inline-flex max-w-[45%] shrink-0 items-center gap-1 rounded-full bg-hover py-0.5 pr-1.5 pl-2.5 text-xs font-medium text-fg outline-hidden hover:bg-selection focus-visible:outline-2 focus-visible:outline-ring/55\"\n >\n <span className=\"truncate\">{focusChat.title}</span>\n <ChevronRightIcon aria-hidden=\"true\" className=\"size-3.5 text-fg-muted\" />\n </button>\n ) : pickingWorkspace ? (\n <button\n type=\"button\"\n onClick={leaveChat}\n title=\"Back to all results\"\n className=\"inline-flex shrink-0 items-center gap-1 rounded-full bg-hover py-0.5 pr-1.5 pl-2.5 text-xs font-medium text-fg outline-hidden hover:bg-selection focus-visible:outline-2 focus-visible:outline-ring/55\"\n >\n Workspaces\n <ChevronRightIcon aria-hidden=\"true\" className=\"size-3.5 text-fg-muted\" />\n </button>\n ) : null}\n <input\n ref={inputRef}\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={listId}\n aria-autocomplete=\"list\"\n aria-activedescendant={activeItem ? optionId(activeItem) : undefined}\n aria-label={\n focusChat\n ? `Actions for ${focusChat.title}`\n : pickingWorkspace\n ? \"Search workspaces\"\n : meetingPages\n ? \"Search chats, Sites, meetings and actions\"\n : \"Search chats, Sites and actions\"\n }\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n enterKeyHint=\"go\"\n value={query}\n maxLength={200}\n placeholder={placeholder}\n onChange={(event) => setQuery(event.target.value)}\n // The whole menu is the focus context; a ring on the field adds noise.\n style={{ outline: \"none\" }}\n className=\"h-13 min-w-0 flex-1 bg-transparent text-[15px] text-fg outline-hidden placeholder:text-fg-subtle\"\n />\n {searching ? (\n <span\n aria-hidden=\"true\"\n className=\"size-3.5 shrink-0 animate-spin rounded-full border-[1.5px] border-fg-subtle/40 border-t-fg-muted\"\n />\n ) : null}\n </div>\n <div\n ref={listRef}\n id={listId}\n role=\"listbox\"\n aria-label={focusChat ? \"Chat actions\" : pickingWorkspace ? \"Workspaces\" : \"Results\"}\n className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain p-1.5\"\n >\n {items.length === 0 ? (\n <p className=\"px-2.5 py-6 text-center text-sm text-fg-muted\">\n {searching ? \"Searching…\" : \"No matches\"}\n </p>\n ) : (\n groups.map((group) =>\n group.items.length === 0 ? null : (\n <div key={group.label} role=\"group\" aria-label={group.label}>\n {groups.length > 1 || !focusChat ? (\n <div className=\"truncate px-2.5 pt-2 pb-1 text-xs leading-4.5 font-medium text-fg-muted\">\n {group.label}\n </div>\n ) : null}\n {group.items.map((item) => {\n const index = items.indexOf(item);\n const selected = index === activeIndex;\n const Icon = item.icon;\n return (\n <div\n key={item.key}\n id={optionId(item)}\n data-item-key={item.key}\n role=\"option\"\n aria-selected={selected}\n onPointerMove={() => {\n if (!selected) setActive(index);\n }}\n onPointerDown={(event) => event.preventDefault()}\n onClick={(event) =>\n item.run({ newTab: platform === \"mac\" ? event.metaKey : event.ctrlKey })\n }\n className={cn(\n \"relative flex min-h-9 w-full min-w-0 cursor-default items-center gap-2.5 rounded-[10px] px-2.5 py-1.5 text-sm text-fg-label select-none pointer-coarse:min-h-11\",\n selected ? \"bg-hover text-fg\" : null,\n )}\n >\n {item.chat?.avatar ? (\n <SessionAvatar\n avatar={item.chat.avatar}\n name={item.chat.title}\n workspaceId={item.chat.workspaceId}\n seed={item.chat.id}\n size=\"xs\"\n />\n ) : item.tile ? (\n <span\n aria-hidden=\"true\"\n className=\"flex size-4 shrink-0 items-center justify-center rounded-[4px] bg-surface-3 text-2xs font-semibold text-fg-muted\"\n >\n {item.tile}\n </span>\n ) : (\n <Icon\n aria-hidden=\"true\"\n className={cn(\n \"size-4 shrink-0\",\n selected ? \"text-fg\" : \"text-fg-muted\",\n )}\n />\n )}\n {item.parentTitle ? (\n <ChatTitleInParent\n title={<Highlighted text={item.title} query={item.highlight} />}\n parentTitle={item.parentTitle}\n />\n ) : (\n <span className=\"min-w-0 flex-1 truncate\">\n <Highlighted text={item.title} query={item.highlight} />\n </span>\n )}\n {item.workspaceTag ? <WorkspaceTag name={item.workspaceTag} /> : null}\n <ChatStatusMarks status={item.status ?? null} />\n {item.meta ? (\n <span className=\"shrink-0 text-xs text-fg-muted tabular-nums\">\n {item.meta}\n </span>\n ) : null}\n {item.chord ? (\n // Touch screens have no keys to press.\n <Keycaps\n chord={item.chord}\n platform={platform}\n className=\"pointer-coarse:hidden\"\n />\n ) : null}\n </div>\n );\n })}\n </div>\n ),\n )\n )}\n </div>\n <div className=\"hidden shrink-0 items-center gap-4 border-t border-border px-4 py-2 text-xs text-fg-muted pointer-fine:flex\">\n <FooterHint\n keys={[{ code: \"ArrowUp\" }, { code: \"ArrowDown\" }]}\n label=\"Move\"\n platform={platform}\n />\n <FooterHint\n keys={[{ code: \"Enter\" }]}\n label={pickingWorkspace ? \"Switch\" : \"Open\"}\n platform={platform}\n />\n {focusChat || pickingWorkspace ? (\n <FooterHint keys={[{ code: \"Escape\" }]} label=\"Back\" platform={platform} />\n ) : (\n <FooterHint keys={[{ code: \"Tab\" }]} label=\"Chat actions\" platform={platform} />\n )}\n {surface === \"web\" && !focusChat && !pickingWorkspace ? (\n <FooterHint\n keys={[{ code: \"Enter\", mod: true }]}\n label=\"New tab\"\n platform={platform}\n />\n ) : null}\n <span className=\"ml-auto inline-flex items-center gap-1.5\">\n <Keycaps chord={{ code: \"Slash\", mod: true }} platform={platform} />\n All shortcuts\n </span>\n </div>\n </DialogPrimitive.Content>\n </DialogPortal>\n </DialogPrimitive.Root>\n );\n}\n\nfunction FooterHint(props: { keys: Chord[]; label: string; platform: ActionEnv[\"platform\"] }) {\n return (\n <span className=\"inline-flex items-center gap-1.5\">\n <span className=\"inline-flex items-center gap-0.5\">\n {props.keys.map((chord) => (\n <Keycaps key={chord.code} chord={chord} platform={props.platform} />\n ))}\n </span>\n {props.label}\n </span>\n );\n}\n\n/** Enough of a chat row to copy its link when only a recent-chats record is known. */\nfunction pseudoRow(record: ChatRecord): SessionListRow {\n return { id: record.id, workspaceId: record.workspaceId } as SessionListRow;\n}\n","/** Ranking for the ⌘K menu's Sites; kept apart from the sidebar's store so the sidebar never loads it. */\nimport { LOOSE_MATCH_BELOW, rankLabel } from \"./rank\";\nimport type { SiteRecord } from \"./site-directory\";\n\nexport type RankedSite = { site: SiteRecord; rank: number; loose: boolean };\n\n/**\n * Ranks Sites by title the way the menu ranks chat titles. `known` are the\n * Sites the app already holds (instant), most recently active first; `found`\n * are the server's matches for this query, which always count even when the\n * title alone would not match locally. As with recently opened chats, the\n * Sites someone was active in lately get a small lift within a match tier,\n * and recent activity breaks ties.\n */\nexport function rankSites(\n known: readonly SiteRecord[],\n found: readonly SiteRecord[],\n query: string,\n): RankedSite[] {\n const trimmed = query.trim();\n if (!trimmed) return [];\n const candidates = new Map<\n string,\n { site: SiteRecord; fromServer: boolean; recency: number | undefined }\n >();\n known.forEach((site, index) =>\n candidates.set(site.id, { site, fromServer: false, recency: index }),\n );\n for (const site of found) {\n const current = candidates.get(site.id);\n // The server's read has the current title; keep the later activity.\n candidates.set(site.id, {\n site: current\n ? { ...site, updatedAt: Math.max(site.updatedAt, current.site.updatedAt) }\n : site,\n fromServer: true,\n recency: current?.recency,\n });\n }\n const ranked: RankedSite[] = [];\n for (const { site, fromServer, recency } of candidates.values()) {\n let rank = rankLabel(site.title, trimmed);\n const loose = rank !== null && rank < LOOSE_MATCH_BELOW;\n // The server matched the title; folding can differ, so keep it.\n if (rank === null && fromServer) rank = 50;\n if (rank === null) continue;\n if (recency !== undefined) rank += Math.max(0, 20 - recency);\n ranked.push({ site, rank, loose });\n }\n return ranked.sort((a, b) => b.rank - a.rank || b.site.updatedAt - a.site.updatedAt);\n}\n\n/** Sites for the empty menu: the most recently active ones, without the one on screen. */\nexport function recentSites(\n known: readonly SiteRecord[],\n currentSiteId: string | null,\n limit: number,\n): SiteRecord[] {\n return [...known]\n .filter((site) => site.id !== currentSiteId)\n .sort((a, b) => b.updatedAt - a.updatedAt)\n .slice(0, limit);\n}\n","/**\n * How the ⌘K menu finds meetings: by title, by someone who spoke in them, by\n * words said in them (the server's search), and by roughly when they happened\n * (\"yesterday\", \"friday\", \"30 oct\", \"last week\"). English and Norwegian date\n * words both work, since meetings are often held in either.\n */\nimport { foldForSearch, LOOSE_MATCH_BELOW, rankLabel } from \"./rank\";\nimport type { MeetingRecord } from \"./meeting-directory\";\n\n/** A stretch of time someone typed: from its start, up to but not including its end. */\nexport type MeetingDateRange = { from: Date; to: Date };\n\n/** Sunday first, as `Date.getDay()` counts. */\nconst WEEKDAYS: readonly (readonly string[])[] = [\n [\"sunday\", \"sun\", \"sondag\", \"son\"],\n [\"monday\", \"mon\", \"mandag\", \"man\"],\n [\"tuesday\", \"tue\", \"tues\", \"tirsdag\", \"tir\"],\n [\"wednesday\", \"wed\", \"onsdag\", \"ons\"],\n [\"thursday\", \"thu\", \"thur\", \"thurs\", \"torsdag\", \"tor\"],\n [\"friday\", \"fri\", \"fredag\", \"fre\"],\n [\"saturday\", \"sat\", \"lordag\", \"lor\"],\n];\n\nconst MONTHS: readonly (readonly string[])[] = [\n [\"january\", \"jan\", \"januar\"],\n [\"february\", \"feb\", \"februar\"],\n [\"march\", \"mar\", \"mars\"],\n [\"april\", \"apr\"],\n [\"may\", \"mai\"],\n [\"june\", \"jun\", \"juni\"],\n [\"july\", \"jul\", \"juli\"],\n [\"august\", \"aug\"],\n [\"september\", \"sep\", \"sept\"],\n [\"october\", \"oct\", \"oktober\", \"okt\"],\n [\"november\", \"nov\"],\n [\"december\", \"dec\", \"desember\", \"des\"],\n];\n\n/**\n * Month names that stand alone as a date. Abbreviations (\"jan\", \"mar\") only\n * count beside a day, since on their own they are often names or words.\n */\nconst FULL_MONTHS = new Set([\n \"january\",\n \"januar\",\n \"february\",\n \"februar\",\n \"march\",\n \"mars\",\n \"april\",\n \"may\",\n \"mai\",\n \"june\",\n \"juni\",\n \"july\",\n \"juli\",\n \"august\",\n \"september\",\n \"october\",\n \"oktober\",\n \"november\",\n \"december\",\n \"desember\",\n]);\n\nfunction startOfDay(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate());\n}\n\nfunction addDays(date: Date, days: number): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate() + days);\n}\n\nfunction oneDay(day: Date): MeetingDateRange {\n return { from: day, to: addDays(day, 1) };\n}\n\nfunction weekday(word: string): number | null {\n const index = WEEKDAYS.findIndex((names) => names.includes(word));\n return index < 0 ? null : index;\n}\n\nfunction month(word: string): number | null {\n const cleaned = word.replace(/\\.$/, \"\");\n const index = MONTHS.findIndex((names) => names.includes(cleaned));\n return index < 0 ? null : index;\n}\n\n/** A day of a month without a year: this year's, or last year's if that is still to come. */\nfunction pastDate(today: Date, monthIndex: number, day: number, year?: number): Date | null {\n if (day < 1 || day > 31 || monthIndex < 0 || monthIndex > 11) return null;\n let date = new Date(year ?? today.getFullYear(), monthIndex, day);\n // 31 Feb and the like roll into the next month: not a date.\n if (date.getMonth() !== monthIndex) return null;\n if (year === undefined && date > today) date = new Date(today.getFullYear() - 1, monthIndex, day);\n return date;\n}\n\nfunction fullYear(text: string | undefined): number | undefined {\n if (!text) return undefined;\n const value = Number(text);\n return text.length === 2 ? 2000 + value : value;\n}\n\n/** Monday-first weeks, as calendars in Norway and most of Europe count them. */\nfunction startOfWeek(day: Date): Date {\n return addDays(day, -((day.getDay() + 6) % 7));\n}\n\n/**\n * The time a query names, when the whole query is a date: \"today\",\n * \"yesterday\", a weekday (the latest one, today included; \"last friday\" is the\n * one before today), \"this week\", \"last week\", a month (\"october\", the latest\n * one), a day of a month (\"30 oct\", \"oct 30\", \"30. oktober\", with or without\n * a year), \"30.10\", \"30.10.2026\" or \"2026-10-30\". Null otherwise.\n */\nexport function meetingDateRange(query: string, now: Date = new Date()): MeetingDateRange | null {\n const text = foldForSearch(query).replace(/,/g, \" \").replace(/\\s+/g, \" \").trim();\n if (!text) return null;\n const today = startOfDay(now);\n if (text === \"today\" || text === \"i dag\" || text === \"idag\") return oneDay(today);\n if (text === \"yesterday\" || text === \"i gar\" || text === \"igar\")\n return oneDay(addDays(today, -1));\n if (text === \"this week\" || text === \"denne uken\" || text === \"denne uka\") {\n return { from: startOfWeek(today), to: addDays(today, 1) };\n }\n if (text === \"last week\" || text === \"forrige uke\" || text === \"sist uke\") {\n const thisWeek = startOfWeek(today);\n return { from: addDays(thisWeek, -7), to: thisWeek };\n }\n const words = text.split(\" \");\n // A weekday: \"friday\", \"on friday\", \"last friday\", \"fredag\", \"forrige fredag\", \"pa fredag\".\n const last = words[0] === \"last\" || words[0] === \"forrige\" || words[0] === \"sist\";\n const dayWords = words[0] === \"on\" || words[0] === \"pa\" || last ? words.slice(1) : words;\n // Bare abbreviations (\"man\", \"tor\", \"sun\") are ordinary words too; they need \"last\" or \"on\".\n if (dayWords.length === 1 && (dayWords !== words || dayWords[0]!.length >= 6)) {\n const day = weekday(dayWords[0]!);\n if (day !== null) {\n let back = (today.getDay() - day + 7) % 7;\n if (last && back === 0) back = 7;\n return oneDay(addDays(today, -back));\n }\n }\n // A month on its own: the latest one, this month included.\n if (words.length === 1 && FULL_MONTHS.has(words[0]!)) {\n const monthIndex = month(words[0]!);\n if (monthIndex !== null) {\n const year = monthIndex <= today.getMonth() ? today.getFullYear() : today.getFullYear() - 1;\n return { from: new Date(year, monthIndex, 1), to: new Date(year, monthIndex + 1, 1) };\n }\n }\n // 2026-10-30\n const iso = /^(\\d{4})-(\\d{1,2})-(\\d{1,2})$/.exec(text);\n if (iso) {\n const date = pastDate(today, Number(iso[2]) - 1, Number(iso[3]), Number(iso[1]));\n return date ? oneDay(date) : null;\n }\n // 30.10, 30.10.2026, 30.10.26\n const dotted = /^(\\d{1,2})\\.(\\d{1,2})\\.?(\\d{2}|\\d{4})?$/.exec(text);\n if (dotted) {\n const date = pastDate(today, Number(dotted[2]) - 1, Number(dotted[1]), fullYear(dotted[3]));\n return date ? oneDay(date) : null;\n }\n // 30 oct, 30. oktober, 30 october 2026\n const dayFirst = /^(\\d{1,2})\\.? ([a-z]+\\.?)(?: (\\d{4}))?$/.exec(text);\n if (dayFirst) {\n const monthIndex = month(dayFirst[2]!);\n const date =\n monthIndex === null\n ? null\n : pastDate(today, monthIndex, Number(dayFirst[1]), fullYear(dayFirst[3]));\n return date ? oneDay(date) : null;\n }\n // oct 30, october 30 2026\n const monthFirst = /^([a-z]+\\.?) (\\d{1,2})(?: (\\d{4}))?$/.exec(text);\n if (monthFirst) {\n const monthIndex = month(monthFirst[1]!);\n const date =\n monthIndex === null\n ? null\n : pastDate(today, monthIndex, Number(monthFirst[2]), fullYear(monthFirst[3]));\n return date ? oneDay(date) : null;\n }\n return null;\n}\n\n/** How the server found a meeting for the query. */\nexport type MeetingMatch = \"words\" | \"person\" | \"date\";\n\nexport type FoundMeeting = { meeting: MeetingRecord; match: MeetingMatch };\n\nexport type RankedMeeting = { meeting: MeetingRecord; rank: number; loose: boolean };\n\n/**\n * Someone who spoke in it, by name: a deliberate match, ahead of a date the\n * same word could name (\"August\", \"May\").\n */\nconst PERSON_RANK = 850;\n/** A date the query names outranks the title words it happens to share. */\nconst DATE_RANK = 800;\n/** Every word found in its title or transcript, but not as a title match here. */\nconst WORDS_RANK = 450;\n\n/**\n * Ranks meetings for a query. `known` are the newest meetings the menu already\n * holds (their titles match at once); `found` are the server's answers, each\n * with how it matched. A meeting keeps its best reason, and newer meetings win\n * ties.\n */\nexport function rankMeetings(\n known: readonly MeetingRecord[],\n found: readonly FoundMeeting[],\n query: string,\n range: MeetingDateRange | null,\n): RankedMeeting[] {\n const trimmed = query.trim();\n if (!trimmed) return [];\n const best = new Map<string, RankedMeeting>();\n const consider = (meeting: MeetingRecord, rank: number | null, loose = false) => {\n if (rank === null) return;\n const current = best.get(meeting.id);\n if (!current || rank > current.rank) best.set(meeting.id, { meeting, rank, loose });\n };\n const inRange = (meeting: MeetingRecord) =>\n range !== null &&\n meeting.startedAt >= range.from.getTime() &&\n meeting.startedAt < range.to.getTime();\n for (const meeting of [...known, ...found.map((entry) => entry.meeting)]) {\n const rank = rankLabel(meeting.title, trimmed);\n consider(meeting, rank, rank !== null && rank < LOOSE_MATCH_BELOW);\n if (inRange(meeting)) consider(meeting, DATE_RANK);\n }\n for (const { meeting, match } of found) {\n consider(\n meeting,\n match === \"date\"\n ? inRange(meeting)\n ? DATE_RANK\n : null\n : match === \"person\"\n ? PERSON_RANK\n : WORDS_RANK,\n );\n }\n return [...best.values()].sort(\n (a, b) => b.rank - a.rank || b.meeting.startedAt - a.meeting.startedAt,\n );\n}\n\n/** Meetings for the empty menu: the newest ones, without the one on screen. */\nexport function recentMeetings(\n known: readonly MeetingRecord[],\n currentMeetingId: string | null,\n limit: number,\n): MeetingRecord[] {\n return known.filter((meeting) => meeting.id !== currentMeetingId).slice(0, limit);\n}\n"],"mappings":"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","names":["current","trimmed","scored","items","result"]}
1
+ {"version":3,"sources":["../../../../src/app/components/command-menu/command-menu.tsx","../../../../src/app/lib/actions/site-rank.ts","../../../../src/app/lib/actions/meeting-search.ts"],"sourcesContent":["/**\n * The ⌘K menu: find a chat, a Site or a meeting, or run any action, from one\n * field.\n *\n * It opens instantly from what the app already knows (chats and Sites the\n * sidebar has loaded and the chats opened recently) and merges the server's\n * title searches as they arrive. Chats in the person's other workspaces show too, tagged with\n * their workspace, and so do workspaces to switch to. Tab on a chat shows that\n * chat's actions; the chords of chat actions work on the highlighted chat\n * while the menu is open. Meetings are found by title, by who spoke, by words\n * said in them and by when they happened.\n *\n * Sub-agent chats (ones another chat started) are far more numerous than the\n * person's own, so they list only where they were asked for: the ones opened\n * recently join Recent chats, pinned ones count as the person's own, and a\n * search lists a few matching ones in a group of their own, after the chats.\n * Each says which chat it belongs to.\n */\nimport {\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n type RefObject,\n} from \"react\";\nimport { Dialog as DialogPrimitive } from \"radix-ui\";\nimport {\n ArchiveIcon,\n ArrowUpRightIcon,\n AudioLinesIcon,\n ChevronRightIcon,\n CornerDownLeftIcon,\n LockIcon,\n MessageCircleQuestionIcon,\n MessageSquareIcon,\n PanelsTopLeftIcon,\n PinIcon,\n SearchIcon,\n TextSearchIcon,\n type LucideIcon,\n} from \"lucide-react\";\nimport type { SessionListRow } from \"../../../session-list-model\";\nimport { useAppContext } from \"../../app-context\";\nimport {\n chatParentTitle,\n listsAsTopLevel,\n readChatDirectory,\n rememberChats,\n useChatDirectoryVersion,\n type ChatRecord,\n} from \"../../lib/actions/chat-directory\";\nimport { matchesChord, type Chord } from \"../../lib/actions/chords\";\nimport {\n readSidebarSites,\n siteRecords,\n useSiteDirectoryVersion,\n type SiteRecord,\n} from \"../../lib/actions/site-directory\";\nimport { rankSites, recentSites } from \"../../lib/actions/site-rank\";\nimport {\n meetingRecords,\n readRecentMeetings,\n rememberRecentMeetings,\n useMeetingDirectoryVersion,\n type MeetingRecord,\n} from \"../../lib/actions/meeting-directory\";\nimport {\n meetingDateRange,\n rankMeetings,\n recentMeetings,\n type FoundMeeting,\n} from \"../../lib/actions/meeting-search\";\nimport { useAppActions } from \"../../lib/actions/actions-provider\";\nimport {\n foldForSearch,\n LOOSE_MATCH_BELOW,\n rankLabel,\n rankWithKeywords,\n} from \"../../lib/actions/rank\";\nimport {\n appActions,\n actionIcon,\n actionTitle,\n type ActionEnv,\n type AppAction,\n type MeetingPages,\n type WorkspaceChoice,\n} from \"../../lib/actions/registry\";\nimport { cn } from \"../../lib/utils\";\nimport { DialogOverlay, DialogPortal } from \"../../../ui/dialog\";\nimport { formatRelativeTime } from \"../../../ui/relative-time\";\nimport { Keycaps } from \"./keycaps\";\nimport { ChatTitleInParent } from \"./chat-title\";\nimport { WorkspaceTag } from \"./workspace-tag\";\nimport { SessionAvatar } from \"../session/session-avatar\";\nimport { ChatStatusMarks, useChatStatusRefresh } from \"./chat-status\";\nimport { currentChatStatus, type ChatStatus } from \"../../lib/actions/chat-status\";\n\ntype Item = {\n key: string;\n group: string;\n icon: LucideIcon;\n /** A workspace's initial, drawn as the workspace picker draws it, instead of the icon. */\n tile?: string | undefined;\n title: string;\n /** Text to mark as matched in the title. */\n highlight?: string | undefined;\n /** Quiet text on the right (when, \"Archived\"). */\n meta?: string | undefined;\n /** The workspace a chat lives in, when it is not the one on screen. */\n workspaceTag?: string | undefined;\n /** The chat a sub-agent chat belongs to, said quietly after its title. */\n parentTitle?: string | undefined;\n chord?: Chord | undefined;\n /** Present on chat rows: Tab opens their actions, chat chords act on them. */\n chat?: ChatRecord | undefined;\n /** The chat's sidebar status marks, while its status is known to be current. */\n status?: ChatStatus | null | undefined;\n run(options: { newTab: boolean }): void;\n};\n\ntype Group = { label: string; items: Item[]; best: number };\n\nconst RECENT_LIMIT = 6;\nconst CHAT_RESULT_LIMIT = 8;\n/** Sub-agent chats a search lists, below the chats, so they never crowd them out. */\nconst SUBAGENT_RESULT_LIMIT = 3;\n/** The server's matches among every chat in this workspace, sub-agent chats included. */\nconst SERVER_SUBAGENT_LIMIT = 10;\nconst ACTION_RESULT_LIMIT = 6;\nconst WORKSPACE_RESULT_LIMIT = 4;\nconst SITE_RESULT_LIMIT = 5;\n/** Sites before anything is typed: a few recent ones, never the whole list. */\nconst RECENT_SITE_LIMIT = 3;\n/** Sites the server title search returns per query. */\nconst SERVER_SITE_LIMIT = 10;\n/** Shorter queries match only the Sites the sidebar has loaded. */\nconst MIN_SERVER_SITE_QUERY = 2;\nconst NO_SITES: readonly SiteRecord[] = [];\n/** Meetings before anything is typed: the newest few, never the whole list. */\nconst RECENT_MEETING_LIMIT = 3;\n/** Newest meetings the menu asks for each time it opens (one spare for the one on screen). */\nconst RECENT_MEETING_FETCH = RECENT_MEETING_LIMIT + 1;\nconst MEETING_RESULT_LIMIT = 5;\n/** Meetings the server returns per kind of match. */\nconst SERVER_MEETING_LIMIT = 8;\n/** Shorter queries match only the meetings the menu already knows. */\nconst MIN_SERVER_MEETING_QUERY = 2;\nconst NO_MEETINGS: readonly FoundMeeting[] = [];\nconst SERVER_DEBOUNCE_MS = 120;\n/** Other workspaces whose titles the server searches too, most used first. */\nconst OTHER_WORKSPACES_SEARCHED = 9;\n/** A chat in another workspace ranks just below an equal match here. */\nconst ELSEWHERE_PENALTY = 10;\n\nfunction relativeMeta(record: ChatRecord, now: number): string | undefined {\n if (record.archived) return \"Archived\";\n if (!record.updatedAt) return undefined;\n return formatRelativeTime(record.updatedAt, { now });\n}\n\nfunction chatIcon(record: ChatRecord): LucideIcon {\n if (record.archived) return ArchiveIcon;\n if (record.pinned) return PinIcon;\n return MessageSquareIcon;\n}\n\n/** Marks the query's words in a title, case- and accent-insensitively. */\nfunction Highlighted(props: { text: string; query: string | undefined }) {\n const { text, query } = props;\n const words = query ? foldForSearch(query).split(\" \").filter(Boolean) : [];\n if (words.length === 0) return <>{text}</>;\n // Fold per character so positions in the folded text map back to the title.\n const folded = Array.from(text, (character) => foldForSearch(character) || \" \");\n const joined = folded.join(\"\");\n const marked = new Array<boolean>(folded.length).fill(false);\n const offsets: number[] = [];\n let offset = 0;\n for (const piece of folded) {\n offsets.push(offset);\n offset += piece.length;\n }\n const indexAt = (position: number) => {\n let index = offsets.findIndex((start) => start > position);\n index = index < 0 ? offsets.length - 1 : index - 1;\n return index;\n };\n const phrase = words.join(\" \");\n const ranges: Array<[number, number]> = [];\n const whole = joined.indexOf(phrase);\n if (whole >= 0) ranges.push([whole, whole + phrase.length]);\n else {\n for (const word of words) {\n const at = joined.indexOf(word);\n if (at >= 0) ranges.push([at, at + word.length]);\n }\n }\n for (const [start, end] of ranges) {\n for (let index = indexAt(start); index <= indexAt(end - 1); index++) marked[index] = true;\n }\n const characters = Array.from(text);\n const parts: ReactNode[] = [];\n let run = \"\";\n let runMarked = false;\n characters.forEach((character, index) => {\n const isMarked = marked[index] ?? false;\n if (index > 0 && isMarked !== runMarked) {\n parts.push(\n runMarked ? (\n <mark key={parts.length} className=\"bg-transparent font-medium text-fg\">\n {run}\n </mark>\n ) : (\n run\n ),\n );\n run = \"\";\n }\n run += character;\n runMarked = isMarked;\n });\n if (run) {\n parts.push(\n runMarked ? (\n <mark key={parts.length} className=\"bg-transparent font-medium text-fg\">\n {run}\n </mark>\n ) : (\n run\n ),\n );\n }\n return <>{parts}</>;\n}\n\n/**\n * The server's title search: this workspace, and the person's other workspaces\n * they use most, side by side. Each workspace's matches join the list as they\n * arrive. Those searches cover top-level chats, so a workspace full of\n * sub-agent chats cannot push them out of the page; one more small search of\n * this workspace finds the sub-agent chats that match.\n */\nfunction useServerTitleSearch(\n workspaceIds: readonly string[],\n subjectId: string,\n query: string,\n open: boolean,\n) {\n const { client } = useAppContext();\n const [state, setState] = useState<{ query: string; rows: SessionListRow[]; loading: boolean }>({\n query: \"\",\n rows: [],\n loading: false,\n });\n const searchKey = workspaceIds.join(\",\");\n useEffect(() => {\n const trimmed = query.trim();\n if (!open || !trimmed || !searchKey) {\n setState({ query: \"\", rows: [], loading: false });\n return;\n }\n setState((current) => ({ ...current, loading: true }));\n const controller = new AbortController();\n const timer = window.setTimeout(() => {\n const targets = searchKey.split(\",\").map((workspaceId, index) => ({\n workspaceId,\n // This workspace first and fullest; a few from each of the others.\n limit: index === 0 ? 20 : 6,\n topLevel: true,\n }));\n targets.splice(1, 0, {\n workspaceId: targets[0]!.workspaceId,\n limit: SERVER_SUBAGENT_LIMIT,\n topLevel: false,\n });\n let pending = targets.length;\n let first = true;\n const settle = (rows: SessionListRow[]) => {\n if (controller.signal.aborted) return;\n pending -= 1;\n const replace = first;\n first = false;\n setState((current) => ({\n query: trimmed,\n rows: replace || current.query !== trimmed ? rows : [...current.rows, ...rows],\n loading: pending > 0,\n }));\n };\n for (const target of targets) {\n // The menu needs list rows, not each session's full tool/configuration payload.\n // Older embedded clients may not expose the optional summary method yet.\n const listPage = client.listSessionSummaryPage ?? client.listSessionPage;\n listPage\n .call(client, target.workspaceId, {\n search: trimmed,\n archiveStatus: \"all\",\n limit: target.limit,\n ...(target.topLevel ? { parentSessionId: null } : {}),\n signal: controller.signal,\n })\n .then((page) => {\n if (controller.signal.aborted) return;\n const rows = [...(page.pinned ?? []), ...page.sessions];\n rememberChats(subjectId, rows);\n settle(rows);\n })\n .catch(() => {\n // Local results still show; the server search is an addition.\n settle([]);\n });\n }\n }, SERVER_DEBOUNCE_MS);\n return () => {\n window.clearTimeout(timer);\n controller.abort();\n };\n }, [client, searchKey, subjectId, query, open]);\n return state;\n}\n\nfunction isAccessFailure(error: unknown): boolean {\n const status =\n error && typeof error === \"object\" && \"status\" in error\n ? (error as { status: unknown }).status\n : null;\n return status === 401 || status === 403;\n}\n\n/**\n * The server's Site title search in this workspace: the artifact catalog's\n * Sites, with its access checks (Only me Sites of other people never show).\n * A failure leaves the rest of the menu as it is; a workspace that refuses\n * access is not asked again until the menu opens next.\n */\nfunction useServerSiteSearch(workspaceId: string, query: string, open: boolean) {\n const { client } = useAppContext();\n const [state, setState] = useState<{\n key: string;\n workspaceId: string;\n sites: readonly SiteRecord[];\n loading: boolean;\n }>({\n key: \"\",\n workspaceId: \"\",\n sites: NO_SITES,\n loading: false,\n });\n const denied = useRef<string | null>(null);\n useEffect(() => {\n if (!open) denied.current = null;\n }, [open]);\n const trimmed = query.trim();\n const key = JSON.stringify([workspaceId, trimmed]);\n useEffect(() => {\n if (\n !open ||\n // One letter would scan the whole catalog on every keystroke; the Sites\n // the sidebar has loaded still match it locally.\n trimmed.length < MIN_SERVER_SITE_QUERY ||\n !workspaceId ||\n denied.current === workspaceId ||\n typeof client.listArtifactCatalog !== \"function\"\n ) {\n setState((current) =>\n current.loading || current.sites.length > 0\n ? { key: \"\", workspaceId: \"\", sites: NO_SITES, loading: false }\n : current,\n );\n return;\n }\n setState((current) => ({ ...current, loading: true }));\n const controller = new AbortController();\n const timer = window.setTimeout(() => {\n Promise.resolve()\n .then(() =>\n client.listArtifactCatalog(workspaceId, {\n kind: \"site\",\n q: trimmed,\n status: \"active\",\n sort: \"updated\",\n limit: SERVER_SITE_LIMIT,\n signal: controller.signal,\n }),\n )\n .then((page) => {\n if (controller.signal.aborted) return;\n const items = Array.isArray(page?.items) ? page.items : [];\n setState({\n key,\n workspaceId,\n sites: siteRecords(\n workspaceId,\n items.filter((item) => item?.kind === \"site\"),\n ),\n loading: false,\n });\n })\n .catch((error: unknown) => {\n if (controller.signal.aborted) return;\n if (isAccessFailure(error)) denied.current = workspaceId;\n // Chats and actions still show; Sites are an addition.\n setState({ key, workspaceId, sites: NO_SITES, loading: false });\n });\n }, SERVER_DEBOUNCE_MS);\n return () => {\n window.clearTimeout(timer);\n controller.abort();\n };\n }, [client, workspaceId, trimmed, key, open]);\n const current = state.key === key;\n return {\n sites: current ? state.sites : NO_SITES,\n // While the next answer loads, the last one's Sites stay candidates (by\n // their title alone), so a Site does not blink out on every keystroke.\n previous: !current && state.workspaceId === workspaceId ? state.sites : NO_SITES,\n loading: state.loading,\n };\n}\n\nexport default function CommandMenu(props: {\n open: boolean;\n /** Opens listing workspaces to switch to. */\n pickWorkspace: boolean;\n onOpenChange: (open: boolean) => void;\n /** Where focus goes back to after a plain close. */\n returnFocus: RefObject<HTMLElement | null>;\n}) {\n const actions = useAppActions();\n if (!actions) return null;\n return (\n <CommandMenuDialog\n {...props}\n env={actions.env}\n run={actions.run}\n chordsFor={actions.chordsFor}\n />\n );\n}\n\n/**\n * Each open asks for the workspace's newest meetings, so the empty menu lists\n * them (from the last answer at once, then this one). A failure keeps the last list.\n */\nfunction useRecentMeetingsRefresh(\n meetingPages: MeetingPages | null,\n subjectId: string,\n workspaceId: string,\n open: boolean,\n) {\n const list = meetingPages?.list;\n useEffect(() => {\n if (!open || !list) return;\n const controller = new AbortController();\n list({ limit: RECENT_MEETING_FETCH, signal: controller.signal })\n .then((recordings) => {\n if (controller.signal.aborted) return;\n rememberRecentMeetings(subjectId, workspaceId, meetingRecords(recordings));\n })\n .catch(() => {\n // The rest of the menu still works; meetings are an addition.\n });\n return () => controller.abort();\n // Once per open: a new `list` from the recorder's state changing isn't a reason to ask again.\n }, [open, subjectId, workspaceId, Boolean(list)]); // eslint-disable-line react-hooks/exhaustive-deps\n}\n\n/**\n * The server's meeting search in this workspace, three ways at once: words in\n * titles and transcripts, someone who spoke by name, and, when the query is a\n * date, the meetings that started then. Each answer joins as it arrives.\n */\nfunction useServerMeetingSearch(meetingPages: MeetingPages | null, query: string, open: boolean) {\n const list = meetingPages?.list;\n const listRef = useRef(list);\n listRef.current = list;\n const [state, setState] = useState<{\n key: string;\n found: readonly FoundMeeting[];\n loading: boolean;\n }>({ key: \"\", found: NO_MEETINGS, loading: false });\n const trimmed = query.trim();\n const enabled = open && Boolean(list) && trimmed.length >= MIN_SERVER_MEETING_QUERY;\n useEffect(() => {\n if (!enabled) {\n setState((current) =>\n current.loading || current.found.length > 0\n ? { key: \"\", found: NO_MEETINGS, loading: false }\n : current,\n );\n return;\n }\n setState((current) => ({ ...current, loading: true }));\n const controller = new AbortController();\n const timer = window.setTimeout(() => {\n const search = listRef.current;\n if (!search) return;\n const range = meetingDateRange(trimmed);\n const requests: Array<[FoundMeeting[\"match\"], Parameters<MeetingPages[\"list\"]>[0]]> = [\n [\"words\", { query: trimmed, limit: SERVER_MEETING_LIMIT }],\n [\"person\", { person: trimmed, limit: SERVER_MEETING_LIMIT }],\n ];\n if (range) {\n requests.push([\n \"date\",\n {\n startedFrom: range.from.toISOString(),\n startedTo: range.to.toISOString(),\n limit: SERVER_MEETING_LIMIT,\n },\n ]);\n }\n let pending = requests.length;\n let first = true;\n const settle = (found: FoundMeeting[]) => {\n if (controller.signal.aborted) return;\n pending -= 1;\n const replace = first;\n first = false;\n setState((current) => ({\n key: trimmed,\n found: replace || current.key !== trimmed ? found : [...current.found, ...found],\n loading: pending > 0,\n }));\n };\n for (const [match, options] of requests) {\n search({ ...options, signal: controller.signal })\n .then((recordings) =>\n settle(meetingRecords(recordings).map((meeting) => ({ meeting, match }))),\n )\n .catch(() => settle([]));\n }\n }, SERVER_DEBOUNCE_MS);\n return () => {\n window.clearTimeout(timer);\n controller.abort();\n };\n }, [enabled, trimmed]);\n const current = state.key === trimmed;\n return {\n found: current ? state.found : NO_MEETINGS,\n // While the next answer loads, the last one's meetings stay candidates (by\n // their title alone), so a meeting does not blink out on every keystroke.\n previous: current ? NO_MEETINGS : state.found,\n loading: state.loading,\n };\n}\n\nfunction CommandMenuDialog(props: {\n open: boolean;\n pickWorkspace: boolean;\n onOpenChange: (open: boolean) => void;\n returnFocus: RefObject<HTMLElement | null>;\n env: ActionEnv;\n run(action: AppAction, chat?: SessionListRow | null, chord?: Chord): void;\n chordsFor(action: AppAction): Chord[];\n}) {\n const { env, run, chordsFor, onOpenChange } = props;\n const { workspaceId, subjectId, platform, surface, workspaces } = env;\n const directoryVersion = useChatDirectoryVersion(subjectId);\n const siteDirectoryVersion = useSiteDirectoryVersion(subjectId);\n const meetingDirectoryVersion = useMeetingDirectoryVersion(subjectId);\n const meetingPages = env.meetingPages;\n const [query, setQuery] = useState(\"\");\n const [focusChat, setFocusChat] = useState<ChatRecord | null>(null);\n const [pickingWorkspace, setPickingWorkspace] = useState(props.pickWorkspace);\n const [active, setActive] = useState(0);\n const inputRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const ranAction = useRef(false);\n /** Runs right after the menu has returned focus (see `AppAction.opensDialog`). */\n const afterClose = useRef<(() => void) | null>(null);\n const listId = useId();\n const workspaceNames = useMemo(\n () => new Map(workspaces.map((workspace) => [workspace.id, workspace.name])),\n [workspaces],\n );\n /** Chats the menu may show: this workspace's, and those of other workspaces still open to the person. */\n const reachable = useCallback(\n (id: string) => id === workspaceId || workspaceNames.has(id),\n [workspaceId, workspaceNames],\n );\n // The server searches this workspace and the other workspaces used most recently.\n const searchWorkspaceIds = useMemo(() => {\n void directoryVersion;\n const directory = readChatDirectory(subjectId, workspaceId);\n const used: string[] = [];\n for (const id of directory.recent) {\n const record = directory.rows.get(id);\n if (record && !used.includes(record.workspaceId)) used.push(record.workspaceId);\n }\n const others = [...used, ...workspaces.map((workspace) => workspace.id)].filter(\n (id, index, all) => id !== workspaceId && reachable(id) && all.indexOf(id) === index,\n );\n return [workspaceId, ...others.slice(0, OTHER_WORKSPACES_SEARCHED)];\n // Which workspaces to search changes only when the menu opens.\n }, [props.open, subjectId, workspaceId, workspaces, reachable]); // eslint-disable-line react-hooks/exhaustive-deps\n const server = useServerTitleSearch(\n searchWorkspaceIds,\n subjectId,\n focusChat || pickingWorkspace ? \"\" : query,\n props.open,\n );\n const serverSites = useServerSiteSearch(\n workspaceId,\n focusChat || pickingWorkspace ? \"\" : query,\n props.open,\n );\n useRecentMeetingsRefresh(meetingPages, subjectId, workspaceId, props.open);\n const serverMeetings = useServerMeetingSearch(\n meetingPages,\n focusChat || pickingWorkspace ? \"\" : query,\n props.open,\n );\n\n // Every open starts fresh.\n useEffect(() => {\n if (!props.open) return;\n setQuery(\"\");\n setFocusChat(null);\n setPickingWorkspace(props.pickWorkspace);\n setActive(0);\n ranAction.current = false;\n afterClose.current = null;\n }, [props.open, props.pickWorkspace]);\n\n const close = useCallback(() => onOpenChange(false), [onOpenChange]);\n\n const runAction = useCallback(\n (action: AppAction, chat: SessionListRow | null, chord?: Chord) => {\n if (action.opensDialog) {\n afterClose.current = () => run(action, action.forChat ? chat : undefined, chord);\n close();\n return;\n }\n ranAction.current = true;\n close();\n run(action, action.forChat ? chat : undefined, chord);\n },\n [close, run],\n );\n\n const openChat = useCallback(\n (record: ChatRecord, newTab: boolean) => {\n ranAction.current = true;\n close();\n if (newTab && surface === \"web\") {\n window.open(env.ops.linkTo(record), \"_blank\", \"noopener\");\n return;\n }\n env.openChat(record.id, record.workspaceId);\n },\n [close, env, surface],\n );\n\n const openSite = useCallback(\n (site: SiteRecord, newTab: boolean) => {\n ranAction.current = true;\n close();\n if (newTab && surface === \"web\") {\n window.open(env.siteLink(site.id), \"_blank\", \"noopener\");\n return;\n }\n env.openSite(site.id);\n },\n [close, env, surface],\n );\n\n const openMeeting = useCallback(\n (meeting: MeetingRecord, newTab: boolean) => {\n if (!meetingPages) return;\n ranAction.current = true;\n close();\n if (newTab && surface === \"web\") {\n window.open(meetingPages.link(meeting.id), \"_blank\", \"noopener\");\n return;\n }\n meetingPages.open(meeting.id);\n },\n [close, meetingPages, surface],\n );\n\n const askAboutMeeting = useCallback(\n (question: string) => {\n const ask = meetingPages?.current?.ask;\n if (!ask) return;\n // Asked once the menu has handed focus back, as an action that opens a dialog.\n afterClose.current = () => ask(question);\n close();\n },\n [close, meetingPages],\n );\n\n const openWorkspace = useCallback(\n (id: string) => {\n ranAction.current = true;\n close();\n if (id !== workspaceId) env.openWorkspace(id);\n },\n [close, env, workspaceId],\n );\n\n const startPickingWorkspace = useCallback(() => {\n setFocusChat(null);\n setPickingWorkspace(true);\n setQuery(\"\");\n inputRef.current?.focus();\n }, []);\n\n const actionItem = useCallback(\n (action: AppAction, chat: SessionListRow | null, group: string, highlight?: string): Item => ({\n key: `action:${action.id}`,\n group,\n icon: actionIcon(action, chat),\n title: actionTitle(action, env, chat),\n highlight,\n chord: chordsFor(action)[0],\n // Switching workspace lists the workspaces right here.\n run: () =>\n action.id === \"go.switchWorkspace\" ? startPickingWorkspace() : runAction(action, chat),\n }),\n [chordsFor, env, runAction, startPickingWorkspace],\n );\n\n const groups = useMemo<Group[]>(() => {\n void directoryVersion;\n void siteDirectoryVersion;\n void meetingDirectoryVersion;\n const now = Date.now();\n const directory = readChatDirectory(subjectId, workspaceId);\n const knownSites = readSidebarSites(subjectId, workspaceId);\n const knownMeetings = meetingPages ? readRecentMeetings(subjectId, workspaceId) : [];\n const currentMeetingId = meetingPages?.current?.recordingId ?? null;\n const current = env.currentChat;\n const sidebarIds = new Set([...directory.sidebarOrder, ...directory.pinnedOrder]);\n\n const chatItem = (record: ChatRecord, group: string, highlight?: string): Item => ({\n key: `chat:${record.id}`,\n group,\n icon: chatIcon(record),\n title: record.title,\n highlight,\n meta: current?.id === record.id ? \"Open now\" : relativeMeta(record, now),\n workspaceTag:\n record.workspaceId === workspaceId ? undefined : workspaceNames.get(record.workspaceId),\n parentTitle: chatParentTitle(directory.rows, record) ?? undefined,\n chat: record,\n status: currentChatStatus(record, sidebarIds, now),\n run: ({ newTab }) => openChat(record, newTab),\n });\n\n const siteItem = (site: SiteRecord, group: string, highlight?: string): Item => ({\n key: `site:${site.id}`,\n group,\n icon: PanelsTopLeftIcon,\n title: site.title,\n highlight,\n meta:\n env.currentSiteId === site.id\n ? \"Open now\"\n : site.updatedAt\n ? formatRelativeTime(site.updatedAt, { now })\n : undefined,\n run: ({ newTab }) => openSite(site, newTab),\n });\n\n const meetingItem = (meeting: MeetingRecord, group: string, highlight?: string): Item => ({\n key: `meeting:${meeting.id}`,\n group,\n icon: AudioLinesIcon,\n title: meeting.title,\n highlight,\n meta:\n currentMeetingId === meeting.id\n ? \"Open now\"\n : meeting.startedAt\n ? formatRelativeTime(meeting.startedAt, { now })\n : undefined,\n run: ({ newTab }) => openMeeting(meeting, newTab),\n });\n\n const workspaceItem = (choice: WorkspaceChoice, group: string, highlight?: string): Item => ({\n key: `workspace:${choice.id}`,\n group,\n icon: LockIcon,\n // A Personal workspace shows its lock, as in the workspace picker.\n tile: choice.personal ? undefined : (choice.name.trim()[0] ?? \"W\").toUpperCase(),\n title: choice.name,\n highlight,\n meta: choice.id === workspaceId ? \"Current\" : undefined,\n run: () => openWorkspace(choice.id),\n });\n\n // Workspaces to switch to, by organization.\n if (pickingWorkspace) {\n const trimmed = query.trim();\n const organizations = new Set(workspaces.map((choice) => choice.organization));\n const scored = workspaces.flatMap((choice) => {\n if (!trimmed) return [{ choice, rank: 0 }];\n const rank =\n rankLabel(choice.name, trimmed) ??\n (organizations.size > 1 ? rankLabel(choice.organization, trimmed) : null);\n return rank === null ? [] : [{ choice, rank }];\n });\n const realMatch = scored.some((entry) => entry.rank >= LOOSE_MATCH_BELOW);\n const kept = scored.filter(\n (entry) => !trimmed || !realMatch || entry.rank >= LOOSE_MATCH_BELOW,\n );\n if (trimmed) {\n kept.sort((a, b) => b.rank - a.rank);\n return [\n {\n label: \"Workspaces\",\n items: kept.map((entry) => workspaceItem(entry.choice, \"Workspaces\", trimmed)),\n best: 0,\n },\n ];\n }\n const byOrganization = new Map<string, Item[]>();\n for (const { choice } of kept) {\n const label = organizations.size > 1 ? choice.organization : \"Workspaces\";\n const list = byOrganization.get(label) ?? [];\n list.push(workspaceItem(choice, label));\n byOrganization.set(label, list);\n }\n return [...byOrganization].map(([label, items]) => ({ label, items, best: 0 }));\n }\n\n // A chat's own actions (after Tab).\n if (focusChat) {\n // Chats in other workspaces offer what works from here: open and copy link.\n const sameWorkspace = focusChat.workspaceId === workspaceId;\n const row = sameWorkspace\n ? (focusChat.row ?? (current?.id === focusChat.id ? current : null))\n : null;\n const items: Array<{ item: Item; rank: number }> = [];\n const openRank = rankLabel(\"Open\", query);\n if (openRank !== null) {\n items.push({\n rank: openRank + 1,\n item: {\n key: \"open\",\n group: focusChat.title,\n icon: CornerDownLeftIcon,\n title: \"Open\",\n highlight: query,\n run: () => openChat(focusChat, false),\n },\n });\n }\n if (surface === \"web\") {\n const tabRank = rankLabel(\"Open in new tab\", query);\n if (tabRank !== null) {\n items.push({\n rank: tabRank,\n item: {\n key: \"open-tab\",\n group: focusChat.title,\n icon: ArrowUpRightIcon,\n title: \"Open in new tab\",\n highlight: query,\n run: () => openChat(focusChat, true),\n },\n });\n }\n }\n for (const action of appActions()) {\n if (!action.forChat || action.inCommandMenu === false) continue;\n // Copy link needs only the id; the rest need the chat's row.\n const target = row ?? (action.id === \"chat.copyLink\" ? pseudoRow(focusChat) : null);\n if (!target || !action.available(env, target)) continue;\n const rank = rankWithKeywords(actionTitle(action, env, target), action.keywords, query);\n if (rank === null) continue;\n items.push({ rank, item: actionItem(action, target, focusChat.title, query) });\n }\n if (query) items.sort((a, b) => b.rank - a.rank);\n return [{ label: focusChat.title, items: items.map((entry) => entry.item), best: 0 }];\n }\n\n const trimmed = query.trim();\n if (!trimmed) {\n const result: Group[] = [];\n // Chats opened recently come first; the top of the sidebar fills the\n // rest, so a fresh window still offers somewhere to go. A sub-agent\n // chat comes in only by being opened here (or pinned).\n const opened = new Set(directory.recent);\n const recentIds = [...new Set([...directory.recent, ...directory.sidebarOrder])].filter(\n (id) => id !== current?.id,\n );\n const recent = recentIds\n .map((id) => directory.rows.get(id))\n .filter((record): record is ChatRecord =>\n Boolean(\n record &&\n (opened.has(record.id) || listsAsTopLevel(record)) &&\n !record.archived &&\n reachable(record.workspaceId),\n ),\n )\n .slice(0, RECENT_LIMIT);\n if (recent.length > 0) {\n result.push({\n label: \"Recent chats\",\n items: recent.map((record) => chatItem(record, \"Recent chats\")),\n best: 0,\n });\n }\n const sites = recentSites(knownSites, env.currentSiteId, RECENT_SITE_LIMIT);\n if (sites.length > 0) {\n result.push({\n label: \"Recent Sites\",\n items: sites.map((site) => siteItem(site, \"Recent Sites\")),\n best: 0,\n });\n }\n const meetings = recentMeetings(knownMeetings, currentMeetingId, RECENT_MEETING_LIMIT);\n if (meetings.length > 0) {\n result.push({\n label: \"Recent meetings\",\n items: meetings.map((meeting) => meetingItem(meeting, \"Recent meetings\")),\n best: 0,\n });\n }\n if (current) {\n const chatActions = appActions().filter(\n (action) =>\n action.forChat &&\n action.inCommandMenu !== false &&\n action.id !== \"chat.find\" &&\n action.available(env, current),\n );\n if (chatActions.length > 0) {\n result.push({\n label: \"This chat\",\n items: chatActions.map((action) => actionItem(action, current, \"This chat\")),\n best: 0,\n });\n }\n }\n // The meeting on screen's own actions (ask about it, copy its link).\n const meetingActions = appActions().filter(\n (action) =>\n action.forMeeting && action.inCommandMenu !== false && action.available(env, null),\n );\n if (meetingActions.length > 0) {\n result.push({\n label: \"This meeting\",\n items: meetingActions.map((action) => actionItem(action, null, \"This meeting\")),\n best: 0,\n });\n }\n const general = appActions().filter(\n (action) =>\n !action.forChat &&\n !action.forMeeting &&\n action.inCommandMenu !== false &&\n action.id !== \"commandMenu.open\" &&\n action.available(env, null),\n );\n if (general.length > 0) {\n result.push({\n label: \"Go to\",\n items: general.map((action) => actionItem(action, null, \"Go to\")),\n best: 0,\n });\n }\n return result;\n }\n\n // Chats: everything the app knows, ranked by title, plus the server's\n // matches. Sub-agent chats rank the same way but list on their own.\n const recentIndex = new Map(directory.recent.map((id, index) => [id, index]));\n const serverIds = new Set(server.query === trimmed ? server.rows.map((row) => row.id) : []);\n const scored: Array<{ record: ChatRecord; rank: number; loose: boolean }> = [];\n const subagentScored: Array<{ record: ChatRecord; rank: number; loose: boolean }> = [];\n for (const record of directory.rows.values()) {\n if (!reachable(record.workspaceId)) continue;\n let rank = rankLabel(record.title, trimmed);\n const loose = rank !== null && rank < LOOSE_MATCH_BELOW;\n // The server matched every word in the title or first message.\n if (rank === null && serverIds.has(record.id)) rank = 50;\n if (rank === null) continue;\n const visited = recentIndex.get(record.id);\n if (visited !== undefined) rank += Math.max(0, 20 - visited);\n if (record.pinned) rank += 5;\n if (record.archived) rank -= 300;\n if (record.workspaceId !== workspaceId) rank -= ELSEWHERE_PENALTY;\n (listsAsTopLevel(record) ? scored : subagentScored).push({ record, rank, loose });\n }\n\n const actionScores: Array<{ item: Item; rank: number; loose: boolean }> = [];\n for (const action of appActions()) {\n if (action.inCommandMenu === false) continue;\n const target = action.forChat ? current : null;\n if (action.forChat && !target) continue;\n if (!action.available(env, target)) continue;\n const rank = rankWithKeywords(actionTitle(action, env, target), action.keywords, trimmed);\n if (rank === null) continue;\n actionScores.push({\n rank,\n loose: rank < LOOSE_MATCH_BELOW,\n item: actionItem(action, target, \"Actions\", trimmed),\n });\n }\n const workspaceScores: Array<{ item: Item; rank: number; loose: boolean }> = [];\n for (const choice of workspaces) {\n if (choice.id === workspaceId) continue;\n const rank = rankLabel(choice.name, trimmed);\n if (rank === null) continue;\n workspaceScores.push({\n rank,\n loose: rank < LOOSE_MATCH_BELOW,\n item: workspaceItem(choice, \"Workspaces\", trimmed),\n });\n }\n const knownIds = new Set(knownSites.map((site) => site.id));\n const siteScores = rankSites(\n [...knownSites, ...serverSites.previous.filter((site) => !knownIds.has(site.id))],\n serverSites.sites,\n trimmed,\n );\n const knownMeetingIds = new Set(knownMeetings.map((meeting) => meeting.id));\n const meetingScores = meetingPages\n ? rankMeetings(\n [\n ...knownMeetings,\n ...serverMeetings.previous\n .map((entry) => entry.meeting)\n .filter((meeting) => !knownMeetingIds.has(meeting.id)),\n ],\n serverMeetings.found,\n trimmed,\n meetingDateRange(trimmed, new Date(now)),\n )\n : [];\n // Letters-in-order guesses only help when nothing really matches; next to\n // real matches they are noise (\"pin\" → \"Postgres … investigation\").\n const hasRealMatch =\n scored.some((entry) => !entry.loose) ||\n siteScores.some((entry) => !entry.loose) ||\n meetingScores.some((entry) => !entry.loose) ||\n actionScores.some((entry) => !entry.loose) ||\n workspaceScores.some((entry) => !entry.loose);\n const chats = scored\n .filter((entry) => !hasRealMatch || !entry.loose)\n .sort((a, b) => b.rank - a.rank || b.record.updatedAt - a.record.updatedAt)\n .slice(0, CHAT_RESULT_LIMIT);\n // Only real matches: a letters-in-order guess among that many chats is noise.\n const subagentChats = subagentScored\n .filter((entry) => !entry.loose)\n .sort((a, b) => b.rank - a.rank || b.record.updatedAt - a.record.updatedAt)\n .slice(0, SUBAGENT_RESULT_LIMIT);\n const sitesFound = siteScores\n .filter((entry) => !hasRealMatch || !entry.loose)\n .slice(0, SITE_RESULT_LIMIT);\n const meetingsFound = meetingScores\n .filter((entry) => !hasRealMatch || !entry.loose)\n .slice(0, MEETING_RESULT_LIMIT);\n const actionsFound = actionScores\n .filter((entry) => !hasRealMatch || !entry.loose)\n .sort((a, b) => b.rank - a.rank)\n .slice(0, ACTION_RESULT_LIMIT);\n const workspacesFound = workspaceScores\n .filter((entry) => !hasRealMatch || !entry.loose)\n .sort((a, b) => b.rank - a.rank)\n .slice(0, WORKSPACE_RESULT_LIMIT);\n\n const result: Group[] = [];\n if (chats.length > 0) {\n result.push({\n label: \"Chats\",\n items: chats.map((entry) => chatItem(entry.record, \"Chats\", trimmed)),\n best: chats[0]!.rank,\n });\n }\n if (actionsFound.length > 0) {\n result.push({\n label: \"Actions\",\n items: actionsFound.map((entry) => entry.item),\n best: actionsFound[0]!.rank,\n });\n }\n if (workspacesFound.length > 0) {\n result.push({\n label: \"Workspaces\",\n items: workspacesFound.map((entry) => entry.item),\n // Chats and actions first on a tie: a workspace is a bigger jump.\n best: workspacesFound[0]!.rank - 1,\n });\n }\n // A clearly better action match (\"new\" → New chat) comes before chats.\n result.sort((a, b) => b.best - a.best);\n if (sitesFound.length > 0) {\n const sitesGroup: Group = {\n label: \"Sites\",\n items: sitesFound.map((entry) => siteItem(entry.site, \"Sites\", trimmed)),\n best: sitesFound[0]!.rank,\n };\n // Sites always follow chats; with no chats they take their place by match.\n const chatsAt = result.findIndex((group) => group.label === \"Chats\");\n const at =\n chatsAt >= 0 ? chatsAt + 1 : result.findIndex((group) => group.best < sitesGroup.best);\n result.splice(at >= 0 ? at : result.length, 0, sitesGroup);\n }\n if (subagentChats.length > 0) {\n const subagentGroup: Group = {\n label: \"Sub-agent chats\",\n items: subagentChats.map((entry) => chatItem(entry.record, \"Sub-agent chats\", trimmed)),\n best: subagentChats[0]!.rank,\n };\n // Right below the chats; with no chats, after anything that matches as well.\n const chatsAt = result.findIndex((group) => group.label === \"Chats\");\n const at =\n chatsAt >= 0 ? chatsAt + 1 : result.findIndex((group) => group.best < subagentGroup.best);\n result.splice(at >= 0 ? at : result.length, 0, subagentGroup);\n }\n if (meetingsFound.length > 0) {\n const meetingsGroup: Group = {\n label: \"Meetings\",\n items: meetingsFound.map((entry) => meetingItem(entry.meeting, \"Meetings\", trimmed)),\n best: meetingsFound[0]!.rank,\n };\n // Like Sites: after the chats and Sites; with neither, placed by match.\n const lastFound = Math.max(\n result.findIndex((group) => group.label === \"Chats\"),\n result.findIndex((group) => group.label === \"Sub-agent chats\"),\n result.findIndex((group) => group.label === \"Sites\"),\n );\n const at =\n lastFound >= 0\n ? lastFound + 1\n : result.findIndex((group) => group.best < meetingsGroup.best);\n result.splice(at >= 0 ? at : result.length, 0, meetingsGroup);\n }\n if (meetingPages?.current?.ask) {\n result.push({\n label: \"This meeting\",\n best: -Infinity,\n items: [\n {\n key: \"ask-meeting\",\n group: \"This meeting\",\n icon: MessageCircleQuestionIcon,\n title: `Ask about this meeting: “${trimmed}”`,\n run: () => askAboutMeeting(trimmed),\n },\n ],\n });\n }\n result.push({\n label: \"Messages\",\n best: -Infinity,\n items: [\n {\n key: \"search-messages\",\n group: \"Messages\",\n icon: TextSearchIcon,\n title: `Search messages for “${trimmed}”`,\n run: () => {\n afterClose.current = () => env.searchMessages(trimmed);\n close();\n },\n },\n ],\n });\n return result;\n }, [\n actionItem,\n askAboutMeeting,\n close,\n directoryVersion,\n env,\n focusChat,\n meetingDirectoryVersion,\n meetingPages,\n openChat,\n openMeeting,\n openSite,\n openWorkspace,\n pickingWorkspace,\n query,\n reachable,\n server.query,\n server.rows,\n serverMeetings.found,\n serverMeetings.previous,\n serverSites.sites,\n serverSites.previous,\n siteDirectoryVersion,\n subjectId,\n surface,\n workspaceId,\n workspaceNames,\n workspaces,\n ]);\n\n const items = useMemo(() => groups.flatMap((group) => group.items), [groups]);\n const listedChatIds = useMemo(\n () => items.flatMap((item) => (item.chat ? [item.chat.id] : [])),\n [items],\n );\n useChatStatusRefresh({ subjectId, workspaceId, ids: listedChatIds, active: props.open });\n const activeIndex = items.length === 0 ? -1 : Math.min(active, items.length - 1);\n const activeItem = activeIndex >= 0 ? items[activeIndex] : undefined;\n const searching =\n Boolean(query.trim()) &&\n !focusChat &&\n !pickingWorkspace &&\n (server.loading || serverSites.loading || serverMeetings.loading);\n\n // Typing starts at the best match; the workspace list starts at the current workspace's neighbour.\n useEffect(() => {\n if (pickingWorkspace && !query) {\n const index = workspaces.findIndex((choice) => choice.id === workspaceId);\n setActive(index >= 0 && workspaces.length > 1 ? (index + 1) % workspaces.length : 0);\n return;\n }\n setActive(0);\n }, [query, focusChat, pickingWorkspace, workspaces, workspaceId]);\n\n // Keep the highlighted row in view without scrolling the page.\n useLayoutEffect(() => {\n if (!activeItem) return;\n const element = listRef.current?.querySelector<HTMLElement>(\n `[data-item-key=\"${CSS.escape(activeItem.key)}\"]`,\n );\n element?.scrollIntoView({ block: \"nearest\" });\n }, [activeItem]);\n\n const enterChat = useCallback((record: ChatRecord) => {\n setFocusChat(record);\n setQuery(\"\");\n inputRef.current?.focus();\n }, []);\n const leaveChat = useCallback(() => {\n setFocusChat(null);\n setPickingWorkspace(false);\n setQuery(\"\");\n }, []);\n\n const onKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (event.nativeEvent.isComposing) return;\n const count = items.length;\n const mod = platform === \"mac\" ? event.metaKey : event.ctrlKey;\n switch (event.key) {\n case \"ArrowDown\":\n case \"ArrowUp\": {\n if (event.altKey || mod) break;\n event.preventDefault();\n if (count === 0) return;\n const step = event.key === \"ArrowDown\" ? 1 : -1;\n setActive((current) => (Math.min(current, count - 1) + step + count) % count);\n return;\n }\n case \"PageDown\":\n case \"PageUp\": {\n event.preventDefault();\n if (count === 0) return;\n const step = event.key === \"PageDown\" ? 5 : -5;\n setActive((current) => Math.max(0, Math.min(count - 1, current + step)));\n return;\n }\n case \"Home\":\n case \"End\": {\n // Inside the field these move the caret, unless the field is empty.\n if (query) break;\n event.preventDefault();\n setActive(event.key === \"Home\" ? 0 : Math.max(0, count - 1));\n return;\n }\n case \"Enter\": {\n event.preventDefault();\n activeItem?.run({ newTab: mod });\n return;\n }\n case \"Tab\": {\n event.preventDefault();\n if (event.shiftKey) {\n if (focusChat || pickingWorkspace) leaveChat();\n return;\n }\n if (!focusChat && activeItem?.chat) enterChat(activeItem.chat);\n return;\n }\n case \"Backspace\": {\n if ((focusChat || pickingWorkspace) && !query) {\n event.preventDefault();\n leaveChat();\n }\n return;\n }\n default:\n break;\n }\n // A chat action's chord acts on the highlighted chat, as in Linear.\n const chatRecord = focusChat ?? activeItem?.chat;\n if (!chatRecord) return;\n const sameWorkspace = chatRecord.workspaceId === workspaceId;\n for (const action of appActions()) {\n if (!action.forChat) continue;\n const chord = chordsFor(action).find((candidate) =>\n matchesChord(event.nativeEvent, candidate, platform),\n );\n if (!chord) continue;\n const row =\n (sameWorkspace\n ? (chatRecord.row ?? (env.currentChat?.id === chatRecord.id ? env.currentChat : null))\n : null) ?? (action.id === \"chat.copyLink\" ? pseudoRow(chatRecord) : null);\n event.preventDefault();\n event.stopPropagation();\n if (row && action.available(env, row)) runAction(action, row, chord);\n return;\n }\n },\n [\n activeItem,\n chordsFor,\n enterChat,\n env,\n focusChat,\n items.length,\n leaveChat,\n pickingWorkspace,\n platform,\n query,\n runAction,\n workspaceId,\n ],\n );\n\n const placeholder = focusChat\n ? \"Search actions…\"\n : pickingWorkspace\n ? \"Switch to workspace…\"\n : meetingPages\n ? \"Search chats, Sites and meetings, or run an action…\"\n : \"Search chats and Sites, or run an action…\";\n const optionId = (item: Item) => `${listId}-${item.key.replace(/[^a-zA-Z0-9_-]/g, \"_\")}`;\n\n return (\n <DialogPrimitive.Root open={props.open} onOpenChange={onOpenChange}>\n <DialogPortal>\n <DialogOverlay className=\"bg-black/25 dark:bg-black/45\" />\n <DialogPrimitive.Content\n data-og-command-menu=\"\"\n aria-label=\"Command menu\"\n aria-describedby={undefined}\n onOpenAutoFocus={(event) => {\n event.preventDefault();\n inputRef.current?.focus();\n }}\n onCloseAutoFocus={(event) => {\n // An action moves focus where it belongs (the new chat's composer,\n // the title being renamed); only a plain close returns focus.\n if (ranAction.current) {\n event.preventDefault();\n return;\n }\n const target = props.returnFocus.current;\n if (target?.isConnected) {\n event.preventDefault();\n target.focus({ preventScroll: true });\n }\n const next = afterClose.current;\n afterClose.current = null;\n next?.();\n }}\n onEscapeKeyDown={(event) => {\n // Esc steps back out of a chat's actions, or the workspace list\n // reached from the menu, before it closes the menu.\n if (!focusChat && !(pickingWorkspace && !props.pickWorkspace)) return;\n event.preventDefault();\n leaveChat();\n }}\n onKeyDown={onKeyDown}\n className={cn(\n \"fixed top-[12dvh] left-1/2 z-50 flex max-h-[min(560px,76dvh)] w-[calc(100vw-1.5rem)] max-w-[640px] -translate-x-1/2 flex-col overflow-hidden\",\n \"rounded-2xl border border-border bg-surface text-fg shadow-og-lg outline-hidden\",\n \"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-98\",\n \"data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-98\",\n \"duration-[120ms] max-sm:top-3\",\n )}\n >\n <DialogPrimitive.Title className=\"sr-only\">Command menu</DialogPrimitive.Title>\n <div className=\"flex min-h-13 shrink-0 items-center gap-2.5 border-b border-border px-4\">\n <SearchIcon aria-hidden=\"true\" className=\"size-4 shrink-0 text-fg-muted\" />\n {focusChat ? (\n <button\n type=\"button\"\n onClick={leaveChat}\n title=\"Back to all results\"\n className=\"inline-flex max-w-[45%] shrink-0 items-center gap-1 rounded-full bg-hover py-0.5 pr-1.5 pl-2.5 text-xs font-medium text-fg outline-hidden hover:bg-selection focus-visible:outline-2 focus-visible:outline-ring/55\"\n >\n <span className=\"truncate\">{focusChat.title}</span>\n <ChevronRightIcon aria-hidden=\"true\" className=\"size-3.5 text-fg-muted\" />\n </button>\n ) : pickingWorkspace ? (\n <button\n type=\"button\"\n onClick={leaveChat}\n title=\"Back to all results\"\n className=\"inline-flex shrink-0 items-center gap-1 rounded-full bg-hover py-0.5 pr-1.5 pl-2.5 text-xs font-medium text-fg outline-hidden hover:bg-selection focus-visible:outline-2 focus-visible:outline-ring/55\"\n >\n Workspaces\n <ChevronRightIcon aria-hidden=\"true\" className=\"size-3.5 text-fg-muted\" />\n </button>\n ) : null}\n <input\n ref={inputRef}\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={listId}\n aria-autocomplete=\"list\"\n aria-activedescendant={activeItem ? optionId(activeItem) : undefined}\n aria-label={\n focusChat\n ? `Actions for ${focusChat.title}`\n : pickingWorkspace\n ? \"Search workspaces\"\n : meetingPages\n ? \"Search chats, Sites, meetings and actions\"\n : \"Search chats, Sites and actions\"\n }\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n enterKeyHint=\"go\"\n value={query}\n maxLength={200}\n placeholder={placeholder}\n onChange={(event) => setQuery(event.target.value)}\n // The whole menu is the focus context; a ring on the field adds noise.\n style={{ outline: \"none\" }}\n className=\"h-13 min-w-0 flex-1 bg-transparent text-[15px] text-fg outline-hidden placeholder:text-fg-subtle\"\n />\n {searching ? (\n <span\n aria-hidden=\"true\"\n className=\"size-3.5 shrink-0 animate-spin rounded-full border-[1.5px] border-fg-subtle/40 border-t-fg-muted\"\n />\n ) : null}\n </div>\n <div\n ref={listRef}\n id={listId}\n role=\"listbox\"\n aria-label={focusChat ? \"Chat actions\" : pickingWorkspace ? \"Workspaces\" : \"Results\"}\n className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain p-1.5\"\n >\n {items.length === 0 ? (\n <p className=\"px-2.5 py-6 text-center text-sm text-fg-muted\">\n {searching ? \"Searching…\" : \"No matches\"}\n </p>\n ) : (\n groups.map((group) =>\n group.items.length === 0 ? null : (\n <div key={group.label} role=\"group\" aria-label={group.label}>\n {groups.length > 1 || !focusChat ? (\n <div className=\"truncate px-2.5 pt-2 pb-1 text-xs leading-4.5 font-medium text-fg-muted\">\n {group.label}\n </div>\n ) : null}\n {group.items.map((item) => {\n const index = items.indexOf(item);\n const selected = index === activeIndex;\n const Icon = item.icon;\n return (\n <div\n key={item.key}\n id={optionId(item)}\n data-item-key={item.key}\n role=\"option\"\n aria-selected={selected}\n onPointerMove={() => {\n if (!selected) setActive(index);\n }}\n onPointerDown={(event) => event.preventDefault()}\n onClick={(event) =>\n item.run({ newTab: platform === \"mac\" ? event.metaKey : event.ctrlKey })\n }\n className={cn(\n \"relative flex min-h-9 w-full min-w-0 cursor-default items-center gap-2.5 rounded-[10px] px-2.5 py-1.5 text-sm text-fg-label select-none pointer-coarse:min-h-11\",\n selected ? \"bg-hover text-fg\" : null,\n )}\n >\n {item.chat?.avatar ? (\n <SessionAvatar\n avatar={item.chat.avatar}\n name={item.chat.title}\n workspaceId={item.chat.workspaceId}\n seed={item.chat.id}\n size=\"xs\"\n />\n ) : item.tile ? (\n <span\n aria-hidden=\"true\"\n className=\"flex size-4 shrink-0 items-center justify-center rounded-[4px] bg-surface-3 text-2xs font-semibold text-fg-muted\"\n >\n {item.tile}\n </span>\n ) : (\n <Icon\n aria-hidden=\"true\"\n className={cn(\n \"size-4 shrink-0\",\n selected ? \"text-fg\" : \"text-fg-muted\",\n )}\n />\n )}\n {item.parentTitle ? (\n <ChatTitleInParent\n title={<Highlighted text={item.title} query={item.highlight} />}\n parentTitle={item.parentTitle}\n />\n ) : (\n <span className=\"min-w-0 flex-1 truncate\">\n <Highlighted text={item.title} query={item.highlight} />\n </span>\n )}\n {item.workspaceTag ? <WorkspaceTag name={item.workspaceTag} /> : null}\n <ChatStatusMarks status={item.status ?? null} />\n {item.meta ? (\n <span className=\"shrink-0 text-xs text-fg-muted tabular-nums\">\n {item.meta}\n </span>\n ) : null}\n {item.chord ? (\n // Touch screens have no keys to press.\n <Keycaps\n chord={item.chord}\n platform={platform}\n className=\"pointer-coarse:hidden\"\n />\n ) : null}\n </div>\n );\n })}\n </div>\n ),\n )\n )}\n </div>\n <div className=\"hidden shrink-0 items-center gap-4 border-t border-border px-4 py-2 text-xs text-fg-muted pointer-fine:flex\">\n <FooterHint\n keys={[{ code: \"ArrowUp\" }, { code: \"ArrowDown\" }]}\n label=\"Move\"\n platform={platform}\n />\n <FooterHint\n keys={[{ code: \"Enter\" }]}\n label={pickingWorkspace ? \"Switch\" : \"Open\"}\n platform={platform}\n />\n {focusChat || pickingWorkspace ? (\n <FooterHint keys={[{ code: \"Escape\" }]} label=\"Back\" platform={platform} />\n ) : (\n <FooterHint keys={[{ code: \"Tab\" }]} label=\"Chat actions\" platform={platform} />\n )}\n {surface === \"web\" && !focusChat && !pickingWorkspace ? (\n <FooterHint\n keys={[{ code: \"Enter\", mod: true }]}\n label=\"New tab\"\n platform={platform}\n />\n ) : null}\n <span className=\"ml-auto inline-flex items-center gap-1.5\">\n <Keycaps chord={{ code: \"Slash\", mod: true }} platform={platform} />\n All shortcuts\n </span>\n </div>\n </DialogPrimitive.Content>\n </DialogPortal>\n </DialogPrimitive.Root>\n );\n}\n\nfunction FooterHint(props: { keys: Chord[]; label: string; platform: ActionEnv[\"platform\"] }) {\n return (\n <span className=\"inline-flex items-center gap-1.5\">\n <span className=\"inline-flex items-center gap-0.5\">\n {props.keys.map((chord) => (\n <Keycaps key={chord.code} chord={chord} platform={props.platform} />\n ))}\n </span>\n {props.label}\n </span>\n );\n}\n\n/** Enough of a chat row to copy its link when only a recent-chats record is known. */\nfunction pseudoRow(record: ChatRecord): SessionListRow {\n return { id: record.id, workspaceId: record.workspaceId } as SessionListRow;\n}\n","/** Ranking for the ⌘K menu's Sites; kept apart from the sidebar's store so the sidebar never loads it. */\nimport { LOOSE_MATCH_BELOW, rankLabel } from \"./rank\";\nimport type { SiteRecord } from \"./site-directory\";\n\nexport type RankedSite = { site: SiteRecord; rank: number; loose: boolean };\n\n/**\n * Ranks Sites by title the way the menu ranks chat titles. `known` are the\n * Sites the app already holds (instant), most recently active first; `found`\n * are the server's matches for this query, which always count even when the\n * title alone would not match locally. As with recently opened chats, the\n * Sites someone was active in lately get a small lift within a match tier,\n * and recent activity breaks ties.\n */\nexport function rankSites(\n known: readonly SiteRecord[],\n found: readonly SiteRecord[],\n query: string,\n): RankedSite[] {\n const trimmed = query.trim();\n if (!trimmed) return [];\n const candidates = new Map<\n string,\n { site: SiteRecord; fromServer: boolean; recency: number | undefined }\n >();\n known.forEach((site, index) =>\n candidates.set(site.id, { site, fromServer: false, recency: index }),\n );\n for (const site of found) {\n const current = candidates.get(site.id);\n // The server's read has the current title; keep the later activity.\n candidates.set(site.id, {\n site: current\n ? { ...site, updatedAt: Math.max(site.updatedAt, current.site.updatedAt) }\n : site,\n fromServer: true,\n recency: current?.recency,\n });\n }\n const ranked: RankedSite[] = [];\n for (const { site, fromServer, recency } of candidates.values()) {\n let rank = rankLabel(site.title, trimmed);\n const loose = rank !== null && rank < LOOSE_MATCH_BELOW;\n // The server matched the title; folding can differ, so keep it.\n if (rank === null && fromServer) rank = 50;\n if (rank === null) continue;\n if (recency !== undefined) rank += Math.max(0, 20 - recency);\n ranked.push({ site, rank, loose });\n }\n return ranked.sort((a, b) => b.rank - a.rank || b.site.updatedAt - a.site.updatedAt);\n}\n\n/** Sites for the empty menu: the most recently active ones, without the one on screen. */\nexport function recentSites(\n known: readonly SiteRecord[],\n currentSiteId: string | null,\n limit: number,\n): SiteRecord[] {\n return [...known]\n .filter((site) => site.id !== currentSiteId)\n .sort((a, b) => b.updatedAt - a.updatedAt)\n .slice(0, limit);\n}\n","/**\n * How the ⌘K menu finds meetings: by title, by someone who spoke in them, by\n * words said in them (the server's search), and by roughly when they happened\n * (\"yesterday\", \"friday\", \"30 oct\", \"last week\"). English and Norwegian date\n * words both work, since meetings are often held in either.\n */\nimport { foldForSearch, LOOSE_MATCH_BELOW, rankLabel } from \"./rank\";\nimport type { MeetingRecord } from \"./meeting-directory\";\n\n/** A stretch of time someone typed: from its start, up to but not including its end. */\nexport type MeetingDateRange = { from: Date; to: Date };\n\n/** Sunday first, as `Date.getDay()` counts. */\nconst WEEKDAYS: readonly (readonly string[])[] = [\n [\"sunday\", \"sun\", \"sondag\", \"son\"],\n [\"monday\", \"mon\", \"mandag\", \"man\"],\n [\"tuesday\", \"tue\", \"tues\", \"tirsdag\", \"tir\"],\n [\"wednesday\", \"wed\", \"onsdag\", \"ons\"],\n [\"thursday\", \"thu\", \"thur\", \"thurs\", \"torsdag\", \"tor\"],\n [\"friday\", \"fri\", \"fredag\", \"fre\"],\n [\"saturday\", \"sat\", \"lordag\", \"lor\"],\n];\n\nconst MONTHS: readonly (readonly string[])[] = [\n [\"january\", \"jan\", \"januar\"],\n [\"february\", \"feb\", \"februar\"],\n [\"march\", \"mar\", \"mars\"],\n [\"april\", \"apr\"],\n [\"may\", \"mai\"],\n [\"june\", \"jun\", \"juni\"],\n [\"july\", \"jul\", \"juli\"],\n [\"august\", \"aug\"],\n [\"september\", \"sep\", \"sept\"],\n [\"october\", \"oct\", \"oktober\", \"okt\"],\n [\"november\", \"nov\"],\n [\"december\", \"dec\", \"desember\", \"des\"],\n];\n\n/**\n * Month names that stand alone as a date. Abbreviations (\"jan\", \"mar\") only\n * count beside a day, since on their own they are often names or words.\n */\nconst FULL_MONTHS = new Set([\n \"january\",\n \"januar\",\n \"february\",\n \"februar\",\n \"march\",\n \"mars\",\n \"april\",\n \"may\",\n \"mai\",\n \"june\",\n \"juni\",\n \"july\",\n \"juli\",\n \"august\",\n \"september\",\n \"october\",\n \"oktober\",\n \"november\",\n \"december\",\n \"desember\",\n]);\n\nfunction startOfDay(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate());\n}\n\nfunction addDays(date: Date, days: number): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate() + days);\n}\n\nfunction oneDay(day: Date): MeetingDateRange {\n return { from: day, to: addDays(day, 1) };\n}\n\nfunction weekday(word: string): number | null {\n const index = WEEKDAYS.findIndex((names) => names.includes(word));\n return index < 0 ? null : index;\n}\n\nfunction month(word: string): number | null {\n const cleaned = word.replace(/\\.$/, \"\");\n const index = MONTHS.findIndex((names) => names.includes(cleaned));\n return index < 0 ? null : index;\n}\n\n/** A day of a month without a year: this year's, or last year's if that is still to come. */\nfunction pastDate(today: Date, monthIndex: number, day: number, year?: number): Date | null {\n if (day < 1 || day > 31 || monthIndex < 0 || monthIndex > 11) return null;\n let date = new Date(year ?? today.getFullYear(), monthIndex, day);\n // 31 Feb and the like roll into the next month: not a date.\n if (date.getMonth() !== monthIndex) return null;\n if (year === undefined && date > today) date = new Date(today.getFullYear() - 1, monthIndex, day);\n return date;\n}\n\nfunction fullYear(text: string | undefined): number | undefined {\n if (!text) return undefined;\n const value = Number(text);\n return text.length === 2 ? 2000 + value : value;\n}\n\n/** Monday-first weeks, as calendars in Norway and most of Europe count them. */\nfunction startOfWeek(day: Date): Date {\n return addDays(day, -((day.getDay() + 6) % 7));\n}\n\n/**\n * The time a query names, when the whole query is a date: \"today\",\n * \"yesterday\", a weekday (the latest one, today included; \"last friday\" is the\n * one before today), \"this week\", \"last week\", a month (\"october\", the latest\n * one), a day of a month (\"30 oct\", \"oct 30\", \"30. oktober\", with or without\n * a year), \"30.10\", \"30.10.2026\" or \"2026-10-30\". Null otherwise.\n */\nexport function meetingDateRange(query: string, now: Date = new Date()): MeetingDateRange | null {\n const text = foldForSearch(query).replace(/,/g, \" \").replace(/\\s+/g, \" \").trim();\n if (!text) return null;\n const today = startOfDay(now);\n if (text === \"today\" || text === \"i dag\" || text === \"idag\") return oneDay(today);\n if (text === \"yesterday\" || text === \"i gar\" || text === \"igar\")\n return oneDay(addDays(today, -1));\n if (text === \"this week\" || text === \"denne uken\" || text === \"denne uka\") {\n return { from: startOfWeek(today), to: addDays(today, 1) };\n }\n if (text === \"last week\" || text === \"forrige uke\" || text === \"sist uke\") {\n const thisWeek = startOfWeek(today);\n return { from: addDays(thisWeek, -7), to: thisWeek };\n }\n const words = text.split(\" \");\n // A weekday: \"friday\", \"on friday\", \"last friday\", \"fredag\", \"forrige fredag\", \"pa fredag\".\n const last = words[0] === \"last\" || words[0] === \"forrige\" || words[0] === \"sist\";\n const dayWords = words[0] === \"on\" || words[0] === \"pa\" || last ? words.slice(1) : words;\n // Bare abbreviations (\"man\", \"tor\", \"sun\") are ordinary words too; they need \"last\" or \"on\".\n if (dayWords.length === 1 && (dayWords !== words || dayWords[0]!.length >= 6)) {\n const day = weekday(dayWords[0]!);\n if (day !== null) {\n let back = (today.getDay() - day + 7) % 7;\n if (last && back === 0) back = 7;\n return oneDay(addDays(today, -back));\n }\n }\n // A month on its own: the latest one, this month included.\n if (words.length === 1 && FULL_MONTHS.has(words[0]!)) {\n const monthIndex = month(words[0]!);\n if (monthIndex !== null) {\n const year = monthIndex <= today.getMonth() ? today.getFullYear() : today.getFullYear() - 1;\n return { from: new Date(year, monthIndex, 1), to: new Date(year, monthIndex + 1, 1) };\n }\n }\n // 2026-10-30\n const iso = /^(\\d{4})-(\\d{1,2})-(\\d{1,2})$/.exec(text);\n if (iso) {\n const date = pastDate(today, Number(iso[2]) - 1, Number(iso[3]), Number(iso[1]));\n return date ? oneDay(date) : null;\n }\n // 30.10, 30.10.2026, 30.10.26\n const dotted = /^(\\d{1,2})\\.(\\d{1,2})\\.?(\\d{2}|\\d{4})?$/.exec(text);\n if (dotted) {\n const date = pastDate(today, Number(dotted[2]) - 1, Number(dotted[1]), fullYear(dotted[3]));\n return date ? oneDay(date) : null;\n }\n // 30 oct, 30. oktober, 30 october 2026\n const dayFirst = /^(\\d{1,2})\\.? ([a-z]+\\.?)(?: (\\d{4}))?$/.exec(text);\n if (dayFirst) {\n const monthIndex = month(dayFirst[2]!);\n const date =\n monthIndex === null\n ? null\n : pastDate(today, monthIndex, Number(dayFirst[1]), fullYear(dayFirst[3]));\n return date ? oneDay(date) : null;\n }\n // oct 30, october 30 2026\n const monthFirst = /^([a-z]+\\.?) (\\d{1,2})(?: (\\d{4}))?$/.exec(text);\n if (monthFirst) {\n const monthIndex = month(monthFirst[1]!);\n const date =\n monthIndex === null\n ? null\n : pastDate(today, monthIndex, Number(monthFirst[2]), fullYear(monthFirst[3]));\n return date ? oneDay(date) : null;\n }\n return null;\n}\n\n/** How the server found a meeting for the query. */\nexport type MeetingMatch = \"words\" | \"person\" | \"date\";\n\nexport type FoundMeeting = { meeting: MeetingRecord; match: MeetingMatch };\n\nexport type RankedMeeting = { meeting: MeetingRecord; rank: number; loose: boolean };\n\n/**\n * Someone who spoke in it, by name: a deliberate match, ahead of a date the\n * same word could name (\"August\", \"May\").\n */\nconst PERSON_RANK = 850;\n/** A date the query names outranks the title words it happens to share. */\nconst DATE_RANK = 800;\n/** Every word found in its title or transcript, but not as a title match here. */\nconst WORDS_RANK = 450;\n\n/**\n * Ranks meetings for a query. `known` are the newest meetings the menu already\n * holds (their titles match at once); `found` are the server's answers, each\n * with how it matched. A meeting keeps its best reason, and newer meetings win\n * ties.\n */\nexport function rankMeetings(\n known: readonly MeetingRecord[],\n found: readonly FoundMeeting[],\n query: string,\n range: MeetingDateRange | null,\n): RankedMeeting[] {\n const trimmed = query.trim();\n if (!trimmed) return [];\n const best = new Map<string, RankedMeeting>();\n const consider = (meeting: MeetingRecord, rank: number | null, loose = false) => {\n if (rank === null) return;\n const current = best.get(meeting.id);\n if (!current || rank > current.rank) best.set(meeting.id, { meeting, rank, loose });\n };\n const inRange = (meeting: MeetingRecord) =>\n range !== null &&\n meeting.startedAt >= range.from.getTime() &&\n meeting.startedAt < range.to.getTime();\n for (const meeting of [...known, ...found.map((entry) => entry.meeting)]) {\n const rank = rankLabel(meeting.title, trimmed);\n consider(meeting, rank, rank !== null && rank < LOOSE_MATCH_BELOW);\n if (inRange(meeting)) consider(meeting, DATE_RANK);\n }\n for (const { meeting, match } of found) {\n consider(\n meeting,\n match === \"date\"\n ? inRange(meeting)\n ? DATE_RANK\n : null\n : match === \"person\"\n ? PERSON_RANK\n : WORDS_RANK,\n );\n }\n return [...best.values()].sort(\n (a, b) => b.rank - a.rank || b.meeting.startedAt - a.meeting.startedAt,\n );\n}\n\n/** Meetings for the empty menu: the newest ones, without the one on screen. */\nexport function recentMeetings(\n known: readonly MeetingRecord[],\n currentMeetingId: string | null,\n limit: number,\n): MeetingRecord[] {\n return known.filter((meeting) => meeting.id !== currentMeetingId).slice(0, limit);\n}\n"],"mappings":"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","names":["current","trimmed","scored","items","result"]}