@kortix/ui 0.14.7 → 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 +64 -4
- 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/runtime-versions.d.ts +4 -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/access-dialog-share.js +4 -7
- package/dist/access/access/access-dialog.js +2 -1
- package/dist/access/access/principal-picker.d.ts +11 -0
- package/dist/access/access/principal-picker.js +9 -7
- 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-cover-card.d.ts +17 -0
- package/dist/customize/agents/agent-cover-card.js +13 -0
- 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 +8 -33
- 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/agents/agents-page.js +43 -49
- 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 -24
- package/dist/customize/migrate-to-v2/migration-prompt.js +34 -235
- 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 +63 -81
- 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/new-entity-menu.js +4 -1
- package/dist/customize/shared/use-customize-prefetch.d.ts +2 -3
- package/dist/customize/shared/use-customize-prefetch.js +9 -27
- package/dist/customize/skills/skills-page.js +4 -5
- 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/then-fields.js +1 -5
- 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 +9 -4
- 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 +906 -70
- package/dist/i18n/en.js +924 -88
- 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.d.ts +38 -0
- package/dist/internal/components/agent-mark.js +41 -0
- 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/pixel-mark.d.ts +33 -0
- package/dist/internal/lib/pixel-mark.js +152 -0
- package/dist/internal/lib/use-project-feature-flags.js +11 -11
- 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/genui/components/inline.d.ts +1 -1
- 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/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/entity-avatar.d.ts +4 -1
- package/dist/primitives/entity-avatar.js +4 -2
- 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/primitives/user-avatar.d.ts +3 -1
- package/dist/primitives/user-avatar.js +4 -2
- package/dist/providers/ui-provider.d.ts +10 -1
- 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 +19 -1
- package/dist/session/composer/agent-selector.js +42 -12
- 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/context-usage.d.ts +5 -0
- package/dist/session/composer/context-usage.js +6 -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/composer/token-progress.js +4 -4
- package/dist/session/header/export-transcript-modal.d.ts +3 -2
- package/dist/session/header/export-transcript-modal.js +6 -3
- 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.d.ts +3 -1
- package/dist/session/models/model-selector.js +7 -3
- 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/easy/plan-card.d.ts +2 -0
- package/dist/session/panel/easy/plan-card.js +2 -0
- 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/plan-surface.d.ts +1 -0
- package/dist/session/thread/plan-surface.js +1 -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-context-metrics.d.ts +15 -0
- package/dist/session/thread/session-context-metrics.js +10 -1
- package/dist/session/thread/session-context-modal.d.ts +4 -2
- package/dist/session/thread/session-context-modal.js +16 -9
- 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 +4 -9
- package/dist/session/thread/transcript.js +119 -21
- package/dist/session/thread/turn-share.d.ts +16 -0
- package/dist/session/thread/turn-share.js +162 -0
- 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/apply-patch-tool.d.ts +1 -0
- package/dist/session/tool/tools/apply-patch-tool.js +1 -0
- 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/pty-kill-tool.d.ts +1 -0
- package/dist/session/tool/tools/pty-kill-tool.js +1 -0
- package/dist/session/tool/tools/pty-read-tool.d.ts +2 -0
- package/dist/session/tool/tools/pty-read-tool.js +2 -0
- package/dist/session/tool/tools/pty-spawn-tool.d.ts +1 -0
- package/dist/session/tool/tools/pty-spawn-tool.js +1 -0
- package/dist/session/tool/tools/pty-write-tool.d.ts +1 -0
- package/dist/session/tool/tools/pty-write-tool.js +1 -0
- package/dist/session/tool/tools/show-tool.js +19 -8
- package/dist/session/tool/tools/todo-write-tool.d.ts +1 -0
- package/dist/session/tool/tools/todo-write-tool.js +1 -0
- 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-label.js +6 -2
- 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 +4 -1
- package/dist/session/turn/plan-anchor.js +4 -1
- package/dist/session/turn/plan-card.d.ts +7 -0
- package/dist/session/turn/plan-card.js +7 -0
- 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/terminal/session-terminal-connect-bar.js +2 -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-brief-hover-card.js +28 -1
- 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 +31 -32
- 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/agents/agent-nav.prototype.d.ts +0 -35
- package/dist/customize/agents/agent-nav.prototype.js +0 -95
- 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/{internal/hooks → hooks}/use-media-query.js +0 -0
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
import type { AgentDraft } from '../sections/view/agent-editor.js';
|
|
2
2
|
import { type ProjectConfigSummary } from '@kortix/sdk';
|
|
3
|
+
import { type PolicySetOption } from './agent-policy-sets.js';
|
|
3
4
|
export declare function SkillsGrantPage({ projectId, config, editor, }: {
|
|
4
5
|
projectId: string;
|
|
5
6
|
config: ProjectConfigSummary;
|
|
6
7
|
editor: AgentDraft;
|
|
7
8
|
}): import("react").JSX.Element;
|
|
8
|
-
export declare function ConnectorsGrantPage({ projectId, editor, }: {
|
|
9
|
+
export declare function ConnectorsGrantPage({ projectId, editor, policySetOptions, }: {
|
|
9
10
|
projectId: string;
|
|
10
11
|
editor: AgentDraft;
|
|
12
|
+
/** Each connector's policy sets (`connectorPolicySetOptions`), read from the
|
|
13
|
+
* manifest the page already holds. */
|
|
14
|
+
policySetOptions?: Record<string, PolicySetOption[]>;
|
|
11
15
|
}): import("react").JSX.Element;
|
|
12
16
|
export declare function SecretsGrantPage({ projectId, editor }: {
|
|
13
17
|
projectId: string;
|
|
@@ -15,11 +15,15 @@ import { useTranslations as useI18nTranslations } from '../../i18n/index.js';
|
|
|
15
15
|
import { Badge } from '../../primitives/badge.js';
|
|
16
16
|
import { Button } from '../../primitives/button.js';
|
|
17
17
|
import { Checkbox } from '../../primitives/checkbox.js';
|
|
18
|
+
import Hint from '../../primitives/hint.js';
|
|
19
|
+
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '../../primitives/select.js';
|
|
18
20
|
import { Skeleton } from '../../primitives/skeleton.js';
|
|
19
21
|
import { EmptyState } from '../../primitives/empty-state.js';
|
|
20
22
|
import { ErrorState } from '../../primitives/error-state.js';
|
|
21
23
|
import { connectorDisplayName } from '../connectors/connector-filter.js';
|
|
22
|
-
import {
|
|
24
|
+
import { ConnectorStatusBadge } from '../connectors/connector-identity.js';
|
|
25
|
+
import { ConnectorLogo } from '../../internal/connector-logo/connector-logo.js';
|
|
26
|
+
import { installedConnectorLogoSource } from '../../internal/connector-logo/connector-logo-source.js';
|
|
23
27
|
import { ConnectorModal } from '../connectors/detail/connector-modal.js';
|
|
24
28
|
import { providerLabel } from '../connectors/provider-label.js';
|
|
25
29
|
import { detailSelection } from '../shared/detail-selection.js';
|
|
@@ -38,6 +42,7 @@ import { PlusIcon } from '@phosphor-icons/react';
|
|
|
38
42
|
import { useQuery, useQueryClient } from '@tanstack/react-query';
|
|
39
43
|
import { useState } from 'react';
|
|
40
44
|
import { appGrantRows } from './agent-apps-grant.js';
|
|
45
|
+
import { policySetRows, withPolicySet, } from './agent-policy-sets.js';
|
|
41
46
|
/**
|
|
42
47
|
* All · Pick · None over the project's catalog, as one bordered list. The
|
|
43
48
|
* checkbox exists only in Pick mode, where it is the control; in All and
|
|
@@ -97,7 +102,28 @@ export function SkillsGrantPage({ projectId, config, editor, }) {
|
|
|
97
102
|
} })] }));
|
|
98
103
|
}
|
|
99
104
|
// ─── Connectors ──────────────────────────────────────────────────────────
|
|
100
|
-
|
|
105
|
+
const BASE_SET_VALUE = '__base';
|
|
106
|
+
/**
|
|
107
|
+
* Which rule set the agent gets on each granted connector that defines sets
|
|
108
|
+
* (`agents.<a>.policy_sets`). One list for Pick and All alike: under All the
|
|
109
|
+
* catalog has no per-row controls, and a second rendering for that mode would
|
|
110
|
+
* be two places to set one value. Choosing a set needs connector write as well
|
|
111
|
+
* as agent write (the API checks both), so a viewer without it sees the
|
|
112
|
+
* values but cannot change them.
|
|
113
|
+
*/
|
|
114
|
+
function AgentPolicySetsSection({ editor, catalog, connectors, canWrite, }) {
|
|
115
|
+
const t = useI18nTranslations('connectorPolicySets');
|
|
116
|
+
const { draft, set } = editor;
|
|
117
|
+
const rows = policySetRows(draft.connectors, catalog, draft.policy_sets, connectors.map((connector) => connector.slug));
|
|
118
|
+
if (rows.length === 0)
|
|
119
|
+
return null;
|
|
120
|
+
return (_jsx(EditorSection, { title: t('agentSection'), bare: true, children: _jsx(EditorList, { children: rows.map((row) => {
|
|
121
|
+
const connector = connectors.find((candidate) => candidate.slug === row.slug);
|
|
122
|
+
const name = connector ? connectorDisplayName(connector) : row.slug;
|
|
123
|
+
return (_jsxs("li", { className: "flex min-h-13 items-center gap-3 px-4 py-2", children: [connector ? (_jsx(ConnectorLogo, { source: installedConnectorLogoSource(connector), size: "sm" })) : null, _jsxs("span", { className: "min-w-0 flex-1", children: [_jsx("span", { className: "text-foreground block truncate text-sm font-medium", children: name }), _jsx("span", { className: "text-muted-foreground block truncate font-mono text-xs", children: row.slug })] }), row.missing && row.value ? (_jsx(Hint, { label: t('agentMissingHint', { name: row.value }), children: _jsx(Badge, { variant: "destructive", size: "xs", children: t('agentMissing') }) })) : null, _jsxs(Select, { value: row.value ?? BASE_SET_VALUE, disabled: !canWrite, onValueChange: (next) => set('policy_sets', withPolicySet(draft.policy_sets, row.slug, next === BASE_SET_VALUE ? null : next)), children: [_jsx(SelectTrigger, { size: "sm", className: "w-40 shrink-0", "aria-label": t('agentSelectLabel', { name }), children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { align: "end", children: [_jsx(SelectItem, { value: BASE_SET_VALUE, children: t('baseRules') }), row.options.map((option) => (_jsx(SelectItem, { value: option.name, description: option.description, children: _jsx("span", { className: "font-mono", children: option.name }) }, option.name))), row.missing && row.value ? (_jsx(SelectItem, { value: row.value, children: _jsx("span", { className: "font-mono", children: row.value }) })) : null] })] })] }, row.slug));
|
|
124
|
+
}) }) }));
|
|
125
|
+
}
|
|
126
|
+
export function ConnectorsGrantPage({ projectId, editor, policySetOptions, }) {
|
|
101
127
|
const tI18nComplete = useI18nTranslations('hardcodedUi.i18nComplete');
|
|
102
128
|
const queryClient = useQueryClient();
|
|
103
129
|
const accountId = useProjectAccountId(projectId);
|
|
@@ -131,7 +157,7 @@ export function ConnectorsGrantPage({ projectId, editor, }) {
|
|
|
131
157
|
}
|
|
132
158
|
}, isLoading: connectorsQuery.isLoading, isError: connectorsQuery.isError, onRetry: () => void connectorsQuery.refetch(), items: connectors.map((connector) => ({
|
|
133
159
|
id: connector.slug,
|
|
134
|
-
leading: _jsx(
|
|
160
|
+
leading: _jsx(ConnectorLogo, { source: installedConnectorLogoSource(connector), size: "sm" }),
|
|
135
161
|
title: connectorDisplayName(connector),
|
|
136
162
|
description: `${providerLabel(connector.provider)} · ${connector.actions.length} ${connector.actions.length === 1 ? 'action' : 'actions'}`,
|
|
137
163
|
status: _jsx(ConnectorStatusBadge, { connector: connector }),
|
|
@@ -142,7 +168,7 @@ export function ConnectorsGrantPage({ projectId, editor, }) {
|
|
|
142
168
|
? current.filter((a) => a !== slug)
|
|
143
169
|
: [...current, slug];
|
|
144
170
|
set('connectors_required', next.length ? next : undefined);
|
|
145
|
-
} })), empty: _jsx(EmptyState, { size: "sm", title: tI18nComplete.raw('text51ae0a7e3783'), description: tI18nComplete.raw('text9bf8fe539046') }) }), draft.connectors === 'all' && draft.connectors_required?.length ? (_jsxs("p", { className: "text-muted-foreground text-xs", children: [tI18nComplete.raw('textf39fe0fefce2'), ' ', _jsx("span", { className: "font-mono", children: draft.connectors_required.join(', ') }), tI18nComplete.raw('text954401fb96d1')] })) : null] }) }), _jsx(ConnectorModal, { projectId: projectId, connector: detail.record, canWrite: canWrite, open: detail.open, isResolving: detail.isResolving, onOpenChange: (open) => !open && setDetailSlug(null), onChanged: invalidate, onRemoved: () => {
|
|
171
|
+
} })), empty: _jsx(EmptyState, { size: "sm", title: tI18nComplete.raw('text51ae0a7e3783'), description: tI18nComplete.raw('text9bf8fe539046') }) }), draft.connectors === 'all' && draft.connectors_required?.length ? (_jsxs("p", { className: "text-muted-foreground text-xs", children: [tI18nComplete.raw('textf39fe0fefce2'), ' ', _jsx("span", { className: "font-mono", children: draft.connectors_required.join(', ') }), tI18nComplete.raw('text954401fb96d1')] })) : null] }) }), _jsx(AgentPolicySetsSection, { editor: editor, catalog: policySetOptions ?? {}, connectors: connectors, canWrite: canWrite }), _jsx(ConnectorModal, { projectId: projectId, connector: detail.record, canWrite: canWrite, open: detail.open, isResolving: detail.isResolving, onOpenChange: (open) => !open && setDetailSlug(null), onChanged: invalidate, onRemoved: () => {
|
|
146
172
|
invalidate();
|
|
147
173
|
setDetailSlug(null);
|
|
148
174
|
} })] }));
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { AgentMark } from '../../internal/components/agent-mark.js';
|
|
3
4
|
import { EntityFilePane } from '../shared/entity/entity-modal.js';
|
|
4
5
|
import { agentStatus } from './agent-status.js';
|
|
5
6
|
import { useDefaultAgent } from './use-default-agent.js';
|
|
@@ -66,7 +67,7 @@ import { errorToast, successToast } from '../../primitives/toast.js';
|
|
|
66
67
|
import { EmptyState } from '../../primitives/empty-state.js';
|
|
67
68
|
import { ErrorState } from '../../primitives/error-state.js';
|
|
68
69
|
import { configEntitySourcePath } from '../sections/component/config-entity-source-path.js';
|
|
69
|
-
import { AgentConfigSections, agentConfigSectionKeys, agentEditorOptionQueries, DEFAULT_AGENT_CONFIG_SECTION,
|
|
70
|
+
import { AgentConfigSections, agentConfigSectionKeys, agentEditorOptionQueries, DEFAULT_AGENT_CONFIG_SECTION, isAgentConfigSectionKey, registryGrantOptions, useAgentDraft, useAgentEditorOptions, useLocalizedAgentConfigCatalog, } from '../sections/view/agent-editor.js';
|
|
70
71
|
import { formatMode, toArray } from '../shared/utils.js';
|
|
71
72
|
import { editConfigPrompt, useConfigureThread, } from '../use-configure-thread.js';
|
|
72
73
|
import { agentConfigNeedsUpgrade, useAgentConfig, useUpdateAgentConfig, } from '../../internal/hooks/projects/use-agent-config.js';
|
|
@@ -92,7 +93,7 @@ import { AgentDrivesSection } from './agent-drives-section.js';
|
|
|
92
93
|
import { AgentAuthorityCard } from './agent-authority-card.js';
|
|
93
94
|
import { AgentModel, AgentScope } from './agent-detail-aside.js';
|
|
94
95
|
import { AppsGrantPage, ConnectorsGrantPage, SecretsGrantPage, SkillsGrantPage, } from './agent-grant-pages.js';
|
|
95
|
-
import {
|
|
96
|
+
import { connectorPolicySetOptions } from './agent-policy-sets.js';
|
|
96
97
|
import { AgentPeopleSection } from './agent-people-section.js';
|
|
97
98
|
import { AgentShareControl } from './agent-share-control.js';
|
|
98
99
|
import { AgentTriggersSection } from './agent-triggers-section.js';
|
|
@@ -164,7 +165,7 @@ export function AgentPage({ projectId, agentName }) {
|
|
|
164
165
|
* the one scroller; the rail is the Settings rail
|
|
165
166
|
* (`project-settings-page.tsx`), row for row.
|
|
166
167
|
*/
|
|
167
|
-
function AgentPageFrame({ header, section, sections, sectionHref, pane, footer,
|
|
168
|
+
function AgentPageFrame({ header, section, sections, sectionHref, pane, footer, }) {
|
|
168
169
|
const tI18nComplete = useI18nTranslations('hardcodedUi.i18nComplete');
|
|
169
170
|
const isMobile = useIsMobile();
|
|
170
171
|
const localizedConfig = useLocalizedAgentConfigCatalog();
|
|
@@ -186,18 +187,7 @@ function AgentPageFrame({ header, section, sections, sectionHref, pane, footer,
|
|
|
186
187
|
// The Settings rail's row dialect (`project-settings-page.tsx`).
|
|
187
188
|
'gap-2 px-2.5 py-1 font-normal transition-none has-[>svg]:px-2.5', 'text-foreground data-[state=inactive]:text-foreground hover:bg-hover hover:text-foreground', 'data-[state=active]:bg-active data-[state=active]:font-medium', '[&_svg]:text-muted-foreground data-[state=active]:[&_svg]:text-foreground'), children: _jsxs(Link, { href: sectionHref(item.key), prefetch: true, children: [_jsx(SectionIcon, { className: "size-4 shrink-0" }), _jsx("span", { className: cn(!horizontal && 'truncate'), children: item.label })] }) }, item.key));
|
|
188
189
|
};
|
|
189
|
-
|
|
190
|
-
const variant = useNavVariant();
|
|
191
|
-
const navProps = {
|
|
192
|
-
groups,
|
|
193
|
-
section,
|
|
194
|
-
href: (key) => sectionHref(key),
|
|
195
|
-
summaries,
|
|
196
|
-
};
|
|
197
|
-
if (!isMobile && variant !== 'rail') {
|
|
198
|
-
return (_jsxs("div", { className: "relative flex h-full min-h-0 flex-1 flex-col", children: [_jsx("div", { className: cn('shrink-0 px-5 py-3', variant === 'inline' && 'border-border/60 border-b'), children: header }), variant === 'tabs' ? _jsx(GroupedUnderlineTabs, { ...navProps }) : null, variant === 'groups' ? _jsx(GroupSwitchTabs, { ...navProps }) : null, _jsx("main", { className: "flex min-h-0 min-w-0 flex-1 flex-col overflow-y-auto", children: variant === 'inline' ? (_jsx(InlineVerticalTabs, { ...navProps, children: pane })) : (_jsx("div", { className: "mx-auto w-full max-w-2xl px-4 py-10 pb-32 lg:py-14 lg:pb-32", children: pane })) }), footer, _jsx(PrototypeSwitcher, {})] }));
|
|
199
|
-
}
|
|
200
|
-
return (_jsxs("div", { className: "relative flex h-full min-h-0 flex-1 flex-col", children: [_jsx("div", { className: "border-border/60 shrink-0 border-b px-5 py-3", children: header }), _jsxs("div", { className: cn('min-h-0 flex-1', isMobile ? 'flex flex-col overflow-hidden' : 'grid overflow-hidden'), style: isMobile ? undefined : { gridTemplateColumns: `${SETTINGS_SIDEBAR_WIDTH_PX}px 1fr` }, children: [isMobile ? (_jsx("nav", { "aria-label": tI18nComplete.raw('text7be318295927'), className: "border-border/60 flex h-auto shrink-0 items-center border-b", children: _jsx(FadedScrollArea, { orientation: "horizontal", fadeColor: "from-background", className: "min-w-0 flex-1 py-2", children: _jsx(Tabs, { value: section, className: "w-fit", children: _jsx(TabsList, { orientation: "horizontal", className: "w-fit", children: items.map((item) => trigger(item, true)) }) }) }) })) : (_jsx("aside", { className: "flex min-h-0 flex-col border-r bg-inherit", children: _jsx("nav", { "aria-label": tI18nComplete.raw('text7be318295927'), className: "flex min-h-0 flex-1 [scrollbar-width:none] flex-col gap-4 overflow-y-auto px-2 pt-3 pb-2 [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden", children: _jsx(Tabs, { value: section, orientation: "vertical", className: "space-y-3", children: groups.map((g) => (_jsxs("div", { children: [showGroupLabels ? (_jsx("div", { className: "text-muted-foreground flex h-7 items-center px-2.5 text-xs font-medium", children: g.group })) : null, _jsx(TabsList, { orientation: "vertical", className: "w-full", children: g.items.map((item) => trigger(item, false)) })] }, g.group))) }) }) })), _jsx("main", { className: "flex min-h-0 min-w-0 flex-1 flex-col overflow-y-auto", children: _jsx("div", { className: "mx-auto w-full max-w-2xl px-4 py-10 pb-32 lg:py-14 lg:pb-32", children: pane }) })] }), footer, _jsx(PrototypeSwitcher, {})] }));
|
|
190
|
+
return (_jsxs("div", { className: "relative flex h-full min-h-0 flex-1 flex-col", children: [_jsx("div", { className: "border-border/60 shrink-0 border-b px-5 py-3", children: header }), _jsxs("div", { className: cn('min-h-0 flex-1', isMobile ? 'flex flex-col overflow-hidden' : 'grid overflow-hidden'), style: isMobile ? undefined : { gridTemplateColumns: `${SETTINGS_SIDEBAR_WIDTH_PX}px 1fr` }, children: [isMobile ? (_jsx("nav", { "aria-label": tI18nComplete.raw('text7be318295927'), className: "border-border/60 flex h-auto shrink-0 items-center border-b", children: _jsx(FadedScrollArea, { orientation: "horizontal", fadeColor: "from-background", className: "min-w-0 flex-1 py-2", children: _jsx(Tabs, { value: section, className: "w-fit", children: _jsx(TabsList, { orientation: "horizontal", className: "w-fit", children: items.map((item) => trigger(item, true)) }) }) }) })) : (_jsx("aside", { className: "flex min-h-0 flex-col border-r bg-inherit", children: _jsx("nav", { "aria-label": tI18nComplete.raw('text7be318295927'), className: "flex min-h-0 flex-1 [scrollbar-width:none] flex-col gap-4 overflow-y-auto px-2 pt-3 pb-2 [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden", children: _jsx(Tabs, { value: section, orientation: "vertical", className: "space-y-3", children: groups.map((g) => (_jsxs("div", { children: [showGroupLabels ? (_jsx("div", { className: "text-muted-foreground flex h-7 items-center px-2.5 text-xs font-medium", children: g.group })) : null, _jsx(TabsList, { orientation: "vertical", className: "w-full", children: g.items.map((item) => trigger(item, false)) })] }, g.group))) }) }) })), _jsx("main", { className: "flex min-h-0 min-w-0 flex-1 flex-col overflow-y-auto", children: _jsx("div", { className: "mx-auto w-full max-w-2xl px-4 py-10 pb-32 lg:py-14 lg:pb-32", children: pane }) })] }), footer] }));
|
|
201
191
|
}
|
|
202
192
|
function CenteredState({ children }) {
|
|
203
193
|
return (_jsx("div", { className: "min-h-0 flex-1 overflow-y-auto", children: _jsx("div", { className: "mx-auto w-full max-w-3xl px-6 py-16", children: children }) }));
|
|
@@ -270,7 +260,7 @@ function AgentChips({ agent, config, size, }) {
|
|
|
270
260
|
*/
|
|
271
261
|
function AgentHeader({ projectId, agent, config, canWrite, children, }) {
|
|
272
262
|
const tI18nComplete = useI18nTranslations('hardcodedUi.i18nComplete');
|
|
273
|
-
return (_jsxs("header", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsxs("nav", { "aria-label": tI18nComplete.raw('text2bd873d6c734'), className: "flex min-w-0 items-center gap-1.5 text-sm", children: [_jsx(Link, { href: capabilityTabHref(projectId, 'agent'), prefetch: true, className: "text-muted-foreground hover:text-foreground shrink-0 transition-colors", children: tI18nComplete.raw('text279b44d2ab4b') }), _jsx(CaretRightIcon, { "aria-hidden": true, className: "text-muted-foreground size-3.5 shrink-0" }), _jsx("h1", { className: "text-foreground truncate text-sm font-semibold", children: isMetaAgentName(agent.name) ? META_AGENT_DISPLAY_NAME : capitalizeWords(agent.name) }), _jsx(AgentChips, { agent: agent, config: config, size: "xs" })] }), _jsx(AgentActions, { projectId: projectId, agent: agent, config: config, canWrite: canWrite })] }), children] }));
|
|
263
|
+
return (_jsxs("header", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsxs("nav", { "aria-label": tI18nComplete.raw('text2bd873d6c734'), className: "flex min-w-0 items-center gap-1.5 text-sm", children: [_jsx(Link, { href: capabilityTabHref(projectId, 'agent'), prefetch: true, className: "text-muted-foreground hover:text-foreground shrink-0 transition-colors", children: tI18nComplete.raw('text279b44d2ab4b') }), _jsx(CaretRightIcon, { "aria-hidden": true, className: "text-muted-foreground size-3.5 shrink-0" }), _jsx(AgentMark, { slug: agent.name }), _jsx("h1", { className: "text-foreground truncate text-sm font-semibold", children: isMetaAgentName(agent.name) ? META_AGENT_DISPLAY_NAME : capitalizeWords(agent.name) }), _jsx(AgentChips, { agent: agent, config: config, size: "xs" })] }), _jsx(AgentActions, { projectId: projectId, agent: agent, config: config, canWrite: canWrite })] }), children] }));
|
|
274
264
|
}
|
|
275
265
|
// ─── Editable body ─────────────────────────────────────────────────────────
|
|
276
266
|
/** What a v1 project, or a reader without write, can still see. */
|
|
@@ -301,23 +291,8 @@ function EditableAgentPage({ projectId, agent, config, initial, schemaVersion, }
|
|
|
301
291
|
const drivesOn = useFeatureFlag(projectId, 'drives').enabled;
|
|
302
292
|
const sections = useMemo(() => agentConfigSectionKeys(schemaVersion).filter((k) => drivesOn || k !== 'drives'), [schemaVersion, drivesOn]);
|
|
303
293
|
const registryOptions = useMemo(() => registryGrantOptions({ manifest_raw: config.manifest_raw, agents: toArray(config.agents) }, agent.name), [config.manifest_raw, config.agents, agent.name]);
|
|
294
|
+
const policySetOptions = useMemo(() => connectorPolicySetOptions(config.manifest_raw), [config.manifest_raw]);
|
|
304
295
|
const section = useAgentSection(sections);
|
|
305
|
-
// PROTOTYPE: the `inline` nav variant shows each topic's current value.
|
|
306
|
-
const summaries = useMemo(() => {
|
|
307
|
-
const d = editor.draft;
|
|
308
|
-
const grant = (v) => grantSummary(v, tI18nComplete).label;
|
|
309
|
-
return {
|
|
310
|
-
skills: grant(d.skills),
|
|
311
|
-
connectors: grant(d.connectors),
|
|
312
|
-
secrets: grant(d.secrets),
|
|
313
|
-
apps: grant(d.apps),
|
|
314
|
-
actions: grant(d.kortix_permissions ?? d.kortix_cli),
|
|
315
|
-
subagents: grant(d.subagents),
|
|
316
|
-
commands: grant(d.commands),
|
|
317
|
-
extensions: grant(d.extensions),
|
|
318
|
-
model: editor.oc.model ? (editor.oc.model.split('/').pop() ?? editor.oc.model) : 'Default',
|
|
319
|
-
};
|
|
320
|
-
}, [editor.draft, editor.oc.model, tI18nComplete]);
|
|
321
296
|
const onSave = useCallback(async () => {
|
|
322
297
|
if (!editor.isDirty || update.isPending)
|
|
323
298
|
return;
|
|
@@ -335,7 +310,7 @@ function EditableAgentPage({ projectId, agent, config, initial, schemaVersion, }
|
|
|
335
310
|
// shared across topics and nothing is lost.
|
|
336
311
|
const leaveGuard = useUnsavedChangesGuard(editor.isDirty, pathname);
|
|
337
312
|
useSaveShortcut(onSave);
|
|
338
|
-
return (_jsx(AgentPageFrame, { header: _jsx(AgentHeader, { projectId: projectId, agent: agent, config: config, canWrite: true }), section: section, sections: sections, sectionHref: sectionHrefFor(pathname),
|
|
313
|
+
return (_jsx(AgentPageFrame, { header: _jsx(AgentHeader, { projectId: projectId, agent: agent, config: config, canWrite: true }), section: section, sections: sections, sectionHref: sectionHrefFor(pathname), pane: _jsx(AgentConfigSections, { section: section, editor: editor, options: options, skillsOptions: skillsOptions, registryOptions: registryOptions, skills: _jsx(SkillsGrantPage, { projectId: projectId, config: config, editor: editor }), connectors: _jsx(ConnectorsGrantPage, { projectId: projectId, editor: editor, policySetOptions: policySetOptions }), secrets: _jsx(SecretsGrantPage, { projectId: projectId, editor: editor }), apps: _jsx(AppsGrantPage, { projectId: projectId, editor: editor }), drives: _jsx(AgentDrivesSection, { projectId: projectId, agentName: agent.name }), overview: _jsx(OverviewPane, { description: editor.oc.description ?? '', onDescriptionChange: (next) => editor.setOc('description', next), descriptionHelp: editor.oc.mode === 'subagent'
|
|
339
314
|
? 'Required. This is how other agents decide to call it.'
|
|
340
315
|
: 'One line on what this agent is for. Other agents read it when picking a subagent.', prompt: editor.oc.prompt ?? '', onPromptChange: (next) => editor.setOc('prompt', next) }), triggers: _jsx(AgentTriggersSection, { projectId: projectId, agentName: agent.name, defaultAgent: config.default_agent ?? config.open_code_default_agent }), people: _jsx(AgentPeopleSection, { projectId: projectId, agentName: agent.name }), authority: _jsx(AgentAuthorityCard, { projectId: projectId, agentName: agent.name, grant: editor.draft.kortix_permissions ?? editor.draft.kortix_cli }) }), footer: _jsxs(_Fragment, { children: [_jsx(SaveBar, { dirty: editor.isDirty, pending: update.isPending, onDiscard: () => setConfirmDiscard(true), onSave: onSave }), _jsx(ConfirmDialog, { open: confirmDiscard, onOpenChange: setConfirmDiscard, title: tI18nComplete.raw('text3b13192b9d88'), description: tI18nComplete('text8a36cce34f68', { value0: capitalizeWords(agent.name) }), confirmLabel: tI18nComplete.raw('texteb1a70e39274'), cancelLabel: tI18nComplete.raw('texte76fd2add010'), confirmVariant: "destructive", onConfirm: () => {
|
|
341
316
|
setConfirmDiscard(false);
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { AgentGrantSetV2 } from '@kortix/sdk';
|
|
2
|
+
/**
|
|
3
|
+
* The agent side of connector policy sets: `agents.<a>.policy_sets` maps a
|
|
4
|
+
* connector slug to one of that connector's sets (`connectors[].policy_sets`).
|
|
5
|
+
* An absent key means the base rules.
|
|
6
|
+
*/
|
|
7
|
+
export interface PolicySetOption {
|
|
8
|
+
name: string;
|
|
9
|
+
description?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Every connector's set names, read from the root kortix.yaml. The agent page
|
|
13
|
+
* already holds the raw manifest, so the editor needs no request per connector.
|
|
14
|
+
* ponytail: connectors declared in an `imports:` file are not read; an agent
|
|
15
|
+
* that names a set on one still shows its value, flagged as missing.
|
|
16
|
+
*/
|
|
17
|
+
export declare function connectorPolicySetOptions(manifestRaw: string | null | undefined): Record<string, PolicySetOption[]>;
|
|
18
|
+
/**
|
|
19
|
+
* One connector's set choice; `null` (or `base`) clears it. Clearing the last
|
|
20
|
+
* entry returns `{}`, never `undefined`: the config PUT keeps the declared
|
|
21
|
+
* `policy_sets` when the key is omitted, so `{}` is what removes it.
|
|
22
|
+
*
|
|
23
|
+
* Entries on connectors the agent no longer holds are kept on purpose: they
|
|
24
|
+
* are inert until the connector is granted again, and dropping one is a set
|
|
25
|
+
* change that needs project.connector.write.
|
|
26
|
+
*/
|
|
27
|
+
export declare function withPolicySet(policySets: Record<string, string> | undefined, slug: string, name: string | null): Record<string, string>;
|
|
28
|
+
export interface PolicySetRow {
|
|
29
|
+
slug: string;
|
|
30
|
+
options: PolicySetOption[];
|
|
31
|
+
/** The set the agent names, or null for the base rules. */
|
|
32
|
+
value: string | null;
|
|
33
|
+
/** The agent names a set the connector does not define: calls are blocked. */
|
|
34
|
+
missing: boolean;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* The rows of the agent's "Rule sets" list: every granted connector that
|
|
38
|
+
* defines at least one set, plus every connector the agent already names a set
|
|
39
|
+
* on (so a stale entry is visible and can be cleared).
|
|
40
|
+
*/
|
|
41
|
+
export declare function policySetRows(grant: AgentGrantSetV2 | undefined, catalog: Record<string, PolicySetOption[]>, policySets: Record<string, string> | undefined,
|
|
42
|
+
/** Slugs of the project's connectors, in display order. */
|
|
43
|
+
connectorSlugs: readonly string[]): PolicySetRow[];
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { parseManifestText } from '../../_vendor/kortix-shared.js';
|
|
2
|
+
/**
|
|
3
|
+
* Every connector's set names, read from the root kortix.yaml. The agent page
|
|
4
|
+
* already holds the raw manifest, so the editor needs no request per connector.
|
|
5
|
+
* ponytail: connectors declared in an `imports:` file are not read; an agent
|
|
6
|
+
* that names a set on one still shows its value, flagged as missing.
|
|
7
|
+
*/
|
|
8
|
+
export function connectorPolicySetOptions(manifestRaw) {
|
|
9
|
+
let manifest = {};
|
|
10
|
+
try {
|
|
11
|
+
manifest = manifestRaw ? parseManifestText(manifestRaw, 'yaml') : {};
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return {};
|
|
15
|
+
}
|
|
16
|
+
const out = Object.create(null);
|
|
17
|
+
const connectors = Array.isArray(manifest.connectors) ? manifest.connectors : [];
|
|
18
|
+
for (const entry of connectors) {
|
|
19
|
+
if (!entry || typeof entry !== 'object')
|
|
20
|
+
continue;
|
|
21
|
+
const { slug, policy_sets: sets } = entry;
|
|
22
|
+
if (typeof slug !== 'string' || !sets || typeof sets !== 'object' || Array.isArray(sets))
|
|
23
|
+
continue;
|
|
24
|
+
const options = Object.entries(sets).map(([name, set]) => {
|
|
25
|
+
const description = set?.description;
|
|
26
|
+
return typeof description === 'string' && description ? { name, description } : { name };
|
|
27
|
+
});
|
|
28
|
+
if (options.length > 0)
|
|
29
|
+
out[slug] = options;
|
|
30
|
+
}
|
|
31
|
+
return out;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* One connector's set choice; `null` (or `base`) clears it. Clearing the last
|
|
35
|
+
* entry returns `{}`, never `undefined`: the config PUT keeps the declared
|
|
36
|
+
* `policy_sets` when the key is omitted, so `{}` is what removes it.
|
|
37
|
+
*
|
|
38
|
+
* Entries on connectors the agent no longer holds are kept on purpose: they
|
|
39
|
+
* are inert until the connector is granted again, and dropping one is a set
|
|
40
|
+
* change that needs project.connector.write.
|
|
41
|
+
*/
|
|
42
|
+
export function withPolicySet(policySets, slug, name) {
|
|
43
|
+
const next = Object.fromEntries(Object.entries(policySets ?? {}).filter(([key]) => key !== slug));
|
|
44
|
+
if (name && name !== 'base')
|
|
45
|
+
next[slug] = name;
|
|
46
|
+
return next;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* The rows of the agent's "Rule sets" list: every granted connector that
|
|
50
|
+
* defines at least one set, plus every connector the agent already names a set
|
|
51
|
+
* on (so a stale entry is visible and can be cleared).
|
|
52
|
+
*/
|
|
53
|
+
export function policySetRows(grant, catalog, policySets,
|
|
54
|
+
/** Slugs of the project's connectors, in display order. */
|
|
55
|
+
connectorSlugs) {
|
|
56
|
+
const granted = (slug) => grant === 'all' || (Array.isArray(grant) && grant.includes(slug));
|
|
57
|
+
const assigned = policySets ?? {};
|
|
58
|
+
const slugs = [
|
|
59
|
+
...connectorSlugs.filter((slug) => granted(slug) && (catalog[slug]?.length || Object.hasOwn(assigned, slug))),
|
|
60
|
+
...Object.keys(assigned).filter((slug) => !connectorSlugs.includes(slug)),
|
|
61
|
+
];
|
|
62
|
+
return slugs.map((slug) => {
|
|
63
|
+
const options = catalog[slug] ?? [];
|
|
64
|
+
const value = Object.hasOwn(assigned, slug) ? (assigned[slug] ?? null) : null;
|
|
65
|
+
return {
|
|
66
|
+
slug,
|
|
67
|
+
options,
|
|
68
|
+
value,
|
|
69
|
+
missing: value !== null && !options.some((option) => option.name === value),
|
|
70
|
+
};
|
|
71
|
+
});
|
|
72
|
+
}
|
|
@@ -34,7 +34,7 @@ import { useProjectFeatureFlags } from '../../internal/lib/use-project-feature-f
|
|
|
34
34
|
import { cn } from '../../internal/lib/utils.js';
|
|
35
35
|
import { listProjectTriggers } from '@kortix/sdk';
|
|
36
36
|
import { contract, qk } from '@kortix/sdk/react';
|
|
37
|
-
import { LightningIcon, PlusIcon, PulseIcon, TimerIcon, WebhooksLogoIcon, } from '@phosphor-icons/react';
|
|
37
|
+
import { AppWindowIcon, LightningIcon, PlusIcon, PulseIcon, TimerIcon, WebhooksLogoIcon, } from '@phosphor-icons/react';
|
|
38
38
|
import { useQuery, useQueryClient } from '@tanstack/react-query';
|
|
39
39
|
import { useCallback, useMemo, useState } from 'react';
|
|
40
40
|
const KIND_ICON = {
|
|
@@ -42,6 +42,7 @@ const KIND_ICON = {
|
|
|
42
42
|
webhook: WebhooksLogoIcon,
|
|
43
43
|
monitor: PulseIcon,
|
|
44
44
|
event: LightningIcon,
|
|
45
|
+
app: AppWindowIcon,
|
|
45
46
|
};
|
|
46
47
|
/**
|
|
47
48
|
* Whether `trigger` starts `agentName`. A trigger that names no agent is
|
|
@@ -16,22 +16,22 @@ import { detectManifestVersion } from '../../internal/lib/manifest-version.js';
|
|
|
16
16
|
import { toArray } from '../shared/utils.js';
|
|
17
17
|
import { newConfigPrompt, useConfigureThread, } from '../use-configure-thread.js';
|
|
18
18
|
import { PROJECT_ACTIONS } from '../../internal/lib/project-actions.js';
|
|
19
|
-
import { Skeleton } from '../../primitives/skeleton.js';
|
|
20
19
|
import { useProjectCan } from '../../internal/lib/use-project-can.js';
|
|
21
20
|
import { cn } from '../../internal/lib/utils.js';
|
|
22
21
|
import { getProjectDetail, listProjectResourceGrants, listProjectTriggers, updateProjectDefaultAgent, } from '@kortix/sdk';
|
|
23
22
|
import { contract, qk, useProjectAccountId } from '@kortix/sdk/react';
|
|
24
23
|
import { capitalizeWords, isMetaAgentName, META_AGENT_DISPLAY_NAME } from '../../_vendor/kortix-shared.js';
|
|
25
|
-
import {
|
|
24
|
+
import { MagnifyingGlassIcon, RobotIcon } from '@phosphor-icons/react';
|
|
26
25
|
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
|
27
26
|
import { CapabilityPageShell } from '../shared/capability-page-shell.js';
|
|
28
27
|
import { agentHref } from '../../internal/lib/capability-tab-routes.js';
|
|
29
28
|
import { prefetchAgentConfig } from '../../internal/hooks/projects/use-agent-config.js';
|
|
30
|
-
import { CatalogCard } from '../shared/catalog/catalog-card.js';
|
|
31
29
|
import { catalogEmptyKind } from '../shared/catalog/catalog-empty.js';
|
|
32
30
|
import { CatalogNoMatch } from '../shared/catalog/catalog-empty-state.js';
|
|
33
31
|
import { CatalogGrid } from '../shared/catalog/catalog-grid.js';
|
|
34
|
-
import {
|
|
32
|
+
import { GRID_CLASSNAME } from '../shared/catalog/catalog-grid-tokens.js';
|
|
33
|
+
import { AgentMark } from '../../internal/components/agent-mark.js';
|
|
34
|
+
import { AgentCoverCard } from './agent-cover-card.js';
|
|
35
35
|
import { agentInMode, filterAgents } from './agent-filter.js';
|
|
36
36
|
import { useSlashFocus } from '../../internal/hooks/index.js';
|
|
37
37
|
/**
|
|
@@ -92,8 +92,8 @@ export function AgentsPage({ projectId }) {
|
|
|
92
92
|
}
|
|
93
93
|
return counts;
|
|
94
94
|
}, [triggersQuery.data, config]);
|
|
95
|
-
// Who is granted each agent
|
|
96
|
-
//
|
|
95
|
+
// Who is granted each agent. Same key the agent page's People section
|
|
96
|
+
// reads, manager-gated like it.
|
|
97
97
|
const grantsQuery = useQuery({
|
|
98
98
|
queryKey: qk.project.resourceGrants(projectId),
|
|
99
99
|
queryFn: () => listProjectResourceGrants(projectId),
|
|
@@ -110,6 +110,7 @@ export function AgentsPage({ projectId }) {
|
|
|
110
110
|
}
|
|
111
111
|
return counts;
|
|
112
112
|
}, [grantsQuery.data]);
|
|
113
|
+
const facts = (agent) => (_jsx(AgentCardFacts, { agent: agent, triggerCount: triggerCounts.get(agent.name) ?? 0, grantCount: grantCounts.get(agent.name) ?? 0 }));
|
|
113
114
|
const agents = useMemo(() => toArray(config?.agents), [config]);
|
|
114
115
|
const filtered = useMemo(() => filterAgents(agents, { mode: null, query }), [agents, query]);
|
|
115
116
|
const defaultAgent = config?.default_agent ?? config?.open_code_default_agent ?? null;
|
|
@@ -122,8 +123,6 @@ export function AgentsPage({ projectId }) {
|
|
|
122
123
|
.filter((agent) => agentInMode(agent, 'primary'))
|
|
123
124
|
.sort((a, b) => Number(b.name === defaultAgent) - Number(a.name === defaultAgent)), [filtered, defaultAgent]);
|
|
124
125
|
const subagents = useMemo(() => filtered.filter((agent) => !agentInMode(agent, 'primary')), [filtered]);
|
|
125
|
-
const subagentTotal = agents.filter((agent) => !agentInMode(agent, 'primary')).length;
|
|
126
|
-
const primaryTotal = agents.length - subagentTotal;
|
|
127
126
|
// `null` = render the grid. Otherwise which "nothing to show" copy applies:
|
|
128
127
|
// genuinely zero agents vs. agents exist but this filter/search hid all of
|
|
129
128
|
// them. Telling the user "No agents yet" in the second case is false and
|
|
@@ -133,69 +132,64 @@ export function AgentsPage({ projectId }) {
|
|
|
133
132
|
// title beside it and can be terse; the empty state is the whole screen and
|
|
134
133
|
// has to name what it creates. Both start the same configure thread, so they
|
|
135
134
|
// cannot drift apart.
|
|
136
|
-
//
|
|
137
|
-
//
|
|
138
|
-
|
|
139
|
-
const createButton = (label) => canWrite ? (_jsx(NewEntityMenu, { label: label, pending: configure.pending, onChat: () => configure.start(newConfigPrompt('agent')), manual: {
|
|
135
|
+
// The header button is `h-9`, the height of the `size="sm"` search input
|
|
136
|
+
// beside it. The empty state keeps `sm` to match its `sm` docs link.
|
|
137
|
+
const createButton = (label, size) => canWrite ? (_jsx(NewEntityMenu, { label: label, size: size, pending: configure.pending, onChat: () => configure.start(newConfigPrompt('agent')), manual: {
|
|
140
138
|
description: tI18nComplete.raw('text5210c5acc2cd'),
|
|
141
139
|
href: uiRoutes().files(projectId) ?? customizePath(projectId, 'repo'),
|
|
142
140
|
} })) : null;
|
|
143
|
-
return (_jsxs(CapabilityPageShell, { title: tI18nComplete.raw('text279b44d2ab4b'), description: tI18nComplete.raw('text636453e23d69'), action:
|
|
144
|
-
// The
|
|
145
|
-
//
|
|
146
|
-
|
|
147
|
-
? ` · ${subagentTotal} ${subagentTotal === 1 ? 'subagent' : 'subagents'}`
|
|
148
|
-
: null, ' ', tI18nComplete.raw('text582967534d0f'), ' ', _jsx("span", { className: "font-mono", children: tI18nComplete.raw('text1965f383021e') })] }), _jsx(DefaultAgentSelector, { projectId: projectId, config: config, canWrite: canWrite })] })) : undefined, children: [_jsx(CatalogGrid, { isLoading: detailQuery.isLoading, isError: detailQuery.isError, error: detailQuery.error, onRetry: () => detailQuery.refetch(), isEmpty: emptyKind !== null, empty: emptyKind === 'no-match' ? (_jsx(CatalogNoMatch, { query: query })) : (_jsx(EmptyState, { icon: RobotIcon, size: "sm", title: tI18nComplete.raw('text971b61f8cb4d'), description: tI18nComplete.raw('textc4e4294c6777'), action: createButton('Create an agent'), secondaryAction: _jsx(Button, { asChild: true, variant: "ghost", size: "sm", className: "gap-1.5", children: _jsx("a", { href: "https://opencode.ai/docs/agents/", target: "_blank", rel: "noopener noreferrer", children: tI18nComplete.raw('text7af023c43013') }) }) })), children: primaryAgents.map((agent) => (_jsx(CatalogCard, { href: agentHref(projectId, agent.name), onIntent: () => prefetchAgentConfig(queryClient, projectId, agent.name), title: agentTitle(agent.name), subtitle: _jsx("code", { className: "text-muted-foreground text-xs break-all", children: agent.name }), description: agent.description, badges: _jsx(AgentCardBadges, { agent: agent, isDefault: defaultAgent === agent.name }), meta: _jsx(AgentCardFacts, { agent: agent, triggerCount: triggerCounts.get(agent.name) ?? 0, peopleCount: canManageMembers ? (grantCounts.get(agent.name) ?? 0) : null }), trailing: _jsx(CardCaret, {}) }, agent.path))) }), !detailQuery.isLoading && !detailQuery.isError && subagents.length > 0 ? (_jsxs("section", { "aria-labelledby": "subagents-heading", className: cn('space-y-2', primaryAgents.length > 0 && 'mt-8'), children: [_jsxs("div", { children: [_jsxs("h2", { id: "subagents-heading", className: "text-foreground text-sm font-medium", children: [tI18nComplete.raw('agentsListSubagentsTitle'), ' ', _jsx("span", { className: "text-muted-foreground font-normal tabular-nums", children: subagents.length })] }), _jsx("p", { className: "text-muted-foreground mt-1 text-xs", children: tI18nComplete.raw('agentsListSubagentsHint') })] }), _jsx("div", { className: cn(DENSE_GRID_CONTAINER_CLASSNAME, '-mx-3'), children: _jsx("div", { className: DENSE_GRID_CLASSNAME, children: subagents.map((agent) => (_jsx(CatalogCard, { variant: "plain", href: agentHref(projectId, agent.name), onIntent: () => prefetchAgentConfig(queryClient, projectId, agent.name), title: agentTitle(agent.name), subtitle: _jsx("code", { className: "text-muted-foreground text-xs break-all", children: agent.name }), description: agent.description, badges: _jsx(AgentCardBadges, { agent: agent, isDefault: false }), meta: _jsx("span", { className: cn('truncate', agent.model && 'font-mono'), children: agent.model?.split('/').pop() ?? tI18nComplete.raw('text3840d9d29421') }), trailing: _jsx(CardCaret, {}) }, agent.path))) }) })] })) : null] }));
|
|
141
|
+
return (_jsxs(CapabilityPageShell, { title: tI18nComplete.raw('text279b44d2ab4b'), description: tI18nComplete.raw('text636453e23d69'), action:
|
|
142
|
+
// The default-agent selector sits in the header beside New: it is a
|
|
143
|
+
// page-level setting, not a filter on the list.
|
|
144
|
+
_jsxs(_Fragment, { children: [config ? (_jsx(DefaultAgentSelector, { projectId: projectId, config: config, canWrite: canWrite })) : null, createButton('New')] }), search: _jsxs(InputGroupSearch, { children: [_jsx(InputGroupSearchIcon, { children: _jsx(MagnifyingGlassIcon, {}) }), _jsx(InputGroupSearchInput, { ref: searchRef, placeholder: tI18nComplete.raw('text212fd04a1d20'), value: query, onChange: (event) => setQuery(event.target.value), variant: "popover", size: "sm" }), _jsx(InputGroupSearchClear, { onClick: () => setQuery('') })] }), children: [_jsx(CatalogGrid, { isLoading: detailQuery.isLoading, isError: detailQuery.isError, error: detailQuery.error, onRetry: () => detailQuery.refetch(), isEmpty: emptyKind !== null, empty: emptyKind === 'no-match' ? (_jsx(CatalogNoMatch, { query: query })) : (_jsx(EmptyState, { icon: RobotIcon, size: "sm", title: tI18nComplete.raw('text971b61f8cb4d'), description: tI18nComplete.raw('textc4e4294c6777'), action: createButton('Create an agent', 'sm'), secondaryAction: _jsx(Button, { asChild: true, variant: "ghost", size: "sm", className: "gap-1.5", children: _jsx("a", { href: "/docs/project/agents", target: "_blank", rel: "noopener noreferrer", children: tI18nComplete.raw('text7af023c43013') }) }) })), children: primaryAgents.map((agent) => (_jsx(AgentCoverCard, { slug: agent.name, href: agentHref(projectId, agent.name), onIntent: () => prefetchAgentConfig(queryClient, projectId, agent.name), title: agentTitle(agent.name), description: agent.description, badges: _jsx(AgentCardBadges, { agent: agent }), coverLabel: defaultAgent === agent.name ? tI18nComplete.raw('text21b111cbfe6e') : undefined, meta: facts(agent) }, agent.path))) }), !detailQuery.isLoading && !detailQuery.isError && subagents.length > 0 ? (_jsxs("section", { "aria-labelledby": "subagents-heading", className: cn('space-y-2', primaryAgents.length > 0 && 'mt-8'), children: [_jsxs("div", { children: [_jsxs("h2", { id: "subagents-heading", className: "text-foreground text-sm font-medium", children: [tI18nComplete.raw('agentsListSubagentsTitle'), ' ', _jsx("span", { className: "text-muted-foreground font-normal tabular-nums", children: subagents.length })] }), _jsx("p", { className: "text-muted-foreground mt-1 text-xs", children: tI18nComplete.raw('agentsListSubagentsHint') })] }), _jsx("div", { className: GRID_CLASSNAME, children: subagents.map((agent) => (_jsx(AgentCoverCard, { slug: agent.name, href: agentHref(projectId, agent.name), onIntent: () => prefetchAgentConfig(queryClient, projectId, agent.name), title: agentTitle(agent.name), description: agent.description, badges: _jsx(AgentCardBadges, { agent: agent }), meta: facts(agent) }, agent.path))) })] })) : null] }));
|
|
149
145
|
}
|
|
150
146
|
function agentTitle(name) {
|
|
151
147
|
return isMetaAgentName(name) ? META_AGENT_DISPLAY_NAME : capitalizeWords(name);
|
|
152
148
|
}
|
|
153
|
-
function CardCaret() {
|
|
154
|
-
return (_jsx(CaretRightIcon, { "aria-hidden": true, className: "text-muted-foreground group-hover:text-foreground mt-0.5 size-4 transition-colors" }));
|
|
155
|
-
}
|
|
156
149
|
/**
|
|
157
|
-
* The
|
|
158
|
-
*
|
|
159
|
-
*
|
|
160
|
-
* printing nothing; triggers and people print their count, including zero,
|
|
161
|
-
* so every card has the same three slots and the eye can compare down a
|
|
162
|
-
* column. People is omitted for a reader who cannot see grants.
|
|
150
|
+
* The access fact (KRTX-3025): "Full access", or the connectors an agent can
|
|
151
|
+
* reach. Nothing for an agent without connectors — the card does not list what
|
|
152
|
+
* an agent lacks.
|
|
163
153
|
*/
|
|
164
|
-
function AgentCardFacts({ agent, triggerCount, peopleCount, }) {
|
|
165
|
-
const tI18nComplete = useI18nTranslations('hardcodedUi.i18nComplete');
|
|
166
|
-
const model = agent.model ? agent.model.split('/').pop() : null;
|
|
167
|
-
const accessLabel = accessLabelOf(agentAccess(agent.scope), tI18nComplete);
|
|
168
|
-
const sep = (_jsx("span", { "aria-hidden": true, className: "text-muted-foreground", children: "\u00B7" }));
|
|
169
|
-
return (_jsxs(_Fragment, { children: [_jsx("span", { className: cn('truncate', model && 'font-mono'), children: model ?? tI18nComplete.raw('text3840d9d29421') }), sep, _jsxs("span", { className: "tabular-nums", children: [triggerCount, " ", triggerCount === 1 ? 'trigger' : 'triggers'] }), peopleCount !== null ? (_jsxs(_Fragment, { children: [sep, _jsx("span", { className: "tabular-nums", children: peopleCount === 0
|
|
170
|
-
? tI18nComplete.raw('textb6c70926c1aa')
|
|
171
|
-
: `${peopleCount} ${peopleCount === 1 ? 'grant' : 'grants'}` })] })) : null, accessLabel ? _jsx("span", { className: "basis-full tabular-nums", children: accessLabel }) : null] }));
|
|
172
|
-
}
|
|
173
|
-
/** The access slot: what the configuration grants (KRTX-3025). */
|
|
174
154
|
function accessLabelOf(access, t) {
|
|
175
155
|
if (!access)
|
|
176
156
|
return null;
|
|
177
157
|
if (access.kind === 'full')
|
|
178
158
|
return t.raw('textf19611c61ca5');
|
|
179
|
-
const
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
159
|
+
const connectors = access.parts.find((part) => part.kind === 'connectors')?.value ?? 0;
|
|
160
|
+
if (connectors === 'all')
|
|
161
|
+
return t.raw('textd83250185d41');
|
|
162
|
+
return connectors > 0 ? t('text15589a542412', { count: connectors }) : null;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* The card's facts line, joined by `•`: access, the agent's own model,
|
|
166
|
+
* triggers, grants. A fact with nothing to say is left out — no "0 triggers",
|
|
167
|
+
* no "Default model" — so an empty slot never reads as information.
|
|
168
|
+
*/
|
|
169
|
+
function AgentCardFacts({ agent, triggerCount, grantCount, }) {
|
|
170
|
+
const tI18nComplete = useI18nTranslations('hardcodedUi.i18nComplete');
|
|
171
|
+
const facts = [
|
|
172
|
+
accessLabelOf(agentAccess(agent.scope), tI18nComplete),
|
|
173
|
+
agent.model ? agent.model.split('/').pop() : null,
|
|
174
|
+
triggerCount > 0 ? `${triggerCount} ${triggerCount === 1 ? 'trigger' : 'triggers'}` : null,
|
|
175
|
+
grantCount > 0 ? `${grantCount} ${grantCount === 1 ? 'grant' : 'grants'}` : null,
|
|
176
|
+
].filter((fact) => Boolean(fact));
|
|
177
|
+
if (facts.length === 0)
|
|
178
|
+
return null;
|
|
179
|
+
return (_jsx("span", { className: "truncate tabular-nums", children: facts.map((fact, index) => (_jsxs("span", { children: [index > 0 ? (_jsx("span", { "aria-hidden": true, className: "px-1.5", children: "\u2022" })) : null, fact] }, fact))) }));
|
|
187
180
|
}
|
|
188
181
|
/**
|
|
189
|
-
* Card badges — "also a subagent",
|
|
182
|
+
* Card badges — "also a subagent", disabled. The default agent is marked on
|
|
183
|
+
* the cover instead.
|
|
190
184
|
*
|
|
191
185
|
* The section already says primary or subagent, so a mode chip only marks the
|
|
192
186
|
* both-ways `all` agent: it sits with the primaries but other agents call it
|
|
193
187
|
* too.
|
|
194
188
|
*/
|
|
195
|
-
function AgentCardBadges({ agent
|
|
189
|
+
function AgentCardBadges({ agent }) {
|
|
196
190
|
const tI18nComplete = useI18nTranslations('hardcodedUi.i18nComplete');
|
|
197
191
|
const mode = agent.mode?.toLowerCase();
|
|
198
|
-
return (_jsxs(_Fragment, { children: [mode === 'all' ? (_jsx(Badge, { variant: "muted", size: "xs", children: tI18nComplete.raw('agentsListAlsoSubagent') })) : null,
|
|
192
|
+
return (_jsxs(_Fragment, { children: [mode === 'all' ? (_jsx(Badge, { variant: "muted", size: "xs", children: tI18nComplete.raw('agentsListAlsoSubagent') })) : null, agent.enabled === false ? (_jsx(Badge, { variant: "muted", size: "xs", children: tI18nComplete.raw('text75081b593d15') })) : null] }));
|
|
199
193
|
}
|
|
200
194
|
/**
|
|
201
195
|
* Which agent a new chat in this project starts with. Rides the filter row
|
|
@@ -227,5 +221,5 @@ function DefaultAgentSelector({ projectId, config, canWrite, }) {
|
|
|
227
221
|
});
|
|
228
222
|
if (!declaresDefaultAgent || availableAgents.length === 0 || !current)
|
|
229
223
|
return null;
|
|
230
|
-
return (_jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [
|
|
224
|
+
return (_jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [mutation.isPending ? _jsx(Loading, { className: "size-4 shrink-0" }) : null, _jsxs(Select, { value: current, onValueChange: (agentName) => mutation.mutate(agentName), disabled: !canWrite || mutation.isPending, children: [_jsx(SelectTrigger, { "aria-label": tI18nComplete.raw('text94da52ecd6c5'), className: "h-9 w-44 shrink-0", size: "sm", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { align: "end", children: availableAgents.map((agent) => (_jsx(SelectItem, { value: agent.name, children: _jsxs("span", { className: "flex min-w-0 items-center gap-2", children: [_jsx(AgentMark, { slug: agent.name }), _jsx("span", { className: "truncate", children: agentTitle(agent.name) })] }) }, agent.name))) })] })] }));
|
|
231
225
|
}
|
|
@@ -6,11 +6,16 @@ import type { McpServerApp } from '../install/mcp-first.js';
|
|
|
6
6
|
* provider's consent page. It replaced eight steps through the custom
|
|
7
7
|
* connector form, Sign in and Add account.
|
|
8
8
|
*/
|
|
9
|
-
export declare function AddMcpServerDialog({ projectId, open, onOpenChange, takenSlugs, onAdded, app, }: {
|
|
9
|
+
export declare function AddMcpServerDialog({ projectId, open, onOpenChange, takenSlugs, onAdded, app, initial, }: {
|
|
10
10
|
projectId: string;
|
|
11
11
|
/** A catalogue app's own MCP server: the URL is filled in and the dialog
|
|
12
12
|
* is titled for the app. Null for a server the user pastes. */
|
|
13
13
|
app?: McpServerApp | null;
|
|
14
|
+
/** A pasted server prefilled from a link (an agent's `setup_url`): a person confirms it here. */
|
|
15
|
+
initial?: {
|
|
16
|
+
url: string;
|
|
17
|
+
name?: string;
|
|
18
|
+
} | null;
|
|
14
19
|
open: boolean;
|
|
15
20
|
onOpenChange: (open: boolean) => void;
|
|
16
21
|
/** Slugs of the project's connectors: a new server never reuses one. */
|