@athenaintel/react 0.28.1 → 0.30.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 +418 -10
- package/dist/agent-runtime/src/asset-attachment.cjs.map +1 -0
- package/dist/agent-runtime/src/asset-attachment.js.map +1 -0
- package/dist/agent-runtime/src/auth-denial.cjs.map +1 -0
- package/dist/agent-runtime/src/auth-denial.js.map +1 -0
- package/dist/agent-runtime/src/client-tool-bridge.cjs.map +1 -0
- package/dist/agent-runtime/src/client-tool-bridge.js.map +1 -0
- package/dist/agent-runtime/src/client-tools.cjs.map +1 -0
- package/dist/agent-runtime/src/client-tools.js.map +1 -0
- package/dist/agent-runtime/src/composer-markdown.cjs +124 -0
- package/dist/agent-runtime/src/composer-markdown.cjs.map +1 -0
- package/dist/agent-runtime/src/composer-markdown.js +124 -0
- package/dist/agent-runtime/src/composer-markdown.js.map +1 -0
- package/dist/agent-runtime/src/conversation-index.cjs.map +1 -0
- package/dist/agent-runtime/src/conversation-index.js.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/conversation-list.cjs +36 -0
- package/dist/agent-runtime/src/conversation-list.cjs.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/conversation-list.js +36 -0
- package/dist/agent-runtime/src/conversation-list.js.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/deep-agent-transport-recipe.cjs +5 -3
- package/dist/agent-runtime/src/deep-agent-transport-recipe.cjs.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/deep-agent-transport-recipe.js +6 -4
- package/dist/agent-runtime/src/deep-agent-transport-recipe.js.map +1 -0
- package/dist/agent-runtime/src/edit-command.cjs.map +1 -0
- package/dist/agent-runtime/src/edit-command.js.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/errors.cjs +23 -0
- package/dist/agent-runtime/src/errors.cjs.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/errors.js +23 -0
- package/dist/agent-runtime/src/errors.js.map +1 -0
- package/dist/agent-runtime/src/execute-output.cjs +41 -0
- package/dist/agent-runtime/src/execute-output.cjs.map +1 -0
- package/dist/agent-runtime/src/execute-output.js +41 -0
- package/dist/agent-runtime/src/execute-output.js.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/generated/runconfig-contract.cjs +10 -2
- package/dist/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/generated/runconfig-contract.js +10 -2
- package/dist/agent-runtime/src/generated/runconfig-contract.js.map +1 -0
- package/dist/agent-runtime/src/github-wake-event.cjs.map +1 -0
- package/dist/agent-runtime/src/github-wake-event.js.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/interrupts.cjs +24 -1
- package/dist/agent-runtime/src/interrupts.cjs.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/interrupts.js +24 -1
- package/dist/agent-runtime/src/interrupts.js.map +1 -0
- package/dist/agent-runtime/src/message-author.cjs.map +1 -0
- package/dist/agent-runtime/src/message-author.js.map +1 -0
- package/dist/agent-runtime/src/message-window.cjs.map +1 -0
- package/dist/agent-runtime/src/message-window.js.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/messages.cjs +8 -4
- package/dist/agent-runtime/src/messages.cjs.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/messages.js +6 -2
- package/dist/agent-runtime/src/messages.js.map +1 -0
- package/dist/agent-runtime/src/model-context.cjs.map +1 -0
- package/dist/agent-runtime/src/model-context.js.map +1 -0
- package/dist/agent-runtime/src/optimistic-content.cjs.map +1 -0
- package/dist/agent-runtime/src/optimistic-content.js.map +1 -0
- package/dist/agent-runtime/src/protocol.cjs.map +1 -0
- package/dist/agent-runtime/src/protocol.js.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/queue.cjs +23 -2
- package/dist/agent-runtime/src/queue.cjs.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/queue.js +23 -2
- package/dist/agent-runtime/src/queue.js.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/quota-safe-local-storage-session.cjs +23 -13
- package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/quota-safe-local-storage-session.js +24 -14
- package/dist/agent-runtime/src/quota-safe-local-storage-session.js.map +1 -0
- package/dist/agent-runtime/src/runtime-messages.cjs.map +1 -0
- package/dist/agent-runtime/src/runtime-messages.js.map +1 -0
- package/dist/agent-runtime/src/screen-point.cjs.map +1 -0
- package/dist/agent-runtime/src/screen-point.js.map +1 -0
- package/dist/agent-runtime/src/send-recovery.cjs.map +1 -0
- package/dist/agent-runtime/src/send-recovery.js.map +1 -0
- package/dist/agent-runtime/src/statewire-attach-observer.cjs.map +1 -0
- package/dist/agent-runtime/src/statewire-attach-observer.js.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/statewire-state.cjs +8 -0
- package/dist/agent-runtime/src/statewire-state.cjs.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/statewire-state.js +8 -0
- package/dist/agent-runtime/src/statewire-state.js.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/statewire-suspended.cjs +4 -0
- package/dist/agent-runtime/src/statewire-suspended.cjs.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/statewire-suspended.js +4 -0
- package/dist/agent-runtime/src/statewire-suspended.js.map +1 -0
- package/dist/agent-runtime/src/statewire-transport.cjs +43 -0
- package/dist/agent-runtime/src/statewire-transport.cjs.map +1 -0
- package/dist/agent-runtime/src/statewire-transport.js +43 -0
- package/dist/agent-runtime/src/statewire-transport.js.map +1 -0
- package/dist/agent-runtime/src/streaming-markdown.cjs.map +1 -0
- package/dist/agent-runtime/src/streaming-markdown.js.map +1 -0
- package/dist/agent-runtime/src/subscription-wake-event.cjs +252 -0
- package/dist/agent-runtime/src/subscription-wake-event.cjs.map +1 -0
- package/dist/agent-runtime/src/subscription-wake-event.js +252 -0
- package/dist/agent-runtime/src/subscription-wake-event.js.map +1 -0
- package/dist/agent-runtime/src/thread-extras.cjs.map +1 -0
- package/dist/agent-runtime/src/thread-extras.js.map +1 -0
- package/dist/agent-runtime/src/thread-snapshot-cache.cjs.map +1 -0
- package/dist/agent-runtime/src/thread-snapshot-cache.js.map +1 -0
- package/dist/agent-runtime/src/thread-status.cjs.map +1 -0
- package/dist/agent-runtime/src/thread-status.js.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/tool-metadata.cjs +279 -3
- package/dist/agent-runtime/src/tool-metadata.cjs.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/tool-metadata.js +279 -3
- package/dist/agent-runtime/src/tool-metadata.js.map +1 -0
- package/dist/agent-runtime/src/tool-names.cjs +5 -0
- package/dist/agent-runtime/src/tool-names.cjs.map +1 -0
- package/dist/agent-runtime/src/tool-names.js +5 -0
- package/dist/agent-runtime/src/tool-names.js.map +1 -0
- package/dist/agent-runtime/src/tool-outputs.cjs.map +1 -0
- package/dist/agent-runtime/src/tool-outputs.js.map +1 -0
- package/dist/agent-runtime/src/tool-result.cjs.map +1 -0
- package/dist/agent-runtime/src/tool-result.js.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/use-conversation-list.cjs +33 -22
- package/dist/agent-runtime/src/use-conversation-list.cjs.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/use-conversation-list.js +34 -23
- package/dist/agent-runtime/src/use-conversation-list.js.map +1 -0
- package/dist/agent-runtime/src/use-deep-agent-config.cjs.map +1 -0
- package/dist/agent-runtime/src/use-deep-agent-config.js.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/use-deep-agent-edit-submit.cjs +2 -0
- package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/use-deep-agent-edit-submit.js +2 -0
- package/dist/agent-runtime/src/use-deep-agent-edit-submit.js.map +1 -0
- package/dist/agent-runtime/src/use-deep-agent-runtime.cjs.map +1 -0
- package/dist/agent-runtime/src/use-deep-agent-runtime.js.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/use-deep-agent-thread.cjs +1 -0
- package/dist/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/use-deep-agent-thread.js +2 -1
- package/dist/agent-runtime/src/use-deep-agent-thread.js.map +1 -0
- package/dist/agent-runtime/src/use-deep-agent-window-sync.cjs.map +1 -0
- package/dist/agent-runtime/src/use-deep-agent-window-sync.js.map +1 -0
- package/dist/agent-runtime/src/use-historical-edit-attachments.cjs +52 -0
- package/dist/agent-runtime/src/use-historical-edit-attachments.cjs.map +1 -0
- package/dist/agent-runtime/src/use-historical-edit-attachments.js +52 -0
- package/dist/agent-runtime/src/use-historical-edit-attachments.js.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/voice-presentation.cjs +14 -0
- package/dist/agent-runtime/src/voice-presentation.cjs.map +1 -0
- package/dist/{packages/agent-runtime → agent-runtime}/src/voice-presentation.js +14 -0
- package/dist/agent-runtime/src/voice-presentation.js.map +1 -0
- package/dist/agent-runtime/src/voice-turn-grouping.cjs.map +1 -0
- package/dist/agent-runtime/src/voice-turn-grouping.js.map +1 -0
- package/dist/assets/AthenaAssetEmbed.cjs +8 -2
- package/dist/assets/AthenaAssetEmbed.cjs.map +1 -1
- package/dist/assets/AthenaAssetEmbed.d.ts +8 -0
- package/dist/assets/AthenaAssetEmbed.js +8 -2
- package/dist/assets/AthenaAssetEmbed.js.map +1 -1
- package/dist/assets/AthenaLayout.cjs +97 -31
- package/dist/assets/AthenaLayout.cjs.map +1 -1
- package/dist/assets/AthenaLayout.d.ts +13 -0
- package/dist/assets/AthenaLayout.js +98 -32
- package/dist/assets/AthenaLayout.js.map +1 -1
- package/dist/assets/asset-embed-messages.cjs.map +1 -1
- package/dist/assets/asset-embed-messages.d.ts +6 -0
- package/dist/assets/asset-embed-messages.js.map +1 -1
- package/dist/assets/asset-panel-store.cjs +68 -32
- package/dist/assets/asset-panel-store.cjs.map +1 -1
- package/dist/assets/asset-panel-store.d.ts +47 -1
- package/dist/assets/asset-panel-store.js +68 -32
- package/dist/assets/asset-panel-store.js.map +1 -1
- package/dist/assets/use-asset-embed.cjs +29 -8
- package/dist/assets/use-asset-embed.cjs.map +1 -1
- package/dist/assets/use-asset-embed.d.ts +7 -0
- package/dist/assets/use-asset-embed.js +29 -8
- package/dist/assets/use-asset-embed.js.map +1 -1
- package/dist/catalog/chat-pickers.cjs +152 -0
- package/dist/catalog/chat-pickers.cjs.map +1 -0
- package/dist/catalog/chat-pickers.d.ts +22 -0
- package/dist/catalog/chat-pickers.js +152 -0
- package/dist/catalog/chat-pickers.js.map +1 -0
- package/dist/catalog/runtime-catalog.cjs +181 -0
- package/dist/catalog/runtime-catalog.cjs.map +1 -0
- package/dist/catalog/runtime-catalog.d.ts +100 -0
- package/dist/catalog/runtime-catalog.js +181 -0
- package/dist/catalog/runtime-catalog.js.map +1 -0
- package/dist/chat/AthenaChat.cjs +86 -46
- package/dist/chat/AthenaChat.cjs.map +1 -1
- package/dist/chat/AthenaChat.d.ts +21 -4
- package/dist/chat/AthenaChat.js +88 -48
- package/dist/chat/AthenaChat.js.map +1 -1
- package/dist/chat/StatewireApprovalCard.cjs +38 -37
- package/dist/chat/StatewireApprovalCard.cjs.map +1 -1
- package/dist/chat/StatewireApprovalCard.d.ts +2 -0
- package/dist/chat/StatewireApprovalCard.js +39 -38
- package/dist/chat/StatewireApprovalCard.js.map +1 -1
- package/dist/chat/StatewireClientToolBridge.cjs +2 -2
- package/dist/chat/StatewireClientToolBridge.js +2 -2
- package/dist/chat/StatewireQueuedMessages.cjs +15 -12
- package/dist/chat/StatewireQueuedMessages.cjs.map +1 -1
- package/dist/chat/StatewireQueuedMessages.d.ts +22 -2
- package/dist/chat/StatewireQueuedMessages.js +15 -12
- package/dist/chat/StatewireQueuedMessages.js.map +1 -1
- package/dist/chat/StatewireRunRefusalNotice.cjs +48 -0
- package/dist/chat/StatewireRunRefusalNotice.cjs.map +1 -0
- package/dist/chat/StatewireRunRefusalNotice.d.ts +25 -0
- package/dist/chat/StatewireRunRefusalNotice.js +48 -0
- package/dist/chat/StatewireRunRefusalNotice.js.map +1 -0
- package/dist/chat/WaitingOnYouBanner.cjs +2 -2
- package/dist/chat/WaitingOnYouBanner.js +2 -2
- package/dist/chat/athena-citation-links.cjs +19 -15
- package/dist/chat/athena-citation-links.cjs.map +1 -1
- package/dist/chat/athena-citation-links.js +19 -15
- package/dist/chat/athena-citation-links.js.map +1 -1
- package/dist/chat/run-activity.cjs +9 -1
- package/dist/chat/run-activity.cjs.map +1 -1
- package/dist/chat/run-activity.d.ts +6 -0
- package/dist/chat/run-activity.js +10 -2
- package/dist/chat/run-activity.js.map +1 -1
- package/dist/chat/statewire-banners.cjs +30 -1
- package/dist/chat/statewire-banners.cjs.map +1 -1
- package/dist/chat/statewire-banners.d.ts +20 -1
- package/dist/chat/statewire-banners.js +32 -3
- package/dist/chat/statewire-banners.js.map +1 -1
- package/dist/chat/statewire-client-tools.cjs +1 -1
- package/dist/chat/statewire-client-tools.js +1 -1
- package/dist/chat/super-grouping/CollapsibleGroup.cjs +1 -1
- package/dist/chat/super-grouping/CollapsibleGroup.cjs.map +1 -1
- package/dist/chat/super-grouping/CollapsibleGroup.js +1 -1
- package/dist/chat/super-grouping/CollapsibleGroup.js.map +1 -1
- package/dist/chat/super-grouping/SuperGroupingCard.cjs +7 -5
- package/dist/chat/super-grouping/SuperGroupingCard.cjs.map +1 -1
- package/dist/chat/super-grouping/SuperGroupingCard.d.ts +8 -2
- package/dist/chat/super-grouping/SuperGroupingCard.js +7 -5
- package/dist/chat/super-grouping/SuperGroupingCard.js.map +1 -1
- package/dist/chat/super-grouping/SuperGroupingTranscript.cjs +350 -0
- package/dist/chat/super-grouping/SuperGroupingTranscript.cjs.map +1 -0
- package/dist/chat/super-grouping/SuperGroupingTranscript.d.ts +31 -0
- package/dist/chat/super-grouping/SuperGroupingTranscript.js +350 -0
- package/dist/chat/super-grouping/SuperGroupingTranscript.js.map +1 -0
- package/dist/chat/super-grouping/ToolTimeline.cjs +13 -2
- package/dist/chat/super-grouping/ToolTimeline.cjs.map +1 -1
- package/dist/chat/super-grouping/ToolTimeline.d.ts +10 -3
- package/dist/chat/super-grouping/ToolTimeline.js +13 -2
- package/dist/chat/super-grouping/ToolTimeline.js.map +1 -1
- package/dist/chat/super-grouping/activity-timeline.cjs +51 -26
- package/dist/chat/super-grouping/activity-timeline.cjs.map +1 -1
- package/dist/chat/super-grouping/activity-timeline.d.ts +40 -8
- package/dist/chat/super-grouping/activity-timeline.js +52 -27
- package/dist/chat/super-grouping/activity-timeline.js.map +1 -1
- package/dist/chat/super-grouping/index.cjs +12 -0
- package/dist/chat/super-grouping/index.cjs.map +1 -1
- package/dist/chat/super-grouping/index.d.ts +7 -2
- package/dist/chat/super-grouping/index.js +14 -2
- package/dist/chat/super-grouping/index.js.map +1 -1
- package/dist/chat/super-grouping/timeline-step.cjs +14 -5
- package/dist/chat/super-grouping/timeline-step.cjs.map +1 -1
- package/dist/chat/super-grouping/timeline-step.d.ts +10 -1
- package/dist/chat/super-grouping/timeline-step.js +15 -6
- package/dist/chat/super-grouping/timeline-step.js.map +1 -1
- package/dist/chat/super-grouping/turn-segments.cjs +82 -0
- package/dist/chat/super-grouping/turn-segments.cjs.map +1 -0
- package/dist/chat/super-grouping/turn-segments.d.ts +69 -0
- package/dist/chat/super-grouping/turn-segments.js +82 -0
- package/dist/chat/super-grouping/turn-segments.js.map +1 -0
- package/dist/chat/super-grouping/turn-timing.cjs +110 -0
- package/dist/chat/super-grouping/turn-timing.cjs.map +1 -0
- package/dist/chat/super-grouping/turn-timing.d.ts +52 -0
- package/dist/chat/super-grouping/turn-timing.js +110 -0
- package/dist/chat/super-grouping/turn-timing.js.map +1 -0
- package/dist/chat/tiptap-text.cjs +1 -1
- package/dist/chat/tiptap-text.js +1 -1
- package/dist/chat/use-athena-run-live.cjs +1 -1
- package/dist/chat/use-athena-run-live.js +1 -1
- package/dist/chat/use-statewire-approval-request.cjs +73 -4
- package/dist/chat/use-statewire-approval-request.cjs.map +1 -1
- package/dist/chat/use-statewire-approval-request.js +74 -5
- package/dist/chat/use-statewire-approval-request.js.map +1 -1
- package/dist/chat-ui/composer/composer-message.cjs +284 -0
- package/dist/chat-ui/composer/composer-message.cjs.map +1 -0
- package/dist/chat-ui/composer/composer-message.d.ts +152 -0
- package/dist/chat-ui/composer/composer-message.js +284 -0
- package/dist/chat-ui/composer/composer-message.js.map +1 -0
- package/dist/chat-ui/composer/tiptap-composer.cjs +57 -11
- package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -1
- package/dist/chat-ui/composer/tiptap-composer.d.ts +34 -6
- package/dist/chat-ui/composer/tiptap-composer.js +57 -11
- package/dist/chat-ui/composer/tiptap-composer.js.map +1 -1
- package/dist/chat-ui/index.cjs +4 -1
- package/dist/chat-ui/index.cjs.map +1 -1
- package/dist/chat-ui/index.d.ts +3 -2
- package/dist/chat-ui/index.js +5 -2
- package/dist/chat-ui/index.js.map +1 -1
- package/dist/chat-ui/mentions/mention-chip.cjs +3 -2
- package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -1
- package/dist/chat-ui/mentions/mention-chip.js +4 -3
- package/dist/chat-ui/mentions/mention-chip.js.map +1 -1
- package/dist/chat-ui/mentions/mention-extension.cjs +8 -2
- package/dist/chat-ui/mentions/mention-extension.cjs.map +1 -1
- package/dist/chat-ui/mentions/mention-extension.js +8 -2
- package/dist/chat-ui/mentions/mention-extension.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs +3 -1
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.js +3 -1
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs +65 -19
- package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/sources/index.d.ts +15 -0
- package/dist/chat-ui/mentions/suggestions/data/sources/index.js +67 -21
- package/dist/chat-ui/mentions/suggestions/data/sources/index.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs +4 -2
- 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 +2 -1
- package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js +5 -3
- package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js.map +1 -1
- package/dist/chat-ui/messages/message-components.cjs +30 -10
- package/dist/chat-ui/messages/message-components.cjs.map +1 -1
- package/dist/chat-ui/messages/message-components.d.ts +21 -1
- package/dist/chat-ui/messages/message-components.js +30 -10
- package/dist/chat-ui/messages/message-components.js.map +1 -1
- package/dist/chat-ui/messages/runtime-message.cjs +1 -1
- package/dist/chat-ui/messages/runtime-message.js +1 -1
- package/dist/chat-ui/messages/statewire-continue-run.cjs +5 -5
- package/dist/chat-ui/messages/statewire-continue-run.js +5 -5
- package/dist/chat-ui/messages/user-edit-composer.cjs +1 -1
- package/dist/chat-ui/messages/user-edit-composer.js +1 -1
- package/dist/chat-ui/messages/wake-marker.cjs +39 -4
- package/dist/chat-ui/messages/wake-marker.cjs.map +1 -1
- package/dist/chat-ui/messages/wake-marker.d.ts +16 -5
- package/dist/chat-ui/messages/wake-marker.js +40 -5
- package/dist/chat-ui/messages/wake-marker.js.map +1 -1
- package/dist/chat-ui/rich-text/chat-message-body.cjs +12 -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 +6 -1
- package/dist/chat-ui/rich-text/chat-message-body.js +13 -9
- package/dist/chat-ui/rich-text/chat-message-body.js.map +1 -1
- package/dist/chat-ui/rich-text/chat-text-schema.cjs +64 -6
- package/dist/chat-ui/rich-text/chat-text-schema.cjs.map +1 -1
- package/dist/chat-ui/rich-text/chat-text-schema.d.ts +5 -0
- package/dist/chat-ui/rich-text/chat-text-schema.js +66 -8
- package/dist/chat-ui/rich-text/chat-text-schema.js.map +1 -1
- package/dist/chat-ui/statewire.cjs +1 -1
- package/dist/chat-ui/statewire.d.ts +1 -1
- package/dist/chat-ui/statewire.js +1 -1
- package/dist/chat-ui/thread/statewire-history-edge.cjs +2 -2
- package/dist/chat-ui/thread/statewire-history-edge.js +2 -2
- package/dist/collab/client.cjs +218 -13
- package/dist/collab/client.cjs.map +1 -1
- package/dist/collab/client.d.ts +105 -2
- package/dist/collab/client.js +221 -17
- package/dist/collab/client.js.map +1 -1
- package/dist/collab/index.cjs +2 -0
- package/dist/collab/index.cjs.map +1 -1
- package/dist/collab/index.d.ts +1 -1
- package/dist/collab/index.js +3 -1
- package/dist/composer/AttachmentContext.cjs +38 -12
- package/dist/composer/AttachmentContext.cjs.map +1 -1
- package/dist/composer/AttachmentContext.d.ts +22 -1
- package/dist/composer/AttachmentContext.js +40 -14
- package/dist/composer/AttachmentContext.js.map +1 -1
- package/dist/composer/QuoteContext.cjs +80 -28
- package/dist/composer/QuoteContext.cjs.map +1 -1
- package/dist/composer/QuoteContext.d.ts +35 -6
- package/dist/composer/QuoteContext.js +82 -30
- package/dist/composer/QuoteContext.js.map +1 -1
- package/dist/composer/build-composed-message.cjs +27 -0
- package/dist/composer/build-composed-message.cjs.map +1 -1
- package/dist/composer/build-composed-message.d.ts +21 -0
- package/dist/composer/build-composed-message.js +28 -1
- package/dist/composer/build-composed-message.js.map +1 -1
- package/dist/composer/composer-handoff.cjs +13 -1
- package/dist/composer/composer-handoff.cjs.map +1 -1
- package/dist/composer/composer-handoff.d.ts +12 -0
- package/dist/composer/composer-handoff.js +15 -3
- package/dist/composer/composer-handoff.js.map +1 -1
- package/dist/composer/index.d.ts +6 -3
- package/dist/composer/useReadComposerDraft.cjs +16 -0
- package/dist/composer/useReadComposerDraft.cjs.map +1 -0
- package/dist/composer/useReadComposerDraft.d.ts +6 -0
- package/dist/composer/useReadComposerDraft.js +16 -0
- package/dist/composer/useReadComposerDraft.js.map +1 -0
- package/dist/diagnostics/errors.cjs +6 -0
- package/dist/diagnostics/errors.cjs.map +1 -1
- package/dist/diagnostics/errors.d.ts +6 -0
- package/dist/diagnostics/errors.js +6 -0
- package/dist/diagnostics/errors.js.map +1 -1
- package/dist/index.cjs +159 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +53 -12
- package/dist/index.js +166 -14
- package/dist/index.js.map +1 -1
- package/dist/lib/owner-document.cjs +32 -0
- package/dist/lib/owner-document.cjs.map +1 -0
- package/dist/lib/owner-document.d.ts +17 -0
- package/dist/lib/owner-document.js +32 -0
- package/dist/lib/owner-document.js.map +1 -0
- package/dist/lib/portal-surface.cjs +55 -0
- package/dist/lib/portal-surface.cjs.map +1 -0
- package/dist/lib/portal-surface.d.ts +37 -0
- package/dist/lib/portal-surface.js +55 -0
- package/dist/lib/portal-surface.js.map +1 -0
- package/dist/lib/use-athena-rest-query.cjs +34 -0
- package/dist/lib/use-athena-rest-query.cjs.map +1 -0
- package/dist/lib/use-athena-rest-query.d.ts +31 -0
- package/dist/lib/use-athena-rest-query.js +34 -0
- package/dist/lib/use-athena-rest-query.js.map +1 -0
- package/dist/provider/AthenaProvider.cjs +36 -6
- package/dist/provider/AthenaProvider.cjs.map +1 -1
- package/dist/provider/AthenaProvider.d.ts +20 -1
- package/dist/provider/AthenaProvider.js +38 -8
- package/dist/provider/AthenaProvider.js.map +1 -1
- package/dist/provider/citation-links.d.ts +10 -2
- package/dist/{packages/react → react}/package.json.cjs +1 -1
- package/dist/{packages/react → react}/package.json.js +1 -1
- package/dist/runtime/statewire-lifecycle.cjs +15 -3
- package/dist/runtime/statewire-lifecycle.cjs.map +1 -1
- package/dist/runtime/statewire-lifecycle.d.ts +6 -0
- package/dist/runtime/statewire-lifecycle.js +15 -3
- package/dist/runtime/statewire-lifecycle.js.map +1 -1
- package/dist/runtime/useAthenaStatewireRuntime.cjs +11 -7
- package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
- package/dist/runtime/useAthenaStatewireRuntime.js +11 -7
- package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
- package/dist/search/useAthenaRepoSearch.cjs +5 -13
- package/dist/search/useAthenaRepoSearch.cjs.map +1 -1
- package/dist/search/useAthenaRepoSearch.d.ts +3 -3
- package/dist/search/useAthenaRepoSearch.js +6 -14
- package/dist/search/useAthenaRepoSearch.js.map +1 -1
- package/dist/sheet-range/a1.cjs +162 -0
- package/dist/sheet-range/a1.cjs.map +1 -0
- package/dist/sheet-range/a1.d.ts +91 -0
- package/dist/sheet-range/a1.js +162 -0
- package/dist/sheet-range/a1.js.map +1 -0
- package/dist/sheet-range/index.cjs +22 -0
- package/dist/sheet-range/index.cjs.map +1 -0
- package/dist/sheet-range/index.d.ts +12 -0
- package/dist/sheet-range/index.js +22 -0
- package/dist/sheet-range/index.js.map +1 -0
- package/dist/sheet-range/range-preview-table.cjs +75 -0
- package/dist/sheet-range/range-preview-table.cjs.map +1 -0
- package/dist/sheet-range/range-preview-table.d.ts +20 -0
- package/dist/sheet-range/range-preview-table.js +75 -0
- package/dist/sheet-range/range-preview-table.js.map +1 -0
- package/dist/sheet-range/range-preview.cjs +116 -0
- package/dist/sheet-range/range-preview.cjs.map +1 -0
- package/dist/sheet-range/range-preview.d.ts +67 -0
- package/dist/sheet-range/range-preview.js +116 -0
- package/dist/sheet-range/range-preview.js.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/threads/Inbox.cjs +289 -0
- package/dist/threads/Inbox.cjs.map +1 -0
- package/dist/threads/Inbox.d.ts +46 -0
- package/dist/threads/Inbox.js +289 -0
- package/dist/threads/Inbox.js.map +1 -0
- package/dist/threads/SessionList.cjs +51 -126
- package/dist/threads/SessionList.cjs.map +1 -1
- package/dist/threads/SessionList.d.ts +26 -1
- package/dist/threads/SessionList.js +45 -120
- package/dist/threads/SessionList.js.map +1 -1
- package/dist/threads/SessionsPage.cjs +753 -0
- package/dist/threads/SessionsPage.cjs.map +1 -0
- package/dist/threads/SessionsPage.d.ts +35 -0
- package/dist/threads/SessionsPage.js +753 -0
- package/dist/threads/SessionsPage.js.map +1 -0
- package/dist/threads/api.cjs +21 -1
- package/dist/threads/api.cjs.map +1 -1
- package/dist/threads/api.d.ts +59 -0
- package/dist/threads/api.js +21 -1
- package/dist/threads/api.js.map +1 -1
- package/dist/threads/conversation-list-fetcher.cjs +9 -2
- package/dist/threads/conversation-list-fetcher.cjs.map +1 -1
- package/dist/threads/conversation-list-fetcher.d.ts +14 -1
- package/dist/threads/conversation-list-fetcher.js +9 -2
- package/dist/threads/conversation-list-fetcher.js.map +1 -1
- package/dist/threads/index.d.ts +2 -1
- package/dist/threads/pull-request-display.cjs +25 -0
- package/dist/threads/pull-request-display.cjs.map +1 -0
- package/dist/threads/pull-request-display.d.ts +15 -0
- package/dist/threads/pull-request-display.js +25 -0
- package/dist/threads/pull-request-display.js.map +1 -0
- package/dist/threads/session-list-model.cjs +16 -2
- package/dist/threads/session-list-model.cjs.map +1 -1
- package/dist/threads/session-list-model.d.ts +10 -0
- package/dist/threads/session-list-model.js +16 -2
- package/dist/threads/session-list-model.js.map +1 -1
- package/dist/threads/session-row-parts.cjs +152 -0
- package/dist/threads/session-row-parts.cjs.map +1 -0
- package/dist/threads/session-row-parts.d.ts +50 -0
- package/dist/threads/session-row-parts.js +152 -0
- package/dist/threads/session-row-parts.js.map +1 -0
- package/dist/threads/sessions-page-model.cjs +305 -0
- package/dist/threads/sessions-page-model.cjs.map +1 -0
- package/dist/threads/sessions-page-model.d.ts +86 -0
- package/dist/threads/sessions-page-model.js +305 -0
- package/dist/threads/sessions-page-model.js.map +1 -0
- package/dist/threads/sessions-page-storage.cjs +93 -0
- package/dist/threads/sessions-page-storage.cjs.map +1 -0
- package/dist/threads/sessions-page-storage.d.ts +23 -0
- package/dist/threads/sessions-page-storage.js +93 -0
- package/dist/threads/sessions-page-storage.js.map +1 -0
- package/dist/threads/sessions-query.cjs +235 -0
- package/dist/threads/sessions-query.cjs.map +1 -0
- package/dist/threads/sessions-query.d.ts +119 -0
- package/dist/threads/sessions-query.js +235 -0
- package/dist/threads/sessions-query.js.map +1 -0
- package/dist/threads/statewire-thread-list.cjs +133 -40
- package/dist/threads/statewire-thread-list.cjs.map +1 -1
- package/dist/threads/statewire-thread-list.d.ts +83 -2
- package/dist/threads/statewire-thread-list.js +134 -41
- package/dist/threads/statewire-thread-list.js.map +1 -1
- package/dist/threads/use-athena-sessions.cjs +198 -0
- package/dist/threads/use-athena-sessions.cjs.map +1 -0
- package/dist/threads/use-athena-sessions.d.ts +81 -0
- package/dist/threads/use-athena-sessions.js +198 -0
- package/dist/threads/use-athena-sessions.js.map +1 -0
- package/dist/threads/use-rest-conversation-history.cjs +1 -1
- package/dist/threads/use-rest-conversation-history.js +1 -1
- package/dist/threads/use-statewire-conversation-history.cjs +1 -1
- package/dist/threads/use-statewire-conversation-history.d.ts +3 -0
- package/dist/threads/use-statewire-conversation-history.js +1 -1
- package/dist/threads/use-thread-read-state.cjs +73 -0
- package/dist/threads/use-thread-read-state.cjs.map +1 -0
- package/dist/threads/use-thread-read-state.d.ts +51 -0
- package/dist/threads/use-thread-read-state.js +73 -0
- package/dist/threads/use-thread-read-state.js.map +1 -0
- package/dist/tiptap-markdown-table/src/markdown-table-serializer.cjs.map +1 -0
- package/dist/tiptap-markdown-table/src/markdown-table-serializer.js.map +1 -0
- package/dist/tools/auto-open-tools.cjs +2 -0
- package/dist/tools/auto-open-tools.cjs.map +1 -1
- package/dist/tools/auto-open-tools.js +2 -0
- package/dist/tools/auto-open-tools.js.map +1 -1
- package/dist/tools/file-tool-uis.cjs +18 -43
- package/dist/tools/file-tool-uis.cjs.map +1 -1
- package/dist/tools/file-tool-uis.d.ts +1 -2
- package/dist/tools/file-tool-uis.js +18 -42
- package/dist/tools/file-tool-uis.js.map +1 -1
- package/dist/tools/index.cjs +6 -2
- package/dist/tools/index.cjs.map +1 -1
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.js +6 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/misc-tool-uis.cjs +2 -2
- package/dist/tools/misc-tool-uis.js +2 -2
- package/dist/tools/primitives.cjs +1 -1
- package/dist/tools/primitives.js +1 -1
- package/dist/tools/read-asset-tool-ui.cjs +21 -70
- package/dist/tools/read-asset-tool-ui.cjs.map +1 -1
- package/dist/tools/read-asset-tool-ui.js +21 -70
- package/dist/tools/read-asset-tool-ui.js.map +1 -1
- package/dist/tools/step-text.cjs +21 -0
- package/dist/tools/step-text.cjs.map +1 -0
- package/dist/tools/step-text.d.ts +10 -0
- package/dist/tools/step-text.js +21 -0
- package/dist/tools/step-text.js.map +1 -0
- package/dist/tools/tool-fallback.cjs +24 -5
- package/dist/tools/tool-fallback.cjs.map +1 -1
- package/dist/tools/tool-fallback.d.ts +3 -1
- package/dist/tools/tool-fallback.js +24 -5
- package/dist/tools/tool-fallback.js.map +1 -1
- package/dist/tools/tool-summary.cjs +661 -0
- package/dist/tools/tool-summary.cjs.map +1 -0
- package/dist/tools/tool-summary.d.ts +99 -0
- package/dist/tools/tool-summary.js +661 -0
- package/dist/tools/tool-summary.js.map +1 -0
- package/dist/tools/tool-uis.cjs +37 -95
- package/dist/tools/tool-uis.cjs.map +1 -1
- package/dist/tools/tool-uis.js +37 -95
- package/dist/tools/tool-uis.js.map +1 -1
- package/dist/tools/voice-update-tool-ui.cjs +1 -1
- package/dist/tools/voice-update-tool-ui.js +1 -1
- package/dist/tools/write-todos-tool-ui.cjs +3 -2
- package/dist/tools/write-todos-tool-ui.cjs.map +1 -1
- package/dist/tools/write-todos-tool-ui.d.ts +5 -0
- package/dist/tools/write-todos-tool-ui.js +5 -4
- package/dist/tools/write-todos-tool-ui.js.map +1 -1
- package/dist/ui/popover.cjs +6 -6
- package/dist/ui/popover.cjs.map +1 -1
- package/dist/ui/popover.js +6 -6
- package/dist/ui/popover.js.map +1 -1
- package/dist/ui/tooltip.cjs +16 -2
- package/dist/ui/tooltip.cjs.map +1 -1
- package/dist/ui/tooltip.d.ts +1 -1
- package/dist/ui/tooltip.js +16 -2
- package/dist/ui/tooltip.js.map +1 -1
- package/dist/version.cjs +1 -1
- package/dist/version.js +1 -1
- package/dist/voice/use-athena-voice-session.cjs.map +1 -1
- package/dist/voice/use-athena-voice-session.d.ts +3 -3
- package/dist/voice/use-athena-voice-session.js.map +1 -1
- package/dist/workbench/SessionWorkbench.cjs +378 -0
- package/dist/workbench/SessionWorkbench.cjs.map +1 -0
- package/dist/workbench/SessionWorkbench.d.ts +30 -0
- package/dist/workbench/SessionWorkbench.js +378 -0
- package/dist/workbench/SessionWorkbench.js.map +1 -0
- package/dist/workbench/session-workbench-context.cjs +26 -0
- package/dist/workbench/session-workbench-context.cjs.map +1 -0
- package/dist/workbench/session-workbench-context.d.ts +55 -0
- package/dist/workbench/session-workbench-context.js +26 -0
- package/dist/workbench/session-workbench-context.js.map +1 -0
- package/dist/workbench/session-workbench-model.cjs +288 -0
- package/dist/workbench/session-workbench-model.cjs.map +1 -0
- package/dist/workbench/session-workbench-model.d.ts +168 -0
- package/dist/workbench/session-workbench-model.js +288 -0
- package/dist/workbench/session-workbench-model.js.map +1 -0
- package/dist/workbench/session-workbench-panes.cjs +580 -0
- package/dist/workbench/session-workbench-panes.cjs.map +1 -0
- package/dist/workbench/session-workbench-panes.d.ts +16 -0
- package/dist/workbench/session-workbench-panes.js +580 -0
- package/dist/workbench/session-workbench-panes.js.map +1 -0
- package/dist/workbench/session-workspace-api.cjs +157 -0
- package/dist/workbench/session-workspace-api.cjs.map +1 -0
- package/dist/workbench/session-workspace-api.d.ts +70 -0
- package/dist/workbench/session-workspace-api.js +157 -0
- package/dist/workbench/session-workspace-api.js.map +1 -0
- package/dist/workbench/use-session-workspace.cjs +100 -0
- package/dist/workbench/use-session-workspace.cjs.map +1 -0
- package/dist/workbench/use-session-workspace.d.ts +45 -0
- package/dist/workbench/use-session-workspace.js +100 -0
- package/dist/workbench/use-session-workspace.js.map +1 -0
- package/dist/workbench/workbench-layout-context.cjs +10 -0
- package/dist/workbench/workbench-layout-context.cjs.map +1 -0
- package/dist/workbench/workbench-layout-context.d.ts +17 -0
- package/dist/workbench/workbench-layout-context.js +10 -0
- package/dist/workbench/workbench-layout-context.js.map +1 -0
- package/package.json +20 -9
- package/dist/node_modules/@assistant-ui/react-langchain/dist/converter.cjs +0 -77
- package/dist/node_modules/@assistant-ui/react-langchain/dist/converter.cjs.map +0 -1
- package/dist/node_modules/@assistant-ui/react-langchain/dist/converter.js +0 -77
- package/dist/node_modules/@assistant-ui/react-langchain/dist/converter.js.map +0 -1
- package/dist/node_modules/@assistant-ui/react-langgraph/dist/convertLangChainMessages.cjs +0 -181
- package/dist/node_modules/@assistant-ui/react-langgraph/dist/convertLangChainMessages.cjs.map +0 -1
- package/dist/node_modules/@assistant-ui/react-langgraph/dist/convertLangChainMessages.js +0 -181
- package/dist/node_modules/@assistant-ui/react-langgraph/dist/convertLangChainMessages.js.map +0 -1
- package/dist/packages/agent-runtime/src/asset-attachment.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/asset-attachment.js.map +0 -1
- package/dist/packages/agent-runtime/src/auth-denial.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/auth-denial.js.map +0 -1
- package/dist/packages/agent-runtime/src/client-tool-bridge.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/client-tool-bridge.js.map +0 -1
- package/dist/packages/agent-runtime/src/client-tools.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/client-tools.js.map +0 -1
- package/dist/packages/agent-runtime/src/conversation-index.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/conversation-index.js.map +0 -1
- package/dist/packages/agent-runtime/src/conversation-list.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/conversation-list.js.map +0 -1
- package/dist/packages/agent-runtime/src/deep-agent-transport-recipe.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/deep-agent-transport-recipe.js.map +0 -1
- package/dist/packages/agent-runtime/src/edit-command.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/edit-command.js.map +0 -1
- package/dist/packages/agent-runtime/src/errors.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/errors.js.map +0 -1
- package/dist/packages/agent-runtime/src/generated/runconfig-contract.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/generated/runconfig-contract.js.map +0 -1
- package/dist/packages/agent-runtime/src/github-wake-event.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/github-wake-event.js.map +0 -1
- package/dist/packages/agent-runtime/src/interrupts.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/interrupts.js.map +0 -1
- package/dist/packages/agent-runtime/src/message-author.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/message-author.js.map +0 -1
- package/dist/packages/agent-runtime/src/message-window.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/message-window.js.map +0 -1
- package/dist/packages/agent-runtime/src/messages.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/messages.js.map +0 -1
- package/dist/packages/agent-runtime/src/model-context.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/model-context.js.map +0 -1
- package/dist/packages/agent-runtime/src/optimistic-content.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/optimistic-content.js.map +0 -1
- package/dist/packages/agent-runtime/src/protocol.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/protocol.js.map +0 -1
- package/dist/packages/agent-runtime/src/queue.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/queue.js.map +0 -1
- package/dist/packages/agent-runtime/src/quota-safe-local-storage-session.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/quota-safe-local-storage-session.js.map +0 -1
- package/dist/packages/agent-runtime/src/runtime-messages.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/runtime-messages.js.map +0 -1
- package/dist/packages/agent-runtime/src/screen-point.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/screen-point.js.map +0 -1
- package/dist/packages/agent-runtime/src/send-recovery.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/send-recovery.js.map +0 -1
- package/dist/packages/agent-runtime/src/statewire-attach-observer.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/statewire-attach-observer.js.map +0 -1
- package/dist/packages/agent-runtime/src/statewire-state.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/statewire-state.js.map +0 -1
- package/dist/packages/agent-runtime/src/statewire-suspended.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/statewire-suspended.js.map +0 -1
- package/dist/packages/agent-runtime/src/statewire-transport.cjs +0 -11
- package/dist/packages/agent-runtime/src/statewire-transport.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/statewire-transport.js +0 -11
- package/dist/packages/agent-runtime/src/statewire-transport.js.map +0 -1
- package/dist/packages/agent-runtime/src/streaming-markdown.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/streaming-markdown.js.map +0 -1
- package/dist/packages/agent-runtime/src/thread-extras.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/thread-extras.js.map +0 -1
- package/dist/packages/agent-runtime/src/thread-snapshot-cache.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/thread-snapshot-cache.js.map +0 -1
- package/dist/packages/agent-runtime/src/thread-status.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/thread-status.js.map +0 -1
- package/dist/packages/agent-runtime/src/tool-metadata.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/tool-metadata.js.map +0 -1
- package/dist/packages/agent-runtime/src/tool-outputs.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/tool-outputs.js.map +0 -1
- package/dist/packages/agent-runtime/src/tool-result.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/tool-result.js.map +0 -1
- package/dist/packages/agent-runtime/src/use-conversation-list.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/use-conversation-list.js.map +0 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-config.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-config.js.map +0 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-edit-submit.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-edit-submit.js.map +0 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-runtime.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-runtime.js.map +0 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-thread.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-thread.js.map +0 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-window-sync.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/use-deep-agent-window-sync.js.map +0 -1
- package/dist/packages/agent-runtime/src/voice-presentation.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/voice-presentation.js.map +0 -1
- package/dist/packages/agent-runtime/src/voice-turn-grouping.cjs.map +0 -1
- package/dist/packages/agent-runtime/src/voice-turn-grouping.js.map +0 -1
- package/dist/packages/tiptap-markdown-table/src/markdown-table-serializer.cjs.map +0 -1
- package/dist/packages/tiptap-markdown-table/src/markdown-table-serializer.js.map +0 -1
- /package/dist/{packages/agent-runtime → agent-runtime}/src/asset-attachment.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/asset-attachment.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/auth-denial.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/auth-denial.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/client-tool-bridge.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/client-tool-bridge.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/client-tools.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/client-tools.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/conversation-index.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/conversation-index.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/edit-command.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/edit-command.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/github-wake-event.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/github-wake-event.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/message-author.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/message-author.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/message-window.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/message-window.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/model-context.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/model-context.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/optimistic-content.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/optimistic-content.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/protocol.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/protocol.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/runtime-messages.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/runtime-messages.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/screen-point.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/screen-point.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/send-recovery.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/send-recovery.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/statewire-attach-observer.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/statewire-attach-observer.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/streaming-markdown.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/streaming-markdown.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/thread-extras.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/thread-extras.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/thread-snapshot-cache.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/thread-snapshot-cache.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/thread-status.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/thread-status.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/tool-outputs.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/tool-outputs.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/tool-result.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/tool-result.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/use-deep-agent-config.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/use-deep-agent-config.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/use-deep-agent-runtime.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/use-deep-agent-runtime.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/use-deep-agent-window-sync.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/use-deep-agent-window-sync.js +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/voice-turn-grouping.cjs +0 -0
- /package/dist/{packages/agent-runtime → agent-runtime}/src/voice-turn-grouping.js +0 -0
- /package/dist/{packages/react → react}/package.json.cjs.map +0 -0
- /package/dist/{packages/react → react}/package.json.js.map +0 -0
- /package/dist/{packages/tiptap-markdown-table → tiptap-markdown-table}/src/markdown-table-serializer.cjs +0 -0
- /package/dist/{packages/tiptap-markdown-table → tiptap-markdown-table}/src/markdown-table-serializer.js +0 -0
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
const jsxRuntime = require("react/jsx-runtime");
|
|
4
4
|
const react = require("@assistant-ui/react");
|
|
5
5
|
const lucideReact = require("lucide-react");
|
|
6
|
-
const voicePresentation = require("../
|
|
6
|
+
const voicePresentation = require("../agent-runtime/src/voice-presentation.cjs");
|
|
7
7
|
const cnfast = require("cnfast");
|
|
8
8
|
const VoiceUpdateCard = ({
|
|
9
9
|
text,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
2
|
import { makeAssistantToolUI } from "@assistant-ui/react";
|
|
3
3
|
import { LoaderIcon, AudioLinesIcon, MessageSquareTextIcon } from "lucide-react";
|
|
4
|
-
import { VOICE_UPDATE_TOOL_NAME, describeVoiceUpdateToolCall, voiceUpdateStatusLabel } from "../
|
|
4
|
+
import { VOICE_UPDATE_TOOL_NAME, describeVoiceUpdateToolCall, voiceUpdateStatusLabel } from "../agent-runtime/src/voice-presentation.js";
|
|
5
5
|
import { cn } from "cnfast";
|
|
6
6
|
const VoiceUpdateCard = ({
|
|
7
7
|
text,
|
|
@@ -83,7 +83,7 @@ function parseTodoPlan({
|
|
|
83
83
|
changeDescription: asDescription(resultRecord == null ? void 0 : resultRecord.description) ?? asDescription(resultRecord == null ? void 0 : resultRecord.todoChangeDescription)
|
|
84
84
|
};
|
|
85
85
|
}
|
|
86
|
-
function
|
|
86
|
+
function PlanStepMarker({
|
|
87
87
|
status,
|
|
88
88
|
index
|
|
89
89
|
}) {
|
|
@@ -239,7 +239,7 @@ const WriteTodosToolUIImpl = ({
|
|
|
239
239
|
className: "absolute left-[calc(1rem+8px)] top-[26px] h-[calc(100%-18px)] w-px bg-border/60"
|
|
240
240
|
}
|
|
241
241
|
),
|
|
242
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "relative z-10 mt-[3px]", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
242
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "relative z-10 mt-[3px]", children: /* @__PURE__ */ jsxRuntime.jsx(PlanStepMarker, { status: step.status, index }) }),
|
|
243
243
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
244
244
|
"span",
|
|
245
245
|
{
|
|
@@ -265,6 +265,7 @@ const WriteTodosToolUI = react.memo(
|
|
|
265
265
|
);
|
|
266
266
|
WriteTodosToolUI.displayName = "WriteTodosToolUI";
|
|
267
267
|
exports.HiddenWriteTodosToolUI = HiddenWriteTodosToolUI;
|
|
268
|
+
exports.PlanStepMarker = PlanStepMarker;
|
|
268
269
|
exports.WriteTodosToolUI = WriteTodosToolUI;
|
|
269
270
|
exports.parseTodoPlan = parseTodoPlan;
|
|
270
271
|
//# sourceMappingURL=write-todos-tool-ui.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-todos-tool-ui.cjs","sources":["../../src/tools/write-todos-tool-ui.tsx"],"sourcesContent":["\"use client\";\n\nimport { memo, useEffect, useMemo, useState } from \"react\";\nimport type { ToolCallMessagePartComponent } from \"@assistant-ui/react\";\nimport {\n CheckIcon,\n ChevronDownIcon,\n ListChecksIcon,\n LoaderIcon,\n XIcon,\n} from \"lucide-react\";\nimport { cn } from \"../lib/utils\";\nimport {\n allocatePlanSeq,\n registerPlanCard,\n unregisterPlanCard,\n updatePlanCard,\n useIsLatestPlanCard,\n usePlanScope,\n} from \"./todo-plan-store\";\n\n// ─── Types ───────────────────────────────────────────────────────────\n\nexport type PlanStepStatus =\n | \"pending\"\n | \"in_progress\"\n | \"completed\"\n | \"cancelled\"\n | \"failed\";\n\nexport type PlanStep = {\n id?: string;\n content: string;\n status: PlanStepStatus;\n};\n\nexport type TodoPlan = {\n steps: PlanStep[];\n changeDescription?: string;\n};\n\nconst STEP_STATUSES: readonly PlanStepStatus[] = [\n \"pending\",\n \"in_progress\",\n \"completed\",\n \"cancelled\",\n \"failed\",\n];\n\n// ─── Parsing ─────────────────────────────────────────────────────────\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return typeof value === \"object\" && value !== null\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction asStatus(value: unknown): PlanStepStatus {\n return typeof value === \"string\" &&\n (STEP_STATUSES as readonly string[]).includes(value)\n ? (value as PlanStepStatus)\n : \"pending\";\n}\n\nfunction parseSteps(value: unknown): PlanStep[] {\n if (!Array.isArray(value)) return [];\n const steps: PlanStep[] = [];\n for (const raw of value) {\n const record = asRecord(raw);\n if (!record) continue;\n const content = record.content ?? record.task ?? record.title;\n if (typeof content !== \"string\" || content.trim() === \"\") continue;\n steps.push({\n id: typeof record.id === \"string\" ? record.id : undefined,\n content: content.trim(),\n status: asStatus(record.status),\n });\n }\n return steps;\n}\n\nfunction asDescription(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() !== \"\"\n ? value.trim()\n : undefined;\n}\n\nfunction parsePartialSteps(argsText: string | undefined): PlanStep[] {\n if (!argsText) return [];\n const steps: PlanStep[] = [];\n const objectPattern = /\\{(?:[^{}\\\\\"]|\"(?:[^\"\\\\]|\\\\.)*\")*\\}?/g;\n for (const [chunk] of argsText.matchAll(objectPattern)) {\n const contentMatch = /\"(?:content|task|title)\"\\s*:\\s*\"((?:[^\"\\\\]|\\\\.)*)\"/.exec(\n chunk,\n );\n if (!contentMatch) continue;\n let content: string;\n try {\n content = JSON.parse(`\"${contentMatch[1]}\"`) as string;\n } catch {\n content = contentMatch[1];\n }\n if (content.trim() === \"\") continue;\n const statusMatch = /\"status\"\\s*:\\s*\"([a-z_]+)\"/.exec(chunk);\n steps.push({\n content: content.trim(),\n status: asStatus(statusMatch?.[1]),\n });\n }\n return steps;\n}\n\nexport function parseTodoPlan({\n args,\n argsText,\n result,\n}: {\n args?: unknown;\n argsText?: string;\n result?: unknown;\n}): TodoPlan {\n const argsRecord = asRecord(args);\n const argSteps = parseSteps(argsRecord?.todos);\n\n let resultRecord = asRecord(result);\n if (!resultRecord && typeof result === \"string\") {\n try {\n resultRecord = asRecord(JSON.parse(result));\n } catch {\n resultRecord = null;\n }\n }\n\n const hasResultTodos = Array.isArray(resultRecord?.todos);\n const steps = hasResultTodos\n ? parseSteps(resultRecord?.todos)\n : argSteps.length > 0\n ? argSteps\n : parsePartialSteps(argsText);\n\n return {\n steps,\n changeDescription:\n asDescription(resultRecord?.description) ??\n asDescription(resultRecord?.todoChangeDescription),\n };\n}\n\n// ─── Presentation ────────────────────────────────────────────────────\n\nfunction StepMarker({\n status,\n index,\n}: {\n status: PlanStepStatus;\n index: number;\n}) {\n if (status === \"completed\") {\n return (\n <span className=\"flex size-[18px] shrink-0 items-center justify-center rounded-full bg-emerald-500 text-white\">\n <CheckIcon className=\"size-3\" strokeWidth={3} />\n </span>\n );\n }\n if (status === \"in_progress\") {\n return (\n <span className=\"flex size-[18px] shrink-0 items-center justify-center rounded-full bg-primary/10 text-primary\">\n <LoaderIcon className=\"size-3 animate-spin\" strokeWidth={3} />\n </span>\n );\n }\n if (status === \"failed\") {\n return (\n <span className=\"flex size-[18px] shrink-0 items-center justify-center rounded-full bg-destructive/10 text-destructive\">\n <XIcon className=\"size-3\" strokeWidth={3} />\n </span>\n );\n }\n if (status === \"cancelled\") {\n return (\n <span className=\"flex size-[18px] shrink-0 items-center justify-center rounded-full border border-border text-muted-foreground\">\n <XIcon className=\"size-3\" strokeWidth={3} />\n </span>\n );\n }\n return (\n <span className=\"flex size-[18px] shrink-0 items-center justify-center rounded-full border border-dashed border-border text-[9px] font-medium text-muted-foreground\">\n {index + 1}\n </span>\n );\n}\n\nfunction PlanBadge({\n resolved,\n total,\n}: {\n resolved: number;\n total: number;\n}) {\n const isDone = total > 0 && resolved === total;\n\n return (\n <span\n className={cn(\n \"flex size-8 shrink-0 items-center justify-center rounded-lg\",\n isDone && \"bg-emerald-50 text-emerald-600\",\n !isDone && \"bg-primary/10 text-primary\",\n )}\n >\n {isDone ? (\n <CheckIcon className=\"size-4\" strokeWidth={3} />\n ) : (\n <ListChecksIcon className=\"size-4\" />\n )}\n </span>\n );\n}\n\n/**\n * Register this card in its chat's plan registry and report whether it is the\n * newest mounted one. Shared by the visible card (which hides superseded\n * instances) and {@link HiddenWriteTodosToolUI} (which renders nothing but\n * keeps the registry — and so `useLatestTodoPlan` — fed).\n */\nfunction usePlanCardRegistration(plan: TodoPlan, isWriting: boolean): boolean {\n const scope = usePlanScope();\n const [seq] = useState(allocatePlanSeq);\n useEffect(() => {\n registerPlanCard(scope, seq, plan, isWriting);\n return () => unregisterPlanCard(scope, seq);\n // Registration is keyed to this instance's lifetime (and its chat's\n // scope); content updates ride the effect below.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [scope, seq]);\n useEffect(() => {\n updatePlanCard(scope, seq, plan, isWriting);\n }, [scope, seq, plan, isWriting]);\n return useIsLatestPlanCard(scope, seq);\n}\n\n/**\n * Inline-invisible `write_todos` for hosts that pin the plan elsewhere:\n * feeds the plan registry exactly like the visible card, renders nothing.\n * Register it via `toolUIs={{ write_todos: HiddenWriteTodosToolUI }}` and\n * read the plan with `useLatestTodoPlan()` — a bare `() => null` override\n * would leave the registry (and the hook) permanently empty.\n */\nconst HiddenWriteTodosToolUIImpl: ToolCallMessagePartComponent = ({\n args,\n argsText,\n result,\n status,\n}) => {\n const plan = useMemo(\n () => parseTodoPlan({ args, argsText, result }),\n [args, argsText, result],\n );\n usePlanCardRegistration(plan, status?.type === \"running\");\n return null;\n};\n\nexport const HiddenWriteTodosToolUI = memo(\n HiddenWriteTodosToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nHiddenWriteTodosToolUI.displayName = \"HiddenWriteTodosToolUI\";\n\nconst WriteTodosToolUIImpl: ToolCallMessagePartComponent = ({\n args,\n argsText,\n result,\n status,\n}) => {\n const plan = useMemo(\n () => parseTodoPlan({ args, argsText, result }),\n [args, argsText, result],\n );\n const { steps, changeDescription } = plan;\n const [collapsed, setCollapsed] = useState(false);\n\n // Newest-plan dedupe: a run updates its plan by calling write_todos again,\n // so a conversation stacks cards that all describe the same plan. Only the\n // newest mounted card in this chat's scope renders (see todo-plan-store.ts).\n const isWriting = status?.type === \"running\";\n const isLatest = usePlanCardRegistration(plan, isWriting);\n if (!isLatest) return null;\n\n const completed = steps.filter((s) => s.status === \"completed\").length;\n const stopped = steps.filter(\n (s) => s.status === \"cancelled\" || s.status === \"failed\",\n ).length;\n const current = steps.find((s) => s.status === \"in_progress\");\n const total = steps.length;\n const resolved = completed + stopped;\n const isDone = total > 0 && resolved === total;\n\n if (total === 0) {\n return isWriting ? (\n <div className=\"my-3 flex w-full items-center gap-2 rounded-xl border border-border/60 bg-background px-4 py-3 shadow-sm\">\n <LoaderIcon className=\"size-3.5 animate-spin text-primary\" />\n <span className=\"text-[13px] font-medium text-foreground\">\n Planning...\n </span>\n </div>\n ) : null;\n }\n\n const heading = isWriting\n ? \"Updating plan\"\n : isDone\n ? \"Plan complete\"\n : completed === 0 && !current\n ? \"Plan\"\n : \"Plan in progress\";\n\n const subtitle =\n changeDescription ?? (current ? current.content : undefined);\n\n return (\n <div className=\"my-3 w-full rounded-xl border border-border/60 bg-background shadow-sm\">\n <div className=\"sticky top-0 z-20 overflow-hidden rounded-t-xl bg-background\">\n <button\n type=\"button\"\n onClick={() => setCollapsed((prev) => !prev)}\n className=\"flex w-full items-center gap-3 px-4 py-3 text-left transition-colors hover:bg-muted/30\"\n aria-expanded={!collapsed}\n >\n <PlanBadge resolved={resolved} total={total} />\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex items-baseline gap-2\">\n <span className=\"text-[13px] font-medium text-foreground\">\n {heading}\n </span>\n <span className=\"text-[11px] tabular-nums text-muted-foreground\">\n {resolved}/{total} steps\n </span>\n </span>\n {subtitle && (\n <span className=\"block truncate text-[12px] text-muted-foreground\">\n {subtitle}\n </span>\n )}\n </span>\n <ChevronDownIcon\n className={cn(\n \"size-4 shrink-0 text-muted-foreground transition-transform duration-200\",\n collapsed && \"-rotate-90\",\n )}\n />\n </button>\n\n <div className=\"h-0.5 w-full bg-muted\">\n <div\n className={cn(\n \"h-full transition-all duration-500\",\n isDone ? \"bg-emerald-500\" : \"bg-primary\",\n )}\n style={{ width: `${total > 0 ? (resolved / total) * 100 : 0}%` }}\n />\n </div>\n </div>\n\n {!collapsed && (\n <ol className=\"flex max-h-72 flex-col overflow-y-auto rounded-b-xl border-t border-border/40 py-1\">\n {steps.map((step, index) => (\n <li\n key={step.id ?? `${index}-${step.content}`}\n className={cn(\n \"relative flex items-start gap-2.5 px-4 py-1.5\",\n step.status === \"in_progress\" && \"bg-primary/5\",\n )}\n >\n {index < steps.length - 1 && (\n <span\n aria-hidden\n className=\"absolute left-[calc(1rem+8px)] top-[26px] h-[calc(100%-18px)] w-px bg-border/60\"\n />\n )}\n <span className=\"relative z-10 mt-[3px]\">\n <StepMarker status={step.status} index={index} />\n </span>\n <span\n className={cn(\n \"text-[12.5px] leading-relaxed text-foreground\",\n step.status === \"completed\" &&\n \"text-muted-foreground line-through decoration-muted-foreground/40\",\n step.status === \"cancelled\" &&\n \"text-muted-foreground/70 line-through decoration-muted-foreground/40\",\n step.status === \"failed\" && \"text-destructive\",\n step.status === \"in_progress\" && \"font-medium text-primary\",\n step.status === \"pending\" && \"text-muted-foreground\",\n )}\n >\n {step.content}\n </span>\n </li>\n ))}\n </ol>\n )}\n </div>\n );\n};\n\nexport const WriteTodosToolUI = memo(\n WriteTodosToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nWriteTodosToolUI.displayName = \"WriteTodosToolUI\";\n"],"names":["jsx","CheckIcon","LoaderIcon","XIcon","cn","ListChecksIcon","usePlanScope","useState","allocatePlanSeq","useEffect","registerPlanCard","unregisterPlanCard","updatePlanCard","useIsLatestPlanCard","useMemo","memo","jsxs","ChevronDownIcon"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"write-todos-tool-ui.cjs","sources":["../../src/tools/write-todos-tool-ui.tsx"],"sourcesContent":["\"use client\";\n\nimport { memo, useEffect, useMemo, useState } from \"react\";\nimport type { ToolCallMessagePartComponent } from \"@assistant-ui/react\";\nimport {\n CheckIcon,\n ChevronDownIcon,\n ListChecksIcon,\n LoaderIcon,\n XIcon,\n} from \"lucide-react\";\nimport { cn } from \"../lib/utils\";\nimport {\n allocatePlanSeq,\n registerPlanCard,\n unregisterPlanCard,\n updatePlanCard,\n useIsLatestPlanCard,\n usePlanScope,\n} from \"./todo-plan-store\";\n\n// ─── Types ───────────────────────────────────────────────────────────\n\nexport type PlanStepStatus =\n | \"pending\"\n | \"in_progress\"\n | \"completed\"\n | \"cancelled\"\n | \"failed\";\n\nexport type PlanStep = {\n id?: string;\n content: string;\n status: PlanStepStatus;\n};\n\nexport type TodoPlan = {\n steps: PlanStep[];\n changeDescription?: string;\n};\n\nconst STEP_STATUSES: readonly PlanStepStatus[] = [\n \"pending\",\n \"in_progress\",\n \"completed\",\n \"cancelled\",\n \"failed\",\n];\n\n// ─── Parsing ─────────────────────────────────────────────────────────\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return typeof value === \"object\" && value !== null\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction asStatus(value: unknown): PlanStepStatus {\n return typeof value === \"string\" &&\n (STEP_STATUSES as readonly string[]).includes(value)\n ? (value as PlanStepStatus)\n : \"pending\";\n}\n\nfunction parseSteps(value: unknown): PlanStep[] {\n if (!Array.isArray(value)) return [];\n const steps: PlanStep[] = [];\n for (const raw of value) {\n const record = asRecord(raw);\n if (!record) continue;\n const content = record.content ?? record.task ?? record.title;\n if (typeof content !== \"string\" || content.trim() === \"\") continue;\n steps.push({\n id: typeof record.id === \"string\" ? record.id : undefined,\n content: content.trim(),\n status: asStatus(record.status),\n });\n }\n return steps;\n}\n\nfunction asDescription(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() !== \"\"\n ? value.trim()\n : undefined;\n}\n\nfunction parsePartialSteps(argsText: string | undefined): PlanStep[] {\n if (!argsText) return [];\n const steps: PlanStep[] = [];\n const objectPattern = /\\{(?:[^{}\\\\\"]|\"(?:[^\"\\\\]|\\\\.)*\")*\\}?/g;\n for (const [chunk] of argsText.matchAll(objectPattern)) {\n const contentMatch = /\"(?:content|task|title)\"\\s*:\\s*\"((?:[^\"\\\\]|\\\\.)*)\"/.exec(\n chunk,\n );\n if (!contentMatch) continue;\n let content: string;\n try {\n content = JSON.parse(`\"${contentMatch[1]}\"`) as string;\n } catch {\n content = contentMatch[1];\n }\n if (content.trim() === \"\") continue;\n const statusMatch = /\"status\"\\s*:\\s*\"([a-z_]+)\"/.exec(chunk);\n steps.push({\n content: content.trim(),\n status: asStatus(statusMatch?.[1]),\n });\n }\n return steps;\n}\n\nexport function parseTodoPlan({\n args,\n argsText,\n result,\n}: {\n args?: unknown;\n argsText?: string;\n result?: unknown;\n}): TodoPlan {\n const argsRecord = asRecord(args);\n const argSteps = parseSteps(argsRecord?.todos);\n\n let resultRecord = asRecord(result);\n if (!resultRecord && typeof result === \"string\") {\n try {\n resultRecord = asRecord(JSON.parse(result));\n } catch {\n resultRecord = null;\n }\n }\n\n const hasResultTodos = Array.isArray(resultRecord?.todos);\n const steps = hasResultTodos\n ? parseSteps(resultRecord?.todos)\n : argSteps.length > 0\n ? argSteps\n : parsePartialSteps(argsText);\n\n return {\n steps,\n changeDescription:\n asDescription(resultRecord?.description) ??\n asDescription(resultRecord?.todoChangeDescription),\n };\n}\n\n// ─── Presentation ────────────────────────────────────────────────────\n\n/** A plan step's status glyph (its number while pending) — shared with the workbench's Tasks pane. */\nexport function PlanStepMarker({\n status,\n index,\n}: {\n status: PlanStepStatus;\n index: number;\n}) {\n if (status === \"completed\") {\n return (\n <span className=\"flex size-[18px] shrink-0 items-center justify-center rounded-full bg-emerald-500 text-white\">\n <CheckIcon className=\"size-3\" strokeWidth={3} />\n </span>\n );\n }\n if (status === \"in_progress\") {\n return (\n <span className=\"flex size-[18px] shrink-0 items-center justify-center rounded-full bg-primary/10 text-primary\">\n <LoaderIcon className=\"size-3 animate-spin\" strokeWidth={3} />\n </span>\n );\n }\n if (status === \"failed\") {\n return (\n <span className=\"flex size-[18px] shrink-0 items-center justify-center rounded-full bg-destructive/10 text-destructive\">\n <XIcon className=\"size-3\" strokeWidth={3} />\n </span>\n );\n }\n if (status === \"cancelled\") {\n return (\n <span className=\"flex size-[18px] shrink-0 items-center justify-center rounded-full border border-border text-muted-foreground\">\n <XIcon className=\"size-3\" strokeWidth={3} />\n </span>\n );\n }\n return (\n <span className=\"flex size-[18px] shrink-0 items-center justify-center rounded-full border border-dashed border-border text-[9px] font-medium text-muted-foreground\">\n {index + 1}\n </span>\n );\n}\n\nfunction PlanBadge({\n resolved,\n total,\n}: {\n resolved: number;\n total: number;\n}) {\n const isDone = total > 0 && resolved === total;\n\n return (\n <span\n className={cn(\n \"flex size-8 shrink-0 items-center justify-center rounded-lg\",\n isDone && \"bg-emerald-50 text-emerald-600\",\n !isDone && \"bg-primary/10 text-primary\",\n )}\n >\n {isDone ? (\n <CheckIcon className=\"size-4\" strokeWidth={3} />\n ) : (\n <ListChecksIcon className=\"size-4\" />\n )}\n </span>\n );\n}\n\n/**\n * Register this card in its chat's plan registry and report whether it is the\n * newest mounted one. Shared by the visible card (which hides superseded\n * instances) and {@link HiddenWriteTodosToolUI} (which renders nothing but\n * keeps the registry — and so `useLatestTodoPlan` — fed).\n */\nfunction usePlanCardRegistration(plan: TodoPlan, isWriting: boolean): boolean {\n const scope = usePlanScope();\n const [seq] = useState(allocatePlanSeq);\n useEffect(() => {\n registerPlanCard(scope, seq, plan, isWriting);\n return () => unregisterPlanCard(scope, seq);\n // Registration is keyed to this instance's lifetime (and its chat's\n // scope); content updates ride the effect below.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [scope, seq]);\n useEffect(() => {\n updatePlanCard(scope, seq, plan, isWriting);\n }, [scope, seq, plan, isWriting]);\n return useIsLatestPlanCard(scope, seq);\n}\n\n/**\n * Inline-invisible `write_todos` for hosts that pin the plan elsewhere:\n * feeds the plan registry exactly like the visible card, renders nothing.\n * Register it via `toolUIs={{ write_todos: HiddenWriteTodosToolUI }}` and\n * read the plan with `useLatestTodoPlan()` — a bare `() => null` override\n * would leave the registry (and the hook) permanently empty.\n */\nconst HiddenWriteTodosToolUIImpl: ToolCallMessagePartComponent = ({\n args,\n argsText,\n result,\n status,\n}) => {\n const plan = useMemo(\n () => parseTodoPlan({ args, argsText, result }),\n [args, argsText, result],\n );\n usePlanCardRegistration(plan, status?.type === \"running\");\n return null;\n};\n\nexport const HiddenWriteTodosToolUI = memo(\n HiddenWriteTodosToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nHiddenWriteTodosToolUI.displayName = \"HiddenWriteTodosToolUI\";\n\nconst WriteTodosToolUIImpl: ToolCallMessagePartComponent = ({\n args,\n argsText,\n result,\n status,\n}) => {\n const plan = useMemo(\n () => parseTodoPlan({ args, argsText, result }),\n [args, argsText, result],\n );\n const { steps, changeDescription } = plan;\n const [collapsed, setCollapsed] = useState(false);\n\n // Newest-plan dedupe: a run updates its plan by calling write_todos again,\n // so a conversation stacks cards that all describe the same plan. Only the\n // newest mounted card in this chat's scope renders (see todo-plan-store.ts).\n const isWriting = status?.type === \"running\";\n const isLatest = usePlanCardRegistration(plan, isWriting);\n if (!isLatest) return null;\n\n const completed = steps.filter((s) => s.status === \"completed\").length;\n const stopped = steps.filter(\n (s) => s.status === \"cancelled\" || s.status === \"failed\",\n ).length;\n const current = steps.find((s) => s.status === \"in_progress\");\n const total = steps.length;\n const resolved = completed + stopped;\n const isDone = total > 0 && resolved === total;\n\n if (total === 0) {\n return isWriting ? (\n <div className=\"my-3 flex w-full items-center gap-2 rounded-xl border border-border/60 bg-background px-4 py-3 shadow-sm\">\n <LoaderIcon className=\"size-3.5 animate-spin text-primary\" />\n <span className=\"text-[13px] font-medium text-foreground\">\n Planning...\n </span>\n </div>\n ) : null;\n }\n\n const heading = isWriting\n ? \"Updating plan\"\n : isDone\n ? \"Plan complete\"\n : completed === 0 && !current\n ? \"Plan\"\n : \"Plan in progress\";\n\n const subtitle =\n changeDescription ?? (current ? current.content : undefined);\n\n return (\n <div className=\"my-3 w-full rounded-xl border border-border/60 bg-background shadow-sm\">\n <div className=\"sticky top-0 z-20 overflow-hidden rounded-t-xl bg-background\">\n <button\n type=\"button\"\n onClick={() => setCollapsed((prev) => !prev)}\n className=\"flex w-full items-center gap-3 px-4 py-3 text-left transition-colors hover:bg-muted/30\"\n aria-expanded={!collapsed}\n >\n <PlanBadge resolved={resolved} total={total} />\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex items-baseline gap-2\">\n <span className=\"text-[13px] font-medium text-foreground\">\n {heading}\n </span>\n <span className=\"text-[11px] tabular-nums text-muted-foreground\">\n {resolved}/{total} steps\n </span>\n </span>\n {subtitle && (\n <span className=\"block truncate text-[12px] text-muted-foreground\">\n {subtitle}\n </span>\n )}\n </span>\n <ChevronDownIcon\n className={cn(\n \"size-4 shrink-0 text-muted-foreground transition-transform duration-200\",\n collapsed && \"-rotate-90\",\n )}\n />\n </button>\n\n <div className=\"h-0.5 w-full bg-muted\">\n <div\n className={cn(\n \"h-full transition-all duration-500\",\n isDone ? \"bg-emerald-500\" : \"bg-primary\",\n )}\n style={{ width: `${total > 0 ? (resolved / total) * 100 : 0}%` }}\n />\n </div>\n </div>\n\n {!collapsed && (\n <ol className=\"flex max-h-72 flex-col overflow-y-auto rounded-b-xl border-t border-border/40 py-1\">\n {steps.map((step, index) => (\n <li\n key={step.id ?? `${index}-${step.content}`}\n className={cn(\n \"relative flex items-start gap-2.5 px-4 py-1.5\",\n step.status === \"in_progress\" && \"bg-primary/5\",\n )}\n >\n {index < steps.length - 1 && (\n <span\n aria-hidden\n className=\"absolute left-[calc(1rem+8px)] top-[26px] h-[calc(100%-18px)] w-px bg-border/60\"\n />\n )}\n <span className=\"relative z-10 mt-[3px]\">\n <PlanStepMarker status={step.status} index={index} />\n </span>\n <span\n className={cn(\n \"text-[12.5px] leading-relaxed text-foreground\",\n step.status === \"completed\" &&\n \"text-muted-foreground line-through decoration-muted-foreground/40\",\n step.status === \"cancelled\" &&\n \"text-muted-foreground/70 line-through decoration-muted-foreground/40\",\n step.status === \"failed\" && \"text-destructive\",\n step.status === \"in_progress\" && \"font-medium text-primary\",\n step.status === \"pending\" && \"text-muted-foreground\",\n )}\n >\n {step.content}\n </span>\n </li>\n ))}\n </ol>\n )}\n </div>\n );\n};\n\nexport const WriteTodosToolUI = memo(\n WriteTodosToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nWriteTodosToolUI.displayName = \"WriteTodosToolUI\";\n"],"names":["jsx","CheckIcon","LoaderIcon","XIcon","cn","ListChecksIcon","usePlanScope","useState","allocatePlanSeq","useEffect","registerPlanCard","unregisterPlanCard","updatePlanCard","useIsLatestPlanCard","useMemo","memo","jsxs","ChevronDownIcon"],"mappings":"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"}
|
|
@@ -14,5 +14,10 @@ export declare function parseTodoPlan({ args, argsText, result, }: {
|
|
|
14
14
|
argsText?: string;
|
|
15
15
|
result?: unknown;
|
|
16
16
|
}): TodoPlan;
|
|
17
|
+
/** A plan step's status glyph (its number while pending) — shared with the workbench's Tasks pane. */
|
|
18
|
+
export declare function PlanStepMarker({ status, index, }: {
|
|
19
|
+
status: PlanStepStatus;
|
|
20
|
+
index: number;
|
|
21
|
+
}): import("react").JSX.Element;
|
|
17
22
|
export declare const HiddenWriteTodosToolUI: ToolCallMessagePartComponent;
|
|
18
23
|
export declare const WriteTodosToolUI: ToolCallMessagePartComponent;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { memo, useMemo, useState, useEffect } from "react";
|
|
3
|
-
import { LoaderIcon,
|
|
3
|
+
import { CheckIcon, LoaderIcon, XIcon, ChevronDownIcon, ListChecksIcon } from "lucide-react";
|
|
4
4
|
import { usePlanScope, allocatePlanSeq, registerPlanCard, unregisterPlanCard, updatePlanCard, useIsLatestPlanCard } from "./todo-plan-store.js";
|
|
5
5
|
import { cn } from "cnfast";
|
|
6
6
|
const STEP_STATUSES = [
|
|
@@ -81,7 +81,7 @@ function parseTodoPlan({
|
|
|
81
81
|
changeDescription: asDescription(resultRecord == null ? void 0 : resultRecord.description) ?? asDescription(resultRecord == null ? void 0 : resultRecord.todoChangeDescription)
|
|
82
82
|
};
|
|
83
83
|
}
|
|
84
|
-
function
|
|
84
|
+
function PlanStepMarker({
|
|
85
85
|
status,
|
|
86
86
|
index
|
|
87
87
|
}) {
|
|
@@ -237,7 +237,7 @@ const WriteTodosToolUIImpl = ({
|
|
|
237
237
|
className: "absolute left-[calc(1rem+8px)] top-[26px] h-[calc(100%-18px)] w-px bg-border/60"
|
|
238
238
|
}
|
|
239
239
|
),
|
|
240
|
-
/* @__PURE__ */ jsx("span", { className: "relative z-10 mt-[3px]", children: /* @__PURE__ */ jsx(
|
|
240
|
+
/* @__PURE__ */ jsx("span", { className: "relative z-10 mt-[3px]", children: /* @__PURE__ */ jsx(PlanStepMarker, { status: step.status, index }) }),
|
|
241
241
|
/* @__PURE__ */ jsx(
|
|
242
242
|
"span",
|
|
243
243
|
{
|
|
@@ -264,6 +264,7 @@ const WriteTodosToolUI = memo(
|
|
|
264
264
|
WriteTodosToolUI.displayName = "WriteTodosToolUI";
|
|
265
265
|
export {
|
|
266
266
|
HiddenWriteTodosToolUI,
|
|
267
|
+
PlanStepMarker,
|
|
267
268
|
WriteTodosToolUI,
|
|
268
269
|
parseTodoPlan
|
|
269
270
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-todos-tool-ui.js","sources":["../../src/tools/write-todos-tool-ui.tsx"],"sourcesContent":["\"use client\";\n\nimport { memo, useEffect, useMemo, useState } from \"react\";\nimport type { ToolCallMessagePartComponent } from \"@assistant-ui/react\";\nimport {\n CheckIcon,\n ChevronDownIcon,\n ListChecksIcon,\n LoaderIcon,\n XIcon,\n} from \"lucide-react\";\nimport { cn } from \"../lib/utils\";\nimport {\n allocatePlanSeq,\n registerPlanCard,\n unregisterPlanCard,\n updatePlanCard,\n useIsLatestPlanCard,\n usePlanScope,\n} from \"./todo-plan-store\";\n\n// ─── Types ───────────────────────────────────────────────────────────\n\nexport type PlanStepStatus =\n | \"pending\"\n | \"in_progress\"\n | \"completed\"\n | \"cancelled\"\n | \"failed\";\n\nexport type PlanStep = {\n id?: string;\n content: string;\n status: PlanStepStatus;\n};\n\nexport type TodoPlan = {\n steps: PlanStep[];\n changeDescription?: string;\n};\n\nconst STEP_STATUSES: readonly PlanStepStatus[] = [\n \"pending\",\n \"in_progress\",\n \"completed\",\n \"cancelled\",\n \"failed\",\n];\n\n// ─── Parsing ─────────────────────────────────────────────────────────\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return typeof value === \"object\" && value !== null\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction asStatus(value: unknown): PlanStepStatus {\n return typeof value === \"string\" &&\n (STEP_STATUSES as readonly string[]).includes(value)\n ? (value as PlanStepStatus)\n : \"pending\";\n}\n\nfunction parseSteps(value: unknown): PlanStep[] {\n if (!Array.isArray(value)) return [];\n const steps: PlanStep[] = [];\n for (const raw of value) {\n const record = asRecord(raw);\n if (!record) continue;\n const content = record.content ?? record.task ?? record.title;\n if (typeof content !== \"string\" || content.trim() === \"\") continue;\n steps.push({\n id: typeof record.id === \"string\" ? record.id : undefined,\n content: content.trim(),\n status: asStatus(record.status),\n });\n }\n return steps;\n}\n\nfunction asDescription(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() !== \"\"\n ? value.trim()\n : undefined;\n}\n\nfunction parsePartialSteps(argsText: string | undefined): PlanStep[] {\n if (!argsText) return [];\n const steps: PlanStep[] = [];\n const objectPattern = /\\{(?:[^{}\\\\\"]|\"(?:[^\"\\\\]|\\\\.)*\")*\\}?/g;\n for (const [chunk] of argsText.matchAll(objectPattern)) {\n const contentMatch = /\"(?:content|task|title)\"\\s*:\\s*\"((?:[^\"\\\\]|\\\\.)*)\"/.exec(\n chunk,\n );\n if (!contentMatch) continue;\n let content: string;\n try {\n content = JSON.parse(`\"${contentMatch[1]}\"`) as string;\n } catch {\n content = contentMatch[1];\n }\n if (content.trim() === \"\") continue;\n const statusMatch = /\"status\"\\s*:\\s*\"([a-z_]+)\"/.exec(chunk);\n steps.push({\n content: content.trim(),\n status: asStatus(statusMatch?.[1]),\n });\n }\n return steps;\n}\n\nexport function parseTodoPlan({\n args,\n argsText,\n result,\n}: {\n args?: unknown;\n argsText?: string;\n result?: unknown;\n}): TodoPlan {\n const argsRecord = asRecord(args);\n const argSteps = parseSteps(argsRecord?.todos);\n\n let resultRecord = asRecord(result);\n if (!resultRecord && typeof result === \"string\") {\n try {\n resultRecord = asRecord(JSON.parse(result));\n } catch {\n resultRecord = null;\n }\n }\n\n const hasResultTodos = Array.isArray(resultRecord?.todos);\n const steps = hasResultTodos\n ? parseSteps(resultRecord?.todos)\n : argSteps.length > 0\n ? argSteps\n : parsePartialSteps(argsText);\n\n return {\n steps,\n changeDescription:\n asDescription(resultRecord?.description) ??\n asDescription(resultRecord?.todoChangeDescription),\n };\n}\n\n// ─── Presentation ────────────────────────────────────────────────────\n\nfunction StepMarker({\n status,\n index,\n}: {\n status: PlanStepStatus;\n index: number;\n}) {\n if (status === \"completed\") {\n return (\n <span className=\"flex size-[18px] shrink-0 items-center justify-center rounded-full bg-emerald-500 text-white\">\n <CheckIcon className=\"size-3\" strokeWidth={3} />\n </span>\n );\n }\n if (status === \"in_progress\") {\n return (\n <span className=\"flex size-[18px] shrink-0 items-center justify-center rounded-full bg-primary/10 text-primary\">\n <LoaderIcon className=\"size-3 animate-spin\" strokeWidth={3} />\n </span>\n );\n }\n if (status === \"failed\") {\n return (\n <span className=\"flex size-[18px] shrink-0 items-center justify-center rounded-full bg-destructive/10 text-destructive\">\n <XIcon className=\"size-3\" strokeWidth={3} />\n </span>\n );\n }\n if (status === \"cancelled\") {\n return (\n <span className=\"flex size-[18px] shrink-0 items-center justify-center rounded-full border border-border text-muted-foreground\">\n <XIcon className=\"size-3\" strokeWidth={3} />\n </span>\n );\n }\n return (\n <span className=\"flex size-[18px] shrink-0 items-center justify-center rounded-full border border-dashed border-border text-[9px] font-medium text-muted-foreground\">\n {index + 1}\n </span>\n );\n}\n\nfunction PlanBadge({\n resolved,\n total,\n}: {\n resolved: number;\n total: number;\n}) {\n const isDone = total > 0 && resolved === total;\n\n return (\n <span\n className={cn(\n \"flex size-8 shrink-0 items-center justify-center rounded-lg\",\n isDone && \"bg-emerald-50 text-emerald-600\",\n !isDone && \"bg-primary/10 text-primary\",\n )}\n >\n {isDone ? (\n <CheckIcon className=\"size-4\" strokeWidth={3} />\n ) : (\n <ListChecksIcon className=\"size-4\" />\n )}\n </span>\n );\n}\n\n/**\n * Register this card in its chat's plan registry and report whether it is the\n * newest mounted one. Shared by the visible card (which hides superseded\n * instances) and {@link HiddenWriteTodosToolUI} (which renders nothing but\n * keeps the registry — and so `useLatestTodoPlan` — fed).\n */\nfunction usePlanCardRegistration(plan: TodoPlan, isWriting: boolean): boolean {\n const scope = usePlanScope();\n const [seq] = useState(allocatePlanSeq);\n useEffect(() => {\n registerPlanCard(scope, seq, plan, isWriting);\n return () => unregisterPlanCard(scope, seq);\n // Registration is keyed to this instance's lifetime (and its chat's\n // scope); content updates ride the effect below.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [scope, seq]);\n useEffect(() => {\n updatePlanCard(scope, seq, plan, isWriting);\n }, [scope, seq, plan, isWriting]);\n return useIsLatestPlanCard(scope, seq);\n}\n\n/**\n * Inline-invisible `write_todos` for hosts that pin the plan elsewhere:\n * feeds the plan registry exactly like the visible card, renders nothing.\n * Register it via `toolUIs={{ write_todos: HiddenWriteTodosToolUI }}` and\n * read the plan with `useLatestTodoPlan()` — a bare `() => null` override\n * would leave the registry (and the hook) permanently empty.\n */\nconst HiddenWriteTodosToolUIImpl: ToolCallMessagePartComponent = ({\n args,\n argsText,\n result,\n status,\n}) => {\n const plan = useMemo(\n () => parseTodoPlan({ args, argsText, result }),\n [args, argsText, result],\n );\n usePlanCardRegistration(plan, status?.type === \"running\");\n return null;\n};\n\nexport const HiddenWriteTodosToolUI = memo(\n HiddenWriteTodosToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nHiddenWriteTodosToolUI.displayName = \"HiddenWriteTodosToolUI\";\n\nconst WriteTodosToolUIImpl: ToolCallMessagePartComponent = ({\n args,\n argsText,\n result,\n status,\n}) => {\n const plan = useMemo(\n () => parseTodoPlan({ args, argsText, result }),\n [args, argsText, result],\n );\n const { steps, changeDescription } = plan;\n const [collapsed, setCollapsed] = useState(false);\n\n // Newest-plan dedupe: a run updates its plan by calling write_todos again,\n // so a conversation stacks cards that all describe the same plan. Only the\n // newest mounted card in this chat's scope renders (see todo-plan-store.ts).\n const isWriting = status?.type === \"running\";\n const isLatest = usePlanCardRegistration(plan, isWriting);\n if (!isLatest) return null;\n\n const completed = steps.filter((s) => s.status === \"completed\").length;\n const stopped = steps.filter(\n (s) => s.status === \"cancelled\" || s.status === \"failed\",\n ).length;\n const current = steps.find((s) => s.status === \"in_progress\");\n const total = steps.length;\n const resolved = completed + stopped;\n const isDone = total > 0 && resolved === total;\n\n if (total === 0) {\n return isWriting ? (\n <div className=\"my-3 flex w-full items-center gap-2 rounded-xl border border-border/60 bg-background px-4 py-3 shadow-sm\">\n <LoaderIcon className=\"size-3.5 animate-spin text-primary\" />\n <span className=\"text-[13px] font-medium text-foreground\">\n Planning...\n </span>\n </div>\n ) : null;\n }\n\n const heading = isWriting\n ? \"Updating plan\"\n : isDone\n ? \"Plan complete\"\n : completed === 0 && !current\n ? \"Plan\"\n : \"Plan in progress\";\n\n const subtitle =\n changeDescription ?? (current ? current.content : undefined);\n\n return (\n <div className=\"my-3 w-full rounded-xl border border-border/60 bg-background shadow-sm\">\n <div className=\"sticky top-0 z-20 overflow-hidden rounded-t-xl bg-background\">\n <button\n type=\"button\"\n onClick={() => setCollapsed((prev) => !prev)}\n className=\"flex w-full items-center gap-3 px-4 py-3 text-left transition-colors hover:bg-muted/30\"\n aria-expanded={!collapsed}\n >\n <PlanBadge resolved={resolved} total={total} />\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex items-baseline gap-2\">\n <span className=\"text-[13px] font-medium text-foreground\">\n {heading}\n </span>\n <span className=\"text-[11px] tabular-nums text-muted-foreground\">\n {resolved}/{total} steps\n </span>\n </span>\n {subtitle && (\n <span className=\"block truncate text-[12px] text-muted-foreground\">\n {subtitle}\n </span>\n )}\n </span>\n <ChevronDownIcon\n className={cn(\n \"size-4 shrink-0 text-muted-foreground transition-transform duration-200\",\n collapsed && \"-rotate-90\",\n )}\n />\n </button>\n\n <div className=\"h-0.5 w-full bg-muted\">\n <div\n className={cn(\n \"h-full transition-all duration-500\",\n isDone ? \"bg-emerald-500\" : \"bg-primary\",\n )}\n style={{ width: `${total > 0 ? (resolved / total) * 100 : 0}%` }}\n />\n </div>\n </div>\n\n {!collapsed && (\n <ol className=\"flex max-h-72 flex-col overflow-y-auto rounded-b-xl border-t border-border/40 py-1\">\n {steps.map((step, index) => (\n <li\n key={step.id ?? `${index}-${step.content}`}\n className={cn(\n \"relative flex items-start gap-2.5 px-4 py-1.5\",\n step.status === \"in_progress\" && \"bg-primary/5\",\n )}\n >\n {index < steps.length - 1 && (\n <span\n aria-hidden\n className=\"absolute left-[calc(1rem+8px)] top-[26px] h-[calc(100%-18px)] w-px bg-border/60\"\n />\n )}\n <span className=\"relative z-10 mt-[3px]\">\n <StepMarker status={step.status} index={index} />\n </span>\n <span\n className={cn(\n \"text-[12.5px] leading-relaxed text-foreground\",\n step.status === \"completed\" &&\n \"text-muted-foreground line-through decoration-muted-foreground/40\",\n step.status === \"cancelled\" &&\n \"text-muted-foreground/70 line-through decoration-muted-foreground/40\",\n step.status === \"failed\" && \"text-destructive\",\n step.status === \"in_progress\" && \"font-medium text-primary\",\n step.status === \"pending\" && \"text-muted-foreground\",\n )}\n >\n {step.content}\n </span>\n </li>\n ))}\n </ol>\n )}\n </div>\n );\n};\n\nexport const WriteTodosToolUI = memo(\n WriteTodosToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nWriteTodosToolUI.displayName = \"WriteTodosToolUI\";\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"write-todos-tool-ui.js","sources":["../../src/tools/write-todos-tool-ui.tsx"],"sourcesContent":["\"use client\";\n\nimport { memo, useEffect, useMemo, useState } from \"react\";\nimport type { ToolCallMessagePartComponent } from \"@assistant-ui/react\";\nimport {\n CheckIcon,\n ChevronDownIcon,\n ListChecksIcon,\n LoaderIcon,\n XIcon,\n} from \"lucide-react\";\nimport { cn } from \"../lib/utils\";\nimport {\n allocatePlanSeq,\n registerPlanCard,\n unregisterPlanCard,\n updatePlanCard,\n useIsLatestPlanCard,\n usePlanScope,\n} from \"./todo-plan-store\";\n\n// ─── Types ───────────────────────────────────────────────────────────\n\nexport type PlanStepStatus =\n | \"pending\"\n | \"in_progress\"\n | \"completed\"\n | \"cancelled\"\n | \"failed\";\n\nexport type PlanStep = {\n id?: string;\n content: string;\n status: PlanStepStatus;\n};\n\nexport type TodoPlan = {\n steps: PlanStep[];\n changeDescription?: string;\n};\n\nconst STEP_STATUSES: readonly PlanStepStatus[] = [\n \"pending\",\n \"in_progress\",\n \"completed\",\n \"cancelled\",\n \"failed\",\n];\n\n// ─── Parsing ─────────────────────────────────────────────────────────\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return typeof value === \"object\" && value !== null\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction asStatus(value: unknown): PlanStepStatus {\n return typeof value === \"string\" &&\n (STEP_STATUSES as readonly string[]).includes(value)\n ? (value as PlanStepStatus)\n : \"pending\";\n}\n\nfunction parseSteps(value: unknown): PlanStep[] {\n if (!Array.isArray(value)) return [];\n const steps: PlanStep[] = [];\n for (const raw of value) {\n const record = asRecord(raw);\n if (!record) continue;\n const content = record.content ?? record.task ?? record.title;\n if (typeof content !== \"string\" || content.trim() === \"\") continue;\n steps.push({\n id: typeof record.id === \"string\" ? record.id : undefined,\n content: content.trim(),\n status: asStatus(record.status),\n });\n }\n return steps;\n}\n\nfunction asDescription(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() !== \"\"\n ? value.trim()\n : undefined;\n}\n\nfunction parsePartialSteps(argsText: string | undefined): PlanStep[] {\n if (!argsText) return [];\n const steps: PlanStep[] = [];\n const objectPattern = /\\{(?:[^{}\\\\\"]|\"(?:[^\"\\\\]|\\\\.)*\")*\\}?/g;\n for (const [chunk] of argsText.matchAll(objectPattern)) {\n const contentMatch = /\"(?:content|task|title)\"\\s*:\\s*\"((?:[^\"\\\\]|\\\\.)*)\"/.exec(\n chunk,\n );\n if (!contentMatch) continue;\n let content: string;\n try {\n content = JSON.parse(`\"${contentMatch[1]}\"`) as string;\n } catch {\n content = contentMatch[1];\n }\n if (content.trim() === \"\") continue;\n const statusMatch = /\"status\"\\s*:\\s*\"([a-z_]+)\"/.exec(chunk);\n steps.push({\n content: content.trim(),\n status: asStatus(statusMatch?.[1]),\n });\n }\n return steps;\n}\n\nexport function parseTodoPlan({\n args,\n argsText,\n result,\n}: {\n args?: unknown;\n argsText?: string;\n result?: unknown;\n}): TodoPlan {\n const argsRecord = asRecord(args);\n const argSteps = parseSteps(argsRecord?.todos);\n\n let resultRecord = asRecord(result);\n if (!resultRecord && typeof result === \"string\") {\n try {\n resultRecord = asRecord(JSON.parse(result));\n } catch {\n resultRecord = null;\n }\n }\n\n const hasResultTodos = Array.isArray(resultRecord?.todos);\n const steps = hasResultTodos\n ? parseSteps(resultRecord?.todos)\n : argSteps.length > 0\n ? argSteps\n : parsePartialSteps(argsText);\n\n return {\n steps,\n changeDescription:\n asDescription(resultRecord?.description) ??\n asDescription(resultRecord?.todoChangeDescription),\n };\n}\n\n// ─── Presentation ────────────────────────────────────────────────────\n\n/** A plan step's status glyph (its number while pending) — shared with the workbench's Tasks pane. */\nexport function PlanStepMarker({\n status,\n index,\n}: {\n status: PlanStepStatus;\n index: number;\n}) {\n if (status === \"completed\") {\n return (\n <span className=\"flex size-[18px] shrink-0 items-center justify-center rounded-full bg-emerald-500 text-white\">\n <CheckIcon className=\"size-3\" strokeWidth={3} />\n </span>\n );\n }\n if (status === \"in_progress\") {\n return (\n <span className=\"flex size-[18px] shrink-0 items-center justify-center rounded-full bg-primary/10 text-primary\">\n <LoaderIcon className=\"size-3 animate-spin\" strokeWidth={3} />\n </span>\n );\n }\n if (status === \"failed\") {\n return (\n <span className=\"flex size-[18px] shrink-0 items-center justify-center rounded-full bg-destructive/10 text-destructive\">\n <XIcon className=\"size-3\" strokeWidth={3} />\n </span>\n );\n }\n if (status === \"cancelled\") {\n return (\n <span className=\"flex size-[18px] shrink-0 items-center justify-center rounded-full border border-border text-muted-foreground\">\n <XIcon className=\"size-3\" strokeWidth={3} />\n </span>\n );\n }\n return (\n <span className=\"flex size-[18px] shrink-0 items-center justify-center rounded-full border border-dashed border-border text-[9px] font-medium text-muted-foreground\">\n {index + 1}\n </span>\n );\n}\n\nfunction PlanBadge({\n resolved,\n total,\n}: {\n resolved: number;\n total: number;\n}) {\n const isDone = total > 0 && resolved === total;\n\n return (\n <span\n className={cn(\n \"flex size-8 shrink-0 items-center justify-center rounded-lg\",\n isDone && \"bg-emerald-50 text-emerald-600\",\n !isDone && \"bg-primary/10 text-primary\",\n )}\n >\n {isDone ? (\n <CheckIcon className=\"size-4\" strokeWidth={3} />\n ) : (\n <ListChecksIcon className=\"size-4\" />\n )}\n </span>\n );\n}\n\n/**\n * Register this card in its chat's plan registry and report whether it is the\n * newest mounted one. Shared by the visible card (which hides superseded\n * instances) and {@link HiddenWriteTodosToolUI} (which renders nothing but\n * keeps the registry — and so `useLatestTodoPlan` — fed).\n */\nfunction usePlanCardRegistration(plan: TodoPlan, isWriting: boolean): boolean {\n const scope = usePlanScope();\n const [seq] = useState(allocatePlanSeq);\n useEffect(() => {\n registerPlanCard(scope, seq, plan, isWriting);\n return () => unregisterPlanCard(scope, seq);\n // Registration is keyed to this instance's lifetime (and its chat's\n // scope); content updates ride the effect below.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [scope, seq]);\n useEffect(() => {\n updatePlanCard(scope, seq, plan, isWriting);\n }, [scope, seq, plan, isWriting]);\n return useIsLatestPlanCard(scope, seq);\n}\n\n/**\n * Inline-invisible `write_todos` for hosts that pin the plan elsewhere:\n * feeds the plan registry exactly like the visible card, renders nothing.\n * Register it via `toolUIs={{ write_todos: HiddenWriteTodosToolUI }}` and\n * read the plan with `useLatestTodoPlan()` — a bare `() => null` override\n * would leave the registry (and the hook) permanently empty.\n */\nconst HiddenWriteTodosToolUIImpl: ToolCallMessagePartComponent = ({\n args,\n argsText,\n result,\n status,\n}) => {\n const plan = useMemo(\n () => parseTodoPlan({ args, argsText, result }),\n [args, argsText, result],\n );\n usePlanCardRegistration(plan, status?.type === \"running\");\n return null;\n};\n\nexport const HiddenWriteTodosToolUI = memo(\n HiddenWriteTodosToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nHiddenWriteTodosToolUI.displayName = \"HiddenWriteTodosToolUI\";\n\nconst WriteTodosToolUIImpl: ToolCallMessagePartComponent = ({\n args,\n argsText,\n result,\n status,\n}) => {\n const plan = useMemo(\n () => parseTodoPlan({ args, argsText, result }),\n [args, argsText, result],\n );\n const { steps, changeDescription } = plan;\n const [collapsed, setCollapsed] = useState(false);\n\n // Newest-plan dedupe: a run updates its plan by calling write_todos again,\n // so a conversation stacks cards that all describe the same plan. Only the\n // newest mounted card in this chat's scope renders (see todo-plan-store.ts).\n const isWriting = status?.type === \"running\";\n const isLatest = usePlanCardRegistration(plan, isWriting);\n if (!isLatest) return null;\n\n const completed = steps.filter((s) => s.status === \"completed\").length;\n const stopped = steps.filter(\n (s) => s.status === \"cancelled\" || s.status === \"failed\",\n ).length;\n const current = steps.find((s) => s.status === \"in_progress\");\n const total = steps.length;\n const resolved = completed + stopped;\n const isDone = total > 0 && resolved === total;\n\n if (total === 0) {\n return isWriting ? (\n <div className=\"my-3 flex w-full items-center gap-2 rounded-xl border border-border/60 bg-background px-4 py-3 shadow-sm\">\n <LoaderIcon className=\"size-3.5 animate-spin text-primary\" />\n <span className=\"text-[13px] font-medium text-foreground\">\n Planning...\n </span>\n </div>\n ) : null;\n }\n\n const heading = isWriting\n ? \"Updating plan\"\n : isDone\n ? \"Plan complete\"\n : completed === 0 && !current\n ? \"Plan\"\n : \"Plan in progress\";\n\n const subtitle =\n changeDescription ?? (current ? current.content : undefined);\n\n return (\n <div className=\"my-3 w-full rounded-xl border border-border/60 bg-background shadow-sm\">\n <div className=\"sticky top-0 z-20 overflow-hidden rounded-t-xl bg-background\">\n <button\n type=\"button\"\n onClick={() => setCollapsed((prev) => !prev)}\n className=\"flex w-full items-center gap-3 px-4 py-3 text-left transition-colors hover:bg-muted/30\"\n aria-expanded={!collapsed}\n >\n <PlanBadge resolved={resolved} total={total} />\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex items-baseline gap-2\">\n <span className=\"text-[13px] font-medium text-foreground\">\n {heading}\n </span>\n <span className=\"text-[11px] tabular-nums text-muted-foreground\">\n {resolved}/{total} steps\n </span>\n </span>\n {subtitle && (\n <span className=\"block truncate text-[12px] text-muted-foreground\">\n {subtitle}\n </span>\n )}\n </span>\n <ChevronDownIcon\n className={cn(\n \"size-4 shrink-0 text-muted-foreground transition-transform duration-200\",\n collapsed && \"-rotate-90\",\n )}\n />\n </button>\n\n <div className=\"h-0.5 w-full bg-muted\">\n <div\n className={cn(\n \"h-full transition-all duration-500\",\n isDone ? \"bg-emerald-500\" : \"bg-primary\",\n )}\n style={{ width: `${total > 0 ? (resolved / total) * 100 : 0}%` }}\n />\n </div>\n </div>\n\n {!collapsed && (\n <ol className=\"flex max-h-72 flex-col overflow-y-auto rounded-b-xl border-t border-border/40 py-1\">\n {steps.map((step, index) => (\n <li\n key={step.id ?? `${index}-${step.content}`}\n className={cn(\n \"relative flex items-start gap-2.5 px-4 py-1.5\",\n step.status === \"in_progress\" && \"bg-primary/5\",\n )}\n >\n {index < steps.length - 1 && (\n <span\n aria-hidden\n className=\"absolute left-[calc(1rem+8px)] top-[26px] h-[calc(100%-18px)] w-px bg-border/60\"\n />\n )}\n <span className=\"relative z-10 mt-[3px]\">\n <PlanStepMarker status={step.status} index={index} />\n </span>\n <span\n className={cn(\n \"text-[12.5px] leading-relaxed text-foreground\",\n step.status === \"completed\" &&\n \"text-muted-foreground line-through decoration-muted-foreground/40\",\n step.status === \"cancelled\" &&\n \"text-muted-foreground/70 line-through decoration-muted-foreground/40\",\n step.status === \"failed\" && \"text-destructive\",\n step.status === \"in_progress\" && \"font-medium text-primary\",\n step.status === \"pending\" && \"text-muted-foreground\",\n )}\n >\n {step.content}\n </span>\n </li>\n ))}\n </ol>\n )}\n </div>\n );\n};\n\nexport const WriteTodosToolUI = memo(\n WriteTodosToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nWriteTodosToolUI.displayName = \"WriteTodosToolUI\";\n"],"names":[],"mappings":"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"}
|
package/dist/ui/popover.cjs
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const jsxRuntime = require("react/jsx-runtime");
|
|
4
4
|
const radixUi = require("radix-ui");
|
|
5
|
+
const lib_ownerDocument = require("../lib/owner-document.cjs");
|
|
6
|
+
const portalSurface = require("../lib/portal-surface.cjs");
|
|
5
7
|
const themeStyleContext = require("../provider/theme-style-context.cjs");
|
|
6
8
|
const cnfast = require("cnfast");
|
|
7
9
|
function Popover({ ...props }) {
|
|
@@ -19,20 +21,18 @@ function PopoverContent({
|
|
|
19
21
|
...props
|
|
20
22
|
}) {
|
|
21
23
|
const themeStyle = themeStyleContext.useAthenaThemeStyle();
|
|
22
|
-
|
|
24
|
+
const container = lib_ownerDocument.usePortalContainer();
|
|
25
|
+
return /* @__PURE__ */ jsxRuntime.jsx(radixUi.Popover.Portal, { container, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
23
26
|
radixUi.Popover.Content,
|
|
24
27
|
{
|
|
25
28
|
"data-slot": "popover-content",
|
|
26
29
|
align,
|
|
27
30
|
sideOffset,
|
|
28
31
|
collisionPadding,
|
|
29
|
-
style:
|
|
32
|
+
style: portalSurface.portalSurfaceStyle({ surface: "popover", className, themeStyle, style }),
|
|
30
33
|
className: cnfast.cn(
|
|
31
|
-
// The scope classes bring the tokens and the scoped reset
|
|
32
|
-
// `.athena-sdk` is `display: contents` (the wrapper's role), so the
|
|
33
|
-
// portal root sets its own box with `block`.
|
|
34
|
+
// The scope classes bring the tokens and the scoped reset.
|
|
34
35
|
"athena-sdk athena-sdk-chrome",
|
|
35
|
-
themeStyle && "athena-themed",
|
|
36
36
|
"block bg-popover text-popover-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border p-1 shadow-md outline-none",
|
|
37
37
|
className
|
|
38
38
|
),
|
package/dist/ui/popover.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"popover.cjs","sources":["../../src/ui/popover.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { Popover as PopoverPrimitive } from \"radix-ui\"\nimport { cn } from \"../lib/utils\"\nimport { useAthenaThemeStyle } from \"../provider/theme-style-context\"\n\nfunction Popover({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />\n}\n\nfunction PopoverTrigger({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />\n}\n\nfunction PopoverContent({\n className,\n style,\n align = \"center\",\n sideOffset = 4,\n collisionPadding = 8,\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n const themeStyle = useAthenaThemeStyle()\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n collisionPadding={collisionPadding}\n // Portaled outside the provider wrapper, so it neither inherits the\n // theme's variables nor the SDK tokens: it carries both itself.\n style={
|
|
1
|
+
{"version":3,"file":"popover.cjs","sources":["../../src/ui/popover.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { Popover as PopoverPrimitive } from \"radix-ui\"\nimport { usePortalContainer } from \"../lib/owner-document\"\nimport { portalSurfaceStyle } from \"../lib/portal-surface\"\nimport { cn } from \"../lib/utils\"\nimport { useAthenaThemeStyle } from \"../provider/theme-style-context\"\n\nfunction Popover({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />\n}\n\nfunction PopoverTrigger({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />\n}\n\nfunction PopoverContent({\n className,\n style,\n align = \"center\",\n sideOffset = 4,\n collisionPadding = 8,\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n const themeStyle = useAthenaThemeStyle()\n const container = usePortalContainer()\n return (\n <PopoverPrimitive.Portal container={container}>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n collisionPadding={collisionPadding}\n // Portaled outside the provider wrapper, so it neither inherits the\n // theme's variables nor the SDK tokens: it carries both itself, and\n // its box and colours inline (lib/portal-surface.ts).\n style={portalSurfaceStyle({ surface: \"popover\", className, themeStyle, style })}\n className={cn(\n // The scope classes bring the tokens and the scoped reset.\n \"athena-sdk athena-sdk-chrome\",\n \"block bg-popover text-popover-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border p-1 shadow-md outline-none\",\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n )\n}\n\nexport { Popover, PopoverTrigger, PopoverContent }\n"],"names":["PopoverPrimitive","useAthenaThemeStyle","usePortalContainer","jsx","portalSurfaceStyle","cn"],"mappings":";;;;;;;;AASA,SAAS,QAAQ,EAAE,GAAG,SAA6D;AACjF,wCAAQA,QAAAA,QAAiB,MAAjB,EAAsB,aAAU,WAAW,GAAG,OAAO;AAC/D;AAEA,SAAS,eAAe,EAAE,GAAG,SAAgE;AAC3F,wCAAQA,QAAAA,QAAiB,SAAjB,EAAyB,aAAU,mBAAmB,GAAG,OAAO;AAC1E;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,GAAG;AACL,GAA0D;AACxD,QAAM,aAAaC,kBAAAA,oBAAA;AACnB,QAAM,YAAYC,kBAAAA,mBAAA;AAClB,SACEC,2BAAAA,IAACH,QAAAA,QAAiB,QAAjB,EAAwB,WACvB,UAAAG,2BAAAA;AAAAA,IAACH,QAAAA,QAAiB;AAAA,IAAjB;AAAA,MACC,aAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MAIA,OAAOI,cAAAA,mBAAmB,EAAE,SAAS,WAAW,WAAW,YAAY,OAAO;AAAA,MAC9E,WAAWC,OAAAA;AAAAA;AAAAA,QAET;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAED,GAAG;AAAA,IAAA;AAAA,EAAA,GAER;AAEJ;;;;"}
|
package/dist/ui/popover.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { jsx } from "react/jsx-runtime";
|
|
2
2
|
import { Popover as Popover$1 } from "radix-ui";
|
|
3
|
+
import { usePortalContainer } from "../lib/owner-document.js";
|
|
4
|
+
import { portalSurfaceStyle } from "../lib/portal-surface.js";
|
|
3
5
|
import { useAthenaThemeStyle } from "../provider/theme-style-context.js";
|
|
4
6
|
import { cn } from "cnfast";
|
|
5
7
|
function Popover({ ...props }) {
|
|
@@ -17,20 +19,18 @@ function PopoverContent({
|
|
|
17
19
|
...props
|
|
18
20
|
}) {
|
|
19
21
|
const themeStyle = useAthenaThemeStyle();
|
|
20
|
-
|
|
22
|
+
const container = usePortalContainer();
|
|
23
|
+
return /* @__PURE__ */ jsx(Popover$1.Portal, { container, children: /* @__PURE__ */ jsx(
|
|
21
24
|
Popover$1.Content,
|
|
22
25
|
{
|
|
23
26
|
"data-slot": "popover-content",
|
|
24
27
|
align,
|
|
25
28
|
sideOffset,
|
|
26
29
|
collisionPadding,
|
|
27
|
-
style:
|
|
30
|
+
style: portalSurfaceStyle({ surface: "popover", className, themeStyle, style }),
|
|
28
31
|
className: cn(
|
|
29
|
-
// The scope classes bring the tokens and the scoped reset
|
|
30
|
-
// `.athena-sdk` is `display: contents` (the wrapper's role), so the
|
|
31
|
-
// portal root sets its own box with `block`.
|
|
32
|
+
// The scope classes bring the tokens and the scoped reset.
|
|
32
33
|
"athena-sdk athena-sdk-chrome",
|
|
33
|
-
themeStyle && "athena-themed",
|
|
34
34
|
"block bg-popover text-popover-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border p-1 shadow-md outline-none",
|
|
35
35
|
className
|
|
36
36
|
),
|
package/dist/ui/popover.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"popover.js","sources":["../../src/ui/popover.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { Popover as PopoverPrimitive } from \"radix-ui\"\nimport { cn } from \"../lib/utils\"\nimport { useAthenaThemeStyle } from \"../provider/theme-style-context\"\n\nfunction Popover({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />\n}\n\nfunction PopoverTrigger({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />\n}\n\nfunction PopoverContent({\n className,\n style,\n align = \"center\",\n sideOffset = 4,\n collisionPadding = 8,\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n const themeStyle = useAthenaThemeStyle()\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n collisionPadding={collisionPadding}\n // Portaled outside the provider wrapper, so it neither inherits the\n // theme's variables nor the SDK tokens: it carries both itself.\n style={
|
|
1
|
+
{"version":3,"file":"popover.js","sources":["../../src/ui/popover.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { Popover as PopoverPrimitive } from \"radix-ui\"\nimport { usePortalContainer } from \"../lib/owner-document\"\nimport { portalSurfaceStyle } from \"../lib/portal-surface\"\nimport { cn } from \"../lib/utils\"\nimport { useAthenaThemeStyle } from \"../provider/theme-style-context\"\n\nfunction Popover({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />\n}\n\nfunction PopoverTrigger({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />\n}\n\nfunction PopoverContent({\n className,\n style,\n align = \"center\",\n sideOffset = 4,\n collisionPadding = 8,\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n const themeStyle = useAthenaThemeStyle()\n const container = usePortalContainer()\n return (\n <PopoverPrimitive.Portal container={container}>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n collisionPadding={collisionPadding}\n // Portaled outside the provider wrapper, so it neither inherits the\n // theme's variables nor the SDK tokens: it carries both itself, and\n // its box and colours inline (lib/portal-surface.ts).\n style={portalSurfaceStyle({ surface: \"popover\", className, themeStyle, style })}\n className={cn(\n // The scope classes bring the tokens and the scoped reset.\n \"athena-sdk athena-sdk-chrome\",\n \"block bg-popover text-popover-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border p-1 shadow-md outline-none\",\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n )\n}\n\nexport { Popover, PopoverTrigger, PopoverContent }\n"],"names":["PopoverPrimitive"],"mappings":";;;;;;AASA,SAAS,QAAQ,EAAE,GAAG,SAA6D;AACjF,6BAAQA,UAAiB,MAAjB,EAAsB,aAAU,WAAW,GAAG,OAAO;AAC/D;AAEA,SAAS,eAAe,EAAE,GAAG,SAAgE;AAC3F,6BAAQA,UAAiB,SAAjB,EAAyB,aAAU,mBAAmB,GAAG,OAAO;AAC1E;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,GAAG;AACL,GAA0D;AACxD,QAAM,aAAa,oBAAA;AACnB,QAAM,YAAY,mBAAA;AAClB,SACE,oBAACA,UAAiB,QAAjB,EAAwB,WACvB,UAAA;AAAA,IAACA,UAAiB;AAAA,IAAjB;AAAA,MACC,aAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MAIA,OAAO,mBAAmB,EAAE,SAAS,WAAW,WAAW,YAAY,OAAO;AAAA,MAC9E,WAAW;AAAA;AAAA,QAET;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAED,GAAG;AAAA,IAAA;AAAA,EAAA,GAER;AAEJ;"}
|
package/dist/ui/tooltip.cjs
CHANGED
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const jsxRuntime = require("react/jsx-runtime");
|
|
4
4
|
const radixUi = require("radix-ui");
|
|
5
|
+
const lib_ownerDocument = require("../lib/owner-document.cjs");
|
|
6
|
+
const portalSurface = require("../lib/portal-surface.cjs");
|
|
7
|
+
const themeStyleContext = require("../provider/theme-style-context.cjs");
|
|
5
8
|
const cnfast = require("cnfast");
|
|
6
9
|
function TooltipProvider({
|
|
7
10
|
delayDuration = 0,
|
|
@@ -17,15 +20,20 @@ function TooltipTrigger({ ...props }) {
|
|
|
17
20
|
}
|
|
18
21
|
function TooltipContent({
|
|
19
22
|
className,
|
|
23
|
+
style,
|
|
20
24
|
sideOffset = 0,
|
|
21
25
|
children,
|
|
22
26
|
...props
|
|
23
27
|
}) {
|
|
24
|
-
|
|
28
|
+
const themeStyle = themeStyleContext.useAthenaThemeStyle();
|
|
29
|
+
const container = lib_ownerDocument.usePortalContainer();
|
|
30
|
+
const surfaceStyle = portalSurface.portalSurfaceStyle({ surface: "tooltip", className, themeStyle, style });
|
|
31
|
+
return /* @__PURE__ */ jsxRuntime.jsx(radixUi.Tooltip.Portal, { container, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
25
32
|
radixUi.Tooltip.Content,
|
|
26
33
|
{
|
|
27
34
|
"data-slot": "tooltip-content",
|
|
28
35
|
sideOffset,
|
|
36
|
+
style: surfaceStyle,
|
|
29
37
|
className: cnfast.cn(
|
|
30
38
|
// Portaled outside the provider wrapper — carries the SDK scope
|
|
31
39
|
// classes itself so tokens and the scoped reset still apply.
|
|
@@ -36,7 +44,13 @@ function TooltipContent({
|
|
|
36
44
|
...props,
|
|
37
45
|
children: [
|
|
38
46
|
children,
|
|
39
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
47
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
48
|
+
radixUi.Tooltip.Arrow,
|
|
49
|
+
{
|
|
50
|
+
className: "bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]",
|
|
51
|
+
style: surfaceStyle.backgroundColor ? { backgroundColor: surfaceStyle.backgroundColor, fill: surfaceStyle.backgroundColor } : void 0
|
|
52
|
+
}
|
|
53
|
+
)
|
|
40
54
|
]
|
|
41
55
|
}
|
|
42
56
|
) });
|
package/dist/ui/tooltip.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tooltip.cjs","sources":["../../src/ui/tooltip.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { Tooltip as TooltipPrimitive } from \"radix-ui\"\nimport { cn } from \"../lib/utils\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return <TooltipPrimitive.Provider data-slot=\"tooltip-provider\" delayDuration={delayDuration} {...props} />\n}\n\nfunction Tooltip({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n}\n\nfunction TooltipTrigger({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n // Portaled outside the provider wrapper — carries the SDK scope\n // classes itself so tokens and the scoped reset still apply.\n \"athena-sdk athena-sdk-chrome\",\n \"bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow
|
|
1
|
+
{"version":3,"file":"tooltip.cjs","sources":["../../src/ui/tooltip.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { Tooltip as TooltipPrimitive } from \"radix-ui\"\nimport { usePortalContainer } from \"../lib/owner-document\"\nimport { portalSurfaceStyle } from \"../lib/portal-surface\"\nimport { cn } from \"../lib/utils\"\nimport { useAthenaThemeStyle } from \"../provider/theme-style-context\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return <TooltipPrimitive.Provider data-slot=\"tooltip-provider\" delayDuration={delayDuration} {...props} />\n}\n\nfunction Tooltip({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n}\n\nfunction TooltipTrigger({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n className,\n style,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n const themeStyle = useAthenaThemeStyle()\n const container = usePortalContainer()\n const surfaceStyle = portalSurfaceStyle({ surface: \"tooltip\", className, themeStyle, style })\n return (\n <TooltipPrimitive.Portal container={container}>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n // Its box and colours inline: no host stylesheet can take them away\n // (lib/portal-surface.ts).\n style={surfaceStyle}\n className={cn(\n // Portaled outside the provider wrapper — carries the SDK scope\n // classes itself so tokens and the scoped reset still apply.\n \"athena-sdk athena-sdk-chrome\",\n \"bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow\n className=\"bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]\"\n // The tooltip's own background when it is inline (the default or the\n // caller's `style`); a caller's colour class leaves both to the classes.\n style={\n surfaceStyle.backgroundColor\n ? { backgroundColor: surfaceStyle.backgroundColor, fill: surfaceStyle.backgroundColor }\n : undefined\n }\n />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n"],"names":["jsx","TooltipPrimitive","useAthenaThemeStyle","usePortalContainer","portalSurfaceStyle","jsxs","cn"],"mappings":";;;;;;;;AASA,SAAS,gBAAgB;AAAA,EACvB,gBAAgB;AAAA,EAChB,GAAG;AACL,GAA2D;AACzD,SAAOA,2BAAAA,IAACC,QAAAA,QAAiB,UAAjB,EAA0B,aAAU,oBAAmB,eAA+B,GAAG,OAAO;AAC1G;AAEA,SAAS,QAAQ,EAAE,GAAG,SAA6D;AACjF,wCAAQA,QAAAA,QAAiB,MAAjB,EAAsB,aAAU,WAAW,GAAG,OAAO;AAC/D;AAEA,SAAS,eAAe,EAAE,GAAG,SAAgE;AAC3F,wCAAQA,QAAAA,QAAiB,SAAjB,EAAyB,aAAU,mBAAmB,GAAG,OAAO;AAC1E;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA,GAAG;AACL,GAA0D;AACxD,QAAM,aAAaC,kBAAAA,oBAAA;AACnB,QAAM,YAAYC,kBAAAA,mBAAA;AAClB,QAAM,eAAeC,cAAAA,mBAAmB,EAAE,SAAS,WAAW,WAAW,YAAY,OAAO;AAC5F,SACEJ,2BAAAA,IAACC,QAAAA,QAAiB,QAAjB,EAAwB,WACvB,UAAAI,2BAAAA;AAAAA,IAACJ,QAAAA,QAAiB;AAAA,IAAjB;AAAA,MACC,aAAU;AAAA,MACV;AAAA,MAGA,OAAO;AAAA,MACP,WAAWK,OAAAA;AAAAA;AAAAA;AAAAA,QAGT;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAED,GAAG;AAAA,MAEH,UAAA;AAAA,QAAA;AAAA,QACDN,2BAAAA;AAAAA,UAACC,QAAAA,QAAiB;AAAA,UAAjB;AAAA,YACC,WAAU;AAAA,YAGV,OACE,aAAa,kBACT,EAAE,iBAAiB,aAAa,iBAAiB,MAAM,aAAa,oBACpE;AAAA,UAAA;AAAA,QAAA;AAAA,MAER;AAAA,IAAA;AAAA,EAAA,GAEJ;AAEJ;;;;;"}
|
package/dist/ui/tooltip.d.ts
CHANGED
|
@@ -3,5 +3,5 @@ import { Tooltip as TooltipPrimitive } from "radix-ui";
|
|
|
3
3
|
declare function TooltipProvider({ delayDuration, ...props }: React.ComponentProps<typeof TooltipPrimitive.Provider>): React.JSX.Element;
|
|
4
4
|
declare function Tooltip({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>): React.JSX.Element;
|
|
5
5
|
declare function TooltipTrigger({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Trigger>): React.JSX.Element;
|
|
6
|
-
declare function TooltipContent({ className, sideOffset, children, ...props }: React.ComponentProps<typeof TooltipPrimitive.Content>): React.JSX.Element;
|
|
6
|
+
declare function TooltipContent({ className, style, sideOffset, children, ...props }: React.ComponentProps<typeof TooltipPrimitive.Content>): React.JSX.Element;
|
|
7
7
|
export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };
|
package/dist/ui/tooltip.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Tooltip as Tooltip$1 } from "radix-ui";
|
|
3
|
+
import { usePortalContainer } from "../lib/owner-document.js";
|
|
4
|
+
import { portalSurfaceStyle } from "../lib/portal-surface.js";
|
|
5
|
+
import { useAthenaThemeStyle } from "../provider/theme-style-context.js";
|
|
3
6
|
import { cn } from "cnfast";
|
|
4
7
|
function TooltipProvider({
|
|
5
8
|
delayDuration = 0,
|
|
@@ -15,15 +18,20 @@ function TooltipTrigger({ ...props }) {
|
|
|
15
18
|
}
|
|
16
19
|
function TooltipContent({
|
|
17
20
|
className,
|
|
21
|
+
style,
|
|
18
22
|
sideOffset = 0,
|
|
19
23
|
children,
|
|
20
24
|
...props
|
|
21
25
|
}) {
|
|
22
|
-
|
|
26
|
+
const themeStyle = useAthenaThemeStyle();
|
|
27
|
+
const container = usePortalContainer();
|
|
28
|
+
const surfaceStyle = portalSurfaceStyle({ surface: "tooltip", className, themeStyle, style });
|
|
29
|
+
return /* @__PURE__ */ jsx(Tooltip$1.Portal, { container, children: /* @__PURE__ */ jsxs(
|
|
23
30
|
Tooltip$1.Content,
|
|
24
31
|
{
|
|
25
32
|
"data-slot": "tooltip-content",
|
|
26
33
|
sideOffset,
|
|
34
|
+
style: surfaceStyle,
|
|
27
35
|
className: cn(
|
|
28
36
|
// Portaled outside the provider wrapper — carries the SDK scope
|
|
29
37
|
// classes itself so tokens and the scoped reset still apply.
|
|
@@ -34,7 +42,13 @@ function TooltipContent({
|
|
|
34
42
|
...props,
|
|
35
43
|
children: [
|
|
36
44
|
children,
|
|
37
|
-
/* @__PURE__ */ jsx(
|
|
45
|
+
/* @__PURE__ */ jsx(
|
|
46
|
+
Tooltip$1.Arrow,
|
|
47
|
+
{
|
|
48
|
+
className: "bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]",
|
|
49
|
+
style: surfaceStyle.backgroundColor ? { backgroundColor: surfaceStyle.backgroundColor, fill: surfaceStyle.backgroundColor } : void 0
|
|
50
|
+
}
|
|
51
|
+
)
|
|
38
52
|
]
|
|
39
53
|
}
|
|
40
54
|
) });
|
package/dist/ui/tooltip.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tooltip.js","sources":["../../src/ui/tooltip.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { Tooltip as TooltipPrimitive } from \"radix-ui\"\nimport { cn } from \"../lib/utils\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return <TooltipPrimitive.Provider data-slot=\"tooltip-provider\" delayDuration={delayDuration} {...props} />\n}\n\nfunction Tooltip({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n}\n\nfunction TooltipTrigger({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n // Portaled outside the provider wrapper — carries the SDK scope\n // classes itself so tokens and the scoped reset still apply.\n \"athena-sdk athena-sdk-chrome\",\n \"bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow
|
|
1
|
+
{"version":3,"file":"tooltip.js","sources":["../../src/ui/tooltip.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { Tooltip as TooltipPrimitive } from \"radix-ui\"\nimport { usePortalContainer } from \"../lib/owner-document\"\nimport { portalSurfaceStyle } from \"../lib/portal-surface\"\nimport { cn } from \"../lib/utils\"\nimport { useAthenaThemeStyle } from \"../provider/theme-style-context\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return <TooltipPrimitive.Provider data-slot=\"tooltip-provider\" delayDuration={delayDuration} {...props} />\n}\n\nfunction Tooltip({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n}\n\nfunction TooltipTrigger({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n className,\n style,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n const themeStyle = useAthenaThemeStyle()\n const container = usePortalContainer()\n const surfaceStyle = portalSurfaceStyle({ surface: \"tooltip\", className, themeStyle, style })\n return (\n <TooltipPrimitive.Portal container={container}>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n // Its box and colours inline: no host stylesheet can take them away\n // (lib/portal-surface.ts).\n style={surfaceStyle}\n className={cn(\n // Portaled outside the provider wrapper — carries the SDK scope\n // classes itself so tokens and the scoped reset still apply.\n \"athena-sdk athena-sdk-chrome\",\n \"bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow\n className=\"bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]\"\n // The tooltip's own background when it is inline (the default or the\n // caller's `style`); a caller's colour class leaves both to the classes.\n style={\n surfaceStyle.backgroundColor\n ? { backgroundColor: surfaceStyle.backgroundColor, fill: surfaceStyle.backgroundColor }\n : undefined\n }\n />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n"],"names":["TooltipPrimitive"],"mappings":";;;;;;AASA,SAAS,gBAAgB;AAAA,EACvB,gBAAgB;AAAA,EAChB,GAAG;AACL,GAA2D;AACzD,SAAO,oBAACA,UAAiB,UAAjB,EAA0B,aAAU,oBAAmB,eAA+B,GAAG,OAAO;AAC1G;AAEA,SAAS,QAAQ,EAAE,GAAG,SAA6D;AACjF,6BAAQA,UAAiB,MAAjB,EAAsB,aAAU,WAAW,GAAG,OAAO;AAC/D;AAEA,SAAS,eAAe,EAAE,GAAG,SAAgE;AAC3F,6BAAQA,UAAiB,SAAjB,EAAyB,aAAU,mBAAmB,GAAG,OAAO;AAC1E;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA,GAAG;AACL,GAA0D;AACxD,QAAM,aAAa,oBAAA;AACnB,QAAM,YAAY,mBAAA;AAClB,QAAM,eAAe,mBAAmB,EAAE,SAAS,WAAW,WAAW,YAAY,OAAO;AAC5F,SACE,oBAACA,UAAiB,QAAjB,EAAwB,WACvB,UAAA;AAAA,IAACA,UAAiB;AAAA,IAAjB;AAAA,MACC,aAAU;AAAA,MACV;AAAA,MAGA,OAAO;AAAA,MACP,WAAW;AAAA;AAAA;AAAA,QAGT;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAED,GAAG;AAAA,MAEH,UAAA;AAAA,QAAA;AAAA,QACD;AAAA,UAACA,UAAiB;AAAA,UAAjB;AAAA,YACC,WAAU;AAAA,YAGV,OACE,aAAa,kBACT,EAAE,iBAAiB,aAAa,iBAAiB,MAAM,aAAa,oBACpE;AAAA,UAAA;AAAA,QAAA;AAAA,MAER;AAAA,IAAA;AAAA,EAAA,GAEJ;AAEJ;"}
|
package/dist/version.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const _package = require("./
|
|
3
|
+
const _package = require("./react/package.json.cjs");
|
|
4
4
|
const ATHENA_REACT_SDK_VERSION = _package.default.version;
|
|
5
5
|
exports.ATHENA_REACT_SDK_VERSION = ATHENA_REACT_SDK_VERSION;
|
|
6
6
|
//# sourceMappingURL=version.cjs.map
|
package/dist/version.js
CHANGED