@athenaintel/react 0.43.0 → 0.48.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +215 -3
- package/dist/agent-runtime/src/answer-label.cjs +137 -0
- package/dist/agent-runtime/src/answer-label.cjs.map +1 -0
- package/dist/agent-runtime/src/answer-label.d.ts +104 -0
- package/dist/agent-runtime/src/answer-label.js +137 -0
- package/dist/agent-runtime/src/answer-label.js.map +1 -0
- package/dist/agent-runtime/src/answer-rows.cjs +180 -0
- package/dist/agent-runtime/src/answer-rows.cjs.map +1 -0
- package/dist/agent-runtime/src/answer-rows.d.ts +86 -0
- package/dist/agent-runtime/src/answer-rows.js +180 -0
- package/dist/agent-runtime/src/answer-rows.js.map +1 -0
- package/dist/agent-runtime/src/client-tool-bridge.cjs +15 -15
- package/dist/agent-runtime/src/client-tool-bridge.cjs.map +1 -1
- package/dist/agent-runtime/src/conversation-index.cjs +8 -8
- package/dist/agent-runtime/src/conversation-index.cjs.map +1 -1
- package/dist/agent-runtime/src/decision-checks.cjs +207 -0
- package/dist/agent-runtime/src/decision-checks.cjs.map +1 -0
- package/dist/agent-runtime/src/decision-checks.d.ts +142 -0
- package/dist/agent-runtime/src/decision-checks.js +207 -0
- package/dist/agent-runtime/src/decision-checks.js.map +1 -0
- package/dist/agent-runtime/src/desktop-handoff.d.ts +12 -0
- package/dist/agent-runtime/src/errors.cjs +18 -0
- package/dist/agent-runtime/src/errors.cjs.map +1 -1
- package/dist/agent-runtime/src/errors.d.ts +7 -0
- package/dist/agent-runtime/src/errors.js +18 -0
- package/dist/agent-runtime/src/errors.js.map +1 -1
- package/dist/agent-runtime/src/generated/runconfig-contract.cjs +12 -0
- package/dist/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -1
- package/dist/agent-runtime/src/generated/runconfig-contract.d.ts +6 -6
- package/dist/agent-runtime/src/generated/runconfig-contract.js +12 -0
- package/dist/agent-runtime/src/generated/runconfig-contract.js.map +1 -1
- package/dist/agent-runtime/src/handoff-arrival.cjs +60 -0
- package/dist/agent-runtime/src/handoff-arrival.cjs.map +1 -0
- package/dist/agent-runtime/src/handoff-arrival.d.ts +46 -0
- package/dist/agent-runtime/src/handoff-arrival.js +60 -0
- package/dist/agent-runtime/src/handoff-arrival.js.map +1 -0
- package/dist/agent-runtime/src/index.d.ts +14 -8
- package/dist/agent-runtime/src/interrupts.cjs +43 -18
- package/dist/agent-runtime/src/interrupts.cjs.map +1 -1
- package/dist/agent-runtime/src/interrupts.d.ts +19 -2
- package/dist/agent-runtime/src/interrupts.js +28 -3
- package/dist/agent-runtime/src/interrupts.js.map +1 -1
- package/dist/agent-runtime/src/lane-history.cjs +8 -8
- package/dist/agent-runtime/src/lane-history.cjs.map +1 -1
- package/dist/agent-runtime/src/messages.cjs +43 -8
- package/dist/agent-runtime/src/messages.cjs.map +1 -1
- package/dist/agent-runtime/src/messages.d.ts +25 -3
- package/dist/agent-runtime/src/messages.js +43 -8
- package/dist/agent-runtime/src/messages.js.map +1 -1
- package/dist/agent-runtime/src/offline-status.cjs +36 -0
- package/dist/agent-runtime/src/offline-status.cjs.map +1 -0
- package/dist/agent-runtime/src/offline-status.d.ts +118 -3
- package/dist/agent-runtime/src/offline-status.js +36 -0
- package/dist/agent-runtime/src/offline-status.js.map +1 -0
- package/dist/agent-runtime/src/queue.cjs +0 -9
- package/dist/agent-runtime/src/queue.cjs.map +1 -1
- package/dist/agent-runtime/src/queue.js +0 -9
- package/dist/agent-runtime/src/queue.js.map +1 -1
- package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs +9 -9
- package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs.map +1 -1
- package/dist/agent-runtime/src/runtime-catalog.cjs +42 -0
- package/dist/agent-runtime/src/runtime-catalog.cjs.map +1 -0
- package/dist/agent-runtime/src/runtime-catalog.d.ts +35 -0
- package/dist/agent-runtime/src/runtime-catalog.js +42 -0
- package/dist/agent-runtime/src/runtime-catalog.js.map +1 -0
- package/dist/agent-runtime/src/runtime-messages.cjs.map +1 -1
- package/dist/agent-runtime/src/runtime-messages.d.ts +1 -1
- package/dist/agent-runtime/src/runtime-messages.js.map +1 -1
- package/dist/agent-runtime/src/runtime.d.ts +40 -0
- package/dist/agent-runtime/src/statewire-suspended.cjs +3 -3
- package/dist/agent-runtime/src/statewire-suspended.cjs.map +1 -1
- package/dist/agent-runtime/src/subagents.cjs +32 -2
- package/dist/agent-runtime/src/subagents.cjs.map +1 -1
- package/dist/agent-runtime/src/subagents.d.ts +9 -0
- package/dist/agent-runtime/src/subagents.js +30 -0
- package/dist/agent-runtime/src/subagents.js.map +1 -1
- package/dist/agent-runtime/src/thread-driver.cjs +67 -0
- package/dist/agent-runtime/src/thread-driver.cjs.map +1 -0
- package/dist/agent-runtime/src/thread-driver.d.ts +49 -0
- package/dist/agent-runtime/src/thread-driver.js +67 -0
- package/dist/agent-runtime/src/thread-driver.js.map +1 -0
- package/dist/agent-runtime/src/thread-handoff-flow-machine.d.ts +172 -0
- package/dist/agent-runtime/src/thread-handoff-protocol.d.ts +756 -0
- package/dist/agent-runtime/src/thread-handoff-qr.d.ts +11 -0
- package/dist/agent-runtime/src/thread-handoff.d.ts +3 -364
- package/dist/agent-runtime/src/thread-status.cjs +3 -3
- package/dist/agent-runtime/src/thread-status.cjs.map +1 -1
- package/dist/agent-runtime/src/tool-metadata.cjs +210 -25
- package/dist/agent-runtime/src/tool-metadata.cjs.map +1 -1
- package/dist/agent-runtime/src/tool-metadata.d.ts +12 -0
- package/dist/agent-runtime/src/tool-metadata.js +210 -25
- package/dist/agent-runtime/src/tool-metadata.js.map +1 -1
- package/dist/agent-runtime/src/tool-names.cjs +2 -0
- package/dist/agent-runtime/src/tool-names.cjs.map +1 -1
- package/dist/agent-runtime/src/tool-names.d.ts +2 -0
- package/dist/agent-runtime/src/tool-names.js +2 -0
- package/dist/agent-runtime/src/tool-names.js.map +1 -1
- package/dist/agent-runtime/src/types.d.ts +10 -2
- package/dist/agent-runtime/src/use-conversation-list.cjs +11 -11
- package/dist/agent-runtime/src/use-conversation-list.cjs.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs +24 -19
- package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-chat-outbox.d.ts +2 -1
- package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js +6 -1
- package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-config.cjs +14 -14
- package/dist/agent-runtime/src/use-deep-agent-config.cjs.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs +6 -6
- package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-runtime.cjs +16 -16
- package/dist/agent-runtime/src/use-deep-agent-runtime.cjs.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-thread.cjs +45 -45
- package/dist/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-voice.cjs +547 -124
- package/dist/agent-runtime/src/use-deep-agent-voice.cjs.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-voice.d.ts +129 -10
- package/dist/agent-runtime/src/use-deep-agent-voice.js +487 -64
- package/dist/agent-runtime/src/use-deep-agent-voice.js.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-window-sync.cjs +26 -26
- package/dist/agent-runtime/src/use-deep-agent-window-sync.cjs.map +1 -1
- package/dist/agent-runtime/src/use-historical-edit-attachments.cjs +4 -4
- package/dist/agent-runtime/src/use-historical-edit-attachments.cjs.map +1 -1
- package/dist/agent-runtime/src/use-thread-handoff-flow.d.ts +28 -26
- package/dist/agent-runtime/src/voice-media.cjs +117 -0
- package/dist/agent-runtime/src/voice-media.cjs.map +1 -0
- package/dist/agent-runtime/src/voice-media.d.ts +49 -0
- package/dist/agent-runtime/src/voice-media.js +117 -0
- package/dist/agent-runtime/src/voice-media.js.map +1 -0
- package/dist/agent-runtime/src/voice-wire-types.d.ts +32 -0
- package/dist/assets/AssetPanel.cjs +11 -11
- package/dist/assets/AssetPanel.cjs.map +1 -1
- package/dist/assets/AthenaAssetEmbed.cjs +11 -9
- package/dist/assets/AthenaAssetEmbed.cjs.map +1 -1
- package/dist/assets/AthenaAssetEmbed.d.ts +7 -0
- package/dist/assets/AthenaAssetEmbed.js +4 -2
- package/dist/assets/AthenaAssetEmbed.js.map +1 -1
- package/dist/assets/AthenaLayout.cjs +16 -16
- package/dist/assets/AthenaLayout.cjs.map +1 -1
- package/dist/assets/use-asset-content.cjs +4 -4
- package/dist/assets/use-asset-content.cjs.map +1 -1
- package/dist/assets/use-asset-embed.cjs +14 -7
- package/dist/assets/use-asset-embed.cjs.map +1 -1
- package/dist/assets/use-asset-embed.d.ts +11 -1
- package/dist/assets/use-asset-embed.js +10 -3
- package/dist/assets/use-asset-embed.js.map +1 -1
- package/dist/auth/AthenaAuthContext.cjs +3 -3
- package/dist/auth/AthenaAuthContext.cjs.map +1 -1
- package/dist/auth/AthenaAuthProvider.cjs +8 -8
- package/dist/auth/AthenaAuthProvider.cjs.map +1 -1
- package/dist/auth/AthenaCredentialSourceContext.cjs +5 -5
- package/dist/auth/AthenaCredentialSourceContext.cjs.map +1 -1
- package/dist/auth/AthenaSSOProvider.cjs +14 -14
- package/dist/auth/AthenaSSOProvider.cjs.map +1 -1
- package/dist/auth/credential-source.cjs +26 -13
- package/dist/auth/credential-source.cjs.map +1 -1
- package/dist/auth/credential-source.d.ts +8 -0
- package/dist/auth/credential-source.js +26 -13
- package/dist/auth/credential-source.js.map +1 -1
- package/dist/catalog/agent-model-options.cjs +25 -17
- package/dist/catalog/agent-model-options.cjs.map +1 -1
- package/dist/catalog/agent-model-options.d.ts +38 -5
- package/dist/catalog/agent-model-options.js +25 -17
- package/dist/catalog/agent-model-options.js.map +1 -1
- package/dist/catalog/channel-refusal.cjs +36 -0
- package/dist/catalog/channel-refusal.cjs.map +1 -0
- package/dist/catalog/channel-refusal.d.ts +29 -0
- package/dist/catalog/channel-refusal.js +36 -0
- package/dist/catalog/channel-refusal.js.map +1 -0
- package/dist/catalog/chat-pickers.cjs +60 -24
- package/dist/catalog/chat-pickers.cjs.map +1 -1
- package/dist/catalog/chat-pickers.d.ts +12 -2
- package/dist/catalog/chat-pickers.js +56 -20
- package/dist/catalog/chat-pickers.js.map +1 -1
- package/dist/catalog/runtime-catalog.cjs +89 -23
- package/dist/catalog/runtime-catalog.cjs.map +1 -1
- package/dist/catalog/runtime-catalog.d.ts +8 -2
- package/dist/catalog/runtime-catalog.js +83 -17
- package/dist/catalog/runtime-catalog.js.map +1 -1
- package/dist/catalog/use-athena-chat-mode.cjs +12 -12
- package/dist/catalog/use-athena-chat-mode.cjs.map +1 -1
- package/dist/chat/AthenaChat.cjs +155 -67
- package/dist/chat/AthenaChat.cjs.map +1 -1
- package/dist/chat/AthenaChat.d.ts +42 -2
- package/dist/chat/AthenaChat.js +106 -18
- package/dist/chat/AthenaChat.js.map +1 -1
- package/dist/chat/AthenaChatErrorBoundary.cjs +3 -3
- package/dist/chat/AthenaChatErrorBoundary.cjs.map +1 -1
- package/dist/chat/DrivingOnChip.cjs +23 -0
- package/dist/chat/DrivingOnChip.cjs.map +1 -0
- package/dist/chat/DrivingOnChip.d.ts +17 -0
- package/dist/chat/DrivingOnChip.js +23 -0
- package/dist/chat/DrivingOnChip.js.map +1 -0
- package/dist/chat/StatewireApprovalCard.cjs +125 -31
- package/dist/chat/StatewireApprovalCard.cjs.map +1 -1
- package/dist/chat/StatewireApprovalCard.d.ts +73 -1
- package/dist/chat/StatewireApprovalCard.js +115 -21
- package/dist/chat/StatewireApprovalCard.js.map +1 -1
- package/dist/chat/StatewireClientToolBridge.cjs +2 -2
- package/dist/chat/StatewireClientToolBridge.cjs.map +1 -1
- package/dist/chat/StatewireQueuedMessages.cjs +25 -63
- package/dist/chat/StatewireQueuedMessages.cjs.map +1 -1
- package/dist/chat/StatewireQueuedMessages.d.ts +11 -13
- package/dist/chat/StatewireQueuedMessages.js +16 -54
- package/dist/chat/StatewireQueuedMessages.js.map +1 -1
- package/dist/chat/WaitingOnYouBanner.cjs +3 -3
- package/dist/chat/WaitingOnYouBanner.cjs.map +1 -1
- package/dist/chat/athena-chat-welcome.cjs +2 -2
- package/dist/chat/athena-chat-welcome.cjs.map +1 -1
- package/dist/chat/athena-citation-links.cjs +5 -5
- package/dist/chat/athena-citation-links.cjs.map +1 -1
- package/dist/chat/athena-composer-controls.cjs +26 -16
- package/dist/chat/athena-composer-controls.cjs.map +1 -1
- package/dist/chat/athena-composer-controls.d.ts +6 -0
- package/dist/chat/athena-composer-controls.js +26 -16
- package/dist/chat/athena-composer-controls.js.map +1 -1
- package/dist/chat/athena-turn-end-status.cjs +42 -0
- package/dist/chat/athena-turn-end-status.cjs.map +1 -0
- package/dist/chat/athena-turn-end-status.d.ts +24 -0
- package/dist/chat/athena-turn-end-status.js +42 -0
- package/dist/chat/athena-turn-end-status.js.map +1 -0
- package/dist/chat/browser-decision-check.cjs +131 -0
- package/dist/chat/browser-decision-check.cjs.map +1 -0
- package/dist/chat/browser-decision-check.d.ts +61 -0
- package/dist/chat/browser-decision-check.js +131 -0
- package/dist/chat/browser-decision-check.js.map +1 -0
- package/dist/chat/chat-outbox-rows.cjs +3 -3
- package/dist/chat/chat-outbox-rows.cjs.map +1 -1
- package/dist/chat/chat-voice-controls.cjs +93 -28
- package/dist/chat/chat-voice-controls.cjs.map +1 -1
- package/dist/chat/chat-voice-controls.d.ts +36 -2
- package/dist/chat/chat-voice-controls.js +89 -24
- package/dist/chat/chat-voice-controls.js.map +1 -1
- package/dist/chat/composer-keyboard-hint.cjs +5 -5
- package/dist/chat/composer-keyboard-hint.cjs.map +1 -1
- package/dist/chat/device-operation.cjs +29 -0
- package/dist/chat/device-operation.cjs.map +1 -0
- package/dist/chat/device-operation.d.ts +34 -0
- package/dist/chat/device-operation.js +29 -0
- package/dist/chat/device-operation.js.map +1 -0
- package/dist/chat/super-grouping/CollapsibleGroup.cjs +14 -14
- package/dist/chat/super-grouping/CollapsibleGroup.cjs.map +1 -1
- package/dist/chat/super-grouping/GroupedMessageParts.cjs +4 -4
- package/dist/chat/super-grouping/GroupedMessageParts.cjs.map +1 -1
- package/dist/chat/super-grouping/SuperGroupingCard.cjs +52 -36
- package/dist/chat/super-grouping/SuperGroupingCard.cjs.map +1 -1
- package/dist/chat/super-grouping/SuperGroupingCard.d.ts +19 -4
- package/dist/chat/super-grouping/SuperGroupingCard.js +29 -13
- package/dist/chat/super-grouping/SuperGroupingCard.js.map +1 -1
- package/dist/chat/super-grouping/SuperGroupingTranscript.cjs +32 -32
- package/dist/chat/super-grouping/SuperGroupingTranscript.cjs.map +1 -1
- package/dist/chat/super-grouping/SuperGroupingTranscript.js +3 -3
- package/dist/chat/super-grouping/SuperGroupingTranscript.js.map +1 -1
- package/dist/chat/super-grouping/ToolTimeline.cjs +73 -40
- package/dist/chat/super-grouping/ToolTimeline.cjs.map +1 -1
- package/dist/chat/super-grouping/ToolTimeline.d.ts +10 -2
- package/dist/chat/super-grouping/ToolTimeline.js +69 -36
- package/dist/chat/super-grouping/ToolTimeline.js.map +1 -1
- package/dist/chat/super-grouping/activity-timeline.cjs +47 -12
- package/dist/chat/super-grouping/activity-timeline.cjs.map +1 -1
- package/dist/chat/super-grouping/activity-timeline.d.ts +21 -0
- package/dist/chat/super-grouping/activity-timeline.js +47 -12
- package/dist/chat/super-grouping/activity-timeline.js.map +1 -1
- package/dist/chat/super-grouping/grouping-function.cjs +4 -0
- package/dist/chat/super-grouping/grouping-function.cjs.map +1 -1
- package/dist/chat/super-grouping/grouping-function.d.ts +7 -0
- package/dist/chat/super-grouping/grouping-function.js +5 -1
- package/dist/chat/super-grouping/grouping-function.js.map +1 -1
- package/dist/chat/super-grouping/index.cjs +6 -0
- package/dist/chat/super-grouping/index.cjs.map +1 -1
- package/dist/chat/super-grouping/index.d.ts +5 -2
- package/dist/chat/super-grouping/index.js +7 -1
- package/dist/chat/super-grouping/index.js.map +1 -1
- package/dist/chat/super-grouping/tool-part-placement.cjs +17 -0
- package/dist/chat/super-grouping/tool-part-placement.cjs.map +1 -0
- package/dist/chat/super-grouping/tool-part-placement.d.ts +22 -0
- package/dist/chat/super-grouping/tool-part-placement.js +17 -0
- package/dist/chat/super-grouping/tool-part-placement.js.map +1 -0
- package/dist/chat/thread-scroll-to-bottom.cjs +2 -2
- package/dist/chat/thread-scroll-to-bottom.cjs.map +1 -1
- package/dist/chat/thread-scroll-to-bottom.d.ts +10 -7
- package/dist/chat/thread-scroll-to-bottom.js +2 -2
- package/dist/chat/thread-scroll-to-bottom.js.map +1 -1
- package/dist/chat/tooltip-icon-button.cjs +2 -2
- package/dist/chat/tooltip-icon-button.cjs.map +1 -1
- package/dist/chat/use-athena-voice-live.cjs +11 -0
- package/dist/chat/use-athena-voice-live.cjs.map +1 -0
- package/dist/chat/use-athena-voice-live.d.ts +11 -0
- package/dist/chat/use-athena-voice-live.js +11 -0
- package/dist/chat/use-athena-voice-live.js.map +1 -0
- package/dist/chat/use-statewire-approval-request.cjs +56 -24
- package/dist/chat/use-statewire-approval-request.cjs.map +1 -1
- package/dist/chat/use-statewire-approval-request.d.ts +33 -4
- package/dist/chat/use-statewire-approval-request.js +41 -9
- package/dist/chat/use-statewire-approval-request.js.map +1 -1
- package/dist/chat-ui/auth/sign-in-card.cjs +2 -2
- package/dist/chat-ui/auth/sign-in-card.cjs.map +1 -1
- package/dist/chat-ui/composer/tiptap-composer.cjs +138 -107
- package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -1
- package/dist/chat-ui/composer/tiptap-composer.d.ts +20 -4
- package/dist/chat-ui/composer/tiptap-composer.js +85 -54
- package/dist/chat-ui/composer/tiptap-composer.js.map +1 -1
- package/dist/chat-ui/header/conversation-history-panel.cjs +49 -23
- package/dist/chat-ui/header/conversation-history-panel.cjs.map +1 -1
- package/dist/chat-ui/header/conversation-history-panel.d.ts +12 -1
- package/dist/chat-ui/header/conversation-history-panel.js +38 -12
- package/dist/chat-ui/header/conversation-history-panel.js.map +1 -1
- package/dist/chat-ui/index.cjs +18 -0
- package/dist/chat-ui/index.cjs.map +1 -1
- package/dist/chat-ui/index.d.ts +7 -1
- package/dist/chat-ui/index.js +18 -0
- package/dist/chat-ui/index.js.map +1 -1
- package/dist/chat-ui/mentions/mention-chip.cjs +4 -4
- package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.cjs +10 -9
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.js +3 -2
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs +2 -2
- package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/menu-list.cjs +29 -6
- package/dist/chat-ui/mentions/suggestions/components/menu-list.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/menu-list.d.ts +7 -1
- package/dist/chat-ui/mentions/suggestions/components/menu-list.js +25 -2
- package/dist/chat-ui/mentions/suggestions/components/menu-list.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/use-keyboard-navigation.cjs +2 -2
- package/dist/chat-ui/mentions/suggestions/components/use-keyboard-navigation.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/components/use-menu-navigation.cjs +2 -2
- package/dist/chat-ui/mentions/suggestions/components/use-menu-navigation.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/api-client.cjs +3 -3
- package/dist/chat-ui/mentions/suggestions/data/api-client.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/orchestrator.cjs +56 -2
- package/dist/chat-ui/mentions/suggestions/data/orchestrator.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/orchestrator.d.ts +12 -0
- package/dist/chat-ui/mentions/suggestions/data/orchestrator.js +56 -2
- package/dist/chat-ui/mentions/suggestions/data/orchestrator.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs +24 -3
- package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/sources/index.d.ts +7 -0
- package/dist/chat-ui/mentions/suggestions/data/sources/index.js +24 -3
- package/dist/chat-ui/mentions/suggestions/data/sources/index.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs +35 -13
- package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.d.ts +15 -1
- package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js +28 -6
- package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/use-menu-items.cjs +9 -6
- package/dist/chat-ui/mentions/suggestions/data/use-menu-items.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/use-menu-items.d.ts +3 -0
- package/dist/chat-ui/mentions/suggestions/data/use-menu-items.js +5 -2
- package/dist/chat-ui/mentions/suggestions/data/use-menu-items.js.map +1 -1
- package/dist/chat-ui/mentions/use-account-workspace-id.cjs +45 -10
- package/dist/chat-ui/mentions/use-account-workspace-id.cjs.map +1 -1
- package/dist/chat-ui/mentions/use-account-workspace-id.d.ts +24 -1
- package/dist/chat-ui/mentions/use-account-workspace-id.js +46 -11
- package/dist/chat-ui/mentions/use-account-workspace-id.js.map +1 -1
- package/dist/chat-ui/mentions/use-member-avatar.cjs +4 -4
- package/dist/chat-ui/mentions/use-member-avatar.cjs.map +1 -1
- package/dist/chat-ui/mentions/use-mention-asset.cjs +3 -3
- package/dist/chat-ui/mentions/use-mention-asset.cjs.map +1 -1
- package/dist/chat-ui/messages/answer-label.cjs +42 -0
- package/dist/chat-ui/messages/answer-label.cjs.map +1 -0
- package/dist/chat-ui/messages/answer-label.d.ts +33 -0
- package/dist/chat-ui/messages/answer-label.js +42 -0
- package/dist/chat-ui/messages/answer-label.js.map +1 -0
- package/dist/chat-ui/messages/arrival-animation.cjs +13 -0
- package/dist/chat-ui/messages/arrival-animation.cjs.map +1 -0
- package/dist/chat-ui/messages/arrival-animation.d.ts +14 -0
- package/dist/chat-ui/messages/arrival-animation.js +13 -0
- package/dist/chat-ui/messages/arrival-animation.js.map +1 -0
- package/dist/chat-ui/messages/continue-pill.cjs +5 -5
- package/dist/chat-ui/messages/continue-pill.cjs.map +1 -1
- package/dist/chat-ui/messages/handoff-arrival-divider.cjs +44 -0
- package/dist/chat-ui/messages/handoff-arrival-divider.cjs.map +1 -0
- package/dist/chat-ui/messages/handoff-arrival-divider.d.ts +17 -0
- package/dist/chat-ui/messages/handoff-arrival-divider.js +44 -0
- package/dist/chat-ui/messages/handoff-arrival-divider.js.map +1 -0
- package/dist/chat-ui/messages/message-actions-config.cjs +3 -3
- package/dist/chat-ui/messages/message-actions-config.cjs.map +1 -1
- package/dist/chat-ui/messages/message-components.cjs +8 -4
- package/dist/chat-ui/messages/message-components.cjs.map +1 -1
- package/dist/chat-ui/messages/message-components.js +5 -1
- package/dist/chat-ui/messages/message-components.js.map +1 -1
- package/dist/chat-ui/messages/message-images.cjs +66 -0
- package/dist/chat-ui/messages/message-images.cjs.map +1 -0
- package/dist/chat-ui/messages/message-images.d.ts +16 -0
- package/dist/chat-ui/messages/message-images.js +66 -0
- package/dist/chat-ui/messages/message-images.js.map +1 -0
- package/dist/chat-ui/messages/user-edit-composer.cjs +2 -2
- package/dist/chat-ui/messages/user-edit-composer.cjs.map +1 -1
- package/dist/chat-ui/messages/wake-marker.cjs +3 -3
- package/dist/chat-ui/messages/wake-marker.cjs.map +1 -1
- package/dist/chat-ui/rich-text/chat-link.cjs +2 -2
- package/dist/chat-ui/rich-text/chat-link.cjs.map +1 -1
- package/dist/chat-ui/rich-text/chat-message-body.cjs +8 -8
- package/dist/chat-ui/rich-text/chat-message-body.cjs.map +1 -1
- package/dist/chat-ui/rich-text/chat-node-views.cjs +6 -6
- package/dist/chat-ui/rich-text/chat-node-views.cjs.map +1 -1
- package/dist/chat-ui/rich-text/dom-output-spec.cjs +2 -2
- package/dist/chat-ui/rich-text/dom-output-spec.cjs.map +1 -1
- package/dist/chat-ui/statewire.cjs +3 -0
- package/dist/chat-ui/statewire.cjs.map +1 -1
- package/dist/chat-ui/statewire.d.ts +2 -1
- package/dist/chat-ui/statewire.js +3 -0
- package/dist/chat-ui/statewire.js.map +1 -1
- package/dist/chat-ui/thread/chat-thread-shell.cjs +43 -14
- package/dist/chat-ui/thread/chat-thread-shell.cjs.map +1 -1
- package/dist/chat-ui/thread/chat-thread-shell.d.ts +16 -2
- package/dist/chat-ui/thread/chat-thread-shell.js +35 -6
- package/dist/chat-ui/thread/chat-thread-shell.js.map +1 -1
- package/dist/chat-ui/thread/composer-send-or-stop.cjs +30 -20
- package/dist/chat-ui/thread/composer-send-or-stop.cjs.map +1 -1
- package/dist/chat-ui/thread/composer-send-or-stop.d.ts +8 -0
- package/dist/chat-ui/thread/composer-send-or-stop.js +29 -19
- package/dist/chat-ui/thread/composer-send-or-stop.js.map +1 -1
- package/dist/chat-ui/thread/statewire-history-edge.cjs +20 -21
- package/dist/chat-ui/thread/statewire-history-edge.cjs.map +1 -1
- package/dist/chat-ui/thread/statewire-history-edge.js +3 -4
- package/dist/chat-ui/thread/statewire-history-edge.js.map +1 -1
- package/dist/chat-ui/thread/thread-loading-overlay.cjs +5 -5
- package/dist/chat-ui/thread/thread-loading-overlay.cjs.map +1 -1
- package/dist/collab/client.cjs +40 -3
- package/dist/collab/client.cjs.map +1 -1
- package/dist/collab/client.d.ts +25 -0
- package/dist/collab/client.js +40 -3
- package/dist/collab/client.js.map +1 -1
- package/dist/collab/document-status.cjs +150 -0
- package/dist/collab/document-status.cjs.map +1 -0
- package/dist/collab/document-status.d.ts +68 -0
- package/dist/collab/document-status.js +150 -0
- package/dist/collab/document-status.js.map +1 -0
- package/dist/collab/index.cjs +7 -0
- package/dist/collab/index.cjs.map +1 -1
- package/dist/collab/index.d.ts +6 -1
- package/dist/collab/index.js +7 -0
- package/dist/collab/index.js.map +1 -1
- package/dist/collab/presence-react.cjs +11 -11
- package/dist/collab/presence-react.cjs.map +1 -1
- package/dist/collab/react.cjs +6 -6
- package/dist/collab/react.cjs.map +1 -1
- package/dist/composer/AttachmentContext.cjs +24 -11
- package/dist/composer/AttachmentContext.cjs.map +1 -1
- package/dist/composer/AttachmentContext.js +18 -5
- package/dist/composer/AttachmentContext.js.map +1 -1
- package/dist/composer/ComposerAttachmentPreview.cjs +78 -23
- package/dist/composer/ComposerAttachmentPreview.cjs.map +1 -1
- package/dist/composer/ComposerAttachmentPreview.d.ts +5 -3
- package/dist/composer/ComposerAttachmentPreview.js +79 -24
- package/dist/composer/ComposerAttachmentPreview.js.map +1 -1
- package/dist/composer/ComposerDropZone.cjs +7 -7
- package/dist/composer/ComposerDropZone.cjs.map +1 -1
- package/dist/composer/FileUploadButton.cjs +37 -22
- package/dist/composer/FileUploadButton.cjs.map +1 -1
- package/dist/composer/FileUploadButton.d.ts +6 -0
- package/dist/composer/FileUploadButton.js +34 -19
- package/dist/composer/FileUploadButton.js.map +1 -1
- package/dist/composer/QuoteContext.cjs +8 -8
- package/dist/composer/QuoteContext.cjs.map +1 -1
- package/dist/composer/composer-handoff.cjs +4 -4
- package/dist/composer/composer-handoff.cjs.map +1 -1
- package/dist/composer/useAppendToComposer.cjs +4 -4
- package/dist/composer/useAppendToComposer.cjs.map +1 -1
- package/dist/composer/useAttachFiles.cjs +23 -6
- package/dist/composer/useAttachFiles.cjs.map +1 -1
- package/dist/composer/useAttachFiles.d.ts +15 -7
- package/dist/composer/useAttachFiles.js +22 -5
- package/dist/composer/useAttachFiles.js.map +1 -1
- package/dist/composer/useComposerAttachment.cjs +4 -4
- package/dist/composer/useComposerAttachment.cjs.map +1 -1
- package/dist/composer/useFileUpload.cjs +21 -16
- package/dist/composer/useFileUpload.cjs.map +1 -1
- package/dist/composer/useFileUpload.d.ts +12 -0
- package/dist/composer/useFileUpload.js +12 -7
- package/dist/composer/useFileUpload.js.map +1 -1
- package/dist/composer/useReadComposerDraft.cjs +2 -2
- package/dist/composer/useReadComposerDraft.cjs.map +1 -1
- package/dist/composer/useSendMessage.cjs +4 -4
- package/dist/composer/useSendMessage.cjs.map +1 -1
- package/dist/diagnostics/useAthenaDiagnostics.cjs +4 -4
- package/dist/diagnostics/useAthenaDiagnostics.cjs.map +1 -1
- package/dist/dictation/audio-level-history.cjs +3 -3
- package/dist/dictation/audio-level-history.cjs.map +1 -1
- package/dist/dictation/dictation-controls.cjs +24 -20
- package/dist/dictation/dictation-controls.cjs.map +1 -1
- package/dist/dictation/dictation-controls.d.ts +6 -1
- package/dist/dictation/dictation-controls.js +24 -20
- package/dist/dictation/dictation-controls.js.map +1 -1
- package/dist/dictation/use-athena-dictation-engine.cjs +3 -3
- package/dist/dictation/use-athena-dictation-engine.cjs.map +1 -1
- package/dist/dictation/use-dictation.cjs +22 -22
- package/dist/dictation/use-dictation.cjs.map +1 -1
- package/dist/index.cjs +26 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +15 -3
- package/dist/index.js +26 -2
- package/dist/index.js.map +1 -1
- package/dist/keryx-http/src/receive-only-socket.cjs +40 -0
- package/dist/keryx-http/src/receive-only-socket.cjs.map +1 -0
- package/dist/keryx-http/src/receive-only-socket.d.ts +27 -0
- package/dist/keryx-http/src/receive-only-socket.js +40 -0
- package/dist/keryx-http/src/receive-only-socket.js.map +1 -0
- package/dist/keryx-http/src/update-attributions.cjs +111 -0
- package/dist/keryx-http/src/update-attributions.cjs.map +1 -0
- package/dist/keryx-http/src/update-attributions.d.ts +75 -0
- package/dist/keryx-http/src/update-attributions.js +111 -0
- package/dist/keryx-http/src/update-attributions.js.map +1 -0
- package/dist/lib/owner-document.cjs +6 -6
- package/dist/lib/owner-document.cjs.map +1 -1
- package/dist/lib/use-athena-rest-query.cjs +4 -4
- package/dist/lib/use-athena-rest-query.cjs.map +1 -1
- package/dist/lib/use-document-active.cjs +4 -4
- package/dist/lib/use-document-active.cjs.map +1 -1
- package/dist/lib/use-prefers-reduced-motion.cjs +2 -2
- package/dist/lib/use-prefers-reduced-motion.cjs.map +1 -1
- package/dist/offline/offline-history.cjs +7 -7
- package/dist/offline/offline-history.cjs.map +1 -1
- package/dist/provider/AthenaContext.cjs +3 -3
- package/dist/provider/AthenaContext.cjs.map +1 -1
- package/dist/provider/AthenaProvider.cjs +116 -79
- package/dist/provider/AthenaProvider.cjs.map +1 -1
- package/dist/provider/AthenaProvider.js +40 -3
- package/dist/provider/AthenaProvider.js.map +1 -1
- package/dist/provider/PostHogProvider.cjs +2 -2
- package/dist/provider/PostHogProvider.cjs.map +1 -1
- package/dist/provider/agent-selection-context.cjs +2 -2
- package/dist/provider/agent-selection-context.cjs.map +1 -1
- package/dist/provider/chat-mode-context.cjs +2 -2
- package/dist/provider/chat-mode-context.cjs.map +1 -1
- package/dist/provider/session-persistence-context.cjs +10 -0
- package/dist/provider/session-persistence-context.cjs.map +1 -0
- package/dist/provider/session-persistence-context.d.ts +15 -0
- package/dist/provider/session-persistence-context.js +10 -0
- package/dist/provider/session-persistence-context.js.map +1 -0
- package/dist/provider/statewire-history-context.cjs +4 -4
- package/dist/provider/statewire-history-context.cjs.map +1 -1
- package/dist/provider/statewire-lifecycle-context.cjs +3 -3
- package/dist/provider/statewire-lifecycle-context.cjs.map +1 -1
- package/dist/provider/statewire-window-context.cjs +3 -3
- package/dist/provider/statewire-window-context.cjs.map +1 -1
- package/dist/provider/theme-style-context.cjs +3 -3
- package/dist/provider/theme-style-context.cjs.map +1 -1
- package/dist/react/package.json.cjs +1 -1
- package/dist/react/package.json.js +1 -1
- package/dist/runtime/StatewireThreadConfigLaneSync.cjs +10 -10
- package/dist/runtime/StatewireThreadConfigLaneSync.cjs.map +1 -1
- package/dist/runtime/auth-refusal-restart.cjs +7 -7
- package/dist/runtime/auth-refusal-restart.cjs.map +1 -1
- package/dist/runtime/auth.cjs +13 -13
- package/dist/runtime/auth.cjs.map +1 -1
- package/dist/runtime/statewire-lifecycle.cjs +1 -0
- package/dist/runtime/statewire-lifecycle.cjs.map +1 -1
- package/dist/runtime/statewire-lifecycle.d.ts +3 -1
- package/dist/runtime/statewire-lifecycle.js +2 -1
- package/dist/runtime/statewire-lifecycle.js.map +1 -1
- package/dist/runtime/statewire-server-lane-context.cjs +2 -2
- package/dist/runtime/statewire-server-lane-context.cjs.map +1 -1
- package/dist/runtime/statewire-session-lane.cjs +4 -4
- package/dist/runtime/statewire-session-lane.cjs.map +1 -1
- package/dist/runtime/useAthenaStatewireRuntime.cjs +10 -8
- package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
- package/dist/runtime/useAthenaStatewireRuntime.d.ts +2 -0
- package/dist/runtime/useAthenaStatewireRuntime.js +2 -0
- package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/threads/Inbox.cjs +8 -8
- package/dist/threads/Inbox.cjs.map +1 -1
- package/dist/threads/SessionList.cjs +9 -9
- package/dist/threads/SessionList.cjs.map +1 -1
- package/dist/threads/SessionsPage.cjs +11 -11
- package/dist/threads/SessionsPage.cjs.map +1 -1
- package/dist/threads/index-triggered-refresh.cjs +10 -10
- package/dist/threads/index-triggered-refresh.cjs.map +1 -1
- package/dist/threads/mark-viewed-thread-read.cjs +12 -12
- package/dist/threads/mark-viewed-thread-read.cjs.map +1 -1
- package/dist/threads/offline-session-list.cjs +3 -3
- package/dist/threads/offline-session-list.cjs.map +1 -1
- package/dist/threads/session-list-tab-share.cjs +5 -5
- package/dist/threads/session-list-tab-share.cjs.map +1 -1
- package/dist/threads/statewire-thread-list.cjs +51 -51
- package/dist/threads/statewire-thread-list.cjs.map +1 -1
- package/dist/threads/thread-id-context.cjs +5 -5
- package/dist/threads/thread-id-context.cjs.map +1 -1
- package/dist/threads/use-athena-session-attention.cjs +2 -2
- package/dist/threads/use-athena-session-attention.cjs.map +1 -1
- package/dist/threads/use-athena-sessions.cjs +10 -10
- package/dist/threads/use-athena-sessions.cjs.map +1 -1
- package/dist/threads/use-athena-thread-model.cjs +3 -3
- package/dist/threads/use-athena-thread-model.cjs.map +1 -1
- package/dist/threads/use-rest-conversation-history.cjs +3 -3
- package/dist/threads/use-rest-conversation-history.cjs.map +1 -1
- package/dist/threads/use-statewire-conversation-history.cjs +8 -8
- package/dist/threads/use-statewire-conversation-history.cjs.map +1 -1
- package/dist/threads/use-thread-archive.cjs +9 -9
- package/dist/threads/use-thread-archive.cjs.map +1 -1
- package/dist/threads/use-thread-favorite.cjs +2 -2
- package/dist/threads/use-thread-favorite.cjs.map +1 -1
- package/dist/threads/use-thread-field-override.cjs +20 -20
- package/dist/threads/use-thread-field-override.cjs.map +1 -1
- package/dist/threads/use-thread-read-state.cjs +4 -4
- package/dist/threads/use-thread-read-state.cjs.map +1 -1
- package/dist/threads/use-thread-rename.cjs +2 -2
- package/dist/threads/use-thread-rename.cjs.map +1 -1
- package/dist/threads/useAthenaThreadManager.cjs +2 -2
- package/dist/threads/useAthenaThreadManager.cjs.map +1 -1
- package/dist/tools/NestedPtcMessages.cjs +6 -6
- package/dist/tools/NestedPtcMessages.cjs.map +1 -1
- package/dist/tools/append-document-tool-ui.cjs +7 -7
- package/dist/tools/append-document-tool-ui.cjs.map +1 -1
- package/dist/tools/file-tool-uis.cjs +2 -2
- package/dist/tools/file-tool-uis.cjs.map +1 -1
- package/dist/tools/misc-tool-uis.cjs +2 -2
- package/dist/tools/misc-tool-uis.cjs.map +1 -1
- package/dist/tools/primitives.cjs +6 -6
- package/dist/tools/primitives.cjs.map +1 -1
- package/dist/tools/read-asset-tool-ui.cjs +6 -6
- package/dist/tools/read-asset-tool-ui.cjs.map +1 -1
- package/dist/tools/subagent-task-tool-ui.cjs +21 -21
- package/dist/tools/subagent-task-tool-ui.cjs.map +1 -1
- package/dist/tools/test-recording-tool-uis.cjs +16 -16
- package/dist/tools/test-recording-tool-uis.cjs.map +1 -1
- package/dist/tools/todo-plan-store.cjs +4 -4
- package/dist/tools/todo-plan-store.cjs.map +1 -1
- package/dist/tools/tool-appearance.cjs +3 -3
- package/dist/tools/tool-appearance.cjs.map +1 -1
- package/dist/tools/tool-fallback.cjs +14 -14
- package/dist/tools/tool-fallback.cjs.map +1 -1
- package/dist/tools/tool-uis.cjs +74 -74
- package/dist/tools/tool-uis.cjs.map +1 -1
- package/dist/tools/use-elapsed-seconds.cjs +3 -3
- package/dist/tools/use-elapsed-seconds.cjs.map +1 -1
- package/dist/tools/write-todos-tool-ui.cjs +9 -9
- package/dist/tools/write-todos-tool-ui.cjs.map +1 -1
- package/dist/ui/image-viewer.cjs +382 -0
- package/dist/ui/image-viewer.cjs.map +1 -0
- package/dist/ui/image-viewer.d.ts +50 -0
- package/dist/ui/image-viewer.js +382 -0
- package/dist/ui/image-viewer.js.map +1 -0
- package/dist/voice/chat.cjs +6 -0
- package/dist/voice/chat.cjs.map +1 -1
- package/dist/voice/chat.d.ts +1 -1
- package/dist/voice/chat.js +8 -2
- package/dist/voice/livekit-join.cjs +52 -101
- package/dist/voice/livekit-join.cjs.map +1 -1
- package/dist/voice/livekit-join.d.ts +1 -6
- package/dist/voice/livekit-join.js +52 -101
- package/dist/voice/livekit-join.js.map +1 -1
- package/dist/voice/livekit.cjs.map +1 -1
- package/dist/voice/livekit.d.ts +11 -1
- package/dist/voice/livekit.js.map +1 -1
- package/dist/voice/use-athena-voice-session.cjs +34 -34
- package/dist/voice/use-athena-voice-session.cjs.map +1 -1
- package/dist/workbench/ComputerLiveDesktop.cjs +13 -13
- package/dist/workbench/ComputerLiveDesktop.cjs.map +1 -1
- package/dist/workbench/SessionWorkbench.cjs +22 -22
- package/dist/workbench/SessionWorkbench.cjs.map +1 -1
- package/dist/workbench/session-workbench-context.cjs +3 -3
- package/dist/workbench/session-workbench-context.cjs.map +1 -1
- package/dist/workbench/session-workbench-panes.cjs +8 -8
- package/dist/workbench/session-workbench-panes.cjs.map +1 -1
- package/dist/workbench/workbench-layout-context.cjs +3 -3
- package/dist/workbench/workbench-layout-context.cjs.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const offlineStatus = require("../agent-runtime/src/offline-status.cjs");
|
|
4
|
+
const DOCUMENT_STATUS_REFRESH_MS = 5 * 6e4;
|
|
5
|
+
const DOCUMENT_STATUS_REFUSED_REFRESH_MS = 6e4;
|
|
6
|
+
const DOCUMENT_STATUS_READ_TIMEOUT_MS = 3e4;
|
|
7
|
+
function settleWithin({
|
|
8
|
+
promise,
|
|
9
|
+
timeoutMs
|
|
10
|
+
}) {
|
|
11
|
+
return new Promise((resolve) => {
|
|
12
|
+
const timer = setTimeout(() => resolve(null), timeoutMs);
|
|
13
|
+
promise.then(
|
|
14
|
+
(value) => {
|
|
15
|
+
clearTimeout(timer);
|
|
16
|
+
resolve(value);
|
|
17
|
+
},
|
|
18
|
+
() => {
|
|
19
|
+
clearTimeout(timer);
|
|
20
|
+
resolve(null);
|
|
21
|
+
}
|
|
22
|
+
);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
function pageHidden() {
|
|
26
|
+
return typeof document !== "undefined" && document.visibilityState === "hidden";
|
|
27
|
+
}
|
|
28
|
+
function watchDocumentStatus({
|
|
29
|
+
read,
|
|
30
|
+
currentGrant,
|
|
31
|
+
onChange
|
|
32
|
+
}) {
|
|
33
|
+
let connected = false;
|
|
34
|
+
let unconfirmed = false;
|
|
35
|
+
let writesRefused = false;
|
|
36
|
+
let reading = false;
|
|
37
|
+
let readAgain = false;
|
|
38
|
+
let destroyed = false;
|
|
39
|
+
let stallRead = false;
|
|
40
|
+
let stallTimer = null;
|
|
41
|
+
let cadenceTimer = null;
|
|
42
|
+
const clearStallTimer = () => {
|
|
43
|
+
if (stallTimer !== null) {
|
|
44
|
+
clearTimeout(stallTimer);
|
|
45
|
+
stallTimer = null;
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
const clearCadenceTimer = () => {
|
|
49
|
+
if (cadenceTimer !== null) {
|
|
50
|
+
clearTimeout(cadenceTimer);
|
|
51
|
+
cadenceTimer = null;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
const setWritesRefused = (next) => {
|
|
55
|
+
if (next === writesRefused) return;
|
|
56
|
+
writesRefused = next;
|
|
57
|
+
onChange();
|
|
58
|
+
};
|
|
59
|
+
const scheduleCadence = () => {
|
|
60
|
+
clearCadenceTimer();
|
|
61
|
+
if (destroyed || !connected) return;
|
|
62
|
+
cadenceTimer = setTimeout(
|
|
63
|
+
() => {
|
|
64
|
+
cadenceTimer = null;
|
|
65
|
+
if (pageHidden()) {
|
|
66
|
+
scheduleCadence();
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
void readStatus();
|
|
70
|
+
},
|
|
71
|
+
writesRefused ? DOCUMENT_STATUS_REFUSED_REFRESH_MS : DOCUMENT_STATUS_REFRESH_MS
|
|
72
|
+
);
|
|
73
|
+
};
|
|
74
|
+
async function readStatus() {
|
|
75
|
+
if (destroyed || !connected) return;
|
|
76
|
+
if (reading) {
|
|
77
|
+
readAgain = true;
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const grant = currentGrant();
|
|
81
|
+
if (grant === null) return;
|
|
82
|
+
clearCadenceTimer();
|
|
83
|
+
if (grant.access_type !== "rw") {
|
|
84
|
+
setWritesRefused(false);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
reading = true;
|
|
88
|
+
const answer = await settleWithin({
|
|
89
|
+
promise: read({ grant }),
|
|
90
|
+
timeoutMs: DOCUMENT_STATUS_READ_TIMEOUT_MS
|
|
91
|
+
});
|
|
92
|
+
reading = false;
|
|
93
|
+
if (destroyed) return;
|
|
94
|
+
setWritesRefused((answer == null ? void 0 : answer.writesRefused) === true);
|
|
95
|
+
if (readAgain) {
|
|
96
|
+
readAgain = false;
|
|
97
|
+
void readStatus();
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
scheduleCadence();
|
|
101
|
+
}
|
|
102
|
+
const stallChanged = () => {
|
|
103
|
+
if (!connected || !unconfirmed) {
|
|
104
|
+
clearStallTimer();
|
|
105
|
+
stallRead = false;
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (stallTimer !== null || stallRead || destroyed) return;
|
|
109
|
+
stallTimer = setTimeout(() => {
|
|
110
|
+
stallTimer = null;
|
|
111
|
+
stallRead = true;
|
|
112
|
+
void readStatus();
|
|
113
|
+
}, offlineStatus.UNCONFIRMED_EDITS_STALL_MS);
|
|
114
|
+
};
|
|
115
|
+
return {
|
|
116
|
+
get writesRefused() {
|
|
117
|
+
return writesRefused;
|
|
118
|
+
},
|
|
119
|
+
connected: ({ readNow }) => {
|
|
120
|
+
if (destroyed) return;
|
|
121
|
+
connected = true;
|
|
122
|
+
stallChanged();
|
|
123
|
+
if (readNow) {
|
|
124
|
+
void readStatus();
|
|
125
|
+
} else if (cadenceTimer === null && !reading) {
|
|
126
|
+
scheduleCadence();
|
|
127
|
+
}
|
|
128
|
+
},
|
|
129
|
+
disconnected: () => {
|
|
130
|
+
connected = false;
|
|
131
|
+
clearCadenceTimer();
|
|
132
|
+
stallChanged();
|
|
133
|
+
},
|
|
134
|
+
unconfirmedChanged: (next) => {
|
|
135
|
+
if (next === unconfirmed) return;
|
|
136
|
+
unconfirmed = next;
|
|
137
|
+
stallChanged();
|
|
138
|
+
},
|
|
139
|
+
destroy: () => {
|
|
140
|
+
destroyed = true;
|
|
141
|
+
clearStallTimer();
|
|
142
|
+
clearCadenceTimer();
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
exports.DOCUMENT_STATUS_READ_TIMEOUT_MS = DOCUMENT_STATUS_READ_TIMEOUT_MS;
|
|
147
|
+
exports.DOCUMENT_STATUS_REFRESH_MS = DOCUMENT_STATUS_REFRESH_MS;
|
|
148
|
+
exports.DOCUMENT_STATUS_REFUSED_REFRESH_MS = DOCUMENT_STATUS_REFUSED_REFRESH_MS;
|
|
149
|
+
exports.watchDocumentStatus = watchDocumentStatus;
|
|
150
|
+
//# sourceMappingURL=document-status.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-status.cjs","sources":["../../src/collab/document-status.ts"],"sourcesContent":["/**\n * Keryx's document status for a room `connectGenericDoc` holds: whether Keryx takes the room's\n * writes for now. A quarantined room takes none (doc 20 track 0.6): its sockets are re-checked and\n * reconnect read-only, and Keryx drops a read-only socket's edits without a word, so the transport\n * alone only ever sees them unconfirmed and a chip would say \"Saving…\" for ever. Keryx says so\n * through `GET /document-status/{org}/{docid}` (`keryx/src/document-status.ts`), which answers no\n * cross-origin page, so the host reads it for the handle with the room's own grant\n * (`readDocumentStatus`): Midas through main, the phone's editor page through the app.\n *\n * The handle reads it when Olympus's room does (`olympus/src/providers/keryx-document-status-query.ts`):\n * - on its first connection, so a room opened while quarantined says so at once;\n * - on the connection that follows Keryx's auth re-check close (4401, which a quarantine and a\n * release both send once the marker is written or cleared), and on one that follows an outage\n * the handle itself treats as real (no socket for `offlineGateAfterMs`), never on an ordinary\n * reconnect: a Keryx deploy reconnects every room at once;\n * - once local edits have waited unconfirmed for `UNCONFIRMED_EDITS_STALL_MS` on a connected\n * socket (a room opened while quarantined is bounced by nothing), once per stall;\n * - on Olympus's cadence while connected and the page is shown: every five minutes, every minute\n * while Keryx says the room takes no writes, so the chip clears soon after a release that bounced\n * no socket.\n *\n * One read at a time, each given up after `DOCUMENT_STATUS_READ_TIMEOUT_MS`, and none on a\n * read-only grant (nothing it sends could be refused). A read that can't answer reads as \"takes\n * writes\": never a delay Keryx did not assert.\n */\n\nimport { UNCONFIRMED_EDITS_STALL_MS } from '@athenaintel/agent-runtime/offline-status';\nimport type { CollabTokenResponse } from './mint';\n\n/** What a host read of Keryx's document status for the room. */\nexport interface DocumentStatusReading {\n /** Keryx takes no writes to the room for now (quarantined while it is repaired). */\n writesRefused: boolean;\n}\n\n/**\n * Reads Keryx's document status with the grant the room connects with (its token, room and branch:\n * `GET /document-status/{org}/{doc_id}?yauth=&branch=` on the grant's Keryx), so it reads nothing\n * the room's own permission does not. `null` when it can't answer: a Keryx or a host that predates\n * the route, a refusal, a failure. It must settle; the handle stops waiting after\n * {@link DOCUMENT_STATUS_READ_TIMEOUT_MS}.\n */\nexport type ReadDocumentStatus = (params: {\n grant: CollabTokenResponse;\n}) => Promise<DocumentStatusReading | null>;\n\n/** How often a connected room reads its status while Keryx takes its writes: Olympus's cadence. */\nexport const DOCUMENT_STATUS_REFRESH_MS = 5 * 60_000;\n/** How often it reads while Keryx refuses them, so a release is heard soon after. */\nexport const DOCUMENT_STATUS_REFUSED_REFRESH_MS = 60_000;\n/** How long the handle waits for one read before it gives up on it. */\nexport const DOCUMENT_STATUS_READ_TIMEOUT_MS = 30_000;\n\n/** What the handle tells its document-status reads about its connection. */\nexport interface DocumentStatusWatch {\n /** Keryx's last answer says the room takes no writes. */\n readonly writesRefused: boolean;\n /** The room's socket connected; `readNow`: a connection that reads the status at once. */\n connected: (params: { readNow: boolean }) => void;\n /** The room's socket is down: nothing is read until it connects again. */\n disconnected: () => void;\n /** Whether local edits wait unconfirmed. */\n unconfirmedChanged: (unconfirmed: boolean) => void;\n destroy: () => void;\n}\n\n/** `promise`'s value, or `null` once it rejects or `timeoutMs` passes first. */\nfunction settleWithin<T>({\n promise,\n timeoutMs,\n}: {\n promise: Promise<T>;\n timeoutMs: number;\n}): Promise<T | null> {\n return new Promise((resolve) => {\n const timer = setTimeout(() => resolve(null), timeoutMs);\n promise.then(\n (value) => {\n clearTimeout(timer);\n resolve(value);\n },\n () => {\n clearTimeout(timer);\n resolve(null);\n }\n );\n });\n}\n\n/** The page is hidden (a cadence read skips its turn, as TanStack's interval does off screen). */\nfunction pageHidden(): boolean {\n return typeof document !== 'undefined' && document.visibilityState === 'hidden';\n}\n\nexport function watchDocumentStatus({\n read,\n currentGrant,\n onChange,\n}: {\n read: ReadDocumentStatus;\n /** The grant the room's socket connects with now. */\n currentGrant: () => CollabTokenResponse | null;\n /** `writesRefused` changed. */\n onChange: () => void;\n}): DocumentStatusWatch {\n let connected = false;\n let unconfirmed = false;\n let writesRefused = false;\n let reading = false;\n let readAgain = false;\n let destroyed = false;\n /** The current stall (edits unconfirmed on a connected socket) has had its read. */\n let stallRead = false;\n let stallTimer: ReturnType<typeof setTimeout> | null = null;\n let cadenceTimer: ReturnType<typeof setTimeout> | null = null;\n\n const clearStallTimer = () => {\n if (stallTimer !== null) {\n clearTimeout(stallTimer);\n stallTimer = null;\n }\n };\n\n const clearCadenceTimer = () => {\n if (cadenceTimer !== null) {\n clearTimeout(cadenceTimer);\n cadenceTimer = null;\n }\n };\n\n const setWritesRefused = (next: boolean) => {\n if (next === writesRefused) return;\n writesRefused = next;\n onChange();\n };\n\n const scheduleCadence = () => {\n clearCadenceTimer();\n if (destroyed || !connected) return;\n cadenceTimer = setTimeout(\n () => {\n cadenceTimer = null;\n if (pageHidden()) {\n scheduleCadence();\n return;\n }\n void readStatus();\n },\n writesRefused ? DOCUMENT_STATUS_REFUSED_REFRESH_MS : DOCUMENT_STATUS_REFRESH_MS\n );\n };\n\n async function readStatus(): Promise<void> {\n if (destroyed || !connected) return;\n if (reading) {\n readAgain = true;\n return;\n }\n const grant = currentGrant();\n if (grant === null) return;\n clearCadenceTimer();\n if (grant.access_type !== 'rw') {\n // A read-only grant sends nothing Keryx could refuse: there is no saving to delay.\n setWritesRefused(false);\n return;\n }\n reading = true;\n const answer = await settleWithin({\n promise: read({ grant }),\n timeoutMs: DOCUMENT_STATUS_READ_TIMEOUT_MS,\n });\n reading = false;\n if (destroyed) return;\n setWritesRefused(answer?.writesRefused === true);\n if (readAgain) {\n readAgain = false;\n void readStatus();\n return;\n }\n scheduleCadence();\n }\n\n const stallChanged = () => {\n if (!connected || !unconfirmed) {\n clearStallTimer();\n stallRead = false;\n return;\n }\n if (stallTimer !== null || stallRead || destroyed) return;\n stallTimer = setTimeout(() => {\n stallTimer = null;\n stallRead = true;\n void readStatus();\n }, UNCONFIRMED_EDITS_STALL_MS);\n };\n\n return {\n get writesRefused() {\n return writesRefused;\n },\n connected: ({ readNow }) => {\n if (destroyed) return;\n connected = true;\n stallChanged();\n if (readNow) {\n void readStatus();\n } else if (cadenceTimer === null && !reading) {\n scheduleCadence();\n }\n },\n disconnected: () => {\n connected = false;\n clearCadenceTimer();\n stallChanged();\n },\n unconfirmedChanged: (next) => {\n if (next === unconfirmed) return;\n unconfirmed = next;\n stallChanged();\n },\n destroy: () => {\n destroyed = true;\n clearStallTimer();\n clearCadenceTimer();\n },\n };\n}\n"],"names":["UNCONFIRMED_EDITS_STALL_MS"],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keryx's document status for a room `connectGenericDoc` holds: whether Keryx takes the room's
|
|
3
|
+
* writes for now. A quarantined room takes none (doc 20 track 0.6): its sockets are re-checked and
|
|
4
|
+
* reconnect read-only, and Keryx drops a read-only socket's edits without a word, so the transport
|
|
5
|
+
* alone only ever sees them unconfirmed and a chip would say "Saving…" for ever. Keryx says so
|
|
6
|
+
* through `GET /document-status/{org}/{docid}` (`keryx/src/document-status.ts`), which answers no
|
|
7
|
+
* cross-origin page, so the host reads it for the handle with the room's own grant
|
|
8
|
+
* (`readDocumentStatus`): Midas through main, the phone's editor page through the app.
|
|
9
|
+
*
|
|
10
|
+
* The handle reads it when Olympus's room does (`olympus/src/providers/keryx-document-status-query.ts`):
|
|
11
|
+
* - on its first connection, so a room opened while quarantined says so at once;
|
|
12
|
+
* - on the connection that follows Keryx's auth re-check close (4401, which a quarantine and a
|
|
13
|
+
* release both send once the marker is written or cleared), and on one that follows an outage
|
|
14
|
+
* the handle itself treats as real (no socket for `offlineGateAfterMs`), never on an ordinary
|
|
15
|
+
* reconnect: a Keryx deploy reconnects every room at once;
|
|
16
|
+
* - once local edits have waited unconfirmed for `UNCONFIRMED_EDITS_STALL_MS` on a connected
|
|
17
|
+
* socket (a room opened while quarantined is bounced by nothing), once per stall;
|
|
18
|
+
* - on Olympus's cadence while connected and the page is shown: every five minutes, every minute
|
|
19
|
+
* while Keryx says the room takes no writes, so the chip clears soon after a release that bounced
|
|
20
|
+
* no socket.
|
|
21
|
+
*
|
|
22
|
+
* One read at a time, each given up after `DOCUMENT_STATUS_READ_TIMEOUT_MS`, and none on a
|
|
23
|
+
* read-only grant (nothing it sends could be refused). A read that can't answer reads as "takes
|
|
24
|
+
* writes": never a delay Keryx did not assert.
|
|
25
|
+
*/
|
|
26
|
+
import type { CollabTokenResponse } from './mint';
|
|
27
|
+
/** What a host read of Keryx's document status for the room. */
|
|
28
|
+
export interface DocumentStatusReading {
|
|
29
|
+
/** Keryx takes no writes to the room for now (quarantined while it is repaired). */
|
|
30
|
+
writesRefused: boolean;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Reads Keryx's document status with the grant the room connects with (its token, room and branch:
|
|
34
|
+
* `GET /document-status/{org}/{doc_id}?yauth=&branch=` on the grant's Keryx), so it reads nothing
|
|
35
|
+
* the room's own permission does not. `null` when it can't answer: a Keryx or a host that predates
|
|
36
|
+
* the route, a refusal, a failure. It must settle; the handle stops waiting after
|
|
37
|
+
* {@link DOCUMENT_STATUS_READ_TIMEOUT_MS}.
|
|
38
|
+
*/
|
|
39
|
+
export type ReadDocumentStatus = (params: {
|
|
40
|
+
grant: CollabTokenResponse;
|
|
41
|
+
}) => Promise<DocumentStatusReading | null>;
|
|
42
|
+
/** How often a connected room reads its status while Keryx takes its writes: Olympus's cadence. */
|
|
43
|
+
export declare const DOCUMENT_STATUS_REFRESH_MS: number;
|
|
44
|
+
/** How often it reads while Keryx refuses them, so a release is heard soon after. */
|
|
45
|
+
export declare const DOCUMENT_STATUS_REFUSED_REFRESH_MS = 60000;
|
|
46
|
+
/** How long the handle waits for one read before it gives up on it. */
|
|
47
|
+
export declare const DOCUMENT_STATUS_READ_TIMEOUT_MS = 30000;
|
|
48
|
+
/** What the handle tells its document-status reads about its connection. */
|
|
49
|
+
export interface DocumentStatusWatch {
|
|
50
|
+
/** Keryx's last answer says the room takes no writes. */
|
|
51
|
+
readonly writesRefused: boolean;
|
|
52
|
+
/** The room's socket connected; `readNow`: a connection that reads the status at once. */
|
|
53
|
+
connected: (params: {
|
|
54
|
+
readNow: boolean;
|
|
55
|
+
}) => void;
|
|
56
|
+
/** The room's socket is down: nothing is read until it connects again. */
|
|
57
|
+
disconnected: () => void;
|
|
58
|
+
/** Whether local edits wait unconfirmed. */
|
|
59
|
+
unconfirmedChanged: (unconfirmed: boolean) => void;
|
|
60
|
+
destroy: () => void;
|
|
61
|
+
}
|
|
62
|
+
export declare function watchDocumentStatus({ read, currentGrant, onChange, }: {
|
|
63
|
+
read: ReadDocumentStatus;
|
|
64
|
+
/** The grant the room's socket connects with now. */
|
|
65
|
+
currentGrant: () => CollabTokenResponse | null;
|
|
66
|
+
/** `writesRefused` changed. */
|
|
67
|
+
onChange: () => void;
|
|
68
|
+
}): DocumentStatusWatch;
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { UNCONFIRMED_EDITS_STALL_MS } from "../agent-runtime/src/offline-status.js";
|
|
2
|
+
const DOCUMENT_STATUS_REFRESH_MS = 5 * 6e4;
|
|
3
|
+
const DOCUMENT_STATUS_REFUSED_REFRESH_MS = 6e4;
|
|
4
|
+
const DOCUMENT_STATUS_READ_TIMEOUT_MS = 3e4;
|
|
5
|
+
function settleWithin({
|
|
6
|
+
promise,
|
|
7
|
+
timeoutMs
|
|
8
|
+
}) {
|
|
9
|
+
return new Promise((resolve) => {
|
|
10
|
+
const timer = setTimeout(() => resolve(null), timeoutMs);
|
|
11
|
+
promise.then(
|
|
12
|
+
(value) => {
|
|
13
|
+
clearTimeout(timer);
|
|
14
|
+
resolve(value);
|
|
15
|
+
},
|
|
16
|
+
() => {
|
|
17
|
+
clearTimeout(timer);
|
|
18
|
+
resolve(null);
|
|
19
|
+
}
|
|
20
|
+
);
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
function pageHidden() {
|
|
24
|
+
return typeof document !== "undefined" && document.visibilityState === "hidden";
|
|
25
|
+
}
|
|
26
|
+
function watchDocumentStatus({
|
|
27
|
+
read,
|
|
28
|
+
currentGrant,
|
|
29
|
+
onChange
|
|
30
|
+
}) {
|
|
31
|
+
let connected = false;
|
|
32
|
+
let unconfirmed = false;
|
|
33
|
+
let writesRefused = false;
|
|
34
|
+
let reading = false;
|
|
35
|
+
let readAgain = false;
|
|
36
|
+
let destroyed = false;
|
|
37
|
+
let stallRead = false;
|
|
38
|
+
let stallTimer = null;
|
|
39
|
+
let cadenceTimer = null;
|
|
40
|
+
const clearStallTimer = () => {
|
|
41
|
+
if (stallTimer !== null) {
|
|
42
|
+
clearTimeout(stallTimer);
|
|
43
|
+
stallTimer = null;
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
const clearCadenceTimer = () => {
|
|
47
|
+
if (cadenceTimer !== null) {
|
|
48
|
+
clearTimeout(cadenceTimer);
|
|
49
|
+
cadenceTimer = null;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
const setWritesRefused = (next) => {
|
|
53
|
+
if (next === writesRefused) return;
|
|
54
|
+
writesRefused = next;
|
|
55
|
+
onChange();
|
|
56
|
+
};
|
|
57
|
+
const scheduleCadence = () => {
|
|
58
|
+
clearCadenceTimer();
|
|
59
|
+
if (destroyed || !connected) return;
|
|
60
|
+
cadenceTimer = setTimeout(
|
|
61
|
+
() => {
|
|
62
|
+
cadenceTimer = null;
|
|
63
|
+
if (pageHidden()) {
|
|
64
|
+
scheduleCadence();
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
void readStatus();
|
|
68
|
+
},
|
|
69
|
+
writesRefused ? DOCUMENT_STATUS_REFUSED_REFRESH_MS : DOCUMENT_STATUS_REFRESH_MS
|
|
70
|
+
);
|
|
71
|
+
};
|
|
72
|
+
async function readStatus() {
|
|
73
|
+
if (destroyed || !connected) return;
|
|
74
|
+
if (reading) {
|
|
75
|
+
readAgain = true;
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const grant = currentGrant();
|
|
79
|
+
if (grant === null) return;
|
|
80
|
+
clearCadenceTimer();
|
|
81
|
+
if (grant.access_type !== "rw") {
|
|
82
|
+
setWritesRefused(false);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
reading = true;
|
|
86
|
+
const answer = await settleWithin({
|
|
87
|
+
promise: read({ grant }),
|
|
88
|
+
timeoutMs: DOCUMENT_STATUS_READ_TIMEOUT_MS
|
|
89
|
+
});
|
|
90
|
+
reading = false;
|
|
91
|
+
if (destroyed) return;
|
|
92
|
+
setWritesRefused((answer == null ? void 0 : answer.writesRefused) === true);
|
|
93
|
+
if (readAgain) {
|
|
94
|
+
readAgain = false;
|
|
95
|
+
void readStatus();
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
scheduleCadence();
|
|
99
|
+
}
|
|
100
|
+
const stallChanged = () => {
|
|
101
|
+
if (!connected || !unconfirmed) {
|
|
102
|
+
clearStallTimer();
|
|
103
|
+
stallRead = false;
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if (stallTimer !== null || stallRead || destroyed) return;
|
|
107
|
+
stallTimer = setTimeout(() => {
|
|
108
|
+
stallTimer = null;
|
|
109
|
+
stallRead = true;
|
|
110
|
+
void readStatus();
|
|
111
|
+
}, UNCONFIRMED_EDITS_STALL_MS);
|
|
112
|
+
};
|
|
113
|
+
return {
|
|
114
|
+
get writesRefused() {
|
|
115
|
+
return writesRefused;
|
|
116
|
+
},
|
|
117
|
+
connected: ({ readNow }) => {
|
|
118
|
+
if (destroyed) return;
|
|
119
|
+
connected = true;
|
|
120
|
+
stallChanged();
|
|
121
|
+
if (readNow) {
|
|
122
|
+
void readStatus();
|
|
123
|
+
} else if (cadenceTimer === null && !reading) {
|
|
124
|
+
scheduleCadence();
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
disconnected: () => {
|
|
128
|
+
connected = false;
|
|
129
|
+
clearCadenceTimer();
|
|
130
|
+
stallChanged();
|
|
131
|
+
},
|
|
132
|
+
unconfirmedChanged: (next) => {
|
|
133
|
+
if (next === unconfirmed) return;
|
|
134
|
+
unconfirmed = next;
|
|
135
|
+
stallChanged();
|
|
136
|
+
},
|
|
137
|
+
destroy: () => {
|
|
138
|
+
destroyed = true;
|
|
139
|
+
clearStallTimer();
|
|
140
|
+
clearCadenceTimer();
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
export {
|
|
145
|
+
DOCUMENT_STATUS_READ_TIMEOUT_MS,
|
|
146
|
+
DOCUMENT_STATUS_REFRESH_MS,
|
|
147
|
+
DOCUMENT_STATUS_REFUSED_REFRESH_MS,
|
|
148
|
+
watchDocumentStatus
|
|
149
|
+
};
|
|
150
|
+
//# sourceMappingURL=document-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-status.js","sources":["../../src/collab/document-status.ts"],"sourcesContent":["/**\n * Keryx's document status for a room `connectGenericDoc` holds: whether Keryx takes the room's\n * writes for now. A quarantined room takes none (doc 20 track 0.6): its sockets are re-checked and\n * reconnect read-only, and Keryx drops a read-only socket's edits without a word, so the transport\n * alone only ever sees them unconfirmed and a chip would say \"Saving…\" for ever. Keryx says so\n * through `GET /document-status/{org}/{docid}` (`keryx/src/document-status.ts`), which answers no\n * cross-origin page, so the host reads it for the handle with the room's own grant\n * (`readDocumentStatus`): Midas through main, the phone's editor page through the app.\n *\n * The handle reads it when Olympus's room does (`olympus/src/providers/keryx-document-status-query.ts`):\n * - on its first connection, so a room opened while quarantined says so at once;\n * - on the connection that follows Keryx's auth re-check close (4401, which a quarantine and a\n * release both send once the marker is written or cleared), and on one that follows an outage\n * the handle itself treats as real (no socket for `offlineGateAfterMs`), never on an ordinary\n * reconnect: a Keryx deploy reconnects every room at once;\n * - once local edits have waited unconfirmed for `UNCONFIRMED_EDITS_STALL_MS` on a connected\n * socket (a room opened while quarantined is bounced by nothing), once per stall;\n * - on Olympus's cadence while connected and the page is shown: every five minutes, every minute\n * while Keryx says the room takes no writes, so the chip clears soon after a release that bounced\n * no socket.\n *\n * One read at a time, each given up after `DOCUMENT_STATUS_READ_TIMEOUT_MS`, and none on a\n * read-only grant (nothing it sends could be refused). A read that can't answer reads as \"takes\n * writes\": never a delay Keryx did not assert.\n */\n\nimport { UNCONFIRMED_EDITS_STALL_MS } from '@athenaintel/agent-runtime/offline-status';\nimport type { CollabTokenResponse } from './mint';\n\n/** What a host read of Keryx's document status for the room. */\nexport interface DocumentStatusReading {\n /** Keryx takes no writes to the room for now (quarantined while it is repaired). */\n writesRefused: boolean;\n}\n\n/**\n * Reads Keryx's document status with the grant the room connects with (its token, room and branch:\n * `GET /document-status/{org}/{doc_id}?yauth=&branch=` on the grant's Keryx), so it reads nothing\n * the room's own permission does not. `null` when it can't answer: a Keryx or a host that predates\n * the route, a refusal, a failure. It must settle; the handle stops waiting after\n * {@link DOCUMENT_STATUS_READ_TIMEOUT_MS}.\n */\nexport type ReadDocumentStatus = (params: {\n grant: CollabTokenResponse;\n}) => Promise<DocumentStatusReading | null>;\n\n/** How often a connected room reads its status while Keryx takes its writes: Olympus's cadence. */\nexport const DOCUMENT_STATUS_REFRESH_MS = 5 * 60_000;\n/** How often it reads while Keryx refuses them, so a release is heard soon after. */\nexport const DOCUMENT_STATUS_REFUSED_REFRESH_MS = 60_000;\n/** How long the handle waits for one read before it gives up on it. */\nexport const DOCUMENT_STATUS_READ_TIMEOUT_MS = 30_000;\n\n/** What the handle tells its document-status reads about its connection. */\nexport interface DocumentStatusWatch {\n /** Keryx's last answer says the room takes no writes. */\n readonly writesRefused: boolean;\n /** The room's socket connected; `readNow`: a connection that reads the status at once. */\n connected: (params: { readNow: boolean }) => void;\n /** The room's socket is down: nothing is read until it connects again. */\n disconnected: () => void;\n /** Whether local edits wait unconfirmed. */\n unconfirmedChanged: (unconfirmed: boolean) => void;\n destroy: () => void;\n}\n\n/** `promise`'s value, or `null` once it rejects or `timeoutMs` passes first. */\nfunction settleWithin<T>({\n promise,\n timeoutMs,\n}: {\n promise: Promise<T>;\n timeoutMs: number;\n}): Promise<T | null> {\n return new Promise((resolve) => {\n const timer = setTimeout(() => resolve(null), timeoutMs);\n promise.then(\n (value) => {\n clearTimeout(timer);\n resolve(value);\n },\n () => {\n clearTimeout(timer);\n resolve(null);\n }\n );\n });\n}\n\n/** The page is hidden (a cadence read skips its turn, as TanStack's interval does off screen). */\nfunction pageHidden(): boolean {\n return typeof document !== 'undefined' && document.visibilityState === 'hidden';\n}\n\nexport function watchDocumentStatus({\n read,\n currentGrant,\n onChange,\n}: {\n read: ReadDocumentStatus;\n /** The grant the room's socket connects with now. */\n currentGrant: () => CollabTokenResponse | null;\n /** `writesRefused` changed. */\n onChange: () => void;\n}): DocumentStatusWatch {\n let connected = false;\n let unconfirmed = false;\n let writesRefused = false;\n let reading = false;\n let readAgain = false;\n let destroyed = false;\n /** The current stall (edits unconfirmed on a connected socket) has had its read. */\n let stallRead = false;\n let stallTimer: ReturnType<typeof setTimeout> | null = null;\n let cadenceTimer: ReturnType<typeof setTimeout> | null = null;\n\n const clearStallTimer = () => {\n if (stallTimer !== null) {\n clearTimeout(stallTimer);\n stallTimer = null;\n }\n };\n\n const clearCadenceTimer = () => {\n if (cadenceTimer !== null) {\n clearTimeout(cadenceTimer);\n cadenceTimer = null;\n }\n };\n\n const setWritesRefused = (next: boolean) => {\n if (next === writesRefused) return;\n writesRefused = next;\n onChange();\n };\n\n const scheduleCadence = () => {\n clearCadenceTimer();\n if (destroyed || !connected) return;\n cadenceTimer = setTimeout(\n () => {\n cadenceTimer = null;\n if (pageHidden()) {\n scheduleCadence();\n return;\n }\n void readStatus();\n },\n writesRefused ? DOCUMENT_STATUS_REFUSED_REFRESH_MS : DOCUMENT_STATUS_REFRESH_MS\n );\n };\n\n async function readStatus(): Promise<void> {\n if (destroyed || !connected) return;\n if (reading) {\n readAgain = true;\n return;\n }\n const grant = currentGrant();\n if (grant === null) return;\n clearCadenceTimer();\n if (grant.access_type !== 'rw') {\n // A read-only grant sends nothing Keryx could refuse: there is no saving to delay.\n setWritesRefused(false);\n return;\n }\n reading = true;\n const answer = await settleWithin({\n promise: read({ grant }),\n timeoutMs: DOCUMENT_STATUS_READ_TIMEOUT_MS,\n });\n reading = false;\n if (destroyed) return;\n setWritesRefused(answer?.writesRefused === true);\n if (readAgain) {\n readAgain = false;\n void readStatus();\n return;\n }\n scheduleCadence();\n }\n\n const stallChanged = () => {\n if (!connected || !unconfirmed) {\n clearStallTimer();\n stallRead = false;\n return;\n }\n if (stallTimer !== null || stallRead || destroyed) return;\n stallTimer = setTimeout(() => {\n stallTimer = null;\n stallRead = true;\n void readStatus();\n }, UNCONFIRMED_EDITS_STALL_MS);\n };\n\n return {\n get writesRefused() {\n return writesRefused;\n },\n connected: ({ readNow }) => {\n if (destroyed) return;\n connected = true;\n stallChanged();\n if (readNow) {\n void readStatus();\n } else if (cadenceTimer === null && !reading) {\n scheduleCadence();\n }\n },\n disconnected: () => {\n connected = false;\n clearCadenceTimer();\n stallChanged();\n },\n unconfirmedChanged: (next) => {\n if (next === unconfirmed) return;\n unconfirmed = next;\n stallChanged();\n },\n destroy: () => {\n destroyed = true;\n clearStallTimer();\n clearCadenceTimer();\n },\n };\n}\n"],"names":[],"mappings":"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"}
|
package/dist/collab/index.cjs
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const closePolicy = require("./close-policy.cjs");
|
|
4
|
+
const documentStatus = require("./document-status.cjs");
|
|
4
5
|
const client = require("./client.cjs");
|
|
6
|
+
const updateAttributions = require("../keryx-http/src/update-attributions.cjs");
|
|
5
7
|
const mint = require("./mint.cjs");
|
|
6
8
|
const presenceClient = require("./presence-client.cjs");
|
|
7
9
|
const presenceMint = require("./presence-mint.cjs");
|
|
@@ -13,9 +15,14 @@ const tokenRefresh = require("./token-refresh.cjs");
|
|
|
13
15
|
exports.WS_CLOSE_AUTH_REVOKED = closePolicy.WS_CLOSE_AUTH_REVOKED;
|
|
14
16
|
exports.WS_CLOSE_DOC_DELETED = closePolicy.WS_CLOSE_DOC_DELETED;
|
|
15
17
|
exports.classifyClose = closePolicy.classifyClose;
|
|
18
|
+
exports.DOCUMENT_STATUS_READ_TIMEOUT_MS = documentStatus.DOCUMENT_STATUS_READ_TIMEOUT_MS;
|
|
19
|
+
exports.DOCUMENT_STATUS_REFRESH_MS = documentStatus.DOCUMENT_STATUS_REFRESH_MS;
|
|
20
|
+
exports.DOCUMENT_STATUS_REFUSED_REFRESH_MS = documentStatus.DOCUMENT_STATUS_REFUSED_REFRESH_MS;
|
|
16
21
|
exports.DEFAULT_OFFLINE_GATE_AFTER_MS = client.DEFAULT_OFFLINE_GATE_AFTER_MS;
|
|
17
22
|
exports.connectGenericDoc = client.connectGenericDoc;
|
|
18
23
|
exports.isRetryableMintError = client.isRetryableMintError;
|
|
24
|
+
exports.BACKGROUND_UPDATE_ATTRIBUTIONS = updateAttributions.BACKGROUND_UPDATE_ATTRIBUTIONS;
|
|
25
|
+
exports.runWithDocUpdateAttributions = updateAttributions.runWithDocUpdateAttributions;
|
|
19
26
|
exports.CollabTokenError = mint.CollabTokenError;
|
|
20
27
|
exports.getAthenaApiBaseUrl = mint.getAthenaApiBaseUrl;
|
|
21
28
|
exports.mintCollabToken = mint.mintCollabToken;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/collab/index.d.ts
CHANGED
|
@@ -5,7 +5,10 @@
|
|
|
5
5
|
* Built on yjs v14 (`@y/y`) and the v14-line WebSocket provider
|
|
6
6
|
* (`@y/websocket`). Document auth flows through the public collab-token mint
|
|
7
7
|
* (`POST /api/v0/assets/{id}/collab-token`), which is allowlisted server-side
|
|
8
|
-
* to `generic_doc` assets and admin-only during the initial rollout.
|
|
8
|
+
* to `generic_doc` assets and admin-only during the initial rollout. A write
|
|
9
|
+
* the host makes on its own goes out as housekeeping, not as the person's edit,
|
|
10
|
+
* when it is made inside `runWithDocUpdateAttributions` for the handle's doc
|
|
11
|
+
* with `BACKGROUND_UPDATE_ATTRIBUTIONS`.
|
|
9
12
|
*
|
|
10
13
|
* Workspace presence (`useWorkspacePresence` / `connectWorkspacePresence`)
|
|
11
14
|
* observes the Keryx workspace awareness room (`<workspaceId>/awareness`) —
|
|
@@ -17,7 +20,9 @@
|
|
|
17
20
|
* in awareness contexts into titles the caller may see.
|
|
18
21
|
*/
|
|
19
22
|
export { classifyClose, WS_CLOSE_AUTH_REVOKED, WS_CLOSE_DOC_DELETED } from './close-policy';
|
|
23
|
+
export { DOCUMENT_STATUS_READ_TIMEOUT_MS, DOCUMENT_STATUS_REFRESH_MS, DOCUMENT_STATUS_REFUSED_REFRESH_MS, type DocumentStatusReading, type ReadDocumentStatus, } from './document-status';
|
|
20
24
|
export { CollabTokenError, connectGenericDoc, DEFAULT_OFFLINE_GATE_AFTER_MS, isRetryableMintError, type CollabAuth, type CollabMint, type CollabTokenResponse, type GenericDocConnectGate, type GenericDocHandle, type GenericDocLocalCopy, type GenericDocStatus, type GenericDocTransportView, type PresenceEntry, } from './client';
|
|
25
|
+
export { BACKGROUND_UPDATE_ATTRIBUTIONS, runWithDocUpdateAttributions, type UpdateAttribution, } from '../keryx-http/src/update-attributions';
|
|
21
26
|
export { getAthenaApiBaseUrl, mintCollabToken } from './mint';
|
|
22
27
|
export { PRESENCE_SWEEP_INTERVAL_MS, connectWorkspacePresence, type WorkspacePresenceHandle, type WorkspacePresenceStatus, } from './presence-client';
|
|
23
28
|
export { mintWorkspacePresenceToken, resolveWorkspacePresence, type WorkspacePresenceResolveRequest, type WorkspacePresenceResolveResponse, type WorkspacePresenceResolvedAsset, type WorkspacePresenceResolvedMember, type WorkspacePresenceResolvedProject, type WorkspacePresenceResolvedSession, type WorkspacePresenceTokenResponse, } from './presence-mint';
|
package/dist/collab/index.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { WS_CLOSE_AUTH_REVOKED, WS_CLOSE_DOC_DELETED, classifyClose } from "./close-policy.js";
|
|
2
|
+
import { DOCUMENT_STATUS_READ_TIMEOUT_MS, DOCUMENT_STATUS_REFRESH_MS, DOCUMENT_STATUS_REFUSED_REFRESH_MS } from "./document-status.js";
|
|
2
3
|
import { DEFAULT_OFFLINE_GATE_AFTER_MS, connectGenericDoc, isRetryableMintError } from "./client.js";
|
|
4
|
+
import { BACKGROUND_UPDATE_ATTRIBUTIONS, runWithDocUpdateAttributions } from "../keryx-http/src/update-attributions.js";
|
|
3
5
|
import { CollabTokenError, getAthenaApiBaseUrl, mintCollabToken } from "./mint.js";
|
|
4
6
|
import { PRESENCE_SWEEP_INTERVAL_MS, connectWorkspacePresence } from "./presence-client.js";
|
|
5
7
|
import { mintWorkspacePresenceToken, resolveWorkspacePresence } from "./presence-mint.js";
|
|
@@ -9,8 +11,12 @@ import { useGenericDoc } from "./react.js";
|
|
|
9
11
|
import { defineDocShape } from "./shape.js";
|
|
10
12
|
import { MAX_CONSECUTIVE_REMINTS, MIN_REFRESH_DELAY_MS, REFRESH_HEADROOM_MS, refreshDelayMs } from "./token-refresh.js";
|
|
11
13
|
export {
|
|
14
|
+
BACKGROUND_UPDATE_ATTRIBUTIONS,
|
|
12
15
|
CollabTokenError,
|
|
13
16
|
DEFAULT_OFFLINE_GATE_AFTER_MS,
|
|
17
|
+
DOCUMENT_STATUS_READ_TIMEOUT_MS,
|
|
18
|
+
DOCUMENT_STATUS_REFRESH_MS,
|
|
19
|
+
DOCUMENT_STATUS_REFUSED_REFRESH_MS,
|
|
14
20
|
MAX_CONSECUTIVE_REMINTS,
|
|
15
21
|
MAX_PRESENCE_CONTEXTS_PER_SLOT,
|
|
16
22
|
MAX_PRESENCE_STRING_CHARS,
|
|
@@ -35,6 +41,7 @@ export {
|
|
|
35
41
|
mintWorkspacePresenceToken,
|
|
36
42
|
refreshDelayMs,
|
|
37
43
|
resolveWorkspacePresence,
|
|
44
|
+
runWithDocUpdateAttributions,
|
|
38
45
|
useGenericDoc,
|
|
39
46
|
useWorkspacePresence,
|
|
40
47
|
useWorkspacePresenceResolver
|
package/dist/collab/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const
|
|
3
|
+
const require$$0 = require("react");
|
|
4
4
|
const AthenaCredentialSourceContext = require("../auth/AthenaCredentialSourceContext.cjs");
|
|
5
5
|
const AthenaContext = require("../provider/AthenaContext.cjs");
|
|
6
6
|
const presenceClient = require("./presence-client.cjs");
|
|
@@ -15,9 +15,9 @@ function useWorkspacePresence(workspaceId, options) {
|
|
|
15
15
|
const identityEpoch = AthenaCredentialSourceContext.useAthenaCredentialIdentityEpoch();
|
|
16
16
|
const enabled = (options == null ? void 0 : options.enabled) !== false && workspaceId !== null;
|
|
17
17
|
const tickMs = (options == null ? void 0 : options.tickMs) ?? PRESENCE_DEFAULT_TICK_MS;
|
|
18
|
-
const [entry, setEntry] =
|
|
19
|
-
const handleRef =
|
|
20
|
-
|
|
18
|
+
const [entry, setEntry] = require$$0.useState(null);
|
|
19
|
+
const handleRef = require$$0.useRef(null);
|
|
20
|
+
require$$0.useEffect(() => {
|
|
21
21
|
if (!enabled || workspaceId === null) {
|
|
22
22
|
setEntry(null);
|
|
23
23
|
return;
|
|
@@ -39,14 +39,14 @@ function useWorkspacePresence(workspaceId, options) {
|
|
|
39
39
|
};
|
|
40
40
|
}, [enabled, workspaceId, config.backendUrl, config.apiKey, config.getToken, identityEpoch]);
|
|
41
41
|
const handle = enabled && entry !== null && entry.workspaceId === workspaceId ? entry.handle : null;
|
|
42
|
-
const subscribe =
|
|
42
|
+
const subscribe = require$$0.useMemo(() => {
|
|
43
43
|
return (onStoreChange) => {
|
|
44
44
|
if (!handle) return () => {
|
|
45
45
|
};
|
|
46
46
|
return handle.onChange(onStoreChange);
|
|
47
47
|
};
|
|
48
48
|
}, [handle]);
|
|
49
|
-
|
|
49
|
+
require$$0.useSyncExternalStore(
|
|
50
50
|
subscribe,
|
|
51
51
|
() => {
|
|
52
52
|
if (!handle) return EMPTY_SNAPSHOT;
|
|
@@ -54,8 +54,8 @@ function useWorkspacePresence(workspaceId, options) {
|
|
|
54
54
|
},
|
|
55
55
|
() => EMPTY_SNAPSHOT
|
|
56
56
|
);
|
|
57
|
-
const [now, setNow] =
|
|
58
|
-
|
|
57
|
+
const [now, setNow] = require$$0.useState(() => Date.now());
|
|
58
|
+
require$$0.useEffect(() => {
|
|
59
59
|
if (!enabled) return;
|
|
60
60
|
setNow(Date.now());
|
|
61
61
|
const timer = setInterval(() => {
|
|
@@ -66,7 +66,7 @@ function useWorkspacePresence(workspaceId, options) {
|
|
|
66
66
|
};
|
|
67
67
|
}, [enabled, tickMs]);
|
|
68
68
|
const rosterHumans = (handle == null ? void 0 : handle.humans) ?? NO_HUMANS;
|
|
69
|
-
const humans =
|
|
69
|
+
const humans = require$$0.useMemo(
|
|
70
70
|
() => rosterHumans.map((human) => ({
|
|
71
71
|
...human,
|
|
72
72
|
state: presenceSlots.derivePresenceState({
|
|
@@ -78,7 +78,7 @@ function useWorkspacePresence(workspaceId, options) {
|
|
|
78
78
|
})),
|
|
79
79
|
[rosterHumans, now]
|
|
80
80
|
);
|
|
81
|
-
const refreshNow =
|
|
81
|
+
const refreshNow = require$$0.useCallback(() => {
|
|
82
82
|
var _a;
|
|
83
83
|
return ((_a = handleRef.current) == null ? void 0 : _a.refreshNow()) ?? Promise.resolve();
|
|
84
84
|
}, []);
|
|
@@ -93,7 +93,7 @@ function useWorkspacePresence(workspaceId, options) {
|
|
|
93
93
|
}
|
|
94
94
|
function useWorkspacePresenceResolver(workspaceId) {
|
|
95
95
|
const config = AthenaContext.useAthenaConfig();
|
|
96
|
-
return
|
|
96
|
+
return require$$0.useCallback(
|
|
97
97
|
(request, signal) => {
|
|
98
98
|
if (workspaceId === null) {
|
|
99
99
|
return Promise.reject(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presence-react.cjs","sources":["../../src/collab/presence-react.ts"],"sourcesContent":["/**\n * React bindings for the workspace presence feed.\n *\n * `useWorkspacePresence(workspaceId)` opens (and owns) a\n * `connectWorkspacePresence` handle, resolving auth from the surrounding\n * `AthenaProvider` (per-viewer bearer when present, API key otherwise), and\n * re-renders on status/roster changes via `useSyncExternalStore`. Each person\n * carries a `state` on the intent ladder, recomputed against a clock that\n * ticks every `tickMs` so `active` decays to `idle` and `away` between\n * awareness events.\n *\n * `useWorkspacePresenceResolver(workspaceId)` returns the batch id→title\n * resolver bound to the same auth. It is deliberately thin: callers own\n * caching (TanStack Query is the expected home for it).\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';\nimport { useAthenaCredentialIdentityEpoch } from '../auth/AthenaCredentialSourceContext';\nimport { useAthenaConfig } from '../provider/AthenaContext';\nimport {\n type WorkspacePresenceHandle,\n type WorkspacePresenceStatus,\n connectWorkspacePresence,\n} from './presence-client';\nimport {\n type WorkspacePresenceResolveRequest,\n type WorkspacePresenceResolveResponse,\n resolveWorkspacePresence,\n} from './presence-mint';\nimport {\n type PresenceAgent,\n type PresenceHuman,\n type PresenceState,\n derivePresenceState,\n} from './presence-slots';\n\n/** Default cadence for re-deriving each person's intent state. */\nexport const PRESENCE_DEFAULT_TICK_MS = 10_000;\n\nexport interface PresenceHumanWithState extends PresenceHuman {\n /** Where the person sits on the intent ladder as of the last tick. */\n state: PresenceState;\n}\n\nexport interface UseWorkspacePresenceOptions {\n /** `false` closes the feed without unmounting the caller. Default `true`. */\n enabled?: boolean;\n /** How often `state` is re-derived from `lastIntentAt`. Default 10 s. */\n tickMs?: number;\n}\n\nexport interface UseWorkspacePresenceResult {\n /** `'closed'` while disabled or without a workspace; `'connecting'` until the first mint resolves. */\n status: WorkspacePresenceStatus;\n error: Error | null;\n accessType: 'r' | 'rw' | null;\n humans: PresenceHumanWithState[];\n agents: PresenceAgent[];\n /** Force an early token refresh; resolves immediately when no feed is open. */\n refreshNow: () => Promise<void>;\n}\n\nconst EMPTY_SNAPSHOT = 'init||0';\nconst NO_HUMANS: PresenceHuman[] = [];\nconst NO_AGENTS: PresenceAgent[] = [];\n\nexport function useWorkspacePresence(\n workspaceId: string | null,\n options?: UseWorkspacePresenceOptions\n): UseWorkspacePresenceResult {\n const config = useAthenaConfig();\n const identityEpoch = useAthenaCredentialIdentityEpoch();\n const enabled = options?.enabled !== false && workspaceId !== null;\n const tickMs = options?.tickMs ?? PRESENCE_DEFAULT_TICK_MS;\n const [entry, setEntry] = useState<{\n workspaceId: string;\n handle: WorkspacePresenceHandle;\n } | null>(null);\n const handleRef = useRef<WorkspacePresenceHandle | null>(null);\n\n useEffect(() => {\n if (!enabled || workspaceId === null) {\n setEntry(null);\n return;\n }\n const next = connectWorkspacePresence({\n workspaceId,\n auth: {\n backendUrl: config.backendUrl,\n apiKey: config.apiKey,\n token: config.token,\n getToken: config.getToken,\n },\n });\n handleRef.current = next;\n setEntry({ workspaceId, handle: next });\n return () => {\n handleRef.current = null;\n next.destroy();\n };\n // Recreate when the target or the signed-in identity changes (the\n // credential source's identity epoch). A renewed token for the same\n // identity reaches the next re-mint through `getToken`, so a renewal\n // does not tear the live connection down.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enabled, workspaceId, config.backendUrl, config.apiKey, config.getToken, identityEpoch]);\n\n // React renders with the new arguments before the effect above runs, so a\n // handle opened for a previous workspace, or before the feed was disabled,\n // still sits in state for that one render. Expose it only while it is the\n // handle this render asked for; otherwise the closed / connecting empty\n // result wins, and a disabled feed never leaks a roster.\n const handle =\n enabled && entry !== null && entry.workspaceId === workspaceId ? entry.handle : null;\n\n const subscribe = useMemo(() => {\n return (onStoreChange: () => void) => {\n if (!handle) return () => {};\n return handle.onChange(onStoreChange);\n };\n }, [handle]);\n\n const snapshot = useSyncExternalStore(\n subscribe,\n () => {\n if (!handle) return EMPTY_SNAPSHOT;\n return `${handle.status}|${handle.accessType ?? ''}|${handle.version}`;\n },\n () => EMPTY_SNAPSHOT\n );\n void snapshot;\n\n // The ladder decays with wall-clock time, not with awareness events; a\n // person who stops typing must drift to idle even when nothing arrives.\n const [now, setNow] = useState(() => Date.now());\n useEffect(() => {\n if (!enabled) return;\n setNow(Date.now());\n const timer = setInterval(() => {\n setNow(Date.now());\n }, tickMs);\n return () => {\n clearInterval(timer);\n };\n }, [enabled, tickMs]);\n\n const rosterHumans = handle?.humans ?? NO_HUMANS;\n const humans = useMemo(\n () =>\n rosterHumans.map((human) => ({\n ...human,\n state: derivePresenceState({\n lastIntentAt: human.lastIntentAt,\n hidden: human.hidden,\n manualAway: human.manualAway,\n now,\n }),\n })),\n [rosterHumans, now]\n );\n\n const refreshNow = useCallback(() => handleRef.current?.refreshNow() ?? Promise.resolve(), []);\n\n return {\n status: handle ? handle.status : enabled ? 'connecting' : 'closed',\n error: handle?.error ?? null,\n accessType: handle?.accessType ?? null,\n humans,\n agents: handle?.agents ?? NO_AGENTS,\n refreshNow,\n };\n}\n\nexport type WorkspacePresenceResolver = (\n request: WorkspacePresenceResolveRequest,\n signal?: AbortSignal\n) => Promise<WorkspacePresenceResolveResponse>;\n\n/**\n * A stable resolver bound to the provider's auth and the given workspace.\n * Credentials are read on every call (the provider serves the current token\n * through getters), and `getToken` renews a refused one once. Rejects when\n * called without a workspace; no caching — callers own that.\n */\nexport function useWorkspacePresenceResolver(\n workspaceId: string | null\n): WorkspacePresenceResolver {\n const config = useAthenaConfig();\n return useCallback<WorkspacePresenceResolver>(\n (request, signal) => {\n if (workspaceId === null) {\n return Promise.reject(\n new Error('[AthenaSDK] useWorkspacePresenceResolver: no workspace selected')\n );\n }\n return resolveWorkspacePresence({\n auth: {\n backendUrl: config.backendUrl,\n apiKey: config.apiKey,\n token: config.token,\n getToken: config.getToken,\n },\n workspaceId,\n request,\n signal,\n });\n },\n [workspaceId, config]\n );\n}\n"],"names":["useAthenaConfig","useAthenaCredentialIdentityEpoch","useState","useRef","useEffect","connectWorkspacePresence","useMemo","useSyncExternalStore","derivePresenceState","useCallback","resolveWorkspacePresence"],"mappings":";;;;;;;;AAqCO,MAAM,2BAA2B;AAyBxC,MAAM,iBAAiB;AACvB,MAAM,YAA6B,CAAA;AACnC,MAAM,YAA6B,CAAA;AAE5B,SAAS,qBACd,aACA,SAC4B;AAC5B,QAAM,SAASA,cAAAA,gBAAA;AACf,QAAM,gBAAgBC,8BAAAA,iCAAA;AACtB,QAAM,WAAU,mCAAS,aAAY,SAAS,gBAAgB;AAC9D,QAAM,UAAS,mCAAS,WAAU;AAClC,QAAM,CAAC,OAAO,QAAQ,IAAIC,
|
|
1
|
+
{"version":3,"file":"presence-react.cjs","sources":["../../src/collab/presence-react.ts"],"sourcesContent":["/**\n * React bindings for the workspace presence feed.\n *\n * `useWorkspacePresence(workspaceId)` opens (and owns) a\n * `connectWorkspacePresence` handle, resolving auth from the surrounding\n * `AthenaProvider` (per-viewer bearer when present, API key otherwise), and\n * re-renders on status/roster changes via `useSyncExternalStore`. Each person\n * carries a `state` on the intent ladder, recomputed against a clock that\n * ticks every `tickMs` so `active` decays to `idle` and `away` between\n * awareness events.\n *\n * `useWorkspacePresenceResolver(workspaceId)` returns the batch id→title\n * resolver bound to the same auth. It is deliberately thin: callers own\n * caching (TanStack Query is the expected home for it).\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';\nimport { useAthenaCredentialIdentityEpoch } from '../auth/AthenaCredentialSourceContext';\nimport { useAthenaConfig } from '../provider/AthenaContext';\nimport {\n type WorkspacePresenceHandle,\n type WorkspacePresenceStatus,\n connectWorkspacePresence,\n} from './presence-client';\nimport {\n type WorkspacePresenceResolveRequest,\n type WorkspacePresenceResolveResponse,\n resolveWorkspacePresence,\n} from './presence-mint';\nimport {\n type PresenceAgent,\n type PresenceHuman,\n type PresenceState,\n derivePresenceState,\n} from './presence-slots';\n\n/** Default cadence for re-deriving each person's intent state. */\nexport const PRESENCE_DEFAULT_TICK_MS = 10_000;\n\nexport interface PresenceHumanWithState extends PresenceHuman {\n /** Where the person sits on the intent ladder as of the last tick. */\n state: PresenceState;\n}\n\nexport interface UseWorkspacePresenceOptions {\n /** `false` closes the feed without unmounting the caller. Default `true`. */\n enabled?: boolean;\n /** How often `state` is re-derived from `lastIntentAt`. Default 10 s. */\n tickMs?: number;\n}\n\nexport interface UseWorkspacePresenceResult {\n /** `'closed'` while disabled or without a workspace; `'connecting'` until the first mint resolves. */\n status: WorkspacePresenceStatus;\n error: Error | null;\n accessType: 'r' | 'rw' | null;\n humans: PresenceHumanWithState[];\n agents: PresenceAgent[];\n /** Force an early token refresh; resolves immediately when no feed is open. */\n refreshNow: () => Promise<void>;\n}\n\nconst EMPTY_SNAPSHOT = 'init||0';\nconst NO_HUMANS: PresenceHuman[] = [];\nconst NO_AGENTS: PresenceAgent[] = [];\n\nexport function useWorkspacePresence(\n workspaceId: string | null,\n options?: UseWorkspacePresenceOptions\n): UseWorkspacePresenceResult {\n const config = useAthenaConfig();\n const identityEpoch = useAthenaCredentialIdentityEpoch();\n const enabled = options?.enabled !== false && workspaceId !== null;\n const tickMs = options?.tickMs ?? PRESENCE_DEFAULT_TICK_MS;\n const [entry, setEntry] = useState<{\n workspaceId: string;\n handle: WorkspacePresenceHandle;\n } | null>(null);\n const handleRef = useRef<WorkspacePresenceHandle | null>(null);\n\n useEffect(() => {\n if (!enabled || workspaceId === null) {\n setEntry(null);\n return;\n }\n const next = connectWorkspacePresence({\n workspaceId,\n auth: {\n backendUrl: config.backendUrl,\n apiKey: config.apiKey,\n token: config.token,\n getToken: config.getToken,\n },\n });\n handleRef.current = next;\n setEntry({ workspaceId, handle: next });\n return () => {\n handleRef.current = null;\n next.destroy();\n };\n // Recreate when the target or the signed-in identity changes (the\n // credential source's identity epoch). A renewed token for the same\n // identity reaches the next re-mint through `getToken`, so a renewal\n // does not tear the live connection down.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enabled, workspaceId, config.backendUrl, config.apiKey, config.getToken, identityEpoch]);\n\n // React renders with the new arguments before the effect above runs, so a\n // handle opened for a previous workspace, or before the feed was disabled,\n // still sits in state for that one render. Expose it only while it is the\n // handle this render asked for; otherwise the closed / connecting empty\n // result wins, and a disabled feed never leaks a roster.\n const handle =\n enabled && entry !== null && entry.workspaceId === workspaceId ? entry.handle : null;\n\n const subscribe = useMemo(() => {\n return (onStoreChange: () => void) => {\n if (!handle) return () => {};\n return handle.onChange(onStoreChange);\n };\n }, [handle]);\n\n const snapshot = useSyncExternalStore(\n subscribe,\n () => {\n if (!handle) return EMPTY_SNAPSHOT;\n return `${handle.status}|${handle.accessType ?? ''}|${handle.version}`;\n },\n () => EMPTY_SNAPSHOT\n );\n void snapshot;\n\n // The ladder decays with wall-clock time, not with awareness events; a\n // person who stops typing must drift to idle even when nothing arrives.\n const [now, setNow] = useState(() => Date.now());\n useEffect(() => {\n if (!enabled) return;\n setNow(Date.now());\n const timer = setInterval(() => {\n setNow(Date.now());\n }, tickMs);\n return () => {\n clearInterval(timer);\n };\n }, [enabled, tickMs]);\n\n const rosterHumans = handle?.humans ?? NO_HUMANS;\n const humans = useMemo(\n () =>\n rosterHumans.map((human) => ({\n ...human,\n state: derivePresenceState({\n lastIntentAt: human.lastIntentAt,\n hidden: human.hidden,\n manualAway: human.manualAway,\n now,\n }),\n })),\n [rosterHumans, now]\n );\n\n const refreshNow = useCallback(() => handleRef.current?.refreshNow() ?? Promise.resolve(), []);\n\n return {\n status: handle ? handle.status : enabled ? 'connecting' : 'closed',\n error: handle?.error ?? null,\n accessType: handle?.accessType ?? null,\n humans,\n agents: handle?.agents ?? NO_AGENTS,\n refreshNow,\n };\n}\n\nexport type WorkspacePresenceResolver = (\n request: WorkspacePresenceResolveRequest,\n signal?: AbortSignal\n) => Promise<WorkspacePresenceResolveResponse>;\n\n/**\n * A stable resolver bound to the provider's auth and the given workspace.\n * Credentials are read on every call (the provider serves the current token\n * through getters), and `getToken` renews a refused one once. Rejects when\n * called without a workspace; no caching — callers own that.\n */\nexport function useWorkspacePresenceResolver(\n workspaceId: string | null\n): WorkspacePresenceResolver {\n const config = useAthenaConfig();\n return useCallback<WorkspacePresenceResolver>(\n (request, signal) => {\n if (workspaceId === null) {\n return Promise.reject(\n new Error('[AthenaSDK] useWorkspacePresenceResolver: no workspace selected')\n );\n }\n return resolveWorkspacePresence({\n auth: {\n backendUrl: config.backendUrl,\n apiKey: config.apiKey,\n token: config.token,\n getToken: config.getToken,\n },\n workspaceId,\n request,\n signal,\n });\n },\n [workspaceId, config]\n );\n}\n"],"names":["useAthenaConfig","useAthenaCredentialIdentityEpoch","useState","useRef","useEffect","connectWorkspacePresence","useMemo","useSyncExternalStore","derivePresenceState","useCallback","resolveWorkspacePresence"],"mappings":"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"}
|