@athenaintel/react 0.57.2 → 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 +759 -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 +290 -97
- package/dist/chat/AthenaChat.cjs.map +1 -1
- package/dist/chat/AthenaChat.d.ts +80 -4
- package/dist/chat/AthenaChat.js +290 -97
- 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 +56 -19
- package/dist/provider/AthenaProvider.cjs.map +1 -1
- package/dist/provider/AthenaProvider.d.ts +24 -8
- package/dist/provider/AthenaProvider.js +57 -20
- 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 +3 -1
- package/dist/runtime/statewire-run-config.cjs.map +1 -1
- package/dist/runtime/statewire-run-config.d.ts +7 -0
- package/dist/runtime/statewire-run-config.js +3 -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 +6 -6
- package/dist/threads/SessionList.cjs.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/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/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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-athena-graphql.cjs","sources":["../../src/data/use-athena-graphql.ts"],"sourcesContent":["/**\n * GraphQL on agora through TanStack Query, on the SDK's own client: a read\n * (`useAthenaGraphQL`) cached per identity and cancelled when its last reader\n * unmounts, and a write (`useAthenaGraphQLMutation`). Both run on the SDK's\n * transport (`athenaGraphQL`), so a read and a write carry the provider's\n * credential and fail as an `AthenaApiError`.\n */\nimport {\n type UseMutationOptions,\n type UseMutationResult,\n type UseQueryOptions,\n type UseQueryResult,\n useMutation,\n useQuery,\n} from '@tanstack/react-query';\nimport { useAthenaConfig } from '../provider/AthenaContext';\nimport { AthenaApiError, AthenaApiErrorKind } from './athena-api-error';\nimport {\n ATHENA_DATA_STALE_MS,\n AthenaDataKind,\n athenaRetryDelay,\n enabledAnd,\n retryAthenaRead,\n useAthenaDataQueryClient,\n useAthenaDataScope,\n} from './athena-data-client';\nimport {\n type AthenaGraphQLDocument,\n type AthenaGraphQLRequestOptions,\n type AthenaGraphQLVariables,\n athenaGraphQL,\n selectedGraphQLOperation,\n} from './athena-request';\n\n/** Request options of a GraphQL hook (its `signal` is TanStack Query's). */\nexport type AthenaGraphQLHookRequestOptions = Omit<AthenaGraphQLRequestOptions, 'signal'>;\n\n/**\n * `useAthenaGraphQL`'s options: TanStack Query's (`enabled`, `select`,\n * `staleTime`, `refetchInterval`…) and the request's (`timeoutMs`,\n * `rateLimitRetry`, `operationName`, `headers`).\n */\nexport type UseAthenaGraphQLOptions<TData, TSelected = TData> = Omit<\n UseQueryOptions<TData, AthenaApiError, TSelected>,\n 'queryKey' | 'queryFn'\n> &\n AthenaGraphQLHookRequestOptions;\n\n/**\n * Read with one GraphQL query on agora's `/graphql`, as the signed-in person.\n * Keyed by the identity (see `useAthenaDataScope`), the document and its\n * variables. Never retried on a 4xx or a GraphQL error; a failure with no\n * answer or a 5xx is asked twice more. Cancelled when no component reads it\n * any more. A mutation is refused here (it would run again on every refetch):\n * send it with `useAthenaGraphQLMutation`.\n *\n * ```tsx\n * const { data, error } = useAthenaGraphQL<{ asset: { title: string } }, { id: string }>(\n * `query Asset($id: String!) { asset(id: $id) { title } }`,\n * { id },\n * );\n * ```\n */\nexport function useAthenaGraphQL<\n TData = unknown,\n TVariables extends object = AthenaGraphQLVariables,\n TSelected = TData,\n>(\n document: AthenaGraphQLDocument<TData, TVariables>,\n variables?: TVariables,\n options: UseAthenaGraphQLOptions<TData, TSelected> = {},\n): UseQueryResult<TSelected, AthenaApiError> {\n const config = useAthenaConfig();\n const scope = useAthenaDataScope();\n const client = useAthenaDataQueryClient();\n const { operationName, timeoutMs, rateLimitRetry, headers, enabled, ...queryOptions } = options;\n const text = String(document);\n return useQuery(\n {\n retry: retryAthenaRead,\n retryDelay: athenaRetryDelay,\n staleTime: ATHENA_DATA_STALE_MS,\n ...queryOptions,\n queryKey: [...scope, AthenaDataKind.GraphQL, text, variables ?? {}, operationName ?? null],\n queryFn: ({ signal }) => {\n // The operation agora would run (`operationName`'s, else the only\n // one), never just the document's first: a mutation or subscription\n // here would run again on every refetch.\n if (selectedGraphQLOperation(text, operationName)?.type !== 'query') {\n throw new AthenaApiError({\n kind: AthenaApiErrorKind.Request,\n message:\n 'useAthenaGraphQL runs one query: name it with operationName when the document holds several, and send a mutation with useAthenaGraphQLMutation',\n method: 'POST',\n path: '/graphql',\n });\n }\n return athenaGraphQL<TData, TVariables>(config, text, variables, {\n operationName,\n timeoutMs,\n rateLimitRetry,\n headers,\n signal,\n });\n },\n enabled: enabledAnd(enabled, config.backendUrl.length > 0),\n },\n client,\n );\n}\n\n/**\n * `useAthenaGraphQLMutation`'s options: TanStack Query's mutation options\n * (`onSuccess`, `onError`, `onMutate`…) and the request's.\n */\nexport type UseAthenaGraphQLMutationOptions<TData, TVariables, TOnMutateResult = unknown> = Omit<\n UseMutationOptions<TData, AthenaApiError, TVariables, TOnMutateResult>,\n 'mutationFn'\n> &\n AthenaGraphQLHookRequestOptions;\n\n/**\n * Write with one GraphQL mutation on agora's `/graphql`, as the signed-in\n * person: `mutate(variables)` / `mutateAsync(variables)`. Never retried (a 429\n * from agora's limiter is waited out by the transport: it refuses before\n * anything runs). A write already sent is not cancelled when its component\n * unmounts, since agora may have applied it; `timeoutMs` still bounds it.\n * Read the reads it changes again with `useInvalidateAthenaQueries`.\n *\n * ```tsx\n * const invalidate = useInvalidateAthenaQueries();\n * const rename = useAthenaGraphQLMutation<RenameResult, { id: string; title: string }>(RENAME, {\n * onSuccess: () => invalidate({ operationNames: ['Asset'] }),\n * });\n * rename.mutate({ id, title });\n * ```\n */\nexport function useAthenaGraphQLMutation<\n TData = unknown,\n TVariables extends object = AthenaGraphQLVariables,\n TOnMutateResult = unknown,\n>(\n document: AthenaGraphQLDocument<TData, TVariables>,\n options: UseAthenaGraphQLMutationOptions<TData, TVariables, TOnMutateResult> = {},\n): UseMutationResult<TData, AthenaApiError, TVariables, TOnMutateResult> {\n const config = useAthenaConfig();\n const client = useAthenaDataQueryClient();\n const { operationName, timeoutMs, rateLimitRetry, headers, ...mutationOptions } = options;\n const text = String(document);\n return useMutation(\n {\n ...mutationOptions,\n // TODO(#54756): send an Idempotency-Key per call once agora honours one, so\n // a write sent twice (a retry, a double click) applies once.\n mutationFn: (variables: TVariables) =>\n athenaGraphQL<TData, TVariables>(config, text, variables, {\n operationName,\n timeoutMs,\n rateLimitRetry,\n headers,\n }),\n },\n client,\n );\n}\n"],"names":["useAthenaConfig","useAthenaDataScope","useAthenaDataQueryClient","useQuery","retryAthenaRead","athenaRetryDelay","ATHENA_DATA_STALE_MS","AthenaDataKind","selectedGraphQLOperation","AthenaApiError","AthenaApiErrorKind","athenaGraphQL","enabledAnd","useMutation"],"mappings":";;;;;;;AA+DO,SAAS,iBAKd,UACA,WACA,UAAqD,CAAA,GACV;AAC3C,QAAM,SAASA,cAAAA,gBAAA;AACf,QAAM,QAAQC,iBAAAA,mBAAA;AACd,QAAM,SAASC,iBAAAA,yBAAA;AACf,QAAM,EAAE,eAAe,WAAW,gBAAgB,SAAS,SAAS,GAAG,iBAAiB;AACxF,QAAM,OAAO,OAAO,QAAQ;AAC5B,SAAOC,WAAAA;AAAAA,IACL;AAAA,MACE,OAAOC,iBAAAA;AAAAA,MACP,YAAYC,iBAAAA;AAAAA,MACZ,WAAWC,iBAAAA;AAAAA,MACX,GAAG;AAAA,MACH,UAAU,CAAC,GAAG,OAAOC,gCAAe,SAAS,MAAM,aAAa,CAAA,GAAI,iBAAiB,IAAI;AAAA,MACzF,SAAS,CAAC,EAAE,aAAa;;AAIvB,cAAIC,mBAAAA,yBAAyB,MAAM,aAAa,MAA5CA,mBAA+C,UAAS,SAAS;AACnE,gBAAM,IAAIC,eAAAA,eAAe;AAAA,YACvB,MAAMC,eAAAA,mBAAmB;AAAA,YACzB,SACE;AAAA,YACF,QAAQ;AAAA,YACR,MAAM;AAAA,UAAA,CACP;AAAA,QACH;AACA,eAAOC,4BAAiC,QAAQ,MAAM,WAAW;AAAA,UAC/D;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA,CACD;AAAA,MACH;AAAA,MACA,SAASC,iBAAAA,WAAW,SAAS,OAAO,WAAW,SAAS,CAAC;AAAA,IAAA;AAAA,IAE3D;AAAA,EAAA;AAEJ;AA4BO,SAAS,yBAKd,UACA,UAA+E,IACR;AACvE,QAAM,SAASZ,cAAAA,gBAAA;AACf,QAAM,SAASE,iBAAAA,yBAAA;AACf,QAAM,EAAE,eAAe,WAAW,gBAAgB,SAAS,GAAG,oBAAoB;AAClF,QAAM,OAAO,OAAO,QAAQ;AAC5B,SAAOW,WAAAA;AAAAA,IACL;AAAA,MACE,GAAG;AAAA;AAAA;AAAA,MAGH,YAAY,CAAC,cACXF,cAAAA,cAAiC,QAAQ,MAAM,WAAW;AAAA,QACxD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA,CACD;AAAA,IAAA;AAAA,IAEL;AAAA,EAAA;AAEJ;;;"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphQL on agora through TanStack Query, on the SDK's own client: a read
|
|
3
|
+
* (`useAthenaGraphQL`) cached per identity and cancelled when its last reader
|
|
4
|
+
* unmounts, and a write (`useAthenaGraphQLMutation`). Both run on the SDK's
|
|
5
|
+
* transport (`athenaGraphQL`), so a read and a write carry the provider's
|
|
6
|
+
* credential and fail as an `AthenaApiError`.
|
|
7
|
+
*/
|
|
8
|
+
import { type UseMutationOptions, type UseMutationResult, type UseQueryOptions, type UseQueryResult } from '@tanstack/react-query';
|
|
9
|
+
import { AthenaApiError } from './athena-api-error';
|
|
10
|
+
import { type AthenaGraphQLDocument, type AthenaGraphQLRequestOptions, type AthenaGraphQLVariables } from './athena-request';
|
|
11
|
+
/** Request options of a GraphQL hook (its `signal` is TanStack Query's). */
|
|
12
|
+
export type AthenaGraphQLHookRequestOptions = Omit<AthenaGraphQLRequestOptions, 'signal'>;
|
|
13
|
+
/**
|
|
14
|
+
* `useAthenaGraphQL`'s options: TanStack Query's (`enabled`, `select`,
|
|
15
|
+
* `staleTime`, `refetchInterval`…) and the request's (`timeoutMs`,
|
|
16
|
+
* `rateLimitRetry`, `operationName`, `headers`).
|
|
17
|
+
*/
|
|
18
|
+
export type UseAthenaGraphQLOptions<TData, TSelected = TData> = Omit<UseQueryOptions<TData, AthenaApiError, TSelected>, 'queryKey' | 'queryFn'> & AthenaGraphQLHookRequestOptions;
|
|
19
|
+
/**
|
|
20
|
+
* Read with one GraphQL query on agora's `/graphql`, as the signed-in person.
|
|
21
|
+
* Keyed by the identity (see `useAthenaDataScope`), the document and its
|
|
22
|
+
* variables. Never retried on a 4xx or a GraphQL error; a failure with no
|
|
23
|
+
* answer or a 5xx is asked twice more. Cancelled when no component reads it
|
|
24
|
+
* any more. A mutation is refused here (it would run again on every refetch):
|
|
25
|
+
* send it with `useAthenaGraphQLMutation`.
|
|
26
|
+
*
|
|
27
|
+
* ```tsx
|
|
28
|
+
* const { data, error } = useAthenaGraphQL<{ asset: { title: string } }, { id: string }>(
|
|
29
|
+
* `query Asset($id: String!) { asset(id: $id) { title } }`,
|
|
30
|
+
* { id },
|
|
31
|
+
* );
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare function useAthenaGraphQL<TData = unknown, TVariables extends object = AthenaGraphQLVariables, TSelected = TData>(document: AthenaGraphQLDocument<TData, TVariables>, variables?: TVariables, options?: UseAthenaGraphQLOptions<TData, TSelected>): UseQueryResult<TSelected, AthenaApiError>;
|
|
35
|
+
/**
|
|
36
|
+
* `useAthenaGraphQLMutation`'s options: TanStack Query's mutation options
|
|
37
|
+
* (`onSuccess`, `onError`, `onMutate`…) and the request's.
|
|
38
|
+
*/
|
|
39
|
+
export type UseAthenaGraphQLMutationOptions<TData, TVariables, TOnMutateResult = unknown> = Omit<UseMutationOptions<TData, AthenaApiError, TVariables, TOnMutateResult>, 'mutationFn'> & AthenaGraphQLHookRequestOptions;
|
|
40
|
+
/**
|
|
41
|
+
* Write with one GraphQL mutation on agora's `/graphql`, as the signed-in
|
|
42
|
+
* person: `mutate(variables)` / `mutateAsync(variables)`. Never retried (a 429
|
|
43
|
+
* from agora's limiter is waited out by the transport: it refuses before
|
|
44
|
+
* anything runs). A write already sent is not cancelled when its component
|
|
45
|
+
* unmounts, since agora may have applied it; `timeoutMs` still bounds it.
|
|
46
|
+
* Read the reads it changes again with `useInvalidateAthenaQueries`.
|
|
47
|
+
*
|
|
48
|
+
* ```tsx
|
|
49
|
+
* const invalidate = useInvalidateAthenaQueries();
|
|
50
|
+
* const rename = useAthenaGraphQLMutation<RenameResult, { id: string; title: string }>(RENAME, {
|
|
51
|
+
* onSuccess: () => invalidate({ operationNames: ['Asset'] }),
|
|
52
|
+
* });
|
|
53
|
+
* rename.mutate({ id, title });
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export declare function useAthenaGraphQLMutation<TData = unknown, TVariables extends object = AthenaGraphQLVariables, TOnMutateResult = unknown>(document: AthenaGraphQLDocument<TData, TVariables>, options?: UseAthenaGraphQLMutationOptions<TData, TVariables, TOnMutateResult>): UseMutationResult<TData, AthenaApiError, TVariables, TOnMutateResult>;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { useQuery, useMutation } from "@tanstack/react-query";
|
|
2
|
+
import { useAthenaConfig } from "../provider/AthenaContext.js";
|
|
3
|
+
import { AthenaApiError, AthenaApiErrorKind } from "./athena-api-error.js";
|
|
4
|
+
import { useAthenaDataScope, useAthenaDataQueryClient, AthenaDataKind, ATHENA_DATA_STALE_MS, athenaRetryDelay, retryAthenaRead, enabledAnd } from "./athena-data-client.js";
|
|
5
|
+
import { selectedGraphQLOperation, athenaGraphQL } from "./athena-request.js";
|
|
6
|
+
function useAthenaGraphQL(document, variables, options = {}) {
|
|
7
|
+
const config = useAthenaConfig();
|
|
8
|
+
const scope = useAthenaDataScope();
|
|
9
|
+
const client = useAthenaDataQueryClient();
|
|
10
|
+
const { operationName, timeoutMs, rateLimitRetry, headers, enabled, ...queryOptions } = options;
|
|
11
|
+
const text = String(document);
|
|
12
|
+
return useQuery(
|
|
13
|
+
{
|
|
14
|
+
retry: retryAthenaRead,
|
|
15
|
+
retryDelay: athenaRetryDelay,
|
|
16
|
+
staleTime: ATHENA_DATA_STALE_MS,
|
|
17
|
+
...queryOptions,
|
|
18
|
+
queryKey: [...scope, AthenaDataKind.GraphQL, text, variables ?? {}, operationName ?? null],
|
|
19
|
+
queryFn: ({ signal }) => {
|
|
20
|
+
var _a;
|
|
21
|
+
if (((_a = selectedGraphQLOperation(text, operationName)) == null ? void 0 : _a.type) !== "query") {
|
|
22
|
+
throw new AthenaApiError({
|
|
23
|
+
kind: AthenaApiErrorKind.Request,
|
|
24
|
+
message: "useAthenaGraphQL runs one query: name it with operationName when the document holds several, and send a mutation with useAthenaGraphQLMutation",
|
|
25
|
+
method: "POST",
|
|
26
|
+
path: "/graphql"
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
return athenaGraphQL(config, text, variables, {
|
|
30
|
+
operationName,
|
|
31
|
+
timeoutMs,
|
|
32
|
+
rateLimitRetry,
|
|
33
|
+
headers,
|
|
34
|
+
signal
|
|
35
|
+
});
|
|
36
|
+
},
|
|
37
|
+
enabled: enabledAnd(enabled, config.backendUrl.length > 0)
|
|
38
|
+
},
|
|
39
|
+
client
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
function useAthenaGraphQLMutation(document, options = {}) {
|
|
43
|
+
const config = useAthenaConfig();
|
|
44
|
+
const client = useAthenaDataQueryClient();
|
|
45
|
+
const { operationName, timeoutMs, rateLimitRetry, headers, ...mutationOptions } = options;
|
|
46
|
+
const text = String(document);
|
|
47
|
+
return useMutation(
|
|
48
|
+
{
|
|
49
|
+
...mutationOptions,
|
|
50
|
+
// TODO(#54756): send an Idempotency-Key per call once agora honours one, so
|
|
51
|
+
// a write sent twice (a retry, a double click) applies once.
|
|
52
|
+
mutationFn: (variables) => athenaGraphQL(config, text, variables, {
|
|
53
|
+
operationName,
|
|
54
|
+
timeoutMs,
|
|
55
|
+
rateLimitRetry,
|
|
56
|
+
headers
|
|
57
|
+
})
|
|
58
|
+
},
|
|
59
|
+
client
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
export {
|
|
63
|
+
useAthenaGraphQL,
|
|
64
|
+
useAthenaGraphQLMutation
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=use-athena-graphql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-athena-graphql.js","sources":["../../src/data/use-athena-graphql.ts"],"sourcesContent":["/**\n * GraphQL on agora through TanStack Query, on the SDK's own client: a read\n * (`useAthenaGraphQL`) cached per identity and cancelled when its last reader\n * unmounts, and a write (`useAthenaGraphQLMutation`). Both run on the SDK's\n * transport (`athenaGraphQL`), so a read and a write carry the provider's\n * credential and fail as an `AthenaApiError`.\n */\nimport {\n type UseMutationOptions,\n type UseMutationResult,\n type UseQueryOptions,\n type UseQueryResult,\n useMutation,\n useQuery,\n} from '@tanstack/react-query';\nimport { useAthenaConfig } from '../provider/AthenaContext';\nimport { AthenaApiError, AthenaApiErrorKind } from './athena-api-error';\nimport {\n ATHENA_DATA_STALE_MS,\n AthenaDataKind,\n athenaRetryDelay,\n enabledAnd,\n retryAthenaRead,\n useAthenaDataQueryClient,\n useAthenaDataScope,\n} from './athena-data-client';\nimport {\n type AthenaGraphQLDocument,\n type AthenaGraphQLRequestOptions,\n type AthenaGraphQLVariables,\n athenaGraphQL,\n selectedGraphQLOperation,\n} from './athena-request';\n\n/** Request options of a GraphQL hook (its `signal` is TanStack Query's). */\nexport type AthenaGraphQLHookRequestOptions = Omit<AthenaGraphQLRequestOptions, 'signal'>;\n\n/**\n * `useAthenaGraphQL`'s options: TanStack Query's (`enabled`, `select`,\n * `staleTime`, `refetchInterval`…) and the request's (`timeoutMs`,\n * `rateLimitRetry`, `operationName`, `headers`).\n */\nexport type UseAthenaGraphQLOptions<TData, TSelected = TData> = Omit<\n UseQueryOptions<TData, AthenaApiError, TSelected>,\n 'queryKey' | 'queryFn'\n> &\n AthenaGraphQLHookRequestOptions;\n\n/**\n * Read with one GraphQL query on agora's `/graphql`, as the signed-in person.\n * Keyed by the identity (see `useAthenaDataScope`), the document and its\n * variables. Never retried on a 4xx or a GraphQL error; a failure with no\n * answer or a 5xx is asked twice more. Cancelled when no component reads it\n * any more. A mutation is refused here (it would run again on every refetch):\n * send it with `useAthenaGraphQLMutation`.\n *\n * ```tsx\n * const { data, error } = useAthenaGraphQL<{ asset: { title: string } }, { id: string }>(\n * `query Asset($id: String!) { asset(id: $id) { title } }`,\n * { id },\n * );\n * ```\n */\nexport function useAthenaGraphQL<\n TData = unknown,\n TVariables extends object = AthenaGraphQLVariables,\n TSelected = TData,\n>(\n document: AthenaGraphQLDocument<TData, TVariables>,\n variables?: TVariables,\n options: UseAthenaGraphQLOptions<TData, TSelected> = {},\n): UseQueryResult<TSelected, AthenaApiError> {\n const config = useAthenaConfig();\n const scope = useAthenaDataScope();\n const client = useAthenaDataQueryClient();\n const { operationName, timeoutMs, rateLimitRetry, headers, enabled, ...queryOptions } = options;\n const text = String(document);\n return useQuery(\n {\n retry: retryAthenaRead,\n retryDelay: athenaRetryDelay,\n staleTime: ATHENA_DATA_STALE_MS,\n ...queryOptions,\n queryKey: [...scope, AthenaDataKind.GraphQL, text, variables ?? {}, operationName ?? null],\n queryFn: ({ signal }) => {\n // The operation agora would run (`operationName`'s, else the only\n // one), never just the document's first: a mutation or subscription\n // here would run again on every refetch.\n if (selectedGraphQLOperation(text, operationName)?.type !== 'query') {\n throw new AthenaApiError({\n kind: AthenaApiErrorKind.Request,\n message:\n 'useAthenaGraphQL runs one query: name it with operationName when the document holds several, and send a mutation with useAthenaGraphQLMutation',\n method: 'POST',\n path: '/graphql',\n });\n }\n return athenaGraphQL<TData, TVariables>(config, text, variables, {\n operationName,\n timeoutMs,\n rateLimitRetry,\n headers,\n signal,\n });\n },\n enabled: enabledAnd(enabled, config.backendUrl.length > 0),\n },\n client,\n );\n}\n\n/**\n * `useAthenaGraphQLMutation`'s options: TanStack Query's mutation options\n * (`onSuccess`, `onError`, `onMutate`…) and the request's.\n */\nexport type UseAthenaGraphQLMutationOptions<TData, TVariables, TOnMutateResult = unknown> = Omit<\n UseMutationOptions<TData, AthenaApiError, TVariables, TOnMutateResult>,\n 'mutationFn'\n> &\n AthenaGraphQLHookRequestOptions;\n\n/**\n * Write with one GraphQL mutation on agora's `/graphql`, as the signed-in\n * person: `mutate(variables)` / `mutateAsync(variables)`. Never retried (a 429\n * from agora's limiter is waited out by the transport: it refuses before\n * anything runs). A write already sent is not cancelled when its component\n * unmounts, since agora may have applied it; `timeoutMs` still bounds it.\n * Read the reads it changes again with `useInvalidateAthenaQueries`.\n *\n * ```tsx\n * const invalidate = useInvalidateAthenaQueries();\n * const rename = useAthenaGraphQLMutation<RenameResult, { id: string; title: string }>(RENAME, {\n * onSuccess: () => invalidate({ operationNames: ['Asset'] }),\n * });\n * rename.mutate({ id, title });\n * ```\n */\nexport function useAthenaGraphQLMutation<\n TData = unknown,\n TVariables extends object = AthenaGraphQLVariables,\n TOnMutateResult = unknown,\n>(\n document: AthenaGraphQLDocument<TData, TVariables>,\n options: UseAthenaGraphQLMutationOptions<TData, TVariables, TOnMutateResult> = {},\n): UseMutationResult<TData, AthenaApiError, TVariables, TOnMutateResult> {\n const config = useAthenaConfig();\n const client = useAthenaDataQueryClient();\n const { operationName, timeoutMs, rateLimitRetry, headers, ...mutationOptions } = options;\n const text = String(document);\n return useMutation(\n {\n ...mutationOptions,\n // TODO(#54756): send an Idempotency-Key per call once agora honours one, so\n // a write sent twice (a retry, a double click) applies once.\n mutationFn: (variables: TVariables) =>\n athenaGraphQL<TData, TVariables>(config, text, variables, {\n operationName,\n timeoutMs,\n rateLimitRetry,\n headers,\n }),\n },\n client,\n );\n}\n"],"names":[],"mappings":";;;;;AA+DO,SAAS,iBAKd,UACA,WACA,UAAqD,CAAA,GACV;AAC3C,QAAM,SAAS,gBAAA;AACf,QAAM,QAAQ,mBAAA;AACd,QAAM,SAAS,yBAAA;AACf,QAAM,EAAE,eAAe,WAAW,gBAAgB,SAAS,SAAS,GAAG,iBAAiB;AACxF,QAAM,OAAO,OAAO,QAAQ;AAC5B,SAAO;AAAA,IACL;AAAA,MACE,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,GAAG;AAAA,MACH,UAAU,CAAC,GAAG,OAAO,eAAe,SAAS,MAAM,aAAa,CAAA,GAAI,iBAAiB,IAAI;AAAA,MACzF,SAAS,CAAC,EAAE,aAAa;;AAIvB,cAAI,8BAAyB,MAAM,aAAa,MAA5C,mBAA+C,UAAS,SAAS;AACnE,gBAAM,IAAI,eAAe;AAAA,YACvB,MAAM,mBAAmB;AAAA,YACzB,SACE;AAAA,YACF,QAAQ;AAAA,YACR,MAAM;AAAA,UAAA,CACP;AAAA,QACH;AACA,eAAO,cAAiC,QAAQ,MAAM,WAAW;AAAA,UAC/D;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA,CACD;AAAA,MACH;AAAA,MACA,SAAS,WAAW,SAAS,OAAO,WAAW,SAAS,CAAC;AAAA,IAAA;AAAA,IAE3D;AAAA,EAAA;AAEJ;AA4BO,SAAS,yBAKd,UACA,UAA+E,IACR;AACvE,QAAM,SAAS,gBAAA;AACf,QAAM,SAAS,yBAAA;AACf,QAAM,EAAE,eAAe,WAAW,gBAAgB,SAAS,GAAG,oBAAoB;AAClF,QAAM,OAAO,OAAO,QAAQ;AAC5B,SAAO;AAAA,IACL;AAAA,MACE,GAAG;AAAA;AAAA;AAAA,MAGH,YAAY,CAAC,cACX,cAAiC,QAAQ,MAAM,WAAW;AAAA,QACxD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA,CACD;AAAA,IAAA;AAAA,IAEL;AAAA,EAAA;AAEJ;"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const reactQuery = require("@tanstack/react-query");
|
|
4
|
+
const AthenaContext = require("../provider/AthenaContext.cjs");
|
|
5
|
+
const athenaDataClient = require("./athena-data-client.cjs");
|
|
6
|
+
const athenaRequest = require("./athena-request.cjs");
|
|
7
|
+
function useAthenaRest(path, options = {}) {
|
|
8
|
+
const config = AthenaContext.useAthenaConfig();
|
|
9
|
+
const scope = athenaDataClient.useAthenaDataScope();
|
|
10
|
+
const client = athenaDataClient.useAthenaDataQueryClient();
|
|
11
|
+
const { params, timeoutMs, rateLimitRetry, headers, enabled, ...queryOptions } = options;
|
|
12
|
+
return reactQuery.useQuery(
|
|
13
|
+
{
|
|
14
|
+
retry: athenaDataClient.retryAthenaRead,
|
|
15
|
+
retryDelay: athenaDataClient.athenaRetryDelay,
|
|
16
|
+
staleTime: athenaDataClient.ATHENA_DATA_STALE_MS,
|
|
17
|
+
...queryOptions,
|
|
18
|
+
queryKey: [...scope, athenaDataClient.AthenaDataKind.Rest, path, params ?? {}],
|
|
19
|
+
queryFn: ({ signal }) => athenaRequest.athenaFetchJson(config, path ?? "", {
|
|
20
|
+
method: "GET",
|
|
21
|
+
params,
|
|
22
|
+
timeoutMs,
|
|
23
|
+
rateLimitRetry,
|
|
24
|
+
headers,
|
|
25
|
+
signal
|
|
26
|
+
}),
|
|
27
|
+
enabled: athenaDataClient.enabledAnd(enabled, path !== null && config.backendUrl.length > 0)
|
|
28
|
+
},
|
|
29
|
+
client
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
exports.useAthenaRest = useAthenaRest;
|
|
33
|
+
//# sourceMappingURL=use-athena-rest.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-athena-rest.cjs","sources":["../../src/data/use-athena-rest.ts"],"sourcesContent":["import { type UseQueryOptions, type UseQueryResult, useQuery } from '@tanstack/react-query';\nimport { useAthenaConfig } from '../provider/AthenaContext';\nimport type { AthenaApiError } from './athena-api-error';\nimport {\n ATHENA_DATA_STALE_MS,\n AthenaDataKind,\n athenaRetryDelay,\n enabledAnd,\n retryAthenaRead,\n useAthenaDataQueryClient,\n useAthenaDataScope,\n} from './athena-data-client';\nimport { type AthenaRequestOptions, athenaFetchJson } from './athena-request';\n\n/**\n * `useAthenaRest`'s options: TanStack Query's (`enabled`, `select`,\n * `staleTime`…), the query-string `params` (part of the cache key) and the\n * request's (`timeoutMs`, `rateLimitRetry`, `headers`).\n */\nexport type UseAthenaRestOptions<TData, TSelected = TData> = Omit<\n UseQueryOptions<TData, AthenaApiError, TSelected>,\n 'queryKey' | 'queryFn'\n> &\n Pick<AthenaRequestOptions, 'params' | 'timeoutMs' | 'rateLimitRetry' | 'headers'>;\n\n/**\n * Read one of agora's JSON `GET` routes as the signed-in person: `path` under\n * the provider's `backendUrl` (`/api/v0/me`, `/api/v0/assets/{id}`…), `null`\n * to hold the read idle. Cached per identity, path and `params`; retried and\n * cancelled as `useAthenaGraphQL` is. `TData` is the caller's word for what the\n * route answers.\n *\n * ```tsx\n * const me = useAthenaRest<{ user_id: string; workspace_id: string }>('/api/v0/me');\n * ```\n */\nexport function useAthenaRest<TData = unknown, TSelected = TData>(\n path: string | null,\n options: UseAthenaRestOptions<TData, TSelected> = {},\n): UseQueryResult<TSelected, AthenaApiError> {\n const config = useAthenaConfig();\n const scope = useAthenaDataScope();\n const client = useAthenaDataQueryClient();\n const { params, timeoutMs, rateLimitRetry, headers, enabled, ...queryOptions } = options;\n return useQuery(\n {\n retry: retryAthenaRead,\n retryDelay: athenaRetryDelay,\n staleTime: ATHENA_DATA_STALE_MS,\n ...queryOptions,\n queryKey: [...scope, AthenaDataKind.Rest, path, params ?? {}],\n queryFn: ({ signal }) =>\n athenaFetchJson<TData>(config, path ?? '', {\n method: 'GET',\n params,\n timeoutMs,\n rateLimitRetry,\n headers,\n signal,\n }),\n enabled: enabledAnd(enabled, path !== null && config.backendUrl.length > 0),\n },\n client,\n );\n}\n"],"names":["useAthenaConfig","useAthenaDataScope","useAthenaDataQueryClient","useQuery","retryAthenaRead","athenaRetryDelay","ATHENA_DATA_STALE_MS","AthenaDataKind","athenaFetchJson","enabledAnd"],"mappings":";;;;;;AAoCO,SAAS,cACd,MACA,UAAkD,IACP;AAC3C,QAAM,SAASA,cAAAA,gBAAA;AACf,QAAM,QAAQC,iBAAAA,mBAAA;AACd,QAAM,SAASC,iBAAAA,yBAAA;AACf,QAAM,EAAE,QAAQ,WAAW,gBAAgB,SAAS,SAAS,GAAG,iBAAiB;AACjF,SAAOC,WAAAA;AAAAA,IACL;AAAA,MACE,OAAOC,iBAAAA;AAAAA,MACP,YAAYC,iBAAAA;AAAAA,MACZ,WAAWC,iBAAAA;AAAAA,MACX,GAAG;AAAA,MACH,UAAU,CAAC,GAAG,OAAOC,iBAAAA,eAAe,MAAM,MAAM,UAAU,EAAE;AAAA,MAC5D,SAAS,CAAC,EAAE,OAAA,MACVC,cAAAA,gBAAuB,QAAQ,QAAQ,IAAI;AAAA,QACzC,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA,CACD;AAAA,MACH,SAASC,iBAAAA,WAAW,SAAS,SAAS,QAAQ,OAAO,WAAW,SAAS,CAAC;AAAA,IAAA;AAAA,IAE5E;AAAA,EAAA;AAEJ;;"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type UseQueryOptions, type UseQueryResult } from '@tanstack/react-query';
|
|
2
|
+
import type { AthenaApiError } from './athena-api-error';
|
|
3
|
+
import { type AthenaRequestOptions } from './athena-request';
|
|
4
|
+
/**
|
|
5
|
+
* `useAthenaRest`'s options: TanStack Query's (`enabled`, `select`,
|
|
6
|
+
* `staleTime`…), the query-string `params` (part of the cache key) and the
|
|
7
|
+
* request's (`timeoutMs`, `rateLimitRetry`, `headers`).
|
|
8
|
+
*/
|
|
9
|
+
export type UseAthenaRestOptions<TData, TSelected = TData> = Omit<UseQueryOptions<TData, AthenaApiError, TSelected>, 'queryKey' | 'queryFn'> & Pick<AthenaRequestOptions, 'params' | 'timeoutMs' | 'rateLimitRetry' | 'headers'>;
|
|
10
|
+
/**
|
|
11
|
+
* Read one of agora's JSON `GET` routes as the signed-in person: `path` under
|
|
12
|
+
* the provider's `backendUrl` (`/api/v0/me`, `/api/v0/assets/{id}`…), `null`
|
|
13
|
+
* to hold the read idle. Cached per identity, path and `params`; retried and
|
|
14
|
+
* cancelled as `useAthenaGraphQL` is. `TData` is the caller's word for what the
|
|
15
|
+
* route answers.
|
|
16
|
+
*
|
|
17
|
+
* ```tsx
|
|
18
|
+
* const me = useAthenaRest<{ user_id: string; workspace_id: string }>('/api/v0/me');
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare function useAthenaRest<TData = unknown, TSelected = TData>(path: string | null, options?: UseAthenaRestOptions<TData, TSelected>): UseQueryResult<TSelected, AthenaApiError>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { useQuery } from "@tanstack/react-query";
|
|
2
|
+
import { useAthenaConfig } from "../provider/AthenaContext.js";
|
|
3
|
+
import { useAthenaDataScope, useAthenaDataQueryClient, AthenaDataKind, ATHENA_DATA_STALE_MS, athenaRetryDelay, retryAthenaRead, enabledAnd } from "./athena-data-client.js";
|
|
4
|
+
import { athenaFetchJson } from "./athena-request.js";
|
|
5
|
+
function useAthenaRest(path, options = {}) {
|
|
6
|
+
const config = useAthenaConfig();
|
|
7
|
+
const scope = useAthenaDataScope();
|
|
8
|
+
const client = useAthenaDataQueryClient();
|
|
9
|
+
const { params, timeoutMs, rateLimitRetry, headers, enabled, ...queryOptions } = options;
|
|
10
|
+
return useQuery(
|
|
11
|
+
{
|
|
12
|
+
retry: retryAthenaRead,
|
|
13
|
+
retryDelay: athenaRetryDelay,
|
|
14
|
+
staleTime: ATHENA_DATA_STALE_MS,
|
|
15
|
+
...queryOptions,
|
|
16
|
+
queryKey: [...scope, AthenaDataKind.Rest, path, params ?? {}],
|
|
17
|
+
queryFn: ({ signal }) => athenaFetchJson(config, path ?? "", {
|
|
18
|
+
method: "GET",
|
|
19
|
+
params,
|
|
20
|
+
timeoutMs,
|
|
21
|
+
rateLimitRetry,
|
|
22
|
+
headers,
|
|
23
|
+
signal
|
|
24
|
+
}),
|
|
25
|
+
enabled: enabledAnd(enabled, path !== null && config.backendUrl.length > 0)
|
|
26
|
+
},
|
|
27
|
+
client
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
export {
|
|
31
|
+
useAthenaRest
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=use-athena-rest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-athena-rest.js","sources":["../../src/data/use-athena-rest.ts"],"sourcesContent":["import { type UseQueryOptions, type UseQueryResult, useQuery } from '@tanstack/react-query';\nimport { useAthenaConfig } from '../provider/AthenaContext';\nimport type { AthenaApiError } from './athena-api-error';\nimport {\n ATHENA_DATA_STALE_MS,\n AthenaDataKind,\n athenaRetryDelay,\n enabledAnd,\n retryAthenaRead,\n useAthenaDataQueryClient,\n useAthenaDataScope,\n} from './athena-data-client';\nimport { type AthenaRequestOptions, athenaFetchJson } from './athena-request';\n\n/**\n * `useAthenaRest`'s options: TanStack Query's (`enabled`, `select`,\n * `staleTime`…), the query-string `params` (part of the cache key) and the\n * request's (`timeoutMs`, `rateLimitRetry`, `headers`).\n */\nexport type UseAthenaRestOptions<TData, TSelected = TData> = Omit<\n UseQueryOptions<TData, AthenaApiError, TSelected>,\n 'queryKey' | 'queryFn'\n> &\n Pick<AthenaRequestOptions, 'params' | 'timeoutMs' | 'rateLimitRetry' | 'headers'>;\n\n/**\n * Read one of agora's JSON `GET` routes as the signed-in person: `path` under\n * the provider's `backendUrl` (`/api/v0/me`, `/api/v0/assets/{id}`…), `null`\n * to hold the read idle. Cached per identity, path and `params`; retried and\n * cancelled as `useAthenaGraphQL` is. `TData` is the caller's word for what the\n * route answers.\n *\n * ```tsx\n * const me = useAthenaRest<{ user_id: string; workspace_id: string }>('/api/v0/me');\n * ```\n */\nexport function useAthenaRest<TData = unknown, TSelected = TData>(\n path: string | null,\n options: UseAthenaRestOptions<TData, TSelected> = {},\n): UseQueryResult<TSelected, AthenaApiError> {\n const config = useAthenaConfig();\n const scope = useAthenaDataScope();\n const client = useAthenaDataQueryClient();\n const { params, timeoutMs, rateLimitRetry, headers, enabled, ...queryOptions } = options;\n return useQuery(\n {\n retry: retryAthenaRead,\n retryDelay: athenaRetryDelay,\n staleTime: ATHENA_DATA_STALE_MS,\n ...queryOptions,\n queryKey: [...scope, AthenaDataKind.Rest, path, params ?? {}],\n queryFn: ({ signal }) =>\n athenaFetchJson<TData>(config, path ?? '', {\n method: 'GET',\n params,\n timeoutMs,\n rateLimitRetry,\n headers,\n signal,\n }),\n enabled: enabledAnd(enabled, path !== null && config.backendUrl.length > 0),\n },\n client,\n );\n}\n"],"names":[],"mappings":";;;;AAoCO,SAAS,cACd,MACA,UAAkD,IACP;AAC3C,QAAM,SAAS,gBAAA;AACf,QAAM,QAAQ,mBAAA;AACd,QAAM,SAAS,yBAAA;AACf,QAAM,EAAE,QAAQ,WAAW,gBAAgB,SAAS,SAAS,GAAG,iBAAiB;AACjF,SAAO;AAAA,IACL;AAAA,MACE,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,GAAG;AAAA,MACH,UAAU,CAAC,GAAG,OAAO,eAAe,MAAM,MAAM,UAAU,EAAE;AAAA,MAC5D,SAAS,CAAC,EAAE,OAAA,MACV,gBAAuB,QAAQ,QAAQ,IAAI;AAAA,QACzC,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA,CACD;AAAA,MACH,SAAS,WAAW,SAAS,SAAS,QAAQ,OAAO,WAAW,SAAS,CAAC;AAAA,IAAA;AAAA,IAE5E;AAAA,EAAA;AAEJ;"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const reactQuery = require("@tanstack/react-query");
|
|
4
|
+
const AthenaContext = require("../provider/AthenaContext.cjs");
|
|
5
|
+
const athenaDataClient = require("./athena-data-client.cjs");
|
|
6
|
+
const athenaRequest = require("./athena-request.cjs");
|
|
7
|
+
function semanticQueryPath(semanticModelId) {
|
|
8
|
+
return `/api/v0/semantic-model/${encodeURIComponent(semanticModelId)}/query`;
|
|
9
|
+
}
|
|
10
|
+
const SEMANTIC_QUERY_TIMEOUT_MS = 9e4;
|
|
11
|
+
function useSemanticQuery({
|
|
12
|
+
semanticModelId,
|
|
13
|
+
query,
|
|
14
|
+
timeoutMs = SEMANTIC_QUERY_TIMEOUT_MS,
|
|
15
|
+
rateLimitRetry,
|
|
16
|
+
enabled,
|
|
17
|
+
...queryOptions
|
|
18
|
+
}) {
|
|
19
|
+
const config = AthenaContext.useAthenaConfig();
|
|
20
|
+
const scope = athenaDataClient.useAthenaDataScope();
|
|
21
|
+
const client = athenaDataClient.useAthenaDataQueryClient();
|
|
22
|
+
return reactQuery.useQuery(
|
|
23
|
+
{
|
|
24
|
+
retry: athenaDataClient.retryAthenaRead,
|
|
25
|
+
retryDelay: athenaDataClient.athenaRetryDelay,
|
|
26
|
+
staleTime: athenaDataClient.ATHENA_DATA_STALE_MS,
|
|
27
|
+
...queryOptions,
|
|
28
|
+
queryKey: [...scope, athenaDataClient.AthenaDataKind.SemanticQuery, semanticModelId, query],
|
|
29
|
+
queryFn: ({ signal }) => athenaRequest.athenaFetchJson(config, semanticQueryPath(semanticModelId ?? ""), {
|
|
30
|
+
method: "POST",
|
|
31
|
+
json: query,
|
|
32
|
+
timeoutMs,
|
|
33
|
+
rateLimitRetry,
|
|
34
|
+
signal
|
|
35
|
+
}),
|
|
36
|
+
enabled: athenaDataClient.enabledAnd(enabled, semanticModelId !== null && config.backendUrl.length > 0)
|
|
37
|
+
},
|
|
38
|
+
client
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
exports.SEMANTIC_QUERY_TIMEOUT_MS = SEMANTIC_QUERY_TIMEOUT_MS;
|
|
42
|
+
exports.semanticQueryPath = semanticQueryPath;
|
|
43
|
+
exports.useSemanticQuery = useSemanticQuery;
|
|
44
|
+
//# sourceMappingURL=use-semantic-query.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-semantic-query.cjs","sources":["../../src/data/use-semantic-query.ts"],"sourcesContent":["/**\n * A semantic model's metrics, read through agora's public semantic query API\n * (`POST /api/v0/semantic-model/{asset_id}/query`, `query_semantic_model` in\n * `agora/agora/web/api/public/v0/views/semantic_model.py`). The query runs as\n * the signed-in person: agora checks their access to the model, and to its\n * lakehouse sources, before Cube runs it. The types below are that route's own\n * request and response (`SemanticModelQueryRequestIn`,\n * `SemanticModelQueryResponseOut` in `agora/openapi.json`), field for field.\n */\nimport { type UseQueryOptions, type UseQueryResult, useQuery } from '@tanstack/react-query';\nimport { useAthenaConfig } from '../provider/AthenaContext';\nimport type { AthenaApiError } from './athena-api-error';\nimport {\n ATHENA_DATA_STALE_MS,\n AthenaDataKind,\n athenaRetryDelay,\n enabledAnd,\n retryAthenaRead,\n useAthenaDataQueryClient,\n useAthenaDataScope,\n} from './athena-data-client';\nimport { type AthenaRequestOptions, athenaFetchJson } from './athena-request';\n\n/** An order entry: `[member, direction]`, or `{ member, direction }`. */\nexport type AthenaSemanticOrder =\n | readonly [member: string, direction: 'asc' | 'desc']\n | { member: string; direction?: 'asc' | 'desc' };\n\n/** A metric query (`SemanticModelQueryRequestIn`). */\nexport interface AthenaSemanticQuery {\n /** Measure identifiers, e.g. `[\"orders.total_revenue\"]`. */\n measures: readonly string[];\n /** Dimension identifiers to group by. */\n dimensions?: readonly string[];\n /** Cube filters. */\n filters?: readonly Readonly<Record<string, unknown>>[];\n /**\n * Cube time dimensions, e.g.\n * `[{ dimension: 'orders.created_at', granularity: 'month', dateRange: ['2026-01-01', '2026-06-30'] }]`.\n */\n time_dimensions?: readonly Readonly<Record<string, unknown>>[];\n /** The order applied before `limit` (a server-side top N). */\n order?: readonly AthenaSemanticOrder[];\n /** At most this many rows, 1 to 5000 (agora's default 100); `truncated` says when there were more. */\n limit?: number;\n}\n\n/** One source table's Iceberg state when the query ran (`SemanticModelSourceSnapshotOut`). */\nexport interface AthenaSemanticSourceSnapshot {\n namespace: string;\n table: string;\n table_uuid: string;\n snapshot_id?: string | null;\n committed_at?: string | null;\n}\n\n/**\n * A metric query's answer (`SemanticModelQueryResponseOut`). The fields after\n * `row_count` are optional: an older agora leaves them out.\n */\nexport interface AthenaSemanticQueryResult {\n /** The rows, keyed by member. */\n data: Record<string, unknown>[];\n row_count: number;\n /** True when the query had more rows than `limit`. */\n truncated?: boolean;\n /** How long the semantic layer and its engine took, in ms. */\n elapsed_ms?: number;\n /** When the data is current as of (ISO-8601 UTC); `null` when the engine exposes no snapshot. */\n data_as_of?: string | null;\n /** `'snapshot'` (lakehouse snapshots) or `'query_time'`. */\n as_of_kind?: string | null;\n /** When the engine computed the result (ISO-8601 UTC). */\n queried_at?: string | null;\n source_snapshots?: AthenaSemanticSourceSnapshot[] | null;\n /** The deployed model definition that computed the rows. */\n schema_hash?: string | null;\n schema_version?: number | null;\n}\n\n/** The public semantic query route of a model. */\nexport function semanticQueryPath(semanticModelId: string): string {\n return `/api/v0/semantic-model/${encodeURIComponent(semanticModelId)}/query`;\n}\n\n/**\n * agora waits up to 60 s for the semantic layer before it answers 504 with\n * `Retry-After: 15`, so a semantic query is given longer than other requests.\n */\nexport const SEMANTIC_QUERY_TIMEOUT_MS = 90_000;\n\nexport type UseSemanticQueryOptions<TSelected = AthenaSemanticQueryResult> = Omit<\n UseQueryOptions<AthenaSemanticQueryResult, AthenaApiError, TSelected>,\n 'queryKey' | 'queryFn'\n> &\n Pick<AthenaRequestOptions, 'timeoutMs' | 'rateLimitRetry'> & {\n /** The semantic model asset (`asset_…`); `null` holds the read idle. */\n semanticModelId: string | null;\n query: AthenaSemanticQuery;\n };\n\n/**\n * Run a metric query on a semantic model as the signed-in person. Cached per\n * identity, model and query; a 504 (the engine still computing) is asked again\n * after the `Retry-After` agora sends, which joins the query still running;\n * a refusal (401 / 403 / 404) or an invalid query (400 / 422) is not.\n *\n * ```tsx\n * const revenue = useSemanticQuery({\n * semanticModelId,\n * query: { measures: ['orders.total_revenue'], dimensions: ['orders.region'], limit: 20 },\n * });\n * ```\n */\nexport function useSemanticQuery<TSelected = AthenaSemanticQueryResult>({\n semanticModelId,\n query,\n timeoutMs = SEMANTIC_QUERY_TIMEOUT_MS,\n rateLimitRetry,\n enabled,\n ...queryOptions\n}: UseSemanticQueryOptions<TSelected>): UseQueryResult<TSelected, AthenaApiError> {\n const config = useAthenaConfig();\n const scope = useAthenaDataScope();\n const client = useAthenaDataQueryClient();\n return useQuery(\n {\n retry: retryAthenaRead,\n retryDelay: athenaRetryDelay,\n staleTime: ATHENA_DATA_STALE_MS,\n ...queryOptions,\n queryKey: [...scope, AthenaDataKind.SemanticQuery, semanticModelId, query],\n queryFn: ({ signal }) =>\n athenaFetchJson<AthenaSemanticQueryResult>(config, semanticQueryPath(semanticModelId ?? ''), {\n method: 'POST',\n json: query,\n timeoutMs,\n rateLimitRetry,\n signal,\n }),\n enabled: enabledAnd(enabled, semanticModelId !== null && config.backendUrl.length > 0),\n },\n client,\n );\n}\n"],"names":["useAthenaConfig","useAthenaDataScope","useAthenaDataQueryClient","useQuery","retryAthenaRead","athenaRetryDelay","ATHENA_DATA_STALE_MS","AthenaDataKind","athenaFetchJson","enabledAnd"],"mappings":";;;;;;AAiFO,SAAS,kBAAkB,iBAAiC;AACjE,SAAO,0BAA0B,mBAAmB,eAAe,CAAC;AACtE;AAMO,MAAM,4BAA4B;AAyBlC,SAAS,iBAAwD;AAAA,EACtE;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAkF;AAChF,QAAM,SAASA,cAAAA,gBAAA;AACf,QAAM,QAAQC,iBAAAA,mBAAA;AACd,QAAM,SAASC,iBAAAA,yBAAA;AACf,SAAOC,WAAAA;AAAAA,IACL;AAAA,MACE,OAAOC,iBAAAA;AAAAA,MACP,YAAYC,iBAAAA;AAAAA,MACZ,WAAWC,iBAAAA;AAAAA,MACX,GAAG;AAAA,MACH,UAAU,CAAC,GAAG,OAAOC,iBAAAA,eAAe,eAAe,iBAAiB,KAAK;AAAA,MACzE,SAAS,CAAC,EAAE,aACVC,cAAAA,gBAA2C,QAAQ,kBAAkB,mBAAmB,EAAE,GAAG;AAAA,QAC3F,QAAQ;AAAA,QACR,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,MAAA,CACD;AAAA,MACH,SAASC,iBAAAA,WAAW,SAAS,oBAAoB,QAAQ,OAAO,WAAW,SAAS,CAAC;AAAA,IAAA;AAAA,IAEvF;AAAA,EAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A semantic model's metrics, read through agora's public semantic query API
|
|
3
|
+
* (`POST /api/v0/semantic-model/{asset_id}/query`, `query_semantic_model` in
|
|
4
|
+
* `agora/agora/web/api/public/v0/views/semantic_model.py`). The query runs as
|
|
5
|
+
* the signed-in person: agora checks their access to the model, and to its
|
|
6
|
+
* lakehouse sources, before Cube runs it. The types below are that route's own
|
|
7
|
+
* request and response (`SemanticModelQueryRequestIn`,
|
|
8
|
+
* `SemanticModelQueryResponseOut` in `agora/openapi.json`), field for field.
|
|
9
|
+
*/
|
|
10
|
+
import { type UseQueryOptions, type UseQueryResult } from '@tanstack/react-query';
|
|
11
|
+
import type { AthenaApiError } from './athena-api-error';
|
|
12
|
+
import { type AthenaRequestOptions } from './athena-request';
|
|
13
|
+
/** An order entry: `[member, direction]`, or `{ member, direction }`. */
|
|
14
|
+
export type AthenaSemanticOrder = readonly [member: string, direction: 'asc' | 'desc'] | {
|
|
15
|
+
member: string;
|
|
16
|
+
direction?: 'asc' | 'desc';
|
|
17
|
+
};
|
|
18
|
+
/** A metric query (`SemanticModelQueryRequestIn`). */
|
|
19
|
+
export interface AthenaSemanticQuery {
|
|
20
|
+
/** Measure identifiers, e.g. `["orders.total_revenue"]`. */
|
|
21
|
+
measures: readonly string[];
|
|
22
|
+
/** Dimension identifiers to group by. */
|
|
23
|
+
dimensions?: readonly string[];
|
|
24
|
+
/** Cube filters. */
|
|
25
|
+
filters?: readonly Readonly<Record<string, unknown>>[];
|
|
26
|
+
/**
|
|
27
|
+
* Cube time dimensions, e.g.
|
|
28
|
+
* `[{ dimension: 'orders.created_at', granularity: 'month', dateRange: ['2026-01-01', '2026-06-30'] }]`.
|
|
29
|
+
*/
|
|
30
|
+
time_dimensions?: readonly Readonly<Record<string, unknown>>[];
|
|
31
|
+
/** The order applied before `limit` (a server-side top N). */
|
|
32
|
+
order?: readonly AthenaSemanticOrder[];
|
|
33
|
+
/** At most this many rows, 1 to 5000 (agora's default 100); `truncated` says when there were more. */
|
|
34
|
+
limit?: number;
|
|
35
|
+
}
|
|
36
|
+
/** One source table's Iceberg state when the query ran (`SemanticModelSourceSnapshotOut`). */
|
|
37
|
+
export interface AthenaSemanticSourceSnapshot {
|
|
38
|
+
namespace: string;
|
|
39
|
+
table: string;
|
|
40
|
+
table_uuid: string;
|
|
41
|
+
snapshot_id?: string | null;
|
|
42
|
+
committed_at?: string | null;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* A metric query's answer (`SemanticModelQueryResponseOut`). The fields after
|
|
46
|
+
* `row_count` are optional: an older agora leaves them out.
|
|
47
|
+
*/
|
|
48
|
+
export interface AthenaSemanticQueryResult {
|
|
49
|
+
/** The rows, keyed by member. */
|
|
50
|
+
data: Record<string, unknown>[];
|
|
51
|
+
row_count: number;
|
|
52
|
+
/** True when the query had more rows than `limit`. */
|
|
53
|
+
truncated?: boolean;
|
|
54
|
+
/** How long the semantic layer and its engine took, in ms. */
|
|
55
|
+
elapsed_ms?: number;
|
|
56
|
+
/** When the data is current as of (ISO-8601 UTC); `null` when the engine exposes no snapshot. */
|
|
57
|
+
data_as_of?: string | null;
|
|
58
|
+
/** `'snapshot'` (lakehouse snapshots) or `'query_time'`. */
|
|
59
|
+
as_of_kind?: string | null;
|
|
60
|
+
/** When the engine computed the result (ISO-8601 UTC). */
|
|
61
|
+
queried_at?: string | null;
|
|
62
|
+
source_snapshots?: AthenaSemanticSourceSnapshot[] | null;
|
|
63
|
+
/** The deployed model definition that computed the rows. */
|
|
64
|
+
schema_hash?: string | null;
|
|
65
|
+
schema_version?: number | null;
|
|
66
|
+
}
|
|
67
|
+
/** The public semantic query route of a model. */
|
|
68
|
+
export declare function semanticQueryPath(semanticModelId: string): string;
|
|
69
|
+
/**
|
|
70
|
+
* agora waits up to 60 s for the semantic layer before it answers 504 with
|
|
71
|
+
* `Retry-After: 15`, so a semantic query is given longer than other requests.
|
|
72
|
+
*/
|
|
73
|
+
export declare const SEMANTIC_QUERY_TIMEOUT_MS = 90000;
|
|
74
|
+
export type UseSemanticQueryOptions<TSelected = AthenaSemanticQueryResult> = Omit<UseQueryOptions<AthenaSemanticQueryResult, AthenaApiError, TSelected>, 'queryKey' | 'queryFn'> & Pick<AthenaRequestOptions, 'timeoutMs' | 'rateLimitRetry'> & {
|
|
75
|
+
/** The semantic model asset (`asset_…`); `null` holds the read idle. */
|
|
76
|
+
semanticModelId: string | null;
|
|
77
|
+
query: AthenaSemanticQuery;
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* Run a metric query on a semantic model as the signed-in person. Cached per
|
|
81
|
+
* identity, model and query; a 504 (the engine still computing) is asked again
|
|
82
|
+
* after the `Retry-After` agora sends, which joins the query still running;
|
|
83
|
+
* a refusal (401 / 403 / 404) or an invalid query (400 / 422) is not.
|
|
84
|
+
*
|
|
85
|
+
* ```tsx
|
|
86
|
+
* const revenue = useSemanticQuery({
|
|
87
|
+
* semanticModelId,
|
|
88
|
+
* query: { measures: ['orders.total_revenue'], dimensions: ['orders.region'], limit: 20 },
|
|
89
|
+
* });
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
export declare function useSemanticQuery<TSelected = AthenaSemanticQueryResult>({ semanticModelId, query, timeoutMs, rateLimitRetry, enabled, ...queryOptions }: UseSemanticQueryOptions<TSelected>): UseQueryResult<TSelected, AthenaApiError>;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { useQuery } from "@tanstack/react-query";
|
|
2
|
+
import { useAthenaConfig } from "../provider/AthenaContext.js";
|
|
3
|
+
import { useAthenaDataScope, useAthenaDataQueryClient, AthenaDataKind, ATHENA_DATA_STALE_MS, athenaRetryDelay, retryAthenaRead, enabledAnd } from "./athena-data-client.js";
|
|
4
|
+
import { athenaFetchJson } from "./athena-request.js";
|
|
5
|
+
function semanticQueryPath(semanticModelId) {
|
|
6
|
+
return `/api/v0/semantic-model/${encodeURIComponent(semanticModelId)}/query`;
|
|
7
|
+
}
|
|
8
|
+
const SEMANTIC_QUERY_TIMEOUT_MS = 9e4;
|
|
9
|
+
function useSemanticQuery({
|
|
10
|
+
semanticModelId,
|
|
11
|
+
query,
|
|
12
|
+
timeoutMs = SEMANTIC_QUERY_TIMEOUT_MS,
|
|
13
|
+
rateLimitRetry,
|
|
14
|
+
enabled,
|
|
15
|
+
...queryOptions
|
|
16
|
+
}) {
|
|
17
|
+
const config = useAthenaConfig();
|
|
18
|
+
const scope = useAthenaDataScope();
|
|
19
|
+
const client = useAthenaDataQueryClient();
|
|
20
|
+
return useQuery(
|
|
21
|
+
{
|
|
22
|
+
retry: retryAthenaRead,
|
|
23
|
+
retryDelay: athenaRetryDelay,
|
|
24
|
+
staleTime: ATHENA_DATA_STALE_MS,
|
|
25
|
+
...queryOptions,
|
|
26
|
+
queryKey: [...scope, AthenaDataKind.SemanticQuery, semanticModelId, query],
|
|
27
|
+
queryFn: ({ signal }) => athenaFetchJson(config, semanticQueryPath(semanticModelId ?? ""), {
|
|
28
|
+
method: "POST",
|
|
29
|
+
json: query,
|
|
30
|
+
timeoutMs,
|
|
31
|
+
rateLimitRetry,
|
|
32
|
+
signal
|
|
33
|
+
}),
|
|
34
|
+
enabled: enabledAnd(enabled, semanticModelId !== null && config.backendUrl.length > 0)
|
|
35
|
+
},
|
|
36
|
+
client
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
export {
|
|
40
|
+
SEMANTIC_QUERY_TIMEOUT_MS,
|
|
41
|
+
semanticQueryPath,
|
|
42
|
+
useSemanticQuery
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=use-semantic-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-semantic-query.js","sources":["../../src/data/use-semantic-query.ts"],"sourcesContent":["/**\n * A semantic model's metrics, read through agora's public semantic query API\n * (`POST /api/v0/semantic-model/{asset_id}/query`, `query_semantic_model` in\n * `agora/agora/web/api/public/v0/views/semantic_model.py`). The query runs as\n * the signed-in person: agora checks their access to the model, and to its\n * lakehouse sources, before Cube runs it. The types below are that route's own\n * request and response (`SemanticModelQueryRequestIn`,\n * `SemanticModelQueryResponseOut` in `agora/openapi.json`), field for field.\n */\nimport { type UseQueryOptions, type UseQueryResult, useQuery } from '@tanstack/react-query';\nimport { useAthenaConfig } from '../provider/AthenaContext';\nimport type { AthenaApiError } from './athena-api-error';\nimport {\n ATHENA_DATA_STALE_MS,\n AthenaDataKind,\n athenaRetryDelay,\n enabledAnd,\n retryAthenaRead,\n useAthenaDataQueryClient,\n useAthenaDataScope,\n} from './athena-data-client';\nimport { type AthenaRequestOptions, athenaFetchJson } from './athena-request';\n\n/** An order entry: `[member, direction]`, or `{ member, direction }`. */\nexport type AthenaSemanticOrder =\n | readonly [member: string, direction: 'asc' | 'desc']\n | { member: string; direction?: 'asc' | 'desc' };\n\n/** A metric query (`SemanticModelQueryRequestIn`). */\nexport interface AthenaSemanticQuery {\n /** Measure identifiers, e.g. `[\"orders.total_revenue\"]`. */\n measures: readonly string[];\n /** Dimension identifiers to group by. */\n dimensions?: readonly string[];\n /** Cube filters. */\n filters?: readonly Readonly<Record<string, unknown>>[];\n /**\n * Cube time dimensions, e.g.\n * `[{ dimension: 'orders.created_at', granularity: 'month', dateRange: ['2026-01-01', '2026-06-30'] }]`.\n */\n time_dimensions?: readonly Readonly<Record<string, unknown>>[];\n /** The order applied before `limit` (a server-side top N). */\n order?: readonly AthenaSemanticOrder[];\n /** At most this many rows, 1 to 5000 (agora's default 100); `truncated` says when there were more. */\n limit?: number;\n}\n\n/** One source table's Iceberg state when the query ran (`SemanticModelSourceSnapshotOut`). */\nexport interface AthenaSemanticSourceSnapshot {\n namespace: string;\n table: string;\n table_uuid: string;\n snapshot_id?: string | null;\n committed_at?: string | null;\n}\n\n/**\n * A metric query's answer (`SemanticModelQueryResponseOut`). The fields after\n * `row_count` are optional: an older agora leaves them out.\n */\nexport interface AthenaSemanticQueryResult {\n /** The rows, keyed by member. */\n data: Record<string, unknown>[];\n row_count: number;\n /** True when the query had more rows than `limit`. */\n truncated?: boolean;\n /** How long the semantic layer and its engine took, in ms. */\n elapsed_ms?: number;\n /** When the data is current as of (ISO-8601 UTC); `null` when the engine exposes no snapshot. */\n data_as_of?: string | null;\n /** `'snapshot'` (lakehouse snapshots) or `'query_time'`. */\n as_of_kind?: string | null;\n /** When the engine computed the result (ISO-8601 UTC). */\n queried_at?: string | null;\n source_snapshots?: AthenaSemanticSourceSnapshot[] | null;\n /** The deployed model definition that computed the rows. */\n schema_hash?: string | null;\n schema_version?: number | null;\n}\n\n/** The public semantic query route of a model. */\nexport function semanticQueryPath(semanticModelId: string): string {\n return `/api/v0/semantic-model/${encodeURIComponent(semanticModelId)}/query`;\n}\n\n/**\n * agora waits up to 60 s for the semantic layer before it answers 504 with\n * `Retry-After: 15`, so a semantic query is given longer than other requests.\n */\nexport const SEMANTIC_QUERY_TIMEOUT_MS = 90_000;\n\nexport type UseSemanticQueryOptions<TSelected = AthenaSemanticQueryResult> = Omit<\n UseQueryOptions<AthenaSemanticQueryResult, AthenaApiError, TSelected>,\n 'queryKey' | 'queryFn'\n> &\n Pick<AthenaRequestOptions, 'timeoutMs' | 'rateLimitRetry'> & {\n /** The semantic model asset (`asset_…`); `null` holds the read idle. */\n semanticModelId: string | null;\n query: AthenaSemanticQuery;\n };\n\n/**\n * Run a metric query on a semantic model as the signed-in person. Cached per\n * identity, model and query; a 504 (the engine still computing) is asked again\n * after the `Retry-After` agora sends, which joins the query still running;\n * a refusal (401 / 403 / 404) or an invalid query (400 / 422) is not.\n *\n * ```tsx\n * const revenue = useSemanticQuery({\n * semanticModelId,\n * query: { measures: ['orders.total_revenue'], dimensions: ['orders.region'], limit: 20 },\n * });\n * ```\n */\nexport function useSemanticQuery<TSelected = AthenaSemanticQueryResult>({\n semanticModelId,\n query,\n timeoutMs = SEMANTIC_QUERY_TIMEOUT_MS,\n rateLimitRetry,\n enabled,\n ...queryOptions\n}: UseSemanticQueryOptions<TSelected>): UseQueryResult<TSelected, AthenaApiError> {\n const config = useAthenaConfig();\n const scope = useAthenaDataScope();\n const client = useAthenaDataQueryClient();\n return useQuery(\n {\n retry: retryAthenaRead,\n retryDelay: athenaRetryDelay,\n staleTime: ATHENA_DATA_STALE_MS,\n ...queryOptions,\n queryKey: [...scope, AthenaDataKind.SemanticQuery, semanticModelId, query],\n queryFn: ({ signal }) =>\n athenaFetchJson<AthenaSemanticQueryResult>(config, semanticQueryPath(semanticModelId ?? ''), {\n method: 'POST',\n json: query,\n timeoutMs,\n rateLimitRetry,\n signal,\n }),\n enabled: enabledAnd(enabled, semanticModelId !== null && config.backendUrl.length > 0),\n },\n client,\n );\n}\n"],"names":[],"mappings":";;;;AAiFO,SAAS,kBAAkB,iBAAiC;AACjE,SAAO,0BAA0B,mBAAmB,eAAe,CAAC;AACtE;AAMO,MAAM,4BAA4B;AAyBlC,SAAS,iBAAwD;AAAA,EACtE;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAkF;AAChF,QAAM,SAAS,gBAAA;AACf,QAAM,QAAQ,mBAAA;AACd,QAAM,SAAS,yBAAA;AACf,SAAO;AAAA,IACL;AAAA,MACE,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,GAAG;AAAA,MACH,UAAU,CAAC,GAAG,OAAO,eAAe,eAAe,iBAAiB,KAAK;AAAA,MACzE,SAAS,CAAC,EAAE,aACV,gBAA2C,QAAQ,kBAAkB,mBAAmB,EAAE,GAAG;AAAA,QAC3F,QAAQ;AAAA,QACR,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,MAAA,CACD;AAAA,MACH,SAAS,WAAW,SAAS,oBAAoB,QAAQ,OAAO,WAAW,SAAS,CAAC;AAAA,IAAA;AAAA,IAEvF;AAAA,EAAA;AAEJ;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"athena-diagnostics.cjs","sources":["../../src/diagnostics/athena-diagnostics.ts"],"sourcesContent":["/**\n * SDK diagnostics: one structured event bus for everything the SDK does that\n * can be slow or can fail — auth acquisition, thread-list fetches, statewire\n * attach/snapshot/connection changes, sends, first tokens, and every error.\n *\n * Design:\n * - Module-level singleton (one SDK, one bus), configured by `AthenaProvider`\n * from its `debug` / `onDiagnostic` / `onError` props. Nothing here runs\n * until something calls `emit`, and with defaults it costs a ring-buffer push.\n * - Every event carries `t` (ms since page navigation start via\n * `performance.now()`) so the buffer reads as a waterfall. Timed spans use\n * `performance.mark` / `performance.measure` too, so the browser Performance\n * panel shows them as user timings without any extra tooling.\n * - Console output is opt-in (`debug` prop or `localStorage['athena:debug']`),\n * prefixed `[AthenaSDK]`, and level-gated. Errors always reach `onError`.\n * - PostHog forwarding (opt-in) sends the timing events as\n * `athena_sdk_<name>` with `duration_ms`, through the SDK's capture gate.\n *\n * Consumers read the buffer with `useAthenaDiagnostics()` or, in the browser\n * console, `window.__ATHENA_SDK__.diagnostics.snapshot()`.\n */\n\nimport { getPostHogInstance } from '../provider/PostHogProvider';\nimport { capturePosthogEvent, type PosthogCaptureClient } from '../lib/posthog/wrap-posthog-client';\nimport { ATHENA_REACT_SDK_VERSION } from '../version';\nimport { AthenaSdkError, isAthenaSdkError, toAthenaSdkError } from './errors';\n\nexport const ATHENA_DIAGNOSTIC_LEVELS = ['debug', 'info', 'warn', 'error'] as const;\nexport type AthenaDiagnosticLevel = (typeof ATHENA_DIAGNOSTIC_LEVELS)[number];\n\nconst LEVEL_RANK: Record<AthenaDiagnosticLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\n\n/**\n * Event names. Dotted `area.event` so a consumer can filter by prefix. Names\n * are part of the public contract: renaming one is a breaking change for\n * dashboards, so add new ones instead of repurposing.\n */\nexport type AthenaDiagnosticEventName =\n // Provider / configuration\n | 'sdk.init'\n | 'sdk.transport'\n | 'sdk.config.warning'\n // Auth acquisition + lifecycle\n | 'auth.bridge.start'\n | 'auth.bridge.ready'\n | 'auth.bridge.timeout'\n | 'auth.bridge.absent'\n | 'auth.bridge.error'\n | 'auth.bridge.retry'\n | 'auth.bridge.config_rejected'\n | 'auth.token.acquired'\n | 'auth.token.refreshed'\n | 'auth.token.refresh_failed'\n | 'auth.token.stale'\n | 'auth.sso.userinfo.start'\n | 'auth.sso.userinfo.done'\n | 'auth.sso.userinfo.error'\n | 'auth.sso.userinfo.retry'\n /**\n * A session the page held ended (a 401 or 403 on a renewal): `sign_back_in`\n * says whether the page then went through sign-in on its own (`sign-back-in.ts`).\n */\n | 'auth.session.ended'\n // Thread list + history\n | 'threads.list.start'\n | 'threads.list.done'\n | 'threads.list.error'\n | 'threads.list.aborted'\n | 'threads.history.start'\n | 'threads.history.done'\n | 'threads.history.error'\n | 'threads.history.aborted'\n // Statewire transport\n | 'statewire.attach.start'\n | 'statewire.snapshot'\n | 'statewire.connection'\n | 'statewire.parked'\n | 'statewire.error'\n | 'statewire.read_only'\n /** A write to the thread's server config lane (`config/patch`) was refused or dropped. */\n | 'statewire.config'\n // Runs\n | 'run.send'\n | 'run.first_token'\n | 'run.done'\n | 'run.error'\n // Composer\n | 'composer.attachment.error'\n /** Files offered while Athena can't be reached were not attached (they could not upload). */\n | 'composer.attachment.refused_offline'\n | 'composer.cancel.error'\n | 'composer.dictation'\n | 'composer.handoff'\n | 'voice.chat'\n // Tool UIs + frontend tools\n | 'tools.schema.warning'\n | 'tools.debug'\n // Mention suggestions\n | 'mentions.fetch.error'\n // Catch-all\n | 'sdk.error';\n\nexport interface AthenaDiagnosticEvent {\n /** Monotonic sequence number within this page. */\n seq: number;\n /** `performance.now()` at emit time (ms since navigation start). */\n t: number;\n /** Wall-clock ISO timestamp, for exports. */\n at: string;\n name: AthenaDiagnosticEventName;\n level: AthenaDiagnosticLevel;\n /** Milliseconds for a completed span (set on `*.done` / `*.ready` / `run.first_token`). */\n durationMs?: number;\n /** Structured context. Never contains credentials — see `redact`. */\n data?: Record<string, unknown>;\n /** Present on error-level events. */\n error?: AthenaSdkError;\n}\n\nexport interface AthenaDiagnosticsConfig {\n /** Minimum level echoed to the console. `false` disables console output. */\n console: AthenaDiagnosticLevel | false;\n /** Forward timing + error events to PostHog as `athena_sdk_*` events. */\n posthog: boolean;\n /** Receives every event (already redacted). */\n onEvent?: (event: AthenaDiagnosticEvent) => void;\n /** Receives every error-level event's `AthenaSdkError`. */\n onError?: (error: AthenaSdkError, event: AthenaDiagnosticEvent) => void;\n /** Ring-buffer capacity. */\n bufferSize: number;\n}\n\nexport interface AthenaDiagnosticsSnapshot {\n sdkVersion: string;\n config: Omit<AthenaDiagnosticsConfig, 'onEvent' | 'onError'>;\n events: AthenaDiagnosticEvent[];\n /** Latest value per gauge (connection status, transport, auth mode, …). */\n gauges: Record<string, unknown>;\n /** Named span durations, most recent per name (`auth.bridge`, `threads.list`, …). */\n timings: Record<string, number>;\n}\n\nconst DEFAULT_CONFIG: AthenaDiagnosticsConfig = {\n console: false,\n posthog: false,\n bufferSize: 300,\n};\n\nconst CONSOLE_PREFIX = '[AthenaSDK]';\nconst LOCAL_STORAGE_DEBUG_KEY = 'athena:debug';\nconst GLOBAL_KEY = '__ATHENA_SDK__';\n\n// Keys whose values must never enter the buffer, the console, or PostHog.\nconst REDACT_KEYS = /token|secret|api[-_]?key|authorization|cookie|password/i;\n\nfunction redact(data: Record<string, unknown> | undefined): Record<string, unknown> | undefined {\n if (!data) return undefined;\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n if (REDACT_KEYS.test(key)) {\n out[key] = typeof value === 'string' && value.length > 0 ? `<redacted:${value.length}>` : '<redacted>';\n } else {\n out[key] = value;\n }\n }\n return out;\n}\n\nfunction nowMs(): number {\n return typeof performance !== 'undefined' && typeof performance.now === 'function'\n ? performance.now()\n : Date.now();\n}\n\nfunction readLocalDebugLevel(): AthenaDiagnosticLevel | null {\n try {\n if (typeof localStorage === 'undefined') return null;\n const raw = localStorage.getItem(LOCAL_STORAGE_DEBUG_KEY);\n if (!raw) return null;\n if ((ATHENA_DIAGNOSTIC_LEVELS as readonly string[]).includes(raw)) {\n return raw as AthenaDiagnosticLevel;\n }\n return raw === '1' || raw === 'true' ? 'debug' : null;\n } catch {\n return null;\n }\n}\n\ntype Listener = (event: AthenaDiagnosticEvent) => void;\n\nclass AthenaDiagnosticsBus {\n private config: AthenaDiagnosticsConfig = { ...DEFAULT_CONFIG };\n private events: AthenaDiagnosticEvent[] = [];\n private listeners = new Set<Listener>();\n private snapshotListeners = new Set<() => void>();\n private seq = 0;\n private gauges: Record<string, unknown> = {};\n private timings: Record<string, number> = {};\n private spans = new Map<string, number>();\n private cachedSnapshot: AthenaDiagnosticsSnapshot | null = null;\n\n configure(partial: Partial<AthenaDiagnosticsConfig>): void {\n this.config = { ...this.config, ...partial };\n if (this.events.length > this.config.bufferSize) {\n this.events = this.events.slice(-this.config.bufferSize);\n }\n this.invalidate();\n }\n\n getConfig(): AthenaDiagnosticsConfig {\n return this.config;\n }\n\n /** Effective console level: the configured one, or `localStorage['athena:debug']`. */\n private consoleLevel(): AthenaDiagnosticLevel | false {\n if (this.config.console !== false) return this.config.console;\n return readLocalDebugLevel() ?? false;\n }\n\n emit(\n name: AthenaDiagnosticEventName,\n options: {\n level?: AthenaDiagnosticLevel;\n data?: Record<string, unknown>;\n durationMs?: number;\n error?: unknown;\n } = {},\n ): AthenaDiagnosticEvent {\n const level = options.level ?? (options.error !== undefined ? 'error' : 'info');\n const error =\n options.error === undefined\n ? undefined\n : toAthenaSdkError(options.error, {\n code: 'unknown',\n message: `Unexpected error during ${name}`,\n });\n const event: AthenaDiagnosticEvent = {\n seq: ++this.seq,\n t: Math.round(nowMs() * 10) / 10,\n at: new Date().toISOString(),\n name,\n level,\n ...(options.durationMs !== undefined && { durationMs: Math.round(options.durationMs) }),\n ...(options.data && { data: redact(options.data) }),\n ...(error && { error }),\n };\n\n this.events.push(event);\n if (this.events.length > this.config.bufferSize) {\n this.events.splice(0, this.events.length - this.config.bufferSize);\n }\n if (event.durationMs !== undefined) {\n this.timings[name] = event.durationMs;\n }\n this.invalidate();\n\n this.echoToConsole(event);\n this.forwardToPostHog(event);\n for (const listener of this.listeners) {\n try {\n listener(event);\n } catch (listenerError) {\n console.error(`${CONSOLE_PREFIX} diagnostics listener threw`, listenerError);\n }\n }\n if (this.config.onEvent) {\n try {\n this.config.onEvent(event);\n } catch (callbackError) {\n console.error(`${CONSOLE_PREFIX} onDiagnostic callback threw`, callbackError);\n }\n }\n if (error && this.config.onError) {\n try {\n this.config.onError(error, event);\n } catch (callbackError) {\n console.error(`${CONSOLE_PREFIX} onError callback threw`, callbackError);\n }\n }\n for (const notify of this.snapshotListeners) notify();\n return event;\n }\n\n /** Record an error-level event. Returns the normalized `AthenaSdkError`. */\n error(\n name: AthenaDiagnosticEventName,\n error: unknown,\n fallback: { code: AthenaSdkError['code']; message: string; hint?: string },\n data?: Record<string, unknown>,\n ): AthenaSdkError {\n const normalized = toAthenaSdkError(error, fallback);\n this.emit(name, { level: 'error', error: normalized, data });\n return normalized;\n }\n\n /**\n * Start a named span. Returns a function that ends it and emits `doneName`\n * with `durationMs` (or `errorName` when passed an error). Also records a\n * `performance.measure` so the span shows in the browser's Performance panel.\n */\n span(\n spanName: string,\n startName: AthenaDiagnosticEventName,\n data?: Record<string, unknown>,\n ): (\n doneName: AthenaDiagnosticEventName,\n doneOptions?: { data?: Record<string, unknown>; error?: unknown },\n ) => number {\n const startedAt = nowMs();\n this.spans.set(spanName, startedAt);\n this.mark(`${spanName}:start`);\n this.emit(startName, { level: 'debug', data });\n return (doneName, doneOptions = {}) => {\n const durationMs = nowMs() - startedAt;\n this.spans.delete(spanName);\n this.mark(`${spanName}:end`);\n this.measure(spanName);\n this.emit(doneName, {\n level: doneOptions.error !== undefined ? 'error' : 'info',\n durationMs,\n data: doneOptions.data,\n error: doneOptions.error,\n });\n return durationMs;\n };\n }\n\n /** Set a gauge (latest-value metric): connection status, transport, auth mode. */\n gauge(name: string, value: unknown): void {\n if (this.gauges[name] === value) return;\n this.gauges[name] = value;\n this.invalidate();\n for (const notify of this.snapshotListeners) notify();\n }\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n /**\n * Additive consumer registration: every registered consumer receives every\n * event (and every error), unlike the single `onEvent`/`onError` config\n * slots which are last-writer-wins. `AthenaProvider` registers through this\n * so two mounted providers never clobber each other's callbacks.\n */\n addConsumer(consumer: {\n onEvent?: (event: AthenaDiagnosticEvent) => void;\n onError?: (error: AthenaSdkError, event: AthenaDiagnosticEvent) => void;\n }): () => void {\n return this.subscribe((event) => {\n try {\n consumer.onEvent?.(event);\n } catch (callbackError) {\n console.error(`${CONSOLE_PREFIX} onDiagnostic consumer threw`, callbackError);\n }\n if (event.error) {\n try {\n consumer.onError?.(event.error, event);\n } catch (callbackError) {\n console.error(`${CONSOLE_PREFIX} onError consumer threw`, callbackError);\n }\n }\n });\n }\n\n /** Subscribe to snapshot changes (for `useSyncExternalStore`). */\n subscribeSnapshot(listener: () => void): () => void {\n this.snapshotListeners.add(listener);\n return () => {\n this.snapshotListeners.delete(listener);\n };\n }\n\n snapshot(): AthenaDiagnosticsSnapshot {\n if (!this.cachedSnapshot) {\n const { onEvent: _onEvent, onError: _onError, ...config } = this.config;\n this.cachedSnapshot = {\n sdkVersion: ATHENA_REACT_SDK_VERSION,\n config,\n events: [...this.events],\n gauges: { ...this.gauges },\n timings: { ...this.timings },\n };\n }\n return this.cachedSnapshot;\n }\n\n /** Copy-paste-able JSON of the current snapshot (errors serialized). */\n export(): string {\n return JSON.stringify(\n this.snapshot(),\n (_key, value) => (isAthenaSdkError(value) ? value.toJSON() : value),\n 2,\n );\n }\n\n clear(): void {\n this.events = [];\n this.timings = {};\n this.invalidate();\n for (const notify of this.snapshotListeners) notify();\n }\n\n private invalidate(): void {\n this.cachedSnapshot = null;\n }\n\n private mark(name: string): void {\n try {\n if (typeof performance !== 'undefined' && typeof performance.mark === 'function') {\n performance.mark(`athena-sdk:${name}`);\n }\n } catch {\n // User Timing is best-effort.\n }\n }\n\n private measure(spanName: string): void {\n try {\n if (typeof performance !== 'undefined' && typeof performance.measure === 'function') {\n performance.measure(\n `athena-sdk:${spanName}`,\n `athena-sdk:${spanName}:start`,\n `athena-sdk:${spanName}:end`,\n );\n }\n } catch {\n // A missing start mark (e.g. after `performance.clearMarks`) is not an error.\n }\n }\n\n private echoToConsole(event: AthenaDiagnosticEvent): void {\n const level = this.consoleLevel();\n if (level === false) {\n // Errors are never silent: with console output off they still log once,\n // compactly, so a broken integration is visible without enabling debug.\n if (event.level === 'error' && event.error) {\n console.error(`${CONSOLE_PREFIX} ${event.name}: ${event.error.describe()}`, event.data ?? '');\n }\n return;\n }\n if (LEVEL_RANK[event.level] < LEVEL_RANK[level]) return;\n const suffix = event.durationMs !== undefined ? ` (${event.durationMs}ms)` : '';\n const line = `${CONSOLE_PREFIX} ${event.name}${suffix}`;\n const payload = event.error ? { ...event.data, error: event.error.describe() } : event.data;\n const method =\n event.level === 'error'\n ? console.error\n : event.level === 'warn'\n ? console.warn\n : event.level === 'debug'\n ? console.debug\n : console.info;\n method(line, payload ?? '');\n }\n\n private forwardToPostHog(event: AthenaDiagnosticEvent): void {\n if (!this.config.posthog) return;\n if (event.durationMs === undefined && event.level !== 'error') return;\n try {\n const client = getPostHogInstance<PosthogCaptureClient>();\n capturePosthogEvent(client, `athena_sdk_${event.name.replace(/\\./g, '_')}`, {\n sdk_version: ATHENA_REACT_SDK_VERSION,\n level: event.level,\n ...(event.durationMs !== undefined && { duration_ms: event.durationMs }),\n ...(event.error && {\n error_code: event.error.code,\n error_message: event.error.message,\n error_status: event.error.status,\n }),\n ...event.data,\n });\n } catch {\n // Analytics must never break the chat.\n }\n }\n}\n\nexport const athenaDiagnostics = new AthenaDiagnosticsBus();\n\n/**\n * Expose the bus on `window.__ATHENA_SDK__` so an integrator can inspect the\n * waterfall from the console (`__ATHENA_SDK__.diagnostics.snapshot()`) or turn\n * console echo on without a rebuild (`localStorage.setItem('athena:debug','debug')`).\n */\nexport function installAthenaDiagnosticsGlobal(): void {\n if (typeof window === 'undefined') return;\n const globalWindow = window as unknown as Record<string, unknown>;\n const existing = (globalWindow[GLOBAL_KEY] ?? {}) as Record<string, unknown>;\n globalWindow[GLOBAL_KEY] = {\n ...existing,\n version: ATHENA_REACT_SDK_VERSION,\n diagnostics: {\n snapshot: () => athenaDiagnostics.snapshot(),\n export: () => athenaDiagnostics.export(),\n clear: () => athenaDiagnostics.clear(),\n enableConsole: (level: AthenaDiagnosticLevel = 'debug') => {\n try {\n localStorage.setItem(LOCAL_STORAGE_DEBUG_KEY, level);\n } catch {\n // localStorage may be unavailable.\n }\n athenaDiagnostics.configure({ console: level });\n },\n disableConsole: () => {\n try {\n localStorage.removeItem(LOCAL_STORAGE_DEBUG_KEY);\n } catch {\n // localStorage may be unavailable.\n }\n athenaDiagnostics.configure({ console: false });\n },\n },\n };\n}\n\n/** Normalize the provider's `debug` prop into a diagnostics config patch. */\nexport function debugPropToDiagnosticsConfig(\n debug: boolean | AthenaDiagnosticLevel | Partial<AthenaDiagnosticsConfig> | undefined,\n): Partial<AthenaDiagnosticsConfig> {\n if (debug === undefined) return {};\n if (debug === true) return { console: 'debug' };\n if (debug === false) return { console: false };\n if (typeof debug === 'string') return { console: debug };\n return debug;\n}\n"],"names":["toAthenaSdkError","ATHENA_REACT_SDK_VERSION","isAthenaSdkError","getPostHogInstance","capturePosthogEvent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"athena-diagnostics.cjs","sources":["../../src/diagnostics/athena-diagnostics.ts"],"sourcesContent":["/**\n * SDK diagnostics: one structured event bus for everything the SDK does that\n * can be slow or can fail — auth acquisition, thread-list fetches, statewire\n * attach/snapshot/connection changes, sends, first tokens, and every error.\n *\n * Design:\n * - Module-level singleton (one SDK, one bus), configured by `AthenaProvider`\n * from its `debug` / `onDiagnostic` / `onError` props. Nothing here runs\n * until something calls `emit`, and with defaults it costs a ring-buffer push.\n * - Every event carries `t` (ms since page navigation start via\n * `performance.now()`) so the buffer reads as a waterfall. Timed spans use\n * `performance.mark` / `performance.measure` too, so the browser Performance\n * panel shows them as user timings without any extra tooling.\n * - Console output is opt-in (`debug` prop or `localStorage['athena:debug']`),\n * prefixed `[AthenaSDK]`, and level-gated. Errors always reach `onError`.\n * - PostHog forwarding (opt-in) sends the timing events as\n * `athena_sdk_<name>` with `duration_ms`, through the SDK's capture gate.\n *\n * Consumers read the buffer with `useAthenaDiagnostics()` or, in the browser\n * console, `window.__ATHENA_SDK__.diagnostics.snapshot()`.\n */\n\nimport { getPostHogInstance } from '../provider/PostHogProvider';\nimport { capturePosthogEvent, type PosthogCaptureClient } from '../lib/posthog/wrap-posthog-client';\nimport { ATHENA_REACT_SDK_VERSION } from '../version';\nimport { AthenaSdkError, isAthenaSdkError, toAthenaSdkError } from './errors';\n\nexport const ATHENA_DIAGNOSTIC_LEVELS = ['debug', 'info', 'warn', 'error'] as const;\nexport type AthenaDiagnosticLevel = (typeof ATHENA_DIAGNOSTIC_LEVELS)[number];\n\nconst LEVEL_RANK: Record<AthenaDiagnosticLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\n\n/**\n * Event names. Dotted `area.event` so a consumer can filter by prefix. Names\n * are part of the public contract: renaming one is a breaking change for\n * dashboards, so add new ones instead of repurposing.\n */\nexport type AthenaDiagnosticEventName =\n // Provider / configuration\n | 'sdk.init'\n | 'sdk.transport'\n | 'sdk.config.warning'\n // Auth acquisition + lifecycle\n | 'auth.bridge.start'\n | 'auth.bridge.ready'\n | 'auth.bridge.timeout'\n | 'auth.bridge.absent'\n | 'auth.bridge.error'\n | 'auth.bridge.retry'\n | 'auth.bridge.config_rejected'\n | 'auth.token.acquired'\n | 'auth.token.refreshed'\n | 'auth.token.refresh_failed'\n | 'auth.token.stale'\n | 'auth.sso.userinfo.start'\n | 'auth.sso.userinfo.done'\n | 'auth.sso.userinfo.error'\n | 'auth.sso.userinfo.retry'\n /**\n * A session the page held ended (a 401 or 403 on a renewal): `sign_back_in`\n * says whether the page then went through sign-in on its own (`sign-back-in.ts`).\n */\n | 'auth.session.ended'\n // Thread list + history\n | 'threads.list.start'\n | 'threads.list.done'\n | 'threads.list.error'\n | 'threads.list.aborted'\n | 'threads.history.start'\n | 'threads.history.done'\n | 'threads.history.error'\n | 'threads.history.aborted'\n // Statewire transport\n | 'statewire.attach.start'\n | 'statewire.snapshot'\n | 'statewire.connection'\n | 'statewire.parked'\n | 'statewire.error'\n | 'statewire.read_only'\n /** A write to the thread's server config lane (`config/patch`) was refused or dropped. */\n | 'statewire.config'\n // Runs\n | 'run.send'\n | 'run.first_token'\n | 'run.done'\n | 'run.error'\n // Composer\n | 'composer.attachment.error'\n /** Files offered while Athena can't be reached were not attached (they could not upload). */\n | 'composer.attachment.refused_offline'\n /** The host's work before a send (`beforeSubmit`, `onBeforeSend`) refused it: nothing was sent. */\n | 'composer.before_send.rejected'\n | 'composer.cancel.error'\n | 'composer.dictation'\n | 'composer.handoff'\n /** A host's `/` command threw or its promise rejected (`ComposerSlashCommand.run`). */\n | 'composer.slash_command'\n | 'voice.chat'\n // Tool UIs + frontend tools\n | 'tools.schema.warning'\n | 'tools.debug'\n // Mention suggestions\n | 'mentions.fetch.error'\n // Catch-all\n | 'sdk.error';\n\nexport interface AthenaDiagnosticEvent {\n /** Monotonic sequence number within this page. */\n seq: number;\n /** `performance.now()` at emit time (ms since navigation start). */\n t: number;\n /** Wall-clock ISO timestamp, for exports. */\n at: string;\n name: AthenaDiagnosticEventName;\n level: AthenaDiagnosticLevel;\n /** Milliseconds for a completed span (set on `*.done` / `*.ready` / `run.first_token`). */\n durationMs?: number;\n /** Structured context. Never contains credentials — see `redact`. */\n data?: Record<string, unknown>;\n /** Present on error-level events. */\n error?: AthenaSdkError;\n}\n\nexport interface AthenaDiagnosticsConfig {\n /** Minimum level echoed to the console. `false` disables console output. */\n console: AthenaDiagnosticLevel | false;\n /** Forward timing + error events to PostHog as `athena_sdk_*` events. */\n posthog: boolean;\n /** Receives every event (already redacted). */\n onEvent?: (event: AthenaDiagnosticEvent) => void;\n /** Receives every error-level event's `AthenaSdkError`. */\n onError?: (error: AthenaSdkError, event: AthenaDiagnosticEvent) => void;\n /** Ring-buffer capacity. */\n bufferSize: number;\n}\n\nexport interface AthenaDiagnosticsSnapshot {\n sdkVersion: string;\n config: Omit<AthenaDiagnosticsConfig, 'onEvent' | 'onError'>;\n events: AthenaDiagnosticEvent[];\n /** Latest value per gauge (connection status, transport, auth mode, …). */\n gauges: Record<string, unknown>;\n /** Named span durations, most recent per name (`auth.bridge`, `threads.list`, …). */\n timings: Record<string, number>;\n}\n\nconst DEFAULT_CONFIG: AthenaDiagnosticsConfig = {\n console: false,\n posthog: false,\n bufferSize: 300,\n};\n\nconst CONSOLE_PREFIX = '[AthenaSDK]';\nconst LOCAL_STORAGE_DEBUG_KEY = 'athena:debug';\nconst GLOBAL_KEY = '__ATHENA_SDK__';\n\n// Keys whose values must never enter the buffer, the console, or PostHog.\nconst REDACT_KEYS = /token|secret|api[-_]?key|authorization|cookie|password/i;\n\nfunction redact(data: Record<string, unknown> | undefined): Record<string, unknown> | undefined {\n if (!data) return undefined;\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n if (REDACT_KEYS.test(key)) {\n out[key] = typeof value === 'string' && value.length > 0 ? `<redacted:${value.length}>` : '<redacted>';\n } else {\n out[key] = value;\n }\n }\n return out;\n}\n\nfunction nowMs(): number {\n return typeof performance !== 'undefined' && typeof performance.now === 'function'\n ? performance.now()\n : Date.now();\n}\n\nfunction readLocalDebugLevel(): AthenaDiagnosticLevel | null {\n try {\n if (typeof localStorage === 'undefined') return null;\n const raw = localStorage.getItem(LOCAL_STORAGE_DEBUG_KEY);\n if (!raw) return null;\n if ((ATHENA_DIAGNOSTIC_LEVELS as readonly string[]).includes(raw)) {\n return raw as AthenaDiagnosticLevel;\n }\n return raw === '1' || raw === 'true' ? 'debug' : null;\n } catch {\n return null;\n }\n}\n\ntype Listener = (event: AthenaDiagnosticEvent) => void;\n\nclass AthenaDiagnosticsBus {\n private config: AthenaDiagnosticsConfig = { ...DEFAULT_CONFIG };\n private events: AthenaDiagnosticEvent[] = [];\n private listeners = new Set<Listener>();\n private snapshotListeners = new Set<() => void>();\n private seq = 0;\n private gauges: Record<string, unknown> = {};\n private timings: Record<string, number> = {};\n private spans = new Map<string, number>();\n private cachedSnapshot: AthenaDiagnosticsSnapshot | null = null;\n\n configure(partial: Partial<AthenaDiagnosticsConfig>): void {\n this.config = { ...this.config, ...partial };\n if (this.events.length > this.config.bufferSize) {\n this.events = this.events.slice(-this.config.bufferSize);\n }\n this.invalidate();\n }\n\n getConfig(): AthenaDiagnosticsConfig {\n return this.config;\n }\n\n /** Effective console level: the configured one, or `localStorage['athena:debug']`. */\n private consoleLevel(): AthenaDiagnosticLevel | false {\n if (this.config.console !== false) return this.config.console;\n return readLocalDebugLevel() ?? false;\n }\n\n emit(\n name: AthenaDiagnosticEventName,\n options: {\n level?: AthenaDiagnosticLevel;\n data?: Record<string, unknown>;\n durationMs?: number;\n error?: unknown;\n } = {},\n ): AthenaDiagnosticEvent {\n const level = options.level ?? (options.error !== undefined ? 'error' : 'info');\n const error =\n options.error === undefined\n ? undefined\n : toAthenaSdkError(options.error, {\n code: 'unknown',\n message: `Unexpected error during ${name}`,\n });\n const event: AthenaDiagnosticEvent = {\n seq: ++this.seq,\n t: Math.round(nowMs() * 10) / 10,\n at: new Date().toISOString(),\n name,\n level,\n ...(options.durationMs !== undefined && { durationMs: Math.round(options.durationMs) }),\n ...(options.data && { data: redact(options.data) }),\n ...(error && { error }),\n };\n\n this.events.push(event);\n if (this.events.length > this.config.bufferSize) {\n this.events.splice(0, this.events.length - this.config.bufferSize);\n }\n if (event.durationMs !== undefined) {\n this.timings[name] = event.durationMs;\n }\n this.invalidate();\n\n this.echoToConsole(event);\n this.forwardToPostHog(event);\n for (const listener of this.listeners) {\n try {\n listener(event);\n } catch (listenerError) {\n console.error(`${CONSOLE_PREFIX} diagnostics listener threw`, listenerError);\n }\n }\n if (this.config.onEvent) {\n try {\n this.config.onEvent(event);\n } catch (callbackError) {\n console.error(`${CONSOLE_PREFIX} onDiagnostic callback threw`, callbackError);\n }\n }\n if (error && this.config.onError) {\n try {\n this.config.onError(error, event);\n } catch (callbackError) {\n console.error(`${CONSOLE_PREFIX} onError callback threw`, callbackError);\n }\n }\n for (const notify of this.snapshotListeners) notify();\n return event;\n }\n\n /** Record an error-level event. Returns the normalized `AthenaSdkError`. */\n error(\n name: AthenaDiagnosticEventName,\n error: unknown,\n fallback: { code: AthenaSdkError['code']; message: string; hint?: string },\n data?: Record<string, unknown>,\n ): AthenaSdkError {\n const normalized = toAthenaSdkError(error, fallback);\n this.emit(name, { level: 'error', error: normalized, data });\n return normalized;\n }\n\n /**\n * Start a named span. Returns a function that ends it and emits `doneName`\n * with `durationMs` (or `errorName` when passed an error). Also records a\n * `performance.measure` so the span shows in the browser's Performance panel.\n */\n span(\n spanName: string,\n startName: AthenaDiagnosticEventName,\n data?: Record<string, unknown>,\n ): (\n doneName: AthenaDiagnosticEventName,\n doneOptions?: { data?: Record<string, unknown>; error?: unknown },\n ) => number {\n const startedAt = nowMs();\n this.spans.set(spanName, startedAt);\n this.mark(`${spanName}:start`);\n this.emit(startName, { level: 'debug', data });\n return (doneName, doneOptions = {}) => {\n const durationMs = nowMs() - startedAt;\n this.spans.delete(spanName);\n this.mark(`${spanName}:end`);\n this.measure(spanName);\n this.emit(doneName, {\n level: doneOptions.error !== undefined ? 'error' : 'info',\n durationMs,\n data: doneOptions.data,\n error: doneOptions.error,\n });\n return durationMs;\n };\n }\n\n /** Set a gauge (latest-value metric): connection status, transport, auth mode. */\n gauge(name: string, value: unknown): void {\n if (this.gauges[name] === value) return;\n this.gauges[name] = value;\n this.invalidate();\n for (const notify of this.snapshotListeners) notify();\n }\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n /**\n * Additive consumer registration: every registered consumer receives every\n * event (and every error), unlike the single `onEvent`/`onError` config\n * slots which are last-writer-wins. `AthenaProvider` registers through this\n * so two mounted providers never clobber each other's callbacks.\n */\n addConsumer(consumer: {\n onEvent?: (event: AthenaDiagnosticEvent) => void;\n onError?: (error: AthenaSdkError, event: AthenaDiagnosticEvent) => void;\n }): () => void {\n return this.subscribe((event) => {\n try {\n consumer.onEvent?.(event);\n } catch (callbackError) {\n console.error(`${CONSOLE_PREFIX} onDiagnostic consumer threw`, callbackError);\n }\n if (event.error) {\n try {\n consumer.onError?.(event.error, event);\n } catch (callbackError) {\n console.error(`${CONSOLE_PREFIX} onError consumer threw`, callbackError);\n }\n }\n });\n }\n\n /** Subscribe to snapshot changes (for `useSyncExternalStore`). */\n subscribeSnapshot(listener: () => void): () => void {\n this.snapshotListeners.add(listener);\n return () => {\n this.snapshotListeners.delete(listener);\n };\n }\n\n snapshot(): AthenaDiagnosticsSnapshot {\n if (!this.cachedSnapshot) {\n const { onEvent: _onEvent, onError: _onError, ...config } = this.config;\n this.cachedSnapshot = {\n sdkVersion: ATHENA_REACT_SDK_VERSION,\n config,\n events: [...this.events],\n gauges: { ...this.gauges },\n timings: { ...this.timings },\n };\n }\n return this.cachedSnapshot;\n }\n\n /** Copy-paste-able JSON of the current snapshot (errors serialized). */\n export(): string {\n return JSON.stringify(\n this.snapshot(),\n (_key, value) => (isAthenaSdkError(value) ? value.toJSON() : value),\n 2,\n );\n }\n\n clear(): void {\n this.events = [];\n this.timings = {};\n this.invalidate();\n for (const notify of this.snapshotListeners) notify();\n }\n\n private invalidate(): void {\n this.cachedSnapshot = null;\n }\n\n private mark(name: string): void {\n try {\n if (typeof performance !== 'undefined' && typeof performance.mark === 'function') {\n performance.mark(`athena-sdk:${name}`);\n }\n } catch {\n // User Timing is best-effort.\n }\n }\n\n private measure(spanName: string): void {\n try {\n if (typeof performance !== 'undefined' && typeof performance.measure === 'function') {\n performance.measure(\n `athena-sdk:${spanName}`,\n `athena-sdk:${spanName}:start`,\n `athena-sdk:${spanName}:end`,\n );\n }\n } catch {\n // A missing start mark (e.g. after `performance.clearMarks`) is not an error.\n }\n }\n\n private echoToConsole(event: AthenaDiagnosticEvent): void {\n const level = this.consoleLevel();\n if (level === false) {\n // Errors are never silent: with console output off they still log once,\n // compactly, so a broken integration is visible without enabling debug.\n if (event.level === 'error' && event.error) {\n console.error(`${CONSOLE_PREFIX} ${event.name}: ${event.error.describe()}`, event.data ?? '');\n }\n return;\n }\n if (LEVEL_RANK[event.level] < LEVEL_RANK[level]) return;\n const suffix = event.durationMs !== undefined ? ` (${event.durationMs}ms)` : '';\n const line = `${CONSOLE_PREFIX} ${event.name}${suffix}`;\n const payload = event.error ? { ...event.data, error: event.error.describe() } : event.data;\n const method =\n event.level === 'error'\n ? console.error\n : event.level === 'warn'\n ? console.warn\n : event.level === 'debug'\n ? console.debug\n : console.info;\n method(line, payload ?? '');\n }\n\n private forwardToPostHog(event: AthenaDiagnosticEvent): void {\n if (!this.config.posthog) return;\n if (event.durationMs === undefined && event.level !== 'error') return;\n try {\n const client = getPostHogInstance<PosthogCaptureClient>();\n capturePosthogEvent(client, `athena_sdk_${event.name.replace(/\\./g, '_')}`, {\n sdk_version: ATHENA_REACT_SDK_VERSION,\n level: event.level,\n ...(event.durationMs !== undefined && { duration_ms: event.durationMs }),\n ...(event.error && {\n error_code: event.error.code,\n error_message: event.error.message,\n error_status: event.error.status,\n }),\n ...event.data,\n });\n } catch {\n // Analytics must never break the chat.\n }\n }\n}\n\nexport const athenaDiagnostics = new AthenaDiagnosticsBus();\n\n/**\n * Expose the bus on `window.__ATHENA_SDK__` so an integrator can inspect the\n * waterfall from the console (`__ATHENA_SDK__.diagnostics.snapshot()`) or turn\n * console echo on without a rebuild (`localStorage.setItem('athena:debug','debug')`).\n */\nexport function installAthenaDiagnosticsGlobal(): void {\n if (typeof window === 'undefined') return;\n const globalWindow = window as unknown as Record<string, unknown>;\n const existing = (globalWindow[GLOBAL_KEY] ?? {}) as Record<string, unknown>;\n globalWindow[GLOBAL_KEY] = {\n ...existing,\n version: ATHENA_REACT_SDK_VERSION,\n diagnostics: {\n snapshot: () => athenaDiagnostics.snapshot(),\n export: () => athenaDiagnostics.export(),\n clear: () => athenaDiagnostics.clear(),\n enableConsole: (level: AthenaDiagnosticLevel = 'debug') => {\n try {\n localStorage.setItem(LOCAL_STORAGE_DEBUG_KEY, level);\n } catch {\n // localStorage may be unavailable.\n }\n athenaDiagnostics.configure({ console: level });\n },\n disableConsole: () => {\n try {\n localStorage.removeItem(LOCAL_STORAGE_DEBUG_KEY);\n } catch {\n // localStorage may be unavailable.\n }\n athenaDiagnostics.configure({ console: false });\n },\n },\n };\n}\n\n/** Normalize the provider's `debug` prop into a diagnostics config patch. */\nexport function debugPropToDiagnosticsConfig(\n debug: boolean | AthenaDiagnosticLevel | Partial<AthenaDiagnosticsConfig> | undefined,\n): Partial<AthenaDiagnosticsConfig> {\n if (debug === undefined) return {};\n if (debug === true) return { console: 'debug' };\n if (debug === false) return { console: false };\n if (typeof debug === 'string') return { console: debug };\n return debug;\n}\n"],"names":["toAthenaSdkError","ATHENA_REACT_SDK_VERSION","isAthenaSdkError","getPostHogInstance","capturePosthogEvent"],"mappings":"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"}
|