@athenaintel/react 0.22.3 → 0.23.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 +394 -4
- package/dist/chat/AthenaChat.cjs +389 -240
- package/dist/chat/AthenaChat.cjs.map +1 -1
- package/dist/chat/AthenaChat.d.ts +26 -8
- package/dist/chat/AthenaChat.js +394 -245
- package/dist/chat/AthenaChat.js.map +1 -1
- package/dist/chat/StatewireApprovalCard.cjs +2 -1
- package/dist/chat/StatewireApprovalCard.cjs.map +1 -1
- package/dist/chat/StatewireApprovalCard.js +2 -1
- package/dist/chat/StatewireApprovalCard.js.map +1 -1
- package/dist/chat/StatewireClientToolBridge.cjs +1 -0
- package/dist/chat/StatewireClientToolBridge.cjs.map +1 -1
- package/dist/chat/StatewireClientToolBridge.js +1 -0
- package/dist/chat/StatewireClientToolBridge.js.map +1 -1
- package/dist/chat/StatewireQueuedMessages.cjs +1 -0
- package/dist/chat/StatewireQueuedMessages.cjs.map +1 -1
- package/dist/chat/StatewireQueuedMessages.js +1 -0
- package/dist/chat/StatewireQueuedMessages.js.map +1 -1
- package/dist/chat/WaitingOnYouBanner.cjs +100 -0
- package/dist/chat/WaitingOnYouBanner.cjs.map +1 -0
- package/dist/chat/WaitingOnYouBanner.d.ts +29 -0
- package/dist/chat/WaitingOnYouBanner.js +100 -0
- package/dist/chat/WaitingOnYouBanner.js.map +1 -0
- package/dist/chat/athena-chat-welcome.cjs +148 -0
- package/dist/chat/athena-chat-welcome.cjs.map +1 -0
- package/dist/chat/athena-chat-welcome.d.ts +54 -0
- package/dist/chat/athena-chat-welcome.js +148 -0
- package/dist/chat/athena-chat-welcome.js.map +1 -0
- package/dist/chat/athena-composer-controls.cjs +76 -0
- package/dist/chat/athena-composer-controls.cjs.map +1 -0
- package/dist/chat/athena-composer-controls.d.ts +21 -0
- package/dist/chat/athena-composer-controls.js +76 -0
- package/dist/chat/athena-composer-controls.js.map +1 -0
- package/dist/chat/composer-keyboard-hint.cjs +61 -0
- package/dist/chat/composer-keyboard-hint.cjs.map +1 -0
- package/dist/chat/composer-keyboard-hint.d.ts +33 -0
- package/dist/chat/composer-keyboard-hint.js +61 -0
- package/dist/chat/composer-keyboard-hint.js.map +1 -0
- package/dist/chat/message-time.cjs +64 -0
- package/dist/chat/message-time.cjs.map +1 -0
- package/dist/chat/message-time.d.ts +45 -0
- package/dist/chat/message-time.js +64 -0
- package/dist/chat/message-time.js.map +1 -0
- package/dist/chat/run-activity.cjs +38 -7
- package/dist/chat/run-activity.cjs.map +1 -1
- package/dist/chat/run-activity.d.ts +14 -3
- package/dist/chat/run-activity.js +39 -8
- package/dist/chat/run-activity.js.map +1 -1
- package/dist/chat/statewire-client-tools.cjs +2 -1
- package/dist/chat/statewire-client-tools.cjs.map +1 -1
- package/dist/chat/statewire-client-tools.js +2 -1
- package/dist/chat/statewire-client-tools.js.map +1 -1
- package/dist/chat/super-grouping/activity-timeline.cjs +2 -1
- package/dist/chat/super-grouping/activity-timeline.cjs.map +1 -1
- package/dist/chat/super-grouping/activity-timeline.js +2 -1
- package/dist/chat/super-grouping/activity-timeline.js.map +1 -1
- package/dist/chat/thread-scroll-to-bottom.cjs +24 -0
- package/dist/chat/thread-scroll-to-bottom.cjs.map +1 -0
- package/dist/chat/thread-scroll-to-bottom.d.ts +11 -0
- package/dist/chat/thread-scroll-to-bottom.js +24 -0
- package/dist/chat/thread-scroll-to-bottom.js.map +1 -0
- package/dist/chat/tiptap-text.cjs +26 -99
- package/dist/chat/tiptap-text.cjs.map +1 -1
- package/dist/chat/tiptap-text.d.ts +13 -0
- package/dist/chat/tiptap-text.js +26 -99
- package/dist/chat/tiptap-text.js.map +1 -1
- package/dist/chat/use-athena-run-live.cjs +2 -1
- package/dist/chat/use-athena-run-live.cjs.map +1 -1
- package/dist/chat/use-athena-run-live.js +2 -1
- package/dist/chat/use-athena-run-live.js.map +1 -1
- package/dist/chat/use-statewire-approval-request.cjs +1 -0
- package/dist/chat/use-statewire-approval-request.cjs.map +1 -1
- package/dist/chat/use-statewire-approval-request.js +1 -0
- package/dist/chat/use-statewire-approval-request.js.map +1 -1
- package/dist/chat-ui/composer/tiptap-composer.cjs +39 -4
- package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -1
- package/dist/chat-ui/composer/tiptap-composer.d.ts +21 -0
- package/dist/chat-ui/composer/tiptap-composer.js +39 -4
- package/dist/chat-ui/composer/tiptap-composer.js.map +1 -1
- package/dist/chat-ui/index.cjs +15 -1
- package/dist/chat-ui/index.cjs.map +1 -1
- package/dist/chat-ui/index.d.ts +6 -3
- package/dist/chat-ui/index.js +16 -2
- package/dist/chat-ui/index.js.map +1 -1
- package/dist/chat-ui/mentions/mention-chip.cjs +31 -4
- package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -1
- package/dist/chat-ui/mentions/mention-chip.js +31 -4
- package/dist/chat-ui/mentions/mention-chip.js.map +1 -1
- package/dist/chat-ui/messages/message-components.cjs +19 -1
- package/dist/chat-ui/messages/message-components.cjs.map +1 -1
- package/dist/chat-ui/messages/message-components.d.ts +13 -0
- package/dist/chat-ui/messages/message-components.js +19 -1
- package/dist/chat-ui/messages/message-components.js.map +1 -1
- package/dist/chat-ui/messages/runtime-message.cjs +2 -1
- package/dist/chat-ui/messages/runtime-message.cjs.map +1 -1
- package/dist/chat-ui/messages/runtime-message.js +2 -1
- package/dist/chat-ui/messages/runtime-message.js.map +1 -1
- package/dist/chat-ui/messages/statewire-continue-run.cjs +1 -0
- package/dist/chat-ui/messages/statewire-continue-run.cjs.map +1 -1
- package/dist/chat-ui/messages/statewire-continue-run.js +1 -0
- package/dist/chat-ui/messages/statewire-continue-run.js.map +1 -1
- package/dist/chat-ui/messages/user-edit-composer.cjs +3 -1
- package/dist/chat-ui/messages/user-edit-composer.cjs.map +1 -1
- package/dist/chat-ui/messages/user-edit-composer.js +3 -1
- package/dist/chat-ui/messages/user-edit-composer.js.map +1 -1
- package/dist/chat-ui/messages/wake-marker.cjs +84 -0
- package/dist/chat-ui/messages/wake-marker.cjs.map +1 -0
- package/dist/chat-ui/messages/wake-marker.d.ts +16 -0
- package/dist/chat-ui/messages/wake-marker.js +84 -0
- package/dist/chat-ui/messages/wake-marker.js.map +1 -0
- package/dist/chat-ui/rich-text/chat-blocks.cjs +177 -0
- package/dist/chat-ui/rich-text/chat-blocks.cjs.map +1 -0
- package/dist/chat-ui/rich-text/chat-blocks.d.ts +58 -0
- package/dist/chat-ui/rich-text/chat-blocks.js +177 -0
- package/dist/chat-ui/rich-text/chat-blocks.js.map +1 -0
- package/dist/chat-ui/rich-text/chat-link.cjs +69 -0
- package/dist/chat-ui/rich-text/chat-link.cjs.map +1 -0
- package/dist/chat-ui/rich-text/chat-link.d.ts +24 -0
- package/dist/chat-ui/rich-text/chat-link.js +69 -0
- package/dist/chat-ui/rich-text/chat-link.js.map +1 -0
- package/dist/chat-ui/rich-text/chat-message-body.cjs +144 -18
- package/dist/chat-ui/rich-text/chat-message-body.cjs.map +1 -1
- package/dist/chat-ui/rich-text/chat-message-body.d.ts +10 -1
- package/dist/chat-ui/rich-text/chat-message-body.js +149 -23
- package/dist/chat-ui/rich-text/chat-message-body.js.map +1 -1
- package/dist/chat-ui/rich-text/chat-node-views.cjs +84 -4
- package/dist/chat-ui/rich-text/chat-node-views.cjs.map +1 -1
- package/dist/chat-ui/rich-text/chat-node-views.d.ts +12 -1
- package/dist/chat-ui/rich-text/chat-node-views.js +85 -5
- package/dist/chat-ui/rich-text/chat-node-views.js.map +1 -1
- package/dist/chat-ui/rich-text/chat-text-schema.cjs +21 -3
- package/dist/chat-ui/rich-text/chat-text-schema.cjs.map +1 -1
- package/dist/chat-ui/rich-text/chat-text-schema.d.ts +17 -2
- package/dist/chat-ui/rich-text/chat-text-schema.js +21 -3
- package/dist/chat-ui/rich-text/chat-text-schema.js.map +1 -1
- package/dist/chat-ui/rich-text/citation-anchors.cjs +139 -0
- package/dist/chat-ui/rich-text/citation-anchors.cjs.map +1 -0
- package/dist/chat-ui/rich-text/citation-anchors.d.ts +74 -0
- package/dist/chat-ui/rich-text/citation-anchors.js +139 -0
- package/dist/chat-ui/rich-text/citation-anchors.js.map +1 -0
- package/dist/chat-ui/statewire.cjs +8 -1
- package/dist/chat-ui/statewire.cjs.map +1 -1
- package/dist/chat-ui/statewire.d.ts +2 -0
- package/dist/chat-ui/statewire.js +8 -1
- package/dist/chat-ui/statewire.js.map +1 -1
- package/dist/chat-ui/thread/chat-composer-dock.cjs +27 -6
- package/dist/chat-ui/thread/chat-composer-dock.cjs.map +1 -1
- package/dist/chat-ui/thread/chat-composer-dock.d.ts +21 -1
- package/dist/chat-ui/thread/chat-composer-dock.js +28 -7
- package/dist/chat-ui/thread/chat-composer-dock.js.map +1 -1
- package/dist/chat-ui/thread/statewire-history-edge.cjs +12 -13
- package/dist/chat-ui/thread/statewire-history-edge.cjs.map +1 -1
- package/dist/chat-ui/thread/statewire-history-edge.d.ts +11 -10
- package/dist/chat-ui/thread/statewire-history-edge.js +13 -14
- package/dist/chat-ui/thread/statewire-history-edge.js.map +1 -1
- package/dist/chat-ui/thread/thread-loading-overlay.cjs +31 -0
- package/dist/chat-ui/thread/thread-loading-overlay.cjs.map +1 -0
- package/dist/chat-ui/thread/thread-loading-overlay.d.ts +14 -0
- package/dist/chat-ui/thread/thread-loading-overlay.js +31 -0
- package/dist/chat-ui/thread/thread-loading-overlay.js.map +1 -0
- package/dist/composer/ComposerDropZone.cjs +8 -1
- package/dist/composer/ComposerDropZone.cjs.map +1 -1
- package/dist/composer/ComposerDropZone.d.ts +6 -0
- package/dist/composer/ComposerDropZone.js +9 -2
- package/dist/composer/ComposerDropZone.js.map +1 -1
- package/dist/diagnostics/errors.cjs +20 -0
- package/dist/diagnostics/errors.cjs.map +1 -1
- package/dist/diagnostics/errors.d.ts +20 -0
- package/dist/diagnostics/errors.js +20 -0
- package/dist/diagnostics/errors.js.map +1 -1
- package/dist/index.cjs +47 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +26 -7
- package/dist/index.js +51 -5
- package/dist/index.js.map +1 -1
- package/dist/lib/use-prefers-reduced-motion.cjs +29 -0
- package/dist/lib/use-prefers-reduced-motion.cjs.map +1 -0
- package/dist/lib/use-prefers-reduced-motion.d.ts +6 -0
- package/dist/lib/use-prefers-reduced-motion.js +29 -0
- package/dist/lib/use-prefers-reduced-motion.js.map +1 -0
- package/dist/packages/agent-runtime/src/conversation-index.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/conversation-index.js.map +1 -1
- package/dist/packages/agent-runtime/src/conversation-list.cjs +59 -0
- package/dist/packages/agent-runtime/src/conversation-list.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/conversation-list.js +60 -1
- package/dist/packages/agent-runtime/src/conversation-list.js.map +1 -1
- package/dist/packages/agent-runtime/src/deep-agent-transport-recipe.cjs +5 -3
- package/dist/packages/agent-runtime/src/deep-agent-transport-recipe.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/deep-agent-transport-recipe.js +5 -3
- package/dist/packages/agent-runtime/src/deep-agent-transport-recipe.js.map +1 -1
- package/dist/packages/agent-runtime/src/edit-command.cjs +21 -17
- package/dist/packages/agent-runtime/src/edit-command.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/edit-command.js +22 -18
- package/dist/packages/agent-runtime/src/edit-command.js.map +1 -1
- package/dist/packages/agent-runtime/src/generated/runconfig-contract.cjs +9 -11
- package/dist/packages/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/generated/runconfig-contract.js +9 -11
- package/dist/packages/agent-runtime/src/generated/runconfig-contract.js.map +1 -1
- package/dist/packages/agent-runtime/src/github-wake-event.cjs +86 -0
- package/dist/packages/agent-runtime/src/github-wake-event.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/github-wake-event.js +86 -0
- package/dist/packages/agent-runtime/src/github-wake-event.js.map +1 -0
- package/dist/packages/agent-runtime/src/message-window.cjs +150 -42
- package/dist/packages/agent-runtime/src/message-window.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/message-window.js +151 -43
- package/dist/packages/agent-runtime/src/message-window.js.map +1 -1
- package/dist/packages/agent-runtime/src/quota-safe-local-storage-session.cjs +13 -9
- package/dist/packages/agent-runtime/src/quota-safe-local-storage-session.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/quota-safe-local-storage-session.js +13 -9
- package/dist/packages/agent-runtime/src/quota-safe-local-storage-session.js.map +1 -1
- package/dist/packages/agent-runtime/src/statewire-suspended.cjs +1 -3
- package/dist/packages/agent-runtime/src/statewire-suspended.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/statewire-suspended.js +1 -3
- package/dist/packages/agent-runtime/src/statewire-suspended.js.map +1 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-edit-submit.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-edit-submit.js.map +1 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-thread.cjs +61 -30
- package/dist/packages/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-thread.js +59 -28
- package/dist/packages/agent-runtime/src/use-deep-agent-thread.js.map +1 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-window-sync.cjs +56 -36
- package/dist/packages/agent-runtime/src/use-deep-agent-window-sync.cjs.map +1 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-window-sync.js +59 -39
- package/dist/packages/agent-runtime/src/use-deep-agent-window-sync.js.map +1 -1
- package/dist/packages/react/package.json.cjs +1 -1
- package/dist/packages/react/package.json.js +1 -1
- package/dist/provider/AthenaContext.cjs.map +1 -1
- package/dist/provider/AthenaContext.d.ts +3 -0
- package/dist/provider/AthenaContext.js.map +1 -1
- package/dist/provider/AthenaProvider.cjs +93 -45
- package/dist/provider/AthenaProvider.cjs.map +1 -1
- package/dist/provider/AthenaProvider.d.ts +6 -1
- package/dist/provider/AthenaProvider.js +97 -49
- package/dist/provider/AthenaProvider.js.map +1 -1
- package/dist/runtime/statewire-lifecycle.cjs +2 -1
- package/dist/runtime/statewire-lifecycle.cjs.map +1 -1
- package/dist/runtime/statewire-lifecycle.js +2 -1
- package/dist/runtime/statewire-lifecycle.js.map +1 -1
- package/dist/runtime/useAthenaStatewireRuntime.cjs +3 -2
- package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
- package/dist/runtime/useAthenaStatewireRuntime.d.ts +8 -12
- package/dist/runtime/useAthenaStatewireRuntime.js +3 -2
- package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
- package/dist/search/useAthenaRepoSearch.cjs +94 -0
- package/dist/search/useAthenaRepoSearch.cjs.map +1 -0
- package/dist/search/useAthenaRepoSearch.d.ts +95 -0
- package/dist/search/useAthenaRepoSearch.js +94 -0
- package/dist/search/useAthenaRepoSearch.js.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/threads/SessionList.cjs +486 -0
- package/dist/threads/SessionList.cjs.map +1 -0
- package/dist/threads/SessionList.d.ts +60 -0
- package/dist/threads/SessionList.js +486 -0
- package/dist/threads/SessionList.js.map +1 -0
- package/dist/threads/api.cjs +112 -4
- package/dist/threads/api.cjs.map +1 -1
- package/dist/threads/api.d.ts +128 -1
- package/dist/threads/api.js +113 -5
- package/dist/threads/api.js.map +1 -1
- package/dist/threads/conversation-list-fetcher.cjs +27 -3
- package/dist/threads/conversation-list-fetcher.cjs.map +1 -1
- package/dist/threads/conversation-list-fetcher.d.ts +16 -3
- package/dist/threads/conversation-list-fetcher.js +27 -3
- package/dist/threads/conversation-list-fetcher.js.map +1 -1
- package/dist/threads/index.d.ts +5 -1
- package/dist/threads/session-list-model.cjs +130 -0
- package/dist/threads/session-list-model.cjs.map +1 -0
- package/dist/threads/session-list-model.d.ts +62 -0
- package/dist/threads/session-list-model.js +130 -0
- package/dist/threads/session-list-model.js.map +1 -0
- package/dist/threads/statewire-thread-list.cjs +220 -38
- package/dist/threads/statewire-thread-list.cjs.map +1 -1
- package/dist/threads/statewire-thread-list.d.ts +152 -2
- package/dist/threads/statewire-thread-list.js +222 -40
- package/dist/threads/statewire-thread-list.js.map +1 -1
- package/dist/threads/thread-prefetcher.cjs +63 -0
- package/dist/threads/thread-prefetcher.cjs.map +1 -0
- package/dist/threads/thread-prefetcher.d.ts +54 -0
- package/dist/threads/thread-prefetcher.js +63 -0
- package/dist/threads/thread-prefetcher.js.map +1 -0
- package/dist/threads/use-athena-session-attention.cjs +22 -0
- package/dist/threads/use-athena-session-attention.cjs.map +1 -0
- package/dist/threads/use-athena-session-attention.d.ts +24 -0
- package/dist/threads/use-athena-session-attention.js +22 -0
- package/dist/threads/use-athena-session-attention.js.map +1 -0
- package/dist/threads/use-rest-conversation-history.cjs +25 -2
- package/dist/threads/use-rest-conversation-history.cjs.map +1 -1
- package/dist/threads/use-rest-conversation-history.d.ts +8 -1
- package/dist/threads/use-rest-conversation-history.js +25 -2
- package/dist/threads/use-rest-conversation-history.js.map +1 -1
- package/dist/threads/use-statewire-conversation-history.cjs +40 -16
- package/dist/threads/use-statewire-conversation-history.cjs.map +1 -1
- package/dist/threads/use-statewire-conversation-history.d.ts +13 -0
- package/dist/threads/use-statewire-conversation-history.js +40 -16
- package/dist/threads/use-statewire-conversation-history.js.map +1 -1
- package/dist/threads/use-thread-archive.cjs +128 -0
- package/dist/threads/use-thread-archive.cjs.map +1 -0
- package/dist/threads/use-thread-archive.d.ts +26 -0
- package/dist/threads/use-thread-archive.js +128 -0
- package/dist/threads/use-thread-archive.js.map +1 -0
- package/dist/threads/use-thread-favorite.cjs +53 -0
- package/dist/threads/use-thread-favorite.cjs.map +1 -0
- package/dist/threads/use-thread-favorite.d.ts +49 -0
- package/dist/threads/use-thread-favorite.js +53 -0
- package/dist/threads/use-thread-favorite.js.map +1 -0
- package/dist/threads/use-thread-field-override.cjs +184 -0
- package/dist/threads/use-thread-field-override.cjs.map +1 -0
- package/dist/threads/use-thread-field-override.d.ts +55 -0
- package/dist/threads/use-thread-field-override.js +184 -0
- package/dist/threads/use-thread-field-override.js.map +1 -0
- package/dist/threads/use-thread-rename.cjs +53 -0
- package/dist/threads/use-thread-rename.cjs.map +1 -0
- package/dist/threads/use-thread-rename.d.ts +48 -0
- package/dist/threads/use-thread-rename.js +53 -0
- package/dist/threads/use-thread-rename.js.map +1 -0
- package/dist/tools/index.cjs +5 -1
- package/dist/tools/index.cjs.map +1 -1
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/index.js +7 -3
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/misc-tool-uis.cjs +2 -1
- package/dist/tools/misc-tool-uis.cjs.map +1 -1
- package/dist/tools/misc-tool-uis.js +2 -1
- package/dist/tools/misc-tool-uis.js.map +1 -1
- package/dist/tools/primitives.cjs +25 -2
- package/dist/tools/primitives.cjs.map +1 -1
- package/dist/tools/primitives.d.ts +9 -2
- package/dist/tools/primitives.js +26 -3
- package/dist/tools/primitives.js.map +1 -1
- package/dist/tools/tool-appearance.cjs +11 -0
- package/dist/tools/tool-appearance.cjs.map +1 -0
- package/dist/tools/tool-appearance.d.ts +29 -0
- package/dist/tools/tool-appearance.js +11 -0
- package/dist/tools/tool-appearance.js.map +1 -0
- package/dist/tools/tool-fallback.cjs +211 -13
- package/dist/tools/tool-fallback.cjs.map +1 -1
- package/dist/tools/tool-fallback.d.ts +31 -4
- package/dist/tools/tool-fallback.js +214 -16
- package/dist/tools/tool-fallback.js.map +1 -1
- package/dist/tools/use-elapsed-seconds.cjs +24 -0
- package/dist/tools/use-elapsed-seconds.cjs.map +1 -0
- package/dist/tools/use-elapsed-seconds.d.ts +10 -0
- package/dist/tools/use-elapsed-seconds.js +24 -0
- package/dist/tools/use-elapsed-seconds.js.map +1 -0
- package/dist/tools/voice-update-tool-ui.cjs +2 -1
- package/dist/tools/voice-update-tool-ui.cjs.map +1 -1
- package/dist/tools/voice-update-tool-ui.js +2 -1
- package/dist/tools/voice-update-tool-ui.js.map +1 -1
- package/package.json +1 -1
- package/src/chat-ui/tailwind-preset.js +14 -1
|
@@ -0,0 +1,486 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
const lucideReact = require("lucide-react");
|
|
5
|
+
const react = require("react");
|
|
6
|
+
const api = require("./api.cjs");
|
|
7
|
+
const sessionListModel = require("./session-list-model.cjs");
|
|
8
|
+
const statewireThreadList = require("./statewire-thread-list.cjs");
|
|
9
|
+
const threadPrefetcher = require("./thread-prefetcher.cjs");
|
|
10
|
+
const cnfast = require("cnfast");
|
|
11
|
+
const INDICATOR_LABEL = {
|
|
12
|
+
needs_you: "Needs you",
|
|
13
|
+
working: "Working",
|
|
14
|
+
unread: "Unread",
|
|
15
|
+
watching: "Watching"
|
|
16
|
+
};
|
|
17
|
+
const SessionStatusIndicator = ({ kind }) => {
|
|
18
|
+
if (kind === null) return /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: "mt-0.5 size-4 shrink-0" });
|
|
19
|
+
const label = INDICATOR_LABEL[kind];
|
|
20
|
+
if (kind === "working") {
|
|
21
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
22
|
+
lucideReact.LoaderCircleIcon,
|
|
23
|
+
{
|
|
24
|
+
role: "img",
|
|
25
|
+
"aria-label": label,
|
|
26
|
+
"data-indicator": kind,
|
|
27
|
+
className: "mt-0.5 size-4 shrink-0 animate-spin text-primary"
|
|
28
|
+
}
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
if (kind === "watching") {
|
|
32
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
33
|
+
lucideReact.ClockIcon,
|
|
34
|
+
{
|
|
35
|
+
role: "img",
|
|
36
|
+
"aria-label": label,
|
|
37
|
+
"data-indicator": kind,
|
|
38
|
+
className: "mt-0.5 size-4 shrink-0 text-muted-foreground"
|
|
39
|
+
}
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
43
|
+
"span",
|
|
44
|
+
{
|
|
45
|
+
role: "img",
|
|
46
|
+
"aria-label": label,
|
|
47
|
+
"data-indicator": kind,
|
|
48
|
+
className: "mt-0.5 flex size-4 shrink-0 items-center justify-center",
|
|
49
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
50
|
+
"span",
|
|
51
|
+
{
|
|
52
|
+
className: cnfast.cn(
|
|
53
|
+
"size-2 rounded-full",
|
|
54
|
+
kind === "needs_you" ? "bg-orange-500" : "bg-primary"
|
|
55
|
+
)
|
|
56
|
+
}
|
|
57
|
+
)
|
|
58
|
+
}
|
|
59
|
+
);
|
|
60
|
+
};
|
|
61
|
+
const LINE_TONE_CLASS = {
|
|
62
|
+
needs_you: "text-orange-600",
|
|
63
|
+
ready: "text-green-600",
|
|
64
|
+
error: "text-red-600",
|
|
65
|
+
muted: "text-muted-foreground"
|
|
66
|
+
};
|
|
67
|
+
const PR_STATE_ICON = {
|
|
68
|
+
open: lucideReact.GitPullRequestIcon,
|
|
69
|
+
draft: lucideReact.GitPullRequestDraftIcon,
|
|
70
|
+
merged: lucideReact.GitMergeIcon,
|
|
71
|
+
closed: lucideReact.GitPullRequestClosedIcon
|
|
72
|
+
};
|
|
73
|
+
const PR_STATE_CLASS = {
|
|
74
|
+
open: "text-green-600",
|
|
75
|
+
draft: "text-muted-foreground",
|
|
76
|
+
merged: "text-violet-600",
|
|
77
|
+
closed: "text-red-600"
|
|
78
|
+
};
|
|
79
|
+
const FOCUS_RING_CLASS = "outline-none focus-visible:ring-2 focus-visible:ring-ring/60 focus-visible:ring-offset-0";
|
|
80
|
+
const stopPropagation = (event) => event.stopPropagation();
|
|
81
|
+
const PullRequestChip = ({ chip }) => {
|
|
82
|
+
const Icon = PR_STATE_ICON[chip.state];
|
|
83
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
84
|
+
"a",
|
|
85
|
+
{
|
|
86
|
+
href: chip.url,
|
|
87
|
+
target: "_blank",
|
|
88
|
+
rel: "noopener noreferrer",
|
|
89
|
+
onClick: stopPropagation,
|
|
90
|
+
title: chip.title,
|
|
91
|
+
"aria-label": `Pull request ${chip.label}, ${chip.state}`,
|
|
92
|
+
"data-pr-state": chip.state,
|
|
93
|
+
"data-pr-count": chip.count,
|
|
94
|
+
className: cnfast.cn(
|
|
95
|
+
"inline-flex h-4 shrink-0 items-center gap-1 rounded-full border border-border/60 px-1.5 font-medium text-[11px] leading-none transition-colors hover:bg-muted",
|
|
96
|
+
FOCUS_RING_CLASS,
|
|
97
|
+
PR_STATE_CLASS[chip.state]
|
|
98
|
+
),
|
|
99
|
+
children: [
|
|
100
|
+
/* @__PURE__ */ jsxRuntime.jsx(Icon, { className: "size-3", "aria-hidden": true }),
|
|
101
|
+
chip.label
|
|
102
|
+
]
|
|
103
|
+
}
|
|
104
|
+
);
|
|
105
|
+
};
|
|
106
|
+
const RowActionButton = ({ label, onClick, pending, alwaysVisible, action, pressed, children }) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
107
|
+
"button",
|
|
108
|
+
{
|
|
109
|
+
type: "button",
|
|
110
|
+
onClick,
|
|
111
|
+
disabled: pending,
|
|
112
|
+
"aria-busy": pending || void 0,
|
|
113
|
+
"aria-pressed": pressed,
|
|
114
|
+
"aria-label": label,
|
|
115
|
+
title: label,
|
|
116
|
+
"data-action": action,
|
|
117
|
+
"data-pending": pending || void 0,
|
|
118
|
+
className: cnfast.cn(
|
|
119
|
+
"rounded p-1 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground disabled:cursor-wait disabled:opacity-60",
|
|
120
|
+
FOCUS_RING_CLASS,
|
|
121
|
+
!alwaysVisible && !pending && "opacity-0 focus-visible:opacity-100 group-focus-within:opacity-100 group-hover:opacity-100"
|
|
122
|
+
),
|
|
123
|
+
children
|
|
124
|
+
}
|
|
125
|
+
);
|
|
126
|
+
const PinToggle = ({ thread, pending, onToggle }) => {
|
|
127
|
+
const label = thread.isFavorited ? "Unpin session" : "Pin session";
|
|
128
|
+
const handleClick = (event) => {
|
|
129
|
+
event.stopPropagation();
|
|
130
|
+
if (pending) return;
|
|
131
|
+
onToggle({ threadId: thread.id, isFavorited: !thread.isFavorited });
|
|
132
|
+
};
|
|
133
|
+
return /* @__PURE__ */ jsxRuntime.jsx("span", { "data-pin-toggle": thread.isFavorited ? "pinned" : "unpinned", className: "contents", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
134
|
+
RowActionButton,
|
|
135
|
+
{
|
|
136
|
+
label,
|
|
137
|
+
onClick: handleClick,
|
|
138
|
+
pending,
|
|
139
|
+
alwaysVisible: thread.isFavorited,
|
|
140
|
+
action: "pin",
|
|
141
|
+
pressed: thread.isFavorited,
|
|
142
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.PinIcon, { className: cnfast.cn("size-3.5", thread.isFavorited && "fill-current"), "aria-hidden": true })
|
|
143
|
+
}
|
|
144
|
+
) });
|
|
145
|
+
};
|
|
146
|
+
const SKELETON_TITLE_WIDTHS = ["w-3/5", "w-4/5", "w-1/2", "w-2/3"];
|
|
147
|
+
const SessionListSkeleton = ({ rows = 4 }) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
148
|
+
"div",
|
|
149
|
+
{
|
|
150
|
+
role: "status",
|
|
151
|
+
"aria-busy": "true",
|
|
152
|
+
"aria-label": "Loading sessions",
|
|
153
|
+
"data-testid": "session-list-skeleton",
|
|
154
|
+
className: "flex flex-col gap-0.5",
|
|
155
|
+
children: Array.from({ length: rows }, (_, index) => /* @__PURE__ */ jsxRuntime.jsxs("div", { "aria-hidden": "true", className: "flex items-start gap-2 px-3 py-2", children: [
|
|
156
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "mt-0.5 size-4 shrink-0 animate-pulse rounded-full bg-muted" }),
|
|
157
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "min-w-0 flex-1", children: [
|
|
158
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex h-5 items-center", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
159
|
+
"span",
|
|
160
|
+
{
|
|
161
|
+
className: cnfast.cn(
|
|
162
|
+
"h-3.5 animate-pulse rounded bg-muted",
|
|
163
|
+
SKELETON_TITLE_WIDTHS[index % SKELETON_TITLE_WIDTHS.length]
|
|
164
|
+
)
|
|
165
|
+
}
|
|
166
|
+
) }),
|
|
167
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "mt-0.5 flex h-4 items-center", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "h-3 w-1/3 animate-pulse rounded bg-muted/70" }) })
|
|
168
|
+
] })
|
|
169
|
+
] }, index))
|
|
170
|
+
}
|
|
171
|
+
);
|
|
172
|
+
const SessionRow = ({
|
|
173
|
+
thread,
|
|
174
|
+
isActive,
|
|
175
|
+
onSelect,
|
|
176
|
+
onPrefetch,
|
|
177
|
+
onToggleFavorite,
|
|
178
|
+
favoritePending,
|
|
179
|
+
onRename,
|
|
180
|
+
renamePending,
|
|
181
|
+
onArchive,
|
|
182
|
+
archivePending
|
|
183
|
+
}) => {
|
|
184
|
+
const indicator = sessionListModel.sessionIndicator(thread);
|
|
185
|
+
const line = sessionListModel.sessionSecondaryLine(thread);
|
|
186
|
+
const chip = sessionListModel.pullRequestChip(thread.pullRequests);
|
|
187
|
+
const origin = sessionListModel.sessionOriginLabel(thread);
|
|
188
|
+
const title = thread.title ?? "Untitled";
|
|
189
|
+
const hoverTimerRef = react.useRef(null);
|
|
190
|
+
const cancelHover = react.useCallback(() => {
|
|
191
|
+
if (hoverTimerRef.current === null) return;
|
|
192
|
+
clearTimeout(hoverTimerRef.current);
|
|
193
|
+
hoverTimerRef.current = null;
|
|
194
|
+
}, []);
|
|
195
|
+
react.useEffect(() => cancelHover, [cancelHover]);
|
|
196
|
+
const handlePointerEnter = () => {
|
|
197
|
+
if (!onPrefetch) return;
|
|
198
|
+
cancelHover();
|
|
199
|
+
hoverTimerRef.current = setTimeout(() => {
|
|
200
|
+
hoverTimerRef.current = null;
|
|
201
|
+
onPrefetch(thread.id);
|
|
202
|
+
}, threadPrefetcher.THREAD_PREFETCH_HOVER_DELAY_MS);
|
|
203
|
+
};
|
|
204
|
+
const handleFocus = () => {
|
|
205
|
+
cancelHover();
|
|
206
|
+
onPrefetch == null ? void 0 : onPrefetch(thread.id);
|
|
207
|
+
};
|
|
208
|
+
const [editing, setEditing] = react.useState(false);
|
|
209
|
+
const [draft, setDraft] = react.useState("");
|
|
210
|
+
const settledRef = react.useRef(false);
|
|
211
|
+
const inputRef = react.useRef(null);
|
|
212
|
+
react.useEffect(() => {
|
|
213
|
+
var _a, _b;
|
|
214
|
+
if (!editing) return;
|
|
215
|
+
(_a = inputRef.current) == null ? void 0 : _a.focus();
|
|
216
|
+
(_b = inputRef.current) == null ? void 0 : _b.select();
|
|
217
|
+
}, [editing]);
|
|
218
|
+
const beginRename = (event) => {
|
|
219
|
+
event.stopPropagation();
|
|
220
|
+
if (renamePending) return;
|
|
221
|
+
settledRef.current = false;
|
|
222
|
+
setDraft(thread.title ?? "");
|
|
223
|
+
setEditing(true);
|
|
224
|
+
};
|
|
225
|
+
const commitRename = () => {
|
|
226
|
+
if (settledRef.current) return;
|
|
227
|
+
settledRef.current = true;
|
|
228
|
+
setEditing(false);
|
|
229
|
+
const next = draft.trim();
|
|
230
|
+
if (!next || next === (thread.title ?? "").trim()) return;
|
|
231
|
+
onRename == null ? void 0 : onRename({ threadId: thread.id, title: next });
|
|
232
|
+
};
|
|
233
|
+
const cancelRename = () => {
|
|
234
|
+
settledRef.current = true;
|
|
235
|
+
setEditing(false);
|
|
236
|
+
};
|
|
237
|
+
const handleEditorKeyDown = (event) => {
|
|
238
|
+
if (event.key === "Enter") {
|
|
239
|
+
event.preventDefault();
|
|
240
|
+
commitRename();
|
|
241
|
+
} else if (event.key === "Escape") {
|
|
242
|
+
event.preventDefault();
|
|
243
|
+
event.stopPropagation();
|
|
244
|
+
cancelRename();
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
const handleArchive = (event) => {
|
|
248
|
+
event.stopPropagation();
|
|
249
|
+
if (archivePending) return;
|
|
250
|
+
onArchive == null ? void 0 : onArchive(thread.id);
|
|
251
|
+
};
|
|
252
|
+
const hasActions = Boolean(onRename || onToggleFavorite || onArchive);
|
|
253
|
+
const body = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
254
|
+
/* @__PURE__ */ jsxRuntime.jsx(SessionStatusIndicator, { kind: indicator }),
|
|
255
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "min-w-0 flex-1", children: [
|
|
256
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex h-5 items-center gap-1.5", children: [
|
|
257
|
+
editing ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
258
|
+
"input",
|
|
259
|
+
{
|
|
260
|
+
ref: inputRef,
|
|
261
|
+
type: "text",
|
|
262
|
+
value: draft,
|
|
263
|
+
maxLength: api.THREAD_TITLE_MAX_LENGTH,
|
|
264
|
+
"aria-label": "Session title",
|
|
265
|
+
"data-rename-input": true,
|
|
266
|
+
onChange: (event) => setDraft(event.target.value),
|
|
267
|
+
onKeyDown: handleEditorKeyDown,
|
|
268
|
+
onBlur: commitRename,
|
|
269
|
+
onClick: stopPropagation,
|
|
270
|
+
className: cnfast.cn(
|
|
271
|
+
"h-5 min-w-0 flex-1 rounded border border-primary/60 bg-background px-1 font-medium text-foreground text-sm",
|
|
272
|
+
FOCUS_RING_CLASS
|
|
273
|
+
)
|
|
274
|
+
}
|
|
275
|
+
) : /* @__PURE__ */ jsxRuntime.jsx("span", { "data-title": true, className: "min-w-0 truncate font-medium text-sm", children: title }),
|
|
276
|
+
thread.isFavorited && !onToggleFavorite ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
277
|
+
lucideReact.PinIcon,
|
|
278
|
+
{
|
|
279
|
+
role: "img",
|
|
280
|
+
"aria-label": "Pinned",
|
|
281
|
+
className: "size-3 shrink-0 fill-current text-muted-foreground"
|
|
282
|
+
}
|
|
283
|
+
) : null,
|
|
284
|
+
origin ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
285
|
+
"span",
|
|
286
|
+
{
|
|
287
|
+
"data-origin": origin,
|
|
288
|
+
className: "shrink-0 rounded-full border border-border/60 px-1.5 py-px text-[10px] text-muted-foreground",
|
|
289
|
+
children: origin
|
|
290
|
+
}
|
|
291
|
+
) : null
|
|
292
|
+
] }),
|
|
293
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
294
|
+
"span",
|
|
295
|
+
{
|
|
296
|
+
"data-line": line.kind,
|
|
297
|
+
className: cnfast.cn("mt-0.5 block h-4 truncate font-normal text-xs leading-4", LINE_TONE_CLASS[line.tone]),
|
|
298
|
+
children: line.text
|
|
299
|
+
}
|
|
300
|
+
)
|
|
301
|
+
] })
|
|
302
|
+
] });
|
|
303
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
304
|
+
"li",
|
|
305
|
+
{
|
|
306
|
+
"data-active": isActive || void 0,
|
|
307
|
+
"data-thread-id": thread.id,
|
|
308
|
+
"data-editing": editing || void 0,
|
|
309
|
+
onPointerEnter: handlePointerEnter,
|
|
310
|
+
onPointerLeave: cancelHover,
|
|
311
|
+
className: cnfast.cn(
|
|
312
|
+
"group relative flex items-start gap-1 rounded-lg text-muted-foreground transition-colors hover:bg-muted/40 hover:text-foreground",
|
|
313
|
+
isActive && "bg-muted text-foreground"
|
|
314
|
+
),
|
|
315
|
+
children: [
|
|
316
|
+
isActive ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
317
|
+
"span",
|
|
318
|
+
{
|
|
319
|
+
"aria-hidden": "true",
|
|
320
|
+
"data-active-accent": true,
|
|
321
|
+
className: "absolute inset-y-2 left-0 w-0.5 rounded-full bg-primary"
|
|
322
|
+
}
|
|
323
|
+
) : null,
|
|
324
|
+
editing ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-w-0 flex-1 items-start gap-2 p-2 pl-3 text-left", children: body }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
325
|
+
"button",
|
|
326
|
+
{
|
|
327
|
+
type: "button",
|
|
328
|
+
onClick: () => onSelect(thread.id),
|
|
329
|
+
onFocus: handleFocus,
|
|
330
|
+
className: cnfast.cn(
|
|
331
|
+
"flex min-w-0 flex-1 cursor-pointer items-start gap-2 rounded-lg p-2 pl-3 text-left",
|
|
332
|
+
FOCUS_RING_CLASS
|
|
333
|
+
),
|
|
334
|
+
children: body
|
|
335
|
+
}
|
|
336
|
+
),
|
|
337
|
+
chip || hasActions ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex shrink-0 flex-col items-end justify-between gap-0.5 py-2 pr-2", children: [
|
|
338
|
+
hasActions ? /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-row-actions": true, className: "flex h-5 items-center gap-0.5", children: [
|
|
339
|
+
onRename ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
340
|
+
RowActionButton,
|
|
341
|
+
{
|
|
342
|
+
label: "Rename session",
|
|
343
|
+
onClick: beginRename,
|
|
344
|
+
pending: renamePending,
|
|
345
|
+
alwaysVisible: false,
|
|
346
|
+
action: "rename",
|
|
347
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.PencilIcon, { className: "size-3.5", "aria-hidden": true })
|
|
348
|
+
}
|
|
349
|
+
) : null,
|
|
350
|
+
onToggleFavorite ? /* @__PURE__ */ jsxRuntime.jsx(PinToggle, { thread, pending: favoritePending, onToggle: onToggleFavorite }) : null,
|
|
351
|
+
onArchive ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
352
|
+
RowActionButton,
|
|
353
|
+
{
|
|
354
|
+
label: "Archive session",
|
|
355
|
+
onClick: handleArchive,
|
|
356
|
+
pending: archivePending,
|
|
357
|
+
alwaysVisible: false,
|
|
358
|
+
action: "archive",
|
|
359
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArchiveIcon, { className: "size-3.5", "aria-hidden": true })
|
|
360
|
+
}
|
|
361
|
+
) : null
|
|
362
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: "h-5" }),
|
|
363
|
+
chip ? /* @__PURE__ */ jsxRuntime.jsx(PullRequestChip, { chip }) : null
|
|
364
|
+
] }) : null
|
|
365
|
+
]
|
|
366
|
+
}
|
|
367
|
+
);
|
|
368
|
+
};
|
|
369
|
+
function SessionList({
|
|
370
|
+
className,
|
|
371
|
+
grouped = true,
|
|
372
|
+
showSearch = true,
|
|
373
|
+
showPinToggle = true,
|
|
374
|
+
showRename = true,
|
|
375
|
+
showArchive = true,
|
|
376
|
+
prefetchOnHover = true
|
|
377
|
+
}) {
|
|
378
|
+
const list = statewireThreadList.useAthenaStatewireThreadList();
|
|
379
|
+
if (!list) return null;
|
|
380
|
+
const sections = sessionListModel.groupSessions(list.threads, grouped);
|
|
381
|
+
const hasSearch = list.search.trim().length > 0;
|
|
382
|
+
const handleSearch = (event) => list.setSearch(event.target.value);
|
|
383
|
+
const onToggleFavorite = showPinToggle && list.favoriteToggleAvailable ? list.setFavorited : void 0;
|
|
384
|
+
const onRename = showRename && list.renameAvailable ? list.renameThread : void 0;
|
|
385
|
+
const onArchive = showArchive && list.archiveAvailable ? list.archiveThread : void 0;
|
|
386
|
+
const onPrefetch = prefetchOnHover ? list.prefetchThread : void 0;
|
|
387
|
+
const showSkeleton = !list.hasResolvedFirstPage || list.isFetching && list.threads.length === 0;
|
|
388
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
389
|
+
"div",
|
|
390
|
+
{
|
|
391
|
+
className: cnfast.cn("athena-sdk-chrome flex flex-col gap-2", className),
|
|
392
|
+
"data-testid": "session-list",
|
|
393
|
+
children: [
|
|
394
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1", children: [
|
|
395
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
396
|
+
"button",
|
|
397
|
+
{
|
|
398
|
+
type: "button",
|
|
399
|
+
onClick: list.newThread,
|
|
400
|
+
className: cnfast.cn(
|
|
401
|
+
"flex h-9 flex-1 items-center gap-2 rounded-lg border border-border/60 px-3 font-medium text-muted-foreground text-sm transition-colors hover:bg-muted hover:text-foreground",
|
|
402
|
+
FOCUS_RING_CLASS
|
|
403
|
+
),
|
|
404
|
+
children: [
|
|
405
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.PlusIcon, { className: "size-4" }),
|
|
406
|
+
"New Chat"
|
|
407
|
+
]
|
|
408
|
+
}
|
|
409
|
+
),
|
|
410
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
411
|
+
"button",
|
|
412
|
+
{
|
|
413
|
+
type: "button",
|
|
414
|
+
onClick: list.refresh,
|
|
415
|
+
disabled: list.isFetching,
|
|
416
|
+
className: cnfast.cn(
|
|
417
|
+
"flex size-9 items-center justify-center rounded-lg border border-border/60 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground disabled:opacity-50",
|
|
418
|
+
FOCUS_RING_CLASS
|
|
419
|
+
),
|
|
420
|
+
title: "Refresh sessions",
|
|
421
|
+
"aria-label": "Refresh sessions",
|
|
422
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.RefreshCwIcon, { className: cnfast.cn("size-4", list.isFetching && "animate-spin") })
|
|
423
|
+
}
|
|
424
|
+
)
|
|
425
|
+
] }),
|
|
426
|
+
showSearch ? /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "relative block", children: [
|
|
427
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.SearchIcon, { className: "pointer-events-none absolute top-1/2 left-2.5 size-3.5 -translate-y-1/2 text-muted-foreground" }),
|
|
428
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Search sessions" }),
|
|
429
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
430
|
+
"input",
|
|
431
|
+
{
|
|
432
|
+
type: "search",
|
|
433
|
+
value: list.search,
|
|
434
|
+
onChange: handleSearch,
|
|
435
|
+
placeholder: "Search sessions…",
|
|
436
|
+
className: "h-8 w-full rounded-lg border border-border/60 bg-muted/40 pr-2 pl-8 text-sm outline-none focus:border-primary focus:bg-background"
|
|
437
|
+
}
|
|
438
|
+
)
|
|
439
|
+
] }) : null,
|
|
440
|
+
showSkeleton ? /* @__PURE__ */ jsxRuntime.jsx(SessionListSkeleton, {}) : sections.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("p", { "data-testid": "session-list-empty", className: "px-3 py-4 text-muted-foreground text-xs", children: hasSearch ? "No matching sessions." : "No sessions yet." }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-2", "aria-busy": list.isFetching || void 0, children: sections.map(({ group, items }) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
441
|
+
"section",
|
|
442
|
+
{
|
|
443
|
+
"aria-label": group ?? "Sessions",
|
|
444
|
+
"data-group": group ?? void 0,
|
|
445
|
+
children: [
|
|
446
|
+
group ? /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "px-3 pb-1 font-medium text-[11px] text-muted-foreground/70 uppercase tracking-wide", children: group }) : null,
|
|
447
|
+
/* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex flex-col gap-0.5", children: items.map((thread) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
448
|
+
SessionRow,
|
|
449
|
+
{
|
|
450
|
+
thread,
|
|
451
|
+
isActive: thread.id === list.activeThreadId,
|
|
452
|
+
onSelect: list.selectThread,
|
|
453
|
+
onPrefetch,
|
|
454
|
+
onToggleFavorite,
|
|
455
|
+
favoritePending: list.favoritePendingThreadIds.has(thread.id),
|
|
456
|
+
onRename,
|
|
457
|
+
renamePending: list.renamePendingThreadIds.has(thread.id),
|
|
458
|
+
onArchive,
|
|
459
|
+
archivePending: list.archivePendingThreadIds.has(thread.id)
|
|
460
|
+
},
|
|
461
|
+
thread.id
|
|
462
|
+
)) })
|
|
463
|
+
]
|
|
464
|
+
},
|
|
465
|
+
group ?? "all"
|
|
466
|
+
)) }),
|
|
467
|
+
list.hasNextPage && !showSkeleton ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
468
|
+
"button",
|
|
469
|
+
{
|
|
470
|
+
type: "button",
|
|
471
|
+
disabled: list.isFetchingNextPage,
|
|
472
|
+
onClick: list.fetchNextPage,
|
|
473
|
+
className: cnfast.cn(
|
|
474
|
+
"w-full rounded-lg py-2 text-muted-foreground text-xs transition-colors hover:bg-muted disabled:opacity-50",
|
|
475
|
+
FOCUS_RING_CLASS
|
|
476
|
+
),
|
|
477
|
+
children: list.isFetchingNextPage ? "Loading…" : "Load more"
|
|
478
|
+
}
|
|
479
|
+
) : null
|
|
480
|
+
]
|
|
481
|
+
}
|
|
482
|
+
);
|
|
483
|
+
}
|
|
484
|
+
exports.SessionList = SessionList;
|
|
485
|
+
exports.SessionListSkeleton = SessionListSkeleton;
|
|
486
|
+
//# sourceMappingURL=SessionList.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionList.cjs","sources":["../../src/threads/SessionList.tsx"],"sourcesContent":["import {\n ArchiveIcon,\n ClockIcon,\n GitMergeIcon,\n GitPullRequestClosedIcon,\n GitPullRequestDraftIcon,\n GitPullRequestIcon,\n LoaderCircleIcon,\n PencilIcon,\n PinIcon,\n PlusIcon,\n RefreshCwIcon,\n SearchIcon,\n} from 'lucide-react';\nimport type { ChangeEvent, FC, KeyboardEvent, MouseEvent, ReactNode } from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { cn } from '../lib/utils';\nimport { THREAD_TITLE_MAX_LENGTH } from './api';\nimport {\n groupSessions,\n type PullRequestChip as PullRequestChipModel,\n type PullRequestChipState,\n pullRequestChip,\n type SessionIndicator as SessionIndicatorKind,\n type SessionLineTone,\n sessionIndicator,\n sessionOriginLabel,\n sessionSecondaryLine,\n} from './session-list-model';\nimport {\n type AthenaStatewireThreadSummary,\n useAthenaStatewireThreadList,\n} from './statewire-thread-list';\nimport { THREAD_PREFETCH_HOVER_DELAY_MS } from './thread-prefetcher';\nimport type { ThreadFavoriteTarget } from './use-thread-favorite';\nimport type { ThreadRenameTarget } from './use-thread-rename';\n\nexport interface SessionListProps {\n className?: string;\n /**\n * Group rows under \"Needs you\" / \"Working\" / \"Pinned\" / \"Recent\" (default\n * `true`); a session appears once, in the first group that applies. `false`\n * renders one newest-first list.\n */\n grouped?: boolean;\n /** Show the title search box, wired to the server-side `search` (default `true`). */\n showSearch?: boolean;\n /**\n * Offer the pin toggle on each row (default `true`). `false` — or a backend\n * without the favorite route — shows a pinned row's pin read-only instead.\n */\n showPinToggle?: boolean;\n /**\n * Offer the inline rename on each row (default `true`). Withdrawn on a\n * backend without the rename route (`renameAvailable`).\n */\n showRename?: boolean;\n /**\n * Offer the archive action on each row (default `true`). Withdrawn on a\n * backend without the archive route (`archiveAvailable`).\n */\n showArchive?: boolean;\n /**\n * Warm the provider's snapshot cache for a row after a 120 ms hover dwell\n * and on row focus (default `true`), so selecting it paints at once.\n */\n prefetchOnHover?: boolean;\n}\n\nconst INDICATOR_LABEL: Record<NonNullable<SessionIndicatorKind>, string> = {\n needs_you: 'Needs you',\n working: 'Working',\n unread: 'Unread',\n watching: 'Watching',\n};\n\n/**\n * The row's status indicator; an empty spacer keeps titles aligned when a\n * row has none.\n */\nconst SessionStatusIndicator: FC<{ kind: SessionIndicatorKind }> = ({ kind }) => {\n if (kind === null) return <span aria-hidden=\"true\" className=\"mt-0.5 size-4 shrink-0\" />;\n const label = INDICATOR_LABEL[kind];\n if (kind === 'working') {\n return (\n <LoaderCircleIcon\n role=\"img\"\n aria-label={label}\n data-indicator={kind}\n className=\"mt-0.5 size-4 shrink-0 animate-spin text-primary\"\n />\n );\n }\n if (kind === 'watching') {\n return (\n <ClockIcon\n role=\"img\"\n aria-label={label}\n data-indicator={kind}\n className=\"mt-0.5 size-4 shrink-0 text-muted-foreground\"\n />\n );\n }\n return (\n <span\n role=\"img\"\n aria-label={label}\n data-indicator={kind}\n className=\"mt-0.5 flex size-4 shrink-0 items-center justify-center\"\n >\n <span\n className={cn(\n 'size-2 rounded-full',\n kind === 'needs_you' ? 'bg-orange-500' : 'bg-primary',\n )}\n />\n </span>\n );\n};\n\nconst LINE_TONE_CLASS: Record<SessionLineTone, string> = {\n needs_you: 'text-orange-600',\n ready: 'text-green-600',\n error: 'text-red-600',\n muted: 'text-muted-foreground',\n};\n\nconst PR_STATE_ICON: Record<PullRequestChipState, FC<{ className?: string; 'aria-hidden'?: boolean }>> = {\n open: GitPullRequestIcon,\n draft: GitPullRequestDraftIcon,\n merged: GitMergeIcon,\n closed: GitPullRequestClosedIcon,\n};\n\nconst PR_STATE_CLASS: Record<PullRequestChipState, string> = {\n open: 'text-green-600',\n draft: 'text-muted-foreground',\n merged: 'text-violet-600',\n closed: 'text-red-600',\n};\n\n/** The focus treatment every row control and action shares. */\nconst FOCUS_RING_CLASS =\n 'outline-none focus-visible:ring-2 focus-visible:ring-ring/60 focus-visible:ring-offset-0';\n\nconst stopPropagation = (event: MouseEvent) => event.stopPropagation();\n\n/**\n * One chip per row linking to the session's primary pull request; a sibling\n * of the row button (never nested inside it) so the markup stays valid and a\n * click on it never selects the row. Sits on the row's second line, beside\n * the meta text.\n */\nconst PullRequestChip: FC<{ chip: PullRequestChipModel }> = ({ chip }) => {\n const Icon = PR_STATE_ICON[chip.state];\n return (\n <a\n href={chip.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={stopPropagation}\n title={chip.title}\n aria-label={`Pull request ${chip.label}, ${chip.state}`}\n data-pr-state={chip.state}\n data-pr-count={chip.count}\n className={cn(\n 'inline-flex h-4 shrink-0 items-center gap-1 rounded-full border border-border/60 px-1.5 font-medium text-[11px] leading-none transition-colors hover:bg-muted',\n FOCUS_RING_CLASS,\n PR_STATE_CLASS[chip.state],\n )}\n >\n <Icon className=\"size-3\" aria-hidden />\n {chip.label}\n </a>\n );\n};\n\n/**\n * One action in the row's trailing cluster: a sibling of the row control\n * (never nested in it — a click must not select the row), labelled for\n * assistive technology, revealed on hover or focus unless `alwaysVisible`,\n * and disabled while its write is in flight so one row never has two writes\n * racing.\n */\nconst RowActionButton: FC<{\n label: string;\n onClick: (event: MouseEvent<HTMLButtonElement>) => void;\n pending: boolean;\n alwaysVisible: boolean;\n action: string;\n pressed?: boolean;\n children: ReactNode;\n}> = ({ label, onClick, pending, alwaysVisible, action, pressed, children }) => (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={pending}\n aria-busy={pending || undefined}\n aria-pressed={pressed}\n aria-label={label}\n title={label}\n data-action={action}\n data-pending={pending || undefined}\n className={cn(\n 'rounded p-1 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground disabled:cursor-wait disabled:opacity-60',\n FOCUS_RING_CLASS,\n !alwaysVisible &&\n !pending &&\n 'opacity-0 focus-visible:opacity-100 group-focus-within:opacity-100 group-hover:opacity-100',\n )}\n >\n {children}\n </button>\n);\n\n/**\n * The pin toggle: pressed while the session is pinned (and then always\n * visible); otherwise an outline pin revealed on hover or focus so an\n * unpinned row stays quiet.\n */\nconst PinToggle: FC<{\n thread: Pick<AthenaStatewireThreadSummary, 'id' | 'isFavorited'>;\n pending: boolean;\n onToggle: (target: ThreadFavoriteTarget) => void;\n}> = ({ thread, pending, onToggle }) => {\n const label = thread.isFavorited ? 'Unpin session' : 'Pin session';\n const handleClick = (event: MouseEvent) => {\n event.stopPropagation();\n if (pending) return;\n onToggle({ threadId: thread.id, isFavorited: !thread.isFavorited });\n };\n return (\n <span data-pin-toggle={thread.isFavorited ? 'pinned' : 'unpinned'} className=\"contents\">\n <RowActionButton\n label={label}\n onClick={handleClick}\n pending={pending}\n alwaysVisible={thread.isFavorited}\n action=\"pin\"\n pressed={thread.isFavorited}\n >\n <PinIcon className={cn('size-3.5', thread.isFavorited && 'fill-current')} aria-hidden />\n </RowActionButton>\n </span>\n );\n};\n\nconst SKELETON_TITLE_WIDTHS = ['w-3/5', 'w-4/5', 'w-1/2', 'w-2/3'] as const;\n\n/**\n * Placeholder rows shaped like session rows (indicator, title line, meta\n * line) for the first page and for a refresh that has no rows to keep yet.\n */\nexport const SessionListSkeleton: FC<{ rows?: number }> = ({ rows = 4 }) => (\n <div\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Loading sessions\"\n data-testid=\"session-list-skeleton\"\n className=\"flex flex-col gap-0.5\"\n >\n {Array.from({ length: rows }, (_, index) => (\n <div key={index} aria-hidden=\"true\" className=\"flex items-start gap-2 px-3 py-2\">\n <span className=\"mt-0.5 size-4 shrink-0 animate-pulse rounded-full bg-muted\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex h-5 items-center\">\n <span\n className={cn(\n 'h-3.5 animate-pulse rounded bg-muted',\n SKELETON_TITLE_WIDTHS[index % SKELETON_TITLE_WIDTHS.length],\n )}\n />\n </span>\n <span className=\"mt-0.5 flex h-4 items-center\">\n <span className=\"h-3 w-1/3 animate-pulse rounded bg-muted/70\" />\n </span>\n </span>\n </div>\n ))}\n </div>\n);\n\nconst SessionRow: FC<{\n thread: AthenaStatewireThreadSummary;\n isActive: boolean;\n onSelect: (threadId: string) => void;\n /** Absent when hover prefetching is off or the provider has no snapshot cache to warm. */\n onPrefetch: ((threadId: string) => void) | undefined;\n /** Absent when the toggle is not offered: a pinned row then shows a read-only pin. */\n onToggleFavorite: ((target: ThreadFavoriteTarget) => void) | undefined;\n /** True while this session's pin write is in flight. */\n favoritePending: boolean;\n /** Absent when the rename is not offered (host opt-out, or a backend without the route). */\n onRename: ((target: ThreadRenameTarget) => void) | undefined;\n renamePending: boolean;\n /** Absent when the archive is not offered (host opt-out, or a backend without the route). */\n onArchive: ((threadId: string) => void) | undefined;\n archivePending: boolean;\n}> = ({\n thread,\n isActive,\n onSelect,\n onPrefetch,\n onToggleFavorite,\n favoritePending,\n onRename,\n renamePending,\n onArchive,\n archivePending,\n}) => {\n const indicator = sessionIndicator(thread);\n const line = sessionSecondaryLine(thread);\n const chip = pullRequestChip(thread.pullRequests);\n const origin = sessionOriginLabel(thread);\n const title = thread.title ?? 'Untitled';\n\n // Hover prefetch: the pointer must rest on the row for the dwell before\n // the fetch starts, so sweeping the pointer down the list fetches nothing.\n const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const cancelHover = useCallback(() => {\n if (hoverTimerRef.current === null) return;\n clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = null;\n }, []);\n useEffect(() => cancelHover, [cancelHover]);\n const handlePointerEnter = () => {\n if (!onPrefetch) return;\n cancelHover();\n hoverTimerRef.current = setTimeout(() => {\n hoverTimerRef.current = null;\n onPrefetch(thread.id);\n }, THREAD_PREFETCH_HOVER_DELAY_MS);\n };\n const handleFocus = () => {\n cancelHover();\n onPrefetch?.(thread.id);\n };\n\n // Inline rename: the title becomes an input; Enter commits, Escape cancels,\n // blur commits. An Enter or Escape settles the edit before the blur its\n // unmount may raise, so the blur never commits a second time.\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState('');\n const settledRef = useRef(false);\n const inputRef = useRef<HTMLInputElement | null>(null);\n useEffect(() => {\n if (!editing) return;\n inputRef.current?.focus();\n inputRef.current?.select();\n }, [editing]);\n const beginRename = (event: MouseEvent) => {\n event.stopPropagation();\n if (renamePending) return;\n settledRef.current = false;\n setDraft(thread.title ?? '');\n setEditing(true);\n };\n const commitRename = () => {\n if (settledRef.current) return;\n settledRef.current = true;\n setEditing(false);\n const next = draft.trim();\n if (!next || next === (thread.title ?? '').trim()) return;\n onRename?.({ threadId: thread.id, title: next });\n };\n const cancelRename = () => {\n settledRef.current = true;\n setEditing(false);\n };\n const handleEditorKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n commitRename();\n } else if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n cancelRename();\n }\n };\n\n const handleArchive = (event: MouseEvent) => {\n event.stopPropagation();\n if (archivePending) return;\n onArchive?.(thread.id);\n };\n\n const hasActions = Boolean(onRename || onToggleFavorite || onArchive);\n const body = (\n <>\n <SessionStatusIndicator kind={indicator} />\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex h-5 items-center gap-1.5\">\n {editing ? (\n <input\n ref={inputRef}\n type=\"text\"\n value={draft}\n maxLength={THREAD_TITLE_MAX_LENGTH}\n aria-label=\"Session title\"\n data-rename-input\n onChange={(event: ChangeEvent<HTMLInputElement>) => setDraft(event.target.value)}\n onKeyDown={handleEditorKeyDown}\n onBlur={commitRename}\n onClick={stopPropagation}\n className={cn(\n 'h-5 min-w-0 flex-1 rounded border border-primary/60 bg-background px-1 font-medium text-foreground text-sm',\n FOCUS_RING_CLASS,\n )}\n />\n ) : (\n <span data-title className=\"min-w-0 truncate font-medium text-sm\">\n {title}\n </span>\n )}\n {thread.isFavorited && !onToggleFavorite ? (\n <PinIcon\n role=\"img\"\n aria-label=\"Pinned\"\n className=\"size-3 shrink-0 fill-current text-muted-foreground\"\n />\n ) : null}\n {origin ? (\n <span\n data-origin={origin}\n className=\"shrink-0 rounded-full border border-border/60 px-1.5 py-px text-[10px] text-muted-foreground\"\n >\n {origin}\n </span>\n ) : null}\n </span>\n <span\n data-line={line.kind}\n className={cn('mt-0.5 block h-4 truncate font-normal text-xs leading-4', LINE_TONE_CLASS[line.tone])}\n >\n {line.text}\n </span>\n </span>\n </>\n );\n\n return (\n <li\n data-active={isActive || undefined}\n data-thread-id={thread.id}\n data-editing={editing || undefined}\n onPointerEnter={handlePointerEnter}\n onPointerLeave={cancelHover}\n className={cn(\n 'group relative flex items-start gap-1 rounded-lg text-muted-foreground transition-colors hover:bg-muted/40 hover:text-foreground',\n isActive && 'bg-muted text-foreground',\n )}\n >\n {isActive ? (\n <span\n aria-hidden=\"true\"\n data-active-accent\n className=\"absolute inset-y-2 left-0 w-0.5 rounded-full bg-primary\"\n />\n ) : null}\n {editing ? (\n <div className=\"flex min-w-0 flex-1 items-start gap-2 p-2 pl-3 text-left\">{body}</div>\n ) : (\n <button\n type=\"button\"\n onClick={() => onSelect(thread.id)}\n onFocus={handleFocus}\n className={cn(\n 'flex min-w-0 flex-1 cursor-pointer items-start gap-2 rounded-lg p-2 pl-3 text-left',\n FOCUS_RING_CLASS,\n )}\n >\n {body}\n </button>\n )}\n {chip || hasActions ? (\n <div className=\"flex shrink-0 flex-col items-end justify-between gap-0.5 py-2 pr-2\">\n {hasActions ? (\n <div data-row-actions className=\"flex h-5 items-center gap-0.5\">\n {onRename ? (\n <RowActionButton\n label=\"Rename session\"\n onClick={beginRename}\n pending={renamePending}\n alwaysVisible={false}\n action=\"rename\"\n >\n <PencilIcon className=\"size-3.5\" aria-hidden />\n </RowActionButton>\n ) : null}\n {onToggleFavorite ? (\n <PinToggle thread={thread} pending={favoritePending} onToggle={onToggleFavorite} />\n ) : null}\n {onArchive ? (\n <RowActionButton\n label=\"Archive session\"\n onClick={handleArchive}\n pending={archivePending}\n alwaysVisible={false}\n action=\"archive\"\n >\n <ArchiveIcon className=\"size-3.5\" aria-hidden />\n </RowActionButton>\n ) : null}\n </div>\n ) : (\n <span aria-hidden=\"true\" className=\"h-5\" />\n )}\n {chip ? <PullRequestChip chip={chip} /> : null}\n </div>\n ) : null}\n </li>\n );\n};\n\n/**\n * Devin-style session list: the `ThreadList` rows with an attention\n * indicator, the server's next action, pull-request chips, an origin badge\n * and a trailing action cluster (rename inline, pin, archive) revealed on\n * hover or focus, grouped by what each session asks of the viewer. Reads the\n * thread-list state that `<AthenaProvider enableThreadList>` provides and\n * renders nothing outside that mode.\n *\n * Every write is optimistic and rolls back on failure: the pin flips the row\n * and moves it between `Pinned` and `Recent`; the rename shows the new title\n * on commit; the archive removes the row. On a backend that predates a route\n * the matching action is withdrawn (`favoriteToggleAvailable` falls back to a\n * read-only pin; `renameAvailable` / `archiveAvailable` hide the action).\n *\n * Rows warm the provider's snapshot cache after a 120 ms hover dwell (and on\n * focus) so a selection paints its transcript at once. Skeleton rows stand in\n * while the first page loads or a refresh has nothing to keep; the empty\n * state appears only after a settled empty answer, and a background refresh\n * never blanks the rows it already has.\n */\nexport function SessionList({\n className,\n grouped = true,\n showSearch = true,\n showPinToggle = true,\n showRename = true,\n showArchive = true,\n prefetchOnHover = true,\n}: SessionListProps) {\n const list = useAthenaStatewireThreadList();\n if (!list) return null;\n\n const sections = groupSessions(list.threads, grouped);\n const hasSearch = list.search.trim().length > 0;\n const handleSearch = (event: ChangeEvent<HTMLInputElement>) =>\n list.setSearch(event.target.value);\n const onToggleFavorite =\n showPinToggle && list.favoriteToggleAvailable ? list.setFavorited : undefined;\n const onRename = showRename && list.renameAvailable ? list.renameThread : undefined;\n const onArchive = showArchive && list.archiveAvailable ? list.archiveThread : undefined;\n const onPrefetch = prefetchOnHover ? list.prefetchThread : undefined;\n // Skeleton until the first page has answered (no credential yet, or the\n // page in flight) and for a refresh with no rows to keep; a refresh that\n // has rows keeps showing them.\n const showSkeleton =\n !list.hasResolvedFirstPage || (list.isFetching && list.threads.length === 0);\n\n return (\n <div\n className={cn('athena-sdk-chrome flex flex-col gap-2', className)}\n data-testid=\"session-list\"\n >\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={list.newThread}\n className={cn(\n 'flex h-9 flex-1 items-center gap-2 rounded-lg border border-border/60 px-3 font-medium text-muted-foreground text-sm transition-colors hover:bg-muted hover:text-foreground',\n FOCUS_RING_CLASS,\n )}\n >\n <PlusIcon className=\"size-4\" />\n New Chat\n </button>\n <button\n type=\"button\"\n onClick={list.refresh}\n disabled={list.isFetching}\n className={cn(\n 'flex size-9 items-center justify-center rounded-lg border border-border/60 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground disabled:opacity-50',\n FOCUS_RING_CLASS,\n )}\n title=\"Refresh sessions\"\n aria-label=\"Refresh sessions\"\n >\n <RefreshCwIcon className={cn('size-4', list.isFetching && 'animate-spin')} />\n </button>\n </div>\n\n {showSearch ? (\n <label className=\"relative block\">\n <SearchIcon className=\"pointer-events-none absolute top-1/2 left-2.5 size-3.5 -translate-y-1/2 text-muted-foreground\" />\n <span className=\"sr-only\">Search sessions</span>\n <input\n type=\"search\"\n value={list.search}\n onChange={handleSearch}\n placeholder=\"Search sessions…\"\n className=\"h-8 w-full rounded-lg border border-border/60 bg-muted/40 pr-2 pl-8 text-sm outline-none focus:border-primary focus:bg-background\"\n />\n </label>\n ) : null}\n\n {showSkeleton ? (\n <SessionListSkeleton />\n ) : sections.length === 0 ? (\n <p data-testid=\"session-list-empty\" className=\"px-3 py-4 text-muted-foreground text-xs\">\n {hasSearch ? 'No matching sessions.' : 'No sessions yet.'}\n </p>\n ) : (\n <div className=\"flex flex-col gap-2\" aria-busy={list.isFetching || undefined}>\n {sections.map(({ group, items }) => (\n <section\n key={group ?? 'all'}\n aria-label={group ?? 'Sessions'}\n data-group={group ?? undefined}\n >\n {group ? (\n <h3 className=\"px-3 pb-1 font-medium text-[11px] text-muted-foreground/70 uppercase tracking-wide\">\n {group}\n </h3>\n ) : null}\n <ul className=\"flex flex-col gap-0.5\">\n {items.map((thread) => (\n <SessionRow\n key={thread.id}\n thread={thread}\n isActive={thread.id === list.activeThreadId}\n onSelect={list.selectThread}\n onPrefetch={onPrefetch}\n onToggleFavorite={onToggleFavorite}\n favoritePending={list.favoritePendingThreadIds.has(thread.id)}\n onRename={onRename}\n renamePending={list.renamePendingThreadIds.has(thread.id)}\n onArchive={onArchive}\n archivePending={list.archivePendingThreadIds.has(thread.id)}\n />\n ))}\n </ul>\n </section>\n ))}\n </div>\n )}\n\n {list.hasNextPage && !showSkeleton ? (\n <button\n type=\"button\"\n disabled={list.isFetchingNextPage}\n onClick={list.fetchNextPage}\n className={cn(\n 'w-full rounded-lg py-2 text-muted-foreground text-xs transition-colors hover:bg-muted disabled:opacity-50',\n FOCUS_RING_CLASS,\n )}\n >\n {list.isFetchingNextPage ? 'Loading…' : 'Load more'}\n </button>\n ) : null}\n </div>\n );\n}\n"],"names":["jsx","LoaderCircleIcon","ClockIcon","cn","GitPullRequestIcon","GitPullRequestDraftIcon","GitMergeIcon","GitPullRequestClosedIcon","jsxs","PinIcon","sessionIndicator","sessionSecondaryLine","pullRequestChip","sessionOriginLabel","useRef","useCallback","useEffect","THREAD_PREFETCH_HOVER_DELAY_MS","useState","Fragment","THREAD_TITLE_MAX_LENGTH","PencilIcon","ArchiveIcon","useAthenaStatewireThreadList","groupSessions","PlusIcon","RefreshCwIcon","SearchIcon"],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { FC } from 'react';
|
|
2
|
+
export interface SessionListProps {
|
|
3
|
+
className?: string;
|
|
4
|
+
/**
|
|
5
|
+
* Group rows under "Needs you" / "Working" / "Pinned" / "Recent" (default
|
|
6
|
+
* `true`); a session appears once, in the first group that applies. `false`
|
|
7
|
+
* renders one newest-first list.
|
|
8
|
+
*/
|
|
9
|
+
grouped?: boolean;
|
|
10
|
+
/** Show the title search box, wired to the server-side `search` (default `true`). */
|
|
11
|
+
showSearch?: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Offer the pin toggle on each row (default `true`). `false` — or a backend
|
|
14
|
+
* without the favorite route — shows a pinned row's pin read-only instead.
|
|
15
|
+
*/
|
|
16
|
+
showPinToggle?: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Offer the inline rename on each row (default `true`). Withdrawn on a
|
|
19
|
+
* backend without the rename route (`renameAvailable`).
|
|
20
|
+
*/
|
|
21
|
+
showRename?: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Offer the archive action on each row (default `true`). Withdrawn on a
|
|
24
|
+
* backend without the archive route (`archiveAvailable`).
|
|
25
|
+
*/
|
|
26
|
+
showArchive?: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Warm the provider's snapshot cache for a row after a 120 ms hover dwell
|
|
29
|
+
* and on row focus (default `true`), so selecting it paints at once.
|
|
30
|
+
*/
|
|
31
|
+
prefetchOnHover?: boolean;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Placeholder rows shaped like session rows (indicator, title line, meta
|
|
35
|
+
* line) for the first page and for a refresh that has no rows to keep yet.
|
|
36
|
+
*/
|
|
37
|
+
export declare const SessionListSkeleton: FC<{
|
|
38
|
+
rows?: number;
|
|
39
|
+
}>;
|
|
40
|
+
/**
|
|
41
|
+
* Devin-style session list: the `ThreadList` rows with an attention
|
|
42
|
+
* indicator, the server's next action, pull-request chips, an origin badge
|
|
43
|
+
* and a trailing action cluster (rename inline, pin, archive) revealed on
|
|
44
|
+
* hover or focus, grouped by what each session asks of the viewer. Reads the
|
|
45
|
+
* thread-list state that `<AthenaProvider enableThreadList>` provides and
|
|
46
|
+
* renders nothing outside that mode.
|
|
47
|
+
*
|
|
48
|
+
* Every write is optimistic and rolls back on failure: the pin flips the row
|
|
49
|
+
* and moves it between `Pinned` and `Recent`; the rename shows the new title
|
|
50
|
+
* on commit; the archive removes the row. On a backend that predates a route
|
|
51
|
+
* the matching action is withdrawn (`favoriteToggleAvailable` falls back to a
|
|
52
|
+
* read-only pin; `renameAvailable` / `archiveAvailable` hide the action).
|
|
53
|
+
*
|
|
54
|
+
* Rows warm the provider's snapshot cache after a 120 ms hover dwell (and on
|
|
55
|
+
* focus) so a selection paints its transcript at once. Skeleton rows stand in
|
|
56
|
+
* while the first page loads or a refresh has nothing to keep; the empty
|
|
57
|
+
* state appears only after a settled empty answer, and a background refresh
|
|
58
|
+
* never blanks the rows it already has.
|
|
59
|
+
*/
|
|
60
|
+
export declare function SessionList({ className, grouped, showSearch, showPinToggle, showRename, showArchive, prefetchOnHover, }: SessionListProps): import("react/jsx-runtime").JSX.Element | null;
|