@kortix/ui 0.14.8 → 0.14.9
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 +63 -3
- package/dist/_vendor/shared/app-config.d.ts +175 -0
- package/dist/_vendor/shared/channel-message.d.ts +34 -5
- package/dist/_vendor/shared/index.d.ts +1 -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 +11 -5
- 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 +51 -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 +16 -25
- 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 +5 -0
- package/dist/customize/sections/view/channels-view.d.ts +5 -1
- package/dist/customize/sections/view/channels-view.js +61 -75
- package/dist/customize/sections/view/gateway/gateway-overview.js +10 -2
- package/dist/customize/settings/tabs/experimental-tab.js +35 -16
- package/dist/customize/shared/catalog/catalog-empty-state.d.ts +1 -12
- package/dist/customize/shared/catalog/catalog-empty-state.js +3 -3
- 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 +46 -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 +873 -85
- package/dist/i18n/en.js +888 -100
- 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/auth/auth-card-shell.js +3 -3
- package/dist/internal/components/agent-mark.js +5 -2
- package/dist/internal/connector-logo/connector-logo-source.d.ts +63 -0
- package/dist/internal/connector-logo/connector-logo-source.js +48 -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/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/injected-scripts.d.ts +7 -0
- package/dist/internal/lib/browser-noise/rules/injected-scripts.js +15 -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 +9 -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/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 +6 -2
- 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/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-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 +5 -1
- package/dist/session/participants/session-participants.js +9 -2
- package/dist/session/prompts/approval-request.d.ts +5 -0
- package/dist/session/prompts/approval-request.js +7 -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 +3 -1
- package/dist/session/thread/session-thread.js +9 -2
- 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 +240 -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 +7 -1
- package/dist/session/turn/user-message.js +21 -7
- 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/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-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 +9 -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 +27 -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 +28 -4
- 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
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* Session groups in the sidebar (`session_groups` flag): the project's shared,
|
|
5
|
+
* named folders of sessions, between Pinned and the rest of the list.
|
|
6
|
+
*
|
|
7
|
+
* Each group is a section. Its rows load when it is open (one paged list per
|
|
8
|
+
* group, any starter, any depth), and its open state is the viewer's own,
|
|
9
|
+
* beside the other sections in the session-filter store. A session moves into
|
|
10
|
+
* a group from its `⋯` menu or by dragging its row onto the group; a group
|
|
11
|
+
* moves by dragging its header onto another group, or with Move up / Move
|
|
12
|
+
* down. Dragging a row onto the rest of the list takes it out of its group.
|
|
13
|
+
*/
|
|
14
|
+
import { ApiError } from '@kortix/sdk';
|
|
15
|
+
import { findCachedProjectSession, useCreateProjectSessionGroup, useDeleteProjectSessionGroup, useProjectSessions, useRenameProjectSessionGroup, useReorderProjectSessionGroups, useSetProjectSessionGroup, } from '@kortix/sdk/react';
|
|
16
|
+
import { useQueryClient } from '@tanstack/react-query';
|
|
17
|
+
import { ArrowDownIcon, ArrowUpIcon, CaretRightIcon, DotsThreeIcon, FolderSimpleIcon, PencilSimpleIcon, TrashIcon, } from '@phosphor-icons/react';
|
|
18
|
+
import { useMemo, useState } from 'react';
|
|
19
|
+
import { useTranslations } from '../../i18n/index.js';
|
|
20
|
+
import { cn } from '../../internal/lib/utils.js';
|
|
21
|
+
import { Button } from '../../primitives/button.js';
|
|
22
|
+
import { ConfirmDialog } from '../../primitives/confirm-dialog.js';
|
|
23
|
+
import { Disclosure, DisclosureContent, DisclosureTrigger } from '../../primitives/disclosure.js';
|
|
24
|
+
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from '../../primitives/dropdown-menu.js';
|
|
25
|
+
import { Input } from '../../primitives/input.js';
|
|
26
|
+
import Loading from '../../primitives/loading.js';
|
|
27
|
+
import { Modal, ModalBody, ModalContent, ModalDescription, ModalFooter, ModalHeader, ModalTitle, } from '../../primitives/modal.js';
|
|
28
|
+
import { errorToast, successToast } from '../../primitives/toast.js';
|
|
29
|
+
import { moveGroupBy, moveGroupTo } from './session-group-order.js';
|
|
30
|
+
import { SESSION_MENU_TRIGGER_CLASS, SESSION_ROW_HEIGHT_CLASS, SIDEBAR_PAGE_SIZE, ShowMoreButton, } from './session-list-chrome.js';
|
|
31
|
+
/** A dragged session row carries its id under this type. */
|
|
32
|
+
const SESSION_DRAG_TYPE = 'application/x-kortix-session';
|
|
33
|
+
/** A dragged group header carries its id under this type. */
|
|
34
|
+
const GROUP_DRAG_TYPE = 'application/x-kortix-session-group';
|
|
35
|
+
/** Mirrors `SESSION_GROUP_NAME_MAX` in `@kortix/api-contract`: the server refuses a longer name. */
|
|
36
|
+
const GROUP_NAME_MAX = 80;
|
|
37
|
+
/**
|
|
38
|
+
* The group header being dragged in this window, if any. `dataTransfer` data is
|
|
39
|
+
* unreadable during `dragover`, and the drop line needs to know whether the
|
|
40
|
+
* dragged group lands above or below the one under the pointer.
|
|
41
|
+
*/
|
|
42
|
+
let draggingGroupId = null;
|
|
43
|
+
/** Keeps a click or key inside a group's menu or dialog (portals bubble through React) off the header's toggle. */
|
|
44
|
+
const stopAtMenu = (event) => event.stopPropagation();
|
|
45
|
+
/** The collapsed-sections id of one group. */
|
|
46
|
+
export function sessionGroupSectionId(groupId) {
|
|
47
|
+
return `group:${groupId}`;
|
|
48
|
+
}
|
|
49
|
+
/** `onDragStart` of a session row: the row's link drag also carries the session id. */
|
|
50
|
+
export function startSessionDrag(event, sessionId) {
|
|
51
|
+
event.dataTransfer.setData(SESSION_DRAG_TYPE, sessionId);
|
|
52
|
+
// A link drag allows only copy and link by default; a drop here is a move.
|
|
53
|
+
event.dataTransfer.effectAllowed = 'all';
|
|
54
|
+
}
|
|
55
|
+
function dragCarries(event, type) {
|
|
56
|
+
return Array.from(event.dataTransfer.types).includes(type);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* A drop target for dragged session rows (and, with `onDropGroup`, dragged
|
|
60
|
+
* group headers). `over` is what is over it right now, for the highlight.
|
|
61
|
+
*/
|
|
62
|
+
function useDropTarget(handlers) {
|
|
63
|
+
const [over, setOver] = useState(null);
|
|
64
|
+
const kindOf = (event) => handlers.onDropSession && dragCarries(event, SESSION_DRAG_TYPE)
|
|
65
|
+
? 'session'
|
|
66
|
+
: handlers.onDropGroup && dragCarries(event, GROUP_DRAG_TYPE)
|
|
67
|
+
? 'group'
|
|
68
|
+
: null;
|
|
69
|
+
const props = {
|
|
70
|
+
onDragOver: (event) => {
|
|
71
|
+
const kind = kindOf(event);
|
|
72
|
+
if (!kind)
|
|
73
|
+
return;
|
|
74
|
+
event.preventDefault();
|
|
75
|
+
event.dataTransfer.dropEffect = 'move';
|
|
76
|
+
if (over !== kind)
|
|
77
|
+
setOver(kind);
|
|
78
|
+
},
|
|
79
|
+
onDragLeave: (event) => {
|
|
80
|
+
if (!event.currentTarget.contains(event.relatedTarget))
|
|
81
|
+
setOver(null);
|
|
82
|
+
},
|
|
83
|
+
onDrop: (event) => {
|
|
84
|
+
const kind = kindOf(event);
|
|
85
|
+
setOver(null);
|
|
86
|
+
if (!kind)
|
|
87
|
+
return;
|
|
88
|
+
event.preventDefault();
|
|
89
|
+
if (kind === 'session')
|
|
90
|
+
handlers.onDropSession?.(event.dataTransfer.getData(SESSION_DRAG_TYPE));
|
|
91
|
+
else
|
|
92
|
+
handlers.onDropGroup?.(event.dataTransfer.getData(GROUP_DRAG_TYPE));
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
return { over, props };
|
|
96
|
+
}
|
|
97
|
+
/** Filing and reordering, with their result toasts. One instance per list. */
|
|
98
|
+
export function useSessionGroupActions(projectId, groups) {
|
|
99
|
+
const t = useTranslations('sidebar.sessionGroups');
|
|
100
|
+
const queryClient = useQueryClient();
|
|
101
|
+
const { mutateAsync: file } = useSetProjectSessionGroup(projectId);
|
|
102
|
+
const { mutateAsync: reorder } = useReorderProjectSessionGroups(projectId);
|
|
103
|
+
return useMemo(() => {
|
|
104
|
+
const nameOf = (groupId) => groupId ? (groups.find((group) => group.group_id === groupId)?.name ?? '') : t('noGroup');
|
|
105
|
+
return {
|
|
106
|
+
/** `toast`: a menu move reports where the row went; a drop shows it in place. */
|
|
107
|
+
move: async (sessionId, groupId, options) => {
|
|
108
|
+
// A drop on the row's own group (or of an ungrouped row on the list) changes nothing.
|
|
109
|
+
const cached = findCachedProjectSession(queryClient, projectId, (session) => session.session_id === sessionId);
|
|
110
|
+
if (cached && (cached.group_id ?? null) === groupId)
|
|
111
|
+
return;
|
|
112
|
+
try {
|
|
113
|
+
await file({ sessionId, groupId });
|
|
114
|
+
if (options?.toast)
|
|
115
|
+
successToast(t('moved'), { description: nameOf(groupId) });
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
errorToast(t('moveFailed'));
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
reorder: async (groupIds) => {
|
|
122
|
+
if (!groupIds)
|
|
123
|
+
return;
|
|
124
|
+
try {
|
|
125
|
+
await reorder(groupIds);
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
errorToast(t('reorderFailed'));
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
}, [file, reorder, groups, t, queryClient, projectId]);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Create a group (`group` null) or rename one. A taken name and the group
|
|
136
|
+
* limit show in the dialog; the dialog closes with a toast once the list holds
|
|
137
|
+
* the change. `onCreated` receives the new group (a row's "New group…" files
|
|
138
|
+
* its session into it).
|
|
139
|
+
*/
|
|
140
|
+
export function SessionGroupNameModal({ projectId, group, open, onOpenChange, onCreated, }) {
|
|
141
|
+
const t = useTranslations('sidebar.sessionGroups');
|
|
142
|
+
const create = useCreateProjectSessionGroup(projectId);
|
|
143
|
+
const rename = useRenameProjectSessionGroup(projectId);
|
|
144
|
+
const [value, setValue] = useState('');
|
|
145
|
+
const [problem, setProblem] = useState(null);
|
|
146
|
+
const [syncedFor, setSyncedFor] = useState([open, group?.group_id ?? null]);
|
|
147
|
+
if (syncedFor[0] !== open || syncedFor[1] !== (group?.group_id ?? null)) {
|
|
148
|
+
setSyncedFor([open, group?.group_id ?? null]);
|
|
149
|
+
if (open) {
|
|
150
|
+
setValue(group?.name ?? '');
|
|
151
|
+
setProblem(null);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
const pending = create.isPending || rename.isPending;
|
|
155
|
+
const name = value.trim();
|
|
156
|
+
const unchanged = group !== null && name === group.name;
|
|
157
|
+
const submit = async () => {
|
|
158
|
+
if (!name || unchanged || pending)
|
|
159
|
+
return;
|
|
160
|
+
setProblem(null);
|
|
161
|
+
try {
|
|
162
|
+
if (group) {
|
|
163
|
+
await rename.mutateAsync({ groupId: group.group_id, name });
|
|
164
|
+
successToast(t('renamed'));
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
const created = await create.mutateAsync({ name });
|
|
168
|
+
successToast(t('created'));
|
|
169
|
+
onCreated?.(created);
|
|
170
|
+
}
|
|
171
|
+
onOpenChange(false);
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
const code = error instanceof ApiError ? error.code : undefined;
|
|
175
|
+
setProblem(code === 'group_name_taken'
|
|
176
|
+
? t('nameTaken')
|
|
177
|
+
: code === 'group_limit'
|
|
178
|
+
? t('limit')
|
|
179
|
+
: t(group ? 'renameFailed' : 'createFailed'));
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
return (_jsx(Modal, { open: open, onOpenChange: (next) => !pending && onOpenChange(next), children: _jsxs(ModalContent, { className: "lg:max-w-md", children: [_jsxs(ModalHeader, { children: [_jsx(ModalTitle, { children: group ? t('rename') : t('createTitle') }), group ? null : _jsx(ModalDescription, { children: t('createDescription') })] }), _jsxs(ModalBody, { className: "space-y-2", children: [_jsx(Input, { autoFocus: true, value: value, maxLength: GROUP_NAME_MAX, placeholder: t('namePlaceholder'), "aria-label": t('namePlaceholder'), "aria-invalid": problem ? true : undefined, onChange: (event) => {
|
|
183
|
+
setValue(event.target.value);
|
|
184
|
+
setProblem(null);
|
|
185
|
+
}, onKeyDown: (event) => {
|
|
186
|
+
if (event.nativeEvent.isComposing)
|
|
187
|
+
return;
|
|
188
|
+
if (event.key === 'Enter') {
|
|
189
|
+
event.preventDefault();
|
|
190
|
+
void submit();
|
|
191
|
+
}
|
|
192
|
+
} }), problem ? (_jsx("p", { className: "text-destructive text-xs", role: "alert", children: problem })) : null] }), _jsxs(ModalFooter, { className: "sm:justify-between", children: [_jsx(Button, { variant: "outline-ghost", size: "sm", className: "w-full sm:w-auto", onClick: () => onOpenChange(false), disabled: pending, children: t('cancel') }), _jsxs(Button, { size: "sm", className: "w-full sm:w-auto", onClick: () => void submit(), disabled: !name || unchanged || pending, children: [pending ? _jsx(Loading, { className: "size-4 shrink-0" }) : null, group ? t('save') : t('create')] })] })] }) }));
|
|
193
|
+
}
|
|
194
|
+
/** Every group of the project, in order. */
|
|
195
|
+
export function SessionGroupSections({ groups, ...rest }) {
|
|
196
|
+
const groupIds = groups.map((group) => group.group_id);
|
|
197
|
+
return (_jsx(_Fragment, { children: groups.map((group) => (_jsx(SessionGroupSection, { group: group, groupIds: groupIds, ...rest }, group.group_id))) }));
|
|
198
|
+
}
|
|
199
|
+
function SessionGroupSection({ projectId, group, groupIds, labels, collapsedSectionIds, onToggleSection, passesFacets, renderNode, actions, onRename, }) {
|
|
200
|
+
const t = useTranslations('sidebar');
|
|
201
|
+
const tGroups = useTranslations('sidebar.sessionGroups');
|
|
202
|
+
const sectionId = sessionGroupSectionId(group.group_id);
|
|
203
|
+
const open = !collapsedSectionIds.has(sectionId);
|
|
204
|
+
// Any starter and any depth, like Pinned: a session is in a group because
|
|
205
|
+
// someone put it there. Loaded only while the group is open.
|
|
206
|
+
const query = useProjectSessions(projectId, {
|
|
207
|
+
group: group.group_id,
|
|
208
|
+
labels,
|
|
209
|
+
limit: SIDEBAR_PAGE_SIZE,
|
|
210
|
+
enabled: open,
|
|
211
|
+
// No focus refetch: a new session never starts inside a group, and a
|
|
212
|
+
// project with dozens of open groups would refetch every one of them.
|
|
213
|
+
refetchOnWindowFocus: false,
|
|
214
|
+
});
|
|
215
|
+
// A pinned row shows under Pinned only. The `group_id` check drops a row the
|
|
216
|
+
// viewer just moved out, before the refetch lands.
|
|
217
|
+
const rows = query.sessions.filter((session) => session.group_id === group.group_id && !session.pinned_at && passesFacets(session));
|
|
218
|
+
const index = groupIds.indexOf(group.group_id);
|
|
219
|
+
const drop = useDropTarget({
|
|
220
|
+
onDropSession: (sessionId) => void actions.move(sessionId, group.group_id),
|
|
221
|
+
onDropGroup: (groupId) => void actions.reorder(moveGroupTo(groupIds, groupId, index)),
|
|
222
|
+
});
|
|
223
|
+
return (_jsx("div", { ...drop.props, "data-session-group": group.group_id, children: _jsxs(Disclosure, { open: open, onOpenChange: () => onToggleSection(sectionId), className: "group/section space-y-1", transition: { duration: 0.15, ease: 'easeOut' }, children: [_jsx(DisclosureTrigger, { children: _jsxs("div", { draggable: true, onDragStart: (event) => {
|
|
224
|
+
event.dataTransfer.setData(GROUP_DRAG_TYPE, group.group_id);
|
|
225
|
+
event.dataTransfer.effectAllowed = 'move';
|
|
226
|
+
draggingGroupId = group.group_id;
|
|
227
|
+
}, onDragEnd: () => {
|
|
228
|
+
draggingGroupId = null;
|
|
229
|
+
}, className: cn('group/section-header text-muted-foreground relative flex items-center gap-1 rounded-md px-2 text-sm font-medium', SESSION_ROW_HEIGHT_CLASS, drop.over === 'session' && 'bg-sidebar-row text-sidebar-foreground',
|
|
230
|
+
// A group dropped here takes this place: a line marks the side it
|
|
231
|
+
// lands on (below this group when it comes from above).
|
|
232
|
+
drop.over === 'group' &&
|
|
233
|
+
'before:bg-foreground/40 before:absolute before:inset-x-2 before:h-0.5 before:rounded-full', drop.over === 'group' &&
|
|
234
|
+
(groupIds.indexOf(draggingGroupId ?? '') < index ? 'before:bottom-0' : 'before:top-0')), children: [_jsx(FolderSimpleIcon, { "aria-hidden": true, className: "size-3.5 shrink-0" }), _jsx("span", { className: "truncate", children: group.name }), _jsx(CaretRightIcon, { "aria-hidden": true, className: "duration-normal size-3 shrink-0 opacity-0 transition-transform ease-out group-hover/section-header:opacity-100 group-data-[state=open]/section:rotate-90" }), _jsx(SessionGroupMenu, { group: group, onRename: () => onRename(group), onMoveUp: moveGroupBy(groupIds, group.group_id, -1), onMoveDown: moveGroupBy(groupIds, group.group_id, 1), onReorder: (ids) => void actions.reorder(ids), projectId: projectId })] }) }), _jsxs(DisclosureContent, { contentClassName: "space-y-px", children: [rows.map(renderNode), query.data !== undefined && rows.length === 0 && !query.hasNextPage ? (_jsx("p", { className: "text-muted-foreground px-2 py-1 text-xs", children: tGroups('empty') })) : null, query.hasNextPage && (_jsx(ShowMoreButton, { loading: query.isFetchingNextPage, failed: query.isFetchNextPageError, label: t('loadMore'), onClick: () => query.fetchNextPage() }))] })] }) }));
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* The group header's `⋯`: Rename, Move up, Move down, Delete. Hover-revealed
|
|
238
|
+
* like a section header's; click and Enter/Space stop propagation so opening
|
|
239
|
+
* it never toggles the group.
|
|
240
|
+
*/
|
|
241
|
+
function SessionGroupMenu({ projectId, group, onRename, onMoveUp, onMoveDown, onReorder, }) {
|
|
242
|
+
const tGroups = useTranslations('sidebar.sessionGroups');
|
|
243
|
+
const [menuOpen, setMenuOpen] = useState(false);
|
|
244
|
+
const [confirmOpen, setConfirmOpen] = useState(false);
|
|
245
|
+
const remove = useDeleteProjectSessionGroup(projectId);
|
|
246
|
+
const afterClose = (fn) => {
|
|
247
|
+
setMenuOpen(false);
|
|
248
|
+
requestAnimationFrame(fn);
|
|
249
|
+
};
|
|
250
|
+
return (
|
|
251
|
+
// `contents`: the trigger stays a flex item of the header (`ml-auto`).
|
|
252
|
+
_jsxs("span", { className: "contents", onClick: stopAtMenu, onKeyDown: stopAtMenu, children: [_jsxs(DropdownMenu, { open: menuOpen, onOpenChange: setMenuOpen, children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon-xs", type: "button", "aria-label": `${tGroups('groupOptions')}: ${group.name}`, className: cn(SESSION_MENU_TRIGGER_CLASS, 'relative ml-auto opacity-0', 'before:absolute before:-inset-1', 'group-hover/section-header:opacity-100 focus-visible:opacity-100 data-[state=open]:opacity-100'), children: _jsx(DotsThreeIcon, { className: "size-4" }) }) }), _jsxs(DropdownMenuContent, { align: "start", side: "right", className: "w-44", children: [_jsxs(DropdownMenuItem, { className: "cursor-pointer", onSelect: () => afterClose(onRename), children: [_jsx(PencilSimpleIcon, {}), tGroups('rename')] }), _jsxs(DropdownMenuItem, { className: "cursor-pointer", disabled: !onMoveUp, onSelect: () => onMoveUp && onReorder(onMoveUp), children: [_jsx(ArrowUpIcon, {}), tGroups('moveUp')] }), _jsxs(DropdownMenuItem, { className: "cursor-pointer", disabled: !onMoveDown, onSelect: () => onMoveDown && onReorder(onMoveDown), children: [_jsx(ArrowDownIcon, {}), tGroups('moveDown')] }), _jsx(DropdownMenuSeparator, {}), _jsxs(DropdownMenuItem, { className: "cursor-pointer", variant: "destructive", onSelect: () => afterClose(() => setConfirmOpen(true)), children: [_jsx(TrashIcon, {}), tGroups('delete')] })] })] }), _jsx(ConfirmDialog, { open: confirmOpen, onOpenChange: setConfirmOpen, title: tGroups('deleteTitle'), description: tGroups('deleteDescription', { name: group.name }), confirmLabel: tGroups('delete'), cancelLabel: tGroups('cancel'), confirmVariant: "destructive", isPending: remove.isPending, onConfirm: () => remove.mutate(group.group_id, {
|
|
253
|
+
onSuccess: () => {
|
|
254
|
+
setConfirmOpen(false);
|
|
255
|
+
successToast(tGroups('deleted'));
|
|
256
|
+
},
|
|
257
|
+
onError: () => errorToast(tGroups('deleteFailed')),
|
|
258
|
+
}) })] }));
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* The rest of the list as a drop target: a session row dropped here leaves
|
|
262
|
+
* its group. Highlights only while a row is over it.
|
|
263
|
+
*/
|
|
264
|
+
export function UngroupDropArea({ onDropSession, children, }) {
|
|
265
|
+
const drop = useDropTarget({ onDropSession });
|
|
266
|
+
return (_jsx("div", { ...drop.props, className: cn('space-y-px rounded-md', drop.over === 'session' && 'bg-sidebar-row/50'), children: children }));
|
|
267
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** The one `⋯` box. All three menus in the session list — the `Sessions` header, every
|
|
2
|
+
* section header, and every session row — render `Button variant="ghost"
|
|
3
|
+
* size="icon-xs"` with THIS class, so the glyph sits on a single vertical
|
|
4
|
+
* axis at every level of the tree.
|
|
5
|
+
*
|
|
6
|
+
* The geometry, given every row is `px-2` inside the same column: the trigger
|
|
7
|
+
* is flush to the right edge of that padded box, so its 24px square spans
|
|
8
|
+
* `[W-32, W-8]` and the 16px glyph inside spans `[W-28, W-12]` — identical for
|
|
9
|
+
* all three, at any sidebar width.
|
|
10
|
+
*
|
|
11
|
+
* Do NOT rebuild this from `SidebarMenuButton`. That primitive's base carries
|
|
12
|
+
* `p-2 w-full h-8 gap-2 overflow-hidden`; `size-6` only beats `w-full`/`h-8`
|
|
13
|
+
* through tailwind-merge, and `p-2` survives outright — leaving a 16px icon
|
|
14
|
+
* overflowing an 8px content box, centered by coincidence rather than by
|
|
15
|
+
* layout, with a different hover fill than the other two. */
|
|
16
|
+
export declare const SESSION_MENU_TRIGGER_CLASS: string;
|
|
17
|
+
/** Every row that can carry a `⋯` is this tall, so the trigger's 24px square is
|
|
18
|
+
* centered in an identical 32px line at all three levels. */
|
|
19
|
+
export declare const SESSION_ROW_HEIGHT_CLASS = "h-8";
|
|
20
|
+
/** Rows per page of an expanded parent, and per page of the Shared,
|
|
21
|
+
* Automated and group sections. */
|
|
22
|
+
export declare const SIDEBAR_PAGE_SIZE = 20;
|
|
23
|
+
export declare function ShowMoreButton({ loading, failed, label, onClick, }: {
|
|
24
|
+
loading: boolean;
|
|
25
|
+
failed: boolean;
|
|
26
|
+
label: string;
|
|
27
|
+
onClick: () => void;
|
|
28
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
// Chrome shared by the session list (`project-session-list.tsx`) and its group
|
|
4
|
+
// sections (`session-group-sections.tsx`): one `⋯` box, one row height, one
|
|
5
|
+
// page size, one Load more.
|
|
6
|
+
import { useTranslations } from '../../i18n/index.js';
|
|
7
|
+
import { cn } from '../../internal/lib/utils.js';
|
|
8
|
+
import { Button } from '../../primitives/button.js';
|
|
9
|
+
/** The one `⋯` box. All three menus in the session list — the `Sessions` header, every
|
|
10
|
+
* section header, and every session row — render `Button variant="ghost"
|
|
11
|
+
* size="icon-xs"` with THIS class, so the glyph sits on a single vertical
|
|
12
|
+
* axis at every level of the tree.
|
|
13
|
+
*
|
|
14
|
+
* The geometry, given every row is `px-2` inside the same column: the trigger
|
|
15
|
+
* is flush to the right edge of that padded box, so its 24px square spans
|
|
16
|
+
* `[W-32, W-8]` and the 16px glyph inside spans `[W-28, W-12]` — identical for
|
|
17
|
+
* all three, at any sidebar width.
|
|
18
|
+
*
|
|
19
|
+
* Do NOT rebuild this from `SidebarMenuButton`. That primitive's base carries
|
|
20
|
+
* `p-2 w-full h-8 gap-2 overflow-hidden`; `size-6` only beats `w-full`/`h-8`
|
|
21
|
+
* through tailwind-merge, and `p-2` survives outright — leaving a 16px icon
|
|
22
|
+
* overflowing an 8px content box, centered by coincidence rather than by
|
|
23
|
+
* layout, with a different hover fill than the other two. */
|
|
24
|
+
export const SESSION_MENU_TRIGGER_CLASS = cn('text-muted-foreground shrink-0 transition-none',
|
|
25
|
+
// An OPAQUE hover fill, and the reason it has to be opaque:
|
|
26
|
+
//
|
|
27
|
+
// `variant="ghost"` hovers to `bg-foreground/10`. `background-color` is one
|
|
28
|
+
// property, so on the row trigger that 10% tint did not sit on top of the
|
|
29
|
+
// `bg-(--session-row-surface)` mask — it REPLACED it. The mask exists to hide
|
|
30
|
+
// the truncated session title running underneath the glyph, so hovering
|
|
31
|
+
// punched a translucent hole in it and the title bled through: the washed-out
|
|
32
|
+
// grey square in the bug report, with a muted `⋯` floating in it.
|
|
33
|
+
//
|
|
34
|
+
// `sidebar-row-control` is one opaque step above the row's own fill
|
|
35
|
+
// (`--sidebar-row`) on hover, in both themes. The square reads as lifted, stays a solid
|
|
36
|
+
// mask, and needs no pseudo-element to stack a tint above a fill.
|
|
37
|
+
'hover:bg-sidebar-row-control data-[state=open]:bg-sidebar-row-control',
|
|
38
|
+
// Full contrast once the pointer is on it — the glyph is a control now, not a
|
|
39
|
+
// marker.
|
|
40
|
+
'hover:text-foreground data-[state=open]:text-foreground');
|
|
41
|
+
/** Every row that can carry a `⋯` is this tall, so the trigger's 24px square is
|
|
42
|
+
* centered in an identical 32px line at all three levels. */
|
|
43
|
+
export const SESSION_ROW_HEIGHT_CLASS = 'h-8';
|
|
44
|
+
/** Rows per page of an expanded parent, and per page of the Shared,
|
|
45
|
+
* Automated and group sections. */
|
|
46
|
+
export const SIDEBAR_PAGE_SIZE = 20;
|
|
47
|
+
export function ShowMoreButton({ loading, failed, label, onClick, }) {
|
|
48
|
+
const t = useTranslations('sidebar');
|
|
49
|
+
return (_jsx(Button, { variant: "ghost", size: "sm", className: "text-muted-foreground hover:text-foreground h-8 w-full justify-start px-2 text-xs", disabled: loading, onClick: onClick, children: loading ? t('loadingMore') : failed ? t('retry') : label }));
|
|
50
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type IconProps } from '@phosphor-icons/react';
|
|
2
|
+
/** A channel's leading glyph: `#` for a public channel, a lock for a private one (only its members see it). */
|
|
3
|
+
export declare function ChannelGlyph({ visibility, ...props }: IconProps & {
|
|
4
|
+
visibility?: 'public' | 'private';
|
|
5
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { HashIcon, LockSimpleIcon } from '@phosphor-icons/react';
|
|
3
|
+
/** A channel's leading glyph: `#` for a public channel, a lock for a private one (only its members see it). */
|
|
4
|
+
export function ChannelGlyph({ visibility, ...props }) {
|
|
5
|
+
return visibility === 'private' ? _jsx(LockSimpleIcon, { ...props }) : _jsx(HashIcon, { ...props });
|
|
6
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ProjectSpace } from '@kortix/sdk';
|
|
2
|
+
/**
|
|
3
|
+
* A channel's one setup block, top of its Chat: only the steps the viewer can
|
|
4
|
+
* take, each checked off from real state. Add agents (creator or manager): the
|
|
5
|
+
* channel has an agent. Invite members (whoever may add people or invite to the
|
|
6
|
+
* project): the channel has a second person. Remember something: the channel's
|
|
7
|
+
* memory has a page. `#general` adds Create a channel. It hides when every step
|
|
8
|
+
* is done or the viewer dismisses it: in `#general` through the server's
|
|
9
|
+
* `get_started.dismissed` mark, elsewhere per channel in this browser.
|
|
10
|
+
*/
|
|
11
|
+
export declare function ChannelSetup({ projectId, space, onOpenMembers, }: {
|
|
12
|
+
projectId: string;
|
|
13
|
+
space: ProjectSpace;
|
|
14
|
+
/** For a viewer who may add no one: the Members tab. */
|
|
15
|
+
onOpenMembers: () => void;
|
|
16
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useChannelsOnboarding, useMarkChannelsOnboarding, useProjectMemoryLayer, useProjectSpaceMembers, } from '@kortix/sdk/react';
|
|
4
|
+
import { CircleIcon } from '@phosphor-icons/react';
|
|
5
|
+
import { useState } from 'react';
|
|
6
|
+
import { useTranslations } from '../../i18n/index.js';
|
|
7
|
+
import { Close } from '../../icons/close.js';
|
|
8
|
+
import { SolidCheckIcon } from '../../internal/icons/solid-check-icon.js';
|
|
9
|
+
import { cn } from '../../lib/utils.js';
|
|
10
|
+
import { Button } from '../../primitives/button.js';
|
|
11
|
+
import Hint from '../../primitives/hint.js';
|
|
12
|
+
import { useUiPathname, useUiRouter, useUiSearchParams } from '../../providers/ui-provider.js';
|
|
13
|
+
import { MEMORY_REMEMBER_PARAM } from '../memory/memory-view.js';
|
|
14
|
+
import { CreateChannelDialog } from './create-channel-dialog.js';
|
|
15
|
+
import { AddChannelMembersDialog, useInviteToProject, useProjectPeople } from './space-members.js';
|
|
16
|
+
const dismissKey = (spaceId) => `kortix:channel-setup-dismissed:${spaceId}`;
|
|
17
|
+
function readDismissed(spaceId) {
|
|
18
|
+
try {
|
|
19
|
+
return window.localStorage.getItem(dismissKey(spaceId)) === '1';
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* A channel's one setup block, top of its Chat: only the steps the viewer can
|
|
27
|
+
* take, each checked off from real state. Add agents (creator or manager): the
|
|
28
|
+
* channel has an agent. Invite members (whoever may add people or invite to the
|
|
29
|
+
* project): the channel has a second person. Remember something: the channel's
|
|
30
|
+
* memory has a page. `#general` adds Create a channel. It hides when every step
|
|
31
|
+
* is done or the viewer dismisses it: in `#general` through the server's
|
|
32
|
+
* `get_started.dismissed` mark, elsewhere per channel in this browser.
|
|
33
|
+
*/
|
|
34
|
+
export function ChannelSetup({ projectId, space, onOpenMembers, }) {
|
|
35
|
+
const t = useTranslations('spaces.view.setup');
|
|
36
|
+
const tStart = useTranslations('spaces.onboarding.getStarted');
|
|
37
|
+
const router = useUiRouter();
|
|
38
|
+
const pathname = useUiPathname();
|
|
39
|
+
const searchParams = useUiSearchParams();
|
|
40
|
+
const general = space.is_default === true;
|
|
41
|
+
const members = useProjectSpaceMembers(projectId, space.space_id);
|
|
42
|
+
const people = useProjectPeople(projectId, general ? undefined : space);
|
|
43
|
+
const layer = useProjectMemoryLayer(projectId, space.space_id);
|
|
44
|
+
const onboarding = useChannelsOnboarding(projectId, { enabled: general });
|
|
45
|
+
const mark = useMarkChannelsOnboarding(projectId);
|
|
46
|
+
const invite = useInviteToProject(projectId);
|
|
47
|
+
const [dismissed, setDismissed] = useState(() => (general ? false : readDismissed(space.space_id)));
|
|
48
|
+
const [picking, setPicking] = useState(false);
|
|
49
|
+
const [creating, setCreating] = useState(false);
|
|
50
|
+
const canAdd = members.data?.can_add === true;
|
|
51
|
+
const editable = space.can_edit !== false;
|
|
52
|
+
const place = `#${space.slug ?? space.name}`;
|
|
53
|
+
const openRemember = () => {
|
|
54
|
+
const params = new URLSearchParams(searchParams.toString());
|
|
55
|
+
params.delete('thread');
|
|
56
|
+
params.set('tab', 'memory');
|
|
57
|
+
params.set(MEMORY_REMEMBER_PARAM, '1');
|
|
58
|
+
router.replace(`${pathname}?${params.toString()}`, { scroll: false });
|
|
59
|
+
};
|
|
60
|
+
// People not in the channel yet are picked; with nobody left (and always in #general), invite by email.
|
|
61
|
+
const openInvite = () => {
|
|
62
|
+
if (!general && canAdd && people.available.length > 0)
|
|
63
|
+
setPicking(true);
|
|
64
|
+
else if (invite.canInvite)
|
|
65
|
+
invite.invite();
|
|
66
|
+
else
|
|
67
|
+
onOpenMembers();
|
|
68
|
+
};
|
|
69
|
+
const state = onboarding.data?.get_started;
|
|
70
|
+
const loading = members.isLoading || layer.isLoading || (general && onboarding.isLoading);
|
|
71
|
+
const steps = [];
|
|
72
|
+
if (editable) {
|
|
73
|
+
steps.push({ key: 'agents', label: t('addAgents'), hint: t('addAgentsHint'), done: (space.agents?.length ?? 0) > 0, onClick: () => setPicking(true) });
|
|
74
|
+
}
|
|
75
|
+
if (general ? invite.canInvite : canAdd || invite.canInvite) {
|
|
76
|
+
steps.push({ key: 'invite', label: t('invite'), hint: t('inviteHint'), done: (members.data?.members.length ?? 0) > 1, onClick: openInvite });
|
|
77
|
+
}
|
|
78
|
+
// Memory off (no layer) or read-only: no step.
|
|
79
|
+
if (layer.data && layer.data.can_write !== false) {
|
|
80
|
+
const pages = Object.values(layer.data.counts).reduce((sum, count) => sum + count, 0);
|
|
81
|
+
steps.push({ key: 'remember', label: t('remember'), hint: t('rememberHint'), done: pages > 0 || state?.remember === true, onClick: openRemember });
|
|
82
|
+
}
|
|
83
|
+
if (general && state) {
|
|
84
|
+
steps.push({ key: 'channel', label: tStart('channel'), done: state.create_channel, onClick: () => setCreating(true) });
|
|
85
|
+
}
|
|
86
|
+
const hidden = loading || dismissed || (general && state?.visible === false) || steps.every((step) => step.done);
|
|
87
|
+
const dismiss = () => {
|
|
88
|
+
setDismissed(true);
|
|
89
|
+
if (general) {
|
|
90
|
+
mark.mutate('get_started.dismissed');
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
window.localStorage.setItem(dismissKey(space.space_id), '1');
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// Storage blocked: dismissed for this visit only.
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
return (_jsxs(_Fragment, { children: [hidden ? null : (_jsx("section", { "aria-label": t('label', { name: place }), className: "shrink-0 px-5 pt-4", children: _jsxs("div", { className: "bg-popover max-w-xl rounded-md border", children: [_jsxs("div", { className: "flex items-center justify-between gap-2 py-1.5 pr-1.5 pl-4", children: [_jsx("h2", { className: "truncate text-sm font-medium", children: t('label', { name: place }) }), _jsx(Hint, { label: tStart('dismiss'), side: "bottom", children: _jsx(Button, { variant: "ghost", size: "icon-sm", "aria-label": tStart('dismiss'), className: "text-muted-foreground", onClick: dismiss, children: _jsx(Close, { className: "size-4" }) }) })] }), _jsx("ul", { className: "flex flex-col px-1.5 pb-1.5", children: steps.map((step) => (_jsx("li", { children: _jsx(StepButton, { step: step, doneLabel: tStart('done') }) }, step.key))) })] }) })), editable || canAdd ? _jsx(AddChannelMembersDialog, { projectId: projectId, space: space, open: picking, onOpenChange: setPicking }) : null, general ? _jsx(CreateChannelDialog, { projectId: projectId, open: creating, onOpenChange: setCreating }) : null, invite.dialog] }));
|
|
101
|
+
}
|
|
102
|
+
/** One step: a done check (or an open circle), the step and its hint; the whole row is its action. */
|
|
103
|
+
function StepButton({ step, doneLabel }) {
|
|
104
|
+
return (_jsxs("button", { type: "button", onClick: step.onClick, className: cn('hover:bg-hover focus-visible:ring-ring flex h-8 w-full items-center gap-2.5 rounded-sm px-2.5 text-left text-sm transition-colors duration-(--duration-fast) outline-none focus-visible:ring-2', step.done ? 'text-muted-foreground' : 'text-foreground'), children: [step.done ? (_jsx(SolidCheckIcon, { "aria-hidden": true, className: "text-kortix-green size-4 shrink-0" })) : (_jsx(CircleIcon, { "aria-hidden": true, className: "text-muted-foreground size-4 shrink-0" })), _jsx("span", { className: "shrink-0", children: step.label }), step.hint ? _jsx("span", { className: "text-muted-foreground min-w-0 flex-1 truncate text-xs", children: step.hint }) : _jsx("span", { className: "flex-1" }), step.done ? _jsx("span", { className: "sr-only", children: doneLabel }) : null] }));
|
|
105
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The member intro, once per member and project: the first channel or DM page
|
|
3
|
+
* after Channels was turned on. Any close ("Got it", Escape, outside) records
|
|
4
|
+
* `channels_intro`, so it never comes back. Turning Channels on again records
|
|
5
|
+
* it for every member, so a second switch shows nothing.
|
|
6
|
+
*/
|
|
7
|
+
export declare function ChannelsIntro({ projectId }: {
|
|
8
|
+
projectId: string;
|
|
9
|
+
}): import("react").JSX.Element;
|
|
10
|
+
/** The top of `#general`'s Chat: the "turned on again" line while the server reports one. */
|
|
11
|
+
export declare function GeneralChatHead({ projectId }: {
|
|
12
|
+
projectId: string;
|
|
13
|
+
}): import("react").JSX.Element | null;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useChannelsOnboarding, useMarkChannelsOnboarding, useProjectSpaceGeneralNotice } from '@kortix/sdk/react';
|
|
4
|
+
import { ChatCircleIcon, HashIcon, SunDimIcon } from '@phosphor-icons/react';
|
|
5
|
+
import { useState } from 'react';
|
|
6
|
+
import { useTranslations } from '../../i18n/index.js';
|
|
7
|
+
import { Button } from '../../primitives/button.js';
|
|
8
|
+
import { Modal, ModalBody, ModalContent, ModalDescription, ModalFooter, ModalHeader, ModalTitle } from '../../primitives/modal.js';
|
|
9
|
+
/**
|
|
10
|
+
* The member intro, once per member and project: the first channel or DM page
|
|
11
|
+
* after Channels was turned on. Any close ("Got it", Escape, outside) records
|
|
12
|
+
* `channels_intro`, so it never comes back. Turning Channels on again records
|
|
13
|
+
* it for every member, so a second switch shows nothing.
|
|
14
|
+
*/
|
|
15
|
+
export function ChannelsIntro({ projectId }) {
|
|
16
|
+
const t = useTranslations('spaces.onboarding.intro');
|
|
17
|
+
const onboarding = useChannelsOnboarding(projectId);
|
|
18
|
+
const mark = useMarkChannelsOnboarding(projectId);
|
|
19
|
+
const [closed, setClosed] = useState(false);
|
|
20
|
+
const open = !closed && onboarding.data?.intro_seen === false;
|
|
21
|
+
const close = () => {
|
|
22
|
+
setClosed(true);
|
|
23
|
+
mark.mutate('channels_intro');
|
|
24
|
+
};
|
|
25
|
+
const lines = [
|
|
26
|
+
{ icon: HashIcon, text: t('channels') },
|
|
27
|
+
{ icon: ChatCircleIcon, text: t('threads') },
|
|
28
|
+
{ icon: SunDimIcon, text: t('memory') },
|
|
29
|
+
];
|
|
30
|
+
return (_jsx(Modal, { open: open, onOpenChange: (next) => !next && close(), children: _jsxs(ModalContent, { className: "lg:max-w-md", children: [_jsxs(ModalHeader, { children: [_jsx(ModalTitle, { children: t('title') }), _jsx(ModalDescription, { className: "sr-only", children: t('title') })] }), _jsx(ModalBody, { children: _jsx("ul", { className: "flex flex-col gap-3", children: lines.map(({ icon: Glyph, text }) => (_jsxs("li", { className: "flex items-start gap-3 text-sm", children: [_jsx(Glyph, { "aria-hidden": true, className: "text-muted-foreground mt-0.5 size-4 shrink-0" }), _jsx("span", { children: text })] }, text))) }) }), _jsx(ModalFooter, { children: _jsx(Button, { autoFocus: true, onClick: close, children: t('gotIt') }) })] }) }));
|
|
31
|
+
}
|
|
32
|
+
/** The top of `#general`'s Chat: the "turned on again" line while the server reports one. */
|
|
33
|
+
export function GeneralChatHead({ projectId }) {
|
|
34
|
+
const t = useTranslations('spaces.onboarding');
|
|
35
|
+
const notice = useProjectSpaceGeneralNotice(projectId);
|
|
36
|
+
return notice.data ? _jsx("p", { className: "text-muted-foreground shrink-0 px-5 pt-3 text-xs", children: t('reenabled') }) : null;
|
|
37
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type ProjectSpace } from '@kortix/sdk';
|
|
2
|
+
/**
|
|
3
|
+
* "Create a channel": a name with a live `#slug` preview, an optional
|
|
4
|
+
* description and "Private" (only the people added to it see it), shown
|
|
5
|
+
* only where the spaces list says `private_channels_available`. Every error stays in the dialog (the SDK call does not toast).
|
|
6
|
+
* On success the dialog closes and the new channel opens.
|
|
7
|
+
*
|
|
8
|
+
* With `space` it renames that channel instead: the same fields, filled in,
|
|
9
|
+
* and the page follows the new slug.
|
|
10
|
+
*/
|
|
11
|
+
export declare function CreateChannelDialog({ projectId, open, onOpenChange, space, }: {
|
|
12
|
+
projectId: string;
|
|
13
|
+
open: boolean;
|
|
14
|
+
onOpenChange: (open: boolean) => void;
|
|
15
|
+
space?: ProjectSpace;
|
|
16
|
+
}): import("react").JSX.Element;
|