@athenaintel/react 0.57.1 → 0.59.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 +778 -9
- package/dist/agent-runtime/src/addressed-agents.cjs +16 -0
- package/dist/agent-runtime/src/addressed-agents.cjs.map +1 -0
- package/dist/agent-runtime/src/addressed-agents.d.ts +30 -0
- package/dist/agent-runtime/src/addressed-agents.js +16 -0
- package/dist/agent-runtime/src/addressed-agents.js.map +1 -0
- package/dist/agent-runtime/src/answer-label.cjs +4 -3
- package/dist/agent-runtime/src/answer-label.cjs.map +1 -1
- package/dist/agent-runtime/src/answer-label.d.ts +13 -6
- package/dist/agent-runtime/src/answer-label.js +4 -3
- package/dist/agent-runtime/src/answer-label.js.map +1 -1
- package/dist/agent-runtime/src/chat-outbox-attachments.cjs.map +1 -1
- package/dist/agent-runtime/src/chat-outbox-attachments.d.ts +1 -1
- package/dist/agent-runtime/src/chat-outbox-attachments.js.map +1 -1
- package/dist/agent-runtime/src/chat-outbox-entry.cjs +101 -0
- package/dist/agent-runtime/src/chat-outbox-entry.cjs.map +1 -0
- package/dist/agent-runtime/src/chat-outbox-entry.d.ts +99 -0
- package/dist/agent-runtime/src/chat-outbox-entry.js +101 -0
- package/dist/agent-runtime/src/chat-outbox-entry.js.map +1 -0
- package/dist/agent-runtime/src/chat-outbox-legacy.cjs +252 -0
- package/dist/agent-runtime/src/chat-outbox-legacy.cjs.map +1 -0
- package/dist/agent-runtime/src/chat-outbox-legacy.d.ts +96 -0
- package/dist/agent-runtime/src/chat-outbox-legacy.js +252 -0
- package/dist/agent-runtime/src/chat-outbox-legacy.js.map +1 -0
- package/dist/agent-runtime/src/chat-outbox-policy.cjs +30 -0
- package/dist/agent-runtime/src/chat-outbox-policy.cjs.map +1 -0
- package/dist/agent-runtime/src/chat-outbox-policy.d.ts +42 -0
- package/dist/agent-runtime/src/chat-outbox-policy.js +30 -0
- package/dist/agent-runtime/src/chat-outbox-policy.js.map +1 -0
- package/dist/agent-runtime/src/chat-outbox-storage.cjs +306 -0
- package/dist/agent-runtime/src/chat-outbox-storage.cjs.map +1 -0
- package/dist/agent-runtime/src/chat-outbox-storage.d.ts +194 -0
- package/dist/agent-runtime/src/chat-outbox-storage.js +306 -0
- package/dist/agent-runtime/src/chat-outbox-storage.js.map +1 -0
- package/dist/agent-runtime/src/chat-outbox-thread.cjs +21 -94
- package/dist/agent-runtime/src/chat-outbox-thread.cjs.map +1 -1
- package/dist/agent-runtime/src/chat-outbox-thread.d.ts +22 -18
- package/dist/agent-runtime/src/chat-outbox-thread.js +21 -94
- package/dist/agent-runtime/src/chat-outbox-thread.js.map +1 -1
- package/dist/agent-runtime/src/chat-outbox.cjs +492 -547
- package/dist/agent-runtime/src/chat-outbox.cjs.map +1 -1
- package/dist/agent-runtime/src/chat-outbox.d.ts +110 -142
- package/dist/agent-runtime/src/chat-outbox.js +492 -547
- package/dist/agent-runtime/src/chat-outbox.js.map +1 -1
- package/dist/agent-runtime/src/composer-markdown.cjs.map +1 -1
- package/dist/agent-runtime/src/composer-markdown.d.ts +1 -1
- package/dist/agent-runtime/src/composer-markdown.js.map +1 -1
- package/dist/agent-runtime/src/deep-agent-transport-recipe.cjs +3 -1
- package/dist/agent-runtime/src/deep-agent-transport-recipe.cjs.map +1 -1
- package/dist/agent-runtime/src/deep-agent-transport-recipe.d.ts +8 -1
- package/dist/agent-runtime/src/deep-agent-transport-recipe.js +3 -1
- package/dist/agent-runtime/src/deep-agent-transport-recipe.js.map +1 -1
- package/dist/agent-runtime/src/dictation-preferences.d.ts +356 -0
- package/dist/agent-runtime/src/dictation-record.d.ts +279 -0
- package/dist/agent-runtime/src/dictation-session.d.ts +106 -7
- package/dist/agent-runtime/src/dictation-snippets.d.ts +9 -0
- package/dist/agent-runtime/src/dictation-transfer.d.ts +142 -0
- package/dist/agent-runtime/src/edit-command.cjs.map +1 -1
- package/dist/agent-runtime/src/edit-command.d.ts +1 -1
- package/dist/agent-runtime/src/edit-command.js.map +1 -1
- package/dist/agent-runtime/src/errors.cjs +1 -0
- package/dist/agent-runtime/src/errors.cjs.map +1 -1
- package/dist/agent-runtime/src/errors.js +1 -0
- package/dist/agent-runtime/src/errors.js.map +1 -1
- package/dist/agent-runtime/src/generated/runconfig-contract.cjs +24 -0
- package/dist/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -1
- package/dist/agent-runtime/src/generated/runconfig-contract.d.ts +3 -3
- package/dist/agent-runtime/src/generated/runconfig-contract.js +24 -0
- package/dist/agent-runtime/src/generated/runconfig-contract.js.map +1 -1
- package/dist/agent-runtime/src/index.d.ts +14 -8
- package/dist/agent-runtime/src/lane-follow.cjs +289 -0
- package/dist/agent-runtime/src/lane-follow.cjs.map +1 -0
- package/dist/agent-runtime/src/lane-follow.js +289 -0
- package/dist/agent-runtime/src/lane-follow.js.map +1 -0
- package/dist/agent-runtime/src/lane-images.cjs +387 -0
- package/dist/agent-runtime/src/lane-images.cjs.map +1 -0
- package/dist/agent-runtime/src/lane-images.js +387 -0
- package/dist/agent-runtime/src/lane-images.js.map +1 -0
- package/dist/agent-runtime/src/message-window.js +1 -1
- package/dist/agent-runtime/src/messages.cjs +19 -1
- package/dist/agent-runtime/src/messages.cjs.map +1 -1
- package/dist/agent-runtime/src/messages.d.ts +8 -0
- package/dist/agent-runtime/src/messages.js +21 -3
- package/dist/agent-runtime/src/messages.js.map +1 -1
- package/dist/agent-runtime/src/named-agents.cjs +301 -0
- package/dist/agent-runtime/src/named-agents.cjs.map +1 -0
- package/dist/agent-runtime/src/named-agents.d.ts +246 -0
- package/dist/agent-runtime/src/named-agents.js +301 -0
- package/dist/agent-runtime/src/named-agents.js.map +1 -0
- package/dist/agent-runtime/src/offline-status.cjs.map +1 -1
- package/dist/agent-runtime/src/offline-status.d.ts +66 -2
- package/dist/agent-runtime/src/offline-status.js.map +1 -1
- package/dist/agent-runtime/src/ptc-subcalls.cjs +41 -0
- package/dist/agent-runtime/src/ptc-subcalls.cjs.map +1 -0
- package/dist/agent-runtime/src/ptc-subcalls.js +41 -0
- package/dist/agent-runtime/src/ptc-subcalls.js.map +1 -0
- package/dist/agent-runtime/src/queue.cjs +2 -2
- package/dist/agent-runtime/src/queue.cjs.map +1 -1
- package/dist/agent-runtime/src/queue.d.ts +20 -25
- package/dist/agent-runtime/src/queue.js +2 -2
- package/dist/agent-runtime/src/queue.js.map +1 -1
- package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs +314 -84
- package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs.map +1 -1
- package/dist/agent-runtime/src/quota-safe-local-storage-session.d.ts +137 -40
- package/dist/agent-runtime/src/quota-safe-local-storage-session.js +318 -88
- package/dist/agent-runtime/src/quota-safe-local-storage-session.js.map +1 -1
- package/dist/agent-runtime/src/run-send.cjs +54 -0
- package/dist/agent-runtime/src/run-send.cjs.map +1 -0
- package/dist/agent-runtime/src/run-send.d.ts +51 -0
- package/dist/agent-runtime/src/run-send.js +54 -0
- package/dist/agent-runtime/src/run-send.js.map +1 -0
- package/dist/agent-runtime/src/running-tool-placeholder.cjs +6 -0
- package/dist/agent-runtime/src/running-tool-placeholder.cjs.map +1 -1
- package/dist/agent-runtime/src/running-tool-placeholder.js +6 -0
- package/dist/agent-runtime/src/running-tool-placeholder.js.map +1 -1
- package/dist/agent-runtime/src/runtime.d.ts +9 -5
- package/dist/agent-runtime/src/sealed-idb.cjs +64 -0
- package/dist/agent-runtime/src/sealed-idb.cjs.map +1 -1
- package/dist/agent-runtime/src/sealed-idb.d.ts +16 -0
- package/dist/agent-runtime/src/sealed-idb.js +64 -0
- package/dist/agent-runtime/src/sealed-idb.js.map +1 -1
- package/dist/agent-runtime/src/send-recovery.cjs +90 -118
- package/dist/agent-runtime/src/send-recovery.cjs.map +1 -1
- package/dist/agent-runtime/src/send-recovery.d.ts +25 -29
- package/dist/agent-runtime/src/send-recovery.js +90 -118
- package/dist/agent-runtime/src/send-recovery.js.map +1 -1
- package/dist/agent-runtime/src/statewire-diagnostics.d.ts +4 -1
- package/dist/agent-runtime/src/statewire-held-sends.cjs +191 -0
- package/dist/agent-runtime/src/statewire-held-sends.cjs.map +1 -0
- package/dist/agent-runtime/src/statewire-held-sends.d.ts +119 -0
- package/dist/agent-runtime/src/statewire-held-sends.js +191 -0
- package/dist/agent-runtime/src/statewire-held-sends.js.map +1 -0
- package/dist/agent-runtime/src/statewire-state.cjs +4 -0
- package/dist/agent-runtime/src/statewire-state.cjs.map +1 -1
- package/dist/agent-runtime/src/statewire-state.js +4 -0
- package/dist/agent-runtime/src/statewire-state.js.map +1 -1
- package/dist/agent-runtime/src/statewire-transport.cjs +8 -2
- package/dist/agent-runtime/src/statewire-transport.cjs.map +1 -1
- package/dist/agent-runtime/src/statewire-transport.d.ts +14 -5
- package/dist/agent-runtime/src/statewire-transport.js +8 -2
- package/dist/agent-runtime/src/statewire-transport.js.map +1 -1
- package/dist/agent-runtime/src/subagent-transcripts.cjs +1 -23
- package/dist/agent-runtime/src/subagent-transcripts.cjs.map +1 -1
- package/dist/agent-runtime/src/subagent-transcripts.js +3 -25
- package/dist/agent-runtime/src/subagent-transcripts.js.map +1 -1
- package/dist/agent-runtime/src/subagents.cjs +22 -29
- package/dist/agent-runtime/src/subagents.cjs.map +1 -1
- package/dist/agent-runtime/src/subagents.js +23 -30
- package/dist/agent-runtime/src/subagents.js.map +1 -1
- package/dist/agent-runtime/src/thread-extras.cjs +27 -19
- package/dist/agent-runtime/src/thread-extras.cjs.map +1 -1
- package/dist/agent-runtime/src/thread-extras.d.ts +19 -6
- package/dist/agent-runtime/src/thread-extras.js +27 -19
- package/dist/agent-runtime/src/thread-extras.js.map +1 -1
- package/dist/agent-runtime/src/thread-handoff-flow-machine.d.ts +8 -8
- package/dist/agent-runtime/src/tool-metadata.cjs +12 -0
- package/dist/agent-runtime/src/tool-metadata.cjs.map +1 -1
- package/dist/agent-runtime/src/tool-metadata.js +12 -0
- package/dist/agent-runtime/src/tool-metadata.js.map +1 -1
- package/dist/agent-runtime/src/tool-names.cjs +21 -0
- package/dist/agent-runtime/src/tool-names.cjs.map +1 -1
- package/dist/agent-runtime/src/tool-names.d.ts +8 -0
- package/dist/agent-runtime/src/tool-names.js +21 -0
- package/dist/agent-runtime/src/tool-names.js.map +1 -1
- package/dist/agent-runtime/src/typed-interrupt-kinds.cjs +247 -0
- package/dist/agent-runtime/src/typed-interrupt-kinds.cjs.map +1 -0
- package/dist/agent-runtime/src/typed-interrupt-kinds.d.ts +173 -0
- package/dist/agent-runtime/src/typed-interrupt-kinds.js +247 -0
- package/dist/agent-runtime/src/typed-interrupt-kinds.js.map +1 -0
- package/dist/agent-runtime/src/typed-interrupts.cjs +48 -0
- package/dist/agent-runtime/src/typed-interrupts.cjs.map +1 -0
- package/dist/agent-runtime/src/typed-interrupts.d.ts +75 -0
- package/dist/agent-runtime/src/typed-interrupts.js +48 -0
- package/dist/agent-runtime/src/typed-interrupts.js.map +1 -0
- package/dist/agent-runtime/src/types.d.ts +1 -1
- package/dist/agent-runtime/src/use-conversation-list.cjs +1 -0
- package/dist/agent-runtime/src/use-conversation-list.cjs.map +1 -1
- package/dist/agent-runtime/src/use-conversation-list.d.ts +7 -0
- package/dist/agent-runtime/src/use-conversation-list.js +1 -0
- package/dist/agent-runtime/src/use-conversation-list.js.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs +46 -29
- 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 +14 -22
- package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js +46 -29
- package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-runtime.cjs +78 -14
- package/dist/agent-runtime/src/use-deep-agent-runtime.cjs.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-runtime.d.ts +34 -7
- package/dist/agent-runtime/src/use-deep-agent-runtime.js +79 -15
- package/dist/agent-runtime/src/use-deep-agent-runtime.js.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-thread.cjs +16 -1
- package/dist/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-thread.d.ts +7 -2
- package/dist/agent-runtime/src/use-deep-agent-thread.js +16 -1
- package/dist/agent-runtime/src/use-deep-agent-thread.js.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-voice.cjs +30 -4
- package/dist/agent-runtime/src/use-deep-agent-voice.cjs.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-voice.d.ts +22 -4
- package/dist/agent-runtime/src/use-deep-agent-voice.js +30 -4
- package/dist/agent-runtime/src/use-deep-agent-voice.js.map +1 -1
- package/dist/agent-runtime/src/withdrawn-turns.d.ts +5 -4
- package/dist/agent-runtime/src/word-device-fit.d.ts +174 -0
- package/dist/agent-runtime/src/work-in.d.ts +127 -0
- package/dist/assets/AthenaAssetEmbed.cjs.map +1 -1
- package/dist/assets/AthenaAssetEmbed.d.ts +6 -1
- package/dist/assets/AthenaAssetEmbed.js.map +1 -1
- package/dist/assets/asset-panel-store.cjs +13 -5
- package/dist/assets/asset-panel-store.cjs.map +1 -1
- package/dist/assets/asset-panel-store.d.ts +33 -2
- package/dist/assets/asset-panel-store.js +13 -5
- package/dist/assets/asset-panel-store.js.map +1 -1
- package/dist/auth/AthenaCredentialSourceContext.cjs +11 -0
- package/dist/auth/AthenaCredentialSourceContext.cjs.map +1 -1
- package/dist/auth/AthenaCredentialSourceContext.d.ts +6 -0
- package/dist/auth/AthenaCredentialSourceContext.js +11 -0
- package/dist/auth/AthenaCredentialSourceContext.js.map +1 -1
- package/dist/auth/account-identity.cjs +13 -2
- package/dist/auth/account-identity.cjs.map +1 -1
- package/dist/auth/account-identity.d.ts +9 -0
- package/dist/auth/account-identity.js +13 -2
- package/dist/auth/account-identity.js.map +1 -1
- package/dist/auth/credential-source.cjs +20 -4
- package/dist/auth/credential-source.cjs.map +1 -1
- package/dist/auth/credential-source.d.ts +9 -0
- package/dist/auth/credential-source.js +20 -4
- package/dist/auth/credential-source.js.map +1 -1
- package/dist/catalog/chat-pickers.cjs +31 -0
- package/dist/catalog/chat-pickers.cjs.map +1 -1
- package/dist/catalog/chat-pickers.d.ts +17 -0
- package/dist/catalog/chat-pickers.js +33 -2
- package/dist/catalog/chat-pickers.js.map +1 -1
- package/dist/catalog/runtime-catalog.cjs +63 -3
- package/dist/catalog/runtime-catalog.cjs.map +1 -1
- package/dist/catalog/runtime-catalog.d.ts +63 -3
- package/dist/catalog/runtime-catalog.js +64 -4
- package/dist/catalog/runtime-catalog.js.map +1 -1
- package/dist/chat/AthenaChat.cjs +337 -99
- package/dist/chat/AthenaChat.cjs.map +1 -1
- package/dist/chat/AthenaChat.d.ts +80 -4
- package/dist/chat/AthenaChat.js +337 -99
- package/dist/chat/AthenaChat.js.map +1 -1
- package/dist/chat/StatewireApprovalCard.cjs +35 -5
- package/dist/chat/StatewireApprovalCard.cjs.map +1 -1
- package/dist/chat/StatewireApprovalCard.d.ts +55 -2
- package/dist/chat/StatewireApprovalCard.js +37 -7
- package/dist/chat/StatewireApprovalCard.js.map +1 -1
- package/dist/chat/StatewireQueuedMessages.cjs +17 -2
- package/dist/chat/StatewireQueuedMessages.cjs.map +1 -1
- package/dist/chat/StatewireQueuedMessages.d.ts +8 -45
- package/dist/chat/StatewireQueuedMessages.js +18 -3
- package/dist/chat/StatewireQueuedMessages.js.map +1 -1
- package/dist/chat/chat-agent-mentions.cjs +70 -0
- package/dist/chat/chat-agent-mentions.cjs.map +1 -0
- package/dist/chat/chat-agent-mentions.d.ts +13 -0
- package/dist/chat/chat-agent-mentions.js +70 -0
- package/dist/chat/chat-agent-mentions.js.map +1 -0
- package/dist/chat/composer-actions.cjs +12 -0
- package/dist/chat/composer-actions.cjs.map +1 -0
- package/dist/chat/composer-actions.d.ts +22 -0
- package/dist/chat/composer-actions.js +12 -0
- package/dist/chat/composer-actions.js.map +1 -0
- package/dist/chat/follow-up-suggestions.cjs +185 -0
- package/dist/chat/follow-up-suggestions.cjs.map +1 -0
- package/dist/chat/follow-up-suggestions.d.ts +64 -0
- package/dist/chat/follow-up-suggestions.js +185 -0
- package/dist/chat/follow-up-suggestions.js.map +1 -0
- package/dist/chat/super-grouping/ToolTimeline.cjs +4 -3
- package/dist/chat/super-grouping/ToolTimeline.cjs.map +1 -1
- package/dist/chat/super-grouping/ToolTimeline.d.ts +7 -3
- package/dist/chat/super-grouping/ToolTimeline.js +4 -3
- package/dist/chat/super-grouping/ToolTimeline.js.map +1 -1
- package/dist/chat/turn-changes.cjs +284 -0
- package/dist/chat/turn-changes.cjs.map +1 -0
- package/dist/chat/turn-changes.d.ts +130 -0
- package/dist/chat/turn-changes.js +284 -0
- package/dist/chat/turn-changes.js.map +1 -0
- package/dist/chat/typed-interrupts/StatewireTypedInterruptCard.cjs +31 -0
- package/dist/chat/typed-interrupts/StatewireTypedInterruptCard.cjs.map +1 -0
- package/dist/chat/typed-interrupts/StatewireTypedInterruptCard.d.ts +31 -0
- package/dist/chat/typed-interrupts/StatewireTypedInterruptCard.js +31 -0
- package/dist/chat/typed-interrupts/StatewireTypedInterruptCard.js.map +1 -0
- package/dist/chat/typed-interrupts/approval-cards.cjs +250 -0
- package/dist/chat/typed-interrupts/approval-cards.cjs.map +1 -0
- package/dist/chat/typed-interrupts/approval-cards.d.ts +22 -0
- package/dist/chat/typed-interrupts/approval-cards.js +250 -0
- package/dist/chat/typed-interrupts/approval-cards.js.map +1 -0
- package/dist/chat/typed-interrupts/form-cards.cjs +289 -0
- package/dist/chat/typed-interrupts/form-cards.cjs.map +1 -0
- package/dist/chat/typed-interrupts/form-cards.d.ts +6 -0
- package/dist/chat/typed-interrupts/form-cards.js +289 -0
- package/dist/chat/typed-interrupts/form-cards.js.map +1 -0
- package/dist/chat/typed-interrupts/interrupt-card-shell.cjs +182 -0
- package/dist/chat/typed-interrupts/interrupt-card-shell.cjs.map +1 -0
- package/dist/chat/typed-interrupts/interrupt-card-shell.d.ts +47 -0
- package/dist/chat/typed-interrupts/interrupt-card-shell.js +182 -0
- package/dist/chat/typed-interrupts/interrupt-card-shell.js.map +1 -0
- package/dist/chat/typed-interrupts/json-schema-form.cjs +388 -0
- package/dist/chat/typed-interrupts/json-schema-form.cjs.map +1 -0
- package/dist/chat/typed-interrupts/json-schema-form.d.ts +33 -0
- package/dist/chat/typed-interrupts/json-schema-form.js +388 -0
- package/dist/chat/typed-interrupts/json-schema-form.js.map +1 -0
- package/dist/chat/typed-interrupts/questionnaire-card.cjs +449 -0
- package/dist/chat/typed-interrupts/questionnaire-card.cjs.map +1 -0
- package/dist/chat/typed-interrupts/questionnaire-card.d.ts +20 -0
- package/dist/chat/typed-interrupts/questionnaire-card.js +449 -0
- package/dist/chat/typed-interrupts/questionnaire-card.js.map +1 -0
- package/dist/chat/typed-interrupts/request-file-card.cjs +159 -0
- package/dist/chat/typed-interrupts/request-file-card.cjs.map +1 -0
- package/dist/chat/typed-interrupts/request-file-card.d.ts +2 -0
- package/dist/chat/typed-interrupts/request-file-card.js +159 -0
- package/dist/chat/typed-interrupts/request-file-card.js.map +1 -0
- package/dist/chat/typed-interrupts/toolkit-selection-card.cjs +189 -0
- package/dist/chat/typed-interrupts/toolkit-selection-card.cjs.map +1 -0
- package/dist/chat/typed-interrupts/toolkit-selection-card.d.ts +23 -0
- package/dist/chat/typed-interrupts/toolkit-selection-card.js +189 -0
- package/dist/chat/typed-interrupts/toolkit-selection-card.js.map +1 -0
- package/dist/chat/typed-interrupts/typed-interrupt-body.cjs +26 -0
- package/dist/chat/typed-interrupts/typed-interrupt-body.cjs.map +1 -0
- package/dist/chat/typed-interrupts/typed-interrupt-body.d.ts +3 -0
- package/dist/chat/typed-interrupts/typed-interrupt-body.js +26 -0
- package/dist/chat/typed-interrupts/typed-interrupt-body.js.map +1 -0
- package/dist/chat/typed-interrupts/typed-interrupt-graphql.cjs +105 -0
- package/dist/chat/typed-interrupts/typed-interrupt-graphql.cjs.map +1 -0
- package/dist/chat/typed-interrupts/typed-interrupt-graphql.d.ts +29 -0
- package/dist/chat/typed-interrupts/typed-interrupt-graphql.js +105 -0
- package/dist/chat/typed-interrupts/typed-interrupt-graphql.js.map +1 -0
- package/dist/chat/typed-interrupts/typed-interrupt-notice.cjs +70 -0
- package/dist/chat/typed-interrupts/typed-interrupt-notice.cjs.map +1 -0
- package/dist/chat/typed-interrupts/typed-interrupt-notice.d.ts +45 -0
- package/dist/chat/typed-interrupts/typed-interrupt-notice.js +70 -0
- package/dist/chat/typed-interrupts/typed-interrupt-notice.js.map +1 -0
- package/dist/chat/typed-interrupts/typed-interrupt-panel.cjs +76 -0
- package/dist/chat/typed-interrupts/typed-interrupt-panel.cjs.map +1 -0
- package/dist/chat/typed-interrupts/typed-interrupt-panel.d.ts +11 -0
- package/dist/chat/typed-interrupts/typed-interrupt-panel.js +76 -0
- package/dist/chat/typed-interrupts/typed-interrupt-panel.js.map +1 -0
- package/dist/chat/typed-interrupts/typed-interrupt-types.d.ts +46 -0
- package/dist/chat/typed-interrupts/use-interrupt-draft.cjs +106 -0
- package/dist/chat/typed-interrupts/use-interrupt-draft.cjs.map +1 -0
- package/dist/chat/typed-interrupts/use-interrupt-draft.d.ts +29 -0
- package/dist/chat/typed-interrupts/use-interrupt-draft.js +106 -0
- package/dist/chat/typed-interrupts/use-interrupt-draft.js.map +1 -0
- package/dist/chat/typed-interrupts/use-statewire-typed-interrupt.cjs +231 -0
- package/dist/chat/typed-interrupts/use-statewire-typed-interrupt.cjs.map +1 -0
- package/dist/chat/typed-interrupts/use-statewire-typed-interrupt.d.ts +66 -0
- package/dist/chat/typed-interrupts/use-statewire-typed-interrupt.js +231 -0
- package/dist/chat/typed-interrupts/use-statewire-typed-interrupt.js.map +1 -0
- package/dist/chat-ui/composer/composer-named-agents.cjs +13 -0
- package/dist/chat-ui/composer/composer-named-agents.cjs.map +1 -0
- package/dist/chat-ui/composer/composer-named-agents.d.ts +20 -0
- package/dist/chat-ui/composer/composer-named-agents.js +13 -0
- package/dist/chat-ui/composer/composer-named-agents.js.map +1 -0
- package/dist/chat-ui/composer/slash-command-menu.cjs +143 -0
- package/dist/chat-ui/composer/slash-command-menu.cjs.map +1 -0
- package/dist/chat-ui/composer/slash-command-menu.d.ts +19 -0
- package/dist/chat-ui/composer/slash-command-menu.js +143 -0
- package/dist/chat-ui/composer/slash-command-menu.js.map +1 -0
- package/dist/chat-ui/composer/slash-commands-extension.cjs +51 -0
- package/dist/chat-ui/composer/slash-commands-extension.cjs.map +1 -0
- package/dist/chat-ui/composer/slash-commands-extension.d.ts +39 -0
- package/dist/chat-ui/composer/slash-commands-extension.js +51 -0
- package/dist/chat-ui/composer/slash-commands-extension.js.map +1 -0
- package/dist/chat-ui/composer/slash-commands.cjs +74 -0
- package/dist/chat-ui/composer/slash-commands.cjs.map +1 -0
- package/dist/chat-ui/composer/slash-commands.d.ts +82 -0
- package/dist/chat-ui/composer/slash-commands.js +74 -0
- package/dist/chat-ui/composer/slash-commands.js.map +1 -0
- package/dist/chat-ui/composer/tiptap-composer.cjs +135 -9
- package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -1
- package/dist/chat-ui/composer/tiptap-composer.d.ts +61 -2
- package/dist/chat-ui/composer/tiptap-composer.js +135 -9
- package/dist/chat-ui/composer/tiptap-composer.js.map +1 -1
- package/dist/chat-ui/index.cjs +3 -0
- package/dist/chat-ui/index.cjs.map +1 -1
- package/dist/chat-ui/index.d.ts +3 -2
- package/dist/chat-ui/index.js +3 -0
- package/dist/chat-ui/index.js.map +1 -1
- package/dist/chat-ui/mentions/mention-chip.cjs +1 -1
- package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -1
- package/dist/chat-ui/mentions/mention-chip.js +2 -2
- package/dist/chat-ui/mentions/mention-chip.js.map +1 -1
- package/dist/chat-ui/mentions/mention-extension.cjs +8 -1
- package/dist/chat-ui/mentions/mention-extension.cjs.map +1 -1
- package/dist/chat-ui/mentions/mention-extension.js +8 -1
- package/dist/chat-ui/mentions/mention-extension.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/get-scope-name.cjs +1 -0
- package/dist/chat-ui/mentions/suggestions/components/get-scope-name.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/get-scope-name.js +1 -0
- package/dist/chat-ui/mentions/suggestions/components/get-scope-name.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/mention-icon.cjs +2 -0
- package/dist/chat-ui/mentions/suggestions/components/mention-icon.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/mention-icon.js +3 -1
- package/dist/chat-ui/mentions/suggestions/components/mention-icon.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/menu-item.cjs +1 -1
- package/dist/chat-ui/mentions/suggestions/components/menu-item.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/menu-item.js +1 -1
- package/dist/chat-ui/mentions/suggestions/components/menu-item.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/api-client.cjs +36 -0
- package/dist/chat-ui/mentions/suggestions/data/api-client.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/api-client.d.ts +42 -0
- package/dist/chat-ui/mentions/suggestions/data/api-client.js +36 -0
- package/dist/chat-ui/mentions/suggestions/data/api-client.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs +235 -19
- package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/sources/index.d.ts +88 -10
- package/dist/chat-ui/mentions/suggestions/data/sources/index.js +236 -20
- package/dist/chat-ui/mentions/suggestions/data/sources/index.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/types.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/types.d.ts +27 -1
- package/dist/chat-ui/mentions/suggestions/data/types.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs +56 -5
- 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 +26 -6
- package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js +57 -6
- package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.cjs +34 -17
- package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.d.ts +19 -1
- package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.js +35 -18
- package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.js.map +1 -1
- package/dist/chat-ui/statewire.d.ts +1 -1
- package/dist/chat-ui/thread/statewire-history-edge.cjs +15 -0
- package/dist/chat-ui/thread/statewire-history-edge.cjs.map +1 -1
- package/dist/chat-ui/thread/statewire-history-edge.d.ts +4 -1
- package/dist/chat-ui/thread/statewire-history-edge.js +15 -0
- package/dist/chat-ui/thread/statewire-history-edge.js.map +1 -1
- package/dist/collab/client.cjs +17 -5
- package/dist/collab/client.cjs.map +1 -1
- package/dist/collab/client.d.ts +22 -7
- package/dist/collab/client.js +17 -5
- package/dist/collab/client.js.map +1 -1
- package/dist/composer/ComposerAttachedReferences.cjs +119 -0
- package/dist/composer/ComposerAttachedReferences.cjs.map +1 -0
- package/dist/composer/ComposerAttachedReferences.d.ts +26 -0
- package/dist/composer/ComposerAttachedReferences.js +119 -0
- package/dist/composer/ComposerAttachedReferences.js.map +1 -0
- package/dist/composer/ComposerNamedAgents.cjs +63 -0
- package/dist/composer/ComposerNamedAgents.cjs.map +1 -0
- package/dist/composer/ComposerNamedAgents.d.ts +16 -0
- package/dist/composer/ComposerNamedAgents.js +63 -0
- package/dist/composer/ComposerNamedAgents.js.map +1 -0
- package/dist/composer/attached-references.cjs +159 -0
- package/dist/composer/attached-references.cjs.map +1 -0
- package/dist/composer/attached-references.d.ts +86 -0
- package/dist/composer/attached-references.js +159 -0
- package/dist/composer/attached-references.js.map +1 -0
- package/dist/composer/build-composed-message.cjs +14 -7
- package/dist/composer/build-composed-message.cjs.map +1 -1
- package/dist/composer/build-composed-message.d.ts +6 -1
- package/dist/composer/build-composed-message.js +14 -7
- package/dist/composer/build-composed-message.js.map +1 -1
- package/dist/composer/composer-handoff.cjs +6 -2
- package/dist/composer/composer-handoff.cjs.map +1 -1
- package/dist/composer/composer-handoff.d.ts +7 -1
- package/dist/composer/composer-handoff.js +6 -2
- package/dist/composer/composer-handoff.js.map +1 -1
- package/dist/composer/folder-upload.cjs +149 -0
- package/dist/composer/folder-upload.cjs.map +1 -0
- package/dist/composer/folder-upload.d.ts +79 -0
- package/dist/composer/folder-upload.js +149 -0
- package/dist/composer/folder-upload.js.map +1 -0
- package/dist/composer/index.d.ts +1 -1
- package/dist/composer/useAttachToChat.cjs +35 -0
- package/dist/composer/useAttachToChat.cjs.map +1 -0
- package/dist/composer/useAttachToChat.d.ts +54 -0
- package/dist/composer/useAttachToChat.js +35 -0
- package/dist/composer/useAttachToChat.js.map +1 -0
- package/dist/composer/useAttachedReferencesComposerProps.cjs +19 -0
- package/dist/composer/useAttachedReferencesComposerProps.cjs.map +1 -0
- package/dist/composer/useAttachedReferencesComposerProps.d.ts +12 -0
- package/dist/composer/useAttachedReferencesComposerProps.js +19 -0
- package/dist/composer/useAttachedReferencesComposerProps.js.map +1 -0
- package/dist/composer/useFileUpload.cjs +95 -7
- package/dist/composer/useFileUpload.cjs.map +1 -1
- package/dist/composer/useFileUpload.d.ts +21 -2
- package/dist/composer/useFileUpload.js +95 -7
- package/dist/composer/useFileUpload.js.map +1 -1
- package/dist/data/athena-api-error.cjs +125 -0
- package/dist/data/athena-api-error.cjs.map +1 -0
- package/dist/data/athena-api-error.d.ts +96 -0
- package/dist/data/athena-api-error.js +125 -0
- package/dist/data/athena-api-error.js.map +1 -0
- package/dist/data/athena-data-client.cjs +106 -0
- package/dist/data/athena-data-client.cjs.map +1 -0
- package/dist/data/athena-data-client.d.ts +74 -0
- package/dist/data/athena-data-client.js +106 -0
- package/dist/data/athena-data-client.js.map +1 -0
- package/dist/data/athena-member.cjs +93 -0
- package/dist/data/athena-member.cjs.map +1 -0
- package/dist/data/athena-member.d.ts +125 -0
- package/dist/data/athena-member.js +93 -0
- package/dist/data/athena-member.js.map +1 -0
- package/dist/data/athena-request.cjs +458 -0
- package/dist/data/athena-request.cjs.map +1 -0
- package/dist/data/athena-request.d.ts +120 -0
- package/dist/data/athena-request.js +458 -0
- package/dist/data/athena-request.js.map +1 -0
- package/dist/data/use-athena-fetch.cjs +14 -0
- package/dist/data/use-athena-fetch.cjs.map +1 -0
- package/dist/data/use-athena-fetch.d.ts +19 -0
- package/dist/data/use-athena-fetch.js +14 -0
- package/dist/data/use-athena-fetch.js.map +1 -0
- package/dist/data/use-athena-graphql.cjs +66 -0
- package/dist/data/use-athena-graphql.cjs.map +1 -0
- package/dist/data/use-athena-graphql.d.ts +56 -0
- package/dist/data/use-athena-graphql.js +66 -0
- package/dist/data/use-athena-graphql.js.map +1 -0
- package/dist/data/use-athena-rest.cjs +33 -0
- package/dist/data/use-athena-rest.cjs.map +1 -0
- package/dist/data/use-athena-rest.d.ts +21 -0
- package/dist/data/use-athena-rest.js +33 -0
- package/dist/data/use-athena-rest.js.map +1 -0
- package/dist/data/use-semantic-query.cjs +44 -0
- package/dist/data/use-semantic-query.cjs.map +1 -0
- package/dist/data/use-semantic-query.d.ts +92 -0
- package/dist/data/use-semantic-query.js +44 -0
- package/dist/data/use-semantic-query.js.map +1 -0
- package/dist/diagnostics/athena-diagnostics.cjs.map +1 -1
- package/dist/diagnostics/athena-diagnostics.d.ts +5 -1
- package/dist/diagnostics/athena-diagnostics.js.map +1 -1
- package/dist/diagnostics/errors.cjs +7 -0
- package/dist/diagnostics/errors.cjs.map +1 -1
- package/dist/diagnostics/errors.d.ts +7 -0
- package/dist/diagnostics/errors.js +7 -0
- package/dist/diagnostics/errors.js.map +1 -1
- package/dist/index.cjs +155 -11
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +72 -13
- package/dist/index.js +148 -4
- package/dist/index.js.map +1 -1
- package/dist/keryx-http/src/initial-sync.cjs +64 -16
- package/dist/keryx-http/src/initial-sync.cjs.map +1 -1
- package/dist/keryx-http/src/initial-sync.d.ts +31 -1
- package/dist/keryx-http/src/initial-sync.js +64 -16
- package/dist/keryx-http/src/initial-sync.js.map +1 -1
- package/dist/keryx-http/src/own-awareness.cjs +20 -0
- package/dist/keryx-http/src/own-awareness.cjs.map +1 -0
- package/dist/keryx-http/src/own-awareness.d.ts +50 -0
- package/dist/keryx-http/src/own-awareness.js +20 -0
- package/dist/keryx-http/src/own-awareness.js.map +1 -0
- package/dist/keryx-http/src/update-attributions.cjs +26 -1
- package/dist/keryx-http/src/update-attributions.cjs.map +1 -1
- package/dist/keryx-http/src/update-attributions.d.ts +10 -1
- package/dist/keryx-http/src/update-attributions.js +26 -1
- package/dist/keryx-http/src/update-attributions.js.map +1 -1
- package/dist/offline/chat-outbox.cjs +262 -26
- package/dist/offline/chat-outbox.cjs.map +1 -1
- package/dist/offline/chat-outbox.d.ts +90 -12
- package/dist/offline/chat-outbox.js +263 -27
- package/dist/offline/chat-outbox.js.map +1 -1
- package/dist/provider/AthenaProvider.cjs +63 -19
- package/dist/provider/AthenaProvider.cjs.map +1 -1
- package/dist/provider/AthenaProvider.d.ts +24 -8
- package/dist/provider/AthenaProvider.js +66 -22
- package/dist/provider/AthenaProvider.js.map +1 -1
- package/dist/react/package.json.cjs +1 -1
- package/dist/react/package.json.js +1 -1
- package/dist/references/src/anchors/types.cjs +5 -0
- package/dist/references/src/anchors/types.cjs.map +1 -1
- package/dist/references/src/anchors/types.js +5 -0
- package/dist/references/src/anchors/types.js.map +1 -1
- package/dist/references/src/attachable.cjs +149 -0
- package/dist/references/src/attachable.cjs.map +1 -0
- package/dist/references/src/attachable.d.ts +87 -0
- package/dist/references/src/attachable.js +149 -0
- package/dist/references/src/attachable.js.map +1 -0
- package/dist/runtime/StatewirePlanModeLaneSync.cjs +93 -0
- package/dist/runtime/StatewirePlanModeLaneSync.cjs.map +1 -0
- package/dist/runtime/StatewirePlanModeLaneSync.d.ts +34 -0
- package/dist/runtime/StatewirePlanModeLaneSync.js +93 -0
- package/dist/runtime/StatewirePlanModeLaneSync.js.map +1 -0
- package/dist/runtime/StatewireThreadConfigLaneSync.cjs +2 -0
- package/dist/runtime/StatewireThreadConfigLaneSync.cjs.map +1 -1
- package/dist/runtime/StatewireThreadConfigLaneSync.d.ts +4 -0
- package/dist/runtime/StatewireThreadConfigLaneSync.js +2 -0
- package/dist/runtime/StatewireThreadConfigLaneSync.js.map +1 -1
- package/dist/runtime/statewire-plan-mode.cjs +71 -0
- package/dist/runtime/statewire-plan-mode.cjs.map +1 -0
- package/dist/runtime/statewire-plan-mode.d.ts +88 -0
- package/dist/runtime/statewire-plan-mode.js +71 -0
- package/dist/runtime/statewire-plan-mode.js.map +1 -0
- package/dist/runtime/statewire-run-config.cjs +18 -1
- package/dist/runtime/statewire-run-config.cjs.map +1 -1
- package/dist/runtime/statewire-run-config.d.ts +20 -0
- package/dist/runtime/statewire-run-config.js +18 -1
- package/dist/runtime/statewire-run-config.js.map +1 -1
- package/dist/runtime/statewire-session-key.cjs +11 -5
- package/dist/runtime/statewire-session-key.cjs.map +1 -1
- package/dist/runtime/statewire-session-key.d.ts +22 -10
- package/dist/runtime/statewire-session-key.js +11 -5
- package/dist/runtime/statewire-session-key.js.map +1 -1
- package/dist/runtime/useAthenaStatewireRuntime.cjs +65 -8
- package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
- package/dist/runtime/useAthenaStatewireRuntime.d.ts +26 -10
- package/dist/runtime/useAthenaStatewireRuntime.js +67 -10
- package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
- package/dist/search/useAthenaAssets.cjs +394 -0
- package/dist/search/useAthenaAssets.cjs.map +1 -0
- package/dist/search/useAthenaAssets.d.ts +186 -0
- package/dist/search/useAthenaAssets.js +394 -0
- package/dist/search/useAthenaAssets.js.map +1 -0
- package/dist/sheet-range/index.cjs +4 -0
- package/dist/sheet-range/index.cjs.map +1 -1
- package/dist/sheet-range/index.d.ts +4 -2
- package/dist/sheet-range/index.js +4 -0
- package/dist/sheet-range/index.js.map +1 -1
- package/dist/sheet-range/query-range.cjs +102 -0
- package/dist/sheet-range/query-range.cjs.map +1 -0
- package/dist/sheet-range/query-range.d.ts +46 -0
- package/dist/sheet-range/query-range.js +102 -0
- package/dist/sheet-range/query-range.js.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/subagents/index.cjs +49 -0
- package/dist/subagents/index.cjs.map +1 -0
- package/dist/subagents/index.d.ts +16 -0
- package/dist/subagents/index.js +49 -0
- package/dist/subagents/index.js.map +1 -0
- package/dist/subagents/lane-follow.cjs +19 -0
- package/dist/subagents/lane-follow.cjs.map +1 -0
- package/dist/subagents/lane-follow.d.ts +9 -0
- package/dist/subagents/lane-follow.js +19 -0
- package/dist/subagents/lane-follow.js.map +1 -0
- package/dist/subagents/lane-model.cjs +178 -0
- package/dist/subagents/lane-model.cjs.map +1 -0
- package/dist/subagents/lane-model.d.ts +140 -0
- package/dist/subagents/lane-model.js +178 -0
- package/dist/subagents/lane-model.js.map +1 -0
- package/dist/subagents/lane-parts.cjs +517 -0
- package/dist/subagents/lane-parts.cjs.map +1 -0
- package/dist/subagents/lane-parts.d.ts +130 -0
- package/dist/subagents/lane-parts.js +517 -0
- package/dist/subagents/lane-parts.js.map +1 -0
- package/dist/subagents/subagent-lane-group.cjs +215 -0
- package/dist/subagents/subagent-lane-group.cjs.map +1 -0
- package/dist/subagents/subagent-lane-group.d.ts +67 -0
- package/dist/subagents/subagent-lane-group.js +215 -0
- package/dist/subagents/subagent-lane-group.js.map +1 -0
- package/dist/subagents/subagent-transcript-drawer.cjs +431 -0
- package/dist/subagents/subagent-transcript-drawer.cjs.map +1 -0
- package/dist/subagents/subagent-transcript-drawer.d.ts +78 -0
- package/dist/subagents/subagent-transcript-drawer.js +431 -0
- package/dist/subagents/subagent-transcript-drawer.js.map +1 -0
- package/dist/subagents/task-subagent-group.cjs +115 -0
- package/dist/subagents/task-subagent-group.cjs.map +1 -0
- package/dist/subagents/task-subagent-group.d.ts +36 -0
- package/dist/subagents/task-subagent-group.js +115 -0
- package/dist/subagents/task-subagent-group.js.map +1 -0
- package/dist/subagents/use-omitted-images-in-view.cjs +68 -0
- package/dist/subagents/use-omitted-images-in-view.cjs.map +1 -0
- package/dist/subagents/use-omitted-images-in-view.d.ts +21 -0
- package/dist/subagents/use-omitted-images-in-view.js +68 -0
- package/dist/subagents/use-omitted-images-in-view.js.map +1 -0
- package/dist/threads/Inbox.cjs +2 -2
- package/dist/threads/Inbox.cjs.map +1 -1
- package/dist/threads/SessionList.cjs +27 -24
- package/dist/threads/SessionList.cjs.map +1 -1
- package/dist/threads/SessionList.js +22 -19
- package/dist/threads/SessionList.js.map +1 -1
- package/dist/threads/SessionsPage.cjs +13 -7
- package/dist/threads/SessionsPage.cjs.map +1 -1
- package/dist/threads/SessionsPage.d.ts +10 -1
- package/dist/threads/SessionsPage.js +9 -3
- package/dist/threads/SessionsPage.js.map +1 -1
- package/dist/threads/live-session-rows.cjs +207 -0
- package/dist/threads/live-session-rows.cjs.map +1 -0
- package/dist/threads/live-session-rows.d.ts +175 -0
- package/dist/threads/live-session-rows.js +207 -0
- package/dist/threads/live-session-rows.js.map +1 -0
- package/dist/threads/session-list-model.cjs.map +1 -1
- package/dist/threads/session-list-model.d.ts +2 -1
- package/dist/threads/session-list-model.js.map +1 -1
- package/dist/threads/session-row-parts.cjs +3 -3
- package/dist/threads/session-row-parts.cjs.map +1 -1
- package/dist/threads/sessions-page-model.cjs +13 -5
- package/dist/threads/sessions-page-model.cjs.map +1 -1
- package/dist/threads/sessions-page-model.d.ts +7 -0
- package/dist/threads/sessions-page-model.js +11 -3
- package/dist/threads/sessions-page-model.js.map +1 -1
- package/dist/threads/sessions-page-storage.cjs +8 -8
- package/dist/threads/sessions-page-storage.cjs.map +1 -1
- package/dist/threads/sessions-page-storage.d.ts +5 -1
- package/dist/threads/sessions-page-storage.js +8 -8
- package/dist/threads/sessions-page-storage.js.map +1 -1
- package/dist/threads/statewire-thread-list.cjs +173 -20
- package/dist/threads/statewire-thread-list.cjs.map +1 -1
- package/dist/threads/statewire-thread-list.d.ts +44 -1
- package/dist/threads/statewire-thread-list.js +174 -21
- package/dist/threads/statewire-thread-list.js.map +1 -1
- package/dist/threads/use-athena-sessions.cjs +1 -0
- package/dist/threads/use-athena-sessions.cjs.map +1 -1
- package/dist/threads/use-athena-sessions.d.ts +7 -0
- package/dist/threads/use-athena-sessions.js +1 -0
- package/dist/threads/use-athena-sessions.js.map +1 -1
- package/dist/threads/use-athena-thread-agent.cjs +31 -0
- package/dist/threads/use-athena-thread-agent.cjs.map +1 -0
- package/dist/threads/use-athena-thread-agent.d.ts +38 -0
- package/dist/threads/use-athena-thread-agent.js +31 -0
- package/dist/threads/use-athena-thread-agent.js.map +1 -0
- package/dist/threads/use-athena-thread-plan-mode.cjs +18 -0
- package/dist/threads/use-athena-thread-plan-mode.cjs.map +1 -0
- package/dist/threads/use-athena-thread-plan-mode.d.ts +18 -0
- package/dist/threads/use-athena-thread-plan-mode.js +18 -0
- package/dist/threads/use-athena-thread-plan-mode.js.map +1 -0
- package/dist/threads/use-rest-conversation-history.d.ts +1 -0
- package/dist/tools/agent-creations.cjs +97 -0
- package/dist/tools/agent-creations.cjs.map +1 -0
- package/dist/tools/agent-creations.d.ts +38 -0
- package/dist/tools/agent-creations.js +97 -0
- package/dist/tools/agent-creations.js.map +1 -0
- package/dist/tools/agent-highlights.cjs +100 -0
- package/dist/tools/agent-highlights.cjs.map +1 -0
- package/dist/tools/agent-highlights.d.ts +57 -0
- package/dist/tools/agent-highlights.js +100 -0
- package/dist/tools/agent-highlights.js.map +1 -0
- package/dist/tools/append-document-tool-ui.cjs +1 -0
- package/dist/tools/append-document-tool-ui.cjs.map +1 -1
- package/dist/tools/append-document-tool-ui.d.ts +7 -0
- package/dist/tools/append-document-tool-ui.js +2 -1
- package/dist/tools/append-document-tool-ui.js.map +1 -1
- package/dist/tools/auto-open-tools.cjs +144 -71
- package/dist/tools/auto-open-tools.cjs.map +1 -1
- package/dist/tools/auto-open-tools.d.ts +131 -1
- package/dist/tools/auto-open-tools.js +145 -72
- package/dist/tools/auto-open-tools.js.map +1 -1
- package/dist/tools/browser-tool-uis.cjs +594 -0
- package/dist/tools/browser-tool-uis.cjs.map +1 -0
- package/dist/tools/browser-tool-uis.d.ts +8 -0
- package/dist/tools/browser-tool-uis.js +594 -0
- package/dist/tools/browser-tool-uis.js.map +1 -0
- package/dist/tools/computer-asset-tool-uis.cjs +313 -0
- package/dist/tools/computer-asset-tool-uis.cjs.map +1 -0
- package/dist/tools/computer-asset-tool-uis.d.ts +5 -0
- package/dist/tools/computer-asset-tool-uis.js +313 -0
- package/dist/tools/computer-asset-tool-uis.js.map +1 -0
- package/dist/tools/document-edit-tool-uis.cjs +218 -0
- package/dist/tools/document-edit-tool-uis.cjs.map +1 -0
- package/dist/tools/document-edit-tool-uis.d.ts +40 -0
- package/dist/tools/document-edit-tool-uis.js +218 -0
- package/dist/tools/document-edit-tool-uis.js.map +1 -0
- package/dist/tools/drive-tool-uis.cjs +425 -0
- package/dist/tools/drive-tool-uis.cjs.map +1 -0
- package/dist/tools/drive-tool-uis.d.ts +120 -0
- package/dist/tools/drive-tool-uis.js +425 -0
- package/dist/tools/drive-tool-uis.js.map +1 -0
- package/dist/tools/email-calendar-tool-uis.cjs +789 -0
- package/dist/tools/email-calendar-tool-uis.cjs.map +1 -0
- package/dist/tools/email-calendar-tool-uis.d.ts +129 -0
- package/dist/tools/email-calendar-tool-uis.js +789 -0
- package/dist/tools/email-calendar-tool-uis.js.map +1 -0
- package/dist/tools/ontology-tool-uis.cjs +83 -0
- package/dist/tools/ontology-tool-uis.cjs.map +1 -0
- package/dist/tools/ontology-tool-uis.d.ts +9 -0
- package/dist/tools/ontology-tool-uis.js +83 -0
- package/dist/tools/ontology-tool-uis.js.map +1 -0
- package/dist/tools/orchestration-tool-uis.cjs +586 -0
- package/dist/tools/orchestration-tool-uis.cjs.map +1 -0
- package/dist/tools/orchestration-tool-uis.d.ts +141 -0
- package/dist/tools/orchestration-tool-uis.js +586 -0
- package/dist/tools/orchestration-tool-uis.js.map +1 -0
- package/dist/tools/presentation-edit-tool-uis.cjs +516 -0
- package/dist/tools/presentation-edit-tool-uis.cjs.map +1 -0
- package/dist/tools/presentation-edit-tool-uis.d.ts +73 -0
- package/dist/tools/presentation-edit-tool-uis.js +516 -0
- package/dist/tools/presentation-edit-tool-uis.js.map +1 -0
- package/dist/tools/project-tool-uis.cjs +213 -0
- package/dist/tools/project-tool-uis.cjs.map +1 -0
- package/dist/tools/project-tool-uis.d.ts +14 -0
- package/dist/tools/project-tool-uis.js +213 -0
- package/dist/tools/project-tool-uis.js.map +1 -0
- package/dist/tools/sandbox-tool-uis.cjs +491 -0
- package/dist/tools/sandbox-tool-uis.cjs.map +1 -0
- package/dist/tools/sandbox-tool-uis.d.ts +116 -0
- package/dist/tools/sandbox-tool-uis.js +491 -0
- package/dist/tools/sandbox-tool-uis.js.map +1 -0
- package/dist/tools/sheet-query-tool-ui.cjs +138 -0
- package/dist/tools/sheet-query-tool-ui.cjs.map +1 -0
- package/dist/tools/sheet-query-tool-ui.d.ts +15 -0
- package/dist/tools/sheet-query-tool-ui.js +138 -0
- package/dist/tools/sheet-query-tool-ui.js.map +1 -0
- package/dist/tools/studio-screenshot-tool-uis.cjs +262 -0
- package/dist/tools/studio-screenshot-tool-uis.cjs.map +1 -0
- package/dist/tools/studio-screenshot-tool-uis.d.ts +52 -0
- package/dist/tools/studio-screenshot-tool-uis.js +262 -0
- package/dist/tools/studio-screenshot-tool-uis.js.map +1 -0
- package/dist/tools/subagent-task-tool-ui.cjs +24 -475
- package/dist/tools/subagent-task-tool-ui.cjs.map +1 -1
- package/dist/tools/subagent-task-tool-ui.d.ts +19 -103
- package/dist/tools/subagent-task-tool-ui.js +28 -479
- package/dist/tools/subagent-task-tool-ui.js.map +1 -1
- package/dist/tools/tool-summary.cjs +36 -0
- package/dist/tools/tool-summary.cjs.map +1 -1
- package/dist/tools/tool-summary.js +36 -0
- package/dist/tools/tool-summary.js.map +1 -1
- package/dist/tools/tool-uis.cjs +181 -53
- package/dist/tools/tool-uis.cjs.map +1 -1
- package/dist/tools/tool-uis.d.ts +40 -0
- package/dist/tools/tool-uis.js +183 -55
- package/dist/tools/tool-uis.js.map +1 -1
- package/dist/typed-interrupts/index.cjs +15 -0
- package/dist/typed-interrupts/index.cjs.map +1 -0
- package/dist/typed-interrupts/index.d.ts +20 -0
- package/dist/typed-interrupts/index.js +15 -0
- package/dist/typed-interrupts/index.js.map +1 -0
- package/dist/workbench/session-workbench-panes.cjs +6 -6
- package/dist/workbench/session-workbench-panes.cjs.map +1 -1
- package/package.json +28 -6
- package/dist/agent-runtime/src/chat-outbox-store.cjs +0 -510
- package/dist/agent-runtime/src/chat-outbox-store.cjs.map +0 -1
- package/dist/agent-runtime/src/chat-outbox-store.d.ts +0 -210
- package/dist/agent-runtime/src/chat-outbox-store.js +0 -510
- package/dist/agent-runtime/src/chat-outbox-store.js.map +0 -1
|
@@ -45,6 +45,8 @@ function createAthenaCredentialSource(read) {
|
|
|
45
45
|
let lastResolved = null;
|
|
46
46
|
let identity = null;
|
|
47
47
|
let identityEpoch = 0;
|
|
48
|
+
let scope = null;
|
|
49
|
+
let scopeEpoch = 0;
|
|
48
50
|
const notifyListeners = () => {
|
|
49
51
|
for (const listener of [...listeners]) listener();
|
|
50
52
|
};
|
|
@@ -57,17 +59,30 @@ function createAthenaCredentialSource(read) {
|
|
|
57
59
|
if (changed) identityEpoch += 1;
|
|
58
60
|
return changed;
|
|
59
61
|
};
|
|
62
|
+
const observeScope = (token) => {
|
|
63
|
+
if (!token) return false;
|
|
64
|
+
const subject = jwtSubject(token);
|
|
65
|
+
const next = subject === null ? token : `${subject}\0${jwtScope(token) ?? ""}`;
|
|
66
|
+
if (next === scope) return false;
|
|
67
|
+
const changed = scope !== null;
|
|
68
|
+
scope = next;
|
|
69
|
+
if (changed) scopeEpoch += 1;
|
|
70
|
+
return changed;
|
|
71
|
+
};
|
|
60
72
|
const notifyTokenChanged = () => {
|
|
61
|
-
|
|
73
|
+
const token = read().token;
|
|
74
|
+
observeIdentity(token);
|
|
75
|
+
observeScope(token);
|
|
62
76
|
notifyListeners();
|
|
63
77
|
};
|
|
64
78
|
const settle = (token) => {
|
|
65
79
|
const identityChanged = observeIdentity(token);
|
|
80
|
+
const scopeChanged = observeScope(token);
|
|
66
81
|
if (token !== null && token !== lastResolved) {
|
|
67
82
|
const replaced = lastResolved !== null;
|
|
68
83
|
lastResolved = token;
|
|
69
|
-
if (replaced || identityChanged) notifyListeners();
|
|
70
|
-
} else if (identityChanged) {
|
|
84
|
+
if (replaced || identityChanged || scopeChanged) notifyListeners();
|
|
85
|
+
} else if (identityChanged || scopeChanged) {
|
|
71
86
|
notifyListeners();
|
|
72
87
|
}
|
|
73
88
|
return token;
|
|
@@ -119,7 +134,8 @@ function createAthenaCredentialSource(read) {
|
|
|
119
134
|
};
|
|
120
135
|
},
|
|
121
136
|
notifyTokenChanged,
|
|
122
|
-
identityEpoch: () => identityEpoch
|
|
137
|
+
identityEpoch: () => identityEpoch,
|
|
138
|
+
scopeEpoch: () => scopeEpoch
|
|
123
139
|
};
|
|
124
140
|
}
|
|
125
141
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credential-source.js","sources":["../../src/auth/credential-source.ts"],"sourcesContent":["import type { AthenaStatewireTokenGetter } from '../runtime/statewire-auth-headers';\n\n/**\n * Renews a token-backed sign-in. `force: true` means the token just presented\n * was refused, or has expired: the renewer must obtain a new one rather than\n * return the one it holds. Resolves `null` when it cannot produce a token.\n */\nexport type AthenaTokenRenewer = (options: { force: boolean }) => Promise<string | null>;\n\n/** What the credential source reads, fresh, on every resolve. */\nexport interface AthenaCredentialInputs {\n /**\n * The host's own getter (`config.getToken`). It owns renewal for its\n * sign-in, so it always wins; the held `token` is its fallback when it\n * resolves nothing.\n */\n hostGetToken?: AthenaStatewireTokenGetter;\n /** The token currently held: the host's, the sign-in provider's or the host bridge's. */\n token: string | null | undefined;\n /** How that token renews (the sign-in provider or the host bridge); absent for a static token. */\n renew?: AthenaTokenRenewer;\n}\n\n/**\n * The single place every SDK network path gets the token it presents — the\n * live thread connection, the session list's index and REST calls, uploads,\n * search, voice and the collaborative-document mint — read right before it is\n * presented.\n */\nexport interface AthenaCredentialSource {\n /**\n * The token to present now. `force` renews it first (the previous one was\n * refused). A token that has expired, or expires within\n * {@link TOKEN_EXPIRY_SKEW_MS}, is renewed before it is presented, so a tab\n * waking from sleep never presents a dead token. Concurrent renewals share\n * one in-flight request, and calls made while one is in flight wait for it\n * instead of presenting the token it is replacing. A renewal never hands one\n * account's token to a call made after the signed-in account changed.\n */\n getToken: (options?: { force?: boolean }) => Promise<string | null>;\n /** Called, with no arguments, whenever a different token becomes current. */\n subscribe: (listener: () => void) => () => void;\n /**\n * How many times the identity behind the token has changed: its JWT\n * subject, or the token itself when it is opaque. Renewals for the same\n * identity leave it alone. Long-lived connections key on it, so they keep\n * running across renewals and are rebuilt when someone else signs in,\n * including under a host `getToken`, whose identity is only known once a\n * token has been resolved. Subscribers hear when it moves.\n */\n identityEpoch: () => number;\n /** Tell subscribers the held token changed (the provider calls this when its inputs do). */\n notifyTokenChanged: () => void;\n}\n\n/** A token this close to its expiry is renewed before it is presented. */\nexport const TOKEN_EXPIRY_SKEW_MS = 30_000;\n\n/** The unverified claims of a JWT, or `null` for anything that is not one. */\nfunction jwtClaims(token: string): Record<string, unknown> | null {\n const payload = token.split('.')[1];\n if (!payload) return null;\n try {\n const base64 = payload.replace(/-/g, '+').replace(/_/g, '/');\n const padded = base64.padEnd(Math.ceil(base64.length / 4) * 4, '=');\n const claims: unknown = JSON.parse(atob(padded));\n return typeof claims === 'object' && claims !== null && !Array.isArray(claims)\n ? (claims as Record<string, unknown>)\n : null;\n } catch {\n return null;\n }\n}\n\n/**\n * The `exp` of a JWT, in milliseconds, or `null` for anything that is not a\n * JWT with a numeric `exp`. Read without verification: it only decides whether\n * to renew before presenting; the server still validates every token.\n */\nexport function jwtExpiresAtMs(token: string): number | null {\n const exp = jwtClaims(token)?.exp;\n return typeof exp === 'number' && Number.isFinite(exp) ? exp * 1000 : null;\n}\n\n/** The unverified `sub` of a JWT, or `null` for anything that is not a JWT with one. */\nexport function jwtSubject(token: string): string | null {\n const sub = jwtClaims(token)?.sub;\n return typeof sub === 'string' && sub.length > 0 ? sub : null;\n}\n\n/**\n * The unverified claims that scope a JWT to a workspace or org, as one stable\n * string, or `null` when it names none: Athena's `workspace_id` (an Office\n * session's token), `org_id` (an external sign-in's), and PropelAuth's\n * active-org `org_member_info.org_id`. Two of one person's tokens scoped to\n * different workspaces read differently; a renewal keeps it.\n */\nexport function jwtScope(token: string): string | null {\n const claims = jwtClaims(token);\n if (claims === null) return null;\n const orgMember = claims.org_member_info;\n const scope = [\n ['workspace_id', claims.workspace_id],\n ['org_id', claims.org_id],\n [\n 'org_member_info.org_id',\n typeof orgMember === 'object' && orgMember !== null\n ? (orgMember as Record<string, unknown>).org_id\n : undefined,\n ],\n ]\n .filter((entry): entry is [string, string] => typeof entry[1] === 'string' && entry[1].length > 0)\n .map(([claim, value]) => `${claim}=${value}`);\n return scope.length > 0 ? scope.join('\\u0000') : null;\n}\n\n/** True for a JWT that has expired or expires within {@link TOKEN_EXPIRY_SKEW_MS}. */\nexport function isTokenExpiring(token: string, now: number = Date.now()): boolean {\n const expiresAt = jwtExpiresAtMs(token);\n return expiresAt !== null && expiresAt - now <= TOKEN_EXPIRY_SKEW_MS;\n}\n\nexport function createAthenaCredentialSource(\n read: () => AthenaCredentialInputs,\n): AthenaCredentialSource {\n const listeners = new Set<() => void>();\n // The renewal in flight, and whether the host's getter runs it (the host\n // owns identity for its getter) or the sign-in provider's / bridge's renewer.\n let renewal: { token: Promise<string | null>; byHost: boolean } | null = null;\n let lastResolved: string | null = null;\n let identity: string | null = null;\n let identityEpoch = 0;\n\n const notifyListeners = () => {\n for (const listener of [...listeners]) listener();\n };\n\n /** Note who a token acts as; true when that is someone other than before. */\n const observeIdentity = (token: string | null | undefined): boolean => {\n if (!token) return false;\n const next = jwtSubject(token) ?? token;\n if (next === identity) return false;\n const changed = identity !== null;\n identity = next;\n if (changed) identityEpoch += 1;\n return changed;\n };\n\n const notifyTokenChanged = () => {\n observeIdentity(read().token);\n notifyListeners();\n };\n\n /** Record what a resolve produced; a different token than the last one is news. */\n const settle = (token: string | null): string | null => {\n const identityChanged = observeIdentity(token);\n if (token !== null && token !== lastResolved) {\n const replaced = lastResolved !== null;\n lastResolved = token;\n if (replaced || identityChanged) notifyListeners();\n } else if (identityChanged) {\n notifyListeners();\n }\n return token;\n };\n\n const shareRenewal = (\n start: () => Promise<string | null>,\n byHost: boolean,\n ): { token: Promise<string | null>; byHost: boolean } => {\n if (!renewal) {\n const entry = {\n token: start().finally(() => {\n if (renewal === entry) renewal = null;\n }),\n byHost,\n };\n renewal = entry;\n }\n return renewal;\n };\n\n /**\n * What a finished renewal hands one caller. A host getter's token is\n * presented as is: the host owns identity for its getter. A sign-in\n * provider's or bridge's renewed token is presented only while it acts as\n * the account the provider holds now. When the account changed while the\n * renewal was in flight (its JWT subject differs from the held token's, or\n * the provider holds no token any more), the held token, the current\n * account's, is presented instead. A renewal that produced nothing keeps\n * the held token: the caller presents it and the host's refusal ends the\n * attempt.\n */\n const presentable = (\n { byHost }: { byHost: boolean },\n renewed: string | null,\n ): string | null => {\n const held = read().token ?? null;\n if (byHost) return renewed ?? held;\n if (!renewed || !held) return held;\n const heldSubject = jwtSubject(held);\n const renewedSubject = jwtSubject(renewed);\n return heldSubject && renewedSubject && heldSubject !== renewedSubject ? held : renewed;\n };\n\n const awaitRenewal = async (shared: {\n token: Promise<string | null>;\n byHost: boolean;\n }): Promise<string | null> => settle(presentable(shared, await shared.token));\n\n const getToken = async ({ force = false }: { force?: boolean } = {}): Promise<string | null> => {\n if (renewal) return awaitRenewal(renewal);\n const inputs = read();\n const hostGetToken = inputs.hostGetToken;\n if (hostGetToken) {\n if (!force) return settle((await hostGetToken({ force: false })) ?? read().token ?? null);\n return awaitRenewal(\n shareRenewal(async () => (await hostGetToken({ force: true })) ?? null, true),\n );\n }\n const current = inputs.token ?? null;\n const renew = inputs.renew;\n if (!renew) return settle(current);\n const stale = force || (current !== null && isTokenExpiring(current));\n if (!stale) return settle(current);\n return awaitRenewal(shareRenewal(() => renew({ force: true }), false));\n };\n\n return {\n getToken,\n subscribe: (listener) => {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n notifyTokenChanged,\n identityEpoch: () => identityEpoch,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"credential-source.js","sources":["../../src/auth/credential-source.ts"],"sourcesContent":["import type { AthenaStatewireTokenGetter } from '../runtime/statewire-auth-headers';\n\n/**\n * Renews a token-backed sign-in. `force: true` means the token just presented\n * was refused, or has expired: the renewer must obtain a new one rather than\n * return the one it holds. Resolves `null` when it cannot produce a token.\n */\nexport type AthenaTokenRenewer = (options: { force: boolean }) => Promise<string | null>;\n\n/** What the credential source reads, fresh, on every resolve. */\nexport interface AthenaCredentialInputs {\n /**\n * The host's own getter (`config.getToken`). It owns renewal for its\n * sign-in, so it always wins; the held `token` is its fallback when it\n * resolves nothing.\n */\n hostGetToken?: AthenaStatewireTokenGetter;\n /** The token currently held: the host's, the sign-in provider's or the host bridge's. */\n token: string | null | undefined;\n /** How that token renews (the sign-in provider or the host bridge); absent for a static token. */\n renew?: AthenaTokenRenewer;\n}\n\n/**\n * The single place every SDK network path gets the token it presents — the\n * live thread connection, the session list's index and REST calls, uploads,\n * search, voice and the collaborative-document mint — read right before it is\n * presented.\n */\nexport interface AthenaCredentialSource {\n /**\n * The token to present now. `force` renews it first (the previous one was\n * refused). A token that has expired, or expires within\n * {@link TOKEN_EXPIRY_SKEW_MS}, is renewed before it is presented, so a tab\n * waking from sleep never presents a dead token. Concurrent renewals share\n * one in-flight request, and calls made while one is in flight wait for it\n * instead of presenting the token it is replacing. A renewal never hands one\n * account's token to a call made after the signed-in account changed.\n */\n getToken: (options?: { force?: boolean }) => Promise<string | null>;\n /** Called, with no arguments, whenever a different token becomes current. */\n subscribe: (listener: () => void) => () => void;\n /**\n * How many times the identity behind the token has changed: its JWT\n * subject, or the token itself when it is opaque. Renewals for the same\n * identity leave it alone. Long-lived connections key on it, so they keep\n * running across renewals and are rebuilt when someone else signs in,\n * including under a host `getToken`, whose identity is only known once a\n * token has been resolved. Subscribers hear when it moves.\n */\n identityEpoch: () => number;\n /**\n * How many times where the token acts has changed: its person (as\n * `identityEpoch` counts them) or the workspace or org its claims scope it\n * to (`jwtScope`). Renewals for the same person and scope leave it alone.\n * Caches of what the person may read key on it, so a host `getToken` that\n * hands out the same person's token for another workspace reads again under\n * new keys. Subscribers hear when it moves.\n */\n scopeEpoch: () => number;\n /** Tell subscribers the held token changed (the provider calls this when its inputs do). */\n notifyTokenChanged: () => void;\n}\n\n/** A token this close to its expiry is renewed before it is presented. */\nexport const TOKEN_EXPIRY_SKEW_MS = 30_000;\n\n/** The unverified claims of a JWT, or `null` for anything that is not one. */\nfunction jwtClaims(token: string): Record<string, unknown> | null {\n const payload = token.split('.')[1];\n if (!payload) return null;\n try {\n const base64 = payload.replace(/-/g, '+').replace(/_/g, '/');\n const padded = base64.padEnd(Math.ceil(base64.length / 4) * 4, '=');\n const claims: unknown = JSON.parse(atob(padded));\n return typeof claims === 'object' && claims !== null && !Array.isArray(claims)\n ? (claims as Record<string, unknown>)\n : null;\n } catch {\n return null;\n }\n}\n\n/**\n * The `exp` of a JWT, in milliseconds, or `null` for anything that is not a\n * JWT with a numeric `exp`. Read without verification: it only decides whether\n * to renew before presenting; the server still validates every token.\n */\nexport function jwtExpiresAtMs(token: string): number | null {\n const exp = jwtClaims(token)?.exp;\n return typeof exp === 'number' && Number.isFinite(exp) ? exp * 1000 : null;\n}\n\n/** The unverified `sub` of a JWT, or `null` for anything that is not a JWT with one. */\nexport function jwtSubject(token: string): string | null {\n const sub = jwtClaims(token)?.sub;\n return typeof sub === 'string' && sub.length > 0 ? sub : null;\n}\n\n/**\n * The unverified claims that scope a JWT to a workspace or org, as one stable\n * string, or `null` when it names none: Athena's `workspace_id` (an Office\n * session's token), `org_id` (an external sign-in's), and PropelAuth's\n * active-org `org_member_info.org_id`. Two of one person's tokens scoped to\n * different workspaces read differently; a renewal keeps it.\n */\nexport function jwtScope(token: string): string | null {\n const claims = jwtClaims(token);\n if (claims === null) return null;\n const orgMember = claims.org_member_info;\n const scope = [\n ['workspace_id', claims.workspace_id],\n ['org_id', claims.org_id],\n [\n 'org_member_info.org_id',\n typeof orgMember === 'object' && orgMember !== null\n ? (orgMember as Record<string, unknown>).org_id\n : undefined,\n ],\n ]\n .filter((entry): entry is [string, string] => typeof entry[1] === 'string' && entry[1].length > 0)\n .map(([claim, value]) => `${claim}=${value}`);\n return scope.length > 0 ? scope.join('\\u0000') : null;\n}\n\n/** True for a JWT that has expired or expires within {@link TOKEN_EXPIRY_SKEW_MS}. */\nexport function isTokenExpiring(token: string, now: number = Date.now()): boolean {\n const expiresAt = jwtExpiresAtMs(token);\n return expiresAt !== null && expiresAt - now <= TOKEN_EXPIRY_SKEW_MS;\n}\n\nexport function createAthenaCredentialSource(\n read: () => AthenaCredentialInputs,\n): AthenaCredentialSource {\n const listeners = new Set<() => void>();\n // The renewal in flight, and whether the host's getter runs it (the host\n // owns identity for its getter) or the sign-in provider's / bridge's renewer.\n let renewal: { token: Promise<string | null>; byHost: boolean } | null = null;\n let lastResolved: string | null = null;\n let identity: string | null = null;\n let identityEpoch = 0;\n let scope: string | null = null;\n let scopeEpoch = 0;\n\n const notifyListeners = () => {\n for (const listener of [...listeners]) listener();\n };\n\n /** Note who a token acts as; true when that is someone other than before. */\n const observeIdentity = (token: string | null | undefined): boolean => {\n if (!token) return false;\n const next = jwtSubject(token) ?? token;\n if (next === identity) return false;\n const changed = identity !== null;\n identity = next;\n if (changed) identityEpoch += 1;\n return changed;\n };\n\n /** Note who a token acts as and where (`jwtScope`); true when either differs from before. */\n const observeScope = (token: string | null | undefined): boolean => {\n if (!token) return false;\n const subject = jwtSubject(token);\n const next = subject === null ? token : `${subject}\\u0000${jwtScope(token) ?? ''}`;\n if (next === scope) return false;\n const changed = scope !== null;\n scope = next;\n if (changed) scopeEpoch += 1;\n return changed;\n };\n\n const notifyTokenChanged = () => {\n const token = read().token;\n observeIdentity(token);\n observeScope(token);\n notifyListeners();\n };\n\n /** Record what a resolve produced; a different token than the last one is news. */\n const settle = (token: string | null): string | null => {\n const identityChanged = observeIdentity(token);\n const scopeChanged = observeScope(token);\n if (token !== null && token !== lastResolved) {\n const replaced = lastResolved !== null;\n lastResolved = token;\n if (replaced || identityChanged || scopeChanged) notifyListeners();\n } else if (identityChanged || scopeChanged) {\n notifyListeners();\n }\n return token;\n };\n\n const shareRenewal = (\n start: () => Promise<string | null>,\n byHost: boolean,\n ): { token: Promise<string | null>; byHost: boolean } => {\n if (!renewal) {\n const entry = {\n token: start().finally(() => {\n if (renewal === entry) renewal = null;\n }),\n byHost,\n };\n renewal = entry;\n }\n return renewal;\n };\n\n /**\n * What a finished renewal hands one caller. A host getter's token is\n * presented as is: the host owns identity for its getter. A sign-in\n * provider's or bridge's renewed token is presented only while it acts as\n * the account the provider holds now. When the account changed while the\n * renewal was in flight (its JWT subject differs from the held token's, or\n * the provider holds no token any more), the held token, the current\n * account's, is presented instead. A renewal that produced nothing keeps\n * the held token: the caller presents it and the host's refusal ends the\n * attempt.\n */\n const presentable = (\n { byHost }: { byHost: boolean },\n renewed: string | null,\n ): string | null => {\n const held = read().token ?? null;\n if (byHost) return renewed ?? held;\n if (!renewed || !held) return held;\n const heldSubject = jwtSubject(held);\n const renewedSubject = jwtSubject(renewed);\n return heldSubject && renewedSubject && heldSubject !== renewedSubject ? held : renewed;\n };\n\n const awaitRenewal = async (shared: {\n token: Promise<string | null>;\n byHost: boolean;\n }): Promise<string | null> => settle(presentable(shared, await shared.token));\n\n const getToken = async ({ force = false }: { force?: boolean } = {}): Promise<string | null> => {\n if (renewal) return awaitRenewal(renewal);\n const inputs = read();\n const hostGetToken = inputs.hostGetToken;\n if (hostGetToken) {\n if (!force) return settle((await hostGetToken({ force: false })) ?? read().token ?? null);\n return awaitRenewal(\n shareRenewal(async () => (await hostGetToken({ force: true })) ?? null, true),\n );\n }\n const current = inputs.token ?? null;\n const renew = inputs.renew;\n if (!renew) return settle(current);\n const stale = force || (current !== null && isTokenExpiring(current));\n if (!stale) return settle(current);\n return awaitRenewal(shareRenewal(() => renew({ force: true }), false));\n };\n\n return {\n getToken,\n subscribe: (listener) => {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n notifyTokenChanged,\n identityEpoch: () => identityEpoch,\n scopeEpoch: () => scopeEpoch,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -412,8 +412,39 @@ function AthenaChatModeMenu({ className }) {
|
|
|
412
412
|
}
|
|
413
413
|
);
|
|
414
414
|
}
|
|
415
|
+
const PLAN_MODE_ON_HINT = "Plan mode is on: for multi-step work Athena writes a to-do plan and checks steps off as it goes. Click to turn it off.";
|
|
416
|
+
const PLAN_MODE_OFF_HINT = "Plan mode is off: Athena works without a to-do plan. Click to turn it on.";
|
|
417
|
+
function ChatPlanModeToggle({
|
|
418
|
+
value,
|
|
419
|
+
onChange,
|
|
420
|
+
disabled = false,
|
|
421
|
+
disabledReason,
|
|
422
|
+
className
|
|
423
|
+
}) {
|
|
424
|
+
const reason = disabled ? disabledReason ?? null : null;
|
|
425
|
+
return /* @__PURE__ */ jsxRuntime.jsx(DisabledReason, { reason, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
426
|
+
"button",
|
|
427
|
+
{
|
|
428
|
+
type: "button",
|
|
429
|
+
role: "switch",
|
|
430
|
+
"aria-checked": value,
|
|
431
|
+
"aria-label": "Plan mode",
|
|
432
|
+
"data-slot": "chat-plan-mode-toggle",
|
|
433
|
+
"data-state": value ? "on" : "off",
|
|
434
|
+
className: cnfast.cn(CHIP_CLASS, value && "bg-muted text-foreground", className),
|
|
435
|
+
disabled,
|
|
436
|
+
title: reason ?? (value ? PLAN_MODE_ON_HINT : PLAN_MODE_OFF_HINT),
|
|
437
|
+
onClick: () => onChange(!value),
|
|
438
|
+
children: [
|
|
439
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ListChecksIcon, { className: "size-3.5 shrink-0", "aria-hidden": true }),
|
|
440
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: "Plan" })
|
|
441
|
+
]
|
|
442
|
+
}
|
|
443
|
+
) });
|
|
444
|
+
}
|
|
415
445
|
exports.AthenaChatModeMenu = AthenaChatModeMenu;
|
|
416
446
|
exports.ChatAgentPicker = ChatAgentPicker;
|
|
417
447
|
exports.ChatModePicker = ChatModePicker;
|
|
418
448
|
exports.ChatModelPicker = ChatModelPicker;
|
|
449
|
+
exports.ChatPlanModeToggle = ChatPlanModeToggle;
|
|
419
450
|
//# sourceMappingURL=chat-pickers.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-pickers.cjs","sources":["../../src/catalog/chat-pickers.tsx"],"sourcesContent":["import { BotIcon, CheckIcon, ChevronDownIcon, LayersIcon, SparklesIcon } from 'lucide-react';\nimport { DropdownMenu } from 'radix-ui';\nimport { type ReactNode, useContext, useEffect, useRef, useState } from 'react';\nimport { usePortalContainer } from '../lib/owner-document';\nimport { portalSurfaceStyle } from '../lib/portal-surface';\nimport { cn } from '../lib/utils';\nimport { AthenaAgentSelectionContext } from '../provider/agent-selection-context';\nimport { useAthenaThemeStyle } from '../provider/theme-style-context';\nimport type { AthenaChatModeOption } from './agent-mode-menu';\nimport { agentAssetIdOf } from './agent-model-options';\nimport {\n type AthenaAgentModelOptions,\n groupModelsByProvider,\n resolveCatalogModelId,\n useAgentModelChoices,\n useAthenaAgentCatalog,\n useAthenaModelCatalog,\n} from './runtime-catalog';\nimport { useAthenaChatMode } from './use-athena-chat-mode';\n\n/**\n * The composer's agent and model pickers: compact chips for `AthenaChat`'s `toolbarStart` slot\n * that open a menu, as ChatGPT's and Codex's composers do. They are controlled: the host keeps the\n * choice (and remembers it if it likes) and passes it to `AthenaProvider` as `model` and\n * `agent=\"collab_agent:<id>\"`. New messages run with the choice. The menus are Radix radio menus,\n * so arrow keys, typeahead, Escape and focus return work as in any native menu.\n */\n\nconst CHIP_CLASS =\n 'inline-flex h-7 max-w-[14rem] items-center gap-1 rounded-md px-2 text-xs text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50';\n\n/** The chip without a menu: one choice, shown as a label. */\nconst STATIC_CHIP_CLASS =\n 'inline-flex h-7 max-w-[14rem] items-center gap-1 rounded-md px-2 text-xs text-muted-foreground';\n\nconst ITEM_CLASS =\n 'relative flex w-full cursor-default select-none items-center gap-2 rounded-sm py-1.5 pl-2 pr-7 text-sm outline-none data-[highlighted]:bg-muted data-[state=checked]:font-medium';\n\n/** The \"Agent's own model\" item's value: a chosen agent runs the model its author set. */\nconst AGENT_OWN_MODEL = '__agent_own_model__';\n\n/** What the chip says while a chosen agent's model is not known. */\nconst AGENT_MODEL_LABEL = 'Agent’s model';\n\n/** The menu body, portaled and themed like the SDK's popovers (it renders outside the provider). */\nfunction PickerMenu({ label, children }: { label: string; children: ReactNode }) {\n const themeStyle = useAthenaThemeStyle();\n const container = usePortalContainer();\n return (\n <DropdownMenu.Portal container={container}>\n <DropdownMenu.Content\n align=\"start\"\n sideOffset={4}\n collisionPadding={8}\n aria-label={label}\n // Its box and colours inline: no host stylesheet can take them away\n // (lib/portal-surface.ts).\n style={portalSurfaceStyle({ surface: 'popover', themeStyle })}\n className={cn(\n 'athena-sdk athena-sdk-chrome',\n 'z-50 block max-h-80 w-64 overflow-y-auto rounded-md border bg-popover p-1 text-popover-foreground shadow-md outline-none',\n )}\n >\n {children}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n );\n}\n\nfunction PickerItem({\n value,\n detail,\n children,\n}: {\n value: string;\n /** A second, muted line (the model behind an author's label, or why the item is listed). */\n detail?: ReactNode;\n children: ReactNode;\n}) {\n return (\n <DropdownMenu.RadioItem value={value} className={ITEM_CLASS}>\n {detail ? (\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"truncate\">{children}</span>\n <span className=\"truncate text-xs font-normal text-muted-foreground\">{detail}</span>\n </span>\n ) : (\n <span className=\"min-w-0 flex-1 truncate\">{children}</span>\n )}\n <DropdownMenu.ItemIndicator className=\"absolute right-2 inline-flex\">\n <CheckIcon className=\"size-3.5\" aria-hidden />\n </DropdownMenu.ItemIndicator>\n </DropdownMenu.RadioItem>\n );\n}\n\n/**\n * Where a chip disabled with a reason keeps it: a disabled button gets no pointer events, so its\n * reason is also the tooltip of a wrapper the pointer reaches (the button carries it as its own\n * description, for a screen reader). Without a reason, the chip alone.\n */\nfunction DisabledReason({ reason, children }: { reason: string | null; children: ReactNode }) {\n if (!reason) return <>{children}</>;\n return (\n <span className=\"inline-flex\" title={reason} data-slot=\"chat-picker-disabled-reason\">\n {children}\n </span>\n );\n}\n\n/**\n * A picker's menu, closed while the picker is disabled: one open when it turns disabled (Athena out\n * of reach while it shows) closes, and it opens again only on the person's next press, never by\n * itself once the picker is back. `choose` drops a choice made while disabled.\n */\nfunction usePickerMenu(disabled: boolean): {\n open: boolean;\n setOpen: (next: boolean) => void;\n choose: (apply: () => void) => void;\n} {\n const [open, setOpenState] = useState(false);\n if (disabled && open) setOpenState(false);\n return {\n open: open && !disabled,\n setOpen: (next) => setOpenState(next && !disabled),\n choose: (apply) => {\n if (!disabled) apply();\n },\n };\n}\n\nfunction PickerNote({ children, alert = false }: { children: ReactNode; alert?: boolean }) {\n return (\n <p\n className={cn('px-2 py-1.5 text-xs', alert ? 'text-destructive' : 'text-muted-foreground')}\n role={alert ? 'alert' : undefined}\n >\n {children}\n </p>\n );\n}\n\nexport interface ChatModelPickerProps {\n /** The chosen model id; `null` lets a selected agent run its own model. */\n value: string | null;\n onChange: (modelId: string | null) => void;\n /** The model a person who chose nothing runs, e.g. `claude-opus-5-5`. */\n defaultModelId: string;\n /**\n * A collab agent is chosen: the picker offers the workspace's models and\n * \"Agent's own model\" (`null`), as before, unless the agent restricts its\n * models (its \"Allow any workspace model\" switch is off), when it offers\n * exactly the agent's own (`useAthenaAgentModelOptions`). Which agent:\n * `agent`, else the one the surrounding `AthenaProvider` runs as.\n */\n agentSelected?: boolean;\n /**\n * The chosen collab agent, as its asset id or `collab_agent:<id>` (implies\n * `agentSelected`). `null` is no agent.\n */\n agent?: string | null;\n /**\n * The collab channel the chat runs on (its model override is the default\n * there). Defaults to the provider's `channel` when the agent is the\n * provider's.\n */\n channel?: string | null;\n disabled?: boolean;\n /**\n * Why the picker is disabled (e.g. \"Needs a connection…\" while the host knows Athena can't be\n * reached), shown as its tooltip while `disabled`.\n */\n disabledReason?: string;\n className?: string;\n}\n\n/**\n * Which model new messages run, from the models the workspace allows this\n * person; with an agent chosen, also \"Agent's own model\" (`null`), or exactly\n * the models its author listed when the agent restricts its models\n * (`allowAnyModel: false`, opt-in per agent). The host passes the choice to\n * `AthenaProvider` as `model`; a change reaches an open session too (the\n * provider writes it to the session's server config).\n */\nexport function ChatModelPicker({\n value,\n onChange,\n defaultModelId,\n agentSelected = false,\n agent,\n channel,\n disabled = false,\n disabledReason,\n className,\n}: ChatModelPickerProps) {\n const providerSelection = useContext(AthenaAgentSelectionContext);\n const agentAssetId =\n agent !== undefined\n ? agentAssetIdOf(agent)\n : agentSelected\n ? (providerSelection?.agentAssetId ?? null)\n : null;\n if (agentAssetId !== null) {\n const agentChannel =\n channel !== undefined\n ? channel\n : providerSelection?.agentAssetId === agentAssetId\n ? providerSelection.channel\n : null;\n return (\n <AgentAwareModelPicker\n agentAssetId={agentAssetId}\n channel={agentChannel}\n value={value}\n onChange={onChange}\n defaultModelId={defaultModelId}\n disabled={disabled}\n disabledReason={disabledReason}\n className={className}\n />\n );\n }\n return (\n <WorkspaceModelPicker\n value={value}\n onChange={onChange}\n defaultModelId={defaultModelId}\n agentSelected={agentSelected}\n disabled={disabled}\n disabledReason={disabledReason}\n className={className}\n />\n );\n}\n\n/**\n * The picker with a collab agent chosen. The agent is read first: one that\n * restricts its models gets {@link AgentModelMenu}; every other agent (the\n * default, and one this person cannot read) gets the workspace menu as before,\n * its \"Agent's own model\" naming the agent's default when known. Until the\n * read settles the workspace menu shows but replaces nothing on the host's\n * behalf, since the host's model may be one only the agent offers.\n */\nfunction AgentAwareModelPicker({\n agentAssetId,\n channel,\n value,\n onChange,\n defaultModelId,\n disabled,\n disabledReason,\n className,\n}: {\n agentAssetId: string;\n channel: string | null;\n value: string | null;\n onChange: (modelId: string | null) => void;\n defaultModelId: string;\n disabled: boolean;\n disabledReason?: string;\n className?: string;\n}) {\n // One query client for the agent read and the catalog both menus name models from.\n const { choices, modelLabel, catalog } = useAgentModelChoices({ agent: agentAssetId, channel });\n if (choices.status === 'ready' && !choices.allowAnyModel) {\n return (\n <AgentModelMenu\n choices={choices}\n modelLabel={modelLabel}\n value={value}\n onChange={onChange}\n disabled={disabled}\n disabledReason={disabledReason}\n className={className}\n />\n );\n }\n return (\n <WorkspaceModelMenu\n catalog={catalog}\n value={value}\n onChange={onChange}\n defaultModelId={defaultModelId}\n agentSelected\n agentDefaultLabel={choices.defaultModel === null ? null : modelLabel(choices.defaultModel)}\n holdReplacement={choices.status === 'loading'}\n disabled={disabled}\n disabledReason={disabledReason}\n className={className}\n />\n );\n}\n\n/** The model picker over the workspace's catalog, with no agent chosen (or none it can name). */\nfunction WorkspaceModelPicker(props: {\n value: string | null;\n onChange: (modelId: string | null) => void;\n defaultModelId: string;\n agentSelected: boolean;\n disabled: boolean;\n disabledReason?: string;\n className?: string;\n}) {\n const catalog = useAthenaModelCatalog();\n return <WorkspaceModelMenu catalog={catalog} {...props} />;\n}\n\n/** The workspace catalog's menu (the picker as it was before agents could restrict models). */\nfunction WorkspaceModelMenu({\n catalog,\n value,\n onChange,\n defaultModelId,\n agentSelected,\n agentDefaultLabel = null,\n holdReplacement = false,\n disabled,\n disabledReason,\n className,\n}: {\n catalog: ReturnType<typeof useAthenaModelCatalog>;\n value: string | null;\n onChange: (modelId: string | null) => void;\n defaultModelId: string;\n agentSelected: boolean;\n /** The chosen agent's default model (its channel's override when it has one), named under \"Agent's own model\". */\n agentDefaultLabel?: string | null;\n /** Replace no unoffered choice yet (the chosen agent is still being read). */\n holdReplacement?: boolean;\n disabled: boolean;\n disabledReason?: string;\n className?: string;\n}) {\n const { open, setOpen, choose } = usePickerMenu(disabled);\n const models = catalog.data ?? [];\n const reason = disabled ? (disabledReason ?? null) : null;\n const resolved =\n value === null && agentSelected\n ? null\n : resolveCatalogModelId({ stored: value, defaultModelId, models });\n const current = models.find((model) => model.id === resolved);\n const label = resolved === null ? 'Agent’s model' : (current?.label ?? resolved);\n // The host's choice is no longer offered (retired, or the workspace stopped allowing it): hand\n // the host the model the chip shows, so new messages run it instead of the dropped id. Once per\n // choice, so a host that keeps the old value is not asked again on every render.\n const replacedRef = useRef<string | null>(null);\n useEffect(() => {\n if (holdReplacement) return;\n if (!catalog.isSuccess || value === null || resolved === null || resolved === value) return;\n if (models.some((model) => model.id === value) || replacedRef.current === value) return;\n replacedRef.current = value;\n onChange(resolved);\n }, [holdReplacement, catalog.isSuccess, models, value, resolved, onChange]);\n return (\n <DisabledReason reason={reason}>\n <DropdownMenu.Root open={open} onOpenChange={setOpen}>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className={cn(CHIP_CLASS, className)}\n disabled={disabled}\n title={reason ?? undefined}\n aria-label={`Model: ${label}`}\n >\n <SparklesIcon className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{label}</span>\n <ChevronDownIcon className=\"size-3 shrink-0\" aria-hidden />\n </button>\n </DropdownMenu.Trigger>\n <PickerMenu label=\"Model\">\n <DropdownMenu.RadioGroup\n value={resolved ?? AGENT_OWN_MODEL}\n onValueChange={(next) => choose(() => onChange(next === AGENT_OWN_MODEL ? null : next))}\n >\n {agentSelected && (\n <PickerItem value={AGENT_OWN_MODEL} detail={agentDefaultLabel}>\n Agent’s own model\n </PickerItem>\n )}\n {catalog.isPending && <PickerNote>Loading models…</PickerNote>}\n {catalog.isError && <PickerNote alert>Couldn’t load the models. Try again in a moment.</PickerNote>}\n {groupModelsByProvider({ models }).map((group) => (\n <DropdownMenu.Group key={group.provider}>\n <DropdownMenu.Label className=\"px-2 pb-0.5 pt-1.5 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n {group.provider}\n </DropdownMenu.Label>\n {group.models.map((model) => (\n <PickerItem key={model.id} value={model.id}>\n {model.label}\n {model.status === 'LEGACY' ? ' (legacy)' : ''}\n </PickerItem>\n ))}\n </DropdownMenu.Group>\n ))}\n </DropdownMenu.RadioGroup>\n </PickerMenu>\n </DropdownMenu.Root>\n </DisabledReason>\n );\n}\n\n/** One item of the agent's model menu. */\ninterface AgentModelItem {\n /** The radio value: a model id, or {@link AGENT_OWN_MODEL} for \"the agent's default\" (`null`). */\n value: string;\n label: string;\n isDefault: boolean;\n detail: string | null;\n}\n\n/**\n * The menu of a chosen collab agent that restricts its models: exactly its own\n * (`useAthenaAgentModelOptions`), the default as `null`. One choice is a label;\n * two or more a menu. Nothing is replaced on the host's behalf: a host choice\n * the agent does not list (an older pick) is shown and listed as it is, as is\n * a model the session pins outside the agent's list. A host choice that names\n * the default model explicitly is a pin, which the agent's next default would\n * not follow, so the menu then also offers \"Agent's own model\" (`null`).\n */\nfunction AgentModelMenu({\n choices,\n modelLabel,\n value,\n onChange,\n disabled,\n disabledReason,\n className,\n}: {\n choices: AthenaAgentModelOptions;\n modelLabel: (model: string) => string;\n value: string | null;\n onChange: (modelId: string | null) => void;\n disabled: boolean;\n disabledReason?: string;\n className?: string;\n}) {\n const { open, setOpen, choose } = usePickerMenu(disabled);\n const reason = disabled ? (disabledReason ?? null) : null;\n const pinsDefault = value !== null && value === choices.defaultModel;\n const items: AgentModelItem[] = choices.options.map((option) => {\n const display = modelLabel(option.model);\n return {\n value: option.isDefault && !pinsDefault ? AGENT_OWN_MODEL : option.model,\n label: option.label,\n isDefault: option.isDefault,\n detail: option.pinnedOutside\n ? 'Set for this conversation outside the agent'\n : display === option.label\n ? null\n : display,\n };\n });\n if (value !== null && !choices.options.some((option) => option.model === value)) {\n items.push({\n value,\n label: modelLabel(value),\n isDefault: false,\n detail: 'Not one of the agent’s models',\n });\n }\n if (pinsDefault) {\n items.push({\n value: AGENT_OWN_MODEL,\n label: 'Agent’s own model',\n isDefault: false,\n detail: 'Follows the agent’s default',\n });\n }\n const selectedValue = value ?? AGENT_OWN_MODEL;\n const selected = items.find((item) => item.value === selectedValue) ?? null;\n const label = selected?.label || AGENT_MODEL_LABEL;\n\n if (items.length < 2) {\n return (\n <span\n role=\"img\"\n aria-label={`Model: ${label}`}\n title={selected ? `This agent runs ${label}` : 'This agent runs its own model'}\n data-slot=\"chat-model-picker-label\"\n className={cn(STATIC_CHIP_CLASS, className)}\n >\n <SparklesIcon className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{label}</span>\n </span>\n );\n }\n return (\n <DisabledReason reason={reason}>\n <DropdownMenu.Root open={open} onOpenChange={setOpen}>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className={cn(CHIP_CLASS, className)}\n disabled={disabled}\n title={reason ?? undefined}\n aria-label={`Model: ${label}`}\n >\n <SparklesIcon className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{label}</span>\n <ChevronDownIcon className=\"size-3 shrink-0\" aria-hidden />\n </button>\n </DropdownMenu.Trigger>\n <PickerMenu label=\"Model\">\n <DropdownMenu.RadioGroup\n value={selectedValue}\n onValueChange={(next) => choose(() => onChange(next === AGENT_OWN_MODEL ? null : next))}\n >\n <DropdownMenu.Label className=\"px-2 pb-0.5 pt-1.5 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n Agent models\n </DropdownMenu.Label>\n {items.map((item) => (\n <PickerItem key={item.value} value={item.value} detail={item.detail}>\n {item.label}\n {item.isDefault ? ' (default)' : ''}\n </PickerItem>\n ))}\n </DropdownMenu.RadioGroup>\n </PickerMenu>\n </DropdownMenu.Root>\n </DisabledReason>\n );\n}\n\nexport interface ChatAgentPickerProps {\n /** The chosen collab agent's asset id; `null` is Athena. */\n value: string | null;\n onChange: (agentId: string | null) => void;\n disabled?: boolean;\n /**\n * Why the picker is disabled (e.g. \"Needs a connection…\" while the host knows Athena can't be\n * reached), shown as its tooltip while `disabled`.\n */\n disabledReason?: string;\n className?: string;\n}\n\n/** The \"Athena\" item's value: no collab agent. */\nconst NO_AGENT = '__athena__';\n\n/** Who answers new messages: Athena, or a published collab agent the person can see. */\nexport function ChatAgentPicker({\n value,\n onChange,\n disabled = false,\n disabledReason,\n className,\n}: ChatAgentPickerProps) {\n const catalog = useAthenaAgentCatalog();\n const { open, setOpen, choose } = usePickerMenu(disabled);\n const reason = disabled ? (disabledReason ?? null) : null;\n const agents = catalog.data ?? [];\n const label = value === null ? 'Athena' : (agents.find((agent) => agent.id === value)?.name ?? 'Agent');\n // The chosen agent is gone (unpublished, or no longer shared with this person): fall back to\n // Athena, so new messages do not target an agent they cannot reach. Once per choice.\n const clearedRef = useRef<string | null>(null);\n useEffect(() => {\n if (!catalog.isSuccess || value === null || clearedRef.current === value) return;\n if (agents.some((agent) => agent.id === value)) return;\n clearedRef.current = value;\n onChange(null);\n }, [catalog.isSuccess, agents, value, onChange]);\n return (\n <DisabledReason reason={reason}>\n <DropdownMenu.Root open={open} onOpenChange={setOpen}>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className={cn(CHIP_CLASS, className)}\n disabled={disabled}\n title={reason ?? undefined}\n aria-label={`Agent: ${label}`}\n >\n <BotIcon className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{label}</span>\n <ChevronDownIcon className=\"size-3 shrink-0\" aria-hidden />\n </button>\n </DropdownMenu.Trigger>\n <PickerMenu label=\"Agent\">\n <DropdownMenu.RadioGroup\n value={value ?? NO_AGENT}\n onValueChange={(next) => choose(() => onChange(next === NO_AGENT ? null : next))}\n >\n <PickerItem value={NO_AGENT}>Athena</PickerItem>\n {catalog.isError && <PickerNote alert>Couldn’t load the agents. Try again in a moment.</PickerNote>}\n {agents.map((agent) => (\n <PickerItem key={agent.id} value={agent.id}>\n {agent.name}\n </PickerItem>\n ))}\n </DropdownMenu.RadioGroup>\n </PickerMenu>\n </DropdownMenu.Root>\n </DisabledReason>\n );\n}\n\nexport interface ChatModePickerProps {\n /** The mode the session runs in: `base` or a mode's id. */\n value: string;\n /** The modes to offer. */\n options: readonly AthenaChatModeOption[];\n onChange: (modeId: string) => void;\n /** The name of `value` when it is none of `options`. */\n valueLabel?: string;\n disabled?: boolean;\n /** Why the picker is disabled, shown as its tooltip. */\n disabledReason?: string;\n className?: string;\n}\n\n/**\n * Which of the agent's modes the chat runs in, as a chip with a radio menu\n * like the other composer pickers. Controlled: `useAthenaChatMode` gives the\n * options, the current mode and `select`, which `AthenaChat`'s built-in menu\n * ({@link AthenaChatModeMenu}) wires up for you.\n */\nexport function ChatModePicker({\n value,\n options,\n onChange,\n valueLabel,\n disabled = false,\n disabledReason,\n className,\n}: ChatModePickerProps) {\n const { open, setOpen, choose } = usePickerMenu(disabled);\n const label = options.find((option) => option.id === value)?.label ?? valueLabel ?? value;\n const reason = disabled ? (disabledReason ?? null) : null;\n return (\n <DisabledReason reason={reason}>\n <DropdownMenu.Root open={open} onOpenChange={setOpen}>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className={cn(CHIP_CLASS, className)}\n disabled={disabled}\n title={reason ?? undefined}\n aria-label={`Mode: ${label}`}\n data-slot=\"chat-mode-picker\"\n >\n <LayersIcon className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{label}</span>\n <ChevronDownIcon className=\"size-3 shrink-0\" aria-hidden />\n </button>\n </DropdownMenu.Trigger>\n <PickerMenu label=\"Mode\">\n <DropdownMenu.RadioGroup value={value} onValueChange={(next) => choose(() => onChange(next))}>\n {options.map((option) => (\n <PickerItem key={option.id} value={option.id}>\n {option.label}\n </PickerItem>\n ))}\n </DropdownMenu.RadioGroup>\n </PickerMenu>\n </DropdownMenu.Root>\n </DisabledReason>\n );\n}\n\n/**\n * `AthenaChat`'s mode menu: {@link ChatModePicker} over `useAthenaChatMode`,\n * shown only while the provider's `modes` give the chat two or more modes.\n */\nexport function AthenaChatModeMenu({ className }: { className?: string }) {\n const mode = useAthenaChatMode();\n if (mode.status !== 'ready') return null;\n return (\n <ChatModePicker\n value={mode.current}\n valueLabel={mode.currentLabel}\n options={mode.options}\n onChange={mode.select}\n disabled={!mode.canSwitch}\n disabledReason=\"This channel keeps each conversation in the mode it started in. Start a new conversation to pick another.\"\n className={className}\n />\n );\n}\n"],"names":["useAthenaThemeStyle","usePortalContainer","jsx","DropdownMenu","portalSurfaceStyle","cn","jsxs","CheckIcon","Fragment","useState","useContext","AthenaAgentSelectionContext","agentAssetIdOf","useAgentModelChoices","useAthenaModelCatalog","resolveCatalogModelId","useRef","useEffect","SparklesIcon","ChevronDownIcon","groupModelsByProvider","useAthenaAgentCatalog","BotIcon","LayersIcon","useAthenaChatMode"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chat-pickers.cjs","sources":["../../src/catalog/chat-pickers.tsx"],"sourcesContent":["import { BotIcon, CheckIcon, ChevronDownIcon, LayersIcon, ListChecksIcon, SparklesIcon } from 'lucide-react';\nimport { DropdownMenu } from 'radix-ui';\nimport { type ReactNode, useContext, useEffect, useRef, useState } from 'react';\nimport { usePortalContainer } from '../lib/owner-document';\nimport { portalSurfaceStyle } from '../lib/portal-surface';\nimport { cn } from '../lib/utils';\nimport { AthenaAgentSelectionContext } from '../provider/agent-selection-context';\nimport { useAthenaThemeStyle } from '../provider/theme-style-context';\nimport type { AthenaChatModeOption } from './agent-mode-menu';\nimport { agentAssetIdOf } from './agent-model-options';\nimport {\n type AthenaAgentModelOptions,\n groupModelsByProvider,\n resolveCatalogModelId,\n useAgentModelChoices,\n useAthenaAgentCatalog,\n useAthenaModelCatalog,\n} from './runtime-catalog';\nimport { useAthenaChatMode } from './use-athena-chat-mode';\n\n/**\n * The composer's agent and model pickers: compact chips for `AthenaChat`'s `toolbarStart` slot\n * that open a menu, as ChatGPT's and Codex's composers do. They are controlled: the host keeps the\n * choice (and remembers it if it likes) and passes it to `AthenaProvider` as `model` and\n * `agent=\"collab_agent:<id>\"`. New messages run with the choice. The menus are Radix radio menus,\n * so arrow keys, typeahead, Escape and focus return work as in any native menu.\n */\n\nconst CHIP_CLASS =\n 'inline-flex h-7 max-w-[14rem] items-center gap-1 rounded-md px-2 text-xs text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50';\n\n/** The chip without a menu: one choice, shown as a label. */\nconst STATIC_CHIP_CLASS =\n 'inline-flex h-7 max-w-[14rem] items-center gap-1 rounded-md px-2 text-xs text-muted-foreground';\n\nconst ITEM_CLASS =\n 'relative flex w-full cursor-default select-none items-center gap-2 rounded-sm py-1.5 pl-2 pr-7 text-sm outline-none data-[highlighted]:bg-muted data-[state=checked]:font-medium';\n\n/** The \"Agent's own model\" item's value: a chosen agent runs the model its author set. */\nconst AGENT_OWN_MODEL = '__agent_own_model__';\n\n/** What the chip says while a chosen agent's model is not known. */\nconst AGENT_MODEL_LABEL = 'Agent’s model';\n\n/** The menu body, portaled and themed like the SDK's popovers (it renders outside the provider). */\nfunction PickerMenu({ label, children }: { label: string; children: ReactNode }) {\n const themeStyle = useAthenaThemeStyle();\n const container = usePortalContainer();\n return (\n <DropdownMenu.Portal container={container}>\n <DropdownMenu.Content\n align=\"start\"\n sideOffset={4}\n collisionPadding={8}\n aria-label={label}\n // Its box and colours inline: no host stylesheet can take them away\n // (lib/portal-surface.ts).\n style={portalSurfaceStyle({ surface: 'popover', themeStyle })}\n className={cn(\n 'athena-sdk athena-sdk-chrome',\n 'z-50 block max-h-80 w-64 overflow-y-auto rounded-md border bg-popover p-1 text-popover-foreground shadow-md outline-none',\n )}\n >\n {children}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n );\n}\n\nfunction PickerItem({\n value,\n detail,\n children,\n}: {\n value: string;\n /** A second, muted line (the model behind an author's label, or why the item is listed). */\n detail?: ReactNode;\n children: ReactNode;\n}) {\n return (\n <DropdownMenu.RadioItem value={value} className={ITEM_CLASS}>\n {detail ? (\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"truncate\">{children}</span>\n <span className=\"truncate text-xs font-normal text-muted-foreground\">{detail}</span>\n </span>\n ) : (\n <span className=\"min-w-0 flex-1 truncate\">{children}</span>\n )}\n <DropdownMenu.ItemIndicator className=\"absolute right-2 inline-flex\">\n <CheckIcon className=\"size-3.5\" aria-hidden />\n </DropdownMenu.ItemIndicator>\n </DropdownMenu.RadioItem>\n );\n}\n\n/**\n * Where a chip disabled with a reason keeps it: a disabled button gets no pointer events, so its\n * reason is also the tooltip of a wrapper the pointer reaches (the button carries it as its own\n * description, for a screen reader). Without a reason, the chip alone.\n */\nfunction DisabledReason({ reason, children }: { reason: string | null; children: ReactNode }) {\n if (!reason) return <>{children}</>;\n return (\n <span className=\"inline-flex\" title={reason} data-slot=\"chat-picker-disabled-reason\">\n {children}\n </span>\n );\n}\n\n/**\n * A picker's menu, closed while the picker is disabled: one open when it turns disabled (Athena out\n * of reach while it shows) closes, and it opens again only on the person's next press, never by\n * itself once the picker is back. `choose` drops a choice made while disabled.\n */\nfunction usePickerMenu(disabled: boolean): {\n open: boolean;\n setOpen: (next: boolean) => void;\n choose: (apply: () => void) => void;\n} {\n const [open, setOpenState] = useState(false);\n if (disabled && open) setOpenState(false);\n return {\n open: open && !disabled,\n setOpen: (next) => setOpenState(next && !disabled),\n choose: (apply) => {\n if (!disabled) apply();\n },\n };\n}\n\nfunction PickerNote({ children, alert = false }: { children: ReactNode; alert?: boolean }) {\n return (\n <p\n className={cn('px-2 py-1.5 text-xs', alert ? 'text-destructive' : 'text-muted-foreground')}\n role={alert ? 'alert' : undefined}\n >\n {children}\n </p>\n );\n}\n\nexport interface ChatModelPickerProps {\n /** The chosen model id; `null` lets a selected agent run its own model. */\n value: string | null;\n onChange: (modelId: string | null) => void;\n /** The model a person who chose nothing runs, e.g. `claude-opus-5-5`. */\n defaultModelId: string;\n /**\n * A collab agent is chosen: the picker offers the workspace's models and\n * \"Agent's own model\" (`null`), as before, unless the agent restricts its\n * models (its \"Allow any workspace model\" switch is off), when it offers\n * exactly the agent's own (`useAthenaAgentModelOptions`). Which agent:\n * `agent`, else the one the surrounding `AthenaProvider` runs as.\n */\n agentSelected?: boolean;\n /**\n * The chosen collab agent, as its asset id or `collab_agent:<id>` (implies\n * `agentSelected`). `null` is no agent.\n */\n agent?: string | null;\n /**\n * The collab channel the chat runs on (its model override is the default\n * there). Defaults to the provider's `channel` when the agent is the\n * provider's.\n */\n channel?: string | null;\n disabled?: boolean;\n /**\n * Why the picker is disabled (e.g. \"Needs a connection…\" while the host knows Athena can't be\n * reached), shown as its tooltip while `disabled`.\n */\n disabledReason?: string;\n className?: string;\n}\n\n/**\n * Which model new messages run, from the models the workspace allows this\n * person; with an agent chosen, also \"Agent's own model\" (`null`), or exactly\n * the models its author listed when the agent restricts its models\n * (`allowAnyModel: false`, opt-in per agent). The host passes the choice to\n * `AthenaProvider` as `model`; a change reaches an open session too (the\n * provider writes it to the session's server config).\n */\nexport function ChatModelPicker({\n value,\n onChange,\n defaultModelId,\n agentSelected = false,\n agent,\n channel,\n disabled = false,\n disabledReason,\n className,\n}: ChatModelPickerProps) {\n const providerSelection = useContext(AthenaAgentSelectionContext);\n const agentAssetId =\n agent !== undefined\n ? agentAssetIdOf(agent)\n : agentSelected\n ? (providerSelection?.agentAssetId ?? null)\n : null;\n if (agentAssetId !== null) {\n const agentChannel =\n channel !== undefined\n ? channel\n : providerSelection?.agentAssetId === agentAssetId\n ? providerSelection.channel\n : null;\n return (\n <AgentAwareModelPicker\n agentAssetId={agentAssetId}\n channel={agentChannel}\n value={value}\n onChange={onChange}\n defaultModelId={defaultModelId}\n disabled={disabled}\n disabledReason={disabledReason}\n className={className}\n />\n );\n }\n return (\n <WorkspaceModelPicker\n value={value}\n onChange={onChange}\n defaultModelId={defaultModelId}\n agentSelected={agentSelected}\n disabled={disabled}\n disabledReason={disabledReason}\n className={className}\n />\n );\n}\n\n/**\n * The picker with a collab agent chosen. The agent is read first: one that\n * restricts its models gets {@link AgentModelMenu}; every other agent (the\n * default, and one this person cannot read) gets the workspace menu as before,\n * its \"Agent's own model\" naming the agent's default when known. Until the\n * read settles the workspace menu shows but replaces nothing on the host's\n * behalf, since the host's model may be one only the agent offers.\n */\nfunction AgentAwareModelPicker({\n agentAssetId,\n channel,\n value,\n onChange,\n defaultModelId,\n disabled,\n disabledReason,\n className,\n}: {\n agentAssetId: string;\n channel: string | null;\n value: string | null;\n onChange: (modelId: string | null) => void;\n defaultModelId: string;\n disabled: boolean;\n disabledReason?: string;\n className?: string;\n}) {\n // One query client for the agent read and the catalog both menus name models from.\n const { choices, modelLabel, catalog } = useAgentModelChoices({ agent: agentAssetId, channel });\n if (choices.status === 'ready' && !choices.allowAnyModel) {\n return (\n <AgentModelMenu\n choices={choices}\n modelLabel={modelLabel}\n value={value}\n onChange={onChange}\n disabled={disabled}\n disabledReason={disabledReason}\n className={className}\n />\n );\n }\n return (\n <WorkspaceModelMenu\n catalog={catalog}\n value={value}\n onChange={onChange}\n defaultModelId={defaultModelId}\n agentSelected\n agentDefaultLabel={choices.defaultModel === null ? null : modelLabel(choices.defaultModel)}\n holdReplacement={choices.status === 'loading'}\n disabled={disabled}\n disabledReason={disabledReason}\n className={className}\n />\n );\n}\n\n/** The model picker over the workspace's catalog, with no agent chosen (or none it can name). */\nfunction WorkspaceModelPicker(props: {\n value: string | null;\n onChange: (modelId: string | null) => void;\n defaultModelId: string;\n agentSelected: boolean;\n disabled: boolean;\n disabledReason?: string;\n className?: string;\n}) {\n const catalog = useAthenaModelCatalog();\n return <WorkspaceModelMenu catalog={catalog} {...props} />;\n}\n\n/** The workspace catalog's menu (the picker as it was before agents could restrict models). */\nfunction WorkspaceModelMenu({\n catalog,\n value,\n onChange,\n defaultModelId,\n agentSelected,\n agentDefaultLabel = null,\n holdReplacement = false,\n disabled,\n disabledReason,\n className,\n}: {\n catalog: ReturnType<typeof useAthenaModelCatalog>;\n value: string | null;\n onChange: (modelId: string | null) => void;\n defaultModelId: string;\n agentSelected: boolean;\n /** The chosen agent's default model (its channel's override when it has one), named under \"Agent's own model\". */\n agentDefaultLabel?: string | null;\n /** Replace no unoffered choice yet (the chosen agent is still being read). */\n holdReplacement?: boolean;\n disabled: boolean;\n disabledReason?: string;\n className?: string;\n}) {\n const { open, setOpen, choose } = usePickerMenu(disabled);\n const models = catalog.data ?? [];\n const reason = disabled ? (disabledReason ?? null) : null;\n const resolved =\n value === null && agentSelected\n ? null\n : resolveCatalogModelId({ stored: value, defaultModelId, models });\n const current = models.find((model) => model.id === resolved);\n const label = resolved === null ? 'Agent’s model' : (current?.label ?? resolved);\n // The host's choice is no longer offered (retired, or the workspace stopped allowing it): hand\n // the host the model the chip shows, so new messages run it instead of the dropped id. Once per\n // choice, so a host that keeps the old value is not asked again on every render.\n const replacedRef = useRef<string | null>(null);\n useEffect(() => {\n if (holdReplacement) return;\n if (!catalog.isSuccess || value === null || resolved === null || resolved === value) return;\n if (models.some((model) => model.id === value) || replacedRef.current === value) return;\n replacedRef.current = value;\n onChange(resolved);\n }, [holdReplacement, catalog.isSuccess, models, value, resolved, onChange]);\n return (\n <DisabledReason reason={reason}>\n <DropdownMenu.Root open={open} onOpenChange={setOpen}>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className={cn(CHIP_CLASS, className)}\n disabled={disabled}\n title={reason ?? undefined}\n aria-label={`Model: ${label}`}\n >\n <SparklesIcon className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{label}</span>\n <ChevronDownIcon className=\"size-3 shrink-0\" aria-hidden />\n </button>\n </DropdownMenu.Trigger>\n <PickerMenu label=\"Model\">\n <DropdownMenu.RadioGroup\n value={resolved ?? AGENT_OWN_MODEL}\n onValueChange={(next) => choose(() => onChange(next === AGENT_OWN_MODEL ? null : next))}\n >\n {agentSelected && (\n <PickerItem value={AGENT_OWN_MODEL} detail={agentDefaultLabel}>\n Agent’s own model\n </PickerItem>\n )}\n {catalog.isPending && <PickerNote>Loading models…</PickerNote>}\n {catalog.isError && <PickerNote alert>Couldn’t load the models. Try again in a moment.</PickerNote>}\n {groupModelsByProvider({ models }).map((group) => (\n <DropdownMenu.Group key={group.provider}>\n <DropdownMenu.Label className=\"px-2 pb-0.5 pt-1.5 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n {group.provider}\n </DropdownMenu.Label>\n {group.models.map((model) => (\n <PickerItem key={model.id} value={model.id}>\n {model.label}\n {model.status === 'LEGACY' ? ' (legacy)' : ''}\n </PickerItem>\n ))}\n </DropdownMenu.Group>\n ))}\n </DropdownMenu.RadioGroup>\n </PickerMenu>\n </DropdownMenu.Root>\n </DisabledReason>\n );\n}\n\n/** One item of the agent's model menu. */\ninterface AgentModelItem {\n /** The radio value: a model id, or {@link AGENT_OWN_MODEL} for \"the agent's default\" (`null`). */\n value: string;\n label: string;\n isDefault: boolean;\n detail: string | null;\n}\n\n/**\n * The menu of a chosen collab agent that restricts its models: exactly its own\n * (`useAthenaAgentModelOptions`), the default as `null`. One choice is a label;\n * two or more a menu. Nothing is replaced on the host's behalf: a host choice\n * the agent does not list (an older pick) is shown and listed as it is, as is\n * a model the session pins outside the agent's list. A host choice that names\n * the default model explicitly is a pin, which the agent's next default would\n * not follow, so the menu then also offers \"Agent's own model\" (`null`).\n */\nfunction AgentModelMenu({\n choices,\n modelLabel,\n value,\n onChange,\n disabled,\n disabledReason,\n className,\n}: {\n choices: AthenaAgentModelOptions;\n modelLabel: (model: string) => string;\n value: string | null;\n onChange: (modelId: string | null) => void;\n disabled: boolean;\n disabledReason?: string;\n className?: string;\n}) {\n const { open, setOpen, choose } = usePickerMenu(disabled);\n const reason = disabled ? (disabledReason ?? null) : null;\n const pinsDefault = value !== null && value === choices.defaultModel;\n const items: AgentModelItem[] = choices.options.map((option) => {\n const display = modelLabel(option.model);\n return {\n value: option.isDefault && !pinsDefault ? AGENT_OWN_MODEL : option.model,\n label: option.label,\n isDefault: option.isDefault,\n detail: option.pinnedOutside\n ? 'Set for this conversation outside the agent'\n : display === option.label\n ? null\n : display,\n };\n });\n if (value !== null && !choices.options.some((option) => option.model === value)) {\n items.push({\n value,\n label: modelLabel(value),\n isDefault: false,\n detail: 'Not one of the agent’s models',\n });\n }\n if (pinsDefault) {\n items.push({\n value: AGENT_OWN_MODEL,\n label: 'Agent’s own model',\n isDefault: false,\n detail: 'Follows the agent’s default',\n });\n }\n const selectedValue = value ?? AGENT_OWN_MODEL;\n const selected = items.find((item) => item.value === selectedValue) ?? null;\n const label = selected?.label || AGENT_MODEL_LABEL;\n\n if (items.length < 2) {\n return (\n <span\n role=\"img\"\n aria-label={`Model: ${label}`}\n title={selected ? `This agent runs ${label}` : 'This agent runs its own model'}\n data-slot=\"chat-model-picker-label\"\n className={cn(STATIC_CHIP_CLASS, className)}\n >\n <SparklesIcon className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{label}</span>\n </span>\n );\n }\n return (\n <DisabledReason reason={reason}>\n <DropdownMenu.Root open={open} onOpenChange={setOpen}>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className={cn(CHIP_CLASS, className)}\n disabled={disabled}\n title={reason ?? undefined}\n aria-label={`Model: ${label}`}\n >\n <SparklesIcon className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{label}</span>\n <ChevronDownIcon className=\"size-3 shrink-0\" aria-hidden />\n </button>\n </DropdownMenu.Trigger>\n <PickerMenu label=\"Model\">\n <DropdownMenu.RadioGroup\n value={selectedValue}\n onValueChange={(next) => choose(() => onChange(next === AGENT_OWN_MODEL ? null : next))}\n >\n <DropdownMenu.Label className=\"px-2 pb-0.5 pt-1.5 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n Agent models\n </DropdownMenu.Label>\n {items.map((item) => (\n <PickerItem key={item.value} value={item.value} detail={item.detail}>\n {item.label}\n {item.isDefault ? ' (default)' : ''}\n </PickerItem>\n ))}\n </DropdownMenu.RadioGroup>\n </PickerMenu>\n </DropdownMenu.Root>\n </DisabledReason>\n );\n}\n\nexport interface ChatAgentPickerProps {\n /** The chosen collab agent's asset id; `null` is Athena. */\n value: string | null;\n onChange: (agentId: string | null) => void;\n disabled?: boolean;\n /**\n * Why the picker is disabled (e.g. \"Needs a connection…\" while the host knows Athena can't be\n * reached), shown as its tooltip while `disabled`.\n */\n disabledReason?: string;\n className?: string;\n}\n\n/** The \"Athena\" item's value: no collab agent. */\nconst NO_AGENT = '__athena__';\n\n/** Who answers new messages: Athena, or a published collab agent the person can see. */\nexport function ChatAgentPicker({\n value,\n onChange,\n disabled = false,\n disabledReason,\n className,\n}: ChatAgentPickerProps) {\n const catalog = useAthenaAgentCatalog();\n const { open, setOpen, choose } = usePickerMenu(disabled);\n const reason = disabled ? (disabledReason ?? null) : null;\n const agents = catalog.data ?? [];\n const label = value === null ? 'Athena' : (agents.find((agent) => agent.id === value)?.name ?? 'Agent');\n // The chosen agent is gone (unpublished, or no longer shared with this person): fall back to\n // Athena, so new messages do not target an agent they cannot reach. Once per choice.\n const clearedRef = useRef<string | null>(null);\n useEffect(() => {\n if (!catalog.isSuccess || value === null || clearedRef.current === value) return;\n if (agents.some((agent) => agent.id === value)) return;\n clearedRef.current = value;\n onChange(null);\n }, [catalog.isSuccess, agents, value, onChange]);\n return (\n <DisabledReason reason={reason}>\n <DropdownMenu.Root open={open} onOpenChange={setOpen}>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className={cn(CHIP_CLASS, className)}\n disabled={disabled}\n title={reason ?? undefined}\n aria-label={`Agent: ${label}`}\n >\n <BotIcon className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{label}</span>\n <ChevronDownIcon className=\"size-3 shrink-0\" aria-hidden />\n </button>\n </DropdownMenu.Trigger>\n <PickerMenu label=\"Agent\">\n <DropdownMenu.RadioGroup\n value={value ?? NO_AGENT}\n onValueChange={(next) => choose(() => onChange(next === NO_AGENT ? null : next))}\n >\n <PickerItem value={NO_AGENT}>Athena</PickerItem>\n {catalog.isError && <PickerNote alert>Couldn’t load the agents. Try again in a moment.</PickerNote>}\n {agents.map((agent) => (\n <PickerItem key={agent.id} value={agent.id}>\n {agent.name}\n </PickerItem>\n ))}\n </DropdownMenu.RadioGroup>\n </PickerMenu>\n </DropdownMenu.Root>\n </DisabledReason>\n );\n}\n\nexport interface ChatModePickerProps {\n /** The mode the session runs in: `base` or a mode's id. */\n value: string;\n /** The modes to offer. */\n options: readonly AthenaChatModeOption[];\n onChange: (modeId: string) => void;\n /** The name of `value` when it is none of `options`. */\n valueLabel?: string;\n disabled?: boolean;\n /** Why the picker is disabled, shown as its tooltip. */\n disabledReason?: string;\n className?: string;\n}\n\n/**\n * Which of the agent's modes the chat runs in, as a chip with a radio menu\n * like the other composer pickers. Controlled: `useAthenaChatMode` gives the\n * options, the current mode and `select`, which `AthenaChat`'s built-in menu\n * ({@link AthenaChatModeMenu}) wires up for you.\n */\nexport function ChatModePicker({\n value,\n options,\n onChange,\n valueLabel,\n disabled = false,\n disabledReason,\n className,\n}: ChatModePickerProps) {\n const { open, setOpen, choose } = usePickerMenu(disabled);\n const label = options.find((option) => option.id === value)?.label ?? valueLabel ?? value;\n const reason = disabled ? (disabledReason ?? null) : null;\n return (\n <DisabledReason reason={reason}>\n <DropdownMenu.Root open={open} onOpenChange={setOpen}>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className={cn(CHIP_CLASS, className)}\n disabled={disabled}\n title={reason ?? undefined}\n aria-label={`Mode: ${label}`}\n data-slot=\"chat-mode-picker\"\n >\n <LayersIcon className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{label}</span>\n <ChevronDownIcon className=\"size-3 shrink-0\" aria-hidden />\n </button>\n </DropdownMenu.Trigger>\n <PickerMenu label=\"Mode\">\n <DropdownMenu.RadioGroup value={value} onValueChange={(next) => choose(() => onChange(next))}>\n {options.map((option) => (\n <PickerItem key={option.id} value={option.id}>\n {option.label}\n </PickerItem>\n ))}\n </DropdownMenu.RadioGroup>\n </PickerMenu>\n </DropdownMenu.Root>\n </DisabledReason>\n );\n}\n\n/**\n * `AthenaChat`'s mode menu: {@link ChatModePicker} over `useAthenaChatMode`,\n * shown only while the provider's `modes` give the chat two or more modes.\n */\nexport function AthenaChatModeMenu({ className }: { className?: string }) {\n const mode = useAthenaChatMode();\n if (mode.status !== 'ready') return null;\n return (\n <ChatModePicker\n value={mode.current}\n valueLabel={mode.currentLabel}\n options={mode.options}\n onChange={mode.select}\n disabled={!mode.canSwitch}\n disabledReason=\"This channel keeps each conversation in the mode it started in. Start a new conversation to pick another.\"\n className={className}\n />\n );\n}\n\n/** What the plan mode chip says it does, on and off (its tooltip). */\nconst PLAN_MODE_ON_HINT =\n 'Plan mode is on: for multi-step work Athena writes a to-do plan and checks steps off as it goes. Click to turn it off.';\nconst PLAN_MODE_OFF_HINT =\n 'Plan mode is off: Athena works without a to-do plan. Click to turn it on.';\n\nexport interface ChatPlanModeToggleProps {\n /** Whether new messages run in plan mode (what the host passes `AthenaProvider` as `planMode`). */\n value: boolean;\n onChange: (planMode: boolean) => void;\n disabled?: boolean;\n /** Why the chip is disabled, shown as its tooltip while `disabled`. */\n disabledReason?: string;\n className?: string;\n}\n\n/**\n * Plan mode as a composer chip beside the pickers: a switch (`role=\"switch\"`)\n * that reads \"Plan\", drawn pressed while on. Controlled like the pickers: the\n * host keeps the choice and passes it to `AthenaProvider` as `planMode`, so new\n * messages run with it and an open session's next turn does too (the provider\n * writes it to the session's server config).\n */\nexport function ChatPlanModeToggle({\n value,\n onChange,\n disabled = false,\n disabledReason,\n className,\n}: ChatPlanModeToggleProps) {\n const reason = disabled ? (disabledReason ?? null) : null;\n return (\n <DisabledReason reason={reason}>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={value}\n aria-label=\"Plan mode\"\n data-slot=\"chat-plan-mode-toggle\"\n data-state={value ? 'on' : 'off'}\n className={cn(CHIP_CLASS, value && 'bg-muted text-foreground', className)}\n disabled={disabled}\n title={reason ?? (value ? PLAN_MODE_ON_HINT : PLAN_MODE_OFF_HINT)}\n onClick={() => onChange(!value)}\n >\n <ListChecksIcon className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">Plan</span>\n </button>\n </DisabledReason>\n );\n}\n"],"names":["useAthenaThemeStyle","usePortalContainer","jsx","DropdownMenu","portalSurfaceStyle","cn","jsxs","CheckIcon","Fragment","useState","useContext","AthenaAgentSelectionContext","agentAssetIdOf","useAgentModelChoices","useAthenaModelCatalog","resolveCatalogModelId","useRef","useEffect","SparklesIcon","ChevronDownIcon","groupModelsByProvider","useAthenaAgentCatalog","BotIcon","LayersIcon","useAthenaChatMode","ListChecksIcon"],"mappings":";;;;;;;;;;;;;;AA4BA,MAAM,aACJ;AAGF,MAAM,oBACJ;AAEF,MAAM,aACJ;AAGF,MAAM,kBAAkB;AAGxB,MAAM,oBAAoB;AAG1B,SAAS,WAAW,EAAE,OAAO,YAAoD;AAC/E,QAAM,aAAaA,kBAAAA,oBAAA;AACnB,QAAM,YAAYC,kBAAAA,mBAAA;AAClB,SACEC,2BAAAA,IAACC,QAAAA,aAAa,QAAb,EAAoB,WACnB,UAAAD,2BAAAA;AAAAA,IAACC,QAAAA,aAAa;AAAA,IAAb;AAAA,MACC,OAAM;AAAA,MACN,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,cAAY;AAAA,MAGZ,OAAOC,cAAAA,mBAAmB,EAAE,SAAS,WAAW,YAAY;AAAA,MAC5D,WAAWC,OAAAA;AAAAA,QACT;AAAA,QACA;AAAA,MAAA;AAAA,MAGD;AAAA,IAAA;AAAA,EAAA,GAEL;AAEJ;AAEA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,yCACGF,QAAAA,aAAa,WAAb,EAAuB,OAAc,WAAW,YAC9C,UAAA;AAAA,IAAA,SACCG,2BAAAA,KAAC,QAAA,EAAK,WAAU,gCACd,UAAA;AAAA,MAAAJ,2BAAAA,IAAC,QAAA,EAAK,WAAU,YAAY,SAAA,CAAS;AAAA,MACrCA,2BAAAA,IAAC,QAAA,EAAK,WAAU,sDAAsD,UAAA,OAAA,CAAO;AAAA,IAAA,EAAA,CAC/E,IAEAA,2BAAAA,IAAC,QAAA,EAAK,WAAU,2BAA2B,UAAS;AAAA,IAEtDA,2BAAAA,IAACC,QAAAA,aAAa,eAAb,EAA2B,WAAU,gCACpC,UAAAD,2BAAAA,IAACK,YAAAA,WAAA,EAAU,WAAU,YAAW,eAAW,KAAA,CAAC,EAAA,CAC9C;AAAA,EAAA,GACF;AAEJ;AAOA,SAAS,eAAe,EAAE,QAAQ,YAA4D;AAC5F,MAAI,CAAC,OAAQ,QAAOL,2BAAAA,IAAAM,WAAAA,UAAA,EAAG,SAAA,CAAS;AAChC,SACEN,+BAAC,UAAK,WAAU,eAAc,OAAO,QAAQ,aAAU,+BACpD,UACH;AAEJ;AAOA,SAAS,cAAc,UAIrB;AACA,QAAM,CAAC,MAAM,YAAY,IAAIO,WAAAA,SAAS,KAAK;AAC3C,MAAI,YAAY,KAAM,cAAa,KAAK;AACxC,SAAO;AAAA,IACL,MAAM,QAAQ,CAAC;AAAA,IACf,SAAS,CAAC,SAAS,aAAa,QAAQ,CAAC,QAAQ;AAAA,IACjD,QAAQ,CAAC,UAAU;AACjB,UAAI,CAAC,SAAU,OAAA;AAAA,IACjB;AAAA,EAAA;AAEJ;AAEA,SAAS,WAAW,EAAE,UAAU,QAAQ,SAAmD;AACzF,SACEP,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWG,OAAAA,GAAG,uBAAuB,QAAQ,qBAAqB,uBAAuB;AAAA,MACzF,MAAM,QAAQ,UAAU;AAAA,MAEvB;AAAA,IAAA;AAAA,EAAA;AAGP;AA4CO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,oBAAoBK,WAAAA,WAAWC,iDAA2B;AAChE,QAAM,eACJ,UAAU,SACNC,iCAAe,KAAK,IACpB,iBACG,uDAAmB,iBAAgB,OACpC;AACR,MAAI,iBAAiB,MAAM;AACzB,UAAM,eACJ,YAAY,SACR,WACA,uDAAmB,kBAAiB,eAClC,kBAAkB,UAClB;AACR,WACEV,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGN;AACA,SACEA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAAA;AAGN;AAUA,SAAS,sBAAsB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GASG;AAED,QAAM,EAAE,SAAS,YAAY,QAAA,IAAYW,eAAAA,qBAAqB,EAAE,OAAO,cAAc,SAAS;AAC9F,MAAI,QAAQ,WAAW,WAAW,CAAC,QAAQ,eAAe;AACxD,WACEX,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGN;AACA,SACEA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAa;AAAA,MACb,mBAAmB,QAAQ,iBAAiB,OAAO,OAAO,WAAW,QAAQ,YAAY;AAAA,MACzF,iBAAiB,QAAQ,WAAW;AAAA,MACpC;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAAA;AAGN;AAGA,SAAS,qBAAqB,OAQ3B;AACD,QAAM,UAAUY,eAAAA,sBAAA;AAChB,SAAOZ,2BAAAA,IAAC,oBAAA,EAAmB,SAAmB,GAAG,MAAA,CAAO;AAC1D;AAGA,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AACF,GAaG;AACD,QAAM,EAAE,MAAM,SAAS,OAAA,IAAW,cAAc,QAAQ;AACxD,QAAM,SAAS,QAAQ,QAAQ,CAAA;AAC/B,QAAM,SAAS,WAAY,kBAAkB,OAAQ;AACrD,QAAM,WACJ,UAAU,QAAQ,gBACd,OACAa,qCAAsB,EAAE,QAAQ,OAAO,gBAAgB,OAAA,CAAQ;AACrE,QAAM,UAAU,OAAO,KAAK,CAAC,UAAU,MAAM,OAAO,QAAQ;AAC5D,QAAM,QAAQ,aAAa,OAAO,mBAAmB,mCAAS,UAAS;AAIvE,QAAM,cAAcC,WAAAA,OAAsB,IAAI;AAC9CC,aAAAA,UAAU,MAAM;AACd,QAAI,gBAAiB;AACrB,QAAI,CAAC,QAAQ,aAAa,UAAU,QAAQ,aAAa,QAAQ,aAAa,MAAO;AACrF,QAAI,OAAO,KAAK,CAAC,UAAU,MAAM,OAAO,KAAK,KAAK,YAAY,YAAY,MAAO;AACjF,gBAAY,UAAU;AACtB,aAAS,QAAQ;AAAA,EACnB,GAAG,CAAC,iBAAiB,QAAQ,WAAW,QAAQ,OAAO,UAAU,QAAQ,CAAC;AAC1E,SACEf,2BAAAA,IAAC,kBAAe,QACd,UAAAI,2BAAAA,KAACH,qBAAa,MAAb,EAAkB,MAAY,cAAc,SAC3C,UAAA;AAAA,IAAAD,2BAAAA,IAACC,QAAAA,aAAa,SAAb,EAAqB,SAAO,MAC3B,UAAAG,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAWD,OAAAA,GAAG,YAAY,SAAS;AAAA,QACnC;AAAA,QACA,OAAO,UAAU;AAAA,QACjB,cAAY,UAAU,KAAK;AAAA,QAE3B,UAAA;AAAA,UAAAH,2BAAAA,IAACgB,YAAAA,cAAA,EAAa,WAAU,qBAAoB,eAAW,MAAC;AAAA,UACxDhB,2BAAAA,IAAC,QAAA,EAAK,WAAU,YAAY,UAAA,OAAM;AAAA,UAClCA,2BAAAA,IAACiB,YAAAA,iBAAA,EAAgB,WAAU,mBAAkB,eAAW,KAAA,CAAC;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,GAE7D;AAAA,IACAjB,2BAAAA,IAAC,YAAA,EAAW,OAAM,SAChB,UAAAI,2BAAAA;AAAAA,MAACH,QAAAA,aAAa;AAAA,MAAb;AAAA,QACC,OAAO,YAAY;AAAA,QACnB,eAAe,CAAC,SAAS,OAAO,MAAM,SAAS,SAAS,kBAAkB,OAAO,IAAI,CAAC;AAAA,QAErF,UAAA;AAAA,UAAA,gDACE,YAAA,EAAW,OAAO,iBAAiB,QAAQ,mBAAmB,UAAA,qBAE/D;AAAA,UAED,QAAQ,aAAaD,2BAAAA,IAAC,YAAA,EAAW,UAAA,mBAAe;AAAA,UAChD,QAAQ,WAAWA,2BAAAA,IAAC,YAAA,EAAW,OAAK,MAAC,UAAA,oDAAgD;AAAA,UACrFkB,eAAAA,sBAAsB,EAAE,QAAQ,EAAE,IAAI,CAAC,UACtCd,2BAAAA,KAACH,QAAAA,aAAa,OAAb,EACC,UAAA;AAAA,YAAAD,+BAACC,QAAAA,aAAa,OAAb,EAAmB,WAAU,4FAC3B,gBAAM,UACT;AAAA,YACC,MAAM,OAAO,IAAI,CAAC,UACjBG,2BAAAA,KAAC,YAAA,EAA0B,OAAO,MAAM,IACrC,UAAA;AAAA,cAAA,MAAM;AAAA,cACN,MAAM,WAAW,WAAW,cAAc;AAAA,YAAA,EAAA,GAF5B,MAAM,EAGvB,CACD;AAAA,UAAA,EAAA,GATsB,MAAM,QAU/B,CACD;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,EACH,CACF;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAEJ;AAoBA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQG;AACD,QAAM,EAAE,MAAM,SAAS,OAAA,IAAW,cAAc,QAAQ;AACxD,QAAM,SAAS,WAAY,kBAAkB,OAAQ;AACrD,QAAM,cAAc,UAAU,QAAQ,UAAU,QAAQ;AACxD,QAAM,QAA0B,QAAQ,QAAQ,IAAI,CAAC,WAAW;AAC9D,UAAM,UAAU,WAAW,OAAO,KAAK;AACvC,WAAO;AAAA,MACL,OAAO,OAAO,aAAa,CAAC,cAAc,kBAAkB,OAAO;AAAA,MACnE,OAAO,OAAO;AAAA,MACd,WAAW,OAAO;AAAA,MAClB,QAAQ,OAAO,gBACX,gDACA,YAAY,OAAO,QACjB,OACA;AAAA,IAAA;AAAA,EAEV,CAAC;AACD,MAAI,UAAU,QAAQ,CAAC,QAAQ,QAAQ,KAAK,CAAC,WAAW,OAAO,UAAU,KAAK,GAAG;AAC/E,UAAM,KAAK;AAAA,MACT;AAAA,MACA,OAAO,WAAW,KAAK;AAAA,MACvB,WAAW;AAAA,MACX,QAAQ;AAAA,IAAA,CACT;AAAA,EACH;AACA,MAAI,aAAa;AACf,UAAM,KAAK;AAAA,MACT,OAAO;AAAA,MACP,OAAO;AAAA,MACP,WAAW;AAAA,MACX,QAAQ;AAAA,IAAA,CACT;AAAA,EACH;AACA,QAAM,gBAAgB,SAAS;AAC/B,QAAM,WAAW,MAAM,KAAK,CAAC,SAAS,KAAK,UAAU,aAAa,KAAK;AACvE,QAAM,SAAQ,qCAAU,UAAS;AAEjC,MAAI,MAAM,SAAS,GAAG;AACpB,WACEA,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAY,UAAU,KAAK;AAAA,QAC3B,OAAO,WAAW,mBAAmB,KAAK,KAAK;AAAA,QAC/C,aAAU;AAAA,QACV,WAAWD,OAAAA,GAAG,mBAAmB,SAAS;AAAA,QAE1C,UAAA;AAAA,UAAAH,2BAAAA,IAACgB,YAAAA,cAAA,EAAa,WAAU,qBAAoB,eAAW,MAAC;AAAA,UACxDhB,2BAAAA,IAAC,QAAA,EAAK,WAAU,YAAY,UAAA,MAAA,CAAM;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGxC;AACA,SACEA,2BAAAA,IAAC,kBAAe,QACd,UAAAI,2BAAAA,KAACH,qBAAa,MAAb,EAAkB,MAAY,cAAc,SAC3C,UAAA;AAAA,IAAAD,2BAAAA,IAACC,QAAAA,aAAa,SAAb,EAAqB,SAAO,MAC3B,UAAAG,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAWD,OAAAA,GAAG,YAAY,SAAS;AAAA,QACnC;AAAA,QACA,OAAO,UAAU;AAAA,QACjB,cAAY,UAAU,KAAK;AAAA,QAE3B,UAAA;AAAA,UAAAH,2BAAAA,IAACgB,YAAAA,cAAA,EAAa,WAAU,qBAAoB,eAAW,MAAC;AAAA,UACxDhB,2BAAAA,IAAC,QAAA,EAAK,WAAU,YAAY,UAAA,OAAM;AAAA,UAClCA,2BAAAA,IAACiB,YAAAA,iBAAA,EAAgB,WAAU,mBAAkB,eAAW,KAAA,CAAC;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,GAE7D;AAAA,IACAjB,2BAAAA,IAAC,YAAA,EAAW,OAAM,SAChB,UAAAI,2BAAAA;AAAAA,MAACH,QAAAA,aAAa;AAAA,MAAb;AAAA,QACC,OAAO;AAAA,QACP,eAAe,CAAC,SAAS,OAAO,MAAM,SAAS,SAAS,kBAAkB,OAAO,IAAI,CAAC;AAAA,QAEtF,UAAA;AAAA,UAAAD,2BAAAA,IAACC,QAAAA,aAAa,OAAb,EAAmB,WAAU,4FAA2F,UAAA,gBAEzH;AAAA,UACC,MAAM,IAAI,CAAC,SACVG,2BAAAA,KAAC,YAAA,EAA4B,OAAO,KAAK,OAAO,QAAQ,KAAK,QAC1D,UAAA;AAAA,YAAA,KAAK;AAAA,YACL,KAAK,YAAY,eAAe;AAAA,UAAA,EAAA,GAFlB,KAAK,KAGtB,CACD;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,EACH,CACF;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAEJ;AAgBA,MAAM,WAAW;AAGV,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AACF,GAAyB;;AACvB,QAAM,UAAUe,eAAAA,sBAAA;AAChB,QAAM,EAAE,MAAM,SAAS,OAAA,IAAW,cAAc,QAAQ;AACxD,QAAM,SAAS,WAAY,kBAAkB,OAAQ;AACrD,QAAM,SAAS,QAAQ,QAAQ,CAAA;AAC/B,QAAM,QAAQ,UAAU,OAAO,aAAY,YAAO,KAAK,CAAC,UAAU,MAAM,OAAO,KAAK,MAAzC,mBAA4C,SAAQ;AAG/F,QAAM,aAAaL,WAAAA,OAAsB,IAAI;AAC7CC,aAAAA,UAAU,MAAM;AACd,QAAI,CAAC,QAAQ,aAAa,UAAU,QAAQ,WAAW,YAAY,MAAO;AAC1E,QAAI,OAAO,KAAK,CAAC,UAAU,MAAM,OAAO,KAAK,EAAG;AAChD,eAAW,UAAU;AACrB,aAAS,IAAI;AAAA,EACf,GAAG,CAAC,QAAQ,WAAW,QAAQ,OAAO,QAAQ,CAAC;AAC/C,SACEf,2BAAAA,IAAC,kBAAe,QACd,UAAAI,2BAAAA,KAACH,qBAAa,MAAb,EAAkB,MAAY,cAAc,SAC3C,UAAA;AAAA,IAAAD,2BAAAA,IAACC,QAAAA,aAAa,SAAb,EAAqB,SAAO,MAC3B,UAAAG,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAWD,OAAAA,GAAG,YAAY,SAAS;AAAA,QACnC;AAAA,QACA,OAAO,UAAU;AAAA,QACjB,cAAY,UAAU,KAAK;AAAA,QAE3B,UAAA;AAAA,UAAAH,2BAAAA,IAACoB,YAAAA,SAAA,EAAQ,WAAU,qBAAoB,eAAW,MAAC;AAAA,UACnDpB,2BAAAA,IAAC,QAAA,EAAK,WAAU,YAAY,UAAA,OAAM;AAAA,UAClCA,2BAAAA,IAACiB,YAAAA,iBAAA,EAAgB,WAAU,mBAAkB,eAAW,KAAA,CAAC;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,GAE7D;AAAA,IACAjB,2BAAAA,IAAC,YAAA,EAAW,OAAM,SAChB,UAAAI,2BAAAA;AAAAA,MAACH,QAAAA,aAAa;AAAA,MAAb;AAAA,QACC,OAAO,SAAS;AAAA,QAChB,eAAe,CAAC,SAAS,OAAO,MAAM,SAAS,SAAS,WAAW,OAAO,IAAI,CAAC;AAAA,QAE/E,UAAA;AAAA,UAAAD,2BAAAA,IAAC,YAAA,EAAW,OAAO,UAAU,UAAA,UAAM;AAAA,UAClC,QAAQ,WAAWA,2BAAAA,IAAC,YAAA,EAAW,OAAK,MAAC,UAAA,oDAAgD;AAAA,UACrF,OAAO,IAAI,CAAC,UACXA,2BAAAA,IAAC,YAAA,EAA0B,OAAO,MAAM,IACrC,UAAA,MAAM,KAAA,GADQ,MAAM,EAEvB,CACD;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,EACH,CACF;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAEJ;AAsBO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AACF,GAAwB;;AACtB,QAAM,EAAE,MAAM,SAAS,OAAA,IAAW,cAAc,QAAQ;AACxD,QAAM,UAAQ,aAAQ,KAAK,CAAC,WAAW,OAAO,OAAO,KAAK,MAA5C,mBAA+C,UAAS,cAAc;AACpF,QAAM,SAAS,WAAY,kBAAkB,OAAQ;AACrD,SACEA,2BAAAA,IAAC,kBAAe,QACd,UAAAI,2BAAAA,KAACH,qBAAa,MAAb,EAAkB,MAAY,cAAc,SAC3C,UAAA;AAAA,IAAAD,2BAAAA,IAACC,QAAAA,aAAa,SAAb,EAAqB,SAAO,MAC3B,UAAAG,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAWD,OAAAA,GAAG,YAAY,SAAS;AAAA,QACnC;AAAA,QACA,OAAO,UAAU;AAAA,QACjB,cAAY,SAAS,KAAK;AAAA,QAC1B,aAAU;AAAA,QAEV,UAAA;AAAA,UAAAH,2BAAAA,IAACqB,YAAAA,YAAA,EAAW,WAAU,qBAAoB,eAAW,MAAC;AAAA,UACtDrB,2BAAAA,IAAC,QAAA,EAAK,WAAU,YAAY,UAAA,OAAM;AAAA,UAClCA,2BAAAA,IAACiB,YAAAA,iBAAA,EAAgB,WAAU,mBAAkB,eAAW,KAAA,CAAC;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,GAE7D;AAAA,IACAjB,2BAAAA,IAAC,YAAA,EAAW,OAAM,QAChB,yCAACC,qBAAa,YAAb,EAAwB,OAAc,eAAe,CAAC,SAAS,OAAO,MAAM,SAAS,IAAI,CAAC,GACxF,UAAA,QAAQ,IAAI,CAAC,0CACX,YAAA,EAA2B,OAAO,OAAO,IACvC,iBAAO,MAAA,GADO,OAAO,EAExB,CACD,GACH,EAAA,CACF;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAEJ;AAMO,SAAS,mBAAmB,EAAE,aAAqC;AACxE,QAAM,OAAOqB,kBAAAA,kBAAA;AACb,MAAI,KAAK,WAAW,QAAS,QAAO;AACpC,SACEtB,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO,KAAK;AAAA,MACZ,YAAY,KAAK;AAAA,MACjB,SAAS,KAAK;AAAA,MACd,UAAU,KAAK;AAAA,MACf,UAAU,CAAC,KAAK;AAAA,MAChB,gBAAe;AAAA,MACf;AAAA,IAAA;AAAA,EAAA;AAGN;AAGA,MAAM,oBACJ;AACF,MAAM,qBACJ;AAmBK,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AACF,GAA4B;AAC1B,QAAM,SAAS,WAAY,kBAAkB,OAAQ;AACrD,SACEA,2BAAAA,IAAC,kBAAe,QACd,UAAAI,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,MAAK;AAAA,MACL,gBAAc;AAAA,MACd,cAAW;AAAA,MACX,aAAU;AAAA,MACV,cAAY,QAAQ,OAAO;AAAA,MAC3B,WAAWD,OAAAA,GAAG,YAAY,SAAS,4BAA4B,SAAS;AAAA,MACxE;AAAA,MACA,OAAO,WAAW,QAAQ,oBAAoB;AAAA,MAC9C,SAAS,MAAM,SAAS,CAAC,KAAK;AAAA,MAE9B,UAAA;AAAA,QAAAH,2BAAAA,IAACuB,YAAAA,gBAAA,EAAe,WAAU,qBAAoB,eAAW,MAAC;AAAA,QAC1DvB,2BAAAA,IAAC,QAAA,EAAK,WAAU,YAAW,UAAA,OAAA,CAAI;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,GAEnC;AAEJ;;;;;;"}
|
|
@@ -82,3 +82,20 @@ export declare function ChatModePicker({ value, options, onChange, valueLabel, d
|
|
|
82
82
|
export declare function AthenaChatModeMenu({ className }: {
|
|
83
83
|
className?: string;
|
|
84
84
|
}): import("react").JSX.Element | null;
|
|
85
|
+
export interface ChatPlanModeToggleProps {
|
|
86
|
+
/** Whether new messages run in plan mode (what the host passes `AthenaProvider` as `planMode`). */
|
|
87
|
+
value: boolean;
|
|
88
|
+
onChange: (planMode: boolean) => void;
|
|
89
|
+
disabled?: boolean;
|
|
90
|
+
/** Why the chip is disabled, shown as its tooltip while `disabled`. */
|
|
91
|
+
disabledReason?: string;
|
|
92
|
+
className?: string;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Plan mode as a composer chip beside the pickers: a switch (`role="switch"`)
|
|
96
|
+
* that reads "Plan", drawn pressed while on. Controlled like the pickers: the
|
|
97
|
+
* host keeps the choice and passes it to `AthenaProvider` as `planMode`, so new
|
|
98
|
+
* messages run with it and an open session's next turn does too (the provider
|
|
99
|
+
* writes it to the session's server config).
|
|
100
|
+
*/
|
|
101
|
+
export declare function ChatPlanModeToggle({ value, onChange, disabled, disabledReason, className, }: ChatPlanModeToggleProps): import("react").JSX.Element;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { BotIcon, ChevronDownIcon, LayersIcon, CheckIcon, SparklesIcon } from "lucide-react";
|
|
2
|
+
import { BotIcon, ChevronDownIcon, LayersIcon, ListChecksIcon, CheckIcon, SparklesIcon } from "lucide-react";
|
|
3
3
|
import { DropdownMenu } from "radix-ui";
|
|
4
4
|
import { useRef, useEffect, useContext, useState } from "react";
|
|
5
5
|
import { usePortalContainer } from "../lib/owner-document.js";
|
|
@@ -410,10 +410,41 @@ function AthenaChatModeMenu({ className }) {
|
|
|
410
410
|
}
|
|
411
411
|
);
|
|
412
412
|
}
|
|
413
|
+
const PLAN_MODE_ON_HINT = "Plan mode is on: for multi-step work Athena writes a to-do plan and checks steps off as it goes. Click to turn it off.";
|
|
414
|
+
const PLAN_MODE_OFF_HINT = "Plan mode is off: Athena works without a to-do plan. Click to turn it on.";
|
|
415
|
+
function ChatPlanModeToggle({
|
|
416
|
+
value,
|
|
417
|
+
onChange,
|
|
418
|
+
disabled = false,
|
|
419
|
+
disabledReason,
|
|
420
|
+
className
|
|
421
|
+
}) {
|
|
422
|
+
const reason = disabled ? disabledReason ?? null : null;
|
|
423
|
+
return /* @__PURE__ */ jsx(DisabledReason, { reason, children: /* @__PURE__ */ jsxs(
|
|
424
|
+
"button",
|
|
425
|
+
{
|
|
426
|
+
type: "button",
|
|
427
|
+
role: "switch",
|
|
428
|
+
"aria-checked": value,
|
|
429
|
+
"aria-label": "Plan mode",
|
|
430
|
+
"data-slot": "chat-plan-mode-toggle",
|
|
431
|
+
"data-state": value ? "on" : "off",
|
|
432
|
+
className: cn(CHIP_CLASS, value && "bg-muted text-foreground", className),
|
|
433
|
+
disabled,
|
|
434
|
+
title: reason ?? (value ? PLAN_MODE_ON_HINT : PLAN_MODE_OFF_HINT),
|
|
435
|
+
onClick: () => onChange(!value),
|
|
436
|
+
children: [
|
|
437
|
+
/* @__PURE__ */ jsx(ListChecksIcon, { className: "size-3.5 shrink-0", "aria-hidden": true }),
|
|
438
|
+
/* @__PURE__ */ jsx("span", { className: "truncate", children: "Plan" })
|
|
439
|
+
]
|
|
440
|
+
}
|
|
441
|
+
) });
|
|
442
|
+
}
|
|
413
443
|
export {
|
|
414
444
|
AthenaChatModeMenu,
|
|
415
445
|
ChatAgentPicker,
|
|
416
446
|
ChatModePicker,
|
|
417
|
-
ChatModelPicker
|
|
447
|
+
ChatModelPicker,
|
|
448
|
+
ChatPlanModeToggle
|
|
418
449
|
};
|
|
419
450
|
//# sourceMappingURL=chat-pickers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-pickers.js","sources":["../../src/catalog/chat-pickers.tsx"],"sourcesContent":["import { BotIcon, CheckIcon, ChevronDownIcon, LayersIcon, SparklesIcon } from 'lucide-react';\nimport { DropdownMenu } from 'radix-ui';\nimport { type ReactNode, useContext, useEffect, useRef, useState } from 'react';\nimport { usePortalContainer } from '../lib/owner-document';\nimport { portalSurfaceStyle } from '../lib/portal-surface';\nimport { cn } from '../lib/utils';\nimport { AthenaAgentSelectionContext } from '../provider/agent-selection-context';\nimport { useAthenaThemeStyle } from '../provider/theme-style-context';\nimport type { AthenaChatModeOption } from './agent-mode-menu';\nimport { agentAssetIdOf } from './agent-model-options';\nimport {\n type AthenaAgentModelOptions,\n groupModelsByProvider,\n resolveCatalogModelId,\n useAgentModelChoices,\n useAthenaAgentCatalog,\n useAthenaModelCatalog,\n} from './runtime-catalog';\nimport { useAthenaChatMode } from './use-athena-chat-mode';\n\n/**\n * The composer's agent and model pickers: compact chips for `AthenaChat`'s `toolbarStart` slot\n * that open a menu, as ChatGPT's and Codex's composers do. They are controlled: the host keeps the\n * choice (and remembers it if it likes) and passes it to `AthenaProvider` as `model` and\n * `agent=\"collab_agent:<id>\"`. New messages run with the choice. The menus are Radix radio menus,\n * so arrow keys, typeahead, Escape and focus return work as in any native menu.\n */\n\nconst CHIP_CLASS =\n 'inline-flex h-7 max-w-[14rem] items-center gap-1 rounded-md px-2 text-xs text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50';\n\n/** The chip without a menu: one choice, shown as a label. */\nconst STATIC_CHIP_CLASS =\n 'inline-flex h-7 max-w-[14rem] items-center gap-1 rounded-md px-2 text-xs text-muted-foreground';\n\nconst ITEM_CLASS =\n 'relative flex w-full cursor-default select-none items-center gap-2 rounded-sm py-1.5 pl-2 pr-7 text-sm outline-none data-[highlighted]:bg-muted data-[state=checked]:font-medium';\n\n/** The \"Agent's own model\" item's value: a chosen agent runs the model its author set. */\nconst AGENT_OWN_MODEL = '__agent_own_model__';\n\n/** What the chip says while a chosen agent's model is not known. */\nconst AGENT_MODEL_LABEL = 'Agent’s model';\n\n/** The menu body, portaled and themed like the SDK's popovers (it renders outside the provider). */\nfunction PickerMenu({ label, children }: { label: string; children: ReactNode }) {\n const themeStyle = useAthenaThemeStyle();\n const container = usePortalContainer();\n return (\n <DropdownMenu.Portal container={container}>\n <DropdownMenu.Content\n align=\"start\"\n sideOffset={4}\n collisionPadding={8}\n aria-label={label}\n // Its box and colours inline: no host stylesheet can take them away\n // (lib/portal-surface.ts).\n style={portalSurfaceStyle({ surface: 'popover', themeStyle })}\n className={cn(\n 'athena-sdk athena-sdk-chrome',\n 'z-50 block max-h-80 w-64 overflow-y-auto rounded-md border bg-popover p-1 text-popover-foreground shadow-md outline-none',\n )}\n >\n {children}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n );\n}\n\nfunction PickerItem({\n value,\n detail,\n children,\n}: {\n value: string;\n /** A second, muted line (the model behind an author's label, or why the item is listed). */\n detail?: ReactNode;\n children: ReactNode;\n}) {\n return (\n <DropdownMenu.RadioItem value={value} className={ITEM_CLASS}>\n {detail ? (\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"truncate\">{children}</span>\n <span className=\"truncate text-xs font-normal text-muted-foreground\">{detail}</span>\n </span>\n ) : (\n <span className=\"min-w-0 flex-1 truncate\">{children}</span>\n )}\n <DropdownMenu.ItemIndicator className=\"absolute right-2 inline-flex\">\n <CheckIcon className=\"size-3.5\" aria-hidden />\n </DropdownMenu.ItemIndicator>\n </DropdownMenu.RadioItem>\n );\n}\n\n/**\n * Where a chip disabled with a reason keeps it: a disabled button gets no pointer events, so its\n * reason is also the tooltip of a wrapper the pointer reaches (the button carries it as its own\n * description, for a screen reader). Without a reason, the chip alone.\n */\nfunction DisabledReason({ reason, children }: { reason: string | null; children: ReactNode }) {\n if (!reason) return <>{children}</>;\n return (\n <span className=\"inline-flex\" title={reason} data-slot=\"chat-picker-disabled-reason\">\n {children}\n </span>\n );\n}\n\n/**\n * A picker's menu, closed while the picker is disabled: one open when it turns disabled (Athena out\n * of reach while it shows) closes, and it opens again only on the person's next press, never by\n * itself once the picker is back. `choose` drops a choice made while disabled.\n */\nfunction usePickerMenu(disabled: boolean): {\n open: boolean;\n setOpen: (next: boolean) => void;\n choose: (apply: () => void) => void;\n} {\n const [open, setOpenState] = useState(false);\n if (disabled && open) setOpenState(false);\n return {\n open: open && !disabled,\n setOpen: (next) => setOpenState(next && !disabled),\n choose: (apply) => {\n if (!disabled) apply();\n },\n };\n}\n\nfunction PickerNote({ children, alert = false }: { children: ReactNode; alert?: boolean }) {\n return (\n <p\n className={cn('px-2 py-1.5 text-xs', alert ? 'text-destructive' : 'text-muted-foreground')}\n role={alert ? 'alert' : undefined}\n >\n {children}\n </p>\n );\n}\n\nexport interface ChatModelPickerProps {\n /** The chosen model id; `null` lets a selected agent run its own model. */\n value: string | null;\n onChange: (modelId: string | null) => void;\n /** The model a person who chose nothing runs, e.g. `claude-opus-5-5`. */\n defaultModelId: string;\n /**\n * A collab agent is chosen: the picker offers the workspace's models and\n * \"Agent's own model\" (`null`), as before, unless the agent restricts its\n * models (its \"Allow any workspace model\" switch is off), when it offers\n * exactly the agent's own (`useAthenaAgentModelOptions`). Which agent:\n * `agent`, else the one the surrounding `AthenaProvider` runs as.\n */\n agentSelected?: boolean;\n /**\n * The chosen collab agent, as its asset id or `collab_agent:<id>` (implies\n * `agentSelected`). `null` is no agent.\n */\n agent?: string | null;\n /**\n * The collab channel the chat runs on (its model override is the default\n * there). Defaults to the provider's `channel` when the agent is the\n * provider's.\n */\n channel?: string | null;\n disabled?: boolean;\n /**\n * Why the picker is disabled (e.g. \"Needs a connection…\" while the host knows Athena can't be\n * reached), shown as its tooltip while `disabled`.\n */\n disabledReason?: string;\n className?: string;\n}\n\n/**\n * Which model new messages run, from the models the workspace allows this\n * person; with an agent chosen, also \"Agent's own model\" (`null`), or exactly\n * the models its author listed when the agent restricts its models\n * (`allowAnyModel: false`, opt-in per agent). The host passes the choice to\n * `AthenaProvider` as `model`; a change reaches an open session too (the\n * provider writes it to the session's server config).\n */\nexport function ChatModelPicker({\n value,\n onChange,\n defaultModelId,\n agentSelected = false,\n agent,\n channel,\n disabled = false,\n disabledReason,\n className,\n}: ChatModelPickerProps) {\n const providerSelection = useContext(AthenaAgentSelectionContext);\n const agentAssetId =\n agent !== undefined\n ? agentAssetIdOf(agent)\n : agentSelected\n ? (providerSelection?.agentAssetId ?? null)\n : null;\n if (agentAssetId !== null) {\n const agentChannel =\n channel !== undefined\n ? channel\n : providerSelection?.agentAssetId === agentAssetId\n ? providerSelection.channel\n : null;\n return (\n <AgentAwareModelPicker\n agentAssetId={agentAssetId}\n channel={agentChannel}\n value={value}\n onChange={onChange}\n defaultModelId={defaultModelId}\n disabled={disabled}\n disabledReason={disabledReason}\n className={className}\n />\n );\n }\n return (\n <WorkspaceModelPicker\n value={value}\n onChange={onChange}\n defaultModelId={defaultModelId}\n agentSelected={agentSelected}\n disabled={disabled}\n disabledReason={disabledReason}\n className={className}\n />\n );\n}\n\n/**\n * The picker with a collab agent chosen. The agent is read first: one that\n * restricts its models gets {@link AgentModelMenu}; every other agent (the\n * default, and one this person cannot read) gets the workspace menu as before,\n * its \"Agent's own model\" naming the agent's default when known. Until the\n * read settles the workspace menu shows but replaces nothing on the host's\n * behalf, since the host's model may be one only the agent offers.\n */\nfunction AgentAwareModelPicker({\n agentAssetId,\n channel,\n value,\n onChange,\n defaultModelId,\n disabled,\n disabledReason,\n className,\n}: {\n agentAssetId: string;\n channel: string | null;\n value: string | null;\n onChange: (modelId: string | null) => void;\n defaultModelId: string;\n disabled: boolean;\n disabledReason?: string;\n className?: string;\n}) {\n // One query client for the agent read and the catalog both menus name models from.\n const { choices, modelLabel, catalog } = useAgentModelChoices({ agent: agentAssetId, channel });\n if (choices.status === 'ready' && !choices.allowAnyModel) {\n return (\n <AgentModelMenu\n choices={choices}\n modelLabel={modelLabel}\n value={value}\n onChange={onChange}\n disabled={disabled}\n disabledReason={disabledReason}\n className={className}\n />\n );\n }\n return (\n <WorkspaceModelMenu\n catalog={catalog}\n value={value}\n onChange={onChange}\n defaultModelId={defaultModelId}\n agentSelected\n agentDefaultLabel={choices.defaultModel === null ? null : modelLabel(choices.defaultModel)}\n holdReplacement={choices.status === 'loading'}\n disabled={disabled}\n disabledReason={disabledReason}\n className={className}\n />\n );\n}\n\n/** The model picker over the workspace's catalog, with no agent chosen (or none it can name). */\nfunction WorkspaceModelPicker(props: {\n value: string | null;\n onChange: (modelId: string | null) => void;\n defaultModelId: string;\n agentSelected: boolean;\n disabled: boolean;\n disabledReason?: string;\n className?: string;\n}) {\n const catalog = useAthenaModelCatalog();\n return <WorkspaceModelMenu catalog={catalog} {...props} />;\n}\n\n/** The workspace catalog's menu (the picker as it was before agents could restrict models). */\nfunction WorkspaceModelMenu({\n catalog,\n value,\n onChange,\n defaultModelId,\n agentSelected,\n agentDefaultLabel = null,\n holdReplacement = false,\n disabled,\n disabledReason,\n className,\n}: {\n catalog: ReturnType<typeof useAthenaModelCatalog>;\n value: string | null;\n onChange: (modelId: string | null) => void;\n defaultModelId: string;\n agentSelected: boolean;\n /** The chosen agent's default model (its channel's override when it has one), named under \"Agent's own model\". */\n agentDefaultLabel?: string | null;\n /** Replace no unoffered choice yet (the chosen agent is still being read). */\n holdReplacement?: boolean;\n disabled: boolean;\n disabledReason?: string;\n className?: string;\n}) {\n const { open, setOpen, choose } = usePickerMenu(disabled);\n const models = catalog.data ?? [];\n const reason = disabled ? (disabledReason ?? null) : null;\n const resolved =\n value === null && agentSelected\n ? null\n : resolveCatalogModelId({ stored: value, defaultModelId, models });\n const current = models.find((model) => model.id === resolved);\n const label = resolved === null ? 'Agent’s model' : (current?.label ?? resolved);\n // The host's choice is no longer offered (retired, or the workspace stopped allowing it): hand\n // the host the model the chip shows, so new messages run it instead of the dropped id. Once per\n // choice, so a host that keeps the old value is not asked again on every render.\n const replacedRef = useRef<string | null>(null);\n useEffect(() => {\n if (holdReplacement) return;\n if (!catalog.isSuccess || value === null || resolved === null || resolved === value) return;\n if (models.some((model) => model.id === value) || replacedRef.current === value) return;\n replacedRef.current = value;\n onChange(resolved);\n }, [holdReplacement, catalog.isSuccess, models, value, resolved, onChange]);\n return (\n <DisabledReason reason={reason}>\n <DropdownMenu.Root open={open} onOpenChange={setOpen}>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className={cn(CHIP_CLASS, className)}\n disabled={disabled}\n title={reason ?? undefined}\n aria-label={`Model: ${label}`}\n >\n <SparklesIcon className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{label}</span>\n <ChevronDownIcon className=\"size-3 shrink-0\" aria-hidden />\n </button>\n </DropdownMenu.Trigger>\n <PickerMenu label=\"Model\">\n <DropdownMenu.RadioGroup\n value={resolved ?? AGENT_OWN_MODEL}\n onValueChange={(next) => choose(() => onChange(next === AGENT_OWN_MODEL ? null : next))}\n >\n {agentSelected && (\n <PickerItem value={AGENT_OWN_MODEL} detail={agentDefaultLabel}>\n Agent’s own model\n </PickerItem>\n )}\n {catalog.isPending && <PickerNote>Loading models…</PickerNote>}\n {catalog.isError && <PickerNote alert>Couldn’t load the models. Try again in a moment.</PickerNote>}\n {groupModelsByProvider({ models }).map((group) => (\n <DropdownMenu.Group key={group.provider}>\n <DropdownMenu.Label className=\"px-2 pb-0.5 pt-1.5 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n {group.provider}\n </DropdownMenu.Label>\n {group.models.map((model) => (\n <PickerItem key={model.id} value={model.id}>\n {model.label}\n {model.status === 'LEGACY' ? ' (legacy)' : ''}\n </PickerItem>\n ))}\n </DropdownMenu.Group>\n ))}\n </DropdownMenu.RadioGroup>\n </PickerMenu>\n </DropdownMenu.Root>\n </DisabledReason>\n );\n}\n\n/** One item of the agent's model menu. */\ninterface AgentModelItem {\n /** The radio value: a model id, or {@link AGENT_OWN_MODEL} for \"the agent's default\" (`null`). */\n value: string;\n label: string;\n isDefault: boolean;\n detail: string | null;\n}\n\n/**\n * The menu of a chosen collab agent that restricts its models: exactly its own\n * (`useAthenaAgentModelOptions`), the default as `null`. One choice is a label;\n * two or more a menu. Nothing is replaced on the host's behalf: a host choice\n * the agent does not list (an older pick) is shown and listed as it is, as is\n * a model the session pins outside the agent's list. A host choice that names\n * the default model explicitly is a pin, which the agent's next default would\n * not follow, so the menu then also offers \"Agent's own model\" (`null`).\n */\nfunction AgentModelMenu({\n choices,\n modelLabel,\n value,\n onChange,\n disabled,\n disabledReason,\n className,\n}: {\n choices: AthenaAgentModelOptions;\n modelLabel: (model: string) => string;\n value: string | null;\n onChange: (modelId: string | null) => void;\n disabled: boolean;\n disabledReason?: string;\n className?: string;\n}) {\n const { open, setOpen, choose } = usePickerMenu(disabled);\n const reason = disabled ? (disabledReason ?? null) : null;\n const pinsDefault = value !== null && value === choices.defaultModel;\n const items: AgentModelItem[] = choices.options.map((option) => {\n const display = modelLabel(option.model);\n return {\n value: option.isDefault && !pinsDefault ? AGENT_OWN_MODEL : option.model,\n label: option.label,\n isDefault: option.isDefault,\n detail: option.pinnedOutside\n ? 'Set for this conversation outside the agent'\n : display === option.label\n ? null\n : display,\n };\n });\n if (value !== null && !choices.options.some((option) => option.model === value)) {\n items.push({\n value,\n label: modelLabel(value),\n isDefault: false,\n detail: 'Not one of the agent’s models',\n });\n }\n if (pinsDefault) {\n items.push({\n value: AGENT_OWN_MODEL,\n label: 'Agent’s own model',\n isDefault: false,\n detail: 'Follows the agent’s default',\n });\n }\n const selectedValue = value ?? AGENT_OWN_MODEL;\n const selected = items.find((item) => item.value === selectedValue) ?? null;\n const label = selected?.label || AGENT_MODEL_LABEL;\n\n if (items.length < 2) {\n return (\n <span\n role=\"img\"\n aria-label={`Model: ${label}`}\n title={selected ? `This agent runs ${label}` : 'This agent runs its own model'}\n data-slot=\"chat-model-picker-label\"\n className={cn(STATIC_CHIP_CLASS, className)}\n >\n <SparklesIcon className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{label}</span>\n </span>\n );\n }\n return (\n <DisabledReason reason={reason}>\n <DropdownMenu.Root open={open} onOpenChange={setOpen}>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className={cn(CHIP_CLASS, className)}\n disabled={disabled}\n title={reason ?? undefined}\n aria-label={`Model: ${label}`}\n >\n <SparklesIcon className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{label}</span>\n <ChevronDownIcon className=\"size-3 shrink-0\" aria-hidden />\n </button>\n </DropdownMenu.Trigger>\n <PickerMenu label=\"Model\">\n <DropdownMenu.RadioGroup\n value={selectedValue}\n onValueChange={(next) => choose(() => onChange(next === AGENT_OWN_MODEL ? null : next))}\n >\n <DropdownMenu.Label className=\"px-2 pb-0.5 pt-1.5 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n Agent models\n </DropdownMenu.Label>\n {items.map((item) => (\n <PickerItem key={item.value} value={item.value} detail={item.detail}>\n {item.label}\n {item.isDefault ? ' (default)' : ''}\n </PickerItem>\n ))}\n </DropdownMenu.RadioGroup>\n </PickerMenu>\n </DropdownMenu.Root>\n </DisabledReason>\n );\n}\n\nexport interface ChatAgentPickerProps {\n /** The chosen collab agent's asset id; `null` is Athena. */\n value: string | null;\n onChange: (agentId: string | null) => void;\n disabled?: boolean;\n /**\n * Why the picker is disabled (e.g. \"Needs a connection…\" while the host knows Athena can't be\n * reached), shown as its tooltip while `disabled`.\n */\n disabledReason?: string;\n className?: string;\n}\n\n/** The \"Athena\" item's value: no collab agent. */\nconst NO_AGENT = '__athena__';\n\n/** Who answers new messages: Athena, or a published collab agent the person can see. */\nexport function ChatAgentPicker({\n value,\n onChange,\n disabled = false,\n disabledReason,\n className,\n}: ChatAgentPickerProps) {\n const catalog = useAthenaAgentCatalog();\n const { open, setOpen, choose } = usePickerMenu(disabled);\n const reason = disabled ? (disabledReason ?? null) : null;\n const agents = catalog.data ?? [];\n const label = value === null ? 'Athena' : (agents.find((agent) => agent.id === value)?.name ?? 'Agent');\n // The chosen agent is gone (unpublished, or no longer shared with this person): fall back to\n // Athena, so new messages do not target an agent they cannot reach. Once per choice.\n const clearedRef = useRef<string | null>(null);\n useEffect(() => {\n if (!catalog.isSuccess || value === null || clearedRef.current === value) return;\n if (agents.some((agent) => agent.id === value)) return;\n clearedRef.current = value;\n onChange(null);\n }, [catalog.isSuccess, agents, value, onChange]);\n return (\n <DisabledReason reason={reason}>\n <DropdownMenu.Root open={open} onOpenChange={setOpen}>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className={cn(CHIP_CLASS, className)}\n disabled={disabled}\n title={reason ?? undefined}\n aria-label={`Agent: ${label}`}\n >\n <BotIcon className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{label}</span>\n <ChevronDownIcon className=\"size-3 shrink-0\" aria-hidden />\n </button>\n </DropdownMenu.Trigger>\n <PickerMenu label=\"Agent\">\n <DropdownMenu.RadioGroup\n value={value ?? NO_AGENT}\n onValueChange={(next) => choose(() => onChange(next === NO_AGENT ? null : next))}\n >\n <PickerItem value={NO_AGENT}>Athena</PickerItem>\n {catalog.isError && <PickerNote alert>Couldn’t load the agents. Try again in a moment.</PickerNote>}\n {agents.map((agent) => (\n <PickerItem key={agent.id} value={agent.id}>\n {agent.name}\n </PickerItem>\n ))}\n </DropdownMenu.RadioGroup>\n </PickerMenu>\n </DropdownMenu.Root>\n </DisabledReason>\n );\n}\n\nexport interface ChatModePickerProps {\n /** The mode the session runs in: `base` or a mode's id. */\n value: string;\n /** The modes to offer. */\n options: readonly AthenaChatModeOption[];\n onChange: (modeId: string) => void;\n /** The name of `value` when it is none of `options`. */\n valueLabel?: string;\n disabled?: boolean;\n /** Why the picker is disabled, shown as its tooltip. */\n disabledReason?: string;\n className?: string;\n}\n\n/**\n * Which of the agent's modes the chat runs in, as a chip with a radio menu\n * like the other composer pickers. Controlled: `useAthenaChatMode` gives the\n * options, the current mode and `select`, which `AthenaChat`'s built-in menu\n * ({@link AthenaChatModeMenu}) wires up for you.\n */\nexport function ChatModePicker({\n value,\n options,\n onChange,\n valueLabel,\n disabled = false,\n disabledReason,\n className,\n}: ChatModePickerProps) {\n const { open, setOpen, choose } = usePickerMenu(disabled);\n const label = options.find((option) => option.id === value)?.label ?? valueLabel ?? value;\n const reason = disabled ? (disabledReason ?? null) : null;\n return (\n <DisabledReason reason={reason}>\n <DropdownMenu.Root open={open} onOpenChange={setOpen}>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className={cn(CHIP_CLASS, className)}\n disabled={disabled}\n title={reason ?? undefined}\n aria-label={`Mode: ${label}`}\n data-slot=\"chat-mode-picker\"\n >\n <LayersIcon className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{label}</span>\n <ChevronDownIcon className=\"size-3 shrink-0\" aria-hidden />\n </button>\n </DropdownMenu.Trigger>\n <PickerMenu label=\"Mode\">\n <DropdownMenu.RadioGroup value={value} onValueChange={(next) => choose(() => onChange(next))}>\n {options.map((option) => (\n <PickerItem key={option.id} value={option.id}>\n {option.label}\n </PickerItem>\n ))}\n </DropdownMenu.RadioGroup>\n </PickerMenu>\n </DropdownMenu.Root>\n </DisabledReason>\n );\n}\n\n/**\n * `AthenaChat`'s mode menu: {@link ChatModePicker} over `useAthenaChatMode`,\n * shown only while the provider's `modes` give the chat two or more modes.\n */\nexport function AthenaChatModeMenu({ className }: { className?: string }) {\n const mode = useAthenaChatMode();\n if (mode.status !== 'ready') return null;\n return (\n <ChatModePicker\n value={mode.current}\n valueLabel={mode.currentLabel}\n options={mode.options}\n onChange={mode.select}\n disabled={!mode.canSwitch}\n disabledReason=\"This channel keeps each conversation in the mode it started in. Start a new conversation to pick another.\"\n className={className}\n />\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chat-pickers.js","sources":["../../src/catalog/chat-pickers.tsx"],"sourcesContent":["import { BotIcon, CheckIcon, ChevronDownIcon, LayersIcon, ListChecksIcon, SparklesIcon } from 'lucide-react';\nimport { DropdownMenu } from 'radix-ui';\nimport { type ReactNode, useContext, useEffect, useRef, useState } from 'react';\nimport { usePortalContainer } from '../lib/owner-document';\nimport { portalSurfaceStyle } from '../lib/portal-surface';\nimport { cn } from '../lib/utils';\nimport { AthenaAgentSelectionContext } from '../provider/agent-selection-context';\nimport { useAthenaThemeStyle } from '../provider/theme-style-context';\nimport type { AthenaChatModeOption } from './agent-mode-menu';\nimport { agentAssetIdOf } from './agent-model-options';\nimport {\n type AthenaAgentModelOptions,\n groupModelsByProvider,\n resolveCatalogModelId,\n useAgentModelChoices,\n useAthenaAgentCatalog,\n useAthenaModelCatalog,\n} from './runtime-catalog';\nimport { useAthenaChatMode } from './use-athena-chat-mode';\n\n/**\n * The composer's agent and model pickers: compact chips for `AthenaChat`'s `toolbarStart` slot\n * that open a menu, as ChatGPT's and Codex's composers do. They are controlled: the host keeps the\n * choice (and remembers it if it likes) and passes it to `AthenaProvider` as `model` and\n * `agent=\"collab_agent:<id>\"`. New messages run with the choice. The menus are Radix radio menus,\n * so arrow keys, typeahead, Escape and focus return work as in any native menu.\n */\n\nconst CHIP_CLASS =\n 'inline-flex h-7 max-w-[14rem] items-center gap-1 rounded-md px-2 text-xs text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50';\n\n/** The chip without a menu: one choice, shown as a label. */\nconst STATIC_CHIP_CLASS =\n 'inline-flex h-7 max-w-[14rem] items-center gap-1 rounded-md px-2 text-xs text-muted-foreground';\n\nconst ITEM_CLASS =\n 'relative flex w-full cursor-default select-none items-center gap-2 rounded-sm py-1.5 pl-2 pr-7 text-sm outline-none data-[highlighted]:bg-muted data-[state=checked]:font-medium';\n\n/** The \"Agent's own model\" item's value: a chosen agent runs the model its author set. */\nconst AGENT_OWN_MODEL = '__agent_own_model__';\n\n/** What the chip says while a chosen agent's model is not known. */\nconst AGENT_MODEL_LABEL = 'Agent’s model';\n\n/** The menu body, portaled and themed like the SDK's popovers (it renders outside the provider). */\nfunction PickerMenu({ label, children }: { label: string; children: ReactNode }) {\n const themeStyle = useAthenaThemeStyle();\n const container = usePortalContainer();\n return (\n <DropdownMenu.Portal container={container}>\n <DropdownMenu.Content\n align=\"start\"\n sideOffset={4}\n collisionPadding={8}\n aria-label={label}\n // Its box and colours inline: no host stylesheet can take them away\n // (lib/portal-surface.ts).\n style={portalSurfaceStyle({ surface: 'popover', themeStyle })}\n className={cn(\n 'athena-sdk athena-sdk-chrome',\n 'z-50 block max-h-80 w-64 overflow-y-auto rounded-md border bg-popover p-1 text-popover-foreground shadow-md outline-none',\n )}\n >\n {children}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n );\n}\n\nfunction PickerItem({\n value,\n detail,\n children,\n}: {\n value: string;\n /** A second, muted line (the model behind an author's label, or why the item is listed). */\n detail?: ReactNode;\n children: ReactNode;\n}) {\n return (\n <DropdownMenu.RadioItem value={value} className={ITEM_CLASS}>\n {detail ? (\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"truncate\">{children}</span>\n <span className=\"truncate text-xs font-normal text-muted-foreground\">{detail}</span>\n </span>\n ) : (\n <span className=\"min-w-0 flex-1 truncate\">{children}</span>\n )}\n <DropdownMenu.ItemIndicator className=\"absolute right-2 inline-flex\">\n <CheckIcon className=\"size-3.5\" aria-hidden />\n </DropdownMenu.ItemIndicator>\n </DropdownMenu.RadioItem>\n );\n}\n\n/**\n * Where a chip disabled with a reason keeps it: a disabled button gets no pointer events, so its\n * reason is also the tooltip of a wrapper the pointer reaches (the button carries it as its own\n * description, for a screen reader). Without a reason, the chip alone.\n */\nfunction DisabledReason({ reason, children }: { reason: string | null; children: ReactNode }) {\n if (!reason) return <>{children}</>;\n return (\n <span className=\"inline-flex\" title={reason} data-slot=\"chat-picker-disabled-reason\">\n {children}\n </span>\n );\n}\n\n/**\n * A picker's menu, closed while the picker is disabled: one open when it turns disabled (Athena out\n * of reach while it shows) closes, and it opens again only on the person's next press, never by\n * itself once the picker is back. `choose` drops a choice made while disabled.\n */\nfunction usePickerMenu(disabled: boolean): {\n open: boolean;\n setOpen: (next: boolean) => void;\n choose: (apply: () => void) => void;\n} {\n const [open, setOpenState] = useState(false);\n if (disabled && open) setOpenState(false);\n return {\n open: open && !disabled,\n setOpen: (next) => setOpenState(next && !disabled),\n choose: (apply) => {\n if (!disabled) apply();\n },\n };\n}\n\nfunction PickerNote({ children, alert = false }: { children: ReactNode; alert?: boolean }) {\n return (\n <p\n className={cn('px-2 py-1.5 text-xs', alert ? 'text-destructive' : 'text-muted-foreground')}\n role={alert ? 'alert' : undefined}\n >\n {children}\n </p>\n );\n}\n\nexport interface ChatModelPickerProps {\n /** The chosen model id; `null` lets a selected agent run its own model. */\n value: string | null;\n onChange: (modelId: string | null) => void;\n /** The model a person who chose nothing runs, e.g. `claude-opus-5-5`. */\n defaultModelId: string;\n /**\n * A collab agent is chosen: the picker offers the workspace's models and\n * \"Agent's own model\" (`null`), as before, unless the agent restricts its\n * models (its \"Allow any workspace model\" switch is off), when it offers\n * exactly the agent's own (`useAthenaAgentModelOptions`). Which agent:\n * `agent`, else the one the surrounding `AthenaProvider` runs as.\n */\n agentSelected?: boolean;\n /**\n * The chosen collab agent, as its asset id or `collab_agent:<id>` (implies\n * `agentSelected`). `null` is no agent.\n */\n agent?: string | null;\n /**\n * The collab channel the chat runs on (its model override is the default\n * there). Defaults to the provider's `channel` when the agent is the\n * provider's.\n */\n channel?: string | null;\n disabled?: boolean;\n /**\n * Why the picker is disabled (e.g. \"Needs a connection…\" while the host knows Athena can't be\n * reached), shown as its tooltip while `disabled`.\n */\n disabledReason?: string;\n className?: string;\n}\n\n/**\n * Which model new messages run, from the models the workspace allows this\n * person; with an agent chosen, also \"Agent's own model\" (`null`), or exactly\n * the models its author listed when the agent restricts its models\n * (`allowAnyModel: false`, opt-in per agent). The host passes the choice to\n * `AthenaProvider` as `model`; a change reaches an open session too (the\n * provider writes it to the session's server config).\n */\nexport function ChatModelPicker({\n value,\n onChange,\n defaultModelId,\n agentSelected = false,\n agent,\n channel,\n disabled = false,\n disabledReason,\n className,\n}: ChatModelPickerProps) {\n const providerSelection = useContext(AthenaAgentSelectionContext);\n const agentAssetId =\n agent !== undefined\n ? agentAssetIdOf(agent)\n : agentSelected\n ? (providerSelection?.agentAssetId ?? null)\n : null;\n if (agentAssetId !== null) {\n const agentChannel =\n channel !== undefined\n ? channel\n : providerSelection?.agentAssetId === agentAssetId\n ? providerSelection.channel\n : null;\n return (\n <AgentAwareModelPicker\n agentAssetId={agentAssetId}\n channel={agentChannel}\n value={value}\n onChange={onChange}\n defaultModelId={defaultModelId}\n disabled={disabled}\n disabledReason={disabledReason}\n className={className}\n />\n );\n }\n return (\n <WorkspaceModelPicker\n value={value}\n onChange={onChange}\n defaultModelId={defaultModelId}\n agentSelected={agentSelected}\n disabled={disabled}\n disabledReason={disabledReason}\n className={className}\n />\n );\n}\n\n/**\n * The picker with a collab agent chosen. The agent is read first: one that\n * restricts its models gets {@link AgentModelMenu}; every other agent (the\n * default, and one this person cannot read) gets the workspace menu as before,\n * its \"Agent's own model\" naming the agent's default when known. Until the\n * read settles the workspace menu shows but replaces nothing on the host's\n * behalf, since the host's model may be one only the agent offers.\n */\nfunction AgentAwareModelPicker({\n agentAssetId,\n channel,\n value,\n onChange,\n defaultModelId,\n disabled,\n disabledReason,\n className,\n}: {\n agentAssetId: string;\n channel: string | null;\n value: string | null;\n onChange: (modelId: string | null) => void;\n defaultModelId: string;\n disabled: boolean;\n disabledReason?: string;\n className?: string;\n}) {\n // One query client for the agent read and the catalog both menus name models from.\n const { choices, modelLabel, catalog } = useAgentModelChoices({ agent: agentAssetId, channel });\n if (choices.status === 'ready' && !choices.allowAnyModel) {\n return (\n <AgentModelMenu\n choices={choices}\n modelLabel={modelLabel}\n value={value}\n onChange={onChange}\n disabled={disabled}\n disabledReason={disabledReason}\n className={className}\n />\n );\n }\n return (\n <WorkspaceModelMenu\n catalog={catalog}\n value={value}\n onChange={onChange}\n defaultModelId={defaultModelId}\n agentSelected\n agentDefaultLabel={choices.defaultModel === null ? null : modelLabel(choices.defaultModel)}\n holdReplacement={choices.status === 'loading'}\n disabled={disabled}\n disabledReason={disabledReason}\n className={className}\n />\n );\n}\n\n/** The model picker over the workspace's catalog, with no agent chosen (or none it can name). */\nfunction WorkspaceModelPicker(props: {\n value: string | null;\n onChange: (modelId: string | null) => void;\n defaultModelId: string;\n agentSelected: boolean;\n disabled: boolean;\n disabledReason?: string;\n className?: string;\n}) {\n const catalog = useAthenaModelCatalog();\n return <WorkspaceModelMenu catalog={catalog} {...props} />;\n}\n\n/** The workspace catalog's menu (the picker as it was before agents could restrict models). */\nfunction WorkspaceModelMenu({\n catalog,\n value,\n onChange,\n defaultModelId,\n agentSelected,\n agentDefaultLabel = null,\n holdReplacement = false,\n disabled,\n disabledReason,\n className,\n}: {\n catalog: ReturnType<typeof useAthenaModelCatalog>;\n value: string | null;\n onChange: (modelId: string | null) => void;\n defaultModelId: string;\n agentSelected: boolean;\n /** The chosen agent's default model (its channel's override when it has one), named under \"Agent's own model\". */\n agentDefaultLabel?: string | null;\n /** Replace no unoffered choice yet (the chosen agent is still being read). */\n holdReplacement?: boolean;\n disabled: boolean;\n disabledReason?: string;\n className?: string;\n}) {\n const { open, setOpen, choose } = usePickerMenu(disabled);\n const models = catalog.data ?? [];\n const reason = disabled ? (disabledReason ?? null) : null;\n const resolved =\n value === null && agentSelected\n ? null\n : resolveCatalogModelId({ stored: value, defaultModelId, models });\n const current = models.find((model) => model.id === resolved);\n const label = resolved === null ? 'Agent’s model' : (current?.label ?? resolved);\n // The host's choice is no longer offered (retired, or the workspace stopped allowing it): hand\n // the host the model the chip shows, so new messages run it instead of the dropped id. Once per\n // choice, so a host that keeps the old value is not asked again on every render.\n const replacedRef = useRef<string | null>(null);\n useEffect(() => {\n if (holdReplacement) return;\n if (!catalog.isSuccess || value === null || resolved === null || resolved === value) return;\n if (models.some((model) => model.id === value) || replacedRef.current === value) return;\n replacedRef.current = value;\n onChange(resolved);\n }, [holdReplacement, catalog.isSuccess, models, value, resolved, onChange]);\n return (\n <DisabledReason reason={reason}>\n <DropdownMenu.Root open={open} onOpenChange={setOpen}>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className={cn(CHIP_CLASS, className)}\n disabled={disabled}\n title={reason ?? undefined}\n aria-label={`Model: ${label}`}\n >\n <SparklesIcon className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{label}</span>\n <ChevronDownIcon className=\"size-3 shrink-0\" aria-hidden />\n </button>\n </DropdownMenu.Trigger>\n <PickerMenu label=\"Model\">\n <DropdownMenu.RadioGroup\n value={resolved ?? AGENT_OWN_MODEL}\n onValueChange={(next) => choose(() => onChange(next === AGENT_OWN_MODEL ? null : next))}\n >\n {agentSelected && (\n <PickerItem value={AGENT_OWN_MODEL} detail={agentDefaultLabel}>\n Agent’s own model\n </PickerItem>\n )}\n {catalog.isPending && <PickerNote>Loading models…</PickerNote>}\n {catalog.isError && <PickerNote alert>Couldn’t load the models. Try again in a moment.</PickerNote>}\n {groupModelsByProvider({ models }).map((group) => (\n <DropdownMenu.Group key={group.provider}>\n <DropdownMenu.Label className=\"px-2 pb-0.5 pt-1.5 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n {group.provider}\n </DropdownMenu.Label>\n {group.models.map((model) => (\n <PickerItem key={model.id} value={model.id}>\n {model.label}\n {model.status === 'LEGACY' ? ' (legacy)' : ''}\n </PickerItem>\n ))}\n </DropdownMenu.Group>\n ))}\n </DropdownMenu.RadioGroup>\n </PickerMenu>\n </DropdownMenu.Root>\n </DisabledReason>\n );\n}\n\n/** One item of the agent's model menu. */\ninterface AgentModelItem {\n /** The radio value: a model id, or {@link AGENT_OWN_MODEL} for \"the agent's default\" (`null`). */\n value: string;\n label: string;\n isDefault: boolean;\n detail: string | null;\n}\n\n/**\n * The menu of a chosen collab agent that restricts its models: exactly its own\n * (`useAthenaAgentModelOptions`), the default as `null`. One choice is a label;\n * two or more a menu. Nothing is replaced on the host's behalf: a host choice\n * the agent does not list (an older pick) is shown and listed as it is, as is\n * a model the session pins outside the agent's list. A host choice that names\n * the default model explicitly is a pin, which the agent's next default would\n * not follow, so the menu then also offers \"Agent's own model\" (`null`).\n */\nfunction AgentModelMenu({\n choices,\n modelLabel,\n value,\n onChange,\n disabled,\n disabledReason,\n className,\n}: {\n choices: AthenaAgentModelOptions;\n modelLabel: (model: string) => string;\n value: string | null;\n onChange: (modelId: string | null) => void;\n disabled: boolean;\n disabledReason?: string;\n className?: string;\n}) {\n const { open, setOpen, choose } = usePickerMenu(disabled);\n const reason = disabled ? (disabledReason ?? null) : null;\n const pinsDefault = value !== null && value === choices.defaultModel;\n const items: AgentModelItem[] = choices.options.map((option) => {\n const display = modelLabel(option.model);\n return {\n value: option.isDefault && !pinsDefault ? AGENT_OWN_MODEL : option.model,\n label: option.label,\n isDefault: option.isDefault,\n detail: option.pinnedOutside\n ? 'Set for this conversation outside the agent'\n : display === option.label\n ? null\n : display,\n };\n });\n if (value !== null && !choices.options.some((option) => option.model === value)) {\n items.push({\n value,\n label: modelLabel(value),\n isDefault: false,\n detail: 'Not one of the agent’s models',\n });\n }\n if (pinsDefault) {\n items.push({\n value: AGENT_OWN_MODEL,\n label: 'Agent’s own model',\n isDefault: false,\n detail: 'Follows the agent’s default',\n });\n }\n const selectedValue = value ?? AGENT_OWN_MODEL;\n const selected = items.find((item) => item.value === selectedValue) ?? null;\n const label = selected?.label || AGENT_MODEL_LABEL;\n\n if (items.length < 2) {\n return (\n <span\n role=\"img\"\n aria-label={`Model: ${label}`}\n title={selected ? `This agent runs ${label}` : 'This agent runs its own model'}\n data-slot=\"chat-model-picker-label\"\n className={cn(STATIC_CHIP_CLASS, className)}\n >\n <SparklesIcon className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{label}</span>\n </span>\n );\n }\n return (\n <DisabledReason reason={reason}>\n <DropdownMenu.Root open={open} onOpenChange={setOpen}>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className={cn(CHIP_CLASS, className)}\n disabled={disabled}\n title={reason ?? undefined}\n aria-label={`Model: ${label}`}\n >\n <SparklesIcon className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{label}</span>\n <ChevronDownIcon className=\"size-3 shrink-0\" aria-hidden />\n </button>\n </DropdownMenu.Trigger>\n <PickerMenu label=\"Model\">\n <DropdownMenu.RadioGroup\n value={selectedValue}\n onValueChange={(next) => choose(() => onChange(next === AGENT_OWN_MODEL ? null : next))}\n >\n <DropdownMenu.Label className=\"px-2 pb-0.5 pt-1.5 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n Agent models\n </DropdownMenu.Label>\n {items.map((item) => (\n <PickerItem key={item.value} value={item.value} detail={item.detail}>\n {item.label}\n {item.isDefault ? ' (default)' : ''}\n </PickerItem>\n ))}\n </DropdownMenu.RadioGroup>\n </PickerMenu>\n </DropdownMenu.Root>\n </DisabledReason>\n );\n}\n\nexport interface ChatAgentPickerProps {\n /** The chosen collab agent's asset id; `null` is Athena. */\n value: string | null;\n onChange: (agentId: string | null) => void;\n disabled?: boolean;\n /**\n * Why the picker is disabled (e.g. \"Needs a connection…\" while the host knows Athena can't be\n * reached), shown as its tooltip while `disabled`.\n */\n disabledReason?: string;\n className?: string;\n}\n\n/** The \"Athena\" item's value: no collab agent. */\nconst NO_AGENT = '__athena__';\n\n/** Who answers new messages: Athena, or a published collab agent the person can see. */\nexport function ChatAgentPicker({\n value,\n onChange,\n disabled = false,\n disabledReason,\n className,\n}: ChatAgentPickerProps) {\n const catalog = useAthenaAgentCatalog();\n const { open, setOpen, choose } = usePickerMenu(disabled);\n const reason = disabled ? (disabledReason ?? null) : null;\n const agents = catalog.data ?? [];\n const label = value === null ? 'Athena' : (agents.find((agent) => agent.id === value)?.name ?? 'Agent');\n // The chosen agent is gone (unpublished, or no longer shared with this person): fall back to\n // Athena, so new messages do not target an agent they cannot reach. Once per choice.\n const clearedRef = useRef<string | null>(null);\n useEffect(() => {\n if (!catalog.isSuccess || value === null || clearedRef.current === value) return;\n if (agents.some((agent) => agent.id === value)) return;\n clearedRef.current = value;\n onChange(null);\n }, [catalog.isSuccess, agents, value, onChange]);\n return (\n <DisabledReason reason={reason}>\n <DropdownMenu.Root open={open} onOpenChange={setOpen}>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className={cn(CHIP_CLASS, className)}\n disabled={disabled}\n title={reason ?? undefined}\n aria-label={`Agent: ${label}`}\n >\n <BotIcon className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{label}</span>\n <ChevronDownIcon className=\"size-3 shrink-0\" aria-hidden />\n </button>\n </DropdownMenu.Trigger>\n <PickerMenu label=\"Agent\">\n <DropdownMenu.RadioGroup\n value={value ?? NO_AGENT}\n onValueChange={(next) => choose(() => onChange(next === NO_AGENT ? null : next))}\n >\n <PickerItem value={NO_AGENT}>Athena</PickerItem>\n {catalog.isError && <PickerNote alert>Couldn’t load the agents. Try again in a moment.</PickerNote>}\n {agents.map((agent) => (\n <PickerItem key={agent.id} value={agent.id}>\n {agent.name}\n </PickerItem>\n ))}\n </DropdownMenu.RadioGroup>\n </PickerMenu>\n </DropdownMenu.Root>\n </DisabledReason>\n );\n}\n\nexport interface ChatModePickerProps {\n /** The mode the session runs in: `base` or a mode's id. */\n value: string;\n /** The modes to offer. */\n options: readonly AthenaChatModeOption[];\n onChange: (modeId: string) => void;\n /** The name of `value` when it is none of `options`. */\n valueLabel?: string;\n disabled?: boolean;\n /** Why the picker is disabled, shown as its tooltip. */\n disabledReason?: string;\n className?: string;\n}\n\n/**\n * Which of the agent's modes the chat runs in, as a chip with a radio menu\n * like the other composer pickers. Controlled: `useAthenaChatMode` gives the\n * options, the current mode and `select`, which `AthenaChat`'s built-in menu\n * ({@link AthenaChatModeMenu}) wires up for you.\n */\nexport function ChatModePicker({\n value,\n options,\n onChange,\n valueLabel,\n disabled = false,\n disabledReason,\n className,\n}: ChatModePickerProps) {\n const { open, setOpen, choose } = usePickerMenu(disabled);\n const label = options.find((option) => option.id === value)?.label ?? valueLabel ?? value;\n const reason = disabled ? (disabledReason ?? null) : null;\n return (\n <DisabledReason reason={reason}>\n <DropdownMenu.Root open={open} onOpenChange={setOpen}>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className={cn(CHIP_CLASS, className)}\n disabled={disabled}\n title={reason ?? undefined}\n aria-label={`Mode: ${label}`}\n data-slot=\"chat-mode-picker\"\n >\n <LayersIcon className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{label}</span>\n <ChevronDownIcon className=\"size-3 shrink-0\" aria-hidden />\n </button>\n </DropdownMenu.Trigger>\n <PickerMenu label=\"Mode\">\n <DropdownMenu.RadioGroup value={value} onValueChange={(next) => choose(() => onChange(next))}>\n {options.map((option) => (\n <PickerItem key={option.id} value={option.id}>\n {option.label}\n </PickerItem>\n ))}\n </DropdownMenu.RadioGroup>\n </PickerMenu>\n </DropdownMenu.Root>\n </DisabledReason>\n );\n}\n\n/**\n * `AthenaChat`'s mode menu: {@link ChatModePicker} over `useAthenaChatMode`,\n * shown only while the provider's `modes` give the chat two or more modes.\n */\nexport function AthenaChatModeMenu({ className }: { className?: string }) {\n const mode = useAthenaChatMode();\n if (mode.status !== 'ready') return null;\n return (\n <ChatModePicker\n value={mode.current}\n valueLabel={mode.currentLabel}\n options={mode.options}\n onChange={mode.select}\n disabled={!mode.canSwitch}\n disabledReason=\"This channel keeps each conversation in the mode it started in. Start a new conversation to pick another.\"\n className={className}\n />\n );\n}\n\n/** What the plan mode chip says it does, on and off (its tooltip). */\nconst PLAN_MODE_ON_HINT =\n 'Plan mode is on: for multi-step work Athena writes a to-do plan and checks steps off as it goes. Click to turn it off.';\nconst PLAN_MODE_OFF_HINT =\n 'Plan mode is off: Athena works without a to-do plan. Click to turn it on.';\n\nexport interface ChatPlanModeToggleProps {\n /** Whether new messages run in plan mode (what the host passes `AthenaProvider` as `planMode`). */\n value: boolean;\n onChange: (planMode: boolean) => void;\n disabled?: boolean;\n /** Why the chip is disabled, shown as its tooltip while `disabled`. */\n disabledReason?: string;\n className?: string;\n}\n\n/**\n * Plan mode as a composer chip beside the pickers: a switch (`role=\"switch\"`)\n * that reads \"Plan\", drawn pressed while on. Controlled like the pickers: the\n * host keeps the choice and passes it to `AthenaProvider` as `planMode`, so new\n * messages run with it and an open session's next turn does too (the provider\n * writes it to the session's server config).\n */\nexport function ChatPlanModeToggle({\n value,\n onChange,\n disabled = false,\n disabledReason,\n className,\n}: ChatPlanModeToggleProps) {\n const reason = disabled ? (disabledReason ?? null) : null;\n return (\n <DisabledReason reason={reason}>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={value}\n aria-label=\"Plan mode\"\n data-slot=\"chat-plan-mode-toggle\"\n data-state={value ? 'on' : 'off'}\n className={cn(CHIP_CLASS, value && 'bg-muted text-foreground', className)}\n disabled={disabled}\n title={reason ?? (value ? PLAN_MODE_ON_HINT : PLAN_MODE_OFF_HINT)}\n onClick={() => onChange(!value)}\n >\n <ListChecksIcon className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">Plan</span>\n </button>\n </DisabledReason>\n );\n}\n"],"names":[],"mappings":"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"}
|