@athenaintel/react 0.19.0 → 0.20.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 +97 -11
- package/dist/assets/AssetPanel.cjs +277 -0
- package/dist/assets/AssetPanel.cjs.map +1 -0
- package/dist/assets/AssetPanel.js +277 -0
- package/dist/assets/AssetPanel.js.map +1 -0
- package/dist/assets/AthenaAssetEmbed.cjs +151 -0
- package/dist/assets/AthenaAssetEmbed.cjs.map +1 -0
- package/dist/assets/AthenaAssetEmbed.js +151 -0
- package/dist/assets/AthenaAssetEmbed.js.map +1 -0
- package/dist/assets/AthenaLayout.cjs +69 -0
- package/dist/assets/AthenaLayout.cjs.map +1 -0
- package/dist/assets/AthenaLayout.js +69 -0
- package/dist/assets/AthenaLayout.js.map +1 -0
- package/dist/assets/asset-embed-messages.cjs +39 -0
- package/dist/assets/asset-embed-messages.cjs.map +1 -0
- package/dist/assets/asset-embed-messages.js +39 -0
- package/dist/assets/asset-embed-messages.js.map +1 -0
- package/dist/assets/asset-panel-store.cjs +124 -0
- package/dist/assets/asset-panel-store.cjs.map +1 -0
- package/dist/assets/asset-panel-store.js +124 -0
- package/dist/assets/asset-panel-store.js.map +1 -0
- package/dist/assets/asset-panel-url.cjs +40 -0
- package/dist/assets/asset-panel-url.cjs.map +1 -0
- package/dist/assets/asset-panel-url.js +40 -0
- package/dist/assets/asset-panel-url.js.map +1 -0
- package/dist/assets/use-asset-embed.cjs +362 -0
- package/dist/assets/use-asset-embed.cjs.map +1 -0
- package/dist/assets/use-asset-embed.js +362 -0
- package/dist/assets/use-asset-embed.js.map +1 -0
- package/dist/{AthenaAuthContext-B3AwLA5Z.cjs → auth/AthenaAuthContext.cjs} +5 -4
- package/dist/auth/AthenaAuthContext.cjs.map +1 -0
- package/dist/{AthenaAuthContext-DQsdayH2.js → auth/AthenaAuthContext.js} +3 -3
- package/dist/auth/AthenaAuthContext.js.map +1 -0
- package/dist/auth/AthenaAuthProvider.cjs +141 -0
- package/dist/auth/AthenaAuthProvider.cjs.map +1 -0
- package/dist/auth/AthenaAuthProvider.js +141 -0
- package/dist/auth/AthenaAuthProvider.js.map +1 -0
- package/dist/{auth.cjs → auth/AthenaSSOProvider.cjs} +14 -151
- package/dist/auth/AthenaSSOProvider.cjs.map +1 -0
- package/dist/{auth.js → auth/AthenaSSOProvider.js} +4 -142
- package/dist/auth/AthenaSSOProvider.js.map +1 -0
- package/dist/auth/index.cjs +10 -0
- package/dist/auth/index.cjs.map +1 -0
- package/dist/auth/index.js +10 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/chat/AthenaChat.cjs +753 -0
- package/dist/chat/AthenaChat.cjs.map +1 -0
- package/dist/chat/AthenaChat.d.ts +3 -2
- package/dist/chat/AthenaChat.js +753 -0
- package/dist/chat/AthenaChat.js.map +1 -0
- package/dist/chat/AthenaChatErrorBoundary.cjs +53 -0
- package/dist/chat/AthenaChatErrorBoundary.cjs.map +1 -0
- package/dist/chat/AthenaChatErrorBoundary.js +53 -0
- package/dist/chat/AthenaChatErrorBoundary.js.map +1 -0
- package/dist/chat/StatewireApprovalCard.cjs +171 -0
- package/dist/chat/StatewireApprovalCard.cjs.map +1 -0
- package/dist/chat/StatewireApprovalCard.js +171 -0
- package/dist/chat/StatewireApprovalCard.js.map +1 -0
- package/dist/chat/StatewireClientToolBridge.cjs +50 -0
- package/dist/chat/StatewireClientToolBridge.cjs.map +1 -0
- package/dist/chat/StatewireClientToolBridge.js +50 -0
- package/dist/chat/StatewireClientToolBridge.js.map +1 -0
- package/dist/chat/StatewireQueuedMessages.cjs +432 -0
- package/dist/chat/StatewireQueuedMessages.cjs.map +1 -0
- package/dist/chat/StatewireQueuedMessages.d.ts +3 -4
- package/dist/chat/StatewireQueuedMessages.js +432 -0
- package/dist/chat/StatewireQueuedMessages.js.map +1 -0
- package/dist/chat/athena-citation-links.cjs +326 -0
- package/dist/chat/athena-citation-links.cjs.map +1 -0
- package/dist/chat/athena-citation-links.js +326 -0
- package/dist/chat/athena-citation-links.js.map +1 -0
- package/dist/chat/run-activity.cjs +28 -0
- package/dist/chat/run-activity.cjs.map +1 -0
- package/dist/chat/run-activity.js +28 -0
- package/dist/chat/run-activity.js.map +1 -0
- package/dist/chat/statewire-banners.cjs +83 -0
- package/dist/chat/statewire-banners.cjs.map +1 -0
- package/dist/chat/statewire-banners.js +83 -0
- package/dist/chat/statewire-banners.js.map +1 -0
- package/dist/chat/statewire-client-tools.cjs +73 -0
- package/dist/chat/statewire-client-tools.cjs.map +1 -0
- package/dist/chat/statewire-client-tools.js +73 -0
- package/dist/chat/statewire-client-tools.js.map +1 -0
- package/dist/chat/super-grouping/CollapsibleGroup.cjs +158 -0
- package/dist/chat/super-grouping/CollapsibleGroup.cjs.map +1 -0
- package/dist/chat/super-grouping/CollapsibleGroup.js +158 -0
- package/dist/chat/super-grouping/CollapsibleGroup.js.map +1 -0
- package/dist/chat/super-grouping/SuperGroupingCard.cjs +361 -0
- package/dist/chat/super-grouping/SuperGroupingCard.cjs.map +1 -0
- package/dist/chat/super-grouping/SuperGroupingCard.d.ts +4 -1
- package/dist/chat/super-grouping/SuperGroupingCard.js +361 -0
- package/dist/chat/super-grouping/SuperGroupingCard.js.map +1 -0
- package/dist/chat/super-grouping/activity-timeline.cjs +151 -0
- package/dist/chat/super-grouping/activity-timeline.cjs.map +1 -0
- package/dist/chat/super-grouping/activity-timeline.d.ts +3 -3
- package/dist/chat/super-grouping/activity-timeline.js +151 -0
- package/dist/chat/super-grouping/activity-timeline.js.map +1 -0
- package/dist/chat/super-grouping/grouping-function.cjs +55 -0
- package/dist/chat/super-grouping/grouping-function.cjs.map +1 -0
- package/dist/chat/super-grouping/grouping-function.js +55 -0
- package/dist/chat/super-grouping/grouping-function.js.map +1 -0
- package/dist/chat/super-grouping/index.cjs +26 -0
- package/dist/chat/super-grouping/index.cjs.map +1 -0
- package/dist/chat/super-grouping/index.js +26 -0
- package/dist/chat/super-grouping/index.js.map +1 -0
- package/dist/chat/super-grouping/toolkit-map.cjs +96 -0
- package/dist/chat/super-grouping/toolkit-map.cjs.map +1 -0
- package/dist/chat/super-grouping/toolkit-map.js +96 -0
- package/dist/chat/super-grouping/toolkit-map.js.map +1 -0
- package/dist/chat/tiptap-text.cjs +101 -0
- package/dist/chat/tiptap-text.cjs.map +1 -0
- package/dist/chat/tiptap-text.js +101 -0
- package/dist/chat/tiptap-text.js.map +1 -0
- package/dist/chat/tooltip-icon-button.cjs +32 -0
- package/dist/chat/tooltip-icon-button.cjs.map +1 -0
- package/dist/chat/tooltip-icon-button.js +32 -0
- package/dist/chat/tooltip-icon-button.js.map +1 -0
- package/dist/chat/use-athena-run-live.cjs +23 -0
- package/dist/chat/use-athena-run-live.cjs.map +1 -0
- package/dist/chat/use-athena-run-live.d.ts +10 -0
- package/dist/chat/use-athena-run-live.js +23 -0
- package/dist/chat/use-athena-run-live.js.map +1 -0
- package/dist/chat/use-statewire-approval-request.cjs +46 -0
- package/dist/chat/use-statewire-approval-request.cjs.map +1 -0
- package/dist/chat/use-statewire-approval-request.js +46 -0
- package/dist/chat/use-statewire-approval-request.js.map +1 -0
- package/dist/chat-ui/auth/sign-in-card.cjs +128 -0
- package/dist/chat-ui/auth/sign-in-card.cjs.map +1 -0
- package/dist/chat-ui/auth/sign-in-card.js +128 -0
- package/dist/chat-ui/auth/sign-in-card.js.map +1 -0
- package/dist/chat-ui/composer/composer-action.cjs +11 -0
- package/dist/chat-ui/composer/composer-action.cjs.map +1 -0
- package/dist/chat-ui/composer/composer-action.d.ts +5 -8
- package/dist/chat-ui/composer/composer-action.js +11 -0
- package/dist/chat-ui/composer/composer-action.js.map +1 -0
- package/dist/chat-ui/composer/pending-attachment-uploads.cjs +25 -0
- package/dist/chat-ui/composer/pending-attachment-uploads.cjs.map +1 -0
- package/dist/chat-ui/composer/pending-attachment-uploads.js +25 -0
- package/dist/chat-ui/composer/pending-attachment-uploads.js.map +1 -0
- package/dist/chat-ui/composer/tiptap-composer.cjs +590 -0
- package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -0
- package/dist/chat-ui/composer/tiptap-composer.d.ts +44 -7
- package/dist/chat-ui/composer/tiptap-composer.js +590 -0
- package/dist/chat-ui/composer/tiptap-composer.js.map +1 -0
- package/dist/chat-ui/header/chat-header.cjs +33 -0
- package/dist/chat-ui/header/chat-header.cjs.map +1 -0
- package/dist/chat-ui/header/chat-header.js +33 -0
- package/dist/chat-ui/header/chat-header.js.map +1 -0
- package/dist/chat-ui/header/conversation-history-panel.cjs +369 -0
- package/dist/chat-ui/header/conversation-history-panel.cjs.map +1 -0
- package/dist/chat-ui/header/conversation-history-panel.js +369 -0
- package/dist/chat-ui/header/conversation-history-panel.js.map +1 -0
- package/dist/chat-ui/index.cjs +139 -0
- package/dist/chat-ui/index.cjs.map +1 -0
- package/dist/chat-ui/index.d.ts +4 -3
- package/dist/chat-ui/index.js +139 -0
- package/dist/chat-ui/index.js.map +1 -0
- package/dist/chat-ui/lib/asset-urls.cjs +18 -0
- package/dist/chat-ui/lib/asset-urls.cjs.map +1 -0
- package/dist/chat-ui/lib/asset-urls.js +18 -0
- package/dist/chat-ui/lib/asset-urls.js.map +1 -0
- package/dist/chat-ui/mentions/mention-chip.cjs +208 -0
- package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -0
- package/dist/chat-ui/mentions/mention-chip.js +208 -0
- package/dist/chat-ui/mentions/mention-chip.js.map +1 -0
- package/dist/chat-ui/mentions/mention-extension.cjs +184 -0
- package/dist/chat-ui/mentions/mention-extension.cjs.map +1 -0
- package/dist/chat-ui/mentions/mention-extension.d.ts +24 -2
- package/dist/chat-ui/mentions/mention-extension.js +184 -0
- package/dist/chat-ui/mentions/mention-extension.js.map +1 -0
- package/dist/chat-ui/mentions/suggestions/components/get-scope-name.cjs +35 -0
- package/dist/chat-ui/mentions/suggestions/components/get-scope-name.cjs.map +1 -0
- package/dist/chat-ui/mentions/suggestions/components/get-scope-name.js +35 -0
- package/dist/chat-ui/mentions/suggestions/components/get-scope-name.js.map +1 -0
- package/dist/chat-ui/mentions/suggestions/components/mention-icon.cjs +95 -0
- package/dist/chat-ui/mentions/suggestions/components/mention-icon.cjs.map +1 -0
- package/dist/chat-ui/mentions/suggestions/components/mention-icon.d.ts +5 -0
- package/dist/chat-ui/mentions/suggestions/components/mention-icon.js +95 -0
- package/dist/chat-ui/mentions/suggestions/components/mention-icon.js.map +1 -0
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.cjs +116 -0
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.cjs.map +1 -0
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.js +116 -0
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.js.map +1 -0
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs +31 -0
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs.map +1 -0
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.js +31 -0
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.js.map +1 -0
- package/dist/chat-ui/mentions/suggestions/components/menu-breadcrumbs.cjs +27 -0
- package/dist/chat-ui/mentions/suggestions/components/menu-breadcrumbs.cjs.map +1 -0
- package/dist/chat-ui/mentions/suggestions/components/menu-breadcrumbs.js +27 -0
- package/dist/chat-ui/mentions/suggestions/components/menu-breadcrumbs.js.map +1 -0
- package/dist/chat-ui/mentions/suggestions/components/menu-item.cjs +62 -0
- package/dist/chat-ui/mentions/suggestions/components/menu-item.cjs.map +1 -0
- package/dist/chat-ui/mentions/suggestions/components/menu-item.js +62 -0
- package/dist/chat-ui/mentions/suggestions/components/menu-item.js.map +1 -0
- package/dist/chat-ui/mentions/suggestions/components/menu-list.cjs +63 -0
- package/dist/chat-ui/mentions/suggestions/components/menu-list.cjs.map +1 -0
- package/dist/chat-ui/mentions/suggestions/components/menu-list.js +63 -0
- package/dist/chat-ui/mentions/suggestions/components/menu-list.js.map +1 -0
- package/dist/chat-ui/mentions/suggestions/components/menu-skeleton.cjs +11 -0
- package/dist/chat-ui/mentions/suggestions/components/menu-skeleton.cjs.map +1 -0
- package/dist/chat-ui/mentions/suggestions/components/menu-skeleton.js +11 -0
- package/dist/chat-ui/mentions/suggestions/components/menu-skeleton.js.map +1 -0
- package/dist/chat-ui/mentions/suggestions/components/menu-summary.cjs +33 -0
- package/dist/chat-ui/mentions/suggestions/components/menu-summary.cjs.map +1 -0
- package/dist/chat-ui/mentions/suggestions/components/menu-summary.js +33 -0
- package/dist/chat-ui/mentions/suggestions/components/menu-summary.js.map +1 -0
- package/dist/chat-ui/mentions/suggestions/components/use-keyboard-navigation.cjs +58 -0
- package/dist/chat-ui/mentions/suggestions/components/use-keyboard-navigation.cjs.map +1 -0
- package/dist/chat-ui/mentions/suggestions/components/use-keyboard-navigation.js +58 -0
- package/dist/chat-ui/mentions/suggestions/components/use-keyboard-navigation.js.map +1 -0
- package/dist/chat-ui/mentions/suggestions/components/use-menu-navigation.cjs +81 -0
- package/dist/chat-ui/mentions/suggestions/components/use-menu-navigation.cjs.map +1 -0
- package/dist/chat-ui/mentions/suggestions/components/use-menu-navigation.js +81 -0
- package/dist/chat-ui/mentions/suggestions/components/use-menu-navigation.js.map +1 -0
- package/dist/chat-ui/mentions/suggestions/components/utils.cjs +18 -0
- package/dist/chat-ui/mentions/suggestions/components/utils.cjs.map +1 -0
- package/dist/chat-ui/mentions/suggestions/components/utils.js +18 -0
- package/dist/chat-ui/mentions/suggestions/components/utils.js.map +1 -0
- package/dist/chat-ui/mentions/suggestions/data/api-client.cjs +123 -0
- package/dist/chat-ui/mentions/suggestions/data/api-client.cjs.map +1 -0
- package/dist/chat-ui/mentions/suggestions/data/api-client.d.ts +10 -0
- package/dist/chat-ui/mentions/suggestions/data/api-client.js +123 -0
- package/dist/chat-ui/mentions/suggestions/data/api-client.js.map +1 -0
- package/dist/chat-ui/mentions/suggestions/data/item-cache.cjs +37 -0
- package/dist/chat-ui/mentions/suggestions/data/item-cache.cjs.map +1 -0
- package/dist/chat-ui/mentions/suggestions/data/item-cache.js +37 -0
- package/dist/chat-ui/mentions/suggestions/data/item-cache.js.map +1 -0
- package/dist/chat-ui/mentions/suggestions/data/orchestrator.cjs +134 -0
- package/dist/chat-ui/mentions/suggestions/data/orchestrator.cjs.map +1 -0
- package/dist/chat-ui/mentions/suggestions/data/orchestrator.js +134 -0
- package/dist/chat-ui/mentions/suggestions/data/orchestrator.js.map +1 -0
- package/dist/chat-ui/mentions/suggestions/data/scope-registry.cjs +91 -0
- package/dist/chat-ui/mentions/suggestions/data/scope-registry.cjs.map +1 -0
- package/dist/chat-ui/mentions/suggestions/data/scope-registry.js +91 -0
- package/dist/chat-ui/mentions/suggestions/data/scope-registry.js.map +1 -0
- package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.cjs +137 -0
- package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.cjs.map +1 -0
- package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.js +137 -0
- package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.js.map +1 -0
- package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs +375 -0
- package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs.map +1 -0
- package/dist/chat-ui/mentions/suggestions/data/sources/index.d.ts +16 -1
- package/dist/chat-ui/mentions/suggestions/data/sources/index.js +375 -0
- package/dist/chat-ui/mentions/suggestions/data/sources/index.js.map +1 -0
- package/dist/chat-ui/mentions/suggestions/data/types.cjs +9 -0
- package/dist/chat-ui/mentions/suggestions/data/types.cjs.map +1 -0
- package/dist/chat-ui/mentions/suggestions/data/types.d.ts +14 -0
- package/dist/chat-ui/mentions/suggestions/data/types.js +9 -0
- package/dist/chat-ui/mentions/suggestions/data/types.js.map +1 -0
- package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs +173 -0
- package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs.map +1 -0
- package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.d.ts +14 -4
- package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js +173 -0
- package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js.map +1 -0
- package/dist/chat-ui/mentions/suggestions/data/use-menu-items.cjs +45 -0
- package/dist/chat-ui/mentions/suggestions/data/use-menu-items.cjs.map +1 -0
- package/dist/chat-ui/mentions/suggestions/data/use-menu-items.js +45 -0
- package/dist/chat-ui/mentions/suggestions/data/use-menu-items.js.map +1 -0
- package/dist/chat-ui/mentions/suggestions/data/utils/filter-items.cjs +43 -0
- package/dist/chat-ui/mentions/suggestions/data/utils/filter-items.cjs.map +1 -0
- package/dist/chat-ui/mentions/suggestions/data/utils/filter-items.js +43 -0
- package/dist/chat-ui/mentions/suggestions/data/utils/filter-items.js.map +1 -0
- package/dist/chat-ui/mentions/suggestions/data/utils/match-query.cjs +14 -0
- package/dist/chat-ui/mentions/suggestions/data/utils/match-query.cjs.map +1 -0
- package/dist/chat-ui/mentions/suggestions/data/utils/match-query.js +14 -0
- package/dist/chat-ui/mentions/suggestions/data/utils/match-query.js.map +1 -0
- package/dist/chat-ui/mentions/suggestions/data/utils/score-match.cjs +48 -0
- package/dist/chat-ui/mentions/suggestions/data/utils/score-match.cjs.map +1 -0
- package/dist/chat-ui/mentions/suggestions/data/utils/score-match.js +48 -0
- package/dist/chat-ui/mentions/suggestions/data/utils/score-match.js.map +1 -0
- package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.cjs +71 -0
- package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.cjs.map +1 -0
- package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.js +71 -0
- package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.js.map +1 -0
- package/dist/chat-ui/messages/continue-pill.cjs +54 -0
- package/dist/chat-ui/messages/continue-pill.cjs.map +1 -0
- package/dist/chat-ui/messages/continue-pill.js +54 -0
- package/dist/chat-ui/messages/continue-pill.js.map +1 -0
- package/dist/chat-ui/messages/message-actions-config.cjs +12 -0
- package/dist/chat-ui/messages/message-actions-config.cjs.map +1 -0
- package/dist/chat-ui/messages/message-actions-config.js +12 -0
- package/dist/chat-ui/messages/message-actions-config.js.map +1 -0
- package/dist/chat-ui/messages/message-components.cjs +343 -0
- package/dist/chat-ui/messages/message-components.cjs.map +1 -0
- package/dist/chat-ui/messages/message-components.d.ts +13 -1
- package/dist/chat-ui/messages/message-components.js +343 -0
- package/dist/chat-ui/messages/message-components.js.map +1 -0
- package/dist/chat-ui/messages/running-indicator.cjs +49 -0
- package/dist/chat-ui/messages/running-indicator.cjs.map +1 -0
- package/dist/chat-ui/messages/running-indicator.js +49 -0
- package/dist/chat-ui/messages/running-indicator.js.map +1 -0
- package/dist/chat-ui/messages/runtime-message.cjs +65 -0
- package/dist/chat-ui/messages/runtime-message.cjs.map +1 -0
- package/dist/chat-ui/messages/runtime-message.js +65 -0
- package/dist/chat-ui/messages/runtime-message.js.map +1 -0
- package/dist/{statewire-continue-run-nE9VCKUh.cjs → chat-ui/messages/statewire-continue-run.cjs} +39 -16
- package/dist/chat-ui/messages/statewire-continue-run.cjs.map +1 -0
- package/dist/chat-ui/messages/statewire-continue-run.d.ts +5 -1
- package/dist/{statewire-continue-run-D34gS7_1.js → chat-ui/messages/statewire-continue-run.js} +29 -7
- package/dist/chat-ui/messages/statewire-continue-run.js.map +1 -0
- package/dist/chat-ui/messages/user-edit-composer.cjs +61 -0
- package/dist/chat-ui/messages/user-edit-composer.cjs.map +1 -0
- package/dist/chat-ui/messages/user-edit-composer.js +61 -0
- package/dist/chat-ui/messages/user-edit-composer.js.map +1 -0
- package/dist/chat-ui/messages/voice-delegation-card.cjs +51 -0
- package/dist/chat-ui/messages/voice-delegation-card.cjs.map +1 -0
- package/dist/chat-ui/messages/voice-delegation-card.d.ts +26 -0
- package/dist/chat-ui/messages/voice-delegation-card.js +51 -0
- package/dist/chat-ui/messages/voice-delegation-card.js.map +1 -0
- package/dist/chat-ui/statewire.cjs +39 -0
- package/dist/chat-ui/statewire.cjs.map +1 -0
- package/dist/chat-ui/statewire.js +39 -0
- package/dist/chat-ui/statewire.js.map +1 -0
- package/dist/chat-ui/thread/chat-composer-dock.cjs +37 -0
- package/dist/chat-ui/thread/chat-composer-dock.cjs.map +1 -0
- package/dist/chat-ui/thread/chat-composer-dock.js +37 -0
- package/dist/chat-ui/thread/chat-composer-dock.js.map +1 -0
- package/dist/chat-ui/thread/chat-thread-shell.cjs +102 -0
- package/dist/chat-ui/thread/chat-thread-shell.cjs.map +1 -0
- package/dist/chat-ui/thread/chat-thread-shell.js +102 -0
- package/dist/chat-ui/thread/chat-thread-shell.js.map +1 -0
- package/dist/chat-ui/thread/composer-send-or-stop.cjs +75 -0
- package/dist/chat-ui/thread/composer-send-or-stop.cjs.map +1 -0
- package/dist/chat-ui/thread/composer-send-or-stop.d.ts +0 -6
- package/dist/chat-ui/thread/composer-send-or-stop.js +75 -0
- package/dist/chat-ui/thread/composer-send-or-stop.js.map +1 -0
- package/dist/chat-ui/thread/statewire-history-edge.cjs +134 -0
- package/dist/chat-ui/thread/statewire-history-edge.cjs.map +1 -0
- package/dist/chat-ui/thread/statewire-history-edge.js +134 -0
- package/dist/chat-ui/thread/statewire-history-edge.js.map +1 -0
- package/dist/{collab.cjs → collab/client.cjs} +6 -166
- package/dist/collab/client.cjs.map +1 -0
- package/dist/{collab.js → collab/client.js} +5 -164
- package/dist/collab/client.js.map +1 -0
- package/dist/collab/close-policy.cjs +14 -0
- package/dist/collab/close-policy.cjs.map +1 -0
- package/dist/collab/close-policy.js +14 -0
- package/dist/collab/close-policy.js.map +1 -0
- package/dist/collab/index.cjs +17 -0
- package/dist/collab/index.cjs.map +1 -0
- package/dist/collab/index.js +17 -0
- package/dist/collab/index.js.map +1 -0
- package/dist/collab/mint.cjs +59 -0
- package/dist/collab/mint.cjs.map +1 -0
- package/dist/collab/mint.js +59 -0
- package/dist/collab/mint.js.map +1 -0
- package/dist/collab/react.cjs +58 -0
- package/dist/collab/react.cjs.map +1 -0
- package/dist/collab/react.js +58 -0
- package/dist/collab/react.js.map +1 -0
- package/dist/collab/shape.cjs +45 -0
- package/dist/collab/shape.cjs.map +1 -0
- package/dist/collab/shape.js +45 -0
- package/dist/collab/shape.js.map +1 -0
- package/dist/composer/AttachmentContext.cjs +40 -0
- package/dist/composer/AttachmentContext.cjs.map +1 -0
- package/dist/composer/AttachmentContext.js +40 -0
- package/dist/composer/AttachmentContext.js.map +1 -0
- package/dist/composer/ComposerAttachmentPreview.cjs +39 -0
- package/dist/composer/ComposerAttachmentPreview.cjs.map +1 -0
- package/dist/composer/ComposerAttachmentPreview.js +39 -0
- package/dist/composer/ComposerAttachmentPreview.js.map +1 -0
- package/dist/composer/ComposerDropZone.cjs +61 -0
- package/dist/composer/ComposerDropZone.cjs.map +1 -0
- package/dist/composer/ComposerDropZone.d.ts +1 -1
- package/dist/composer/ComposerDropZone.js +61 -0
- package/dist/composer/ComposerDropZone.js.map +1 -0
- package/dist/composer/ComposerQuotePreview.cjs +42 -0
- package/dist/composer/ComposerQuotePreview.cjs.map +1 -0
- package/dist/composer/ComposerQuotePreview.js +42 -0
- package/dist/composer/ComposerQuotePreview.js.map +1 -0
- package/dist/composer/FileUploadButton.cjs +65 -0
- package/dist/composer/FileUploadButton.cjs.map +1 -0
- package/dist/composer/FileUploadButton.d.ts +1 -1
- package/dist/composer/FileUploadButton.js +65 -0
- package/dist/composer/FileUploadButton.js.map +1 -0
- package/dist/composer/QuoteContext.cjs +68 -0
- package/dist/composer/QuoteContext.cjs.map +1 -0
- package/dist/composer/QuoteContext.js +68 -0
- package/dist/composer/QuoteContext.js.map +1 -0
- package/dist/composer/build-composed-message.cjs +25 -0
- package/dist/composer/build-composed-message.cjs.map +1 -0
- package/dist/composer/build-composed-message.js +25 -0
- package/dist/composer/build-composed-message.js.map +1 -0
- package/dist/composer/clipboard.cjs +62 -0
- package/dist/composer/clipboard.cjs.map +1 -0
- package/dist/composer/clipboard.d.ts +27 -3
- package/dist/composer/clipboard.js +62 -0
- package/dist/composer/clipboard.js.map +1 -0
- package/dist/composer/useAppendToComposer.cjs +21 -0
- package/dist/composer/useAppendToComposer.cjs.map +1 -0
- package/dist/composer/useAppendToComposer.js +21 -0
- package/dist/composer/useAppendToComposer.js.map +1 -0
- package/dist/composer/useAttachFiles.cjs +40 -0
- package/dist/composer/useAttachFiles.cjs.map +1 -0
- package/dist/composer/useAttachFiles.d.ts +24 -0
- package/dist/composer/useAttachFiles.js +40 -0
- package/dist/composer/useAttachFiles.js.map +1 -0
- package/dist/composer/useComposerAttachment.cjs +25 -0
- package/dist/composer/useComposerAttachment.cjs.map +1 -0
- package/dist/composer/useComposerAttachment.js +25 -0
- package/dist/composer/useComposerAttachment.js.map +1 -0
- package/dist/composer/useFileUpload.cjs +123 -0
- package/dist/composer/useFileUpload.cjs.map +1 -0
- package/dist/composer/useFileUpload.js +123 -0
- package/dist/composer/useFileUpload.js.map +1 -0
- package/dist/composer/useSendMessage.cjs +22 -0
- package/dist/composer/useSendMessage.cjs.map +1 -0
- package/dist/composer/useSendMessage.js +22 -0
- package/dist/composer/useSendMessage.js.map +1 -0
- package/dist/diagnostics/athena-diagnostics.cjs +329 -0
- package/dist/diagnostics/athena-diagnostics.cjs.map +1 -0
- package/dist/diagnostics/athena-diagnostics.js +329 -0
- package/dist/diagnostics/athena-diagnostics.js.map +1 -0
- package/dist/diagnostics/errors.cjs +89 -0
- package/dist/diagnostics/errors.cjs.map +1 -0
- package/dist/diagnostics/errors.js +89 -0
- package/dist/diagnostics/errors.js.map +1 -0
- package/dist/diagnostics/useAthenaDiagnostics.cjs +16 -0
- package/dist/diagnostics/useAthenaDiagnostics.cjs.map +1 -0
- package/dist/diagnostics/useAthenaDiagnostics.js +16 -0
- package/dist/diagnostics/useAthenaDiagnostics.js.map +1 -0
- package/dist/index.cjs +274 -27882
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +6 -4
- package/dist/index.js +161 -27759
- package/dist/index.js.map +1 -1
- package/dist/lib/athena-urls.cjs +194 -0
- package/dist/lib/athena-urls.cjs.map +1 -0
- package/dist/lib/athena-urls.d.ts +20 -5
- package/dist/lib/athena-urls.js +194 -0
- package/dist/lib/athena-urls.js.map +1 -0
- package/dist/lib/posthog/before-send.cjs +58 -0
- package/dist/lib/posthog/before-send.cjs.map +1 -0
- package/dist/lib/posthog/before-send.js +58 -0
- package/dist/lib/posthog/before-send.js.map +1 -0
- package/dist/lib/posthog/capture-gate.cjs +322 -0
- package/dist/lib/posthog/capture-gate.cjs.map +1 -0
- package/dist/lib/posthog/capture-gate.js +322 -0
- package/dist/lib/posthog/capture-gate.js.map +1 -0
- package/dist/lib/posthog/wrap-posthog-client.cjs +163 -0
- package/dist/lib/posthog/wrap-posthog-client.cjs.map +1 -0
- package/dist/lib/posthog/wrap-posthog-client.js +163 -0
- package/dist/lib/posthog/wrap-posthog-client.js.map +1 -0
- package/dist/lib/utils.cjs +12 -0
- package/dist/lib/utils.cjs.map +1 -0
- package/dist/lib/utils.js +9 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/node_modules/@assistant-ui/react-langchain/dist/converter.cjs +77 -0
- package/dist/node_modules/@assistant-ui/react-langchain/dist/converter.cjs.map +1 -0
- package/dist/node_modules/@assistant-ui/react-langchain/dist/converter.js +77 -0
- package/dist/node_modules/@assistant-ui/react-langchain/dist/converter.js.map +1 -0
- package/dist/node_modules/@assistant-ui/react-langgraph/dist/convertLangChainMessages.cjs +181 -0
- package/dist/node_modules/@assistant-ui/react-langgraph/dist/convertLangChainMessages.cjs.map +1 -0
- package/dist/node_modules/@assistant-ui/react-langgraph/dist/convertLangChainMessages.js +181 -0
- package/dist/node_modules/@assistant-ui/react-langgraph/dist/convertLangChainMessages.js.map +1 -0
- package/dist/packages/agent-runtime/src/asset-attachment.cjs +19 -0
- package/dist/packages/agent-runtime/src/asset-attachment.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/asset-attachment.js +19 -0
- package/dist/packages/agent-runtime/src/asset-attachment.js.map +1 -0
- package/dist/packages/agent-runtime/src/auth-denial.cjs +28 -0
- package/dist/packages/agent-runtime/src/auth-denial.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/auth-denial.js +28 -0
- package/dist/packages/agent-runtime/src/auth-denial.js.map +1 -0
- package/dist/packages/agent-runtime/src/client-tool-bridge.cjs +270 -0
- package/dist/packages/agent-runtime/src/client-tool-bridge.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/client-tool-bridge.js +270 -0
- package/dist/packages/agent-runtime/src/client-tool-bridge.js.map +1 -0
- package/dist/packages/agent-runtime/src/client-tools.cjs +137 -0
- package/dist/packages/agent-runtime/src/client-tools.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/client-tools.js +137 -0
- package/dist/packages/agent-runtime/src/client-tools.js.map +1 -0
- package/dist/packages/agent-runtime/src/conversation-index.cjs +80 -0
- package/dist/packages/agent-runtime/src/conversation-index.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/conversation-index.js +80 -0
- package/dist/packages/agent-runtime/src/conversation-index.js.map +1 -0
- package/dist/packages/agent-runtime/src/conversation-list.cjs +86 -0
- package/dist/packages/agent-runtime/src/conversation-list.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/conversation-list.js +86 -0
- package/dist/packages/agent-runtime/src/conversation-list.js.map +1 -0
- package/dist/packages/agent-runtime/src/deep-agent-transport-recipe.cjs +55 -0
- package/dist/packages/agent-runtime/src/deep-agent-transport-recipe.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/deep-agent-transport-recipe.js +55 -0
- package/dist/packages/agent-runtime/src/deep-agent-transport-recipe.js.map +1 -0
- package/dist/packages/agent-runtime/src/edit-command.cjs +89 -0
- package/dist/packages/agent-runtime/src/edit-command.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/edit-command.js +89 -0
- package/dist/packages/agent-runtime/src/edit-command.js.map +1 -0
- package/dist/packages/agent-runtime/src/errors.cjs +95 -0
- package/dist/packages/agent-runtime/src/errors.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/errors.js +95 -0
- package/dist/packages/agent-runtime/src/errors.js.map +1 -0
- package/dist/packages/agent-runtime/src/generated/runconfig-contract.cjs +236 -0
- package/dist/packages/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/generated/runconfig-contract.js +236 -0
- package/dist/packages/agent-runtime/src/generated/runconfig-contract.js.map +1 -0
- package/dist/packages/agent-runtime/src/interrupts.cjs +117 -0
- package/dist/packages/agent-runtime/src/interrupts.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/interrupts.js +117 -0
- package/dist/packages/agent-runtime/src/interrupts.js.map +1 -0
- package/dist/packages/agent-runtime/src/message-author.cjs +31 -0
- package/dist/packages/agent-runtime/src/message-author.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/message-author.js +31 -0
- package/dist/packages/agent-runtime/src/message-author.js.map +1 -0
- package/dist/packages/agent-runtime/src/message-window.cjs +85 -0
- package/dist/packages/agent-runtime/src/message-window.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/message-window.js +85 -0
- package/dist/packages/agent-runtime/src/message-window.js.map +1 -0
- package/dist/packages/agent-runtime/src/messages.cjs +433 -0
- package/dist/packages/agent-runtime/src/messages.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/messages.js +433 -0
- package/dist/packages/agent-runtime/src/messages.js.map +1 -0
- package/dist/packages/agent-runtime/src/model-context.cjs +13 -0
- package/dist/packages/agent-runtime/src/model-context.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/model-context.js +13 -0
- package/dist/packages/agent-runtime/src/model-context.js.map +1 -0
- package/dist/packages/agent-runtime/src/optimistic-content.cjs +17 -0
- package/dist/packages/agent-runtime/src/optimistic-content.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/optimistic-content.js +17 -0
- package/dist/packages/agent-runtime/src/optimistic-content.js.map +1 -0
- package/dist/packages/agent-runtime/src/protocol.cjs +33 -0
- package/dist/packages/agent-runtime/src/protocol.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/protocol.js +33 -0
- package/dist/packages/agent-runtime/src/protocol.js.map +1 -0
- package/dist/packages/agent-runtime/src/queue.cjs +67 -0
- package/dist/packages/agent-runtime/src/queue.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/queue.js +67 -0
- package/dist/packages/agent-runtime/src/queue.js.map +1 -0
- package/dist/packages/agent-runtime/src/quota-safe-local-storage-session.cjs +47 -0
- package/dist/packages/agent-runtime/src/quota-safe-local-storage-session.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/quota-safe-local-storage-session.js +47 -0
- package/dist/packages/agent-runtime/src/quota-safe-local-storage-session.js.map +1 -0
- package/dist/packages/agent-runtime/src/runtime-messages.cjs +187 -0
- package/dist/packages/agent-runtime/src/runtime-messages.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/runtime-messages.js +187 -0
- package/dist/packages/agent-runtime/src/runtime-messages.js.map +1 -0
- package/dist/packages/agent-runtime/src/send-recovery.cjs +128 -0
- package/dist/packages/agent-runtime/src/send-recovery.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/send-recovery.js +128 -0
- package/dist/packages/agent-runtime/src/send-recovery.js.map +1 -0
- package/dist/packages/agent-runtime/src/statewire-attach-observer.cjs +249 -0
- package/dist/packages/agent-runtime/src/statewire-attach-observer.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/statewire-attach-observer.js +249 -0
- package/dist/packages/agent-runtime/src/statewire-attach-observer.js.map +1 -0
- package/dist/packages/agent-runtime/src/statewire-state.cjs +16 -0
- package/dist/packages/agent-runtime/src/statewire-state.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/statewire-state.js +16 -0
- package/dist/packages/agent-runtime/src/statewire-state.js.map +1 -0
- package/dist/packages/agent-runtime/src/statewire-suspended.cjs +41 -0
- package/dist/packages/agent-runtime/src/statewire-suspended.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/statewire-suspended.js +41 -0
- package/dist/packages/agent-runtime/src/statewire-suspended.js.map +1 -0
- package/dist/packages/agent-runtime/src/statewire-transport.cjs +6 -0
- package/dist/packages/agent-runtime/src/statewire-transport.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/statewire-transport.js +6 -0
- package/dist/packages/agent-runtime/src/statewire-transport.js.map +1 -0
- package/dist/packages/agent-runtime/src/streaming-markdown.cjs +214 -0
- package/dist/packages/agent-runtime/src/streaming-markdown.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/streaming-markdown.js +214 -0
- package/dist/packages/agent-runtime/src/streaming-markdown.js.map +1 -0
- package/dist/packages/agent-runtime/src/thread-extras.cjs +38 -0
- package/dist/packages/agent-runtime/src/thread-extras.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/thread-extras.js +38 -0
- package/dist/packages/agent-runtime/src/thread-extras.js.map +1 -0
- package/dist/packages/agent-runtime/src/thread-snapshot-cache.cjs +90 -0
- package/dist/packages/agent-runtime/src/thread-snapshot-cache.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/thread-snapshot-cache.js +90 -0
- package/dist/packages/agent-runtime/src/thread-snapshot-cache.js.map +1 -0
- package/dist/packages/agent-runtime/src/thread-status.cjs +49 -0
- package/dist/packages/agent-runtime/src/thread-status.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/thread-status.js +49 -0
- package/dist/packages/agent-runtime/src/thread-status.js.map +1 -0
- package/dist/packages/agent-runtime/src/tool-metadata.cjs +1802 -0
- package/dist/packages/agent-runtime/src/tool-metadata.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/tool-metadata.js +1802 -0
- package/dist/packages/agent-runtime/src/tool-metadata.js.map +1 -0
- package/dist/packages/agent-runtime/src/tool-outputs.cjs +46 -0
- package/dist/packages/agent-runtime/src/tool-outputs.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/tool-outputs.js +46 -0
- package/dist/packages/agent-runtime/src/tool-outputs.js.map +1 -0
- package/dist/packages/agent-runtime/src/tool-result.cjs +151 -0
- package/dist/packages/agent-runtime/src/tool-result.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/tool-result.js +151 -0
- package/dist/packages/agent-runtime/src/tool-result.js.map +1 -0
- package/dist/packages/agent-runtime/src/use-conversation-list.cjs +139 -0
- package/dist/packages/agent-runtime/src/use-conversation-list.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/use-conversation-list.js +139 -0
- package/dist/packages/agent-runtime/src/use-conversation-list.js.map +1 -0
- package/dist/packages/agent-runtime/src/use-deep-agent-edit-submit.cjs +28 -0
- package/dist/packages/agent-runtime/src/use-deep-agent-edit-submit.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/use-deep-agent-edit-submit.js +28 -0
- package/dist/packages/agent-runtime/src/use-deep-agent-edit-submit.js.map +1 -0
- package/dist/packages/agent-runtime/src/use-deep-agent-runtime.cjs +138 -0
- package/dist/packages/agent-runtime/src/use-deep-agent-runtime.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/use-deep-agent-runtime.js +138 -0
- package/dist/packages/agent-runtime/src/use-deep-agent-runtime.js.map +1 -0
- package/dist/packages/agent-runtime/src/use-deep-agent-thread.cjs +387 -0
- package/dist/packages/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/use-deep-agent-thread.js +387 -0
- package/dist/packages/agent-runtime/src/use-deep-agent-thread.js.map +1 -0
- package/dist/packages/agent-runtime/src/use-deep-agent-window-sync.cjs +133 -0
- package/dist/packages/agent-runtime/src/use-deep-agent-window-sync.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/use-deep-agent-window-sync.js +133 -0
- package/dist/packages/agent-runtime/src/use-deep-agent-window-sync.js.map +1 -0
- package/dist/packages/agent-runtime/src/voice-presentation.cjs +37 -0
- package/dist/packages/agent-runtime/src/voice-presentation.cjs.map +1 -0
- package/dist/packages/agent-runtime/src/voice-presentation.js +37 -0
- package/dist/packages/agent-runtime/src/voice-presentation.js.map +1 -0
- package/dist/packages/react/package.json.cjs +9 -0
- package/dist/packages/react/package.json.cjs.map +1 -0
- package/dist/packages/react/package.json.js +9 -0
- package/dist/packages/react/package.json.js.map +1 -0
- package/dist/{AthenaContext-B1QMhIP-.cjs → provider/AthenaContext.cjs} +5 -4
- package/dist/provider/AthenaContext.cjs.map +1 -0
- package/dist/{AthenaContext-MOslgOmE.js → provider/AthenaContext.js} +3 -3
- package/dist/provider/AthenaContext.js.map +1 -0
- package/dist/provider/AthenaProvider.cjs +403 -0
- package/dist/provider/AthenaProvider.cjs.map +1 -0
- package/dist/provider/AthenaProvider.js +403 -0
- package/dist/provider/AthenaProvider.js.map +1 -0
- package/dist/provider/PostHogProvider.cjs +81 -0
- package/dist/provider/PostHogProvider.cjs.map +1 -0
- package/dist/provider/PostHogProvider.js +59 -0
- package/dist/provider/PostHogProvider.js.map +1 -0
- package/dist/provider/config.d.ts +8 -7
- package/dist/provider/statewire-lifecycle-context.cjs +10 -0
- package/dist/provider/statewire-lifecycle-context.cjs.map +1 -0
- package/dist/provider/statewire-lifecycle-context.js +10 -0
- package/dist/provider/statewire-lifecycle-context.js.map +1 -0
- package/dist/provider/statewire-window-context.cjs +10 -0
- package/dist/provider/statewire-window-context.cjs.map +1 -0
- package/dist/provider/statewire-window-context.js +10 -0
- package/dist/provider/statewire-window-context.js.map +1 -0
- package/dist/runtime/auth.cjs +309 -0
- package/dist/runtime/auth.cjs.map +1 -0
- package/dist/runtime/auth.d.ts +19 -18
- package/dist/runtime/auth.js +309 -0
- package/dist/runtime/auth.js.map +1 -0
- package/dist/runtime/statewire-auth-headers.cjs +18 -0
- package/dist/runtime/statewire-auth-headers.cjs.map +1 -0
- package/dist/runtime/statewire-auth-headers.js +18 -0
- package/dist/runtime/statewire-auth-headers.js.map +1 -0
- package/dist/runtime/statewire-lifecycle.cjs +67 -0
- package/dist/runtime/statewire-lifecycle.cjs.map +1 -0
- package/dist/runtime/statewire-lifecycle.js +67 -0
- package/dist/runtime/statewire-lifecycle.js.map +1 -0
- package/dist/runtime/statewire-run-config.cjs +68 -0
- package/dist/runtime/statewire-run-config.cjs.map +1 -0
- package/dist/runtime/statewire-run-config.js +68 -0
- package/dist/runtime/statewire-run-config.js.map +1 -0
- package/dist/runtime/statewire-session-key.cjs +11 -0
- package/dist/runtime/statewire-session-key.cjs.map +1 -0
- package/dist/runtime/statewire-session-key.js +11 -0
- package/dist/runtime/statewire-session-key.js.map +1 -0
- package/dist/runtime/useAthenaStatewireRuntime.cjs +179 -0
- package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -0
- package/dist/runtime/useAthenaStatewireRuntime.js +180 -0
- package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/theme/index.cjs +182 -0
- package/dist/theme/index.cjs.map +1 -0
- package/dist/theme/index.js +182 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/threads/ThreadList.cjs +55 -0
- package/dist/threads/ThreadList.cjs.map +1 -0
- package/dist/threads/ThreadList.js +55 -0
- package/dist/threads/ThreadList.js.map +1 -0
- package/dist/threads/api.cjs +208 -0
- package/dist/threads/api.cjs.map +1 -0
- package/dist/threads/api.js +208 -0
- package/dist/threads/api.js.map +1 -0
- package/dist/threads/conversation-list-fetcher.cjs +70 -0
- package/dist/threads/conversation-list-fetcher.cjs.map +1 -0
- package/dist/threads/conversation-list-fetcher.js +70 -0
- package/dist/threads/conversation-list-fetcher.js.map +1 -0
- package/dist/threads/mint-thread-id.cjs +7 -0
- package/dist/threads/mint-thread-id.cjs.map +1 -0
- package/dist/threads/mint-thread-id.js +7 -0
- package/dist/threads/mint-thread-id.js.map +1 -0
- package/dist/threads/statewire-thread-list.cjs +231 -0
- package/dist/threads/statewire-thread-list.cjs.map +1 -0
- package/dist/threads/statewire-thread-list.js +231 -0
- package/dist/threads/statewire-thread-list.js.map +1 -0
- package/dist/threads/thread-id-context.cjs +22 -0
- package/dist/threads/thread-id-context.cjs.map +1 -0
- package/dist/threads/thread-id-context.d.ts +9 -0
- package/dist/threads/thread-id-context.js +22 -0
- package/dist/threads/thread-id-context.js.map +1 -0
- package/dist/threads/title.cjs +95 -0
- package/dist/threads/title.cjs.map +1 -0
- package/dist/threads/title.js +95 -0
- package/dist/threads/title.js.map +1 -0
- package/dist/threads/use-rest-conversation-history.cjs +79 -0
- package/dist/threads/use-rest-conversation-history.cjs.map +1 -0
- package/dist/threads/use-rest-conversation-history.js +79 -0
- package/dist/threads/use-rest-conversation-history.js.map +1 -0
- package/dist/threads/use-statewire-conversation-history.cjs +243 -0
- package/dist/threads/use-statewire-conversation-history.cjs.map +1 -0
- package/dist/threads/use-statewire-conversation-history.js +243 -0
- package/dist/threads/use-statewire-conversation-history.js.map +1 -0
- package/dist/threads/useAthenaThreadManager.cjs +24 -0
- package/dist/threads/useAthenaThreadManager.cjs.map +1 -0
- package/dist/threads/useAthenaThreadManager.js +24 -0
- package/dist/threads/useAthenaThreadManager.js.map +1 -0
- package/dist/toolkits/index.cjs +279 -0
- package/dist/toolkits/index.cjs.map +1 -0
- package/dist/toolkits/index.js +279 -0
- package/dist/toolkits/index.js.map +1 -0
- package/dist/tools/NestedPtcMessages.cjs +46 -0
- package/dist/tools/NestedPtcMessages.cjs.map +1 -0
- package/dist/tools/NestedPtcMessages.js +46 -0
- package/dist/tools/NestedPtcMessages.js.map +1 -0
- package/dist/tools/append-document-tool-ui.cjs +145 -0
- package/dist/tools/append-document-tool-ui.cjs.map +1 -0
- package/dist/tools/append-document-tool-ui.js +145 -0
- package/dist/tools/append-document-tool-ui.js.map +1 -0
- package/dist/tools/asset-utils.cjs +16 -0
- package/dist/tools/asset-utils.cjs.map +1 -0
- package/dist/tools/asset-utils.js +16 -0
- package/dist/tools/asset-utils.js.map +1 -0
- package/dist/tools/auto-open-tools.cjs +121 -0
- package/dist/tools/auto-open-tools.cjs.map +1 -0
- package/dist/tools/auto-open-tools.js +121 -0
- package/dist/tools/auto-open-tools.js.map +1 -0
- package/dist/tools/file-tool-uis.cjs +108 -0
- package/dist/tools/file-tool-uis.cjs.map +1 -0
- package/dist/tools/file-tool-uis.js +108 -0
- package/dist/tools/file-tool-uis.js.map +1 -0
- package/dist/tools/index.cjs +56 -0
- package/dist/tools/index.cjs.map +1 -0
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.js +56 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/misc-tool-uis.cjs +54 -0
- package/dist/tools/misc-tool-uis.cjs.map +1 -0
- package/dist/{misc-tool-uis-gAiQw0Yl.js → tools/misc-tool-uis.js} +17 -7
- package/dist/tools/misc-tool-uis.js.map +1 -0
- package/dist/tools/primitives.cjs +166 -0
- package/dist/tools/primitives.cjs.map +1 -0
- package/dist/tools/primitives.js +166 -0
- package/dist/tools/primitives.js.map +1 -0
- package/dist/tools/read-asset-tool-ui.cjs +284 -0
- package/dist/tools/read-asset-tool-ui.cjs.map +1 -0
- package/dist/tools/read-asset-tool-ui.js +284 -0
- package/dist/tools/read-asset-tool-ui.js.map +1 -0
- package/dist/tools/todo-plan-store.cjs +88 -0
- package/dist/tools/todo-plan-store.cjs.map +1 -0
- package/dist/tools/todo-plan-store.js +88 -0
- package/dist/tools/todo-plan-store.js.map +1 -0
- package/dist/tools/tool-fallback.cjs +667 -0
- package/dist/tools/tool-fallback.cjs.map +1 -0
- package/dist/tools/tool-fallback.js +667 -0
- package/dist/tools/tool-fallback.js.map +1 -0
- package/dist/tools/tool-icons.cjs +61 -0
- package/dist/tools/tool-icons.cjs.map +1 -0
- package/dist/tools/tool-icons.js +61 -0
- package/dist/tools/tool-icons.js.map +1 -0
- package/dist/tools/tool-uis.cjs +3049 -0
- package/dist/tools/tool-uis.cjs.map +1 -0
- package/dist/tools/tool-uis.js +3049 -0
- package/dist/tools/tool-uis.js.map +1 -0
- package/dist/tools/voice-update-tool-ui.cjs +89 -0
- package/dist/tools/voice-update-tool-ui.cjs.map +1 -0
- package/dist/tools/voice-update-tool-ui.d.ts +27 -0
- package/dist/tools/voice-update-tool-ui.js +89 -0
- package/dist/tools/voice-update-tool-ui.js.map +1 -0
- package/dist/tools/write-todos-tool-ui.cjs +270 -0
- package/dist/tools/write-todos-tool-ui.cjs.map +1 -0
- package/dist/tools/write-todos-tool-ui.js +270 -0
- package/dist/tools/write-todos-tool-ui.js.map +1 -0
- package/dist/ui/button.cjs +57 -0
- package/dist/ui/button.cjs.map +1 -0
- package/dist/ui/button.js +57 -0
- package/dist/ui/button.js.map +1 -0
- package/dist/ui/collapsible.cjs +17 -0
- package/dist/ui/collapsible.cjs.map +1 -0
- package/dist/ui/collapsible.js +17 -0
- package/dist/ui/collapsible.js.map +1 -0
- package/dist/ui/tooltip.cjs +48 -0
- package/dist/ui/tooltip.cjs.map +1 -0
- package/dist/ui/tooltip.js +48 -0
- package/dist/ui/tooltip.js.map +1 -0
- package/dist/version.cjs +6 -0
- package/dist/version.cjs.map +1 -0
- package/dist/version.js +6 -0
- package/dist/version.js.map +1 -0
- package/package.json +18 -20
- package/dist/AthenaAuthContext-B3AwLA5Z.cjs.map +0 -1
- package/dist/AthenaAuthContext-DQsdayH2.js.map +0 -1
- package/dist/AthenaContext-B1QMhIP-.cjs.map +0 -1
- package/dist/AthenaContext-MOslgOmE.js.map +0 -1
- package/dist/SuperGroupingCard-BsWbHyV_.js +0 -795
- package/dist/SuperGroupingCard-BsWbHyV_.js.map +0 -1
- package/dist/SuperGroupingCard-CRRFUgjN.cjs +0 -794
- package/dist/SuperGroupingCard-CRRFUgjN.cjs.map +0 -1
- package/dist/auth.cjs.map +0 -1
- package/dist/auth.js.map +0 -1
- package/dist/chat/ComposerEditorContext.d.ts +0 -36
- package/dist/chat/tiptap-composer.d.ts +0 -7
- package/dist/chat-ui-statewire.cjs +0 -25
- package/dist/chat-ui-statewire.cjs.map +0 -1
- package/dist/chat-ui-statewire.js +0 -25
- package/dist/chat-ui-statewire.js.map +0 -1
- package/dist/chat-ui.cjs +0 -2484
- package/dist/chat-ui.cjs.map +0 -1
- package/dist/chat-ui.js +0 -2486
- package/dist/chat-ui.js.map +0 -1
- package/dist/collab.cjs.map +0 -1
- package/dist/collab.js.map +0 -1
- package/dist/mentions/composer-keybinds.d.ts +0 -5
- package/dist/mentions/mention-extension.d.ts +0 -6
- package/dist/mentions/mention-icons.d.ts +0 -4
- package/dist/mentions/mention-node-view.d.ts +0 -2
- package/dist/mentions/mention-suggestion-list.d.ts +0 -14
- package/dist/mentions/mention-suggestion-popup.d.ts +0 -15
- package/dist/mentions/mention-suggestions-extension.d.ts +0 -11
- package/dist/mentions/mention-types.d.ts +0 -21
- package/dist/mentions/mention-utils.d.ts +0 -23
- package/dist/mentions/use-mention-suggestions.d.ts +0 -29
- package/dist/misc-tool-uis-B2e0Okkn.cjs +0 -43
- package/dist/misc-tool-uis-B2e0Okkn.cjs.map +0 -1
- package/dist/misc-tool-uis-gAiQw0Yl.js.map +0 -1
- package/dist/statewire-continue-run-D34gS7_1.js.map +0 -1
- package/dist/statewire-continue-run-nE9VCKUh.cjs.map +0 -1
- package/dist/statewire-history-edge-C8uyTEjX.cjs +0 -1711
- package/dist/statewire-history-edge-C8uyTEjX.cjs.map +0 -1
- package/dist/statewire-history-edge-CPohUKMt.js +0 -1712
- package/dist/statewire-history-edge-CPohUKMt.js.map +0 -1
- package/dist/super-grouping.cjs +0 -22
- package/dist/super-grouping.cjs.map +0 -1
- package/dist/super-grouping.js +0 -22
- package/dist/super-grouping.js.map +0 -1
- package/dist/tool-fallback-DkQ3DLkn.js +0 -4281
- package/dist/tool-fallback-DkQ3DLkn.js.map +0 -1
- package/dist/tool-fallback-kfhpJQZa.cjs +0 -4297
- package/dist/tool-fallback-kfhpJQZa.cjs.map +0 -1
- package/dist/tools.cjs +0 -41
- package/dist/tools.cjs.map +0 -1
- package/dist/tools.js +0 -41
- package/dist/tools.js.map +0 -1
- package/dist/trash-2-B5OaNAL7.cjs +0 -5096
- package/dist/trash-2-B5OaNAL7.cjs.map +0 -1
- package/dist/trash-2-CCwSURL-.js +0 -5081
- package/dist/trash-2-CCwSURL-.js.map +0 -1
- package/dist/use-rest-conversation-history-Cm8qMRxp.cjs +0 -32397
- package/dist/use-rest-conversation-history-Cm8qMRxp.cjs.map +0 -1
- package/dist/use-rest-conversation-history-veDZS-oL.js +0 -32361
- package/dist/use-rest-conversation-history-veDZS-oL.js.map +0 -1
- package/dist/wrench-BEf72cyP.cjs +0 -417
- package/dist/wrench-BEf72cyP.cjs.map +0 -1
- package/dist/wrench-CbrOlVYm.js +0 -418
- package/dist/wrench-CbrOlVYm.js.map +0 -1
- package/dist/x-Dfd2NzK0.cjs +0 -42
- package/dist/x-Dfd2NzK0.cjs.map +0 -1
- package/dist/x-_DntAa_a.js +0 -43
- package/dist/x-_DntAa_a.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-uis.cjs","sources":["../../src/tools/tool-uis.tsx"],"sourcesContent":["\"use client\";\n\nimport { athenaDiagnostics } from \"../diagnostics/athena-diagnostics\";\nimport { type FC, memo, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { ToolCallMessagePartComponent } from \"@assistant-ui/react\";\nimport {\n AlertCircleIcon,\n AlertTriangleIcon,\n BarChart3Icon,\n BookOpenIcon,\n CameraIcon,\n CheckCircle2Icon,\n ChevronDownIcon,\n ClipboardCopyIcon,\n CodeIcon,\n DatabaseIcon,\n ExternalLinkIcon,\n FileTextIcon,\n FolderOpenIcon,\n GlobeIcon,\n ImageIcon,\n LoaderIcon,\n MailIcon,\n Maximize2Icon,\n FilePlusIcon,\n PlayIcon,\n PresentationIcon,\n ScissorsIcon,\n SearchIcon,\n SheetIcon,\n TableIcon,\n TablePropertiesIcon,\n TerminalIcon,\n XIcon,\n} from \"lucide-react\";\nimport { cn } from \"../lib/utils\";\nimport {\n ExpandableSection,\n formatToolName,\n normalizeResult,\n ToolCard,\n type ToolStatus,\n truncate,\n tryParseJson,\n} from \"./primitives\";\nimport {\n EditFileToolUI,\n ListFilesToolUI,\n ReadFileToolUI,\n SearchFilesToolUI,\n WriteFileToolUI,\n} from \"./file-tool-uis\";\nimport { WriteTodosToolUI } from \"./write-todos-tool-ui\";\nimport { InstallPackageToolUI } from \"./misc-tool-uis\";\nimport {\n useAssetPanelStore,\n type AssetType,\n} from \"../assets/asset-panel-store\";\nimport { useAthenaConfig } from \"../provider/AthenaContext\";\n\n// The shared card shell and result helpers live in ./primitives (so the\n// file tool UIs can use them without importing this registry); re-exported\n// here for the hosts that reached them through this module.\nexport {\n ExpandableSection,\n formatToolName,\n normalizeResult,\n ToolCard,\n type ToolStatus,\n truncate,\n} from \"./primitives\";\n\n// ─── Helpers ─────────────────────────────────────────────────────────\n\nfunction isSdkToolDebugEnabled(): boolean {\n const env = (import.meta as ImportMeta & { env?: { DEV?: boolean } }).env;\n if (env?.DEV) {\n return true;\n }\n\n try {\n const hostname = globalThis.location?.hostname;\n if (\n hostname === \"localhost\" ||\n hostname === \"127.0.0.1\" ||\n hostname === \"::1\"\n ) {\n return true;\n }\n return globalThis.localStorage?.getItem(\"athena:sdk:debug\") === \"1\";\n } catch {\n return false;\n }\n}\n\nfunction stringifyDebugPayload(payload: Record<string, unknown>): string {\n return JSON.stringify(payload, (_key, value) => {\n if (typeof value === \"string\" && value.length > 800) {\n return `${value.slice(0, 800)}... [truncated ${value.length - 800} chars]`;\n }\n return value;\n });\n}\n\nfunction logDebugPayload(label: string, payload: Record<string, unknown>) {\n if (!isSdkToolDebugEnabled()) {\n return;\n }\n athenaDiagnostics.emit(\"tools.debug\", {\n level: \"debug\",\n data: { label, payload: stringifyDebugPayload(payload) },\n });\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────\n\n// ─── Web Search Tool UI ──────────────────────────────────────────────\n\ninterface SearchResult {\n title?: string;\n url?: string;\n content?: string;\n snippet?: string;\n}\n\nfunction parseSearchResults(data: Record<string, unknown>): SearchResult[] {\n const results = (data.results ??\n data.search_results ??\n data.items ??\n data.limited_results) as unknown[] | undefined;\n if (!Array.isArray(results)) return [];\n return results.slice(0, 8).map((r) => {\n const item = r as Record<string, unknown>;\n return {\n title: (item.title ?? item.name) as string | undefined,\n url: (item.url ?? item.link ?? item.href) as string | undefined,\n content: (item.content ?? item.snippet ?? item.description) as\n | string\n | undefined,\n };\n });\n}\n\nconst WebSearchToolUIImpl: ToolCallMessagePartComponent = ({\n toolName,\n args,\n result,\n status,\n}) => {\n const typedArgs = args as Record<string, unknown> | undefined;\n const query = (typedArgs?.query ?? typedArgs?.search_query ?? \"\") as string;\n const data = useMemo(() => normalizeResult(result), [result]);\n const results = useMemo(() => (data ? parseSearchResults(data) : []), [data]);\n\n const isRunning = status?.type === \"running\";\n const isComplete = status?.type === \"complete\";\n const errorMsg =\n status?.type === \"incomplete\" ? (status.error as string) : null;\n\n return (\n <ToolCard\n icon={SearchIcon}\n status={status?.type ?? \"complete\"}\n title={isRunning ? \"Searching the web...\" : \"Web search\"}\n subtitle={query ? truncate(query, 80) : undefined}\n toolName={toolName}\n args={typedArgs as Record<string, unknown>}\n result={result}\n badge={\n isComplete && results.length > 0\n ? `${results.length} results`\n : undefined\n }\n error={errorMsg}\n >\n {isComplete && results.length > 0 && (\n <ExpandableSection label=\"Show search results\">\n <div className=\"flex flex-col gap-2.5\">\n {results.map((r, i) => (\n <div key={i} className=\"flex flex-col gap-0.5\">\n <div className=\"flex items-center gap-1.5\">\n {r.url && /^https?:\\/\\//i.test(r.url) ? (\n <a\n href={r.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-[12px] font-medium text-blue-600 hover:underline\"\n >\n {r.title || r.url}\n </a>\n ) : (\n <span className=\"text-[12px] font-medium text-foreground\">\n {r.title || r.url || \"Result\"}\n </span>\n )}\n {r.url && (\n <ExternalLinkIcon className=\"size-3 shrink-0 text-muted-foreground\" />\n )}\n </div>\n {r.url && (\n <span className=\"text-[10px] text-muted-foreground\">\n {truncate(r.url, 60)}\n </span>\n )}\n {r.content && (\n <p className=\"text-[11px] leading-relaxed text-muted-foreground\">\n {truncate(r.content, 200)}\n </p>\n )}\n </div>\n ))}\n </div>\n </ExpandableSection>\n )}\n </ToolCard>\n );\n};\n\nexport const WebSearchToolUI = memo(\n WebSearchToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nWebSearchToolUI.displayName = \"WebSearchToolUI\";\n\n// ─── Browse Tool UI ──────────────────────────────────────────────────\n\nconst BrowseToolUIImpl: ToolCallMessagePartComponent = ({\n toolName,\n args,\n result,\n status,\n}) => {\n const typedArgs = args as Record<string, unknown> | undefined;\n const url = (typedArgs?.url ?? typedArgs?.page_url ?? \"\") as string;\n const data = useMemo(() => normalizeResult(result), [result]);\n const pageTitle = (data?.title ?? data?.page_title) as string | undefined;\n const pageContent = (data?.content ?? data?.text ?? data?.page_text) as\n | string\n | undefined;\n\n const isRunning = status?.type === \"running\";\n const isComplete = status?.type === \"complete\";\n const errorMsg =\n status?.type === \"incomplete\" ? (status.error as string) : null;\n\n const displayUrl = useMemo(() => {\n if (!url) return undefined;\n try {\n const parsed = new URL(url);\n return parsed.hostname + (parsed.pathname !== \"/\" ? parsed.pathname : \"\");\n } catch {\n return truncate(url, 60);\n }\n }, [url]);\n\n return (\n <ToolCard\n icon={GlobeIcon}\n status={status?.type ?? \"complete\"}\n title={\n isRunning\n ? \"Browsing page...\"\n : pageTitle\n ? truncate(pageTitle, 50)\n : \"Browsed page\"\n }\n subtitle={displayUrl}\n toolName={toolName}\n args={typedArgs as Record<string, unknown>}\n result={result}\n error={errorMsg}\n >\n {isComplete && pageContent && (\n <ExpandableSection label=\"Show page content\">\n <pre className=\"whitespace-pre-wrap break-words text-[11px] leading-relaxed text-muted-foreground\">\n {truncate(pageContent, 3000)}\n </pre>\n </ExpandableSection>\n )}\n </ToolCard>\n );\n};\n\nexport const BrowseToolUI = memo(\n BrowseToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nBrowseToolUI.displayName = \"BrowseToolUI\";\n\n// ─── Email Search Tool UI ────────────────────────────────────────────\n\ninterface EmailResult {\n subject?: string;\n from?: string;\n date?: string;\n snippet?: string;\n isDraft?: boolean;\n}\n\nfunction parseEmailResults(data: Record<string, unknown>): EmailResult[] {\n const results = (data.limited_results ??\n data.results ??\n data.emails ??\n data.messages) as unknown[] | undefined;\n if (!Array.isArray(results)) return [];\n return results.slice(0, 50).flatMap((r) => {\n const item = asRecord(r);\n if (!item) return [];\n return [\n {\n subject: asString(item.subject) ?? asString(item.title),\n from:\n asString(item.from) ??\n asString(item.sender) ??\n asString(item.from_email),\n date:\n asString(item.date) ??\n asString(item.received_at) ??\n asString(item.sent_at),\n snippet:\n asString(item.snippet) ??\n asString(item.preview) ??\n asString(item.body_preview),\n isDraft: item.is_draft === true,\n },\n ];\n });\n}\n\n/** Short human date for an email row: \"Aug 24\" this year, \"Aug 24, 2025\"\n * otherwise, time-of-day for today. Unparseable input passes through. */\nexport function formatEmailDate(raw: string | undefined): string | undefined {\n if (!raw) return undefined;\n // A date-only string (\"2026-08-24\") parses as UTC midnight, which renders\n // as the PREVIOUS day west of UTC — construct it in local time instead.\n const dateOnly = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(raw.trim());\n const date = dateOnly\n ? new Date(Number(dateOnly[1]), Number(dateOnly[2]) - 1, Number(dateOnly[3]))\n : new Date(raw);\n if (Number.isNaN(date.getTime())) return raw;\n const now = new Date();\n // Time-of-day only makes sense when the input carried a time.\n if (!dateOnly && date.toDateString() === now.toDateString()) {\n return date.toLocaleTimeString(undefined, {\n hour: \"numeric\",\n minute: \"2-digit\",\n });\n }\n const sameYear = date.getFullYear() === now.getFullYear();\n return date.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n ...(sameYear ? {} : { year: \"numeric\" }),\n });\n}\n\n/* Gmail-style operators the unified search accepts (the tool translates them\n for Outlook, so this is the full query vocabulary either way). */\nconst EMAIL_QUERY_OPERATOR =\n /(?:^|\\s)(received|after|before|from|to|subject|has|in|is):(?:\"([^\"]+)\"|(\\S+))/gi;\n\nfunction humanEmailDate(raw: string): string {\n return formatEmailDate(raw.replace(/\\//g, \"-\")) ?? raw;\n}\n\n/** Turn a raw search query (\"received:2026-08-24..2026-08-26 from:kim budget\")\n * into a readable phrase (\"Aug 24 – Aug 26 · from kim · “budget”\"). */\nexport function humanizeEmailQuery(query: string): string {\n if (!query.trim()) return \"\";\n const phrases: string[] = [];\n let freeText = query;\n for (const match of query.matchAll(EMAIL_QUERY_OPERATOR)) {\n const [token, op, quoted, bare] = match;\n const value = quoted ?? bare ?? \"\";\n freeText = freeText.replace(token, \" \");\n switch (op.toLowerCase()) {\n case \"received\": {\n const [start, end] = value.split(\"..\");\n phrases.push(\n end\n ? `${humanEmailDate(start)} – ${humanEmailDate(end)}`\n : humanEmailDate(start),\n );\n break;\n }\n case \"after\":\n phrases.push(`after ${humanEmailDate(value)}`);\n break;\n case \"before\":\n phrases.push(`before ${humanEmailDate(value)}`);\n break;\n case \"from\":\n phrases.push(`from ${value}`);\n break;\n case \"to\":\n phrases.push(`to ${value}`);\n break;\n case \"subject\":\n phrases.push(`subject “${value}”`);\n break;\n case \"has\":\n phrases.push(value === \"attachment\" ? \"with attachments\" : `has ${value}`);\n break;\n case \"in\":\n phrases.push(value === \"drafts\" ? \"drafts only\" : `in ${value}`);\n break;\n case \"is\":\n phrases.push(value);\n break;\n }\n }\n const remainder = freeText.trim().replace(/\\s+/g, \" \");\n if (remainder) phrases.push(`“${remainder}”`);\n return phrases.join(\" · \");\n}\n\nconst INLINE_EMAIL_ROWS = 3;\n\nfunction EmailResultRow({ email }: { email: EmailResult }) {\n return (\n <div className=\"flex flex-col gap-0.5 py-2 first:pt-0 last:pb-0\">\n <div className=\"flex items-baseline justify-between gap-2\">\n <span className=\"flex min-w-0 items-baseline gap-1.5 text-[12px] font-medium text-foreground\">\n {email.isDraft && (\n <span className=\"shrink-0 rounded bg-amber-100 px-1 py-px text-[9px] font-semibold uppercase tracking-wide text-amber-700\">\n Draft\n </span>\n )}\n <span className=\"truncate\">{email.subject || \"No subject\"}</span>\n </span>\n {email.date && (\n <span className=\"shrink-0 text-[10px] text-muted-foreground\">\n {formatEmailDate(email.date)}\n </span>\n )}\n </div>\n {email.from && (\n <span className=\"truncate text-[11px] text-muted-foreground\">\n {email.from}\n </span>\n )}\n {email.snippet && (\n <p className=\"text-[11px] leading-relaxed text-muted-foreground/80\">\n {truncate(email.snippet, 150)}\n </p>\n )}\n </div>\n );\n}\n\nconst EmailSearchToolUIImpl: ToolCallMessagePartComponent = ({\n toolName,\n args,\n result,\n status,\n}) => {\n const typedArgs = args as Record<string, unknown> | undefined;\n const query = (typedArgs?.query ?? typedArgs?.search_query ?? \"\") as string;\n const data = useMemo(() => normalizeResult(result), [result]);\n const emails = useMemo(() => (data ? parseEmailResults(data) : []), [data]);\n const provider =\n typeof data?.provider === \"string\" ? (data.provider as string) : undefined;\n const totalCount =\n typeof data?.count === \"number\" ? (data.count as number) : emails.length;\n\n const isRunning = status?.type === \"running\";\n const isComplete = status?.type === \"complete\";\n const errorMsg =\n status?.type === \"incomplete\" ? (status.error as string) : null;\n\n const readableQuery = useMemo(() => humanizeEmailQuery(query), [query]);\n const inlineEmails = emails.slice(0, INLINE_EMAIL_ROWS);\n const overflowEmails = emails.slice(INLINE_EMAIL_ROWS);\n const countLabel =\n emails.length > 0 && totalCount > emails.length\n ? `${emails.length} of ${totalCount}`\n : `${totalCount}`;\n\n return (\n <ToolCard\n icon={MailIcon}\n status={status?.type ?? \"complete\"}\n title={isRunning ? \"Searching email…\" : \"Email search\"}\n subtitle={readableQuery ? truncate(readableQuery, 90) : undefined}\n toolName={toolName}\n args={typedArgs as Record<string, unknown>}\n result={result}\n badge={\n isComplete\n ? totalCount > 0\n ? `${countLabel} email${totalCount === 1 ? \"\" : \"s\"}${provider ? ` · ${provider}` : \"\"}`\n : \"No matches\"\n : undefined\n }\n error={errorMsg}\n >\n {isComplete && emails.length > 0 && (\n <div className=\"border-t border-border/40 px-4 py-2.5\">\n <div className=\"flex flex-col divide-y divide-border/30\">\n {inlineEmails.map((email, i) => (\n <EmailResultRow key={i} email={email} />\n ))}\n </div>\n {overflowEmails.length > 0 && (\n <ExpandableSection\n label={`Show ${overflowEmails.length} more`}\n >\n <div className=\"flex flex-col divide-y divide-border/30\">\n {overflowEmails.map((email, i) => (\n <EmailResultRow key={i} email={email} />\n ))}\n </div>\n </ExpandableSection>\n )}\n </div>\n )}\n </ToolCard>\n );\n};\n\nexport const EmailSearchToolUI = memo(\n EmailSearchToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nEmailSearchToolUI.displayName = \"EmailSearchToolUI\";\n\n// ─── Email Accounts Tool UI ──────────────────────────────────────────\n\ninterface EmailAccount {\n address?: string;\n provider?: string;\n name?: string;\n isDefault?: boolean;\n}\n\n/** Lenient decode of the unified `list accounts` payload\n * (`{accounts: [{email_address, provider, account_name, is_default}]}`,\n * with older field spellings tolerated). */\nexport function parseEmailAccounts(\n data: Record<string, unknown>,\n): EmailAccount[] {\n const accounts = (data.accounts ?? data.results) as unknown[] | undefined;\n if (!Array.isArray(accounts)) return [];\n return accounts.slice(0, 10).flatMap((raw) => {\n const item = asRecord(raw);\n if (!item) return [];\n const defaultFlag =\n typeof item.is_default === \"boolean\" ? item.is_default : item.default;\n return [\n {\n address:\n asString(item.email_address) ??\n asString(item.email) ??\n asString(item.address),\n provider: asString(item.provider) ?? asString(item.provider_name),\n name: asString(item.account_name) ?? asString(item.name),\n isDefault: defaultFlag === true,\n },\n ];\n });\n}\n\nconst EmailAccountsToolUIImpl: ToolCallMessagePartComponent = ({\n toolName,\n args,\n result,\n status,\n}) => {\n const data = useMemo(() => normalizeResult(result), [result]);\n const accounts = useMemo(\n () => (data ? parseEmailAccounts(data) : []),\n [data],\n );\n const isRunning = status?.type === \"running\";\n const isComplete = status?.type === \"complete\";\n const errorMsg =\n status?.type === \"incomplete\" ? (status.error as string) : null;\n\n return (\n <ToolCard\n icon={MailIcon}\n status={status?.type ?? \"complete\"}\n title={isRunning ? \"Checking connected email accounts…\" : \"Email accounts\"}\n toolName={toolName}\n args={args as Record<string, unknown>}\n result={result}\n badge={\n isComplete && accounts.length > 0\n ? `${accounts.length} connected`\n : undefined\n }\n error={errorMsg}\n >\n {isComplete && accounts.length > 0 && (\n <div className=\"border-t border-border/40 px-4 py-2.5\">\n <div className=\"flex flex-col divide-y divide-border/30\">\n {accounts.map((account, i) => (\n <div\n key={i}\n className=\"flex items-center justify-between gap-2 py-1.5 first:pt-0 last:pb-0\"\n >\n <span className=\"min-w-0 truncate text-[12px] text-foreground\">\n {account.address || account.name || \"Unknown account\"}\n </span>\n <span className=\"flex shrink-0 items-center gap-1.5\">\n {account.isDefault && (\n <span className=\"rounded-full bg-emerald-50 px-1.5 py-px text-[9px] font-semibold uppercase tracking-wide text-emerald-700\">\n Default\n </span>\n )}\n {account.provider && (\n <span className=\"rounded-md bg-muted/60 px-1.5 py-0.5 text-[10px] text-muted-foreground\">\n {account.provider}\n </span>\n )}\n </span>\n </div>\n ))}\n </div>\n </div>\n )}\n </ToolCard>\n );\n};\n\nexport const EmailAccountsToolUI = memo(\n EmailAccountsToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nEmailAccountsToolUI.displayName = \"EmailAccountsToolUI\";\n\n// ─── Asset ID extraction ─────────────────────────────────────────────\n\nfunction extractAssetId(result: unknown): string | null {\n const data = normalizeResult(result);\n if (!data) return null;\n const id = (data.asset_id ?? data.assetId ?? data.id) as string | undefined;\n if (typeof id === \"string\" && id.startsWith(\"asset_\")) return id;\n return null;\n}\n\nexport function resetAssetAutoOpen() {\n useAssetPanelStore.getState().resetAutoOpen();\n}\n\nfunction getStringField(\n source: Record<string, unknown> | null | undefined,\n keys: readonly string[],\n): string | null {\n if (!source) return null;\n for (const key of keys) {\n const value = source[key];\n if (typeof value === \"string\" && value.trim()) {\n return value;\n }\n }\n return null;\n}\n\nfunction getNumberField(\n source: Record<string, unknown> | null | undefined,\n keys: readonly string[],\n): number | null {\n if (!source) return null;\n for (const key of keys) {\n const value = source[key];\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n }\n return null;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return null;\n }\n return value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nconst PRESENTATION_CODE_SLIDE_NUMBER_KEYS = [\n \"slideNumber\",\n \"slide_number\",\n \"targetSlideNumber\",\n \"target_slide_number\",\n \"targetSlide\",\n \"target_slide\",\n] as const;\n\nconst PRESENTATION_CODE_SLIDE_INDEX_KEYS = [\n \"slideIndex\",\n \"slide_index\",\n \"targetSlideIndex\",\n \"target_slide_index\",\n] as const;\n\n// PTC sub-call payloads match Agora's canonical `ptc_subcall_event` shape.\n// The dispatcher folds the event-level `assetId` into `args.assetId`, and\n// the studio SDK command args are camelCased from `command.to_dict()`.\nfunction getStudioAssetId({\n args,\n result,\n}: {\n args?: Record<string, unknown>;\n result?: Record<string, unknown> | null;\n}): string | null {\n const id = getStringField(result, [\"asset_id\", \"assetId\", \"id\"])\n ?? getStringField(args, [\"asset_id\", \"assetId\", \"id\"]);\n return id?.startsWith(\"asset_\") ? id : null;\n}\n\nfunction getPresentationCodeDeckId(code: string): string | null {\n const match = code.match(/\\bdeck_id\\s*=\\s*[\"']([^\"']+)[\"']/);\n const deckId = match?.[1];\n return deckId?.startsWith(\"asset_\") ? deckId : null;\n}\n\nfunction getPresentationCodeSlideNumberFromFields(\n source?: Record<string, unknown> | null,\n): number | undefined {\n const explicit = getNumberField(source, PRESENTATION_CODE_SLIDE_NUMBER_KEYS);\n if (explicit != null && Number.isInteger(explicit) && explicit >= 1) {\n return explicit;\n }\n\n const zeroBasedIndex = getNumberField(source, PRESENTATION_CODE_SLIDE_INDEX_KEYS);\n if (\n zeroBasedIndex != null &&\n Number.isInteger(zeroBasedIndex) &&\n zeroBasedIndex >= 0\n ) {\n return zeroBasedIndex + 1;\n }\n\n return undefined;\n}\n\nfunction getPresentationCodeSlideNumberFromText(\n text: string | null | undefined,\n): number | undefined {\n const match = text?.match(/\\bslide\\s*(?:#|number\\s*)?(\\d+)\\b/i);\n if (!match) {\n return undefined;\n }\n\n const slideNumber = Number.parseInt(match[1] ?? \"\", 10);\n return Number.isInteger(slideNumber) && slideNumber >= 1\n ? slideNumber\n : undefined;\n}\n\nfunction getPresentationCodeSlideNumber({\n args,\n result,\n}: {\n args?: Record<string, unknown>;\n result?: Record<string, unknown> | null;\n}): number | undefined {\n return (\n getPresentationCodeSlideNumberFromFields(args) ??\n getPresentationCodeSlideNumberFromFields(result) ??\n getPresentationCodeSlideNumberFromText(\n getStringField(args, [\"summary\", \"title\", \"description\"]),\n )\n );\n}\n\nfunction getAddSlideNumber(args?: Record<string, unknown>): number | undefined {\n const index = getNumberField(args, [\"index\"]);\n return index != null && Number.isInteger(index) && index >= 0\n ? index + 1\n : undefined;\n}\n\n// ─── Create Asset Tool UI (document, sheet, presentation) ───────────\n\nfunction CreateAssetToolUIImpl({\n icon: Icon,\n assetType,\n runningLabel,\n doneLabel,\n toolName,\n args,\n result,\n status,\n}: {\n icon: React.ElementType;\n assetType: AssetType;\n runningLabel: string;\n doneLabel: string;\n toolName?: string;\n args?: Record<string, unknown>;\n result?: unknown;\n status?: { type: string; error?: unknown; reason?: string };\n}) {\n const typedArgs = args as Record<string, unknown> | undefined;\n const name = (typedArgs?.name ??\n typedArgs?.title ??\n typedArgs?.document_name ??\n typedArgs?.sheet_name ??\n \"\") as string;\n const data = useMemo(() => normalizeResult(result), [result]);\n const createdName = (data?.name ?? data?.title ?? data?.asset_name) as\n | string\n | undefined;\n const assetId = extractAssetId(result);\n\n const isRunning = status?.type === \"running\";\n const isComplete = status?.type === \"complete\" || !status;\n const isCancelled =\n status?.type === \"incomplete\" && status.reason === \"cancelled\";\n const errorMsg =\n status?.type === \"incomplete\" ? (status.error as string) : null;\n\n const openAsset = useAssetPanelStore((s) => s.openAsset);\n\n const handleOpen = () => {\n if (assetId) {\n openAsset(assetId, {\n name: createdName || name || undefined,\n type: assetType,\n });\n }\n };\n\n return (\n <ToolCard\n icon={Icon}\n status={(status?.type ?? \"complete\") as ToolStatus}\n title={isRunning ? runningLabel : doneLabel}\n subtitle={createdName || name || undefined}\n toolName={toolName}\n args={typedArgs as Record<string, unknown>}\n result={result}\n error={errorMsg}\n >\n {assetId && isComplete && !isCancelled && (\n <div className=\"border-t border-border/40 px-4 py-2.5\">\n <button\n type=\"button\"\n onClick={handleOpen}\n className=\"group flex w-full items-center gap-3 rounded-lg border border-border/60 bg-muted/20 px-3 py-2.5 text-left transition-colors hover:border-border hover:bg-muted/40\"\n >\n <div\n className={cn(\n \"flex size-10 shrink-0 items-center justify-center rounded-lg\",\n ASSET_TILE_STYLE[assetType] ?? ASSET_TILE_STYLE.unknown,\n )}\n >\n <Icon className=\"size-5\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-[13px] font-medium text-foreground\">\n {createdName || name || \"Untitled\"}\n </div>\n <div className=\"text-[11px] text-muted-foreground\">\n {ASSET_TILE_LABEL[assetType] ?? \"Asset\"} · Click to open\n </div>\n </div>\n <ExternalLinkIcon className=\"size-3.5 shrink-0 text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100\" />\n </button>\n </div>\n )}\n </ToolCard>\n );\n}\n\n/* Per-type accents for the clickable asset tile: the familiar office-suite\n palette (blue documents, green spreadsheets, orange decks) so the type\n reads at a glance. */\nconst ASSET_TILE_STYLE: Record<AssetType, string> = {\n document: \"bg-blue-500/10 text-blue-600\",\n spreadsheet: \"bg-emerald-500/10 text-emerald-600\",\n presentation: \"bg-orange-500/10 text-orange-600\",\n notebook: \"bg-violet-500/10 text-violet-600\",\n unknown: \"bg-muted text-muted-foreground\",\n};\n\nconst ASSET_TILE_LABEL: Record<AssetType, string> = {\n document: \"Document\",\n spreadsheet: \"Spreadsheet\",\n presentation: \"Presentation\",\n notebook: \"Notebook\",\n unknown: \"Asset\",\n};\n\nconst CreateDocumentToolUIImpl: ToolCallMessagePartComponent = (props) => (\n <CreateAssetToolUIImpl\n icon={FilePlusIcon}\n assetType=\"document\"\n runningLabel=\"Creating document...\"\n doneLabel=\"Created document\"\n {...props}\n />\n);\n\nexport const CreateDocumentToolUI = memo(\n CreateDocumentToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nCreateDocumentToolUI.displayName = \"CreateDocumentToolUI\";\n\nconst CreateSheetToolUIImpl: ToolCallMessagePartComponent = (props) => (\n <CreateAssetToolUIImpl\n icon={BarChart3Icon}\n assetType=\"spreadsheet\"\n runningLabel=\"Creating spreadsheet...\"\n doneLabel=\"Created spreadsheet\"\n {...props}\n />\n);\n\nexport const CreateSheetToolUI = memo(\n CreateSheetToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nCreateSheetToolUI.displayName = \"CreateSheetToolUI\";\n\nconst CreatePresentationToolUIImpl: ToolCallMessagePartComponent = (props) => (\n <CreateAssetToolUIImpl\n icon={PresentationIcon}\n assetType=\"presentation\"\n runningLabel=\"Creating presentation...\"\n doneLabel=\"Created presentation\"\n {...props}\n />\n);\n\nexport const CreatePresentationToolUI = memo(\n CreatePresentationToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nCreatePresentationToolUI.displayName = \"CreatePresentationToolUI\";\n\n// ─── Studio PTC Tool UIs (nested SDK calls) ─────────────────────────\n\ntype StudioToolConfig = {\n icon: React.ElementType;\n assetType: AssetType;\n runningLabel: (args?: Record<string, unknown>) => string;\n doneLabel: (args?: Record<string, unknown>, slideNumber?: number) => string;\n badge: string;\n getSubtitle?: (\n args?: Record<string, unknown>,\n result?: Record<string, unknown> | null,\n slideNumber?: number,\n ) => string | undefined;\n getSlideNumber?: (args?: Record<string, unknown>) => number | undefined;\n openLabel: (slideNumber?: number) => string;\n preserveExistingSlide?: boolean;\n};\n\nfunction openStudioAsset({\n assetId,\n assetType,\n slideNumber,\n preserveExistingSlide,\n}: {\n assetId: string;\n assetType: AssetType;\n slideNumber?: number;\n preserveExistingSlide?: boolean;\n}) {\n const store = useAssetPanelStore.getState();\n const existing = store.tabs.find((tab) => tab.id === assetId);\n const shouldKeepCurrentSlide = preserveExistingSlide && existing;\n store.openAsset(assetId, {\n type: assetType,\n ...(!shouldKeepCurrentSlide && slideNumber !== undefined\n ? { slideNumber }\n : {}),\n });\n}\n\nfunction StudioPtcToolUI({\n config,\n toolName,\n args,\n result,\n status,\n}: {\n config: StudioToolConfig;\n toolName?: string;\n toolCallId?: string;\n args?: Record<string, unknown>;\n result?: unknown;\n status?: { type: string; error?: unknown; reason?: string };\n}) {\n const typedArgs = args as Record<string, unknown> | undefined;\n const data = useMemo(() => normalizeResult(result), [result]);\n const slideNumber = config.getSlideNumber?.(typedArgs);\n const assetId = getStudioAssetId({ args: typedArgs, result: data });\n const subtitle = config.getSubtitle?.(typedArgs, data, slideNumber);\n\n const isRunning = status?.type === \"running\";\n const isComplete = status?.type === \"complete\" || !status;\n const isCancelled =\n status?.type === \"incomplete\" && status.reason === \"cancelled\";\n const errorMsg =\n status?.type === \"incomplete\"\n ? String(status.error ?? status.reason ?? \"Tool failed\")\n : null;\n\n const handleOpen = useCallback(() => {\n if (!assetId) return;\n if (toolName === \"AddSlide\") {\n logDebugPayload(\"[Athena SDK AddSlide] manual open\", {\n args: typedArgs,\n parsedResult: data,\n rawResult: result,\n assetId,\n slideNumber,\n });\n }\n openStudioAsset({\n assetId,\n assetType: config.assetType,\n slideNumber,\n preserveExistingSlide: config.preserveExistingSlide,\n });\n }, [\n assetId,\n config.assetType,\n config.preserveExistingSlide,\n data,\n result,\n slideNumber,\n toolName,\n typedArgs,\n ]);\n\n useEffect(() => {\n if (toolName !== \"AddSlide\") {\n return;\n }\n\n logDebugPayload(\"[Athena SDK AddSlide] tool state\", {\n args: typedArgs,\n parsedResult: data,\n rawResult: result,\n status,\n assetId,\n slideNumber,\n isComplete,\n isCancelled,\n });\n }, [\n assetId,\n data,\n isCancelled,\n isComplete,\n result,\n slideNumber,\n status,\n toolName,\n typedArgs,\n ]);\n\n return (\n <ToolCard\n icon={config.icon}\n status={(status?.type ?? \"complete\") as ToolStatus}\n title={\n isRunning\n ? config.runningLabel(typedArgs)\n : config.doneLabel(typedArgs, slideNumber)\n }\n subtitle={subtitle}\n badge={config.badge}\n toolName={toolName}\n args={typedArgs}\n result={result}\n error={errorMsg}\n >\n {assetId && isComplete && !isCancelled && (\n <div className=\"border-t border-border/40 px-4 py-2\">\n <button\n type=\"button\"\n onClick={handleOpen}\n className=\"flex items-center gap-1.5 rounded-md border border-border/60 px-3 py-1.5 text-xs font-medium text-muted-foreground transition-colors hover:bg-muted/50 hover:text-foreground\"\n >\n <ExternalLinkIcon className=\"size-3\" />\n {config.openLabel(slideNumber)}\n </button>\n </div>\n )}\n </ToolCard>\n );\n}\n\nfunction createStudioPtcToolUI(\n displayName: string,\n config: StudioToolConfig,\n): ToolCallMessagePartComponent {\n const Component: ToolCallMessagePartComponent = (props) => (\n <StudioPtcToolUI config={config} {...props} />\n );\n const Memoized = memo(Component) as unknown as ToolCallMessagePartComponent;\n Memoized.displayName = displayName;\n return Memoized;\n}\n\nconst getNameSubtitle = (\n args?: Record<string, unknown>,\n result?: Record<string, unknown> | null,\n) =>\n getStringField(result, [\"title\", \"name\", \"asset_name\"]) ??\n getStringField(args, [\"title\", \"name\"]) ??\n undefined;\n\nconst getParagraphSubtitle = (args?: Record<string, unknown>) => {\n const text = getStringField(args, [\"text\"]);\n return text ? truncate(text, 80) : undefined;\n};\n\nconst getSlideSubtitle = (\n args?: Record<string, unknown>,\n _result?: Record<string, unknown> | null,\n slideNumber?: number,\n) => {\n const layout =\n getStringField(args, [\"layoutName\", \"layout_name\"]) ??\n getStringField(args, [\"layoutPath\", \"layout_path\"]);\n const slideLabel = slideNumber ? `Slide ${slideNumber}` : null;\n if (slideLabel && layout) return `${slideLabel} - ${truncate(layout, 48)}`;\n return slideLabel ?? (layout ? truncate(layout, 64) : undefined);\n};\n\nexport const StudioCreateWorkbookToolUI = createStudioPtcToolUI(\n \"StudioCreateWorkbookToolUI\",\n {\n icon: BarChart3Icon,\n assetType: \"spreadsheet\",\n badge: \"Sheet\",\n runningLabel: (args) => {\n const title = getStringField(args, [\"title\", \"name\"]);\n return title ? `Creating workbook \"${title}\"...` : \"Creating workbook...\";\n },\n doneLabel: () => \"Workbook created\",\n getSubtitle: getNameSubtitle,\n openLabel: () => \"Open workbook\",\n },\n);\n\nexport const StudioAddSheetToolUI = createStudioPtcToolUI(\n \"StudioAddSheetToolUI\",\n {\n icon: BarChart3Icon,\n assetType: \"spreadsheet\",\n badge: \"Sheet\",\n runningLabel: (args) => {\n const name = getStringField(args, [\"name\", \"sheetName\", \"sheet_name\"]);\n return name ? `Adding sheet \"${name}\"...` : \"Adding sheet...\";\n },\n doneLabel: (args) => {\n const name = getStringField(args, [\"name\", \"sheetName\", \"sheet_name\"]);\n return name ? `Sheet added: ${name}` : \"Sheet added\";\n },\n getSubtitle: (args) =>\n getStringField(args, [\"name\", \"sheetName\", \"sheet_name\"]) ?? undefined,\n openLabel: () => \"Open workbook\",\n },\n);\n\nexport const StudioOpenWorkbookToolUI = createStudioPtcToolUI(\n \"StudioOpenWorkbookToolUI\",\n {\n icon: BarChart3Icon,\n assetType: \"spreadsheet\",\n badge: \"Sheet\",\n runningLabel: () => \"Opening workbook...\",\n doneLabel: () => \"Workbook opened\",\n openLabel: () => \"Open workbook\",\n },\n);\n\nexport const StudioCreatePresentationToolUI = createStudioPtcToolUI(\n \"StudioCreatePresentationToolUI\",\n {\n icon: PresentationIcon,\n assetType: \"presentation\",\n badge: \"Deck\",\n runningLabel: (args) => {\n const title = getStringField(args, [\"title\", \"name\"]);\n return title ? `Creating presentation \"${title}\"...` : \"Creating presentation...\";\n },\n doneLabel: () => \"Presentation created\",\n getSubtitle: getNameSubtitle,\n getSlideNumber: () => 1,\n openLabel: () => \"Open presentation\",\n },\n);\n\nexport const StudioOpenPresentationToolUI = createStudioPtcToolUI(\n \"StudioOpenPresentationToolUI\",\n {\n icon: PresentationIcon,\n assetType: \"presentation\",\n badge: \"Deck\",\n runningLabel: () => \"Opening presentation...\",\n doneLabel: () => \"Presentation opened\",\n getSlideNumber: () => 1,\n getSubtitle: (_args, _result, slideNumber) =>\n slideNumber ? `Slide ${slideNumber}` : undefined,\n openLabel: () => \"Open presentation\",\n preserveExistingSlide: true,\n },\n);\n\nexport const StudioAddSlideToolUI = createStudioPtcToolUI(\n \"StudioAddSlideToolUI\",\n {\n icon: PresentationIcon,\n assetType: \"presentation\",\n badge: \"Deck\",\n runningLabel: () => \"Adding slide...\",\n doneLabel: (_args, slideNumber) =>\n slideNumber ? `Slide ${slideNumber} added` : \"Slide added\",\n getSubtitle: getSlideSubtitle,\n getSlideNumber: (args) => getAddSlideNumber(args) ?? 1,\n openLabel: (slideNumber) =>\n slideNumber ? `Open slide ${slideNumber}` : \"Open presentation\",\n },\n);\n\nexport const StudioCreateDocumentToolUI = createStudioPtcToolUI(\n \"StudioCreateDocumentToolUI\",\n {\n icon: FileTextIcon,\n assetType: \"document\",\n badge: \"Doc\",\n runningLabel: (args) => {\n const title = getStringField(args, [\"title\", \"name\"]);\n return title ? `Creating document \"${title}\"...` : \"Creating document...\";\n },\n doneLabel: () => \"Document created\",\n getSubtitle: getNameSubtitle,\n openLabel: () => \"Open document\",\n },\n);\n\nexport const StudioCreateParagraphToolUI = createStudioPtcToolUI(\n \"StudioCreateParagraphToolUI\",\n {\n icon: FileTextIcon,\n assetType: \"document\",\n badge: \"Doc\",\n runningLabel: () => \"Adding paragraph...\",\n doneLabel: () => \"Paragraph added\",\n getSubtitle: getParagraphSubtitle,\n openLabel: () => \"Open document\",\n },\n);\n\nexport const StudioOpenDocumentToolUI = createStudioPtcToolUI(\n \"StudioOpenDocumentToolUI\",\n {\n icon: FileTextIcon,\n assetType: \"document\",\n badge: \"Doc\",\n runningLabel: () => \"Opening document...\",\n doneLabel: () => \"Document opened\",\n openLabel: () => \"Open document\",\n },\n);\n\n// ─── Create Email Draft Tool UI ──────────────────────────────────────\n\nconst CreateEmailDraftToolUIImpl: ToolCallMessagePartComponent = ({\n toolName,\n args,\n result,\n status,\n}) => {\n const typedArgs = args as Record<string, unknown> | undefined;\n const to = (typedArgs?.to ?? typedArgs?.recipient ?? \"\") as string;\n const subject = (typedArgs?.subject ?? \"\") as string;\n\n const isRunning = status?.type === \"running\";\n const errorMsg =\n status?.type === \"incomplete\" ? (status.error as string) : null;\n\n return (\n <ToolCard\n icon={MailIcon}\n status={status?.type ?? \"complete\"}\n title={isRunning ? \"Creating email draft...\" : \"Email draft created\"}\n toolName={toolName}\n args={typedArgs as Record<string, unknown>}\n result={result}\n subtitle={\n subject\n ? truncate(subject, 60)\n : to\n ? `To: ${truncate(to, 40)}`\n : undefined\n }\n error={errorMsg}\n />\n );\n};\n\nexport const CreateEmailDraftToolUI = memo(\n CreateEmailDraftToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nCreateEmailDraftToolUI.displayName = \"CreateEmailDraftToolUI\";\n\n// ─── Create Notebook Tool UI ─────────────────────────────────────────\n\nconst CreateNotebookToolUIImpl: ToolCallMessagePartComponent = (props) => (\n <CreateAssetToolUIImpl\n icon={BookOpenIcon}\n assetType=\"notebook\"\n runningLabel=\"Creating notebook...\"\n doneLabel=\"Created notebook\"\n {...props}\n />\n);\n\nexport const CreateNotebookToolUI = memo(\n CreateNotebookToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nCreateNotebookToolUI.displayName = \"CreateNotebookToolUI\";\n\n// ─── Run Python Code Tool UI ─────────────────────────────────────────\n\nfunction parsePythonResult(result: unknown): {\n outputs: Array<{\n objectId: string | null;\n title: string | null;\n textPlain: string | null;\n imagePng: string | null;\n plotlyJson: string | null;\n assetId: string | null;\n }>;\n stdout: string | null;\n stderr: string | null;\n value: string | null;\n error: string | null;\n exception: { name: string; value: string; traceback: string } | null;\n imagePng: string | null;\n plotlyJson: string | null;\n createdAssets: Array<{ asset_id: string }>;\n assetId: string | null;\n deckId: string | null;\n} {\n const data = normalizeResult(result);\n if (!data)\n return {\n outputs: [],\n stdout: null,\n stderr: null,\n value: null,\n error: null,\n exception: null,\n imagePng: null,\n plotlyJson: null,\n createdAssets: [],\n assetId: null,\n deckId: null,\n };\n\n const inner = (\n typeof data.result === \"object\" && data.result !== null ? data.result : data\n ) as Record<string, unknown>;\n\n const stdout = (inner.stdout as string) ?? null;\n const stderr = (inner.stderr as string) ?? null;\n const value = (inner.value as string) ?? null;\n const error = (inner.error as string) ?? null;\n\n let exception: { name: string; value: string; traceback: string } | null =\n null;\n if (inner.exception && typeof inner.exception === \"object\") {\n const exc = inner.exception as Record<string, unknown>;\n exception = {\n name: (exc.name as string) ?? \"Error\",\n value: (exc.value as string) ?? \"\",\n traceback: (exc.traceback as string) ?? \"\",\n };\n }\n\n let imagePng: string | null = null;\n let plotlyJson: string | null = null;\n const outputs: Array<{\n objectId: string | null;\n title: string | null;\n textPlain: string | null;\n imagePng: string | null;\n plotlyJson: string | null;\n assetId: string | null;\n }> = [];\n\n // Check legacy format: data.png\n if (inner.data && typeof inner.data === \"object\") {\n imagePng = ((inner.data as Record<string, unknown>).png as string) ?? null;\n }\n // Check mime-bundle format: outputs[].mime_bundle\n if (Array.isArray(data.outputs)) {\n for (const output of data.outputs) {\n if (output && typeof output === \"object\") {\n const outputRecord = output as Record<string, unknown>;\n const mimeBundle = (output as Record<string, unknown>).mime_bundle;\n let outputImagePng: string | null = null;\n let outputPlotlyJson: string | null = null;\n let outputTextPlain: string | null = null;\n if (mimeBundle && typeof mimeBundle === \"object\") {\n const mb = mimeBundle as Record<string, unknown>;\n // Prefer plotly+json for interactive charts\n if (!plotlyJson && typeof mb[\"plotly+json\"] === \"string\") {\n plotlyJson = mb[\"plotly+json\"] as string;\n }\n // Fall back to PNG\n if (!imagePng && typeof mb[\"image/png\"] === \"string\") {\n imagePng = mb[\"image/png\"] as string;\n }\n outputPlotlyJson =\n typeof mb[\"plotly+json\"] === \"string\" ? (mb[\"plotly+json\"] as string) : null;\n outputImagePng =\n typeof mb[\"image/png\"] === \"string\" ? (mb[\"image/png\"] as string) : null;\n outputTextPlain =\n typeof mb[\"text/plain\"] === \"string\" ? (mb[\"text/plain\"] as string) : null;\n }\n outputs.push({\n objectId:\n typeof outputRecord.object_id === \"string\" ? outputRecord.object_id : null,\n title: typeof outputRecord.title === \"string\" ? outputRecord.title : null,\n textPlain: outputTextPlain,\n imagePng: outputImagePng,\n plotlyJson: outputPlotlyJson,\n assetId: typeof outputRecord.asset_id === \"string\" ? outputRecord.asset_id : null,\n });\n }\n }\n }\n\n const createdAssets = Array.isArray(data.created_assets)\n ? (data.created_assets as Array<{ asset_id: string }>)\n : [];\n const assetId = typeof data.asset_id === \"string\" ? data.asset_id : null;\n const deckId = typeof data.deck_id === \"string\" ? data.deck_id : null;\n\n return {\n outputs,\n stdout,\n stderr,\n value,\n error,\n exception,\n imagePng,\n plotlyJson,\n createdAssets,\n assetId,\n deckId,\n };\n}\n\nfunction getExecutionTextOutput(parsed: ReturnType<typeof parsePythonResult>): string | null {\n const output = [\n parsed.value,\n parsed.stdout,\n parsed.stderr,\n ...parsed.outputs.map((entry) => {\n if (!entry.textPlain) {\n return null;\n }\n return entry.title ? `${entry.title}\\n${entry.textPlain}` : entry.textPlain;\n }),\n ]\n .filter((chunk): chunk is string => Boolean(chunk && chunk.trim()))\n .join(\"\\n\\n\");\n\n return output || null;\n}\n\n/** Typed interface for the Plotly global loaded from CDN */\ninterface PlotlyInstance {\n newPlot: (el: HTMLElement, data: unknown[], layout: unknown, config: unknown) => void;\n purge: (el: HTMLElement) => void;\n}\n\nfunction getPlotly(): PlotlyInstance | undefined {\n return (window as unknown as { Plotly?: PlotlyInstance }).Plotly;\n}\n\n/** Lazy-load Plotly.js from CDN (once per page, only when a chart is rendered) */\nlet plotlyLoadPromise: Promise<void> | null = null;\nfunction ensurePlotlyLoaded(): Promise<void> {\n if (getPlotly()) return Promise.resolve();\n if (plotlyLoadPromise) return plotlyLoadPromise;\n plotlyLoadPromise = new Promise<void>((resolve, reject) => {\n const script = document.createElement(\"script\");\n script.src = \"https://cdn.plot.ly/plotly-2.35.2.min.js\";\n script.crossOrigin = \"anonymous\";\n script.onload = () => resolve();\n script.onerror = () => {\n plotlyLoadPromise = null;\n document.head.removeChild(script);\n reject(new Error(\"Failed to load Plotly\"));\n };\n document.head.appendChild(script);\n });\n return plotlyLoadPromise;\n}\n\n/** Renders a Plotly chart directly in the DOM */\nconst PlotlyChart: FC<{ json: string; height?: number | string }> = ({ json, height = 500 }) => {\n const chartRef = useRef<HTMLDivElement>(null);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n ensurePlotlyLoaded()\n .then(() => {\n if (cancelled || !chartRef.current) return;\n const parsed = JSON.parse(json);\n const Plotly = getPlotly();\n if (!Plotly) return;\n Plotly.newPlot(\n chartRef.current,\n parsed.data || [],\n { ...(parsed.layout || {}), autosize: true, width: undefined, height: undefined },\n { responsive: true, displayModeBar: true, displaylogo: false, showLink: false },\n );\n })\n .catch((err: Error) => {\n if (!cancelled) setError(err.message);\n });\n\n return () => {\n cancelled = true;\n if (chartRef.current) {\n const Plotly = getPlotly();\n if (Plotly) Plotly.purge(chartRef.current);\n }\n };\n }, [json]);\n\n if (error) {\n return <p className=\"text-xs text-destructive\">{error}</p>;\n }\n\n return <div ref={chartRef} className=\"w-full overflow-hidden\" style={{ height }} />;\n};\n\n/** Plotly chart section with fullscreen toggle */\nconst PlotlyChartSection: FC<{ json: string }> = ({ json }) => {\n const [isFullscreen, setIsFullscreen] = useState(false);\n\n return (\n <>\n <div className=\"border-t border-border/40 px-4 py-2.5\">\n <div className=\"flex items-center justify-between mb-1.5\">\n <div className=\"flex items-center gap-1.5\">\n <BarChart3Icon className=\"size-3 text-muted-foreground\" />\n <span className=\"text-[11px] font-medium text-muted-foreground\">\n Interactive chart\n </span>\n </div>\n <button\n type=\"button\"\n onClick={() => setIsFullscreen(true)}\n className=\"flex items-center gap-1 rounded-md px-1.5 py-1 text-[11px] text-muted-foreground transition-colors hover:bg-muted/50 hover:text-foreground\"\n title=\"View full screen\"\n >\n <Maximize2Icon className=\"size-3.5\" />\n </button>\n </div>\n <PlotlyChart json={json} />\n </div>\n {isFullscreen && (\n <div className=\"fixed inset-0 z-[9999] flex flex-col bg-background\">\n <div className=\"flex items-center justify-between px-6 py-3 border-b border-border\">\n <div className=\"flex items-center gap-2\">\n <BarChart3Icon className=\"size-4 text-muted-foreground\" />\n <span className=\"text-sm font-medium\">Interactive chart</span>\n </div>\n <button\n type=\"button\"\n onClick={() => setIsFullscreen(false)}\n className=\"flex items-center justify-center rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-muted/50 hover:text-foreground\"\n title=\"Close full screen\"\n >\n <XIcon className=\"size-5\" />\n </button>\n </div>\n <div className=\"flex-1 min-h-0 p-4\">\n <PlotlyChart json={json} height=\"100%\" />\n </div>\n </div>\n )}\n </>\n );\n};\n\n/** Lightweight Python syntax highlighter — no external deps */\nconst SyntaxHighlightedCode: FC<{ code: string }> = memo(({ code }) => {\n const highlighted = useMemo(() => highlightPython(code), [code]);\n return (\n <pre\n className=\"whitespace-pre-wrap break-words text-[11px] leading-relaxed font-mono\"\n // biome-ignore lint: html from our own highlighter, not user content\n dangerouslySetInnerHTML={{ __html: highlighted }}\n />\n );\n});\nSyntaxHighlightedCode.displayName = \"SyntaxHighlightedCode\";\n\nconst PY_KEYWORDS = new Set([\n \"False\",\"None\",\"True\",\"and\",\"as\",\"assert\",\"async\",\"await\",\"break\",\"class\",\n \"continue\",\"def\",\"del\",\"elif\",\"else\",\"except\",\"finally\",\"for\",\"from\",\"global\",\n \"if\",\"import\",\"in\",\"is\",\"lambda\",\"nonlocal\",\"not\",\"or\",\"pass\",\"raise\",\"return\",\n \"try\",\"while\",\"with\",\"yield\",\n]);\n\nconst PY_BUILTINS = new Set([\n \"print\",\"len\",\"range\",\"int\",\"str\",\"float\",\"list\",\"dict\",\"set\",\"tuple\",\"bool\",\n \"type\",\"isinstance\",\"enumerate\",\"zip\",\"map\",\"filter\",\"sorted\",\"reversed\",\"sum\",\n \"min\",\"max\",\"abs\",\"round\",\"open\",\"super\",\"property\",\"staticmethod\",\"classmethod\",\n \"display\",\"input\",\"format\",\"getattr\",\"setattr\",\"hasattr\",\"vars\",\"dir\",\n]);\n\nfunction escapeHtml(s: string): string {\n return s.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\n}\n\nfunction highlightPython(code: string): string {\n const lines = code.split(\"\\n\");\n return lines\n .map((line) => {\n // Full-line comment\n const commentMatch = line.match(/^(\\s*)(#.*)$/);\n if (commentMatch) {\n return `${escapeHtml(commentMatch[1])}<span style=\"color:var(--aui-syn-comment, #6a9955)\">${escapeHtml(commentMatch[2])}</span>`;\n }\n\n let result = \"\";\n let i = 0;\n while (i < line.length) {\n // Inline comment\n if (line[i] === \"#\") {\n result += `<span style=\"color:var(--aui-syn-comment, #6a9955)\">${escapeHtml(line.slice(i))}</span>`;\n break;\n }\n // Triple-quoted strings\n if (line.slice(i, i + 3) === '\"\"\"' || line.slice(i, i + 3) === \"'''\") {\n const quote = line.slice(i, i + 3);\n const end = line.indexOf(quote, i + 3);\n const str = end >= 0 ? line.slice(i, end + 3) : line.slice(i);\n result += `<span style=\"color:var(--aui-syn-string, #ce9178)\">${escapeHtml(str)}</span>`;\n i += str.length;\n continue;\n }\n // Strings\n if (line[i] === '\"' || line[i] === \"'\") {\n const q = line[i];\n let j = i + 1;\n while (j < line.length && line[j] !== q) {\n if (line[j] === \"\\\\\") j++;\n j++;\n }\n const str = line.slice(i, j + 1);\n result += `<span style=\"color:var(--aui-syn-string, #ce9178)\">${escapeHtml(str)}</span>`;\n i = j + 1;\n continue;\n }\n // Numbers\n if (/\\d/.test(line[i]) && (i === 0 || /[\\s(,=[\\-+*/:!<>]/.test(line[i - 1]))) {\n const numMatch = line.slice(i).match(/^(\\d+\\.?\\d*(?:[eE][+-]?\\d+)?)/);\n if (numMatch) {\n result += `<span style=\"color:var(--aui-syn-number, #b5cea8)\">${escapeHtml(numMatch[1])}</span>`;\n i += numMatch[1].length;\n continue;\n }\n }\n // Words (keywords, builtins, identifiers)\n if (/[a-zA-Z_]/.test(line[i])) {\n const wordMatch = line.slice(i).match(/^[a-zA-Z_]\\w*/);\n if (wordMatch) {\n const word = wordMatch[0];\n if (PY_KEYWORDS.has(word)) {\n result += `<span style=\"color:var(--aui-syn-keyword, #569cd6)\">${escapeHtml(word)}</span>`;\n } else if (PY_BUILTINS.has(word)) {\n result += `<span style=\"color:var(--aui-syn-builtin, #dcdcaa)\">${escapeHtml(word)}</span>`;\n } else if (line[i + word.length] === \"(\") {\n result += `<span style=\"color:var(--aui-syn-func, #dcdcaa)\">${escapeHtml(word)}</span>`;\n } else {\n result += escapeHtml(word);\n }\n i += word.length;\n continue;\n }\n }\n // Decorators\n if (line[i] === \"@\" && (i === 0 || /\\s/.test(line[i - 1]))) {\n const decMatch = line.slice(i).match(/^@[\\w.]+/);\n if (decMatch) {\n result += `<span style=\"color:var(--aui-syn-decorator, #569cd6)\">${escapeHtml(decMatch[0])}</span>`;\n i += decMatch[0].length;\n continue;\n }\n }\n // Operators\n if (/[+\\-*/%=<>!&|^~]/.test(line[i])) {\n result += `<span style=\"color:var(--aui-syn-op, #d4d4d4)\">${escapeHtml(line[i])}</span>`;\n i++;\n continue;\n }\n result += escapeHtml(line[i]);\n i++;\n }\n return result;\n })\n .join(\"\\n\");\n}\n\nconst RunPythonCodeToolUIImpl: ToolCallMessagePartComponent = ({\n toolName,\n args,\n result,\n status,\n}) => {\n const typedArgs = args as Record<string, unknown> | undefined;\n const code = (typedArgs?.code ?? \"\") as string;\n const summary = (typedArgs?.summary as string) ?? null;\n const lines = code ? code.split(\"\\n\").length : 0;\n\n const isRunning = status?.type === \"running\";\n const isComplete = status?.type === \"complete\";\n const errorMsg =\n status?.type === \"incomplete\" ? (status.error as string) : null;\n\n const parsed = useMemo(\n () => (isComplete ? parsePythonResult(result) : null),\n [result, isComplete],\n );\n const openAsset = useAssetPanelStore((s) => s.openAsset);\n\n const outputText = parsed ? getExecutionTextOutput(parsed) : null;\n const hasOutput = Boolean(outputText);\n const hasError = parsed && (parsed.error || parsed.exception);\n const hasImage = parsed?.imagePng;\n const hasPlotly = parsed?.plotlyJson;\n\n return (\n <ToolCard\n icon={CodeIcon}\n status={status?.type ?? \"complete\"}\n title={\n isRunning\n ? \"Running code...\"\n : summary || `Executed ${lines} ${lines !== 1 ? \"lines\" : \"line\"}`\n }\n toolName={toolName}\n args={typedArgs as Record<string, unknown>}\n result={result}\n error={errorMsg}\n >\n {/* Code preview */}\n {code && (\n <ExpandableSection label=\"Show code\">\n <SyntaxHighlightedCode code={code} />\n </ExpandableSection>\n )}\n\n {/* Output */}\n {isComplete && hasOutput && (\n <div className=\"border-t border-border/40 px-4 py-2.5\">\n <div className=\"flex items-center gap-1.5 mb-1\">\n <TerminalIcon className=\"size-3 text-muted-foreground\" />\n <span className=\"text-[11px] font-medium text-muted-foreground\">\n Output\n </span>\n </div>\n <pre className=\"max-h-48 overflow-auto whitespace-pre-wrap break-words rounded-md bg-muted/30 p-2 text-[11px] leading-relaxed font-mono text-foreground/80\">\n {outputText}\n </pre>\n </div>\n )}\n\n {/* Error / Exception */}\n {isComplete && hasError && (\n <div className=\"border-t border-border/40 bg-destructive/10 px-4 py-2.5\">\n <div className=\"flex items-center gap-1.5 mb-1\">\n <AlertTriangleIcon className=\"size-3 text-destructive\" />\n <span className=\"text-[11px] font-medium text-destructive\">\n {parsed.exception\n ? `${parsed.exception.name}: ${parsed.exception.value}`\n : \"Error\"}\n </span>\n </div>\n <pre className=\"max-h-48 overflow-auto whitespace-pre-wrap break-words rounded-md bg-destructive/5 p-2 text-[11px] leading-relaxed font-mono text-destructive/80\">\n {parsed.exception?.traceback ?? parsed.error}\n </pre>\n </div>\n )}\n\n {/* Interactive Plotly chart */}\n {isComplete && hasPlotly && (\n <PlotlyChartSection json={parsed.plotlyJson!} />\n )}\n\n {/* Image output (PNG fallback when no Plotly) */}\n {isComplete && hasImage && !hasPlotly && (\n <div className=\"border-t border-border/40 px-4 py-2.5\">\n <div className=\"flex items-center gap-1.5 mb-1.5\">\n <ImageIcon className=\"size-3 text-muted-foreground\" />\n <span className=\"text-[11px] font-medium text-muted-foreground\">\n Generated image\n </span>\n </div>\n <img\n src={`data:image/png;base64,${parsed.imagePng}`}\n alt=\"Python output\"\n className=\"max-w-full rounded-md border border-border/40\"\n />\n </div>\n )}\n\n {/* Created assets */}\n {isComplete && parsed && parsed.createdAssets.length > 0 && (\n <div className=\"border-t border-border/40 px-4 py-2\">\n <span className=\"text-[11px] font-medium text-muted-foreground\">\n Created assets\n </span>\n <div className=\"mt-1 flex flex-wrap gap-1.5\">\n {parsed.createdAssets.map((a) => (\n <button\n type=\"button\"\n key={a.asset_id}\n onClick={() => openAsset(a.asset_id)}\n className=\"flex items-center gap-1 rounded-md border border-border/60 px-2 py-1 text-[11px] font-medium text-muted-foreground transition-colors hover:bg-muted/50 hover:text-foreground\"\n >\n <ExternalLinkIcon className=\"size-2.5\" />\n {truncate(a.asset_id, 20)}\n </button>\n ))}\n </div>\n </div>\n )}\n </ToolCard>\n );\n};\n\nexport const RunPythonCodeToolUI = memo(\n RunPythonCodeToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nRunPythonCodeToolUI.displayName = \"RunPythonCodeToolUI\";\n\nconst ExecutePresentationCodeToolUIImpl: ToolCallMessagePartComponent = ({\n toolName,\n args,\n result,\n status,\n}) => {\n const typedArgs = args as Record<string, unknown> | undefined;\n const code = (typedArgs?.code ?? \"\") as string;\n const summary = (typedArgs?.summary as string) ?? null;\n const deckIdFromArgs =\n getStringField(typedArgs, [\"deck_id\", \"deckId\", \"asset_id\", \"assetId\"]) ??\n getPresentationCodeDeckId(code);\n\n const isRunning = status?.type === \"running\";\n const isComplete = status?.type === \"complete\";\n const errorMsg =\n status?.type === \"incomplete\" ? (status.error as string) : null;\n\n const parsed = useMemo(\n () => (isComplete ? parsePythonResult(result) : null),\n [result, isComplete],\n );\n const resultData = useMemo(() => normalizeResult(result), [result]);\n const outputText = parsed ? getExecutionTextOutput(parsed) : null;\n const targetSlideNumber = getPresentationCodeSlideNumber({\n args: typedArgs,\n result: resultData,\n });\n const deckId = parsed?.deckId ?? deckIdFromArgs;\n const assetId =\n parsed?.assetId ?? (deckId?.startsWith(\"asset_\") ? deckId : null);\n const hasError = parsed && (parsed.error || parsed.exception);\n const openAsset = useAssetPanelStore((s) => s.openAsset);\n\n useEffect(() => {\n if (!isComplete) {\n return;\n }\n\n logDebugPayload(\"[Athena SDK execute_presentation_code] tool state\", {\n args: typedArgs,\n parsedResult: resultData,\n status,\n assetId,\n deckId,\n targetSlideNumber,\n outputText,\n });\n }, [\n assetId,\n deckId,\n isComplete,\n outputText,\n resultData,\n status,\n targetSlideNumber,\n typedArgs,\n ]);\n\n const openPresentation = useCallback(() => {\n if (!assetId) {\n return;\n }\n\n logDebugPayload(\"[Athena SDK execute_presentation_code] open deck\", {\n args: typedArgs,\n parsedResult: resultData,\n assetId,\n deckId,\n targetSlideNumber,\n });\n openAsset(assetId, {\n type: \"presentation\",\n ...(targetSlideNumber !== undefined\n ? { slideNumber: targetSlideNumber }\n : {}),\n });\n }, [assetId, deckId, openAsset, resultData, targetSlideNumber, typedArgs]);\n\n return (\n <ToolCard\n icon={PresentationIcon}\n status={status?.type ?? \"complete\"}\n title={\n isRunning\n ? summary || \"Executing presentation code...\"\n : summary || \"Presentation updated\"\n }\n subtitle={\n deckId\n ? `Deck ${truncate(deckId, 24)}`\n : assetId\n ? `Asset ${truncate(assetId, 24)}`\n : undefined\n }\n badge=\"Deck\"\n toolName={toolName}\n args={typedArgs as Record<string, unknown>}\n result={result}\n error={errorMsg}\n >\n {assetId && isComplete && (\n <div className=\"border-t border-border/40 px-4 py-2.5\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"text-[11px] font-medium text-muted-foreground\">\n Open the updated deck in the asset panel\n </div>\n <div className=\"truncate text-[11px] text-foreground/80\">\n {truncate(assetId, 32)}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={openPresentation}\n className=\"flex shrink-0 items-center gap-1.5 rounded-md border border-border/60 px-3 py-1.5 text-xs font-medium text-muted-foreground transition-colors hover:bg-muted/50 hover:text-foreground\"\n >\n <ExternalLinkIcon className=\"size-3\" />\n {targetSlideNumber ? `Open slide ${targetSlideNumber}` : \"Open deck\"}\n </button>\n </div>\n </div>\n )}\n\n {code && (\n <ExpandableSection label=\"Show code\">\n <SyntaxHighlightedCode code={code} />\n </ExpandableSection>\n )}\n\n {isComplete && outputText && (\n <div className=\"border-t border-border/40 px-4 py-2.5\">\n <div className=\"mb-1 flex items-center gap-1.5\">\n <TerminalIcon className=\"size-3 text-muted-foreground\" />\n <span className=\"text-[11px] font-medium text-muted-foreground\">\n Execution log\n </span>\n </div>\n <pre className=\"max-h-56 overflow-auto whitespace-pre-wrap break-words rounded-md bg-muted/30 p-2 text-[11px] leading-relaxed font-mono text-foreground/80\">\n {outputText}\n </pre>\n </div>\n )}\n\n {isComplete && hasError && (\n <div className=\"border-t border-border/40 bg-destructive/10 px-4 py-2.5\">\n <div className=\"mb-1 flex items-center gap-1.5\">\n <AlertTriangleIcon className=\"size-3 text-destructive\" />\n <span className=\"text-[11px] font-medium text-destructive\">\n {parsed.exception\n ? `${parsed.exception.name}: ${parsed.exception.value}`\n : \"Execution error\"}\n </span>\n </div>\n <pre className=\"max-h-48 overflow-auto whitespace-pre-wrap break-words rounded-md bg-destructive/5 p-2 text-[11px] leading-relaxed font-mono text-destructive/80\">\n {parsed.exception?.traceback ?? parsed.error}\n </pre>\n </div>\n )}\n\n {isComplete && parsed && parsed.createdAssets.length > 0 && (\n <div className=\"border-t border-border/40 px-4 py-2\">\n <span className=\"text-[11px] font-medium text-muted-foreground\">\n Created assets\n </span>\n <div className=\"mt-1 flex flex-wrap gap-1.5\">\n {parsed.createdAssets.map((entry) => (\n <button\n type=\"button\"\n key={entry.asset_id}\n onClick={() => openAsset(entry.asset_id)}\n className=\"flex items-center gap-1 rounded-md border border-border/60 px-2 py-1 text-[11px] font-medium text-muted-foreground transition-colors hover:bg-muted/50 hover:text-foreground\"\n >\n <ExternalLinkIcon className=\"size-2.5\" />\n {truncate(entry.asset_id, 20)}\n </button>\n ))}\n </div>\n </div>\n )}\n </ToolCard>\n );\n};\n\nexport const ExecutePresentationCodeToolUI = memo(\n ExecutePresentationCodeToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nExecutePresentationCodeToolUI.displayName = \"ExecutePresentationCodeToolUI\";\n\n// ─── Open Asset In Workspace Tool UI ─────────────────────────────────\n\nconst OpenAssetToolUIImpl: ToolCallMessagePartComponent = ({\n toolName,\n args,\n result,\n status,\n}) => {\n const typedArgs = args as Record<string, unknown> | undefined;\n const argsAssetId = (typedArgs?.asset_id ??\n typedArgs?.assetId ??\n \"\") as string;\n const resultAssetId = extractAssetId(result);\n const assetId =\n resultAssetId ?? (argsAssetId.startsWith(\"asset_\") ? argsAssetId : null);\n\n const isRunning = status?.type === \"running\";\n const isComplete = status?.type === \"complete\" || !status;\n const isCancelled =\n status?.type === \"incomplete\" && status.reason === \"cancelled\";\n const errorMsg =\n status?.type === \"incomplete\" ? (status.error as string) : null;\n\n const openAsset = useAssetPanelStore((s) => s.openAsset);\n\n return (\n <ToolCard\n icon={FolderOpenIcon}\n status={(status?.type ?? \"complete\") as ToolStatus}\n title={isRunning ? \"Opening asset...\" : \"Asset opened\"}\n subtitle={assetId ? truncate(assetId, 30) : undefined}\n toolName={toolName}\n args={typedArgs as Record<string, unknown>}\n result={result}\n error={errorMsg}\n >\n {assetId && isComplete && !isCancelled && (\n <div className=\"border-t border-border/40 px-4 py-2\">\n <button\n type=\"button\"\n onClick={() => openAsset(assetId)}\n className=\"flex items-center gap-1.5 rounded-md border border-border/60 px-3 py-1.5 text-xs font-medium text-muted-foreground transition-colors hover:bg-muted/50 hover:text-foreground\"\n >\n <ExternalLinkIcon className=\"size-3\" />\n Open asset\n </button>\n </div>\n )}\n </ToolCard>\n );\n};\n\nexport const OpenAssetToolUI = memo(\n OpenAssetToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nOpenAssetToolUI.displayName = \"OpenAssetToolUI\";\n\n// ─── Database Tool UIs ───────────────────────────────────────────────\n\ninterface DatabaseTableInfo {\n table_name: string;\n schema_name?: string;\n row_count?: number;\n}\n\ninterface DatabaseColumnInfo {\n name: string;\n data_type: string;\n is_nullable?: boolean;\n default_value?: string | null;\n max_length?: number | null;\n}\n\n/** Describe Database — shows database overview (name, provider, table count, status). */\nconst DescribeDatabaseToolUIImpl: ToolCallMessagePartComponent = ({\n toolName,\n args,\n result,\n status,\n}) => {\n const typedArgs = args as Record<string, unknown> | undefined;\n const data = useMemo(() => normalizeResult(result), [result]);\n\n const title = typeof data?.title === \"string\" ? data.title : null;\n const provider = typeof data?.provider === \"string\" ? data.provider : null;\n const databaseName =\n typeof data?.database_name === \"string\" ? data.database_name : null;\n const tableCount =\n typeof data?.table_count === \"number\" ? data.table_count : null;\n const dbStatus = typeof data?.status === \"string\" ? data.status : null;\n\n const isRunning = status?.type === \"running\";\n const isComplete = status?.type === \"complete\";\n const errorMsg =\n status?.type === \"incomplete\" ? (status.error as string) : null;\n\n return (\n <ToolCard\n icon={DatabaseIcon}\n status={status?.type ?? \"complete\"}\n title={\n isRunning\n ? \"Inspecting database...\"\n : title\n ? `Database: ${title}`\n : \"Database overview\"\n }\n subtitle={databaseName ?? undefined}\n toolName={toolName}\n args={typedArgs as Record<string, unknown>}\n result={result}\n badge={\n isComplete && tableCount !== null\n ? `${tableCount} ${tableCount === 1 ? \"table\" : \"tables\"}`\n : undefined\n }\n error={errorMsg}\n >\n {isComplete && (title || provider || databaseName || dbStatus) && (\n <div className=\"border-t border-border/40 px-4 py-2.5\">\n <div className=\"grid grid-cols-2 gap-x-4 gap-y-2 text-[11px]\">\n {title && (\n <div className=\"flex flex-col gap-0.5 min-w-0\">\n <span className=\"font-medium text-muted-foreground\">Name</span>\n <span className=\"truncate text-foreground/80\">{title}</span>\n </div>\n )}\n {provider && (\n <div className=\"flex flex-col gap-0.5 min-w-0\">\n <span className=\"font-medium text-muted-foreground\">\n Provider\n </span>\n <span className=\"truncate text-foreground/80 capitalize\">\n {provider}\n </span>\n </div>\n )}\n {databaseName && (\n <div className=\"flex flex-col gap-0.5 min-w-0\">\n <span className=\"font-medium text-muted-foreground\">\n Database\n </span>\n <span className=\"truncate font-mono text-foreground/80\">\n {databaseName}\n </span>\n </div>\n )}\n {dbStatus && (\n <div className=\"flex flex-col gap-0.5 min-w-0\">\n <span className=\"font-medium text-muted-foreground\">\n Status\n </span>\n <span\n className={cn(\n \"inline-flex w-fit items-center gap-1 rounded-full px-1.5 py-0.5 text-[10px] font-medium capitalize\",\n dbStatus === \"active\"\n ? \"bg-emerald-50 text-emerald-700\"\n : \"bg-muted text-muted-foreground\",\n )}\n >\n <span\n className={cn(\n \"size-1.5 rounded-full\",\n dbStatus === \"active\"\n ? \"bg-emerald-500\"\n : \"bg-muted-foreground\",\n )}\n />\n {dbStatus}\n </span>\n </div>\n )}\n </div>\n </div>\n )}\n </ToolCard>\n );\n};\n\nexport const DescribeDatabaseToolUI = memo(\n DescribeDatabaseToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nDescribeDatabaseToolUI.displayName = \"DescribeDatabaseToolUI\";\n\n/** List Database Tables — shows tables with row counts. */\nconst ListDatabaseTablesToolUIImpl: ToolCallMessagePartComponent = ({\n toolName,\n args,\n result,\n status,\n}) => {\n const typedArgs = args as Record<string, unknown> | undefined;\n const data = useMemo(() => normalizeResult(result), [result]);\n\n const tables: DatabaseTableInfo[] = useMemo(() => {\n if (!data || !Array.isArray(data.tables)) return [];\n return (data.tables as unknown[]).map((t) => {\n const item = (t ?? {}) as Record<string, unknown>;\n return {\n table_name:\n typeof item.table_name === \"string\" ? item.table_name : \"\",\n schema_name:\n typeof item.schema_name === \"string\" ? item.schema_name : undefined,\n row_count:\n typeof item.row_count === \"number\" ? item.row_count : undefined,\n };\n });\n }, [data]);\n\n const isRunning = status?.type === \"running\";\n const isComplete = status?.type === \"complete\";\n const errorMsg =\n status?.type === \"incomplete\" ? (status.error as string) : null;\n\n return (\n <ToolCard\n icon={TableIcon}\n status={status?.type ?? \"complete\"}\n title={isRunning ? \"Listing database tables...\" : \"Database tables\"}\n toolName={toolName}\n args={typedArgs as Record<string, unknown>}\n result={result}\n badge={\n isComplete && tables.length > 0\n ? `${tables.length} ${tables.length === 1 ? \"table\" : \"tables\"}`\n : undefined\n }\n error={errorMsg}\n >\n {isComplete && tables.length > 0 && (\n <ExpandableSection\n label=\"Show tables\"\n defaultOpen={tables.length <= 10}\n >\n <div className=\"flex flex-col gap-0.5\">\n {tables.map((t) => {\n const qualified = t.schema_name\n ? `${t.schema_name}.${t.table_name}`\n : t.table_name;\n return (\n <div\n key={qualified}\n className=\"flex items-center justify-between gap-3 rounded-md px-2 py-1 hover:bg-muted/40\"\n >\n <div className=\"flex min-w-0 items-center gap-1.5\">\n <TableIcon className=\"size-3 shrink-0 text-muted-foreground/60\" />\n <span className=\"truncate font-mono text-[12px] text-foreground/90\">\n {qualified}\n </span>\n </div>\n {t.row_count !== undefined && (\n <span className=\"shrink-0 text-[10px] tabular-nums text-muted-foreground\">\n {t.row_count.toLocaleString()}{\" \"}\n {t.row_count === 1 ? \"row\" : \"rows\"}\n </span>\n )}\n </div>\n );\n })}\n </div>\n </ExpandableSection>\n )}\n </ToolCard>\n );\n};\n\nexport const ListDatabaseTablesToolUI = memo(\n ListDatabaseTablesToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nListDatabaseTablesToolUI.displayName = \"ListDatabaseTablesToolUI\";\n\n/** Get Database Table Schema — shows columns, types, and nullability. */\nconst GetDatabaseTableSchemaToolUIImpl: ToolCallMessagePartComponent = ({\n toolName,\n args,\n result,\n status,\n}) => {\n const typedArgs = args as Record<string, unknown> | undefined;\n const data = useMemo(() => normalizeResult(result), [result]);\n\n const tableName =\n (typeof data?.table_name === \"string\" ? data.table_name : null) ??\n (typeof typedArgs?.table_name === \"string\" ? typedArgs.table_name : null);\n const schemaName =\n typeof data?.schema_name === \"string\" ? data.schema_name : null;\n\n const columns: DatabaseColumnInfo[] = useMemo(() => {\n if (!data || !Array.isArray(data.columns)) return [];\n return (data.columns as unknown[]).map((c) => {\n const item = (c ?? {}) as Record<string, unknown>;\n return {\n name: typeof item.name === \"string\" ? item.name : \"\",\n data_type: typeof item.data_type === \"string\" ? item.data_type : \"\",\n is_nullable:\n typeof item.is_nullable === \"boolean\" ? item.is_nullable : undefined,\n default_value:\n typeof item.default_value === \"string\" ? item.default_value : null,\n max_length:\n typeof item.max_length === \"number\" ? item.max_length : null,\n };\n });\n }, [data]);\n\n const isRunning = status?.type === \"running\";\n const isComplete = status?.type === \"complete\";\n const errorMsg =\n status?.type === \"incomplete\" ? (status.error as string) : null;\n\n const displayName = tableName\n ? schemaName\n ? `${schemaName}.${tableName}`\n : tableName\n : null;\n\n return (\n <ToolCard\n icon={TablePropertiesIcon}\n status={status?.type ?? \"complete\"}\n title={\n isRunning\n ? \"Reading table schema...\"\n : displayName\n ? `Schema: ${displayName}`\n : \"Table schema\"\n }\n toolName={toolName}\n args={typedArgs as Record<string, unknown>}\n result={result}\n badge={\n isComplete && columns.length > 0\n ? `${columns.length} ${columns.length === 1 ? \"column\" : \"columns\"}`\n : undefined\n }\n error={errorMsg}\n >\n {isComplete && columns.length > 0 && (\n <ExpandableSection\n label=\"Show columns\"\n defaultOpen={columns.length <= 12}\n >\n <div className=\"overflow-hidden rounded-md border border-border/40\">\n <table className=\"w-full text-[11px]\">\n <thead className=\"bg-muted/50\">\n <tr>\n <th className=\"px-2 py-1.5 text-left font-medium text-muted-foreground\">\n Column\n </th>\n <th className=\"px-2 py-1.5 text-left font-medium text-muted-foreground\">\n Type\n </th>\n <th className=\"px-2 py-1.5 text-right font-medium text-muted-foreground\">\n Nullable\n </th>\n </tr>\n </thead>\n <tbody>\n {columns.map((col) => {\n const typeLabel =\n col.max_length != null\n ? `${col.data_type}(${col.max_length})`\n : col.data_type;\n return (\n <tr\n key={col.name}\n className=\"border-t border-border/30\"\n title={\n col.default_value\n ? `default: ${col.default_value}`\n : undefined\n }\n >\n <td className=\"whitespace-nowrap px-2 py-1 font-mono text-foreground/90\">\n {col.name}\n </td>\n <td className=\"whitespace-nowrap px-2 py-1 text-muted-foreground\">\n {typeLabel}\n </td>\n <td className=\"whitespace-nowrap px-2 py-1 text-right\">\n {col.is_nullable === false ? (\n <span className=\"rounded bg-amber-50 px-1 py-0.5 text-[10px] font-medium text-amber-700\">\n NOT NULL\n </span>\n ) : (\n <span className=\"text-muted-foreground/50\">—</span>\n )}\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </ExpandableSection>\n )}\n </ToolCard>\n );\n};\n\nexport const GetDatabaseTableSchemaToolUI = memo(\n GetDatabaseTableSchemaToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nGetDatabaseTableSchemaToolUI.displayName = \"GetDatabaseTableSchemaToolUI\";\n\n// ─── SQL highlighter (lightweight) ───────────────────────────────────\n\nconst SQL_KEYWORDS = new Set([\n \"SELECT\", \"FROM\", \"WHERE\", \"JOIN\", \"LEFT\", \"RIGHT\", \"INNER\", \"OUTER\", \"FULL\",\n \"CROSS\", \"ON\", \"USING\", \"AND\", \"OR\", \"NOT\", \"IN\", \"IS\", \"NULL\", \"AS\", \"ORDER\",\n \"BY\", \"GROUP\", \"HAVING\", \"LIMIT\", \"OFFSET\", \"UNION\", \"ALL\", \"DISTINCT\",\n \"INSERT\", \"INTO\", \"VALUES\", \"UPDATE\", \"SET\", \"DELETE\", \"CREATE\", \"TABLE\",\n \"DROP\", \"ALTER\", \"ADD\", \"COLUMN\", \"INDEX\", \"PRIMARY\", \"KEY\", \"FOREIGN\",\n \"REFERENCES\", \"CONSTRAINT\", \"CASCADE\", \"CASE\", \"WHEN\", \"THEN\", \"ELSE\", \"END\",\n \"WITH\", \"RECURSIVE\", \"ASC\", \"DESC\", \"BETWEEN\", \"LIKE\", \"ILIKE\", \"EXISTS\",\n \"ANY\", \"SOME\", \"RETURNING\", \"OVER\", \"PARTITION\", \"WINDOW\",\n]);\n\nconst SQL_FUNCTIONS = new Set([\n \"COUNT\", \"SUM\", \"AVG\", \"MIN\", \"MAX\", \"ROUND\", \"CAST\", \"COALESCE\", \"NULLIF\",\n \"UPPER\", \"LOWER\", \"LENGTH\", \"SUBSTRING\", \"TRIM\", \"CONCAT\", \"DATE\", \"NOW\",\n \"CURRENT_DATE\", \"CURRENT_TIMESTAMP\", \"EXTRACT\", \"DATE_TRUNC\", \"ROW_NUMBER\",\n \"RANK\", \"DENSE_RANK\", \"LAG\", \"LEAD\",\n]);\n\nfunction highlightSql(code: string): string {\n let result = \"\";\n let i = 0;\n while (i < code.length) {\n // Line comment: -- rest of line\n if (code.slice(i, i + 2) === \"--\") {\n const end = code.indexOf(\"\\n\", i);\n const str = end >= 0 ? code.slice(i, end) : code.slice(i);\n result += `<span style=\"color:var(--aui-syn-comment, #6a9955)\">${escapeHtml(str)}</span>`;\n i += str.length;\n continue;\n }\n // Block comment: /* ... */\n if (code.slice(i, i + 2) === \"/*\") {\n const end = code.indexOf(\"*/\", i + 2);\n const str = end >= 0 ? code.slice(i, end + 2) : code.slice(i);\n result += `<span style=\"color:var(--aui-syn-comment, #6a9955)\">${escapeHtml(str)}</span>`;\n i += str.length;\n continue;\n }\n // Strings (single or double quoted, with SQL doubled-quote escaping)\n if (code[i] === \"'\" || code[i] === '\"') {\n const q = code[i];\n let j = i + 1;\n while (j < code.length) {\n if (code[j] === q) {\n // SQL doubled-quote escape: '' inside a '-delimited string\n if (j + 1 < code.length && code[j + 1] === q) { j += 2; continue; }\n break;\n }\n j++;\n }\n const str = code.slice(i, j + 1);\n result += `<span style=\"color:var(--aui-syn-string, #ce9178)\">${escapeHtml(str)}</span>`;\n i = j + 1;\n continue;\n }\n // Numbers\n if (\n /\\d/.test(code[i]) &&\n (i === 0 || /[\\s(,=[\\-+*/:!<>]/.test(code[i - 1]))\n ) {\n const m = code.slice(i).match(/^(\\d+\\.?\\d*)/);\n if (m) {\n result += `<span style=\"color:var(--aui-syn-number, #b5cea8)\">${escapeHtml(m[1])}</span>`;\n i += m[1].length;\n continue;\n }\n }\n // Words\n if (/[a-zA-Z_]/.test(code[i])) {\n const m = code.slice(i).match(/^[a-zA-Z_]\\w*/);\n if (m) {\n const word = m[0];\n const upper = word.toUpperCase();\n if (SQL_KEYWORDS.has(upper)) {\n result += `<span style=\"color:var(--aui-syn-keyword, #569cd6)\">${escapeHtml(word)}</span>`;\n } else if (SQL_FUNCTIONS.has(upper)) {\n result += `<span style=\"color:var(--aui-syn-func, #dcdcaa)\">${escapeHtml(word)}</span>`;\n } else {\n result += escapeHtml(word);\n }\n i += word.length;\n continue;\n }\n }\n result += escapeHtml(code[i]);\n i++;\n }\n return result;\n}\n\nconst SyntaxHighlightedSql: FC<{ code: string }> = memo(({ code }) => {\n const highlighted = useMemo(() => highlightSql(code), [code]);\n return (\n <pre\n className=\"whitespace-pre-wrap break-words text-[11px] leading-relaxed font-mono\"\n // biome-ignore lint: html from our own highlighter, not user content\n dangerouslySetInnerHTML={{ __html: highlighted }}\n />\n );\n});\nSyntaxHighlightedSql.displayName = \"SyntaxHighlightedSql\";\n\n// ─── Run SQL Tool UI ─────────────────────────────────────────────────\n\ninterface SqlQueryResult {\n columns: string[];\n rows: Array<Record<string, unknown>>;\n rowCount: number | null;\n}\n\nfunction parseSqlResult(result: unknown): SqlQueryResult {\n const empty: SqlQueryResult = { columns: [], rows: [], rowCount: null };\n const data = normalizeResult(result);\n if (!data) return empty;\n\n // Unwrap a nested `result` field if present\n const inner =\n data.result && typeof data.result === \"object\" && !Array.isArray(data.result)\n ? (data.result as Record<string, unknown>)\n : data;\n\n const rawRows = (inner.rows ?? inner.data ?? inner.records) as unknown;\n if (!Array.isArray(rawRows)) return empty;\n\n const rows = rawRows.filter(\n (r): r is Record<string, unknown> =>\n typeof r === \"object\" && r !== null && !Array.isArray(r),\n );\n\n // Columns: explicit field first, then infer from first row\n let columns: string[] = [];\n if (Array.isArray(inner.columns)) {\n columns = (inner.columns as unknown[])\n .map((c) => {\n if (typeof c === \"string\") return c;\n if (c && typeof c === \"object\") {\n const name = (c as Record<string, unknown>).name;\n return typeof name === \"string\" ? name : null;\n }\n return null;\n })\n .filter((c): c is string => c !== null);\n }\n if (columns.length === 0 && rows.length > 0) {\n columns = Object.keys(rows[0]);\n }\n\n const rowCount =\n typeof inner.row_count === \"number\"\n ? inner.row_count\n : typeof inner.rowCount === \"number\"\n ? inner.rowCount\n : rows.length;\n\n return { columns, rows, rowCount };\n}\n\nconst RunSqlToolUIImpl: ToolCallMessagePartComponent = ({\n toolName,\n args,\n result,\n status,\n}) => {\n const typedArgs = args as Record<string, unknown> | undefined;\n const sqlQuery =\n (typedArgs?.sql_query as string) ??\n (typedArgs?.query as string) ??\n (typedArgs?.sql as string) ??\n \"\";\n const trimmedQuery = sqlQuery.trim();\n\n const isRunning = status?.type === \"running\";\n const isComplete = status?.type === \"complete\";\n const errorMsg =\n status?.type === \"incomplete\" ? (status.error as string) : null;\n\n const parsed = useMemo(\n () => (isComplete ? parseSqlResult(result) : null),\n [result, isComplete],\n );\n\n // Collapse whitespace for a one-line subtitle preview\n const querySubtitle = useMemo(() => {\n if (!trimmedQuery) return undefined;\n const oneLine = trimmedQuery.replace(/\\s+/g, \" \");\n return truncate(oneLine, 80);\n }, [trimmedQuery]);\n\n return (\n <ToolCard\n icon={PlayIcon}\n status={status?.type ?? \"complete\"}\n title={isRunning ? \"Running SQL query...\" : \"SQL query\"}\n subtitle={querySubtitle}\n toolName={toolName}\n args={typedArgs as Record<string, unknown>}\n result={result}\n badge={\n isComplete && parsed && parsed.rowCount !== null\n ? `${parsed.rowCount} ${parsed.rowCount === 1 ? \"row\" : \"rows\"}`\n : undefined\n }\n error={errorMsg}\n >\n {trimmedQuery && (\n <ExpandableSection\n label=\"Show query\"\n defaultOpen={isComplete && (!parsed || parsed.rows.length === 0)}\n >\n <SyntaxHighlightedSql code={trimmedQuery} />\n </ExpandableSection>\n )}\n\n {isComplete && parsed && parsed.rows.length > 0 && (\n <div className=\"border-t border-border/40\">\n <div className=\"max-h-72 overflow-auto\">\n <table className=\"w-full text-[11px]\">\n <thead className=\"sticky top-0 bg-muted/60 backdrop-blur\">\n <tr>\n {parsed.columns.map((col) => (\n <th\n key={col}\n className=\"whitespace-nowrap px-2 py-1.5 text-left font-medium text-muted-foreground\"\n >\n {col}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {parsed.rows.slice(0, 50).map((row, i) => (\n <tr\n key={i}\n className=\"border-t border-border/30 hover:bg-muted/20\"\n >\n {parsed.columns.map((col) => {\n const value = row[col];\n const isNull = value === null || value === undefined;\n const str = isNull\n ? \"\"\n : typeof value === \"object\"\n ? JSON.stringify(value)\n : String(value);\n return (\n <td\n key={col}\n className=\"max-w-[240px] truncate whitespace-nowrap px-2 py-1 text-foreground/80\"\n title={isNull ? \"null\" : str}\n >\n {isNull ? (\n <span className=\"italic text-muted-foreground/60\">\n null\n </span>\n ) : (\n str\n )}\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {(parsed.rows.length > 50 || (parsed.rowCount !== null && parsed.rowCount > parsed.rows.length)) && (\n <div className=\"border-t border-border/30 px-4 py-1.5 text-[10px] text-muted-foreground\">\n Showing first {Math.min(50, parsed.rows.length)} of {parsed.rowCount ?? parsed.rows.length} rows\n </div>\n )}\n </div>\n )}\n\n {isComplete &&\n parsed &&\n parsed.rows.length === 0 &&\n parsed.rowCount === 0 && (\n <div className=\"border-t border-border/40 px-4 py-2.5\">\n <span className=\"text-[11px] italic text-muted-foreground\">\n Query returned no rows\n </span>\n </div>\n )}\n </ToolCard>\n );\n};\n\nexport const RunSqlToolUI = memo(\n RunSqlToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nRunSqlToolUI.displayName = \"RunSqlToolUI\";\n\n// ─── Update Sheet Range Tool UI ──────────────────────────────────────\n\ninterface SheetCellData {\n value?: string | number | boolean | null;\n formula?: string | null;\n}\n\n/** Parse A1 range string to extract the starting column letter and row number. */\nfunction parseA1Range(range: string): { startCol: string; startRow: number } | null {\n // Strip sheet prefix like \"'Sheet 2'!A1:C20\" → \"A1:C20\"\n const stripped = range.replace(/^(?:'[^']+'|[^'!]+)!/, \"\");\n const match = stripped.match(/^([A-Z]+)(\\d+)/i);\n if (!match) return null;\n return { startCol: match[1].toUpperCase(), startRow: parseInt(match[2], 10) };\n}\n\n/** Convert column number (1-based) to letter (A, B, ..., Z, AA, AB, ...). */\nfunction colNumToLetter(n: number): string {\n let result = \"\";\n let num = n;\n while (num > 0) {\n num--;\n result = String.fromCharCode(65 + (num % 26)) + result;\n num = Math.floor(num / 26);\n }\n return result;\n}\n\n/** Convert cells 2D array (CellData or plain values) to string[][] for display. */\nfunction parseCellsToGrid(\n cells: unknown,\n): string[][] | null {\n let parsed: unknown[][] | null = null;\n\n if (typeof cells === \"string\") {\n try {\n parsed = JSON.parse(cells) as unknown[][];\n } catch {\n return null;\n }\n } else if (Array.isArray(cells)) {\n parsed = cells as unknown[][];\n }\n\n if (!parsed || !Array.isArray(parsed)) return null;\n\n return parsed.map((row) => {\n if (!Array.isArray(row)) return [];\n return row.map((cell) => {\n if (cell == null) return \"\";\n if (typeof cell === \"object\" && cell !== null) {\n const c = cell as SheetCellData;\n if (c.formula) return c.formula;\n if (c.value !== undefined && c.value !== null) return String(c.value);\n return \"\";\n }\n return String(cell);\n });\n });\n}\n\nconst MAX_SHEET_DISPLAY_ROWS = 30;\n\n/**\n * A single data-validation rejection returned by the backend write when a\n * value violates a strict rule (mirrors the Olympus tool UI + the converter's\n * `DataValidationViolation`).\n */\ninterface SheetDataValidationViolation {\n address?: string;\n allowed?: string[];\n constraint?: string;\n}\n\n// Keep the card's message concise: list the first few offending cells and\n// collapse the rest into a \"+N more\" suffix.\nconst MAX_LISTED_DV_VIOLATIONS = 3;\n\n/**\n * A rejected `update_sheet_range` write (data-validation violation, no-op, or\n * other failure) comes back as `success: false` rather than raising, so build a\n * concise, user-facing reason for the tool card instead of a false \"Updated\"\n * success. Prefers naming the offending cells and their allowed values, then\n * falls back to the backend error string, then a generic message.\n */\nexport function buildSheetUpdateFailureMessage(\n data: Record<string, unknown> | null,\n range: string,\n): string {\n const rawViolations = data?.dataValidationViolations;\n const violations: SheetDataValidationViolation[] = Array.isArray(rawViolations)\n ? (rawViolations as SheetDataValidationViolation[])\n : [];\n if (violations.length > 0) {\n const listed: string[] = violations\n .slice(0, MAX_LISTED_DV_VIOLATIONS)\n .map((v) => {\n const expectation: string =\n v.allowed && v.allowed.length > 0\n ? `only allows ${v.allowed.join(\", \")}`\n : `rejected the value${v.constraint ? ` (${v.constraint})` : \"\"}`;\n return `${v.address ?? \"cell\"} ${expectation}`;\n });\n const more: string =\n violations.length > MAX_LISTED_DV_VIOLATIONS\n ? ` (+${violations.length - MAX_LISTED_DV_VIOLATIONS} more)`\n : \"\";\n return `Data validation blocked this update — nothing was written: ${listed.join(\"; \")}${more}`;\n }\n const errorStr = typeof data?.error === \"string\" ? data.error : null;\n if (errorStr) return errorStr;\n return `Update to ${range || \"the sheet\"} was rejected — nothing was written`;\n}\n\nconst UpdateSheetRangeToolUIImpl: ToolCallMessagePartComponent = ({\n toolName,\n args,\n result,\n status,\n}) => {\n const typedArgs = args as Record<string, unknown> | undefined;\n const range = (typedArgs?.range as string) ?? \"\";\n const explanation = (typedArgs?.explanation as string) ?? \"\";\n const assetId =\n (typedArgs?.asset_id as string) ??\n (typedArgs?.assetId as string) ??\n \"\";\n\n const data = useMemo(() => normalizeResult(result), [result]);\n const success = data?.success === true;\n const resultAssetId = extractAssetId(result);\n\n const isRunning = status?.type === \"running\";\n const isComplete = status?.type === \"complete\";\n // A rejected write (data-validation violation, no-op, or other failure)\n // comes back as success:false rather than raising, so surface it as an error\n // card instead of a false \"Updated\" success.\n const isFailure = isComplete && data?.success === false;\n const errorMsg = isFailure\n ? buildSheetUpdateFailureMessage(data, range)\n : status?.type === \"incomplete\"\n ? (status.error as string)\n : null;\n\n // Parse cells for table preview\n const grid = useMemo(\n () => parseCellsToGrid(typedArgs?.cells),\n [typedArgs?.cells],\n );\n\n const rangeInfo = useMemo(() => parseA1Range(range), [range]);\n\n // Build a table with column headers (A, B, ...) and row numbers\n const { headers, displayRows, totalRows } = useMemo(() => {\n if (!grid || grid.length === 0) {\n return { headers: [] as string[], displayRows: [] as string[][], totalRows: 0 };\n }\n const maxCols = Math.max(...grid.map((r) => r.length));\n const startColNum = rangeInfo\n ? rangeInfo.startCol.split(\"\").reduce((acc, c) => acc * 26 + c.charCodeAt(0) - 64, 0)\n : 1;\n const hdrs = Array.from({ length: maxCols }, (_, i) =>\n colNumToLetter(startColNum + i),\n );\n const capped = grid.slice(0, MAX_SHEET_DISPLAY_ROWS);\n return { headers: hdrs, displayRows: capped, totalRows: grid.length };\n }, [grid, rangeInfo]);\n\n const openAsset = useAssetPanelStore((s) => s.openAsset);\n const effectiveAssetId = resultAssetId ?? (assetId.startsWith(\"asset_\") ? assetId : null);\n\n const title = isRunning\n ? explanation\n ? `Updating ${range}: ${explanation}`\n : `Updating sheet range ${range}...`\n : isFailure\n ? `Update to ${range || \"sheet\"} rejected`\n : explanation\n ? `Updated ${range}: ${explanation}`\n : `Updated sheet range ${range}`;\n\n return (\n <ToolCard\n icon={SheetIcon}\n status={isFailure ? \"incomplete\" : (status?.type ?? \"complete\")}\n title={truncate(title, 80)}\n subtitle={\n !explanation && range\n ? `Range: ${range}`\n : undefined\n }\n toolName={toolName}\n args={typedArgs as Record<string, unknown>}\n result={result}\n badge={\n isComplete && success && grid\n ? `${totalRows} ${totalRows === 1 ? \"row\" : \"rows\"}`\n : undefined\n }\n error={errorMsg}\n >\n {/* Data preview table */}\n {headers.length > 0 && displayRows.length > 0 && (\n <ExpandableSection\n label={`Show data (${totalRows} ${totalRows === 1 ? \"row\" : \"rows\"})`}\n defaultOpen={totalRows <= 10}\n >\n <div className=\"overflow-auto max-h-72\">\n <table className=\"w-full text-[11px]\">\n <thead className=\"sticky top-0 bg-muted/60 backdrop-blur\">\n <tr>\n {/* Row number column */}\n <th className=\"w-8 px-1.5 py-1 text-right font-medium text-muted-foreground/60\">\n #\n </th>\n {headers.map((h) => (\n <th\n key={h}\n className=\"whitespace-nowrap px-2 py-1 text-center font-medium text-muted-foreground\"\n >\n {h}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {displayRows.map((row, i) => {\n const rowNum = (rangeInfo?.startRow ?? 1) + i;\n return (\n <tr key={i} className=\"border-t border-border/30 hover:bg-muted/20\">\n <td className=\"w-8 px-1.5 py-0.5 text-right tabular-nums text-muted-foreground/60\">\n {rowNum}\n </td>\n {headers.map((h, j) => {\n const val = row[j] ?? \"\";\n const isFormula = typeof val === \"string\" && val.startsWith(\"=\");\n return (\n <td\n key={h}\n className={cn(\n \"max-w-[180px] truncate whitespace-nowrap px-2 py-0.5 text-foreground/80\",\n isFormula && \"font-mono text-blue-600\",\n )}\n title={val}\n >\n {val || (\n <span className=\"text-muted-foreground/30\">—</span>\n )}\n </td>\n );\n })}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n {totalRows > MAX_SHEET_DISPLAY_ROWS && (\n <div className=\"px-2 py-1 text-[10px] text-muted-foreground\">\n Showing first {MAX_SHEET_DISPLAY_ROWS} of {totalRows} rows\n </div>\n )}\n </ExpandableSection>\n )}\n\n {/* Open asset button */}\n {effectiveAssetId && isComplete && !errorMsg && (\n <div className=\"border-t border-border/40 px-4 py-2\">\n <button\n type=\"button\"\n onClick={() =>\n openAsset(effectiveAssetId, { type: \"spreadsheet\" })\n }\n className=\"flex items-center gap-1.5 rounded-md border border-border/60 px-3 py-1.5 text-xs font-medium text-muted-foreground transition-colors hover:bg-muted/50 hover:text-foreground\"\n >\n <ExternalLinkIcon className=\"size-3\" />\n Open spreadsheet\n </button>\n </div>\n )}\n </ToolCard>\n );\n};\n\nexport const UpdateSheetRangeToolUI = memo(\n UpdateSheetRangeToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nUpdateSheetRangeToolUI.displayName = \"UpdateSheetRangeToolUI\";\n\n// ─── Bulk Format Sheet Range Tool UI ─────────────────────────────────\n\ntype SheetFormatOperationSummary = {\n assetId: string | null;\n explanation: string | null;\n range: string;\n styleSummary: string;\n};\n\nfunction parseJsonArray(text: string): unknown[] | null {\n try {\n const parsed = JSON.parse(text);\n return Array.isArray(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\nfunction getFirstSheetCellStyle(\n operation: Record<string, unknown>,\n): Record<string, unknown> | null {\n const cells = operation.cells;\n const rows = typeof cells === \"string\" ? parseJsonArray(cells) : cells;\n if (!Array.isArray(rows)) {\n return null;\n }\n\n for (const row of rows) {\n if (!Array.isArray(row)) {\n continue;\n }\n for (const cell of row) {\n const cellRecord = asRecord(cell);\n const style = asRecord(\n cellRecord?.cellStyles ?? cellRecord?.cell_styles ?? cellRecord?.style,\n );\n if (style) {\n return style;\n }\n }\n }\n\n return null;\n}\n\nfunction summarizeSheetCellStyle(style: Record<string, unknown> | null): string {\n if (!style) {\n return \"Cell formatting\";\n }\n\n const parts: string[] = [];\n const textFormat = asRecord(style.textFormat ?? style.text_format);\n if (textFormat?.bold === true) {\n parts.push(\"bold\");\n }\n if (textFormat?.italic === true) {\n parts.push(\"italic\");\n }\n if (textFormat?.underline === true) {\n parts.push(\"underline\");\n }\n\n const fontSize = getNumberField(textFormat, [\"fontSize\", \"font_size\"]);\n if (fontSize != null) {\n parts.push(`${fontSize} pt`);\n }\n\n const textColor = getStringField(textFormat, [\n \"color_hex\",\n \"colorHex\",\n \"foregroundColor_hex\",\n \"foregroundColorHex\",\n ]);\n if (textColor) {\n parts.push(`text ${textColor}`);\n }\n\n const fillColor = getStringField(style, [\n \"backgroundColor_hex\",\n \"backgroundColorHex\",\n \"background_color_hex\",\n ]);\n if (fillColor) {\n parts.push(`fill ${fillColor}`);\n }\n\n const numberFormat = asRecord(style.numberFormat ?? style.number_format);\n const numberPattern = getStringField(numberFormat, [\"pattern\"]);\n const numberType = getStringField(numberFormat, [\"type\"]);\n if (numberPattern) {\n parts.push(numberPattern);\n } else if (numberType) {\n parts.push(numberType.toLowerCase());\n }\n\n const horizontalAlignment = getStringField(style, [\n \"horizontalAlignment\",\n \"horizontal_alignment\",\n ]);\n if (horizontalAlignment) {\n parts.push(`${horizontalAlignment.toLowerCase()} align`);\n }\n\n return parts.length > 0 ? parts.slice(0, 5).join(\", \") : \"Cell formatting\";\n}\n\nfunction parseSheetFormatOperations(\n operationsValue: unknown,\n): SheetFormatOperationSummary[] {\n const operations =\n typeof operationsValue === \"string\"\n ? parseJsonArray(operationsValue)\n : operationsValue;\n\n if (!Array.isArray(operations)) {\n return [];\n }\n\n return operations.flatMap((operation) => {\n const record = asRecord(operation);\n if (!record) {\n return [];\n }\n\n const range = getStringField(record, [\"range\"]) ?? \"\";\n if (!range) {\n return [];\n }\n\n const assetId = getStringField(record, [\"asset_id\", \"assetId\", \"id\"]);\n return [\n {\n assetId: assetId?.startsWith(\"asset_\") ? assetId : null,\n explanation: getStringField(record, [\"explanation\", \"summary\"]),\n range,\n styleSummary: summarizeSheetCellStyle(getFirstSheetCellStyle(record)),\n },\n ];\n });\n}\n\nfunction getSpreadsheetAssetIdFromOperations(\n operations: SheetFormatOperationSummary[],\n): string | null {\n return operations.find((operation) => operation.assetId)?.assetId ?? null;\n}\n\nfunction getSpreadsheetAssetIdFromArgs(\n args: Record<string, unknown> | undefined,\n): string | null {\n const assetId = getStringField(args, [\"asset_id\", \"assetId\", \"id\"]);\n return assetId?.startsWith(\"asset_\") ? assetId : null;\n}\n\nfunction summarizeSheetRanges(ranges: string[]): string | undefined {\n if (ranges.length === 0) {\n return undefined;\n }\n\n const visible = ranges.slice(0, 4);\n const remaining = ranges.length - visible.length;\n return remaining > 0\n ? `${visible.join(\", \")} +${remaining} more`\n : visible.join(\", \");\n}\n\nconst BulkFormatSheetRangeToolUIImpl: ToolCallMessagePartComponent = ({\n toolName,\n args,\n result,\n status,\n}) => {\n const typedArgs = args as Record<string, unknown> | undefined;\n const data = useMemo(() => normalizeResult(result), [result]);\n const operations = useMemo(\n () => parseSheetFormatOperations(typedArgs?.operations),\n [typedArgs?.operations],\n );\n const resultAssetId = extractAssetId(result);\n const argsAssetId = getSpreadsheetAssetIdFromArgs(typedArgs);\n const operationsAssetId = getSpreadsheetAssetIdFromOperations(operations);\n const effectiveAssetId = resultAssetId ?? argsAssetId ?? operationsAssetId;\n\n const isRunning = status?.type === \"running\";\n const isComplete = status?.type === \"complete\";\n const errorMsg =\n status?.type === \"incomplete\" ? (status.error as string) : null;\n\n const totalCount = getNumberField(data, [\"total\"]) ?? operations.length;\n const succeededCount =\n getNumberField(data, [\"succeeded\", \"success_count\", \"successCount\"]) ??\n (isComplete && totalCount > 0\n ? Math.max(totalCount - (getNumberField(data, [\"failed\"]) ?? 0), 0)\n : null);\n const failedCount = getNumberField(data, [\n \"failed\",\n \"failure_count\",\n \"failureCount\",\n ]);\n const rangesSummary = summarizeSheetRanges(\n operations.map((operation) => operation.range),\n );\n const visibleOperations = operations.slice(0, 24);\n const openAsset = useAssetPanelStore((s) => s.openAsset);\n\n const title = isRunning\n ? totalCount > 0\n ? `Formatting ${totalCount} sheet ${totalCount === 1 ? \"range\" : \"ranges\"}...`\n : \"Formatting spreadsheet ranges...\"\n : failedCount && failedCount > 0\n ? `Formatted ${succeededCount ?? 0} of ${totalCount} sheet ranges`\n : totalCount > 0\n ? `Formatted ${totalCount} sheet ${totalCount === 1 ? \"range\" : \"ranges\"}`\n : \"Formatted spreadsheet ranges\";\n\n return (\n <ToolCard\n icon={TablePropertiesIcon}\n status={status?.type ?? \"complete\"}\n title={truncate(title, 80)}\n subtitle={rangesSummary}\n toolName={toolName}\n args={typedArgs as Record<string, unknown>}\n result={result}\n badge={\n failedCount && failedCount > 0\n ? `${failedCount} failed`\n : totalCount > 0\n ? `${totalCount} ops`\n : undefined\n }\n error={errorMsg}\n >\n {operations.length > 0 && (\n <ExpandableSection\n label={`Show formatting operations (${operations.length})`}\n defaultOpen={operations.length <= 6}\n >\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-[11px]\">\n <thead>\n <tr className=\"border-b border-border/40 text-left text-muted-foreground\">\n <th className=\"w-20 pb-1.5 pr-3 font-medium\">Range</th>\n <th className=\"pb-1.5 pr-3 font-medium\">Purpose</th>\n <th className=\"pb-1.5 font-medium\">Style</th>\n </tr>\n </thead>\n <tbody>\n {visibleOperations.map((operation, index) => (\n <tr\n key={`${operation.range}-${index}`}\n className=\"border-t border-border/25 first:border-t-0\"\n >\n <td className=\"whitespace-nowrap py-1.5 pr-3 font-mono text-foreground/80\">\n {operation.range}\n </td>\n <td className=\"max-w-[220px] py-1.5 pr-3 text-foreground/75\">\n {operation.explanation ? (\n truncate(operation.explanation, 72)\n ) : (\n <span className=\"text-muted-foreground/40\">-</span>\n )}\n </td>\n <td className=\"max-w-[260px] py-1.5 text-muted-foreground\">\n {truncate(operation.styleSummary, 80)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {operations.length > visibleOperations.length && (\n <div className=\"pt-2 text-[10px] text-muted-foreground\">\n Showing first {visibleOperations.length} of {operations.length} operations\n </div>\n )}\n </ExpandableSection>\n )}\n\n {effectiveAssetId && isComplete && !errorMsg && (\n <div className=\"border-t border-border/40 px-4 py-2\">\n <button\n type=\"button\"\n onClick={() =>\n openAsset(effectiveAssetId, { type: \"spreadsheet\" })\n }\n className=\"flex items-center gap-1.5 rounded-md border border-border/60 px-3 py-1.5 text-xs font-medium text-muted-foreground transition-colors hover:bg-muted/50 hover:text-foreground\"\n >\n <ExternalLinkIcon className=\"size-3\" />\n Open spreadsheet\n </button>\n </div>\n )}\n </ToolCard>\n );\n};\n\nexport const BulkFormatSheetRangeToolUI = memo(\n BulkFormatSheetRangeToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nBulkFormatSheetRangeToolUI.displayName = \"BulkFormatSheetRangeToolUI\";\n\n// ─── Set Row Column Dimensions Tool UI ──────────────────────────────\n\ntype SheetDimensionSummary = {\n kind: string;\n shortValue: string | null;\n value: string | null;\n};\n\nfunction formatDimensionUnit(unit: string | null): string {\n if (!unit) {\n return \"\";\n }\n\n const normalized = unit.toLowerCase();\n if (normalized === \"pixels\" || normalized === \"pixel\") {\n return \"pixels\";\n }\n if (normalized === \"points\" || normalized === \"point\") {\n return \"points\";\n }\n return unit;\n}\n\nfunction formatShortDimensionUnit(unit: string | null): string {\n const normalized = unit?.toLowerCase();\n if (normalized === \"pixels\" || normalized === \"pixel\") {\n return \"px\";\n }\n if (normalized === \"points\" || normalized === \"point\") {\n return \"pt\";\n }\n return unit ?? \"\";\n}\n\nfunction parseDimensionMeasurement(\n value: unknown,\n): { value: string; shortValue: string } | null {\n const record = asRecord(value);\n if (record) {\n const numericValue = getNumberField(record, [\"value\"]);\n const stringValue = getStringField(record, [\"value\"]);\n const rawValue =\n numericValue != null\n ? String(numericValue)\n : stringValue\n ? stringValue\n : null;\n if (!rawValue) {\n return null;\n }\n\n const unit = getStringField(record, [\"type\", \"unit\"]);\n const formattedUnit = formatDimensionUnit(unit);\n const shortUnit = formatShortDimensionUnit(unit);\n return {\n value: formattedUnit ? `${rawValue} ${formattedUnit}` : rawValue,\n shortValue: shortUnit ? `${rawValue} ${shortUnit}` : rawValue,\n };\n }\n\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return { value: String(value), shortValue: String(value) };\n }\n if (typeof value === \"string\" && value.trim()) {\n return { value, shortValue: value };\n }\n\n return null;\n}\n\nfunction getSheetDimensionSummary(\n args: Record<string, unknown> | undefined,\n): SheetDimensionSummary {\n const width = parseDimensionMeasurement(args?.width);\n if (width) {\n return {\n kind: \"column width\",\n shortValue: width.shortValue,\n value: width.value,\n };\n }\n\n const height = parseDimensionMeasurement(args?.height);\n if (height) {\n return {\n kind: \"row height\",\n shortValue: height.shortValue,\n value: height.value,\n };\n }\n\n return {\n kind: \"row and column dimensions\",\n shortValue: null,\n value: null,\n };\n}\n\nfunction getToolResultText(\n result: unknown,\n data: Record<string, unknown> | null,\n): string | null {\n if (typeof result === \"string\" && result.trim()) {\n return result;\n }\n return getStringField(data, [\"message\", \"result\", \"summary\"]);\n}\n\nconst SetRowColumnDimensionsToolUIImpl: ToolCallMessagePartComponent = ({\n toolName,\n args,\n result,\n status,\n}) => {\n const typedArgs = args as Record<string, unknown> | undefined;\n const data = useMemo(() => normalizeResult(result), [result]);\n const range = getStringField(typedArgs, [\"range\"]) ?? \"\";\n const dimension = getSheetDimensionSummary(typedArgs);\n const effectiveAssetId =\n extractAssetId(result) ?? getSpreadsheetAssetIdFromArgs(typedArgs);\n const resultText = getToolResultText(result, data);\n const openAsset = useAssetPanelStore((s) => s.openAsset);\n\n const isRunning = status?.type === \"running\";\n const isComplete = status?.type === \"complete\";\n const errorMsg =\n status?.type === \"incomplete\" ? (status.error as string) : null;\n\n const title = isRunning\n ? `Setting ${dimension.kind}...`\n : range\n ? `Set ${dimension.kind} for ${range}`\n : `Set ${dimension.kind}`;\n\n return (\n <ToolCard\n icon={TablePropertiesIcon}\n status={status?.type ?? \"complete\"}\n title={truncate(title, 80)}\n subtitle={dimension.value ? `Value: ${dimension.value}` : undefined}\n toolName={toolName}\n args={typedArgs as Record<string, unknown>}\n result={result}\n badge={dimension.shortValue ?? undefined}\n error={errorMsg}\n >\n {(range || dimension.value || resultText) && isComplete && (\n <div className=\"border-t border-border/40 px-4 py-2.5\">\n <dl className=\"grid gap-2 text-[11px] sm:grid-cols-3\">\n {range && (\n <div>\n <dt className=\"font-medium text-muted-foreground\">Range</dt>\n <dd className=\"mt-0.5 font-mono text-foreground/80\">{range}</dd>\n </div>\n )}\n <div>\n <dt className=\"font-medium text-muted-foreground\">Dimension</dt>\n <dd className=\"mt-0.5 text-foreground/80\">{dimension.kind}</dd>\n </div>\n {dimension.value && (\n <div>\n <dt className=\"font-medium text-muted-foreground\">Value</dt>\n <dd className=\"mt-0.5 text-foreground/80\">{dimension.value}</dd>\n </div>\n )}\n </dl>\n {resultText && (\n <p className=\"mt-2 text-[11px] leading-relaxed text-muted-foreground\">\n {truncate(resultText, 160)}\n </p>\n )}\n </div>\n )}\n\n {effectiveAssetId && isComplete && !errorMsg && (\n <div className=\"border-t border-border/40 px-4 py-2\">\n <button\n type=\"button\"\n onClick={() =>\n openAsset(effectiveAssetId, { type: \"spreadsheet\" })\n }\n className=\"flex items-center gap-1.5 rounded-md border border-border/60 px-3 py-1.5 text-xs font-medium text-muted-foreground transition-colors hover:bg-muted/50 hover:text-foreground\"\n >\n <ExternalLinkIcon className=\"size-3\" />\n Open spreadsheet\n </button>\n </div>\n )}\n </ToolCard>\n );\n};\n\nexport const SetRowColumnDimensionsToolUI = memo(\n SetRowColumnDimensionsToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nSetRowColumnDimensionsToolUI.displayName = \"SetRowColumnDimensionsToolUI\";\n\n// ─── createAssetToolUI helper ────────────────────────────────────────\n// Public helper for creating simple asset tool UIs without knowing the schema.\n\nexport function createAssetToolUI(config: {\n icon: React.ElementType;\n assetType: AssetType;\n runningLabel: string;\n doneLabel: string;\n}): ToolCallMessagePartComponent {\n const Component: ToolCallMessagePartComponent = (props) => (\n <CreateAssetToolUIImpl\n icon={config.icon}\n assetType={config.assetType}\n runningLabel={config.runningLabel}\n doneLabel={config.doneLabel}\n {...props}\n />\n );\n const Memoized = memo(Component) as unknown as ToolCallMessagePartComponent;\n Memoized.displayName = `CreateAssetToolUI(${config.assetType})`;\n return Memoized;\n}\n\n// ─── Capture Moment Tool UI ──────────────────────────────────────────\n\nconst CaptureMomentToolUIImpl: ToolCallMessagePartComponent = ({\n toolName,\n args,\n result,\n status,\n}) => {\n const typedArgs = args as Record<string, unknown> | undefined;\n const timestamp = typedArgs?.timestamp as string | number | undefined;\n const startTime = typedArgs?.start_time as string | number | undefined;\n const endTime = typedArgs?.end_time as string | number | undefined;\n const sourceAssetId = (typedArgs?.asset_id ?? \"\") as string;\n\n const isClipMode = startTime != null && endTime != null;\n\n const data = useMemo(() => normalizeResult(result), [result]);\n const success = data?.success as boolean | undefined;\n const createdAssetId = extractAssetId(result);\n const resultType = (data?.type ?? (isClipMode ? \"video\" : \"image\")) as string;\n const resultTimestamp = (data?.timestamp ?? timestamp) as string | undefined;\n const timeRange = data?.time_range as\n | { start: string; end: string }\n | undefined;\n const errorMsg =\n status?.type === \"incomplete\"\n ? (status.error as string)\n : data && !success\n ? (data.error as string)\n : null;\n\n const isRunning = status?.type === \"running\";\n const isComplete = status?.type === \"complete\" || !status;\n const isCancelled =\n status?.type === \"incomplete\" && status.reason === \"cancelled\";\n\n const openAsset = useAssetPanelStore((s) => s.openAsset);\n\n const handleOpen = () => {\n if (createdAssetId) {\n openAsset(createdAssetId, {\n name: undefined,\n type: \"unknown\",\n });\n }\n };\n\n // Build subtitle\n let subtitle: string | undefined;\n if (isClipMode) {\n const rangeLabel =\n timeRange\n ? `${timeRange.start} → ${timeRange.end}`\n : `${startTime} → ${endTime}`;\n subtitle = `Clip: ${rangeLabel}`;\n } else if (resultTimestamp || timestamp) {\n subtitle = `Screenshot at ${resultTimestamp ?? timestamp}`;\n }\n if (sourceAssetId) {\n subtitle = subtitle\n ? `${subtitle} · ${truncate(sourceAssetId, 30)}`\n : truncate(sourceAssetId, 40);\n }\n\n // Build title\n const Icon = isClipMode ? ScissorsIcon : CameraIcon;\n let title: string;\n if (isRunning) {\n title = isClipMode ? \"Extracting video clip…\" : \"Capturing screenshot…\";\n } else if (errorMsg) {\n title = \"Capture failed\";\n } else {\n title = isClipMode ? \"Video clip captured\" : \"Screenshot captured\";\n }\n\n return (\n <ToolCard\n icon={Icon}\n status={(status?.type ?? \"complete\") as ToolStatus}\n title={title}\n subtitle={subtitle}\n toolName={toolName}\n badge={isComplete && success ? resultType : undefined}\n args={typedArgs as Record<string, unknown>}\n result={result}\n error={errorMsg}\n >\n {createdAssetId && isComplete && !isCancelled && (\n <div className=\"border-t border-border/40 px-4 py-2\">\n <button\n type=\"button\"\n onClick={handleOpen}\n className=\"flex items-center gap-1.5 rounded-md border border-border/60 px-3 py-1.5 text-xs font-medium text-muted-foreground transition-colors hover:bg-muted/50 hover:text-foreground\"\n >\n <ExternalLinkIcon className=\"size-3\" />\n Open {resultType === \"video\" ? \"clip\" : \"screenshot\"}\n </button>\n </div>\n )}\n </ToolCard>\n );\n};\n\nexport const CaptureMomentToolUI = memo(\n CaptureMomentToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nCaptureMomentToolUI.displayName = \"CaptureMomentToolUI\";\n\n// ─── Capture Slide Screenshot Tool UI ────────────────────────────────\n\nfunction normalizeContentResult(result: unknown): unknown[] {\n if (Array.isArray(result)) {\n return result;\n }\n if (typeof result === \"string\") {\n try {\n const parsed = JSON.parse(result);\n return normalizeContentResult(parsed);\n } catch {\n return [];\n }\n }\n if (result && typeof result === \"object\") {\n const obj = result as Record<string, unknown>;\n if (Array.isArray(obj.result)) {\n return obj.result;\n }\n if (typeof obj.result === \"string\") {\n return normalizeContentResult(obj.result);\n }\n if (Array.isArray(obj.content)) {\n return obj.content;\n }\n }\n return [];\n}\n\n/**\n * Fetches a fresh presigned URL from the backend given an S3 key.\n * Falls back to the original URL while loading or if the fetch fails.\n */\nfunction useFreshPresignedUrl({\n s3Key,\n fallbackUrl,\n}: {\n s3Key: string | null;\n fallbackUrl: string | null;\n}): string | null {\n const [freshUrl, setFreshUrl] = useState<string | null>(null);\n const config = useAthenaConfig();\n const configRef = useRef(config);\n configRef.current = config;\n\n useEffect(() => {\n setFreshUrl(null);\n if (!s3Key) return;\n\n let cancelled = false;\n\n (async () => {\n try {\n const { backendUrl, token, apiKey } = configRef.current;\n const baseUrl = backendUrl.replace(/\\/api\\/assistant-ui\\/?$/, \"\");\n const url = `${baseUrl}/api/asset/fetch-attachment-presigned-url`;\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (token) {\n headers[\"Authorization\"] = `Bearer ${token}`;\n } else if (apiKey) {\n headers[\"X-API-KEY\"] = apiKey;\n }\n\n const resp = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ s3_key: s3Key }),\n });\n\n if (!cancelled && resp.ok) {\n const data = (await resp.json()) as { presigned_url?: string };\n if (!cancelled && data.presigned_url) {\n setFreshUrl(data.presigned_url);\n }\n }\n } catch {\n // Silently fall back to the original URL\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [s3Key]);\n\n return freshUrl ?? fallbackUrl;\n}\n\nfunction getSlideScreenshotResult(result: unknown): {\n text: string | null;\n imageUrl: string | null;\n mediaType: string | null;\n s3Key: string | null;\n} {\n let text: string | null = null;\n let imageUrl: string | null = null;\n let mediaType: string | null = null;\n let s3Key: string | null = null;\n\n for (const item of normalizeContentResult(result)) {\n if (!item || typeof item !== \"object\") {\n continue;\n }\n const part = item as Record<string, unknown>;\n if (!text && part.type === \"text\" && typeof part.text === \"string\") {\n text = part.text;\n continue;\n }\n if (part.type !== \"image\") {\n continue;\n }\n\n const source =\n part.source && typeof part.source === \"object\"\n ? (part.source as Record<string, unknown>)\n : {};\n if (!imageUrl) {\n imageUrl =\n getStringField(source, [\"presigned_url\", \"url\"]) ??\n getStringField(part, [\"url\", \"image_url\"]);\n }\n if (!mediaType) {\n mediaType =\n getStringField(source, [\"media_type\", \"mime_type\"]) ??\n getStringField(part, [\"media_type\", \"mime_type\"]);\n }\n if (!s3Key) {\n s3Key = getStringField(source, [\"data\", \"s3_key\"]);\n }\n }\n\n return { text, imageUrl, mediaType, s3Key };\n}\n\nconst CaptureSlideScreenshotToolUIImpl: ToolCallMessagePartComponent = ({\n toolName,\n args,\n result,\n status,\n}) => {\n const typedArgs = args as Record<string, unknown> | undefined;\n const assetId = getStringField(typedArgs, [\"asset_id\", \"assetId\"]);\n const slideNumber =\n getNumberField(typedArgs, [\"slide_number\", \"slideNumber\"]) ?? undefined;\n const { text, imageUrl, mediaType, s3Key } = useMemo(\n () => getSlideScreenshotResult(result),\n [result],\n );\n\n const freshImageUrl = useFreshPresignedUrl({ s3Key, fallbackUrl: imageUrl });\n\n const isRunning = status?.type === \"running\";\n const isComplete = status?.type === \"complete\" || !status;\n const isCancelled =\n status?.type === \"incomplete\" && status.reason === \"cancelled\";\n const errorMsg =\n status?.type === \"incomplete\" ? String(status.error ?? status.reason ?? \"Capture failed\") : null;\n const openAsset = useAssetPanelStore((s) => s.openAsset);\n\n const handleOpenSlide = useCallback(() => {\n if (!assetId) {\n return;\n }\n openAsset(assetId, {\n type: \"presentation\",\n ...(slideNumber ? { slideNumber } : {}),\n });\n }, [assetId, openAsset, slideNumber]);\n\n const subtitle = [\n slideNumber ? `Slide ${slideNumber}` : null,\n assetId ? truncate(assetId, 34) : null,\n ]\n .filter((value): value is string => Boolean(value))\n .join(\" · \");\n\n return (\n <ToolCard\n icon={CameraIcon}\n status={(status?.type ?? \"complete\") as ToolStatus}\n title={\n isRunning\n ? \"Capturing slide screenshot...\"\n : errorMsg\n ? \"Slide screenshot failed\"\n : \"Slide screenshot captured\"\n }\n subtitle={subtitle || undefined}\n badge={slideNumber ? `Slide ${slideNumber}` : mediaType ?? undefined}\n toolName={toolName}\n args={typedArgs}\n result={result}\n error={errorMsg}\n >\n {isComplete && !isCancelled && freshImageUrl && (\n <div className=\"border-t border-border/40 p-3\">\n <div className=\"overflow-hidden rounded-lg border border-border/50 bg-muted/20\">\n <img\n src={freshImageUrl}\n alt={slideNumber ? `Slide ${slideNumber} screenshot` : \"Slide screenshot\"}\n className=\"aspect-video w-full object-contain\"\n loading=\"lazy\"\n />\n </div>\n {text && (\n <p className=\"mt-2 text-[11px] leading-relaxed text-muted-foreground\">\n {truncate(text, 160)}\n </p>\n )}\n </div>\n )}\n {isComplete && !isCancelled && assetId && (\n <div className=\"flex flex-wrap gap-2 border-t border-border/40 px-4 py-2\">\n <button\n type=\"button\"\n onClick={handleOpenSlide}\n className=\"flex items-center gap-1.5 rounded-md border border-border/60 px-3 py-1.5 text-xs font-medium text-muted-foreground transition-colors hover:bg-muted/50 hover:text-foreground\"\n >\n <ExternalLinkIcon className=\"size-3\" />\n {slideNumber ? `Open slide ${slideNumber}` : \"Open presentation\"}\n </button>\n {freshImageUrl && (\n <a\n href={freshImageUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"flex items-center gap-1.5 rounded-md border border-border/60 px-3 py-1.5 text-xs font-medium text-muted-foreground transition-colors hover:bg-muted/50 hover:text-foreground\"\n >\n <ImageIcon className=\"size-3\" />\n Open image\n </a>\n )}\n </div>\n )}\n </ToolCard>\n );\n};\n\nexport const CaptureSlideScreenshotToolUI = memo(\n CaptureSlideScreenshotToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nCaptureSlideScreenshotToolUI.displayName = \"CaptureSlideScreenshotToolUI\";\n\n// ─── Open Browser Tool UI ─────────────────────────────────────────────\n\nconst OpenBrowserToolUIImpl: ToolCallMessagePartComponent = ({\n toolName,\n args,\n result,\n status,\n}) => {\n const typedArgs = args as Record<string, unknown> | undefined;\n const url = (typedArgs?.url ?? \"\") as string;\n const argsTitle = typedArgs?.title as string | undefined;\n\n const data = useMemo(() => normalizeResult(result), [result]);\n const pageTitle = (data?.page_title ?? data?.title) as string | undefined;\n const landedUrl = (data?.landed_url ?? url) as string | undefined;\n const warning = data?.warning as string | undefined;\n const redirectWarning = useMemo(() => {\n if (!url || !landedUrl) return null;\n try {\n const requested = new URL(url);\n const landed = new URL(landedUrl);\n const sameTarget =\n requested.origin === landed.origin &&\n requested.pathname.replace(/\\/+$/, \"\") ===\n landed.pathname.replace(/\\/+$/, \"\") &&\n requested.search === landed.search;\n return sameTarget ? null : `Redirected to ${landed.href}`;\n } catch {\n return url === landedUrl ? null : `Redirected to ${landedUrl}`;\n }\n }, [url, landedUrl]);\n const warningText = warning ?? redirectWarning;\n const assetId = extractAssetId(result);\n\n const isRunning = status?.type === \"running\";\n const isComplete = status?.type === \"complete\" || !status;\n const errorMsg =\n status?.type === \"incomplete\" ? (status.error as string) : null;\n\n const displayUrl = useMemo(() => {\n const raw = landedUrl || url;\n if (!raw) return undefined;\n try {\n const parsed = new URL(raw);\n return parsed.hostname + (parsed.pathname !== \"/\" ? parsed.pathname : \"\");\n } catch {\n return truncate(raw, 60);\n }\n }, [landedUrl, url]);\n\n const displayTitle = useMemo(() => {\n if (isRunning) return \"Opening browser...\";\n if (pageTitle) return truncate(pageTitle, 50);\n if (argsTitle) return truncate(argsTitle, 50);\n return \"Browser session opened\";\n }, [isRunning, pageTitle, argsTitle]);\n\n const openAsset = useAssetPanelStore((s) => s.openAsset);\n\n return (\n <ToolCard\n icon={GlobeIcon}\n status={status?.type ?? \"complete\"}\n title={displayTitle}\n subtitle={displayUrl}\n toolName={toolName}\n args={typedArgs as Record<string, unknown>}\n result={result}\n error={errorMsg}\n >\n {warningText && isComplete && (\n <div className=\"border-t border-border/40 bg-amber-50 px-4 py-2\">\n <div className=\"flex items-start gap-2\">\n <AlertTriangleIcon className=\"mt-0.5 size-3 shrink-0 text-amber-600\" />\n <p className=\"text-[11px] leading-relaxed text-amber-700\">\n {warningText}\n </p>\n </div>\n </div>\n )}\n {isComplete && (\n <div className=\"flex items-center gap-2 border-t border-border/40 px-4 py-2\">\n {assetId && (\n <button\n type=\"button\"\n onClick={() =>\n openAsset(assetId, {\n name: pageTitle ?? argsTitle,\n type: \"unknown\",\n })\n }\n className=\"flex items-center gap-1.5 rounded-md border border-border/60 px-3 py-1.5 text-xs font-medium text-muted-foreground transition-colors hover:bg-muted/50 hover:text-foreground\"\n >\n <ExternalLinkIcon className=\"size-3\" />\n Open session\n </button>\n )}\n {landedUrl && /^https?:\\/\\//i.test(landedUrl) && (\n <a\n href={landedUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-1.5 rounded-md border border-border/60 px-3 py-1.5 text-xs font-medium text-muted-foreground transition-colors hover:bg-muted/50 hover:text-foreground\"\n >\n <GlobeIcon className=\"size-3\" />\n Visit URL\n </a>\n )}\n </div>\n )}\n </ToolCard>\n );\n};\n\nexport const OpenBrowserToolUI = memo(\n OpenBrowserToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nOpenBrowserToolUI.displayName = \"OpenBrowserToolUI\";\n\n// ─── Tool UI registry ────────────────────────────────────────────────\n// Map of tool names → their custom UI component.\n// Import and spread into thread.tsx `by_name` to register.\n\nexport const TOOL_UI_REGISTRY: Record<string, ToolCallMessagePartComponent> = {\n search: WebSearchToolUI,\n browse: BrowseToolUI,\n open_browser: OpenBrowserToolUI,\n search_email: EmailSearchToolUI,\n unified_email_search: EmailSearchToolUI,\n unified_email_list_accounts: EmailAccountsToolUI,\n email_list_accounts: EmailAccountsToolUI,\n create_email_draft: CreateEmailDraftToolUI,\n unified_email_create_draft: CreateEmailDraftToolUI,\n create_new_document: CreateDocumentToolUI,\n create_document_from_markdown: CreateDocumentToolUI,\n create_new_sheet: CreateSheetToolUI,\n create_powerpoint_deck: CreatePresentationToolUI,\n create_presentation_pptx_studio: CreatePresentationToolUI,\n create_new_notebook: CreateNotebookToolUI,\n // Studio SDK nested PTC tools\n CreateWorkbook: StudioCreateWorkbookToolUI,\n AddSheet: StudioAddSheetToolUI,\n OpenWorkbook: StudioOpenWorkbookToolUI,\n CreatePresentation: StudioCreatePresentationToolUI,\n OpenPresentation: StudioOpenPresentationToolUI,\n AddSlide: StudioAddSlideToolUI,\n CreateDocument: StudioCreateDocumentToolUI,\n OpenDocument: StudioOpenDocumentToolUI,\n CreateParagraph: StudioCreateParagraphToolUI,\n execute_presentation_code: ExecutePresentationCodeToolUI,\n run_python_code: RunPythonCodeToolUI,\n open_asset_in_workspace: OpenAssetToolUI,\n // Media capture\n capture_moment: CaptureMomentToolUI,\n capture_slide_screenshot: CaptureSlideScreenshotToolUI,\n // Spreadsheet toolkit\n bulk_format_sheet_range: BulkFormatSheetRangeToolUI,\n set_row_column_dimensions: SetRowColumnDimensionsToolUI,\n update_sheet_range: UpdateSheetRangeToolUI,\n // Database toolkit\n describe_database: DescribeDatabaseToolUI,\n list_database_tables: ListDatabaseTablesToolUI,\n get_database_table_schema: GetDatabaseTableSchemaToolUI,\n run_sql: RunSqlToolUI,\n run_database_sql: RunSqlToolUI,\n run_sql_query_tool: RunSqlToolUI,\n install_pip_package: InstallPackageToolUI,\n write_todos: WriteTodosToolUI,\n // Deep-agent workspace-file tools — quiet plain-English cards; the generic\n // fallback dumped raw scratch-space JSON (see file-tool-uis.tsx).\n read_file: ReadFileToolUI,\n ls: ListFilesToolUI,\n write_file: WriteFileToolUI,\n edit_file: EditFileToolUI,\n glob: SearchFilesToolUI,\n grep: SearchFilesToolUI,\n};\n"],"names":["athenaDiagnostics","useMemo","normalizeResult","jsx","ToolCard","SearchIcon","truncate","ExpandableSection","jsxs","ExternalLinkIcon","memo","GlobeIcon","MailIcon","useAssetPanelStore","cn","FilePlusIcon","BarChart3Icon","PresentationIcon","useCallback","useEffect","FileTextIcon","BookOpenIcon","useRef","useState","Fragment","Maximize2Icon","XIcon","CodeIcon","TerminalIcon","AlertTriangleIcon","ImageIcon","FolderOpenIcon","DatabaseIcon","TableIcon","TablePropertiesIcon","PlayIcon","SheetIcon","ScissorsIcon","CameraIcon","useAthenaConfig","InstallPackageToolUI","WriteTodosToolUI","ReadFileToolUI","ListFilesToolUI","WriteFileToolUI","EditFileToolUI","SearchFilesToolUI"],"mappings":"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"}
|