@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
|
@@ -1,16 +1,29 @@
|
|
|
1
1
|
import type { AdminConnector } from '@kortix/sdk';
|
|
2
2
|
import { type ConnectorSetupStatus } from '../../sections/connector-connection-form.js';
|
|
3
|
-
/**
|
|
4
|
-
|
|
3
|
+
/**
|
|
4
|
+
* The three states a connector shows, everywhere it shows one (the list card,
|
|
5
|
+
* the connector header, the app page): Connected, Needs account, Error. A
|
|
6
|
+
* sign-in still to finish and a missing credential are both "Needs account":
|
|
7
|
+
* adding or signing in an account is the fix in either case.
|
|
8
|
+
*/
|
|
9
|
+
export type ConnectorStatusTone = 'connected' | 'account' | 'error';
|
|
5
10
|
export declare const STATUS_DOT: Record<ConnectorStatusTone, string>;
|
|
6
11
|
/** The `connectorPages` key of each state's word. */
|
|
7
12
|
export declare const STATUS_WORD: {
|
|
8
|
-
readonly
|
|
9
|
-
readonly
|
|
13
|
+
readonly connected: "statusConnected";
|
|
14
|
+
readonly account: "statusNeedsAccount";
|
|
10
15
|
readonly error: "statusError";
|
|
11
|
-
readonly setup: "statusNeedsSetup";
|
|
12
16
|
};
|
|
13
|
-
|
|
17
|
+
/** The server's derived state (`state` on the connector). `disabled` reads as an error. */
|
|
18
|
+
export type ConnectorDerivedState = 'needs_account' | 'connected' | 'error';
|
|
19
|
+
export declare function connectorDerivedState(connector: object): ConnectorDerivedState | null;
|
|
20
|
+
/**
|
|
21
|
+
* The server's `state` when it sends one. An older API: the same rule from the
|
|
22
|
+
* fields, where zero accounts (once loaded) is Needs account.
|
|
23
|
+
*/
|
|
24
|
+
export declare function connectorStatusTone(connector: Pick<AdminConnector, 'authorizationStrategy' | 'authSecret' | 'secretSet' | 'status'> & Partial<Pick<AdminConnector, 'provider' | 'lastError'>>,
|
|
25
|
+
/** The accounts the caller can see, once loaded. */
|
|
26
|
+
accountCount?: number): ConnectorStatusTone;
|
|
14
27
|
/**
|
|
15
28
|
* Agents can use the connector now: it is signed in, it runs on per-person
|
|
16
29
|
* accounts, or it needs no sign-in and has an account to run as.
|
|
@@ -1,23 +1,47 @@
|
|
|
1
1
|
import { connectorSetupStatus, } from '../../sections/connector-connection-form.js';
|
|
2
2
|
import { providerLabel } from '../provider-label.js';
|
|
3
3
|
export const STATUS_DOT = {
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
connected: 'bg-kortix-green',
|
|
5
|
+
account: 'bg-kortix-orange',
|
|
6
6
|
error: 'bg-kortix-red',
|
|
7
|
-
setup: 'bg-kortix-orange',
|
|
8
7
|
};
|
|
9
8
|
/** The `connectorPages` key of each state's word. */
|
|
10
9
|
export const STATUS_WORD = {
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
connected: 'statusConnected',
|
|
11
|
+
account: 'statusNeedsAccount',
|
|
13
12
|
error: 'statusError',
|
|
14
|
-
setup: 'statusNeedsSetup',
|
|
15
13
|
};
|
|
16
|
-
export function
|
|
14
|
+
export function connectorDerivedState(connector) {
|
|
15
|
+
const state = connector.state;
|
|
16
|
+
if (state === 'disabled')
|
|
17
|
+
return 'error';
|
|
18
|
+
return state === 'needs_account' || state === 'connected' || state === 'error' ? state : null;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* The server's `state` when it sends one. An older API: the same rule from the
|
|
22
|
+
* fields, where zero accounts (once loaded) is Needs account.
|
|
23
|
+
*/
|
|
24
|
+
export function connectorStatusTone(connector,
|
|
25
|
+
/** The accounts the caller can see, once loaded. */
|
|
26
|
+
accountCount) {
|
|
27
|
+
const state = connectorDerivedState(connector);
|
|
28
|
+
if (state === 'error')
|
|
29
|
+
return 'error';
|
|
30
|
+
if (state === 'needs_account')
|
|
31
|
+
return 'account';
|
|
32
|
+
// A channel or computer has no accounts to count. Anything else with zero
|
|
33
|
+
// loaded accounts has nothing to run as, whatever else it reports.
|
|
34
|
+
const counted = connector.provider !== 'channel' && connector.provider !== 'computer';
|
|
35
|
+
if (counted && accountCount === 0)
|
|
36
|
+
return 'account';
|
|
37
|
+
if (state === 'connected')
|
|
38
|
+
return 'connected';
|
|
17
39
|
const status = connectorSetupStatus(connector);
|
|
18
|
-
if (status === '
|
|
19
|
-
return '
|
|
20
|
-
|
|
40
|
+
if (status === 'error')
|
|
41
|
+
return 'error';
|
|
42
|
+
if (status === 'pending' || status === 'needs_setup')
|
|
43
|
+
return 'account';
|
|
44
|
+
return 'connected';
|
|
21
45
|
}
|
|
22
46
|
/**
|
|
23
47
|
* Agents can use the connector now: it is signed in, it runs on per-person
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { AdminConnector } from '@kortix/sdk';
|
|
2
|
-
export type ConnectorTab = 'accounts' | 'tools' | 'triggers' | 'settings';
|
|
2
|
+
export type ConnectorTab = 'accounts' | 'tools' | 'agents' | 'triggers' | 'settings';
|
|
3
3
|
/**
|
|
4
4
|
* Tab order never changes. A tab that does not apply is absent; the ones that
|
|
5
5
|
* remain keep their positions, so the surface does not reshape per connector.
|
|
@@ -17,6 +17,9 @@ export declare const CONNECTOR_TAB_LABEL_KEY: Record<ConnectorTab, string>;
|
|
|
17
17
|
* - Tools and Settings mutate project state, so they are writer-only. Accounts
|
|
18
18
|
* stays for readers: it is how they see whether the connector works, and how
|
|
19
19
|
* they connect their own account.
|
|
20
|
+
* - Agents lists which agents can use the connector and their rule set. It
|
|
21
|
+
* shows for readers too (read-only), except on a channel or the computer:
|
|
22
|
+
* those reach every agent and have no kortix.yaml entry to grant.
|
|
20
23
|
* - Triggers lists the app event triggers on this connector. It shows only when
|
|
21
24
|
* the connector's app has events (`hasEvents`), and for readers too: it is a
|
|
22
25
|
* list, and its New button is gated on its own permission.
|
|
@@ -2,11 +2,12 @@
|
|
|
2
2
|
* Tab order never changes. A tab that does not apply is absent; the ones that
|
|
3
3
|
* remain keep their positions, so the surface does not reshape per connector.
|
|
4
4
|
*/
|
|
5
|
-
export const CONNECTOR_TABS = ['accounts', 'tools', 'triggers', 'settings'];
|
|
5
|
+
export const CONNECTOR_TABS = ['accounts', 'tools', 'agents', 'triggers', 'settings'];
|
|
6
6
|
/** `hardcodedUi.i18nComplete` key of each tab's label. */
|
|
7
7
|
export const CONNECTOR_TAB_LABEL_KEY = {
|
|
8
8
|
accounts: 'text8a7c8b67fe8b',
|
|
9
|
-
tools: '
|
|
9
|
+
tools: 'text9d2b6f0c41ae',
|
|
10
|
+
agents: 'text279b44d2ab4b',
|
|
10
11
|
triggers: 'texte62f2148a64d',
|
|
11
12
|
settings: 'text74a883a037bc',
|
|
12
13
|
};
|
|
@@ -20,6 +21,9 @@ export const CONNECTOR_TAB_LABEL_KEY = {
|
|
|
20
21
|
* - Tools and Settings mutate project state, so they are writer-only. Accounts
|
|
21
22
|
* stays for readers: it is how they see whether the connector works, and how
|
|
22
23
|
* they connect their own account.
|
|
24
|
+
* - Agents lists which agents can use the connector and their rule set. It
|
|
25
|
+
* shows for readers too (read-only), except on a channel or the computer:
|
|
26
|
+
* those reach every agent and have no kortix.yaml entry to grant.
|
|
23
27
|
* - Triggers lists the app event triggers on this connector. It shows only when
|
|
24
28
|
* the connector's app has events (`hasEvents`), and for readers too: it is a
|
|
25
29
|
* list, and its New button is gated on its own permission.
|
|
@@ -31,6 +35,8 @@ export function connectorTabs(connector, caps) {
|
|
|
31
35
|
present.add('accounts');
|
|
32
36
|
if (caps.canWrite)
|
|
33
37
|
present.add('tools');
|
|
38
|
+
if (connector.provider !== 'channel' && connector.provider !== 'computer')
|
|
39
|
+
present.add('agents');
|
|
34
40
|
if (caps.hasEvents)
|
|
35
41
|
present.add('triggers');
|
|
36
42
|
if (caps.canWrite && connector.provider !== 'computer')
|
|
@@ -14,9 +14,9 @@ interface ConnectorToolsProps {
|
|
|
14
14
|
* Three things make this readable to someone who is not going to study a
|
|
15
15
|
* policy engine:
|
|
16
16
|
*
|
|
17
|
-
* 1. **
|
|
18
|
-
* writes
|
|
19
|
-
*
|
|
17
|
+
* 1. **Read, write, unclassified.** `groupToolsByRisk` folds `destructive`
|
|
18
|
+
* into writes, and a tool nobody classified gets its own group instead of
|
|
19
|
+
* passing for a write.
|
|
20
20
|
* 2. **Default is a state, not a value.** A tool the platform allows by
|
|
21
21
|
* default renders with NO segment lit and a `Hint` naming the default.
|
|
22
22
|
* Lighting Allow would claim a choice nobody made.
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
3
3
|
import { ConnectorAdvancedTools } from './connector-advanced-tools.js';
|
|
4
|
+
import { ConnectorPolicySetBar } from './connector-policy-sets.js';
|
|
4
5
|
import { useLocalizedUiCatalog } from '../../../i18n/ui-catalog/use-localized-ui-catalog.js';
|
|
5
6
|
import { useTranslations } from '../../../i18n/index.js';
|
|
6
7
|
import { getConnectorPolicies, setConnectorPolicies, setConnectorSensitive, } from '@kortix/sdk';
|
|
7
8
|
import { CaretDownIcon, CaretRightIcon, LockIcon, MagnifyingGlassIcon, WrenchIcon, } from '@phosphor-icons/react';
|
|
8
9
|
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
|
9
|
-
import { useMemo, useState } from 'react';
|
|
10
|
+
import { useCallback, useMemo, useState } from 'react';
|
|
10
11
|
import { Button } from '../../../primitives/button.js';
|
|
11
12
|
import { ConfirmDialog } from '../../../primitives/confirm-dialog.js';
|
|
12
13
|
import { CountBadge } from '../../../primitives/count-badge.js';
|
|
@@ -15,19 +16,24 @@ import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigge
|
|
|
15
16
|
import { InfoBanner } from '../../../primitives/info-banner.js';
|
|
16
17
|
import { InputGroupSearch, InputGroupSearchClear, InputGroupSearchIcon, InputGroupSearchInput, } from '../../../primitives/input-group.js';
|
|
17
18
|
import { Skeleton } from '../../../primitives/skeleton.js';
|
|
19
|
+
import { cn } from '../../../internal/lib/utils.js';
|
|
18
20
|
import { errorToast, successToast } from '../../../primitives/toast.js';
|
|
19
21
|
import { EmptyState } from '../../../primitives/empty-state.js';
|
|
20
22
|
import { ErrorState } from '../../../primitives/error-state.js';
|
|
23
|
+
import Hint from '../../../primitives/hint.js';
|
|
24
|
+
import { Switch } from '../../../primitives/switch.js';
|
|
21
25
|
import { filterActions, groupToolsByRisk, toolRowText, } from '../tools/tool-groups.js';
|
|
22
|
-
import { applyBulkPolicy,
|
|
26
|
+
import { applyBulkPolicy, connectorDefaultAction, inheritedAction, isAdvancedRule, isLockedByProject, orderPolicyRules, previewEffective, summarizeToolDecisions, toolChoice, } from '../tools/tool-policy.js';
|
|
27
|
+
import { connectorPoliciesKey, supportsPolicySets } from '../tools/policy-sets.js';
|
|
23
28
|
import { ToolPolicyControl } from '../tools/tool-policy-control.js';
|
|
24
29
|
import { POLICY_CHOICE_LABEL, POLICY_SEGMENTS, } from '../tools/tool-policy-labels.js';
|
|
25
30
|
import { CatalogNoMatch } from '../../shared/catalog/catalog-empty-state.js';
|
|
31
|
+
import { UiLink as Link } from '../../../providers/ui-provider.js';
|
|
32
|
+
import { rulesHref } from '../connector-routes.js';
|
|
26
33
|
/** Below this many tools the search field is clutter; above it the list is
|
|
27
34
|
* unusable without one. */
|
|
28
35
|
const SEARCH_THRESHOLD = 6;
|
|
29
36
|
const POLICY_QUERY_STALE_MS = 5_000;
|
|
30
|
-
const LOCKED_REASON = 'A project rule already decides this tool. Change it under Global rules on the Connectors page.';
|
|
31
37
|
/**
|
|
32
38
|
* Tools — what this connector is allowed to do, as a per-tool decision instead
|
|
33
39
|
* of a dropdown and a save button.
|
|
@@ -35,9 +41,9 @@ const LOCKED_REASON = 'A project rule already decides this tool. Change it under
|
|
|
35
41
|
* Three things make this readable to someone who is not going to study a
|
|
36
42
|
* policy engine:
|
|
37
43
|
*
|
|
38
|
-
* 1. **
|
|
39
|
-
* writes
|
|
40
|
-
*
|
|
44
|
+
* 1. **Read, write, unclassified.** `groupToolsByRisk` folds `destructive`
|
|
45
|
+
* into writes, and a tool nobody classified gets its own group instead of
|
|
46
|
+
* passing for a write.
|
|
41
47
|
* 2. **Default is a state, not a value.** A tool the platform allows by
|
|
42
48
|
* default renders with NO segment lit and a `Hint` naming the default.
|
|
43
49
|
* Lighting Allow would claim a choice nobody made.
|
|
@@ -56,21 +62,37 @@ const LOCKED_REASON = 'A project rule already decides this tool. Change it under
|
|
|
56
62
|
*/
|
|
57
63
|
export function ConnectorTools({ projectId, connector, displayName, canWrite, onChanged, }) {
|
|
58
64
|
const t = useTranslations('connectorPages');
|
|
65
|
+
const tSets = useTranslations('connectorPolicySets');
|
|
59
66
|
const tI18nComplete = useTranslations('hardcodedUi.i18nComplete');
|
|
60
67
|
const policySegments = useLocalizedUiCatalog(POLICY_SEGMENTS);
|
|
61
68
|
const queryClient = useQueryClient();
|
|
62
69
|
const slug = connector.slug;
|
|
63
|
-
|
|
70
|
+
// Null edits the base rules; a name edits that policy set's rules. The
|
|
71
|
+
// query key carries it, so each list caches on its own.
|
|
72
|
+
const [policySet, setPolicySet] = useState(null);
|
|
73
|
+
const onPolicySet = useCallback((next) => setPolicySet(next), []);
|
|
74
|
+
const scope = policySet ? 'set' : 'base';
|
|
75
|
+
const showSets = supportsPolicySets(connector.provider);
|
|
76
|
+
const queryKey = useMemo(() => connectorPoliciesKey(projectId, slug, policySet), [projectId, slug, policySet]);
|
|
64
77
|
// Reading policies is admin-gated on the server (`resolveAdmin`,
|
|
65
78
|
// connectors/router.ts:1193), so a reader would get a 403 and a permanent
|
|
66
79
|
// skeleton. `connectorTabs` already hides this tab from them; the guard
|
|
67
80
|
// below keeps that true if it ever stops doing so.
|
|
68
81
|
const policiesQuery = useQuery({
|
|
69
82
|
queryKey,
|
|
70
|
-
queryFn: () => getConnectorPolicies(projectId, slug),
|
|
83
|
+
queryFn: () => getConnectorPolicies(projectId, slug, { policySet: policySet ?? undefined }),
|
|
71
84
|
staleTime: POLICY_QUERY_STALE_MS,
|
|
72
85
|
enabled: canWrite,
|
|
73
86
|
});
|
|
87
|
+
// In a set, Inherit names what the base rules decide. Same key and fetch as
|
|
88
|
+
// the base view and the rule-set strip: one cached request.
|
|
89
|
+
const baseQuery = useQuery({
|
|
90
|
+
queryKey: connectorPoliciesKey(projectId, slug, null),
|
|
91
|
+
queryFn: () => getConnectorPolicies(projectId, slug, { policySet: undefined }),
|
|
92
|
+
staleTime: POLICY_QUERY_STALE_MS,
|
|
93
|
+
enabled: canWrite && scope === 'set',
|
|
94
|
+
});
|
|
95
|
+
const baseEffective = useMemo(() => baseQuery.data?.effective ?? [], [baseQuery.data]);
|
|
74
96
|
const policies = useMemo(() => policiesQuery.data?.policies ?? [], [policiesQuery.data]);
|
|
75
97
|
const effective = useMemo(() => policiesQuery.data?.effective ?? [], [policiesQuery.data]);
|
|
76
98
|
const toolPaths = useMemo(() => new Set(connector.actions.map((action) => action.path)), [connector.actions]);
|
|
@@ -79,14 +101,30 @@ export function ConnectorTools({ projectId, connector, displayName, canWrite, on
|
|
|
79
101
|
// connector no longer reports — belongs to the Advanced editor, where it
|
|
80
102
|
// stays visible and editable instead of being silently dropped on the next
|
|
81
103
|
// save.
|
|
82
|
-
const toolRules = useMemo(() => policies.filter((rule) => !
|
|
83
|
-
const advancedRules = useMemo(() => policies.filter((rule) =>
|
|
104
|
+
const toolRules = useMemo(() => policies.filter((rule) => !isAdvancedRule(rule) && toolPaths.has(rule.match)), [policies, toolPaths]);
|
|
105
|
+
const advancedRules = useMemo(() => policies.filter((rule) => isAdvancedRule(rule) || !toolPaths.has(rule.match)), [policies, toolPaths]);
|
|
106
|
+
const sensitive = connector.sensitive === true;
|
|
107
|
+
const defaultMode = policiesQuery.data?.default_mode;
|
|
108
|
+
const fallback = useCallback((action) => connectorDefaultAction(sensitive, defaultMode, action.risk), [sensitive, defaultMode]);
|
|
109
|
+
const summary = useMemo(() => summarizeToolDecisions(connector.actions, policies, effective, scope, fallback), [connector.actions, policies, effective, scope, fallback]);
|
|
110
|
+
// The first word of a name is the app: `LINEAR_ARCHIVE_ISSUE` reads
|
|
111
|
+
// "Archive issue" on the Linear page.
|
|
112
|
+
const appNames = useMemo(() => [slug, connector.name, displayName, slug.split('-')[0] ?? ''], [slug, connector.name, displayName]);
|
|
84
113
|
const [query, setQuery] = useState('');
|
|
85
|
-
const
|
|
86
|
-
const
|
|
114
|
+
const [onlyChanged, setOnlyChanged] = useState(false);
|
|
115
|
+
const matches = useMemo(() => {
|
|
116
|
+
const found = filterActions(connector.actions, query);
|
|
117
|
+
if (!onlyChanged)
|
|
118
|
+
return found;
|
|
119
|
+
return found.filter((action) => toolChoice(action.path, policies, effective, scope) !== 'default' &&
|
|
120
|
+
!isLockedByProject(action.path, effective));
|
|
121
|
+
}, [connector.actions, query, onlyChanged, policies, effective, scope]);
|
|
122
|
+
const groups = useMemo(() => groupToolsByRisk(matches, tI18nComplete, appNames), [matches, tI18nComplete, appNames]);
|
|
87
123
|
const projectLockedCount = useMemo(() => effective.filter((entry) => entry.source === 'project').length, [effective]);
|
|
88
124
|
const writePolicies = useMutation({
|
|
89
|
-
mutationFn: (write) => setConnectorPolicies(projectId, slug, orderPolicyRules(write.rules)
|
|
125
|
+
mutationFn: (write) => setConnectorPolicies(projectId, slug, orderPolicyRules(write.rules), {
|
|
126
|
+
policySet: policySet ?? undefined,
|
|
127
|
+
}),
|
|
90
128
|
onMutate: async (write) => {
|
|
91
129
|
await queryClient.cancelQueries({ queryKey });
|
|
92
130
|
const previous = queryClient.getQueryData(queryKey);
|
|
@@ -95,7 +133,7 @@ export function ConnectorTools({ projectId, connector, displayName, canWrite, on
|
|
|
95
133
|
...old,
|
|
96
134
|
policies: orderPolicyRules(write.rules),
|
|
97
135
|
effective: write.paths && write.choice
|
|
98
|
-
? previewEffective(old.effective ?? [], write.paths, write.choice)
|
|
136
|
+
? previewEffective(old.effective ?? [], write.paths, write.choice, scope)
|
|
99
137
|
: old.effective,
|
|
100
138
|
}
|
|
101
139
|
: old);
|
|
@@ -145,33 +183,76 @@ export function ConnectorTools({ projectId, connector, displayName, canWrite, on
|
|
|
145
183
|
return (_jsxs("p", { className: "text-muted-foreground text-sm text-pretty", children: [tI18nComplete.raw('textdb7d057a2f68'), " ", displayName, ' ', tI18nComplete.raw('text24984f203fd7')] }));
|
|
146
184
|
}
|
|
147
185
|
const hasTools = connector.actions.length > 0;
|
|
148
|
-
|
|
186
|
+
const choiceLabel = (choice) => choice === 'default' && scope === 'set' ? tSets('inherit') : POLICY_CHOICE_LABEL[choice];
|
|
187
|
+
const decisionWord = (action) => action === 'block'
|
|
188
|
+
? t('toolsDecisionBlocked')
|
|
189
|
+
: action === 'require_approval'
|
|
190
|
+
? t('toolsDecisionAsks')
|
|
191
|
+
: t('toolsDecisionRuns');
|
|
192
|
+
const inheritLabel = (path, choice, action) => {
|
|
193
|
+
const resolved = decisionWord(inheritedAction(path, choice, effective, baseEffective, scope, fallback(action)));
|
|
194
|
+
return scope === 'set'
|
|
195
|
+
? t('toolsInheritAs', { action: resolved })
|
|
196
|
+
: t('toolsDefaultAs', { action: resolved });
|
|
197
|
+
};
|
|
198
|
+
// What decides a tool left on Default/Inherit, named the way the page names
|
|
199
|
+
// it: the base rules, the sensitive flag, or the project's default mode.
|
|
200
|
+
const decidedBy = (path) => {
|
|
201
|
+
const entry = (scope === 'set' ? baseEffective : effective).find((e) => e.path === path);
|
|
202
|
+
if (scope === 'set' && entry?.source !== 'risk_default' && entry?.source !== 'allow_all') {
|
|
203
|
+
return t('toolsFromBase');
|
|
204
|
+
}
|
|
205
|
+
if (entry?.source === 'connector')
|
|
206
|
+
return t('toolsFromBase');
|
|
207
|
+
if (sensitive)
|
|
208
|
+
return t('toolsFromSensitive');
|
|
209
|
+
return t('toolsFromDefault');
|
|
210
|
+
};
|
|
211
|
+
const summaryParts = [
|
|
212
|
+
t('toolsSummaryTotal', { count: summary.total }),
|
|
213
|
+
summary.block > 0 ? t('toolsSummaryBlocked', { count: summary.block }) : null,
|
|
214
|
+
summary.ask > 0 ? t('toolsSummaryAsk', { count: summary.ask }) : null,
|
|
215
|
+
summary.run > 0 ? t('toolsSummaryRun', { count: summary.run }) : null,
|
|
216
|
+
].filter(Boolean);
|
|
217
|
+
return (_jsxs("div", { className: "space-y-5", children: [showSets ? (_jsx(ConnectorPolicySetBar, { projectId: projectId, slug: slug, canWrite: canWrite, value: policySet, onChange: onPolicySet })) : null, hasTools && policiesQuery.data ? (_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3", children: [_jsx("p", { className: "text-muted-foreground min-w-0 text-sm tabular-nums", children: summaryParts.join(' · ') }), _jsxs("div", { className: "flex w-full flex-wrap items-center gap-3 sm:w-auto", children: [connector.actions.length > SEARCH_THRESHOLD ? (_jsxs(InputGroupSearch, { className: "w-full sm:w-56", children: [_jsx(InputGroupSearchIcon, { children: _jsx(MagnifyingGlassIcon, {}) }), _jsx(InputGroupSearchInput, { placeholder: tI18nComplete.raw('textfbd165231fa1'), value: query, onChange: (event) => setQuery(event.target.value), size: "sm" }), _jsx(InputGroupSearchClear, { onClick: () => setQuery('') })] })) : null, _jsx(Switch, { label: t('toolsOnlyChanged'), checked: onlyChanged, onCheckedChange: setOnlyChanged, className: "px-0 py-0" })] })] })) : null, projectLockedCount > 0 ? (_jsxs(InfoBanner, { tone: "warning", icon: LockIcon, title: tI18nComplete('textd3d900c89bd0', {
|
|
149
218
|
value0: projectLockedCount,
|
|
150
219
|
value1: projectLockedCount === 1
|
|
151
220
|
? tI18nComplete.raw('text86ca67d2851a')
|
|
152
221
|
: tI18nComplete.raw('textd50ab26e1621'),
|
|
153
|
-
}), children:
|
|
222
|
+
}), children: [t('toolsProjectLockedBody'), ' ', _jsx(Link, { href: rulesHref(projectId), className: "text-foreground underline underline-offset-4", children: t('toolsOpenRules') })] })) : null, policiesQuery.isPending ? (_jsx("div", { className: "space-y-2", children: [0, 1, 2].map((row) => (_jsx(Skeleton, { className: "h-14 rounded-md" }, row))) })) : policiesQuery.isError ? (_jsx(ErrorState, { size: "sm", title: tI18nComplete.raw('textff6065190563'), description: policiesQuery.error instanceof Error
|
|
154
223
|
? policiesQuery.error.message
|
|
155
224
|
: tI18nComplete.raw('texta47c08d35337'), action: _jsx(Button, { variant: "outline", size: "sm", onClick: () => void policiesQuery.refetch(), children: tI18nComplete.raw('text942087cc2d41') }) })) : !hasTools ? (
|
|
156
225
|
// The connector exists but has reported no tools — a failed or pending
|
|
157
226
|
// sync. That is a different statement from "nothing matched your
|
|
158
227
|
// search", and it must not render as a blank panel.
|
|
159
|
-
_jsx(EmptyState, { icon: WrenchIcon, size: "sm", title: tI18nComplete.raw('text99dd86336467'), description: t('toolsEmptyBody', { name: displayName }) })) : groups.length === 0 ? (
|
|
228
|
+
_jsx(EmptyState, { icon: WrenchIcon, size: "sm", title: tI18nComplete.raw('text99dd86336467'), description: t('toolsEmptyBody', { name: displayName }) })) : groups.length === 0 && onlyChanged && !query.trim() ? (_jsx("p", { className: "text-muted-foreground py-6 text-center text-sm text-pretty", children: scope === 'set' ? t('toolsNoneChangedSet') : t('toolsNoneChangedBase') })) : groups.length === 0 ? (
|
|
160
229
|
// The same line the four catalogs render, from the same component.
|
|
161
230
|
// What was searched is unambiguous here — the box above says "Search
|
|
162
231
|
// 19 tools" — so a second wording for one outcome bought nothing.
|
|
163
|
-
_jsx(CatalogNoMatch, { query: query })) : (_jsx("div", { className: "space-y-2", children: groups.map((group) => (_jsxs(Disclosure, { variant: "outline", className: "overflow-hidden", defaultOpen: true, children: [_jsxs("div", { className: "flex items-center gap-2 pr-2", children: [_jsx(DisclosureTrigger, { variant: "outline", children: _jsxs(Button, { variant: "popover", className: "flex min-w-0 flex-1 items-center justify-start rounded-none", children: [_jsx(CaretRightIcon, { className: "text-muted-foreground size-3.5 shrink-0 transition-transform duration-(--duration-normal) ease-out group-data-[state=open]:rotate-90 motion-reduce:transition-none" }), _jsx("span", { className: "truncate text-sm font-medium", children: group.label }), _jsx(CountBadge, { count: group.actions.length })] }) }), _jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs(Button, { size: "sm", variant: "ghost", className: "shrink-0", disabled: frozen || busy || bulkPathsFor(group).length === 0, children: [tI18nComplete.raw('textd9d0b4384a58'), _jsx(CaretDownIcon, { className: "size-3.5 shrink-0" })] }) }), _jsx(DropdownMenuContent, { align: "end", className: "min-w-32", children: policySegments.map((segment) => (_jsx(DropdownMenuItem, { onSelect: () => setBulk({ group, choice: segment.choice }), children: segment.label }, segment.choice))) })] })] }), _jsx(DisclosureContent, { variant: "outline", contentClassName: "border-border border-t", children: _jsx("ul", { className: "divide-border/60 divide-y px-4", children: group.actions.map((action) => {
|
|
232
|
+
_jsx(CatalogNoMatch, { query: query })) : (_jsx("div", { className: "space-y-2", children: groups.map((group) => (_jsxs(Disclosure, { variant: "outline", className: "overflow-hidden", defaultOpen: true, children: [_jsxs("div", { className: "flex items-center gap-2 pr-2", children: [_jsx(DisclosureTrigger, { variant: "outline", children: _jsxs(Button, { variant: "popover", className: "flex min-w-0 flex-1 items-center justify-start rounded-none", children: [_jsx(CaretRightIcon, { className: "text-muted-foreground size-3.5 shrink-0 transition-transform duration-(--duration-normal) ease-out group-data-[state=open]:rotate-90 motion-reduce:transition-none" }), _jsx("span", { className: "truncate text-sm font-medium", children: group.label }), _jsx(CountBadge, { count: group.actions.length })] }) }), _jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs(Button, { size: "sm", variant: "ghost", className: "shrink-0", disabled: frozen || busy || bulkPathsFor(group).length === 0, children: [tI18nComplete.raw('textd9d0b4384a58'), _jsx(CaretDownIcon, { className: "size-3.5 shrink-0" })] }) }), _jsx(DropdownMenuContent, { align: "end", className: "min-w-32", children: policySegments.map((segment) => (_jsx(DropdownMenuItem, { onSelect: () => setBulk({ group, choice: segment.choice }), children: segment.choice === 'default' ? choiceLabel('default') : segment.label }, segment.choice))) })] })] }), _jsx(DisclosureContent, { variant: "outline", contentClassName: "border-border border-t", children: _jsx("ul", { className: "divide-border/60 divide-y px-4", children: group.actions.map((action) => {
|
|
164
233
|
const locked = isLockedByProject(action.path, effective);
|
|
165
|
-
const row = toolRowText(action);
|
|
166
|
-
|
|
234
|
+
const row = toolRowText(action, appNames);
|
|
235
|
+
const choice = toolChoice(action.path, policies, effective, scope);
|
|
236
|
+
const changed = choice !== 'default' && !locked;
|
|
237
|
+
return (_jsxs("li", { className: "flex flex-wrap items-center gap-x-4 gap-y-2 py-2.5", children: [_jsxs("div", { className: "flex min-w-0 flex-1 basis-56 items-start gap-2", children: [_jsx("span", { className: "flex h-5 shrink-0 items-center", children: _jsx("span", { className: cn('size-1.5 rounded-full', changed && 'bg-foreground'), children: changed ? _jsx("span", { className: "sr-only", children: t('toolsChanged') }) : null }) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex flex-wrap items-baseline gap-x-2", children: [_jsx("p", { className: "text-foreground min-w-0 text-sm font-medium wrap-break-word", children: row.title }), row.path ? (_jsx("code", { className: "text-muted-foreground max-w-full truncate font-mono text-xs", children: row.path })) : null] }), choice === 'default' && !locked ? (_jsx("p", { className: "text-muted-foreground text-xs", children: decidedBy(action.path) })) : null, row.description ? (_jsx(Hint, { label: row.description, side: "bottom", children: _jsx("p", { className: "text-muted-foreground truncate text-xs", children: row.description }) })) : null] })] }), _jsx(ToolPolicyControl, { label: tI18nComplete('textb34f1e3c1569', {
|
|
167
238
|
value0: row.path ?? row.title,
|
|
168
|
-
}), value:
|
|
169
|
-
}) }) })] }, group.key))) })), _jsx(ConnectorAdvancedTools, { connector: connector, advancedRules: advancedRules, toolRules: toolRules, loaded: !!policiesQuery.data, frozen: frozen, busy: busy, saving: writePolicies.isPending, sensitivePending: sensitiveMutation.isPending, onSave: (rules) => writePolicies.mutate({ rules }), onSensitive: (next) => sensitiveMutation.mutate(next) }), _jsx(ConfirmDialog, { open: bulk !== null, onOpenChange: (open) => {
|
|
239
|
+
}), value: choice, onChange: (next) => setToolPolicy(action.path, next), disabled: frozen || busy, lockedReason: locked ? t('toolsLockedByProject') : undefined, defaultLabel: inheritLabel(action.path, choice, action) })] }, action.path));
|
|
240
|
+
}) }) })] }, group.key))) })), _jsx(ConnectorAdvancedTools, { connector: connector, showSensitive: scope === 'base', advancedRules: advancedRules, toolRules: toolRules, loaded: !!policiesQuery.data, frozen: frozen, busy: busy, saving: writePolicies.isPending, sensitivePending: sensitiveMutation.isPending, onSave: (rules) => writePolicies.mutate({ rules }), onSensitive: (next) => sensitiveMutation.mutate(next) }, policySet ?? 'base'), _jsx(ConfirmDialog, { open: bulk !== null, onOpenChange: (open) => {
|
|
170
241
|
if (!open)
|
|
171
242
|
setBulk(null);
|
|
172
|
-
}, title: bulk
|
|
243
|
+
}, title: bulk
|
|
244
|
+
? bulk.choice === 'default' && scope === 'set'
|
|
245
|
+
? tSets('bulkInheritTitle', { count: bulkPaths.length })
|
|
246
|
+
: bulkConfirmTitle(bulkPaths.length, bulk.choice)
|
|
247
|
+
: '', description: bulk
|
|
248
|
+
? bulk.choice === 'default' && scope === 'set'
|
|
249
|
+
? tSets('bulkInheritBody', { group: bulk.group.label })
|
|
250
|
+
: bulkConfirmDescription(bulk.group.label, bulk.choice)
|
|
251
|
+
: '', confirmLabel: bulk
|
|
173
252
|
? bulk.choice === 'default'
|
|
174
|
-
?
|
|
253
|
+
? scope === 'set'
|
|
254
|
+
? tSets('inherit')
|
|
255
|
+
: tI18nComplete.raw('text1707565fd3f0')
|
|
175
256
|
: tI18nComplete('text41ffc5e14073', { value0: POLICY_CHOICE_LABEL[bulk.choice] })
|
|
176
257
|
: 'Confirm', isPending: writePolicies.isPending, onConfirm: () => {
|
|
177
258
|
if (!bulk)
|
|
@@ -198,27 +279,3 @@ function bulkConfirmDescription(groupLabel, choice) {
|
|
|
198
279
|
? `Deletes the per-tool rule for every tool listed under ${groupLabel} right now, so each one follows the connector default again. ${tail}`
|
|
199
280
|
: `Every tool listed under ${groupLabel} right now is set to ${POLICY_CHOICE_LABEL[choice]}. ${tail}`;
|
|
200
281
|
}
|
|
201
|
-
/**
|
|
202
|
-
* What happens to a tool nobody has decided on — read off the server's own
|
|
203
|
-
* answer, never guessed. `sensitive` beats `default_mode` at the gate
|
|
204
|
-
* (`resolveEffectiveAction`, connectors/policy.ts:362), so it is stated first.
|
|
205
|
-
*/
|
|
206
|
-
function describeDefault(sensitive, defaultMode) {
|
|
207
|
-
if (sensitive) {
|
|
208
|
-
return 'Every tool asks for approval before it runs, including reads. Set a tool below to change that.';
|
|
209
|
-
}
|
|
210
|
-
if (defaultMode === 'allow_all') {
|
|
211
|
-
return 'Every tool runs without asking unless you decide otherwise below.';
|
|
212
|
-
}
|
|
213
|
-
return 'Reads run without asking; writes and deletes ask first. Decide any tool below.';
|
|
214
|
-
}
|
|
215
|
-
/** The same answer for one row, so an unlit control still says what it does. */
|
|
216
|
-
function describeToolDefault(sensitive, defaultMode, risk) {
|
|
217
|
-
if (sensitive)
|
|
218
|
-
return 'Following the connector default — asks before it runs.';
|
|
219
|
-
if (defaultMode === 'allow_all')
|
|
220
|
-
return 'Following the connector default — runs without asking.';
|
|
221
|
-
return risk === 'read'
|
|
222
|
-
? 'Following the connector default — runs without asking.'
|
|
223
|
-
: 'Following the connector default — asks before it runs.';
|
|
224
|
-
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type EmailInbox } from '../../../internal/hooks/channels/use-email-inboxes.js';
|
|
2
|
+
import type { EmailSenderPolicy } from '../../../internal/hooks/channels/use-channels-installations.js';
|
|
3
|
+
/** The one connector profile every inbox is an account on. */
|
|
4
|
+
export declare const EMAIL_CONNECTOR_SLUG = "kortix_email";
|
|
5
|
+
/** "Kortix managed" or "Your Resend account": where an inbox lives. */
|
|
6
|
+
export declare function EmailInboxHome({ inbox }: {
|
|
7
|
+
inbox: Pick<EmailInbox, 'managed'>;
|
|
8
|
+
}): import("react").JSX.Element;
|
|
9
|
+
/** The sender policy in the editor's shape, whatever casing the wire used. */
|
|
10
|
+
export declare function inboxSenderPolicy(inbox: Pick<EmailInbox, 'sender_policy'> | null | undefined): EmailSenderPolicy;
|
|
11
|
+
/**
|
|
12
|
+
* "Add inbox": the account's name and who can use it (`AddAccountFields`, the
|
|
13
|
+
* same fields every connector's Add account asks), then the inbox itself
|
|
14
|
+
* (`EmailConnectForm`). Picked people get the account shared with them after
|
|
15
|
+
* it exists, exactly like `useAddAccount`.
|
|
16
|
+
*/
|
|
17
|
+
export declare function AddEmailInboxDialog({ projectId, open, onOpenChange, existing, onAdded, }: {
|
|
18
|
+
projectId: string;
|
|
19
|
+
open: boolean;
|
|
20
|
+
onOpenChange: (open: boolean) => void;
|
|
21
|
+
/** The profile's accounts, for a free name and the "already used" check. */
|
|
22
|
+
existing: ReadonlyArray<{
|
|
23
|
+
label: string;
|
|
24
|
+
owner_type: string;
|
|
25
|
+
}>;
|
|
26
|
+
onAdded: (inbox: EmailInbox) => void;
|
|
27
|
+
}): import("react").JSX.Element;
|
|
28
|
+
/** "Who can email" for one inbox: anyone, or only the listed senders. */
|
|
29
|
+
export declare function EmailSenderPolicyDialog({ projectId, inbox, open, onOpenChange, }: {
|
|
30
|
+
projectId: string;
|
|
31
|
+
inbox: EmailInbox | null;
|
|
32
|
+
open: boolean;
|
|
33
|
+
onOpenChange: (open: boolean) => void;
|
|
34
|
+
}): import("react").JSX.Element;
|
|
35
|
+
/**
|
|
36
|
+
* The Email hero (Channels tab, the Email page): the pitch until a first inbox
|
|
37
|
+
* exists, then how many inboxes there are, their addresses, and Manage (the
|
|
38
|
+
* connector page with the account list) or Add another inbox. Like ComputerHero.
|
|
39
|
+
*/
|
|
40
|
+
export declare function EmailHero({ projectId, canWrite }: {
|
|
41
|
+
projectId: string;
|
|
42
|
+
canWrite: boolean;
|
|
43
|
+
}): import("react").JSX.Element;
|