@flamingo-stack/openframe-frontend-core 0.0.213 → 0.0.214
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/dist/{chunk-3JWIJJ44.js → chunk-5OWDOFKK.js} +2 -2
- package/dist/{chunk-IK2X5YJU.js → chunk-HWY35EAK.js} +2 -2
- package/dist/{chunk-OTKJASSX.cjs → chunk-IZL2KEH6.cjs} +24 -24
- package/dist/{chunk-OTKJASSX.cjs.map → chunk-IZL2KEH6.cjs.map} +1 -1
- package/dist/{chunk-35XIT2CF.cjs → chunk-KDNGUYZM.cjs} +17 -17
- package/dist/{chunk-35XIT2CF.cjs.map → chunk-KDNGUYZM.cjs.map} +1 -1
- package/dist/{chunk-ZTJVRSN5.js → chunk-UKND27XC.js} +2 -2
- package/dist/chunk-UKND27XC.js.map +1 -0
- package/dist/{chunk-ZDF6F7ED.cjs → chunk-YZUUFTIK.cjs} +2 -2
- package/dist/chunk-YZUUFTIK.cjs.map +1 -0
- package/dist/components/chat/index.cjs +2 -2
- package/dist/components/chat/index.js +1 -1
- package/dist/components/contact/index.cjs +3 -3
- package/dist/components/contact/index.js +2 -2
- package/dist/components/features/index.cjs +2 -2
- package/dist/components/features/index.js +1 -1
- package/dist/components/index.cjs +49 -49
- package/dist/components/index.js +2 -2
- package/dist/components/navigation/index.cjs +2 -2
- package/dist/components/navigation/index.js +1 -1
- package/dist/components/tickets/index.cjs +61 -61
- package/dist/components/tickets/index.js +3 -3
- package/dist/components/ui/index.cjs +2 -2
- package/dist/components/ui/index.js +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/src/.index.md +36 -34
- package/src/components/.alert-dialog.md +27 -23
- package/src/components/.announcement-bar.md +26 -21
- package/src/components/.breadcrumb.md +19 -15
- package/src/components/.calendar.md +24 -19
- package/src/components/.categories-cart.md +29 -24
- package/src/components/.checkbox.md +23 -25
- package/src/components/.chevron-button.md +37 -32
- package/src/components/.comment-card.md +32 -62
- package/src/components/.dialog.md +26 -26
- package/src/components/.dynamic-skeleton.md +54 -57
- package/src/components/.empty-state.md +42 -51
- package/src/components/.faq-accordion.md +27 -21
- package/src/components/.filter-chip.md +41 -24
- package/src/components/.flamingo-logo.md +20 -23
- package/src/components/.footer-waitlist-button.md +29 -22
- package/src/components/.footer.md +32 -32
- package/src/components/.icons-block.md +27 -17
- package/src/components/.image-cropper.md +41 -32
- package/src/components/.index.md +33 -39
- package/src/components/.input.md +31 -35
- package/src/components/.logs-list.md +31 -20
- package/src/components/.media-carousel.md +35 -36
- package/src/components/.open-source-features.md +33 -16
- package/src/components/.pagination.md +52 -51
- package/src/components/.provider-button.md +21 -23
- package/src/components/.select.md +31 -20
- package/src/components/.sidebar.md +34 -24
- package/src/components/.smooth-accordion.md +29 -24
- package/src/components/.social-icon-row.md +36 -32
- package/src/components/.textarea.md +25 -31
- package/src/components/.tool-icon.md +24 -26
- package/src/components/.unified-filter-logic.md +37 -30
- package/src/components/.unified-pagination.md +23 -22
- package/src/components/.user-summary-stub.md +38 -22
- package/src/components/.vendor-display-button.md +25 -25
- package/src/components/.vendor-icon.md +33 -25
- package/src/components/.why-it-matters.md +28 -25
- package/src/components/chat/.approval-batch-message.md +51 -0
- package/src/components/chat/.approval-request-message.md +35 -34
- package/src/components/chat/.chat-attachment-bar.md +64 -0
- package/src/components/chat/.chat-container.md +36 -18
- package/src/components/chat/.chat-input.md +37 -20
- package/src/components/chat/.chat-message-enhanced.md +30 -49
- package/src/components/chat/.chat-message-list.md +45 -32
- package/src/components/chat/.chat-message-skeleton.md +26 -22
- package/src/components/chat/.chat-panel-context.md +52 -0
- package/src/components/chat/.chat-ref.types.md +42 -0
- package/src/components/chat/.chat-sidebar-skeleton.md +34 -25
- package/src/components/chat/.chat-sidebar.md +31 -26
- package/src/components/chat/.chat-ticket-list.md +39 -0
- package/src/components/chat/.context-compaction-display.md +36 -0
- package/src/components/chat/.cycling-phrase.md +52 -0
- package/src/components/chat/.embeddable-chat.md +48 -0
- package/src/components/chat/.expand-chevron.md +24 -0
- package/src/components/chat/.index.md +31 -35
- package/src/components/chat/.mingo-onboarding-card-skeleton.md +44 -0
- package/src/components/chat/.mingo-onboarding-card.md +62 -0
- package/src/components/chat/.model-display.md +32 -30
- package/src/components/chat/.nav-link-anchor-via-runtime.md +40 -0
- package/src/components/chat/.remark-card-links.md +38 -0
- package/src/components/chat/.slash-command-suggestions.md +47 -0
- package/src/components/chat/.source-action-button.md +48 -0
- package/src/components/chat/.thinking-display.md +42 -0
- package/src/components/chat/.tool-call-blocks.md +45 -0
- package/src/components/chat/.tool-execution-display.md +44 -36
- package/src/components/chat/chat-container.tsx +1 -1
- package/src/components/chat/entity-cards/.admin-content-card.md +43 -0
- package/src/components/chat/entity-cards/.block-card.md +47 -0
- package/src/components/chat/entity-cards/.blog-card.md +52 -0
- package/src/components/chat/entity-cards/.blog-image-placeholder.md +39 -0
- package/src/components/chat/entity-cards/.campaign-card-admin.md +47 -0
- package/src/components/chat/entity-cards/.case-study-card.md +58 -0
- package/src/components/chat/entity-cards/.chat-ticket-item.md +40 -0
- package/src/components/chat/entity-cards/.chat-video-entity-card.md +43 -0
- package/src/components/chat/entity-cards/.customer-interview-card.md +53 -0
- package/src/components/chat/entity-cards/.data-room-doc-card.md +47 -0
- package/src/components/chat/entity-cards/.dispatch.md +39 -0
- package/src/components/chat/entity-cards/.entity-author-card.md +51 -0
- package/src/components/chat/entity-cards/.generic-entity-card.md +62 -0
- package/src/components/chat/entity-cards/.github-activity-card.md +61 -0
- package/src/components/chat/entity-cards/.hubspot-ticket-card.md +53 -0
- package/src/components/chat/entity-cards/.index.md +66 -0
- package/src/components/chat/entity-cards/.investor-update-card.md +47 -0
- package/src/components/chat/entity-cards/.onboarding-guide-card.md +58 -0
- package/src/components/chat/entity-cards/.product-release-card-defaults.md +31 -0
- package/src/components/chat/entity-cards/.product-release-card.md +29 -0
- package/src/components/chat/entity-cards/.program-card-defaults.md +41 -0
- package/src/components/chat/entity-cards/.program-card.md +59 -0
- package/src/components/chat/entity-cards/.roadmap-card.md +46 -0
- package/src/components/chat/entity-cards/.roadmap-vote-button.md +52 -0
- package/src/components/chat/entity-cards/.slack-message-card.md +48 -0
- package/src/components/chat/entity-cards/.task-type-icon.md +47 -0
- package/src/components/chat/hooks/.index.md +36 -21
- package/src/components/chat/hooks/.use-chat-attachment-image-gallery.md +51 -0
- package/src/components/chat/hooks/.use-chat-attachments.md +48 -0
- package/src/components/chat/hooks/.use-chat-card-item.md +39 -0
- package/src/components/chat/hooks/.use-chat-identity.md +45 -0
- package/src/components/chat/hooks/.use-chat.md +58 -0
- package/src/components/chat/hooks/.use-chunk-catchup.md +46 -48
- package/src/components/chat/hooks/.use-close-on-navigation.md +44 -0
- package/src/components/chat/hooks/.use-collapsible.md +48 -0
- package/src/components/chat/hooks/.use-embedded-chat.md +32 -0
- package/src/components/chat/hooks/.use-jetstream-dialog-subscription.md +40 -0
- package/src/components/chat/hooks/.use-nats-chat-adapter.md +52 -0
- package/src/components/chat/hooks/.use-nats-dialog-subscription.md +49 -30
- package/src/components/chat/hooks/.use-proxied-image-url.md +40 -0
- package/src/components/chat/hooks/.use-realtime-chunk-processor.md +43 -40
- package/src/components/chat/hooks/.use-slash-commands.md +46 -0
- package/src/components/chat/hooks/.use-sse-chat-adapter.md +34 -0
- package/src/components/chat/hooks/.use-sse.md +60 -0
- package/src/components/chat/hooks/.use-unified-chat.md +57 -0
- package/src/components/chat/types/.api.types.md +52 -38
- package/src/components/chat/types/.chat.types.md +43 -34
- package/src/components/chat/types/.component.types.md +47 -48
- package/src/components/chat/types/.index.md +20 -27
- package/src/components/chat/types/.message.types.md +58 -48
- package/src/components/chat/types/.network.types.md +57 -31
- package/src/components/chat/types/.processing.types.md +49 -31
- package/src/components/chat/types/.unified-chat-state.types.md +41 -0
- package/src/components/chat/types/entities/.blog.md +43 -0
- package/src/components/chat/types/entities/.case-study.md +26 -0
- package/src/components/chat/types/entities/.content-ref.md +41 -0
- package/src/components/chat/types/entities/.customer-interview.md +28 -0
- package/src/components/chat/types/entities/.data-room-doc.md +36 -0
- package/src/components/chat/types/entities/.github-activity.md +43 -0
- package/src/components/chat/types/entities/.hubspot-ticket.md +53 -0
- package/src/components/chat/types/entities/.index.md +42 -0
- package/src/components/chat/types/entities/.investor-update.md +45 -0
- package/src/components/chat/types/entities/.onboarding-guide.md +50 -0
- package/src/components/chat/types/entities/.program-types.md +57 -0
- package/src/components/chat/types/entities/.roadmap-item.md +58 -0
- package/src/components/chat/types/entities/.slack-message.md +35 -0
- package/src/components/chat/utils/.agent-status-message.md +45 -0
- package/src/components/chat/utils/.auto-continuation-directive.md +58 -0
- package/src/components/chat/utils/.chat-attachment-markdown.md +54 -0
- package/src/components/chat/utils/.chat-authed-fetch.md +25 -0
- package/src/components/chat/utils/.chat-nav-resolution.md +46 -0
- package/src/components/chat/utils/.chat-proxy-auth-storage.md +38 -0
- package/src/components/chat/utils/.chip-action-class.md +34 -0
- package/src/components/chat/utils/.chip-styles.md +46 -0
- package/src/components/chat/utils/.chunk-parser.md +38 -28
- package/src/components/chat/utils/.clickup-task-type-utils.md +48 -0
- package/src/components/chat/utils/.compact-card-classes.md +62 -0
- package/src/components/chat/utils/.decide-new-tab.md +51 -0
- package/src/components/chat/utils/.external-app-urls.md +29 -0
- package/src/components/chat/utils/.extract-incomplete-message-state.md +25 -29
- package/src/components/chat/utils/.flatten-assistant-content.md +34 -0
- package/src/components/chat/utils/.icon-registry.md +46 -0
- package/src/components/chat/utils/.index.md +37 -32
- package/src/components/chat/utils/.is-cross-origin-url.md +35 -0
- package/src/components/chat/utils/.message-segment-accumulator.md +25 -34
- package/src/components/chat/utils/.nav-anchor-props.md +44 -0
- package/src/components/chat/utils/.nav-click-handler.md +47 -0
- package/src/components/chat/utils/.onboarding-icons.md +28 -0
- package/src/components/chat/utils/.process-historical-messages.md +46 -35
- package/src/components/chat/utils/.scroll-anchor.md +40 -0
- package/src/components/chat/utils/.slash-dispatch-utils.md +44 -0
- package/src/components/chat/utils/.source-icons.md +35 -0
- package/src/components/chat/utils/.source-row-cta.md +54 -0
- package/src/components/chat/utils/.tool-call-helpers.md +42 -0
- package/src/components/contact/.contact-form.md +43 -0
- package/src/components/contact/.index.md +27 -0
- package/src/components/features/.array-entry-manager.md +36 -45
- package/src/components/features/.changelog-manager.md +47 -21
- package/src/components/features/.changelog-sections-manager.md +21 -26
- package/src/components/features/.command-box.md +31 -28
- package/src/components/features/.entity-summary-editor.md +46 -0
- package/src/components/features/.entity-video-section.md +51 -0
- package/src/components/features/.figma-prototype-viewer.md +48 -29
- package/src/components/features/.filters-dropdown.md +33 -46
- package/src/components/features/.highlight-config-section.md +42 -0
- package/src/components/features/.highlight-generation-section.md +46 -0
- package/src/components/features/.highlight-video-combined-section.md +47 -0
- package/src/components/features/.highlight-video-preview.md +44 -0
- package/src/components/features/.highlight-video-section.md +47 -0
- package/src/components/features/.index.md +40 -66
- package/src/components/features/.media-gallery-manager.md +48 -38
- package/src/components/features/.more-about-button.md +22 -19
- package/src/components/features/.og-editor-preview.md +40 -36
- package/src/components/features/.parallax-image-showcase.md +33 -26
- package/src/components/features/.paths-display.md +42 -43
- package/src/components/features/.platform-badge.md +37 -36
- package/src/components/features/.platform-filter.md +23 -16
- package/src/components/features/.policy-configuration-panel.md +48 -56
- package/src/components/features/.provider-button.md +33 -36
- package/src/components/features/.push-button-selector.md +40 -29
- package/src/components/features/.release-media-manager.md +46 -31
- package/src/components/features/.section-selector.md +26 -31
- package/src/components/features/.select-button.md +35 -25
- package/src/components/features/.seo-editor-preview.md +41 -44
- package/src/components/features/.social-links-manager.md +25 -19
- package/src/components/features/.start-with-openframe-button.md +37 -29
- package/src/components/features/.status-filter-component.md +36 -20
- package/src/components/features/.tags-selector.md +40 -24
- package/src/components/features/.transcribe-and-summarize-combined-section.md +45 -0
- package/src/components/features/.transcribe-summarize-section.md +48 -0
- package/src/components/features/.transcript-summary-editor.md +53 -0
- package/src/components/features/.video-bites-display.md +46 -0
- package/src/components/features/.video-clips-section.md +41 -0
- package/src/components/features/.video-ratio-tabs.md +56 -0
- package/src/components/features/.video-source-selector.md +60 -0
- package/src/components/features/.video.md +44 -0
- package/src/components/features/.waitlist-form.md +60 -0
- package/src/components/features/ai-enrich/.AIEnrichButton.md +30 -27
- package/src/components/features/ai-enrich/.AIEnrichSection.md +46 -42
- package/src/components/features/board/.board-column-header.md +38 -0
- package/src/components/features/board/.board-column.md +43 -0
- package/src/components/features/board/.board.md +51 -0
- package/src/components/features/board/.color-utils.md +26 -0
- package/src/components/features/board/.index.md +56 -0
- package/src/components/features/board/.ticket-card-skeleton.md +38 -0
- package/src/components/features/board/.ticket-card.md +47 -0
- package/src/components/features/board/.types.md +45 -0
- package/src/components/features/board/.use-board-collapse.md +34 -0
- package/src/components/features/notifications/.index.md +57 -0
- package/src/components/features/notifications/.notification-drawer.md +34 -0
- package/src/components/features/notifications/.notification-tile.md +39 -0
- package/src/components/features/notifications/.notifications-context.md +73 -0
- package/src/components/features/notifications/.types.md +45 -0
- package/src/components/icons/.about-icon.md +20 -28
- package/src/components/icons/.ai-robot-icon.md +15 -17
- package/src/components/icons/.bash-icon.md +16 -23
- package/src/components/icons/.buildings-icon.md +10 -24
- package/src/components/icons/.capterra-icon.md +30 -26
- package/src/components/icons/.carta-icon.md +29 -0
- package/src/components/icons/.clickup-icon.md +26 -0
- package/src/components/icons/.cmd-icon.md +15 -22
- package/src/components/icons/.coins-icon.md +17 -25
- package/src/components/icons/.community-hub-icon.md +19 -25
- package/src/components/icons/.community-icon.md +24 -21
- package/src/components/icons/.compare-icon.md +32 -19
- package/src/components/icons/.copy-icon.md +29 -15
- package/src/components/icons/.custom-external-link-icon.md +19 -17
- package/src/components/icons/.custom-fork-icon.md +32 -21
- package/src/components/icons/.custom-license-icon.md +29 -25
- package/src/components/icons/.custom-star-icon.md +20 -28
- package/src/components/icons/.custom-time-icon.md +21 -22
- package/src/components/icons/.cut-vendor-costs-icon.md +6 -19
- package/src/components/icons/.dashboard-icon.md +13 -18
- package/src/components/icons/.deno-icon.md +16 -23
- package/src/components/icons/.donut-icon.md +12 -23
- package/src/components/icons/.double-chevron-icon.md +28 -36
- package/src/components/icons/.elestio-logo.md +13 -23
- package/src/components/icons/.empty-vendor-icon.md +16 -18
- package/src/components/icons/.explore-categories-icon.md +18 -29
- package/src/components/icons/.eye-icon.md +16 -26
- package/src/components/icons/.facebook-icon.md +9 -20
- package/src/components/icons/.figma-icon.md +8 -17
- package/src/components/icons/.filter-icon.md +15 -17
- package/src/components/icons/.flamingo-logo.md +28 -27
- package/src/components/icons/.folder-shield-icon.md +28 -19
- package/src/components/icons/.g2-icon.md +22 -21
- package/src/components/icons/.getapp-icon.md +25 -21
- package/src/components/icons/.github-icon.md +13 -25
- package/src/components/icons/.globe-icon.md +14 -19
- package/src/components/icons/.google-gemini-icon.md +16 -19
- package/src/components/icons/.google-logo.md +15 -21
- package/src/components/icons/.grid-view-icon.md +30 -19
- package/src/components/icons/.hamburger-icon.md +22 -20
- package/src/components/icons/.hand-dollar-icon.md +24 -34
- package/src/components/icons/.hotel-icon.md +27 -21
- package/src/components/icons/.icon-utils.md +28 -29
- package/src/components/icons/.image-icon.md +15 -22
- package/src/components/icons/.index.md +25 -28
- package/src/components/icons/.info-circle-icon.md +29 -30
- package/src/components/icons/.instagram-icon.md +10 -24
- package/src/components/icons/.jump-in-icon.md +18 -18
- package/src/components/icons/.linux-icon.md +18 -18
- package/src/components/icons/.log-out-icon.md +15 -23
- package/src/components/icons/.logs-icon.md +14 -23
- package/src/components/icons/.margin-crisis-icon.md +21 -20
- package/src/components/icons/.menu-icon.md +18 -19
- package/src/components/icons/.miami-cyber-gang-logo-face-only.md +18 -21
- package/src/components/icons/.miami-cyber-gang-logo.md +22 -14
- package/src/components/icons/.mlg-logo.md +18 -16
- package/src/components/icons/.moon-icon.md +32 -22
- package/src/components/icons/.ms-icon.md +30 -19
- package/src/components/icons/.nushell-icon.md +7 -21
- package/src/components/icons/.open-source-icon.md +19 -23
- package/src/components/icons/.openai-icon.md +9 -24
- package/src/components/icons/.openframe-ai-icons.md +25 -26
- package/src/components/icons/.openframe-logo.md +28 -22
- package/src/components/icons/.openframe-text.md +24 -27
- package/src/components/icons/.openmsp-logo.md +26 -23
- package/src/components/icons/.pilot-icon.md +23 -0
- package/src/components/icons/.powershell-icon.md +17 -22
- package/src/components/icons/.python-icon.md +16 -23
- package/src/components/icons/.queries-icon.md +13 -21
- package/src/components/icons/.reddit-icon.md +28 -24
- package/src/components/icons/.remote-control-icon.md +13 -17
- package/src/components/icons/.script-icon.md +27 -19
- package/src/components/icons/.search-icon.md +21 -21
- package/src/components/icons/.send-icon.md +14 -16
- package/src/components/icons/.settings-icon.md +30 -19
- package/src/components/icons/.shape-circle-dash-icon.md +16 -21
- package/src/components/icons/.shell-icon.md +15 -19
- package/src/components/icons/.shield-check-icon.md +18 -31
- package/src/components/icons/.shield-key-icon.md +25 -25
- package/src/components/icons/.shield-lock-icon.md +8 -18
- package/src/components/icons/.slack-icon.md +28 -32
- package/src/components/icons/.sparkles-icon.md +18 -23
- package/src/components/icons/.sso-configuration-icon.md +29 -16
- package/src/components/icons/.sun-icon.md +20 -18
- package/src/components/icons/.table-view-icon.md +17 -19
- package/src/components/icons/.telegram-icon.md +8 -22
- package/src/components/icons/.thumbs-down-icon.md +10 -19
- package/src/components/icons/.thumbs-up-icon.md +8 -17
- package/src/components/icons/.tool-directory-icons.md +24 -28
- package/src/components/icons/.trustpilot-icon.md +25 -22
- package/src/components/icons/.user-icon.md +26 -28
- package/src/components/icons/.users-group-icon.md +28 -24
- package/src/components/icons/.vendor-showcase-icons.md +21 -29
- package/src/components/icons/.vendors-icon.md +18 -22
- package/src/components/icons/.whatsapp-icon.md +30 -14
- package/src/components/icons/.x-icon.md +18 -23
- package/src/components/icons/.x-logo.md +13 -38
- package/src/components/icons/.youtube-icon.md +8 -19
- package/src/components/icons/device-type-icons/.get-device-type-icon.md +26 -34
- package/src/components/icons-v2-generated/.index.md +52 -0
- package/src/components/icons-v2-generated/alphabet/.index.md +33 -0
- package/src/components/icons-v2-generated/arrows/.index.md +39 -0
- package/src/components/icons-v2-generated/audio-and-visual/.index.md +40 -0
- package/src/components/icons-v2-generated/brand-logos/.elestio-logo-icon.md +40 -0
- package/src/components/icons-v2-generated/brand-logos/.gemini-logo-icon.md +37 -0
- package/src/components/icons-v2-generated/brand-logos/.google-gemini-logo-icon.md +33 -0
- package/src/components/icons-v2-generated/brand-logos/.index.md +38 -0
- package/src/components/icons-v2-generated/brand-logos/.meshcentral-logo-grey-icon.md +35 -0
- package/src/components/icons-v2-generated/brand-logos/.meshcentral-logo-icon.md +36 -0
- package/src/components/icons-v2-generated/buildings/.index.md +48 -0
- package/src/components/icons-v2-generated/charts/.index.md +40 -0
- package/src/components/icons-v2-generated/clothes/.index.md +48 -0
- package/src/components/icons-v2-generated/coding/.index.md +42 -0
- package/src/components/icons-v2-generated/communication/.index.md +39 -0
- package/src/components/icons-v2-generated/date-and-time/.index.md +29 -0
- package/src/components/icons-v2-generated/design/.index.md +39 -0
- package/src/components/icons-v2-generated/devices/.index.md +38 -0
- package/src/components/icons-v2-generated/documents/.index.md +38 -0
- package/src/components/icons-v2-generated/finance/.index.md +34 -0
- package/src/components/icons-v2-generated/food-and-drinks/.index.md +34 -0
- package/src/components/icons-v2-generated/food-and-drinks/.leafy-green-icon.md +36 -0
- package/src/components/icons-v2-generated/food-and-drinks/.strawberry-icon.md +39 -0
- package/src/components/icons-v2-generated/health/.index.md +40 -0
- package/src/components/icons-v2-generated/household/.index.md +45 -0
- package/src/components/icons-v2-generated/interface/.index.md +36 -0
- package/src/components/icons-v2-generated/map-and-travel/.index.md +41 -0
- package/src/components/icons-v2-generated/media-playback/.index.md +51 -0
- package/src/components/icons-v2-generated/number/.index.md +41 -0
- package/src/components/icons-v2-generated/school/.index.md +37 -0
- package/src/components/icons-v2-generated/security/.fingerprint-icon.md +38 -0
- package/src/components/icons-v2-generated/security/.index.md +39 -0
- package/src/components/icons-v2-generated/shopping/.index.md +42 -0
- package/src/components/icons-v2-generated/signs-and-symbols/.index.md +32 -0
- package/src/components/icons-v2-generated/sort-and-filter/.index.md +35 -0
- package/src/components/icons-v2-generated/sport/.index.md +41 -0
- package/src/components/icons-v2-generated/text-editor/.index.md +44 -0
- package/src/components/icons-v2-generated/users/.index.md +45 -0
- package/src/components/icons-v2-generated/vehicles-and-delivery/.index.md +36 -0
- package/src/components/icons-v2-generated/weather-and-nature/.flower-sakura-icon.md +36 -0
- package/src/components/icons-v2-generated/weather-and-nature/.index.md +34 -0
- package/src/components/layout/.article-detail-layout.md +43 -0
- package/src/components/layout/.back-button.md +40 -0
- package/src/components/layout/.list-page-layout.md +35 -26
- package/src/components/layout/.page-container.md +27 -38
- package/src/components/layout/.page-layout.md +50 -0
- package/src/components/layout/.title-block.md +42 -0
- package/src/components/loading/.card-skeleton.md +38 -29
- package/src/components/loading/.device-card-skeleton.md +29 -25
- package/src/components/loading/.index.md +39 -46
- package/src/components/loading/.margin-report-skeleton.md +45 -34
- package/src/components/loading/.organization-card-skeleton.md +39 -44
- package/src/components/loading/.page-layout-skeleton.md +34 -45
- package/src/components/loading/.unified-skeleton.md +62 -36
- package/src/components/navigation/.app-header.md +40 -29
- package/src/components/navigation/.app-layout.md +25 -26
- package/src/components/navigation/.header-global-search.md +34 -37
- package/src/components/navigation/.header-organization-filter.md +23 -22
- package/src/components/navigation/.header.md +31 -35
- package/src/components/navigation/.mobile-burger-menu.md +39 -47
- package/src/components/navigation/.mobile-nav-panel.md +51 -32
- package/src/components/navigation/.navigation-sidebar-header.md +36 -0
- package/src/components/navigation/.navigation-sidebar-item.md +45 -0
- package/src/components/navigation/.navigation-sidebar-toggle.md +38 -0
- package/src/components/navigation/.navigation-sidebar.md +33 -34
- package/src/components/navigation/.sliding-sidebar.md +52 -41
- package/src/components/navigation/.sticky-section-nav.md +56 -48
- package/src/components/platform/.ScriptArguments.md +39 -25
- package/src/components/platform/.ScriptInfoSection.md +30 -26
- package/src/components/platform/.ShellTypeBadge.md +18 -13
- package/src/components/platform/.SoftwareInfo.md +23 -27
- package/src/components/platform/.SoftwareSourceBadge.md +28 -19
- package/src/components/platform/.ToolBadge.md +25 -26
- package/src/components/providers/.theme-provider.md +52 -0
- package/src/components/shared/delivery/.delivery-lists.md +39 -0
- package/src/components/shared/delivery/.delivery-row.md +41 -0
- package/src/components/shared/delivery/.delivery-table.md +41 -0
- package/src/components/shared/delivery/.index.md +38 -0
- package/src/components/shared/dev-section/.dev-card-row.md +60 -0
- package/src/components/shared/dev-section/.dev-section-page.md +48 -0
- package/src/components/shared/dev-section/.dev-section-view.md +43 -0
- package/src/components/shared/dev-section/.index.md +38 -0
- package/src/components/shared/legal-document/.index.md +40 -0
- package/src/components/shared/legal-document/.legal-document-page.md +50 -0
- package/src/components/shared/legal-document/.use-legal-docs.md +42 -0
- package/src/components/shared/onboarding/.onboarding-step-card.md +32 -31
- package/src/components/shared/onboarding/.onboarding-walkthrough.md +39 -43
- package/src/components/shared/product-release/.index.md +28 -30
- package/src/components/shared/product-release/.product-release-card-skeleton.md +28 -28
- package/src/components/shared/product-release/.product-release-card.md +45 -27
- package/src/components/shared/product-release/.release-detail-page.md +23 -24
- package/src/components/shared/roadmap/.index.md +37 -0
- package/src/components/shared/roadmap/.roadmap-grid-skeleton.md +39 -0
- package/src/components/shared/roadmap/.roadmap-grid.md +66 -0
- package/src/components/shared/roadmap/.use-roadmap-voting.md +68 -0
- package/src/components/tickets/.help-center-card.md +51 -0
- package/src/components/tickets/.help-center-create-form.md +38 -0
- package/src/components/tickets/.help-center-list.md +40 -0
- package/src/components/tickets/.index.md +65 -0
- package/src/components/tickets/.ticket-center.md +51 -0
- package/src/components/tickets/.ticket-detail-drawer.md +48 -0
- package/src/components/tickets/.ticket-linked-delivery-card.md +36 -0
- package/src/components/tickets/.ticket-open-form.md +50 -0
- package/src/components/tickets/.ticket-row.md +30 -0
- package/src/components/tickets/.types.md +57 -0
- package/src/components/tickets/hooks/.use-ticket-actions.md +77 -0
- package/src/components/tickets/hooks/.use-ticket-engagements.md +42 -0
- package/src/components/tickets/hooks/.use-tickets-list.md +54 -0
- package/src/components/ui/.actions-menu.md +66 -41
- package/src/components/ui/.alert-dialog.md +29 -26
- package/src/components/ui/.allowed-domains-input.md +29 -21
- package/src/components/ui/.assignee-dropdown.md +45 -0
- package/src/components/ui/.autocomplete.md +47 -41
- package/src/components/ui/.benefit-card.md +51 -36
- package/src/components/ui/.brand-association-card.md +30 -27
- package/src/components/ui/.breadcrumb.md +17 -15
- package/src/components/ui/.checkbox-block.md +39 -35
- package/src/components/ui/.checkbox-with-description.md +23 -16
- package/src/components/ui/.checkbox.md +31 -23
- package/src/components/ui/.circular-progress.md +49 -19
- package/src/components/ui/.content-loader.md +32 -20
- package/src/components/ui/.cursor-pagination.md +41 -52
- package/src/components/ui/.dashboard-info-card.md +33 -26
- package/src/components/ui/.date-picker.md +27 -25
- package/src/components/ui/.device-card-compact.md +28 -29
- package/src/components/ui/.device-card.md +27 -27
- package/src/components/ui/.dialog.md +25 -16
- package/src/components/ui/.drawer.md +86 -0
- package/src/components/ui/.dropdown-button.md +45 -0
- package/src/components/ui/.entity-image.md +46 -0
- package/src/components/ui/.error-state.md +41 -28
- package/src/components/ui/.feature-card.md +35 -31
- package/src/components/ui/.feature-list.md +48 -0
- package/src/components/ui/.field-wrapper.md +47 -0
- package/src/components/ui/.file-upload.md +42 -0
- package/src/components/ui/.filter-checkbox-item.md +43 -0
- package/src/components/ui/.filter-list.md +57 -0
- package/src/components/ui/.filter-modal.md +59 -0
- package/src/components/ui/.floating-tooltip.md +43 -26
- package/src/components/ui/.hidden-tags-popup.md +49 -0
- package/src/components/ui/.hover-dropdown.md +54 -0
- package/src/components/ui/.image-gallery-modal.md +41 -34
- package/src/components/ui/.image-uploader.md +53 -0
- package/src/components/ui/.index.md +40 -34
- package/src/components/ui/.info-card.md +31 -31
- package/src/components/ui/.info-row.md +31 -27
- package/src/components/ui/.input-trigger.md +44 -0
- package/src/components/ui/.input.md +37 -31
- package/src/components/ui/.markdown-editor.md +57 -0
- package/src/components/ui/.modal-v2.md +51 -0
- package/src/components/ui/.modal.md +32 -31
- package/src/components/ui/.more-actions-menu.md +45 -38
- package/src/components/ui/.organization-card.md +31 -37
- package/src/components/ui/.page-actions.md +44 -54
- package/src/components/ui/.phone-input.md +54 -0
- package/src/components/ui/.progress-bar.md +35 -27
- package/src/components/ui/.radio-group.md +39 -27
- package/src/components/ui/.release-changelog-section.md +34 -34
- package/src/components/ui/.search-input.md +48 -0
- package/src/components/ui/.select.md +54 -34
- package/src/components/ui/.service-card.md +42 -40
- package/src/components/ui/.sheet.md +27 -18
- package/src/components/ui/.simple-markdown-renderer.md +29 -31
- package/src/components/ui/.sort-column-item.md +42 -0
- package/src/components/ui/.square-avatar.md +34 -24
- package/src/components/ui/.status-badge.md +26 -38
- package/src/components/ui/.switch.md +22 -35
- package/src/components/ui/.tab-navigation.md +56 -53
- package/src/components/ui/.tab-selector.md +40 -0
- package/src/components/ui/.tag-key-value-filter.md +56 -0
- package/src/components/ui/.tag-search-input.md +53 -0
- package/src/components/ui/.tag.md +49 -31
- package/src/components/ui/.tags-manager.md +60 -0
- package/src/components/ui/.textarea.md +44 -34
- package/src/components/ui/.ticket-attachments-list.md +45 -0
- package/src/components/ui/.ticket-detail-section.md +29 -0
- package/src/components/ui/.ticket-info-section.md +56 -0
- package/src/components/ui/.ticket-note-card.md +53 -0
- package/src/components/ui/.ticket-notes-section.md +54 -0
- package/src/components/ui/.ticket-status-tag.md +49 -0
- package/src/components/ui/.title-content-block.md +25 -26
- package/src/components/ui/.toaster.md +40 -28
- package/src/components/ui/.tooltip.md +22 -11
- package/src/components/ui/.truncate-text.md +39 -0
- package/src/components/ui/button/.button-styles.md +35 -0
- package/src/components/ui/button/.button.md +53 -0
- package/src/components/ui/button/.split-button.md +48 -0
- package/src/components/ui/data-table/.data-table-body.md +48 -0
- package/src/components/ui/data-table/.data-table-column-filter.md +45 -0
- package/src/components/ui/data-table/.data-table-cursor-footer.md +45 -0
- package/src/components/ui/data-table/.data-table-empty.md +43 -0
- package/src/components/ui/data-table/.data-table-header.md +55 -0
- package/src/components/ui/data-table/.data-table-infinite-footer.md +44 -0
- package/src/components/ui/data-table/.data-table-row-count.md +43 -0
- package/src/components/ui/data-table/.data-table-row.md +47 -0
- package/src/components/ui/data-table/.data-table-skeleton.md +42 -0
- package/src/components/ui/data-table/.data-table.md +47 -0
- package/src/components/ui/data-table/.index.md +55 -0
- package/src/components/ui/data-table/.types.md +54 -0
- package/src/components/ui/data-table/.use-data-table.md +45 -0
- package/src/components/ui/data-table/.utils.md +38 -0
- package/src/components/ui/file-manager/.file-manager-action-bar.md +39 -30
- package/src/components/ui/file-manager/.file-manager-breadcrumb.md +29 -27
- package/src/components/ui/file-manager/.file-manager-context-menu.md +38 -42
- package/src/components/ui/file-manager/.file-manager-empty.md +26 -39
- package/src/components/ui/file-manager/.file-manager-table-row.md +33 -41
- package/src/components/ui/file-manager/.file-manager.md +35 -31
- package/src/components/ui/query-report-table/.index.md +43 -0
- package/src/components/ui/query-report-table/.query-report-table-header.md +36 -0
- package/src/components/ui/query-report-table/.query-report-table-row.md +40 -0
- package/src/components/ui/query-report-table/.query-report-table-skeleton.md +44 -0
- package/src/components/ui/query-report-table/.query-report-table.md +47 -0
- package/src/components/ui/query-report-table/.types.md +41 -0
- package/src/components/ui/query-report-table/.utils.md +35 -0
- package/src/components/ui/table/.index.md +27 -48
- package/src/components/ui/table/.table-cell.md +18 -27
- package/src/components/ui/table/.table-column-filter-dropdown.md +40 -0
- package/src/components/ui/table/.table-description-cell.md +24 -14
- package/src/components/ui/table/.table-empty-state.md +21 -22
- package/src/components/ui/table/.table-header.md +25 -40
- package/src/components/ui/table/.table-row.md +22 -40
- package/src/components/ui/table/.table-skeleton.md +33 -26
- package/src/components/ui/table/.table-timestamp-cell.md +26 -16
- package/src/components/ui/table/.table.md +39 -59
- package/src/components/ui/table/.types.md +44 -36
- package/src/components/ui/table/.utils.md +18 -20
- package/src/contexts/.chat-runtime-context.md +54 -0
- package/src/contexts/.endpoints-runtime-context.md +58 -0
- package/src/contexts/.index.md +53 -0
- package/src/contexts/.use-outer-or-default.md +36 -0
- package/src/embed-shims/.index.md +45 -0
- package/src/embed-shims/.next-dynamic.md +43 -0
- package/src/embed-shims/.next-image.md +45 -0
- package/src/embed-shims/.next-link.md +59 -0
- package/src/embed-shims/.next-navigation.md +59 -0
- package/src/hooks/.index.md +34 -29
- package/src/hooks/.use-access-code-integration.md +49 -0
- package/src/hooks/.use-contact-submission.md +37 -26
- package/src/hooks/.use-copy-to-clipboard.md +42 -0
- package/src/hooks/.use-near-viewport.md +44 -0
- package/src/hooks/.use-og-placeholder.md +51 -0
- package/src/hooks/.use-toast.md +36 -35
- package/src/hooks/state/.use-api-params.md +29 -46
- package/src/hooks/state/.use-query-params.md +37 -33
- package/src/hooks/ui/.index.md +33 -32
- package/src/hooks/ui/.use-auto-limit-tags.md +54 -0
- package/src/hooks/ui/.use-horizontal-scrollbar.md +74 -0
- package/src/hooks/ui/.use-image-edge-color.md +42 -0
- package/src/hooks/ui/.use-media-query.md +33 -25
- package/src/hooks/ui/.use-search.md +51 -0
- package/src/nats/.nats.md +49 -28
- package/src/schemas/.contact-schema.md +45 -0
- package/src/stories/.AnnouncementBar.stories.md +45 -0
- package/src/stories/.AppLayout.stories.md +20 -21
- package/src/stories/.Autocomplete.stories.md +48 -34
- package/src/stories/.Board.stories.md +35 -0
- package/src/stories/.Button.stories.md +36 -33
- package/src/stories/.ChatTicketList.stories.md +33 -0
- package/src/stories/.CheckboxBlock.stories.md +40 -28
- package/src/stories/.ContentLoader.stories.md +47 -0
- package/src/stories/.DashboardInfoCard.stories.md +57 -0
- package/src/stories/.DataTable.stories.md +41 -0
- package/src/stories/.DatePicker.stories.md +66 -52
- package/src/stories/.DeviceCard.stories.md +41 -40
- package/src/stories/.DeviceCardCompact.stories.md +41 -0
- package/src/stories/.DotsLoaderIcon.stories.md +36 -0
- package/src/stories/.Drawer.stories.md +58 -0
- package/src/stories/.EmbeddableChat.stories.md +41 -0
- package/src/stories/.FileManager.stories.md +41 -0
- package/src/stories/.FileManagerActionBar.stories.md +38 -0
- package/src/stories/.FileUpload.stories.md +53 -0
- package/src/stories/.FilterList.stories.md +54 -0
- package/src/stories/.FilterModal.stories.md +72 -0
- package/src/stories/.FiltersDropdown.stories.md +57 -0
- package/src/stories/.Header.stories.md +48 -0
- package/src/stories/.ImageUploader.stories.md +49 -0
- package/src/stories/.InfoCard.stories.md +54 -0
- package/src/stories/.Input.stories.md +48 -30
- package/src/stories/.ListPageLayout.stories.md +56 -43
- package/src/stories/.MingoOnboardingCard.stories.md +42 -0
- package/src/stories/.MingoOnboardingCardSkeleton.stories.md +35 -0
- package/src/stories/.Modal.stories.md +40 -31
- package/src/stories/.NotificationDrawer.stories.md +55 -0
- package/src/stories/.OnboardingStepCard.stories.md +41 -0
- package/src/stories/.OrganizationCard.stories.md +61 -0
- package/src/stories/.PageActions.stories.md +52 -49
- package/src/stories/.PageContainer.stories.md +41 -35
- package/src/stories/.PageLayout.stories.md +60 -0
- package/src/stories/.ParallaxImageShowcase.stories.md +49 -0
- package/src/stories/.PhoneInput.stories.md +53 -0
- package/src/stories/.QueryReportTable.stories.md +44 -0
- package/src/stories/.RadioGroup.stories.md +46 -0
- package/src/stories/.RadioGroupBlock.stories.md +45 -0
- package/src/stories/.Select.stories.md +29 -15
- package/src/stories/.SlashCommandSuggestions.stories.md +41 -0
- package/src/stories/.SplitButton.stories.md +62 -0
- package/src/stories/.TabNavigation.stories.md +47 -38
- package/src/stories/.TabSelector.stories.md +65 -0
- package/src/stories/.Table.stories.md +38 -46
- package/src/stories/.TableColumnFilterDropdown.stories.md +46 -0
- package/src/stories/.Tag.stories.md +43 -32
- package/src/stories/.TagKeyValueFilter.stories.md +44 -0
- package/src/stories/.TagSearchInput.stories.md +61 -0
- package/src/stories/.Textarea.stories.md +49 -26
- package/src/stories/.Theme.stories.md +41 -0
- package/src/stories/.TicketAttachmentsList.stories.md +39 -0
- package/src/stories/.TicketDescriptionViewer.stories.md +39 -0
- package/src/stories/.TicketInfoSection.stories.md +40 -0
- package/src/stories/.TicketKnowledgeBaseList.stories.md +36 -0
- package/src/stories/.TicketNotesSection.stories.md +50 -0
- package/src/stories/.Toaster.stories.md +40 -0
- package/src/stories/.ToolExecutionDisplay.stories.md +41 -0
- package/src/stories/.Tooltip.stories.md +41 -0
- package/src/stories/.UserSummary.stories.md +41 -0
- package/src/stories/.WaitlistForm.stories.md +42 -0
- package/src/stories/BlogCard.stories.tsx +61 -0
- package/src/stories/CampaignCardAdmin.stories.tsx +52 -0
- package/src/stories/CaseStudyCard.stories.tsx +42 -0
- package/src/stories/ChatContainer.stories.tsx +186 -0
- package/src/stories/ChatInlineVideoPill.stories.tsx +63 -0
- package/src/stories/CustomerInterviewCard.stories.tsx +42 -0
- package/src/stories/DataRoomDocCard.stories.tsx +52 -0
- package/src/stories/GenericEntityCard.stories.tsx +66 -0
- package/src/stories/GitHubActivityCard.stories.tsx +61 -0
- package/src/stories/HubspotTicketCard.stories.tsx +98 -0
- package/src/stories/InvestorUpdateCard.stories.tsx +42 -0
- package/src/stories/OnboardingGuideCard.stories.tsx +52 -0
- package/src/stories/ProductReleaseCard.stories.tsx +61 -0
- package/src/stories/ProgramCard.stories.tsx +79 -0
- package/src/stories/RoadmapCard.stories.tsx +75 -0
- package/src/stories/SlackMessageCard.stories.tsx +41 -0
- package/src/stories/__fixtures__/chat-cards.ts +604 -0
- package/src/types/.blog.md +53 -29
- package/src/types/.case-study.md +44 -27
- package/src/types/.customer-interview.md +66 -44
- package/src/types/.delivery.md +40 -0
- package/src/types/.employee.md +24 -30
- package/src/types/.index.md +33 -47
- package/src/types/.marketing.md +49 -44
- package/src/types/.navigation.md +33 -25
- package/src/types/.os.types.md +32 -27
- package/src/types/.platform.md +31 -28
- package/src/types/.product-release.md +65 -38
- package/src/types/.supabase.md +37 -29
- package/src/types/.team.md +41 -33
- package/src/types/.video-processing.md +54 -0
- package/src/types/.waitlist.md +40 -36
- package/src/utils/.access-code-client.md +37 -36
- package/src/utils/.cn.md +31 -23
- package/src/utils/.color-analysis.md +35 -0
- package/src/utils/.country-phone-utils.md +39 -0
- package/src/utils/.date-formatters.md +19 -18
- package/src/utils/.embed-authed-fetch.md +39 -0
- package/src/utils/.embed-proxy-auth-storage.md +38 -0
- package/src/utils/.fetch-priority.md +41 -0
- package/src/utils/.format.md +74 -25
- package/src/utils/.generic-domain-utils.md +42 -0
- package/src/utils/.image-proxy.md +59 -23
- package/src/utils/.index.md +42 -49
- package/src/utils/.local-storage-adapter.md +50 -0
- package/src/utils/.ods-color-utils.md +55 -38
- package/src/utils/.platform-config.md +45 -25
- package/src/utils/.scroll-into-view.md +40 -0
- package/src/utils/.source-icons.md +53 -0
- package/src/utils/.sse-decision-frame.md +46 -0
- package/src/utils/dev-sections/.index.md +34 -0
- package/src/utils/dev-sections/.openframe-dev-sections.md +49 -0
- package/dist/chunk-ZDF6F7ED.cjs.map +0 -1
- package/dist/chunk-ZTJVRSN5.js.map +0 -1
- package/src/components/.card.md +0 -42
- package/src/components/.contact-button.md +0 -30
- package/src/components/.drawer.md +0 -46
- package/src/components/.fixed-layout-container.md +0 -47
- package/src/components/.footer-waitlist-card.md +0 -29
- package/src/components/.join-waitlist-cta.md +0 -29
- package/src/components/.sheet.md +0 -47
- package/src/components/.sliding-panel.md +0 -48
- package/src/components/.tooltip.md +0 -48
- package/src/components/.use-mobile.md +0 -42
- package/src/components/.vendor-compact-card.md +0 -66
- package/src/components/.x-button.md +0 -42
- package/src/components/features/.github-repo-button.md +0 -40
- package/src/components/features/.organization-icon.md +0 -47
- package/src/components/features/.organization-selector.md +0 -45
- package/src/components/icons/.fleet-icon.md +0 -39
- package/src/components/icons/.meshcentral-icon.md +0 -35
- package/src/components/icons/.refresh-icon.md +0 -34
- package/src/components/icons/.tactical-icon.md +0 -35
- package/src/components/ui/.button.md +0 -69
- package/src/components/ui/.log-table-row.md +0 -47
- package/src/components/ui/.selectable-device-card.md +0 -46
- package/src/hooks/.api-hooks-stub.md +0 -45
- package/src/hooks/api/.use-product-releases.md +0 -53
- package/src/stories/.OrganizationSelector.stories.md +0 -42
- package/src/stories/.SelectableDeviceCard.stories.md +0 -30
- package/src/utils/.lite-youtube-embed-stub.md +0 -37
- package/src/utils/.lite-youtube-embed.md +0 -33
- /package/dist/{chunk-3JWIJJ44.js.map → chunk-5OWDOFKK.js.map} +0 -0
- /package/dist/{chunk-IK2X5YJU.js.map → chunk-HWY35EAK.js.map} +0 -0
|
@@ -1,55 +1,53 @@
|
|
|
1
|
-
<!-- source-hash:
|
|
2
|
-
|
|
1
|
+
<!-- source-hash: a64b1bda14e5000a8167e43f4d2c233d -->
|
|
2
|
+
Manages NATS message chunk buffering and catchup for dialog loading, ensuring chunks arriving during initial fetch are buffered, deduplicated, ordered by sequence ID, and processed without gaps or duplicates.
|
|
3
3
|
|
|
4
4
|
## Key Components
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
| Export | Type | Description |
|
|
7
|
+
|--------|------|-------------|
|
|
8
|
+
| `useChunkCatchup` | Hook | Main hook orchestrating chunk buffering, catchup fetching, deduplication, and ordered processing |
|
|
9
|
+
| `makeSeqKey` | Helper | Generates a unique tracking key from `messageType`, `chunkType`, and `sequenceId` |
|
|
10
|
+
| `makeBatchDedupKey` | Helper | Generates a composite deduplication key covering all relevant chunk fields |
|
|
11
|
+
| `getChatTypeMessageType` | Helper | Maps a `ChatType` to its corresponding `NatsMessageType` |
|
|
12
|
+
|
|
13
|
+
### Hook Return API (`UseChunkCatchupReturn`)
|
|
14
|
+
|
|
15
|
+
| Method | Description |
|
|
16
|
+
|--------|-------------|
|
|
17
|
+
| `catchUpChunks(fromSequenceId?)` | Fetches historical chunks from the API and merges with buffered NATS chunks |
|
|
18
|
+
| `processChunk(chunk, messageType, forceProcess?)` | Processes a single chunk, buffering it if catchup is still in progress |
|
|
19
|
+
| `startInitialBuffering()` | Activates the buffer so live NATS chunks are held during initial fetch |
|
|
20
|
+
| `isBufferingActive()` | Returns `true` if buffering is currently active |
|
|
21
|
+
| `resetChunkTracking()` | Clears all sequence tracking and buffer state |
|
|
22
|
+
| `resetAndCatchUp()` | Resets guards and re-fetches from the last known sequence — use after reconnection |
|
|
23
|
+
| `processedCount` | Number of successfully processed sequence keys |
|
|
12
24
|
|
|
13
25
|
## Usage Example
|
|
14
26
|
|
|
15
27
|
```typescript
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
catchUpChunks()
|
|
43
|
-
}
|
|
44
|
-
}, [dialogId])
|
|
45
|
-
|
|
46
|
-
// Process realtime chunks from NATS
|
|
47
|
-
const handleNatsChunk = useCallback((chunk, messageType) => {
|
|
48
|
-
processChunk(chunk, messageType)
|
|
49
|
-
}, [processChunk])
|
|
50
|
-
|
|
51
|
-
return <div>Chat content...</div>
|
|
52
|
-
}
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
The hook handles complex scenarios like preventing duplicate chunks, maintaining sequence order, buffering realtime chunks during catchup, and finding complete message boundaries to ensure proper synchronization.
|
|
28
|
+
const {
|
|
29
|
+
catchUpChunks,
|
|
30
|
+
processChunk,
|
|
31
|
+
startInitialBuffering,
|
|
32
|
+
resetAndCatchUp,
|
|
33
|
+
} = useChunkCatchup({
|
|
34
|
+
dialogId: 'dialog-123',
|
|
35
|
+
chatTypes: [CHAT_TYPE.CLIENT, CHAT_TYPE.ADMIN],
|
|
36
|
+
fetchChunks: async (dialogId, chatType, fromSequenceId) => {
|
|
37
|
+
return await api.getChunks(dialogId, chatType, fromSequenceId)
|
|
38
|
+
},
|
|
39
|
+
onChunkReceived: (chunk, messageType) => {
|
|
40
|
+
dispatch(appendChunk({ chunk, messageType }))
|
|
41
|
+
},
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
// On dialog open: buffer live chunks while fetching history
|
|
45
|
+
startInitialBuffering()
|
|
46
|
+
await catchUpChunks()
|
|
47
|
+
|
|
48
|
+
// On NATS message received:
|
|
49
|
+
processChunk(incomingChunk, 'message')
|
|
50
|
+
|
|
51
|
+
// On reconnect: re-fetch missed chunks from last known position
|
|
52
|
+
await resetAndCatchUp()
|
|
53
|
+
```
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<!-- source-hash: a2a5f2990aca87eef1bd65cbfd43d85e -->
|
|
2
|
+
Closes a layout-mounted overlay (modal, drawer, dropdown, side panel) automatically when the URL pathname changes, preventing stale body-level scroll/pointer-event locks on the new page.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
### `useCloseOnNavigation(close, pathname)`
|
|
7
|
+
|
|
8
|
+
| Parameter | Type | Description |
|
|
9
|
+
|-----------|------|-------------|
|
|
10
|
+
| `close` | `() => void` | Stable callback that triggers the overlay's close flow |
|
|
11
|
+
| `pathname` | `string \| null` | Current route pathname; threading this makes the hook router-agnostic |
|
|
12
|
+
|
|
13
|
+
**Behaviour:**
|
|
14
|
+
- **Skip-first-render** — uses `initializedRef` to record the initial pathname without firing `close()`, preventing a spurious close on mount
|
|
15
|
+
- **Real change only** — compares against `prevPathnameRef` and calls `close()` only when the pathname actually changes
|
|
16
|
+
- `close` is intentionally excluded from the `useEffect` dependency array; callers must pass a stable (memoized or ref-stable) callback
|
|
17
|
+
|
|
18
|
+
## Usage Example
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
// Lib (router-agnostic, direct usage):
|
|
22
|
+
import { useCloseOnNavigation } from '@/lib/hooks/use-close-on-navigation'
|
|
23
|
+
|
|
24
|
+
function MyDrawer() {
|
|
25
|
+
const [isOpen, setIsOpen] = useState(false)
|
|
26
|
+
const pathname = usePathname() // or useLocation(), window.location.pathname, etc.
|
|
27
|
+
|
|
28
|
+
useCloseOnNavigation(() => setIsOpen(false), pathname)
|
|
29
|
+
|
|
30
|
+
return <Drawer open={isOpen} onClose={() => setIsOpen(false)} />
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
```typescript
|
|
35
|
+
// Hub wrapper (binds Next.js router once, re-exports a cleaner API):
|
|
36
|
+
import { usePathname } from 'next/navigation'
|
|
37
|
+
import { useCloseOnNavigation as libUseCloseOnNavigation } from '@lib/hooks/use-close-on-navigation'
|
|
38
|
+
|
|
39
|
+
export function useCloseOnNavigation(close: () => void) {
|
|
40
|
+
return libUseCloseOnNavigation(close, usePathname())
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
> **Layout-shell only** — do not call this from page-level components. Pages unmount on navigation naturally; this hook exists solely for overlays that persist in the root layout across route changes.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
<!-- source-hash: 24f090768a3d572fe819879e60f540e1 -->
|
|
2
|
+
Provides animated expand/collapse behavior for a container element by measuring content height and toggling `max-height` with a CSS transition.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
### `UseCollapsibleOptions`
|
|
7
|
+
Configuration interface for the hook:
|
|
8
|
+
- `expanded` — controls whether the content is expanded or collapsed
|
|
9
|
+
- `collapsedHeight` — collapsed height in pixels or `"1lh"` (one line-height); defaults to `0`
|
|
10
|
+
- `disableTransition` — skips the CSS transition when `true`; defaults to `false`
|
|
11
|
+
- `durationMs` — transition duration in milliseconds; defaults to `200`
|
|
12
|
+
|
|
13
|
+
### `useCollapsible(options)`
|
|
14
|
+
Main hook that returns:
|
|
15
|
+
- `innerRef` — ref callback to attach to the collapsible content `div`
|
|
16
|
+
- `isOverflowing` — `true` when content height exceeds the collapsed height (useful for showing "show more" triggers)
|
|
17
|
+
- `containerStyle` — computed `CSSProperties` object with `overflow`, `max-height`, and `transition` to spread onto the wrapper element
|
|
18
|
+
|
|
19
|
+
**`"1lh"` handling:** When `collapsedHeight` is `"1lh"`, the hook measures the inner element's `lineHeight` via `getComputedStyle` and uses the resolved pixel value instead of the raw CSS unit. This prevents the outer element's line-height from leaking adjacent content past the clip boundary.
|
|
20
|
+
|
|
21
|
+
A `ResizeObserver` watches the inner element and re-measures on size changes, keeping `contentHeight` accurate.
|
|
22
|
+
|
|
23
|
+
## Usage Example
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
function CollapsibleText({ text }: { text: string }) {
|
|
27
|
+
const [expanded, setExpanded] = useState(false)
|
|
28
|
+
|
|
29
|
+
const { innerRef, containerStyle, isOverflowing } = useCollapsible({
|
|
30
|
+
expanded,
|
|
31
|
+
collapsedHeight: "1lh",
|
|
32
|
+
durationMs: 300,
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
return (
|
|
36
|
+
<div>
|
|
37
|
+
<div style={containerStyle}>
|
|
38
|
+
<div ref={innerRef}>{text}</div>
|
|
39
|
+
</div>
|
|
40
|
+
{isOverflowing && (
|
|
41
|
+
<button onClick={() => setExpanded(!expanded)}>
|
|
42
|
+
{expanded ? "Show less" : "Show more"}
|
|
43
|
+
</button>
|
|
44
|
+
)}
|
|
45
|
+
</div>
|
|
46
|
+
)
|
|
47
|
+
}
|
|
48
|
+
```
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
<!-- source-hash: 01d63c5d1bf9f446d2f4c5d33842b562 -->
|
|
2
|
+
Backward-compatibility shim that re-exports `useSseChatAdapter` under the legacy `useEmbeddedChat` name, preserving external consumer compatibility during the migration to the unified `useChat` API.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
| Export | Alias / Origin | Description |
|
|
7
|
+
|--------|---------------|-------------|
|
|
8
|
+
| `useEmbeddedChat` | `useSseChatAdapter` | Legacy hook name for the SSE/Guide-mode chat adapter |
|
|
9
|
+
| `UseEmbeddedChatOptions` | `UseSseChatAdapterOptions` | Legacy options type alias |
|
|
10
|
+
| `ChatSource` | `./use-sse-chat-adapter` | Chat source type |
|
|
11
|
+
| `DocChatMessage` | `./use-sse-chat-adapter` | Document chat message type |
|
|
12
|
+
| `DocSource` | `./use-sse-chat-adapter` | Document source type |
|
|
13
|
+
| `ChatTurnMeta` | `./use-sse-chat-adapter` | Chat turn metadata type |
|
|
14
|
+
| `StreamingPhase` | `./use-sse-chat-adapter` | Streaming phase enum/type |
|
|
15
|
+
|
|
16
|
+
## Usage Example
|
|
17
|
+
|
|
18
|
+
```typescript
|
|
19
|
+
// ⚠️ Legacy import — works but will be removed after migration
|
|
20
|
+
import { useEmbeddedChat, UseEmbeddedChatOptions } from './use-embedded-chat'
|
|
21
|
+
|
|
22
|
+
// ✅ Preferred — import directly from the canonical module
|
|
23
|
+
import { useSseChatAdapter } from './use-sse-chat-adapter'
|
|
24
|
+
|
|
25
|
+
// ✅ Future — use the unified entry point
|
|
26
|
+
import { useChat } from './use-chat'
|
|
27
|
+
const chat = useChat({ mode: 'sse' })
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Migration Notes
|
|
31
|
+
|
|
32
|
+
> **Deprecation notice:** Internal library code should import directly from `./use-sse-chat-adapter`. This shim will be removed once all consumers migrate to the unified `useChat({ mode })` entry point.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<!-- source-hash: dcf2e60dac262a108cfeb8aa720addd1 -->
|
|
2
|
+
Subscribes a React component to a NATS JetStream ephemeral ordered consumer for a specific chat dialog, managing connection lifecycle, reconnection backoff, and sequence-aware resumption.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
- **`useJetStreamDialogSubscription`** — Primary hook export. Manages a shared NATS WebSocket connection (ref-counted singleton) and an ephemeral JetStream `OrderedConsumer` scoped to `chat.{dialogId}.{topic}`.
|
|
7
|
+
- **`SharedConnection`** — Module-level singleton tracking the active NATS client, ref count, and deferred close/retry timers to avoid redundant reconnects across component instances.
|
|
8
|
+
- **`acquireClient`** — Increments the shared connection ref count (or creates a new client if the URL changed), cancelling any pending close timer.
|
|
9
|
+
- **`releaseClient`** — Decrements the ref count and schedules a deferred close (`SHARED_CLOSE_DELAY_MS`) when the last consumer releases the connection.
|
|
10
|
+
- **Connection effect** — Drives `connect()` / status-listener lifecycle; implements jittered exponential backoff with optional fast-retry leading attempts via `reconnectionBackoff`.
|
|
11
|
+
- **Subscription effect** — Recreates the ephemeral consumer on each `isConnected` transition, resuming from `highestStreamSeq + 1` to avoid replaying or skipping chunks.
|
|
12
|
+
|
|
13
|
+
## Usage Example
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
const { isConnected, isSubscribed, reconnectionCount, currentStreamSeq } =
|
|
17
|
+
useJetStreamDialogSubscription({
|
|
18
|
+
enabled: true,
|
|
19
|
+
dialogId: 'dialog-abc123',
|
|
20
|
+
topic: 'events',
|
|
21
|
+
optStartSeq: lastKnownSeq, // null → live-tail (DeliverPolicy.New)
|
|
22
|
+
getNatsWsUrl: () => 'wss://nats.example.com',
|
|
23
|
+
onEvent: (data) => console.log('chunk received', data),
|
|
24
|
+
onConnect: () => console.log('connected'),
|
|
25
|
+
onDisconnect: () => console.log('disconnected'),
|
|
26
|
+
reconnectionBackoff: {
|
|
27
|
+
fastRetries: 3,
|
|
28
|
+
fastRetryDelayMs: 200,
|
|
29
|
+
initialDelayMs: 500,
|
|
30
|
+
maxDelayMs: 30_000,
|
|
31
|
+
multiplier: 2,
|
|
32
|
+
},
|
|
33
|
+
inactiveThresholdMs: 5 * 60_000,
|
|
34
|
+
})
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Notes
|
|
38
|
+
|
|
39
|
+
- Protocol-level `-ERR` events (e.g. ACL violations) are logged as warnings but do **not** trigger reconnect, preventing auth-refresh loops.
|
|
40
|
+
- The shared connection singleton is module-scoped, so multiple hook instances sharing the same WebSocket URL reuse one NATS client.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
<!-- source-hash: 6c5780e92306ea381bac35aaf97c435f -->
|
|
2
|
+
Provides the NATS/Mingo-mode transport adapter for the unified chat surface, implementing the `UnifiedChatState` contract so the `useChat({ mode })` dispatcher can switch between NATS and SSE adapters without shell-side branching.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
### `UseNatsChatAdapterConfig`
|
|
7
|
+
Consumer-supplied configuration interface covering:
|
|
8
|
+
- `dialogId` — active conversation identifier
|
|
9
|
+
- `getNatsWsUrl` — factory returning the NATS WebSocket URL
|
|
10
|
+
- `publishUserMessage` — consumer-owned send callback (HTTP POST or NATS publish)
|
|
11
|
+
- `fetchChunks` — optional historical chunk fetcher for catchup
|
|
12
|
+
- `clientConfig` — optional NATS auth credentials
|
|
13
|
+
- `enableThinking` / `batchApprovalsEnabled` — processor feature flags
|
|
14
|
+
|
|
15
|
+
### `UseNatsChatAdapterOptions`
|
|
16
|
+
- `active` — gates the live subscription; keeps message state alive while the mode is hidden
|
|
17
|
+
|
|
18
|
+
### `useNatsChatAdapter(config, options)`
|
|
19
|
+
Main hook. Composes three internal hooks:
|
|
20
|
+
|
|
21
|
+
```text
|
|
22
|
+
useNatsDialogSubscription → live NATS event tail
|
|
23
|
+
↓
|
|
24
|
+
useRealtimeChunkProcessor → chunk → MessageSegment[]
|
|
25
|
+
↓
|
|
26
|
+
useChunkCatchup → back-fills missed chunks on reconnect/activation
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Returns a full `UnifiedChatState` object including `messages`, `isLoading`, `streamingPhase`, `sendMessage`, `stopMessage`, and `clearMessages`.
|
|
30
|
+
|
|
31
|
+
## Usage Example
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
const chatState = useNatsChatAdapter(
|
|
35
|
+
{
|
|
36
|
+
dialogId: 'dialog-abc123',
|
|
37
|
+
getNatsWsUrl: () => `wss://nats.example.com`,
|
|
38
|
+
publishUserMessage: async (text, { dialogId }) => {
|
|
39
|
+
await fetch('/api/chat', {
|
|
40
|
+
method: 'POST',
|
|
41
|
+
body: JSON.stringify({ text, dialogId }),
|
|
42
|
+
})
|
|
43
|
+
},
|
|
44
|
+
fetchChunks: ({ dialogId, after }) =>
|
|
45
|
+
fetch(`/api/chunks?dialogId=${dialogId}&after=${after}`).then(r => r.json()),
|
|
46
|
+
batchApprovalsEnabled: true,
|
|
47
|
+
},
|
|
48
|
+
{ active: isNatsModeVisible },
|
|
49
|
+
)
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
> **Note:** `publishUserMessage` is intentionally consumer-owned — the adapter only handles optimistic UI updates and phase transitions; the actual transport is wired externally.
|
|
@@ -1,46 +1,65 @@
|
|
|
1
|
-
<!-- source-hash:
|
|
2
|
-
|
|
1
|
+
<!-- source-hash: 9e073aef3e517df1b4ab46b93212f4cb -->
|
|
2
|
+
Provides a React hook for managing NATS WebSocket dialog subscriptions with shared connection pooling, automatic reconnection with exponential backoff, and multi-topic support.
|
|
3
3
|
|
|
4
4
|
## Key Components
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
### `useNatsDialogSubscription(options)`
|
|
7
|
+
The primary exported hook that manages the full lifecycle of a NATS dialog subscription.
|
|
8
|
+
|
|
9
|
+
**Parameters (`UseNatsDialogSubscriptionOptions`):**
|
|
10
|
+
|
|
11
|
+
| Option | Description |
|
|
12
|
+
|--------|-------------|
|
|
13
|
+
| `enabled` | Toggles the connection/subscription on or off |
|
|
14
|
+
| `dialogId` | The dialog ID to subscribe to (e.g., `chat.<dialogId>.<topic>`) |
|
|
15
|
+
| `topics` | Array of `NatsMessageType` values to subscribe to (default: `['message']`) |
|
|
16
|
+
| `onEvent` | Callback fired when a NATS message is received |
|
|
17
|
+
| `onConnect` / `onDisconnect` | Lifecycle callbacks for connection state changes |
|
|
18
|
+
| `onSubscribed` | Fired when subscriptions are successfully established |
|
|
19
|
+
| `onBeforeReconnect` | Async hook called before each reconnection attempt (e.g., token refresh) |
|
|
20
|
+
| `getNatsWsUrl` | Factory function returning the WebSocket URL |
|
|
21
|
+
| `clientConfig` | Optional NATS client config overrides (`name`, `user`, `pass`) |
|
|
22
|
+
| `reconnectionBackoff` | Configures retry delays: `fastRetries`, `initialDelayMs`, `maxDelayMs`, `multiplier` |
|
|
23
|
+
|
|
24
|
+
**Returns (`UseNatsDialogSubscriptionReturn`):** `{ isConnected, isSubscribed, reconnectionCount }`
|
|
25
|
+
|
|
26
|
+
### `SharedConnection` (module-level singleton)
|
|
27
|
+
A module-scoped singleton that reference-counts active consumers sharing the same WebSocket URL, with a deferred close delay (`SHARED_CLOSE_DELAY_MS`) to avoid reconnect churn during component remounts.
|
|
10
28
|
|
|
11
29
|
## Usage Example
|
|
12
30
|
|
|
13
31
|
```typescript
|
|
14
|
-
import { useNatsDialogSubscription
|
|
32
|
+
import { useNatsDialogSubscription } from './use-nats-dialog-subscription'
|
|
15
33
|
|
|
16
|
-
function
|
|
17
|
-
const { isConnected, isSubscribed } = useNatsDialogSubscription({
|
|
18
|
-
enabled:
|
|
34
|
+
function DialogListener({ dialogId }: { dialogId: string }) {
|
|
35
|
+
const { isConnected, isSubscribed, reconnectionCount } = useNatsDialogSubscription({
|
|
36
|
+
enabled: true,
|
|
19
37
|
dialogId,
|
|
20
38
|
topics: ['message', 'admin-message'],
|
|
21
|
-
getNatsWsUrl: () =>
|
|
22
|
-
|
|
23
|
-
{
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
39
|
+
getNatsWsUrl: () => 'ws://nats.example.com:4223',
|
|
40
|
+
onEvent: (event, messageType) => {
|
|
41
|
+
console.log(`[${messageType}]`, event)
|
|
42
|
+
},
|
|
43
|
+
onConnect: () => console.log('NATS connected'),
|
|
44
|
+
onDisconnect: () => console.log('NATS disconnected'),
|
|
45
|
+
onBeforeReconnect: async () => {
|
|
46
|
+
await refreshAuthToken() // e.g., refresh JWT before retry
|
|
47
|
+
},
|
|
48
|
+
reconnectionBackoff: {
|
|
49
|
+
fastRetries: 3,
|
|
50
|
+
fastRetryDelayMs: 500,
|
|
51
|
+
initialDelayMs: 1000,
|
|
52
|
+
maxDelayMs: 30000,
|
|
53
|
+
multiplier: 2,
|
|
27
54
|
},
|
|
28
|
-
onConnect: () => console.log('Connected to NATS'),
|
|
29
|
-
onDisconnect: () => console.log('Disconnected from NATS'),
|
|
30
|
-
clientConfig: {
|
|
31
|
-
name: 'my-app',
|
|
32
|
-
user: 'client',
|
|
33
|
-
pass: 'secret'
|
|
34
|
-
}
|
|
35
55
|
})
|
|
36
56
|
|
|
37
|
-
return
|
|
38
|
-
<div>
|
|
39
|
-
Status: {isConnected ? 'Connected' : 'Disconnected'}
|
|
40
|
-
Subscribed: {isSubscribed ? 'Yes' : 'No'}
|
|
41
|
-
</div>
|
|
42
|
-
)
|
|
57
|
+
return <div>Connected: {isConnected ? 'Yes' : 'No'} | Reconnects: {reconnectionCount}</div>
|
|
43
58
|
}
|
|
44
59
|
```
|
|
45
60
|
|
|
46
|
-
|
|
61
|
+
## Notes
|
|
62
|
+
|
|
63
|
+
- Reconnection uses **jittered exponential backoff** (`delay * (0.5 + random * 0.5)`) to avoid thundering herd scenarios.
|
|
64
|
+
- Callbacks (`onEvent`, `onConnect`, etc.) are stored in stable refs, so they never trigger reconnection when their identity changes.
|
|
65
|
+
- The shared connection is scoped per WebSocket URL — switching URLs tears down the old connection before establishing a new one.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<!-- source-hash: cc0502db44c43b65b6de8507cd22cc50 -->
|
|
2
|
+
A React hook that wraps `getProxiedImageUrl` by reading proxy configuration (`proxyPrefix` and `skipDomains`) from the ambient `ChatRuntimeContext`, eliminating the need to manually pass proxy config at each call site.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
### `useProxiedImageUrl(url)`
|
|
7
|
+
- **Input:** `string | null | undefined` — the image URL to potentially proxy
|
|
8
|
+
- **Output:** `string` — the proxied URL, or `''` for null/undefined input
|
|
9
|
+
- **Behavior:** Always passes `directHttps: true`, meaning HTTPS URLs are returned as-is. For cases requiring proxied HTTPS URLs, use `getProxiedImageUrl` from `@flamingo-stack/openframe-frontend-core/utils` directly with hardcoded config.
|
|
10
|
+
|
|
11
|
+
## Usage Example
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
// ✅ Standard usage — inside a component rendered within ChatRuntimeContext.Provider
|
|
15
|
+
function AvatarImage({ imageUrl }: { imageUrl: string }) {
|
|
16
|
+
const proxiedUrl = useProxiedImageUrl(imageUrl)
|
|
17
|
+
return <img src={proxiedUrl} alt="avatar" />
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// ✅ Handles null/undefined gracefully
|
|
21
|
+
function OptionalImage({ imageUrl }: { imageUrl?: string | null }) {
|
|
22
|
+
const proxiedUrl = useProxiedImageUrl(imageUrl) // returns '' if nullish
|
|
23
|
+
return proxiedUrl ? <img src={proxiedUrl} alt="preview" /> : null
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// ❌ Never call inside a loop — violates Rules of Hooks
|
|
27
|
+
items.map(item => useProxiedImageUrl(item.url)) // WRONG
|
|
28
|
+
|
|
29
|
+
// ✅ For map/loop patterns, use the pure utility instead
|
|
30
|
+
import { getProxiedImageUrl } from '@flamingo-stack/openframe-frontend-core/utils'
|
|
31
|
+
items.map(item => getProxiedImageUrl(item.url, { proxyPrefix, skipDomains }))
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Constraints
|
|
35
|
+
|
|
36
|
+
| Constraint | Detail |
|
|
37
|
+
|---|---|
|
|
38
|
+
| Must be inside `ChatRuntimeContext.Provider` | Uses `useRequiredChatRuntime()` — throws if context is missing |
|
|
39
|
+
| `directHttps: true` always set | HTTPS URLs bypass the proxy; use pure util to override |
|
|
40
|
+
| Top-level call only | Standard Rules of Hooks apply — no loops or conditionals |
|
|
@@ -1,47 +1,50 @@
|
|
|
1
|
-
<!-- source-hash:
|
|
2
|
-
|
|
1
|
+
<!-- source-hash: e37a3772ece6c09122bfe5d89ce800e0 -->
|
|
2
|
+
Real-time NATS streaming chunk processor hook that converts raw streaming messages into typed message segments, managing stream state, tool execution, and approval workflows.
|
|
3
3
|
|
|
4
4
|
## Key Components
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
| Export | Type | Description |
|
|
7
|
+
|--------|------|-------------|
|
|
8
|
+
| `useRealtimeChunkProcessor` | Hook | Primary hook for processing NATS stream chunks into UI-ready message segments |
|
|
9
|
+
| `accumulatorRef` | Internal Ref | Holds a `MessageSegmentAccumulator` instance that tracks and builds segments across chunk events |
|
|
10
|
+
| `isInStreamRef` | Internal Ref | Tracks whether a `MESSAGE_START`/`MESSAGE_END` boundary is active |
|
|
11
|
+
| `hasEverStreamedRef` | Internal Ref | Distinguishes cold-start vs. resumed-dialog continuation mode |
|
|
12
|
+
| `pendingEscalatedRef` | Internal Ref | Tracks escalated (non-display) approval requests awaiting results |
|
|
13
|
+
|
|
14
|
+
### Handled Chunk Actions
|
|
15
|
+
|
|
16
|
+
| Action | Behavior |
|
|
17
|
+
|--------|----------|
|
|
18
|
+
| `message_start` / `message_end` | Opens/closes stream window, resets segment accumulator |
|
|
19
|
+
| `text` / `thinking` | Appends to accumulator; uses append mode post-stream |
|
|
20
|
+
| `tool_execution` | Routes to accumulator in-stream, or `onToolExecuted` post-stream |
|
|
21
|
+
| `approval_request` | Renders inline or escalates based on `displayApprovalTypes` |
|
|
22
|
+
| `approval_batch` | Renders batch card or unfolds into legacy cards if `batchApprovalsEnabled = false` |
|
|
23
|
+
| `approval_result` | Resolves escalated or inline approvals, updates accumulator status |
|
|
24
|
+
| `error` | Parses error detail and emits error segment |
|
|
11
25
|
|
|
12
26
|
## Usage Example
|
|
13
27
|
|
|
14
28
|
```typescript
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}, [processor])
|
|
38
|
-
|
|
39
|
-
return (
|
|
40
|
-
<div>
|
|
41
|
-
{processor.getSegments().map(segment =>
|
|
42
|
-
<MessageSegment key={segment.id} segment={segment} />
|
|
43
|
-
)}
|
|
44
|
-
</div>
|
|
45
|
-
)
|
|
46
|
-
}
|
|
47
|
-
```
|
|
29
|
+
const { processChunk } = useRealtimeChunkProcessor({
|
|
30
|
+
callbacks: {
|
|
31
|
+
onSegmentsUpdate: (segments, opts) => updateMessage(segments, opts),
|
|
32
|
+
onStreamStart: () => setStreaming(true),
|
|
33
|
+
onStreamEnd: () => setStreaming(false),
|
|
34
|
+
onApprove: (requestId) => approveToolCall(requestId),
|
|
35
|
+
onReject: (requestId) => rejectToolCall(requestId),
|
|
36
|
+
onEscalatedApproval: (requestId, data) => notifyTechnician(requestId, data),
|
|
37
|
+
onApprovalResolved: (requestId, status) => syncStatus(requestId, status),
|
|
38
|
+
onError: (error) => console.error(error),
|
|
39
|
+
},
|
|
40
|
+
displayApprovalTypes: ['CLIENT'],
|
|
41
|
+
approvalStatuses: { 'req-123': 'pending' },
|
|
42
|
+
enableThinking: false,
|
|
43
|
+
batchApprovalsEnabled: true,
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
// Feed raw NATS chunks directly
|
|
47
|
+
natsSubscription.on('message', (msg) => processChunk(msg.data))
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
> **Note:** `batchApprovalsEnabled` defaults to `true`. Pass `false` to fall back to legacy per-call approval cards. Consumers using `onApprovalResolved` should omit `onSegmentsUpdate` handling for approval results to avoid bubble overwrites during status flips.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
<!-- source-hash: 433665c60d11f92235ffb1f5227d3b44 -->
|
|
2
|
+
Debounced React hook and stateless fetch helper for slash-command autocomplete suggestions in the OpenFrame chat interface.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
| Export | Type | Description |
|
|
7
|
+
|--------|------|-------------|
|
|
8
|
+
| `fetchSlashCommands` | `async function` | Stateless fetch wrapper; resolves suggestions from a caller-supplied `commandsUrl`, returns empty array on any non-2xx response |
|
|
9
|
+
| `useSlashCommands` | React hook | Debounced (150ms), cancellable hook returning `{ commands, loading }` |
|
|
10
|
+
| `SlashCommandSummary` | Re-exported type | Canonical summary shape for a slash command |
|
|
11
|
+
| `SlashCommandSummaryAction` | Re-exported type | Action payload within a summary |
|
|
12
|
+
| `SlashCommandActionId` | Re-exported type | Identifier type for actions |
|
|
13
|
+
|
|
14
|
+
## Usage Example
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
import {
|
|
18
|
+
useSlashCommands,
|
|
19
|
+
fetchSlashCommands,
|
|
20
|
+
} from "@flamingo-stack/openframe-frontend-core/components/chat/hooks";
|
|
21
|
+
import { useChatRuntime } from "./chat-runtime";
|
|
22
|
+
|
|
23
|
+
// Hook usage (preferred in React components)
|
|
24
|
+
function SlashCommandDropdown({ prefix }: { prefix: string | null }) {
|
|
25
|
+
const { endpoints } = useChatRuntime();
|
|
26
|
+
const { commands, loading } = useSlashCommands(prefix, endpoints.commandsUrl);
|
|
27
|
+
|
|
28
|
+
if (loading) return <Spinner />;
|
|
29
|
+
return <CommandList items={commands} />;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Stateless usage (e.g. outside React, in a server action test)
|
|
33
|
+
const ctrl = new AbortController();
|
|
34
|
+
const suggestions = await fetchSlashCommands(
|
|
35
|
+
"res",
|
|
36
|
+
ctrl.signal,
|
|
37
|
+
"/api/mingo-guide/commands",
|
|
38
|
+
);
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Notes
|
|
42
|
+
|
|
43
|
+
- `commandsUrl` has **no default** — always supply via `useChatRuntime().endpoints.commandsUrl`
|
|
44
|
+
- URL resolution uses `new URL(commandsUrl, window.location.origin)`, supporting both relative and absolute URLs
|
|
45
|
+
- Non-2xx responses (401, 403, 429) return `[]` silently — no error toasts
|
|
46
|
+
- `AbortError` on unmount/dependency change is swallowed; other errors emit a `console.warn`
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<!-- source-hash: c000c5cabcd81a500ce236944b8c4464 -->
|
|
2
|
+
Provides the SSE/Guide-mode transport adapter for the unified chat surface, implementing `UnifiedChatState` by consuming server-sent events from the chat stream endpoint and mapping them into structured `DocChatMessage` segments, sources, refs, and per-turn metadata.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
| Export | Type | Description |
|
|
7
|
+
|--------|------|-------------|
|
|
8
|
+
| `useSseChatAdapter` | Hook | Primary hook — reads `source` from runtime context, manages SSE stream lifecycle, slash commands, and turn metadata |
|
|
9
|
+
| `DocChatMessage` | Interface | Full message shape including `segments`, `sources`, `chatRefs`, and `scrollAnchor` |
|
|
10
|
+
| `ChatSource` | Interface | Per-citation source descriptor with support for single-row and grouped chips |
|
|
11
|
+
| `ChatTurnMeta` | Interface | Per-turn LLM metadata (provider, token counts, cache hit rate, routing decision) |
|
|
12
|
+
| `UseSseChatAdapterOptions` | Interface | DI options — primarily `tableIdForDocumentType` override for non-standard RAG table configs |
|
|
13
|
+
| `StreamingPhase` | Type (re-export) | Streaming lifecycle phase, re-exported from `unified-chat-state.types` for backward compatibility |
|
|
14
|
+
| `createDocStreamFn` | Internal factory | Builds the per-call async generator that POSTs to the SSE endpoint and yields `MessageSegment` chunks |
|
|
15
|
+
|
|
16
|
+
## Usage Example
|
|
17
|
+
|
|
18
|
+
```typescript
|
|
19
|
+
import { useSseChatAdapter } from './use-sse-chat-adapter'
|
|
20
|
+
|
|
21
|
+
// Basic — tableIdForDocumentType defaults to the lib-baked map
|
|
22
|
+
const chatState = useSseChatAdapter()
|
|
23
|
+
|
|
24
|
+
// With custom document type registry (per-tenant override)
|
|
25
|
+
const chatState = useSseChatAdapter({
|
|
26
|
+
tableIdForDocumentType: (docType) =>
|
|
27
|
+
myTenantRegistry[docType] ?? null,
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
// Consume the returned UnifiedChatState
|
|
31
|
+
const { messages, sendMessage, isStreaming, streamingPhase } = chatState
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
> **Note:** `source` is read automatically from `ChatRuntimeContext` — no parameter needed. If `runtime.source` is empty the hook throws immediately to surface misconfigured embedders early.
|