@kortix/ui 0.14.8 → 0.14.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/_vendor/kortix-shared.js +116 -3
- package/dist/_vendor/shared/app-config.d.ts +175 -0
- package/dist/_vendor/shared/artifact-comments.d.ts +235 -0
- package/dist/_vendor/shared/channel-descriptors.d.ts +96 -0
- package/dist/_vendor/shared/channel-message.d.ts +45 -5
- package/dist/_vendor/shared/index.d.ts +2 -0
- package/dist/_vendor/shared/space-slug.d.ts +37 -0
- package/dist/access/access/access-detail-shell.js +1 -1
- package/dist/access/access/principal-picker.d.ts +11 -0
- package/dist/access/access/principal-picker.js +3 -2
- package/dist/apps/app-preview-pool.d.ts +7 -2
- package/dist/apps/app-preview-pool.js +30 -7
- package/dist/apps/app-shared.d.ts +22 -15
- package/dist/apps/app-shared.js +37 -19
- package/dist/apps/index.d.ts +2 -2
- package/dist/apps/index.js +2 -2
- package/dist/artifacts/artifact-frame.d.ts +16 -0
- package/dist/artifacts/artifact-frame.js +55 -0
- package/dist/artifacts/artifact-session.d.ts +18 -0
- package/dist/artifacts/artifact-session.js +101 -0
- package/dist/artifacts/frame-policy.d.ts +30 -0
- package/dist/artifacts/frame-policy.js +61 -0
- package/dist/artifacts/index.d.ts +3 -0
- package/dist/artifacts/index.js +5 -0
- package/dist/browser/sandbox-browser-chrome.d.ts +4 -1
- package/dist/browser/sandbox-browser-chrome.js +2 -2
- package/dist/customize/agents/agent-grant-pages.d.ts +5 -1
- package/dist/customize/agents/agent-grant-pages.js +30 -4
- package/dist/customize/agents/agent-page.js +3 -1
- package/dist/customize/agents/agent-policy-sets.d.ts +43 -0
- package/dist/customize/agents/agent-policy-sets.js +72 -0
- package/dist/customize/agents/agent-triggers-section.js +2 -1
- package/dist/customize/connectors/add-mcp/add-mcp-server-dialog.d.ts +6 -1
- package/dist/customize/connectors/add-mcp/add-mcp-server-dialog.js +10 -4
- package/dist/customize/connectors/agent-access.d.ts +35 -0
- package/dist/customize/connectors/agent-access.js +77 -0
- package/dist/customize/connectors/catalog/browse-sections.d.ts +2 -29
- package/dist/customize/connectors/catalog/browse-sections.js +7 -74
- package/dist/customize/connectors/catalog/catalog-entry.d.ts +18 -37
- package/dist/customize/connectors/catalog/catalog-entry.js +28 -40
- package/dist/customize/connectors/catalog/connector-browse.d.ts +3 -32
- package/dist/customize/connectors/catalog/connector-browse.js +19 -50
- package/dist/customize/connectors/catalog/use-catalog.d.ts +20 -59
- package/dist/customize/connectors/catalog/use-catalog.js +48 -175
- package/dist/customize/connectors/connector-identity.d.ts +9 -11
- package/dist/customize/connectors/connector-identity.js +13 -42
- package/dist/customize/connectors/connector-moves-banner.d.ts +2 -1
- package/dist/customize/connectors/connector-moves-banner.js +4 -6
- package/dist/customize/connectors/connector-routes.d.ts +21 -9
- package/dist/customize/connectors/connector-routes.js +29 -20
- package/dist/customize/connectors/connectors-page.js +53 -82
- package/dist/customize/connectors/detail/app-page.js +226 -98
- package/dist/customize/connectors/detail/computer-app-page.d.ts +16 -0
- package/dist/customize/connectors/detail/computer-app-page.js +39 -0
- package/dist/customize/connectors/detail/connector-accounts.js +3 -1
- package/dist/customize/connectors/detail/connector-advanced-tools.d.ts +4 -1
- package/dist/customize/connectors/detail/connector-advanced-tools.js +2 -2
- package/dist/customize/connectors/detail/connector-agents.d.ts +14 -0
- package/dist/customize/connectors/detail/connector-agents.js +69 -0
- package/dist/customize/connectors/detail/connector-detail-tabs.js +2 -1
- package/dist/customize/connectors/detail/connector-move-row.d.ts +8 -5
- package/dist/customize/connectors/detail/connector-move-row.js +23 -14
- package/dist/customize/connectors/detail/connector-page.d.ts +4 -1
- package/dist/customize/connectors/detail/connector-page.js +14 -10
- package/dist/customize/connectors/detail/connector-policy-sets.d.ts +28 -0
- package/dist/customize/connectors/detail/connector-policy-sets.js +203 -0
- package/dist/customize/connectors/detail/connector-settings.d.ts +4 -1
- package/dist/customize/connectors/detail/connector-settings.js +7 -3
- package/dist/customize/connectors/detail/connector-status.d.ts +19 -6
- package/dist/customize/connectors/detail/connector-status.js +34 -10
- package/dist/customize/connectors/detail/connector-tabs.d.ts +4 -1
- package/dist/customize/connectors/detail/connector-tabs.js +8 -2
- package/dist/customize/connectors/detail/connector-tools.d.ts +3 -3
- package/dist/customize/connectors/detail/connector-tools.js +105 -48
- package/dist/customize/connectors/detail/email-inboxes.d.ts +43 -0
- package/dist/customize/connectors/detail/email-inboxes.js +184 -0
- package/dist/customize/connectors/detail/provider-info.d.ts +1 -1
- package/dist/customize/connectors/detail/provider-info.js +2 -2
- package/dist/customize/connectors/detail/status-badge.d.ts +1 -1
- package/dist/customize/connectors/detail/status-badge.js +4 -5
- package/dist/customize/connectors/detail/use-connector-detail.d.ts +6 -0
- package/dist/customize/connectors/detail/use-connector-detail.js +14 -4
- package/dist/customize/connectors/install/install-dialog.d.ts +23 -0
- package/dist/customize/connectors/install/install-dialog.js +40 -0
- package/dist/customize/connectors/install/install.d.ts +13 -2
- package/dist/customize/connectors/install/install.js +9 -4
- package/dist/customize/connectors/install/use-install.d.ts +19 -2
- package/dist/customize/connectors/install/use-install.js +65 -37
- package/dist/customize/connectors/install/way-kind.d.ts +5 -0
- package/dist/customize/connectors/install/way-kind.js +16 -0
- package/dist/customize/connectors/provider-label.d.ts +2 -1
- package/dist/customize/connectors/provider-label.js +13 -3
- package/dist/customize/connectors/tools/pattern-rule-draft.d.ts +4 -0
- package/dist/customize/connectors/tools/pattern-rule-draft.js +12 -3
- package/dist/customize/connectors/tools/policy-sets.d.ts +27 -0
- package/dist/customize/connectors/tools/policy-sets.js +41 -0
- package/dist/customize/connectors/tools/tool-groups.d.ts +32 -9
- package/dist/customize/connectors/tools/tool-groups.js +78 -16
- package/dist/customize/connectors/tools/tool-policy-control.d.ts +11 -10
- package/dist/customize/connectors/tools/tool-policy-control.js +15 -16
- package/dist/customize/connectors/tools/tool-policy-labels.d.ts +6 -5
- package/dist/customize/connectors/tools/tool-policy-labels.js +17 -16
- package/dist/customize/connectors/tools/tool-policy.d.ts +50 -4
- package/dist/customize/connectors/tools/tool-policy.js +74 -8
- package/dist/customize/connectors/use-agent-access.d.ts +85 -0
- package/dist/customize/connectors/use-agent-access.js +72 -0
- package/dist/customize/migrate-to-v2/index.d.ts +1 -2
- package/dist/customize/migrate-to-v2/index.js +1 -2
- package/dist/customize/migrate-to-v2/migration-prompt.d.ts +12 -25
- package/dist/customize/migrate-to-v2/migration-prompt.js +34 -236
- package/dist/customize/migrate-to-v2/upgrade-defs.d.ts +1 -1
- package/dist/customize/migrate-to-v2/upgrade-defs.js +7 -6
- package/dist/customize/migrate-to-v2/upgrade-view.js +7 -7
- package/dist/customize/migrate-to-v2/use-run-upgrade.d.ts +3 -3
- package/dist/customize/providers/provider-accordion.js +17 -2
- package/dist/customize/sections/component/channel-access-panel.d.ts +16 -0
- package/dist/customize/sections/component/channel-access-panel.js +146 -0
- package/dist/customize/sections/component/channel-connect-hero.d.ts +3 -2
- package/dist/customize/sections/component/channel-connect-hero.js +3 -2
- package/dist/customize/sections/component/channel-hero-frame.d.ts +31 -0
- package/dist/customize/sections/component/channel-hero-frame.js +40 -0
- package/dist/customize/sections/component/channel-mocks.d.ts +6 -0
- package/dist/customize/sections/component/channel-mocks.js +46 -0
- package/dist/customize/sections/component/channel-row.d.ts +13 -3
- package/dist/customize/sections/component/channel-row.js +10 -4
- package/dist/customize/sections/component/email-connect-form.d.ts +27 -0
- package/dist/customize/sections/component/email-connect-form.js +183 -0
- package/dist/customize/sections/component/slack-connect-card.d.ts +7 -0
- package/dist/customize/sections/component/slack-connect-card.js +2 -3
- package/dist/customize/sections/component/teams-connect-card.d.ts +7 -0
- package/dist/customize/sections/component/teams-connect-card.js +2 -3
- package/dist/customize/sections/component/telegram-channel-row.js +21 -28
- package/dist/customize/sections/connectors-view.d.ts +1 -15
- package/dist/customize/sections/connectors-view.js +81 -314
- package/dist/customize/sections/view/agent-editor-catalog.js +10 -0
- package/dist/customize/sections/view/channels-view.d.ts +6 -1
- package/dist/customize/sections/view/channels-view.js +72 -81
- package/dist/customize/sections/view/gateway/gateway-overview.js +10 -2
- package/dist/customize/settings/rail.js +9 -0
- package/dist/customize/settings/settings-tabs.d.ts +1 -1
- package/dist/customize/settings/settings-tabs.js +1 -0
- package/dist/customize/settings/tabs/chrome-connections-tab.d.ts +6 -0
- package/dist/customize/settings/tabs/chrome-connections-tab.js +99 -0
- package/dist/customize/settings/tabs/experimental-tab.js +35 -16
- package/dist/customize/shared/catalog/catalog-empty-state.d.ts +4 -15
- package/dist/customize/shared/catalog/catalog-empty-state.js +9 -7
- package/dist/customize/shared/channels-switch-dialog.d.ts +18 -0
- package/dist/customize/shared/channels-switch-dialog.js +30 -0
- package/dist/customize/shared/feature-gate-screen.js +27 -9
- package/dist/customize/shared/use-customize-prefetch.d.ts +2 -3
- package/dist/customize/shared/use-customize-prefetch.js +9 -27
- package/dist/customize/triggers/schedule/post-to-field.d.ts +18 -0
- package/dist/customize/triggers/schedule/post-to-field.js +49 -0
- package/dist/customize/triggers/schedule/schedule-copy.d.ts +10 -6
- package/dist/customize/triggers/schedule/schedule-copy.js +42 -11
- package/dist/customize/triggers/schedule/schedule-detail-sheet.js +2 -1
- package/dist/customize/triggers/schedule/trigger-composer-logic.d.ts +22 -0
- package/dist/customize/triggers/schedule/trigger-composer-logic.js +25 -0
- package/dist/customize/triggers/schedule/trigger-composer.d.ts +5 -0
- package/dist/customize/triggers/schedule/trigger-composer.js +23 -14
- package/dist/customize/triggers/schedule/trigger-edit-logic.js +3 -0
- package/dist/customize/triggers/schedule/trigger-filter.js +1 -1
- package/dist/customize/triggers/schedule/trigger-runs-logic.d.ts +2 -2
- package/dist/customize/triggers/schedule/trigger-runs-panel.js +1 -0
- package/dist/customize/triggers/schedule/trigger-toast.js +2 -1
- package/dist/customize/triggers/schedule-view.js +5 -2
- package/dist/files/index.d.ts +1 -0
- package/dist/files/index.js +1 -0
- package/dist/files/project/change-request-recovery.d.ts +1 -26
- package/dist/files/project/change-request-recovery.js +1 -59
- package/dist/files/project/components/change-request-detail-dialog.js +13 -3
- package/dist/files/project/components/drive-explorer.js +15 -15
- package/dist/files/project/components/drive-toolbar.d.ts +16 -2
- package/dist/files/project/components/drive-toolbar.js +14 -5
- package/dist/files/project/hooks/use-change-request-recovery.js +3 -19
- package/dist/files/project/hooks/use-change-requests.d.ts +1 -0
- package/dist/files/project/hooks/use-change-requests.js +11 -2
- package/dist/files/renderers/image-frame.d.ts +48 -0
- package/dist/files/renderers/image-frame.js +59 -0
- package/dist/files/renderers/image-renderer.d.ts +11 -1
- package/dist/files/renderers/image-renderer.js +13 -3
- package/dist/files/renderers/pdf/pdf-clipboard.d.ts +2 -0
- package/dist/files/renderers/pdf/pdf-clipboard.js +21 -0
- package/dist/files/renderers/pdf/pdf-viewer.js +4 -2
- package/dist/files/renderers/show-content-renderer.d.ts +9 -1
- package/dist/files/renderers/show-content-renderer.js +56 -14
- package/dist/files/runtime/file-source.js +2 -0
- package/dist/files/runtime/hooks/use-binary-blob.d.ts +10 -1
- package/dist/files/runtime/hooks/use-binary-blob.js +10 -4
- package/dist/files/runtime/hooks/use-shared-image.d.ts +41 -0
- package/dist/files/runtime/hooks/use-shared-image.js +177 -0
- package/dist/files/viewer/file-content-renderer.d.ts +22 -1
- package/dist/files/viewer/file-content-renderer.js +50 -7
- package/dist/files/viewer/file-header.d.ts +7 -3
- package/dist/files/viewer/file-header.js +20 -11
- package/dist/files/viewer/file-preview-modal.d.ts +1 -1
- package/dist/files/viewer/file-preview-modal.js +10 -22
- package/dist/files/viewer/file-source.d.ts +13 -0
- package/dist/files/viewer/use-file-content-state.d.ts +2 -0
- package/dist/files/viewer/use-file-content-state.js +28 -10
- package/dist/files/viewer/viewer-actions.d.ts +3 -1
- package/dist/files/viewer/viewer-actions.js +2 -2
- package/dist/hooks/use-media-query.d.ts +1 -0
- package/dist/hooks/use-mobile.d.ts +5 -0
- package/dist/hooks/use-mobile.js +8 -0
- package/dist/i18n/en.d.ts +1062 -85
- package/dist/i18n/en.js +1078 -101
- package/dist/i18n/ui-catalog/localize-ui-catalog.js +4 -0
- package/dist/i18n/ui-catalog/remaining-ui-translation-keys.generated.js +15 -3
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/internal/account-hub/account-settings-sidebar.js +1 -1
- package/dist/internal/account-hub/hub-sheet.d.ts +9 -1
- package/dist/internal/account-hub/hub-sheet.js +21 -5
- package/dist/internal/account-hub/sections.d.ts +1 -1
- package/dist/internal/account-hub/sections.js +2 -1
- package/dist/internal/apps-and-extensions/apps-modal.d.ts +9 -0
- package/dist/internal/apps-and-extensions/apps-modal.js +107 -0
- package/dist/internal/auth/auth-card-shell.js +3 -3
- package/dist/internal/chrome/browser-icon.d.ts +24 -0
- package/dist/internal/chrome/browser-icon.js +58 -0
- package/dist/internal/chrome/chrome-card-state.d.ts +16 -0
- package/dist/internal/chrome/chrome-card-state.js +9 -0
- package/dist/internal/chrome/chrome-connect.d.ts +69 -0
- package/dist/internal/chrome/chrome-connect.js +178 -0
- package/dist/internal/chrome/chrome-mock.d.ts +4 -0
- package/dist/internal/chrome/chrome-mock.js +15 -0
- package/dist/internal/chrome/chrome-names.d.ts +15 -0
- package/dist/internal/chrome/chrome-names.js +35 -0
- package/dist/internal/chrome/extension.d.ts +47 -0
- package/dist/internal/chrome/extension.js +91 -0
- package/dist/internal/chrome/use-chrome-offered.d.ts +11 -0
- package/dist/internal/chrome/use-chrome-offered.js +22 -0
- package/dist/internal/components/agent-mark.js +5 -2
- package/dist/internal/connector-logo/connector-logo-source.d.ts +64 -0
- package/dist/internal/connector-logo/connector-logo-source.js +49 -0
- package/dist/internal/connector-logo/connector-logo.d.ts +39 -0
- package/dist/internal/connector-logo/connector-logo.js +56 -0
- package/dist/internal/connector-logo/connector-mark-files.d.ts +11 -0
- package/dist/internal/connector-logo/connector-mark-files.js +35 -0
- package/dist/internal/files/file-read-retry.d.ts +13 -0
- package/dist/internal/files/file-read-retry.js +23 -3
- package/dist/internal/files/session-drive-files.d.ts +5 -1
- package/dist/internal/files/session-drive-files.js +7 -2
- package/dist/internal/hooks/channels/use-channels-installations.d.ts +32 -5
- package/dist/internal/hooks/channels/use-channels-installations.js +55 -7
- package/dist/internal/hooks/channels/use-email-inboxes.d.ts +19 -0
- package/dist/internal/hooks/channels/use-email-inboxes.js +48 -0
- package/dist/internal/hooks/connectors/use-add-account.js +1 -1
- package/dist/internal/hooks/index.d.ts +1 -1
- package/dist/internal/hooks/index.js +1 -1
- package/dist/internal/hooks/projects/use-new-project-session.d.ts +9 -0
- package/dist/internal/hooks/projects/use-new-project-session.js +28 -12
- package/dist/internal/hooks/use-auto-scroll.d.ts +8 -1
- package/dist/internal/hooks/use-auto-scroll.js +4 -4
- package/dist/internal/icons/edge.d.ts +5 -0
- package/dist/internal/icons/edge.js +10 -0
- package/dist/internal/icons/telegram.d.ts +5 -0
- package/dist/internal/icons/telegram.js +6 -1
- package/dist/internal/layout/nav-hover-card.d.ts +35 -0
- package/dist/internal/layout/nav-hover-card.js +84 -0
- package/dist/internal/layout/project-nav-row.d.ts +3 -1
- package/dist/internal/layout/project-nav-row.js +3 -2
- package/dist/internal/layout/project-page-header.d.ts +4 -2
- package/dist/internal/layout/project-page-header.js +4 -3
- package/dist/internal/layout/project-settings-nav.js +59 -2
- package/dist/internal/lib/browser-error-noise.d.ts +1 -1
- package/dist/internal/lib/browser-error-noise.js +1 -1
- package/dist/internal/lib/browser-noise/rules/extensions.js +17 -3
- package/dist/internal/lib/browser-noise/rules/injected-scripts.d.ts +7 -0
- package/dist/internal/lib/browser-noise/rules/injected-scripts.js +15 -0
- package/dist/internal/lib/detect-os.d.ts +43 -0
- package/dist/internal/lib/detect-os.js +70 -0
- package/dist/internal/lib/manifest-version.d.ts +1 -1
- package/dist/internal/lib/manifest-version.js +2 -2
- package/dist/internal/lib/memory-href.d.ts +16 -0
- package/dist/internal/lib/memory-href.js +46 -0
- package/dist/internal/lib/use-project-feature-flags.js +13 -9
- package/dist/internal/lib/utils/heic-convert.d.ts +1 -1
- package/dist/internal/lib/utils/heic-convert.js +3 -4
- package/dist/internal/lib/web-notifications.d.ts +20 -0
- package/dist/internal/lib/web-notifications.js +48 -4
- package/dist/internal/notifications/notification-bell.d.ts +4 -1
- package/dist/internal/notifications/notification-bell.js +2 -2
- package/dist/internal/selection/selection-bar.d.ts +2 -1
- package/dist/internal/selection/selection-bar.js +1 -1
- package/dist/internal/stores/apps-modal-store.d.ts +8 -0
- package/dist/internal/stores/apps-modal-store.js +6 -0
- package/dist/internal/stores/composer-prefill-store.d.ts +12 -5
- package/dist/internal/stores/file-preview-store.d.ts +29 -2
- package/dist/internal/stores/file-preview-store.js +19 -1
- package/dist/internal/stores/kortix-computer-store.js +3 -0
- package/dist/internal/stores/sidebar-nav-store.d.ts +1 -1
- package/dist/internal/stores/sidebar-nav-store.js +3 -1
- package/dist/lib/routes.d.ts +13 -1
- package/dist/lib/routes.js +13 -0
- package/dist/markdown/index.d.ts +2 -1
- package/dist/markdown/index.js +2 -1
- package/dist/markdown/setup-links/approval-decision.d.ts +1 -0
- package/dist/markdown/setup-links/approval-decision.js +9 -3
- package/dist/markdown/setup-links/connector-handshake.d.ts +3 -1
- package/dist/markdown/setup-links/connector-handshake.js +12 -10
- package/dist/markdown/setup-links/secret-intake-form.d.ts +0 -10
- package/dist/markdown/setup-links/secret-intake-form.js +1 -1
- package/dist/markdown/setup-links/show-connect-hero.d.ts +28 -0
- package/dist/markdown/setup-links/show-connect-hero.js +91 -0
- package/dist/markdown/unified-markdown.js +5 -5
- package/dist/primitives/badge.d.ts +1 -1
- package/dist/primitives/badge.js +2 -0
- package/dist/primitives/disclosure.js +14 -2
- package/dist/primitives/empty-art.d.ts +12 -0
- package/dist/primitives/empty-art.js +11 -0
- package/dist/primitives/empty-state.d.ts +2 -2
- package/dist/primitives/empty-state.js +6 -5
- package/dist/primitives/mermaid-renderer.d.ts +2 -0
- package/dist/primitives/mermaid-renderer.js +21 -15
- package/dist/primitives/resizable.js +6 -1
- package/dist/primitives/resize-seam.d.ts +11 -0
- package/dist/primitives/resize-seam.js +12 -0
- package/dist/primitives/sidebar-panel.js +4 -7
- package/dist/primitives/tabs.d.ts +14 -1
- package/dist/primitives/tabs.js +1 -1
- package/dist/providers/ui-provider.d.ts +9 -0
- package/dist/session/composer/ComposerAboveCard.d.ts +1 -1
- package/dist/session/composer/ComposerAboveCard.js +2 -2
- package/dist/session/composer/ComposerCard.d.ts +1 -1
- package/dist/session/composer/ComposerCard.js +3 -3
- package/dist/session/composer/agent-selector.d.ts +13 -1
- package/dist/session/composer/agent-selector.js +25 -5
- package/dist/session/composer/composer-agent-access.d.ts +15 -0
- package/dist/session/composer/composer-agent-access.js +27 -0
- package/dist/session/composer/composer-chat-input.d.ts +8 -2
- package/dist/session/composer/composer-chat-input.js +8 -6
- package/dist/session/composer/composer-logic.d.ts +16 -0
- package/dist/session/composer/composer-logic.js +12 -0
- package/dist/session/composer/composer-underbar.d.ts +3 -1
- package/dist/session/composer/composer-underbar.js +4 -3
- package/dist/session/composer/composer.d.ts +15 -1
- package/dist/session/composer/composer.js +19 -1
- package/dist/session/composer/draft/composer-draft.d.ts +6 -2
- package/dist/session/composer/draft/composer-draft.js +5 -1
- package/dist/session/composer/reasoning-effort-selector.js +1 -1
- package/dist/session/models/chatgpt-connection-button.d.ts +11 -0
- package/dist/session/models/chatgpt-connection-button.js +54 -0
- package/dist/session/models/model-selector.js +5 -2
- package/dist/session/models/use-model-connection-gate.d.ts +5 -5
- package/dist/session/models/use-model-connection-gate.js +5 -5
- package/dist/session/outcomes/jump-to-outcome.d.ts +10 -0
- package/dist/session/outcomes/jump-to-outcome.js +11 -0
- package/dist/session/outcomes/session-outcomes-bridge.d.ts +14 -0
- package/dist/session/outcomes/session-outcomes-bridge.js +12 -0
- package/dist/session/outcomes/session-outcomes-provider.d.ts +3 -1
- package/dist/session/outcomes/session-outcomes-provider.js +33 -3
- package/dist/session/panel/easy/app-preview.d.ts +10 -0
- package/dist/session/panel/easy/app-preview.js +31 -12
- package/dist/session/panel/easy/change-requests-card.d.ts +7 -0
- package/dist/session/panel/easy/change-requests-card.js +17 -0
- package/dist/session/panel/easy/easy-panel-logic.js +7 -1
- package/dist/session/panel/easy/easy-panel.js +5 -2
- package/dist/session/panel/easy/file-preview.js +1 -1
- package/dist/session/panel/easy/outputs-card.d.ts +2 -1
- package/dist/session/panel/easy/outputs-card.js +3 -2
- package/dist/session/panel/mobile-tool-drawer.js +7 -1
- package/dist/session/panel/session-audit-panel.js +9 -2
- package/dist/session/panel/session-audit-shared.js +3 -1
- package/dist/session/panel/session-detail-panel.js +9 -3
- package/dist/session/panel/session-files-explorer.d.ts +9 -0
- package/dist/session/panel/session-files-explorer.js +12 -3
- package/dist/session/panel/session-panel-provider.d.ts +15 -1
- package/dist/session/panel/session-panel-provider.js +32 -7
- package/dist/session/panel/shared/derive-panels.d.ts +8 -1
- package/dist/session/panel/shared/derive-panels.js +12 -2
- package/dist/session/panel/shared/output-priority.js +2 -0
- package/dist/session/participants/session-participants.d.ts +8 -2
- package/dist/session/participants/session-participants.js +11 -4
- package/dist/session/prompts/approval-request.d.ts +5 -0
- package/dist/session/prompts/approval-request.js +9 -1
- package/dist/session/prompts/session-approval-review.d.ts +9 -0
- package/dist/session/prompts/session-approval-review.js +18 -0
- package/dist/session/status/session-error-banner.js +2 -49
- package/dist/session/status/session-starting-loader.d.ts +14 -2
- package/dist/session/status/session-starting-loader.js +16 -4
- package/dist/session/thread/after-first-prompt.d.ts +7 -0
- package/dist/session/thread/after-first-prompt.js +8 -0
- package/dist/session/thread/detect-command.d.ts +12 -0
- package/dist/session/thread/detect-command.js +20 -0
- package/dist/session/thread/session-chat.d.ts +3 -1
- package/dist/session/thread/session-chat.js +377 -252
- package/dist/session/thread/session-thread.d.ts +15 -1
- package/dist/session/thread/session-thread.js +20 -3
- package/dist/session/thread/session-transcript-class.d.ts +5 -1
- package/dist/session/thread/session-transcript-class.js +5 -1
- package/dist/session/thread/thread-boot-rows.d.ts +36 -0
- package/dist/session/thread/thread-boot-rows.js +89 -0
- package/dist/session/thread/transcript-rows.d.ts +31 -0
- package/dist/session/thread/transcript-rows.js +3 -0
- package/dist/session/thread/transcript.d.ts +0 -9
- package/dist/session/thread/transcript.js +104 -19
- package/dist/session/tool/shared/infrastructure-contexts.d.ts +28 -0
- package/dist/session/tool/shared/infrastructure-contexts.js +31 -3
- package/dist/session/tool/tool-part-renderer.d.ts +5 -4
- package/dist/session/tool/tool-part-renderer.js +8 -3
- package/dist/session/tool/tools/bash-tool.js +7 -6
- package/dist/session/tool/tools/channel-send-card.d.ts +1 -2
- package/dist/session/tool/tools/channel-send.d.ts +2 -1
- package/dist/session/tool/tools/codemode-tool.js +1 -1
- package/dist/session/tool/tools/connector-tools.js +1 -1
- package/dist/session/tool/tools/image-gen-tool.d.ts +1 -1
- package/dist/session/tool/tools/image-gen-tool.js +241 -53
- package/dist/session/tool/tools/show-tool.js +19 -8
- package/dist/session/turn/channel-brand.d.ts +8 -3
- package/dist/session/turn/channel-brand.js +20 -4
- package/dist/session/turn/message-author.d.ts +8 -0
- package/dist/session/turn/message-author.js +24 -0
- package/dist/session/turn/message-row.d.ts +52 -0
- package/dist/session/turn/message-row.js +44 -0
- package/dist/session/turn/plan-anchor.d.ts +1 -1
- package/dist/session/turn/plan-anchor.js +1 -1
- package/dist/session/turn/user-message.d.ts +14 -6
- package/dist/session/turn/user-message.js +35 -15
- package/dist/styles.css +1 -1
- package/dist/workspace/home/access-requests-bell.d.ts +9 -2
- package/dist/workspace/home/access-requests-bell.js +20 -6
- package/dist/workspace/home/first-chat.d.ts +8 -21
- package/dist/workspace/home/first-chat.js +22 -72
- package/dist/workspace/index.d.ts +6 -0
- package/dist/workspace/index.js +6 -0
- package/dist/workspace/layout/project-home.d.ts +14 -2
- package/dist/workspace/layout/project-home.js +60 -21
- package/dist/workspace/layout/use-project-home-send.d.ts +9 -1
- package/dist/workspace/layout/use-project-home-send.js +82 -3
- package/dist/workspace/memory/body-doc.d.ts +17 -0
- package/dist/workspace/memory/body-doc.js +208 -0
- package/dist/workspace/memory/body-extensions.d.ts +38 -0
- package/dist/workspace/memory/body-extensions.js +103 -0
- package/dist/workspace/memory/company-memory-page.d.ts +8 -0
- package/dist/workspace/memory/company-memory-page.js +16 -0
- package/dist/workspace/memory/memory-all.d.ts +20 -0
- package/dist/workspace/memory/memory-all.js +27 -0
- package/dist/workspace/memory/memory-body.d.ts +19 -0
- package/dist/workspace/memory/memory-body.js +139 -0
- package/dist/workspace/memory/memory-empty.d.ts +13 -0
- package/dist/workspace/memory/memory-empty.js +28 -0
- package/dist/workspace/memory/memory-history.d.ts +27 -0
- package/dist/workspace/memory/memory-history.js +108 -0
- package/dist/workspace/memory/memory-labels.d.ts +16 -0
- package/dist/workspace/memory/memory-labels.js +47 -0
- package/dist/workspace/memory/memory-page-list.d.ts +34 -0
- package/dist/workspace/memory/memory-page-list.js +156 -0
- package/dist/workspace/memory/memory-reader.d.ts +58 -0
- package/dist/workspace/memory/memory-reader.js +123 -0
- package/dist/workspace/memory/memory-view.d.ts +21 -0
- package/dist/workspace/memory/memory-view.js +124 -0
- package/dist/workspace/memory/remember-popover.d.ts +19 -0
- package/dist/workspace/memory/remember-popover.js +61 -0
- package/dist/workspace/memory/remember-this.d.ts +12 -0
- package/dist/workspace/memory/remember-this.js +89 -0
- package/dist/workspace/memory/source-mark.d.ts +18 -0
- package/dist/workspace/memory/source-mark.js +79 -0
- package/dist/workspace/memory/used-memory-chip.d.ts +14 -0
- package/dist/workspace/memory/used-memory-chip.js +61 -0
- package/dist/workspace/new/advanced-fields.d.ts +2 -1
- package/dist/workspace/new/advanced-fields.js +2 -2
- package/dist/workspace/new/source-param.d.ts +1 -1
- package/dist/workspace/new/source-param.js +3 -1
- package/dist/workspace/new/use-create-workspace.d.ts +8 -10
- package/dist/workspace/new/use-create-workspace.js +3 -3
- package/dist/workspace/projects/onboarding/app-logo.d.ts +7 -2
- package/dist/workspace/projects/onboarding/app-logo.js +6 -13
- package/dist/workspace/projects/policies-panel.js +5 -3
- package/dist/workspace/review/review-actions.d.ts +4 -2
- package/dist/workspace/review/review-actions.js +8 -2
- package/dist/workspace/review/review-center.js +11 -7
- package/dist/workspace/review/review-detail.d.ts +10 -0
- package/dist/workspace/review/review-detail.js +101 -13
- package/dist/workspace/saved-session-skeleton.d.ts +2 -2
- package/dist/workspace/saved-session-skeleton.js +3 -3
- package/dist/workspace/session-workspace.js +15 -13
- package/dist/workspace/sessions/project-sessions-view.js +3 -2
- package/dist/workspace/sessions/session-label-badges.js +2 -1
- package/dist/workspace/sessions/sessions-toolbar.d.ts +3 -1
- package/dist/workspace/sessions/sessions-toolbar.js +2 -2
- package/dist/workspace/sidebar/footer/project-apps-nav.d.ts +5 -0
- package/dist/workspace/sidebar/footer/project-apps-nav.js +41 -2
- package/dist/workspace/sidebar/footer/project-artifacts-nav.d.ts +6 -0
- package/dist/workspace/sidebar/footer/project-artifacts-nav.js +22 -0
- package/dist/workspace/sidebar/footer/project-chrome-nav.d.ts +10 -0
- package/dist/workspace/sidebar/footer/project-chrome-nav.js +56 -0
- package/dist/workspace/sidebar/footer/project-manifest-upgrade-alert.js +13 -13
- package/dist/workspace/sidebar/footer/project-memory-nav.d.ts +7 -0
- package/dist/workspace/sidebar/footer/project-memory-nav.js +19 -0
- package/dist/workspace/sidebar/nav-row-meta.js +14 -2
- package/dist/workspace/sidebar/project-nav-items.js +3 -0
- package/dist/workspace/sidebar/project-session-list.js +68 -56
- package/dist/workspace/sidebar/project-sidebar.js +13 -2
- package/dist/workspace/sidebar/project-spaces-nav.d.ts +8 -0
- package/dist/workspace/sidebar/project-spaces-nav.js +69 -0
- package/dist/workspace/sidebar/session-group-order.d.ts +9 -0
- package/dist/workspace/sidebar/session-group-order.js +25 -0
- package/dist/workspace/sidebar/session-group-sections.d.ts +62 -0
- package/dist/workspace/sidebar/session-group-sections.js +267 -0
- package/dist/workspace/sidebar/session-list-chrome.d.ts +28 -0
- package/dist/workspace/sidebar/session-list-chrome.js +50 -0
- package/dist/workspace/spaces/channel-glyph.d.ts +5 -0
- package/dist/workspace/spaces/channel-glyph.js +6 -0
- package/dist/workspace/spaces/channel-setup.d.ts +16 -0
- package/dist/workspace/spaces/channel-setup.js +105 -0
- package/dist/workspace/spaces/channels-onboarding.d.ts +13 -0
- package/dist/workspace/spaces/channels-onboarding.js +37 -0
- package/dist/workspace/spaces/create-channel-dialog.d.ts +16 -0
- package/dist/workspace/spaces/create-channel-dialog.js +158 -0
- package/dist/workspace/spaces/private-channels-not-in.d.ts +9 -0
- package/dist/workspace/spaces/private-channels-not-in.js +69 -0
- package/dist/workspace/spaces/space-agents.d.ts +10 -0
- package/dist/workspace/spaces/space-agents.js +10 -0
- package/dist/workspace/spaces/space-details-dialog.d.ts +20 -0
- package/dist/workspace/spaces/space-details-dialog.js +176 -0
- package/dist/workspace/spaces/space-link-label.d.ts +49 -0
- package/dist/workspace/spaces/space-link-label.js +73 -0
- package/dist/workspace/spaces/space-links.d.ts +19 -0
- package/dist/workspace/spaces/space-links.js +230 -0
- package/dist/workspace/spaces/space-members.d.ts +46 -0
- package/dist/workspace/spaces/space-members.js +182 -0
- package/dist/workspace/spaces/space-roster.d.ts +15 -0
- package/dist/workspace/spaces/space-roster.js +44 -0
- package/dist/workspace/spaces/space-threads-tab.d.ts +56 -0
- package/dist/workspace/spaces/space-threads-tab.js +156 -0
- package/dist/workspace/spaces/space-timeline-view.d.ts +254 -0
- package/dist/workspace/spaces/space-timeline-view.js +235 -0
- package/dist/workspace/spaces/space-timeline.d.ts +106 -0
- package/dist/workspace/spaces/space-timeline.js +183 -0
- package/dist/workspace/spaces/space-triggers.d.ts +13 -0
- package/dist/workspace/spaces/space-triggers.js +78 -0
- package/dist/workspace/spaces/space-view.d.ts +37 -0
- package/dist/workspace/spaces/space-view.js +436 -0
- package/package.json +67 -36
- package/skills/kortix-ui/SKILL.md +3 -3
- package/skills/kortix-ui/references/custom-dashboard.md +3 -3
- package/skills/kortix-ui/references/modules.md +29 -5
- package/skills/kortix-ui/references/theming.md +1 -1
- package/dist/customize/connectors/catalog/merge-search.d.ts +0 -10
- package/dist/customize/connectors/catalog/merge-search.js +0 -26
- package/dist/customize/connectors/detail/find-easy-connect-app.d.ts +0 -29
- package/dist/customize/connectors/detail/find-easy-connect-app.js +0 -22
- package/dist/customize/migrate-to-v2/use-migrate-to-v2.d.ts +0 -9
- package/dist/customize/migrate-to-v2/use-migrate-to-v2.js +0 -24
- package/dist/customize/sections/connector-connection-header.d.ts +0 -36
- package/dist/customize/sections/connector-connection-header.js +0 -33
- package/dist/customize/sections/connector-connection-modal.d.ts +0 -34
- package/dist/customize/sections/connector-connection-modal.js +0 -72
- package/dist/customize/sections/discover-catalogue-card.d.ts +0 -19
- package/dist/customize/sections/discover-catalogue-card.js +0 -26
- package/dist/customize/sections/discover-catalogue-detail.d.ts +0 -15
- package/dist/customize/sections/discover-catalogue-detail.js +0 -24
- package/dist/customize/sections/discover-catalogue.d.ts +0 -17
- package/dist/customize/sections/discover-catalogue.js +0 -132
- package/dist/customize/sections/llm-provider/provider-access-menu.d.ts +0 -10
- package/dist/customize/sections/llm-provider/provider-access-menu.js +0 -23
- package/dist/files/project/components/drive-empty-art.d.ts +0 -2
- package/dist/files/project/components/drive-empty-art.js +0 -5
- package/dist/internal/hooks/use-media-query.d.ts +0 -2
- package/dist/internal/share/public-share-link-button.d.ts +0 -14
- package/dist/internal/share/public-share-link-button.js +0 -17
- package/dist/markdown/setup-links/app-credentials-form.d.ts +0 -12
- package/dist/markdown/setup-links/app-credentials-form.js +0 -115
- /package/dist/{internal/hooks → hooks}/use-media-query.js +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';
|
|
3
|
-
import { OWN_SCROLL_MS, chevronVisible, isAtEnd, keyScrollIntentFor, pickAnchorIndex, prefersReducedMotion, roomUnderNewestTurn, settleMotion, shouldReleaseFollow, } from './use-auto-scroll-physics.js';
|
|
3
|
+
import { BOTTOM_GAP_PX, OWN_SCROLL_MS, chevronVisible, isAtEnd, keyScrollIntentFor, pickAnchorIndex, prefersReducedMotion, roomUnderNewestTurn, settleMotion, shouldReleaseFollow, } from './use-auto-scroll-physics.js';
|
|
4
4
|
export { AT_END_PX, BOTTOM_GAP_PX, CHEVRON_PX, GLIDE_MIN_PX, OWN_SCROLL_MS, TURN_TOP_OFFSET, chevronVisible, classifyScrollKey, isAtEnd, isEditableTarget, isSpaceActivatedTarget, keyScrollIntentFor, pickAnchorIndex, roomUnderNewestTurn, settleMotion, shouldReleaseFollow, } from './use-auto-scroll-physics.js';
|
|
5
5
|
/**
|
|
6
6
|
* useAutoScroll — the session transcript's scroll physics, from first
|
|
@@ -75,7 +75,7 @@ const SEND_GLIDE_ARM_MS = 1000;
|
|
|
75
75
|
function distanceFromEnd(el) {
|
|
76
76
|
return el.scrollHeight - el.scrollTop - el.clientHeight;
|
|
77
77
|
}
|
|
78
|
-
export function useAutoScroll({ hasContent = false, } = {}) {
|
|
78
|
+
export function useAutoScroll({ hasContent = false, room = true, } = {}) {
|
|
79
79
|
const scrollRef = useRef(null);
|
|
80
80
|
const contentRef = useRef(null);
|
|
81
81
|
const spacerElRef = useRef(null);
|
|
@@ -149,7 +149,7 @@ export function useAutoScroll({ hasContent = false, } = {}) {
|
|
|
149
149
|
const span = anchor
|
|
150
150
|
? spacer.getBoundingClientRect().top - anchor.getBoundingClientRect().top
|
|
151
151
|
: null;
|
|
152
|
-
const h = roomUnderNewestTurn(el.clientHeight, span);
|
|
152
|
+
const h = room ? roomUnderNewestTurn(el.clientHeight, span) : BOTTOM_GAP_PX;
|
|
153
153
|
if (spacer.style.height !== `${h}px`)
|
|
154
154
|
spacer.style.height = `${h}px`;
|
|
155
155
|
const anchorChanged = previous !== null && anchor !== previous.el;
|
|
@@ -161,7 +161,7 @@ export function useAutoScroll({ hasContent = false, } = {}) {
|
|
|
161
161
|
}
|
|
162
162
|
: null;
|
|
163
163
|
return { room: h, anchorChanged };
|
|
164
|
-
}, []);
|
|
164
|
+
}, [room]);
|
|
165
165
|
const settleRef = useRef(null);
|
|
166
166
|
const cancelGlide = useCallback(() => {
|
|
167
167
|
const glide = glideRef.current;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** @internal Kortix apps only. No semver: it may change in any release. */
|
|
2
|
+
/** Edge brand mark, full colour. Source: gilbarbara/logos (CC0), `logos:microsoft-edge`. */
|
|
3
|
+
export declare const Edge: ({ className }: {
|
|
4
|
+
className?: string;
|
|
5
|
+
}) => import("react").JSX.Element;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useId } from 'react';
|
|
4
|
+
import { cn } from '@kortix/ui';
|
|
5
|
+
/** Edge brand mark, full colour. Source: gilbarbara/logos (CC0), `logos:microsoft-edge`. */
|
|
6
|
+
export const Edge = ({ className }) => {
|
|
7
|
+
// Gradient ids are per instance, so two marks on one page never share a definition.
|
|
8
|
+
const uid = useId().replace(/[^a-zA-Z0-9_-]/g, '');
|
|
9
|
+
return (_jsxs("svg", { viewBox: "0 0 256 256", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", className: cn('size-4', className), children: [_jsxs("defs", { children: [_jsxs("radialGradient", { id: `${uid}SVGHFrboeCQ`, cx: "161.83", cy: "788.401", r: "95.38", gradientTransform: "matrix(.9999 0 0 .9498 -4.622 -570.387)", gradientUnits: "userSpaceOnUse", children: [_jsx("stop", { offset: ".72", stopOpacity: "0" }), _jsx("stop", { offset: ".95", stopOpacity: ".53" }), _jsx("stop", { offset: "1" })] }), _jsxs("radialGradient", { id: `${uid}SVGVG94vbPK`, cx: "-773.636", cy: "746.715", r: "143.24", gradientTransform: "matrix(.15 -.9898 .8 .12 -410.718 -656.341)", gradientUnits: "userSpaceOnUse", children: [_jsx("stop", { offset: ".76", stopOpacity: "0" }), _jsx("stop", { offset: ".95", stopOpacity: ".5" }), _jsx("stop", { offset: "1" })] }), _jsxs("radialGradient", { id: `${uid}SVGw2d8JdCl`, cx: "230.593", cy: "-106.038", r: "202.43", gradientTransform: "matrix(-.04 .9998 -2.1299 -.07998 -190.775 -191.635)", gradientUnits: "userSpaceOnUse", children: [_jsx("stop", { offset: "0", stopColor: "#35c1f1" }), _jsx("stop", { offset: ".11", stopColor: "#34c1ed" }), _jsx("stop", { offset: ".23", stopColor: "#2fc2df" }), _jsx("stop", { offset: ".31", stopColor: "#2bc3d2" }), _jsx("stop", { offset: ".67", stopColor: "#36c752" })] }), _jsxs("radialGradient", { id: `${uid}SVGIqWItcPR`, cx: "536.357", cy: "-117.703", r: "97.34", gradientTransform: "matrix(.28 .9598 -.78 .23 -1.928 -410.318)", gradientUnits: "userSpaceOnUse", children: [_jsx("stop", { offset: "0", stopColor: "#66eb6e" }), _jsx("stop", { offset: "1", stopColor: "#66eb6e", stopOpacity: "0" })] }), _jsxs("linearGradient", { id: `${uid}SVGktZSUcGK`, x1: "63.334", x2: "241.617", y1: "757.83", y2: "757.83", gradientTransform: "translate(-4.63 -580.81)", gradientUnits: "userSpaceOnUse", children: [_jsx("stop", { offset: "0", stopColor: "#0c59a4" }), _jsx("stop", { offset: "1", stopColor: "#114a8b" })] }), _jsxs("linearGradient", { id: `${uid}SVGaPqZBebW`, x1: "157.401", x2: "46.028", y1: "680.556", y2: "801.868", gradientTransform: "translate(-4.63 -580.81)", gradientUnits: "userSpaceOnUse", children: [_jsx("stop", { offset: "0", stopColor: "#1b9de2" }), _jsx("stop", { offset: ".16", stopColor: "#1595df" }), _jsx("stop", { offset: ".67", stopColor: "#0680d7" }), _jsx("stop", { offset: "1", stopColor: "#0078d4" })] })] }), _jsx("path", { fill: `url(#${uid}SVGktZSUcGK)`, d: "M231 190.5c-3.4 1.8-6.9 3.4-10.5 4.7c-11.5 4.3-23.6 6.5-35.9 6.5c-47.3 0-88.5-32.5-88.5-74.3c.1-11.4 6.4-21.9 16.4-27.3c-42.8 1.8-53.8 46.4-53.8 72.5c0 73.9 68.1 81.4 82.8 81.4c7.9 0 19.8-2.3 27-4.6l1.3-.4c27.6-9.5 51-28.1 66.6-52.8c1.2-1.9.6-4.3-1.2-5.5c-1.3-.8-2.9-.9-4.2-.2" }), _jsx("path", { fill: `url(#${uid}SVGHFrboeCQ)`, d: "M231 190.5c-3.4 1.8-6.9 3.4-10.5 4.7c-11.5 4.3-23.6 6.5-35.9 6.5c-47.3 0-88.5-32.5-88.5-74.3c.1-11.4 6.4-21.9 16.4-27.3c-42.8 1.8-53.8 46.4-53.8 72.5c0 73.9 68.1 81.4 82.8 81.4c7.9 0 19.8-2.3 27-4.6l1.3-.4c27.6-9.5 51-28.1 66.6-52.8c1.2-1.9.6-4.3-1.2-5.5c-1.3-.8-2.9-.9-4.2-.2", opacity: ".35" }), _jsx("path", { fill: `url(#${uid}SVGaPqZBebW)`, d: "M105.7 241.4c-8.9-5.5-16.6-12.8-22.7-21.3c-26.3-36-18.4-86.5 17.6-112.8c3.8-2.7 7.7-5.2 11.9-7.2c3.1-1.5 8.4-4.1 15.5-4c10.1.1 19.6 4.9 25.7 13c4 5.4 6.3 11.9 6.4 18.7c0-.2 24.5-79.6-80-79.6c-43.9 0-80 41.7-80 78.2c-.2 19.3 4 38.5 12.1 56c27.6 58.8 94.8 87.6 156.4 67.1c-21.1 6.6-44.1 3.7-62.9-8.1" }), _jsx("path", { fill: `url(#${uid}SVGVG94vbPK)`, d: "M105.7 241.4c-8.9-5.5-16.6-12.8-22.7-21.3c-26.3-36-18.4-86.5 17.6-112.8c3.8-2.7 7.7-5.2 11.9-7.2c3.1-1.5 8.4-4.1 15.5-4c10.1.1 19.6 4.9 25.7 13c4 5.4 6.3 11.9 6.4 18.7c0-.2 24.5-79.6-80-79.6c-43.9 0-80 41.7-80 78.2c-.2 19.3 4 38.5 12.1 56c27.6 58.8 94.8 87.6 156.4 67.1c-21.1 6.6-44.1 3.7-62.9-8.1", opacity: ".41" }), _jsx("path", { fill: `url(#${uid}SVGw2d8JdCl)`, d: "M152.3 148.9c-.8 1-3.3 2.5-3.3 5.7c0 2.6 1.7 5.1 4.7 7.2c14.4 10 41.5 8.7 41.6 8.7c10.7 0 21.1-2.9 30.3-8.3c18.8-11 30.4-31.1 30.4-52.9c.3-22.4-8-37.3-11.3-43.9C223.5 23.9 177.7 0 128 0C58 0 1 56.2 0 126.2c.5-36.5 36.8-66 80-66c3.5 0 23.5.3 42 10.1c16.3 8.6 24.9 18.9 30.8 29.2c6.2 10.7 7.3 24.1 7.3 29.5c0 5.3-2.7 13.3-7.8 19.9" }), _jsx("path", { fill: `url(#${uid}SVGIqWItcPR)`, d: "M152.3 148.9c-.8 1-3.3 2.5-3.3 5.7c0 2.6 1.7 5.1 4.7 7.2c14.4 10 41.5 8.7 41.6 8.7c10.7 0 21.1-2.9 30.3-8.3c18.8-11 30.4-31.1 30.4-52.9c.3-22.4-8-37.3-11.3-43.9C223.5 23.9 177.7 0 128 0C58 0 1 56.2 0 126.2c.5-36.5 36.8-66 80-66c3.5 0 23.5.3 42 10.1c16.3 8.6 24.9 18.9 30.8 29.2c6.2 10.7 7.3 24.1 7.3 29.5c0 5.3-2.7 13.3-7.8 19.9" })] }));
|
|
10
|
+
};
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
/** @internal Kortix apps only. No semver: it may change in any release. */
|
|
2
|
+
/**
|
|
3
|
+
* The official Telegram logo (telegram.org brand mark): a blue gradient
|
|
4
|
+
* circle with a white paper plane. Static gradient id: the mark is identical
|
|
5
|
+
* wherever it sits, so a shared id resolves to the same fill.
|
|
6
|
+
*/
|
|
2
7
|
export declare const Telegram: ({ className }: {
|
|
3
8
|
className?: string;
|
|
4
9
|
}) => import("react").JSX.Element;
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { cn } from '../lib/utils.js';
|
|
4
|
+
/**
|
|
5
|
+
* The official Telegram logo (telegram.org brand mark): a blue gradient
|
|
6
|
+
* circle with a white paper plane. Static gradient id: the mark is identical
|
|
7
|
+
* wherever it sits, so a shared id resolves to the same fill.
|
|
8
|
+
*/
|
|
4
9
|
export const Telegram = ({ className }) => {
|
|
5
|
-
return (_jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 240 240", className: cn('size-4', className), children: [_jsx("defs", { children: _jsxs("linearGradient", { id: "
|
|
10
|
+
return (_jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 240 240", className: cn('size-4', className), children: [_jsx("defs", { children: _jsxs("linearGradient", { id: "kortix-telegram-logo", x1: "0.5", y1: "0", x2: "0.5", y2: "1", children: [_jsx("stop", { offset: "0", stopColor: "#2AABEE" }), _jsx("stop", { offset: "1", stopColor: "#229ED9" })] }) }), _jsx("circle", { cx: "120", cy: "120", r: "120", fill: "url(#kortix-telegram-logo)" }), _jsx("path", { fill: "#FFFFFF", d: "M54.3 118.8c35-15.2 58.3-25.3 70-30.2 33.3-13.9 40.3-16.3 44.8-16.4 1 0 3.2.2 4.7 1.4 1.2 1 1.5 2.3 1.7 3.3s.4 3.1.2 4.7c-1.8 19-9.6 65.1-13.6 86.3-1.7 9-5 12-8.2 12.3-7 .6-12.3-4.6-19-9-10.6-6.9-16.5-11.2-26.8-18-11.9-7.8-4.2-12.1 2.6-19.1 1.8-1.8 32.5-29.8 33.1-32.3.1-.3.1-1.5-.6-2.1-.7-.6-1.7-.4-2.5-.2-1.1.2-17.9 11.4-50.6 33.5-4.8 3.3-9.1 4.9-13 4.8-4.3-.1-12.5-2.4-18.7-4.4-7.5-2.4-13.5-3.7-13-7.9.3-2.2 3.3-4.4 8.9-6.7z" })] }));
|
|
6
11
|
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/** @internal Kortix apps only. No semver: it may change in any release. */
|
|
2
|
+
import { PopoverContent } from '../../primitives/popover.js';
|
|
3
|
+
import { type ComponentProps, type PointerEvent, type RefObject } from 'react';
|
|
4
|
+
/**
|
|
5
|
+
* The hover card of a sidebar nav row (Apps, Customize): a mouse that rests on
|
|
6
|
+
* the row opens a list of where the row leads, so one click lands on the
|
|
7
|
+
* thing instead of two. The row stays a plain link: the card is a Popover
|
|
8
|
+
* anchored to it (`anchorRef` as `PopoverAnchor virtualRef`), not a menu
|
|
9
|
+
* trigger, which would take Enter and Space for itself.
|
|
10
|
+
*
|
|
11
|
+
* It opens only where hover exists (the session list's gate) and only on the
|
|
12
|
+
* expanded sidebar: the collapsed rail shows the row's tooltip there.
|
|
13
|
+
* `holdRef` names an input that keeps the card open while it has focus.
|
|
14
|
+
*/
|
|
15
|
+
export declare function useNavHoverCard({ enabled, holdRef, }: {
|
|
16
|
+
enabled: boolean;
|
|
17
|
+
holdRef?: RefObject<HTMLElement | null>;
|
|
18
|
+
}): {
|
|
19
|
+
open: boolean;
|
|
20
|
+
setOpen: import("react").Dispatch<import("react").SetStateAction<boolean>>;
|
|
21
|
+
anchorRef: RefObject<HTMLElement>;
|
|
22
|
+
rowProps: {
|
|
23
|
+
onPointerEnter: (event: PointerEvent<HTMLElement>) => void;
|
|
24
|
+
onPointerLeave: (event: PointerEvent<HTMLElement>) => void;
|
|
25
|
+
onClick: () => void;
|
|
26
|
+
};
|
|
27
|
+
contentProps: {
|
|
28
|
+
onPointerEnter: (event: PointerEvent<HTMLElement>) => void;
|
|
29
|
+
onPointerLeave: (event: PointerEvent<HTMLElement>) => void;
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
/** The card's panel: to the right of the row, top edges aligned, never taking focus. */
|
|
33
|
+
export declare function NavHoverCardContent({ className, ...props }: ComponentProps<typeof PopoverContent>): import("react").JSX.Element;
|
|
34
|
+
/** The card's list: the floating-list padding. A list that can grow long sets its own cap. */
|
|
35
|
+
export declare function NavHoverCardList({ className, ...props }: ComponentProps<'ul'>): import("react").JSX.Element;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useMediaQuery } from '../hooks/index.js';
|
|
4
|
+
import { PopoverContent } from '../../primitives/popover.js';
|
|
5
|
+
import { useSidebar } from '../../primitives/sidebar.js';
|
|
6
|
+
import { cn } from '../../lib/utils.js';
|
|
7
|
+
import { useEffect, useRef, useState, } from 'react';
|
|
8
|
+
/** Time the pointer rests on the row before the card opens, so passing over it does nothing. */
|
|
9
|
+
const HOVER_OPEN_DELAY_MS = 400;
|
|
10
|
+
/** Time to cross the gap between the row and its card before it closes. Same as the More row. */
|
|
11
|
+
const HOVER_CLOSE_DELAY_MS = 150;
|
|
12
|
+
/**
|
|
13
|
+
* The hover card of a sidebar nav row (Apps, Customize): a mouse that rests on
|
|
14
|
+
* the row opens a list of where the row leads, so one click lands on the
|
|
15
|
+
* thing instead of two. The row stays a plain link: the card is a Popover
|
|
16
|
+
* anchored to it (`anchorRef` as `PopoverAnchor virtualRef`), not a menu
|
|
17
|
+
* trigger, which would take Enter and Space for itself.
|
|
18
|
+
*
|
|
19
|
+
* It opens only where hover exists (the session list's gate) and only on the
|
|
20
|
+
* expanded sidebar: the collapsed rail shows the row's tooltip there.
|
|
21
|
+
* `holdRef` names an input that keeps the card open while it has focus.
|
|
22
|
+
*/
|
|
23
|
+
export function useNavHoverCard({ enabled, holdRef, }) {
|
|
24
|
+
const canHover = useMediaQuery('(min-width: 768px) and (hover: hover) and (pointer: fine)');
|
|
25
|
+
const { state } = useSidebar();
|
|
26
|
+
const [open, setOpen] = useState(false);
|
|
27
|
+
const anchorRef = useRef(null);
|
|
28
|
+
const openTimer = useRef(undefined);
|
|
29
|
+
const closeTimer = useRef(undefined);
|
|
30
|
+
const active = enabled && canHover && state === 'expanded';
|
|
31
|
+
const cancelTimers = () => {
|
|
32
|
+
clearTimeout(openTimer.current);
|
|
33
|
+
clearTimeout(closeTimer.current);
|
|
34
|
+
};
|
|
35
|
+
useEffect(() => cancelTimers, []);
|
|
36
|
+
// An open card stays open while the pointer crosses between row and card;
|
|
37
|
+
// a closed one opens only after the pointer rests on the row.
|
|
38
|
+
const hoverOpen = (event) => {
|
|
39
|
+
if (event.pointerType !== 'mouse' || !active)
|
|
40
|
+
return;
|
|
41
|
+
cancelTimers();
|
|
42
|
+
if (open)
|
|
43
|
+
return;
|
|
44
|
+
openTimer.current = setTimeout(() => setOpen(true), HOVER_OPEN_DELAY_MS);
|
|
45
|
+
};
|
|
46
|
+
const hoverClose = (event) => {
|
|
47
|
+
if (event.pointerType !== 'mouse')
|
|
48
|
+
return;
|
|
49
|
+
cancelTimers();
|
|
50
|
+
closeTimer.current = setTimeout(() => {
|
|
51
|
+
// Typing in the card keeps it; a click outside or Escape closes it.
|
|
52
|
+
if (holdRef?.current && document.activeElement === holdRef.current)
|
|
53
|
+
return;
|
|
54
|
+
setOpen(false);
|
|
55
|
+
}, HOVER_CLOSE_DELAY_MS);
|
|
56
|
+
};
|
|
57
|
+
return {
|
|
58
|
+
open: open && active,
|
|
59
|
+
setOpen,
|
|
60
|
+
anchorRef: anchorRef,
|
|
61
|
+
rowProps: {
|
|
62
|
+
onPointerEnter: (event) => {
|
|
63
|
+
anchorRef.current = event.currentTarget;
|
|
64
|
+
hoverOpen(event);
|
|
65
|
+
},
|
|
66
|
+
onPointerLeave: hoverClose,
|
|
67
|
+
onClick: () => {
|
|
68
|
+
cancelTimers();
|
|
69
|
+
setOpen(false);
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
contentProps: { onPointerEnter: hoverOpen, onPointerLeave: hoverClose },
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/** The card's panel: to the right of the row, top edges aligned, never taking focus. */
|
|
76
|
+
export function NavHoverCardContent({ className, ...props }) {
|
|
77
|
+
return (_jsx(PopoverContent, { side: "right", align: "start", sideOffset: 8, className: cn('w-60 overflow-hidden p-0', className),
|
|
78
|
+
// Hover must not move focus: the row keeps it, and so does the page.
|
|
79
|
+
onOpenAutoFocus: (event) => event.preventDefault(), onCloseAutoFocus: (event) => event.preventDefault(), ...props }));
|
|
80
|
+
}
|
|
81
|
+
/** The card's list: the floating-list padding. A list that can grow long sets its own cap. */
|
|
82
|
+
export function NavHoverCardList({ className, ...props }) {
|
|
83
|
+
return _jsx("ul", { className: cn('p-1', className), ...props });
|
|
84
|
+
}
|
|
@@ -2,8 +2,10 @@
|
|
|
2
2
|
import { HoverPrefetchLink } from '../components/hover-prefetch-link.js';
|
|
3
3
|
import type { ComponentProps, ReactNode } from 'react';
|
|
4
4
|
/** Keep the anchor's intent handlers and the caller's active-route semantics. */
|
|
5
|
-
export declare function ProjectNavRow({ active, label, children, ...link }: ComponentProps<typeof HoverPrefetchLink> & {
|
|
5
|
+
export declare function ProjectNavRow({ active, label, className, children, ...link }: ComponentProps<typeof HoverPrefetchLink> & {
|
|
6
6
|
active: boolean;
|
|
7
7
|
label: string;
|
|
8
|
+
/** Added to the row button's classes. */
|
|
9
|
+
className?: string;
|
|
8
10
|
children: ReactNode;
|
|
9
11
|
}): import("react").JSX.Element;
|
|
@@ -3,11 +3,12 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
3
3
|
import { HoverPrefetchLink } from '../components/hover-prefetch-link.js';
|
|
4
4
|
import { SidebarMenuButton, SidebarMenuItem, useSidebar } from '../../primitives/sidebar.js';
|
|
5
5
|
import { useIsMobile } from '../hooks/index.js';
|
|
6
|
+
import { cn } from '../lib/utils.js';
|
|
6
7
|
/** Keep the anchor's intent handlers and the caller's active-route semantics. */
|
|
7
|
-
export function ProjectNavRow({ active, label, children, ...link }) {
|
|
8
|
+
export function ProjectNavRow({ active, label, className, children, ...link }) {
|
|
8
9
|
const isMobile = useIsMobile();
|
|
9
10
|
const { setOpenMobile } = useSidebar();
|
|
10
|
-
return (_jsx(SidebarMenuItem, { children: _jsx(SidebarMenuButton, { asChild: true, isActive: active, tooltip: label, className:
|
|
11
|
+
return (_jsx(SidebarMenuItem, { children: _jsx(SidebarMenuButton, { asChild: true, isActive: active, tooltip: label, className: cn('group/menu-button text-sidebar-foreground relative', className), children: _jsx(HoverPrefetchLink, { ...link, onClick: (event) => {
|
|
11
12
|
link.onClick?.(event);
|
|
12
13
|
if (isMobile)
|
|
13
14
|
setOpenMobile(false);
|
|
@@ -5,12 +5,14 @@
|
|
|
5
5
|
* same title-bar classes as the Customize tab bar (`CapabilityTabs`), so it
|
|
6
6
|
* has the same height and clears the desktop window controls the same way.
|
|
7
7
|
* A page has one view, so the title is plain text, not a one-tab underline
|
|
8
|
-
* bar. `
|
|
8
|
+
* bar. `titleAccessory` sits right after the title (a docs link). `children`
|
|
9
|
+
* sit at the trailing edge (page actions).
|
|
9
10
|
*
|
|
10
11
|
* The e2e journey `18-apps-ui` finds the page by the
|
|
11
12
|
* `<h1>`.
|
|
12
13
|
*/
|
|
13
|
-
export declare function ProjectPageHeader({ title, children, }: {
|
|
14
|
+
export declare function ProjectPageHeader({ title, titleAccessory, children, }: {
|
|
14
15
|
title: string;
|
|
16
|
+
titleAccessory?: React.ReactNode;
|
|
15
17
|
children?: React.ReactNode;
|
|
16
18
|
}): import("react").JSX.Element;
|
|
@@ -8,12 +8,13 @@ import { SidebarToggle } from './sidebar-toggle.js';
|
|
|
8
8
|
* same title-bar classes as the Customize tab bar (`CapabilityTabs`), so it
|
|
9
9
|
* has the same height and clears the desktop window controls the same way.
|
|
10
10
|
* A page has one view, so the title is plain text, not a one-tab underline
|
|
11
|
-
* bar. `
|
|
11
|
+
* bar. `titleAccessory` sits right after the title (a docs link). `children`
|
|
12
|
+
* sit at the trailing edge (page actions).
|
|
12
13
|
*
|
|
13
14
|
* The e2e journey `18-apps-ui` finds the page by the
|
|
14
15
|
* `<h1>`.
|
|
15
16
|
*/
|
|
16
|
-
export function ProjectPageHeader({ title, children, }) {
|
|
17
|
+
export function ProjectPageHeader({ title, titleAccessory, children, }) {
|
|
17
18
|
const sidebar = useOptionalSidebar();
|
|
18
|
-
return (_jsxs("div", { className: "kx-titlebar-row kx-capability-titlebar relative flex shrink-0 items-center gap-1 border-b px-2", "data-sidebar-collapsed": sidebar?.state === 'collapsed' || undefined, children: [_jsx(SidebarToggle, {}),
|
|
19
|
+
return (_jsxs("div", { className: "kx-titlebar-row kx-capability-titlebar relative flex shrink-0 items-center gap-1 border-b px-2", "data-sidebar-collapsed": sidebar?.state === 'collapsed' || undefined, children: [_jsx(SidebarToggle, {}), _jsxs("div", { className: "kx-titlebar-tabs flex h-10 min-w-0 flex-1 items-center gap-1.5 px-3", children: [_jsx("h1", { className: "text-foreground truncate text-sm font-medium", children: title }), titleAccessory] }), children ? _jsx("div", { className: "flex shrink-0 items-center gap-1", children: children }) : null] }));
|
|
19
20
|
}
|
|
@@ -7,11 +7,37 @@ export { CustomizeGlyph } from '../icons/customize.js';
|
|
|
7
7
|
import { useTranslations } from '../../i18n/index.js';
|
|
8
8
|
import { useUiPathname } from '../../providers/ui-provider.js';
|
|
9
9
|
import { CountBadge } from '../../primitives/count-badge.js';
|
|
10
|
-
import {
|
|
10
|
+
import { cn } from '../lib/utils.js';
|
|
11
|
+
import { CAPABILITY_TABS, activeCapabilityTab, capabilityTabHref, } from '../lib/capability-tab-routes.js';
|
|
11
12
|
import { PROJECT_ACTIONS } from '../lib/project-actions.js';
|
|
12
13
|
import { useFeatureFlag } from '@kortix/sdk/react';
|
|
13
14
|
import { useProjectPageCans } from '../lib/use-project-can.js';
|
|
14
15
|
import { useReviewSessionSummary } from '../hooks/use-review-session-summary.js';
|
|
16
|
+
import { HubLink } from '../account-hub/account-hub-location.js';
|
|
17
|
+
import { hubTarget } from '../stores/account-panel-store.js';
|
|
18
|
+
import { HoverPrefetchLink } from '../components/hover-prefetch-link.js';
|
|
19
|
+
import { NavHoverCardContent, NavHoverCardList, useNavHoverCard } from './nav-hover-card.js';
|
|
20
|
+
import { useLocalizedUiCatalog } from '../../i18n/ui-catalog/use-localized-ui-catalog.js';
|
|
21
|
+
import { MENU_SEPARATOR, menuRow } from '../../primitives/menu-recipe.js';
|
|
22
|
+
import { Popover, PopoverAnchor } from '../../primitives/popover.js';
|
|
23
|
+
import { getProjectDetail } from '@kortix/sdk';
|
|
24
|
+
import { contract, qk } from '@kortix/sdk/react';
|
|
25
|
+
import { useQuery } from '@tanstack/react-query';
|
|
26
|
+
import { AlarmIcon, CalendarIcon, CpuIcon, GearSixIcon, GitBranchIcon, LockKeyIcon, PlugIcon, RobotIcon, SquaresFourIcon, TrayIcon, UsersIcon, } from '@phosphor-icons/react';
|
|
27
|
+
import { Fragment } from 'react';
|
|
28
|
+
/** Each tab's glyph: the one the command palette shows for the same page (`menu-registry.ts`). */
|
|
29
|
+
const TAB_ICONS = {
|
|
30
|
+
agent: RobotIcon,
|
|
31
|
+
skills: SquaresFourIcon,
|
|
32
|
+
connectors: PlugIcon,
|
|
33
|
+
triggers: AlarmIcon,
|
|
34
|
+
reminders: CalendarIcon,
|
|
35
|
+
models: CpuIcon,
|
|
36
|
+
secrets: LockKeyIcon,
|
|
37
|
+
files: GitBranchIcon,
|
|
38
|
+
review: TrayIcon,
|
|
39
|
+
config: GearSixIcon,
|
|
40
|
+
};
|
|
15
41
|
/**
|
|
16
42
|
* The one project-configuration entry in the sidebar:
|
|
17
43
|
* ProjectCustomizeNavItem, top of the panel under New session, navigating to
|
|
@@ -197,10 +223,41 @@ export function ProjectCustomizeNavItem({ projectId }) {
|
|
|
197
223
|
// Connectors or one agent's page, not just on the landing tab.
|
|
198
224
|
const isActive = !!pathname &&
|
|
199
225
|
(pathname === customizePath(projectId) || activeCapabilityTab(pathname) !== null);
|
|
226
|
+
const card = useNavHoverCard({ enabled: !!tab && !!projectId });
|
|
200
227
|
if (!tab)
|
|
201
228
|
return null;
|
|
202
229
|
// No project id means no valid href, so there is nothing to render.
|
|
203
230
|
if (!projectId)
|
|
204
231
|
return null;
|
|
205
|
-
return (_jsxs(ProjectNavRow, { active: isActive, label: t('customize'), href: capabilityTabHref(projectId, tab), prefetch: true, children: [_jsx("span", { className: "shrink-0", children: _jsx(CustomizeGlyph, {}) }), t('customize'), reviewCount > 0 ? (_jsx("span", { className: "ml-auto flex shrink-0 items-center gap-1", children: _jsx(CountBadge, { count: reviewCount, tone: "waiting" }) })) : null] }));
|
|
232
|
+
return (_jsxs(Popover, { open: card.open, onOpenChange: card.setOpen, children: [_jsx(PopoverAnchor, { virtualRef: card.anchorRef }), _jsxs(ProjectNavRow, { active: isActive, label: t('customize'), href: capabilityTabHref(projectId, tab), prefetch: true, ...card.rowProps, children: [_jsx("span", { className: "shrink-0", children: _jsx(CustomizeGlyph, {}) }), t('customize'), reviewCount > 0 ? (_jsx("span", { className: "ml-auto flex shrink-0 items-center gap-1", children: _jsx(CountBadge, { count: reviewCount, tone: "waiting" }) })) : null] }), _jsx(NavHoverCardContent, { ...card.contentProps, children: _jsx(CustomizeCardList, { projectId: projectId, tabs: access.tabs, reviewCount: reviewCount, onOpen: () => card.setOpen(false) }) })] }));
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* The Customize card: every tab the caller may open, in the tab bar's order
|
|
236
|
+
* and with its seams (Agents | the library | Members and Settings), so the
|
|
237
|
+
* card and the bar read as one list. Members is the bar's launcher into the
|
|
238
|
+
* Access hub, gated the same way (`project.members.read`).
|
|
239
|
+
*/
|
|
240
|
+
function CustomizeCardList({ projectId, tabs, reviewCount, onOpen, }) {
|
|
241
|
+
const tI18nComplete = useTranslations('hardcodedUi.i18nComplete');
|
|
242
|
+
const allTabs = useLocalizedUiCatalog(CAPABILITY_TABS);
|
|
243
|
+
const { data } = useQuery({
|
|
244
|
+
queryKey: qk.project.detail(projectId),
|
|
245
|
+
queryFn: () => getProjectDetail(projectId),
|
|
246
|
+
...contract('config'),
|
|
247
|
+
});
|
|
248
|
+
const canReadMembers = useProjectPageCans(projectId)[PROJECT_ACTIONS.PROJECT_MEMBERS_READ]?.allowed === true;
|
|
249
|
+
const accountId = data?.project?.account_id;
|
|
250
|
+
const allowed = new Set(tabs);
|
|
251
|
+
const shown = allTabs.filter((entry) => allowed.has(entry.key));
|
|
252
|
+
const rowClass = menuRow('sm', 'default', 'cursor-pointer');
|
|
253
|
+
const tabRow = (entry) => {
|
|
254
|
+
const TabIcon = TAB_ICONS[entry.key];
|
|
255
|
+
return (_jsx("li", { children: _jsxs(HoverPrefetchLink, { href: capabilityTabHref(projectId, entry.key), onClick: onOpen, className: rowClass, children: [_jsx(TabIcon, { "aria-hidden": true }), _jsx("span", { className: "min-w-0 flex-1 truncate", children: entry.label }), entry.key === 'review' && reviewCount > 0 ? _jsx(CountBadge, { count: reviewCount, tone: "waiting" }) : null] }) }, entry.key));
|
|
256
|
+
};
|
|
257
|
+
const primary = shown.filter((entry) => entry.key === 'agent');
|
|
258
|
+
const library = shown.filter((entry) => entry.key !== 'agent' && entry.key !== 'config');
|
|
259
|
+
const trailing = shown.filter((entry) => entry.key === 'config');
|
|
260
|
+
const members = canReadMembers && accountId ? (_jsx("li", { children: _jsxs(HubLink, { to: hubTarget(accountId, { tab: 'access-projects', project: projectId }), onClick: onOpen, className: rowClass, children: [_jsx(UsersIcon, { "aria-hidden": true }), _jsx("span", { className: "min-w-0 flex-1 truncate", children: tI18nComplete.raw('text1044a4c056d0') })] }) }, "members")) : null;
|
|
261
|
+
const groups = [primary.map(tabRow), library.map(tabRow), [members, ...trailing.map(tabRow)].filter(Boolean)].filter((group) => group.length > 0);
|
|
262
|
+
return (_jsx(NavHoverCardList, { children: groups.map((group, index) => (_jsxs(Fragment, { children: [index > 0 ? _jsx("li", { "aria-hidden": true, className: cn(MENU_SEPARATOR, '-mx-1') }) : null, group] }, index))) }));
|
|
206
263
|
}
|
|
@@ -4,7 +4,7 @@ export { isEmptyMessageUnresolvedBrowserChunkNoise, isStaleWebpackRuntimeCallNoi
|
|
|
4
4
|
export { isClientRequestTimeoutMessage, isExpectedBillingGateMessage, isExpectedCompactionNoModelMessage, isGitMirrorUnavailableNoiseMessage, isModelNotServableNoise, isRuntimeNotReadyNoiseMessage, isServerDeadlineNoiseMessage, } from './browser-noise/rules/expected-states.js';
|
|
5
5
|
export { isCaptchaInterceptorNoise, isExtensionRejectedObjectNoise, isExtensionSource, isInjectedAppSource, isInjectedScriptSendMessageNoise, isInpageJsNoErrorMessageNoise, isInpageWalletStreamNoise, isTronLinkProxyNoise, isUserscriptManagerNoise, } from './browser-noise/rules/extensions.js';
|
|
6
6
|
export { isCanvasImageDataOOMNoise, isPaperShaderImageUniformNoise, isPaperShaderNullContextNoise, isPaperShaderWebGLUnsupportedNoise, isSpoofedWebGLGetParameterNoise, } from './browser-noise/rules/graphics.js';
|
|
7
|
-
export { isOneTrustJsonParseNoise, isRedefineInjectedWalletNoise, isRedefineWebdriverNoise, isVercelLiveFeedbackNoise, } from './browser-noise/rules/injected-scripts.js';
|
|
7
|
+
export { isGoogletagUndefinedNoise, isOneTrustJsonParseNoise, isRedefineInjectedWalletNoise, isRedefineWebdriverNoise, isVercelLiveFeedbackNoise, } from './browser-noise/rules/injected-scripts.js';
|
|
8
8
|
export { isKnownBrowserNoiseMessage, isKnownTestNoiseMessage, } from './browser-noise/rules/messages.js';
|
|
9
9
|
export { isConnectionClosedNoise, isFailedToSendMessageNoise, isFramelessNetworkErrorNoise, isSignalTimeoutNoise, } from './browser-noise/rules/network.js';
|
|
10
10
|
export { isIosWebViewInjectedStackOverflowNoise, isOldBrowserDomNullDerefNoise, isFirefoxDeadObjectUnattributableNoise, isOldBrowserSyntaxParseError, isOldWebkitRegexNoiseMessage, isUndefinedVariableThirdPartyNoise, isUnresolvableStackOverflowNoise, } from './browser-noise/rules/old-browsers.js';
|
|
@@ -29,7 +29,7 @@ export { isEmptyMessageUnresolvedBrowserChunkNoise, isStaleWebpackRuntimeCallNoi
|
|
|
29
29
|
export { isClientRequestTimeoutMessage, isExpectedBillingGateMessage, isExpectedCompactionNoModelMessage, isGitMirrorUnavailableNoiseMessage, isModelNotServableNoise, isRuntimeNotReadyNoiseMessage, isServerDeadlineNoiseMessage, } from './browser-noise/rules/expected-states.js';
|
|
30
30
|
export { isCaptchaInterceptorNoise, isExtensionRejectedObjectNoise, isExtensionSource, isInjectedAppSource, isInjectedScriptSendMessageNoise, isInpageJsNoErrorMessageNoise, isInpageWalletStreamNoise, isTronLinkProxyNoise, isUserscriptManagerNoise, } from './browser-noise/rules/extensions.js';
|
|
31
31
|
export { isCanvasImageDataOOMNoise, isPaperShaderImageUniformNoise, isPaperShaderNullContextNoise, isPaperShaderWebGLUnsupportedNoise, isSpoofedWebGLGetParameterNoise, } from './browser-noise/rules/graphics.js';
|
|
32
|
-
export { isOneTrustJsonParseNoise, isRedefineInjectedWalletNoise, isRedefineWebdriverNoise, isVercelLiveFeedbackNoise, } from './browser-noise/rules/injected-scripts.js';
|
|
32
|
+
export { isGoogletagUndefinedNoise, isOneTrustJsonParseNoise, isRedefineInjectedWalletNoise, isRedefineWebdriverNoise, isVercelLiveFeedbackNoise, } from './browser-noise/rules/injected-scripts.js';
|
|
33
33
|
export { isKnownBrowserNoiseMessage, isKnownTestNoiseMessage, } from './browser-noise/rules/messages.js';
|
|
34
34
|
export { isConnectionClosedNoise, isFailedToSendMessageNoise, isFramelessNetworkErrorNoise, isSignalTimeoutNoise, } from './browser-noise/rules/network.js';
|
|
35
35
|
export { isIosWebViewInjectedStackOverflowNoise, isOldBrowserDomNullDerefNoise, isFirefoxDeadObjectUnattributableNoise, isOldBrowserSyntaxParseError, isOldWebkitRegexNoiseMessage, isUndefinedVariableThirdPartyNoise, isUnresolvableStackOverflowNoise, } from './browser-noise/rules/old-browsers.js';
|
|
@@ -615,8 +615,9 @@ export function isCaptchaInterceptorNoise(input) {
|
|
|
615
615
|
}
|
|
616
616
|
/**
|
|
617
617
|
* An injected wallet provider rejecting a pending request with the EIP-1474
|
|
618
|
-
* default internal error, `{ code: -32603, message: 'Internal JSON-RPC error.' }
|
|
619
|
-
*
|
|
618
|
+
* default internal error, `{ code: -32603, message: 'Internal JSON-RPC error.' }`,
|
|
619
|
+
* or the exact missing-account error captured in KRTX-2150 (code 4001).
|
|
620
|
+
* Both use the wallet provider's own wording. The rejected value is a plain
|
|
620
621
|
* object with no `stack`, so Sentry reports a frameless synthetic
|
|
621
622
|
* "Object captured as promise rejection with keys: code, message" and the
|
|
622
623
|
* extension-stack anchor above cannot see it. Better Stack, Kortix Frontend
|
|
@@ -633,7 +634,11 @@ function isWalletInternalRpcRejectionNoise(input) {
|
|
|
633
634
|
const value = serialized;
|
|
634
635
|
if (Object.keys(value).sort().join(',') !== 'code,message')
|
|
635
636
|
return false;
|
|
636
|
-
|
|
637
|
+
// KRTX-2150 recurred with a second frameless wallet payload (2026-10-29).
|
|
638
|
+
// Match the exact pair, not EIP-1193 code 4001 alone (user rejection).
|
|
639
|
+
const internal = value.code === -32603 && value.message === 'Internal JSON-RPC error.';
|
|
640
|
+
const missingAccount = value.code === 4001 && value.message === 'wallet must has at least one account';
|
|
641
|
+
if (!internal && !missingAccount)
|
|
637
642
|
return false;
|
|
638
643
|
return !sourcesOf(input).some((source) => isBrowserBundleSource(source) || isFirstPartyResolvedSource(source));
|
|
639
644
|
}
|
|
@@ -677,6 +682,15 @@ function isWalletProviderDisconnectedRejectionNoise(input) {
|
|
|
677
682
|
return !sourcesOf(input).some((source) => isBrowserBundleSource(source) || isFirstPartyResolvedSource(source));
|
|
678
683
|
}
|
|
679
684
|
export const EXTENSION_RULES = [
|
|
685
|
+
{
|
|
686
|
+
// Talisman's injected page.js rejects before wallet onboarding (KRTX-3678).
|
|
687
|
+
// Require its exact message and response frame; page.js alone is ambiguous.
|
|
688
|
+
id: 'talisman-onboarding',
|
|
689
|
+
appliesTo: 'sentry',
|
|
690
|
+
match: ({ message, frames }) => normalizeString(message) === 'Talisman extension has not been configured yet. Please continue with onboarding.' &&
|
|
691
|
+
!frames.some((frame) => isFirstPartyResolvedSource(frame.filename)) &&
|
|
692
|
+
frames.some((frame) => frame.filename === 'app:///page.js' && frame.function === 'ne.handleResponse'),
|
|
693
|
+
},
|
|
680
694
|
{
|
|
681
695
|
id: 'injected-app-source',
|
|
682
696
|
appliesTo: 'both',
|
|
@@ -70,6 +70,13 @@ export declare function isInjectedWalletProviderWriteNoise(input: {
|
|
|
70
70
|
filename?: unknown;
|
|
71
71
|
} | undefined>;
|
|
72
72
|
}): boolean;
|
|
73
|
+
export declare function isGoogletagUndefinedNoise(input: {
|
|
74
|
+
message?: unknown;
|
|
75
|
+
filename?: unknown;
|
|
76
|
+
frames?: Array<{
|
|
77
|
+
filename?: unknown;
|
|
78
|
+
} | undefined>;
|
|
79
|
+
}): boolean;
|
|
73
80
|
/** Vercel toolbar frames have a reserved source path outside app bundles. */
|
|
74
81
|
export declare function isVercelLiveFeedbackNoise(input: {
|
|
75
82
|
filename?: unknown;
|
|
@@ -213,6 +213,20 @@ export function isInjectedWalletProviderWriteNoise(input) {
|
|
|
213
213
|
return (UNDEFINED_WALLET_PROVIDER_WRITE_MESSAGE.test(stripped) &&
|
|
214
214
|
!sources.some((source) => isBrowserBundleSource(source) || isFirstPartyResolvedSource(source)));
|
|
215
215
|
}
|
|
216
|
+
/**
|
|
217
|
+
* A tag that calls Google Publisher Tag (`googletag`) before its library
|
|
218
|
+
* loads: `googletag is not defined` (V8, Gecko) or `Can't find variable:
|
|
219
|
+
* googletag` (WebKit). Better Stack, Kortix Frontend prod, 2026-10-27
|
|
220
|
+
* (KRTX-3549): 71 events in 2 s from one `<anonymous>` frame, 0 users. Kortix
|
|
221
|
+
* never loads or calls `googletag`; its Google Tag Manager writes only to
|
|
222
|
+
* `dataLayer`. A frame in our bundles or resolved first-party source keeps
|
|
223
|
+
* reporting.
|
|
224
|
+
*/
|
|
225
|
+
const GOOGLETAG_UNDEFINED_MESSAGE = /^(?:googletag is not defined|Can't find variable: googletag)$/;
|
|
226
|
+
export function isGoogletagUndefinedNoise(input) {
|
|
227
|
+
return (GOOGLETAG_UNDEFINED_MESSAGE.test(stripErrorWrappers(normalizeString(input.message))) &&
|
|
228
|
+
!sourcesOf(input).some((source) => isBrowserBundleSource(source) || isFirstPartyResolvedSource(source)));
|
|
229
|
+
}
|
|
216
230
|
/** Vercel toolbar frames have a reserved source path outside app bundles. */
|
|
217
231
|
export function isVercelLiveFeedbackNoise(input) {
|
|
218
232
|
const sources = sourcesOf(input);
|
|
@@ -225,5 +239,6 @@ export const INJECTED_SCRIPT_RULES = [
|
|
|
225
239
|
{ id: 'redefine-webdriver', appliesTo: 'both', match: isRedefineWebdriverNoise },
|
|
226
240
|
{ id: 'redefine-wallet-provider', appliesTo: 'both', match: isRedefineInjectedWalletNoise },
|
|
227
241
|
{ id: 'wallet-provider-write', appliesTo: 'both', match: isInjectedWalletProviderWriteNoise },
|
|
242
|
+
{ id: 'googletag-undefined', appliesTo: 'both', match: isGoogletagUndefinedNoise },
|
|
228
243
|
{ id: 'vercel-live-feedback', appliesTo: 'both', match: isVercelLiveFeedbackNoise },
|
|
229
244
|
];
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** @internal Kortix apps only. No semver: it may change in any release. */
|
|
2
|
+
/**
|
|
3
|
+
* Platform detection for the /download page and the per-platform redirect
|
|
4
|
+
* routes.
|
|
5
|
+
*
|
|
6
|
+
* Detection runs on the SERVER, from the request's user-agent header, so the
|
|
7
|
+
* page paints the correct filled button (and, on a phone, the mobile card
|
|
8
|
+
* first) on first render. A client-side `useEffect` swap would let a visitor click the wrong
|
|
9
|
+
* installer during the flash — the exact failure this page exists to prevent.
|
|
10
|
+
*
|
|
11
|
+
* Architecture is deliberately NOT detected: macOS ships a single universal
|
|
12
|
+
* .dmg, and macOS user agents misreport arch anyway (they always claim Intel).
|
|
13
|
+
*/
|
|
14
|
+
export type DesktopOs = 'macos' | 'windows' | 'linux';
|
|
15
|
+
export type MobileOs = 'ios' | 'android';
|
|
16
|
+
export type Platform = DesktopOs | MobileOs;
|
|
17
|
+
/** Fixed row order. Detection never reorders rows; it only picks the filled button. */
|
|
18
|
+
export declare const DESKTOP_ORDER: readonly DesktopOs[];
|
|
19
|
+
export declare const MOBILE_ORDER: readonly MobileOs[];
|
|
20
|
+
/** Map an explicit `?platform=` value or `/download/<segment>` to a platform. */
|
|
21
|
+
export declare function normalizePlatform(raw: string | null | undefined): Platform | null;
|
|
22
|
+
/**
|
|
23
|
+
* Best-effort platform from a user-agent string.
|
|
24
|
+
*
|
|
25
|
+
* THE ORDER OF THESE CHECKS IS LOAD-BEARING. Two user agents carry another
|
|
26
|
+
* platform's token:
|
|
27
|
+
* iPad "Mozilla/5.0 (iPad; CPU OS 17_0 like Mac OS X)" contains "mac"
|
|
28
|
+
* Android "Mozilla/5.0 (Linux; Android 14; Pixel 8)" contains "linux"
|
|
29
|
+
* So iOS is tested before macOS, and Android before Linux. `detect-os.test.ts`
|
|
30
|
+
* pins both; if you reorder these lines, those tests fail.
|
|
31
|
+
*
|
|
32
|
+
* KNOWN LIMITATION: an iPad with "Request Desktop Website" enabled sends a UA
|
|
33
|
+
* byte-identical to a Mac's. No server can separate them — real detection needs
|
|
34
|
+
* `navigator.maxTouchPoints`, which is not in any request header. That visitor
|
|
35
|
+
* gets the Desktop card first; the Mobile card is still on the page, one tap
|
|
36
|
+
* away. Fixing it client-side would reintroduce the wrong-file-click window
|
|
37
|
+
* this module exists to close.
|
|
38
|
+
*
|
|
39
|
+
* Defaults to macOS: the largest desktop segment for this product, and every
|
|
40
|
+
* other platform stays one click away on the page.
|
|
41
|
+
*/
|
|
42
|
+
export declare function detectPlatform(userAgent: string | null | undefined): Platform;
|
|
43
|
+
export declare function isMobilePlatform(platform: Platform): platform is MobileOs;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Platform detection for the /download page and the per-platform redirect
|
|
3
|
+
* routes.
|
|
4
|
+
*
|
|
5
|
+
* Detection runs on the SERVER, from the request's user-agent header, so the
|
|
6
|
+
* page paints the correct filled button (and, on a phone, the mobile card
|
|
7
|
+
* first) on first render. A client-side `useEffect` swap would let a visitor click the wrong
|
|
8
|
+
* installer during the flash — the exact failure this page exists to prevent.
|
|
9
|
+
*
|
|
10
|
+
* Architecture is deliberately NOT detected: macOS ships a single universal
|
|
11
|
+
* .dmg, and macOS user agents misreport arch anyway (they always claim Intel).
|
|
12
|
+
*/
|
|
13
|
+
/** Fixed row order. Detection never reorders rows; it only picks the filled button. */
|
|
14
|
+
export const DESKTOP_ORDER = ['macos', 'windows', 'linux'];
|
|
15
|
+
export const MOBILE_ORDER = ['ios', 'android'];
|
|
16
|
+
const PLATFORM_ALIASES = {
|
|
17
|
+
mac: 'macos',
|
|
18
|
+
macos: 'macos',
|
|
19
|
+
osx: 'macos',
|
|
20
|
+
darwin: 'macos',
|
|
21
|
+
apple: 'macos',
|
|
22
|
+
win: 'windows',
|
|
23
|
+
windows: 'windows',
|
|
24
|
+
linux: 'linux',
|
|
25
|
+
ios: 'ios',
|
|
26
|
+
iphone: 'ios',
|
|
27
|
+
ipad: 'ios',
|
|
28
|
+
android: 'android',
|
|
29
|
+
};
|
|
30
|
+
/** Map an explicit `?platform=` value or `/download/<segment>` to a platform. */
|
|
31
|
+
export function normalizePlatform(raw) {
|
|
32
|
+
return PLATFORM_ALIASES[(raw || '').toLowerCase()] ?? null;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Best-effort platform from a user-agent string.
|
|
36
|
+
*
|
|
37
|
+
* THE ORDER OF THESE CHECKS IS LOAD-BEARING. Two user agents carry another
|
|
38
|
+
* platform's token:
|
|
39
|
+
* iPad "Mozilla/5.0 (iPad; CPU OS 17_0 like Mac OS X)" contains "mac"
|
|
40
|
+
* Android "Mozilla/5.0 (Linux; Android 14; Pixel 8)" contains "linux"
|
|
41
|
+
* So iOS is tested before macOS, and Android before Linux. `detect-os.test.ts`
|
|
42
|
+
* pins both; if you reorder these lines, those tests fail.
|
|
43
|
+
*
|
|
44
|
+
* KNOWN LIMITATION: an iPad with "Request Desktop Website" enabled sends a UA
|
|
45
|
+
* byte-identical to a Mac's. No server can separate them — real detection needs
|
|
46
|
+
* `navigator.maxTouchPoints`, which is not in any request header. That visitor
|
|
47
|
+
* gets the Desktop card first; the Mobile card is still on the page, one tap
|
|
48
|
+
* away. Fixing it client-side would reintroduce the wrong-file-click window
|
|
49
|
+
* this module exists to close.
|
|
50
|
+
*
|
|
51
|
+
* Defaults to macOS: the largest desktop segment for this product, and every
|
|
52
|
+
* other platform stays one click away on the page.
|
|
53
|
+
*/
|
|
54
|
+
export function detectPlatform(userAgent) {
|
|
55
|
+
const ua = (userAgent || '').toLowerCase();
|
|
56
|
+
if (ua.includes('iphone') || ua.includes('ipad') || ua.includes('ipod'))
|
|
57
|
+
return 'ios';
|
|
58
|
+
if (ua.includes('android'))
|
|
59
|
+
return 'android';
|
|
60
|
+
if (ua.includes('windows'))
|
|
61
|
+
return 'windows';
|
|
62
|
+
if (ua.includes('mac') || ua.includes('darwin'))
|
|
63
|
+
return 'macos';
|
|
64
|
+
if (ua.includes('linux'))
|
|
65
|
+
return 'linux';
|
|
66
|
+
return 'macos';
|
|
67
|
+
}
|
|
68
|
+
export function isMobilePlatform(platform) {
|
|
69
|
+
return platform === 'ios' || platform === 'android';
|
|
70
|
+
}
|
|
@@ -3,7 +3,7 @@ export type ManifestVersion = 1 | 2 | 3;
|
|
|
3
3
|
export declare function detectManifestVersion(manifestRaw: string | null | undefined): ManifestVersion;
|
|
4
4
|
/** The manifest file a version lives in. An unresolved read (`null`) reads as v1. */
|
|
5
5
|
export declare function manifestFilename(version: number | null): 'kortix.toml' | 'kortix.yaml';
|
|
6
|
-
/**
|
|
6
|
+
/** A v1 or v2 project is offered the upgrade to v3. `null` (not read yet) is not. */
|
|
7
7
|
export declare function manifestNeedsUpgrade(version: ManifestVersion | null): boolean;
|
|
8
8
|
export interface ProjectManifestVersionState {
|
|
9
9
|
/** `null` while the project-detail fetch is still in flight — callers that
|
|
@@ -27,9 +27,9 @@ export function detectManifestVersion(manifestRaw) {
|
|
|
27
27
|
export function manifestFilename(version) {
|
|
28
28
|
return (version ?? 1) >= 2 ? 'kortix.yaml' : 'kortix.toml';
|
|
29
29
|
}
|
|
30
|
-
/**
|
|
30
|
+
/** A v1 or v2 project is offered the upgrade to v3. `null` (not read yet) is not. */
|
|
31
31
|
export function manifestNeedsUpgrade(version) {
|
|
32
|
-
return version === 1;
|
|
32
|
+
return version === 1 || version === 2;
|
|
33
33
|
}
|
|
34
34
|
/**
|
|
35
35
|
* Reads the SAME `qk.project.detail(id)` query the rest of Customize already
|