@flamingo-stack/openframe-frontend-core 0.0.213 → 0.0.214-snapshot.20260528192313
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-35XIT2CF.cjs → chunk-2G3NXF6J.cjs} +17 -17
- package/dist/{chunk-35XIT2CF.cjs.map → chunk-2G3NXF6J.cjs.map} +1 -1
- package/dist/{chunk-IK2X5YJU.js → chunk-7PCP7YQR.js} +2 -2
- package/dist/{chunk-ZDF6F7ED.cjs → chunk-D4MNFY67.cjs} +4 -3
- package/dist/chunk-D4MNFY67.cjs.map +1 -0
- package/dist/{chunk-OTKJASSX.cjs → chunk-NGFP4RVL.cjs} +24 -24
- package/dist/{chunk-OTKJASSX.cjs.map → chunk-NGFP4RVL.cjs.map} +1 -1
- package/dist/{chunk-3JWIJJ44.js → chunk-R6MLPU4A.js} +2 -2
- package/dist/{chunk-ZTJVRSN5.js → chunk-WQZP3JIZ.js} +4 -3
- package/dist/chunk-WQZP3JIZ.js.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/platform/ShellTypeBadge.tsx +2 -2
- 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-IK2X5YJU.js.map → chunk-7PCP7YQR.js.map} +0 -0
- /package/dist/{chunk-3JWIJJ44.js.map → chunk-R6MLPU4A.js.map} +0 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
<!-- source-hash: 84402bbfdf1a37e83bafc681331451ac -->
|
|
2
|
+
Resolves ClickUp `custom_item_id` numeric values to human-readable label strings for use in chat-inline cards and activity feeds.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
- **`CUSTOM_ITEM_ID`** — Const enum-style object mapping 14 ClickUp standard task type names to their numeric IDs (`1000`–`1014`).
|
|
7
|
+
- **`getTaskTypeLabel(customItemId)`** — Returns a display string for a given `custom_item_id`, or `null` for unknown IDs so callers can fall back to a generic label.
|
|
8
|
+
|
|
9
|
+
## Usage Example
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
import { getTaskTypeLabel, CUSTOM_ITEM_ID } from './clickup-task-type-utils'
|
|
13
|
+
|
|
14
|
+
// Resolve a raw ID from a ClickUp task payload
|
|
15
|
+
const label = getTaskTypeLabel(task.custom_item_id) ?? 'Task'
|
|
16
|
+
console.log(label) // e.g. "Bug", "Epic", "Milestone"
|
|
17
|
+
|
|
18
|
+
// Use the constant directly when constructing queries or comparisons
|
|
19
|
+
if (task.custom_item_id === CUSTOM_ITEM_ID.EPIC) {
|
|
20
|
+
// handle epic-specific logic
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// null and undefined both resolve gracefully
|
|
24
|
+
getTaskTypeLabel(null) // → null (fall back to "Task")
|
|
25
|
+
getTaskTypeLabel(undefined) // → null
|
|
26
|
+
getTaskTypeLabel(9999) // → null (unknown ID)
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## ID Reference
|
|
30
|
+
|
|
31
|
+
| Constant | ID | Label |
|
|
32
|
+
|---|---|---|
|
|
33
|
+
| `TASK` | 1000 | Task |
|
|
34
|
+
| `MILESTONE` | 1001 | Milestone |
|
|
35
|
+
| `RECURRING` | 1002 | Recurring |
|
|
36
|
+
| `SUBTASK` | 1003 | Subtask |
|
|
37
|
+
| `FORM` | 1004 | Form |
|
|
38
|
+
| `PLAN` | 1006 | Plan |
|
|
39
|
+
| `STRATEGY` | 1007 | Strategy |
|
|
40
|
+
| `BUG` | 1008 | Bug |
|
|
41
|
+
| `REQUEST` | 1009 | Request |
|
|
42
|
+
| `FEATURE` | 1010 | Feature |
|
|
43
|
+
| `STORY` | 1011 | Story |
|
|
44
|
+
| `EPIC` | 1012 | Epic |
|
|
45
|
+
| `COMPONENT` | 1013 | Component |
|
|
46
|
+
| `INITIATIVE` | 1014 | Initiative |
|
|
47
|
+
|
|
48
|
+
> `null` input and unrecognized IDs both return `null` — callers should default to `"Task"` as the fallback affordance.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
<!-- source-hash: 727163d193b2d1e3e47ea92637add9ea -->
|
|
2
|
+
Single source of truth for compact card Tailwind class constants and URL safety utilities used across chat-inline `size='sm'` card frames in the OpenFrame chat shell.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
### Class Constants
|
|
7
|
+
|
|
8
|
+
| Export | Purpose |
|
|
9
|
+
|--------|---------|
|
|
10
|
+
| `COMPACT_CARD_OUTER` | Interactive anchor wrap with hover/transition styles |
|
|
11
|
+
| `COMPACT_CARD_OUTER_STATIC` | Non-interactive span wrap (no hover, `cursor-default`) |
|
|
12
|
+
| `COMPACT_CARD_SKELETON_OUTER` | Animated pulse skeleton frame |
|
|
13
|
+
| `COMPACT_CARD_IMAGE_SLOT` | 56×56 cover image container |
|
|
14
|
+
| `COMPACT_CARD_ICON_SLOT` | 56×56 fallback icon container |
|
|
15
|
+
| `COMPACT_CARD_SKELETON_IMAGE_SLOT` | 56×56 skeleton image placeholder |
|
|
16
|
+
| `COMPACT_CARD_TEXT_COL` | Flex column wrapper for text content |
|
|
17
|
+
| `COMPACT_CARD_TITLE_ROW` | Fixed 20px height title row |
|
|
18
|
+
| `COMPACT_CARD_META_ROW_BOX` | Fixed 16px height subtitle row |
|
|
19
|
+
| `COMPACT_CARD_TITLE` | Bold 14px/20px primary text |
|
|
20
|
+
| `COMPACT_CARD_SUBTITLE` | 11px/16px secondary text |
|
|
21
|
+
| `COMPACT_CARD_SUMMARY` | 11px/16px secondary text at 80% opacity |
|
|
22
|
+
| `COMPACT_CARD_META_ROW` | Multi-part 11px metadata row |
|
|
23
|
+
| `COMPACT_CARD_ROW_FILLER` | Non-breaking space to preserve row height |
|
|
24
|
+
|
|
25
|
+
### Functions
|
|
26
|
+
|
|
27
|
+
**`safeHref(url)`** — Validates a URL before use in an `<a href>`. Allows `http:`, `https:`, `mailto:`, and same-origin paths (`/path`). Strips control/zero-width characters. Returns the original string or `null`.
|
|
28
|
+
|
|
29
|
+
## Usage Example
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
import {
|
|
33
|
+
COMPACT_CARD_OUTER,
|
|
34
|
+
COMPACT_CARD_OUTER_STATIC,
|
|
35
|
+
COMPACT_CARD_IMAGE_SLOT,
|
|
36
|
+
COMPACT_CARD_TITLE,
|
|
37
|
+
COMPACT_CARD_SUBTITLE,
|
|
38
|
+
safeHref,
|
|
39
|
+
} from './compact-card-classes'
|
|
40
|
+
|
|
41
|
+
const href = safeHref(card.url)
|
|
42
|
+
|
|
43
|
+
// Interactive card (valid href)
|
|
44
|
+
if (href) {
|
|
45
|
+
return (
|
|
46
|
+
<a href={href} className={COMPACT_CARD_OUTER}>
|
|
47
|
+
<div className={COMPACT_CARD_IMAGE_SLOT}>...</div>
|
|
48
|
+
<span className={COMPACT_CARD_TITLE}>{card.title}</span>
|
|
49
|
+
<span className={COMPACT_CARD_SUBTITLE}>{card.subtitle}</span>
|
|
50
|
+
</a>
|
|
51
|
+
)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Non-interactive fallback
|
|
55
|
+
return (
|
|
56
|
+
<span className={COMPACT_CARD_OUTER_STATIC}>
|
|
57
|
+
...
|
|
58
|
+
</span>
|
|
59
|
+
)
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
> Card-specific variations (play overlays, status badges, pill counters) are added inside each card component. The outer frame constants remain uniform across all compact card types.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
<!-- source-hash: f8a0a33feba94cc42bfec8295a8e57f2 -->
|
|
2
|
+
Determines whether a navigation action should open in a new browser tab, using a prioritized rule chain to handle embed mode, explicit overrides, platform comparisons, and cross-origin fallbacks.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
### Types
|
|
7
|
+
- **`NavSurface`** — Labels the calling surface (`'useNavLink'` | `'useUnifiedNav'`) for trace logging
|
|
8
|
+
- **`RuntimeMode`** — Chat runtime context (`'host'` | `'embed'`)
|
|
9
|
+
- **`DecideNewTabInput`** — Input shape for the decision function
|
|
10
|
+
|
|
11
|
+
### Function
|
|
12
|
+
- **`decideNewTab(input: DecideNewTabInput): boolean`** — Returns `true` if navigation should open a new tab
|
|
13
|
+
|
|
14
|
+
## Branch Priority
|
|
15
|
+
|
|
16
|
+
| Priority | Condition | Result |
|
|
17
|
+
|----------|-----------|--------|
|
|
18
|
+
| 1 | `runtimeMode === 'embed'` | Always new tab |
|
|
19
|
+
| 2 | `openIn === 'new-tab'` | New tab |
|
|
20
|
+
| 3 | `alwaysNewTab === true` | New tab |
|
|
21
|
+
| 4 | `openIn === 'same-tab'` | Same tab |
|
|
22
|
+
| 5 | `targetPlatform` defined + `currentSource` non-empty | New tab if platforms differ |
|
|
23
|
+
| 6 | Fallback: `isCrossOriginUrl(href)` | New tab if cross-origin |
|
|
24
|
+
|
|
25
|
+
## Usage Example
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
import { decideNewTab } from './decide-new-tab'
|
|
29
|
+
|
|
30
|
+
// Embed mode — always opens new tab regardless of other options
|
|
31
|
+
decideNewTab({
|
|
32
|
+
href: '/dashboard',
|
|
33
|
+
currentSource: 'flamingo',
|
|
34
|
+
runtimeMode: 'embed',
|
|
35
|
+
}) // → true
|
|
36
|
+
|
|
37
|
+
// Platform comparison — cross-app link
|
|
38
|
+
decideNewTab({
|
|
39
|
+
href: '/tickets',
|
|
40
|
+
targetPlatform: 'openframe',
|
|
41
|
+
currentSource: 'flamingo',
|
|
42
|
+
}) // → true (different platforms)
|
|
43
|
+
|
|
44
|
+
// Explicit override
|
|
45
|
+
decideNewTab({
|
|
46
|
+
href: '/settings',
|
|
47
|
+
openIn: 'same-tab',
|
|
48
|
+
currentSource: 'flamingo',
|
|
49
|
+
runtimeMode: 'host',
|
|
50
|
+
}) // → false
|
|
51
|
+
```
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
<!-- source-hash: 20391ac02d557100140a6d8d11a61656 -->
|
|
2
|
+
Builds and exports URL helpers for third-party app deep-links used across chat surfaces (chip clicks, inline-card tracking rows).
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
| Export | Type | Description |
|
|
7
|
+
|--------|------|-------------|
|
|
8
|
+
| `clickupTaskUrl` | `function` | Generates a ClickUp task detail URL from an external task ID |
|
|
9
|
+
|
|
10
|
+
## Usage Example
|
|
11
|
+
|
|
12
|
+
```typescript
|
|
13
|
+
import { clickupTaskUrl } from './external-app-urls'
|
|
14
|
+
|
|
15
|
+
// Valid external ID → returns full URL
|
|
16
|
+
clickupTaskUrl('abc123')
|
|
17
|
+
// → "https://app.clickup.com/t/abc123"
|
|
18
|
+
|
|
19
|
+
// Missing or nullish ID → returns null (prevents broken `.../t/undefined` links)
|
|
20
|
+
clickupTaskUrl(null) // → null
|
|
21
|
+
clickupTaskUrl(undefined) // → null
|
|
22
|
+
clickupTaskUrl('') // → null
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Notes
|
|
26
|
+
|
|
27
|
+
- This is the **lib-side subset** of the hub's `external-app-urls.ts` — only helpers consumed by shared/chat surfaces live here.
|
|
28
|
+
- HubSpot and admin route builders remain hub-side as they are only used by hub-internal mappers.
|
|
29
|
+
- Null-safe by design: always check the return value before rendering a link.
|
|
@@ -1,48 +1,44 @@
|
|
|
1
|
-
<!-- source-hash:
|
|
2
|
-
|
|
1
|
+
<!-- source-hash: 05b4580f6cd1fa50abcf196198e4487a -->
|
|
2
|
+
Extracts incomplete message state from the last historical assistant message to enable resumption of in-progress AI responses across realtime connection restarts.
|
|
3
3
|
|
|
4
4
|
## Key Components
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
### `extractIncompleteMessageState(lastMessage)`
|
|
7
|
+
|
|
8
|
+
**Parameters:** `lastMessage: ProcessedMessage | undefined`
|
|
9
|
+
|
|
10
|
+
**Returns:** `{ existingSegments?, pendingApprovals?, executingTools? } | undefined`
|
|
11
|
+
|
|
12
|
+
Returns `undefined` if the message is complete or not an assistant message with structured segments. Otherwise returns state needed to reinitialize the realtime chunk processor.
|
|
13
|
+
|
|
14
|
+
**Incomplete state detection by segment type:**
|
|
15
|
+
|
|
16
|
+
| Segment Type | Condition Flagged Incomplete |
|
|
17
|
+
|---|---|
|
|
18
|
+
| `tool_execution` | Status is `EXECUTING_TOOL` |
|
|
19
|
+
| `approval_request` | Status is `pending` with a `requestId` |
|
|
20
|
+
| `approval_batch` | Not `rejected` AND not all tool calls have `done` executions |
|
|
21
|
+
| `context_compaction` | Status is `started` |
|
|
7
22
|
|
|
8
23
|
## Usage Example
|
|
9
24
|
|
|
10
25
|
```typescript
|
|
11
26
|
import { extractIncompleteMessageState } from './extract-incomplete-message-state'
|
|
12
|
-
import type { ProcessedMessage } from '../types'
|
|
13
|
-
|
|
14
|
-
// Extract state from the last assistant message
|
|
15
|
-
const lastMessage: ProcessedMessage = {
|
|
16
|
-
role: 'assistant',
|
|
17
|
-
content: [
|
|
18
|
-
{ type: 'text', content: 'Starting deployment...' },
|
|
19
|
-
{
|
|
20
|
-
type: 'tool_execution',
|
|
21
|
-
data: {
|
|
22
|
-
type: 'EXECUTING_TOOL',
|
|
23
|
-
integratedToolType: 'kubernetes',
|
|
24
|
-
toolFunction: 'deployApp',
|
|
25
|
-
parameters: { namespace: 'prod' }
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
]
|
|
29
|
-
}
|
|
30
27
|
|
|
28
|
+
const lastMessage = conversationHistory.at(-1)
|
|
31
29
|
const incompleteState = extractIncompleteMessageState(lastMessage)
|
|
32
30
|
|
|
33
31
|
if (incompleteState) {
|
|
34
|
-
console.log('Found incomplete message with:')
|
|
35
|
-
console.log('- Existing segments:', incompleteState.existingSegments?.length)
|
|
36
|
-
console.log('- Executing tools:', incompleteState.executingTools?.size)
|
|
37
|
-
console.log('- Pending approvals:', incompleteState.pendingApprovals?.size)
|
|
38
|
-
|
|
39
|
-
// Initialize realtime processor with existing state
|
|
40
32
|
realtimeProcessor.initialize({
|
|
41
33
|
existingSegments: incompleteState.existingSegments,
|
|
42
34
|
pendingApprovals: incompleteState.pendingApprovals,
|
|
43
|
-
executingTools: incompleteState.executingTools
|
|
35
|
+
executingTools: incompleteState.executingTools,
|
|
44
36
|
})
|
|
45
37
|
}
|
|
46
38
|
```
|
|
47
39
|
|
|
48
|
-
|
|
40
|
+
## Notes
|
|
41
|
+
|
|
42
|
+
- Only processes assistant messages with structured (`MessageSegment[]`) content — string content is ignored
|
|
43
|
+
- `pendingApprovals` and `executingTools` maps are omitted from the return value when empty, reducing unnecessary initialization overhead
|
|
44
|
+
- The `approval_batch` logic ensures post-approval `EXECUTED_TOOL` chunks can correctly merge into the batch segment via `applyExecutionToBatch`
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<!-- source-hash: df5859607a7e41cd7507f9527aeed74b -->
|
|
2
|
+
Coerces a chat message's `content` field — either a plain string or a `MessageSegment[]` array — into a flat string suitable for wire transport to the LLM.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
- **`flattenAssistantContent(raw: unknown): string`** — Single exported function that normalizes assistant message content before serialization. Handles three cases:
|
|
7
|
+
- Plain strings are returned as-is
|
|
8
|
+
- Arrays are filtered to `text`-typed segments, joining their `.text` fields with `\n\n`
|
|
9
|
+
- Null, undefined, or unknown shapes return `''`
|
|
10
|
+
|
|
11
|
+
## Why This Exists
|
|
12
|
+
|
|
13
|
+
When `useChat` streams SSE responses, assistant messages are stored in React state as structured `MessageSegment[]` arrays (text, approval cards, tool executions, thinking blocks). A naive empty-string fallback for non-strings silently drops all context on subsequent turns — Anthropic receives `assistant: ""` and loses conversation history. This function preserves the LLM-visible text while intentionally skipping non-text segments (`approval_request`, `tool_execution`, `thinking`) to avoid bloating the request body.
|
|
14
|
+
|
|
15
|
+
## Usage Example
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
import { flattenAssistantContent } from './flatten-assistant-content'
|
|
19
|
+
|
|
20
|
+
// Plain string — returned as-is
|
|
21
|
+
flattenAssistantContent("Hello world") // → "Hello world"
|
|
22
|
+
|
|
23
|
+
// Structured segment array — text segments joined
|
|
24
|
+
flattenAssistantContent([
|
|
25
|
+
{ type: 'thinking', content: '...' }, // skipped
|
|
26
|
+
{ type: 'text', text: 'Here is my answer.' }, // included
|
|
27
|
+
{ type: 'tool_execution', id: 'tu_1' }, // skipped
|
|
28
|
+
{ type: 'text', text: 'And a follow-up.' }, // included
|
|
29
|
+
])
|
|
30
|
+
// → "Here is my answer.\n\nAnd a follow-up."
|
|
31
|
+
|
|
32
|
+
// Null / unknown — safe fallback
|
|
33
|
+
flattenAssistantContent(null) // → ""
|
|
34
|
+
```
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
<!-- source-hash: d7e38b48af56d6db68e8de321044b39c -->
|
|
2
|
+
Single source of truth for resolving icon name strings (kebab-case or PascalCase) to React components, with sized rendering helpers.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
### Exports
|
|
7
|
+
|
|
8
|
+
| Export | Type | Description |
|
|
9
|
+
|--------|------|-------------|
|
|
10
|
+
| `ICON_REGISTRY` | `Record<string, IconComponent>` | Kebab-case map of all registered icon names to React components |
|
|
11
|
+
| `normalizeIconKey(key)` | `(string) => string` | Converts PascalCase icon names to canonical kebab-case; passes kebab keys through unchanged |
|
|
12
|
+
| `getIconComponent(iconName)` | `(string\|null\|undefined) => ComponentType` | Resolves any icon name to a component; falls back to `FileText` |
|
|
13
|
+
| `getDynamicIcon(iconName, size, className)` | `(...) => ReactNode` | Renders a sized icon element directly; falls back to `Globe` |
|
|
14
|
+
| `DynamicIconSize` | `'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl'` | Size preset type (12px–48px) |
|
|
15
|
+
|
|
16
|
+
### Key Conventions
|
|
17
|
+
|
|
18
|
+
- **Registry keys** are always kebab-case (e.g. `'dollar-sign'`, `'book-open'`)
|
|
19
|
+
- **Brand vs. Lucide variants** share the same base name: `'github'` → brand icon, `'github-lucide'` → Lucide outline
|
|
20
|
+
- **PascalCase aliases** (`social_platforms.icon_name` column) are resolved via `PASCAL_TO_KEBAB_ALIASES` before lookup
|
|
21
|
+
- **Unknown names** never crash render — `getIconComponent` falls back to `FileText`, `getDynamicIcon` falls back to `Globe`
|
|
22
|
+
|
|
23
|
+
## Usage Example
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
import { getIconComponent, getDynamicIcon, normalizeIconKey } from './icon-registry'
|
|
27
|
+
|
|
28
|
+
// Resolve a component for use in JSX (kebab or PascalCase both work)
|
|
29
|
+
const Icon = getIconComponent('rocket') // → Rocket
|
|
30
|
+
const Icon2 = getIconComponent('LinkedInIcon') // → LinkedInIcon (via alias)
|
|
31
|
+
const Icon3 = getIconComponent('unknown-icon') // → FileText (fallback)
|
|
32
|
+
|
|
33
|
+
// Render a sized icon node directly
|
|
34
|
+
const node = getDynamicIcon('youtube', 'lg') // 32px YouTubeIcon with brand color
|
|
35
|
+
const node2 = getDynamicIcon('dollar-sign', 'sm', 'text-green-500')
|
|
36
|
+
|
|
37
|
+
// Normalize a PascalCase key manually
|
|
38
|
+
normalizeIconKey('GitHubIcon') // → 'github'
|
|
39
|
+
normalizeIconKey('globe') // → 'globe' (pass-through)
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Adding a New Icon
|
|
43
|
+
|
|
44
|
+
1. Import the component at the top of the file
|
|
45
|
+
2. Add a `'kebab-name': Component` entry to `ICON_REGISTRY`
|
|
46
|
+
3. If the icon is stored as PascalCase in any DB column, add a `PascalName → 'kebab-name'` row to `PASCAL_TO_KEBAB_ALIASES`
|
|
@@ -1,48 +1,53 @@
|
|
|
1
|
-
<!-- source-hash:
|
|
2
|
-
|
|
1
|
+
<!-- source-hash: 85c0af6cd361347beeabcd097260378a -->
|
|
2
|
+
Barrel export module that consolidates and re-exports all message processing, chat navigation, UI styling, and content utility functions for chat interfaces.
|
|
3
3
|
|
|
4
4
|
## Key Components
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
**
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
**
|
|
17
|
-
|
|
18
|
-
- `extractErrorMessages` - Extracts error information from message history
|
|
19
|
-
- `processHistoricalMessagesWithErrors` - Combined processing with error handling
|
|
20
|
-
|
|
21
|
-
**State Management**
|
|
22
|
-
- `extractIncompleteMessageState` - Retrieves state of partially received messages
|
|
6
|
+
| Category | Exports |
|
|
7
|
+
|----------|---------|
|
|
8
|
+
| **Chunk Parsing** | `parseChunkToAction`, `isControlChunk`, `isErrorChunk`, `isMetadataChunk`, `extractTextFromChunk` |
|
|
9
|
+
| **Message Accumulation** | `MessageSegmentAccumulator`, `createMessageSegmentAccumulator`, `AccumulatorCallbacks` |
|
|
10
|
+
| **Historical Messages** | `processHistoricalMessages`, `extractErrorMessages`, `processHistoricalMessagesWithErrors` |
|
|
11
|
+
| **Chat Navigation** | `handleChatNavClick`, `resolveExternalNavigation`, `decideNewTab`, `computeIsNewTab`, `buildAnchorProps` |
|
|
12
|
+
| **Proxy Auth** | `getChatProxyAuth`, `setChatProxyAuth`, `clearChatProxyAuth`, `applyProxyAuth`, `chatAuthedFetch` |
|
|
13
|
+
| **Attachments** | `formatChatAttachmentMarkdownForBubble`, `stripChatAttachmentMarkdown`, `buildChatAttachmentViewUrl` |
|
|
14
|
+
| **UI / Styling** | `chatChipClass`, compact card class constants (`COMPACT_CARD_*`), `getStatusColorScheme` |
|
|
15
|
+
| **Icon Registry** | `ICON_REGISTRY`, `getIconComponent`, `normalizeIconKey`, `getDynamicIcon` |
|
|
16
|
+
| **Source Utilities** | `getSourceIconName`, `getSourceLabel`, `resolveSourceRowCTA`, `resolveSourceIcon` |
|
|
17
|
+
| **Slash Commands** | `parseWireCommandOverride`, `sanitizeTitleForChat`, `buildDiscussAddendum` |
|
|
23
18
|
|
|
24
19
|
## Usage Example
|
|
25
20
|
|
|
26
21
|
```typescript
|
|
27
22
|
import {
|
|
28
|
-
MessageSegmentAccumulator,
|
|
29
23
|
parseChunkToAction,
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
24
|
+
createMessageSegmentAccumulator,
|
|
25
|
+
handleChatNavClick,
|
|
26
|
+
getChatProxyAuth,
|
|
27
|
+
getIconComponent,
|
|
28
|
+
formatChatAttachmentMarkdownForBubble,
|
|
29
|
+
decideNewTab,
|
|
30
|
+
getStatusColorScheme,
|
|
31
|
+
} from '@flamingo/chat-utils'
|
|
32
|
+
|
|
33
|
+
// Parse a streaming chunk from the AI response
|
|
35
34
|
const action = parseChunkToAction(rawChunk)
|
|
36
35
|
|
|
37
|
-
//
|
|
38
|
-
const accumulator =
|
|
36
|
+
// Accumulate streamed message segments
|
|
37
|
+
const accumulator = createMessageSegmentAccumulator({
|
|
39
38
|
onSegmentComplete: (segment) => console.log('Segment:', segment),
|
|
40
|
-
onError: (error) => console.error('Error:', error)
|
|
41
39
|
})
|
|
42
40
|
|
|
43
|
-
//
|
|
44
|
-
const
|
|
41
|
+
// Resolve navigation target for a chat link
|
|
42
|
+
const { openInNewTab } = decideNewTab({
|
|
43
|
+
href: 'https://app.example.com/tickets/123',
|
|
44
|
+
surface: 'chat-bubble',
|
|
45
|
+
mode: 'web',
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
// Look up a registered icon by kebab-case key
|
|
49
|
+
const Icon = getIconComponent('clickup')
|
|
45
50
|
|
|
46
|
-
//
|
|
47
|
-
const
|
|
51
|
+
// Apply agent status color scheme to UI
|
|
52
|
+
const colors = getStatusColorScheme('running')
|
|
48
53
|
```
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
<!-- source-hash: 4303371bd78ed68ce85468361247ddc3 -->
|
|
2
|
+
Determines whether a URL is cross-origin by checking for an explicit host, used to drive new-tab navigation decisions in chat and link rendering.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
### `isCrossOriginUrl(url)`
|
|
7
|
+
- **Input:** `string | null | undefined`
|
|
8
|
+
- **Returns:** `boolean` — `true` if the URL has an explicit host (absolute or protocol-relative), `false` for relative paths or falsy values
|
|
9
|
+
|
|
10
|
+
## Logic
|
|
11
|
+
|
|
12
|
+
```text
|
|
13
|
+
null / undefined / "" → false
|
|
14
|
+
/relative/path → false (same-origin by convention)
|
|
15
|
+
//protocol-relative → true (explicit host)
|
|
16
|
+
https://example.com → true (explicit host)
|
|
17
|
+
http://example.com → true (explicit host)
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Usage Example
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
import { isCrossOriginUrl } from './is-cross-origin-url'
|
|
24
|
+
|
|
25
|
+
isCrossOriginUrl('/support') // false — same-origin
|
|
26
|
+
isCrossOriginUrl('//cdn.example.com/file.js') // true — cross-origin
|
|
27
|
+
isCrossOriginUrl('https://flamingo.run') // true — cross-origin
|
|
28
|
+
isCrossOriginUrl(null) // false — falsy guard
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Design Notes
|
|
32
|
+
|
|
33
|
+
- **SSR-deterministic:** avoids `window.location` comparison, which previously caused React hydration mismatches when SSR (no `window`) and client produced different results for the same URL
|
|
34
|
+
- **Convention-based:** same-origin navigation within the app always uses relative paths; any URL with a host is treated as external regardless of the actual deployment origin
|
|
35
|
+
- **Scope:** only handles the fallback case in `decideNewTab`; absolute same-platform URLs are caught earlier by the `targetPlatform !== currentSource` branch and never reach this function
|
|
@@ -1,50 +1,41 @@
|
|
|
1
|
-
<!-- source-hash:
|
|
2
|
-
Manages accumulation and
|
|
1
|
+
<!-- source-hash: 17a77a7a52f5be3583fd5569ca4bb36f -->
|
|
2
|
+
Manages the accumulation and lifecycle of message segments during real-time AI chat streaming, handling text, tool executions, and approval workflows.
|
|
3
3
|
|
|
4
4
|
## Key Components
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
|
|
14
|
-
**Helper Functions:**
|
|
15
|
-
- `createMessageSegmentAccumulator()` - Factory function for creating accumulator instances
|
|
6
|
+
- **`MessageSegmentAccumulator`** — Core class that tracks all segment types (`text`, `thinking`, `tool_execution`, `approval_request`, `approval_batch`) in a stateful array
|
|
7
|
+
- **`AccumulatorCallbacks`** — Interface for wiring `onApprove`/`onReject` handlers into approval segments
|
|
8
|
+
- **`initializeWithState()`** — Restores accumulator from serialized state across reconnections or page refreshes
|
|
9
|
+
- **`appendText()` / `appendThinking()`** — Coalesces consecutive same-type segments instead of creating duplicates
|
|
10
|
+
- **`addToolExecution()`** — Routes `EXECUTING_TOOL` → `EXECUTED_TOOL` state transitions, merging into approval batches when a `toolExecutionRequestId` matches
|
|
11
|
+
- **`addApprovalBatch()`** — Upserts batch approval segments by `approvalRequestId` to prevent duplicates during replay
|
|
12
|
+
- **`resolvePendingApprovalForExecution()`** — Implicitly marks the latest pending approval as approved when a tool execution arrives (handles observer streams with no `APPROVAL_RESULT` chunk)
|
|
13
|
+
- **`getState()` / `reset()`** — Serialization and teardown helpers
|
|
16
14
|
|
|
17
15
|
## Usage Example
|
|
18
16
|
|
|
19
17
|
```typescript
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
onApprove: async (requestId) => console.log(`Approved: ${requestId}`),
|
|
25
|
-
onReject: async (requestId) => console.log(`Rejected: ${requestId}`)
|
|
26
|
-
}
|
|
18
|
+
const accumulator = new MessageSegmentAccumulator({
|
|
19
|
+
onApprove: async (requestId) => await approveRequest(requestId),
|
|
20
|
+
onReject: async (requestId) => await rejectRequest(requestId),
|
|
21
|
+
})
|
|
27
22
|
|
|
28
|
-
|
|
23
|
+
// Restore state after reconnection
|
|
24
|
+
accumulator.initializeWithState({
|
|
25
|
+
existingSegments: previousSegments,
|
|
26
|
+
pendingApprovals: savedApprovals,
|
|
27
|
+
})
|
|
29
28
|
|
|
30
|
-
//
|
|
31
|
-
accumulator.appendText('
|
|
32
|
-
accumulator.appendText('
|
|
29
|
+
// Stream incoming chunks
|
|
30
|
+
accumulator.appendText('Checking your ')
|
|
31
|
+
accumulator.appendText('ticket status...')
|
|
33
32
|
|
|
34
|
-
//
|
|
33
|
+
// Handle tool lifecycle
|
|
35
34
|
accumulator.addToolExecution({
|
|
36
35
|
type: 'tool_execution',
|
|
37
|
-
data: {
|
|
38
|
-
type: 'EXECUTING_TOOL',
|
|
39
|
-
integratedToolType: 'filesystem',
|
|
40
|
-
toolFunction: 'readFile',
|
|
41
|
-
parameters: { path: '/home/user/file.txt' }
|
|
42
|
-
}
|
|
36
|
+
data: { type: 'EXECUTING_TOOL', toolFunction: 'getTicket', toolTitle: 'Get Ticket', ... },
|
|
43
37
|
})
|
|
44
38
|
|
|
45
|
-
//
|
|
46
|
-
accumulator.addApprovalRequest('req-123', 'rm -rf temp/', 'Delete temp files', 'SYSTEM')
|
|
47
|
-
|
|
48
|
-
// Get final segments
|
|
39
|
+
// Retrieve rendered segments
|
|
49
40
|
const segments = accumulator.getSegments()
|
|
50
41
|
```
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<!-- source-hash: 24346a4b70daaa3c49e151b19cf6cf28 -->
|
|
2
|
+
Provides pure helper functions for computing new-tab navigation decisions and building `<a>` anchor attribute objects used by chat-rendered links across inline cards, source chips, and runtime nav wrappers.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
| Export | Signature | Purpose |
|
|
7
|
+
|--------|-----------|---------|
|
|
8
|
+
| `computeIsNewTab` | `(runtime, href, targetPlatform) → boolean` | Single source of truth for the new-tab rule; always returns `true` in `embed` mode, defers to `decideNewTab` callback or lib default in `host` mode |
|
|
9
|
+
| `newTabAnchorAttrs` | `(isNewTab) → { target?, rel? }` | Returns `_blank` + `noopener noreferrer` pair or empty object; safe to spread directly into JSX `<a>` |
|
|
10
|
+
| `buildAnchorProps` | `(href, isNewTab) → { href, target?, rel? } \| undefined` | Combines href + anchor attrs into a single `anchorProps` slot; returns `undefined` (not `{}`) when href is absent so card components can branch on `!= null` |
|
|
11
|
+
|
|
12
|
+
## Usage Example
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
import {
|
|
16
|
+
computeIsNewTab,
|
|
17
|
+
buildAnchorProps,
|
|
18
|
+
} from './nav-anchor-props'
|
|
19
|
+
|
|
20
|
+
// Inside a card dispatcher wrapper
|
|
21
|
+
function CardLink({ runtime, chatRef, targetPlatform }) {
|
|
22
|
+
const isNewTab = computeIsNewTab(runtime, chatRef.url, targetPlatform)
|
|
23
|
+
const anchorProps = buildAnchorProps(chatRef.url, isNewTab)
|
|
24
|
+
|
|
25
|
+
return anchorProps != null
|
|
26
|
+
? <a {...anchorProps}>{children}</a>
|
|
27
|
+
: <span>{children}</span>
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Navigation Mode Rules
|
|
32
|
+
|
|
33
|
+
```mermaid
|
|
34
|
+
graph TD
|
|
35
|
+
A["computeIsNewTab called"] --> B{"href present?"}
|
|
36
|
+
B -- No --> C["return false"]
|
|
37
|
+
B -- Yes --> D{"embed mode?"}
|
|
38
|
+
D -- Yes --> E["return true (always new-tab)"]
|
|
39
|
+
D -- No --> F{"runtime.decideNewTab defined?"}
|
|
40
|
+
F -- Yes --> G["call runtime.decideNewTab"]
|
|
41
|
+
F -- No --> H["call libDecideNewTab fallback"]
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
> **Important:** Do not inline the `embed` short-circuit or `decideNewTab` fallback chain elsewhere. `computeIsNewTab` is the **only** place this logic should live.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
<!-- source-hash: 52e6bfa6e916758ef4a95f83d0eb97da -->
|
|
2
|
+
Unified click-handler for chat-rendered navigation links. Centralizes the routing decision logic (same-tab vs. new-tab, embed vs. host, modifier-key pass-through) so callers like chip blocks, entity-card wrappers, and markdown anchor wrappers share a single implementation.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
### `ChatNavClickInput`
|
|
7
|
+
Input interface describing the navigation target:
|
|
8
|
+
- `href` — destination URL (required)
|
|
9
|
+
- `path` — optional internal route path
|
|
10
|
+
- `targetPlatform` — optional platform hint for routing decisions
|
|
11
|
+
|
|
12
|
+
### `NavClickEvent`
|
|
13
|
+
Structural mouse-event interface (subset of `React.MouseEvent`) that keeps the handler callable from non-anchor surfaces without requiring a cast.
|
|
14
|
+
|
|
15
|
+
### `handleChatNavClick(e, runtime, input): boolean`
|
|
16
|
+
The core export. Processes a click event against a `ChatRuntime` and returns:
|
|
17
|
+
- `true` — handler took action and called `preventDefault()`
|
|
18
|
+
- `false` — modifier-click or non-primary button; browser default applies
|
|
19
|
+
|
|
20
|
+
**Routing rules in priority order:**
|
|
21
|
+
1. Empty `href` → `preventDefault` + no-op
|
|
22
|
+
2. Non-primary button or any modifier key (`meta`, `ctrl`, `shift`, `alt`) → pass through to browser
|
|
23
|
+
3. New-tab decision via `computeIsNewTab` → `runtime.navigation.openExternal` or `window.open`
|
|
24
|
+
4. Same-tab → `runtime.navigation.navigate?.()` → fallback to `window.location.assign`
|
|
25
|
+
|
|
26
|
+
## Usage Example
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
import { handleChatNavClick } from './nav-click-handler'
|
|
30
|
+
import { useChatRuntime } from '../../../contexts/chat-runtime-context'
|
|
31
|
+
|
|
32
|
+
function NavChip({ href, path, targetPlatform }) {
|
|
33
|
+
const runtime = useChatRuntime()
|
|
34
|
+
|
|
35
|
+
return (
|
|
36
|
+
<button
|
|
37
|
+
onClick={(e) =>
|
|
38
|
+
handleChatNavClick(e, runtime, { href, path, targetPlatform })
|
|
39
|
+
}
|
|
40
|
+
>
|
|
41
|
+
{label}
|
|
42
|
+
</button>
|
|
43
|
+
)
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
> **Note:** Pass-through (`return false`) preserves native `<a>` semantics for modifier-clicks (e.g., Cmd+Click opens a new tab), so wrapping anchor elements still behave correctly without extra logic in the caller.
|