@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.
- package/dist/app/app-state.d.ts +4 -0
- package/dist/app/app-state.js +19 -14
- package/dist/app/components/Composer.js +25 -23
- package/dist/app/components/agent/agent-capability-picker.js +10 -8
- package/dist/app/components/artifacts/artifact-browse-controls.js +4 -4
- package/dist/app/components/artifacts/artifact-library.js +21 -19
- package/dist/app/components/artifacts/artifact-page-chrome.js +3 -3
- package/dist/app/components/artifacts/artifact-viewer.js +23 -22
- package/dist/app/components/artifacts/artifact-viewer.js.map +1 -1
- package/dist/app/components/artifacts/chat-interactive-block.js +12 -12
- package/dist/app/components/artifacts/copy-artifact-link.js +7 -5
- package/dist/app/components/artifacts/file-reach-dialog.js +11 -9
- package/dist/app/components/artifacts/inline-chat-image.js +18 -18
- package/dist/app/components/artifacts/retained-file-preview.js +24 -23
- package/dist/app/components/artifacts/retained-text-preview.js +3 -3
- package/dist/app/components/artifacts/site-audience.js +6 -5
- package/dist/app/components/artifacts/site-conversations.js +16 -14
- package/dist/app/components/artifacts/site-data.js +18 -16
- package/dist/app/components/artifacts/site-public-link.js +3 -2
- package/dist/app/components/artifacts/site-publishing-page.js +39 -37
- package/dist/app/components/artifacts/site-publishing.js +34 -32
- package/dist/app/components/artifacts/site-settings.js +38 -36
- package/dist/app/components/artifacts/site-version-menu.js +8 -7
- package/dist/app/components/billing-class-mark.js +3 -3
- package/dist/app/components/bots/bot-launch-strip.js +17 -17
- package/dist/app/components/bots/bot-template-dialog.js +30 -28
- package/dist/app/components/bots/bot-template-shortcuts.js +19 -19
- package/dist/app/components/bots/bot-templates-page.js +38 -36
- package/dist/app/components/bots/bot-templates-page.js.map +1 -1
- package/dist/app/components/capabilities/capability-detail-sheet.js +13 -11
- package/dist/app/components/capabilities/capability-logo-source.js +13 -13
- package/dist/app/components/capabilities/capability-logo.js +4 -3
- package/dist/app/components/capabilities/connector-tool-permissions.js +8 -6
- package/dist/app/components/capabilities/native-connect-setup.js +14 -14
- package/dist/app/components/capabilities/own-logins-shared-heads-up.js +7 -6
- package/dist/app/components/capabilities/perform-capability-action.js +7 -6
- package/dist/app/components/capabilities/prepared-mcp-setup-card.js +17 -17
- package/dist/app/components/capabilities/session-capability-card.js +72 -70
- package/dist/app/components/capabilities/session-capability-card.js.map +1 -1
- package/dist/app/components/capabilities/session-chrome-card.js +28 -26
- package/dist/app/components/capabilities/session-connection-accounts.js +4 -3
- package/dist/app/components/capabilities/session-custom-mcp-card.js +20 -19
- package/dist/app/components/capabilities/session-github-card.js +22 -20
- package/dist/app/components/capabilities/session-machine-card.js +27 -25
- package/dist/app/components/capabilities/session-personal-github-card.js +16 -16
- package/dist/app/components/capabilities/session-plugin-card.js +10 -9
- package/dist/app/components/capabilities/use-capabilities-catalog.js +4 -3
- package/dist/app/components/capabilities/use-connection-accounts.js +5 -4
- package/dist/app/components/command-menu/chat-status.js +15 -13
- package/dist/app/components/command-menu/chat-switcher.js +35 -33
- package/dist/app/components/command-menu/chat-switcher.js.map +1 -1
- package/dist/app/components/command-menu/command-menu.js +53 -50
- package/dist/app/components/command-menu/command-menu.js.map +1 -1
- package/dist/app/components/command-menu/shortcut-sheet.js +18 -16
- package/dist/app/components/command-menu/shortcut-sheet.js.map +1 -1
- package/dist/app/components/common.js +4 -3
- package/dist/app/components/composer-capabilities-menu-body.js +4 -4
- package/dist/app/components/composer-mobile-plus-panel.js +8 -8
- package/dist/app/components/composer-mobile-plus.js +1 -1
- package/dist/app/components/credit-required-gate.js +3 -3
- package/dist/app/components/credit-required-prompt.js +10 -8
- package/dist/app/components/credit-required-prompt.js.map +1 -1
- package/dist/app/components/credits/checkout-credits-celebration.js +3 -2
- package/dist/app/components/credits/checkout-return.js +3 -2
- package/dist/app/components/credits/checkout-return.js.map +1 -1
- package/dist/app/components/credits/coupon-redeem.js +5 -4
- package/dist/app/components/credits/credit-refusal-notice.js +7 -5
- package/dist/app/components/cross-slot-deep-link-recovery.js +5 -4
- package/dist/app/components/desktop/app-shots.js +13 -11
- package/dist/app/components/desktop/computer-use.js +6 -4
- package/dist/app/components/desktop/this-computer.js +9 -7
- package/dist/app/components/feedback.js +5 -4
- package/dist/app/components/follow-up-repository-menu-body.js +8 -6
- package/dist/app/components/follow-up-repository-menu-body.js.map +1 -1
- package/dist/app/components/follow-up-repository-picker.js +1 -1
- package/dist/app/components/github-app-connect-launcher.js +5 -4
- package/dist/app/components/in-app-help-link.js +3 -3
- package/dist/app/components/knowledge/agent-learning-settings.js +3 -2
- package/dist/app/components/knowledge/agent-learning-settings.js.map +1 -1
- package/dist/app/components/machines/connect-machine-dialog.js +18 -16
- package/dist/app/components/manual-repository-editor.js +3 -2
- package/dist/app/components/markdown.js +6 -6
- package/dist/app/components/models/models-ui.js +12 -10
- package/dist/app/components/my-things.js +12 -10
- package/dist/app/components/my-things.js.map +1 -1
- package/dist/app/components/new-session-starters.js +3 -3
- package/dist/app/components/own-where-it-works.js +9 -7
- package/dist/app/components/personal-resource-attachment-surface.js +4 -4
- package/dist/app/components/pickers.js +5 -5
- package/dist/app/components/rail/channel-create-dialog.js +7 -5
- package/dist/app/components/rail/project-glyph.js +17 -17
- package/dist/app/components/rail/project-profile.js +31 -29
- package/dist/app/components/rail/rail-context.js +3 -3
- package/dist/app/components/rail/rail-sections.js +68 -66
- package/dist/app/components/rail/session-header.js +59 -57
- package/dist/app/components/rail/session-list.js +66 -64
- package/dist/app/components/rail/session-row-content.js +4 -4
- package/dist/app/components/rail/session-row-hover-details.js +14 -12
- package/dist/app/components/rail/session-shell.js +90 -88
- package/dist/app/components/rail/site-session-group-heading.js +8 -8
- package/dist/app/components/repository-picker.js +8 -6
- package/dist/app/components/secrets/session-secrets-panel.js +4 -3
- package/dist/app/components/secrets/vault-model.js +3 -2
- package/dist/app/components/session/agent-configuration-panel.js +25 -23
- package/dist/app/components/session/agent-configuration-panel.js.map +1 -1
- package/dist/app/components/session/artifact-link-boundary.js +3 -3
- package/dist/app/components/session/artifact-session-page.js +11 -9
- package/dist/app/components/session/banners.js +8 -8
- package/dist/app/components/session/codex-usage-notice.js +5 -3
- package/dist/app/components/session/console-new-conversation.js +42 -40
- package/dist/app/components/session/context-text-reader.js +3 -2
- package/dist/app/components/session/descendant-requests.js +39 -37
- package/dist/app/components/session/descendant-requests.js.map +1 -1
- package/dist/app/components/session/editable-artifacts-workspace.js +36 -34
- package/dist/app/components/session/editable-artifacts-workspace.js.map +1 -1
- package/dist/app/components/session/failed-session-banner.js +13 -11
- package/dist/app/components/session/failed-session-banner.js.map +1 -1
- package/dist/app/components/session/failure-recovery-boundary.js +3 -3
- package/dist/app/components/session/human-input-delegation-record.js +2 -2
- package/dist/app/components/session/human-input.js +33 -31
- package/dist/app/components/session/inspector.js +57 -55
- package/dist/app/components/session/inspector.js.map +1 -1
- package/dist/app/components/session/message-actions.js +5 -4
- package/dist/app/components/session/message-actions.js.map +1 -1
- package/dist/app/components/session/message-resource-attachments.js +12 -11
- package/dist/app/components/session/message-resource-attachments.js.map +1 -1
- package/dist/app/components/session/model-context-inspector.js +6 -4
- package/dist/app/components/session/model-recovery-notice.js +3 -3
- package/dist/app/components/session/new-session-settings-menu.js +11 -9
- package/dist/app/components/session/new-session-setup-strip.js +18 -18
- package/dist/app/components/session/sandbox-recovery-actions.js +3 -3
- package/dist/app/components/session/sandbox-switcher.js +10 -9
- package/dist/app/components/session/sandbox-workspace.js +47 -46
- package/dist/app/components/session/search-markdown-highlight.js +7 -7
- package/dist/app/components/session/search-results-view.js +8 -8
- package/dist/app/components/session/session-admin-access.js +13 -11
- package/dist/app/components/session/session-admission-notice.js +7 -5
- package/dist/app/components/session/session-avatar-picker.js +22 -20
- package/dist/app/components/session/session-avatar.js +16 -16
- package/dist/app/components/session/session-machine-access-notice.js +7 -5
- package/dist/app/components/session/session-profile-dialog.js +29 -27
- package/dist/app/components/session/session-profile-editor.js +30 -28
- package/dist/app/components/session/session-retention.js +10 -8
- package/dist/app/components/session/session-search-dialog.js +10 -10
- package/dist/app/components/session/session-skill-reviews.js +2 -1
- package/dist/app/components/session/session-skill-reviews.js.map +1 -1
- package/dist/app/components/session/session-tenancy-control.js +13 -11
- package/dist/app/components/session/session-tenancy-control.js.map +1 -1
- package/dist/app/components/session/session-unattended-setting.js +7 -5
- package/dist/app/components/session/session-usage-limit-section.js +11 -9
- package/dist/app/components/session/share-chat-dialog.js +9 -7
- package/dist/app/components/session/site-origin-link.js +3 -3
- package/dist/app/components/session/subagents.js +8 -8
- package/dist/app/components/session/subscription-account-indicator.js +6 -6
- package/dist/app/components/session-connectors-menu-body.js +4 -3
- package/dist/app/components/session-connectors-menu-body.js.map +1 -1
- package/dist/app/components/settings/row-select.js +7 -5
- package/dist/app/components/toaster.js +3 -2
- package/dist/app/components/transcription-settings.js +11 -9
- package/dist/app/components/ui/destructive-confirm.js +11 -9
- package/dist/app/components/usage/usage-entry.js +5 -5
- package/dist/app/components/window-bar.js +16 -14
- package/dist/app/components/workspace-composer-plus.js +22 -21
- package/dist/app/components/workspace-reach.js +6 -4
- package/dist/app/components/workspace-tenant-boundary.js +5 -4
- package/dist/app/embed/memory-navigation.js +3 -3
- package/dist/app/embed/session-app.js +211 -209
- package/dist/app/lib/actions/actions-provider.js +15 -13
- package/dist/app/lib/agent-capabilities.js +3 -3
- package/dist/app/lib/app-surfaces.js +7 -6
- package/dist/app/lib/archive-session.d.ts +9 -4
- package/dist/app/lib/archive-session.js +4 -2
- package/dist/app/lib/bot-templates.js +3 -2
- package/dist/app/lib/capabilities.js +3 -2
- package/dist/app/lib/codex-usage-query.js +2 -2
- package/dist/app/lib/composer-connectors.js +17 -16
- package/dist/app/lib/console-site.js +2 -2
- package/dist/app/lib/console-text.js +2 -2
- package/dist/app/lib/events.js +9 -9
- package/dist/app/lib/failed-session-copy.js +3 -3
- package/dist/app/lib/inbox.js +4 -2
- package/dist/app/lib/model-access-onboarding.js +3 -3
- package/dist/app/lib/move-chat-to-machine.js +3 -3
- package/dist/app/lib/navigation.js +2 -2
- package/dist/app/lib/session-branch-cache.js +6 -6
- package/dist/app/lib/session-create.js +4 -4
- package/dist/app/lib/session-group-pagination.js +6 -6
- package/dist/app/lib/session-hover-facts.js +13 -11
- package/dist/app/lib/session-model.js +2 -2
- package/dist/app/lib/session-rail.js +3 -3
- package/dist/app/lib/session-rename.js +3 -3
- package/dist/app/lib/session-restart-operation-controller.js +4 -3
- package/dist/app/lib/session-tenancy.js +3 -2
- package/dist/app/lib/session-usage-limit.js +3 -2
- package/dist/app/lib/sessions-group.js +5 -5
- package/dist/app/lib/site-publishing.js +3 -2
- package/dist/app/lib/site-tool-consent-dialog.js +9 -7
- package/dist/app/lib/site-tool-consent-dialog.js.map +1 -1
- package/dist/app/lib/site-tool-consent.js +1 -1
- package/dist/app/lib/subscription-plans.js +3 -2
- package/dist/app/lib/toast.js +2 -1
- package/dist/app/lib/turn-failure-analytics.js +4 -4
- package/dist/app/lib/use-duplicate-site.js +6 -5
- package/dist/app/lib/use-follow-up-repositories.js +6 -5
- package/dist/app/lib/use-workspace-integrations.js +4 -3
- package/dist/app/lib/use-workspace-machines.js +4 -4
- package/dist/app/lib/use-workspace-model-catalog.js +5 -4
- package/dist/app/lib/use-workspace-rigs.js +2 -2
- package/dist/app/lib/workspace-navigation-preference.js +4 -4
- package/dist/app/lib/workspace-scope-context.js +3 -3
- package/dist/app/routes/artifacts.js +67 -66
- package/dist/app/routes/artifacts.js.map +1 -1
- package/dist/app/routes/retained-artifact.js +42 -40
- package/dist/app/routes/retained-artifact.js.map +1 -1
- package/dist/app/routes/session-unavailable.js +8 -7
- package/dist/app/routes/session.js +119 -117
- package/dist/app/routes/sessions-index-hydration.js +5 -5
- package/dist/app/routes/sessions-index.js +104 -102
- package/dist/app/routes/site-view.js +67 -65
- package/dist/app/routes/site-view.js.map +1 -1
- package/dist/artifacts-document.js +4 -4
- package/dist/artifacts-presentation.js +4 -4
- package/dist/artifacts-spreadsheet.js +4 -4
- package/dist/artifacts.js +10 -10
- package/dist/automations.js +17 -15
- package/dist/automations.js.map +1 -1
- package/dist/browser-viewer-TC27OCIP.js +23 -0
- package/dist/chat-interactive-block-RWPQBHVS.js +18 -0
- package/dist/chunk-2BDT3UZQ.js +229 -0
- package/dist/chunk-2CLNIEK4.js +373 -0
- package/dist/chunk-2FSBSCZJ.js +451 -0
- package/dist/chunk-2I7HDP53.js +199 -0
- package/dist/chunk-2INLDVK3.js +15 -0
- package/dist/chunk-2KALVELR.js +126 -0
- package/dist/chunk-2M3J7ZWQ.js +418 -0
- package/dist/chunk-2OP6WLGV.js +708 -0
- package/dist/chunk-2RG7NIAS.js +2936 -0
- package/dist/chunk-2STUPWEL.js +135 -0
- package/dist/chunk-2YUOVM3G.js +271 -0
- package/dist/chunk-2Z3NQNTM.js +3670 -0
- package/dist/chunk-3CPWWGNK.js +920 -0
- package/dist/chunk-3ED2U6XE.js +37 -0
- package/dist/chunk-3GZA4BUW.js +216 -0
- package/dist/chunk-3IK6UYO6.js +1022 -0
- package/dist/chunk-3PZ7JZI2.js +431 -0
- package/dist/chunk-4DVJ6ONS.js +50 -0
- package/dist/chunk-4DVNUCRR.js +2386 -0
- package/dist/chunk-4DVNUCRR.js.map +1 -0
- package/dist/chunk-4E3ZJRTZ.js +41 -0
- package/dist/chunk-4SAWSRAA.js +141 -0
- package/dist/chunk-53AGXXZM.js +307 -0
- package/dist/chunk-54YW6SZZ.js +818 -0
- package/dist/chunk-57AZS3IE.js +2317 -0
- package/dist/chunk-5CPEEAFD.js +143 -0
- package/dist/chunk-5EWSRZ2Y.js +340 -0
- package/dist/chunk-5IE76VCY.js +387 -0
- package/dist/chunk-5NWEKLDZ.js +170 -0
- package/dist/chunk-5O2FCCHZ.js +198 -0
- package/dist/chunk-5QAY6K77.js +399 -0
- package/dist/chunk-5YKW2K6I.js +625 -0
- package/dist/chunk-5YKW2K6I.js.map +1 -0
- package/dist/chunk-6BCXNDEI.js +4116 -0
- package/dist/chunk-6BCXNDEI.js.map +1 -0
- package/dist/chunk-6DK6Z4UN.js +2599 -0
- package/dist/chunk-6DVCC7QS.js +702 -0
- package/dist/chunk-6JHU2UBS.js +2058 -0
- package/dist/chunk-6PZ7OBYU.js +490 -0
- package/dist/chunk-6WD2INST.js +539 -0
- package/dist/chunk-6WD2INST.js.map +1 -0
- package/dist/chunk-6WGRDRMA.js +163 -0
- package/dist/chunk-77WAKEAH.js +186 -0
- package/dist/chunk-7T2ZE3VT.js +5558 -0
- package/dist/chunk-7T2ZE3VT.js.map +1 -0
- package/dist/chunk-7TDO3CUM.js +393 -0
- package/dist/chunk-7TIX2UAR.js +247 -0
- package/dist/chunk-7V5REBCP.js +148 -0
- package/dist/chunk-7VMZGLYI.js +339 -0
- package/dist/chunk-7W37NS3I.js +236 -0
- package/dist/chunk-7X6SDK2C.js +111 -0
- package/dist/chunk-7ZNUHRP5.js +95 -0
- package/dist/chunk-A36PZALD.js +84 -0
- package/dist/chunk-AUI6VA63.js +107 -0
- package/dist/chunk-AW2MQB37.js +24 -0
- package/dist/chunk-AWKES45Y.js +198 -0
- package/dist/chunk-AXHZYXUV.js +132 -0
- package/dist/chunk-BHNSJVBC.js +129 -0
- package/dist/chunk-BJEJFISW.js +50 -0
- package/dist/chunk-BJFH6JI5.js +422 -0
- package/dist/chunk-BMICEQZQ.js +960 -0
- package/dist/chunk-BTLBYBLU.js +29 -0
- package/dist/chunk-BXBDYNRP.js +89 -0
- package/dist/chunk-C372BFOV.js +357 -0
- package/dist/chunk-C43KRXGA.js +234 -0
- package/dist/chunk-C43KRXGA.js.map +1 -0
- package/dist/chunk-CMKGILJK.js +4824 -0
- package/dist/chunk-CRAOSVHC.js +50 -0
- package/dist/chunk-CRU35QQH.js +281 -0
- package/dist/chunk-CUIWCGMA.js +172 -0
- package/dist/chunk-D5TWNFFE.js +38 -0
- package/dist/chunk-DF5EAHDN.js +4461 -0
- package/dist/chunk-DJAXC5OK.js +56 -0
- package/dist/chunk-DXBYWSL5.js +3550 -0
- package/dist/chunk-DXR5PDFP.js +84 -0
- package/dist/chunk-DZWARC4M.js +267 -0
- package/dist/chunk-DZXEDSQI.js +106 -0
- package/dist/chunk-E7XERZWC.js +48 -0
- package/dist/chunk-ECJBYNLJ.js +79 -0
- package/dist/chunk-EDI6SJ2N.js +43 -0
- package/dist/chunk-EWSOC6WF.js +114 -0
- package/dist/chunk-F2OPHAUN.js +103 -0
- package/dist/chunk-F4ISQGGM.js +81 -0
- package/dist/chunk-FO4LYKJL.js +197 -0
- package/dist/chunk-FPXASDG5.js +73 -0
- package/dist/chunk-FSOQDUCG.js +117 -0
- package/dist/chunk-FSOQDUCG.js.map +1 -0
- package/dist/chunk-FVXBNBHO.js +157 -0
- package/dist/chunk-FYWT2O76.js +34 -0
- package/dist/chunk-FYWT2O76.js.map +1 -0
- package/dist/chunk-FZC5N55X.js +981 -0
- package/dist/chunk-GAVYGBFI.js +99 -0
- package/dist/chunk-GFIMOUDT.js +846 -0
- package/dist/chunk-GFIMOUDT.js.map +1 -0
- package/dist/chunk-GKVJIDHF.js +33 -0
- package/dist/chunk-GVN5SZLX.js +212 -0
- package/dist/chunk-H3T7IWNA.js +134 -0
- package/dist/chunk-HAX4LCR5.js +261 -0
- package/dist/chunk-HC4JFZVU.js +121 -0
- package/dist/chunk-HEFPPMBQ.js +581 -0
- package/dist/chunk-HGKTHF2U.js +1356 -0
- package/dist/chunk-HGKTHF2U.js.map +1 -0
- package/dist/chunk-HNLR7Q4Z.js +83 -0
- package/dist/chunk-HSOXMJOT.js +12 -0
- package/dist/chunk-I4MRDSUF.js +281 -0
- package/dist/chunk-I4QEJ62Y.js +202 -0
- package/dist/chunk-I5B5L6Q4.js +56 -0
- package/dist/chunk-I5QZJODL.js +264 -0
- package/dist/chunk-I7ITSXSJ.js +603 -0
- package/dist/chunk-I7XIZRFD.js +390 -0
- package/dist/chunk-IDANQPRH.js +82 -0
- package/dist/chunk-IFB3WJ36.js +212 -0
- package/dist/chunk-IHTAKKTK.js +264 -0
- package/dist/chunk-IKXNLWAL.js +205 -0
- package/dist/chunk-IKXNLWAL.js.map +1 -0
- package/dist/chunk-ILDXWY37.js +173 -0
- package/dist/chunk-IMDQUHBJ.js +570 -0
- package/dist/chunk-IMZCQBOT.js +119 -0
- package/dist/chunk-IXPTECSC.js +403 -0
- package/dist/chunk-J255A3N5.js +71 -0
- package/dist/chunk-J5F5HPPW.js +141 -0
- package/dist/chunk-JDTGRRNU.js +5045 -0
- package/dist/chunk-JDTGRRNU.js.map +1 -0
- package/dist/chunk-JEA3QDX7.js +2469 -0
- package/dist/chunk-JEUPAVYY.js +156 -0
- package/dist/chunk-JKHKLL5W.js +194 -0
- package/dist/chunk-JQL7ZH6C.js +650 -0
- package/dist/chunk-JWB44UGJ.js +57 -0
- package/dist/chunk-JZ4NLCAP.js +333 -0
- package/dist/chunk-K2A5PXQ5.js +412 -0
- package/dist/chunk-K56XV3C3.js +623 -0
- package/dist/chunk-K6GAXXVA.js +23 -0
- package/dist/chunk-KCBMFSMS.js +199 -0
- package/dist/chunk-KF2FV3ZJ.js +268 -0
- package/dist/chunk-KJD65EJP.js +278 -0
- package/dist/chunk-KLEUWIMZ.js +386 -0
- package/dist/chunk-KODELWYT.js +309 -0
- package/dist/chunk-KRDR5RJD.js +83 -0
- package/dist/chunk-KUDGXAF7.js +914 -0
- package/dist/chunk-KY2R73CG.js +171 -0
- package/dist/chunk-KY2R73CG.js.map +1 -0
- package/dist/chunk-KYS77RPN.js +85 -0
- package/dist/chunk-L7YTNTIK.js +368 -0
- package/dist/chunk-LHPNABDH.js +686 -0
- package/dist/chunk-MFROMEKA.js +401 -0
- package/dist/chunk-MIHN76LX.js +2656 -0
- package/dist/chunk-MIYFS2XN.js +42 -0
- package/dist/chunk-MJUCFQMS.js +65 -0
- package/dist/chunk-MM4FNWI4.js +3064 -0
- package/dist/chunk-MNZG4OHU.js +790 -0
- package/dist/chunk-MVW6HNPI.js +250 -0
- package/dist/chunk-MVW6HNPI.js.map +1 -0
- package/dist/chunk-N6AACDUW.js +200 -0
- package/dist/chunk-NC55IFN3.js +781 -0
- package/dist/chunk-NC7PVOEK.js +98 -0
- package/dist/chunk-NCYMNCJO.js +70 -0
- package/dist/chunk-ND2BXV3P.js +259 -0
- package/dist/chunk-NDBTFUO6.js +272 -0
- package/dist/chunk-NDQJZ7HF.js +206 -0
- package/dist/chunk-NGJJJPZZ.js +162 -0
- package/dist/chunk-NJTSNNE7.js +251 -0
- package/dist/chunk-NPGISCU6.js +4159 -0
- package/dist/chunk-NPGISCU6.js.map +1 -0
- package/dist/chunk-NRTE7DNV.js +1270 -0
- package/dist/chunk-NULUNM7H.js +290 -0
- package/dist/chunk-NUNZS36W.js +227 -0
- package/dist/chunk-NW53H5RW.js +2424 -0
- package/dist/chunk-NXCMHIKI.js +263 -0
- package/dist/chunk-O3LKCBP5.js +159 -0
- package/dist/chunk-O4EA4F3W.js +103 -0
- package/dist/chunk-O4EA4F3W.js.map +1 -0
- package/dist/chunk-O4OOG3D6.js +116 -0
- package/dist/chunk-O4OOG3D6.js.map +1 -0
- package/dist/chunk-O6N4ABCA.js +376 -0
- package/dist/chunk-O732GAFC.js +112 -0
- package/dist/chunk-OF4TIKYC.js +690 -0
- package/dist/chunk-OMPVOMPP.js +70 -0
- package/dist/chunk-OPJJSKUK.js +118 -0
- package/dist/chunk-OPWCMA4D.js +196 -0
- package/dist/chunk-ORJPS5VN.js +1193 -0
- package/dist/chunk-OSY5K7L7.js +187 -0
- package/dist/chunk-OV6QJRT4.js +45 -0
- package/dist/chunk-OVKYVZMW.js +108 -0
- package/dist/chunk-OZCBM3UC.js +171 -0
- package/dist/chunk-P3A2EINJ.js +61 -0
- package/dist/chunk-PTAG4PDC.js +27 -0
- package/dist/chunk-PTF5B7TJ.js +298 -0
- package/dist/chunk-Q3DPEYX4.js +848 -0
- package/dist/chunk-Q6CGOPJD.js +215 -0
- package/dist/chunk-Q6CGOPJD.js.map +1 -0
- package/dist/chunk-QB2KMIDP.js +100 -0
- package/dist/chunk-QCSJ4CWE.js +1067 -0
- package/dist/chunk-QIOQ2NPQ.js +414 -0
- package/dist/chunk-QK5EFEUT.js +353 -0
- package/dist/chunk-QPQBLYQJ.js +41 -0
- package/dist/chunk-QPSGCC5D.js +184 -0
- package/dist/chunk-QZAAUQRN.js +474 -0
- package/dist/chunk-QZM6YDJW.js +489 -0
- package/dist/chunk-QZM6YDJW.js.map +1 -0
- package/dist/chunk-RGBI63KJ.js +188 -0
- package/dist/chunk-RLBKLAEY.js +138 -0
- package/dist/chunk-RMFKVOM7.js +304 -0
- package/dist/chunk-ROKQU7WG.js +258 -0
- package/dist/chunk-RPVREAU7.js +251 -0
- package/dist/chunk-RQKLF42C.js +723 -0
- package/dist/chunk-SC6RRD2D.js +38 -0
- package/dist/chunk-SC6RRD2D.js.map +1 -0
- package/dist/chunk-SEO7TICN.js +94 -0
- package/dist/chunk-SHHJCL7X.js +432 -0
- package/dist/chunk-SIRLACNZ.js +114 -0
- package/dist/chunk-SKPHMYAA.js +237 -0
- package/dist/chunk-SODC7T6L.js +1583 -0
- package/dist/chunk-SQJIKMN3.js +366 -0
- package/dist/chunk-SVINDKVW.js +26 -0
- package/dist/chunk-SYCDHPZF.js +335 -0
- package/dist/chunk-T2QX3FDP.js +133 -0
- package/dist/chunk-T3OWFVMS.js +1187 -0
- package/dist/chunk-T6XI5FLY.js +61 -0
- package/dist/chunk-T7OXJZCX.js +62 -0
- package/dist/chunk-TAT5USZN.js +353 -0
- package/dist/chunk-TPQTRNER.js +172 -0
- package/dist/chunk-TUIN4MB7.js +266 -0
- package/dist/chunk-TX3VECZU.js +71 -0
- package/dist/chunk-TXLIEOJX.js +9624 -0
- package/dist/chunk-U3DN4HEY.js +27 -0
- package/dist/chunk-U7XM7CB4.js +191 -0
- package/dist/chunk-UJK53QFL.js +140 -0
- package/dist/chunk-UMTXA2TH.js +319 -0
- package/dist/chunk-UPDSXFK5.js +199 -0
- package/dist/chunk-UTIAXH52.js +269 -0
- package/dist/chunk-UVN5TMHU.js +1184 -0
- package/dist/chunk-V4Z4B2E3.js +52 -0
- package/dist/chunk-V4Z4B2E3.js.map +1 -0
- package/dist/chunk-VGYXW3VG.js +246 -0
- package/dist/chunk-VS7AHPCZ.js +255 -0
- package/dist/chunk-VTTAJOQ7.js +121 -0
- package/dist/chunk-VWPOLUAO.js +99 -0
- package/dist/chunk-X3MWB2QU.js +3851 -0
- package/dist/chunk-X6KAJI3V.js +211 -0
- package/dist/chunk-XBLRHV5R.js +50 -0
- package/dist/chunk-XDFP2LMW.js +605 -0
- package/dist/chunk-XEQMZB3C.js +525 -0
- package/dist/chunk-XEYLT5VA.js +223 -0
- package/dist/chunk-XHIQ5I6N.js +918 -0
- package/dist/chunk-XLH7QY2R.js +378 -0
- package/dist/chunk-XWFAMUZQ.js +113 -0
- package/dist/chunk-Y4BB2KS2.js +294 -0
- package/dist/chunk-Y4BB2KS2.js.map +1 -0
- package/dist/chunk-Y4OBB2VN.js +84 -0
- package/dist/chunk-YCVD6CI3.js +234 -0
- package/dist/chunk-YENLNISG.js +270 -0
- package/dist/chunk-YIRVLKAX.js +351 -0
- package/dist/chunk-YL73CVNK.js +390 -0
- package/dist/chunk-YLS6QE5G.js +288 -0
- package/dist/chunk-YNF2OC54.js +366 -0
- package/dist/chunk-YNF2OC54.js.map +1 -0
- package/dist/chunk-YPWU5KPE.js +147 -0
- package/dist/chunk-YQXTDZSU.js +2984 -0
- package/dist/chunk-YSJEAAOL.js +178 -0
- package/dist/chunk-YWIFM7D7.js +499 -0
- package/dist/chunk-YWVI6ZMK.js +103 -0
- package/dist/chunk-Z4FMAFNH.js +847 -0
- package/dist/chunk-Z654FWNU.js +136 -0
- package/dist/chunk-Z7Y523PS.js +130 -0
- package/dist/chunk-ZD67RM6G.js +60 -0
- package/dist/chunk-ZEG4VPBL.js +187 -0
- package/dist/chunk-ZHDFQITM.js +283 -0
- package/dist/chunk-ZHDFQITM.js.map +1 -0
- package/dist/chunk-ZLYCOBHW.js +75 -0
- package/dist/chunk-ZNJ5MTXV.js +89 -0
- package/dist/chunk-ZSGY3H53.js +155 -0
- package/dist/chunk-ZTPXACWB.js +1788 -0
- package/dist/chunk-ZUA3JMI6.js +107 -0
- package/dist/chunk-ZYAZUPPV.js +559 -0
- package/dist/composer.js +8 -8
- package/dist/computer-viewer-TDDO25AV.js +21 -0
- package/dist/connect.js +12 -12
- package/dist/desktop-dictation.js +12 -10
- package/dist/desktop-dictation.js.map +1 -1
- package/dist/desktop.js +2 -2
- package/dist/editor.js +2 -2
- package/dist/embedded-new-voice-2G3VLPVQ.js +24 -0
- package/dist/embedded-voice-T5IWOWGD.js +24 -0
- package/dist/fleet-decision-row-WM64KXP3.js +361 -0
- package/dist/in-chat-connect-model.js +5 -5
- package/dist/index.js +51 -51
- package/dist/interaction.js +5 -5
- package/dist/machines.js +3 -3
- package/dist/meetings-recorder.js +1 -1
- package/dist/meetings.js +40 -32
- package/dist/meetings.js.map +1 -1
- package/dist/messages/en.d.ts +3 -0
- package/dist/messages.js +1 -1
- package/dist/model-policy-picker-menu-SMC6J6QN.js +22 -0
- package/dist/payment-page-card-G4U63KUV.js +223 -0
- package/dist/platform-activity-row-BUZGZAKZ.js +128 -0
- package/dist/queue-surface-implementation-4KUZ4PJV.js +908 -0
- package/dist/realtime.js +4 -4
- package/dist/recorder-host-WF2RRR56.js +69 -0
- package/dist/recorder-host-WF2RRR56.js.map +1 -0
- package/dist/recordings.js +3 -3
- package/dist/sandbox-files-ESDMOFSD.js +27 -0
- package/dist/session-app.js +211 -209
- package/dist/session-connect-cards-Q53KMMYY.js +25 -0
- package/dist/session-list-model.js +2 -2
- package/dist/session-realtime-CF3I35WJ.js +30 -0
- package/dist/session-realtime.js +2 -2
- package/dist/session-ui.js +33 -31
- package/dist/session.js +5 -5
- package/dist/sites.js +2 -2
- package/dist/terminal.js +2 -2
- package/dist/this-computer.js +3 -3
- package/dist/timeline-annotation-markers-CJK4RYZ4.js +157 -0
- package/dist/timeline-annotation-selection-67GF5H26.js +208 -0
- package/dist/timeline-annotations-dialog-ONJPQDJQ.js +283 -0
- package/dist/ui/access-list.js +11 -9
- package/dist/ui/access-list.js.map +1 -1
- package/dist/ui/api-error.d.ts +6 -3
- package/dist/ui/api-error.js +2 -1
- package/dist/ui/cadence-picker.js +6 -4
- package/dist/ui/choice-cards.js +5 -3
- package/dist/ui/confirm-dialog.js +2 -2
- package/dist/ui/copy-field.js +5 -3
- package/dist/ui/detail-page.js +2 -2
- package/dist/ui/detail-sheet.js +2 -2
- package/dist/ui/diff-view.js +4 -3
- package/dist/ui/disclosure.js +3 -3
- package/dist/ui/email-chips-input.js +5 -3
- package/dist/ui/error-message.js +2 -1
- package/dist/ui/error-reference.d.ts +15 -0
- package/dist/ui/error-text.d.ts +10 -0
- package/dist/ui/error-text.js +9 -0
- package/dist/ui/error-text.js.map +1 -0
- package/dist/ui/field.js +4 -2
- package/dist/ui/flush-form-page.js +8 -6
- package/dist/ui/form-dialog.js +7 -5
- package/dist/ui/list-row.js +3 -3
- package/dist/ui/load-failure.js +3 -2
- package/dist/ui/load-failure.js.map +1 -1
- package/dist/ui/notice.js +3 -1
- package/dist/ui/relative-time.js +2 -2
- package/dist/ui/revision-history.js +9 -7
- package/dist/ui/revision-history.js.map +1 -1
- package/dist/ui/role-select.js +10 -8
- package/dist/ui/segmented-control.js +4 -2
- package/dist/ui/select-menu.js +5 -3
- package/dist/ui/setting-row.js +3 -1
- package/dist/ui/switch.js +4 -2
- package/dist/ui/usage-meter.js +3 -3
- package/dist/ui/word-list-row.js +4 -2
- package/dist/usage.js +2 -2
- package/dist/workbench.js +4 -4
- package/package.json +5 -6
- package/src/app/app-state.tsx +126 -14
- package/src/app/components/artifacts/site-data.tsx +2 -2
- package/src/app/components/artifacts/site-settings.tsx +2 -2
- package/src/app/components/rail/session-list.tsx +7 -8
- package/src/app/components/rail/session-shell.tsx +3 -3
- package/src/app/components/repository-picker.tsx +8 -1
- package/src/app/components/session/model-context-inspector.tsx +2 -1
- package/src/app/components/session/session-admin-access.tsx +2 -2
- package/src/app/lib/actions/chat-operations.ts +4 -4
- package/src/app/lib/archive-session.test.tsx +265 -2
- package/src/app/lib/archive-session.tsx +175 -9
- package/src/app/lib/copy-link.ts +2 -2
- package/src/app/lib/inbox.tsx +2 -2
- package/src/app/lib/session-failure-toasts.ts +3 -2
- package/src/app/lib/toast.test.tsx +215 -0
- package/src/app/lib/toast.tsx +67 -2
- package/src/app/personal-github-reconnect.test.tsx +356 -0
- package/src/app/routes/artifacts.tsx +1 -2
- package/src/components/tool-action-review.tsx +14 -1
- package/src/meetings/delete-meeting-dialog.tsx +2 -1
- package/src/meetings/meeting-ask.tsx +2 -1
- package/src/meetings/meeting-detail-page.tsx +2 -1
- package/src/meetings/meeting-notes.tsx +2 -1
- package/src/meetings/meeting-settings.tsx +4 -1
- package/src/meetings/meeting-transcript.tsx +4 -1
- package/src/meetings/recorder-context.tsx +10 -0
- package/src/meetings/recorder-host.test.tsx +60 -2
- package/src/meetings/recorder-host.tsx +16 -3
- package/src/meetings/recorder-panel.tsx +2 -1
- package/src/meetings/recorder-workspace.test.tsx +26 -1
- package/src/messages/en.ts +6 -0
- package/src/ui/api-error.test.ts +29 -5
- package/src/ui/api-error.tsx +10 -4
- package/src/ui/error-message.tsx +8 -0
- package/src/ui/error-reference.test.ts +54 -0
- package/src/ui/error-reference.ts +51 -0
- package/src/ui/error-text.test.tsx +66 -0
- package/src/ui/error-text.tsx +49 -0
- package/src/ui/field.tsx +4 -1
- package/src/ui/notice.tsx +7 -2
- package/src/ui/setting-row.tsx +4 -1
- package/styles/app.css +12 -0
- package/styles/compiled.css +9 -0
- package/dist/browser-viewer-NOP5EAUO.js +0 -23
- package/dist/chat-interactive-block-G7O44JHR.js +0 -18
- package/dist/chunk-26RWVLRD.js +0 -135
- package/dist/chunk-2AHTY7OT.js +0 -247
- package/dist/chunk-2GDNWKSC.js +0 -3670
- package/dist/chunk-2JENKGCE.js +0 -339
- package/dist/chunk-2KYQC4T5.js +0 -155
- package/dist/chunk-2RREGDQH.js +0 -708
- package/dist/chunk-2T7DX6KR.js +0 -353
- package/dist/chunk-2VB2O4FQ.js +0 -920
- package/dist/chunk-2VTTKH23.js +0 -94
- package/dist/chunk-2XNG2KNT.js +0 -172
- package/dist/chunk-2YC6JQRO.js +0 -399
- package/dist/chunk-2ZVRJRXC.js +0 -27
- package/dist/chunk-35737UT4.js +0 -162
- package/dist/chunk-366XZ4PM.js +0 -41
- package/dist/chunk-36MIDGAH.js +0 -199
- package/dist/chunk-3FD76LXM.js +0 -212
- package/dist/chunk-3OVIXY4O.js +0 -213
- package/dist/chunk-3OVIXY4O.js.map +0 -1
- package/dist/chunk-3QNRBEYH.js +0 -432
- package/dist/chunk-3QX55WLC.js +0 -15
- package/dist/chunk-3USJPT2S.js +0 -1022
- package/dist/chunk-42CMQ5VR.js +0 -251
- package/dist/chunk-4LPOWQJY.js +0 -42
- package/dist/chunk-4NBTZRKT.js +0 -79
- package/dist/chunk-4OXI6HCV.js +0 -118
- package/dist/chunk-4SZZAFYQ.js +0 -2317
- package/dist/chunk-4TQL3WP2.js +0 -140
- package/dist/chunk-4Y6BK7IU.js +0 -196
- package/dist/chunk-4YD7YZC5.js +0 -373
- package/dist/chunk-5DTST3TP.js +0 -81
- package/dist/chunk-5FH5LQVS.js +0 -130
- package/dist/chunk-5KWMYPJV.js +0 -847
- package/dist/chunk-5MUJDC6C.js +0 -84
- package/dist/chunk-5QM2WPKV.js +0 -41
- package/dist/chunk-5WUN7XPD.js +0 -1184
- package/dist/chunk-64PO2WXU.js +0 -1067
- package/dist/chunk-6AHATAAY.js +0 -431
- package/dist/chunk-6ED2YWBT.js +0 -56
- package/dist/chunk-6GXVYAGR.js +0 -170
- package/dist/chunk-6H4SJBPE.js +0 -85
- package/dist/chunk-6MT3HHUB.js +0 -84
- package/dist/chunk-6UHCBH4G.js +0 -198
- package/dist/chunk-6WLX3NR3.js +0 -198
- package/dist/chunk-73NXYYWE.js +0 -112
- package/dist/chunk-76ERNKIZ.js +0 -603
- package/dist/chunk-776QZ573.js +0 -57
- package/dist/chunk-7BYWOFVH.js +0 -171
- package/dist/chunk-7O5CGGIQ.js +0 -108
- package/dist/chunk-7QOHRZ67.js +0 -251
- package/dist/chunk-7WIDB4PL.js +0 -2058
- package/dist/chunk-7WKP3DYJ.js +0 -37
- package/dist/chunk-7XOVTPDI.js +0 -227
- package/dist/chunk-AB5MBIXY.js +0 -281
- package/dist/chunk-ADNMXBCX.js +0 -1193
- package/dist/chunk-AFBJTUFK.js +0 -202
- package/dist/chunk-ALVRWCXE.js +0 -61
- package/dist/chunk-AOHU6O3M.js +0 -247
- package/dist/chunk-AOHU6O3M.js.map +0 -1
- package/dist/chunk-APW4T4SW.js +0 -270
- package/dist/chunk-AXBSYWKX.js +0 -2656
- package/dist/chunk-B2I5ZW35.js +0 -422
- package/dist/chunk-B3LMRTRF.js +0 -223
- package/dist/chunk-BE2XENG2.js +0 -292
- package/dist/chunk-BE2XENG2.js.map +0 -1
- package/dist/chunk-BF4SADKX.js +0 -29
- package/dist/chunk-BKP43KK4.js +0 -1788
- package/dist/chunk-BM3NEZ6X.js +0 -781
- package/dist/chunk-BT3BAGB5.js +0 -216
- package/dist/chunk-BTSYDIVJ.js +0 -357
- package/dist/chunk-BUBNGKWG.js +0 -70
- package/dist/chunk-BVUJV5WR.js +0 -126
- package/dist/chunk-BZO5ZMUP.js +0 -27
- package/dist/chunk-C3HUF3M2.js +0 -157
- package/dist/chunk-C5QCAOES.js +0 -264
- package/dist/chunk-CGK6ALQU.js +0 -159
- package/dist/chunk-CPYGO76Q.js +0 -335
- package/dist/chunk-CQH4FWYA.js +0 -490
- package/dist/chunk-CZP5QXNB.js +0 -234
- package/dist/chunk-D2TOWEYH.js +0 -266
- package/dist/chunk-D6L4GHRH.js +0 -340
- package/dist/chunk-DKT3N37I.js +0 -50
- package/dist/chunk-DMMJIFKA.js +0 -84
- package/dist/chunk-DO74DQC7.js +0 -26
- package/dist/chunk-DOFJZ2JU.js +0 -83
- package/dist/chunk-DSXVY5WZ.js +0 -119
- package/dist/chunk-E337C2VK.js +0 -82
- package/dist/chunk-E6NRSRBE.js +0 -114
- package/dist/chunk-E6SQKHAU.js +0 -114
- package/dist/chunk-E7UIVD7F.js +0 -236
- package/dist/chunk-EGBII4CP.js +0 -229
- package/dist/chunk-EILSAQVJ.js +0 -200
- package/dist/chunk-ELL6HSYR.js +0 -307
- package/dist/chunk-EUBGLFFR.js +0 -73
- package/dist/chunk-EW6RNWSH.js +0 -212
- package/dist/chunk-EYUT5Y6V.js +0 -2599
- package/dist/chunk-F7U3QPZ3.js +0 -304
- package/dist/chunk-FBTJKSTM.js +0 -1270
- package/dist/chunk-FC2FTSK3.js +0 -2424
- package/dist/chunk-FOGNA3BU.js +0 -148
- package/dist/chunk-FQFKHNC7.js +0 -650
- package/dist/chunk-FTCHM755.js +0 -50
- package/dist/chunk-FXSHP4JZ.js +0 -3550
- package/dist/chunk-G6ZZC543.js +0 -818
- package/dist/chunk-G7FU6PUA.js +0 -100
- package/dist/chunk-GA4YEAMX.js +0 -3851
- package/dist/chunk-GE33BGB7.js +0 -12
- package/dist/chunk-GQ67HSJY.js +0 -570
- package/dist/chunk-GXXZ3WAK.js +0 -106
- package/dist/chunk-H2TCRX3H.js +0 -237
- package/dist/chunk-HLL4PBO7.js +0 -60
- package/dist/chunk-HLOEPV5C.js +0 -259
- package/dist/chunk-HUAGBS4O.js +0 -56
- package/dist/chunk-I36GSRUJ.js +0 -211
- package/dist/chunk-I6VBHT7S.js +0 -261
- package/dist/chunk-ICNNNOXE.js +0 -333
- package/dist/chunk-ICX64J4U.js +0 -172
- package/dist/chunk-ID36Y46W.js +0 -5046
- package/dist/chunk-ID36Y46W.js.map +0 -1
- package/dist/chunk-IGVVXLKJ.js +0 -559
- package/dist/chunk-IKJLSBUI.js +0 -2984
- package/dist/chunk-IKMUFDVS.js +0 -50
- package/dist/chunk-IKUNOX7F.js +0 -255
- package/dist/chunk-ILKDYBON.js +0 -288
- package/dist/chunk-IVYJX3OY.js +0 -187
- package/dist/chunk-JCY4CMDH.js +0 -107
- package/dist/chunk-JJZPLGIP.js +0 -474
- package/dist/chunk-JW33RV4V.js +0 -143
- package/dist/chunk-JWPA6ZPZ.js +0 -351
- package/dist/chunk-JZ4QXS6D.js +0 -50
- package/dist/chunk-K42OUZQ3.js +0 -386
- package/dist/chunk-K5TOVX5A.js +0 -206
- package/dist/chunk-K63HGHZX.js +0 -99
- package/dist/chunk-K6R5T44I.js +0 -75
- package/dist/chunk-KHJ5PXFM.js +0 -914
- package/dist/chunk-KJZRQ55O.js +0 -2319
- package/dist/chunk-KJZRQ55O.js.map +0 -1
- package/dist/chunk-KKI55ZMW.js +0 -65
- package/dist/chunk-KRPLAAFP.js +0 -199
- package/dist/chunk-KVFEZDBO.js +0 -134
- package/dist/chunk-L4I665WK.js +0 -45
- package/dist/chunk-L4OF77LE.js +0 -110
- package/dist/chunk-L4OF77LE.js.map +0 -1
- package/dist/chunk-LA5T52RM.js +0 -70
- package/dist/chunk-LM2W5YAT.js +0 -401
- package/dist/chunk-LQ62ECE6.js +0 -390
- package/dist/chunk-LQDUHU3Y.js +0 -71
- package/dist/chunk-LRJIYTZW.js +0 -4157
- package/dist/chunk-LRJIYTZW.js.map +0 -1
- package/dist/chunk-LRN6GYAZ.js +0 -138
- package/dist/chunk-M4SDVTKJ.js +0 -790
- package/dist/chunk-MA6O7CM6.js +0 -99
- package/dist/chunk-MBIBB6GI.js +0 -197
- package/dist/chunk-MF3ZFB4H.js +0 -199
- package/dist/chunk-MJJGJMYJ.js +0 -98
- package/dist/chunk-MLJADQFI.js +0 -4824
- package/dist/chunk-MQG7RV3B.js +0 -62
- package/dist/chunk-MTTGSQA5.js +0 -186
- package/dist/chunk-MW7Y3T55.js +0 -525
- package/dist/chunk-MYUFMVCH.js +0 -121
- package/dist/chunk-N3OARGH2.js +0 -61
- package/dist/chunk-NB2HMRT2.js +0 -353
- package/dist/chunk-NFDFYWMV.js +0 -141
- package/dist/chunk-NWGNFN3N.js +0 -1187
- package/dist/chunk-NWJRPDIO.js +0 -840
- package/dist/chunk-NWJRPDIO.js.map +0 -1
- package/dist/chunk-NXWBBZJV.js +0 -267
- package/dist/chunk-NY2QWROL.js +0 -71
- package/dist/chunk-O2IOPP3R.js +0 -848
- package/dist/chunk-O2UWH5RG.js +0 -141
- package/dist/chunk-O5YWDLYF.js +0 -393
- package/dist/chunk-OBMCZO7E.js +0 -121
- package/dist/chunk-OD3DCCCB.js +0 -132
- package/dist/chunk-OMH7R6I3.js +0 -390
- package/dist/chunk-OSA5EQG5.js +0 -113
- package/dist/chunk-OSJ3MUTZ.js +0 -2936
- package/dist/chunk-OWAYJ2OV.js +0 -368
- package/dist/chunk-OYXBFSGK.js +0 -269
- package/dist/chunk-PC2EBA5G.js +0 -4116
- package/dist/chunk-PC2EBA5G.js.map +0 -1
- package/dist/chunk-PC2MVXIP.js +0 -363
- package/dist/chunk-PC2MVXIP.js.map +0 -1
- package/dist/chunk-PENGLDR5.js +0 -309
- package/dist/chunk-PSMAWRPL.js +0 -191
- package/dist/chunk-PW4IMTYR.js +0 -702
- package/dist/chunk-PW54V7T5.js +0 -387
- package/dist/chunk-Q2EXYSMO.js +0 -24
- package/dist/chunk-Q2XJK5I4.js +0 -51
- package/dist/chunk-Q2XJK5I4.js.map +0 -1
- package/dist/chunk-Q4EFRI6X.js +0 -258
- package/dist/chunk-Q52CXW6C.js +0 -48
- package/dist/chunk-Q6XQ2R37.js +0 -184
- package/dist/chunk-QAJ53XBW.js +0 -23
- package/dist/chunk-QDTKECT4.js +0 -129
- package/dist/chunk-QE3ZFGI3.js +0 -43
- package/dist/chunk-QHHSUR2Y.js +0 -298
- package/dist/chunk-QHNVNR7B.js +0 -173
- package/dist/chunk-QIK2Q6N5.js +0 -376
- package/dist/chunk-QWL4L366.js +0 -38
- package/dist/chunk-R3J2PTVQ.js +0 -690
- package/dist/chunk-RBRX5ZS3.js +0 -319
- package/dist/chunk-REX6JIC7.js +0 -33
- package/dist/chunk-RGZ7EEC3.js +0 -537
- package/dist/chunk-RGZ7EEC3.js.map +0 -1
- package/dist/chunk-RIPS7GFR.js +0 -960
- package/dist/chunk-RTBZNFNV.js +0 -1354
- package/dist/chunk-RTBZNFNV.js.map +0 -1
- package/dist/chunk-SKMNW4SW.js +0 -187
- package/dist/chunk-SRFARKXC.js +0 -623
- package/dist/chunk-SWIHWCTW.js +0 -4461
- package/dist/chunk-TA5CFTO4.js +0 -103
- package/dist/chunk-TF4ZVJLI.js +0 -156
- package/dist/chunk-TG7DADJR.js +0 -9624
- package/dist/chunk-TI4R2ZD5.js +0 -623
- package/dist/chunk-TI4R2ZD5.js.map +0 -1
- package/dist/chunk-TNKWOUWP.js +0 -412
- package/dist/chunk-TNUSPXPW.js +0 -5555
- package/dist/chunk-TNUSPXPW.js.map +0 -1
- package/dist/chunk-TNYFHKVV.js +0 -366
- package/dist/chunk-TPMZBOFH.js +0 -178
- package/dist/chunk-TW3LKRJF.js +0 -263
- package/dist/chunk-TZAO65I4.js +0 -83
- package/dist/chunk-U5EFEMYU.js +0 -89
- package/dist/chunk-U6M4LS3M.js +0 -378
- package/dist/chunk-UI4HI5QK.js +0 -918
- package/dist/chunk-UJDOWCQ3.js +0 -272
- package/dist/chunk-UJUQ2QOX.js +0 -581
- package/dist/chunk-UQ3IM6FY.js +0 -133
- package/dist/chunk-UYE47LO6.js +0 -246
- package/dist/chunk-VADHIT26.js +0 -89
- package/dist/chunk-VFQ3H6CO.js +0 -163
- package/dist/chunk-VGUN6VB2.js +0 -188
- package/dist/chunk-VGWWEVSD.js +0 -723
- package/dist/chunk-VIEFJ2DM.js +0 -2469
- package/dist/chunk-VLXM36VS.js +0 -268
- package/dist/chunk-W3BFRR2G.js +0 -499
- package/dist/chunk-W5MPXR3A.js +0 -981
- package/dist/chunk-W5OWKVZG.js +0 -136
- package/dist/chunk-W6FRORMX.js +0 -486
- package/dist/chunk-W6FRORMX.js.map +0 -1
- package/dist/chunk-W7XROSZO.js +0 -232
- package/dist/chunk-W7XROSZO.js.map +0 -1
- package/dist/chunk-WEZ5PXZP.js +0 -403
- package/dist/chunk-WHWUWN2X.js +0 -197
- package/dist/chunk-WHWUWN2X.js.map +0 -1
- package/dist/chunk-WLEDGIVS.js +0 -114
- package/dist/chunk-WLEDGIVS.js.map +0 -1
- package/dist/chunk-WNDAKLHG.js +0 -281
- package/dist/chunk-WTJ4PLMU.js +0 -103
- package/dist/chunk-WV2KPJUW.js +0 -107
- package/dist/chunk-X3VY5EGY.js +0 -277
- package/dist/chunk-X3VY5EGY.js.map +0 -1
- package/dist/chunk-XDBYWVCW.js +0 -418
- package/dist/chunk-XF7MA4U5.js +0 -36
- package/dist/chunk-XF7MA4U5.js.map +0 -1
- package/dist/chunk-XOSQP3YA.js +0 -605
- package/dist/chunk-XYBV4ZJQ.js +0 -271
- package/dist/chunk-YBKVGLQR.js +0 -147
- package/dist/chunk-YDCUBUWH.js +0 -1583
- package/dist/chunk-YG6NARQY.js +0 -51
- package/dist/chunk-YG6NARQY.js.map +0 -1
- package/dist/chunk-YSVD5HI4.js +0 -278
- package/dist/chunk-YT3WGNG6.js +0 -290
- package/dist/chunk-YYICQDK4.js +0 -414
- package/dist/chunk-YYLMZLI6.js +0 -686
- package/dist/chunk-ZAMTKG5U.js +0 -95
- package/dist/chunk-ZDLYSXKN.js +0 -111
- package/dist/chunk-ZG447FSS.js +0 -194
- package/dist/chunk-ZIT5KD4Q.js +0 -264
- package/dist/chunk-ZUDOVDKR.js +0 -3064
- package/dist/chunk-ZW2ECJ3A.js +0 -451
- package/dist/computer-viewer-LPZ763KF.js +0 -21
- package/dist/embedded-new-voice-YVMKSLKJ.js +0 -24
- package/dist/embedded-voice-BJPQFXSU.js +0 -24
- package/dist/fleet-decision-row-AA4H5CDT.js +0 -361
- package/dist/model-policy-picker-menu-HSMWVO4P.js +0 -22
- package/dist/payment-page-card-3LTSFJGN.js +0 -223
- package/dist/platform-activity-row-5VYV6TX4.js +0 -128
- package/dist/queue-surface-implementation-NXHZUKD2.js +0 -908
- package/dist/recorder-host-ZKRWTDBM.js +0 -57
- package/dist/recorder-host-ZKRWTDBM.js.map +0 -1
- package/dist/sandbox-files-YCMLQUFU.js +0 -27
- package/dist/session-connect-cards-KSQLMRM5.js +0 -25
- package/dist/session-realtime-ZR6JLG3Y.js +0 -30
- package/dist/timeline-annotation-markers-YAHDPWVG.js +0 -157
- package/dist/timeline-annotation-selection-KHXNCEJP.js +0 -208
- package/dist/timeline-annotations-dialog-Y4XD3N7B.js +0 -283
- /package/dist/{browser-viewer-NOP5EAUO.js.map → browser-viewer-TC27OCIP.js.map} +0 -0
- /package/dist/{chat-interactive-block-G7O44JHR.js.map → chat-interactive-block-RWPQBHVS.js.map} +0 -0
- /package/dist/{chunk-EGBII4CP.js.map → chunk-2BDT3UZQ.js.map} +0 -0
- /package/dist/{chunk-4YD7YZC5.js.map → chunk-2CLNIEK4.js.map} +0 -0
- /package/dist/{chunk-ZW2ECJ3A.js.map → chunk-2FSBSCZJ.js.map} +0 -0
- /package/dist/{chunk-KRPLAAFP.js.map → chunk-2I7HDP53.js.map} +0 -0
- /package/dist/{chunk-3QX55WLC.js.map → chunk-2INLDVK3.js.map} +0 -0
- /package/dist/{chunk-BVUJV5WR.js.map → chunk-2KALVELR.js.map} +0 -0
- /package/dist/{chunk-XDBYWVCW.js.map → chunk-2M3J7ZWQ.js.map} +0 -0
- /package/dist/{chunk-2RREGDQH.js.map → chunk-2OP6WLGV.js.map} +0 -0
- /package/dist/{chunk-OSJ3MUTZ.js.map → chunk-2RG7NIAS.js.map} +0 -0
- /package/dist/{chunk-26RWVLRD.js.map → chunk-2STUPWEL.js.map} +0 -0
- /package/dist/{chunk-XYBV4ZJQ.js.map → chunk-2YUOVM3G.js.map} +0 -0
- /package/dist/{chunk-2GDNWKSC.js.map → chunk-2Z3NQNTM.js.map} +0 -0
- /package/dist/{chunk-2VB2O4FQ.js.map → chunk-3CPWWGNK.js.map} +0 -0
- /package/dist/{chunk-7WKP3DYJ.js.map → chunk-3ED2U6XE.js.map} +0 -0
- /package/dist/{chunk-BT3BAGB5.js.map → chunk-3GZA4BUW.js.map} +0 -0
- /package/dist/{chunk-3USJPT2S.js.map → chunk-3IK6UYO6.js.map} +0 -0
- /package/dist/{chunk-6AHATAAY.js.map → chunk-3PZ7JZI2.js.map} +0 -0
- /package/dist/{chunk-JZ4QXS6D.js.map → chunk-4DVJ6ONS.js.map} +0 -0
- /package/dist/{chunk-5QM2WPKV.js.map → chunk-4E3ZJRTZ.js.map} +0 -0
- /package/dist/{chunk-NFDFYWMV.js.map → chunk-4SAWSRAA.js.map} +0 -0
- /package/dist/{chunk-ELL6HSYR.js.map → chunk-53AGXXZM.js.map} +0 -0
- /package/dist/{chunk-G6ZZC543.js.map → chunk-54YW6SZZ.js.map} +0 -0
- /package/dist/{chunk-4SZZAFYQ.js.map → chunk-57AZS3IE.js.map} +0 -0
- /package/dist/{chunk-JW33RV4V.js.map → chunk-5CPEEAFD.js.map} +0 -0
- /package/dist/{chunk-D6L4GHRH.js.map → chunk-5EWSRZ2Y.js.map} +0 -0
- /package/dist/{chunk-PW54V7T5.js.map → chunk-5IE76VCY.js.map} +0 -0
- /package/dist/{chunk-6GXVYAGR.js.map → chunk-5NWEKLDZ.js.map} +0 -0
- /package/dist/{chunk-6UHCBH4G.js.map → chunk-5O2FCCHZ.js.map} +0 -0
- /package/dist/{chunk-2YC6JQRO.js.map → chunk-5QAY6K77.js.map} +0 -0
- /package/dist/{chunk-EYUT5Y6V.js.map → chunk-6DK6Z4UN.js.map} +0 -0
- /package/dist/{chunk-PW4IMTYR.js.map → chunk-6DVCC7QS.js.map} +0 -0
- /package/dist/{chunk-7WIDB4PL.js.map → chunk-6JHU2UBS.js.map} +0 -0
- /package/dist/{chunk-CQH4FWYA.js.map → chunk-6PZ7OBYU.js.map} +0 -0
- /package/dist/{chunk-VFQ3H6CO.js.map → chunk-6WGRDRMA.js.map} +0 -0
- /package/dist/{chunk-MTTGSQA5.js.map → chunk-77WAKEAH.js.map} +0 -0
- /package/dist/{chunk-O5YWDLYF.js.map → chunk-7TDO3CUM.js.map} +0 -0
- /package/dist/{chunk-2AHTY7OT.js.map → chunk-7TIX2UAR.js.map} +0 -0
- /package/dist/{chunk-FOGNA3BU.js.map → chunk-7V5REBCP.js.map} +0 -0
- /package/dist/{chunk-2JENKGCE.js.map → chunk-7VMZGLYI.js.map} +0 -0
- /package/dist/{chunk-E7UIVD7F.js.map → chunk-7W37NS3I.js.map} +0 -0
- /package/dist/{chunk-ZDLYSXKN.js.map → chunk-7X6SDK2C.js.map} +0 -0
- /package/dist/{chunk-ZAMTKG5U.js.map → chunk-7ZNUHRP5.js.map} +0 -0
- /package/dist/{chunk-DMMJIFKA.js.map → chunk-A36PZALD.js.map} +0 -0
- /package/dist/{chunk-WV2KPJUW.js.map → chunk-AUI6VA63.js.map} +0 -0
- /package/dist/{chunk-Q2EXYSMO.js.map → chunk-AW2MQB37.js.map} +0 -0
- /package/dist/{chunk-6WLX3NR3.js.map → chunk-AWKES45Y.js.map} +0 -0
- /package/dist/{chunk-OD3DCCCB.js.map → chunk-AXHZYXUV.js.map} +0 -0
- /package/dist/{chunk-QDTKECT4.js.map → chunk-BHNSJVBC.js.map} +0 -0
- /package/dist/{chunk-FTCHM755.js.map → chunk-BJEJFISW.js.map} +0 -0
- /package/dist/{chunk-B2I5ZW35.js.map → chunk-BJFH6JI5.js.map} +0 -0
- /package/dist/{chunk-RIPS7GFR.js.map → chunk-BMICEQZQ.js.map} +0 -0
- /package/dist/{chunk-BF4SADKX.js.map → chunk-BTLBYBLU.js.map} +0 -0
- /package/dist/{chunk-U5EFEMYU.js.map → chunk-BXBDYNRP.js.map} +0 -0
- /package/dist/{chunk-BTSYDIVJ.js.map → chunk-C372BFOV.js.map} +0 -0
- /package/dist/{chunk-MLJADQFI.js.map → chunk-CMKGILJK.js.map} +0 -0
- /package/dist/{chunk-DKT3N37I.js.map → chunk-CRAOSVHC.js.map} +0 -0
- /package/dist/{chunk-WNDAKLHG.js.map → chunk-CRU35QQH.js.map} +0 -0
- /package/dist/{chunk-2XNG2KNT.js.map → chunk-CUIWCGMA.js.map} +0 -0
- /package/dist/{chunk-QWL4L366.js.map → chunk-D5TWNFFE.js.map} +0 -0
- /package/dist/{chunk-SWIHWCTW.js.map → chunk-DF5EAHDN.js.map} +0 -0
- /package/dist/{chunk-HUAGBS4O.js.map → chunk-DJAXC5OK.js.map} +0 -0
- /package/dist/{chunk-FXSHP4JZ.js.map → chunk-DXBYWSL5.js.map} +0 -0
- /package/dist/{chunk-5MUJDC6C.js.map → chunk-DXR5PDFP.js.map} +0 -0
- /package/dist/{chunk-NXWBBZJV.js.map → chunk-DZWARC4M.js.map} +0 -0
- /package/dist/{chunk-GXXZ3WAK.js.map → chunk-DZXEDSQI.js.map} +0 -0
- /package/dist/{chunk-Q52CXW6C.js.map → chunk-E7XERZWC.js.map} +0 -0
- /package/dist/{chunk-4NBTZRKT.js.map → chunk-ECJBYNLJ.js.map} +0 -0
- /package/dist/{chunk-QE3ZFGI3.js.map → chunk-EDI6SJ2N.js.map} +0 -0
- /package/dist/{chunk-E6NRSRBE.js.map → chunk-EWSOC6WF.js.map} +0 -0
- /package/dist/{chunk-TA5CFTO4.js.map → chunk-F2OPHAUN.js.map} +0 -0
- /package/dist/{chunk-5DTST3TP.js.map → chunk-F4ISQGGM.js.map} +0 -0
- /package/dist/{chunk-MBIBB6GI.js.map → chunk-FO4LYKJL.js.map} +0 -0
- /package/dist/{chunk-EUBGLFFR.js.map → chunk-FPXASDG5.js.map} +0 -0
- /package/dist/{chunk-C3HUF3M2.js.map → chunk-FVXBNBHO.js.map} +0 -0
- /package/dist/{chunk-W5MPXR3A.js.map → chunk-FZC5N55X.js.map} +0 -0
- /package/dist/{chunk-MA6O7CM6.js.map → chunk-GAVYGBFI.js.map} +0 -0
- /package/dist/{chunk-REX6JIC7.js.map → chunk-GKVJIDHF.js.map} +0 -0
- /package/dist/{chunk-EW6RNWSH.js.map → chunk-GVN5SZLX.js.map} +0 -0
- /package/dist/{chunk-KVFEZDBO.js.map → chunk-H3T7IWNA.js.map} +0 -0
- /package/dist/{chunk-I6VBHT7S.js.map → chunk-HAX4LCR5.js.map} +0 -0
- /package/dist/{chunk-OBMCZO7E.js.map → chunk-HC4JFZVU.js.map} +0 -0
- /package/dist/{chunk-UJUQ2QOX.js.map → chunk-HEFPPMBQ.js.map} +0 -0
- /package/dist/{chunk-DOFJZ2JU.js.map → chunk-HNLR7Q4Z.js.map} +0 -0
- /package/dist/{chunk-GE33BGB7.js.map → chunk-HSOXMJOT.js.map} +0 -0
- /package/dist/{chunk-AB5MBIXY.js.map → chunk-I4MRDSUF.js.map} +0 -0
- /package/dist/{chunk-AFBJTUFK.js.map → chunk-I4QEJ62Y.js.map} +0 -0
- /package/dist/{chunk-6ED2YWBT.js.map → chunk-I5B5L6Q4.js.map} +0 -0
- /package/dist/{chunk-C5QCAOES.js.map → chunk-I5QZJODL.js.map} +0 -0
- /package/dist/{chunk-76ERNKIZ.js.map → chunk-I7ITSXSJ.js.map} +0 -0
- /package/dist/{chunk-OMH7R6I3.js.map → chunk-I7XIZRFD.js.map} +0 -0
- /package/dist/{chunk-E337C2VK.js.map → chunk-IDANQPRH.js.map} +0 -0
- /package/dist/{chunk-3FD76LXM.js.map → chunk-IFB3WJ36.js.map} +0 -0
- /package/dist/{chunk-ZIT5KD4Q.js.map → chunk-IHTAKKTK.js.map} +0 -0
- /package/dist/{chunk-QHNVNR7B.js.map → chunk-ILDXWY37.js.map} +0 -0
- /package/dist/{chunk-GQ67HSJY.js.map → chunk-IMDQUHBJ.js.map} +0 -0
- /package/dist/{chunk-DSXVY5WZ.js.map → chunk-IMZCQBOT.js.map} +0 -0
- /package/dist/{chunk-WEZ5PXZP.js.map → chunk-IXPTECSC.js.map} +0 -0
- /package/dist/{chunk-NY2QWROL.js.map → chunk-J255A3N5.js.map} +0 -0
- /package/dist/{chunk-O2UWH5RG.js.map → chunk-J5F5HPPW.js.map} +0 -0
- /package/dist/{chunk-VIEFJ2DM.js.map → chunk-JEA3QDX7.js.map} +0 -0
- /package/dist/{chunk-TF4ZVJLI.js.map → chunk-JEUPAVYY.js.map} +0 -0
- /package/dist/{chunk-ZG447FSS.js.map → chunk-JKHKLL5W.js.map} +0 -0
- /package/dist/{chunk-FQFKHNC7.js.map → chunk-JQL7ZH6C.js.map} +0 -0
- /package/dist/{chunk-776QZ573.js.map → chunk-JWB44UGJ.js.map} +0 -0
- /package/dist/{chunk-ICNNNOXE.js.map → chunk-JZ4NLCAP.js.map} +0 -0
- /package/dist/{chunk-TNKWOUWP.js.map → chunk-K2A5PXQ5.js.map} +0 -0
- /package/dist/{chunk-SRFARKXC.js.map → chunk-K56XV3C3.js.map} +0 -0
- /package/dist/{chunk-QAJ53XBW.js.map → chunk-K6GAXXVA.js.map} +0 -0
- /package/dist/{chunk-MF3ZFB4H.js.map → chunk-KCBMFSMS.js.map} +0 -0
- /package/dist/{chunk-VLXM36VS.js.map → chunk-KF2FV3ZJ.js.map} +0 -0
- /package/dist/{chunk-YSVD5HI4.js.map → chunk-KJD65EJP.js.map} +0 -0
- /package/dist/{chunk-K42OUZQ3.js.map → chunk-KLEUWIMZ.js.map} +0 -0
- /package/dist/{chunk-PENGLDR5.js.map → chunk-KODELWYT.js.map} +0 -0
- /package/dist/{chunk-TZAO65I4.js.map → chunk-KRDR5RJD.js.map} +0 -0
- /package/dist/{chunk-KHJ5PXFM.js.map → chunk-KUDGXAF7.js.map} +0 -0
- /package/dist/{chunk-6H4SJBPE.js.map → chunk-KYS77RPN.js.map} +0 -0
- /package/dist/{chunk-OWAYJ2OV.js.map → chunk-L7YTNTIK.js.map} +0 -0
- /package/dist/{chunk-YYLMZLI6.js.map → chunk-LHPNABDH.js.map} +0 -0
- /package/dist/{chunk-LM2W5YAT.js.map → chunk-MFROMEKA.js.map} +0 -0
- /package/dist/{chunk-AXBSYWKX.js.map → chunk-MIHN76LX.js.map} +0 -0
- /package/dist/{chunk-4LPOWQJY.js.map → chunk-MIYFS2XN.js.map} +0 -0
- /package/dist/{chunk-KKI55ZMW.js.map → chunk-MJUCFQMS.js.map} +0 -0
- /package/dist/{chunk-ZUDOVDKR.js.map → chunk-MM4FNWI4.js.map} +0 -0
- /package/dist/{chunk-M4SDVTKJ.js.map → chunk-MNZG4OHU.js.map} +0 -0
- /package/dist/{chunk-EILSAQVJ.js.map → chunk-N6AACDUW.js.map} +0 -0
- /package/dist/{chunk-BM3NEZ6X.js.map → chunk-NC55IFN3.js.map} +0 -0
- /package/dist/{chunk-MJJGJMYJ.js.map → chunk-NC7PVOEK.js.map} +0 -0
- /package/dist/{chunk-LA5T52RM.js.map → chunk-NCYMNCJO.js.map} +0 -0
- /package/dist/{chunk-HLOEPV5C.js.map → chunk-ND2BXV3P.js.map} +0 -0
- /package/dist/{chunk-UJDOWCQ3.js.map → chunk-NDBTFUO6.js.map} +0 -0
- /package/dist/{chunk-K5TOVX5A.js.map → chunk-NDQJZ7HF.js.map} +0 -0
- /package/dist/{chunk-35737UT4.js.map → chunk-NGJJJPZZ.js.map} +0 -0
- /package/dist/{chunk-42CMQ5VR.js.map → chunk-NJTSNNE7.js.map} +0 -0
- /package/dist/{chunk-FBTJKSTM.js.map → chunk-NRTE7DNV.js.map} +0 -0
- /package/dist/{chunk-YT3WGNG6.js.map → chunk-NULUNM7H.js.map} +0 -0
- /package/dist/{chunk-7XOVTPDI.js.map → chunk-NUNZS36W.js.map} +0 -0
- /package/dist/{chunk-FC2FTSK3.js.map → chunk-NW53H5RW.js.map} +0 -0
- /package/dist/{chunk-TW3LKRJF.js.map → chunk-NXCMHIKI.js.map} +0 -0
- /package/dist/{chunk-CGK6ALQU.js.map → chunk-O3LKCBP5.js.map} +0 -0
- /package/dist/{chunk-QIK2Q6N5.js.map → chunk-O6N4ABCA.js.map} +0 -0
- /package/dist/{chunk-73NXYYWE.js.map → chunk-O732GAFC.js.map} +0 -0
- /package/dist/{chunk-R3J2PTVQ.js.map → chunk-OF4TIKYC.js.map} +0 -0
- /package/dist/{chunk-BUBNGKWG.js.map → chunk-OMPVOMPP.js.map} +0 -0
- /package/dist/{chunk-4OXI6HCV.js.map → chunk-OPJJSKUK.js.map} +0 -0
- /package/dist/{chunk-4Y6BK7IU.js.map → chunk-OPWCMA4D.js.map} +0 -0
- /package/dist/{chunk-ADNMXBCX.js.map → chunk-ORJPS5VN.js.map} +0 -0
- /package/dist/{chunk-SKMNW4SW.js.map → chunk-OSY5K7L7.js.map} +0 -0
- /package/dist/{chunk-L4I665WK.js.map → chunk-OV6QJRT4.js.map} +0 -0
- /package/dist/{chunk-7O5CGGIQ.js.map → chunk-OVKYVZMW.js.map} +0 -0
- /package/dist/{chunk-7BYWOFVH.js.map → chunk-OZCBM3UC.js.map} +0 -0
- /package/dist/{chunk-ALVRWCXE.js.map → chunk-P3A2EINJ.js.map} +0 -0
- /package/dist/{chunk-BZO5ZMUP.js.map → chunk-PTAG4PDC.js.map} +0 -0
- /package/dist/{chunk-QHHSUR2Y.js.map → chunk-PTF5B7TJ.js.map} +0 -0
- /package/dist/{chunk-O2IOPP3R.js.map → chunk-Q3DPEYX4.js.map} +0 -0
- /package/dist/{chunk-G7FU6PUA.js.map → chunk-QB2KMIDP.js.map} +0 -0
- /package/dist/{chunk-64PO2WXU.js.map → chunk-QCSJ4CWE.js.map} +0 -0
- /package/dist/{chunk-YYICQDK4.js.map → chunk-QIOQ2NPQ.js.map} +0 -0
- /package/dist/{chunk-NB2HMRT2.js.map → chunk-QK5EFEUT.js.map} +0 -0
- /package/dist/{chunk-366XZ4PM.js.map → chunk-QPQBLYQJ.js.map} +0 -0
- /package/dist/{chunk-Q6XQ2R37.js.map → chunk-QPSGCC5D.js.map} +0 -0
- /package/dist/{chunk-JJZPLGIP.js.map → chunk-QZAAUQRN.js.map} +0 -0
- /package/dist/{chunk-VGUN6VB2.js.map → chunk-RGBI63KJ.js.map} +0 -0
- /package/dist/{chunk-LRN6GYAZ.js.map → chunk-RLBKLAEY.js.map} +0 -0
- /package/dist/{chunk-F7U3QPZ3.js.map → chunk-RMFKVOM7.js.map} +0 -0
- /package/dist/{chunk-Q4EFRI6X.js.map → chunk-ROKQU7WG.js.map} +0 -0
- /package/dist/{chunk-7QOHRZ67.js.map → chunk-RPVREAU7.js.map} +0 -0
- /package/dist/{chunk-VGWWEVSD.js.map → chunk-RQKLF42C.js.map} +0 -0
- /package/dist/{chunk-2VTTKH23.js.map → chunk-SEO7TICN.js.map} +0 -0
- /package/dist/{chunk-3QNRBEYH.js.map → chunk-SHHJCL7X.js.map} +0 -0
- /package/dist/{chunk-E6SQKHAU.js.map → chunk-SIRLACNZ.js.map} +0 -0
- /package/dist/{chunk-H2TCRX3H.js.map → chunk-SKPHMYAA.js.map} +0 -0
- /package/dist/{chunk-YDCUBUWH.js.map → chunk-SODC7T6L.js.map} +0 -0
- /package/dist/{chunk-TNYFHKVV.js.map → chunk-SQJIKMN3.js.map} +0 -0
- /package/dist/{chunk-DO74DQC7.js.map → chunk-SVINDKVW.js.map} +0 -0
- /package/dist/{chunk-CPYGO76Q.js.map → chunk-SYCDHPZF.js.map} +0 -0
- /package/dist/{chunk-UQ3IM6FY.js.map → chunk-T2QX3FDP.js.map} +0 -0
- /package/dist/{chunk-NWGNFN3N.js.map → chunk-T3OWFVMS.js.map} +0 -0
- /package/dist/{chunk-N3OARGH2.js.map → chunk-T6XI5FLY.js.map} +0 -0
- /package/dist/{chunk-MQG7RV3B.js.map → chunk-T7OXJZCX.js.map} +0 -0
- /package/dist/{chunk-2T7DX6KR.js.map → chunk-TAT5USZN.js.map} +0 -0
- /package/dist/{chunk-ICX64J4U.js.map → chunk-TPQTRNER.js.map} +0 -0
- /package/dist/{chunk-D2TOWEYH.js.map → chunk-TUIN4MB7.js.map} +0 -0
- /package/dist/{chunk-LQDUHU3Y.js.map → chunk-TX3VECZU.js.map} +0 -0
- /package/dist/{chunk-TG7DADJR.js.map → chunk-TXLIEOJX.js.map} +0 -0
- /package/dist/{chunk-2ZVRJRXC.js.map → chunk-U3DN4HEY.js.map} +0 -0
- /package/dist/{chunk-PSMAWRPL.js.map → chunk-U7XM7CB4.js.map} +0 -0
- /package/dist/{chunk-4TQL3WP2.js.map → chunk-UJK53QFL.js.map} +0 -0
- /package/dist/{chunk-RBRX5ZS3.js.map → chunk-UMTXA2TH.js.map} +0 -0
- /package/dist/{chunk-36MIDGAH.js.map → chunk-UPDSXFK5.js.map} +0 -0
- /package/dist/{chunk-OYXBFSGK.js.map → chunk-UTIAXH52.js.map} +0 -0
- /package/dist/{chunk-5WUN7XPD.js.map → chunk-UVN5TMHU.js.map} +0 -0
- /package/dist/{chunk-UYE47LO6.js.map → chunk-VGYXW3VG.js.map} +0 -0
- /package/dist/{chunk-IKUNOX7F.js.map → chunk-VS7AHPCZ.js.map} +0 -0
- /package/dist/{chunk-MYUFMVCH.js.map → chunk-VTTAJOQ7.js.map} +0 -0
- /package/dist/{chunk-K63HGHZX.js.map → chunk-VWPOLUAO.js.map} +0 -0
- /package/dist/{chunk-GA4YEAMX.js.map → chunk-X3MWB2QU.js.map} +0 -0
- /package/dist/{chunk-I36GSRUJ.js.map → chunk-X6KAJI3V.js.map} +0 -0
- /package/dist/{chunk-IKMUFDVS.js.map → chunk-XBLRHV5R.js.map} +0 -0
- /package/dist/{chunk-XOSQP3YA.js.map → chunk-XDFP2LMW.js.map} +0 -0
- /package/dist/{chunk-MW7Y3T55.js.map → chunk-XEQMZB3C.js.map} +0 -0
- /package/dist/{chunk-B3LMRTRF.js.map → chunk-XEYLT5VA.js.map} +0 -0
- /package/dist/{chunk-UI4HI5QK.js.map → chunk-XHIQ5I6N.js.map} +0 -0
- /package/dist/{chunk-U6M4LS3M.js.map → chunk-XLH7QY2R.js.map} +0 -0
- /package/dist/{chunk-OSA5EQG5.js.map → chunk-XWFAMUZQ.js.map} +0 -0
- /package/dist/{chunk-6MT3HHUB.js.map → chunk-Y4OBB2VN.js.map} +0 -0
- /package/dist/{chunk-CZP5QXNB.js.map → chunk-YCVD6CI3.js.map} +0 -0
- /package/dist/{chunk-APW4T4SW.js.map → chunk-YENLNISG.js.map} +0 -0
- /package/dist/{chunk-JWPA6ZPZ.js.map → chunk-YIRVLKAX.js.map} +0 -0
- /package/dist/{chunk-LQ62ECE6.js.map → chunk-YL73CVNK.js.map} +0 -0
- /package/dist/{chunk-ILKDYBON.js.map → chunk-YLS6QE5G.js.map} +0 -0
- /package/dist/{chunk-YBKVGLQR.js.map → chunk-YPWU5KPE.js.map} +0 -0
- /package/dist/{chunk-IKJLSBUI.js.map → chunk-YQXTDZSU.js.map} +0 -0
- /package/dist/{chunk-TPMZBOFH.js.map → chunk-YSJEAAOL.js.map} +0 -0
- /package/dist/{chunk-W3BFRR2G.js.map → chunk-YWIFM7D7.js.map} +0 -0
- /package/dist/{chunk-WTJ4PLMU.js.map → chunk-YWVI6ZMK.js.map} +0 -0
- /package/dist/{chunk-5KWMYPJV.js.map → chunk-Z4FMAFNH.js.map} +0 -0
- /package/dist/{chunk-W5OWKVZG.js.map → chunk-Z654FWNU.js.map} +0 -0
- /package/dist/{chunk-5FH5LQVS.js.map → chunk-Z7Y523PS.js.map} +0 -0
- /package/dist/{chunk-HLL4PBO7.js.map → chunk-ZD67RM6G.js.map} +0 -0
- /package/dist/{chunk-IVYJX3OY.js.map → chunk-ZEG4VPBL.js.map} +0 -0
- /package/dist/{chunk-K6R5T44I.js.map → chunk-ZLYCOBHW.js.map} +0 -0
- /package/dist/{chunk-VADHIT26.js.map → chunk-ZNJ5MTXV.js.map} +0 -0
- /package/dist/{chunk-2KYQC4T5.js.map → chunk-ZSGY3H53.js.map} +0 -0
- /package/dist/{chunk-BKP43KK4.js.map → chunk-ZTPXACWB.js.map} +0 -0
- /package/dist/{chunk-JCY4CMDH.js.map → chunk-ZUA3JMI6.js.map} +0 -0
- /package/dist/{chunk-IGVVXLKJ.js.map → chunk-ZYAZUPPV.js.map} +0 -0
- /package/dist/{computer-viewer-LPZ763KF.js.map → computer-viewer-TDDO25AV.js.map} +0 -0
- /package/dist/{embedded-new-voice-YVMKSLKJ.js.map → embedded-new-voice-2G3VLPVQ.js.map} +0 -0
- /package/dist/{embedded-voice-BJPQFXSU.js.map → embedded-voice-T5IWOWGD.js.map} +0 -0
- /package/dist/{fleet-decision-row-AA4H5CDT.js.map → fleet-decision-row-WM64KXP3.js.map} +0 -0
- /package/dist/{model-policy-picker-menu-HSMWVO4P.js.map → model-policy-picker-menu-SMC6J6QN.js.map} +0 -0
- /package/dist/{payment-page-card-3LTSFJGN.js.map → payment-page-card-G4U63KUV.js.map} +0 -0
- /package/dist/{platform-activity-row-5VYV6TX4.js.map → platform-activity-row-BUZGZAKZ.js.map} +0 -0
- /package/dist/{queue-surface-implementation-NXHZUKD2.js.map → queue-surface-implementation-4KUZ4PJV.js.map} +0 -0
- /package/dist/{sandbox-files-YCMLQUFU.js.map → sandbox-files-ESDMOFSD.js.map} +0 -0
- /package/dist/{session-connect-cards-KSQLMRM5.js.map → session-connect-cards-Q53KMMYY.js.map} +0 -0
- /package/dist/{session-realtime-ZR6JLG3Y.js.map → session-realtime-CF3I35WJ.js.map} +0 -0
- /package/dist/{timeline-annotation-markers-YAHDPWVG.js.map → timeline-annotation-markers-CJK4RYZ4.js.map} +0 -0
- /package/dist/{timeline-annotation-selection-KHXNCEJP.js.map → timeline-annotation-selection-67GF5H26.js.map} +0 -0
- /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"]}
|