@athenaintel/react 0.43.0 → 0.50.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 +258 -8
- 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/call-recap.cjs +319 -0
- package/dist/agent-runtime/src/call-recap.cjs.map +1 -0
- package/dist/agent-runtime/src/call-recap.d.ts +142 -0
- package/dist/agent-runtime/src/call-recap.js +319 -0
- package/dist/agent-runtime/src/call-recap.js.map +1 -0
- package/dist/agent-runtime/src/chat-outbox-store.cjs +1 -0
- package/dist/agent-runtime/src/chat-outbox-store.cjs.map +1 -1
- package/dist/agent-runtime/src/chat-outbox-store.d.ts +7 -0
- package/dist/agent-runtime/src/chat-outbox-store.js +1 -0
- package/dist/agent-runtime/src/chat-outbox-store.js.map +1 -1
- package/dist/agent-runtime/src/chat-outbox.cjs +46 -5
- package/dist/agent-runtime/src/chat-outbox.cjs.map +1 -1
- package/dist/agent-runtime/src/chat-outbox.d.ts +29 -0
- package/dist/agent-runtime/src/chat-outbox.js +46 -5
- package/dist/agent-runtime/src/chat-outbox.js.map +1 -1
- package/dist/agent-runtime/src/client-tool-bridge.cjs +15 -15
- package/dist/agent-runtime/src/client-tool-bridge.cjs.map +1 -1
- package/dist/agent-runtime/src/conversation-index.cjs +8 -8
- package/dist/agent-runtime/src/conversation-index.cjs.map +1 -1
- package/dist/agent-runtime/src/conversation-index.d.ts +7 -0
- package/dist/agent-runtime/src/conversation-index.js.map +1 -1
- package/dist/agent-runtime/src/conversation-list.cjs +2 -1
- package/dist/agent-runtime/src/conversation-list.cjs.map +1 -1
- package/dist/agent-runtime/src/conversation-list.d.ts +19 -3
- package/dist/agent-runtime/src/conversation-list.js +2 -1
- package/dist/agent-runtime/src/conversation-list.js.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 +16 -9
- package/dist/agent-runtime/src/interrupts.cjs +71 -19
- package/dist/agent-runtime/src/interrupts.cjs.map +1 -1
- package/dist/agent-runtime/src/interrupts.d.ts +40 -3
- package/dist/agent-runtime/src/interrupts.js +56 -4
- 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/model-context.cjs +3 -2
- package/dist/agent-runtime/src/model-context.cjs.map +1 -1
- package/dist/agent-runtime/src/model-context.d.ts +6 -1
- package/dist/agent-runtime/src/model-context.js +3 -2
- package/dist/agent-runtime/src/model-context.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 +41 -0
- package/dist/agent-runtime/src/send-recovery.cjs +37 -3
- package/dist/agent-runtime/src/send-recovery.cjs.map +1 -1
- package/dist/agent-runtime/src/send-recovery.d.ts +19 -0
- package/dist/agent-runtime/src/send-recovery.js +37 -3
- package/dist/agent-runtime/src/send-recovery.js.map +1 -1
- 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 +868 -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 +14 -13
- package/dist/agent-runtime/src/use-conversation-list.cjs.map +1 -1
- package/dist/agent-runtime/src/use-conversation-list.d.ts +6 -0
- package/dist/agent-runtime/src/use-conversation-list.js +3 -2
- package/dist/agent-runtime/src/use-conversation-list.js.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs +45 -20
- 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 +10 -3
- package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js +27 -2
- 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 +40 -22
- package/dist/agent-runtime/src/use-deep-agent-runtime.cjs.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-runtime.d.ts +17 -0
- package/dist/agent-runtime/src/use-deep-agent-runtime.js +24 -6
- package/dist/agent-runtime/src/use-deep-agent-runtime.js.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 +588 -130
- package/dist/agent-runtime/src/use-deep-agent-voice.cjs.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-voice.d.ts +162 -10
- package/dist/agent-runtime/src/use-deep-agent-voice.js +529 -71
- 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 +34 -26
- package/dist/agent-runtime/src/voice-earcon.cjs +139 -0
- package/dist/agent-runtime/src/voice-earcon.cjs.map +1 -0
- package/dist/agent-runtime/src/voice-earcon.d.ts +38 -0
- package/dist/agent-runtime/src/voice-earcon.js +139 -0
- package/dist/agent-runtime/src/voice-earcon.js.map +1 -0
- 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 +63 -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-presentation.cjs +2 -0
- package/dist/agent-runtime/src/voice-presentation.cjs.map +1 -1
- package/dist/agent-runtime/src/voice-presentation.js +2 -0
- package/dist/agent-runtime/src/voice-presentation.js.map +1 -1
- 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 +18 -5
- 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 +23 -6
- 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 +166 -37
- package/dist/chat/StatewireApprovalCard.cjs.map +1 -1
- package/dist/chat/StatewireApprovalCard.d.ts +91 -2
- package/dist/chat/StatewireApprovalCard.js +156 -27
- 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 +81 -69
- package/dist/chat/StatewireQueuedMessages.cjs.map +1 -1
- package/dist/chat/StatewireQueuedMessages.d.ts +25 -13
- package/dist/chat/StatewireQueuedMessages.js +73 -61
- package/dist/chat/StatewireQueuedMessages.js.map +1 -1
- package/dist/chat/WaitingOnYouBanner.cjs +9 -5
- package/dist/chat/WaitingOnYouBanner.cjs.map +1 -1
- package/dist/chat/WaitingOnYouBanner.js +7 -3
- package/dist/chat/WaitingOnYouBanner.js.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 +96 -29
- package/dist/chat/chat-voice-controls.cjs.map +1 -1
- package/dist/chat/chat-voice-controls.d.ts +42 -3
- package/dist/chat/chat-voice-controls.js +92 -25
- 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 +21 -0
- package/dist/chat-ui/index.cjs.map +1 -1
- package/dist/chat-ui/index.d.ts +8 -1
- package/dist/chat-ui/index.js +21 -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/from-the-call-card.cjs +124 -0
- package/dist/chat-ui/messages/from-the-call-card.cjs.map +1 -0
- package/dist/chat-ui/messages/from-the-call-card.d.ts +17 -0
- package/dist/chat-ui/messages/from-the-call-card.js +124 -0
- package/dist/chat-ui/messages/from-the-call-card.js.map +1 -0
- 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 +3 -2
- package/dist/chat-ui/rich-text/chat-link.cjs.map +1 -1
- package/dist/chat-ui/rich-text/chat-link.d.ts +4 -0
- package/dist/chat-ui/rich-text/chat-link.js +4 -3
- package/dist/chat-ui/rich-text/chat-link.js.map +1 -1
- package/dist/chat-ui/rich-text/chat-message-body.cjs +9 -8
- package/dist/chat-ui/rich-text/chat-message-body.cjs.map +1 -1
- package/dist/chat-ui/rich-text/chat-message-body.d.ts +12 -0
- package/dist/chat-ui/rich-text/chat-message-body.js +2 -1
- package/dist/chat-ui/rich-text/chat-message-body.js.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 +45 -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 +37 -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 +52 -3
- package/dist/collab/client.cjs.map +1 -1
- package/dist/collab/client.d.ts +27 -0
- package/dist/collab/client.js +52 -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/index.d.ts +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 +27 -8
- package/dist/composer/useReadComposerDraft.cjs.map +1 -1
- package/dist/composer/useReadComposerDraft.d.ts +23 -1
- package/dist/composer/useReadComposerDraft.js +27 -8
- package/dist/composer/useReadComposerDraft.js.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 +29 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +18 -4
- package/dist/index.js +30 -3
- 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/unconfirmed-update-attributions.cjs +190 -0
- package/dist/keryx-http/src/unconfirmed-update-attributions.cjs.map +1 -0
- package/dist/keryx-http/src/unconfirmed-update-attributions.d.ts +132 -0
- package/dist/keryx-http/src/unconfirmed-update-attributions.js +190 -0
- package/dist/keryx-http/src/unconfirmed-update-attributions.js.map +1 -0
- package/dist/keryx-http/src/update-attributions.cjs +141 -0
- package/dist/keryx-http/src/update-attributions.cjs.map +1 -0
- package/dist/keryx-http/src/update-attributions.d.ts +107 -0
- package/dist/keryx-http/src/update-attributions.js +141 -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 +120 -79
- package/dist/provider/AthenaProvider.cjs.map +1 -1
- package/dist/provider/AthenaProvider.d.ts +11 -1
- package/dist/provider/AthenaProvider.js +44 -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/api.cjs.map +1 -1
- package/dist/threads/api.d.ts +15 -0
- package/dist/threads/api.js.map +1 -1
- package/dist/threads/conversation-list-fetcher.cjs +13 -5
- package/dist/threads/conversation-list-fetcher.cjs.map +1 -1
- package/dist/threads/conversation-list-fetcher.d.ts +4 -1
- package/dist/threads/conversation-list-fetcher.js +13 -5
- package/dist/threads/conversation-list-fetcher.js.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 +79 -57
- package/dist/threads/statewire-thread-list.cjs.map +1 -1
- package/dist/threads/statewire-thread-list.d.ts +20 -8
- package/dist/threads/statewire-thread-list.js +28 -6
- package/dist/threads/statewire-thread-list.js.map +1 -1
- package/dist/threads/thread-id-context.cjs +5 -5
- package/dist/threads/thread-id-context.cjs.map +1 -1
- package/dist/threads/use-athena-session-attention.cjs +2 -2
- package/dist/threads/use-athena-session-attention.cjs.map +1 -1
- package/dist/threads/use-athena-sessions.cjs +37 -15
- package/dist/threads/use-athena-sessions.cjs.map +1 -1
- package/dist/threads/use-athena-sessions.d.ts +10 -5
- package/dist/threads/use-athena-sessions.js +28 -6
- package/dist/threads/use-athena-sessions.js.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-rest-conversation-history.d.ts +1 -0
- 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,17 @@ 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");
|
|
41
|
+
const fromTheCallCard = require("./messages/from-the-call-card.cjs");
|
|
37
42
|
const continuePill = require("./messages/continue-pill.cjs");
|
|
38
43
|
const statewireContinueRun = require("./messages/statewire-continue-run.cjs");
|
|
39
44
|
const StatewireApprovalCard = require("../chat/StatewireApprovalCard.cjs");
|
|
45
|
+
const browserDecisionCheck = require("../chat/browser-decision-check.cjs");
|
|
40
46
|
const useStatewireApprovalRequest = require("../chat/use-statewire-approval-request.cjs");
|
|
41
47
|
const StatewireQueuedMessages = require("../chat/StatewireQueuedMessages.cjs");
|
|
48
|
+
const DrivingOnChip = require("../chat/DrivingOnChip.cjs");
|
|
42
49
|
const WaitingOnYouBanner = require("../chat/WaitingOnYouBanner.cjs");
|
|
43
50
|
const interrupts = require("../agent-runtime/src/interrupts.cjs");
|
|
44
51
|
exports.ChatThreadShell = chatThreadShell.ChatThreadShell;
|
|
@@ -107,6 +114,10 @@ exports.THREAD_SCROLL_TO_BOTTOM_CLASS = messageComponents.THREAD_SCROLL_TO_BOTTO
|
|
|
107
114
|
exports.UserMessage = messageComponents.UserMessage;
|
|
108
115
|
exports.UserMessageText = messageComponents.UserMessageText;
|
|
109
116
|
exports.createAssistantMessage = messageComponents.createAssistantMessage;
|
|
117
|
+
exports.MessageImageGallery = messageImages.MessageImageGallery;
|
|
118
|
+
exports.MessageImagePart = messageImages.MessageImagePart;
|
|
119
|
+
exports.MESSAGE_ARRIVAL_ANIMATION_CLASS = arrivalAnimation.MESSAGE_ARRIVAL_ANIMATION_CLASS;
|
|
120
|
+
exports.useMessageArrivalAnimation = arrivalAnimation.useMessageArrivalAnimation;
|
|
110
121
|
exports.IconButton = threadChrome.IconButton;
|
|
111
122
|
exports.SmallIconButton = threadChrome.SmallIconButton;
|
|
112
123
|
exports.THREAD_HEADER_ACTIONS_CLASS = threadChrome.THREAD_HEADER_ACTIONS_CLASS;
|
|
@@ -128,15 +139,25 @@ exports.SignInTextField = signInCard.SignInTextField;
|
|
|
128
139
|
exports.RuntimeMessageCard = runtimeMessage.RuntimeMessageCard;
|
|
129
140
|
exports.WakeMarkerCard = wakeMarker.WakeMarkerCard;
|
|
130
141
|
exports.WakeMarkerMessage = wakeMarker.WakeMarkerMessage;
|
|
142
|
+
exports.HandoffArrivalAfterMessage = handoffArrivalDivider.HandoffArrivalAfterMessage;
|
|
143
|
+
exports.HandoffArrivalDivider = handoffArrivalDivider.HandoffArrivalDivider;
|
|
144
|
+
exports.HandoffArrivalScope = handoffArrivalDivider.HandoffArrivalScope;
|
|
145
|
+
exports.AnswerLabel = answerLabel.AnswerLabel;
|
|
146
|
+
exports.AnswerLabelScope = answerLabel.AnswerLabelScope;
|
|
131
147
|
exports.VoiceDelegationCard = voiceDelegationCard.VoiceDelegationCard;
|
|
132
148
|
exports.VoiceDelegationMessage = voiceDelegationCard.VoiceDelegationMessage;
|
|
149
|
+
exports.FromTheCallAfterMessage = fromTheCallCard.FromTheCallAfterMessage;
|
|
150
|
+
exports.FromTheCallCard = fromTheCallCard.FromTheCallCard;
|
|
133
151
|
exports.ContinuePill = continuePill.ContinuePill;
|
|
134
152
|
exports.StatewireContinueRunAffordance = statewireContinueRun.StatewireContinueRunAffordance;
|
|
135
153
|
exports.StatewireContinueRunButton = statewireContinueRun.StatewireContinueRunButton;
|
|
136
154
|
exports.StatewireRunEndedFooter = statewireContinueRun.StatewireRunEndedFooter;
|
|
137
155
|
exports.StatewireApprovalCard = StatewireApprovalCard.StatewireApprovalCard;
|
|
156
|
+
exports.useAthenaBrowserDecisionConfirmer = browserDecisionCheck.useAthenaBrowserDecisionConfirmer;
|
|
157
|
+
exports.useBrowserDecisionConfirmer = browserDecisionCheck.useBrowserDecisionConfirmer;
|
|
138
158
|
exports.useStatewireApprovalRequest = useStatewireApprovalRequest.useStatewireApprovalRequest;
|
|
139
159
|
exports.StatewireQueuedMessages = StatewireQueuedMessages.StatewireQueuedMessages;
|
|
160
|
+
exports.DrivingOnChip = DrivingOnChip.DrivingOnChip;
|
|
140
161
|
exports.WaitingOnYouBanner = WaitingOnYouBanner.WaitingOnYouBanner;
|
|
141
162
|
exports.WaitingOnYouBannerView = WaitingOnYouBanner.WaitingOnYouBannerView;
|
|
142
163
|
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,16 @@ 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";
|
|
51
|
+
export { FromTheCallAfterMessage, FromTheCallCard, type FromTheCallCardProps, } from "./messages/from-the-call-card";
|
|
47
52
|
export { ContinuePill } from "./messages/continue-pill";
|
|
48
53
|
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";
|
|
54
|
+
export { StatewireApprovalCard, type StatewireApprovalCardProps, type StatewireApprovalEditorContext, type StatewireApprovalRequestContext, type StatewireDecisionAnswer, type StatewireDecisionConfirmer, } from "../chat/StatewireApprovalCard";
|
|
55
|
+
export { type AthenaBrowserDecisionConfirmerOptions, type BrowserDecisionConfirmerOptions, type PendingBrowserDecisionConfirm, useAthenaBrowserDecisionConfirmer, useBrowserDecisionConfirmer, } from "../chat/browser-decision-check";
|
|
50
56
|
export { type StatewireApprovalRequest, type StatewireInterruptPredicate, type UseStatewireApprovalRequestOptions, useStatewireApprovalRequest, } from "../chat/use-statewire-approval-request";
|
|
51
57
|
export { StatewireQueuedMessages, type StatewireQueueEditorContext, type StatewireQueueEvent, type StatewireQueueRowContentContext, type StatewireQueueRowMarkerContext, type StatewireQueuedMessagesProps, } from "../chat/StatewireQueuedMessages";
|
|
58
|
+
export { DrivingOnChip, type DrivingOnChipProps } from "../chat/DrivingOnChip";
|
|
52
59
|
export { WaitingOnYouBanner, type WaitingOnYouBannerProps, WaitingOnYouBannerView, type WaitingOnYouBannerViewProps, } from "../chat/WaitingOnYouBanner";
|
|
53
60
|
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,22 @@ 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";
|
|
39
|
+
import { FromTheCallAfterMessage, FromTheCallCard } from "./messages/from-the-call-card.js";
|
|
35
40
|
import { ContinuePill } from "./messages/continue-pill.js";
|
|
36
41
|
import { StatewireContinueRunAffordance, StatewireContinueRunButton, StatewireRunEndedFooter } from "./messages/statewire-continue-run.js";
|
|
37
42
|
import { StatewireApprovalCard } from "../chat/StatewireApprovalCard.js";
|
|
43
|
+
import { useAthenaBrowserDecisionConfirmer, useBrowserDecisionConfirmer } from "../chat/browser-decision-check.js";
|
|
38
44
|
import { useStatewireApprovalRequest } from "../chat/use-statewire-approval-request.js";
|
|
39
45
|
import { StatewireQueuedMessages } from "../chat/StatewireQueuedMessages.js";
|
|
46
|
+
import { DrivingOnChip } from "../chat/DrivingOnChip.js";
|
|
40
47
|
import { WaitingOnYouBanner, WaitingOnYouBannerView } from "../chat/WaitingOnYouBanner.js";
|
|
41
48
|
import { HITL_PENDING_RESUME_GRACE_MS } from "../agent-runtime/src/interrupts.js";
|
|
42
49
|
export {
|
|
50
|
+
AnswerLabel,
|
|
51
|
+
AnswerLabelScope,
|
|
43
52
|
AthenaGraphQLError,
|
|
44
53
|
BranchPicker,
|
|
45
54
|
COMPOSER_DOCK_CLASS,
|
|
@@ -61,10 +70,17 @@ export {
|
|
|
61
70
|
ComposerStopButton,
|
|
62
71
|
ContinuePill,
|
|
63
72
|
ConversationHistoryPanel,
|
|
73
|
+
DrivingOnChip,
|
|
74
|
+
FromTheCallAfterMessage,
|
|
75
|
+
FromTheCallCard,
|
|
64
76
|
HISTORY_EDGE_NEAR_MARGIN_PX,
|
|
65
77
|
HITL_PENDING_RESUME_GRACE_MS,
|
|
78
|
+
HandoffArrivalAfterMessage,
|
|
79
|
+
HandoffArrivalDivider,
|
|
80
|
+
HandoffArrivalScope,
|
|
66
81
|
HistoryEdgeRow,
|
|
67
82
|
IconButton,
|
|
83
|
+
MESSAGE_ARRIVAL_ANIMATION_CLASS,
|
|
68
84
|
MarkdownText,
|
|
69
85
|
MentionAuthCtx,
|
|
70
86
|
MentionChip,
|
|
@@ -77,6 +93,8 @@ export {
|
|
|
77
93
|
MentionSuggestionsExtension,
|
|
78
94
|
MenuList,
|
|
79
95
|
MessageActionsReadOnlyProvider,
|
|
96
|
+
MessageImageGallery,
|
|
97
|
+
MessageImagePart,
|
|
80
98
|
PendingAttachmentUploads,
|
|
81
99
|
ROOT_MENTION_CATEGORIES,
|
|
82
100
|
RuntimeMessageCard,
|
|
@@ -133,9 +151,12 @@ export {
|
|
|
133
151
|
resolveComposerAction,
|
|
134
152
|
serializeDraft,
|
|
135
153
|
serializeMention,
|
|
154
|
+
useAthenaBrowserDecisionConfirmer,
|
|
155
|
+
useBrowserDecisionConfirmer,
|
|
136
156
|
useMentionAuth,
|
|
137
157
|
useMentionSuggestions,
|
|
138
158
|
useMessageActionsReadOnly,
|
|
159
|
+
useMessageArrivalAnimation,
|
|
139
160
|
useStatewireApprovalRequest,
|
|
140
161
|
useStatewireToolOutputs,
|
|
141
162
|
webpageMentionFingerprint
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|