@athenaintel/react 0.43.0 → 0.48.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +215 -3
- package/dist/agent-runtime/src/answer-label.cjs +137 -0
- package/dist/agent-runtime/src/answer-label.cjs.map +1 -0
- package/dist/agent-runtime/src/answer-label.d.ts +104 -0
- package/dist/agent-runtime/src/answer-label.js +137 -0
- package/dist/agent-runtime/src/answer-label.js.map +1 -0
- package/dist/agent-runtime/src/answer-rows.cjs +180 -0
- package/dist/agent-runtime/src/answer-rows.cjs.map +1 -0
- package/dist/agent-runtime/src/answer-rows.d.ts +86 -0
- package/dist/agent-runtime/src/answer-rows.js +180 -0
- package/dist/agent-runtime/src/answer-rows.js.map +1 -0
- package/dist/agent-runtime/src/client-tool-bridge.cjs +15 -15
- package/dist/agent-runtime/src/client-tool-bridge.cjs.map +1 -1
- package/dist/agent-runtime/src/conversation-index.cjs +8 -8
- package/dist/agent-runtime/src/conversation-index.cjs.map +1 -1
- package/dist/agent-runtime/src/decision-checks.cjs +207 -0
- package/dist/agent-runtime/src/decision-checks.cjs.map +1 -0
- package/dist/agent-runtime/src/decision-checks.d.ts +142 -0
- package/dist/agent-runtime/src/decision-checks.js +207 -0
- package/dist/agent-runtime/src/decision-checks.js.map +1 -0
- package/dist/agent-runtime/src/desktop-handoff.d.ts +12 -0
- package/dist/agent-runtime/src/errors.cjs +18 -0
- package/dist/agent-runtime/src/errors.cjs.map +1 -1
- package/dist/agent-runtime/src/errors.d.ts +7 -0
- package/dist/agent-runtime/src/errors.js +18 -0
- package/dist/agent-runtime/src/errors.js.map +1 -1
- package/dist/agent-runtime/src/generated/runconfig-contract.cjs +12 -0
- package/dist/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -1
- package/dist/agent-runtime/src/generated/runconfig-contract.d.ts +6 -6
- package/dist/agent-runtime/src/generated/runconfig-contract.js +12 -0
- package/dist/agent-runtime/src/generated/runconfig-contract.js.map +1 -1
- package/dist/agent-runtime/src/handoff-arrival.cjs +60 -0
- package/dist/agent-runtime/src/handoff-arrival.cjs.map +1 -0
- package/dist/agent-runtime/src/handoff-arrival.d.ts +46 -0
- package/dist/agent-runtime/src/handoff-arrival.js +60 -0
- package/dist/agent-runtime/src/handoff-arrival.js.map +1 -0
- package/dist/agent-runtime/src/index.d.ts +14 -8
- package/dist/agent-runtime/src/interrupts.cjs +43 -18
- package/dist/agent-runtime/src/interrupts.cjs.map +1 -1
- package/dist/agent-runtime/src/interrupts.d.ts +19 -2
- package/dist/agent-runtime/src/interrupts.js +28 -3
- package/dist/agent-runtime/src/interrupts.js.map +1 -1
- package/dist/agent-runtime/src/lane-history.cjs +8 -8
- package/dist/agent-runtime/src/lane-history.cjs.map +1 -1
- package/dist/agent-runtime/src/messages.cjs +43 -8
- package/dist/agent-runtime/src/messages.cjs.map +1 -1
- package/dist/agent-runtime/src/messages.d.ts +25 -3
- package/dist/agent-runtime/src/messages.js +43 -8
- package/dist/agent-runtime/src/messages.js.map +1 -1
- package/dist/agent-runtime/src/offline-status.cjs +36 -0
- package/dist/agent-runtime/src/offline-status.cjs.map +1 -0
- package/dist/agent-runtime/src/offline-status.d.ts +118 -3
- package/dist/agent-runtime/src/offline-status.js +36 -0
- package/dist/agent-runtime/src/offline-status.js.map +1 -0
- package/dist/agent-runtime/src/queue.cjs +0 -9
- package/dist/agent-runtime/src/queue.cjs.map +1 -1
- package/dist/agent-runtime/src/queue.js +0 -9
- package/dist/agent-runtime/src/queue.js.map +1 -1
- package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs +9 -9
- package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs.map +1 -1
- package/dist/agent-runtime/src/runtime-catalog.cjs +42 -0
- package/dist/agent-runtime/src/runtime-catalog.cjs.map +1 -0
- package/dist/agent-runtime/src/runtime-catalog.d.ts +35 -0
- package/dist/agent-runtime/src/runtime-catalog.js +42 -0
- package/dist/agent-runtime/src/runtime-catalog.js.map +1 -0
- package/dist/agent-runtime/src/runtime-messages.cjs.map +1 -1
- package/dist/agent-runtime/src/runtime-messages.d.ts +1 -1
- package/dist/agent-runtime/src/runtime-messages.js.map +1 -1
- package/dist/agent-runtime/src/runtime.d.ts +40 -0
- package/dist/agent-runtime/src/statewire-suspended.cjs +3 -3
- package/dist/agent-runtime/src/statewire-suspended.cjs.map +1 -1
- package/dist/agent-runtime/src/subagents.cjs +32 -2
- package/dist/agent-runtime/src/subagents.cjs.map +1 -1
- package/dist/agent-runtime/src/subagents.d.ts +9 -0
- package/dist/agent-runtime/src/subagents.js +30 -0
- package/dist/agent-runtime/src/subagents.js.map +1 -1
- package/dist/agent-runtime/src/thread-driver.cjs +67 -0
- package/dist/agent-runtime/src/thread-driver.cjs.map +1 -0
- package/dist/agent-runtime/src/thread-driver.d.ts +49 -0
- package/dist/agent-runtime/src/thread-driver.js +67 -0
- package/dist/agent-runtime/src/thread-driver.js.map +1 -0
- package/dist/agent-runtime/src/thread-handoff-flow-machine.d.ts +172 -0
- package/dist/agent-runtime/src/thread-handoff-protocol.d.ts +756 -0
- package/dist/agent-runtime/src/thread-handoff-qr.d.ts +11 -0
- package/dist/agent-runtime/src/thread-handoff.d.ts +3 -364
- package/dist/agent-runtime/src/thread-status.cjs +3 -3
- package/dist/agent-runtime/src/thread-status.cjs.map +1 -1
- package/dist/agent-runtime/src/tool-metadata.cjs +210 -25
- package/dist/agent-runtime/src/tool-metadata.cjs.map +1 -1
- package/dist/agent-runtime/src/tool-metadata.d.ts +12 -0
- package/dist/agent-runtime/src/tool-metadata.js +210 -25
- package/dist/agent-runtime/src/tool-metadata.js.map +1 -1
- package/dist/agent-runtime/src/tool-names.cjs +2 -0
- package/dist/agent-runtime/src/tool-names.cjs.map +1 -1
- package/dist/agent-runtime/src/tool-names.d.ts +2 -0
- package/dist/agent-runtime/src/tool-names.js +2 -0
- package/dist/agent-runtime/src/tool-names.js.map +1 -1
- package/dist/agent-runtime/src/types.d.ts +10 -2
- package/dist/agent-runtime/src/use-conversation-list.cjs +11 -11
- package/dist/agent-runtime/src/use-conversation-list.cjs.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs +24 -19
- package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-chat-outbox.d.ts +2 -1
- package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js +6 -1
- package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-config.cjs +14 -14
- package/dist/agent-runtime/src/use-deep-agent-config.cjs.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs +6 -6
- package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-runtime.cjs +16 -16
- package/dist/agent-runtime/src/use-deep-agent-runtime.cjs.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-thread.cjs +45 -45
- package/dist/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-voice.cjs +547 -124
- package/dist/agent-runtime/src/use-deep-agent-voice.cjs.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-voice.d.ts +129 -10
- package/dist/agent-runtime/src/use-deep-agent-voice.js +487 -64
- package/dist/agent-runtime/src/use-deep-agent-voice.js.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-window-sync.cjs +26 -26
- package/dist/agent-runtime/src/use-deep-agent-window-sync.cjs.map +1 -1
- package/dist/agent-runtime/src/use-historical-edit-attachments.cjs +4 -4
- package/dist/agent-runtime/src/use-historical-edit-attachments.cjs.map +1 -1
- package/dist/agent-runtime/src/use-thread-handoff-flow.d.ts +28 -26
- package/dist/agent-runtime/src/voice-media.cjs +117 -0
- package/dist/agent-runtime/src/voice-media.cjs.map +1 -0
- package/dist/agent-runtime/src/voice-media.d.ts +49 -0
- package/dist/agent-runtime/src/voice-media.js +117 -0
- package/dist/agent-runtime/src/voice-media.js.map +1 -0
- package/dist/agent-runtime/src/voice-wire-types.d.ts +32 -0
- package/dist/assets/AssetPanel.cjs +11 -11
- package/dist/assets/AssetPanel.cjs.map +1 -1
- package/dist/assets/AthenaAssetEmbed.cjs +11 -9
- package/dist/assets/AthenaAssetEmbed.cjs.map +1 -1
- package/dist/assets/AthenaAssetEmbed.d.ts +7 -0
- package/dist/assets/AthenaAssetEmbed.js +4 -2
- package/dist/assets/AthenaAssetEmbed.js.map +1 -1
- package/dist/assets/AthenaLayout.cjs +16 -16
- package/dist/assets/AthenaLayout.cjs.map +1 -1
- package/dist/assets/use-asset-content.cjs +4 -4
- package/dist/assets/use-asset-content.cjs.map +1 -1
- package/dist/assets/use-asset-embed.cjs +14 -7
- package/dist/assets/use-asset-embed.cjs.map +1 -1
- package/dist/assets/use-asset-embed.d.ts +11 -1
- package/dist/assets/use-asset-embed.js +10 -3
- package/dist/assets/use-asset-embed.js.map +1 -1
- package/dist/auth/AthenaAuthContext.cjs +3 -3
- package/dist/auth/AthenaAuthContext.cjs.map +1 -1
- package/dist/auth/AthenaAuthProvider.cjs +8 -8
- package/dist/auth/AthenaAuthProvider.cjs.map +1 -1
- package/dist/auth/AthenaCredentialSourceContext.cjs +5 -5
- package/dist/auth/AthenaCredentialSourceContext.cjs.map +1 -1
- package/dist/auth/AthenaSSOProvider.cjs +14 -14
- package/dist/auth/AthenaSSOProvider.cjs.map +1 -1
- package/dist/auth/credential-source.cjs +26 -13
- package/dist/auth/credential-source.cjs.map +1 -1
- package/dist/auth/credential-source.d.ts +8 -0
- package/dist/auth/credential-source.js +26 -13
- package/dist/auth/credential-source.js.map +1 -1
- package/dist/catalog/agent-model-options.cjs +25 -17
- package/dist/catalog/agent-model-options.cjs.map +1 -1
- package/dist/catalog/agent-model-options.d.ts +38 -5
- package/dist/catalog/agent-model-options.js +25 -17
- package/dist/catalog/agent-model-options.js.map +1 -1
- package/dist/catalog/channel-refusal.cjs +36 -0
- package/dist/catalog/channel-refusal.cjs.map +1 -0
- package/dist/catalog/channel-refusal.d.ts +29 -0
- package/dist/catalog/channel-refusal.js +36 -0
- package/dist/catalog/channel-refusal.js.map +1 -0
- package/dist/catalog/chat-pickers.cjs +60 -24
- package/dist/catalog/chat-pickers.cjs.map +1 -1
- package/dist/catalog/chat-pickers.d.ts +12 -2
- package/dist/catalog/chat-pickers.js +56 -20
- package/dist/catalog/chat-pickers.js.map +1 -1
- package/dist/catalog/runtime-catalog.cjs +89 -23
- package/dist/catalog/runtime-catalog.cjs.map +1 -1
- package/dist/catalog/runtime-catalog.d.ts +8 -2
- package/dist/catalog/runtime-catalog.js +83 -17
- package/dist/catalog/runtime-catalog.js.map +1 -1
- package/dist/catalog/use-athena-chat-mode.cjs +12 -12
- package/dist/catalog/use-athena-chat-mode.cjs.map +1 -1
- package/dist/chat/AthenaChat.cjs +155 -67
- package/dist/chat/AthenaChat.cjs.map +1 -1
- package/dist/chat/AthenaChat.d.ts +42 -2
- package/dist/chat/AthenaChat.js +106 -18
- package/dist/chat/AthenaChat.js.map +1 -1
- package/dist/chat/AthenaChatErrorBoundary.cjs +3 -3
- package/dist/chat/AthenaChatErrorBoundary.cjs.map +1 -1
- package/dist/chat/DrivingOnChip.cjs +23 -0
- package/dist/chat/DrivingOnChip.cjs.map +1 -0
- package/dist/chat/DrivingOnChip.d.ts +17 -0
- package/dist/chat/DrivingOnChip.js +23 -0
- package/dist/chat/DrivingOnChip.js.map +1 -0
- package/dist/chat/StatewireApprovalCard.cjs +125 -31
- package/dist/chat/StatewireApprovalCard.cjs.map +1 -1
- package/dist/chat/StatewireApprovalCard.d.ts +73 -1
- package/dist/chat/StatewireApprovalCard.js +115 -21
- package/dist/chat/StatewireApprovalCard.js.map +1 -1
- package/dist/chat/StatewireClientToolBridge.cjs +2 -2
- package/dist/chat/StatewireClientToolBridge.cjs.map +1 -1
- package/dist/chat/StatewireQueuedMessages.cjs +25 -63
- package/dist/chat/StatewireQueuedMessages.cjs.map +1 -1
- package/dist/chat/StatewireQueuedMessages.d.ts +11 -13
- package/dist/chat/StatewireQueuedMessages.js +16 -54
- package/dist/chat/StatewireQueuedMessages.js.map +1 -1
- package/dist/chat/WaitingOnYouBanner.cjs +3 -3
- package/dist/chat/WaitingOnYouBanner.cjs.map +1 -1
- package/dist/chat/athena-chat-welcome.cjs +2 -2
- package/dist/chat/athena-chat-welcome.cjs.map +1 -1
- package/dist/chat/athena-citation-links.cjs +5 -5
- package/dist/chat/athena-citation-links.cjs.map +1 -1
- package/dist/chat/athena-composer-controls.cjs +26 -16
- package/dist/chat/athena-composer-controls.cjs.map +1 -1
- package/dist/chat/athena-composer-controls.d.ts +6 -0
- package/dist/chat/athena-composer-controls.js +26 -16
- package/dist/chat/athena-composer-controls.js.map +1 -1
- package/dist/chat/athena-turn-end-status.cjs +42 -0
- package/dist/chat/athena-turn-end-status.cjs.map +1 -0
- package/dist/chat/athena-turn-end-status.d.ts +24 -0
- package/dist/chat/athena-turn-end-status.js +42 -0
- package/dist/chat/athena-turn-end-status.js.map +1 -0
- package/dist/chat/browser-decision-check.cjs +131 -0
- package/dist/chat/browser-decision-check.cjs.map +1 -0
- package/dist/chat/browser-decision-check.d.ts +61 -0
- package/dist/chat/browser-decision-check.js +131 -0
- package/dist/chat/browser-decision-check.js.map +1 -0
- package/dist/chat/chat-outbox-rows.cjs +3 -3
- package/dist/chat/chat-outbox-rows.cjs.map +1 -1
- package/dist/chat/chat-voice-controls.cjs +93 -28
- package/dist/chat/chat-voice-controls.cjs.map +1 -1
- package/dist/chat/chat-voice-controls.d.ts +36 -2
- package/dist/chat/chat-voice-controls.js +89 -24
- package/dist/chat/chat-voice-controls.js.map +1 -1
- package/dist/chat/composer-keyboard-hint.cjs +5 -5
- package/dist/chat/composer-keyboard-hint.cjs.map +1 -1
- package/dist/chat/device-operation.cjs +29 -0
- package/dist/chat/device-operation.cjs.map +1 -0
- package/dist/chat/device-operation.d.ts +34 -0
- package/dist/chat/device-operation.js +29 -0
- package/dist/chat/device-operation.js.map +1 -0
- package/dist/chat/super-grouping/CollapsibleGroup.cjs +14 -14
- package/dist/chat/super-grouping/CollapsibleGroup.cjs.map +1 -1
- package/dist/chat/super-grouping/GroupedMessageParts.cjs +4 -4
- package/dist/chat/super-grouping/GroupedMessageParts.cjs.map +1 -1
- package/dist/chat/super-grouping/SuperGroupingCard.cjs +52 -36
- package/dist/chat/super-grouping/SuperGroupingCard.cjs.map +1 -1
- package/dist/chat/super-grouping/SuperGroupingCard.d.ts +19 -4
- package/dist/chat/super-grouping/SuperGroupingCard.js +29 -13
- package/dist/chat/super-grouping/SuperGroupingCard.js.map +1 -1
- package/dist/chat/super-grouping/SuperGroupingTranscript.cjs +32 -32
- package/dist/chat/super-grouping/SuperGroupingTranscript.cjs.map +1 -1
- package/dist/chat/super-grouping/SuperGroupingTranscript.js +3 -3
- package/dist/chat/super-grouping/SuperGroupingTranscript.js.map +1 -1
- package/dist/chat/super-grouping/ToolTimeline.cjs +73 -40
- package/dist/chat/super-grouping/ToolTimeline.cjs.map +1 -1
- package/dist/chat/super-grouping/ToolTimeline.d.ts +10 -2
- package/dist/chat/super-grouping/ToolTimeline.js +69 -36
- package/dist/chat/super-grouping/ToolTimeline.js.map +1 -1
- package/dist/chat/super-grouping/activity-timeline.cjs +47 -12
- package/dist/chat/super-grouping/activity-timeline.cjs.map +1 -1
- package/dist/chat/super-grouping/activity-timeline.d.ts +21 -0
- package/dist/chat/super-grouping/activity-timeline.js +47 -12
- package/dist/chat/super-grouping/activity-timeline.js.map +1 -1
- package/dist/chat/super-grouping/grouping-function.cjs +4 -0
- package/dist/chat/super-grouping/grouping-function.cjs.map +1 -1
- package/dist/chat/super-grouping/grouping-function.d.ts +7 -0
- package/dist/chat/super-grouping/grouping-function.js +5 -1
- package/dist/chat/super-grouping/grouping-function.js.map +1 -1
- package/dist/chat/super-grouping/index.cjs +6 -0
- package/dist/chat/super-grouping/index.cjs.map +1 -1
- package/dist/chat/super-grouping/index.d.ts +5 -2
- package/dist/chat/super-grouping/index.js +7 -1
- package/dist/chat/super-grouping/index.js.map +1 -1
- package/dist/chat/super-grouping/tool-part-placement.cjs +17 -0
- package/dist/chat/super-grouping/tool-part-placement.cjs.map +1 -0
- package/dist/chat/super-grouping/tool-part-placement.d.ts +22 -0
- package/dist/chat/super-grouping/tool-part-placement.js +17 -0
- package/dist/chat/super-grouping/tool-part-placement.js.map +1 -0
- package/dist/chat/thread-scroll-to-bottom.cjs +2 -2
- package/dist/chat/thread-scroll-to-bottom.cjs.map +1 -1
- package/dist/chat/thread-scroll-to-bottom.d.ts +10 -7
- package/dist/chat/thread-scroll-to-bottom.js +2 -2
- package/dist/chat/thread-scroll-to-bottom.js.map +1 -1
- package/dist/chat/tooltip-icon-button.cjs +2 -2
- package/dist/chat/tooltip-icon-button.cjs.map +1 -1
- package/dist/chat/use-athena-voice-live.cjs +11 -0
- package/dist/chat/use-athena-voice-live.cjs.map +1 -0
- package/dist/chat/use-athena-voice-live.d.ts +11 -0
- package/dist/chat/use-athena-voice-live.js +11 -0
- package/dist/chat/use-athena-voice-live.js.map +1 -0
- package/dist/chat/use-statewire-approval-request.cjs +56 -24
- package/dist/chat/use-statewire-approval-request.cjs.map +1 -1
- package/dist/chat/use-statewire-approval-request.d.ts +33 -4
- package/dist/chat/use-statewire-approval-request.js +41 -9
- package/dist/chat/use-statewire-approval-request.js.map +1 -1
- package/dist/chat-ui/auth/sign-in-card.cjs +2 -2
- package/dist/chat-ui/auth/sign-in-card.cjs.map +1 -1
- package/dist/chat-ui/composer/tiptap-composer.cjs +138 -107
- package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -1
- package/dist/chat-ui/composer/tiptap-composer.d.ts +20 -4
- package/dist/chat-ui/composer/tiptap-composer.js +85 -54
- package/dist/chat-ui/composer/tiptap-composer.js.map +1 -1
- package/dist/chat-ui/header/conversation-history-panel.cjs +49 -23
- package/dist/chat-ui/header/conversation-history-panel.cjs.map +1 -1
- package/dist/chat-ui/header/conversation-history-panel.d.ts +12 -1
- package/dist/chat-ui/header/conversation-history-panel.js +38 -12
- package/dist/chat-ui/header/conversation-history-panel.js.map +1 -1
- package/dist/chat-ui/index.cjs +18 -0
- package/dist/chat-ui/index.cjs.map +1 -1
- package/dist/chat-ui/index.d.ts +7 -1
- package/dist/chat-ui/index.js +18 -0
- package/dist/chat-ui/index.js.map +1 -1
- package/dist/chat-ui/mentions/mention-chip.cjs +4 -4
- package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.cjs +10 -9
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.js +3 -2
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs +2 -2
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/menu-list.cjs +29 -6
- package/dist/chat-ui/mentions/suggestions/components/menu-list.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/menu-list.d.ts +7 -1
- package/dist/chat-ui/mentions/suggestions/components/menu-list.js +25 -2
- package/dist/chat-ui/mentions/suggestions/components/menu-list.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/use-keyboard-navigation.cjs +2 -2
- package/dist/chat-ui/mentions/suggestions/components/use-keyboard-navigation.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/use-menu-navigation.cjs +2 -2
- package/dist/chat-ui/mentions/suggestions/components/use-menu-navigation.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/api-client.cjs +3 -3
- package/dist/chat-ui/mentions/suggestions/data/api-client.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/orchestrator.cjs +56 -2
- package/dist/chat-ui/mentions/suggestions/data/orchestrator.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/orchestrator.d.ts +12 -0
- package/dist/chat-ui/mentions/suggestions/data/orchestrator.js +56 -2
- package/dist/chat-ui/mentions/suggestions/data/orchestrator.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs +24 -3
- package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/sources/index.d.ts +7 -0
- package/dist/chat-ui/mentions/suggestions/data/sources/index.js +24 -3
- package/dist/chat-ui/mentions/suggestions/data/sources/index.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs +35 -13
- package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.d.ts +15 -1
- package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js +28 -6
- package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/use-menu-items.cjs +9 -6
- package/dist/chat-ui/mentions/suggestions/data/use-menu-items.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/use-menu-items.d.ts +3 -0
- package/dist/chat-ui/mentions/suggestions/data/use-menu-items.js +5 -2
- package/dist/chat-ui/mentions/suggestions/data/use-menu-items.js.map +1 -1
- package/dist/chat-ui/mentions/use-account-workspace-id.cjs +45 -10
- package/dist/chat-ui/mentions/use-account-workspace-id.cjs.map +1 -1
- package/dist/chat-ui/mentions/use-account-workspace-id.d.ts +24 -1
- package/dist/chat-ui/mentions/use-account-workspace-id.js +46 -11
- package/dist/chat-ui/mentions/use-account-workspace-id.js.map +1 -1
- package/dist/chat-ui/mentions/use-member-avatar.cjs +4 -4
- package/dist/chat-ui/mentions/use-member-avatar.cjs.map +1 -1
- package/dist/chat-ui/mentions/use-mention-asset.cjs +3 -3
- package/dist/chat-ui/mentions/use-mention-asset.cjs.map +1 -1
- package/dist/chat-ui/messages/answer-label.cjs +42 -0
- package/dist/chat-ui/messages/answer-label.cjs.map +1 -0
- package/dist/chat-ui/messages/answer-label.d.ts +33 -0
- package/dist/chat-ui/messages/answer-label.js +42 -0
- package/dist/chat-ui/messages/answer-label.js.map +1 -0
- package/dist/chat-ui/messages/arrival-animation.cjs +13 -0
- package/dist/chat-ui/messages/arrival-animation.cjs.map +1 -0
- package/dist/chat-ui/messages/arrival-animation.d.ts +14 -0
- package/dist/chat-ui/messages/arrival-animation.js +13 -0
- package/dist/chat-ui/messages/arrival-animation.js.map +1 -0
- package/dist/chat-ui/messages/continue-pill.cjs +5 -5
- package/dist/chat-ui/messages/continue-pill.cjs.map +1 -1
- package/dist/chat-ui/messages/handoff-arrival-divider.cjs +44 -0
- package/dist/chat-ui/messages/handoff-arrival-divider.cjs.map +1 -0
- package/dist/chat-ui/messages/handoff-arrival-divider.d.ts +17 -0
- package/dist/chat-ui/messages/handoff-arrival-divider.js +44 -0
- package/dist/chat-ui/messages/handoff-arrival-divider.js.map +1 -0
- package/dist/chat-ui/messages/message-actions-config.cjs +3 -3
- package/dist/chat-ui/messages/message-actions-config.cjs.map +1 -1
- package/dist/chat-ui/messages/message-components.cjs +8 -4
- package/dist/chat-ui/messages/message-components.cjs.map +1 -1
- package/dist/chat-ui/messages/message-components.js +5 -1
- package/dist/chat-ui/messages/message-components.js.map +1 -1
- package/dist/chat-ui/messages/message-images.cjs +66 -0
- package/dist/chat-ui/messages/message-images.cjs.map +1 -0
- package/dist/chat-ui/messages/message-images.d.ts +16 -0
- package/dist/chat-ui/messages/message-images.js +66 -0
- package/dist/chat-ui/messages/message-images.js.map +1 -0
- package/dist/chat-ui/messages/user-edit-composer.cjs +2 -2
- package/dist/chat-ui/messages/user-edit-composer.cjs.map +1 -1
- package/dist/chat-ui/messages/wake-marker.cjs +3 -3
- package/dist/chat-ui/messages/wake-marker.cjs.map +1 -1
- package/dist/chat-ui/rich-text/chat-link.cjs +2 -2
- package/dist/chat-ui/rich-text/chat-link.cjs.map +1 -1
- package/dist/chat-ui/rich-text/chat-message-body.cjs +8 -8
- package/dist/chat-ui/rich-text/chat-message-body.cjs.map +1 -1
- package/dist/chat-ui/rich-text/chat-node-views.cjs +6 -6
- package/dist/chat-ui/rich-text/chat-node-views.cjs.map +1 -1
- package/dist/chat-ui/rich-text/dom-output-spec.cjs +2 -2
- package/dist/chat-ui/rich-text/dom-output-spec.cjs.map +1 -1
- package/dist/chat-ui/statewire.cjs +3 -0
- package/dist/chat-ui/statewire.cjs.map +1 -1
- package/dist/chat-ui/statewire.d.ts +2 -1
- package/dist/chat-ui/statewire.js +3 -0
- package/dist/chat-ui/statewire.js.map +1 -1
- package/dist/chat-ui/thread/chat-thread-shell.cjs +43 -14
- package/dist/chat-ui/thread/chat-thread-shell.cjs.map +1 -1
- package/dist/chat-ui/thread/chat-thread-shell.d.ts +16 -2
- package/dist/chat-ui/thread/chat-thread-shell.js +35 -6
- package/dist/chat-ui/thread/chat-thread-shell.js.map +1 -1
- package/dist/chat-ui/thread/composer-send-or-stop.cjs +30 -20
- package/dist/chat-ui/thread/composer-send-or-stop.cjs.map +1 -1
- package/dist/chat-ui/thread/composer-send-or-stop.d.ts +8 -0
- package/dist/chat-ui/thread/composer-send-or-stop.js +29 -19
- package/dist/chat-ui/thread/composer-send-or-stop.js.map +1 -1
- package/dist/chat-ui/thread/statewire-history-edge.cjs +20 -21
- package/dist/chat-ui/thread/statewire-history-edge.cjs.map +1 -1
- package/dist/chat-ui/thread/statewire-history-edge.js +3 -4
- package/dist/chat-ui/thread/statewire-history-edge.js.map +1 -1
- package/dist/chat-ui/thread/thread-loading-overlay.cjs +5 -5
- package/dist/chat-ui/thread/thread-loading-overlay.cjs.map +1 -1
- package/dist/collab/client.cjs +40 -3
- package/dist/collab/client.cjs.map +1 -1
- package/dist/collab/client.d.ts +25 -0
- package/dist/collab/client.js +40 -3
- package/dist/collab/client.js.map +1 -1
- package/dist/collab/document-status.cjs +150 -0
- package/dist/collab/document-status.cjs.map +1 -0
- package/dist/collab/document-status.d.ts +68 -0
- package/dist/collab/document-status.js +150 -0
- package/dist/collab/document-status.js.map +1 -0
- package/dist/collab/index.cjs +7 -0
- package/dist/collab/index.cjs.map +1 -1
- package/dist/collab/index.d.ts +6 -1
- package/dist/collab/index.js +7 -0
- package/dist/collab/index.js.map +1 -1
- package/dist/collab/presence-react.cjs +11 -11
- package/dist/collab/presence-react.cjs.map +1 -1
- package/dist/collab/react.cjs +6 -6
- package/dist/collab/react.cjs.map +1 -1
- package/dist/composer/AttachmentContext.cjs +24 -11
- package/dist/composer/AttachmentContext.cjs.map +1 -1
- package/dist/composer/AttachmentContext.js +18 -5
- package/dist/composer/AttachmentContext.js.map +1 -1
- package/dist/composer/ComposerAttachmentPreview.cjs +78 -23
- package/dist/composer/ComposerAttachmentPreview.cjs.map +1 -1
- package/dist/composer/ComposerAttachmentPreview.d.ts +5 -3
- package/dist/composer/ComposerAttachmentPreview.js +79 -24
- package/dist/composer/ComposerAttachmentPreview.js.map +1 -1
- package/dist/composer/ComposerDropZone.cjs +7 -7
- package/dist/composer/ComposerDropZone.cjs.map +1 -1
- package/dist/composer/FileUploadButton.cjs +37 -22
- package/dist/composer/FileUploadButton.cjs.map +1 -1
- package/dist/composer/FileUploadButton.d.ts +6 -0
- package/dist/composer/FileUploadButton.js +34 -19
- package/dist/composer/FileUploadButton.js.map +1 -1
- package/dist/composer/QuoteContext.cjs +8 -8
- package/dist/composer/QuoteContext.cjs.map +1 -1
- package/dist/composer/composer-handoff.cjs +4 -4
- package/dist/composer/composer-handoff.cjs.map +1 -1
- package/dist/composer/useAppendToComposer.cjs +4 -4
- package/dist/composer/useAppendToComposer.cjs.map +1 -1
- package/dist/composer/useAttachFiles.cjs +23 -6
- package/dist/composer/useAttachFiles.cjs.map +1 -1
- package/dist/composer/useAttachFiles.d.ts +15 -7
- package/dist/composer/useAttachFiles.js +22 -5
- package/dist/composer/useAttachFiles.js.map +1 -1
- package/dist/composer/useComposerAttachment.cjs +4 -4
- package/dist/composer/useComposerAttachment.cjs.map +1 -1
- package/dist/composer/useFileUpload.cjs +21 -16
- package/dist/composer/useFileUpload.cjs.map +1 -1
- package/dist/composer/useFileUpload.d.ts +12 -0
- package/dist/composer/useFileUpload.js +12 -7
- package/dist/composer/useFileUpload.js.map +1 -1
- package/dist/composer/useReadComposerDraft.cjs +2 -2
- package/dist/composer/useReadComposerDraft.cjs.map +1 -1
- package/dist/composer/useSendMessage.cjs +4 -4
- package/dist/composer/useSendMessage.cjs.map +1 -1
- package/dist/diagnostics/useAthenaDiagnostics.cjs +4 -4
- package/dist/diagnostics/useAthenaDiagnostics.cjs.map +1 -1
- package/dist/dictation/audio-level-history.cjs +3 -3
- package/dist/dictation/audio-level-history.cjs.map +1 -1
- package/dist/dictation/dictation-controls.cjs +24 -20
- package/dist/dictation/dictation-controls.cjs.map +1 -1
- package/dist/dictation/dictation-controls.d.ts +6 -1
- package/dist/dictation/dictation-controls.js +24 -20
- package/dist/dictation/dictation-controls.js.map +1 -1
- package/dist/dictation/use-athena-dictation-engine.cjs +3 -3
- package/dist/dictation/use-athena-dictation-engine.cjs.map +1 -1
- package/dist/dictation/use-dictation.cjs +22 -22
- package/dist/dictation/use-dictation.cjs.map +1 -1
- package/dist/index.cjs +26 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +15 -3
- package/dist/index.js +26 -2
- package/dist/index.js.map +1 -1
- package/dist/keryx-http/src/receive-only-socket.cjs +40 -0
- package/dist/keryx-http/src/receive-only-socket.cjs.map +1 -0
- package/dist/keryx-http/src/receive-only-socket.d.ts +27 -0
- package/dist/keryx-http/src/receive-only-socket.js +40 -0
- package/dist/keryx-http/src/receive-only-socket.js.map +1 -0
- package/dist/keryx-http/src/update-attributions.cjs +111 -0
- package/dist/keryx-http/src/update-attributions.cjs.map +1 -0
- package/dist/keryx-http/src/update-attributions.d.ts +75 -0
- package/dist/keryx-http/src/update-attributions.js +111 -0
- package/dist/keryx-http/src/update-attributions.js.map +1 -0
- package/dist/lib/owner-document.cjs +6 -6
- package/dist/lib/owner-document.cjs.map +1 -1
- package/dist/lib/use-athena-rest-query.cjs +4 -4
- package/dist/lib/use-athena-rest-query.cjs.map +1 -1
- package/dist/lib/use-document-active.cjs +4 -4
- package/dist/lib/use-document-active.cjs.map +1 -1
- package/dist/lib/use-prefers-reduced-motion.cjs +2 -2
- package/dist/lib/use-prefers-reduced-motion.cjs.map +1 -1
- package/dist/offline/offline-history.cjs +7 -7
- package/dist/offline/offline-history.cjs.map +1 -1
- package/dist/provider/AthenaContext.cjs +3 -3
- package/dist/provider/AthenaContext.cjs.map +1 -1
- package/dist/provider/AthenaProvider.cjs +116 -79
- package/dist/provider/AthenaProvider.cjs.map +1 -1
- package/dist/provider/AthenaProvider.js +40 -3
- package/dist/provider/AthenaProvider.js.map +1 -1
- package/dist/provider/PostHogProvider.cjs +2 -2
- package/dist/provider/PostHogProvider.cjs.map +1 -1
- package/dist/provider/agent-selection-context.cjs +2 -2
- package/dist/provider/agent-selection-context.cjs.map +1 -1
- package/dist/provider/chat-mode-context.cjs +2 -2
- package/dist/provider/chat-mode-context.cjs.map +1 -1
- package/dist/provider/session-persistence-context.cjs +10 -0
- package/dist/provider/session-persistence-context.cjs.map +1 -0
- package/dist/provider/session-persistence-context.d.ts +15 -0
- package/dist/provider/session-persistence-context.js +10 -0
- package/dist/provider/session-persistence-context.js.map +1 -0
- package/dist/provider/statewire-history-context.cjs +4 -4
- package/dist/provider/statewire-history-context.cjs.map +1 -1
- package/dist/provider/statewire-lifecycle-context.cjs +3 -3
- package/dist/provider/statewire-lifecycle-context.cjs.map +1 -1
- package/dist/provider/statewire-window-context.cjs +3 -3
- package/dist/provider/statewire-window-context.cjs.map +1 -1
- package/dist/provider/theme-style-context.cjs +3 -3
- package/dist/provider/theme-style-context.cjs.map +1 -1
- package/dist/react/package.json.cjs +1 -1
- package/dist/react/package.json.js +1 -1
- package/dist/runtime/StatewireThreadConfigLaneSync.cjs +10 -10
- package/dist/runtime/StatewireThreadConfigLaneSync.cjs.map +1 -1
- package/dist/runtime/auth-refusal-restart.cjs +7 -7
- package/dist/runtime/auth-refusal-restart.cjs.map +1 -1
- package/dist/runtime/auth.cjs +13 -13
- package/dist/runtime/auth.cjs.map +1 -1
- package/dist/runtime/statewire-lifecycle.cjs +1 -0
- package/dist/runtime/statewire-lifecycle.cjs.map +1 -1
- package/dist/runtime/statewire-lifecycle.d.ts +3 -1
- package/dist/runtime/statewire-lifecycle.js +2 -1
- package/dist/runtime/statewire-lifecycle.js.map +1 -1
- package/dist/runtime/statewire-server-lane-context.cjs +2 -2
- package/dist/runtime/statewire-server-lane-context.cjs.map +1 -1
- package/dist/runtime/statewire-session-lane.cjs +4 -4
- package/dist/runtime/statewire-session-lane.cjs.map +1 -1
- package/dist/runtime/useAthenaStatewireRuntime.cjs +10 -8
- package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
- package/dist/runtime/useAthenaStatewireRuntime.d.ts +2 -0
- package/dist/runtime/useAthenaStatewireRuntime.js +2 -0
- package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/threads/Inbox.cjs +8 -8
- package/dist/threads/Inbox.cjs.map +1 -1
- package/dist/threads/SessionList.cjs +9 -9
- package/dist/threads/SessionList.cjs.map +1 -1
- package/dist/threads/SessionsPage.cjs +11 -11
- package/dist/threads/SessionsPage.cjs.map +1 -1
- package/dist/threads/index-triggered-refresh.cjs +10 -10
- package/dist/threads/index-triggered-refresh.cjs.map +1 -1
- package/dist/threads/mark-viewed-thread-read.cjs +12 -12
- package/dist/threads/mark-viewed-thread-read.cjs.map +1 -1
- package/dist/threads/offline-session-list.cjs +3 -3
- package/dist/threads/offline-session-list.cjs.map +1 -1
- package/dist/threads/session-list-tab-share.cjs +5 -5
- package/dist/threads/session-list-tab-share.cjs.map +1 -1
- package/dist/threads/statewire-thread-list.cjs +51 -51
- package/dist/threads/statewire-thread-list.cjs.map +1 -1
- package/dist/threads/thread-id-context.cjs +5 -5
- package/dist/threads/thread-id-context.cjs.map +1 -1
- package/dist/threads/use-athena-session-attention.cjs +2 -2
- package/dist/threads/use-athena-session-attention.cjs.map +1 -1
- package/dist/threads/use-athena-sessions.cjs +10 -10
- package/dist/threads/use-athena-sessions.cjs.map +1 -1
- package/dist/threads/use-athena-thread-model.cjs +3 -3
- package/dist/threads/use-athena-thread-model.cjs.map +1 -1
- package/dist/threads/use-rest-conversation-history.cjs +3 -3
- package/dist/threads/use-rest-conversation-history.cjs.map +1 -1
- package/dist/threads/use-statewire-conversation-history.cjs +8 -8
- package/dist/threads/use-statewire-conversation-history.cjs.map +1 -1
- package/dist/threads/use-thread-archive.cjs +9 -9
- package/dist/threads/use-thread-archive.cjs.map +1 -1
- package/dist/threads/use-thread-favorite.cjs +2 -2
- package/dist/threads/use-thread-favorite.cjs.map +1 -1
- package/dist/threads/use-thread-field-override.cjs +20 -20
- package/dist/threads/use-thread-field-override.cjs.map +1 -1
- package/dist/threads/use-thread-read-state.cjs +4 -4
- package/dist/threads/use-thread-read-state.cjs.map +1 -1
- package/dist/threads/use-thread-rename.cjs +2 -2
- package/dist/threads/use-thread-rename.cjs.map +1 -1
- package/dist/threads/useAthenaThreadManager.cjs +2 -2
- package/dist/threads/useAthenaThreadManager.cjs.map +1 -1
- package/dist/tools/NestedPtcMessages.cjs +6 -6
- package/dist/tools/NestedPtcMessages.cjs.map +1 -1
- package/dist/tools/append-document-tool-ui.cjs +7 -7
- package/dist/tools/append-document-tool-ui.cjs.map +1 -1
- package/dist/tools/file-tool-uis.cjs +2 -2
- package/dist/tools/file-tool-uis.cjs.map +1 -1
- package/dist/tools/misc-tool-uis.cjs +2 -2
- package/dist/tools/misc-tool-uis.cjs.map +1 -1
- package/dist/tools/primitives.cjs +6 -6
- package/dist/tools/primitives.cjs.map +1 -1
- package/dist/tools/read-asset-tool-ui.cjs +6 -6
- package/dist/tools/read-asset-tool-ui.cjs.map +1 -1
- package/dist/tools/subagent-task-tool-ui.cjs +21 -21
- package/dist/tools/subagent-task-tool-ui.cjs.map +1 -1
- package/dist/tools/test-recording-tool-uis.cjs +16 -16
- package/dist/tools/test-recording-tool-uis.cjs.map +1 -1
- package/dist/tools/todo-plan-store.cjs +4 -4
- package/dist/tools/todo-plan-store.cjs.map +1 -1
- package/dist/tools/tool-appearance.cjs +3 -3
- package/dist/tools/tool-appearance.cjs.map +1 -1
- package/dist/tools/tool-fallback.cjs +14 -14
- package/dist/tools/tool-fallback.cjs.map +1 -1
- package/dist/tools/tool-uis.cjs +74 -74
- package/dist/tools/tool-uis.cjs.map +1 -1
- package/dist/tools/use-elapsed-seconds.cjs +3 -3
- package/dist/tools/use-elapsed-seconds.cjs.map +1 -1
- package/dist/tools/write-todos-tool-ui.cjs +9 -9
- package/dist/tools/write-todos-tool-ui.cjs.map +1 -1
- package/dist/ui/image-viewer.cjs +382 -0
- package/dist/ui/image-viewer.cjs.map +1 -0
- package/dist/ui/image-viewer.d.ts +50 -0
- package/dist/ui/image-viewer.js +382 -0
- package/dist/ui/image-viewer.js.map +1 -0
- package/dist/voice/chat.cjs +6 -0
- package/dist/voice/chat.cjs.map +1 -1
- package/dist/voice/chat.d.ts +1 -1
- package/dist/voice/chat.js +8 -2
- package/dist/voice/livekit-join.cjs +52 -101
- package/dist/voice/livekit-join.cjs.map +1 -1
- package/dist/voice/livekit-join.d.ts +1 -6
- package/dist/voice/livekit-join.js +52 -101
- package/dist/voice/livekit-join.js.map +1 -1
- package/dist/voice/livekit.cjs.map +1 -1
- package/dist/voice/livekit.d.ts +11 -1
- package/dist/voice/livekit.js.map +1 -1
- package/dist/voice/use-athena-voice-session.cjs +34 -34
- package/dist/voice/use-athena-voice-session.cjs.map +1 -1
- package/dist/workbench/ComputerLiveDesktop.cjs +13 -13
- package/dist/workbench/ComputerLiveDesktop.cjs.map +1 -1
- package/dist/workbench/SessionWorkbench.cjs +22 -22
- package/dist/workbench/SessionWorkbench.cjs.map +1 -1
- package/dist/workbench/session-workbench-context.cjs +3 -3
- package/dist/workbench/session-workbench-context.cjs.map +1 -1
- package/dist/workbench/session-workbench-panes.cjs +8 -8
- package/dist/workbench/session-workbench-panes.cjs.map +1 -1
- package/dist/workbench/workbench-layout-context.cjs +3 -3
- package/dist/workbench/workbench-layout-context.cjs.map +1 -1
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-thread-read-state.cjs","sources":["../../src/threads/use-thread-read-state.ts"],"sourcesContent":["/**\n * Mark a session read or unread for the viewer — the inbox's \"Mark read\" and\n * the session list's read toggle: `useThreadFieldOverride` over\n * `POST /api/conversations/threads/read-state` (see that module for the\n * optimistic-override, rollback, serialization and identity-scoping\n * contract).\n *\n * The override matters more here than for the pin: the read-state route\n * publishes no conversation-index update, so a pushed index entry keeps the\n * `is_unread` it had at the index's last rebuild. The override holds the\n * viewer's answer over that stale push until the sources agree.\n */\nimport { useCallback, useRef, useState } from 'react';\nimport type { CredentialResolver } from '../runtime/credential-renewal';\nimport { setThreadReadState } from './api';\nimport type { RestConversationAuth } from './use-rest-conversation-history';\nimport { type ThreadFieldTarget, useThreadFieldOverride } from './use-thread-field-override';\n\nexport interface ThreadReadStateTarget {\n threadId: string;\n isUnread: boolean;\n /**\n * The row's last update the receipt covers (its `updatedAt` when the person\n * acted). Activity newer than that ends the override, so a session read\n * here turns unread again when it gets a new message — even in a list the\n * provider's own page does not hold. Without it the provider's page row's\n * value is used when it has one.\n */\n updatedAt?: string;\n}\n\n/** The fields the override layer reads on a list row. */\nexport interface ReadStateRow {\n threadId: string;\n isUnread: boolean;\n updatedAt?: string;\n}\n\nexport interface UseThreadReadStateOptions {\n backendUrl: string;\n /** Non-secret identity in the mutation key. */\n principalId: string;\n /** Resolved per request; called with `{ force: true }` when the host refuses the token. */\n getAuth: CredentialResolver<RestConversationAuth>;\n /** The rows as the list sources report them, BEFORE overrides. */\n rows: readonly ReadStateRow[];\n /** Write the server's answer into the list caches. */\n onServerTruth?: (result: ThreadReadStateTarget) => void;\n}\n\nexport interface ThreadReadStateToggle {\n /** Optimistic, then server-confirmed, values layered over the list sources, keyed by thread id. */\n overrides: Readonly<Record<string, boolean>>;\n /** The `updatedAt` each override covers; a row updated after it shows its own value. */\n coveredUpdatedAt: Readonly<Record<string, string>>;\n setReadState: (target: ThreadReadStateTarget) => void;\n pendingThreadIds: ReadonlySet<string>;\n /**\n * Always `true`: every agora the SDK supports has the read-state route, so\n * a 404 is a session that no longer exists, never a missing route.\n */\n isAvailable: boolean;\n}\n\nconst READ_STATE_UNAVAILABLE_WARNING =\n '[AthenaSDK] This backend has no POST /api/conversations/threads/read-state route; sessions cannot be marked read from here.';\n\n/** The route predates every agora the SDK supports; a rejection is per thread, never \"no route\". */\nconst isReadStateUnavailableError = (): boolean => false;\n\nconst readUnread = (row: ReadStateRow): boolean => row.isUnread;\n\nexport function useThreadReadState({\n backendUrl,\n principalId,\n getAuth,\n rows,\n onServerTruth,\n}: UseThreadReadStateOptions): ThreadReadStateToggle {\n const field = useThreadFieldOverride<boolean, ReadStateRow>({\n field: 'read-state',\n backendUrl,\n principalId,\n getAuth,\n rows,\n readRow: readUnread,\n write: async (auth, { threadId, value }) => {\n const result = await setThreadReadState(backendUrl, auth, { threadId, isUnread: value });\n return { threadId: result.thread_id, value: result.is_unread };\n },\n isUnavailableError: isReadStateUnavailableError,\n unavailableWarning: READ_STATE_UNAVAILABLE_WARNING,\n onServerTruth: onServerTruth\n ? ({ threadId, value }: ThreadFieldTarget<boolean>) =>\n onServerTruth({ threadId, isUnread: value })\n : undefined,\n });\n const set = field.set;\n const rowsRef = useRef(rows);\n rowsRef.current = rows;\n const [coveredUpdatedAt, setCoveredUpdatedAt] = useState<Readonly<Record<string, string>>>({});\n const setReadState = useCallback(\n ({ threadId, isUnread, updatedAt }: ThreadReadStateTarget) => {\n const covered =\n updatedAt ?? rowsRef.current.find((row) => row.threadId === threadId)?.updatedAt;\n setCoveredUpdatedAt((current) => {\n const next = { ...current };\n if (covered) next[threadId] = covered;\n else delete next[threadId];\n return next;\n });\n set({ threadId, value: isUnread });\n },\n [set],\n );\n return {\n overrides: field.overrides,\n coveredUpdatedAt,\n setReadState,\n pendingThreadIds: field.pendingThreadIds,\n isAvailable: field.isAvailable,\n };\n}\n\nfunction updatedAfter(row: ReadStateRow, covered: string | undefined): boolean {\n if (!covered || !row.updatedAt) return false;\n const rowAt = Date.parse(row.updatedAt);\n const coveredAt = Date.parse(covered);\n return Number.isFinite(rowAt) && Number.isFinite(coveredAt) && rowAt > coveredAt;\n}\n\n/**\n * Every row with its read-state override applied — except a row updated\n * after the activity the override covers, which shows its own value (marking\n * read never moves `updatedAt`, so a newer one is new activity).\n */\nexport function withReadStateOverrides<T extends ReadStateRow>(\n rows: readonly T[],\n overrides: Readonly<Record<string, boolean>>,\n coveredUpdatedAt: Readonly<Record<string, string>> = {},\n): T[] {\n return rows.map((row) => {\n const override = overrides[row.threadId];\n if (override === undefined || override === row.isUnread) return row;\n if (updatedAfter(row, coveredUpdatedAt[row.threadId])) return row;\n return { ...row, isUnread: override };\n });\n}\n"],"names":["useThreadFieldOverride","setThreadReadState","useRef","useState","useCallback"],"mappings":";;;;;AAgEA,MAAM,iCACJ;AAGF,MAAM,8BAA8B,MAAe;AAEnD,MAAM,aAAa,CAAC,QAA+B,IAAI;AAEhD,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAqD;AACnD,QAAM,QAAQA,uBAAAA,uBAA8C;AAAA,IAC1D,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,OAAO,OAAO,MAAM,EAAE,UAAU,YAAY;AAC1C,YAAM,SAAS,MAAMC,IAAAA,mBAAmB,YAAY,MAAM,EAAE,UAAU,UAAU,OAAO;AACvF,aAAO,EAAE,UAAU,OAAO,WAAW,OAAO,OAAO,UAAA;AAAA,IACrD;AAAA,IACA,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,eAAe,gBACX,CAAC,EAAE,UAAU,MAAA,MACX,cAAc,EAAE,UAAU,UAAU,MAAA,CAAO,IAC7C;AAAA,EAAA,CACL;AACD,QAAM,MAAM,MAAM;AAClB,QAAM,UAAUC,
|
|
1
|
+
{"version":3,"file":"use-thread-read-state.cjs","sources":["../../src/threads/use-thread-read-state.ts"],"sourcesContent":["/**\n * Mark a session read or unread for the viewer — the inbox's \"Mark read\" and\n * the session list's read toggle: `useThreadFieldOverride` over\n * `POST /api/conversations/threads/read-state` (see that module for the\n * optimistic-override, rollback, serialization and identity-scoping\n * contract).\n *\n * The override matters more here than for the pin: the read-state route\n * publishes no conversation-index update, so a pushed index entry keeps the\n * `is_unread` it had at the index's last rebuild. The override holds the\n * viewer's answer over that stale push until the sources agree.\n */\nimport { useCallback, useRef, useState } from 'react';\nimport type { CredentialResolver } from '../runtime/credential-renewal';\nimport { setThreadReadState } from './api';\nimport type { RestConversationAuth } from './use-rest-conversation-history';\nimport { type ThreadFieldTarget, useThreadFieldOverride } from './use-thread-field-override';\n\nexport interface ThreadReadStateTarget {\n threadId: string;\n isUnread: boolean;\n /**\n * The row's last update the receipt covers (its `updatedAt` when the person\n * acted). Activity newer than that ends the override, so a session read\n * here turns unread again when it gets a new message — even in a list the\n * provider's own page does not hold. Without it the provider's page row's\n * value is used when it has one.\n */\n updatedAt?: string;\n}\n\n/** The fields the override layer reads on a list row. */\nexport interface ReadStateRow {\n threadId: string;\n isUnread: boolean;\n updatedAt?: string;\n}\n\nexport interface UseThreadReadStateOptions {\n backendUrl: string;\n /** Non-secret identity in the mutation key. */\n principalId: string;\n /** Resolved per request; called with `{ force: true }` when the host refuses the token. */\n getAuth: CredentialResolver<RestConversationAuth>;\n /** The rows as the list sources report them, BEFORE overrides. */\n rows: readonly ReadStateRow[];\n /** Write the server's answer into the list caches. */\n onServerTruth?: (result: ThreadReadStateTarget) => void;\n}\n\nexport interface ThreadReadStateToggle {\n /** Optimistic, then server-confirmed, values layered over the list sources, keyed by thread id. */\n overrides: Readonly<Record<string, boolean>>;\n /** The `updatedAt` each override covers; a row updated after it shows its own value. */\n coveredUpdatedAt: Readonly<Record<string, string>>;\n setReadState: (target: ThreadReadStateTarget) => void;\n pendingThreadIds: ReadonlySet<string>;\n /**\n * Always `true`: every agora the SDK supports has the read-state route, so\n * a 404 is a session that no longer exists, never a missing route.\n */\n isAvailable: boolean;\n}\n\nconst READ_STATE_UNAVAILABLE_WARNING =\n '[AthenaSDK] This backend has no POST /api/conversations/threads/read-state route; sessions cannot be marked read from here.';\n\n/** The route predates every agora the SDK supports; a rejection is per thread, never \"no route\". */\nconst isReadStateUnavailableError = (): boolean => false;\n\nconst readUnread = (row: ReadStateRow): boolean => row.isUnread;\n\nexport function useThreadReadState({\n backendUrl,\n principalId,\n getAuth,\n rows,\n onServerTruth,\n}: UseThreadReadStateOptions): ThreadReadStateToggle {\n const field = useThreadFieldOverride<boolean, ReadStateRow>({\n field: 'read-state',\n backendUrl,\n principalId,\n getAuth,\n rows,\n readRow: readUnread,\n write: async (auth, { threadId, value }) => {\n const result = await setThreadReadState(backendUrl, auth, { threadId, isUnread: value });\n return { threadId: result.thread_id, value: result.is_unread };\n },\n isUnavailableError: isReadStateUnavailableError,\n unavailableWarning: READ_STATE_UNAVAILABLE_WARNING,\n onServerTruth: onServerTruth\n ? ({ threadId, value }: ThreadFieldTarget<boolean>) =>\n onServerTruth({ threadId, isUnread: value })\n : undefined,\n });\n const set = field.set;\n const rowsRef = useRef(rows);\n rowsRef.current = rows;\n const [coveredUpdatedAt, setCoveredUpdatedAt] = useState<Readonly<Record<string, string>>>({});\n const setReadState = useCallback(\n ({ threadId, isUnread, updatedAt }: ThreadReadStateTarget) => {\n const covered =\n updatedAt ?? rowsRef.current.find((row) => row.threadId === threadId)?.updatedAt;\n setCoveredUpdatedAt((current) => {\n const next = { ...current };\n if (covered) next[threadId] = covered;\n else delete next[threadId];\n return next;\n });\n set({ threadId, value: isUnread });\n },\n [set],\n );\n return {\n overrides: field.overrides,\n coveredUpdatedAt,\n setReadState,\n pendingThreadIds: field.pendingThreadIds,\n isAvailable: field.isAvailable,\n };\n}\n\nfunction updatedAfter(row: ReadStateRow, covered: string | undefined): boolean {\n if (!covered || !row.updatedAt) return false;\n const rowAt = Date.parse(row.updatedAt);\n const coveredAt = Date.parse(covered);\n return Number.isFinite(rowAt) && Number.isFinite(coveredAt) && rowAt > coveredAt;\n}\n\n/**\n * Every row with its read-state override applied — except a row updated\n * after the activity the override covers, which shows its own value (marking\n * read never moves `updatedAt`, so a newer one is new activity).\n */\nexport function withReadStateOverrides<T extends ReadStateRow>(\n rows: readonly T[],\n overrides: Readonly<Record<string, boolean>>,\n coveredUpdatedAt: Readonly<Record<string, string>> = {},\n): T[] {\n return rows.map((row) => {\n const override = overrides[row.threadId];\n if (override === undefined || override === row.isUnread) return row;\n if (updatedAfter(row, coveredUpdatedAt[row.threadId])) return row;\n return { ...row, isUnread: override };\n });\n}\n"],"names":["useThreadFieldOverride","setThreadReadState","useRef","useState","useCallback"],"mappings":";;;;;AAgEA,MAAM,iCACJ;AAGF,MAAM,8BAA8B,MAAe;AAEnD,MAAM,aAAa,CAAC,QAA+B,IAAI;AAEhD,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAqD;AACnD,QAAM,QAAQA,uBAAAA,uBAA8C;AAAA,IAC1D,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,OAAO,OAAO,MAAM,EAAE,UAAU,YAAY;AAC1C,YAAM,SAAS,MAAMC,IAAAA,mBAAmB,YAAY,MAAM,EAAE,UAAU,UAAU,OAAO;AACvF,aAAO,EAAE,UAAU,OAAO,WAAW,OAAO,OAAO,UAAA;AAAA,IACrD;AAAA,IACA,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,eAAe,gBACX,CAAC,EAAE,UAAU,MAAA,MACX,cAAc,EAAE,UAAU,UAAU,MAAA,CAAO,IAC7C;AAAA,EAAA,CACL;AACD,QAAM,MAAM,MAAM;AAClB,QAAM,UAAUC,WAAAA,OAAO,IAAI;AAC3B,UAAQ,UAAU;AAClB,QAAM,CAAC,kBAAkB,mBAAmB,IAAIC,WAAAA,SAA2C,CAAA,CAAE;AAC7F,QAAM,eAAeC,WAAAA;AAAAA,IACnB,CAAC,EAAE,UAAU,UAAU,gBAAuC;;AAC5D,YAAM,UACJ,eAAa,aAAQ,QAAQ,KAAK,CAAC,QAAQ,IAAI,aAAa,QAAQ,MAAvD,mBAA0D;AACzE,0BAAoB,CAAC,YAAY;AAC/B,cAAM,OAAO,EAAE,GAAG,QAAA;AAClB,YAAI,QAAS,MAAK,QAAQ,IAAI;AAAA,YACzB,QAAO,KAAK,QAAQ;AACzB,eAAO;AAAA,MACT,CAAC;AACD,UAAI,EAAE,UAAU,OAAO,SAAA,CAAU;AAAA,IACnC;AAAA,IACA,CAAC,GAAG;AAAA,EAAA;AAEN,SAAO;AAAA,IACL,WAAW,MAAM;AAAA,IACjB;AAAA,IACA;AAAA,IACA,kBAAkB,MAAM;AAAA,IACxB,aAAa,MAAM;AAAA,EAAA;AAEvB;AAEA,SAAS,aAAa,KAAmB,SAAsC;AAC7E,MAAI,CAAC,WAAW,CAAC,IAAI,UAAW,QAAO;AACvC,QAAM,QAAQ,KAAK,MAAM,IAAI,SAAS;AACtC,QAAM,YAAY,KAAK,MAAM,OAAO;AACpC,SAAO,OAAO,SAAS,KAAK,KAAK,OAAO,SAAS,SAAS,KAAK,QAAQ;AACzE;AAOO,SAAS,uBACd,MACA,WACA,mBAAqD,CAAA,GAChD;AACL,SAAO,KAAK,IAAI,CAAC,QAAQ;AACvB,UAAM,WAAW,UAAU,IAAI,QAAQ;AACvC,QAAI,aAAa,UAAa,aAAa,IAAI,SAAU,QAAO;AAChE,QAAI,aAAa,KAAK,iBAAiB,IAAI,QAAQ,CAAC,EAAG,QAAO;AAC9D,WAAO,EAAE,GAAG,KAAK,UAAU,SAAA;AAAA,EAC7B,CAAC;AACH;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const
|
|
3
|
+
const require$$0 = require("react");
|
|
4
4
|
const api = require("./api.cjs");
|
|
5
5
|
const useThreadFieldOverride = require("./use-thread-field-override.cjs");
|
|
6
6
|
const RENAME_UNAVAILABLE_WARNING = "[AthenaSDK] This backend has no POST /api/conversations/threads/rename route yet; sessions cannot be renamed from here until it deploys.";
|
|
@@ -28,7 +28,7 @@ function useThreadRename({
|
|
|
28
28
|
onServerTruth: onServerTruth ? ({ threadId, value }) => onServerTruth({ threadId, title: value }) : void 0
|
|
29
29
|
});
|
|
30
30
|
const set = field.set;
|
|
31
|
-
const rename =
|
|
31
|
+
const rename = require$$0.useCallback(
|
|
32
32
|
({ threadId, title }) => set({ threadId, value: title }),
|
|
33
33
|
[set]
|
|
34
34
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-thread-rename.cjs","sources":["../../src/threads/use-thread-rename.ts"],"sourcesContent":["/**\n * The inline rename behind `SessionList`: `useThreadFieldOverride` over\n * `POST /api/conversations/threads/rename` (see that module for the\n * optimistic-override, rollback, serialization and identity-scoping\n * contract). The row shows the new title on commit; the server's stored\n * title (trimmed) is written back, and a failure restores the previous one.\n * A 404 / 405 marks the rename unavailable — the backend predates the route\n * — so the list withdraws the action instead of failing on every commit.\n */\nimport { useCallback } from 'react';\nimport type { CredentialResolver } from '../runtime/credential-renewal';\nimport { isThreadRenameUnavailableError, renameThread } from './api';\nimport type { RestConversationAuth } from './use-rest-conversation-history';\nimport { type ThreadFieldTarget, useThreadFieldOverride } from './use-thread-field-override';\n\nexport interface ThreadRenameTarget {\n threadId: string;\n /** The new title; the caller trims it (the server trims again and bounds it to 1–200 characters). */\n title: string;\n}\n\n/** The two fields the override layer reads and writes on a list row. */\nexport interface TitleRow {\n threadId: string;\n title: string;\n}\n\nexport interface UseThreadRenameOptions {\n backendUrl: string;\n /** Non-secret identity in the mutation key (as the read-state mutation keys). */\n principalId: string;\n /** Resolved per request; called with `{ force: true }` when the host refuses the token. */\n getAuth: CredentialResolver<RestConversationAuth>;\n /**\n * The rows as the list sources currently report them, BEFORE overrides. An\n * override is dropped once its row reports the same title.\n */\n rows: readonly TitleRow[];\n /** Write the server's answer into the list caches (`patchConversation`). */\n onServerTruth?: (result: ThreadRenameTarget) => void;\n}\n\nexport interface ThreadRename {\n /** Optimistic, then server-confirmed, titles layered over the list sources, keyed by thread id. */\n overrides: Readonly<Record<string, string>>;\n /**\n * Rename a thread. The row shows the title at once; while that thread's\n * write is in flight the call only records the desired title (see the\n * field-override module doc).\n */\n rename: (target: ThreadRenameTarget) => void;\n /** True while any rename is in flight. */\n isPending: boolean;\n /** The threads whose rename is in flight — the row's editor stays closed for these. */\n pendingThreadIds: ReadonlySet<string>;\n /**\n * `false` once the backend answered 404 / 405: the route is not deployed\n * there, and the list offers no rename action.\n */\n isAvailable: boolean;\n}\n\nconst RENAME_UNAVAILABLE_WARNING =\n '[AthenaSDK] This backend has no POST /api/conversations/threads/rename route yet; sessions cannot be renamed from here until it deploys.';\n\nconst readTitle = (row: TitleRow): string => row.title;\n\nexport function useThreadRename({\n backendUrl,\n principalId,\n getAuth,\n rows,\n onServerTruth,\n}: UseThreadRenameOptions): ThreadRename {\n const field = useThreadFieldOverride<string, TitleRow>({\n field: 'rename',\n backendUrl,\n principalId,\n getAuth,\n rows,\n readRow: readTitle,\n write: async (auth, { threadId, value }) => {\n const result = await renameThread(backendUrl, auth, { threadId, title: value });\n return { threadId: result.thread_id, value: result.title };\n },\n isUnavailableError: isThreadRenameUnavailableError,\n unavailableWarning: RENAME_UNAVAILABLE_WARNING,\n onServerTruth: onServerTruth\n ? ({ threadId, value }: ThreadFieldTarget<string>) => onServerTruth({ threadId, title: value })\n : undefined,\n });\n const set = field.set;\n const rename = useCallback(\n ({ threadId, title }: ThreadRenameTarget) => set({ threadId, value: title }),\n [set],\n );\n return {\n overrides: field.overrides,\n rename,\n isPending: field.isPending,\n pendingThreadIds: field.pendingThreadIds,\n isAvailable: field.isAvailable,\n };\n}\n\n/** The row with its title override applied, or the row itself when it has none. */\nexport function withTitleOverride<T extends TitleRow>(\n row: T,\n overrides: Readonly<Record<string, string>>,\n): T {\n const override = overrides[row.threadId];\n return override === undefined || override === row.title ? row : { ...row, title: override };\n}\n\n/** Every row with its title override applied. */\nexport function withTitleOverrides<T extends TitleRow>(\n rows: readonly T[],\n overrides: Readonly<Record<string, string>>,\n): T[] {\n return rows.map((row) => withTitleOverride(row, overrides));\n}\n"],"names":["useThreadFieldOverride","renameThread","isThreadRenameUnavailableError","useCallback"],"mappings":";;;;;AA8DA,MAAM,6BACJ;AAEF,MAAM,YAAY,CAAC,QAA0B,IAAI;AAE1C,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyC;AACvC,QAAM,QAAQA,uBAAAA,uBAAyC;AAAA,IACrD,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,OAAO,OAAO,MAAM,EAAE,UAAU,YAAY;AAC1C,YAAM,SAAS,MAAMC,IAAAA,aAAa,YAAY,MAAM,EAAE,UAAU,OAAO,OAAO;AAC9E,aAAO,EAAE,UAAU,OAAO,WAAW,OAAO,OAAO,MAAA;AAAA,IACrD;AAAA,IACA,oBAAoBC,IAAAA;AAAAA,IACpB,oBAAoB;AAAA,IACpB,eAAe,gBACX,CAAC,EAAE,UAAU,MAAA,MAAuC,cAAc,EAAE,UAAU,OAAO,MAAA,CAAO,IAC5F;AAAA,EAAA,CACL;AACD,QAAM,MAAM,MAAM;AAClB,QAAM,SAASC,
|
|
1
|
+
{"version":3,"file":"use-thread-rename.cjs","sources":["../../src/threads/use-thread-rename.ts"],"sourcesContent":["/**\n * The inline rename behind `SessionList`: `useThreadFieldOverride` over\n * `POST /api/conversations/threads/rename` (see that module for the\n * optimistic-override, rollback, serialization and identity-scoping\n * contract). The row shows the new title on commit; the server's stored\n * title (trimmed) is written back, and a failure restores the previous one.\n * A 404 / 405 marks the rename unavailable — the backend predates the route\n * — so the list withdraws the action instead of failing on every commit.\n */\nimport { useCallback } from 'react';\nimport type { CredentialResolver } from '../runtime/credential-renewal';\nimport { isThreadRenameUnavailableError, renameThread } from './api';\nimport type { RestConversationAuth } from './use-rest-conversation-history';\nimport { type ThreadFieldTarget, useThreadFieldOverride } from './use-thread-field-override';\n\nexport interface ThreadRenameTarget {\n threadId: string;\n /** The new title; the caller trims it (the server trims again and bounds it to 1–200 characters). */\n title: string;\n}\n\n/** The two fields the override layer reads and writes on a list row. */\nexport interface TitleRow {\n threadId: string;\n title: string;\n}\n\nexport interface UseThreadRenameOptions {\n backendUrl: string;\n /** Non-secret identity in the mutation key (as the read-state mutation keys). */\n principalId: string;\n /** Resolved per request; called with `{ force: true }` when the host refuses the token. */\n getAuth: CredentialResolver<RestConversationAuth>;\n /**\n * The rows as the list sources currently report them, BEFORE overrides. An\n * override is dropped once its row reports the same title.\n */\n rows: readonly TitleRow[];\n /** Write the server's answer into the list caches (`patchConversation`). */\n onServerTruth?: (result: ThreadRenameTarget) => void;\n}\n\nexport interface ThreadRename {\n /** Optimistic, then server-confirmed, titles layered over the list sources, keyed by thread id. */\n overrides: Readonly<Record<string, string>>;\n /**\n * Rename a thread. The row shows the title at once; while that thread's\n * write is in flight the call only records the desired title (see the\n * field-override module doc).\n */\n rename: (target: ThreadRenameTarget) => void;\n /** True while any rename is in flight. */\n isPending: boolean;\n /** The threads whose rename is in flight — the row's editor stays closed for these. */\n pendingThreadIds: ReadonlySet<string>;\n /**\n * `false` once the backend answered 404 / 405: the route is not deployed\n * there, and the list offers no rename action.\n */\n isAvailable: boolean;\n}\n\nconst RENAME_UNAVAILABLE_WARNING =\n '[AthenaSDK] This backend has no POST /api/conversations/threads/rename route yet; sessions cannot be renamed from here until it deploys.';\n\nconst readTitle = (row: TitleRow): string => row.title;\n\nexport function useThreadRename({\n backendUrl,\n principalId,\n getAuth,\n rows,\n onServerTruth,\n}: UseThreadRenameOptions): ThreadRename {\n const field = useThreadFieldOverride<string, TitleRow>({\n field: 'rename',\n backendUrl,\n principalId,\n getAuth,\n rows,\n readRow: readTitle,\n write: async (auth, { threadId, value }) => {\n const result = await renameThread(backendUrl, auth, { threadId, title: value });\n return { threadId: result.thread_id, value: result.title };\n },\n isUnavailableError: isThreadRenameUnavailableError,\n unavailableWarning: RENAME_UNAVAILABLE_WARNING,\n onServerTruth: onServerTruth\n ? ({ threadId, value }: ThreadFieldTarget<string>) => onServerTruth({ threadId, title: value })\n : undefined,\n });\n const set = field.set;\n const rename = useCallback(\n ({ threadId, title }: ThreadRenameTarget) => set({ threadId, value: title }),\n [set],\n );\n return {\n overrides: field.overrides,\n rename,\n isPending: field.isPending,\n pendingThreadIds: field.pendingThreadIds,\n isAvailable: field.isAvailable,\n };\n}\n\n/** The row with its title override applied, or the row itself when it has none. */\nexport function withTitleOverride<T extends TitleRow>(\n row: T,\n overrides: Readonly<Record<string, string>>,\n): T {\n const override = overrides[row.threadId];\n return override === undefined || override === row.title ? row : { ...row, title: override };\n}\n\n/** Every row with its title override applied. */\nexport function withTitleOverrides<T extends TitleRow>(\n rows: readonly T[],\n overrides: Readonly<Record<string, string>>,\n): T[] {\n return rows.map((row) => withTitleOverride(row, overrides));\n}\n"],"names":["useThreadFieldOverride","renameThread","isThreadRenameUnavailableError","useCallback"],"mappings":";;;;;AA8DA,MAAM,6BACJ;AAEF,MAAM,YAAY,CAAC,QAA0B,IAAI;AAE1C,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyC;AACvC,QAAM,QAAQA,uBAAAA,uBAAyC;AAAA,IACrD,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,OAAO,OAAO,MAAM,EAAE,UAAU,YAAY;AAC1C,YAAM,SAAS,MAAMC,IAAAA,aAAa,YAAY,MAAM,EAAE,UAAU,OAAO,OAAO;AAC9E,aAAO,EAAE,UAAU,OAAO,WAAW,OAAO,OAAO,MAAA;AAAA,IACrD;AAAA,IACA,oBAAoBC,IAAAA;AAAAA,IACpB,oBAAoB;AAAA,IACpB,eAAe,gBACX,CAAC,EAAE,UAAU,MAAA,MAAuC,cAAc,EAAE,UAAU,OAAO,MAAA,CAAO,IAC5F;AAAA,EAAA,CACL;AACD,QAAM,MAAM,MAAM;AAClB,QAAM,SAASC,WAAAA;AAAAA,IACb,CAAC,EAAE,UAAU,YAAgC,IAAI,EAAE,UAAU,OAAO,OAAO;AAAA,IAC3E,CAAC,GAAG;AAAA,EAAA;AAEN,SAAO;AAAA,IACL,WAAW,MAAM;AAAA,IACjB;AAAA,IACA,WAAW,MAAM;AAAA,IACjB,kBAAkB,MAAM;AAAA,IACxB,aAAa,MAAM;AAAA,EAAA;AAEvB;AAGO,SAAS,kBACd,KACA,WACG;AACH,QAAM,WAAW,UAAU,IAAI,QAAQ;AACvC,SAAO,aAAa,UAAa,aAAa,IAAI,QAAQ,MAAM,EAAE,GAAG,KAAK,OAAO,SAAA;AACnF;AAGO,SAAS,mBACd,MACA,WACK;AACL,SAAO,KAAK,IAAI,CAAC,QAAQ,kBAAkB,KAAK,SAAS,CAAC;AAC5D;;;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const react = require("@assistant-ui/react");
|
|
4
|
-
const
|
|
4
|
+
const require$$0 = require("react");
|
|
5
5
|
const statewireThreadList = require("./statewire-thread-list.cjs");
|
|
6
6
|
function useAthenaThreadManager() {
|
|
7
7
|
const list = statewireThreadList.useAthenaStatewireThreadList();
|
|
@@ -9,7 +9,7 @@ function useAthenaThreadManager() {
|
|
|
9
9
|
var _a;
|
|
10
10
|
return ((_a = s.optional.thread) == null ? void 0 : _a.isLoading) ?? false;
|
|
11
11
|
});
|
|
12
|
-
return
|
|
12
|
+
return require$$0.useMemo(() => {
|
|
13
13
|
if (!list) return null;
|
|
14
14
|
return {
|
|
15
15
|
activeThreadId: list.isNewChat ? null : list.activeThreadId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAthenaThreadManager.cjs","sources":["../../src/threads/useAthenaThreadManager.ts"],"sourcesContent":["/**\n * Public hook for managing thread state and navigation.\n *\n * Wraps the provider's thread-list state to provide a clean, Athena-branded\n * API for reading the active thread and switching between threads.\n *\n * Must be used inside `<AthenaProvider enableThreadList>`.\n */\n\nimport { useAuiState } from '@assistant-ui/react';\nimport { useMemo } from 'react';\nimport { useAthenaStatewireThreadList } from './statewire-thread-list';\n\nexport interface AthenaThreadManagerState {\n /** The backend thread ID of the currently active thread, or null while the\n * active chat is a never-started local chat the backend has not listed yet. */\n activeThreadId: string | null;\n /** Whether the thread list is still loading from the backend. */\n isListLoading: boolean;\n /** Whether the current thread is loading its message history (e.g. after a thread switch). */\n isThreadLoading: boolean;\n /** Switch the chat to a different thread by its backend thread ID. */\n switchToThread: (threadId: string) => Promise<void>;\n /** Create and switch to a new empty thread. */\n switchToNewThread: () => Promise<void>;\n}\n\n/**\n * Hook for managing thread navigation.\n *\n * Returns `null` when called outside `<AthenaProvider enableThreadList>`.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const threads = useAthenaThreadManager();\n * if (!threads) return null;\n *\n * return (\n * <div>\n * <p>Active: {threads.activeThreadId}</p>\n * <button onClick={() => threads.switchToNewThread()}>New Chat</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useAthenaThreadManager(): AthenaThreadManagerState | null {\n const list = useAthenaStatewireThreadList();\n const isThreadLoading = useAuiState((s) => s.optional.thread?.isLoading ?? false);\n\n return useMemo<AthenaThreadManagerState | null>(() => {\n if (!list) return null;\n return {\n activeThreadId: list.isNewChat ? null : list.activeThreadId,\n isListLoading: list.isLoading,\n isThreadLoading,\n switchToThread: async (threadId: string) => list.selectThread(threadId),\n switchToNewThread: async () => list.newThread(),\n };\n }, [list, isThreadLoading]);\n}\n"],"names":["useAthenaStatewireThreadList","useAuiState","useMemo"],"mappings":";;;;;AA+CO,SAAS,yBAA0D;AACxE,QAAM,OAAOA,oBAAAA,6BAAA;AACb,QAAM,kBAAkBC,MAAAA,YAAY,CAAC,MAAA;;AAAM,oBAAE,SAAS,WAAX,mBAAmB,cAAa;AAAA,GAAK;AAEhF,SAAOC,
|
|
1
|
+
{"version":3,"file":"useAthenaThreadManager.cjs","sources":["../../src/threads/useAthenaThreadManager.ts"],"sourcesContent":["/**\n * Public hook for managing thread state and navigation.\n *\n * Wraps the provider's thread-list state to provide a clean, Athena-branded\n * API for reading the active thread and switching between threads.\n *\n * Must be used inside `<AthenaProvider enableThreadList>`.\n */\n\nimport { useAuiState } from '@assistant-ui/react';\nimport { useMemo } from 'react';\nimport { useAthenaStatewireThreadList } from './statewire-thread-list';\n\nexport interface AthenaThreadManagerState {\n /** The backend thread ID of the currently active thread, or null while the\n * active chat is a never-started local chat the backend has not listed yet. */\n activeThreadId: string | null;\n /** Whether the thread list is still loading from the backend. */\n isListLoading: boolean;\n /** Whether the current thread is loading its message history (e.g. after a thread switch). */\n isThreadLoading: boolean;\n /** Switch the chat to a different thread by its backend thread ID. */\n switchToThread: (threadId: string) => Promise<void>;\n /** Create and switch to a new empty thread. */\n switchToNewThread: () => Promise<void>;\n}\n\n/**\n * Hook for managing thread navigation.\n *\n * Returns `null` when called outside `<AthenaProvider enableThreadList>`.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const threads = useAthenaThreadManager();\n * if (!threads) return null;\n *\n * return (\n * <div>\n * <p>Active: {threads.activeThreadId}</p>\n * <button onClick={() => threads.switchToNewThread()}>New Chat</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useAthenaThreadManager(): AthenaThreadManagerState | null {\n const list = useAthenaStatewireThreadList();\n const isThreadLoading = useAuiState((s) => s.optional.thread?.isLoading ?? false);\n\n return useMemo<AthenaThreadManagerState | null>(() => {\n if (!list) return null;\n return {\n activeThreadId: list.isNewChat ? null : list.activeThreadId,\n isListLoading: list.isLoading,\n isThreadLoading,\n switchToThread: async (threadId: string) => list.selectThread(threadId),\n switchToNewThread: async () => list.newThread(),\n };\n }, [list, isThreadLoading]);\n}\n"],"names":["useAthenaStatewireThreadList","useAuiState","useMemo"],"mappings":";;;;;AA+CO,SAAS,yBAA0D;AACxE,QAAM,OAAOA,oBAAAA,6BAAA;AACb,QAAM,kBAAkBC,MAAAA,YAAY,CAAC,MAAA;;AAAM,oBAAE,SAAS,WAAX,mBAAmB,cAAa;AAAA,GAAK;AAEhF,SAAOC,WAAAA,QAAyC,MAAM;AACpD,QAAI,CAAC,KAAM,QAAO;AAClB,WAAO;AAAA,MACL,gBAAgB,KAAK,YAAY,OAAO,KAAK;AAAA,MAC7C,eAAe,KAAK;AAAA,MACpB;AAAA,MACA,gBAAgB,OAAO,aAAqB,KAAK,aAAa,QAAQ;AAAA,MACtE,mBAAmB,YAAY,KAAK,UAAA;AAAA,IAAU;AAAA,EAElD,GAAG,CAAC,MAAM,eAAe,CAAC;AAC5B;;"}
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const jsxRuntime = require("react/jsx-runtime");
|
|
4
4
|
const react = require("@assistant-ui/react");
|
|
5
|
-
const
|
|
5
|
+
const require$$0 = require("react");
|
|
6
6
|
const toolNames = require("../agent-runtime/src/tool-names.cjs");
|
|
7
|
-
const NestedPtcComponentsContext =
|
|
7
|
+
const NestedPtcComponentsContext = require$$0.createContext(null);
|
|
8
8
|
const NestedPtcComponentsProvider = ({ components, children }) => /* @__PURE__ */ jsxRuntime.jsx(NestedPtcComponentsContext.Provider, { value: components, children });
|
|
9
9
|
const useNestedPtcComponents = (fallback) => {
|
|
10
|
-
const components =
|
|
11
|
-
return
|
|
10
|
+
const components = require$$0.useContext(NestedPtcComponentsContext);
|
|
11
|
+
return require$$0.useMemo(() => {
|
|
12
12
|
const standardComponents = components && "ChainOfThought" in components && components.ChainOfThought ? void 0 : components;
|
|
13
13
|
return {
|
|
14
14
|
...standardComponents ?? {},
|
|
@@ -27,9 +27,9 @@ const NestedPtcMessages = ({
|
|
|
27
27
|
const isSubagentLane = react.useAuiState(
|
|
28
28
|
(s) => s.part.type === "tool-call" && s.part.toolName === toolNames.TASK_TOOL_NAME
|
|
29
29
|
);
|
|
30
|
-
const propsRef =
|
|
30
|
+
const propsRef = require$$0.useRef({ components, messageClassName });
|
|
31
31
|
propsRef.current = { components, messageClassName };
|
|
32
|
-
const messageComponents =
|
|
32
|
+
const messageComponents = require$$0.useMemo(() => {
|
|
33
33
|
const NestedMessage = () => {
|
|
34
34
|
const { components: components2, messageClassName: messageClassName2 } = propsRef.current;
|
|
35
35
|
const parts = /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NestedPtcMessages.cjs","sources":["../../src/tools/NestedPtcMessages.tsx"],"sourcesContent":["\"use client\";\n\nimport { MessagePartPrimitive, MessagePrimitive, useAuiState } from \"@assistant-ui/react\";\nimport { TASK_TOOL_NAME } from \"@athenaintel/agent-runtime\";\nimport {\n createContext,\n useContext,\n useMemo,\n useRef,\n type ComponentProps,\n type FC,\n type PropsWithChildren,\n} from \"react\";\nimport type { ToolCallMessagePartComponent } from \"@assistant-ui/react\";\n\ntype PartsComponents = ComponentProps<typeof MessagePrimitive.Parts>[\"components\"];\ntype StandardPartsComponents = Extract<\n NonNullable<PartsComponents>,\n { ChainOfThought?: undefined }\n>;\n\nconst NestedPtcComponentsContext = createContext<PartsComponents | null>(null);\n\nexport const NestedPtcComponentsProvider: FC<\n PropsWithChildren<{ components: PartsComponents }>\n> = ({ components, children }) => (\n <NestedPtcComponentsContext.Provider value={components}>\n {children}\n </NestedPtcComponentsContext.Provider>\n);\n\nexport const useNestedPtcComponents = (\n fallback: ToolCallMessagePartComponent\n): PartsComponents => {\n const components = useContext(NestedPtcComponentsContext);\n\n return useMemo(() => {\n const standardComponents =\n components && \"ChainOfThought\" in components && components.ChainOfThought\n ? undefined\n : (components as StandardPartsComponents | null);\n\n return {\n ...(standardComponents ?? {}),\n tools: {\n ...(standardComponents?.tools ?? {}),\n Fallback: fallback,\n },\n } satisfies StandardPartsComponents;\n }, [components, fallback]);\n};\n\nexport interface NestedPtcMessagesProps {\n components: PartsComponents;\n messageClassName?: string;\n}\n\nconst EmptyComponent: FC = () => null;\n\n/**\n * A tool call's nested messages (a programmatic-tool-calling execution's\n * sub-calls), rendered under the tool card with the parent's renderers.\n *\n * Except a `task` call's: those are its subagent's lane, which the subagent\n * card (`SubagentTaskToolUI`) shows and pages. A generic card or a host's own\n * `task` UI wrapped with these would show a second, unpaged copy (a cut lane\n * holds only its newest steps), so it renders nothing for them.\n */\nexport const NestedPtcMessages: FC<NestedPtcMessagesProps> = ({\n components,\n messageClassName,\n}) => {\n const isSubagentLane = useAuiState(\n (s) => s.part.type === \"tool-call\" && s.part.toolName === TASK_TOOL_NAME,\n );\n const propsRef = useRef({ components, messageClassName });\n propsRef.current = { components, messageClassName };\n\n const messageComponents = useMemo(() => {\n const NestedMessage: FC = () => {\n const { components, messageClassName } = propsRef.current;\n const parts = (\n <MessagePrimitive.Parts\n components={{ Empty: EmptyComponent, ...components }}\n />\n );\n return messageClassName ? (\n <div className={messageClassName}>{parts}</div>\n ) : (\n parts\n );\n };\n\n return { Message: NestedMessage };\n }, []);\n\n if (isSubagentLane) return null;\n return <MessagePartPrimitive.Messages components={messageComponents} />;\n};\n"],"names":["createContext","jsx","useContext","useMemo","useAuiState","TASK_TOOL_NAME","useRef","components","messageClassName","MessagePrimitive","MessagePartPrimitive"],"mappings":";;;;;;AAqBA,MAAM,6BAA6BA,
|
|
1
|
+
{"version":3,"file":"NestedPtcMessages.cjs","sources":["../../src/tools/NestedPtcMessages.tsx"],"sourcesContent":["\"use client\";\n\nimport { MessagePartPrimitive, MessagePrimitive, useAuiState } from \"@assistant-ui/react\";\nimport { TASK_TOOL_NAME } from \"@athenaintel/agent-runtime\";\nimport {\n createContext,\n useContext,\n useMemo,\n useRef,\n type ComponentProps,\n type FC,\n type PropsWithChildren,\n} from \"react\";\nimport type { ToolCallMessagePartComponent } from \"@assistant-ui/react\";\n\ntype PartsComponents = ComponentProps<typeof MessagePrimitive.Parts>[\"components\"];\ntype StandardPartsComponents = Extract<\n NonNullable<PartsComponents>,\n { ChainOfThought?: undefined }\n>;\n\nconst NestedPtcComponentsContext = createContext<PartsComponents | null>(null);\n\nexport const NestedPtcComponentsProvider: FC<\n PropsWithChildren<{ components: PartsComponents }>\n> = ({ components, children }) => (\n <NestedPtcComponentsContext.Provider value={components}>\n {children}\n </NestedPtcComponentsContext.Provider>\n);\n\nexport const useNestedPtcComponents = (\n fallback: ToolCallMessagePartComponent\n): PartsComponents => {\n const components = useContext(NestedPtcComponentsContext);\n\n return useMemo(() => {\n const standardComponents =\n components && \"ChainOfThought\" in components && components.ChainOfThought\n ? undefined\n : (components as StandardPartsComponents | null);\n\n return {\n ...(standardComponents ?? {}),\n tools: {\n ...(standardComponents?.tools ?? {}),\n Fallback: fallback,\n },\n } satisfies StandardPartsComponents;\n }, [components, fallback]);\n};\n\nexport interface NestedPtcMessagesProps {\n components: PartsComponents;\n messageClassName?: string;\n}\n\nconst EmptyComponent: FC = () => null;\n\n/**\n * A tool call's nested messages (a programmatic-tool-calling execution's\n * sub-calls), rendered under the tool card with the parent's renderers.\n *\n * Except a `task` call's: those are its subagent's lane, which the subagent\n * card (`SubagentTaskToolUI`) shows and pages. A generic card or a host's own\n * `task` UI wrapped with these would show a second, unpaged copy (a cut lane\n * holds only its newest steps), so it renders nothing for them.\n */\nexport const NestedPtcMessages: FC<NestedPtcMessagesProps> = ({\n components,\n messageClassName,\n}) => {\n const isSubagentLane = useAuiState(\n (s) => s.part.type === \"tool-call\" && s.part.toolName === TASK_TOOL_NAME,\n );\n const propsRef = useRef({ components, messageClassName });\n propsRef.current = { components, messageClassName };\n\n const messageComponents = useMemo(() => {\n const NestedMessage: FC = () => {\n const { components, messageClassName } = propsRef.current;\n const parts = (\n <MessagePrimitive.Parts\n components={{ Empty: EmptyComponent, ...components }}\n />\n );\n return messageClassName ? (\n <div className={messageClassName}>{parts}</div>\n ) : (\n parts\n );\n };\n\n return { Message: NestedMessage };\n }, []);\n\n if (isSubagentLane) return null;\n return <MessagePartPrimitive.Messages components={messageComponents} />;\n};\n"],"names":["createContext","jsx","useContext","useMemo","useAuiState","TASK_TOOL_NAME","useRef","components","messageClassName","MessagePrimitive","MessagePartPrimitive"],"mappings":";;;;;;AAqBA,MAAM,6BAA6BA,WAAAA,cAAsC,IAAI;AAEtE,MAAM,8BAET,CAAC,EAAE,YAAY,eACjBC,2BAAAA,IAAC,2BAA2B,UAA3B,EAAoC,OAAO,YACzC,SAAA,CACH;AAGK,MAAM,yBAAyB,CACpC,aACoB;AACpB,QAAM,aAAaC,WAAAA,WAAW,0BAA0B;AAExD,SAAOC,WAAAA,QAAQ,MAAM;AACnB,UAAM,qBACJ,cAAc,oBAAoB,cAAc,WAAW,iBACvD,SACC;AAEP,WAAO;AAAA,MACL,GAAI,sBAAsB,CAAA;AAAA,MAC1B,OAAO;AAAA,QACL,IAAI,yDAAoB,UAAS,CAAA;AAAA,QACjC,UAAU;AAAA,MAAA;AAAA,IACZ;AAAA,EAEJ,GAAG,CAAC,YAAY,QAAQ,CAAC;AAC3B;AAOA,MAAM,iBAAqB,MAAM;AAW1B,MAAM,oBAAgD,CAAC;AAAA,EAC5D;AAAA,EACA;AACF,MAAM;AACJ,QAAM,iBAAiBC,MAAAA;AAAAA,IACrB,CAAC,MAAM,EAAE,KAAK,SAAS,eAAe,EAAE,KAAK,aAAaC,UAAAA;AAAAA,EAAA;AAE5D,QAAM,WAAWC,WAAAA,OAAO,EAAE,YAAY,kBAAkB;AACxD,WAAS,UAAU,EAAE,YAAY,iBAAA;AAEjC,QAAM,oBAAoBH,WAAAA,QAAQ,MAAM;AACtC,UAAM,gBAAoB,MAAM;AAC9B,YAAM,EAAE,YAAAI,aAAY,kBAAAC,kBAAAA,IAAqB,SAAS;AAClD,YAAM,QACJP,2BAAAA;AAAAA,QAACQ,MAAAA,iBAAiB;AAAA,QAAjB;AAAA,UACC,YAAY,EAAE,OAAO,gBAAgB,GAAGF,YAAAA;AAAAA,QAAW;AAAA,MAAA;AAGvD,aAAOC,oBACLP,+BAAC,OAAA,EAAI,WAAWO,mBAAmB,iBAAM,IAEzC;AAAA,IAEJ;AAEA,WAAO,EAAE,SAAS,cAAA;AAAA,EACpB,GAAG,CAAA,CAAE;AAEL,MAAI,eAAgB,QAAO;AAC3B,SAAOP,2BAAAA,IAACS,MAAAA,qBAAqB,UAArB,EAA8B,YAAY,kBAAA,CAAmB;AACvE;;;;"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
-
const
|
|
5
|
-
const react
|
|
4
|
+
const require$$0 = require("react");
|
|
5
|
+
const react = require("@tiptap/react");
|
|
6
6
|
const StarterKit = require("@tiptap/starter-kit");
|
|
7
7
|
const Link = require("@tiptap/extension-link");
|
|
8
8
|
const tiptapMarkdown = require("tiptap-markdown");
|
|
@@ -40,7 +40,7 @@ const markdownPreviewExtensions = [
|
|
|
40
40
|
})
|
|
41
41
|
];
|
|
42
42
|
function MarkdownPreview({ content }) {
|
|
43
|
-
const editor = react
|
|
43
|
+
const editor = react.useEditor({
|
|
44
44
|
immediatelyRender: true,
|
|
45
45
|
extensions: markdownPreviewExtensions,
|
|
46
46
|
content,
|
|
@@ -51,16 +51,16 @@ function MarkdownPreview({ content }) {
|
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
53
|
});
|
|
54
|
-
return /* @__PURE__ */ jsxRuntime.jsx(react
|
|
54
|
+
return /* @__PURE__ */ jsxRuntime.jsx(react.EditorContent, { editor });
|
|
55
55
|
}
|
|
56
56
|
const AppendDocumentToolUIImpl = ({
|
|
57
57
|
args,
|
|
58
58
|
result,
|
|
59
59
|
status
|
|
60
60
|
}) => {
|
|
61
|
-
const [expanded, setExpanded] =
|
|
61
|
+
const [expanded, setExpanded] = require$$0.useState(false);
|
|
62
62
|
const typedArgs = args;
|
|
63
|
-
const resultData =
|
|
63
|
+
const resultData = require$$0.useMemo(() => {
|
|
64
64
|
if (!result) return null;
|
|
65
65
|
if (typeof result === "string") return assetUtils.tryParseJson(result);
|
|
66
66
|
if (typeof result === "object") {
|
|
@@ -142,7 +142,7 @@ const AppendDocumentToolUIImpl = ({
|
|
|
142
142
|
] })
|
|
143
143
|
] });
|
|
144
144
|
};
|
|
145
|
-
const AppendDocumentToolUI =
|
|
145
|
+
const AppendDocumentToolUI = require$$0.memo(
|
|
146
146
|
AppendDocumentToolUIImpl
|
|
147
147
|
);
|
|
148
148
|
AppendDocumentToolUI.displayName = "AppendDocumentToolUI";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"append-document-tool-ui.cjs","sources":["../../src/tools/append-document-tool-ui.tsx"],"sourcesContent":["import { memo, useMemo, useState } from \"react\";\nimport type { ToolCallMessagePartComponent } from \"@assistant-ui/react\";\nimport { useEditor, EditorContent } from \"@tiptap/react\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport Link from \"@tiptap/extension-link\";\nimport { Markdown } from \"tiptap-markdown\";\nimport {\n CheckCircle2Icon,\n ChevronDownIcon,\n FileTextIcon,\n LoaderIcon,\n AlertCircleIcon,\n NotebookPenIcon,\n} from \"lucide-react\";\nimport { cn } from \"../lib/utils\";\nimport { getAssetInfo, tryParseJson } from \"./asset-utils\";\n\nconst markdownPreviewExtensions = [\n StarterKit.configure({\n // Tiptap 3 StarterKit also bundles these; the preview registers its own link.\n link: false,\n underline: false,\n listKeymap: false,\n trailingNode: false,\n codeBlock: {\n HTMLAttributes: {\n class: \"rounded bg-muted p-2 font-mono text-[11px]\",\n },\n },\n }),\n Link.configure({\n openOnClick: true,\n HTMLAttributes: {\n class: \"text-blue-600 underline decoration-blue-300 hover:text-blue-700\",\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n },\n }),\n Markdown.configure({\n html: false,\n tightLists: true,\n linkify: true,\n breaks: true,\n transformPastedText: false,\n transformCopiedText: false,\n }),\n];\n\nfunction MarkdownPreview({ content }: { content: string }) {\n const editor = useEditor({\n immediatelyRender: true,\n extensions: markdownPreviewExtensions,\n content,\n editable: false,\n editorProps: {\n attributes: {\n class: \"prose prose-sm max-w-none focus:outline-none\",\n },\n },\n });\n\n return <EditorContent editor={editor} />;\n}\n\nconst AppendDocumentToolUIImpl: ToolCallMessagePartComponent = ({\n args,\n result,\n status,\n}) => {\n const [expanded, setExpanded] = useState(false);\n\n const typedArgs = args as Record<string, unknown> | undefined;\n const resultData = useMemo(() => {\n if (!result) return null;\n if (typeof result === \"string\") return tryParseJson(result);\n if (typeof result === \"object\") {\n const obj = result as Record<string, unknown>;\n if (typeof obj.result === \"string\") return tryParseJson(obj.result) ?? obj;\n return obj;\n }\n return null;\n }, [result]);\n\n const assetId = (typedArgs?.asset_id as string) ?? \"\";\n const markdownText = ((typedArgs?.markdown_text ?? typedArgs?.markdownText) as string) ?? \"\";\n const asset = getAssetInfo(assetId);\n\n const isRunning = status?.type === \"running\";\n const isComplete = status?.type === \"complete\";\n const isError = status?.type === \"incomplete\";\n\n const wordCount = resultData?.word_count as number | undefined;\n const lineCount = resultData?.non_empty_line_count as number | undefined;\n const msg = resultData?.msg as string | undefined;\n const isSuccess = isComplete && (msg?.toLowerCase().includes(\"success\") ?? true);\n\n return (\n <div className=\"my-1.5 w-full overflow-hidden rounded-xl border bg-background shadow-sm\">\n {/* Header */}\n <div className=\"flex items-center gap-3 px-4 py-3\">\n <div\n className={cn(\n \"flex size-9 shrink-0 items-center justify-center rounded-lg\",\n isRunning && \"bg-blue-50 text-blue-600\",\n isComplete && isSuccess && \"bg-emerald-50 text-emerald-600\",\n isComplete && !isSuccess && \"bg-amber-50 text-amber-600\",\n isError && \"bg-red-50 text-red-500\",\n !isRunning && !isComplete && !isError && \"bg-muted text-muted-foreground\",\n )}\n >\n {isRunning ? (\n <LoaderIcon className=\"size-4 animate-spin\" />\n ) : isError ? (\n <AlertCircleIcon className=\"size-4\" />\n ) : (\n <NotebookPenIcon className=\"size-4\" />\n )}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-[13px] font-semibold\">\n {isRunning ? \"Writing to document...\" : \"Appended content to document\"}\n </span>\n {isComplete && isSuccess && (\n <CheckCircle2Icon className=\"size-3.5 text-emerald-500\" />\n )}\n </div>\n <div className=\"flex items-center gap-1.5\">\n <FileTextIcon className=\"size-4\" />\n <span className=\"text-[12px] text-muted-foreground\">{asset.name}</span>\n </div>\n </div>\n\n {/* Stats badges */}\n {isComplete && (wordCount || lineCount) && (\n <div className=\"flex items-center gap-2\">\n {lineCount ? (\n <span className=\"rounded-full bg-muted px-2 py-0.5 text-[10px] font-medium text-muted-foreground\">\n {lineCount} lines\n </span>\n ) : null}\n {wordCount ? (\n <span className=\"rounded-full bg-muted px-2 py-0.5 text-[10px] font-medium text-muted-foreground\">\n {wordCount.toLocaleString()} words\n </span>\n ) : null}\n </div>\n )}\n </div>\n\n {/* Content preview */}\n {markdownText && (\n <div className=\"border-t\">\n <button\n type=\"button\"\n onClick={() => setExpanded(!expanded)}\n className=\"flex w-full items-center gap-2 px-4 py-2 text-left text-[11px] font-medium text-muted-foreground transition-colors hover:bg-muted/50\"\n >\n <ChevronDownIcon\n className={cn(\n \"size-3.5 shrink-0 transition-transform duration-200\",\n !expanded && \"-rotate-90\",\n )}\n />\n <span>{expanded ? \"Hide content\" : \"Show content preview\"}</span>\n </button>\n\n {expanded && (\n <div className=\"max-h-72 overflow-y-auto border-t bg-muted/30 px-4 py-3\">\n <MarkdownPreview content={markdownText} />\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n\nexport const AppendDocumentToolUI = memo(\n AppendDocumentToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\n\nAppendDocumentToolUI.displayName = \"AppendDocumentToolUI\";\n"],"names":["Markdown","useEditor","jsx","EditorContent","useState","useMemo","tryParseJson","getAssetInfo","jsxs","cn","LoaderIcon","AlertCircleIcon","NotebookPenIcon","CheckCircle2Icon","FileTextIcon","ChevronDownIcon","memo"],"mappings":";;;;;;;;;;;AAiBA,MAAM,4BAA4B;AAAA,EAChC,WAAW,UAAU;AAAA;AAAA,IAEnB,MAAM;AAAA,IACN,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,WAAW;AAAA,MACT,gBAAgB;AAAA,QACd,OAAO;AAAA,MAAA;AAAA,IACT;AAAA,EACF,CACD;AAAA,EACD,KAAK,UAAU;AAAA,IACb,aAAa;AAAA,IACb,gBAAgB;AAAA,MACd,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,KAAK;AAAA,IAAA;AAAA,EACP,CACD;AAAA,EACDA,eAAAA,SAAS,UAAU;AAAA,IACjB,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,EAAA,CACtB;AACH;AAEA,SAAS,gBAAgB,EAAE,WAAgC;AACzD,QAAM,SAASC,
|
|
1
|
+
{"version":3,"file":"append-document-tool-ui.cjs","sources":["../../src/tools/append-document-tool-ui.tsx"],"sourcesContent":["import { memo, useMemo, useState } from \"react\";\nimport type { ToolCallMessagePartComponent } from \"@assistant-ui/react\";\nimport { useEditor, EditorContent } from \"@tiptap/react\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport Link from \"@tiptap/extension-link\";\nimport { Markdown } from \"tiptap-markdown\";\nimport {\n CheckCircle2Icon,\n ChevronDownIcon,\n FileTextIcon,\n LoaderIcon,\n AlertCircleIcon,\n NotebookPenIcon,\n} from \"lucide-react\";\nimport { cn } from \"../lib/utils\";\nimport { getAssetInfo, tryParseJson } from \"./asset-utils\";\n\nconst markdownPreviewExtensions = [\n StarterKit.configure({\n // Tiptap 3 StarterKit also bundles these; the preview registers its own link.\n link: false,\n underline: false,\n listKeymap: false,\n trailingNode: false,\n codeBlock: {\n HTMLAttributes: {\n class: \"rounded bg-muted p-2 font-mono text-[11px]\",\n },\n },\n }),\n Link.configure({\n openOnClick: true,\n HTMLAttributes: {\n class: \"text-blue-600 underline decoration-blue-300 hover:text-blue-700\",\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n },\n }),\n Markdown.configure({\n html: false,\n tightLists: true,\n linkify: true,\n breaks: true,\n transformPastedText: false,\n transformCopiedText: false,\n }),\n];\n\nfunction MarkdownPreview({ content }: { content: string }) {\n const editor = useEditor({\n immediatelyRender: true,\n extensions: markdownPreviewExtensions,\n content,\n editable: false,\n editorProps: {\n attributes: {\n class: \"prose prose-sm max-w-none focus:outline-none\",\n },\n },\n });\n\n return <EditorContent editor={editor} />;\n}\n\nconst AppendDocumentToolUIImpl: ToolCallMessagePartComponent = ({\n args,\n result,\n status,\n}) => {\n const [expanded, setExpanded] = useState(false);\n\n const typedArgs = args as Record<string, unknown> | undefined;\n const resultData = useMemo(() => {\n if (!result) return null;\n if (typeof result === \"string\") return tryParseJson(result);\n if (typeof result === \"object\") {\n const obj = result as Record<string, unknown>;\n if (typeof obj.result === \"string\") return tryParseJson(obj.result) ?? obj;\n return obj;\n }\n return null;\n }, [result]);\n\n const assetId = (typedArgs?.asset_id as string) ?? \"\";\n const markdownText = ((typedArgs?.markdown_text ?? typedArgs?.markdownText) as string) ?? \"\";\n const asset = getAssetInfo(assetId);\n\n const isRunning = status?.type === \"running\";\n const isComplete = status?.type === \"complete\";\n const isError = status?.type === \"incomplete\";\n\n const wordCount = resultData?.word_count as number | undefined;\n const lineCount = resultData?.non_empty_line_count as number | undefined;\n const msg = resultData?.msg as string | undefined;\n const isSuccess = isComplete && (msg?.toLowerCase().includes(\"success\") ?? true);\n\n return (\n <div className=\"my-1.5 w-full overflow-hidden rounded-xl border bg-background shadow-sm\">\n {/* Header */}\n <div className=\"flex items-center gap-3 px-4 py-3\">\n <div\n className={cn(\n \"flex size-9 shrink-0 items-center justify-center rounded-lg\",\n isRunning && \"bg-blue-50 text-blue-600\",\n isComplete && isSuccess && \"bg-emerald-50 text-emerald-600\",\n isComplete && !isSuccess && \"bg-amber-50 text-amber-600\",\n isError && \"bg-red-50 text-red-500\",\n !isRunning && !isComplete && !isError && \"bg-muted text-muted-foreground\",\n )}\n >\n {isRunning ? (\n <LoaderIcon className=\"size-4 animate-spin\" />\n ) : isError ? (\n <AlertCircleIcon className=\"size-4\" />\n ) : (\n <NotebookPenIcon className=\"size-4\" />\n )}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-[13px] font-semibold\">\n {isRunning ? \"Writing to document...\" : \"Appended content to document\"}\n </span>\n {isComplete && isSuccess && (\n <CheckCircle2Icon className=\"size-3.5 text-emerald-500\" />\n )}\n </div>\n <div className=\"flex items-center gap-1.5\">\n <FileTextIcon className=\"size-4\" />\n <span className=\"text-[12px] text-muted-foreground\">{asset.name}</span>\n </div>\n </div>\n\n {/* Stats badges */}\n {isComplete && (wordCount || lineCount) && (\n <div className=\"flex items-center gap-2\">\n {lineCount ? (\n <span className=\"rounded-full bg-muted px-2 py-0.5 text-[10px] font-medium text-muted-foreground\">\n {lineCount} lines\n </span>\n ) : null}\n {wordCount ? (\n <span className=\"rounded-full bg-muted px-2 py-0.5 text-[10px] font-medium text-muted-foreground\">\n {wordCount.toLocaleString()} words\n </span>\n ) : null}\n </div>\n )}\n </div>\n\n {/* Content preview */}\n {markdownText && (\n <div className=\"border-t\">\n <button\n type=\"button\"\n onClick={() => setExpanded(!expanded)}\n className=\"flex w-full items-center gap-2 px-4 py-2 text-left text-[11px] font-medium text-muted-foreground transition-colors hover:bg-muted/50\"\n >\n <ChevronDownIcon\n className={cn(\n \"size-3.5 shrink-0 transition-transform duration-200\",\n !expanded && \"-rotate-90\",\n )}\n />\n <span>{expanded ? \"Hide content\" : \"Show content preview\"}</span>\n </button>\n\n {expanded && (\n <div className=\"max-h-72 overflow-y-auto border-t bg-muted/30 px-4 py-3\">\n <MarkdownPreview content={markdownText} />\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n\nexport const AppendDocumentToolUI = memo(\n AppendDocumentToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\n\nAppendDocumentToolUI.displayName = \"AppendDocumentToolUI\";\n"],"names":["Markdown","useEditor","jsx","EditorContent","useState","useMemo","tryParseJson","getAssetInfo","jsxs","cn","LoaderIcon","AlertCircleIcon","NotebookPenIcon","CheckCircle2Icon","FileTextIcon","ChevronDownIcon","memo"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const jsxRuntime = require("react/jsx-runtime");
|
|
4
4
|
const lucideReact = require("lucide-react");
|
|
5
|
-
const
|
|
5
|
+
const require$$0 = require("react");
|
|
6
6
|
const primitives = require("./primitives.cjs");
|
|
7
7
|
const toolSummary = require("./tool-summary.cjs");
|
|
8
8
|
function rawDetails(result) {
|
|
@@ -50,7 +50,7 @@ function makeQuietFileToolUI(spec) {
|
|
|
50
50
|
}
|
|
51
51
|
);
|
|
52
52
|
};
|
|
53
|
-
const Quiet =
|
|
53
|
+
const Quiet = require$$0.memo(Impl);
|
|
54
54
|
Quiet.displayName = `QuietFileToolUI(${spec.detailsLabel})`;
|
|
55
55
|
return Quiet;
|
|
56
56
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-tool-uis.cjs","sources":["../../src/tools/file-tool-uis.tsx"],"sourcesContent":["/**\n * Quiet tool cards for the deep-agent workspace-file tools.\n *\n * `read_file` / `ls` / `write_file` / `edit_file` / `glob` / `grep` are the\n * agent's own scratch-space plumbing. Without registry entries they fall\n * through to the generic fallback, which renders the raw args/result JSON —\n * scratch paths like `/large_tool_results/toolu_…` and screenfuls of encoded\n * text that read as garble to a non-technical user. Each becomes a one-line\n * card titled by the shared summary registry (\"Read config.ts\", \"Edited\n * upstream.py\" with \"+4 −1\", scratch paths in plain English); the raw output\n * stays available behind a collapsed \"Show details\" section. Hosts can still\n * override any of them via the `toolUIs` prop, which wins over the registry.\n */\nimport {\n FileTextIcon,\n FolderOpenIcon,\n PenLineIcon,\n ScanSearchIcon,\n SearchIcon,\n} from \"lucide-react\";\nimport { memo } from \"react\";\nimport type { ToolCallMessagePartComponent } from \"@assistant-ui/react\";\nimport { ExpandableSection, normalizeResult, ToolCard, truncate } from \"./primitives\";\nimport { summarizeToolCall, type ToolSummaryState } from \"./tool-summary\";\n\nexport { friendlyWorkspacePath } from \"./tool-summary\";\n\nfunction rawDetails(result: unknown): string | null {\n if (result === null || result === undefined) return null;\n // File tools usually return plain text (file content, listings) — show it\n // as-is; only genuinely structured results get pretty-printed.\n if (typeof result === \"string\") {\n return result.trim() !== \"\" ? result : null;\n }\n if (typeof result === \"object\") {\n const inner = (result as Record<string, unknown>).result;\n if (typeof inner === \"string\") {\n return inner.trim() !== \"\" ? inner : null;\n }\n }\n const data = normalizeResult(result);\n if (data === null) return null;\n const text = JSON.stringify(data, null, 2);\n return text.trim() !== \"\" ? text : null;\n}\n\ninterface QuietFileToolSpec {\n icon: React.ElementType;\n detailsLabel: string;\n}\n\nfunction quietCardState(status: { type: string; reason?: string } | undefined): ToolSummaryState {\n if (status?.type === \"running\") return \"running\";\n if (status?.type === \"requires-action\") return \"waiting\";\n if (status?.type === \"incomplete\") return status.reason === \"cancelled\" ? \"cancelled\" : \"error\";\n return \"complete\";\n}\n\nfunction makeQuietFileToolUI(spec: QuietFileToolSpec): ToolCallMessagePartComponent {\n const Impl: ToolCallMessagePartComponent = ({ toolName, args, result, status }) => {\n const isFailed = status?.type === \"incomplete\";\n const errorMsg = isFailed ? String(status.error ?? \"\") : null;\n const details = status?.type === \"complete\" ? rawDetails(result) : null;\n const summary = summarizeToolCall({\n toolName,\n args: args as Record<string, unknown> | undefined,\n result: status?.type === \"complete\" ? result : undefined,\n status: quietCardState(status),\n });\n\n return (\n <ToolCard\n icon={spec.icon}\n status={status?.type ?? \"complete\"}\n title={summary.label}\n subtitle={summary.meta ? truncate(summary.meta, 70) : undefined}\n error={errorMsg || undefined}\n >\n {details && (\n <ExpandableSection label={spec.detailsLabel}>\n <pre className=\"max-h-64 overflow-auto whitespace-pre-wrap break-all text-[11px] leading-snug text-muted-foreground\">\n {truncate(details, 6000)}\n </pre>\n </ExpandableSection>\n )}\n </ToolCard>\n );\n };\n const Quiet = memo(Impl) as unknown as ToolCallMessagePartComponent;\n Quiet.displayName = `QuietFileToolUI(${spec.detailsLabel})`;\n return Quiet;\n}\n\nexport const ReadFileToolUI = makeQuietFileToolUI({\n icon: ScanSearchIcon,\n detailsLabel: \"Show details\",\n});\n\nexport const ListFilesToolUI = makeQuietFileToolUI({\n icon: FolderOpenIcon,\n detailsLabel: \"Show files\",\n});\n\nexport const WriteFileToolUI = makeQuietFileToolUI({\n icon: FileTextIcon,\n detailsLabel: \"Show details\",\n});\n\nexport const EditFileToolUI = makeQuietFileToolUI({\n icon: PenLineIcon,\n detailsLabel: \"Show details\",\n});\n\nexport const SearchFilesToolUI = makeQuietFileToolUI({\n icon: SearchIcon,\n detailsLabel: \"Show matches\",\n});\n"],"names":["normalizeResult","summarizeToolCall","jsx","ToolCard","truncate","ExpandableSection","memo","ScanSearchIcon","FolderOpenIcon","FileTextIcon","PenLineIcon","SearchIcon"],"mappings":";;;;;;;AA2BA,SAAS,WAAW,QAAgC;AAClD,MAAI,WAAW,QAAQ,WAAW,OAAW,QAAO;AAGpD,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO,OAAO,KAAA,MAAW,KAAK,SAAS;AAAA,EACzC;AACA,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,QAAS,OAAmC;AAClD,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,MAAM,KAAA,MAAW,KAAK,QAAQ;AAAA,IACvC;AAAA,EACF;AACA,QAAM,OAAOA,WAAAA,gBAAgB,MAAM;AACnC,MAAI,SAAS,KAAM,QAAO;AAC1B,QAAM,OAAO,KAAK,UAAU,MAAM,MAAM,CAAC;AACzC,SAAO,KAAK,KAAA,MAAW,KAAK,OAAO;AACrC;AAOA,SAAS,eAAe,QAAyE;AAC/F,OAAI,iCAAQ,UAAS,UAAW,QAAO;AACvC,OAAI,iCAAQ,UAAS,kBAAmB,QAAO;AAC/C,OAAI,iCAAQ,UAAS,qBAAqB,OAAO,WAAW,cAAc,cAAc;AACxF,SAAO;AACT;AAEA,SAAS,oBAAoB,MAAuD;AAClF,QAAM,OAAqC,CAAC,EAAE,UAAU,MAAM,QAAQ,aAAa;AACjF,UAAM,YAAW,iCAAQ,UAAS;AAClC,UAAM,WAAW,WAAW,OAAO,OAAO,SAAS,EAAE,IAAI;AACzD,UAAM,WAAU,iCAAQ,UAAS,aAAa,WAAW,MAAM,IAAI;AACnE,UAAM,UAAUC,YAAAA,kBAAkB;AAAA,MAChC;AAAA,MACA;AAAA,MACA,SAAQ,iCAAQ,UAAS,aAAa,SAAS;AAAA,MAC/C,QAAQ,eAAe,MAAM;AAAA,IAAA,CAC9B;AAED,WACEC,2BAAAA;AAAAA,MAACC,WAAAA;AAAAA,MAAA;AAAA,QACC,MAAM,KAAK;AAAA,QACX,SAAQ,iCAAQ,SAAQ;AAAA,QACxB,OAAO,QAAQ;AAAA,QACf,UAAU,QAAQ,OAAOC,WAAAA,SAAS,QAAQ,MAAM,EAAE,IAAI;AAAA,QACtD,OAAO,YAAY;AAAA,QAElB,UAAA,WACCF,2BAAAA,IAACG,WAAAA,mBAAA,EAAkB,OAAO,KAAK,cAC7B,UAAAH,2BAAAA,IAAC,OAAA,EAAI,WAAU,uGACZ,UAAAE,WAAAA,SAAS,SAAS,GAAI,GACzB,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAIR;AACA,QAAM,QAAQE,
|
|
1
|
+
{"version":3,"file":"file-tool-uis.cjs","sources":["../../src/tools/file-tool-uis.tsx"],"sourcesContent":["/**\n * Quiet tool cards for the deep-agent workspace-file tools.\n *\n * `read_file` / `ls` / `write_file` / `edit_file` / `glob` / `grep` are the\n * agent's own scratch-space plumbing. Without registry entries they fall\n * through to the generic fallback, which renders the raw args/result JSON —\n * scratch paths like `/large_tool_results/toolu_…` and screenfuls of encoded\n * text that read as garble to a non-technical user. Each becomes a one-line\n * card titled by the shared summary registry (\"Read config.ts\", \"Edited\n * upstream.py\" with \"+4 −1\", scratch paths in plain English); the raw output\n * stays available behind a collapsed \"Show details\" section. Hosts can still\n * override any of them via the `toolUIs` prop, which wins over the registry.\n */\nimport {\n FileTextIcon,\n FolderOpenIcon,\n PenLineIcon,\n ScanSearchIcon,\n SearchIcon,\n} from \"lucide-react\";\nimport { memo } from \"react\";\nimport type { ToolCallMessagePartComponent } from \"@assistant-ui/react\";\nimport { ExpandableSection, normalizeResult, ToolCard, truncate } from \"./primitives\";\nimport { summarizeToolCall, type ToolSummaryState } from \"./tool-summary\";\n\nexport { friendlyWorkspacePath } from \"./tool-summary\";\n\nfunction rawDetails(result: unknown): string | null {\n if (result === null || result === undefined) return null;\n // File tools usually return plain text (file content, listings) — show it\n // as-is; only genuinely structured results get pretty-printed.\n if (typeof result === \"string\") {\n return result.trim() !== \"\" ? result : null;\n }\n if (typeof result === \"object\") {\n const inner = (result as Record<string, unknown>).result;\n if (typeof inner === \"string\") {\n return inner.trim() !== \"\" ? inner : null;\n }\n }\n const data = normalizeResult(result);\n if (data === null) return null;\n const text = JSON.stringify(data, null, 2);\n return text.trim() !== \"\" ? text : null;\n}\n\ninterface QuietFileToolSpec {\n icon: React.ElementType;\n detailsLabel: string;\n}\n\nfunction quietCardState(status: { type: string; reason?: string } | undefined): ToolSummaryState {\n if (status?.type === \"running\") return \"running\";\n if (status?.type === \"requires-action\") return \"waiting\";\n if (status?.type === \"incomplete\") return status.reason === \"cancelled\" ? \"cancelled\" : \"error\";\n return \"complete\";\n}\n\nfunction makeQuietFileToolUI(spec: QuietFileToolSpec): ToolCallMessagePartComponent {\n const Impl: ToolCallMessagePartComponent = ({ toolName, args, result, status }) => {\n const isFailed = status?.type === \"incomplete\";\n const errorMsg = isFailed ? String(status.error ?? \"\") : null;\n const details = status?.type === \"complete\" ? rawDetails(result) : null;\n const summary = summarizeToolCall({\n toolName,\n args: args as Record<string, unknown> | undefined,\n result: status?.type === \"complete\" ? result : undefined,\n status: quietCardState(status),\n });\n\n return (\n <ToolCard\n icon={spec.icon}\n status={status?.type ?? \"complete\"}\n title={summary.label}\n subtitle={summary.meta ? truncate(summary.meta, 70) : undefined}\n error={errorMsg || undefined}\n >\n {details && (\n <ExpandableSection label={spec.detailsLabel}>\n <pre className=\"max-h-64 overflow-auto whitespace-pre-wrap break-all text-[11px] leading-snug text-muted-foreground\">\n {truncate(details, 6000)}\n </pre>\n </ExpandableSection>\n )}\n </ToolCard>\n );\n };\n const Quiet = memo(Impl) as unknown as ToolCallMessagePartComponent;\n Quiet.displayName = `QuietFileToolUI(${spec.detailsLabel})`;\n return Quiet;\n}\n\nexport const ReadFileToolUI = makeQuietFileToolUI({\n icon: ScanSearchIcon,\n detailsLabel: \"Show details\",\n});\n\nexport const ListFilesToolUI = makeQuietFileToolUI({\n icon: FolderOpenIcon,\n detailsLabel: \"Show files\",\n});\n\nexport const WriteFileToolUI = makeQuietFileToolUI({\n icon: FileTextIcon,\n detailsLabel: \"Show details\",\n});\n\nexport const EditFileToolUI = makeQuietFileToolUI({\n icon: PenLineIcon,\n detailsLabel: \"Show details\",\n});\n\nexport const SearchFilesToolUI = makeQuietFileToolUI({\n icon: SearchIcon,\n detailsLabel: \"Show matches\",\n});\n"],"names":["normalizeResult","summarizeToolCall","jsx","ToolCard","truncate","ExpandableSection","memo","ScanSearchIcon","FolderOpenIcon","FileTextIcon","PenLineIcon","SearchIcon"],"mappings":";;;;;;;AA2BA,SAAS,WAAW,QAAgC;AAClD,MAAI,WAAW,QAAQ,WAAW,OAAW,QAAO;AAGpD,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO,OAAO,KAAA,MAAW,KAAK,SAAS;AAAA,EACzC;AACA,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,QAAS,OAAmC;AAClD,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,MAAM,KAAA,MAAW,KAAK,QAAQ;AAAA,IACvC;AAAA,EACF;AACA,QAAM,OAAOA,WAAAA,gBAAgB,MAAM;AACnC,MAAI,SAAS,KAAM,QAAO;AAC1B,QAAM,OAAO,KAAK,UAAU,MAAM,MAAM,CAAC;AACzC,SAAO,KAAK,KAAA,MAAW,KAAK,OAAO;AACrC;AAOA,SAAS,eAAe,QAAyE;AAC/F,OAAI,iCAAQ,UAAS,UAAW,QAAO;AACvC,OAAI,iCAAQ,UAAS,kBAAmB,QAAO;AAC/C,OAAI,iCAAQ,UAAS,qBAAqB,OAAO,WAAW,cAAc,cAAc;AACxF,SAAO;AACT;AAEA,SAAS,oBAAoB,MAAuD;AAClF,QAAM,OAAqC,CAAC,EAAE,UAAU,MAAM,QAAQ,aAAa;AACjF,UAAM,YAAW,iCAAQ,UAAS;AAClC,UAAM,WAAW,WAAW,OAAO,OAAO,SAAS,EAAE,IAAI;AACzD,UAAM,WAAU,iCAAQ,UAAS,aAAa,WAAW,MAAM,IAAI;AACnE,UAAM,UAAUC,YAAAA,kBAAkB;AAAA,MAChC;AAAA,MACA;AAAA,MACA,SAAQ,iCAAQ,UAAS,aAAa,SAAS;AAAA,MAC/C,QAAQ,eAAe,MAAM;AAAA,IAAA,CAC9B;AAED,WACEC,2BAAAA;AAAAA,MAACC,WAAAA;AAAAA,MAAA;AAAA,QACC,MAAM,KAAK;AAAA,QACX,SAAQ,iCAAQ,SAAQ;AAAA,QACxB,OAAO,QAAQ;AAAA,QACf,UAAU,QAAQ,OAAOC,WAAAA,SAAS,QAAQ,MAAM,EAAE,IAAI;AAAA,QACtD,OAAO,YAAY;AAAA,QAElB,UAAA,WACCF,2BAAAA,IAACG,WAAAA,mBAAA,EAAkB,OAAO,KAAK,cAC7B,UAAAH,2BAAAA,IAAC,OAAA,EAAI,WAAU,uGACZ,UAAAE,WAAAA,SAAS,SAAS,GAAI,GACzB,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAIR;AACA,QAAM,QAAQE,WAAAA,KAAK,IAAI;AACvB,QAAM,cAAc,mBAAmB,KAAK,YAAY;AACxD,SAAO;AACT;AAEO,MAAM,iBAAiB,oBAAoB;AAAA,EAChD,MAAMC,YAAAA;AAAAA,EACN,cAAc;AAChB,CAAC;AAEM,MAAM,kBAAkB,oBAAoB;AAAA,EACjD,MAAMC,YAAAA;AAAAA,EACN,cAAc;AAChB,CAAC;AAEM,MAAM,kBAAkB,oBAAoB;AAAA,EACjD,MAAMC,YAAAA;AAAAA,EACN,cAAc;AAChB,CAAC;AAEM,MAAM,iBAAiB,oBAAoB;AAAA,EAChD,MAAMC,YAAAA;AAAAA,EACN,cAAc;AAChB,CAAC;AAEM,MAAM,oBAAoB,oBAAoB;AAAA,EACnD,MAAMC,YAAAA;AAAAA,EACN,cAAc;AAChB,CAAC;;;;;;;"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const jsxRuntime = require("react/jsx-runtime");
|
|
4
4
|
const lucideReact = require("lucide-react");
|
|
5
|
-
const
|
|
5
|
+
const require$$0 = require("react");
|
|
6
6
|
const primitives = require("./primitives.cjs");
|
|
7
7
|
const toolFallback = require("./tool-fallback.cjs");
|
|
8
8
|
const toolResult = require("../agent-runtime/src/tool-result.cjs");
|
|
@@ -33,7 +33,7 @@ const InstallPackageToolUIImpl = (props) => {
|
|
|
33
33
|
}
|
|
34
34
|
);
|
|
35
35
|
};
|
|
36
|
-
const InstallPackageToolUI =
|
|
36
|
+
const InstallPackageToolUI = require$$0.memo(
|
|
37
37
|
InstallPackageToolUIImpl
|
|
38
38
|
);
|
|
39
39
|
InstallPackageToolUI.displayName = "InstallPackageToolUI";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"misc-tool-uis.cjs","sources":["../../src/tools/misc-tool-uis.tsx"],"sourcesContent":["/**\n * Small dedicated cards for tools whose generic fallback rendering read\n * poorly: currently the pip installer (Olympus registers it; the SDK's own\n * registry includes it).\n */\nimport { PackageIcon } from \"lucide-react\";\nimport { memo } from \"react\";\nimport type { ToolCallMessagePartComponent } from \"@assistant-ui/react\";\nimport {\n classifyToolResult,\n describePackage,\n isToolResultSuccess,\n} from \"@athenaintel/agent-runtime\";\nimport { ExpandableSection, normalizeResult, ToolCard } from \"./primitives\";\nimport { ToolFallback } from \"./tool-fallback\";\n\nconst InstallPackageToolUIImpl: ToolCallMessagePartComponent = (props) => {\n const { toolName, args, result, status } = props;\n // An install the user refused at the approval gate is neither installed\n // nor failed: the generic card owns the rejected treatment.\n if (classifyToolResult({ status, result }).state === \"rejected\") {\n return <ToolFallback {...props} icon={PackageIcon} />;\n }\n const typedArgs = (args ?? {}) as Record<string, unknown>;\n const packageName = describePackage(typedArgs);\n const isRunning = status?.type === \"running\";\n const isFailed =\n status?.type === \"incomplete\" || (status?.type === \"complete\" && !isToolResultSuccess(result));\n const data = normalizeResult(result);\n const detail =\n typeof result === \"string\" ? result : data ? JSON.stringify(data, null, 2) : null;\n\n return (\n <ToolCard\n icon={PackageIcon}\n status={isFailed && status?.type === \"complete\" ? \"incomplete\" : (status?.type ?? \"complete\")}\n title={\n isRunning\n ? \"Installing package...\"\n : isFailed\n ? \"Couldn't install package\"\n : \"Installed package\"\n }\n subtitle={packageName}\n toolName={toolName}\n error={status?.type === \"incomplete\" ? String(status.error ?? \"\") || undefined : undefined}\n args={typedArgs}\n result={result}\n >\n {!isRunning && detail ? (\n <ExpandableSection label=\"Show output\">\n <pre className=\"max-h-64 overflow-auto whitespace-pre-wrap break-all text-[11px] leading-snug text-muted-foreground\">\n {detail}\n </pre>\n </ExpandableSection>\n ) : null}\n </ToolCard>\n );\n};\n\nexport const InstallPackageToolUI = memo(\n InstallPackageToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nInstallPackageToolUI.displayName = \"InstallPackageToolUI\";\n"],"names":["classifyToolResult","jsx","ToolFallback","PackageIcon","describePackage","isToolResultSuccess","normalizeResult","ToolCard","ExpandableSection","memo"],"mappings":";;;;;;;;;AAgBA,MAAM,2BAAyD,CAAC,UAAU;AACxE,QAAM,EAAE,UAAU,MAAM,QAAQ,WAAW;AAG3C,MAAIA,WAAAA,mBAAmB,EAAE,QAAQ,QAAQ,EAAE,UAAU,YAAY;AAC/D,WAAOC,2BAAAA,IAACC,aAAAA,cAAA,EAAc,GAAG,OAAO,MAAMC,YAAAA,aAAa;AAAA,EACrD;AACA,QAAM,YAAa,QAAQ,CAAA;AAC3B,QAAM,cAAcC,aAAAA,gBAAgB,SAAS;AAC7C,QAAM,aAAY,iCAAQ,UAAS;AACnC,QAAM,YACJ,iCAAQ,UAAS,iBAAiB,iCAAQ,UAAS,cAAc,CAACC,WAAAA,oBAAoB,MAAM;AAC9F,QAAM,OAAOC,WAAAA,gBAAgB,MAAM;AACnC,QAAM,SACJ,OAAO,WAAW,WAAW,SAAS,OAAO,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI;AAE/E,SACEL,2BAAAA;AAAAA,IAACM,WAAAA;AAAAA,IAAA;AAAA,MACC,MAAMJ,YAAAA;AAAAA,MACN,QAAQ,aAAY,iCAAQ,UAAS,aAAa,gBAAgB,iCAAQ,SAAQ;AAAA,MAClF,OACE,YACI,0BACA,WACE,6BACA;AAAA,MAER,UAAU;AAAA,MACV;AAAA,MACA,QAAO,iCAAQ,UAAS,eAAe,OAAO,OAAO,SAAS,EAAE,KAAK,SAAY;AAAA,MACjF,MAAM;AAAA,MACN;AAAA,MAEC,UAAA,CAAC,aAAa,SACbF,2BAAAA,IAACO,8BAAA,EAAkB,OAAM,eACvB,UAAAP,2BAAAA,IAAC,OAAA,EAAI,WAAU,uGACZ,UAAA,OAAA,CACH,GACF,IACE;AAAA,IAAA;AAAA,EAAA;AAGV;AAEO,MAAM,uBAAuBQ,
|
|
1
|
+
{"version":3,"file":"misc-tool-uis.cjs","sources":["../../src/tools/misc-tool-uis.tsx"],"sourcesContent":["/**\n * Small dedicated cards for tools whose generic fallback rendering read\n * poorly: currently the pip installer (Olympus registers it; the SDK's own\n * registry includes it).\n */\nimport { PackageIcon } from \"lucide-react\";\nimport { memo } from \"react\";\nimport type { ToolCallMessagePartComponent } from \"@assistant-ui/react\";\nimport {\n classifyToolResult,\n describePackage,\n isToolResultSuccess,\n} from \"@athenaintel/agent-runtime\";\nimport { ExpandableSection, normalizeResult, ToolCard } from \"./primitives\";\nimport { ToolFallback } from \"./tool-fallback\";\n\nconst InstallPackageToolUIImpl: ToolCallMessagePartComponent = (props) => {\n const { toolName, args, result, status } = props;\n // An install the user refused at the approval gate is neither installed\n // nor failed: the generic card owns the rejected treatment.\n if (classifyToolResult({ status, result }).state === \"rejected\") {\n return <ToolFallback {...props} icon={PackageIcon} />;\n }\n const typedArgs = (args ?? {}) as Record<string, unknown>;\n const packageName = describePackage(typedArgs);\n const isRunning = status?.type === \"running\";\n const isFailed =\n status?.type === \"incomplete\" || (status?.type === \"complete\" && !isToolResultSuccess(result));\n const data = normalizeResult(result);\n const detail =\n typeof result === \"string\" ? result : data ? JSON.stringify(data, null, 2) : null;\n\n return (\n <ToolCard\n icon={PackageIcon}\n status={isFailed && status?.type === \"complete\" ? \"incomplete\" : (status?.type ?? \"complete\")}\n title={\n isRunning\n ? \"Installing package...\"\n : isFailed\n ? \"Couldn't install package\"\n : \"Installed package\"\n }\n subtitle={packageName}\n toolName={toolName}\n error={status?.type === \"incomplete\" ? String(status.error ?? \"\") || undefined : undefined}\n args={typedArgs}\n result={result}\n >\n {!isRunning && detail ? (\n <ExpandableSection label=\"Show output\">\n <pre className=\"max-h-64 overflow-auto whitespace-pre-wrap break-all text-[11px] leading-snug text-muted-foreground\">\n {detail}\n </pre>\n </ExpandableSection>\n ) : null}\n </ToolCard>\n );\n};\n\nexport const InstallPackageToolUI = memo(\n InstallPackageToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nInstallPackageToolUI.displayName = \"InstallPackageToolUI\";\n"],"names":["classifyToolResult","jsx","ToolFallback","PackageIcon","describePackage","isToolResultSuccess","normalizeResult","ToolCard","ExpandableSection","memo"],"mappings":";;;;;;;;;AAgBA,MAAM,2BAAyD,CAAC,UAAU;AACxE,QAAM,EAAE,UAAU,MAAM,QAAQ,WAAW;AAG3C,MAAIA,WAAAA,mBAAmB,EAAE,QAAQ,QAAQ,EAAE,UAAU,YAAY;AAC/D,WAAOC,2BAAAA,IAACC,aAAAA,cAAA,EAAc,GAAG,OAAO,MAAMC,YAAAA,aAAa;AAAA,EACrD;AACA,QAAM,YAAa,QAAQ,CAAA;AAC3B,QAAM,cAAcC,aAAAA,gBAAgB,SAAS;AAC7C,QAAM,aAAY,iCAAQ,UAAS;AACnC,QAAM,YACJ,iCAAQ,UAAS,iBAAiB,iCAAQ,UAAS,cAAc,CAACC,WAAAA,oBAAoB,MAAM;AAC9F,QAAM,OAAOC,WAAAA,gBAAgB,MAAM;AACnC,QAAM,SACJ,OAAO,WAAW,WAAW,SAAS,OAAO,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI;AAE/E,SACEL,2BAAAA;AAAAA,IAACM,WAAAA;AAAAA,IAAA;AAAA,MACC,MAAMJ,YAAAA;AAAAA,MACN,QAAQ,aAAY,iCAAQ,UAAS,aAAa,gBAAgB,iCAAQ,SAAQ;AAAA,MAClF,OACE,YACI,0BACA,WACE,6BACA;AAAA,MAER,UAAU;AAAA,MACV;AAAA,MACA,QAAO,iCAAQ,UAAS,eAAe,OAAO,OAAO,SAAS,EAAE,KAAK,SAAY;AAAA,MACjF,MAAM;AAAA,MACN;AAAA,MAEC,UAAA,CAAC,aAAa,SACbF,2BAAAA,IAACO,8BAAA,EAAkB,OAAM,eACvB,UAAAP,2BAAAA,IAAC,OAAA,EAAI,WAAU,uGACZ,UAAA,OAAA,CACH,GACF,IACE;AAAA,IAAA;AAAA,EAAA;AAGV;AAEO,MAAM,uBAAuBQ,WAAAA;AAAAA,EAClC;AACF;AACA,qBAAqB,cAAc;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
-
const
|
|
4
|
+
const require$$0 = require("react");
|
|
5
5
|
const lucideReact = require("lucide-react");
|
|
6
6
|
const toolAppearance = require("./tool-appearance.cjs");
|
|
7
7
|
const toolMetadata = require("../agent-runtime/src/tool-metadata.cjs");
|
|
@@ -29,7 +29,7 @@ function truncate(text, max) {
|
|
|
29
29
|
}
|
|
30
30
|
function ToolCard(props) {
|
|
31
31
|
var _a;
|
|
32
|
-
const ThreadToolCard = (_a =
|
|
32
|
+
const ThreadToolCard = (_a = require$$0.useContext(toolAppearance.ToolAppearanceContext)) == null ? void 0 : _a.ToolCard;
|
|
33
33
|
if (ThreadToolCard) return /* @__PURE__ */ jsxRuntime.jsx(ThreadToolCard, { ...props });
|
|
34
34
|
return /* @__PURE__ */ jsxRuntime.jsx(ToolCardBox, { ...props });
|
|
35
35
|
}
|
|
@@ -88,8 +88,8 @@ function CopyToolSpecButton({
|
|
|
88
88
|
result,
|
|
89
89
|
className
|
|
90
90
|
}) {
|
|
91
|
-
const [copied, setCopied] =
|
|
92
|
-
const handleCopy =
|
|
91
|
+
const [copied, setCopied] = require$$0.useState(false);
|
|
92
|
+
const handleCopy = require$$0.useCallback(() => {
|
|
93
93
|
const spec = { tool_name: toolName };
|
|
94
94
|
if (args) spec.arguments = args;
|
|
95
95
|
else if (argsText) spec.arguments = tryParseJson(argsText) ?? argsText;
|
|
@@ -132,8 +132,8 @@ function ExpandableSection({
|
|
|
132
132
|
defaultOpen = false
|
|
133
133
|
}) {
|
|
134
134
|
var _a;
|
|
135
|
-
const [expanded, setExpanded] =
|
|
136
|
-
const appearance = ((_a =
|
|
135
|
+
const [expanded, setExpanded] = require$$0.useState(defaultOpen);
|
|
136
|
+
const appearance = ((_a = require$$0.useContext(toolAppearance.ToolAppearanceContext)) == null ? void 0 : _a.appearance) ?? "card";
|
|
137
137
|
if (appearance === "thread") {
|
|
138
138
|
const heading = sectionHeading(label);
|
|
139
139
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-slot": "tool-section", className: "flex flex-col gap-1.5 px-3", children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"primitives.cjs","sources":["../../src/tools/primitives.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * The shared building blocks every SDK tool card is made of — the card shell\n * (`ToolCard`), the collapsible details section, and the result/text helpers.\n * Kept apart from the tool UI registry so a tool UI module can use them\n * without importing the registry that imports it back.\n */\nimport {\n useCallback,\n useContext,\n useState,\n type ElementType,\n type ReactNode,\n} from \"react\";\nimport { formatToolName } from \"@athenaintel/agent-runtime\";\nimport {\n AlertCircleIcon,\n CheckCircle2Icon,\n ChevronDownIcon,\n ClipboardCopyIcon,\n LoaderIcon,\n} from \"lucide-react\";\nimport { cn } from \"../lib/utils\";\nimport { ToolAppearanceContext } from \"./tool-appearance\";\n\nexport { formatToolName };\n\n/** Parse JSON text into a record, or `null` when it is not one. */\nexport function tryParseJson(text: string): Record<string, unknown> | null {\n try {\n const parsed: unknown = JSON.parse(text);\n return typeof parsed === \"object\" && parsed !== null\n ? (parsed as Record<string, unknown>)\n : null;\n } catch {\n return null;\n }\n}\n\n/** Parse a tool result (handles nested `.result`, string-encoded JSON) into a record. */\nexport function normalizeResult(result: unknown): Record<string, unknown> | null {\n if (!result) return null;\n if (typeof result === \"string\") return tryParseJson(result);\n if (typeof result === \"object\") {\n const obj = result as Record<string, unknown>;\n if (typeof obj.result === \"string\") return tryParseJson(obj.result) ?? obj;\n return obj;\n }\n return null;\n}\n\n/** Truncate a string with an ellipsis. */\nexport function truncate(text: string, max: number): string {\n return text.length > max ? `${text.slice(0, max)}...` : text;\n}\n\nexport type ToolStatus = \"running\" | \"complete\" | \"incomplete\" | \"requires-action\";\n\nexport interface ToolCardProps {\n icon: ElementType;\n status: ToolStatus;\n title: string;\n subtitle?: string;\n toolName?: string;\n badge?: string;\n error?: string | null;\n children?: ReactNode;\n args?: Record<string, unknown>;\n result?: unknown;\n}\n\n/**\n * The card shell every dedicated tool UI is built on. Under a thread\n * appearance provider it renders through the provider's row renderer (the\n * `ToolFallback` shell), so a dedicated UI and a generic fallback share one\n * anatomy there; with no provider it is the boxed card below, unchanged.\n */\nexport function ToolCard(props: ToolCardProps) {\n const ThreadToolCard = useContext(ToolAppearanceContext)?.ToolCard;\n if (ThreadToolCard) return <ThreadToolCard {...props} />;\n return <ToolCardBox {...props} />;\n}\n\nfunction ToolCardBox({\n icon: Icon,\n status,\n title,\n subtitle,\n toolName,\n badge,\n error,\n children,\n args,\n result,\n}: ToolCardProps) {\n const isRunning = status === \"running\";\n const isComplete = status === \"complete\";\n const isError = status === \"incomplete\";\n\n return (\n <div className=\"my-3 w-full overflow-hidden rounded-xl border border-border/60 bg-background shadow-sm\">\n <div className=\"flex items-center gap-3 px-4 py-3\">\n <div\n className={cn(\n \"flex size-8 shrink-0 items-center justify-center rounded-lg\",\n isRunning && \"bg-blue-50 text-blue-600\",\n isComplete && \"bg-emerald-50 text-emerald-600\",\n isError && \"bg-destructive/10 text-destructive\",\n )}\n >\n {isRunning ? (\n <LoaderIcon className=\"size-4 animate-spin\" />\n ) : isError ? (\n <AlertCircleIcon className=\"size-4\" />\n ) : (\n <Icon className=\"size-4\" />\n )}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-[13px] font-medium text-foreground\">\n {title}\n </span>\n {isComplete && !error && (\n <CheckCircle2Icon className=\"size-3.5 text-emerald-500\" />\n )}\n </div>\n {subtitle && (\n <p className=\"truncate text-[12px] text-muted-foreground\">\n {subtitle}\n </p>\n )}\n </div>\n {toolName && (\n <span className=\"shrink-0 rounded-md bg-muted/60 px-1.5 py-0.5 text-[10px] font-mono text-muted-foreground\">\n {formatToolName(toolName)}\n </span>\n )}\n {badge && (\n <span className=\"shrink-0 rounded-full bg-muted px-2 py-0.5 text-[10px] font-medium text-muted-foreground\">\n {badge}\n </span>\n )}\n {isRunning && (\n <div className=\"flex items-center gap-1.5\">\n <div className=\"h-1.5 w-10 animate-pulse rounded-full bg-blue-100\" />\n <div className=\"h-1.5 w-6 animate-pulse rounded-full bg-blue-100\" />\n </div>\n )}\n </div>\n\n {error && (\n <div className=\"border-t border-border/40 bg-destructive/10 px-4 py-2.5\">\n <p className=\"text-[12px] leading-relaxed text-destructive\">\n {error}\n </p>\n </div>\n )}\n\n {children}\n\n {/* Copy tool spec — subtle button at the bottom of every tool card */}\n {toolName && isComplete && (\n <CopyToolSpecButton toolName={toolName} args={args} result={result} />\n )}\n </div>\n );\n}\n\n/** Copies `{ tool_name, arguments, result }` as JSON — the tool spec a support ticket needs. */\nexport function CopyToolSpecButton({\n toolName,\n args,\n argsText,\n result,\n className,\n}: {\n toolName: string;\n args?: Record<string, unknown>;\n argsText?: string;\n result?: unknown;\n className?: string;\n}) {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = useCallback(() => {\n const spec: Record<string, unknown> = { tool_name: toolName };\n if (args) spec.arguments = args;\n else if (argsText) spec.arguments = tryParseJson(argsText) ?? argsText;\n if (result !== undefined) {\n if (typeof result === \"string\") {\n const parsed = tryParseJson(result);\n spec.result = parsed ?? result;\n } else {\n spec.result = result;\n }\n }\n navigator.clipboard.writeText(JSON.stringify(spec, null, 2)).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n }, [toolName, args, argsText, result]);\n\n return (\n <div className={cn(\"flex justify-end px-3 pb-1.5\", className)}>\n <button\n type=\"button\"\n onClick={handleCopy}\n className=\"flex items-center gap-1 rounded px-1.5 py-0.5 text-[10px] text-muted-foreground/40 transition-colors hover:bg-muted/50 hover:text-muted-foreground\"\n title=\"Copy tool name, arguments, and result as JSON\"\n >\n <ClipboardCopyIcon className=\"size-2.5\" />\n {copied ? \"Copied!\" : toolName}\n </button>\n </div>\n );\n}\n\n/** \"Show search results\" → \"Search results\": the static heading a section gets once the row's disclosure is the only toggle. */\nfunction sectionHeading(label: string | undefined): string | null {\n if (!label) return null;\n const heading = label.replace(/^show\\s+/i, \"\").trim();\n if (!heading) return null;\n return heading.charAt(0).toUpperCase() + heading.slice(1);\n}\n\nexport function ExpandableSection({\n label,\n children,\n defaultOpen = false,\n}: {\n label?: string;\n children: ReactNode;\n defaultOpen?: boolean;\n}) {\n const [expanded, setExpanded] = useState(defaultOpen);\n const appearance = useContext(ToolAppearanceContext)?.appearance ?? \"card\";\n\n // Inside the thread row the card's own disclosure is the one toggle; a\n // second nested \"Show details\" would make a reader click twice.\n if (appearance === \"thread\") {\n const heading = sectionHeading(label);\n return (\n <div data-slot=\"tool-section\" className=\"flex flex-col gap-1.5 px-3\">\n {heading ? (\n <p className=\"text-xs font-medium text-muted-foreground\">{heading}</p>\n ) : null}\n <div className=\"max-h-72 overflow-y-auto\">{children}</div>\n </div>\n );\n }\n\n return (\n <div className=\"border-t border-border/40\">\n <button\n type=\"button\"\n onClick={() => setExpanded(!expanded)}\n className=\"flex w-full items-center gap-2 px-4 py-2 text-left text-[11px] font-medium text-muted-foreground transition-colors hover:bg-muted/30\"\n >\n <ChevronDownIcon\n className={cn(\n \"size-3.5 shrink-0 transition-transform duration-200\",\n !expanded && \"-rotate-90\",\n )}\n />\n <span>{expanded ? \"Hide details\" : (label ?? \"Show details\")}</span>\n </button>\n {expanded && (\n <div className=\"max-h-72 overflow-y-auto border-t border-border/40 bg-muted/10 px-4 py-3\">\n {children}\n </div>\n )}\n </div>\n );\n}\n"],"names":["useContext","ToolAppearanceContext","jsx","jsxs","cn","LoaderIcon","AlertCircleIcon","CheckCircle2Icon","formatToolName","useState","useCallback","ClipboardCopyIcon","ChevronDownIcon"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"primitives.cjs","sources":["../../src/tools/primitives.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * The shared building blocks every SDK tool card is made of — the card shell\n * (`ToolCard`), the collapsible details section, and the result/text helpers.\n * Kept apart from the tool UI registry so a tool UI module can use them\n * without importing the registry that imports it back.\n */\nimport {\n useCallback,\n useContext,\n useState,\n type ElementType,\n type ReactNode,\n} from \"react\";\nimport { formatToolName } from \"@athenaintel/agent-runtime\";\nimport {\n AlertCircleIcon,\n CheckCircle2Icon,\n ChevronDownIcon,\n ClipboardCopyIcon,\n LoaderIcon,\n} from \"lucide-react\";\nimport { cn } from \"../lib/utils\";\nimport { ToolAppearanceContext } from \"./tool-appearance\";\n\nexport { formatToolName };\n\n/** Parse JSON text into a record, or `null` when it is not one. */\nexport function tryParseJson(text: string): Record<string, unknown> | null {\n try {\n const parsed: unknown = JSON.parse(text);\n return typeof parsed === \"object\" && parsed !== null\n ? (parsed as Record<string, unknown>)\n : null;\n } catch {\n return null;\n }\n}\n\n/** Parse a tool result (handles nested `.result`, string-encoded JSON) into a record. */\nexport function normalizeResult(result: unknown): Record<string, unknown> | null {\n if (!result) return null;\n if (typeof result === \"string\") return tryParseJson(result);\n if (typeof result === \"object\") {\n const obj = result as Record<string, unknown>;\n if (typeof obj.result === \"string\") return tryParseJson(obj.result) ?? obj;\n return obj;\n }\n return null;\n}\n\n/** Truncate a string with an ellipsis. */\nexport function truncate(text: string, max: number): string {\n return text.length > max ? `${text.slice(0, max)}...` : text;\n}\n\nexport type ToolStatus = \"running\" | \"complete\" | \"incomplete\" | \"requires-action\";\n\nexport interface ToolCardProps {\n icon: ElementType;\n status: ToolStatus;\n title: string;\n subtitle?: string;\n toolName?: string;\n badge?: string;\n error?: string | null;\n children?: ReactNode;\n args?: Record<string, unknown>;\n result?: unknown;\n}\n\n/**\n * The card shell every dedicated tool UI is built on. Under a thread\n * appearance provider it renders through the provider's row renderer (the\n * `ToolFallback` shell), so a dedicated UI and a generic fallback share one\n * anatomy there; with no provider it is the boxed card below, unchanged.\n */\nexport function ToolCard(props: ToolCardProps) {\n const ThreadToolCard = useContext(ToolAppearanceContext)?.ToolCard;\n if (ThreadToolCard) return <ThreadToolCard {...props} />;\n return <ToolCardBox {...props} />;\n}\n\nfunction ToolCardBox({\n icon: Icon,\n status,\n title,\n subtitle,\n toolName,\n badge,\n error,\n children,\n args,\n result,\n}: ToolCardProps) {\n const isRunning = status === \"running\";\n const isComplete = status === \"complete\";\n const isError = status === \"incomplete\";\n\n return (\n <div className=\"my-3 w-full overflow-hidden rounded-xl border border-border/60 bg-background shadow-sm\">\n <div className=\"flex items-center gap-3 px-4 py-3\">\n <div\n className={cn(\n \"flex size-8 shrink-0 items-center justify-center rounded-lg\",\n isRunning && \"bg-blue-50 text-blue-600\",\n isComplete && \"bg-emerald-50 text-emerald-600\",\n isError && \"bg-destructive/10 text-destructive\",\n )}\n >\n {isRunning ? (\n <LoaderIcon className=\"size-4 animate-spin\" />\n ) : isError ? (\n <AlertCircleIcon className=\"size-4\" />\n ) : (\n <Icon className=\"size-4\" />\n )}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-[13px] font-medium text-foreground\">\n {title}\n </span>\n {isComplete && !error && (\n <CheckCircle2Icon className=\"size-3.5 text-emerald-500\" />\n )}\n </div>\n {subtitle && (\n <p className=\"truncate text-[12px] text-muted-foreground\">\n {subtitle}\n </p>\n )}\n </div>\n {toolName && (\n <span className=\"shrink-0 rounded-md bg-muted/60 px-1.5 py-0.5 text-[10px] font-mono text-muted-foreground\">\n {formatToolName(toolName)}\n </span>\n )}\n {badge && (\n <span className=\"shrink-0 rounded-full bg-muted px-2 py-0.5 text-[10px] font-medium text-muted-foreground\">\n {badge}\n </span>\n )}\n {isRunning && (\n <div className=\"flex items-center gap-1.5\">\n <div className=\"h-1.5 w-10 animate-pulse rounded-full bg-blue-100\" />\n <div className=\"h-1.5 w-6 animate-pulse rounded-full bg-blue-100\" />\n </div>\n )}\n </div>\n\n {error && (\n <div className=\"border-t border-border/40 bg-destructive/10 px-4 py-2.5\">\n <p className=\"text-[12px] leading-relaxed text-destructive\">\n {error}\n </p>\n </div>\n )}\n\n {children}\n\n {/* Copy tool spec — subtle button at the bottom of every tool card */}\n {toolName && isComplete && (\n <CopyToolSpecButton toolName={toolName} args={args} result={result} />\n )}\n </div>\n );\n}\n\n/** Copies `{ tool_name, arguments, result }` as JSON — the tool spec a support ticket needs. */\nexport function CopyToolSpecButton({\n toolName,\n args,\n argsText,\n result,\n className,\n}: {\n toolName: string;\n args?: Record<string, unknown>;\n argsText?: string;\n result?: unknown;\n className?: string;\n}) {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = useCallback(() => {\n const spec: Record<string, unknown> = { tool_name: toolName };\n if (args) spec.arguments = args;\n else if (argsText) spec.arguments = tryParseJson(argsText) ?? argsText;\n if (result !== undefined) {\n if (typeof result === \"string\") {\n const parsed = tryParseJson(result);\n spec.result = parsed ?? result;\n } else {\n spec.result = result;\n }\n }\n navigator.clipboard.writeText(JSON.stringify(spec, null, 2)).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n }, [toolName, args, argsText, result]);\n\n return (\n <div className={cn(\"flex justify-end px-3 pb-1.5\", className)}>\n <button\n type=\"button\"\n onClick={handleCopy}\n className=\"flex items-center gap-1 rounded px-1.5 py-0.5 text-[10px] text-muted-foreground/40 transition-colors hover:bg-muted/50 hover:text-muted-foreground\"\n title=\"Copy tool name, arguments, and result as JSON\"\n >\n <ClipboardCopyIcon className=\"size-2.5\" />\n {copied ? \"Copied!\" : toolName}\n </button>\n </div>\n );\n}\n\n/** \"Show search results\" → \"Search results\": the static heading a section gets once the row's disclosure is the only toggle. */\nfunction sectionHeading(label: string | undefined): string | null {\n if (!label) return null;\n const heading = label.replace(/^show\\s+/i, \"\").trim();\n if (!heading) return null;\n return heading.charAt(0).toUpperCase() + heading.slice(1);\n}\n\nexport function ExpandableSection({\n label,\n children,\n defaultOpen = false,\n}: {\n label?: string;\n children: ReactNode;\n defaultOpen?: boolean;\n}) {\n const [expanded, setExpanded] = useState(defaultOpen);\n const appearance = useContext(ToolAppearanceContext)?.appearance ?? \"card\";\n\n // Inside the thread row the card's own disclosure is the one toggle; a\n // second nested \"Show details\" would make a reader click twice.\n if (appearance === \"thread\") {\n const heading = sectionHeading(label);\n return (\n <div data-slot=\"tool-section\" className=\"flex flex-col gap-1.5 px-3\">\n {heading ? (\n <p className=\"text-xs font-medium text-muted-foreground\">{heading}</p>\n ) : null}\n <div className=\"max-h-72 overflow-y-auto\">{children}</div>\n </div>\n );\n }\n\n return (\n <div className=\"border-t border-border/40\">\n <button\n type=\"button\"\n onClick={() => setExpanded(!expanded)}\n className=\"flex w-full items-center gap-2 px-4 py-2 text-left text-[11px] font-medium text-muted-foreground transition-colors hover:bg-muted/30\"\n >\n <ChevronDownIcon\n className={cn(\n \"size-3.5 shrink-0 transition-transform duration-200\",\n !expanded && \"-rotate-90\",\n )}\n />\n <span>{expanded ? \"Hide details\" : (label ?? \"Show details\")}</span>\n </button>\n {expanded && (\n <div className=\"max-h-72 overflow-y-auto border-t border-border/40 bg-muted/10 px-4 py-3\">\n {children}\n </div>\n )}\n </div>\n );\n}\n"],"names":["useContext","ToolAppearanceContext","jsx","jsxs","cn","LoaderIcon","AlertCircleIcon","CheckCircle2Icon","formatToolName","useState","useCallback","ClipboardCopyIcon","ChevronDownIcon"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
-
const
|
|
4
|
+
const require$$0 = require("react");
|
|
5
5
|
const lucideReact = require("lucide-react");
|
|
6
6
|
const rangePreview = require("../sheet-range/range-preview.cjs");
|
|
7
7
|
const rangePreviewTable = require("../sheet-range/range-preview-table.cjs");
|
|
@@ -105,20 +105,20 @@ const ReadAssetToolUIImpl = ({
|
|
|
105
105
|
isError: isToolError
|
|
106
106
|
}) => {
|
|
107
107
|
var _a;
|
|
108
|
-
const [expanded, setExpanded] =
|
|
108
|
+
const [expanded, setExpanded] = require$$0.useState(false);
|
|
109
109
|
const typedArgs = args;
|
|
110
110
|
const assetIds = (typedArgs == null ? void 0 : typedArgs.asset_ids) ?? [];
|
|
111
111
|
const firstAssetId = assetIds[0] ?? "";
|
|
112
112
|
const assetCount = assetIds.length;
|
|
113
|
-
const normalizedResult =
|
|
114
|
-
const resultItems =
|
|
113
|
+
const normalizedResult = require$$0.useMemo(() => normalizeResult(result), [result]);
|
|
114
|
+
const resultItems = require$$0.useMemo(
|
|
115
115
|
() => getResultItems(normalizedResult),
|
|
116
116
|
[normalizedResult]
|
|
117
117
|
);
|
|
118
118
|
const isRunning = (status == null ? void 0 : status.type) === "running";
|
|
119
119
|
const isComplete = (status == null ? void 0 : status.type) === "complete";
|
|
120
120
|
const isIncomplete = (status == null ? void 0 : status.type) === "incomplete";
|
|
121
|
-
const reviewedText =
|
|
121
|
+
const reviewedText = require$$0.useMemo(
|
|
122
122
|
() => getReviewedText(resultItems),
|
|
123
123
|
[resultItems]
|
|
124
124
|
);
|
|
@@ -227,7 +227,7 @@ const ReadAssetToolUIImpl = ({
|
|
|
227
227
|
] })
|
|
228
228
|
] });
|
|
229
229
|
};
|
|
230
|
-
const ReadAssetToolUI =
|
|
230
|
+
const ReadAssetToolUI = require$$0.memo(
|
|
231
231
|
ReadAssetToolUIImpl
|
|
232
232
|
);
|
|
233
233
|
ReadAssetToolUI.displayName = "ReadAssetToolUI";
|