@athenaintel/react 0.43.0 → 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 +215 -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/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 +14 -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 -25
- 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 -25
- 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 +547 -124
- package/dist/agent-runtime/src/use-deep-agent-voice.cjs.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-voice.d.ts +129 -10
- package/dist/agent-runtime/src/use-deep-agent-voice.js +487 -64
- 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 +52 -36
- package/dist/chat/super-grouping/SuperGroupingCard.cjs.map +1 -1
- package/dist/chat/super-grouping/SuperGroupingCard.d.ts +19 -4
- package/dist/chat/super-grouping/SuperGroupingCard.js +29 -13
- 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 +73 -40
- package/dist/chat/super-grouping/ToolTimeline.cjs.map +1 -1
- package/dist/chat/super-grouping/ToolTimeline.d.ts +10 -2
- package/dist/chat/super-grouping/ToolTimeline.js +69 -36
- 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 +5 -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/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 +4 -4
- package/dist/chat-ui/mentions/mention-chip.cjs.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 +3 -3
- package/dist/chat-ui/mentions/use-mention-asset.cjs.map +1 -1
- 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 +2 -2
- package/dist/chat-ui/rich-text/chat-link.cjs.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 +6 -6
- package/dist/chat-ui/rich-text/chat-node-views.cjs.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/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 +51 -51
- package/dist/threads/statewire-thread-list.cjs.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-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":"conversation-history-panel.cjs","sources":["../../../src/chat-ui/header/conversation-history-panel.tsx"],"sourcesContent":["import type { ConversationSummary } from \"@athenaintel/agent-runtime\";\nimport {\n ArchiveIcon,\n BotIcon,\n LoaderCircleIcon,\n MessageSquareIcon,\n PlusIcon,\n RefreshCwIcon,\n SearchIcon,\n} from \"lucide-react\";\nimport {\n type ChangeEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { conversationDisplayTitle } from \"../../threads/use-rest-conversation-history\";\nimport { assetTypeToThumb } from \"../mentions/suggestions/data/sources/asset-type-icons\";\n\nexport type ConversationActivityFilter = \"all\" | \"chat\" | \"automated\";\nexport type ConversationTimeGroup =\n | \"Today\"\n | \"Yesterday\"\n | \"This Week\"\n | \"This Month\"\n | \"Older\";\n\nconst TIME_GROUPS: readonly ConversationTimeGroup[] = [\n \"Today\",\n \"Yesterday\",\n \"This Week\",\n \"This Month\",\n \"Older\",\n];\n\nconst AUTOMATED_SOURCE_CHANNELS = new Set([\n \"api\",\n \"email\",\n \"orchestration\",\n \"slack\",\n \"sms\",\n \"task\",\n \"teams\",\n]);\n\n/** Mirrors Agora's persisted background-run classification for list metadata. */\nexport function isAutomatedConversation(\n conversation: Pick<ConversationSummary, \"sourceChannel\" | \"triggerType\">,\n): boolean {\n const sourceChannel = conversation.sourceChannel?.trim().toLowerCase();\n if (sourceChannel && AUTOMATED_SOURCE_CHANNELS.has(sourceChannel))\n return true;\n const triggerType = conversation.triggerType?.trim().toLowerCase();\n return Boolean(triggerType && triggerType !== \"manual\");\n}\n\nexport function conversationTimeGroup(\n value: string,\n now: Date = new Date(),\n): ConversationTimeGroup {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return \"Older\";\n const startOfToday = new Date(\n now.getFullYear(),\n now.getMonth(),\n now.getDate(),\n );\n const startOfYesterday = new Date(startOfToday.getTime() - 86_400_000);\n const startOfWeek = new Date(\n startOfToday.getTime() - startOfToday.getDay() * 86_400_000,\n );\n const startOfMonth = new Date(now.getFullYear(), now.getMonth(), 1);\n if (date >= startOfToday) return \"Today\";\n if (date >= startOfYesterday) return \"Yesterday\";\n if (date >= startOfWeek) return \"This Week\";\n if (date >= startOfMonth) return \"This Month\";\n return \"Older\";\n}\n\nexport interface ConversationHistoryPanelProps {\n conversations: readonly ConversationSummary[];\n activeThreadId: string;\n search: string;\n onSearchChange: (search: string) => void;\n activityFilter: ConversationActivityFilter;\n onActivityFilterChange: (filter: ConversationActivityFilter) => void;\n originFilter: string;\n onOriginFilterChange: (origin: string) => void;\n onSelect: (threadId: string) => void;\n onNewChat: () => void;\n onRefresh: () => void;\n onArchive: (threadId: string) => void;\n onSetReadState: (threadId: string, isUnread: boolean) => void;\n isLoading?: boolean;\n isRefreshing?: boolean;\n hasNextPage?: boolean;\n isFetchingNextPage?: boolean;\n onLoadMore?: () => void;\n /**\n * The pointer has rested on a conversation row for `hoverIntentDelayMs`:\n * the user is likely to open it next. Hosts wake and pre-dial the thread\n * here so the click lands on a warm instance with its hello in hand.\n */\n onHoverIntent?: (threadId: string) => void;\n /** The pointer left a row whose intent had fired. */\n onHoverIntentEnd?: (threadId: string) => void;\n /** Dwell before a hover counts as intent; a pass-through never fires. */\n hoverIntentDelayMs?: number;\n}\n\nfunction originKey(conversation: ConversationSummary): string {\n return conversation.appId ?? conversation.sourceChannel ?? \"unknown\";\n}\n\nfunction originLabel(value: string): string {\n const normalized = value.toLowerCase();\n if (normalized.includes(\"chrome\")) return \"Chrome\";\n if (normalized.includes(\"powerpoint\")) return \"PowerPoint\";\n if (normalized.includes(\"word\")) return \"Word\";\n if (normalized.includes(\"excel\")) return \"Excel\";\n if (normalized.includes(\"office\")) return \"Office\";\n if (normalized === \"web\" || normalized.includes(\"olympus\")) return \"Athena\";\n if (normalized.includes(\"mobile\")) return \"Mobile\";\n if (value === \"unknown\") return \"Legacy\";\n return value.replace(/^athena[-_]/, \"\").replaceAll(\"_\", \" \");\n}\n\nfunction relativeTime(value: string): string {\n const timestamp = Date.parse(value);\n if (!Number.isFinite(timestamp)) return \"\";\n const elapsed = Math.max(0, Date.now() - timestamp);\n const minutes = Math.floor(elapsed / 60_000);\n if (minutes < 1) return \"<1m ago\";\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ${minutes % 60}m ago`;\n const days = Math.floor(hours / 24);\n return days < 7 ? `${days}d ago` : new Date(timestamp).toLocaleDateString();\n}\n\nfunction ConversationTypeIcon({\n conversation,\n automated,\n}: {\n conversation: ConversationSummary;\n automated: boolean;\n}) {\n if (conversation.state === \"running\") {\n return (\n <LoaderCircleIcon\n aria-label=\"Conversation running\"\n className=\"mt-0.5 size-4 shrink-0 animate-spin text-primary\"\n />\n );\n }\n const thumbnail = assetTypeToThumb(conversation.assetType ?? \"session\");\n if (thumbnail) {\n return <img src={thumbnail} alt=\"\" className=\"mt-0.5 size-4 shrink-0\" />;\n }\n return automated ? (\n <BotIcon className=\"mt-0.5 size-4 shrink-0 text-primary\" />\n ) : (\n <MessageSquareIcon className=\"mt-0.5 size-4 shrink-0 text-emerald-500\" />\n );\n}\n\nexport function ConversationHistoryPanel({\n conversations,\n activeThreadId,\n search,\n onSearchChange,\n activityFilter,\n onActivityFilterChange,\n originFilter,\n onOriginFilterChange,\n onSelect,\n onNewChat,\n onRefresh,\n onArchive,\n onSetReadState,\n isLoading = false,\n isRefreshing = false,\n hasNextPage = false,\n isFetchingNextPage = false,\n onLoadMore,\n onHoverIntent,\n onHoverIntentEnd,\n hoverIntentDelayMs = 150,\n}: ConversationHistoryPanelProps) {\n // Hover intent: one dwell timer for the row under the pointer; a row the\n // pointer merely crosses never fires. The id whose intent fired is kept so\n // its end is reported exactly once — on leave, when the row disappears\n // (filter, archive, refresh) or when the panel closes under the pointer.\n // The callbacks are read through refs so an inline handler's identity\n // changing on a parent re-render neither re-arms nor ends anything.\n const hoverTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const hoverIntentThreadId = useRef<string | null>(null);\n const onHoverIntentRef = useRef(onHoverIntent);\n onHoverIntentRef.current = onHoverIntent;\n const onHoverIntentEndRef = useRef(onHoverIntentEnd);\n onHoverIntentEndRef.current = onHoverIntentEnd;\n const cancelHoverTimer = useCallback(() => {\n if (hoverTimer.current === null) return;\n clearTimeout(hoverTimer.current);\n hoverTimer.current = null;\n }, []);\n const endHoverIntent = useCallback(() => {\n const threadId = hoverIntentThreadId.current;\n if (threadId === null) return;\n hoverIntentThreadId.current = null;\n onHoverIntentEndRef.current?.(threadId);\n }, []);\n useEffect(\n () => () => {\n cancelHoverTimer();\n endHoverIntent();\n },\n [cancelHoverTimer, endHoverIntent],\n );\n const handleRowEnter = (threadId: string) => {\n if (!onHoverIntentRef.current) return;\n cancelHoverTimer();\n hoverTimer.current = setTimeout(() => {\n hoverTimer.current = null;\n hoverIntentThreadId.current = threadId;\n onHoverIntentRef.current?.(threadId);\n }, hoverIntentDelayMs);\n };\n const handleRowLeave = (threadId: string) => {\n cancelHoverTimer();\n if (hoverIntentThreadId.current !== threadId) return;\n endHoverIntent();\n };\n const origins = useMemo(\n () => [...new Set(conversations.map(originKey))].sort(),\n [conversations],\n );\n const grouped = useMemo(() => {\n const visible = conversations.filter((conversation) => {\n const automated = isAutomatedConversation(conversation);\n if (activityFilter === \"chat\" && automated) return false;\n if (activityFilter === \"automated\" && !automated) return false;\n return originFilter === \"all\" || originKey(conversation) === originFilter;\n });\n const byGroup = new Map<ConversationTimeGroup, ConversationSummary[]>();\n for (const conversation of visible) {\n const group = conversationTimeGroup(conversation.updatedAt);\n const items = byGroup.get(group) ?? [];\n items.push(conversation);\n byGroup.set(group, items);\n }\n return TIME_GROUPS.flatMap((group) => {\n const items = byGroup.get(group);\n return items ? [{ group, items }] : [];\n });\n }, [activityFilter, conversations, originFilter]);\n // The hovered row left the list (filter, archive, refresh): no leave event\n // will come for it, so its intent ends here.\n useEffect(() => {\n const threadId = hoverIntentThreadId.current;\n if (threadId === null) return;\n const stillVisible = grouped.some(({ items }) =>\n items.some((conversation) => conversation.threadId === threadId),\n );\n if (!stillVisible) endHoverIntent();\n }, [grouped, endHoverIntent]);\n const visibleCount = grouped.reduce(\n (count, group) => count + group.items.length,\n 0,\n );\n const handleSearch = (event: ChangeEvent<HTMLInputElement>) =>\n onSearchChange(event.target.value);\n\n return (\n <section\n aria-label=\"Conversation history\"\n className=\"border-b border-border bg-background px-2 pb-2\"\n data-testid=\"conversation-history-panel\"\n >\n <div className=\"flex h-10 items-center gap-1.5 px-1\">\n <h2 className=\"text-[11px] font-semibold uppercase tracking-[0.08em] text-muted-foreground\">\n Sessions\n </h2>\n <button\n type=\"button\"\n aria-label=\"Refresh sessions\"\n title=\"Refresh sessions\"\n disabled={isRefreshing}\n onClick={onRefresh}\n className=\"ml-auto rounded-md p-1.5 text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-50\"\n >\n <RefreshCwIcon\n className={cn(\"size-3.5\", isRefreshing && \"animate-spin\")}\n />\n </button>\n <button\n type=\"button\"\n onClick={onNewChat}\n className=\"flex h-7 shrink-0 items-center gap-1 rounded-md bg-primary px-2 text-[11px] font-medium text-primary-foreground\"\n >\n <PlusIcon className=\"size-3\" /> New\n </button>\n </div>\n <label className=\"relative block min-w-0 px-1 pb-2\">\n <SearchIcon className=\"pointer-events-none absolute left-3 top-1/2 size-3.5 -translate-y-[calc(50%+0.25rem)] text-muted-foreground\" />\n <span className=\"sr-only\">Search sessions</span>\n <input\n value={search}\n onChange={handleSearch}\n placeholder=\"Search sessions...\"\n className=\"h-8 w-full rounded-md border border-border bg-muted/40 pl-7 pr-2 text-xs outline-none focus:border-primary focus:bg-background\"\n />\n </label>\n <div className=\"flex gap-1 overflow-x-auto px-1 pb-2 text-[11px]\">\n {([\"all\", \"chat\", \"automated\"] as const).map((filter) => (\n <button\n key={filter}\n type=\"button\"\n onClick={() => onActivityFilterChange(filter)}\n className={cn(\n \"rounded-full border px-2 py-1 capitalize\",\n activityFilter === filter\n ? \"border-primary bg-primary/10 text-primary\"\n : \"border-border text-muted-foreground\",\n )}\n >\n {filter === \"chat\"\n ? \"Chats\"\n : filter === \"automated\"\n ? \"Automations\"\n : \"All\"}\n </button>\n ))}\n <select\n aria-label=\"Filter by origin\"\n value={originFilter}\n onChange={(event) => onOriginFilterChange(event.target.value)}\n className=\"ml-auto rounded-full border border-border bg-background px-2 text-[11px] text-muted-foreground\"\n >\n <option value=\"all\">All origins</option>\n {origins.map((origin) => (\n <option key={origin} value={origin}>\n {originLabel(origin)}\n </option>\n ))}\n </select>\n </div>\n <div className=\"max-h-[min(60vh,28rem)] overflow-y-auto px-0.5\">\n {isLoading ? (\n <div className=\"flex items-center gap-2 px-2 py-4 text-xs text-muted-foreground\">\n <LoaderCircleIcon className=\"size-3.5 animate-spin\" /> Loading\n sessions…\n </div>\n ) : visibleCount === 0 ? (\n <p className=\"px-2 py-4 text-xs text-muted-foreground\">\n No matching sessions.\n </p>\n ) : (\n grouped.map(({ group, items }) => (\n <div key={group}>\n <h3 className=\"px-2 pb-1 pt-2 text-[10px] font-semibold uppercase tracking-[0.08em] text-muted-foreground/75\">\n {group}\n </h3>\n {items.map((conversation) => {\n const automated = isAutomatedConversation(conversation);\n return (\n <div\n key={conversation.threadId}\n className={cn(\n \"group flex items-start gap-2 rounded-md px-2 py-2 hover:bg-accent\",\n conversation.threadId === activeThreadId &&\n \"bg-primary/10 text-primary\",\n )}\n onMouseEnter={() => handleRowEnter(conversation.threadId)}\n onMouseLeave={() => handleRowLeave(conversation.threadId)}\n >\n <button\n type=\"button\"\n onClick={() => {\n onSelect(conversation.threadId);\n if (conversation.isUnread) {\n onSetReadState(conversation.threadId, false);\n }\n }}\n className=\"flex min-w-0 flex-1 items-start gap-2 text-left\"\n >\n <ConversationTypeIcon\n conversation={conversation}\n automated={automated}\n />\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex items-start gap-1\">\n <span className=\"line-clamp-2 flex-1 text-xs font-medium leading-snug\">\n {conversationDisplayTitle(conversation)}\n </span>\n {conversation.isUnread ? (\n <span\n aria-label=\"Unread\"\n className=\"mt-1 size-1.5 shrink-0 rounded-full bg-primary\"\n />\n ) : null}\n </span>\n <span className=\"mt-0.5 flex items-center gap-1.5 text-[10px] text-muted-foreground\">\n <span>{relativeTime(conversation.updatedAt)}</span>\n <span aria-hidden=\"true\">·</span>\n <span className=\"truncate\">\n {originLabel(originKey(conversation))}\n </span>\n </span>\n </span>\n </button>\n <button\n type=\"button\"\n aria-label={`Archive ${conversationDisplayTitle(conversation)}`}\n title=\"Archive conversation\"\n onClick={() => onArchive(conversation.threadId)}\n className=\"invisible rounded p-1 text-muted-foreground hover:bg-background hover:text-foreground group-hover:visible focus:visible\"\n >\n <ArchiveIcon className=\"size-3.5\" />\n </button>\n </div>\n );\n })}\n </div>\n ))\n )}\n {hasNextPage ? (\n <button\n type=\"button\"\n disabled={isFetchingNextPage}\n onClick={onLoadMore}\n className=\"mt-1 w-full rounded-lg py-2 text-xs text-muted-foreground hover:bg-accent disabled:opacity-50\"\n >\n {isFetchingNextPage ? \"Loading…\" : \"Load older sessions\"}\n </button>\n ) : visibleCount > 0 ? (\n <p className=\"py-2 text-center text-[10px] text-muted-foreground/70\">\n No more sessions\n </p>\n ) : null}\n </div>\n </section>\n );\n}\n"],"names":["jsx","LoaderCircleIcon","assetTypeToThumb","BotIcon","MessageSquareIcon","useRef","useCallback","useEffect","useMemo","jsxs","RefreshCwIcon","cn","PlusIcon","SearchIcon","conversationDisplayTitle","ArchiveIcon"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"conversation-history-panel.cjs","sources":["../../../src/chat-ui/header/conversation-history-panel.tsx"],"sourcesContent":["import type { ConversationSummary } from \"@athenaintel/agent-runtime\";\nimport type { LabelCopy } from \"@athenaintel/agent-runtime/offline-status\";\nimport {\n ArchiveIcon,\n BotIcon,\n LoaderCircleIcon,\n MessageSquareIcon,\n PlusIcon,\n RefreshCwIcon,\n SearchIcon,\n} from \"lucide-react\";\nimport {\n type ChangeEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { conversationDisplayTitle } from \"../../threads/use-rest-conversation-history\";\nimport { assetTypeToThumb } from \"../mentions/suggestions/data/sources/asset-type-icons\";\n\nexport type ConversationActivityFilter = \"all\" | \"chat\" | \"automated\";\nexport type ConversationTimeGroup =\n | \"Today\"\n | \"Yesterday\"\n | \"This Week\"\n | \"This Month\"\n | \"Older\";\n\nconst TIME_GROUPS: readonly ConversationTimeGroup[] = [\n \"Today\",\n \"Yesterday\",\n \"This Week\",\n \"This Month\",\n \"Older\",\n];\n\nconst AUTOMATED_SOURCE_CHANNELS = new Set([\n \"api\",\n \"email\",\n \"orchestration\",\n \"slack\",\n \"sms\",\n \"task\",\n \"teams\",\n]);\n\n/** Mirrors Agora's persisted background-run classification for list metadata. */\nexport function isAutomatedConversation(\n conversation: Pick<ConversationSummary, \"sourceChannel\" | \"triggerType\">,\n): boolean {\n const sourceChannel = conversation.sourceChannel?.trim().toLowerCase();\n if (sourceChannel && AUTOMATED_SOURCE_CHANNELS.has(sourceChannel))\n return true;\n const triggerType = conversation.triggerType?.trim().toLowerCase();\n return Boolean(triggerType && triggerType !== \"manual\");\n}\n\nexport function conversationTimeGroup(\n value: string,\n now: Date = new Date(),\n): ConversationTimeGroup {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return \"Older\";\n const startOfToday = new Date(\n now.getFullYear(),\n now.getMonth(),\n now.getDate(),\n );\n const startOfYesterday = new Date(startOfToday.getTime() - 86_400_000);\n const startOfWeek = new Date(\n startOfToday.getTime() - startOfToday.getDay() * 86_400_000,\n );\n const startOfMonth = new Date(now.getFullYear(), now.getMonth(), 1);\n if (date >= startOfToday) return \"Today\";\n if (date >= startOfYesterday) return \"Yesterday\";\n if (date >= startOfWeek) return \"This Week\";\n if (date >= startOfMonth) return \"This Month\";\n return \"Older\";\n}\n\nexport interface ConversationHistoryPanelProps {\n conversations: readonly ConversationSummary[];\n activeThreadId: string;\n search: string;\n onSearchChange: (search: string) => void;\n activityFilter: ConversationActivityFilter;\n onActivityFilterChange: (filter: ConversationActivityFilter) => void;\n originFilter: string;\n onOriginFilterChange: (origin: string) => void;\n onSelect: (threadId: string) => void;\n onNewChat: () => void;\n onRefresh: () => void;\n onArchive: (threadId: string) => void;\n onSetReadState: (threadId: string, isUnread: boolean) => void;\n isLoading?: boolean;\n isRefreshing?: boolean;\n hasNextPage?: boolean;\n isFetchingNextPage?: boolean;\n onLoadMore?: () => void;\n /**\n * The pointer has rested on a conversation row for `hoverIntentDelayMs`:\n * the user is likely to open it next. Hosts wake and pre-dial the thread\n * here so the click lands on a warm instance with its hello in hand.\n */\n onHoverIntent?: (threadId: string) => void;\n /** The pointer left a row whose intent had fired. */\n onHoverIntentEnd?: (threadId: string) => void;\n /** Dwell before a hover counts as intent; a pass-through never fires. */\n hoverIntentDelayMs?: number;\n /**\n * Why what needs Athena waits, or `null` while Athena answers: a host that\n * keeps nothing while Athena can't be reached passes `NEEDS_CONNECTION`\n * (`@athenaintel/agent-runtime/offline-status`). Refresh, the search box\n * (a search asks Athena), Archive and loading older sessions are then\n * disabled with it as their tooltip, and a list or a search that can't load\n * says it instead of spinning. The rows already loaded, the filters and New\n * stay as they are.\n */\n actionsUnavailable?: LabelCopy | null;\n}\n\n/** A disabled control's tooltip: the reason's label, then its line. */\nfunction unavailableTitle(reason: LabelCopy): string {\n return `${reason.label} — ${reason.detail}`;\n}\n\nfunction originKey(conversation: ConversationSummary): string {\n return conversation.appId ?? conversation.sourceChannel ?? \"unknown\";\n}\n\nfunction originLabel(value: string): string {\n const normalized = value.toLowerCase();\n if (normalized.includes(\"chrome\")) return \"Chrome\";\n if (normalized.includes(\"powerpoint\")) return \"PowerPoint\";\n if (normalized.includes(\"word\")) return \"Word\";\n if (normalized.includes(\"excel\")) return \"Excel\";\n if (normalized.includes(\"office\")) return \"Office\";\n if (normalized === \"web\" || normalized.includes(\"olympus\")) return \"Athena\";\n if (normalized.includes(\"mobile\")) return \"Mobile\";\n if (value === \"unknown\") return \"Legacy\";\n return value.replace(/^athena[-_]/, \"\").replaceAll(\"_\", \" \");\n}\n\nfunction relativeTime(value: string): string {\n const timestamp = Date.parse(value);\n if (!Number.isFinite(timestamp)) return \"\";\n const elapsed = Math.max(0, Date.now() - timestamp);\n const minutes = Math.floor(elapsed / 60_000);\n if (minutes < 1) return \"<1m ago\";\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ${minutes % 60}m ago`;\n const days = Math.floor(hours / 24);\n return days < 7 ? `${days}d ago` : new Date(timestamp).toLocaleDateString();\n}\n\nfunction ConversationTypeIcon({\n conversation,\n automated,\n}: {\n conversation: ConversationSummary;\n automated: boolean;\n}) {\n if (conversation.state === \"running\") {\n return (\n <LoaderCircleIcon\n aria-label=\"Conversation running\"\n className=\"mt-0.5 size-4 shrink-0 animate-spin text-primary\"\n />\n );\n }\n const thumbnail = assetTypeToThumb(conversation.assetType ?? \"session\");\n if (thumbnail) {\n return <img src={thumbnail} alt=\"\" className=\"mt-0.5 size-4 shrink-0\" />;\n }\n return automated ? (\n <BotIcon className=\"mt-0.5 size-4 shrink-0 text-primary\" />\n ) : (\n <MessageSquareIcon className=\"mt-0.5 size-4 shrink-0 text-emerald-500\" />\n );\n}\n\nexport function ConversationHistoryPanel({\n conversations,\n activeThreadId,\n search,\n onSearchChange,\n activityFilter,\n onActivityFilterChange,\n originFilter,\n onOriginFilterChange,\n onSelect,\n onNewChat,\n onRefresh,\n onArchive,\n onSetReadState,\n isLoading = false,\n isRefreshing = false,\n hasNextPage = false,\n isFetchingNextPage = false,\n onLoadMore,\n onHoverIntent,\n onHoverIntentEnd,\n hoverIntentDelayMs = 150,\n actionsUnavailable = null,\n}: ConversationHistoryPanelProps) {\n const unavailable = actionsUnavailable\n ? unavailableTitle(actionsUnavailable)\n : null;\n // Hover intent: one dwell timer for the row under the pointer; a row the\n // pointer merely crosses never fires. The id whose intent fired is kept so\n // its end is reported exactly once — on leave, when the row disappears\n // (filter, archive, refresh) or when the panel closes under the pointer.\n // The callbacks are read through refs so an inline handler's identity\n // changing on a parent re-render neither re-arms nor ends anything.\n const hoverTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const hoverIntentThreadId = useRef<string | null>(null);\n const onHoverIntentRef = useRef(onHoverIntent);\n onHoverIntentRef.current = onHoverIntent;\n const onHoverIntentEndRef = useRef(onHoverIntentEnd);\n onHoverIntentEndRef.current = onHoverIntentEnd;\n const cancelHoverTimer = useCallback(() => {\n if (hoverTimer.current === null) return;\n clearTimeout(hoverTimer.current);\n hoverTimer.current = null;\n }, []);\n const endHoverIntent = useCallback(() => {\n const threadId = hoverIntentThreadId.current;\n if (threadId === null) return;\n hoverIntentThreadId.current = null;\n onHoverIntentEndRef.current?.(threadId);\n }, []);\n useEffect(\n () => () => {\n cancelHoverTimer();\n endHoverIntent();\n },\n [cancelHoverTimer, endHoverIntent],\n );\n const handleRowEnter = (threadId: string) => {\n if (!onHoverIntentRef.current) return;\n cancelHoverTimer();\n hoverTimer.current = setTimeout(() => {\n hoverTimer.current = null;\n hoverIntentThreadId.current = threadId;\n onHoverIntentRef.current?.(threadId);\n }, hoverIntentDelayMs);\n };\n const handleRowLeave = (threadId: string) => {\n cancelHoverTimer();\n if (hoverIntentThreadId.current !== threadId) return;\n endHoverIntent();\n };\n const origins = useMemo(\n () => [...new Set(conversations.map(originKey))].sort(),\n [conversations],\n );\n const grouped = useMemo(() => {\n const visible = conversations.filter((conversation) => {\n const automated = isAutomatedConversation(conversation);\n if (activityFilter === \"chat\" && automated) return false;\n if (activityFilter === \"automated\" && !automated) return false;\n return originFilter === \"all\" || originKey(conversation) === originFilter;\n });\n const byGroup = new Map<ConversationTimeGroup, ConversationSummary[]>();\n for (const conversation of visible) {\n const group = conversationTimeGroup(conversation.updatedAt);\n const items = byGroup.get(group) ?? [];\n items.push(conversation);\n byGroup.set(group, items);\n }\n return TIME_GROUPS.flatMap((group) => {\n const items = byGroup.get(group);\n return items ? [{ group, items }] : [];\n });\n }, [activityFilter, conversations, originFilter]);\n // The hovered row left the list (filter, archive, refresh): no leave event\n // will come for it, so its intent ends here.\n useEffect(() => {\n const threadId = hoverIntentThreadId.current;\n if (threadId === null) return;\n const stillVisible = grouped.some(({ items }) =>\n items.some((conversation) => conversation.threadId === threadId),\n );\n if (!stillVisible) endHoverIntent();\n }, [grouped, endHoverIntent]);\n const visibleCount = grouped.reduce(\n (count, group) => count + group.items.length,\n 0,\n );\n const handleSearch = (event: ChangeEvent<HTMLInputElement>) =>\n onSearchChange(event.target.value);\n // A list that never loaded, or a search with nothing to show, waits on\n // Athena while it can't be reached: say so instead of spinning, or of\n // \"No matching sessions\" for a search that never ran.\n const listWaitsOnAthena =\n actionsUnavailable !== null &&\n (isLoading || (visibleCount === 0 && search.trim().length > 0));\n\n return (\n <section\n aria-label=\"Conversation history\"\n className=\"border-b border-border bg-background px-2 pb-2\"\n data-testid=\"conversation-history-panel\"\n >\n <div className=\"flex h-10 items-center gap-1.5 px-1\">\n <h2 className=\"text-[11px] font-semibold uppercase tracking-[0.08em] text-muted-foreground\">\n Sessions\n </h2>\n <button\n type=\"button\"\n aria-label=\"Refresh sessions\"\n title={unavailable ?? \"Refresh sessions\"}\n disabled={isRefreshing || unavailable !== null}\n onClick={onRefresh}\n className=\"ml-auto rounded-md p-1.5 text-muted-foreground hover:bg-accent hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <RefreshCwIcon\n className={cn(\n \"size-3.5\",\n isRefreshing && unavailable === null && \"animate-spin\",\n )}\n />\n </button>\n <button\n type=\"button\"\n onClick={onNewChat}\n className=\"flex h-7 shrink-0 items-center gap-1 rounded-md bg-primary px-2 text-[11px] font-medium text-primary-foreground\"\n >\n <PlusIcon className=\"size-3\" /> New\n </button>\n </div>\n <label className=\"relative block min-w-0 px-1 pb-2\">\n <SearchIcon className=\"pointer-events-none absolute left-3 top-1/2 size-3.5 -translate-y-[calc(50%+0.25rem)] text-muted-foreground\" />\n <span className=\"sr-only\">Search sessions</span>\n <input\n value={search}\n onChange={handleSearch}\n placeholder=\"Search sessions...\"\n // Read-only rather than disabled: no search can start, and the focus of\n // someone typing when Athena went away stays where it was.\n readOnly={unavailable !== null}\n aria-disabled={unavailable !== null || undefined}\n title={unavailable ?? undefined}\n className=\"h-8 w-full rounded-md border border-border bg-muted/40 pl-7 pr-2 text-xs outline-none focus:border-primary focus:bg-background aria-disabled:cursor-not-allowed aria-disabled:opacity-60\"\n />\n </label>\n <div className=\"flex gap-1 overflow-x-auto px-1 pb-2 text-[11px]\">\n {([\"all\", \"chat\", \"automated\"] as const).map((filter) => (\n <button\n key={filter}\n type=\"button\"\n onClick={() => onActivityFilterChange(filter)}\n className={cn(\n \"rounded-full border px-2 py-1 capitalize\",\n activityFilter === filter\n ? \"border-primary bg-primary/10 text-primary\"\n : \"border-border text-muted-foreground\",\n )}\n >\n {filter === \"chat\"\n ? \"Chats\"\n : filter === \"automated\"\n ? \"Automations\"\n : \"All\"}\n </button>\n ))}\n <select\n aria-label=\"Filter by origin\"\n value={originFilter}\n onChange={(event) => onOriginFilterChange(event.target.value)}\n className=\"ml-auto rounded-full border border-border bg-background px-2 text-[11px] text-muted-foreground\"\n >\n <option value=\"all\">All origins</option>\n {origins.map((origin) => (\n <option key={origin} value={origin}>\n {originLabel(origin)}\n </option>\n ))}\n </select>\n </div>\n <div className=\"max-h-[min(60vh,28rem)] overflow-y-auto px-0.5\">\n {listWaitsOnAthena && actionsUnavailable ? (\n <p\n role=\"status\"\n data-testid=\"conversation-history-unavailable\"\n className=\"px-2 py-4 text-xs text-muted-foreground\"\n >\n <span className=\"font-medium text-foreground\">\n {actionsUnavailable.label}\n </span>{\" \"}\n {actionsUnavailable.detail}\n </p>\n ) : isLoading ? (\n <div className=\"flex items-center gap-2 px-2 py-4 text-xs text-muted-foreground\">\n <LoaderCircleIcon className=\"size-3.5 animate-spin\" /> Loading\n sessions…\n </div>\n ) : visibleCount === 0 ? (\n <p className=\"px-2 py-4 text-xs text-muted-foreground\">\n No matching sessions.\n </p>\n ) : (\n grouped.map(({ group, items }) => (\n <div key={group}>\n <h3 className=\"px-2 pb-1 pt-2 text-[10px] font-semibold uppercase tracking-[0.08em] text-muted-foreground/75\">\n {group}\n </h3>\n {items.map((conversation) => {\n const automated = isAutomatedConversation(conversation);\n return (\n <div\n key={conversation.threadId}\n className={cn(\n \"group flex items-start gap-2 rounded-md px-2 py-2 hover:bg-accent\",\n conversation.threadId === activeThreadId &&\n \"bg-primary/10 text-primary\",\n )}\n onMouseEnter={() => handleRowEnter(conversation.threadId)}\n onMouseLeave={() => handleRowLeave(conversation.threadId)}\n >\n <button\n type=\"button\"\n onClick={() => {\n onSelect(conversation.threadId);\n if (conversation.isUnread) {\n onSetReadState(conversation.threadId, false);\n }\n }}\n className=\"flex min-w-0 flex-1 items-start gap-2 text-left\"\n >\n <ConversationTypeIcon\n conversation={conversation}\n automated={automated}\n />\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex items-start gap-1\">\n <span className=\"line-clamp-2 flex-1 text-xs font-medium leading-snug\">\n {conversationDisplayTitle(conversation)}\n </span>\n {conversation.isUnread ? (\n <span\n aria-label=\"Unread\"\n className=\"mt-1 size-1.5 shrink-0 rounded-full bg-primary\"\n />\n ) : null}\n </span>\n <span className=\"mt-0.5 flex items-center gap-1.5 text-[10px] text-muted-foreground\">\n <span>{relativeTime(conversation.updatedAt)}</span>\n <span aria-hidden=\"true\">·</span>\n <span className=\"truncate\">\n {originLabel(originKey(conversation))}\n </span>\n </span>\n </span>\n </button>\n <button\n type=\"button\"\n aria-label={`Archive ${conversationDisplayTitle(conversation)}`}\n title={unavailable ?? \"Archive conversation\"}\n disabled={unavailable !== null}\n onClick={() => onArchive(conversation.threadId)}\n className=\"invisible rounded p-1 text-muted-foreground hover:bg-background hover:text-foreground group-hover:visible focus:visible disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <ArchiveIcon className=\"size-3.5\" />\n </button>\n </div>\n );\n })}\n </div>\n ))\n )}\n {listWaitsOnAthena ? null : hasNextPage ? (\n <button\n type=\"button\"\n title={unavailable ?? undefined}\n disabled={isFetchingNextPage || unavailable !== null}\n onClick={onLoadMore}\n className=\"mt-1 w-full rounded-lg py-2 text-xs text-muted-foreground hover:bg-accent disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {isFetchingNextPage ? \"Loading…\" : \"Load older sessions\"}\n </button>\n ) : visibleCount > 0 ? (\n <p className=\"py-2 text-center text-[10px] text-muted-foreground/70\">\n No more sessions\n </p>\n ) : null}\n </div>\n </section>\n );\n}\n"],"names":["jsx","LoaderCircleIcon","assetTypeToThumb","BotIcon","MessageSquareIcon","useRef","useCallback","useEffect","useMemo","jsxs","RefreshCwIcon","cn","PlusIcon","SearchIcon","conversationDisplayTitle","ArchiveIcon"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ConversationSummary } from "../../agent-runtime/src/index";
|
|
2
|
+
import type { LabelCopy } from "../../agent-runtime/src/offline-status";
|
|
2
3
|
export type ConversationActivityFilter = "all" | "chat" | "automated";
|
|
3
4
|
export type ConversationTimeGroup = "Today" | "Yesterday" | "This Week" | "This Month" | "Older";
|
|
4
5
|
/** Mirrors Agora's persisted background-run classification for list metadata. */
|
|
@@ -33,5 +34,15 @@ export interface ConversationHistoryPanelProps {
|
|
|
33
34
|
onHoverIntentEnd?: (threadId: string) => void;
|
|
34
35
|
/** Dwell before a hover counts as intent; a pass-through never fires. */
|
|
35
36
|
hoverIntentDelayMs?: number;
|
|
37
|
+
/**
|
|
38
|
+
* Why what needs Athena waits, or `null` while Athena answers: a host that
|
|
39
|
+
* keeps nothing while Athena can't be reached passes `NEEDS_CONNECTION`
|
|
40
|
+
* (`@athenaintel/agent-runtime/offline-status`). Refresh, the search box
|
|
41
|
+
* (a search asks Athena), Archive and loading older sessions are then
|
|
42
|
+
* disabled with it as their tooltip, and a list or a search that can't load
|
|
43
|
+
* says it instead of spinning. The rows already loaded, the filters and New
|
|
44
|
+
* stay as they are.
|
|
45
|
+
*/
|
|
46
|
+
actionsUnavailable?: LabelCopy | null;
|
|
36
47
|
}
|
|
37
|
-
export declare function ConversationHistoryPanel({ conversations, activeThreadId, search, onSearchChange, activityFilter, onActivityFilterChange, originFilter, onOriginFilterChange, onSelect, onNewChat, onRefresh, onArchive, onSetReadState, isLoading, isRefreshing, hasNextPage, isFetchingNextPage, onLoadMore, onHoverIntent, onHoverIntentEnd, hoverIntentDelayMs, }: ConversationHistoryPanelProps): import("react").JSX.Element;
|
|
48
|
+
export declare function ConversationHistoryPanel({ conversations, activeThreadId, search, onSearchChange, activityFilter, onActivityFilterChange, originFilter, onOriginFilterChange, onSelect, onNewChat, onRefresh, onArchive, onSetReadState, isLoading, isRefreshing, hasNextPage, isFetchingNextPage, onLoadMore, onHoverIntent, onHoverIntentEnd, hoverIntentDelayMs, actionsUnavailable, }: ConversationHistoryPanelProps): import("react").JSX.Element;
|
|
@@ -47,6 +47,9 @@ function conversationTimeGroup(value, now = /* @__PURE__ */ new Date()) {
|
|
|
47
47
|
if (date >= startOfMonth) return "This Month";
|
|
48
48
|
return "Older";
|
|
49
49
|
}
|
|
50
|
+
function unavailableTitle(reason) {
|
|
51
|
+
return `${reason.label} — ${reason.detail}`;
|
|
52
|
+
}
|
|
50
53
|
function originKey(conversation) {
|
|
51
54
|
return conversation.appId ?? conversation.sourceChannel ?? "unknown";
|
|
52
55
|
}
|
|
@@ -114,8 +117,10 @@ function ConversationHistoryPanel({
|
|
|
114
117
|
onLoadMore,
|
|
115
118
|
onHoverIntent,
|
|
116
119
|
onHoverIntentEnd,
|
|
117
|
-
hoverIntentDelayMs = 150
|
|
120
|
+
hoverIntentDelayMs = 150,
|
|
121
|
+
actionsUnavailable = null
|
|
118
122
|
}) {
|
|
123
|
+
const unavailable = actionsUnavailable ? unavailableTitle(actionsUnavailable) : null;
|
|
119
124
|
const hoverTimer = useRef(null);
|
|
120
125
|
const hoverIntentThreadId = useRef(null);
|
|
121
126
|
const onHoverIntentRef = useRef(onHoverIntent);
|
|
@@ -192,6 +197,7 @@ function ConversationHistoryPanel({
|
|
|
192
197
|
0
|
|
193
198
|
);
|
|
194
199
|
const handleSearch = (event) => onSearchChange(event.target.value);
|
|
200
|
+
const listWaitsOnAthena = actionsUnavailable !== null && (isLoading || visibleCount === 0 && search.trim().length > 0);
|
|
195
201
|
return /* @__PURE__ */ jsxs(
|
|
196
202
|
"section",
|
|
197
203
|
{
|
|
@@ -206,14 +212,17 @@ function ConversationHistoryPanel({
|
|
|
206
212
|
{
|
|
207
213
|
type: "button",
|
|
208
214
|
"aria-label": "Refresh sessions",
|
|
209
|
-
title: "Refresh sessions",
|
|
210
|
-
disabled: isRefreshing,
|
|
215
|
+
title: unavailable ?? "Refresh sessions",
|
|
216
|
+
disabled: isRefreshing || unavailable !== null,
|
|
211
217
|
onClick: onRefresh,
|
|
212
|
-
className: "ml-auto rounded-md p-1.5 text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-50",
|
|
218
|
+
className: "ml-auto rounded-md p-1.5 text-muted-foreground hover:bg-accent hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50",
|
|
213
219
|
children: /* @__PURE__ */ jsx(
|
|
214
220
|
RefreshCwIcon,
|
|
215
221
|
{
|
|
216
|
-
className: cn(
|
|
222
|
+
className: cn(
|
|
223
|
+
"size-3.5",
|
|
224
|
+
isRefreshing && unavailable === null && "animate-spin"
|
|
225
|
+
)
|
|
217
226
|
}
|
|
218
227
|
)
|
|
219
228
|
}
|
|
@@ -240,7 +249,10 @@ function ConversationHistoryPanel({
|
|
|
240
249
|
value: search,
|
|
241
250
|
onChange: handleSearch,
|
|
242
251
|
placeholder: "Search sessions...",
|
|
243
|
-
|
|
252
|
+
readOnly: unavailable !== null,
|
|
253
|
+
"aria-disabled": unavailable !== null || void 0,
|
|
254
|
+
title: unavailable ?? void 0,
|
|
255
|
+
className: "h-8 w-full rounded-md border border-border bg-muted/40 pl-7 pr-2 text-xs outline-none focus:border-primary focus:bg-background aria-disabled:cursor-not-allowed aria-disabled:opacity-60"
|
|
244
256
|
}
|
|
245
257
|
)
|
|
246
258
|
] }),
|
|
@@ -273,7 +285,19 @@ function ConversationHistoryPanel({
|
|
|
273
285
|
)
|
|
274
286
|
] }),
|
|
275
287
|
/* @__PURE__ */ jsxs("div", { className: "max-h-[min(60vh,28rem)] overflow-y-auto px-0.5", children: [
|
|
276
|
-
|
|
288
|
+
listWaitsOnAthena && actionsUnavailable ? /* @__PURE__ */ jsxs(
|
|
289
|
+
"p",
|
|
290
|
+
{
|
|
291
|
+
role: "status",
|
|
292
|
+
"data-testid": "conversation-history-unavailable",
|
|
293
|
+
className: "px-2 py-4 text-xs text-muted-foreground",
|
|
294
|
+
children: [
|
|
295
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium text-foreground", children: actionsUnavailable.label }),
|
|
296
|
+
" ",
|
|
297
|
+
actionsUnavailable.detail
|
|
298
|
+
]
|
|
299
|
+
}
|
|
300
|
+
) : isLoading ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 px-2 py-4 text-xs text-muted-foreground", children: [
|
|
277
301
|
/* @__PURE__ */ jsx(LoaderCircleIcon, { className: "size-3.5 animate-spin" }),
|
|
278
302
|
" Loading sessions…"
|
|
279
303
|
] }) : visibleCount === 0 ? /* @__PURE__ */ jsx("p", { className: "px-2 py-4 text-xs text-muted-foreground", children: "No matching sessions." }) : grouped.map(({ group, items }) => /* @__PURE__ */ jsxs("div", { children: [
|
|
@@ -334,9 +358,10 @@ function ConversationHistoryPanel({
|
|
|
334
358
|
{
|
|
335
359
|
type: "button",
|
|
336
360
|
"aria-label": `Archive ${conversationDisplayTitle(conversation)}`,
|
|
337
|
-
title: "Archive conversation",
|
|
361
|
+
title: unavailable ?? "Archive conversation",
|
|
362
|
+
disabled: unavailable !== null,
|
|
338
363
|
onClick: () => onArchive(conversation.threadId),
|
|
339
|
-
className: "invisible rounded p-1 text-muted-foreground hover:bg-background hover:text-foreground group-hover:visible focus:visible",
|
|
364
|
+
className: "invisible rounded p-1 text-muted-foreground hover:bg-background hover:text-foreground group-hover:visible focus:visible disabled:cursor-not-allowed disabled:opacity-50",
|
|
340
365
|
children: /* @__PURE__ */ jsx(ArchiveIcon, { className: "size-3.5" })
|
|
341
366
|
}
|
|
342
367
|
)
|
|
@@ -346,13 +371,14 @@ function ConversationHistoryPanel({
|
|
|
346
371
|
);
|
|
347
372
|
})
|
|
348
373
|
] }, group)),
|
|
349
|
-
hasNextPage ? /* @__PURE__ */ jsx(
|
|
374
|
+
listWaitsOnAthena ? null : hasNextPage ? /* @__PURE__ */ jsx(
|
|
350
375
|
"button",
|
|
351
376
|
{
|
|
352
377
|
type: "button",
|
|
353
|
-
|
|
378
|
+
title: unavailable ?? void 0,
|
|
379
|
+
disabled: isFetchingNextPage || unavailable !== null,
|
|
354
380
|
onClick: onLoadMore,
|
|
355
|
-
className: "mt-1 w-full rounded-lg py-2 text-xs text-muted-foreground hover:bg-accent disabled:opacity-50",
|
|
381
|
+
className: "mt-1 w-full rounded-lg py-2 text-xs text-muted-foreground hover:bg-accent disabled:cursor-not-allowed disabled:opacity-50",
|
|
356
382
|
children: isFetchingNextPage ? "Loading…" : "Load older sessions"
|
|
357
383
|
}
|
|
358
384
|
) : visibleCount > 0 ? /* @__PURE__ */ jsx("p", { className: "py-2 text-center text-[10px] text-muted-foreground/70", children: "No more sessions" }) : null
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-history-panel.js","sources":["../../../src/chat-ui/header/conversation-history-panel.tsx"],"sourcesContent":["import type { ConversationSummary } from \"@athenaintel/agent-runtime\";\nimport {\n ArchiveIcon,\n BotIcon,\n LoaderCircleIcon,\n MessageSquareIcon,\n PlusIcon,\n RefreshCwIcon,\n SearchIcon,\n} from \"lucide-react\";\nimport {\n type ChangeEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { conversationDisplayTitle } from \"../../threads/use-rest-conversation-history\";\nimport { assetTypeToThumb } from \"../mentions/suggestions/data/sources/asset-type-icons\";\n\nexport type ConversationActivityFilter = \"all\" | \"chat\" | \"automated\";\nexport type ConversationTimeGroup =\n | \"Today\"\n | \"Yesterday\"\n | \"This Week\"\n | \"This Month\"\n | \"Older\";\n\nconst TIME_GROUPS: readonly ConversationTimeGroup[] = [\n \"Today\",\n \"Yesterday\",\n \"This Week\",\n \"This Month\",\n \"Older\",\n];\n\nconst AUTOMATED_SOURCE_CHANNELS = new Set([\n \"api\",\n \"email\",\n \"orchestration\",\n \"slack\",\n \"sms\",\n \"task\",\n \"teams\",\n]);\n\n/** Mirrors Agora's persisted background-run classification for list metadata. */\nexport function isAutomatedConversation(\n conversation: Pick<ConversationSummary, \"sourceChannel\" | \"triggerType\">,\n): boolean {\n const sourceChannel = conversation.sourceChannel?.trim().toLowerCase();\n if (sourceChannel && AUTOMATED_SOURCE_CHANNELS.has(sourceChannel))\n return true;\n const triggerType = conversation.triggerType?.trim().toLowerCase();\n return Boolean(triggerType && triggerType !== \"manual\");\n}\n\nexport function conversationTimeGroup(\n value: string,\n now: Date = new Date(),\n): ConversationTimeGroup {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return \"Older\";\n const startOfToday = new Date(\n now.getFullYear(),\n now.getMonth(),\n now.getDate(),\n );\n const startOfYesterday = new Date(startOfToday.getTime() - 86_400_000);\n const startOfWeek = new Date(\n startOfToday.getTime() - startOfToday.getDay() * 86_400_000,\n );\n const startOfMonth = new Date(now.getFullYear(), now.getMonth(), 1);\n if (date >= startOfToday) return \"Today\";\n if (date >= startOfYesterday) return \"Yesterday\";\n if (date >= startOfWeek) return \"This Week\";\n if (date >= startOfMonth) return \"This Month\";\n return \"Older\";\n}\n\nexport interface ConversationHistoryPanelProps {\n conversations: readonly ConversationSummary[];\n activeThreadId: string;\n search: string;\n onSearchChange: (search: string) => void;\n activityFilter: ConversationActivityFilter;\n onActivityFilterChange: (filter: ConversationActivityFilter) => void;\n originFilter: string;\n onOriginFilterChange: (origin: string) => void;\n onSelect: (threadId: string) => void;\n onNewChat: () => void;\n onRefresh: () => void;\n onArchive: (threadId: string) => void;\n onSetReadState: (threadId: string, isUnread: boolean) => void;\n isLoading?: boolean;\n isRefreshing?: boolean;\n hasNextPage?: boolean;\n isFetchingNextPage?: boolean;\n onLoadMore?: () => void;\n /**\n * The pointer has rested on a conversation row for `hoverIntentDelayMs`:\n * the user is likely to open it next. Hosts wake and pre-dial the thread\n * here so the click lands on a warm instance with its hello in hand.\n */\n onHoverIntent?: (threadId: string) => void;\n /** The pointer left a row whose intent had fired. */\n onHoverIntentEnd?: (threadId: string) => void;\n /** Dwell before a hover counts as intent; a pass-through never fires. */\n hoverIntentDelayMs?: number;\n}\n\nfunction originKey(conversation: ConversationSummary): string {\n return conversation.appId ?? conversation.sourceChannel ?? \"unknown\";\n}\n\nfunction originLabel(value: string): string {\n const normalized = value.toLowerCase();\n if (normalized.includes(\"chrome\")) return \"Chrome\";\n if (normalized.includes(\"powerpoint\")) return \"PowerPoint\";\n if (normalized.includes(\"word\")) return \"Word\";\n if (normalized.includes(\"excel\")) return \"Excel\";\n if (normalized.includes(\"office\")) return \"Office\";\n if (normalized === \"web\" || normalized.includes(\"olympus\")) return \"Athena\";\n if (normalized.includes(\"mobile\")) return \"Mobile\";\n if (value === \"unknown\") return \"Legacy\";\n return value.replace(/^athena[-_]/, \"\").replaceAll(\"_\", \" \");\n}\n\nfunction relativeTime(value: string): string {\n const timestamp = Date.parse(value);\n if (!Number.isFinite(timestamp)) return \"\";\n const elapsed = Math.max(0, Date.now() - timestamp);\n const minutes = Math.floor(elapsed / 60_000);\n if (minutes < 1) return \"<1m ago\";\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ${minutes % 60}m ago`;\n const days = Math.floor(hours / 24);\n return days < 7 ? `${days}d ago` : new Date(timestamp).toLocaleDateString();\n}\n\nfunction ConversationTypeIcon({\n conversation,\n automated,\n}: {\n conversation: ConversationSummary;\n automated: boolean;\n}) {\n if (conversation.state === \"running\") {\n return (\n <LoaderCircleIcon\n aria-label=\"Conversation running\"\n className=\"mt-0.5 size-4 shrink-0 animate-spin text-primary\"\n />\n );\n }\n const thumbnail = assetTypeToThumb(conversation.assetType ?? \"session\");\n if (thumbnail) {\n return <img src={thumbnail} alt=\"\" className=\"mt-0.5 size-4 shrink-0\" />;\n }\n return automated ? (\n <BotIcon className=\"mt-0.5 size-4 shrink-0 text-primary\" />\n ) : (\n <MessageSquareIcon className=\"mt-0.5 size-4 shrink-0 text-emerald-500\" />\n );\n}\n\nexport function ConversationHistoryPanel({\n conversations,\n activeThreadId,\n search,\n onSearchChange,\n activityFilter,\n onActivityFilterChange,\n originFilter,\n onOriginFilterChange,\n onSelect,\n onNewChat,\n onRefresh,\n onArchive,\n onSetReadState,\n isLoading = false,\n isRefreshing = false,\n hasNextPage = false,\n isFetchingNextPage = false,\n onLoadMore,\n onHoverIntent,\n onHoverIntentEnd,\n hoverIntentDelayMs = 150,\n}: ConversationHistoryPanelProps) {\n // Hover intent: one dwell timer for the row under the pointer; a row the\n // pointer merely crosses never fires. The id whose intent fired is kept so\n // its end is reported exactly once — on leave, when the row disappears\n // (filter, archive, refresh) or when the panel closes under the pointer.\n // The callbacks are read through refs so an inline handler's identity\n // changing on a parent re-render neither re-arms nor ends anything.\n const hoverTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const hoverIntentThreadId = useRef<string | null>(null);\n const onHoverIntentRef = useRef(onHoverIntent);\n onHoverIntentRef.current = onHoverIntent;\n const onHoverIntentEndRef = useRef(onHoverIntentEnd);\n onHoverIntentEndRef.current = onHoverIntentEnd;\n const cancelHoverTimer = useCallback(() => {\n if (hoverTimer.current === null) return;\n clearTimeout(hoverTimer.current);\n hoverTimer.current = null;\n }, []);\n const endHoverIntent = useCallback(() => {\n const threadId = hoverIntentThreadId.current;\n if (threadId === null) return;\n hoverIntentThreadId.current = null;\n onHoverIntentEndRef.current?.(threadId);\n }, []);\n useEffect(\n () => () => {\n cancelHoverTimer();\n endHoverIntent();\n },\n [cancelHoverTimer, endHoverIntent],\n );\n const handleRowEnter = (threadId: string) => {\n if (!onHoverIntentRef.current) return;\n cancelHoverTimer();\n hoverTimer.current = setTimeout(() => {\n hoverTimer.current = null;\n hoverIntentThreadId.current = threadId;\n onHoverIntentRef.current?.(threadId);\n }, hoverIntentDelayMs);\n };\n const handleRowLeave = (threadId: string) => {\n cancelHoverTimer();\n if (hoverIntentThreadId.current !== threadId) return;\n endHoverIntent();\n };\n const origins = useMemo(\n () => [...new Set(conversations.map(originKey))].sort(),\n [conversations],\n );\n const grouped = useMemo(() => {\n const visible = conversations.filter((conversation) => {\n const automated = isAutomatedConversation(conversation);\n if (activityFilter === \"chat\" && automated) return false;\n if (activityFilter === \"automated\" && !automated) return false;\n return originFilter === \"all\" || originKey(conversation) === originFilter;\n });\n const byGroup = new Map<ConversationTimeGroup, ConversationSummary[]>();\n for (const conversation of visible) {\n const group = conversationTimeGroup(conversation.updatedAt);\n const items = byGroup.get(group) ?? [];\n items.push(conversation);\n byGroup.set(group, items);\n }\n return TIME_GROUPS.flatMap((group) => {\n const items = byGroup.get(group);\n return items ? [{ group, items }] : [];\n });\n }, [activityFilter, conversations, originFilter]);\n // The hovered row left the list (filter, archive, refresh): no leave event\n // will come for it, so its intent ends here.\n useEffect(() => {\n const threadId = hoverIntentThreadId.current;\n if (threadId === null) return;\n const stillVisible = grouped.some(({ items }) =>\n items.some((conversation) => conversation.threadId === threadId),\n );\n if (!stillVisible) endHoverIntent();\n }, [grouped, endHoverIntent]);\n const visibleCount = grouped.reduce(\n (count, group) => count + group.items.length,\n 0,\n );\n const handleSearch = (event: ChangeEvent<HTMLInputElement>) =>\n onSearchChange(event.target.value);\n\n return (\n <section\n aria-label=\"Conversation history\"\n className=\"border-b border-border bg-background px-2 pb-2\"\n data-testid=\"conversation-history-panel\"\n >\n <div className=\"flex h-10 items-center gap-1.5 px-1\">\n <h2 className=\"text-[11px] font-semibold uppercase tracking-[0.08em] text-muted-foreground\">\n Sessions\n </h2>\n <button\n type=\"button\"\n aria-label=\"Refresh sessions\"\n title=\"Refresh sessions\"\n disabled={isRefreshing}\n onClick={onRefresh}\n className=\"ml-auto rounded-md p-1.5 text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-50\"\n >\n <RefreshCwIcon\n className={cn(\"size-3.5\", isRefreshing && \"animate-spin\")}\n />\n </button>\n <button\n type=\"button\"\n onClick={onNewChat}\n className=\"flex h-7 shrink-0 items-center gap-1 rounded-md bg-primary px-2 text-[11px] font-medium text-primary-foreground\"\n >\n <PlusIcon className=\"size-3\" /> New\n </button>\n </div>\n <label className=\"relative block min-w-0 px-1 pb-2\">\n <SearchIcon className=\"pointer-events-none absolute left-3 top-1/2 size-3.5 -translate-y-[calc(50%+0.25rem)] text-muted-foreground\" />\n <span className=\"sr-only\">Search sessions</span>\n <input\n value={search}\n onChange={handleSearch}\n placeholder=\"Search sessions...\"\n className=\"h-8 w-full rounded-md border border-border bg-muted/40 pl-7 pr-2 text-xs outline-none focus:border-primary focus:bg-background\"\n />\n </label>\n <div className=\"flex gap-1 overflow-x-auto px-1 pb-2 text-[11px]\">\n {([\"all\", \"chat\", \"automated\"] as const).map((filter) => (\n <button\n key={filter}\n type=\"button\"\n onClick={() => onActivityFilterChange(filter)}\n className={cn(\n \"rounded-full border px-2 py-1 capitalize\",\n activityFilter === filter\n ? \"border-primary bg-primary/10 text-primary\"\n : \"border-border text-muted-foreground\",\n )}\n >\n {filter === \"chat\"\n ? \"Chats\"\n : filter === \"automated\"\n ? \"Automations\"\n : \"All\"}\n </button>\n ))}\n <select\n aria-label=\"Filter by origin\"\n value={originFilter}\n onChange={(event) => onOriginFilterChange(event.target.value)}\n className=\"ml-auto rounded-full border border-border bg-background px-2 text-[11px] text-muted-foreground\"\n >\n <option value=\"all\">All origins</option>\n {origins.map((origin) => (\n <option key={origin} value={origin}>\n {originLabel(origin)}\n </option>\n ))}\n </select>\n </div>\n <div className=\"max-h-[min(60vh,28rem)] overflow-y-auto px-0.5\">\n {isLoading ? (\n <div className=\"flex items-center gap-2 px-2 py-4 text-xs text-muted-foreground\">\n <LoaderCircleIcon className=\"size-3.5 animate-spin\" /> Loading\n sessions…\n </div>\n ) : visibleCount === 0 ? (\n <p className=\"px-2 py-4 text-xs text-muted-foreground\">\n No matching sessions.\n </p>\n ) : (\n grouped.map(({ group, items }) => (\n <div key={group}>\n <h3 className=\"px-2 pb-1 pt-2 text-[10px] font-semibold uppercase tracking-[0.08em] text-muted-foreground/75\">\n {group}\n </h3>\n {items.map((conversation) => {\n const automated = isAutomatedConversation(conversation);\n return (\n <div\n key={conversation.threadId}\n className={cn(\n \"group flex items-start gap-2 rounded-md px-2 py-2 hover:bg-accent\",\n conversation.threadId === activeThreadId &&\n \"bg-primary/10 text-primary\",\n )}\n onMouseEnter={() => handleRowEnter(conversation.threadId)}\n onMouseLeave={() => handleRowLeave(conversation.threadId)}\n >\n <button\n type=\"button\"\n onClick={() => {\n onSelect(conversation.threadId);\n if (conversation.isUnread) {\n onSetReadState(conversation.threadId, false);\n }\n }}\n className=\"flex min-w-0 flex-1 items-start gap-2 text-left\"\n >\n <ConversationTypeIcon\n conversation={conversation}\n automated={automated}\n />\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex items-start gap-1\">\n <span className=\"line-clamp-2 flex-1 text-xs font-medium leading-snug\">\n {conversationDisplayTitle(conversation)}\n </span>\n {conversation.isUnread ? (\n <span\n aria-label=\"Unread\"\n className=\"mt-1 size-1.5 shrink-0 rounded-full bg-primary\"\n />\n ) : null}\n </span>\n <span className=\"mt-0.5 flex items-center gap-1.5 text-[10px] text-muted-foreground\">\n <span>{relativeTime(conversation.updatedAt)}</span>\n <span aria-hidden=\"true\">·</span>\n <span className=\"truncate\">\n {originLabel(originKey(conversation))}\n </span>\n </span>\n </span>\n </button>\n <button\n type=\"button\"\n aria-label={`Archive ${conversationDisplayTitle(conversation)}`}\n title=\"Archive conversation\"\n onClick={() => onArchive(conversation.threadId)}\n className=\"invisible rounded p-1 text-muted-foreground hover:bg-background hover:text-foreground group-hover:visible focus:visible\"\n >\n <ArchiveIcon className=\"size-3.5\" />\n </button>\n </div>\n );\n })}\n </div>\n ))\n )}\n {hasNextPage ? (\n <button\n type=\"button\"\n disabled={isFetchingNextPage}\n onClick={onLoadMore}\n className=\"mt-1 w-full rounded-lg py-2 text-xs text-muted-foreground hover:bg-accent disabled:opacity-50\"\n >\n {isFetchingNextPage ? \"Loading…\" : \"Load older sessions\"}\n </button>\n ) : visibleCount > 0 ? (\n <p className=\"py-2 text-center text-[10px] text-muted-foreground/70\">\n No more sessions\n </p>\n ) : null}\n </div>\n </section>\n );\n}\n"],"names":[],"mappings":";;;;;;AA6BA,MAAM,cAAgD;AAAA,EACpD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,MAAM,gDAAgC,IAAI;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,SAAS,wBACd,cACS;;AACT,QAAM,iBAAgB,kBAAa,kBAAb,mBAA4B,OAAO;AACzD,MAAI,iBAAiB,0BAA0B,IAAI,aAAa;AAC9D,WAAO;AACT,QAAM,eAAc,kBAAa,gBAAb,mBAA0B,OAAO;AACrD,SAAO,QAAQ,eAAe,gBAAgB,QAAQ;AACxD;AAEO,SAAS,sBACd,OACA,MAAY,oBAAI,QACO;AACvB,QAAM,OAAO,IAAI,KAAK,KAAK;AAC3B,MAAI,OAAO,MAAM,KAAK,QAAA,CAAS,EAAG,QAAO;AACzC,QAAM,eAAe,IAAI;AAAA,IACvB,IAAI,YAAA;AAAA,IACJ,IAAI,SAAA;AAAA,IACJ,IAAI,QAAA;AAAA,EAAQ;AAEd,QAAM,mBAAmB,IAAI,KAAK,aAAa,QAAA,IAAY,KAAU;AACrE,QAAM,cAAc,IAAI;AAAA,IACtB,aAAa,QAAA,IAAY,aAAa,WAAW;AAAA,EAAA;AAEnD,QAAM,eAAe,IAAI,KAAK,IAAI,eAAe,IAAI,SAAA,GAAY,CAAC;AAClE,MAAI,QAAQ,aAAc,QAAO;AACjC,MAAI,QAAQ,iBAAkB,QAAO;AACrC,MAAI,QAAQ,YAAa,QAAO;AAChC,MAAI,QAAQ,aAAc,QAAO;AACjC,SAAO;AACT;AAiCA,SAAS,UAAU,cAA2C;AAC5D,SAAO,aAAa,SAAS,aAAa,iBAAiB;AAC7D;AAEA,SAAS,YAAY,OAAuB;AAC1C,QAAM,aAAa,MAAM,YAAA;AACzB,MAAI,WAAW,SAAS,QAAQ,EAAG,QAAO;AAC1C,MAAI,WAAW,SAAS,YAAY,EAAG,QAAO;AAC9C,MAAI,WAAW,SAAS,MAAM,EAAG,QAAO;AACxC,MAAI,WAAW,SAAS,OAAO,EAAG,QAAO;AACzC,MAAI,WAAW,SAAS,QAAQ,EAAG,QAAO;AAC1C,MAAI,eAAe,SAAS,WAAW,SAAS,SAAS,EAAG,QAAO;AACnE,MAAI,WAAW,SAAS,QAAQ,EAAG,QAAO;AAC1C,MAAI,UAAU,UAAW,QAAO;AAChC,SAAO,MAAM,QAAQ,eAAe,EAAE,EAAE,WAAW,KAAK,GAAG;AAC7D;AAEA,SAAS,aAAa,OAAuB;AAC3C,QAAM,YAAY,KAAK,MAAM,KAAK;AAClC,MAAI,CAAC,OAAO,SAAS,SAAS,EAAG,QAAO;AACxC,QAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAA,IAAQ,SAAS;AAClD,QAAM,UAAU,KAAK,MAAM,UAAU,GAAM;AAC3C,MAAI,UAAU,EAAG,QAAO;AACxB,MAAI,UAAU,GAAI,QAAO,GAAG,OAAO;AACnC,QAAM,QAAQ,KAAK,MAAM,UAAU,EAAE;AACrC,MAAI,QAAQ,GAAI,QAAO,GAAG,KAAK,KAAK,UAAU,EAAE;AAChD,QAAM,OAAO,KAAK,MAAM,QAAQ,EAAE;AAClC,SAAO,OAAO,IAAI,GAAG,IAAI,UAAU,IAAI,KAAK,SAAS,EAAE,mBAAA;AACzD;AAEA,SAAS,qBAAqB;AAAA,EAC5B;AAAA,EACA;AACF,GAGG;AACD,MAAI,aAAa,UAAU,WAAW;AACpC,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,cAAW;AAAA,QACX,WAAU;AAAA,MAAA;AAAA,IAAA;AAAA,EAGhB;AACA,QAAM,YAAY,iBAAiB,aAAa,aAAa,SAAS;AACtE,MAAI,WAAW;AACb,+BAAQ,OAAA,EAAI,KAAK,WAAW,KAAI,IAAG,WAAU,0BAAyB;AAAA,EACxE;AACA,SAAO,gCACJ,SAAA,EAAQ,WAAU,uCAAsC,IAEzD,oBAAC,mBAAA,EAAkB,WAAU,0CAAA,CAA0C;AAE3E;AAEO,SAAS,yBAAyB;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,cAAc;AAAA,EACd,qBAAqB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA,qBAAqB;AACvB,GAAkC;AAOhC,QAAM,aAAa,OAA6C,IAAI;AACpE,QAAM,sBAAsB,OAAsB,IAAI;AACtD,QAAM,mBAAmB,OAAO,aAAa;AAC7C,mBAAiB,UAAU;AAC3B,QAAM,sBAAsB,OAAO,gBAAgB;AACnD,sBAAoB,UAAU;AAC9B,QAAM,mBAAmB,YAAY,MAAM;AACzC,QAAI,WAAW,YAAY,KAAM;AACjC,iBAAa,WAAW,OAAO;AAC/B,eAAW,UAAU;AAAA,EACvB,GAAG,CAAA,CAAE;AACL,QAAM,iBAAiB,YAAY,MAAM;;AACvC,UAAM,WAAW,oBAAoB;AACrC,QAAI,aAAa,KAAM;AACvB,wBAAoB,UAAU;AAC9B,8BAAoB,YAApB,6CAA8B;AAAA,EAChC,GAAG,CAAA,CAAE;AACL;AAAA,IACE,MAAM,MAAM;AACV,uBAAA;AACA,qBAAA;AAAA,IACF;AAAA,IACA,CAAC,kBAAkB,cAAc;AAAA,EAAA;AAEnC,QAAM,iBAAiB,CAAC,aAAqB;AAC3C,QAAI,CAAC,iBAAiB,QAAS;AAC/B,qBAAA;AACA,eAAW,UAAU,WAAW,MAAM;;AACpC,iBAAW,UAAU;AACrB,0BAAoB,UAAU;AAC9B,6BAAiB,YAAjB,0CAA2B;AAAA,IAC7B,GAAG,kBAAkB;AAAA,EACvB;AACA,QAAM,iBAAiB,CAAC,aAAqB;AAC3C,qBAAA;AACA,QAAI,oBAAoB,YAAY,SAAU;AAC9C,mBAAA;AAAA,EACF;AACA,QAAM,UAAU;AAAA,IACd,MAAM,CAAC,GAAG,IAAI,IAAI,cAAc,IAAI,SAAS,CAAC,CAAC,EAAE,KAAA;AAAA,IACjD,CAAC,aAAa;AAAA,EAAA;AAEhB,QAAM,UAAU,QAAQ,MAAM;AAC5B,UAAM,UAAU,cAAc,OAAO,CAAC,iBAAiB;AACrD,YAAM,YAAY,wBAAwB,YAAY;AACtD,UAAI,mBAAmB,UAAU,UAAW,QAAO;AACnD,UAAI,mBAAmB,eAAe,CAAC,UAAW,QAAO;AACzD,aAAO,iBAAiB,SAAS,UAAU,YAAY,MAAM;AAAA,IAC/D,CAAC;AACD,UAAM,8BAAc,IAAA;AACpB,eAAW,gBAAgB,SAAS;AAClC,YAAM,QAAQ,sBAAsB,aAAa,SAAS;AAC1D,YAAM,QAAQ,QAAQ,IAAI,KAAK,KAAK,CAAA;AACpC,YAAM,KAAK,YAAY;AACvB,cAAQ,IAAI,OAAO,KAAK;AAAA,IAC1B;AACA,WAAO,YAAY,QAAQ,CAAC,UAAU;AACpC,YAAM,QAAQ,QAAQ,IAAI,KAAK;AAC/B,aAAO,QAAQ,CAAC,EAAE,OAAO,MAAA,CAAO,IAAI,CAAA;AAAA,IACtC,CAAC;AAAA,EACH,GAAG,CAAC,gBAAgB,eAAe,YAAY,CAAC;AAGhD,YAAU,MAAM;AACd,UAAM,WAAW,oBAAoB;AACrC,QAAI,aAAa,KAAM;AACvB,UAAM,eAAe,QAAQ;AAAA,MAAK,CAAC,EAAE,MAAA,MACnC,MAAM,KAAK,CAAC,iBAAiB,aAAa,aAAa,QAAQ;AAAA,IAAA;AAEjE,QAAI,CAAC,aAAc,gBAAA;AAAA,EACrB,GAAG,CAAC,SAAS,cAAc,CAAC;AAC5B,QAAM,eAAe,QAAQ;AAAA,IAC3B,CAAC,OAAO,UAAU,QAAQ,MAAM,MAAM;AAAA,IACtC;AAAA,EAAA;AAEF,QAAM,eAAe,CAAC,UACpB,eAAe,MAAM,OAAO,KAAK;AAEnC,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,cAAW;AAAA,MACX,WAAU;AAAA,MACV,eAAY;AAAA,MAEZ,UAAA;AAAA,QAAA,qBAAC,OAAA,EAAI,WAAU,uCACb,UAAA;AAAA,UAAA,oBAAC,MAAA,EAAG,WAAU,+EAA8E,UAAA,YAE5F;AAAA,UACA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,cAAW;AAAA,cACX,OAAM;AAAA,cACN,UAAU;AAAA,cACV,SAAS;AAAA,cACT,WAAU;AAAA,cAEV,UAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAW,GAAG,YAAY,gBAAgB,cAAc;AAAA,gBAAA;AAAA,cAAA;AAAA,YAC1D;AAAA,UAAA;AAAA,UAEF;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,WAAU;AAAA,cAEV,UAAA;AAAA,gBAAA,oBAAC,UAAA,EAAS,WAAU,SAAA,CAAS;AAAA,gBAAE;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QACjC,GACF;AAAA,QACA,qBAAC,SAAA,EAAM,WAAU,oCACf,UAAA;AAAA,UAAA,oBAAC,YAAA,EAAW,WAAU,8GAAA,CAA8G;AAAA,UACpI,oBAAC,QAAA,EAAK,WAAU,WAAU,UAAA,mBAAe;AAAA,UACzC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO;AAAA,cACP,UAAU;AAAA,cACV,aAAY;AAAA,cACZ,WAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QACZ,GACF;AAAA,QACA,qBAAC,OAAA,EAAI,WAAU,oDACX,UAAA;AAAA,UAAA,CAAC,OAAO,QAAQ,WAAW,EAAY,IAAI,CAAC,WAC5C;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,MAAK;AAAA,cACL,SAAS,MAAM,uBAAuB,MAAM;AAAA,cAC5C,WAAW;AAAA,gBACT;AAAA,gBACA,mBAAmB,SACf,8CACA;AAAA,cAAA;AAAA,cAGL,UAAA,WAAW,SACR,UACA,WAAW,cACT,gBACA;AAAA,YAAA;AAAA,YAdD;AAAA,UAAA,CAgBR;AAAA,UACD;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,cAAW;AAAA,cACX,OAAO;AAAA,cACP,UAAU,CAAC,UAAU,qBAAqB,MAAM,OAAO,KAAK;AAAA,cAC5D,WAAU;AAAA,cAEV,UAAA;AAAA,gBAAA,oBAAC,UAAA,EAAO,OAAM,OAAM,UAAA,eAAW;AAAA,gBAC9B,QAAQ,IAAI,CAAC,WACZ,oBAAC,UAAA,EAAoB,OAAO,QACzB,UAAA,YAAY,MAAM,EAAA,GADR,MAEb,CACD;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QACH,GACF;AAAA,QACA,qBAAC,OAAA,EAAI,WAAU,kDACZ,UAAA;AAAA,UAAA,YACC,qBAAC,OAAA,EAAI,WAAU,mEACb,UAAA;AAAA,YAAA,oBAAC,kBAAA,EAAiB,WAAU,wBAAA,CAAwB;AAAA,YAAE;AAAA,UAAA,GAExD,IACE,iBAAiB,IACnB,oBAAC,KAAA,EAAE,WAAU,2CAA0C,UAAA,wBAAA,CAEvD,IAEA,QAAQ,IAAI,CAAC,EAAE,OAAO,MAAA,2BACnB,OAAA,EACC,UAAA;AAAA,YAAA,oBAAC,MAAA,EAAG,WAAU,iGACX,UAAA,OACH;AAAA,YACC,MAAM,IAAI,CAAC,iBAAiB;AAC3B,oBAAM,YAAY,wBAAwB,YAAY;AACtD,qBACE;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,WAAW;AAAA,oBACT;AAAA,oBACA,aAAa,aAAa,kBACxB;AAAA,kBAAA;AAAA,kBAEJ,cAAc,MAAM,eAAe,aAAa,QAAQ;AAAA,kBACxD,cAAc,MAAM,eAAe,aAAa,QAAQ;AAAA,kBAExD,UAAA;AAAA,oBAAA;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,MAAK;AAAA,wBACL,SAAS,MAAM;AACb,mCAAS,aAAa,QAAQ;AAC9B,8BAAI,aAAa,UAAU;AACzB,2CAAe,aAAa,UAAU,KAAK;AAAA,0BAC7C;AAAA,wBACF;AAAA,wBACA,WAAU;AAAA,wBAEV,UAAA;AAAA,0BAAA;AAAA,4BAAC;AAAA,4BAAA;AAAA,8BACC;AAAA,8BACA;AAAA,4BAAA;AAAA,0BAAA;AAAA,0BAEF,qBAAC,QAAA,EAAK,WAAU,kBACd,UAAA;AAAA,4BAAA,qBAAC,QAAA,EAAK,WAAU,0BACd,UAAA;AAAA,8BAAA,oBAAC,QAAA,EAAK,WAAU,wDACb,UAAA,yBAAyB,YAAY,GACxC;AAAA,8BACC,aAAa,WACZ;AAAA,gCAAC;AAAA,gCAAA;AAAA,kCACC,cAAW;AAAA,kCACX,WAAU;AAAA,gCAAA;AAAA,8BAAA,IAEV;AAAA,4BAAA,GACN;AAAA,4BACA,qBAAC,QAAA,EAAK,WAAU,sEACd,UAAA;AAAA,8BAAA,oBAAC,QAAA,EAAM,UAAA,aAAa,aAAa,SAAS,GAAE;AAAA,8BAC5C,oBAAC,QAAA,EAAK,eAAY,QAAO,UAAA,KAAC;AAAA,8BAC1B,oBAAC,UAAK,WAAU,YACb,sBAAY,UAAU,YAAY,CAAC,EAAA,CACtC;AAAA,4BAAA,EAAA,CACF;AAAA,0BAAA,EAAA,CACF;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBAAA;AAAA,oBAEF;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,MAAK;AAAA,wBACL,cAAY,WAAW,yBAAyB,YAAY,CAAC;AAAA,wBAC7D,OAAM;AAAA,wBACN,SAAS,MAAM,UAAU,aAAa,QAAQ;AAAA,wBAC9C,WAAU;AAAA,wBAEV,UAAA,oBAAC,aAAA,EAAY,WAAU,WAAA,CAAW;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBACpC;AAAA,gBAAA;AAAA,gBApDK,aAAa;AAAA,cAAA;AAAA,YAuDxB,CAAC;AAAA,UAAA,EAAA,GA/DO,KAgEV,CACD;AAAA,UAEF,cACC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,UAAU;AAAA,cACV,SAAS;AAAA,cACT,WAAU;AAAA,cAET,+BAAqB,aAAa;AAAA,YAAA;AAAA,UAAA,IAEnC,eAAe,IACjB,oBAAC,OAAE,WAAU,yDAAwD,8BAErE,IACE;AAAA,QAAA,EAAA,CACN;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;"}
|
|
1
|
+
{"version":3,"file":"conversation-history-panel.js","sources":["../../../src/chat-ui/header/conversation-history-panel.tsx"],"sourcesContent":["import type { ConversationSummary } from \"@athenaintel/agent-runtime\";\nimport type { LabelCopy } from \"@athenaintel/agent-runtime/offline-status\";\nimport {\n ArchiveIcon,\n BotIcon,\n LoaderCircleIcon,\n MessageSquareIcon,\n PlusIcon,\n RefreshCwIcon,\n SearchIcon,\n} from \"lucide-react\";\nimport {\n type ChangeEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { conversationDisplayTitle } from \"../../threads/use-rest-conversation-history\";\nimport { assetTypeToThumb } from \"../mentions/suggestions/data/sources/asset-type-icons\";\n\nexport type ConversationActivityFilter = \"all\" | \"chat\" | \"automated\";\nexport type ConversationTimeGroup =\n | \"Today\"\n | \"Yesterday\"\n | \"This Week\"\n | \"This Month\"\n | \"Older\";\n\nconst TIME_GROUPS: readonly ConversationTimeGroup[] = [\n \"Today\",\n \"Yesterday\",\n \"This Week\",\n \"This Month\",\n \"Older\",\n];\n\nconst AUTOMATED_SOURCE_CHANNELS = new Set([\n \"api\",\n \"email\",\n \"orchestration\",\n \"slack\",\n \"sms\",\n \"task\",\n \"teams\",\n]);\n\n/** Mirrors Agora's persisted background-run classification for list metadata. */\nexport function isAutomatedConversation(\n conversation: Pick<ConversationSummary, \"sourceChannel\" | \"triggerType\">,\n): boolean {\n const sourceChannel = conversation.sourceChannel?.trim().toLowerCase();\n if (sourceChannel && AUTOMATED_SOURCE_CHANNELS.has(sourceChannel))\n return true;\n const triggerType = conversation.triggerType?.trim().toLowerCase();\n return Boolean(triggerType && triggerType !== \"manual\");\n}\n\nexport function conversationTimeGroup(\n value: string,\n now: Date = new Date(),\n): ConversationTimeGroup {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return \"Older\";\n const startOfToday = new Date(\n now.getFullYear(),\n now.getMonth(),\n now.getDate(),\n );\n const startOfYesterday = new Date(startOfToday.getTime() - 86_400_000);\n const startOfWeek = new Date(\n startOfToday.getTime() - startOfToday.getDay() * 86_400_000,\n );\n const startOfMonth = new Date(now.getFullYear(), now.getMonth(), 1);\n if (date >= startOfToday) return \"Today\";\n if (date >= startOfYesterday) return \"Yesterday\";\n if (date >= startOfWeek) return \"This Week\";\n if (date >= startOfMonth) return \"This Month\";\n return \"Older\";\n}\n\nexport interface ConversationHistoryPanelProps {\n conversations: readonly ConversationSummary[];\n activeThreadId: string;\n search: string;\n onSearchChange: (search: string) => void;\n activityFilter: ConversationActivityFilter;\n onActivityFilterChange: (filter: ConversationActivityFilter) => void;\n originFilter: string;\n onOriginFilterChange: (origin: string) => void;\n onSelect: (threadId: string) => void;\n onNewChat: () => void;\n onRefresh: () => void;\n onArchive: (threadId: string) => void;\n onSetReadState: (threadId: string, isUnread: boolean) => void;\n isLoading?: boolean;\n isRefreshing?: boolean;\n hasNextPage?: boolean;\n isFetchingNextPage?: boolean;\n onLoadMore?: () => void;\n /**\n * The pointer has rested on a conversation row for `hoverIntentDelayMs`:\n * the user is likely to open it next. Hosts wake and pre-dial the thread\n * here so the click lands on a warm instance with its hello in hand.\n */\n onHoverIntent?: (threadId: string) => void;\n /** The pointer left a row whose intent had fired. */\n onHoverIntentEnd?: (threadId: string) => void;\n /** Dwell before a hover counts as intent; a pass-through never fires. */\n hoverIntentDelayMs?: number;\n /**\n * Why what needs Athena waits, or `null` while Athena answers: a host that\n * keeps nothing while Athena can't be reached passes `NEEDS_CONNECTION`\n * (`@athenaintel/agent-runtime/offline-status`). Refresh, the search box\n * (a search asks Athena), Archive and loading older sessions are then\n * disabled with it as their tooltip, and a list or a search that can't load\n * says it instead of spinning. The rows already loaded, the filters and New\n * stay as they are.\n */\n actionsUnavailable?: LabelCopy | null;\n}\n\n/** A disabled control's tooltip: the reason's label, then its line. */\nfunction unavailableTitle(reason: LabelCopy): string {\n return `${reason.label} — ${reason.detail}`;\n}\n\nfunction originKey(conversation: ConversationSummary): string {\n return conversation.appId ?? conversation.sourceChannel ?? \"unknown\";\n}\n\nfunction originLabel(value: string): string {\n const normalized = value.toLowerCase();\n if (normalized.includes(\"chrome\")) return \"Chrome\";\n if (normalized.includes(\"powerpoint\")) return \"PowerPoint\";\n if (normalized.includes(\"word\")) return \"Word\";\n if (normalized.includes(\"excel\")) return \"Excel\";\n if (normalized.includes(\"office\")) return \"Office\";\n if (normalized === \"web\" || normalized.includes(\"olympus\")) return \"Athena\";\n if (normalized.includes(\"mobile\")) return \"Mobile\";\n if (value === \"unknown\") return \"Legacy\";\n return value.replace(/^athena[-_]/, \"\").replaceAll(\"_\", \" \");\n}\n\nfunction relativeTime(value: string): string {\n const timestamp = Date.parse(value);\n if (!Number.isFinite(timestamp)) return \"\";\n const elapsed = Math.max(0, Date.now() - timestamp);\n const minutes = Math.floor(elapsed / 60_000);\n if (minutes < 1) return \"<1m ago\";\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ${minutes % 60}m ago`;\n const days = Math.floor(hours / 24);\n return days < 7 ? `${days}d ago` : new Date(timestamp).toLocaleDateString();\n}\n\nfunction ConversationTypeIcon({\n conversation,\n automated,\n}: {\n conversation: ConversationSummary;\n automated: boolean;\n}) {\n if (conversation.state === \"running\") {\n return (\n <LoaderCircleIcon\n aria-label=\"Conversation running\"\n className=\"mt-0.5 size-4 shrink-0 animate-spin text-primary\"\n />\n );\n }\n const thumbnail = assetTypeToThumb(conversation.assetType ?? \"session\");\n if (thumbnail) {\n return <img src={thumbnail} alt=\"\" className=\"mt-0.5 size-4 shrink-0\" />;\n }\n return automated ? (\n <BotIcon className=\"mt-0.5 size-4 shrink-0 text-primary\" />\n ) : (\n <MessageSquareIcon className=\"mt-0.5 size-4 shrink-0 text-emerald-500\" />\n );\n}\n\nexport function ConversationHistoryPanel({\n conversations,\n activeThreadId,\n search,\n onSearchChange,\n activityFilter,\n onActivityFilterChange,\n originFilter,\n onOriginFilterChange,\n onSelect,\n onNewChat,\n onRefresh,\n onArchive,\n onSetReadState,\n isLoading = false,\n isRefreshing = false,\n hasNextPage = false,\n isFetchingNextPage = false,\n onLoadMore,\n onHoverIntent,\n onHoverIntentEnd,\n hoverIntentDelayMs = 150,\n actionsUnavailable = null,\n}: ConversationHistoryPanelProps) {\n const unavailable = actionsUnavailable\n ? unavailableTitle(actionsUnavailable)\n : null;\n // Hover intent: one dwell timer for the row under the pointer; a row the\n // pointer merely crosses never fires. The id whose intent fired is kept so\n // its end is reported exactly once — on leave, when the row disappears\n // (filter, archive, refresh) or when the panel closes under the pointer.\n // The callbacks are read through refs so an inline handler's identity\n // changing on a parent re-render neither re-arms nor ends anything.\n const hoverTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const hoverIntentThreadId = useRef<string | null>(null);\n const onHoverIntentRef = useRef(onHoverIntent);\n onHoverIntentRef.current = onHoverIntent;\n const onHoverIntentEndRef = useRef(onHoverIntentEnd);\n onHoverIntentEndRef.current = onHoverIntentEnd;\n const cancelHoverTimer = useCallback(() => {\n if (hoverTimer.current === null) return;\n clearTimeout(hoverTimer.current);\n hoverTimer.current = null;\n }, []);\n const endHoverIntent = useCallback(() => {\n const threadId = hoverIntentThreadId.current;\n if (threadId === null) return;\n hoverIntentThreadId.current = null;\n onHoverIntentEndRef.current?.(threadId);\n }, []);\n useEffect(\n () => () => {\n cancelHoverTimer();\n endHoverIntent();\n },\n [cancelHoverTimer, endHoverIntent],\n );\n const handleRowEnter = (threadId: string) => {\n if (!onHoverIntentRef.current) return;\n cancelHoverTimer();\n hoverTimer.current = setTimeout(() => {\n hoverTimer.current = null;\n hoverIntentThreadId.current = threadId;\n onHoverIntentRef.current?.(threadId);\n }, hoverIntentDelayMs);\n };\n const handleRowLeave = (threadId: string) => {\n cancelHoverTimer();\n if (hoverIntentThreadId.current !== threadId) return;\n endHoverIntent();\n };\n const origins = useMemo(\n () => [...new Set(conversations.map(originKey))].sort(),\n [conversations],\n );\n const grouped = useMemo(() => {\n const visible = conversations.filter((conversation) => {\n const automated = isAutomatedConversation(conversation);\n if (activityFilter === \"chat\" && automated) return false;\n if (activityFilter === \"automated\" && !automated) return false;\n return originFilter === \"all\" || originKey(conversation) === originFilter;\n });\n const byGroup = new Map<ConversationTimeGroup, ConversationSummary[]>();\n for (const conversation of visible) {\n const group = conversationTimeGroup(conversation.updatedAt);\n const items = byGroup.get(group) ?? [];\n items.push(conversation);\n byGroup.set(group, items);\n }\n return TIME_GROUPS.flatMap((group) => {\n const items = byGroup.get(group);\n return items ? [{ group, items }] : [];\n });\n }, [activityFilter, conversations, originFilter]);\n // The hovered row left the list (filter, archive, refresh): no leave event\n // will come for it, so its intent ends here.\n useEffect(() => {\n const threadId = hoverIntentThreadId.current;\n if (threadId === null) return;\n const stillVisible = grouped.some(({ items }) =>\n items.some((conversation) => conversation.threadId === threadId),\n );\n if (!stillVisible) endHoverIntent();\n }, [grouped, endHoverIntent]);\n const visibleCount = grouped.reduce(\n (count, group) => count + group.items.length,\n 0,\n );\n const handleSearch = (event: ChangeEvent<HTMLInputElement>) =>\n onSearchChange(event.target.value);\n // A list that never loaded, or a search with nothing to show, waits on\n // Athena while it can't be reached: say so instead of spinning, or of\n // \"No matching sessions\" for a search that never ran.\n const listWaitsOnAthena =\n actionsUnavailable !== null &&\n (isLoading || (visibleCount === 0 && search.trim().length > 0));\n\n return (\n <section\n aria-label=\"Conversation history\"\n className=\"border-b border-border bg-background px-2 pb-2\"\n data-testid=\"conversation-history-panel\"\n >\n <div className=\"flex h-10 items-center gap-1.5 px-1\">\n <h2 className=\"text-[11px] font-semibold uppercase tracking-[0.08em] text-muted-foreground\">\n Sessions\n </h2>\n <button\n type=\"button\"\n aria-label=\"Refresh sessions\"\n title={unavailable ?? \"Refresh sessions\"}\n disabled={isRefreshing || unavailable !== null}\n onClick={onRefresh}\n className=\"ml-auto rounded-md p-1.5 text-muted-foreground hover:bg-accent hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <RefreshCwIcon\n className={cn(\n \"size-3.5\",\n isRefreshing && unavailable === null && \"animate-spin\",\n )}\n />\n </button>\n <button\n type=\"button\"\n onClick={onNewChat}\n className=\"flex h-7 shrink-0 items-center gap-1 rounded-md bg-primary px-2 text-[11px] font-medium text-primary-foreground\"\n >\n <PlusIcon className=\"size-3\" /> New\n </button>\n </div>\n <label className=\"relative block min-w-0 px-1 pb-2\">\n <SearchIcon className=\"pointer-events-none absolute left-3 top-1/2 size-3.5 -translate-y-[calc(50%+0.25rem)] text-muted-foreground\" />\n <span className=\"sr-only\">Search sessions</span>\n <input\n value={search}\n onChange={handleSearch}\n placeholder=\"Search sessions...\"\n // Read-only rather than disabled: no search can start, and the focus of\n // someone typing when Athena went away stays where it was.\n readOnly={unavailable !== null}\n aria-disabled={unavailable !== null || undefined}\n title={unavailable ?? undefined}\n className=\"h-8 w-full rounded-md border border-border bg-muted/40 pl-7 pr-2 text-xs outline-none focus:border-primary focus:bg-background aria-disabled:cursor-not-allowed aria-disabled:opacity-60\"\n />\n </label>\n <div className=\"flex gap-1 overflow-x-auto px-1 pb-2 text-[11px]\">\n {([\"all\", \"chat\", \"automated\"] as const).map((filter) => (\n <button\n key={filter}\n type=\"button\"\n onClick={() => onActivityFilterChange(filter)}\n className={cn(\n \"rounded-full border px-2 py-1 capitalize\",\n activityFilter === filter\n ? \"border-primary bg-primary/10 text-primary\"\n : \"border-border text-muted-foreground\",\n )}\n >\n {filter === \"chat\"\n ? \"Chats\"\n : filter === \"automated\"\n ? \"Automations\"\n : \"All\"}\n </button>\n ))}\n <select\n aria-label=\"Filter by origin\"\n value={originFilter}\n onChange={(event) => onOriginFilterChange(event.target.value)}\n className=\"ml-auto rounded-full border border-border bg-background px-2 text-[11px] text-muted-foreground\"\n >\n <option value=\"all\">All origins</option>\n {origins.map((origin) => (\n <option key={origin} value={origin}>\n {originLabel(origin)}\n </option>\n ))}\n </select>\n </div>\n <div className=\"max-h-[min(60vh,28rem)] overflow-y-auto px-0.5\">\n {listWaitsOnAthena && actionsUnavailable ? (\n <p\n role=\"status\"\n data-testid=\"conversation-history-unavailable\"\n className=\"px-2 py-4 text-xs text-muted-foreground\"\n >\n <span className=\"font-medium text-foreground\">\n {actionsUnavailable.label}\n </span>{\" \"}\n {actionsUnavailable.detail}\n </p>\n ) : isLoading ? (\n <div className=\"flex items-center gap-2 px-2 py-4 text-xs text-muted-foreground\">\n <LoaderCircleIcon className=\"size-3.5 animate-spin\" /> Loading\n sessions…\n </div>\n ) : visibleCount === 0 ? (\n <p className=\"px-2 py-4 text-xs text-muted-foreground\">\n No matching sessions.\n </p>\n ) : (\n grouped.map(({ group, items }) => (\n <div key={group}>\n <h3 className=\"px-2 pb-1 pt-2 text-[10px] font-semibold uppercase tracking-[0.08em] text-muted-foreground/75\">\n {group}\n </h3>\n {items.map((conversation) => {\n const automated = isAutomatedConversation(conversation);\n return (\n <div\n key={conversation.threadId}\n className={cn(\n \"group flex items-start gap-2 rounded-md px-2 py-2 hover:bg-accent\",\n conversation.threadId === activeThreadId &&\n \"bg-primary/10 text-primary\",\n )}\n onMouseEnter={() => handleRowEnter(conversation.threadId)}\n onMouseLeave={() => handleRowLeave(conversation.threadId)}\n >\n <button\n type=\"button\"\n onClick={() => {\n onSelect(conversation.threadId);\n if (conversation.isUnread) {\n onSetReadState(conversation.threadId, false);\n }\n }}\n className=\"flex min-w-0 flex-1 items-start gap-2 text-left\"\n >\n <ConversationTypeIcon\n conversation={conversation}\n automated={automated}\n />\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex items-start gap-1\">\n <span className=\"line-clamp-2 flex-1 text-xs font-medium leading-snug\">\n {conversationDisplayTitle(conversation)}\n </span>\n {conversation.isUnread ? (\n <span\n aria-label=\"Unread\"\n className=\"mt-1 size-1.5 shrink-0 rounded-full bg-primary\"\n />\n ) : null}\n </span>\n <span className=\"mt-0.5 flex items-center gap-1.5 text-[10px] text-muted-foreground\">\n <span>{relativeTime(conversation.updatedAt)}</span>\n <span aria-hidden=\"true\">·</span>\n <span className=\"truncate\">\n {originLabel(originKey(conversation))}\n </span>\n </span>\n </span>\n </button>\n <button\n type=\"button\"\n aria-label={`Archive ${conversationDisplayTitle(conversation)}`}\n title={unavailable ?? \"Archive conversation\"}\n disabled={unavailable !== null}\n onClick={() => onArchive(conversation.threadId)}\n className=\"invisible rounded p-1 text-muted-foreground hover:bg-background hover:text-foreground group-hover:visible focus:visible disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <ArchiveIcon className=\"size-3.5\" />\n </button>\n </div>\n );\n })}\n </div>\n ))\n )}\n {listWaitsOnAthena ? null : hasNextPage ? (\n <button\n type=\"button\"\n title={unavailable ?? undefined}\n disabled={isFetchingNextPage || unavailable !== null}\n onClick={onLoadMore}\n className=\"mt-1 w-full rounded-lg py-2 text-xs text-muted-foreground hover:bg-accent disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {isFetchingNextPage ? \"Loading…\" : \"Load older sessions\"}\n </button>\n ) : visibleCount > 0 ? (\n <p className=\"py-2 text-center text-[10px] text-muted-foreground/70\">\n No more sessions\n </p>\n ) : null}\n </div>\n </section>\n );\n}\n"],"names":[],"mappings":"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"}
|
package/dist/chat-ui/index.cjs
CHANGED
|
@@ -26,6 +26,8 @@ const assetTypeIcons = require("./mentions/suggestions/data/sources/asset-type-i
|
|
|
26
26
|
const types = require("./mentions/suggestions/data/types.cjs");
|
|
27
27
|
const assetUrls = require("./lib/asset-urls.cjs");
|
|
28
28
|
const messageComponents = require("./messages/message-components.cjs");
|
|
29
|
+
const messageImages = require("./messages/message-images.cjs");
|
|
30
|
+
const arrivalAnimation = require("./messages/arrival-animation.cjs");
|
|
29
31
|
const threadChrome = require("./messages/thread-chrome.cjs");
|
|
30
32
|
const userEditComposer = require("./messages/user-edit-composer.cjs");
|
|
31
33
|
const messageActionsConfig = require("./messages/message-actions-config.cjs");
|
|
@@ -33,12 +35,16 @@ const runningIndicator = require("./messages/running-indicator.cjs");
|
|
|
33
35
|
const signInCard = require("./auth/sign-in-card.cjs");
|
|
34
36
|
const runtimeMessage = require("./messages/runtime-message.cjs");
|
|
35
37
|
const wakeMarker = require("./messages/wake-marker.cjs");
|
|
38
|
+
const handoffArrivalDivider = require("./messages/handoff-arrival-divider.cjs");
|
|
39
|
+
const answerLabel = require("./messages/answer-label.cjs");
|
|
36
40
|
const voiceDelegationCard = require("./messages/voice-delegation-card.cjs");
|
|
37
41
|
const continuePill = require("./messages/continue-pill.cjs");
|
|
38
42
|
const statewireContinueRun = require("./messages/statewire-continue-run.cjs");
|
|
39
43
|
const StatewireApprovalCard = require("../chat/StatewireApprovalCard.cjs");
|
|
44
|
+
const browserDecisionCheck = require("../chat/browser-decision-check.cjs");
|
|
40
45
|
const useStatewireApprovalRequest = require("../chat/use-statewire-approval-request.cjs");
|
|
41
46
|
const StatewireQueuedMessages = require("../chat/StatewireQueuedMessages.cjs");
|
|
47
|
+
const DrivingOnChip = require("../chat/DrivingOnChip.cjs");
|
|
42
48
|
const WaitingOnYouBanner = require("../chat/WaitingOnYouBanner.cjs");
|
|
43
49
|
const interrupts = require("../agent-runtime/src/interrupts.cjs");
|
|
44
50
|
exports.ChatThreadShell = chatThreadShell.ChatThreadShell;
|
|
@@ -107,6 +113,10 @@ exports.THREAD_SCROLL_TO_BOTTOM_CLASS = messageComponents.THREAD_SCROLL_TO_BOTTO
|
|
|
107
113
|
exports.UserMessage = messageComponents.UserMessage;
|
|
108
114
|
exports.UserMessageText = messageComponents.UserMessageText;
|
|
109
115
|
exports.createAssistantMessage = messageComponents.createAssistantMessage;
|
|
116
|
+
exports.MessageImageGallery = messageImages.MessageImageGallery;
|
|
117
|
+
exports.MessageImagePart = messageImages.MessageImagePart;
|
|
118
|
+
exports.MESSAGE_ARRIVAL_ANIMATION_CLASS = arrivalAnimation.MESSAGE_ARRIVAL_ANIMATION_CLASS;
|
|
119
|
+
exports.useMessageArrivalAnimation = arrivalAnimation.useMessageArrivalAnimation;
|
|
110
120
|
exports.IconButton = threadChrome.IconButton;
|
|
111
121
|
exports.SmallIconButton = threadChrome.SmallIconButton;
|
|
112
122
|
exports.THREAD_HEADER_ACTIONS_CLASS = threadChrome.THREAD_HEADER_ACTIONS_CLASS;
|
|
@@ -128,6 +138,11 @@ exports.SignInTextField = signInCard.SignInTextField;
|
|
|
128
138
|
exports.RuntimeMessageCard = runtimeMessage.RuntimeMessageCard;
|
|
129
139
|
exports.WakeMarkerCard = wakeMarker.WakeMarkerCard;
|
|
130
140
|
exports.WakeMarkerMessage = wakeMarker.WakeMarkerMessage;
|
|
141
|
+
exports.HandoffArrivalAfterMessage = handoffArrivalDivider.HandoffArrivalAfterMessage;
|
|
142
|
+
exports.HandoffArrivalDivider = handoffArrivalDivider.HandoffArrivalDivider;
|
|
143
|
+
exports.HandoffArrivalScope = handoffArrivalDivider.HandoffArrivalScope;
|
|
144
|
+
exports.AnswerLabel = answerLabel.AnswerLabel;
|
|
145
|
+
exports.AnswerLabelScope = answerLabel.AnswerLabelScope;
|
|
131
146
|
exports.VoiceDelegationCard = voiceDelegationCard.VoiceDelegationCard;
|
|
132
147
|
exports.VoiceDelegationMessage = voiceDelegationCard.VoiceDelegationMessage;
|
|
133
148
|
exports.ContinuePill = continuePill.ContinuePill;
|
|
@@ -135,8 +150,11 @@ exports.StatewireContinueRunAffordance = statewireContinueRun.StatewireContinueR
|
|
|
135
150
|
exports.StatewireContinueRunButton = statewireContinueRun.StatewireContinueRunButton;
|
|
136
151
|
exports.StatewireRunEndedFooter = statewireContinueRun.StatewireRunEndedFooter;
|
|
137
152
|
exports.StatewireApprovalCard = StatewireApprovalCard.StatewireApprovalCard;
|
|
153
|
+
exports.useAthenaBrowserDecisionConfirmer = browserDecisionCheck.useAthenaBrowserDecisionConfirmer;
|
|
154
|
+
exports.useBrowserDecisionConfirmer = browserDecisionCheck.useBrowserDecisionConfirmer;
|
|
138
155
|
exports.useStatewireApprovalRequest = useStatewireApprovalRequest.useStatewireApprovalRequest;
|
|
139
156
|
exports.StatewireQueuedMessages = StatewireQueuedMessages.StatewireQueuedMessages;
|
|
157
|
+
exports.DrivingOnChip = DrivingOnChip.DrivingOnChip;
|
|
140
158
|
exports.WaitingOnYouBanner = WaitingOnYouBanner.WaitingOnYouBanner;
|
|
141
159
|
exports.WaitingOnYouBannerView = WaitingOnYouBanner.WaitingOnYouBannerView;
|
|
142
160
|
exports.HITL_PENDING_RESUME_GRACE_MS = interrupts.HITL_PENDING_RESUME_GRACE_MS;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/chat-ui/index.d.ts
CHANGED
|
@@ -36,6 +36,8 @@ export { assetTypeToIcon, assetTypeToThumb, configureAssetIconBasePath, } from "
|
|
|
36
36
|
export { MentionMenuSection, type MentionTool, type MenuItem, type MenuScope, type WebpageMention, type WebpageMentionScope, } from "./mentions/suggestions/data/types";
|
|
37
37
|
export { createOlympusAssetUrl } from "./lib/asset-urls";
|
|
38
38
|
export { COMPOSER_DOCK_CLASS, COMPOSER_EDITOR_ROW_CLASS, COMPOSER_PAPER_DOCK_CLASS, COMPOSER_PAPER_EDITOR_ROW_CLASS, COMPOSER_PAPER_SURFACE_CLASS, COMPOSER_PAPER_TOOLBAR_CLASS, COMPOSER_SURFACE_CLASS, COMPOSER_TOOLBAR_CLASS, BranchPicker, ComposerSendButton, ComposerStopButton, type ComposerSendButtonProps, type ComposerStopButtonProps, MarkdownText, THREAD_SCROLL_TO_BOTTOM_CLASS, UserMessage, UserMessageText, createAssistantMessage, type CreateAssistantMessageOptions, } from "./messages/message-components";
|
|
39
|
+
export { MessageImageGallery, MessageImagePart } from "./messages/message-images";
|
|
40
|
+
export { MESSAGE_ARRIVAL_ANIMATION_CLASS, useMessageArrivalAnimation, } from "./messages/arrival-animation";
|
|
39
41
|
export { IconButton, SmallIconButton, THREAD_HEADER_ACTIONS_CLASS, THREAD_HEADER_CLASS, THREAD_HEADER_ICON_CLASS, THREAD_HEADER_PILL_CLASS, THREAD_PANEL_CLASS, } from "./messages/thread-chrome";
|
|
40
42
|
export { UserEditComposer } from "./messages/user-edit-composer";
|
|
41
43
|
export { MessageActionsReadOnlyProvider, useMessageActionsReadOnly, } from "./messages/message-actions-config";
|
|
@@ -43,11 +45,15 @@ export { TextShimmerLoader, ThreadRunningIndicator, } from "./messages/running-i
|
|
|
43
45
|
export { SignInCard, SignInConsent, SignInFallbackSection, SignInSecondaryButton, SignInSelect, SignInTextField, } from "./auth/sign-in-card";
|
|
44
46
|
export { RuntimeMessageCard, type RuntimeMessageCardProps } from "./messages/runtime-message";
|
|
45
47
|
export { WakeMarkerCard, type WakeMarkerCardProps, WakeMarkerMessage, } from "./messages/wake-marker";
|
|
48
|
+
export { HandoffArrivalAfterMessage, HandoffArrivalDivider, type HandoffArrivalDividerProps, HandoffArrivalScope, } from "./messages/handoff-arrival-divider";
|
|
49
|
+
export { AnswerLabel, type AnswerLabelProps, AnswerLabelScope, type AnswerLabelScopeProps, } from "./messages/answer-label";
|
|
46
50
|
export { VoiceDelegationCard, type VoiceDelegationCardProps, VoiceDelegationMessage, } from "./messages/voice-delegation-card";
|
|
47
51
|
export { ContinuePill } from "./messages/continue-pill";
|
|
48
52
|
export { type ReadStatewireTailEnding, StatewireContinueRunAffordance, StatewireContinueRunButton, type StatewireContinueRunButtonProps, StatewireRunEndedFooter, type StatewireRunEndedFooterActionsContext, type StatewireRunEndedFooterProps, type StatewireTailEnding, } from "./messages/statewire-continue-run";
|
|
49
|
-
export { StatewireApprovalCard, type StatewireApprovalCardProps, type StatewireApprovalEditorContext, type StatewireApprovalRequestContext, } from "../chat/StatewireApprovalCard";
|
|
53
|
+
export { StatewireApprovalCard, type StatewireApprovalCardProps, type StatewireApprovalEditorContext, type StatewireApprovalRequestContext, type StatewireDecisionAnswer, type StatewireDecisionConfirmer, } from "../chat/StatewireApprovalCard";
|
|
54
|
+
export { type AthenaBrowserDecisionConfirmerOptions, type BrowserDecisionConfirmerOptions, type PendingBrowserDecisionConfirm, useAthenaBrowserDecisionConfirmer, useBrowserDecisionConfirmer, } from "../chat/browser-decision-check";
|
|
50
55
|
export { type StatewireApprovalRequest, type StatewireInterruptPredicate, type UseStatewireApprovalRequestOptions, useStatewireApprovalRequest, } from "../chat/use-statewire-approval-request";
|
|
51
56
|
export { StatewireQueuedMessages, type StatewireQueueEditorContext, type StatewireQueueEvent, type StatewireQueueRowContentContext, type StatewireQueueRowMarkerContext, type StatewireQueuedMessagesProps, } from "../chat/StatewireQueuedMessages";
|
|
57
|
+
export { DrivingOnChip, type DrivingOnChipProps } from "../chat/DrivingOnChip";
|
|
52
58
|
export { WaitingOnYouBanner, type WaitingOnYouBannerProps, WaitingOnYouBannerView, type WaitingOnYouBannerViewProps, } from "../chat/WaitingOnYouBanner";
|
|
53
59
|
export { HITL_PENDING_RESUME_GRACE_MS } from "../agent-runtime/src/index";
|
package/dist/chat-ui/index.js
CHANGED
|
@@ -24,6 +24,8 @@ import { assetTypeToIcon, assetTypeToThumb, configureAssetIconBasePath } from ".
|
|
|
24
24
|
import { MentionMenuSection } from "./mentions/suggestions/data/types.js";
|
|
25
25
|
import { createOlympusAssetUrl } from "./lib/asset-urls.js";
|
|
26
26
|
import { BranchPicker, COMPOSER_DOCK_CLASS, COMPOSER_EDITOR_ROW_CLASS, COMPOSER_PAPER_DOCK_CLASS, COMPOSER_PAPER_EDITOR_ROW_CLASS, COMPOSER_PAPER_SURFACE_CLASS, COMPOSER_PAPER_TOOLBAR_CLASS, COMPOSER_SURFACE_CLASS, COMPOSER_TOOLBAR_CLASS, ComposerSendButton, ComposerStopButton, MarkdownText, THREAD_SCROLL_TO_BOTTOM_CLASS, UserMessage, UserMessageText, createAssistantMessage } from "./messages/message-components.js";
|
|
27
|
+
import { MessageImageGallery, MessageImagePart } from "./messages/message-images.js";
|
|
28
|
+
import { MESSAGE_ARRIVAL_ANIMATION_CLASS, useMessageArrivalAnimation } from "./messages/arrival-animation.js";
|
|
27
29
|
import { IconButton, SmallIconButton, THREAD_HEADER_ACTIONS_CLASS, THREAD_HEADER_CLASS, THREAD_HEADER_ICON_CLASS, THREAD_HEADER_PILL_CLASS, THREAD_PANEL_CLASS } from "./messages/thread-chrome.js";
|
|
28
30
|
import { UserEditComposer } from "./messages/user-edit-composer.js";
|
|
29
31
|
import { MessageActionsReadOnlyProvider, useMessageActionsReadOnly } from "./messages/message-actions-config.js";
|
|
@@ -31,15 +33,21 @@ import { TextShimmerLoader, ThreadRunningIndicator } from "./messages/running-in
|
|
|
31
33
|
import { SignInCard, SignInConsent, SignInFallbackSection, SignInSecondaryButton, SignInSelect, SignInTextField } from "./auth/sign-in-card.js";
|
|
32
34
|
import { RuntimeMessageCard } from "./messages/runtime-message.js";
|
|
33
35
|
import { WakeMarkerCard, WakeMarkerMessage } from "./messages/wake-marker.js";
|
|
36
|
+
import { HandoffArrivalAfterMessage, HandoffArrivalDivider, HandoffArrivalScope } from "./messages/handoff-arrival-divider.js";
|
|
37
|
+
import { AnswerLabel, AnswerLabelScope } from "./messages/answer-label.js";
|
|
34
38
|
import { VoiceDelegationCard, VoiceDelegationMessage } from "./messages/voice-delegation-card.js";
|
|
35
39
|
import { ContinuePill } from "./messages/continue-pill.js";
|
|
36
40
|
import { StatewireContinueRunAffordance, StatewireContinueRunButton, StatewireRunEndedFooter } from "./messages/statewire-continue-run.js";
|
|
37
41
|
import { StatewireApprovalCard } from "../chat/StatewireApprovalCard.js";
|
|
42
|
+
import { useAthenaBrowserDecisionConfirmer, useBrowserDecisionConfirmer } from "../chat/browser-decision-check.js";
|
|
38
43
|
import { useStatewireApprovalRequest } from "../chat/use-statewire-approval-request.js";
|
|
39
44
|
import { StatewireQueuedMessages } from "../chat/StatewireQueuedMessages.js";
|
|
45
|
+
import { DrivingOnChip } from "../chat/DrivingOnChip.js";
|
|
40
46
|
import { WaitingOnYouBanner, WaitingOnYouBannerView } from "../chat/WaitingOnYouBanner.js";
|
|
41
47
|
import { HITL_PENDING_RESUME_GRACE_MS } from "../agent-runtime/src/interrupts.js";
|
|
42
48
|
export {
|
|
49
|
+
AnswerLabel,
|
|
50
|
+
AnswerLabelScope,
|
|
43
51
|
AthenaGraphQLError,
|
|
44
52
|
BranchPicker,
|
|
45
53
|
COMPOSER_DOCK_CLASS,
|
|
@@ -61,10 +69,15 @@ export {
|
|
|
61
69
|
ComposerStopButton,
|
|
62
70
|
ContinuePill,
|
|
63
71
|
ConversationHistoryPanel,
|
|
72
|
+
DrivingOnChip,
|
|
64
73
|
HISTORY_EDGE_NEAR_MARGIN_PX,
|
|
65
74
|
HITL_PENDING_RESUME_GRACE_MS,
|
|
75
|
+
HandoffArrivalAfterMessage,
|
|
76
|
+
HandoffArrivalDivider,
|
|
77
|
+
HandoffArrivalScope,
|
|
66
78
|
HistoryEdgeRow,
|
|
67
79
|
IconButton,
|
|
80
|
+
MESSAGE_ARRIVAL_ANIMATION_CLASS,
|
|
68
81
|
MarkdownText,
|
|
69
82
|
MentionAuthCtx,
|
|
70
83
|
MentionChip,
|
|
@@ -77,6 +90,8 @@ export {
|
|
|
77
90
|
MentionSuggestionsExtension,
|
|
78
91
|
MenuList,
|
|
79
92
|
MessageActionsReadOnlyProvider,
|
|
93
|
+
MessageImageGallery,
|
|
94
|
+
MessageImagePart,
|
|
80
95
|
PendingAttachmentUploads,
|
|
81
96
|
ROOT_MENTION_CATEGORIES,
|
|
82
97
|
RuntimeMessageCard,
|
|
@@ -133,9 +148,12 @@ export {
|
|
|
133
148
|
resolveComposerAction,
|
|
134
149
|
serializeDraft,
|
|
135
150
|
serializeMention,
|
|
151
|
+
useAthenaBrowserDecisionConfirmer,
|
|
152
|
+
useBrowserDecisionConfirmer,
|
|
136
153
|
useMentionAuth,
|
|
137
154
|
useMentionSuggestions,
|
|
138
155
|
useMessageActionsReadOnly,
|
|
156
|
+
useMessageArrivalAnimation,
|
|
139
157
|
useStatewireApprovalRequest,
|
|
140
158
|
useStatewireToolOutputs,
|
|
141
159
|
webpageMentionFingerprint
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|