@athenaintel/react 0.42.2 → 0.48.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/README.md +225 -3
- package/dist/agent-runtime/src/answer-label.cjs +137 -0
- package/dist/agent-runtime/src/answer-label.cjs.map +1 -0
- package/dist/agent-runtime/src/answer-label.d.ts +104 -0
- package/dist/agent-runtime/src/answer-label.js +137 -0
- package/dist/agent-runtime/src/answer-label.js.map +1 -0
- package/dist/agent-runtime/src/answer-rows.cjs +180 -0
- package/dist/agent-runtime/src/answer-rows.cjs.map +1 -0
- package/dist/agent-runtime/src/answer-rows.d.ts +86 -0
- package/dist/agent-runtime/src/answer-rows.js +180 -0
- package/dist/agent-runtime/src/answer-rows.js.map +1 -0
- package/dist/agent-runtime/src/client-tool-bridge.cjs +15 -15
- package/dist/agent-runtime/src/client-tool-bridge.cjs.map +1 -1
- package/dist/agent-runtime/src/conversation-index.cjs +8 -8
- package/dist/agent-runtime/src/conversation-index.cjs.map +1 -1
- package/dist/agent-runtime/src/conversation-list-groups.d.ts +74 -0
- package/dist/agent-runtime/src/decision-checks.cjs +207 -0
- package/dist/agent-runtime/src/decision-checks.cjs.map +1 -0
- package/dist/agent-runtime/src/decision-checks.d.ts +142 -0
- package/dist/agent-runtime/src/decision-checks.js +207 -0
- package/dist/agent-runtime/src/decision-checks.js.map +1 -0
- package/dist/agent-runtime/src/desktop-handoff.d.ts +12 -0
- package/dist/agent-runtime/src/errors.cjs +18 -0
- package/dist/agent-runtime/src/errors.cjs.map +1 -1
- package/dist/agent-runtime/src/errors.d.ts +7 -0
- package/dist/agent-runtime/src/errors.js +18 -0
- package/dist/agent-runtime/src/errors.js.map +1 -1
- package/dist/agent-runtime/src/generated/runconfig-contract.cjs +12 -0
- package/dist/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -1
- package/dist/agent-runtime/src/generated/runconfig-contract.d.ts +6 -6
- package/dist/agent-runtime/src/generated/runconfig-contract.js +12 -0
- package/dist/agent-runtime/src/generated/runconfig-contract.js.map +1 -1
- package/dist/agent-runtime/src/handoff-arrival.cjs +60 -0
- package/dist/agent-runtime/src/handoff-arrival.cjs.map +1 -0
- package/dist/agent-runtime/src/handoff-arrival.d.ts +46 -0
- package/dist/agent-runtime/src/handoff-arrival.js +60 -0
- package/dist/agent-runtime/src/handoff-arrival.js.map +1 -0
- package/dist/agent-runtime/src/index.d.ts +15 -8
- package/dist/agent-runtime/src/interrupts.cjs +43 -18
- package/dist/agent-runtime/src/interrupts.cjs.map +1 -1
- package/dist/agent-runtime/src/interrupts.d.ts +19 -2
- package/dist/agent-runtime/src/interrupts.js +28 -3
- package/dist/agent-runtime/src/interrupts.js.map +1 -1
- package/dist/agent-runtime/src/lane-history.cjs +8 -8
- package/dist/agent-runtime/src/lane-history.cjs.map +1 -1
- package/dist/agent-runtime/src/messages.cjs +43 -8
- package/dist/agent-runtime/src/messages.cjs.map +1 -1
- package/dist/agent-runtime/src/messages.d.ts +25 -3
- package/dist/agent-runtime/src/messages.js +43 -8
- package/dist/agent-runtime/src/messages.js.map +1 -1
- package/dist/agent-runtime/src/offline-status.cjs +36 -0
- package/dist/agent-runtime/src/offline-status.cjs.map +1 -0
- package/dist/agent-runtime/src/offline-status.d.ts +118 -3
- package/dist/agent-runtime/src/offline-status.js +36 -0
- package/dist/agent-runtime/src/offline-status.js.map +1 -0
- package/dist/agent-runtime/src/queue.cjs +0 -9
- package/dist/agent-runtime/src/queue.cjs.map +1 -1
- package/dist/agent-runtime/src/queue.js +0 -9
- package/dist/agent-runtime/src/queue.js.map +1 -1
- package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs +9 -9
- package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs.map +1 -1
- package/dist/agent-runtime/src/runtime-catalog.cjs +42 -0
- package/dist/agent-runtime/src/runtime-catalog.cjs.map +1 -0
- package/dist/agent-runtime/src/runtime-catalog.d.ts +35 -0
- package/dist/agent-runtime/src/runtime-catalog.js +42 -0
- package/dist/agent-runtime/src/runtime-catalog.js.map +1 -0
- package/dist/agent-runtime/src/runtime-messages.cjs.map +1 -1
- package/dist/agent-runtime/src/runtime-messages.d.ts +1 -1
- package/dist/agent-runtime/src/runtime-messages.js.map +1 -1
- package/dist/agent-runtime/src/runtime.d.ts +40 -0
- package/dist/agent-runtime/src/statewire-suspended.cjs +3 -3
- package/dist/agent-runtime/src/statewire-suspended.cjs.map +1 -1
- package/dist/agent-runtime/src/subagents.cjs +32 -2
- package/dist/agent-runtime/src/subagents.cjs.map +1 -1
- package/dist/agent-runtime/src/subagents.d.ts +9 -0
- package/dist/agent-runtime/src/subagents.js +30 -0
- package/dist/agent-runtime/src/subagents.js.map +1 -1
- package/dist/agent-runtime/src/thread-driver.cjs +67 -0
- package/dist/agent-runtime/src/thread-driver.cjs.map +1 -0
- package/dist/agent-runtime/src/thread-driver.d.ts +49 -0
- package/dist/agent-runtime/src/thread-driver.js +67 -0
- package/dist/agent-runtime/src/thread-driver.js.map +1 -0
- package/dist/agent-runtime/src/thread-handoff-flow-machine.d.ts +172 -0
- package/dist/agent-runtime/src/thread-handoff-protocol.d.ts +756 -0
- package/dist/agent-runtime/src/thread-handoff-qr.d.ts +11 -0
- package/dist/agent-runtime/src/thread-handoff.d.ts +3 -364
- package/dist/agent-runtime/src/thread-status.cjs +3 -3
- package/dist/agent-runtime/src/thread-status.cjs.map +1 -1
- package/dist/agent-runtime/src/tool-metadata.cjs +210 -33
- package/dist/agent-runtime/src/tool-metadata.cjs.map +1 -1
- package/dist/agent-runtime/src/tool-metadata.d.ts +12 -0
- package/dist/agent-runtime/src/tool-metadata.js +210 -33
- package/dist/agent-runtime/src/tool-metadata.js.map +1 -1
- package/dist/agent-runtime/src/tool-names.cjs +2 -0
- package/dist/agent-runtime/src/tool-names.cjs.map +1 -1
- package/dist/agent-runtime/src/tool-names.d.ts +2 -0
- package/dist/agent-runtime/src/tool-names.js +2 -0
- package/dist/agent-runtime/src/tool-names.js.map +1 -1
- package/dist/agent-runtime/src/types.d.ts +10 -2
- package/dist/agent-runtime/src/use-conversation-list.cjs +11 -11
- package/dist/agent-runtime/src/use-conversation-list.cjs.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs +24 -19
- package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-chat-outbox.d.ts +2 -1
- package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js +6 -1
- package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-config.cjs +14 -14
- package/dist/agent-runtime/src/use-deep-agent-config.cjs.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs +6 -6
- package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-runtime.cjs +16 -16
- package/dist/agent-runtime/src/use-deep-agent-runtime.cjs.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-thread.cjs +45 -45
- package/dist/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-voice.cjs +572 -134
- package/dist/agent-runtime/src/use-deep-agent-voice.cjs.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-voice.d.ts +137 -10
- package/dist/agent-runtime/src/use-deep-agent-voice.js +514 -76
- package/dist/agent-runtime/src/use-deep-agent-voice.js.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-window-sync.cjs +26 -26
- package/dist/agent-runtime/src/use-deep-agent-window-sync.cjs.map +1 -1
- package/dist/agent-runtime/src/use-historical-edit-attachments.cjs +4 -4
- package/dist/agent-runtime/src/use-historical-edit-attachments.cjs.map +1 -1
- package/dist/agent-runtime/src/use-thread-handoff-flow.d.ts +28 -26
- package/dist/agent-runtime/src/voice-media.cjs +117 -0
- package/dist/agent-runtime/src/voice-media.cjs.map +1 -0
- package/dist/agent-runtime/src/voice-media.d.ts +49 -0
- package/dist/agent-runtime/src/voice-media.js +117 -0
- package/dist/agent-runtime/src/voice-media.js.map +1 -0
- package/dist/agent-runtime/src/voice-wire-types.d.ts +32 -0
- package/dist/assets/AssetPanel.cjs +11 -11
- package/dist/assets/AssetPanel.cjs.map +1 -1
- package/dist/assets/AthenaAssetEmbed.cjs +11 -9
- package/dist/assets/AthenaAssetEmbed.cjs.map +1 -1
- package/dist/assets/AthenaAssetEmbed.d.ts +7 -0
- package/dist/assets/AthenaAssetEmbed.js +4 -2
- package/dist/assets/AthenaAssetEmbed.js.map +1 -1
- package/dist/assets/AthenaLayout.cjs +16 -16
- package/dist/assets/AthenaLayout.cjs.map +1 -1
- package/dist/assets/use-asset-content.cjs +4 -4
- package/dist/assets/use-asset-content.cjs.map +1 -1
- package/dist/assets/use-asset-embed.cjs +14 -7
- package/dist/assets/use-asset-embed.cjs.map +1 -1
- package/dist/assets/use-asset-embed.d.ts +11 -1
- package/dist/assets/use-asset-embed.js +10 -3
- package/dist/assets/use-asset-embed.js.map +1 -1
- package/dist/auth/AthenaAuthContext.cjs +3 -3
- package/dist/auth/AthenaAuthContext.cjs.map +1 -1
- package/dist/auth/AthenaAuthProvider.cjs +8 -8
- package/dist/auth/AthenaAuthProvider.cjs.map +1 -1
- package/dist/auth/AthenaCredentialSourceContext.cjs +5 -5
- package/dist/auth/AthenaCredentialSourceContext.cjs.map +1 -1
- package/dist/auth/AthenaSSOProvider.cjs +14 -14
- package/dist/auth/AthenaSSOProvider.cjs.map +1 -1
- package/dist/auth/credential-source.cjs +26 -13
- package/dist/auth/credential-source.cjs.map +1 -1
- package/dist/auth/credential-source.d.ts +8 -0
- package/dist/auth/credential-source.js +26 -13
- package/dist/auth/credential-source.js.map +1 -1
- package/dist/catalog/agent-model-options.cjs +25 -17
- package/dist/catalog/agent-model-options.cjs.map +1 -1
- package/dist/catalog/agent-model-options.d.ts +38 -5
- package/dist/catalog/agent-model-options.js +25 -17
- package/dist/catalog/agent-model-options.js.map +1 -1
- package/dist/catalog/channel-refusal.cjs +36 -0
- package/dist/catalog/channel-refusal.cjs.map +1 -0
- package/dist/catalog/channel-refusal.d.ts +29 -0
- package/dist/catalog/channel-refusal.js +36 -0
- package/dist/catalog/channel-refusal.js.map +1 -0
- package/dist/catalog/chat-pickers.cjs +60 -24
- package/dist/catalog/chat-pickers.cjs.map +1 -1
- package/dist/catalog/chat-pickers.d.ts +12 -2
- package/dist/catalog/chat-pickers.js +56 -20
- package/dist/catalog/chat-pickers.js.map +1 -1
- package/dist/catalog/runtime-catalog.cjs +89 -23
- package/dist/catalog/runtime-catalog.cjs.map +1 -1
- package/dist/catalog/runtime-catalog.d.ts +8 -2
- package/dist/catalog/runtime-catalog.js +83 -17
- package/dist/catalog/runtime-catalog.js.map +1 -1
- package/dist/catalog/use-athena-chat-mode.cjs +12 -12
- package/dist/catalog/use-athena-chat-mode.cjs.map +1 -1
- package/dist/chat/AthenaChat.cjs +155 -67
- package/dist/chat/AthenaChat.cjs.map +1 -1
- package/dist/chat/AthenaChat.d.ts +42 -2
- package/dist/chat/AthenaChat.js +106 -18
- package/dist/chat/AthenaChat.js.map +1 -1
- package/dist/chat/AthenaChatErrorBoundary.cjs +3 -3
- package/dist/chat/AthenaChatErrorBoundary.cjs.map +1 -1
- package/dist/chat/DrivingOnChip.cjs +23 -0
- package/dist/chat/DrivingOnChip.cjs.map +1 -0
- package/dist/chat/DrivingOnChip.d.ts +17 -0
- package/dist/chat/DrivingOnChip.js +23 -0
- package/dist/chat/DrivingOnChip.js.map +1 -0
- package/dist/chat/StatewireApprovalCard.cjs +125 -31
- package/dist/chat/StatewireApprovalCard.cjs.map +1 -1
- package/dist/chat/StatewireApprovalCard.d.ts +73 -1
- package/dist/chat/StatewireApprovalCard.js +115 -21
- package/dist/chat/StatewireApprovalCard.js.map +1 -1
- package/dist/chat/StatewireClientToolBridge.cjs +2 -2
- package/dist/chat/StatewireClientToolBridge.cjs.map +1 -1
- package/dist/chat/StatewireQueuedMessages.cjs +25 -63
- package/dist/chat/StatewireQueuedMessages.cjs.map +1 -1
- package/dist/chat/StatewireQueuedMessages.d.ts +11 -13
- package/dist/chat/StatewireQueuedMessages.js +16 -54
- package/dist/chat/StatewireQueuedMessages.js.map +1 -1
- package/dist/chat/WaitingOnYouBanner.cjs +3 -3
- package/dist/chat/WaitingOnYouBanner.cjs.map +1 -1
- package/dist/chat/athena-chat-welcome.cjs +2 -2
- package/dist/chat/athena-chat-welcome.cjs.map +1 -1
- package/dist/chat/athena-citation-links.cjs +5 -5
- package/dist/chat/athena-citation-links.cjs.map +1 -1
- package/dist/chat/athena-composer-controls.cjs +26 -16
- package/dist/chat/athena-composer-controls.cjs.map +1 -1
- package/dist/chat/athena-composer-controls.d.ts +6 -0
- package/dist/chat/athena-composer-controls.js +26 -16
- package/dist/chat/athena-composer-controls.js.map +1 -1
- package/dist/chat/athena-turn-end-status.cjs +42 -0
- package/dist/chat/athena-turn-end-status.cjs.map +1 -0
- package/dist/chat/athena-turn-end-status.d.ts +24 -0
- package/dist/chat/athena-turn-end-status.js +42 -0
- package/dist/chat/athena-turn-end-status.js.map +1 -0
- package/dist/chat/browser-decision-check.cjs +131 -0
- package/dist/chat/browser-decision-check.cjs.map +1 -0
- package/dist/chat/browser-decision-check.d.ts +61 -0
- package/dist/chat/browser-decision-check.js +131 -0
- package/dist/chat/browser-decision-check.js.map +1 -0
- package/dist/chat/chat-outbox-rows.cjs +3 -3
- package/dist/chat/chat-outbox-rows.cjs.map +1 -1
- package/dist/chat/chat-voice-controls.cjs +93 -28
- package/dist/chat/chat-voice-controls.cjs.map +1 -1
- package/dist/chat/chat-voice-controls.d.ts +36 -2
- package/dist/chat/chat-voice-controls.js +89 -24
- package/dist/chat/chat-voice-controls.js.map +1 -1
- package/dist/chat/composer-keyboard-hint.cjs +5 -5
- package/dist/chat/composer-keyboard-hint.cjs.map +1 -1
- package/dist/chat/device-operation.cjs +29 -0
- package/dist/chat/device-operation.cjs.map +1 -0
- package/dist/chat/device-operation.d.ts +34 -0
- package/dist/chat/device-operation.js +29 -0
- package/dist/chat/device-operation.js.map +1 -0
- package/dist/chat/super-grouping/CollapsibleGroup.cjs +14 -14
- package/dist/chat/super-grouping/CollapsibleGroup.cjs.map +1 -1
- package/dist/chat/super-grouping/GroupedMessageParts.cjs +4 -4
- package/dist/chat/super-grouping/GroupedMessageParts.cjs.map +1 -1
- package/dist/chat/super-grouping/SuperGroupingCard.cjs +60 -38
- package/dist/chat/super-grouping/SuperGroupingCard.cjs.map +1 -1
- package/dist/chat/super-grouping/SuperGroupingCard.d.ts +24 -4
- package/dist/chat/super-grouping/SuperGroupingCard.js +37 -15
- package/dist/chat/super-grouping/SuperGroupingCard.js.map +1 -1
- package/dist/chat/super-grouping/SuperGroupingTranscript.cjs +32 -32
- package/dist/chat/super-grouping/SuperGroupingTranscript.cjs.map +1 -1
- package/dist/chat/super-grouping/SuperGroupingTranscript.js +3 -3
- package/dist/chat/super-grouping/SuperGroupingTranscript.js.map +1 -1
- package/dist/chat/super-grouping/ToolTimeline.cjs +97 -37
- package/dist/chat/super-grouping/ToolTimeline.cjs.map +1 -1
- package/dist/chat/super-grouping/ToolTimeline.d.ts +14 -2
- package/dist/chat/super-grouping/ToolTimeline.js +94 -34
- package/dist/chat/super-grouping/ToolTimeline.js.map +1 -1
- package/dist/chat/super-grouping/activity-timeline.cjs +47 -12
- package/dist/chat/super-grouping/activity-timeline.cjs.map +1 -1
- package/dist/chat/super-grouping/activity-timeline.d.ts +21 -0
- package/dist/chat/super-grouping/activity-timeline.js +47 -12
- package/dist/chat/super-grouping/activity-timeline.js.map +1 -1
- package/dist/chat/super-grouping/grouping-function.cjs +4 -0
- package/dist/chat/super-grouping/grouping-function.cjs.map +1 -1
- package/dist/chat/super-grouping/grouping-function.d.ts +7 -0
- package/dist/chat/super-grouping/grouping-function.js +5 -1
- package/dist/chat/super-grouping/grouping-function.js.map +1 -1
- package/dist/chat/super-grouping/index.cjs +6 -0
- package/dist/chat/super-grouping/index.cjs.map +1 -1
- package/dist/chat/super-grouping/index.d.ts +6 -2
- package/dist/chat/super-grouping/index.js +7 -1
- package/dist/chat/super-grouping/index.js.map +1 -1
- package/dist/chat/super-grouping/timeline-step.cjs +61 -2
- package/dist/chat/super-grouping/timeline-step.cjs.map +1 -1
- package/dist/chat/super-grouping/timeline-step.d.ts +13 -1
- package/dist/chat/super-grouping/timeline-step.js +61 -2
- package/dist/chat/super-grouping/timeline-step.js.map +1 -1
- package/dist/chat/super-grouping/tool-part-placement.cjs +17 -0
- package/dist/chat/super-grouping/tool-part-placement.cjs.map +1 -0
- package/dist/chat/super-grouping/tool-part-placement.d.ts +22 -0
- package/dist/chat/super-grouping/tool-part-placement.js +17 -0
- package/dist/chat/super-grouping/tool-part-placement.js.map +1 -0
- package/dist/chat/thread-scroll-to-bottom.cjs +2 -2
- package/dist/chat/thread-scroll-to-bottom.cjs.map +1 -1
- package/dist/chat/thread-scroll-to-bottom.d.ts +10 -7
- package/dist/chat/thread-scroll-to-bottom.js +2 -2
- package/dist/chat/thread-scroll-to-bottom.js.map +1 -1
- package/dist/chat/tooltip-icon-button.cjs +2 -2
- package/dist/chat/tooltip-icon-button.cjs.map +1 -1
- package/dist/chat/use-athena-voice-live.cjs +11 -0
- package/dist/chat/use-athena-voice-live.cjs.map +1 -0
- package/dist/chat/use-athena-voice-live.d.ts +11 -0
- package/dist/chat/use-athena-voice-live.js +11 -0
- package/dist/chat/use-athena-voice-live.js.map +1 -0
- package/dist/chat/use-statewire-approval-request.cjs +56 -24
- package/dist/chat/use-statewire-approval-request.cjs.map +1 -1
- package/dist/chat/use-statewire-approval-request.d.ts +33 -4
- package/dist/chat/use-statewire-approval-request.js +41 -9
- package/dist/chat/use-statewire-approval-request.js.map +1 -1
- package/dist/chat-ui/auth/sign-in-card.cjs +2 -2
- package/dist/chat-ui/auth/sign-in-card.cjs.map +1 -1
- package/dist/chat-ui/composer/tiptap-composer.cjs +138 -107
- package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -1
- package/dist/chat-ui/composer/tiptap-composer.d.ts +20 -4
- package/dist/chat-ui/composer/tiptap-composer.js +85 -54
- package/dist/chat-ui/composer/tiptap-composer.js.map +1 -1
- package/dist/chat-ui/header/conversation-history-panel.cjs +49 -23
- package/dist/chat-ui/header/conversation-history-panel.cjs.map +1 -1
- package/dist/chat-ui/header/conversation-history-panel.d.ts +12 -1
- package/dist/chat-ui/header/conversation-history-panel.js +38 -12
- package/dist/chat-ui/header/conversation-history-panel.js.map +1 -1
- package/dist/chat-ui/index.cjs +18 -0
- package/dist/chat-ui/index.cjs.map +1 -1
- package/dist/chat-ui/index.d.ts +7 -1
- package/dist/chat-ui/index.js +18 -0
- package/dist/chat-ui/index.js.map +1 -1
- package/dist/chat-ui/mentions/mention-chip.cjs +147 -38
- package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -1
- package/dist/chat-ui/mentions/mention-chip.d.ts +17 -1
- package/dist/chat-ui/mentions/mention-chip.js +146 -37
- package/dist/chat-ui/mentions/mention-chip.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.cjs +10 -9
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.js +3 -2
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs +2 -2
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/menu-list.cjs +29 -6
- package/dist/chat-ui/mentions/suggestions/components/menu-list.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/menu-list.d.ts +7 -1
- package/dist/chat-ui/mentions/suggestions/components/menu-list.js +25 -2
- package/dist/chat-ui/mentions/suggestions/components/menu-list.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/use-keyboard-navigation.cjs +2 -2
- package/dist/chat-ui/mentions/suggestions/components/use-keyboard-navigation.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/use-menu-navigation.cjs +2 -2
- package/dist/chat-ui/mentions/suggestions/components/use-menu-navigation.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/api-client.cjs +3 -3
- package/dist/chat-ui/mentions/suggestions/data/api-client.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/orchestrator.cjs +56 -2
- package/dist/chat-ui/mentions/suggestions/data/orchestrator.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/orchestrator.d.ts +12 -0
- package/dist/chat-ui/mentions/suggestions/data/orchestrator.js +56 -2
- package/dist/chat-ui/mentions/suggestions/data/orchestrator.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs +24 -3
- package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/sources/index.d.ts +7 -0
- package/dist/chat-ui/mentions/suggestions/data/sources/index.js +24 -3
- package/dist/chat-ui/mentions/suggestions/data/sources/index.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs +35 -13
- package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.d.ts +15 -1
- package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js +28 -6
- package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/use-menu-items.cjs +9 -6
- package/dist/chat-ui/mentions/suggestions/data/use-menu-items.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/use-menu-items.d.ts +3 -0
- package/dist/chat-ui/mentions/suggestions/data/use-menu-items.js +5 -2
- package/dist/chat-ui/mentions/suggestions/data/use-menu-items.js.map +1 -1
- package/dist/chat-ui/mentions/use-account-workspace-id.cjs +45 -10
- package/dist/chat-ui/mentions/use-account-workspace-id.cjs.map +1 -1
- package/dist/chat-ui/mentions/use-account-workspace-id.d.ts +24 -1
- package/dist/chat-ui/mentions/use-account-workspace-id.js +46 -11
- package/dist/chat-ui/mentions/use-account-workspace-id.js.map +1 -1
- package/dist/chat-ui/mentions/use-member-avatar.cjs +4 -4
- package/dist/chat-ui/mentions/use-member-avatar.cjs.map +1 -1
- package/dist/chat-ui/mentions/use-mention-asset.cjs +140 -0
- package/dist/chat-ui/mentions/use-mention-asset.cjs.map +1 -0
- package/dist/chat-ui/mentions/use-mention-asset.d.ts +16 -0
- package/dist/chat-ui/mentions/use-mention-asset.js +140 -0
- package/dist/chat-ui/mentions/use-mention-asset.js.map +1 -0
- package/dist/chat-ui/messages/answer-label.cjs +42 -0
- package/dist/chat-ui/messages/answer-label.cjs.map +1 -0
- package/dist/chat-ui/messages/answer-label.d.ts +33 -0
- package/dist/chat-ui/messages/answer-label.js +42 -0
- package/dist/chat-ui/messages/answer-label.js.map +1 -0
- package/dist/chat-ui/messages/arrival-animation.cjs +13 -0
- package/dist/chat-ui/messages/arrival-animation.cjs.map +1 -0
- package/dist/chat-ui/messages/arrival-animation.d.ts +14 -0
- package/dist/chat-ui/messages/arrival-animation.js +13 -0
- package/dist/chat-ui/messages/arrival-animation.js.map +1 -0
- package/dist/chat-ui/messages/continue-pill.cjs +5 -5
- package/dist/chat-ui/messages/continue-pill.cjs.map +1 -1
- package/dist/chat-ui/messages/handoff-arrival-divider.cjs +44 -0
- package/dist/chat-ui/messages/handoff-arrival-divider.cjs.map +1 -0
- package/dist/chat-ui/messages/handoff-arrival-divider.d.ts +17 -0
- package/dist/chat-ui/messages/handoff-arrival-divider.js +44 -0
- package/dist/chat-ui/messages/handoff-arrival-divider.js.map +1 -0
- package/dist/chat-ui/messages/message-actions-config.cjs +3 -3
- package/dist/chat-ui/messages/message-actions-config.cjs.map +1 -1
- package/dist/chat-ui/messages/message-components.cjs +8 -4
- package/dist/chat-ui/messages/message-components.cjs.map +1 -1
- package/dist/chat-ui/messages/message-components.js +5 -1
- package/dist/chat-ui/messages/message-components.js.map +1 -1
- package/dist/chat-ui/messages/message-images.cjs +66 -0
- package/dist/chat-ui/messages/message-images.cjs.map +1 -0
- package/dist/chat-ui/messages/message-images.d.ts +16 -0
- package/dist/chat-ui/messages/message-images.js +66 -0
- package/dist/chat-ui/messages/message-images.js.map +1 -0
- package/dist/chat-ui/messages/user-edit-composer.cjs +2 -2
- package/dist/chat-ui/messages/user-edit-composer.cjs.map +1 -1
- package/dist/chat-ui/messages/wake-marker.cjs +3 -3
- package/dist/chat-ui/messages/wake-marker.cjs.map +1 -1
- package/dist/chat-ui/rich-text/chat-link.cjs +7 -6
- package/dist/chat-ui/rich-text/chat-link.cjs.map +1 -1
- package/dist/chat-ui/rich-text/chat-link.d.ts +2 -3
- package/dist/chat-ui/rich-text/chat-link.js +6 -5
- package/dist/chat-ui/rich-text/chat-link.js.map +1 -1
- package/dist/chat-ui/rich-text/chat-message-body.cjs +8 -8
- package/dist/chat-ui/rich-text/chat-message-body.cjs.map +1 -1
- package/dist/chat-ui/rich-text/chat-node-views.cjs +7 -6
- package/dist/chat-ui/rich-text/chat-node-views.cjs.map +1 -1
- package/dist/chat-ui/rich-text/chat-node-views.js +1 -0
- package/dist/chat-ui/rich-text/chat-node-views.js.map +1 -1
- package/dist/chat-ui/rich-text/dom-output-spec.cjs +2 -2
- package/dist/chat-ui/rich-text/dom-output-spec.cjs.map +1 -1
- package/dist/chat-ui/statewire.cjs +3 -0
- package/dist/chat-ui/statewire.cjs.map +1 -1
- package/dist/chat-ui/statewire.d.ts +2 -1
- package/dist/chat-ui/statewire.js +3 -0
- package/dist/chat-ui/statewire.js.map +1 -1
- package/dist/chat-ui/thread/chat-thread-shell.cjs +43 -14
- package/dist/chat-ui/thread/chat-thread-shell.cjs.map +1 -1
- package/dist/chat-ui/thread/chat-thread-shell.d.ts +16 -2
- package/dist/chat-ui/thread/chat-thread-shell.js +35 -6
- package/dist/chat-ui/thread/chat-thread-shell.js.map +1 -1
- package/dist/chat-ui/thread/composer-send-or-stop.cjs +30 -20
- package/dist/chat-ui/thread/composer-send-or-stop.cjs.map +1 -1
- package/dist/chat-ui/thread/composer-send-or-stop.d.ts +8 -0
- package/dist/chat-ui/thread/composer-send-or-stop.js +29 -19
- package/dist/chat-ui/thread/composer-send-or-stop.js.map +1 -1
- package/dist/chat-ui/thread/statewire-history-edge.cjs +20 -21
- package/dist/chat-ui/thread/statewire-history-edge.cjs.map +1 -1
- package/dist/chat-ui/thread/statewire-history-edge.js +3 -4
- package/dist/chat-ui/thread/statewire-history-edge.js.map +1 -1
- package/dist/chat-ui/thread/thread-loading-overlay.cjs +5 -5
- package/dist/chat-ui/thread/thread-loading-overlay.cjs.map +1 -1
- package/dist/collab/client.cjs +40 -3
- package/dist/collab/client.cjs.map +1 -1
- package/dist/collab/client.d.ts +25 -0
- package/dist/collab/client.js +40 -3
- package/dist/collab/client.js.map +1 -1
- package/dist/collab/document-status.cjs +150 -0
- package/dist/collab/document-status.cjs.map +1 -0
- package/dist/collab/document-status.d.ts +68 -0
- package/dist/collab/document-status.js +150 -0
- package/dist/collab/document-status.js.map +1 -0
- package/dist/collab/index.cjs +7 -0
- package/dist/collab/index.cjs.map +1 -1
- package/dist/collab/index.d.ts +6 -1
- package/dist/collab/index.js +7 -0
- package/dist/collab/index.js.map +1 -1
- package/dist/collab/presence-react.cjs +11 -11
- package/dist/collab/presence-react.cjs.map +1 -1
- package/dist/collab/react.cjs +6 -6
- package/dist/collab/react.cjs.map +1 -1
- package/dist/composer/AttachmentContext.cjs +24 -11
- package/dist/composer/AttachmentContext.cjs.map +1 -1
- package/dist/composer/AttachmentContext.js +18 -5
- package/dist/composer/AttachmentContext.js.map +1 -1
- package/dist/composer/ComposerAttachmentPreview.cjs +78 -23
- package/dist/composer/ComposerAttachmentPreview.cjs.map +1 -1
- package/dist/composer/ComposerAttachmentPreview.d.ts +5 -3
- package/dist/composer/ComposerAttachmentPreview.js +79 -24
- package/dist/composer/ComposerAttachmentPreview.js.map +1 -1
- package/dist/composer/ComposerDropZone.cjs +7 -7
- package/dist/composer/ComposerDropZone.cjs.map +1 -1
- package/dist/composer/FileUploadButton.cjs +37 -22
- package/dist/composer/FileUploadButton.cjs.map +1 -1
- package/dist/composer/FileUploadButton.d.ts +6 -0
- package/dist/composer/FileUploadButton.js +34 -19
- package/dist/composer/FileUploadButton.js.map +1 -1
- package/dist/composer/QuoteContext.cjs +8 -8
- package/dist/composer/QuoteContext.cjs.map +1 -1
- package/dist/composer/composer-handoff.cjs +4 -4
- package/dist/composer/composer-handoff.cjs.map +1 -1
- package/dist/composer/useAppendToComposer.cjs +4 -4
- package/dist/composer/useAppendToComposer.cjs.map +1 -1
- package/dist/composer/useAttachFiles.cjs +23 -6
- package/dist/composer/useAttachFiles.cjs.map +1 -1
- package/dist/composer/useAttachFiles.d.ts +15 -7
- package/dist/composer/useAttachFiles.js +22 -5
- package/dist/composer/useAttachFiles.js.map +1 -1
- package/dist/composer/useComposerAttachment.cjs +4 -4
- package/dist/composer/useComposerAttachment.cjs.map +1 -1
- package/dist/composer/useFileUpload.cjs +21 -16
- package/dist/composer/useFileUpload.cjs.map +1 -1
- package/dist/composer/useFileUpload.d.ts +12 -0
- package/dist/composer/useFileUpload.js +12 -7
- package/dist/composer/useFileUpload.js.map +1 -1
- package/dist/composer/useReadComposerDraft.cjs +2 -2
- package/dist/composer/useReadComposerDraft.cjs.map +1 -1
- package/dist/composer/useSendMessage.cjs +4 -4
- package/dist/composer/useSendMessage.cjs.map +1 -1
- package/dist/diagnostics/useAthenaDiagnostics.cjs +4 -4
- package/dist/diagnostics/useAthenaDiagnostics.cjs.map +1 -1
- package/dist/dictation/audio-level-history.cjs +3 -3
- package/dist/dictation/audio-level-history.cjs.map +1 -1
- package/dist/dictation/dictation-controls.cjs +24 -20
- package/dist/dictation/dictation-controls.cjs.map +1 -1
- package/dist/dictation/dictation-controls.d.ts +6 -1
- package/dist/dictation/dictation-controls.js +24 -20
- package/dist/dictation/dictation-controls.js.map +1 -1
- package/dist/dictation/use-athena-dictation-engine.cjs +3 -3
- package/dist/dictation/use-athena-dictation-engine.cjs.map +1 -1
- package/dist/dictation/use-dictation.cjs +22 -22
- package/dist/dictation/use-dictation.cjs.map +1 -1
- package/dist/index.cjs +26 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +15 -3
- package/dist/index.js +26 -2
- package/dist/index.js.map +1 -1
- package/dist/keryx-http/src/receive-only-socket.cjs +40 -0
- package/dist/keryx-http/src/receive-only-socket.cjs.map +1 -0
- package/dist/keryx-http/src/receive-only-socket.d.ts +27 -0
- package/dist/keryx-http/src/receive-only-socket.js +40 -0
- package/dist/keryx-http/src/receive-only-socket.js.map +1 -0
- package/dist/keryx-http/src/update-attributions.cjs +111 -0
- package/dist/keryx-http/src/update-attributions.cjs.map +1 -0
- package/dist/keryx-http/src/update-attributions.d.ts +75 -0
- package/dist/keryx-http/src/update-attributions.js +111 -0
- package/dist/keryx-http/src/update-attributions.js.map +1 -0
- package/dist/lib/owner-document.cjs +6 -6
- package/dist/lib/owner-document.cjs.map +1 -1
- package/dist/lib/use-athena-rest-query.cjs +4 -4
- package/dist/lib/use-athena-rest-query.cjs.map +1 -1
- package/dist/lib/use-document-active.cjs +4 -4
- package/dist/lib/use-document-active.cjs.map +1 -1
- package/dist/lib/use-prefers-reduced-motion.cjs +2 -2
- package/dist/lib/use-prefers-reduced-motion.cjs.map +1 -1
- package/dist/offline/offline-history.cjs +7 -7
- package/dist/offline/offline-history.cjs.map +1 -1
- package/dist/provider/AthenaContext.cjs +3 -3
- package/dist/provider/AthenaContext.cjs.map +1 -1
- package/dist/provider/AthenaProvider.cjs +116 -79
- package/dist/provider/AthenaProvider.cjs.map +1 -1
- package/dist/provider/AthenaProvider.js +40 -3
- package/dist/provider/AthenaProvider.js.map +1 -1
- package/dist/provider/PostHogProvider.cjs +2 -2
- package/dist/provider/PostHogProvider.cjs.map +1 -1
- package/dist/provider/agent-selection-context.cjs +2 -2
- package/dist/provider/agent-selection-context.cjs.map +1 -1
- package/dist/provider/chat-mode-context.cjs +2 -2
- package/dist/provider/chat-mode-context.cjs.map +1 -1
- package/dist/provider/session-persistence-context.cjs +10 -0
- package/dist/provider/session-persistence-context.cjs.map +1 -0
- package/dist/provider/session-persistence-context.d.ts +15 -0
- package/dist/provider/session-persistence-context.js +10 -0
- package/dist/provider/session-persistence-context.js.map +1 -0
- package/dist/provider/statewire-history-context.cjs +4 -4
- package/dist/provider/statewire-history-context.cjs.map +1 -1
- package/dist/provider/statewire-lifecycle-context.cjs +3 -3
- package/dist/provider/statewire-lifecycle-context.cjs.map +1 -1
- package/dist/provider/statewire-window-context.cjs +3 -3
- package/dist/provider/statewire-window-context.cjs.map +1 -1
- package/dist/provider/theme-style-context.cjs +3 -3
- package/dist/provider/theme-style-context.cjs.map +1 -1
- package/dist/react/package.json.cjs +1 -1
- package/dist/react/package.json.js +1 -1
- package/dist/references/src/tool-option-schemas.d.ts +0 -34
- package/dist/runtime/StatewireThreadConfigLaneSync.cjs +10 -10
- package/dist/runtime/StatewireThreadConfigLaneSync.cjs.map +1 -1
- package/dist/runtime/auth-refusal-restart.cjs +7 -7
- package/dist/runtime/auth-refusal-restart.cjs.map +1 -1
- package/dist/runtime/auth.cjs +13 -13
- package/dist/runtime/auth.cjs.map +1 -1
- package/dist/runtime/statewire-lifecycle.cjs +1 -0
- package/dist/runtime/statewire-lifecycle.cjs.map +1 -1
- package/dist/runtime/statewire-lifecycle.d.ts +3 -1
- package/dist/runtime/statewire-lifecycle.js +2 -1
- package/dist/runtime/statewire-lifecycle.js.map +1 -1
- package/dist/runtime/statewire-server-lane-context.cjs +2 -2
- package/dist/runtime/statewire-server-lane-context.cjs.map +1 -1
- package/dist/runtime/statewire-session-lane.cjs +4 -4
- package/dist/runtime/statewire-session-lane.cjs.map +1 -1
- package/dist/runtime/useAthenaStatewireRuntime.cjs +10 -8
- package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
- package/dist/runtime/useAthenaStatewireRuntime.d.ts +2 -0
- package/dist/runtime/useAthenaStatewireRuntime.js +2 -0
- package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/threads/Inbox.cjs +8 -8
- package/dist/threads/Inbox.cjs.map +1 -1
- package/dist/threads/SessionList.cjs +9 -9
- package/dist/threads/SessionList.cjs.map +1 -1
- package/dist/threads/SessionsPage.cjs +11 -11
- package/dist/threads/SessionsPage.cjs.map +1 -1
- package/dist/threads/index-triggered-refresh.cjs +10 -10
- package/dist/threads/index-triggered-refresh.cjs.map +1 -1
- package/dist/threads/mark-viewed-thread-read.cjs +12 -12
- package/dist/threads/mark-viewed-thread-read.cjs.map +1 -1
- package/dist/threads/offline-session-list.cjs +3 -3
- package/dist/threads/offline-session-list.cjs.map +1 -1
- package/dist/threads/session-list-tab-share.cjs +5 -5
- package/dist/threads/session-list-tab-share.cjs.map +1 -1
- package/dist/threads/statewire-thread-list.cjs +55 -51
- package/dist/threads/statewire-thread-list.cjs.map +1 -1
- package/dist/threads/statewire-thread-list.js +6 -2
- package/dist/threads/statewire-thread-list.js.map +1 -1
- package/dist/threads/thread-id-context.cjs +5 -5
- package/dist/threads/thread-id-context.cjs.map +1 -1
- package/dist/threads/use-athena-session-attention.cjs +2 -2
- package/dist/threads/use-athena-session-attention.cjs.map +1 -1
- package/dist/threads/use-athena-sessions.cjs +10 -10
- package/dist/threads/use-athena-sessions.cjs.map +1 -1
- package/dist/threads/use-athena-thread-model.cjs +3 -3
- package/dist/threads/use-athena-thread-model.cjs.map +1 -1
- package/dist/threads/use-rest-conversation-history.cjs +3 -3
- package/dist/threads/use-rest-conversation-history.cjs.map +1 -1
- package/dist/threads/use-statewire-conversation-history.cjs +8 -8
- package/dist/threads/use-statewire-conversation-history.cjs.map +1 -1
- package/dist/threads/use-thread-archive.cjs +9 -9
- package/dist/threads/use-thread-archive.cjs.map +1 -1
- package/dist/threads/use-thread-favorite.cjs +2 -2
- package/dist/threads/use-thread-favorite.cjs.map +1 -1
- package/dist/threads/use-thread-field-override.cjs +20 -20
- package/dist/threads/use-thread-field-override.cjs.map +1 -1
- package/dist/threads/use-thread-read-state.cjs +4 -4
- package/dist/threads/use-thread-read-state.cjs.map +1 -1
- package/dist/threads/use-thread-rename.cjs +2 -2
- package/dist/threads/use-thread-rename.cjs.map +1 -1
- package/dist/threads/useAthenaThreadManager.cjs +2 -2
- package/dist/threads/useAthenaThreadManager.cjs.map +1 -1
- package/dist/tools/NestedPtcMessages.cjs +6 -6
- package/dist/tools/NestedPtcMessages.cjs.map +1 -1
- package/dist/tools/append-document-tool-ui.cjs +7 -7
- package/dist/tools/append-document-tool-ui.cjs.map +1 -1
- package/dist/tools/file-tool-uis.cjs +2 -2
- package/dist/tools/file-tool-uis.cjs.map +1 -1
- package/dist/tools/misc-tool-uis.cjs +2 -2
- package/dist/tools/misc-tool-uis.cjs.map +1 -1
- package/dist/tools/primitives.cjs +6 -6
- package/dist/tools/primitives.cjs.map +1 -1
- package/dist/tools/read-asset-tool-ui.cjs +6 -6
- package/dist/tools/read-asset-tool-ui.cjs.map +1 -1
- package/dist/tools/subagent-task-tool-ui.cjs +21 -21
- package/dist/tools/subagent-task-tool-ui.cjs.map +1 -1
- package/dist/tools/test-recording-tool-uis.cjs +16 -16
- package/dist/tools/test-recording-tool-uis.cjs.map +1 -1
- package/dist/tools/todo-plan-store.cjs +4 -4
- package/dist/tools/todo-plan-store.cjs.map +1 -1
- package/dist/tools/tool-appearance.cjs +3 -3
- package/dist/tools/tool-appearance.cjs.map +1 -1
- package/dist/tools/tool-fallback.cjs +14 -14
- package/dist/tools/tool-fallback.cjs.map +1 -1
- package/dist/tools/tool-summary.cjs +0 -2
- package/dist/tools/tool-summary.cjs.map +1 -1
- package/dist/tools/tool-summary.js +0 -2
- package/dist/tools/tool-summary.js.map +1 -1
- package/dist/tools/tool-uis.cjs +74 -74
- package/dist/tools/tool-uis.cjs.map +1 -1
- package/dist/tools/use-elapsed-seconds.cjs +3 -3
- package/dist/tools/use-elapsed-seconds.cjs.map +1 -1
- package/dist/tools/write-todos-tool-ui.cjs +9 -9
- package/dist/tools/write-todos-tool-ui.cjs.map +1 -1
- package/dist/ui/image-viewer.cjs +382 -0
- package/dist/ui/image-viewer.cjs.map +1 -0
- package/dist/ui/image-viewer.d.ts +50 -0
- package/dist/ui/image-viewer.js +382 -0
- package/dist/ui/image-viewer.js.map +1 -0
- package/dist/voice/chat.cjs +6 -0
- package/dist/voice/chat.cjs.map +1 -1
- package/dist/voice/chat.d.ts +1 -1
- package/dist/voice/chat.js +8 -2
- package/dist/voice/livekit-join.cjs +52 -101
- package/dist/voice/livekit-join.cjs.map +1 -1
- package/dist/voice/livekit-join.d.ts +1 -6
- package/dist/voice/livekit-join.js +52 -101
- package/dist/voice/livekit-join.js.map +1 -1
- package/dist/voice/livekit.cjs.map +1 -1
- package/dist/voice/livekit.d.ts +11 -1
- package/dist/voice/livekit.js.map +1 -1
- package/dist/voice/use-athena-voice-session.cjs +34 -34
- package/dist/voice/use-athena-voice-session.cjs.map +1 -1
- package/dist/workbench/ComputerLiveDesktop.cjs +13 -13
- package/dist/workbench/ComputerLiveDesktop.cjs.map +1 -1
- package/dist/workbench/SessionWorkbench.cjs +22 -22
- package/dist/workbench/SessionWorkbench.cjs.map +1 -1
- package/dist/workbench/session-workbench-context.cjs +3 -3
- package/dist/workbench/session-workbench-context.cjs.map +1 -1
- package/dist/workbench/session-workbench-panes.cjs +8 -8
- package/dist/workbench/session-workbench-panes.cjs.map +1 -1
- package/dist/workbench/workbench-layout-context.cjs +3 -3
- package/dist/workbench/workbench-layout-context.cjs.map +1 -1
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mention-suggestion-list.js","sources":["../../../../../src/chat-ui/mentions/suggestions/components/mention-suggestion-list.tsx"],"sourcesContent":["/**\n * MentionSuggestionList — Main mention menu component.\n *\n * Composed of:\n * - Registry + cache backed data (async fetching)\n * - useMenuNavigation for scope stack management\n * - useKeyboardNavigation for keyboard handling\n * - MenuList for item rendering with loading states\n * - MenuSummary for breadcrumbs + back\n */\n\nimport { useStore } from \"@tanstack/react-store\";\nimport type { Editor } from \"@tiptap/core\";\nimport { forwardRef, useCallback, useEffect, useState } from \"react\";\nimport type { MenuItem } from \"../data/types\";\nimport type { MentionSuggestionsStore } from \"../data/use-mention-suggestions\";\nimport { useMenuItems } from \"../data/use-menu-items\";\nimport { getSearchScope } from \"../data/scope-registry\";\nimport { getScopeName } from \"./get-scope-name\";\nimport { MenuList } from \"./menu-list\";\nimport { MenuSummary } from \"./menu-summary\";\nimport { useKeyboardNavigation, type KeyboardNavigationHandle } from \"./use-keyboard-navigation\";\nimport {\n getCurrentScope,\n getSelectedIndex,\n useMenuNavigation,\n} from \"./use-menu-navigation\";\nimport { clearTextAfterTrigger } from \"./utils\";\n\nexport interface MentionSuggestionListProps {\n store: MentionSuggestionsStore;\n editor: Editor;\n query: string;\n command: (item: MenuItem) => void;\n closeMenu: (dismissedByUser?: boolean) => void;\n}\n\nexport const MentionSuggestionList = forwardRef<\n KeyboardNavigationHandle,\n MentionSuggestionListProps\n>(({ store, editor, query, command, closeMenu }, ref) => {\n const [selectedIndexOverride, setSelectedIndexOverride] = useState<number | null>(null);\n const navStore = useMenuNavigation();\n\n // Get current scope from navigation\n const currentScopeId = useStore(navStore, (s) => getCurrentScope(s));\n const navSelectedIndex = useStore(navStore, (s) => getSelectedIndex(s));\n const selectedIndex = selectedIndexOverride ?? navSelectedIndex;\n const scopeStack = useStore(navStore, (s) => s.scopeStack);\n\n let effectiveScopeId = currentScopeId;\n\n if (query) {\n try {\n const searchScope = getSearchScope(store.state.registry, currentScopeId);\n if (searchScope) {\n effectiveScopeId = searchScope;\n }\n } catch {\n // No search scope binding — use current\n }\n }\n\n // Get items from the data store (reactive, with async fetching)\n const { items, isFetching, hasMore, loadMore } = useMenuItems(store, {\n scope: effectiveScopeId,\n query,\n minItems: 50,\n parentScope: currentScopeId !== effectiveScopeId ? currentScopeId : undefined,\n });\n\n // Reset selection on query or scope change\n useEffect(() => {\n setSelectedIndexOverride(null);\n }, [query, effectiveScopeId]);\n\n // Build scope path for breadcrumbs from the navigation stack\n const scopePath = scopeStack.map((entry) => ({\n id: entry.scope,\n name: entry.breadcrumbLabel ?? getScopeName(entry.scope, store),\n }));\n\n // Handle item selection\n const handleSelect = useCallback(\n (item: MenuItem) => {\n if (item.navigatesToScope) {\n navStore.navigateTo(item.navigatesToScope, selectedIndex, {\n breadcrumbLabel: item.name,\n parentScope: currentScopeId,\n });\n clearTextAfterTrigger(editor);\n setSelectedIndexOverride(null);\n return;\n }\n // Insert mention\n command(item);\n },\n [command, editor, navStore, selectedIndex, currentScopeId],\n );\n\n // Handle back navigation\n const handleBack = useCallback(() => {\n navStore.navigateBack();\n clearTextAfterTrigger(editor);\n setSelectedIndexOverride(null);\n }, [editor, navStore]);\n\n // Handle breadcrumb navigation\n const handleBreadcrumbNavigate = useCallback(\n (targetScopeId: string) => {\n // Navigate to specific scope in the stack\n const targetIdx = scopeStack.findIndex((entry) => entry.scope === targetScopeId);\n\n if (targetIdx >= 0) {\n // Pop stack down to the target\n const popsNeeded = scopeStack.length - 1 - targetIdx;\n for (let i = 0; i < popsNeeded; i++) {\n navStore.navigateBack();\n }\n clearTextAfterTrigger(editor);\n setSelectedIndexOverride(null);\n }\n },\n [editor, navStore, scopeStack],\n );\n\n // Keyboard navigation\n useKeyboardNavigation(ref, {\n items,\n selectedIndex,\n onSelect: handleSelect,\n onBack: currentScopeId !== \"root\" ? handleBack : undefined,\n onClose: () => closeMenu(true),\n setSelectedIndex: (idx: number) => {\n setSelectedIndexOverride(idx);\n },\n });\n\n return (\n <div className=\"bg-white border border-gray-300 rounded shadow-lg min-w-[280px] max-w-[380px] max-h-[320px] flex flex-col\">\n {/* Scrollable items */}\n <div className=\"flex-1 overflow-y-auto\">\n <MenuList\n items={items}\n selectedIndex={selectedIndex}\n isLoading={isFetching}\n hasMore={hasMore}\n onSelect={handleSelect}\n onMouseMove={(idx) => {\n setSelectedIndexOverride(idx);\n }}\n onLoadMore={loadMore}\n />\n </div>\n\n {/* Bottom summary with breadcrumbs + back */}\n <MenuSummary\n scopePath={scopePath}\n onNavigate={handleBreadcrumbNavigate}\n onBackClick={currentScopeId !== \"root\" ? handleBack : undefined}\n isFetching={isFetching}\n />\n </div>\n );\n});\n\nMentionSuggestionList.displayName = \"MentionSuggestionList\";\n"],"names":[],"mappings":";;;;;;;;;;;AAqCO,MAAM,wBAAwB,WAGnC,CAAC,EAAE,OAAO,QAAQ,OAAO,SAAS,UAAA,GAAa,QAAQ;AACvD,QAAM,CAAC,uBAAuB,wBAAwB,IAAI,SAAwB,IAAI;AACtF,QAAM,WAAW,kBAAA;AAGjB,QAAM,iBAAiB,SAAS,UAAU,CAAC,MAAM,gBAAgB,CAAC,CAAC;AACnE,QAAM,mBAAmB,SAAS,UAAU,CAAC,MAAM,iBAAiB,CAAC,CAAC;AACtE,QAAM,gBAAgB,yBAAyB;AAC/C,QAAM,aAAa,SAAS,UAAU,CAAC,MAAM,EAAE,UAAU;AAEzD,MAAI,mBAAmB;AAEvB,MAAI,OAAO;AACT,QAAI;AACF,YAAM,cAAc,eAAe,MAAM,MAAM,UAAU,cAAc;AACvE,UAAI,aAAa;AACf,2BAAmB;AAAA,MACrB;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,QAAM,EAAE,OAAO,YAAY,SAAS,SAAA,IAAa,aAAa,OAAO;AAAA,
|
|
1
|
+
{"version":3,"file":"mention-suggestion-list.js","sources":["../../../../../src/chat-ui/mentions/suggestions/components/mention-suggestion-list.tsx"],"sourcesContent":["/**\n * MentionSuggestionList — Main mention menu component.\n *\n * Composed of:\n * - Registry + cache backed data (async fetching)\n * - useMenuNavigation for scope stack management\n * - useKeyboardNavigation for keyboard handling\n * - MenuList for item rendering with loading states\n * - MenuSummary for breadcrumbs + back\n */\n\nimport { useStore } from \"@tanstack/react-store\";\nimport type { Editor } from \"@tiptap/core\";\nimport { forwardRef, useCallback, useEffect, useState } from \"react\";\nimport type { MenuItem } from \"../data/types\";\nimport type { MentionSuggestionsStore } from \"../data/use-mention-suggestions\";\nimport { useMenuItems } from \"../data/use-menu-items\";\nimport { getSearchScope } from \"../data/scope-registry\";\nimport { getScopeName } from \"./get-scope-name\";\nimport { MenuList } from \"./menu-list\";\nimport { MenuSummary } from \"./menu-summary\";\nimport { useKeyboardNavigation, type KeyboardNavigationHandle } from \"./use-keyboard-navigation\";\nimport {\n getCurrentScope,\n getSelectedIndex,\n useMenuNavigation,\n} from \"./use-menu-navigation\";\nimport { clearTextAfterTrigger } from \"./utils\";\n\nexport interface MentionSuggestionListProps {\n store: MentionSuggestionsStore;\n editor: Editor;\n query: string;\n command: (item: MenuItem) => void;\n closeMenu: (dismissedByUser?: boolean) => void;\n}\n\nexport const MentionSuggestionList = forwardRef<\n KeyboardNavigationHandle,\n MentionSuggestionListProps\n>(({ store, editor, query, command, closeMenu }, ref) => {\n const [selectedIndexOverride, setSelectedIndexOverride] = useState<number | null>(null);\n const navStore = useMenuNavigation();\n\n // Get current scope from navigation\n const currentScopeId = useStore(navStore, (s) => getCurrentScope(s));\n const navSelectedIndex = useStore(navStore, (s) => getSelectedIndex(s));\n const selectedIndex = selectedIndexOverride ?? navSelectedIndex;\n const scopeStack = useStore(navStore, (s) => s.scopeStack);\n\n let effectiveScopeId = currentScopeId;\n\n if (query) {\n try {\n const searchScope = getSearchScope(store.state.registry, currentScopeId);\n if (searchScope) {\n effectiveScopeId = searchScope;\n }\n } catch {\n // No search scope binding — use current\n }\n }\n\n // Get items from the data store (reactive, with async fetching)\n const { items, isFetching, hasMore, unavailable, loadMore } = useMenuItems(store, {\n scope: effectiveScopeId,\n query,\n minItems: 50,\n parentScope: currentScopeId !== effectiveScopeId ? currentScopeId : undefined,\n });\n\n // Reset selection on query or scope change\n useEffect(() => {\n setSelectedIndexOverride(null);\n }, [query, effectiveScopeId]);\n\n // Build scope path for breadcrumbs from the navigation stack\n const scopePath = scopeStack.map((entry) => ({\n id: entry.scope,\n name: entry.breadcrumbLabel ?? getScopeName(entry.scope, store),\n }));\n\n // Handle item selection\n const handleSelect = useCallback(\n (item: MenuItem) => {\n if (item.navigatesToScope) {\n navStore.navigateTo(item.navigatesToScope, selectedIndex, {\n breadcrumbLabel: item.name,\n parentScope: currentScopeId,\n });\n clearTextAfterTrigger(editor);\n setSelectedIndexOverride(null);\n return;\n }\n // Insert mention\n command(item);\n },\n [command, editor, navStore, selectedIndex, currentScopeId],\n );\n\n // Handle back navigation\n const handleBack = useCallback(() => {\n navStore.navigateBack();\n clearTextAfterTrigger(editor);\n setSelectedIndexOverride(null);\n }, [editor, navStore]);\n\n // Handle breadcrumb navigation\n const handleBreadcrumbNavigate = useCallback(\n (targetScopeId: string) => {\n // Navigate to specific scope in the stack\n const targetIdx = scopeStack.findIndex((entry) => entry.scope === targetScopeId);\n\n if (targetIdx >= 0) {\n // Pop stack down to the target\n const popsNeeded = scopeStack.length - 1 - targetIdx;\n for (let i = 0; i < popsNeeded; i++) {\n navStore.navigateBack();\n }\n clearTextAfterTrigger(editor);\n setSelectedIndexOverride(null);\n }\n },\n [editor, navStore, scopeStack],\n );\n\n // Keyboard navigation\n useKeyboardNavigation(ref, {\n items,\n selectedIndex,\n onSelect: handleSelect,\n onBack: currentScopeId !== \"root\" ? handleBack : undefined,\n onClose: () => closeMenu(true),\n setSelectedIndex: (idx: number) => {\n setSelectedIndexOverride(idx);\n },\n });\n\n return (\n <div className=\"bg-white border border-gray-300 rounded shadow-lg min-w-[280px] max-w-[380px] max-h-[320px] flex flex-col\">\n {/* Scrollable items */}\n <div className=\"flex-1 overflow-y-auto\">\n <MenuList\n items={items}\n selectedIndex={selectedIndex}\n isLoading={isFetching}\n hasMore={hasMore}\n unavailable={unavailable}\n onSelect={handleSelect}\n onMouseMove={(idx) => {\n setSelectedIndexOverride(idx);\n }}\n onLoadMore={loadMore}\n />\n </div>\n\n {/* Bottom summary with breadcrumbs + back */}\n <MenuSummary\n scopePath={scopePath}\n onNavigate={handleBreadcrumbNavigate}\n onBackClick={currentScopeId !== \"root\" ? handleBack : undefined}\n isFetching={isFetching && unavailable === null}\n />\n </div>\n );\n});\n\nMentionSuggestionList.displayName = \"MentionSuggestionList\";\n"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
-
const
|
|
4
|
+
const require$$0 = require("react");
|
|
5
5
|
const react = require("@floating-ui/react");
|
|
6
6
|
const lib_ownerDocument = require("../../../../lib/owner-document.cjs");
|
|
7
7
|
const MentionSuggestionPopup = ({ clientRect, children }) => {
|
|
@@ -11,7 +11,7 @@ const MentionSuggestionPopup = ({ clientRect, children }) => {
|
|
|
11
11
|
middleware: [react.offset(10), react.flip(), react.shift({ padding: 8 })],
|
|
12
12
|
whileElementsMounted: react.autoUpdate
|
|
13
13
|
});
|
|
14
|
-
|
|
14
|
+
require$$0.useEffect(() => {
|
|
15
15
|
if (clientRect) {
|
|
16
16
|
refs.setPositionReference({
|
|
17
17
|
getBoundingClientRect: () => clientRect() ?? new DOMRect()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mention-suggestion-popup.cjs","sources":["../../../../../src/chat-ui/mentions/suggestions/components/mention-suggestion-popup.tsx"],"sourcesContent":["/**\n * Floating popup wrapper for the mention suggestion menu.\n * Uses Floating UI for positioning near the cursor.\n */\n\nimport { type FC, type ReactNode, useEffect } from \"react\";\nimport {\n useFloating,\n offset,\n flip,\n shift,\n autoUpdate,\n FloatingPortal,\n} from \"@floating-ui/react\";\nimport { usePortalContainer } from \"../../../../lib/owner-document\";\n\nexport const MentionSuggestionPopup: FC<{\n clientRect: (() => DOMRect | null) | null;\n children: ReactNode;\n}> = ({ clientRect, children }) => {\n const portalRoot = usePortalContainer();\n const { refs, floatingStyles } = useFloating({\n placement: \"bottom-start\",\n middleware: [offset(10), flip(), shift({ padding: 8 })],\n whileElementsMounted: autoUpdate,\n });\n\n // Use setPositionReference for virtual elements (cursor position)\n // instead of elements.reference which requires a real DOM element\n useEffect(() => {\n if (clientRect) {\n refs.setPositionReference({\n getBoundingClientRect: () => clientRect() ?? new DOMRect(),\n });\n }\n }, [clientRect, refs]);\n\n return (\n <FloatingPortal root={portalRoot}>\n <div\n ref={refs.setFloating}\n style={floatingStyles}\n className=\"z-[9999]\"\n onMouseDown={(e) => e.preventDefault()} // Prevent focus loss on click\n >\n {children}\n </div>\n </FloatingPortal>\n );\n};\n"],"names":["usePortalContainer","useFloating","offset","flip","shift","autoUpdate","useEffect","jsx","FloatingPortal"],"mappings":";;;;;;AAgBO,MAAM,yBAGR,CAAC,EAAE,YAAY,eAAe;AACjC,QAAM,aAAaA,kBAAAA,mBAAA;AACnB,QAAM,EAAE,MAAM,eAAA,IAAmBC,kBAAY;AAAA,IAC3C,WAAW;AAAA,IACX,YAAY,CAACC,aAAO,EAAE,GAAGC,MAAAA,QAAQC,MAAAA,MAAM,EAAE,SAAS,EAAA,CAAG,CAAC;AAAA,IACtD,sBAAsBC,MAAAA;AAAAA,EAAA,CACvB;AAIDC,
|
|
1
|
+
{"version":3,"file":"mention-suggestion-popup.cjs","sources":["../../../../../src/chat-ui/mentions/suggestions/components/mention-suggestion-popup.tsx"],"sourcesContent":["/**\n * Floating popup wrapper for the mention suggestion menu.\n * Uses Floating UI for positioning near the cursor.\n */\n\nimport { type FC, type ReactNode, useEffect } from \"react\";\nimport {\n useFloating,\n offset,\n flip,\n shift,\n autoUpdate,\n FloatingPortal,\n} from \"@floating-ui/react\";\nimport { usePortalContainer } from \"../../../../lib/owner-document\";\n\nexport const MentionSuggestionPopup: FC<{\n clientRect: (() => DOMRect | null) | null;\n children: ReactNode;\n}> = ({ clientRect, children }) => {\n const portalRoot = usePortalContainer();\n const { refs, floatingStyles } = useFloating({\n placement: \"bottom-start\",\n middleware: [offset(10), flip(), shift({ padding: 8 })],\n whileElementsMounted: autoUpdate,\n });\n\n // Use setPositionReference for virtual elements (cursor position)\n // instead of elements.reference which requires a real DOM element\n useEffect(() => {\n if (clientRect) {\n refs.setPositionReference({\n getBoundingClientRect: () => clientRect() ?? new DOMRect(),\n });\n }\n }, [clientRect, refs]);\n\n return (\n <FloatingPortal root={portalRoot}>\n <div\n ref={refs.setFloating}\n style={floatingStyles}\n className=\"z-[9999]\"\n onMouseDown={(e) => e.preventDefault()} // Prevent focus loss on click\n >\n {children}\n </div>\n </FloatingPortal>\n );\n};\n"],"names":["usePortalContainer","useFloating","offset","flip","shift","autoUpdate","useEffect","jsx","FloatingPortal"],"mappings":";;;;;;AAgBO,MAAM,yBAGR,CAAC,EAAE,YAAY,eAAe;AACjC,QAAM,aAAaA,kBAAAA,mBAAA;AACnB,QAAM,EAAE,MAAM,eAAA,IAAmBC,kBAAY;AAAA,IAC3C,WAAW;AAAA,IACX,YAAY,CAACC,aAAO,EAAE,GAAGC,MAAAA,QAAQC,MAAAA,MAAM,EAAE,SAAS,EAAA,CAAG,CAAC;AAAA,IACtD,sBAAsBC,MAAAA;AAAAA,EAAA,CACvB;AAIDC,aAAAA,UAAU,MAAM;AACd,QAAI,YAAY;AACd,WAAK,qBAAqB;AAAA,QACxB,uBAAuB,MAAM,WAAA,KAAgB,IAAI,QAAA;AAAA,MAAQ,CAC1D;AAAA,IACH;AAAA,EACF,GAAG,CAAC,YAAY,IAAI,CAAC;AAErB,SACEC,2BAAAA,IAACC,MAAAA,gBAAA,EAAe,MAAM,YACpB,UAAAD,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK,KAAK;AAAA,MACV,OAAO;AAAA,MACP,WAAU;AAAA,MACV,aAAa,CAAC,MAAM,EAAE,eAAA;AAAA,MAErB;AAAA,IAAA;AAAA,EAAA,GAEL;AAEJ;;"}
|
|
@@ -1,24 +1,46 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
-
const
|
|
4
|
+
const require$$0 = require("react");
|
|
5
5
|
const types = require("../data/types.cjs");
|
|
6
6
|
const menuItem = require("./menu-item.cjs");
|
|
7
7
|
const menuSkeleton = require("./menu-skeleton.cjs");
|
|
8
|
+
const cnfast = require("cnfast");
|
|
9
|
+
function UnavailableNotice({
|
|
10
|
+
reason,
|
|
11
|
+
compact = false
|
|
12
|
+
}) {
|
|
13
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
14
|
+
"div",
|
|
15
|
+
{
|
|
16
|
+
role: "status",
|
|
17
|
+
"data-testid": "mention-search-unavailable",
|
|
18
|
+
className: cnfast.cn("px-2 text-center", compact ? "py-2" : "py-9"),
|
|
19
|
+
children: [
|
|
20
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: cnfast.cn("text-gray-600", compact ? "text-xs" : "mb-1 text-sm"), children: reason.label }),
|
|
21
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs text-gray-400", children: reason.detail })
|
|
22
|
+
]
|
|
23
|
+
}
|
|
24
|
+
);
|
|
25
|
+
}
|
|
8
26
|
function MenuList({
|
|
9
27
|
items,
|
|
10
28
|
selectedIndex,
|
|
11
29
|
isLoading,
|
|
12
30
|
hasMore,
|
|
31
|
+
unavailable = null,
|
|
13
32
|
onSelect,
|
|
14
33
|
onMouseMove,
|
|
15
34
|
onLoadMore
|
|
16
35
|
}) {
|
|
17
|
-
const selectedRef =
|
|
18
|
-
|
|
36
|
+
const selectedRef = require$$0.useRef(null);
|
|
37
|
+
require$$0.useEffect(() => {
|
|
19
38
|
var _a;
|
|
20
39
|
(_a = selectedRef.current) == null ? void 0 : _a.scrollIntoView({ block: "nearest" });
|
|
21
40
|
}, [selectedIndex]);
|
|
41
|
+
if (unavailable && items.length === 0) {
|
|
42
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-1 py-1", children: /* @__PURE__ */ jsxRuntime.jsx(UnavailableNotice, { reason: unavailable }) });
|
|
43
|
+
}
|
|
22
44
|
if (isLoading && items.length === 0) return /* @__PURE__ */ jsxRuntime.jsx(menuSkeleton.MenuSkeleton, {});
|
|
23
45
|
if (items.length === 0) {
|
|
24
46
|
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-1 py-1", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "px-2 py-9 text-center text-sm text-gray-500", children: [
|
|
@@ -32,7 +54,7 @@ function MenuList({
|
|
|
32
54
|
const previousSection = (_a = items[index - 1]) == null ? void 0 : _a.menuSection;
|
|
33
55
|
const startsOtherWebpages = item.menuSection === types.MentionMenuSection.OTHER_WEBPAGES && previousSection !== types.MentionMenuSection.OTHER_WEBPAGES;
|
|
34
56
|
const startsLibrary = item.menuSection === types.MentionMenuSection.LIBRARY && (previousSection === types.MentionMenuSection.CURRENT_WEBPAGE || previousSection === types.MentionMenuSection.OTHER_WEBPAGES);
|
|
35
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
57
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(require$$0.Fragment, { children: [
|
|
36
58
|
startsOtherWebpages && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-2 pb-1 pt-2 text-[11px] font-medium uppercase tracking-wide text-gray-400", children: "Other webpages in this group" }),
|
|
37
59
|
startsLibrary && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-2 my-1 border-t border-gray-100" }),
|
|
38
60
|
/* @__PURE__ */ jsxRuntime.jsx("div", { ref: index === selectedIndex ? selectedRef : void 0, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -47,8 +69,9 @@ function MenuList({
|
|
|
47
69
|
) })
|
|
48
70
|
] }, item.id);
|
|
49
71
|
}),
|
|
50
|
-
|
|
51
|
-
|
|
72
|
+
unavailable && hasMore && /* @__PURE__ */ jsxRuntime.jsx(UnavailableNotice, { reason: unavailable, compact: true }),
|
|
73
|
+
!unavailable && isLoading && items.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-2 py-2 text-center", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-gray-400", children: "Loading more..." }) }),
|
|
74
|
+
!unavailable && hasMore && !isLoading && onLoadMore && /* @__PURE__ */ jsxRuntime.jsx(
|
|
52
75
|
"button",
|
|
53
76
|
{
|
|
54
77
|
type: "button",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu-list.cjs","sources":["../../../../../src/chat-ui/mentions/suggestions/components/menu-list.tsx"],"sourcesContent":["/**\n * Scrollable list of menu items with loading and empty states.\n */\n\nimport { Fragment, useEffect, useRef } from \"react\";\nimport { MentionMenuSection, type MenuItem } from \"../data/types\";\nimport { MenuItemRow } from \"./menu-item\";\nimport { MenuSkeleton } from \"./menu-skeleton\";\n\nexport function MenuList({\n items,\n selectedIndex,\n isLoading,\n hasMore,\n onSelect,\n onMouseMove,\n onLoadMore,\n}: {\n items: MenuItem[];\n selectedIndex: number;\n isLoading?: boolean;\n hasMore?: boolean;\n onSelect: (item: MenuItem) => void;\n onMouseMove: (index: number) => void;\n onLoadMore?: () => void;\n}) {\n const selectedRef = useRef<HTMLDivElement>(null);\n\n // Auto-scroll selected item into view\n useEffect(() => {\n selectedRef.current?.scrollIntoView({ block: \"nearest\" });\n }, [selectedIndex]);\n\n if (isLoading && items.length === 0) return <MenuSkeleton />;\n\n if (items.length === 0) {\n return (\n <div className=\"px-1 py-1\">\n <div className=\"px-2 py-9 text-center text-sm text-gray-500\">\n <div className=\"mb-1\">No results found</div>\n <div className=\"text-xs text-gray-400\">Try a different search or go back</div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"px-1 py-1\">\n {items.map((item, index) => {\n const previousSection = items[index - 1]?.menuSection;\n const startsOtherWebpages =\n item.menuSection === MentionMenuSection.OTHER_WEBPAGES &&\n previousSection !== MentionMenuSection.OTHER_WEBPAGES;\n const startsLibrary =\n item.menuSection === MentionMenuSection.LIBRARY &&\n (previousSection === MentionMenuSection.CURRENT_WEBPAGE ||\n previousSection === MentionMenuSection.OTHER_WEBPAGES);\n\n return (\n <Fragment key={item.id}>\n {startsOtherWebpages && (\n <div className=\"px-2 pb-1 pt-2 text-[11px] font-medium uppercase tracking-wide text-gray-400\">\n Other webpages in this group\n </div>\n )}\n {startsLibrary && <div className=\"mx-2 my-1 border-t border-gray-100\" />}\n <div ref={index === selectedIndex ? selectedRef : undefined}>\n <MenuItemRow\n item={item}\n isSelected={index === selectedIndex}\n onMouseMove={() => onMouseMove(index)}\n onClick={() => onSelect(item)}\n showArrow={!!item.navigatesToScope}\n />\n </div>\n </Fragment>\n );\n })}\n\n {/* Loading more indicator */}\n {isLoading && items.length > 0 && (\n <div className=\"px-2 py-2 text-center\">\n <span className=\"text-xs text-gray-400\">Loading more...</span>\n </div>\n )}\n\n {/* Load more sentinel */}\n {hasMore && !isLoading && onLoadMore && (\n <button\n type=\"button\"\n onClick={onLoadMore}\n className=\"w-full px-2 py-1.5 text-xs text-gray-500 hover:text-gray-700 hover:bg-gray-50 rounded transition-colors text-center\"\n >\n ··· Load more\n </button>\n )}\n </div>\n );\n}\n"],"names":["
|
|
1
|
+
{"version":3,"file":"menu-list.cjs","sources":["../../../../../src/chat-ui/mentions/suggestions/components/menu-list.tsx"],"sourcesContent":["/**\n * Scrollable list of menu items with loading and empty states.\n */\n\nimport type { LabelCopy } from \"@athenaintel/agent-runtime/offline-status\";\nimport { Fragment, useEffect, useRef } from \"react\";\nimport { cn } from \"../../../../lib/utils\";\nimport { MentionMenuSection, type MenuItem } from \"../data/types\";\nimport { MenuItemRow } from \"./menu-item\";\nimport { MenuSkeleton } from \"./menu-skeleton\";\n\n/** Why the list can't load from Athena right now, where results would otherwise be. */\nfunction UnavailableNotice({\n reason,\n compact = false,\n}: {\n reason: LabelCopy;\n compact?: boolean;\n}) {\n return (\n <div\n role=\"status\"\n data-testid=\"mention-search-unavailable\"\n className={cn(\"px-2 text-center\", compact ? \"py-2\" : \"py-9\")}\n >\n <div className={cn(\"text-gray-600\", compact ? \"text-xs\" : \"mb-1 text-sm\")}>\n {reason.label}\n </div>\n <div className=\"text-xs text-gray-400\">{reason.detail}</div>\n </div>\n );\n}\n\nexport function MenuList({\n items,\n selectedIndex,\n isLoading,\n hasMore,\n unavailable = null,\n onSelect,\n onMouseMove,\n onLoadMore,\n}: {\n items: MenuItem[];\n selectedIndex: number;\n isLoading?: boolean;\n hasMore?: boolean;\n /**\n * Why this list can't load from Athena right now: it says so instead of a\n * skeleton, \"No results found\" or \"Load more\"; what is already here still shows.\n */\n unavailable?: LabelCopy | null;\n onSelect: (item: MenuItem) => void;\n onMouseMove: (index: number) => void;\n onLoadMore?: () => void;\n}) {\n const selectedRef = useRef<HTMLDivElement>(null);\n\n // Auto-scroll selected item into view\n useEffect(() => {\n selectedRef.current?.scrollIntoView({ block: \"nearest\" });\n }, [selectedIndex]);\n\n if (unavailable && items.length === 0) {\n return (\n <div className=\"px-1 py-1\">\n <UnavailableNotice reason={unavailable} />\n </div>\n );\n }\n\n if (isLoading && items.length === 0) return <MenuSkeleton />;\n\n if (items.length === 0) {\n return (\n <div className=\"px-1 py-1\">\n <div className=\"px-2 py-9 text-center text-sm text-gray-500\">\n <div className=\"mb-1\">No results found</div>\n <div className=\"text-xs text-gray-400\">Try a different search or go back</div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"px-1 py-1\">\n {items.map((item, index) => {\n const previousSection = items[index - 1]?.menuSection;\n const startsOtherWebpages =\n item.menuSection === MentionMenuSection.OTHER_WEBPAGES &&\n previousSection !== MentionMenuSection.OTHER_WEBPAGES;\n const startsLibrary =\n item.menuSection === MentionMenuSection.LIBRARY &&\n (previousSection === MentionMenuSection.CURRENT_WEBPAGE ||\n previousSection === MentionMenuSection.OTHER_WEBPAGES);\n\n return (\n <Fragment key={item.id}>\n {startsOtherWebpages && (\n <div className=\"px-2 pb-1 pt-2 text-[11px] font-medium uppercase tracking-wide text-gray-400\">\n Other webpages in this group\n </div>\n )}\n {startsLibrary && <div className=\"mx-2 my-1 border-t border-gray-100\" />}\n <div ref={index === selectedIndex ? selectedRef : undefined}>\n <MenuItemRow\n item={item}\n isSelected={index === selectedIndex}\n onMouseMove={() => onMouseMove(index)}\n onClick={() => onSelect(item)}\n showArrow={!!item.navigatesToScope}\n />\n </div>\n </Fragment>\n );\n })}\n\n {/* More would come from Athena, which can't be reached: say so instead */}\n {unavailable && hasMore && <UnavailableNotice reason={unavailable} compact />}\n\n {/* Loading more indicator */}\n {!unavailable && isLoading && items.length > 0 && (\n <div className=\"px-2 py-2 text-center\">\n <span className=\"text-xs text-gray-400\">Loading more...</span>\n </div>\n )}\n\n {/* Load more sentinel */}\n {!unavailable && hasMore && !isLoading && onLoadMore && (\n <button\n type=\"button\"\n onClick={onLoadMore}\n className=\"w-full px-2 py-1.5 text-xs text-gray-500 hover:text-gray-700 hover:bg-gray-50 rounded transition-colors text-center\"\n >\n ··· Load more\n </button>\n )}\n </div>\n );\n}\n"],"names":["jsxs","cn","jsx","useRef","useEffect","MenuSkeleton","MentionMenuSection","Fragment","MenuItemRow"],"mappings":"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"}
|
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Scrollable list of menu items with loading and empty states.
|
|
3
3
|
*/
|
|
4
|
+
import type { LabelCopy } from "../../../../agent-runtime/src/offline-status";
|
|
4
5
|
import { type MenuItem } from "../data/types";
|
|
5
|
-
export declare function MenuList({ items, selectedIndex, isLoading, hasMore, onSelect, onMouseMove, onLoadMore, }: {
|
|
6
|
+
export declare function MenuList({ items, selectedIndex, isLoading, hasMore, unavailable, onSelect, onMouseMove, onLoadMore, }: {
|
|
6
7
|
items: MenuItem[];
|
|
7
8
|
selectedIndex: number;
|
|
8
9
|
isLoading?: boolean;
|
|
9
10
|
hasMore?: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Why this list can't load from Athena right now: it says so instead of a
|
|
13
|
+
* skeleton, "No results found" or "Load more"; what is already here still shows.
|
|
14
|
+
*/
|
|
15
|
+
unavailable?: LabelCopy | null;
|
|
10
16
|
onSelect: (item: MenuItem) => void;
|
|
11
17
|
onMouseMove: (index: number) => void;
|
|
12
18
|
onLoadMore?: () => void;
|
|
@@ -3,11 +3,30 @@ import { useRef, useEffect, Fragment } from "react";
|
|
|
3
3
|
import { MentionMenuSection } from "../data/types.js";
|
|
4
4
|
import { MenuItemRow } from "./menu-item.js";
|
|
5
5
|
import { MenuSkeleton } from "./menu-skeleton.js";
|
|
6
|
+
import { cn } from "cnfast";
|
|
7
|
+
function UnavailableNotice({
|
|
8
|
+
reason,
|
|
9
|
+
compact = false
|
|
10
|
+
}) {
|
|
11
|
+
return /* @__PURE__ */ jsxs(
|
|
12
|
+
"div",
|
|
13
|
+
{
|
|
14
|
+
role: "status",
|
|
15
|
+
"data-testid": "mention-search-unavailable",
|
|
16
|
+
className: cn("px-2 text-center", compact ? "py-2" : "py-9"),
|
|
17
|
+
children: [
|
|
18
|
+
/* @__PURE__ */ jsx("div", { className: cn("text-gray-600", compact ? "text-xs" : "mb-1 text-sm"), children: reason.label }),
|
|
19
|
+
/* @__PURE__ */ jsx("div", { className: "text-xs text-gray-400", children: reason.detail })
|
|
20
|
+
]
|
|
21
|
+
}
|
|
22
|
+
);
|
|
23
|
+
}
|
|
6
24
|
function MenuList({
|
|
7
25
|
items,
|
|
8
26
|
selectedIndex,
|
|
9
27
|
isLoading,
|
|
10
28
|
hasMore,
|
|
29
|
+
unavailable = null,
|
|
11
30
|
onSelect,
|
|
12
31
|
onMouseMove,
|
|
13
32
|
onLoadMore
|
|
@@ -17,6 +36,9 @@ function MenuList({
|
|
|
17
36
|
var _a;
|
|
18
37
|
(_a = selectedRef.current) == null ? void 0 : _a.scrollIntoView({ block: "nearest" });
|
|
19
38
|
}, [selectedIndex]);
|
|
39
|
+
if (unavailable && items.length === 0) {
|
|
40
|
+
return /* @__PURE__ */ jsx("div", { className: "px-1 py-1", children: /* @__PURE__ */ jsx(UnavailableNotice, { reason: unavailable }) });
|
|
41
|
+
}
|
|
20
42
|
if (isLoading && items.length === 0) return /* @__PURE__ */ jsx(MenuSkeleton, {});
|
|
21
43
|
if (items.length === 0) {
|
|
22
44
|
return /* @__PURE__ */ jsx("div", { className: "px-1 py-1", children: /* @__PURE__ */ jsxs("div", { className: "px-2 py-9 text-center text-sm text-gray-500", children: [
|
|
@@ -45,8 +67,9 @@ function MenuList({
|
|
|
45
67
|
) })
|
|
46
68
|
] }, item.id);
|
|
47
69
|
}),
|
|
48
|
-
|
|
49
|
-
|
|
70
|
+
unavailable && hasMore && /* @__PURE__ */ jsx(UnavailableNotice, { reason: unavailable, compact: true }),
|
|
71
|
+
!unavailable && isLoading && items.length > 0 && /* @__PURE__ */ jsx("div", { className: "px-2 py-2 text-center", children: /* @__PURE__ */ jsx("span", { className: "text-xs text-gray-400", children: "Loading more..." }) }),
|
|
72
|
+
!unavailable && hasMore && !isLoading && onLoadMore && /* @__PURE__ */ jsx(
|
|
50
73
|
"button",
|
|
51
74
|
{
|
|
52
75
|
type: "button",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu-list.js","sources":["../../../../../src/chat-ui/mentions/suggestions/components/menu-list.tsx"],"sourcesContent":["/**\n * Scrollable list of menu items with loading and empty states.\n */\n\nimport { Fragment, useEffect, useRef } from \"react\";\nimport { MentionMenuSection, type MenuItem } from \"../data/types\";\nimport { MenuItemRow } from \"./menu-item\";\nimport { MenuSkeleton } from \"./menu-skeleton\";\n\nexport function MenuList({\n items,\n selectedIndex,\n isLoading,\n hasMore,\n onSelect,\n onMouseMove,\n onLoadMore,\n}: {\n items: MenuItem[];\n selectedIndex: number;\n isLoading?: boolean;\n hasMore?: boolean;\n onSelect: (item: MenuItem) => void;\n onMouseMove: (index: number) => void;\n onLoadMore?: () => void;\n}) {\n const selectedRef = useRef<HTMLDivElement>(null);\n\n // Auto-scroll selected item into view\n useEffect(() => {\n selectedRef.current?.scrollIntoView({ block: \"nearest\" });\n }, [selectedIndex]);\n\n if (isLoading && items.length === 0) return <MenuSkeleton />;\n\n if (items.length === 0) {\n return (\n <div className=\"px-1 py-1\">\n <div className=\"px-2 py-9 text-center text-sm text-gray-500\">\n <div className=\"mb-1\">No results found</div>\n <div className=\"text-xs text-gray-400\">Try a different search or go back</div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"px-1 py-1\">\n {items.map((item, index) => {\n const previousSection = items[index - 1]?.menuSection;\n const startsOtherWebpages =\n item.menuSection === MentionMenuSection.OTHER_WEBPAGES &&\n previousSection !== MentionMenuSection.OTHER_WEBPAGES;\n const startsLibrary =\n item.menuSection === MentionMenuSection.LIBRARY &&\n (previousSection === MentionMenuSection.CURRENT_WEBPAGE ||\n previousSection === MentionMenuSection.OTHER_WEBPAGES);\n\n return (\n <Fragment key={item.id}>\n {startsOtherWebpages && (\n <div className=\"px-2 pb-1 pt-2 text-[11px] font-medium uppercase tracking-wide text-gray-400\">\n Other webpages in this group\n </div>\n )}\n {startsLibrary && <div className=\"mx-2 my-1 border-t border-gray-100\" />}\n <div ref={index === selectedIndex ? selectedRef : undefined}>\n <MenuItemRow\n item={item}\n isSelected={index === selectedIndex}\n onMouseMove={() => onMouseMove(index)}\n onClick={() => onSelect(item)}\n showArrow={!!item.navigatesToScope}\n />\n </div>\n </Fragment>\n );\n })}\n\n {/* Loading more indicator */}\n {isLoading && items.length > 0 && (\n <div className=\"px-2 py-2 text-center\">\n <span className=\"text-xs text-gray-400\">Loading more...</span>\n </div>\n )}\n\n {/* Load more sentinel */}\n {hasMore && !isLoading && onLoadMore && (\n <button\n type=\"button\"\n onClick={onLoadMore}\n className=\"w-full px-2 py-1.5 text-xs text-gray-500 hover:text-gray-700 hover:bg-gray-50 rounded transition-colors text-center\"\n >\n ··· Load more\n </button>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"menu-list.js","sources":["../../../../../src/chat-ui/mentions/suggestions/components/menu-list.tsx"],"sourcesContent":["/**\n * Scrollable list of menu items with loading and empty states.\n */\n\nimport type { LabelCopy } from \"@athenaintel/agent-runtime/offline-status\";\nimport { Fragment, useEffect, useRef } from \"react\";\nimport { cn } from \"../../../../lib/utils\";\nimport { MentionMenuSection, type MenuItem } from \"../data/types\";\nimport { MenuItemRow } from \"./menu-item\";\nimport { MenuSkeleton } from \"./menu-skeleton\";\n\n/** Why the list can't load from Athena right now, where results would otherwise be. */\nfunction UnavailableNotice({\n reason,\n compact = false,\n}: {\n reason: LabelCopy;\n compact?: boolean;\n}) {\n return (\n <div\n role=\"status\"\n data-testid=\"mention-search-unavailable\"\n className={cn(\"px-2 text-center\", compact ? \"py-2\" : \"py-9\")}\n >\n <div className={cn(\"text-gray-600\", compact ? \"text-xs\" : \"mb-1 text-sm\")}>\n {reason.label}\n </div>\n <div className=\"text-xs text-gray-400\">{reason.detail}</div>\n </div>\n );\n}\n\nexport function MenuList({\n items,\n selectedIndex,\n isLoading,\n hasMore,\n unavailable = null,\n onSelect,\n onMouseMove,\n onLoadMore,\n}: {\n items: MenuItem[];\n selectedIndex: number;\n isLoading?: boolean;\n hasMore?: boolean;\n /**\n * Why this list can't load from Athena right now: it says so instead of a\n * skeleton, \"No results found\" or \"Load more\"; what is already here still shows.\n */\n unavailable?: LabelCopy | null;\n onSelect: (item: MenuItem) => void;\n onMouseMove: (index: number) => void;\n onLoadMore?: () => void;\n}) {\n const selectedRef = useRef<HTMLDivElement>(null);\n\n // Auto-scroll selected item into view\n useEffect(() => {\n selectedRef.current?.scrollIntoView({ block: \"nearest\" });\n }, [selectedIndex]);\n\n if (unavailable && items.length === 0) {\n return (\n <div className=\"px-1 py-1\">\n <UnavailableNotice reason={unavailable} />\n </div>\n );\n }\n\n if (isLoading && items.length === 0) return <MenuSkeleton />;\n\n if (items.length === 0) {\n return (\n <div className=\"px-1 py-1\">\n <div className=\"px-2 py-9 text-center text-sm text-gray-500\">\n <div className=\"mb-1\">No results found</div>\n <div className=\"text-xs text-gray-400\">Try a different search or go back</div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"px-1 py-1\">\n {items.map((item, index) => {\n const previousSection = items[index - 1]?.menuSection;\n const startsOtherWebpages =\n item.menuSection === MentionMenuSection.OTHER_WEBPAGES &&\n previousSection !== MentionMenuSection.OTHER_WEBPAGES;\n const startsLibrary =\n item.menuSection === MentionMenuSection.LIBRARY &&\n (previousSection === MentionMenuSection.CURRENT_WEBPAGE ||\n previousSection === MentionMenuSection.OTHER_WEBPAGES);\n\n return (\n <Fragment key={item.id}>\n {startsOtherWebpages && (\n <div className=\"px-2 pb-1 pt-2 text-[11px] font-medium uppercase tracking-wide text-gray-400\">\n Other webpages in this group\n </div>\n )}\n {startsLibrary && <div className=\"mx-2 my-1 border-t border-gray-100\" />}\n <div ref={index === selectedIndex ? selectedRef : undefined}>\n <MenuItemRow\n item={item}\n isSelected={index === selectedIndex}\n onMouseMove={() => onMouseMove(index)}\n onClick={() => onSelect(item)}\n showArrow={!!item.navigatesToScope}\n />\n </div>\n </Fragment>\n );\n })}\n\n {/* More would come from Athena, which can't be reached: say so instead */}\n {unavailable && hasMore && <UnavailableNotice reason={unavailable} compact />}\n\n {/* Loading more indicator */}\n {!unavailable && isLoading && items.length > 0 && (\n <div className=\"px-2 py-2 text-center\">\n <span className=\"text-xs text-gray-400\">Loading more...</span>\n </div>\n )}\n\n {/* Load more sentinel */}\n {!unavailable && hasMore && !isLoading && onLoadMore && (\n <button\n type=\"button\"\n onClick={onLoadMore}\n className=\"w-full px-2 py-1.5 text-xs text-gray-500 hover:text-gray-700 hover:bg-gray-50 rounded transition-colors text-center\"\n >\n ··· Load more\n </button>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;;AAYA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA,UAAU;AACZ,GAGG;AACD,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,eAAY;AAAA,MACZ,WAAW,GAAG,oBAAoB,UAAU,SAAS,MAAM;AAAA,MAE3D,UAAA;AAAA,QAAA,oBAAC,OAAA,EAAI,WAAW,GAAG,iBAAiB,UAAU,YAAY,cAAc,GACrE,UAAA,OAAO,MAAA,CACV;AAAA,QACA,oBAAC,OAAA,EAAI,WAAU,yBAAyB,iBAAO,OAAA,CAAO;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAG5D;AAEO,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AACF,GAaG;AACD,QAAM,cAAc,OAAuB,IAAI;AAG/C,YAAU,MAAM;;AACd,sBAAY,YAAZ,mBAAqB,eAAe,EAAE,OAAO;EAC/C,GAAG,CAAC,aAAa,CAAC;AAElB,MAAI,eAAe,MAAM,WAAW,GAAG;AACrC,WACE,oBAAC,SAAI,WAAU,aACb,8BAAC,mBAAA,EAAkB,QAAQ,aAAa,EAAA,CAC1C;AAAA,EAEJ;AAEA,MAAI,aAAa,MAAM,WAAW,EAAG,4BAAQ,cAAA,EAAa;AAE1D,MAAI,MAAM,WAAW,GAAG;AACtB,+BACG,OAAA,EAAI,WAAU,aACb,UAAA,qBAAC,OAAA,EAAI,WAAU,+CACb,UAAA;AAAA,MAAA,oBAAC,OAAA,EAAI,WAAU,QAAO,UAAA,oBAAgB;AAAA,MACtC,oBAAC,OAAA,EAAI,WAAU,yBAAwB,UAAA,oCAAA,CAAiC;AAAA,IAAA,EAAA,CAC1E,EAAA,CACF;AAAA,EAEJ;AAEA,SACE,qBAAC,OAAA,EAAI,WAAU,aACZ,UAAA;AAAA,IAAA,MAAM,IAAI,CAAC,MAAM,UAAU;;AAC1B,YAAM,mBAAkB,WAAM,QAAQ,CAAC,MAAf,mBAAkB;AAC1C,YAAM,sBACJ,KAAK,gBAAgB,mBAAmB,kBACxC,oBAAoB,mBAAmB;AACzC,YAAM,gBACJ,KAAK,gBAAgB,mBAAmB,YACvC,oBAAoB,mBAAmB,mBACtC,oBAAoB,mBAAmB;AAE3C,kCACG,UAAA,EACE,UAAA;AAAA,QAAA,uBACC,oBAAC,OAAA,EAAI,WAAU,gFAA+E,UAAA,gCAE9F;AAAA,QAED,iBAAiB,oBAAC,OAAA,EAAI,WAAU,qCAAA,CAAqC;AAAA,4BACrE,OAAA,EAAI,KAAK,UAAU,gBAAgB,cAAc,QAChD,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC;AAAA,YACA,YAAY,UAAU;AAAA,YACtB,aAAa,MAAM,YAAY,KAAK;AAAA,YACpC,SAAS,MAAM,SAAS,IAAI;AAAA,YAC5B,WAAW,CAAC,CAAC,KAAK;AAAA,UAAA;AAAA,QAAA,EACpB,CACF;AAAA,MAAA,EAAA,GAfa,KAAK,EAgBpB;AAAA,IAEJ,CAAC;AAAA,IAGA,eAAe,WAAW,oBAAC,qBAAkB,QAAQ,aAAa,SAAO,MAAC;AAAA,IAG1E,CAAC,eAAe,aAAa,MAAM,SAAS,KAC3C,oBAAC,OAAA,EAAI,WAAU,yBACb,UAAA,oBAAC,QAAA,EAAK,WAAU,yBAAwB,6BAAe,GACzD;AAAA,IAID,CAAC,eAAe,WAAW,CAAC,aAAa,cACxC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS;AAAA,QACT,WAAU;AAAA,QACX,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAED,GAEJ;AAEJ;"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const
|
|
3
|
+
const require$$0 = require("react");
|
|
4
4
|
function useKeyboardNavigation(ref, opts) {
|
|
5
5
|
const { items, selectedIndex, setSelectedIndex, onSelect, onBack, onClose } = opts;
|
|
6
|
-
|
|
6
|
+
require$$0.useImperativeHandle(
|
|
7
7
|
ref,
|
|
8
8
|
() => ({
|
|
9
9
|
onKeyDown: (event) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-keyboard-navigation.cjs","sources":["../../../../../src/chat-ui/mentions/suggestions/components/use-keyboard-navigation.ts"],"sourcesContent":["/**\n * Keyboard navigation for the mention menu.\n *\n * Exposes an imperative handle so MentionSuggestionList can forward keystrokes\n * from the editor into the menu.\n */\n\nimport type { ForwardedRef } from \"react\";\nimport { useImperativeHandle } from \"react\";\nimport type { MenuItem } from \"../data/types\";\n\nexport interface KeyboardNavigationHandle {\n onKeyDown: (event: KeyboardEvent) => boolean;\n}\n\nexport function useKeyboardNavigation(\n ref: ForwardedRef<KeyboardNavigationHandle>,\n opts: {\n items: MenuItem[];\n selectedIndex: number;\n setSelectedIndex: (index: number) => void;\n onSelect: (item: MenuItem) => void;\n onBack?: () => void;\n onClose: () => void;\n },\n) {\n const { items, selectedIndex, setSelectedIndex, onSelect, onBack, onClose } = opts;\n\n useImperativeHandle(\n ref,\n () => ({\n onKeyDown: (event: KeyboardEvent): boolean => {\n if (items.length === 0 && event.key !== \"Escape\") return false;\n\n switch (event.key) {\n case \"ArrowDown\": {\n const next = (selectedIndex + 1) % items.length;\n setSelectedIndex(next);\n return true;\n }\n case \"ArrowUp\": {\n const prev = (selectedIndex - 1 + items.length) % items.length;\n setSelectedIndex(prev);\n return true;\n }\n case \"Enter\": {\n const item = items[selectedIndex];\n if (item) onSelect(item);\n return true;\n }\n case \"ArrowLeft\": {\n if (onBack) {\n onBack();\n return true;\n }\n return false;\n }\n case \"Backspace\": {\n // Never capture Backspace — let Tiptap handle it naturally.\n // The suggestion plugin closes the popup when you backspace past @.\n return false;\n }\n case \"ArrowRight\": {\n const item = items[selectedIndex];\n if (item?.navigatesToScope) {\n onSelect(item);\n return true;\n }\n return false;\n }\n case \"Escape\": {\n onClose();\n return true;\n }\n default:\n return false;\n }\n },\n }),\n [items, selectedIndex, setSelectedIndex, onSelect, onBack, onClose],\n );\n}\n"],"names":["useImperativeHandle"],"mappings":";;;AAeO,SAAS,sBACd,KACA,MAQA;AACA,QAAM,EAAE,OAAO,eAAe,kBAAkB,UAAU,QAAQ,YAAY;AAE9EA,
|
|
1
|
+
{"version":3,"file":"use-keyboard-navigation.cjs","sources":["../../../../../src/chat-ui/mentions/suggestions/components/use-keyboard-navigation.ts"],"sourcesContent":["/**\n * Keyboard navigation for the mention menu.\n *\n * Exposes an imperative handle so MentionSuggestionList can forward keystrokes\n * from the editor into the menu.\n */\n\nimport type { ForwardedRef } from \"react\";\nimport { useImperativeHandle } from \"react\";\nimport type { MenuItem } from \"../data/types\";\n\nexport interface KeyboardNavigationHandle {\n onKeyDown: (event: KeyboardEvent) => boolean;\n}\n\nexport function useKeyboardNavigation(\n ref: ForwardedRef<KeyboardNavigationHandle>,\n opts: {\n items: MenuItem[];\n selectedIndex: number;\n setSelectedIndex: (index: number) => void;\n onSelect: (item: MenuItem) => void;\n onBack?: () => void;\n onClose: () => void;\n },\n) {\n const { items, selectedIndex, setSelectedIndex, onSelect, onBack, onClose } = opts;\n\n useImperativeHandle(\n ref,\n () => ({\n onKeyDown: (event: KeyboardEvent): boolean => {\n if (items.length === 0 && event.key !== \"Escape\") return false;\n\n switch (event.key) {\n case \"ArrowDown\": {\n const next = (selectedIndex + 1) % items.length;\n setSelectedIndex(next);\n return true;\n }\n case \"ArrowUp\": {\n const prev = (selectedIndex - 1 + items.length) % items.length;\n setSelectedIndex(prev);\n return true;\n }\n case \"Enter\": {\n const item = items[selectedIndex];\n if (item) onSelect(item);\n return true;\n }\n case \"ArrowLeft\": {\n if (onBack) {\n onBack();\n return true;\n }\n return false;\n }\n case \"Backspace\": {\n // Never capture Backspace — let Tiptap handle it naturally.\n // The suggestion plugin closes the popup when you backspace past @.\n return false;\n }\n case \"ArrowRight\": {\n const item = items[selectedIndex];\n if (item?.navigatesToScope) {\n onSelect(item);\n return true;\n }\n return false;\n }\n case \"Escape\": {\n onClose();\n return true;\n }\n default:\n return false;\n }\n },\n }),\n [items, selectedIndex, setSelectedIndex, onSelect, onBack, onClose],\n );\n}\n"],"names":["useImperativeHandle"],"mappings":";;;AAeO,SAAS,sBACd,KACA,MAQA;AACA,QAAM,EAAE,OAAO,eAAe,kBAAkB,UAAU,QAAQ,YAAY;AAE9EA,aAAAA;AAAAA,IACE;AAAA,IACA,OAAO;AAAA,MACL,WAAW,CAAC,UAAkC;AAC5C,YAAI,MAAM,WAAW,KAAK,MAAM,QAAQ,SAAU,QAAO;AAEzD,gBAAQ,MAAM,KAAA;AAAA,UACZ,KAAK,aAAa;AAChB,kBAAM,QAAQ,gBAAgB,KAAK,MAAM;AACzC,6BAAiB,IAAI;AACrB,mBAAO;AAAA,UACT;AAAA,UACA,KAAK,WAAW;AACd,kBAAM,QAAQ,gBAAgB,IAAI,MAAM,UAAU,MAAM;AACxD,6BAAiB,IAAI;AACrB,mBAAO;AAAA,UACT;AAAA,UACA,KAAK,SAAS;AACZ,kBAAM,OAAO,MAAM,aAAa;AAChC,gBAAI,eAAe,IAAI;AACvB,mBAAO;AAAA,UACT;AAAA,UACA,KAAK,aAAa;AAChB,gBAAI,QAAQ;AACV,qBAAA;AACA,qBAAO;AAAA,YACT;AACA,mBAAO;AAAA,UACT;AAAA,UACA,KAAK,aAAa;AAGhB,mBAAO;AAAA,UACT;AAAA,UACA,KAAK,cAAc;AACjB,kBAAM,OAAO,MAAM,aAAa;AAChC,gBAAI,6BAAM,kBAAkB;AAC1B,uBAAS,IAAI;AACb,qBAAO;AAAA,YACT;AACA,mBAAO;AAAA,UACT;AAAA,UACA,KAAK,UAAU;AACb,oBAAA;AACA,mBAAO;AAAA,UACT;AAAA,UACA;AACE,mBAAO;AAAA,QAAA;AAAA,MAEb;AAAA,IAAA;AAAA,IAEF,CAAC,OAAO,eAAe,kBAAkB,UAAU,QAAQ,OAAO;AAAA,EAAA;AAEtE;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const store = require("@tanstack/store");
|
|
4
|
-
const
|
|
4
|
+
const require$$0 = require("react");
|
|
5
5
|
function getCurrentScope(state) {
|
|
6
6
|
const lastEntry = state.scopeStack[state.scopeStack.length - 1];
|
|
7
7
|
return (lastEntry == null ? void 0 : lastEntry.scope) ?? "root";
|
|
@@ -11,7 +11,7 @@ function getSelectedIndex(state) {
|
|
|
11
11
|
return (lastEntry == null ? void 0 : lastEntry.selectedIndex) ?? 0;
|
|
12
12
|
}
|
|
13
13
|
function useMenuNavigation() {
|
|
14
|
-
const [store$1] =
|
|
14
|
+
const [store$1] = require$$0.useState(() => {
|
|
15
15
|
const baseStore = new store.Store({
|
|
16
16
|
scopeStack: [{ scope: "root", selectedIndex: 0 }],
|
|
17
17
|
query: "",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-menu-navigation.cjs","sources":["../../../../../src/chat-ui/mentions/suggestions/components/use-menu-navigation.ts"],"sourcesContent":["import { Store } from '@tanstack/store';\nimport { useState } from 'react';\nimport type { MenuScope } from '../data/types';\n\n/**\n * Stack entry with scope and selected item position\n *\n * When navigating forward, we save the current selectedIndex so we can restore\n * it when navigating back (like browser history).\n */\nexport interface ScopeStackEntry {\n scope: MenuScope;\n selectedIndex: number; // Position of selected item when we left this scope\n breadcrumbLabel?: string; // Display name for this scope, when it isn't a known category\n parentScope?: MenuScope; // Scope we navigated from\n}\n\n/**\n * Menu navigation state - tracks current navigation context\n *\n * This is the \"current UI state\" that changes as user navigates and types.\n * Cleared when menu opens/closes.\n *\n * Uses a navigation stack for proper back button behavior:\n * - Forward navigation: push to stack (with current selectedIndex)\n * - Back navigation: pop from stack (restore selectedIndex)\n * - Current scope: last item in stack\n * - Parent scope: second-to-last item in stack\n */\nexport interface MenuNavigationState {\n // Navigation stack (browser-like history)\n // Example: [{ scope: 'root', selectedIndex: 2 }, { scope: 'folder_123', selectedIndex: 0 }]\n // Current scope = scopeStack[scopeStack.length - 1].scope\n // Parent scope = scopeStack[scopeStack.length - 2].scope\n scopeStack: ScopeStackEntry[];\n\n // Current search query\n query: string;\n\n // Is menu currently active?\n isActive: boolean;\n}\n\n/**\n * Menu navigation store with helper methods\n */\nexport interface MenuNavigationStore extends Store<MenuNavigationState> {\n navigateTo: (\n scope: MenuScope,\n currentSelectedIndex: number,\n options?: { breadcrumbLabel?: string; parentScope?: MenuScope },\n ) => void;\n navigateBack: () => void;\n setQuery: (query: string) => void;\n open: () => void;\n close: () => void;\n}\n\n/**\n * Get current scope from state\n */\nexport function getCurrentScope(state: MenuNavigationState): MenuScope {\n const lastEntry = state.scopeStack[state.scopeStack.length - 1];\n return lastEntry?.scope ?? \"root\";\n}\n\n/**\n * Get parent scope from state (for source inheritance)\n */\nexport function getParentScope(state: MenuNavigationState): MenuScope | undefined {\n if (state.scopeStack.length <= 1) return undefined;\n const parentEntry = state.scopeStack[state.scopeStack.length - 2];\n return parentEntry?.scope;\n}\n\n/**\n * Get selected index from current scope stack entry\n */\nexport function getSelectedIndex(state: MenuNavigationState): number {\n const lastEntry = state.scopeStack[state.scopeStack.length - 1];\n return lastEntry?.selectedIndex ?? 0;\n}\n\n/**\n * useMenuNavigation - Creates per-editor navigation state\n *\n * This is a UI concern - each editor instance gets its own navigation state.\n *\n * Returns a TanStack Store with navigation helper methods.\n */\nexport function useMenuNavigation(): MenuNavigationStore {\n const [store] = useState(() => {\n const baseStore = new Store<MenuNavigationState>({\n scopeStack: [{ scope: 'root', selectedIndex: 0 }],\n query: '',\n isActive: false,\n });\n\n // Extend store with navigation methods\n const navigationStore = baseStore as MenuNavigationStore;\n\n navigationStore.navigateTo = (\n scope: MenuScope,\n currentSelectedIndex: number,\n options?: { breadcrumbLabel?: string; parentScope?: MenuScope },\n ) => {\n const state = baseStore.state;\n\n // Save current selectedIndex in the current entry before navigating forward\n const updatedStack = [...state.scopeStack];\n if (updatedStack.length > 0) {\n updatedStack[updatedStack.length - 1] = {\n ...updatedStack[updatedStack.length - 1],\n selectedIndex: currentSelectedIndex,\n };\n }\n\n // Push new scope with selectedIndex = 0 (start at top of new scope)\n const newStack = [\n ...updatedStack,\n {\n scope,\n selectedIndex: 0,\n breadcrumbLabel: options?.breadcrumbLabel,\n parentScope: options?.parentScope,\n },\n ];\n\n baseStore.setState((prev) => ({\n ...prev,\n scopeStack: newStack,\n query: '',\n }));\n };\n\n navigationStore.navigateBack = () => {\n const state = baseStore.state;\n\n if (state.scopeStack.length <= 1) {\n return;\n }\n\n const newStack = state.scopeStack.slice(0, -1);\n\n baseStore.setState((prev) => ({\n ...prev,\n scopeStack: newStack,\n query: '',\n }));\n };\n\n navigationStore.setQuery = (query: string) => {\n baseStore.setState((prev) => ({ ...prev, query }));\n };\n\n navigationStore.open = () => {\n baseStore.setState(() => ({\n scopeStack: [{ scope: 'root', selectedIndex: 0 }],\n query: '',\n isActive: true,\n }));\n };\n\n navigationStore.close = () => {\n baseStore.setState(() => ({\n scopeStack: [{ scope: 'root', selectedIndex: 0 }],\n query: '',\n isActive: false,\n }));\n };\n\n return navigationStore;\n });\n\n return store;\n}\n"],"names":["store","useState","Store"],"mappings":";;;;AA6DO,SAAS,gBAAgB,OAAuC;AACrE,QAAM,YAAY,MAAM,WAAW,MAAM,WAAW,SAAS,CAAC;AAC9D,UAAO,uCAAW,UAAS;AAC7B;AAcO,SAAS,iBAAiB,OAAoC;AACnE,QAAM,YAAY,MAAM,WAAW,MAAM,WAAW,SAAS,CAAC;AAC9D,UAAO,uCAAW,kBAAiB;AACrC;AASO,SAAS,oBAAyC;AACvD,QAAM,CAACA,OAAK,IAAIC,
|
|
1
|
+
{"version":3,"file":"use-menu-navigation.cjs","sources":["../../../../../src/chat-ui/mentions/suggestions/components/use-menu-navigation.ts"],"sourcesContent":["import { Store } from '@tanstack/store';\nimport { useState } from 'react';\nimport type { MenuScope } from '../data/types';\n\n/**\n * Stack entry with scope and selected item position\n *\n * When navigating forward, we save the current selectedIndex so we can restore\n * it when navigating back (like browser history).\n */\nexport interface ScopeStackEntry {\n scope: MenuScope;\n selectedIndex: number; // Position of selected item when we left this scope\n breadcrumbLabel?: string; // Display name for this scope, when it isn't a known category\n parentScope?: MenuScope; // Scope we navigated from\n}\n\n/**\n * Menu navigation state - tracks current navigation context\n *\n * This is the \"current UI state\" that changes as user navigates and types.\n * Cleared when menu opens/closes.\n *\n * Uses a navigation stack for proper back button behavior:\n * - Forward navigation: push to stack (with current selectedIndex)\n * - Back navigation: pop from stack (restore selectedIndex)\n * - Current scope: last item in stack\n * - Parent scope: second-to-last item in stack\n */\nexport interface MenuNavigationState {\n // Navigation stack (browser-like history)\n // Example: [{ scope: 'root', selectedIndex: 2 }, { scope: 'folder_123', selectedIndex: 0 }]\n // Current scope = scopeStack[scopeStack.length - 1].scope\n // Parent scope = scopeStack[scopeStack.length - 2].scope\n scopeStack: ScopeStackEntry[];\n\n // Current search query\n query: string;\n\n // Is menu currently active?\n isActive: boolean;\n}\n\n/**\n * Menu navigation store with helper methods\n */\nexport interface MenuNavigationStore extends Store<MenuNavigationState> {\n navigateTo: (\n scope: MenuScope,\n currentSelectedIndex: number,\n options?: { breadcrumbLabel?: string; parentScope?: MenuScope },\n ) => void;\n navigateBack: () => void;\n setQuery: (query: string) => void;\n open: () => void;\n close: () => void;\n}\n\n/**\n * Get current scope from state\n */\nexport function getCurrentScope(state: MenuNavigationState): MenuScope {\n const lastEntry = state.scopeStack[state.scopeStack.length - 1];\n return lastEntry?.scope ?? \"root\";\n}\n\n/**\n * Get parent scope from state (for source inheritance)\n */\nexport function getParentScope(state: MenuNavigationState): MenuScope | undefined {\n if (state.scopeStack.length <= 1) return undefined;\n const parentEntry = state.scopeStack[state.scopeStack.length - 2];\n return parentEntry?.scope;\n}\n\n/**\n * Get selected index from current scope stack entry\n */\nexport function getSelectedIndex(state: MenuNavigationState): number {\n const lastEntry = state.scopeStack[state.scopeStack.length - 1];\n return lastEntry?.selectedIndex ?? 0;\n}\n\n/**\n * useMenuNavigation - Creates per-editor navigation state\n *\n * This is a UI concern - each editor instance gets its own navigation state.\n *\n * Returns a TanStack Store with navigation helper methods.\n */\nexport function useMenuNavigation(): MenuNavigationStore {\n const [store] = useState(() => {\n const baseStore = new Store<MenuNavigationState>({\n scopeStack: [{ scope: 'root', selectedIndex: 0 }],\n query: '',\n isActive: false,\n });\n\n // Extend store with navigation methods\n const navigationStore = baseStore as MenuNavigationStore;\n\n navigationStore.navigateTo = (\n scope: MenuScope,\n currentSelectedIndex: number,\n options?: { breadcrumbLabel?: string; parentScope?: MenuScope },\n ) => {\n const state = baseStore.state;\n\n // Save current selectedIndex in the current entry before navigating forward\n const updatedStack = [...state.scopeStack];\n if (updatedStack.length > 0) {\n updatedStack[updatedStack.length - 1] = {\n ...updatedStack[updatedStack.length - 1],\n selectedIndex: currentSelectedIndex,\n };\n }\n\n // Push new scope with selectedIndex = 0 (start at top of new scope)\n const newStack = [\n ...updatedStack,\n {\n scope,\n selectedIndex: 0,\n breadcrumbLabel: options?.breadcrumbLabel,\n parentScope: options?.parentScope,\n },\n ];\n\n baseStore.setState((prev) => ({\n ...prev,\n scopeStack: newStack,\n query: '',\n }));\n };\n\n navigationStore.navigateBack = () => {\n const state = baseStore.state;\n\n if (state.scopeStack.length <= 1) {\n return;\n }\n\n const newStack = state.scopeStack.slice(0, -1);\n\n baseStore.setState((prev) => ({\n ...prev,\n scopeStack: newStack,\n query: '',\n }));\n };\n\n navigationStore.setQuery = (query: string) => {\n baseStore.setState((prev) => ({ ...prev, query }));\n };\n\n navigationStore.open = () => {\n baseStore.setState(() => ({\n scopeStack: [{ scope: 'root', selectedIndex: 0 }],\n query: '',\n isActive: true,\n }));\n };\n\n navigationStore.close = () => {\n baseStore.setState(() => ({\n scopeStack: [{ scope: 'root', selectedIndex: 0 }],\n query: '',\n isActive: false,\n }));\n };\n\n return navigationStore;\n });\n\n return store;\n}\n"],"names":["store","useState","Store"],"mappings":";;;;AA6DO,SAAS,gBAAgB,OAAuC;AACrE,QAAM,YAAY,MAAM,WAAW,MAAM,WAAW,SAAS,CAAC;AAC9D,UAAO,uCAAW,UAAS;AAC7B;AAcO,SAAS,iBAAiB,OAAoC;AACnE,QAAM,YAAY,MAAM,WAAW,MAAM,WAAW,SAAS,CAAC;AAC9D,UAAO,uCAAW,kBAAiB;AACrC;AASO,SAAS,oBAAyC;AACvD,QAAM,CAACA,OAAK,IAAIC,WAAAA,SAAS,MAAM;AAC7B,UAAM,YAAY,IAAIC,YAA2B;AAAA,MAC/C,YAAY,CAAC,EAAE,OAAO,QAAQ,eAAe,GAAG;AAAA,MAChD,OAAO;AAAA,MACP,UAAU;AAAA,IAAA,CACX;AAGD,UAAM,kBAAkB;AAExB,oBAAgB,aAAa,CAC3B,OACA,sBACA,YACG;AACH,YAAM,QAAQ,UAAU;AAGxB,YAAM,eAAe,CAAC,GAAG,MAAM,UAAU;AACzC,UAAI,aAAa,SAAS,GAAG;AAC3B,qBAAa,aAAa,SAAS,CAAC,IAAI;AAAA,UACtC,GAAG,aAAa,aAAa,SAAS,CAAC;AAAA,UACvC,eAAe;AAAA,QAAA;AAAA,MAEnB;AAGA,YAAM,WAAW;AAAA,QACf,GAAG;AAAA,QACH;AAAA,UACE;AAAA,UACA,eAAe;AAAA,UACf,iBAAiB,mCAAS;AAAA,UAC1B,aAAa,mCAAS;AAAA,QAAA;AAAA,MACxB;AAGF,gBAAU,SAAS,CAAC,UAAU;AAAA,QAC5B,GAAG;AAAA,QACH,YAAY;AAAA,QACZ,OAAO;AAAA,MAAA,EACP;AAAA,IACJ;AAEA,oBAAgB,eAAe,MAAM;AACnC,YAAM,QAAQ,UAAU;AAExB,UAAI,MAAM,WAAW,UAAU,GAAG;AAChC;AAAA,MACF;AAEA,YAAM,WAAW,MAAM,WAAW,MAAM,GAAG,EAAE;AAE7C,gBAAU,SAAS,CAAC,UAAU;AAAA,QAC5B,GAAG;AAAA,QACH,YAAY;AAAA,QACZ,OAAO;AAAA,MAAA,EACP;AAAA,IACJ;AAEA,oBAAgB,WAAW,CAAC,UAAkB;AAC5C,gBAAU,SAAS,CAAC,UAAU,EAAE,GAAG,MAAM,QAAQ;AAAA,IACnD;AAEA,oBAAgB,OAAO,MAAM;AAC3B,gBAAU,SAAS,OAAO;AAAA,QACxB,YAAY,CAAC,EAAE,OAAO,QAAQ,eAAe,GAAG;AAAA,QAChD,OAAO;AAAA,QACP,UAAU;AAAA,MAAA,EACV;AAAA,IACJ;AAEA,oBAAgB,QAAQ,MAAM;AAC5B,gBAAU,SAAS,OAAO;AAAA,QACxB,YAAY,CAAC,EAAE,OAAO,QAAQ,eAAe,GAAG;AAAA,QAChD,OAAO;AAAA,QACP,UAAU;AAAA,MAAA,EACV;AAAA,IACJ;AAEA,WAAO;AAAA,EACT,CAAC;AAED,SAAOF;AACT;;;;"}
|
|
@@ -3,7 +3,7 @@ var __defProp = Object.defineProperty;
|
|
|
3
3
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
4
4
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
5
5
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
6
|
-
const
|
|
6
|
+
const require$$0 = require("react");
|
|
7
7
|
function mentionRequestInit(auth) {
|
|
8
8
|
if (auth.accessToken) {
|
|
9
9
|
return { headers: { Authorization: `Bearer ${auth.accessToken}` } };
|
|
@@ -12,9 +12,9 @@ function mentionRequestInit(auth) {
|
|
|
12
12
|
if (auth.credentials) return { headers: {}, credentials: auth.credentials };
|
|
13
13
|
throw new Error("MentionAuthCtx needs either an accessToken or an apiKey");
|
|
14
14
|
}
|
|
15
|
-
const MentionAuthCtx =
|
|
15
|
+
const MentionAuthCtx = require$$0.createContext(null);
|
|
16
16
|
function useMentionAuth() {
|
|
17
|
-
const ctx =
|
|
17
|
+
const ctx = require$$0.useContext(MentionAuthCtx);
|
|
18
18
|
if (!ctx) throw new Error("MentionAuthCtx not provided");
|
|
19
19
|
return ctx;
|
|
20
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.cjs","sources":["../../../../../src/chat-ui/mentions/suggestions/data/api-client.ts"],"sourcesContent":["/**\n * API client for mention data fetching.\n *\n * Wraps raw fetch() with GraphQL support. Hosts authenticate with either a\n * bearer token or a workspace API key; agora's /graphql accepts both.\n */\n\nimport { createContext, useContext } from \"react\";\n\n// ── Auth context ──\n\nexport interface MentionAuthContext {\n backendUrl: string;\n appUrl?: string;\n /** Bearer credential; hosts without one authenticate with `apiKey`. */\n accessToken?: string;\n /**\n * Resolve a current bearer before each query (for rotating Office sessions).\n * Resolving nothing falls back to `accessToken`, then the API key.\n */\n getAccessToken?: () => Promise<string | null | undefined>;\n /**\n * Renew the bearer after the backend refused it (401), for one resend of\n * the query. Without it, or when it resolves nothing, a refused query fails\n * as before.\n */\n renewAccessToken?: () => Promise<string | null | undefined>;\n apiKey?: string;\n /**\n * With neither credential, ride the browser's same-origin session cookie\n * instead of failing — the SDK's AthenaChat, whose REST helpers make the\n * same choice for a host that configured no token and no API key. Hosts\n * that always hold a credential leave this unset so an accidental anonymous\n * query fails loudly.\n */\n credentials?: \"include\";\n workspaceId?: string;\n userId?: string;\n}\n\n/** Credential headers (or the cookie lane) for a mention fetch. */\nexport function mentionRequestInit(\n auth: MentionAuthContext,\n): Pick<RequestInit, \"headers\" | \"credentials\"> {\n if (auth.accessToken) {\n return { headers: { Authorization: `Bearer ${auth.accessToken}` } };\n }\n if (auth.apiKey) return { headers: { \"X-API-KEY\": auth.apiKey } };\n if (auth.credentials) return { headers: {}, credentials: auth.credentials };\n throw new Error(\"MentionAuthCtx needs either an accessToken or an apiKey\");\n}\n\nexport const MentionAuthCtx = createContext<MentionAuthContext | null>(null);\n\nexport function useMentionAuth(): MentionAuthContext {\n const ctx = useContext(MentionAuthCtx);\n if (!ctx) throw new Error(\"MentionAuthCtx not provided\");\n return ctx;\n}\n\n// ── GraphQL client ──\n\n/**\n * What {@link fetchGraphQL} throws: an HTTP failure (`status`) or the first\n * GraphQL error of the response (`code`, its `extensions.code`, e.g. agora's\n * `UNAUTHORIZED` for an asset the caller cannot read).\n */\nexport class AthenaGraphQLError extends Error {\n readonly status: number | null;\n readonly code: string | null;\n\n constructor({\n message,\n status = null,\n code = null,\n }: {\n message: string;\n status?: number | null;\n code?: string | null;\n }) {\n super(message);\n this.name = \"AthenaGraphQLError\";\n this.status = status;\n this.code = code;\n }\n}\n\n/** The `extensions.code` of a GraphQL error entry, when it carries a string one. */\nfunction graphQLErrorCode(entry: unknown): string | null {\n if (typeof entry !== \"object\" || entry === null) return null;\n const extensions: unknown = Reflect.get(entry, \"extensions\");\n if (typeof extensions !== \"object\" || extensions === null) return null;\n const code: unknown = Reflect.get(extensions, \"code\");\n return typeof code === \"string\" ? code : null;\n}\n\nexport async function fetchGraphQL<T = any>(\n auth: MentionAuthContext,\n query: string,\n variables: Record<string, any> = {},\n options: { signal?: AbortSignal } = {},\n): Promise<T> {\n const url = `${auth.backendUrl.replace(/\\/+$/, \"\")}/graphql`;\n const send = (requestAuth: MentionAuthContext) => {\n const { headers, credentials } = mentionRequestInit(requestAuth);\n return fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n ...(credentials ? { credentials } : {}),\n signal: options.signal,\n body: JSON.stringify({ query, variables }),\n });\n };\n const requestAuth = auth.getAccessToken\n ? { ...auth, accessToken: (await auth.getAccessToken()) ?? auth.accessToken }\n : auth;\n let response = await send(requestAuth);\n // A refused bearer gets one renewal and a resend (the statewire transport's\n // `staleAuth` contract); an API-key or cookie request has nothing to renew.\n if (response.status === 401 && requestAuth.accessToken && auth.renewAccessToken) {\n const renewed = await auth.renewAccessToken();\n // The same token again (a static one) would only be refused again.\n if (renewed && renewed !== requestAuth.accessToken) {\n response = await send({ ...auth, accessToken: renewed });\n }\n }\n\n if (!response.ok) {\n throw new AthenaGraphQLError({\n message: `GraphQL HTTP ${response.status}: ${response.statusText}`,\n status: response.status,\n });\n }\n\n const result = await response.json();\n if (result.errors?.length) {\n throw new AthenaGraphQLError({\n message: `GraphQL error: ${result.errors[0].message}`,\n code: graphQLErrorCode(result.errors[0]),\n });\n }\n\n return result.data as T;\n}\n\n// ── GraphQL Queries ──\n\n/**\n * Lightweight asset fragment for mention menu items.\n * Only fetches fields needed for display + navigation.\n */\nconst MENTION_ASSET_FIELDS = `\n id\n title\n athenaOriginalType\n athenaConvertedType\n parentFolderId\n updatedAt\n isFavorited\n isArchived\n isHidden\n`;\n\nexport const SIMPLE_SEARCH_QUERY = `\n query SimpleSearch($input: SimpleSearchRequestInput!) {\n simpleSearch(input: $input) {\n assets {\n ${MENTION_ASSET_FIELDS}\n }\n totalCount\n }\n }\n`;\n\nexport const PAGINATED_ASSETS_QUERY = `\n query GetPaginatedAssetsForWorkspace(\n $limit: Int!\n $offset: Int!\n $parentFolderId: String\n $filterTypes: [String!]\n $filterColumns: ColumnFilter\n ) {\n getPaginatedAssetsForWorkspace(\n limit: $limit\n offset: $offset\n parentFolderId: $parentFolderId\n filterTypes: $filterTypes\n filterColumns: $filterColumns\n ) {\n ${MENTION_ASSET_FIELDS}\n }\n }\n`;\n\nexport const WORKSPACE_MEMBERS_QUERY = `\n query GetUsersInWorkspace($workspaceId: String!) {\n getUsersInWorkspace(workspaceId: $workspaceId) {\n id\n email\n firstName\n lastName\n isAdmin\n avatarUrl\n }\n }\n`;\n\nexport const TOOL_CATALOG_QUERY = `\n query MentionToolCatalog {\n getToolkitToToolsMapping {\n tools {\n id\n name\n description\n icon\n adminOnly\n isMentionable\n }\n toolkits {\n name\n displayName\n description\n icon\n onlyAdmin\n hideFromMenu\n isMentionable\n }\n }\n }\n`;\n\n// ── Response types ──\n\nexport interface ToolCatalogTool {\n id: string;\n name: string;\n description: string | null;\n icon: string;\n adminOnly: boolean;\n isMentionable: boolean;\n}\n\nexport interface ToolCatalogToolkit {\n name: string;\n displayName: string;\n description: string;\n icon: string;\n onlyAdmin: boolean;\n hideFromMenu: boolean;\n isMentionable: boolean;\n}\n\nexport interface ToolCatalogResult {\n getToolkitToToolsMapping: {\n tools: ToolCatalogTool[];\n toolkits: ToolCatalogToolkit[];\n };\n}\n\nexport interface AssetResult {\n id: string;\n title: string | null;\n athenaOriginalType: string | null;\n athenaConvertedType: string | null;\n parentFolderId: string | null;\n updatedAt: string | null;\n isFavorited: boolean | null;\n isArchived: boolean | null;\n isHidden: boolean | null;\n}\n\nexport interface WorkspaceMember {\n id: string;\n email: string | null;\n firstName: string | null;\n lastName: string | null;\n isAdmin: boolean;\n avatarUrl: string | null;\n}\n"],"names":["createContext","useContext","requestAuth"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"api-client.cjs","sources":["../../../../../src/chat-ui/mentions/suggestions/data/api-client.ts"],"sourcesContent":["/**\n * API client for mention data fetching.\n *\n * Wraps raw fetch() with GraphQL support. Hosts authenticate with either a\n * bearer token or a workspace API key; agora's /graphql accepts both.\n */\n\nimport { createContext, useContext } from \"react\";\n\n// ── Auth context ──\n\nexport interface MentionAuthContext {\n backendUrl: string;\n appUrl?: string;\n /** Bearer credential; hosts without one authenticate with `apiKey`. */\n accessToken?: string;\n /**\n * Resolve a current bearer before each query (for rotating Office sessions).\n * Resolving nothing falls back to `accessToken`, then the API key.\n */\n getAccessToken?: () => Promise<string | null | undefined>;\n /**\n * Renew the bearer after the backend refused it (401), for one resend of\n * the query. Without it, or when it resolves nothing, a refused query fails\n * as before.\n */\n renewAccessToken?: () => Promise<string | null | undefined>;\n apiKey?: string;\n /**\n * With neither credential, ride the browser's same-origin session cookie\n * instead of failing — the SDK's AthenaChat, whose REST helpers make the\n * same choice for a host that configured no token and no API key. Hosts\n * that always hold a credential leave this unset so an accidental anonymous\n * query fails loudly.\n */\n credentials?: \"include\";\n workspaceId?: string;\n userId?: string;\n}\n\n/** Credential headers (or the cookie lane) for a mention fetch. */\nexport function mentionRequestInit(\n auth: MentionAuthContext,\n): Pick<RequestInit, \"headers\" | \"credentials\"> {\n if (auth.accessToken) {\n return { headers: { Authorization: `Bearer ${auth.accessToken}` } };\n }\n if (auth.apiKey) return { headers: { \"X-API-KEY\": auth.apiKey } };\n if (auth.credentials) return { headers: {}, credentials: auth.credentials };\n throw new Error(\"MentionAuthCtx needs either an accessToken or an apiKey\");\n}\n\nexport const MentionAuthCtx = createContext<MentionAuthContext | null>(null);\n\nexport function useMentionAuth(): MentionAuthContext {\n const ctx = useContext(MentionAuthCtx);\n if (!ctx) throw new Error(\"MentionAuthCtx not provided\");\n return ctx;\n}\n\n// ── GraphQL client ──\n\n/**\n * What {@link fetchGraphQL} throws: an HTTP failure (`status`) or the first\n * GraphQL error of the response (`code`, its `extensions.code`, e.g. agora's\n * `UNAUTHORIZED` for an asset the caller cannot read).\n */\nexport class AthenaGraphQLError extends Error {\n readonly status: number | null;\n readonly code: string | null;\n\n constructor({\n message,\n status = null,\n code = null,\n }: {\n message: string;\n status?: number | null;\n code?: string | null;\n }) {\n super(message);\n this.name = \"AthenaGraphQLError\";\n this.status = status;\n this.code = code;\n }\n}\n\n/** The `extensions.code` of a GraphQL error entry, when it carries a string one. */\nfunction graphQLErrorCode(entry: unknown): string | null {\n if (typeof entry !== \"object\" || entry === null) return null;\n const extensions: unknown = Reflect.get(entry, \"extensions\");\n if (typeof extensions !== \"object\" || extensions === null) return null;\n const code: unknown = Reflect.get(extensions, \"code\");\n return typeof code === \"string\" ? code : null;\n}\n\nexport async function fetchGraphQL<T = any>(\n auth: MentionAuthContext,\n query: string,\n variables: Record<string, any> = {},\n options: { signal?: AbortSignal } = {},\n): Promise<T> {\n const url = `${auth.backendUrl.replace(/\\/+$/, \"\")}/graphql`;\n const send = (requestAuth: MentionAuthContext) => {\n const { headers, credentials } = mentionRequestInit(requestAuth);\n return fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n ...(credentials ? { credentials } : {}),\n signal: options.signal,\n body: JSON.stringify({ query, variables }),\n });\n };\n const requestAuth = auth.getAccessToken\n ? { ...auth, accessToken: (await auth.getAccessToken()) ?? auth.accessToken }\n : auth;\n let response = await send(requestAuth);\n // A refused bearer gets one renewal and a resend (the statewire transport's\n // `staleAuth` contract); an API-key or cookie request has nothing to renew.\n if (response.status === 401 && requestAuth.accessToken && auth.renewAccessToken) {\n const renewed = await auth.renewAccessToken();\n // The same token again (a static one) would only be refused again.\n if (renewed && renewed !== requestAuth.accessToken) {\n response = await send({ ...auth, accessToken: renewed });\n }\n }\n\n if (!response.ok) {\n throw new AthenaGraphQLError({\n message: `GraphQL HTTP ${response.status}: ${response.statusText}`,\n status: response.status,\n });\n }\n\n const result = await response.json();\n if (result.errors?.length) {\n throw new AthenaGraphQLError({\n message: `GraphQL error: ${result.errors[0].message}`,\n code: graphQLErrorCode(result.errors[0]),\n });\n }\n\n return result.data as T;\n}\n\n// ── GraphQL Queries ──\n\n/**\n * Lightweight asset fragment for mention menu items.\n * Only fetches fields needed for display + navigation.\n */\nconst MENTION_ASSET_FIELDS = `\n id\n title\n athenaOriginalType\n athenaConvertedType\n parentFolderId\n updatedAt\n isFavorited\n isArchived\n isHidden\n`;\n\nexport const SIMPLE_SEARCH_QUERY = `\n query SimpleSearch($input: SimpleSearchRequestInput!) {\n simpleSearch(input: $input) {\n assets {\n ${MENTION_ASSET_FIELDS}\n }\n totalCount\n }\n }\n`;\n\nexport const PAGINATED_ASSETS_QUERY = `\n query GetPaginatedAssetsForWorkspace(\n $limit: Int!\n $offset: Int!\n $parentFolderId: String\n $filterTypes: [String!]\n $filterColumns: ColumnFilter\n ) {\n getPaginatedAssetsForWorkspace(\n limit: $limit\n offset: $offset\n parentFolderId: $parentFolderId\n filterTypes: $filterTypes\n filterColumns: $filterColumns\n ) {\n ${MENTION_ASSET_FIELDS}\n }\n }\n`;\n\nexport const WORKSPACE_MEMBERS_QUERY = `\n query GetUsersInWorkspace($workspaceId: String!) {\n getUsersInWorkspace(workspaceId: $workspaceId) {\n id\n email\n firstName\n lastName\n isAdmin\n avatarUrl\n }\n }\n`;\n\nexport const TOOL_CATALOG_QUERY = `\n query MentionToolCatalog {\n getToolkitToToolsMapping {\n tools {\n id\n name\n description\n icon\n adminOnly\n isMentionable\n }\n toolkits {\n name\n displayName\n description\n icon\n onlyAdmin\n hideFromMenu\n isMentionable\n }\n }\n }\n`;\n\n// ── Response types ──\n\nexport interface ToolCatalogTool {\n id: string;\n name: string;\n description: string | null;\n icon: string;\n adminOnly: boolean;\n isMentionable: boolean;\n}\n\nexport interface ToolCatalogToolkit {\n name: string;\n displayName: string;\n description: string;\n icon: string;\n onlyAdmin: boolean;\n hideFromMenu: boolean;\n isMentionable: boolean;\n}\n\nexport interface ToolCatalogResult {\n getToolkitToToolsMapping: {\n tools: ToolCatalogTool[];\n toolkits: ToolCatalogToolkit[];\n };\n}\n\nexport interface AssetResult {\n id: string;\n title: string | null;\n athenaOriginalType: string | null;\n athenaConvertedType: string | null;\n parentFolderId: string | null;\n updatedAt: string | null;\n isFavorited: boolean | null;\n isArchived: boolean | null;\n isHidden: boolean | null;\n}\n\nexport interface WorkspaceMember {\n id: string;\n email: string | null;\n firstName: string | null;\n lastName: string | null;\n isAdmin: boolean;\n avatarUrl: string | null;\n}\n"],"names":["createContext","useContext","requestAuth"],"mappings":";;;;;;AAyCO,SAAS,mBACd,MAC8C;AAC9C,MAAI,KAAK,aAAa;AACpB,WAAO,EAAE,SAAS,EAAE,eAAe,UAAU,KAAK,WAAW,KAAG;AAAA,EAClE;AACA,MAAI,KAAK,OAAQ,QAAO,EAAE,SAAS,EAAE,aAAa,KAAK,SAAO;AAC9D,MAAI,KAAK,YAAa,QAAO,EAAE,SAAS,CAAA,GAAI,aAAa,KAAK,YAAA;AAC9D,QAAM,IAAI,MAAM,yDAAyD;AAC3E;AAEO,MAAM,iBAAiBA,WAAAA,cAAyC,IAAI;AAEpE,SAAS,iBAAqC;AACnD,QAAM,MAAMC,WAAAA,WAAW,cAAc;AACrC,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,6BAA6B;AACvD,SAAO;AACT;AASO,MAAM,2BAA2B,MAAM;AAAA,EAI5C,YAAY;AAAA,IACV;AAAA,IACA,SAAS;AAAA,IACT,OAAO;AAAA,EAAA,GAKN;AACD,UAAM,OAAO;AAZN;AACA;AAYP,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,OAAO;AAAA,EACd;AACF;AAGA,SAAS,iBAAiB,OAA+B;AACvD,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,QAAM,aAAsB,QAAQ,IAAI,OAAO,YAAY;AAC3D,MAAI,OAAO,eAAe,YAAY,eAAe,KAAM,QAAO;AAClE,QAAM,OAAgB,QAAQ,IAAI,YAAY,MAAM;AACpD,SAAO,OAAO,SAAS,WAAW,OAAO;AAC3C;AAEA,eAAsB,aACpB,MACA,OACA,YAAiC,CAAA,GACjC,UAAoC,IACxB;;AACZ,QAAM,MAAM,GAAG,KAAK,WAAW,QAAQ,QAAQ,EAAE,CAAC;AAClD,QAAM,OAAO,CAACC,iBAAoC;AAChD,UAAM,EAAE,SAAS,gBAAgB,mBAAmBA,YAAW;AAC/D,WAAO,MAAM,KAAK;AAAA,MAChB,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,GAAG;AAAA,MAAA;AAAA,MAEL,GAAI,cAAc,EAAE,YAAA,IAAgB,CAAA;AAAA,MACpC,QAAQ,QAAQ;AAAA,MAChB,MAAM,KAAK,UAAU,EAAE,OAAO,WAAW;AAAA,IAAA,CAC1C;AAAA,EACH;AACA,QAAM,cAAc,KAAK,iBACrB,EAAE,GAAG,MAAM,aAAc,MAAM,KAAK,eAAA,KAAqB,KAAK,gBAC9D;AACJ,MAAI,WAAW,MAAM,KAAK,WAAW;AAGrC,MAAI,SAAS,WAAW,OAAO,YAAY,eAAe,KAAK,kBAAkB;AAC/E,UAAM,UAAU,MAAM,KAAK,iBAAA;AAE3B,QAAI,WAAW,YAAY,YAAY,aAAa;AAClD,iBAAW,MAAM,KAAK,EAAE,GAAG,MAAM,aAAa,SAAS;AAAA,IACzD;AAAA,EACF;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,mBAAmB;AAAA,MAC3B,SAAS,gBAAgB,SAAS,MAAM,KAAK,SAAS,UAAU;AAAA,MAChE,QAAQ,SAAS;AAAA,IAAA,CAClB;AAAA,EACH;AAEA,QAAM,SAAS,MAAM,SAAS,KAAA;AAC9B,OAAI,YAAO,WAAP,mBAAe,QAAQ;AACzB,UAAM,IAAI,mBAAmB;AAAA,MAC3B,SAAS,kBAAkB,OAAO,OAAO,CAAC,EAAE,OAAO;AAAA,MACnD,MAAM,iBAAiB,OAAO,OAAO,CAAC,CAAC;AAAA,IAAA,CACxC;AAAA,EACH;AAEA,SAAO,OAAO;AAChB;AAQA,MAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYtB,MAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA,UAIzB,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAOvB,MAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAe9B,oBAAoB;AAAA;AAAA;AAAA;AAKrB,MAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAahC,MAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;;"}
|
|
@@ -3,12 +3,30 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
const athenaDiagnostics = require("../../../../diagnostics/athena-diagnostics.cjs");
|
|
4
4
|
const itemCache = require("./item-cache.cjs");
|
|
5
5
|
const scopeRegistry = require("./scope-registry.cjs");
|
|
6
|
+
const index = require("./sources/index.cjs");
|
|
7
|
+
const filterItems = require("./utils/filter-items.cjs");
|
|
6
8
|
const MAX_ERROR_RETRIES = 3;
|
|
9
|
+
function unavailableFor(state, scopeId, parentScopeId) {
|
|
10
|
+
if (state.athenaUnavailable === null) return null;
|
|
11
|
+
try {
|
|
12
|
+
const entry = scopeRegistry.getEntry(state.registry, scopeId, parentScopeId);
|
|
13
|
+
return index.sourceAsksAthena(entry.sourceFn) ? state.athenaUnavailable : null;
|
|
14
|
+
} catch {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
7
18
|
function selectItems(store, scope, query, _targetCount, parentScope) {
|
|
8
19
|
const state = store.state;
|
|
9
20
|
const scopeId = typeof scope === "string" ? scope : scope.id;
|
|
10
21
|
const parentScopeId = parentScope ? typeof parentScope === "string" ? parentScope : parentScope.id : void 0;
|
|
11
|
-
const
|
|
22
|
+
const unavailable = unavailableFor(state, scopeId, parentScopeId);
|
|
23
|
+
const cached = itemCache.getFilteredItems(state.cache, scopeId, query);
|
|
24
|
+
const items = unavailable ? withOfflineItems({
|
|
25
|
+
cached,
|
|
26
|
+
offline: offlineItemsFor(state, scopeId, parentScopeId),
|
|
27
|
+
query,
|
|
28
|
+
scopeId
|
|
29
|
+
}) : cached;
|
|
12
30
|
let isFetching = false;
|
|
13
31
|
let hasMore = true;
|
|
14
32
|
try {
|
|
@@ -18,7 +36,41 @@ function selectItems(store, scope, query, _targetCount, parentScope) {
|
|
|
18
36
|
} catch {
|
|
19
37
|
hasMore = false;
|
|
20
38
|
}
|
|
21
|
-
return { items, isFetching, hasMore };
|
|
39
|
+
return { items, isFetching, hasMore, unavailable };
|
|
40
|
+
}
|
|
41
|
+
function offlineItemsFor(state, scopeId, parentScopeId) {
|
|
42
|
+
try {
|
|
43
|
+
return index.offlineItemsOf(scopeRegistry.getEntry(state.registry, scopeId, parentScopeId).sourceFn);
|
|
44
|
+
} catch {
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function withOfflineItems({
|
|
49
|
+
cached,
|
|
50
|
+
offline,
|
|
51
|
+
query,
|
|
52
|
+
scopeId
|
|
53
|
+
}) {
|
|
54
|
+
if (offline.length === 0) return cached;
|
|
55
|
+
const matched = filterItems.filterItems(offline, query);
|
|
56
|
+
const shown = new Set(matched.map((item) => item.id));
|
|
57
|
+
return [...matched, ...cached.filter((item) => !shown.has(item.id))];
|
|
58
|
+
}
|
|
59
|
+
function retryFailedFetches(store) {
|
|
60
|
+
let changed = false;
|
|
61
|
+
for (const entry of Object.values(store.state.registry.entries)) {
|
|
62
|
+
for (const fetchState of Object.values(entry.fetchStates)) {
|
|
63
|
+
const meta = fetchState.meta ?? {};
|
|
64
|
+
const errorAttempts = meta.errorAttempts ?? 0;
|
|
65
|
+
if (fetchState.error === null && errorAttempts === 0) continue;
|
|
66
|
+
fetchState.meta = { ...meta, errorAttempts: 0 };
|
|
67
|
+
if (fetchState.isFetching) continue;
|
|
68
|
+
fetchState.error = null;
|
|
69
|
+
fetchState.hasNextPage = true;
|
|
70
|
+
changed = true;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (changed) store.setState((prev) => ({ ...prev }));
|
|
22
74
|
}
|
|
23
75
|
function triggerFetchIfNeeded(store, scope, query, _targetCount, parentScope) {
|
|
24
76
|
const scopeId = typeof scope === "string" ? scope : scope.id;
|
|
@@ -30,6 +82,7 @@ function triggerFetchIfNeeded(store, scope, query, _targetCount, parentScope) {
|
|
|
30
82
|
} catch {
|
|
31
83
|
return;
|
|
32
84
|
}
|
|
85
|
+
if (state.athenaUnavailable !== null && index.sourceAsksAthena(entry.sourceFn)) return;
|
|
33
86
|
const fetchState = scopeRegistry.getFetchState(state.registry, scopeId, query, parentScopeId);
|
|
34
87
|
if (fetchState.isFetching || !fetchState.hasNextPage || fetchState.error) {
|
|
35
88
|
return;
|
|
@@ -129,6 +182,7 @@ function triggerFetchIfNeeded(store, scope, query, _targetCount, parentScope) {
|
|
|
129
182
|
store.setState((prev) => ({ ...prev }));
|
|
130
183
|
});
|
|
131
184
|
}
|
|
185
|
+
exports.retryFailedFetches = retryFailedFetches;
|
|
132
186
|
exports.selectItems = selectItems;
|
|
133
187
|
exports.triggerFetchIfNeeded = triggerFetchIfNeeded;
|
|
134
188
|
//# sourceMappingURL=orchestrator.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.cjs","sources":["../../../../../src/chat-ui/mentions/suggestions/data/orchestrator.ts"],"sourcesContent":["/**\n * Mention Orchestrator — Async data fetching with registry + cache.\n *\n * selectItems (pure read) + triggerFetchIfNeeded (async fetch).\n */\n\nimport { athenaDiagnostics } from \"../../../../diagnostics/athena-diagnostics\";\nimport type { MenuItem, MenuScope, FetchMetadata, SourceToRegister } from \"./types\";\nimport type { MentionSuggestionsStore, MentionSuggestionsStoreState } from \"./use-mention-suggestions\";\nimport { getFilteredItems, addItems } from \"./item-cache\";\nimport {\n getEntry,\n getFetchState,\n updateFetchState,\n registerSource,\n bindScopes,\n} from \"./scope-registry\";\nimport { filterItems } from \"./utils/filter-items\";\n\n/** Consecutive fetch failures tolerated before a scope+query stops retrying. */\nconst MAX_ERROR_RETRIES = 3;\n\n/**\n * Select items for a given scope + query from the cache.\n * Pure, synchronous read — no side effects.\n */\nexport function selectItems(\n store: MentionSuggestionsStore,\n scope: MenuScope | { id: string },\n query: string,\n _targetCount?: number,\n parentScope?: MenuScope | { id: string },\n): { items: MenuItem[]; isFetching: boolean; hasMore: boolean } {\n const state = store.state;\n const scopeId = typeof scope === \"string\" ? scope : scope.id;\n const parentScopeId = parentScope\n ? typeof parentScope === \"string\" ? parentScope : parentScope.id\n : undefined;\n\n // Read from cache\n const items = getFilteredItems(state.cache, scopeId, query);\n\n // Read fetch state from registry\n let isFetching = false;\n let hasMore = true;\n\n try {\n const fetchState = getFetchState(state.registry, scopeId, query, parentScopeId);\n isFetching = fetchState.isFetching;\n hasMore = fetchState.hasNextPage;\n } catch {\n // Scope not registered — no more to fetch\n hasMore = false;\n }\n\n return { items, isFetching, hasMore };\n}\n\n/**\n * Trigger an async fetch if needed.\n * Called by useMenuItems when cache < target AND hasMore AND !fetching.\n */\nexport function triggerFetchIfNeeded(\n store: MentionSuggestionsStore,\n scope: MenuScope | { id: string },\n query: string,\n _targetCount?: number,\n parentScope?: MenuScope | { id: string },\n): void {\n const scopeId = typeof scope === \"string\" ? scope : scope.id;\n const parentScopeId = parentScope\n ? typeof parentScope === \"string\" ? parentScope : parentScope.id\n : undefined;\n\n const state = store.state;\n\n // Check if scope is registered\n let entry;\n try {\n entry = getEntry(state.registry, scopeId, parentScopeId);\n } catch {\n return; // Not registered, nothing to fetch\n }\n\n // Check fetch state\n const fetchState = getFetchState(state.registry, scopeId, query, parentScopeId);\n if (fetchState.isFetching || !fetchState.hasNextPage || fetchState.error) {\n return;\n }\n\n // Safety limit\n const meta = (fetchState.meta as FetchMetadata) || {};\n if ((meta.fetchAttempts || 0) >= 10) return;\n\n // Mark as fetching\n updateFetchState(state.registry, scopeId, query, { isFetching: true }, parentScopeId);\n store.setState((prev) => ({ ...prev }));\n\n // Async fetch\n const sourceFn = entry.sourceFn;\n const sourceConfig = entry.sourceConfig;\n\n sourceFn({\n scope: scopeId,\n query,\n fetchState,\n sourceConfig,\n })\n .then((result) => {\n const currentState = store.state;\n\n // Add items to cache with scope tagging\n addItems(currentState.cache, result.items, scopeId);\n\n // Register dynamically discovered sources\n if (result.sources) {\n for (const src of result.sources) {\n try {\n getEntry(currentState.registry, src.scope);\n } catch {\n // Not registered yet — register it\n registerSource(\n currentState.registry,\n src.scope,\n src.sourceFn,\n src.sourceConfig,\n src.isFlat,\n );\n }\n }\n }\n\n // Register dynamically discovered bindings\n if (result.bindings) {\n for (const binding of result.bindings) {\n bindScopes(currentState.registry, binding.browseScope, binding.searchScope);\n }\n }\n\n // Update fetch state\n const currentMeta = (fetchState.meta as FetchMetadata) || {};\n // Advance the server-side offset by the rows the source consumed, which\n // exceeds `items.length` whenever a source drops rows after fetching.\n const consumed = result.pagination?.consumedCount ?? result.items.length;\n const newValidated = (currentMeta.validatedCount || 0) + consumed;\n\n updateFetchState(\n currentState.registry,\n scopeId,\n query,\n {\n isFetching: false,\n hasNextPage: result.pagination?.hasMore ?? false,\n error: null,\n meta: {\n ...currentMeta,\n ...result.meta,\n validatedCount: newValidated,\n fetchAttempts: (currentMeta.fetchAttempts || 0) + 1,\n errorAttempts: 0,\n },\n },\n parentScopeId,\n );\n\n // Trigger re-render\n store.setState((prev) => ({ ...prev }));\n })\n .catch((error) => {\n const currentState = store.state;\n const currentMeta = (fetchState.meta as FetchMetadata) || {};\n const errorAttempts = ((currentMeta.errorAttempts as number) || 0) + 1;\n const retriable = errorAttempts < MAX_ERROR_RETRIES;\n\n // Retriable failures are a warning on the bus; the final one is an\n // error and also lands in the scope's fetch state below.\n if (retriable) {\n athenaDiagnostics.emit(\"mentions.fetch.error\", {\n level: \"warn\",\n data: {\n scopeId,\n attempt: errorAttempts,\n retriable,\n error: error instanceof Error ? error.message : String(error),\n },\n });\n } else {\n athenaDiagnostics.error(\n \"mentions.fetch.error\",\n error,\n { code: \"mentions_fetch_failed\", message: `Mention suggestions failed for ${scopeId}` },\n { scopeId, attempt: errorAttempts, retriable },\n );\n }\n\n updateFetchState(\n currentState.registry,\n scopeId,\n query,\n {\n isFetching: false,\n hasNextPage: retriable,\n error: retriable\n ? null\n : error instanceof Error\n ? error\n : new Error(String(error)),\n meta: { ...currentMeta, errorAttempts },\n },\n parentScopeId,\n );\n\n store.setState((prev) => ({ ...prev }));\n });\n}\n"],"names":["getFilteredItems","getFetchState","getEntry","updateFetchState","addItems","registerSource","bindScopes","athenaDiagnostics"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"orchestrator.cjs","sources":["../../../../../src/chat-ui/mentions/suggestions/data/orchestrator.ts"],"sourcesContent":["/**\n * Mention Orchestrator — Async data fetching with registry + cache.\n *\n * selectItems (pure read) + triggerFetchIfNeeded (async fetch).\n */\n\nimport type { LabelCopy } from \"@athenaintel/agent-runtime/offline-status\";\nimport { athenaDiagnostics } from \"../../../../diagnostics/athena-diagnostics\";\nimport type { MenuItem, MenuScope, FetchMetadata, SourceToRegister } from \"./types\";\nimport type { MentionSuggestionsStore, MentionSuggestionsStoreState } from \"./use-mention-suggestions\";\nimport { getFilteredItems, addItems } from \"./item-cache\";\nimport {\n getEntry,\n getFetchState,\n updateFetchState,\n registerSource,\n bindScopes,\n} from \"./scope-registry\";\nimport { offlineItemsOf, sourceAsksAthena } from \"./sources\";\nimport { filterItems } from \"./utils/filter-items\";\n\n/** Consecutive fetch failures tolerated before a scope+query stops retrying. */\nconst MAX_ERROR_RETRIES = 3;\n\n/**\n * Why a scope's items can't be asked of Athena right now: the store's reason\n * while its source asks Athena, `null` for the host's own items (or while\n * Athena answers).\n */\nfunction unavailableFor(\n state: MentionSuggestionsStoreState,\n scopeId: string,\n parentScopeId: string | undefined,\n): LabelCopy | null {\n if (state.athenaUnavailable === null) return null;\n try {\n const entry = getEntry(state.registry, scopeId, parentScopeId);\n return sourceAsksAthena(entry.sourceFn) ? state.athenaUnavailable : null;\n } catch {\n return null; // Not registered: nothing would be fetched anyway.\n }\n}\n\n/**\n * Select items for a given scope + query from the cache.\n * Pure, synchronous read — no side effects.\n */\nexport function selectItems(\n store: MentionSuggestionsStore,\n scope: MenuScope | { id: string },\n query: string,\n _targetCount?: number,\n parentScope?: MenuScope | { id: string },\n): {\n items: MenuItem[];\n isFetching: boolean;\n hasMore: boolean;\n /** Why this scope can't load more right now; what is already here still shows. */\n unavailable: LabelCopy | null;\n} {\n const state = store.state;\n const scopeId = typeof scope === \"string\" ? scope : scope.id;\n const parentScopeId = parentScope\n ? typeof parentScope === \"string\" ? parentScope : parentScope.id\n : undefined;\n\n // Read from cache; while Athena can't be reached, a scope that asks it still lists the host's own\n // items its source carries (a root search's host tools), matched as the cache's are, never fetched.\n const unavailable = unavailableFor(state, scopeId, parentScopeId);\n const cached = getFilteredItems(state.cache, scopeId, query);\n const items = unavailable\n ? withOfflineItems({\n cached,\n offline: offlineItemsFor(state, scopeId, parentScopeId),\n query,\n scopeId,\n })\n : cached;\n\n // Read fetch state from registry\n let isFetching = false;\n let hasMore = true;\n\n try {\n const fetchState = getFetchState(state.registry, scopeId, query, parentScopeId);\n isFetching = fetchState.isFetching;\n hasMore = fetchState.hasNextPage;\n } catch {\n // Scope not registered — no more to fetch\n hasMore = false;\n }\n\n return { items, isFetching, hasMore, unavailable };\n}\n\n/** The host's own items a scope's source can list while Athena can't be reached (none if unknown). */\nfunction offlineItemsFor(\n state: MentionSuggestionsStoreState,\n scopeId: string,\n parentScopeId: string | undefined,\n): MenuItem[] {\n try {\n return offlineItemsOf(getEntry(state.registry, scopeId, parentScopeId).sourceFn);\n } catch {\n return [];\n }\n}\n\n/** The host's own items that match `query` first, then what the cache already holds, once each. */\nfunction withOfflineItems({\n cached,\n offline,\n query,\n scopeId,\n}: {\n cached: MenuItem[];\n offline: MenuItem[];\n query: string;\n scopeId: string;\n}): MenuItem[] {\n if (offline.length === 0) return cached;\n const matched = filterItems(offline, query, scopeId);\n const shown = new Set(matched.map((item) => item.id));\n return [...matched, ...cached.filter((item) => !shown.has(item.id))];\n}\n\n/**\n * Lookups that failed — a scope+query that gave up after its retries, or one\n * still counting failures — may run again: once Athena can be reached after it\n * couldn't, a search that failed meanwhile isn't left saying \"No results\". A\n * lookup still in flight keeps running, with its count of failures cleared, so\n * that if it fails after all it is a first failure and is retried, not a third\n * that gives up. Called once per return, so it adds no loop.\n */\nexport function retryFailedFetches(store: MentionSuggestionsStore): void {\n let changed = false;\n for (const entry of Object.values(store.state.registry.entries)) {\n for (const fetchState of Object.values(entry.fetchStates)) {\n const meta = (fetchState.meta as FetchMetadata | null) ?? {};\n const errorAttempts = (meta.errorAttempts as number | undefined) ?? 0;\n if (fetchState.error === null && errorAttempts === 0) continue;\n // Read by the failure handler of the lookup in flight; nothing to show yet.\n fetchState.meta = { ...meta, errorAttempts: 0 };\n if (fetchState.isFetching) continue;\n fetchState.error = null;\n fetchState.hasNextPage = true;\n changed = true;\n }\n }\n if (changed) store.setState((prev) => ({ ...prev }));\n}\n\n/**\n * Trigger an async fetch if needed.\n * Called by useMenuItems when cache < target AND hasMore AND !fetching.\n */\nexport function triggerFetchIfNeeded(\n store: MentionSuggestionsStore,\n scope: MenuScope | { id: string },\n query: string,\n _targetCount?: number,\n parentScope?: MenuScope | { id: string },\n): void {\n const scopeId = typeof scope === \"string\" ? scope : scope.id;\n const parentScopeId = parentScope\n ? typeof parentScope === \"string\" ? parentScope : parentScope.id\n : undefined;\n\n const state = store.state;\n\n // Check if scope is registered\n let entry;\n try {\n entry = getEntry(state.registry, scopeId, parentScopeId);\n } catch {\n return; // Not registered, nothing to fetch\n }\n\n // Athena can't be reached: nothing is asked of it (the host's own items still load).\n if (state.athenaUnavailable !== null && sourceAsksAthena(entry.sourceFn)) return;\n\n // Check fetch state\n const fetchState = getFetchState(state.registry, scopeId, query, parentScopeId);\n if (fetchState.isFetching || !fetchState.hasNextPage || fetchState.error) {\n return;\n }\n\n // Safety limit\n const meta = (fetchState.meta as FetchMetadata) || {};\n if ((meta.fetchAttempts || 0) >= 10) return;\n\n // Mark as fetching\n updateFetchState(state.registry, scopeId, query, { isFetching: true }, parentScopeId);\n store.setState((prev) => ({ ...prev }));\n\n // Async fetch\n const sourceFn = entry.sourceFn;\n const sourceConfig = entry.sourceConfig;\n\n sourceFn({\n scope: scopeId,\n query,\n fetchState,\n sourceConfig,\n })\n .then((result) => {\n const currentState = store.state;\n\n // Add items to cache with scope tagging\n addItems(currentState.cache, result.items, scopeId);\n\n // Register dynamically discovered sources\n if (result.sources) {\n for (const src of result.sources) {\n try {\n getEntry(currentState.registry, src.scope);\n } catch {\n // Not registered yet — register it\n registerSource(\n currentState.registry,\n src.scope,\n src.sourceFn,\n src.sourceConfig,\n src.isFlat,\n );\n }\n }\n }\n\n // Register dynamically discovered bindings\n if (result.bindings) {\n for (const binding of result.bindings) {\n bindScopes(currentState.registry, binding.browseScope, binding.searchScope);\n }\n }\n\n // Update fetch state\n const currentMeta = (fetchState.meta as FetchMetadata) || {};\n // Advance the server-side offset by the rows the source consumed, which\n // exceeds `items.length` whenever a source drops rows after fetching.\n const consumed = result.pagination?.consumedCount ?? result.items.length;\n const newValidated = (currentMeta.validatedCount || 0) + consumed;\n\n updateFetchState(\n currentState.registry,\n scopeId,\n query,\n {\n isFetching: false,\n hasNextPage: result.pagination?.hasMore ?? false,\n error: null,\n meta: {\n ...currentMeta,\n ...result.meta,\n validatedCount: newValidated,\n fetchAttempts: (currentMeta.fetchAttempts || 0) + 1,\n errorAttempts: 0,\n },\n },\n parentScopeId,\n );\n\n // Trigger re-render\n store.setState((prev) => ({ ...prev }));\n })\n .catch((error) => {\n const currentState = store.state;\n const currentMeta = (fetchState.meta as FetchMetadata) || {};\n const errorAttempts = ((currentMeta.errorAttempts as number) || 0) + 1;\n const retriable = errorAttempts < MAX_ERROR_RETRIES;\n\n // Retriable failures are a warning on the bus; the final one is an\n // error and also lands in the scope's fetch state below.\n if (retriable) {\n athenaDiagnostics.emit(\"mentions.fetch.error\", {\n level: \"warn\",\n data: {\n scopeId,\n attempt: errorAttempts,\n retriable,\n error: error instanceof Error ? error.message : String(error),\n },\n });\n } else {\n athenaDiagnostics.error(\n \"mentions.fetch.error\",\n error,\n { code: \"mentions_fetch_failed\", message: `Mention suggestions failed for ${scopeId}` },\n { scopeId, attempt: errorAttempts, retriable },\n );\n }\n\n updateFetchState(\n currentState.registry,\n scopeId,\n query,\n {\n isFetching: false,\n hasNextPage: retriable,\n error: retriable\n ? null\n : error instanceof Error\n ? error\n : new Error(String(error)),\n meta: { ...currentMeta, errorAttempts },\n },\n parentScopeId,\n );\n\n store.setState((prev) => ({ ...prev }));\n });\n}\n"],"names":["getEntry","sourceAsksAthena","getFilteredItems","getFetchState","offlineItemsOf","filterItems","updateFetchState","addItems","registerSource","bindScopes","athenaDiagnostics"],"mappings":"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"}
|