@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,7 +1,19 @@
|
|
|
1
1
|
import type { Agent } from '@kortix/sdk/react';
|
|
2
|
+
/**
|
|
3
|
+
* A place's own agents, listed first in the picker under `label` (a
|
|
4
|
+
* channel's `#name`); every other agent follows under `restLabel`. Set by a
|
|
5
|
+
* channel's composer (`space-view.tsx`). No provider: one plain list.
|
|
6
|
+
*/
|
|
7
|
+
export declare const FeaturedAgentsContext: import("react").Context<{
|
|
8
|
+
label: string;
|
|
9
|
+
restLabel: string;
|
|
10
|
+
names: readonly string[];
|
|
11
|
+
} | null>;
|
|
2
12
|
/** The label `AgentSelector` shows for a selection (null = nothing picked). Other surfaces that name the agent reuse it. */
|
|
3
13
|
export declare function agentDisplayLabel(agents: Agent[], selectedAgent: string | null): string;
|
|
4
|
-
export declare function AgentSelector({ agents, selectedAgent, onSelect, disabled, triggerLabelClassName, unavailableHint, open: controlledOpen, onOpenChange, }: {
|
|
14
|
+
export declare function AgentSelector({ agents, selectedAgent, onSelect, disabled, triggerLabelClassName, unavailableHint, open: controlledOpen, onOpenChange, compact, appearance, }: {
|
|
15
|
+
/** The trigger shows the agent's tile alone, no caret; the name is its tooltip. */
|
|
16
|
+
compact?: boolean;
|
|
5
17
|
agents: Agent[];
|
|
6
18
|
selectedAgent: string | null;
|
|
7
19
|
onSelect: (agentName: string | null) => void;
|
|
@@ -17,4 +29,10 @@ export declare function AgentSelector({ agents, selectedAgent, onSelect, disable
|
|
|
17
29
|
unavailableHint?: string | null;
|
|
18
30
|
open?: boolean;
|
|
19
31
|
onOpenChange?: (open: boolean) => void;
|
|
32
|
+
/**
|
|
33
|
+
* `chip` is the composer's borderless toolbar chip. `field` is a form field:
|
|
34
|
+
* the full-width `h-9` box every `SelectTrigger` in a form draws, so the
|
|
35
|
+
* picker reads as one more field instead of a chip inside a frame.
|
|
36
|
+
*/
|
|
37
|
+
appearance?: 'chip' | 'field';
|
|
20
38
|
}): import("react").JSX.Element;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
3
|
import { Badge } from '../../primitives/badge.js';
|
|
4
4
|
import { Button } from '../../primitives/button.js';
|
|
5
5
|
import { CommandGroup, CommandInput, CommandItem, CommandList, CommandPopover, CommandPopoverContent, CommandPopoverTrigger, CommandSeparator, } from '../../primitives/command.js';
|
|
@@ -7,10 +7,18 @@ import Hint from '../../primitives/hint.js';
|
|
|
7
7
|
import { useTranslations } from '../../i18n/index.js';
|
|
8
8
|
import { useUiHostConfig } from '../../providers/ui-provider.js';
|
|
9
9
|
import { cn } from '../../lib/utils.js';
|
|
10
|
+
import { TRIGGER_CARET_CLASS, triggerVariants } from '../../primitives/trigger-variants.js';
|
|
10
11
|
import { capitalizeWords, isMetaAgentName, META_AGENT_DISPLAY_NAME } from '../../_vendor/kortix-shared.js';
|
|
11
|
-
import { CaretDownIcon, CheckIcon
|
|
12
|
-
import {
|
|
12
|
+
import { CaretDownIcon, CheckIcon } from '@phosphor-icons/react';
|
|
13
|
+
import { AgentMark } from '../../internal/components/agent-mark.js';
|
|
14
|
+
import { createContext, useContext, useEffect, useMemo, useState } from 'react';
|
|
13
15
|
import { composerSelectableAgents } from './composer-agent-access.js';
|
|
16
|
+
/**
|
|
17
|
+
* A place's own agents, listed first in the picker under `label` (a
|
|
18
|
+
* channel's `#name`); every other agent follows under `restLabel`. Set by a
|
|
19
|
+
* channel's composer (`space-view.tsx`). No provider: one plain list.
|
|
20
|
+
*/
|
|
21
|
+
export const FeaturedAgentsContext = createContext(null);
|
|
14
22
|
/**
|
|
15
23
|
* Agents on screen before the popover grows a search field.
|
|
16
24
|
*
|
|
@@ -36,7 +44,7 @@ export function agentDisplayLabel(agents, selectedAgent) {
|
|
|
36
44
|
return 'Agent';
|
|
37
45
|
return isMetaAgentName(name) ? META_AGENT_DISPLAY_NAME : capitalizeWords(name);
|
|
38
46
|
}
|
|
39
|
-
export function AgentSelector({ agents, selectedAgent, onSelect, disabled = false, triggerLabelClassName, unavailableHint, open: controlledOpen, onOpenChange, }) {
|
|
47
|
+
export function AgentSelector({ agents, selectedAgent, onSelect, disabled = false, triggerLabelClassName, unavailableHint, open: controlledOpen, onOpenChange, compact = false, appearance = 'chip', }) {
|
|
40
48
|
const tHardcodedUi = useTranslations('hardcodedUi');
|
|
41
49
|
const t = useTranslations('threads');
|
|
42
50
|
const [internalOpen, setInternalOpen] = useState(false);
|
|
@@ -71,6 +79,12 @@ export function AgentSelector({ agents, selectedAgent, onSelect, disabled = fals
|
|
|
71
79
|
}, [primaryAgents, search, agentLabels]);
|
|
72
80
|
const filteredMeta = useMemo(() => filteredPrimary.filter((a) => isMetaAgentName(a.name)), [filteredPrimary]);
|
|
73
81
|
const filteredProject = useMemo(() => filteredPrimary.filter((a) => !isMetaAgentName(a.name)), [filteredPrimary]);
|
|
82
|
+
// The place's agents, in its order, then every other agent.
|
|
83
|
+
const featured = useContext(FeaturedAgentsContext);
|
|
84
|
+
const filteredFeatured = useMemo(() => (featured?.names ?? []).flatMap((name) => {
|
|
85
|
+
const agent = filteredPrimary.find((a) => a.name === name);
|
|
86
|
+
return agent ? [agent] : [];
|
|
87
|
+
}), [featured, filteredPrimary]);
|
|
74
88
|
// Keyed off the FULL list, never the filtered one: deriving it from
|
|
75
89
|
// `filteredPrimary` would make the field that is doing the filtering vanish
|
|
76
90
|
// the moment a query narrowed the list past the threshold, taking the
|
|
@@ -84,7 +98,13 @@ export function AgentSelector({ agents, selectedAgent, onSelect, disabled = fals
|
|
|
84
98
|
// matching the resolver's own first-accessible pre-selection.
|
|
85
99
|
const displayedName = resolveDisplayedAgentName(primaryAgents, selectedAgent);
|
|
86
100
|
const displayName = displayedName ? label(displayedName) : agentDisplayLabel(offered, selectedAgent);
|
|
87
|
-
|
|
101
|
+
// The trigger leads with the agent's pixel mark, the same face it has on the
|
|
102
|
+
// Agents page and in every row below. Only for a real agent: a placeholder
|
|
103
|
+
// name such as a trigger's `default` would get a mark of its own, and that
|
|
104
|
+
// face would belong to no agent.
|
|
105
|
+
const triggerMark = displayedName && primaryAgents.some((agent) => agent.name === displayedName) ? (_jsx(AgentMark, { slug: displayedName })) : null;
|
|
106
|
+
const field = appearance === 'field';
|
|
107
|
+
const fieldTrigger = (caret, props) => (_jsxs("button", { type: "button", className: cn(triggerVariants(), 'h-9 w-full'), ...props, children: [_jsxs("span", { className: "flex min-w-0 items-center gap-2", children: [triggerMark, _jsx("span", { className: "truncate", children: displayName })] }), caret ? _jsx(CaretDownIcon, { className: cn(TRIGGER_CARET_CLASS, 'size-4') }) : null] }));
|
|
88
108
|
/**
|
|
89
109
|
* One agent: name, its type, its description, and a check when it is the
|
|
90
110
|
* one in use.
|
|
@@ -111,10 +131,7 @@ export function AgentSelector({ agents, selectedAgent, onSelect, disabled = fals
|
|
|
111
131
|
className: cn('items-start gap-2 py-2', isSelected && 'bg-primary/[0.06]'), onSelect: () => {
|
|
112
132
|
onSelect(agent.name);
|
|
113
133
|
setOpen(false);
|
|
114
|
-
}, children: [meta && (
|
|
115
|
-
// Meta is the platform agent that runs the others, so its row leads
|
|
116
|
-
// with its own mark instead of reading as one more peer in the list.
|
|
117
|
-
_jsx("span", { className: "bg-muted flex size-8 shrink-0 items-center justify-center rounded-md", children: _jsx(SparkleIcon, { weight: "fill", className: "text-foreground size-4" }) })), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex min-w-0 items-center gap-1.5", children: [_jsx("span", { className: "text-foreground truncate text-sm font-medium", children: label(agent.name) }), meta && (_jsx(Badge, { variant: "outline", size: "xs", className: "shrink-0 font-normal", children: tHardcodedUi.raw('i18nComplete.textc78ffe195710') }))] }), agent.description && (_jsx("p", { className: "text-muted-foreground mt-0.5 truncate text-xs", children: agent.description }))] }), isSelected && (
|
|
134
|
+
}, children: [agent.description ? (_jsx(AgentMark, { slug: agent.name, size: 28, tile: 36 })) : (_jsx(AgentMark, { slug: agent.name, size: 14 })), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex min-w-0 items-center gap-1.5", children: [_jsx("span", { className: "text-foreground truncate text-sm font-medium", children: label(agent.name) }), meta && (_jsx(Badge, { variant: "outline", size: "xs", className: "shrink-0 font-normal", children: tHardcodedUi.raw('i18nComplete.textc78ffe195710') }))] }), agent.description && (_jsx("p", { className: "text-muted-foreground truncate text-xs", children: agent.description }))] }), isSelected && (
|
|
118
135
|
// `mt-0.5` optically centres the 16px check against the first line
|
|
119
136
|
// rather than the top edge of the text box.
|
|
120
137
|
_jsx(CheckIcon, { className: "text-foreground mt-0.5 size-4 shrink-0" }))] }, agent.name));
|
|
@@ -135,7 +152,7 @@ export function AgentSelector({ agents, selectedAgent, onSelect, disabled = fals
|
|
|
135
152
|
* open — in exactly the state where its words matter.
|
|
136
153
|
*/
|
|
137
154
|
if (primaryAgents.length === 0) {
|
|
138
|
-
const trigger = (_jsxs(Button, { type: "button", variant: "ghost", size: "sm", disabled: true, "aria-label": unavailableHint ?? undefined, className: "text-muted-foreground rounded-lg hit-area-y-3", children: [_jsx("span", { className: cn('max-w-[100px] truncate', triggerLabelClassName), children: displayName }), _jsx(CaretDownIcon, { className: "size-3" })] }));
|
|
155
|
+
const trigger = field ? (fieldTrigger(false, { disabled: true, 'aria-label': unavailableHint ?? undefined })) : (_jsxs(Button, { type: "button", variant: "ghost", size: "sm", disabled: true, "aria-label": unavailableHint ?? undefined, className: "text-muted-foreground rounded-lg hit-area-y-3", children: [_jsx("span", { className: cn('max-w-[100px] truncate', triggerLabelClassName), children: displayName }), _jsx(CaretDownIcon, { className: "size-3" })] }));
|
|
139
156
|
if (!unavailableHint)
|
|
140
157
|
return trigger;
|
|
141
158
|
return (_jsx(Hint, { side: "top", label: unavailableHint, children: _jsx("span", { className: "inline-flex", children: trigger }) }));
|
|
@@ -148,7 +165,20 @@ export function AgentSelector({ agents, selectedAgent, onSelect, disabled = fals
|
|
|
148
165
|
* text every inert control on this rail wears, and the disabled attribute.
|
|
149
166
|
*/
|
|
150
167
|
if (disabled) {
|
|
151
|
-
|
|
168
|
+
if (field)
|
|
169
|
+
return fieldTrigger(false, { disabled: true });
|
|
170
|
+
return (_jsxs(Button, { type: "button", variant: "ghost", size: "sm", disabled: true, className: "text-muted-foreground rounded-lg hit-area-y-3", children: [triggerMark, _jsx("span", { className: cn('max-w-[100px] truncate', triggerLabelClassName), children: displayName })] }));
|
|
152
171
|
}
|
|
153
|
-
|
|
172
|
+
const trigger = (_jsx(CommandPopoverTrigger, { children: field ? (fieldTrigger(true, { 'aria-label': t('selectAgent') })) : (_jsx(Button, { type: "button", variant: "ghost", size: "sm", "aria-label": compact ? `${t('selectAgent')}: ${displayName}` : t('selectAgent'), className: cn('text-muted-foreground rounded-lg hit-area-y-3', compact && 'px-1.5'), children: compact ? (
|
|
173
|
+
// The mark alone: the name is the tooltip and the menu's checked row.
|
|
174
|
+
// A placeholder name has no mark, so it shows as text.
|
|
175
|
+
triggerMark ?? _jsx("span", { className: cn('max-w-[100px] truncate', triggerLabelClassName), children: displayName })) : (_jsxs(_Fragment, { children: [triggerMark, _jsx("span", { className: cn('max-w-[100px] truncate', triggerLabelClassName), children: displayName }), _jsx(CaretDownIcon, { className: cn('size-3 transition-transform duration-moderate ease-out', open && 'rotate-180') })] })) })) }));
|
|
176
|
+
return (_jsxs(CommandPopover, { open: open, onOpenChange: setOpen, children: [compact ? (_jsx(Hint, { side: "top", label: displayName, children: trigger })) : (trigger), _jsxs(CommandPopoverContent, { side: "top", align: "start", sideOffset: 8, className: "w-[min(300px,calc(100vw-1.5rem))]", children: [_jsx("div", { className: showSearch ? undefined : 'sr-only', children: _jsx(CommandInput, { compact: true, placeholder: tHardcodedUi.raw('componentsSessionSessionChatInput.line231JsxAttrPlaceholderSearchAgents'), value: search, onValueChange: setSearch }) }), _jsxs(CommandList, { className: "max-h-[320px]", children: [filteredFeatured.length > 0 && featured ? (
|
|
177
|
+
// Two groups, so each earns its heading: the place's agents, then the rest.
|
|
178
|
+
_jsxs(_Fragment, { children: [_jsx(CommandGroup, { forceMount: true, heading: featured.label, className: "[&_[cmdk-group-items]]:flex [&_[cmdk-group-items]]:flex-col [&_[cmdk-group-items]]:gap-px", children: filteredFeatured.map((agent) => renderAgentItem(agent, isMetaAgentName(agent.name))) }), filteredPrimary.length > filteredFeatured.length && (_jsx(CommandGroup, { forceMount: true, heading: featured.restLabel, className: "[&_[cmdk-group-items]]:flex [&_[cmdk-group-items]]:flex-col [&_[cmdk-group-items]]:gap-px", children: filteredPrimary
|
|
179
|
+
.filter((agent) => !filteredFeatured.includes(agent))
|
|
180
|
+
.map((agent) => renderAgentItem(agent, isMetaAgentName(agent.name))) }))] })) : filteredPrimary.length > 0 && (
|
|
181
|
+
// `gap-px` between rows: a selected row and a hovered row next to it
|
|
182
|
+
// otherwise draw one merged grey block.
|
|
183
|
+
_jsxs(CommandGroup, { forceMount: true, className: "[&_[cmdk-group-items]]:flex [&_[cmdk-group-items]]:flex-col [&_[cmdk-group-items]]:gap-px", children: [filteredMeta.map((agent) => renderAgentItem(agent, true)), filteredMeta.length > 0 && filteredProject.length > 0 && (_jsx(CommandSeparator, { className: "my-1" })), filteredProject.map((agent) => renderAgentItem(agent, false))] })), filteredPrimary.length === 0 && search.trim() && (_jsxs("div", { className: "text-muted-foreground py-8 text-center text-xs", children: [tHardcodedUi.raw('componentsSessionSessionChatInput.line273JsxTextNoAgentsMatchLdquo'), search.trim(), tHardcodedUi.raw('componentsSessionSessionChatInput.line273JsxTextRdquo')] }))] })] })] }));
|
|
154
184
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ProjectSpace } from '@kortix/sdk';
|
|
1
2
|
import type { Agent } from '@kortix/sdk/react';
|
|
2
3
|
/**
|
|
3
4
|
* Which agent the composer will actually run, given the roster the server is
|
|
@@ -64,6 +65,20 @@ export interface ComposerAgentResolution {
|
|
|
64
65
|
* empty picker, and must not read as "we have an agent to run".
|
|
65
66
|
*/
|
|
66
67
|
export declare function composerSelectableAgents(agents: Agent[] | undefined): Agent[];
|
|
68
|
+
/**
|
|
69
|
+
* The agents anyone who posts in this channel may run, granted or not (the
|
|
70
|
+
* server's `channelAgentNames`): the channel's agents,
|
|
71
|
+
* else the project default. None in a DM or with no space: its own rules apply.
|
|
72
|
+
*/
|
|
73
|
+
export declare function channelRunnableAgents(space: Pick<ProjectSpace, 'agents' | 'kind'> | null | undefined, projectDefault: string | null | undefined): string[];
|
|
74
|
+
/**
|
|
75
|
+
* The roster plus a channel's agents: whoever may
|
|
76
|
+
* post in a channel runs its agents there without an agent grant, and the
|
|
77
|
+
* server applies the same rule (`agent-access.ts`, `channelRunnableAgents`).
|
|
78
|
+
* A name missing from the roster gets a plain primary entry. `undefined`
|
|
79
|
+
* (still loading) stays `undefined`.
|
|
80
|
+
*/
|
|
81
|
+
export declare function withChannelAgents(agents: Agent[] | undefined, channelAgents: readonly string[] | undefined): Agent[] | undefined;
|
|
67
82
|
export declare function resolveComposerAgent(input: {
|
|
68
83
|
/** The accessible roster. `undefined` means the query is still in flight. */
|
|
69
84
|
agents: Agent[] | undefined;
|
|
@@ -48,6 +48,33 @@ export function composerSelectableAgents(agents) {
|
|
|
48
48
|
return [];
|
|
49
49
|
return agents.filter(isSelectableAgent);
|
|
50
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* The agents anyone who posts in this channel may run, granted or not (the
|
|
53
|
+
* server's `channelAgentNames`): the channel's agents,
|
|
54
|
+
* else the project default. None in a DM or with no space: its own rules apply.
|
|
55
|
+
*/
|
|
56
|
+
export function channelRunnableAgents(space, projectDefault) {
|
|
57
|
+
if (space?.kind !== 'channel')
|
|
58
|
+
return [];
|
|
59
|
+
const agents = space.agents ?? [];
|
|
60
|
+
return agents.length > 0 ? [...agents] : projectDefault ? [projectDefault] : [];
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* The roster plus a channel's agents: whoever may
|
|
64
|
+
* post in a channel runs its agents there without an agent grant, and the
|
|
65
|
+
* server applies the same rule (`agent-access.ts`, `channelRunnableAgents`).
|
|
66
|
+
* A name missing from the roster gets a plain primary entry. `undefined`
|
|
67
|
+
* (still loading) stays `undefined`.
|
|
68
|
+
*/
|
|
69
|
+
export function withChannelAgents(agents, channelAgents) {
|
|
70
|
+
if (!agents || !channelAgents?.length)
|
|
71
|
+
return agents;
|
|
72
|
+
const known = new Set(agents.map((a) => a.name));
|
|
73
|
+
const missing = channelAgents.filter((name) => !known.has(name));
|
|
74
|
+
if (missing.length === 0)
|
|
75
|
+
return agents;
|
|
76
|
+
return [...agents, ...missing.map((name) => ({ name, mode: 'primary' }))];
|
|
77
|
+
}
|
|
51
78
|
export function resolveComposerAgent(input) {
|
|
52
79
|
const bound = input.boundAgent?.trim() || null;
|
|
53
80
|
// A pending roster is not an empty one. Refusing the send here would disable
|
|
@@ -24,7 +24,7 @@ export interface ComposerOptions {
|
|
|
24
24
|
* The current selections are handed to `onSend` / `onCommand` as `options`, so
|
|
25
25
|
* callers never need their own `useRuntimeLocal`.
|
|
26
26
|
*/
|
|
27
|
-
export declare function ComposerChatInput({ onSend, onCommand, sessionId, projectId, isBusy, sessionWorking, runtimeReady, stopDisabled, isSending, disabled, autoFocus, placeholder, prefill, onPrefillApplied, aboveSlot, inputSlot, toolbarSlot, underbarPlacement, slashMenuPlacement, cardClassName, parentClassName, boundAgentName, projectSession, clearOnSend, onAgentSelectionChange, sandboxSlot, draftScope, draftActive, promptAttachments, submitLabel, onArrowUpAtStart, }: {
|
|
27
|
+
export declare function ComposerChatInput({ onSend, onCommand, sessionId, projectId, isBusy, sessionWorking, runtimeReady, stopDisabled, isSending, disabled, autoFocus, placeholder, hint, prefill, onPrefillApplied, aboveSlot, inputSlot, toolbarSlot, underbarPlacement, slashMenuPlacement, cardClassName, parentClassName, boundAgentName, defaultAgentName, channelAgentNames, projectSession, clearOnSend, onAgentSelectionChange, sandboxSlot, draftScope, draftActive, promptAttachments, submitLabel, onArrowUpAtStart, }: {
|
|
28
28
|
onSend: (text: string, files: AttachedFile[] | undefined, options: ComposerOptions, attachments?: AttachmentSubmission) => void | Promise<void>;
|
|
29
29
|
onCommand?: (command: Command, args: string | undefined, options: ComposerOptions) => void;
|
|
30
30
|
sessionId?: string;
|
|
@@ -49,13 +49,15 @@ export declare function ComposerChatInput({ onSend, onCommand, sessionId, projec
|
|
|
49
49
|
clearOnSend?: ComposerSendReset;
|
|
50
50
|
autoFocus?: boolean;
|
|
51
51
|
placeholder?: string;
|
|
52
|
+
/** Static copy that replaces the rotating placeholder. See `SessionChatInputProps.hint`. */
|
|
53
|
+
hint?: string;
|
|
52
54
|
prefill?: {
|
|
53
55
|
text: string;
|
|
54
56
|
id: number;
|
|
55
57
|
files?: AttachedFile[];
|
|
56
58
|
mode?: 'replace' | 'merge';
|
|
57
59
|
options?: SessionPromptOverrides | null;
|
|
58
|
-
submit?: boolean;
|
|
60
|
+
submit?: boolean | 'when-ready';
|
|
59
61
|
} | null;
|
|
60
62
|
onPrefillApplied?: SessionChatInputProps['onPrefillApplied'];
|
|
61
63
|
aboveSlot?: ReactNode;
|
|
@@ -69,6 +71,10 @@ export declare function ComposerChatInput({ onSend, onCommand, sessionId, projec
|
|
|
69
71
|
parentClassName?: string;
|
|
70
72
|
/** Immutable project-session agent. When set, sends are locked to this agent. */
|
|
71
73
|
boundAgentName?: string | null;
|
|
74
|
+
/** The agent a new thread starts on here (a channel's default). Unset: the project's default. */
|
|
75
|
+
defaultAgentName?: string | null;
|
|
76
|
+
/** A channel's agents: anyone who posts here runs them, granted or not. */
|
|
77
|
+
channelAgentNames?: readonly string[];
|
|
72
78
|
/** The project session row. Its model pin is the model this composer opens on. */
|
|
73
79
|
projectSession?: {
|
|
74
80
|
metadata?: Record<string, unknown> | null;
|
|
@@ -5,7 +5,7 @@ import { SessionOverridesComposer } from '../overrides/session-overrides-compose
|
|
|
5
5
|
import { SessionChatInput, } from './session-chat-input.js';
|
|
6
6
|
import { useProjectConfig, useRuntimeAgents, useRuntimeCommands, useRuntimeConfig, useRuntimeProviders, useSessionModelSelection } from '@kortix/sdk/react';
|
|
7
7
|
import { appendMentionRefs } from '../../internal/lib/project-preamble.js';
|
|
8
|
-
import { resolveComposerAgent } from './composer-agent-access.js';
|
|
8
|
+
import { resolveComposerAgent, withChannelAgents } from './composer-agent-access.js';
|
|
9
9
|
/**
|
|
10
10
|
* The canonical "compose a first message" input: {@link SessionChatInput}
|
|
11
11
|
* pre-wired with the OpenCode model / agent / variant / command selectors (the
|
|
@@ -15,18 +15,20 @@ import { resolveComposerAgent } from './composer-agent-access.js';
|
|
|
15
15
|
* The current selections are handed to `onSend` / `onCommand` as `options`, so
|
|
16
16
|
* callers never need their own `useRuntimeLocal`.
|
|
17
17
|
*/
|
|
18
|
-
export function ComposerChatInput({ onSend, onCommand, sessionId, projectId, isBusy, sessionWorking, runtimeReady, stopDisabled, isSending, disabled, autoFocus, placeholder, prefill, onPrefillApplied, aboveSlot, inputSlot, toolbarSlot, underbarPlacement, slashMenuPlacement, cardClassName, parentClassName, boundAgentName, projectSession, clearOnSend, onAgentSelectionChange, sandboxSlot, draftScope, draftActive, promptAttachments, submitLabel, onArrowUpAtStart, }) {
|
|
19
|
-
const { data:
|
|
18
|
+
export function ComposerChatInput({ onSend, onCommand, sessionId, projectId, isBusy, sessionWorking, runtimeReady, stopDisabled, isSending, disabled, autoFocus, placeholder, hint, prefill, onPrefillApplied, aboveSlot, inputSlot, toolbarSlot, underbarPlacement, slashMenuPlacement, cardClassName, parentClassName, boundAgentName, defaultAgentName, channelAgentNames, projectSession, clearOnSend, onAgentSelectionChange, sandboxSlot, draftScope, draftActive, promptAttachments, submitLabel, onArrowUpAtStart, }) {
|
|
19
|
+
const { data: rosterAgents } = useRuntimeAgents({ projectId });
|
|
20
|
+
const agents = useMemo(() => withChannelAgents(rosterAgents, channelAgentNames), [rosterAgents, channelAgentNames]);
|
|
20
21
|
const { data: providers, isLoading: providersLoading } = useRuntimeProviders();
|
|
21
22
|
const { data: config } = useRuntimeConfig();
|
|
22
23
|
const projectConfig = useProjectConfig(projectId);
|
|
24
|
+
const startAgent = defaultAgentName || (projectConfig?.default_agent ?? projectConfig?.open_code_default_agent);
|
|
23
25
|
const local = useSessionModelSelection({
|
|
24
26
|
agents,
|
|
25
27
|
providers,
|
|
26
28
|
config,
|
|
27
29
|
sessionId,
|
|
28
30
|
boundAgentName,
|
|
29
|
-
defaultAgentName:
|
|
31
|
+
defaultAgentName: startAgent,
|
|
30
32
|
projectSession,
|
|
31
33
|
});
|
|
32
34
|
const setAgent = local.agent.set;
|
|
@@ -70,7 +72,7 @@ export function ComposerChatInput({ onSend, onCommand, sessionId, projectId, isB
|
|
|
70
72
|
const agentResolution = resolveComposerAgent({
|
|
71
73
|
agents,
|
|
72
74
|
boundAgent: boundAgentName,
|
|
73
|
-
defaultAgent:
|
|
75
|
+
defaultAgent: startAgent,
|
|
74
76
|
selectedAgent: local.agent.current?.name ?? null,
|
|
75
77
|
});
|
|
76
78
|
const selectedAgentName = agentResolution.selected;
|
|
@@ -141,5 +143,5 @@ export function ComposerChatInput({ onSend, onCommand, sessionId, projectId, isB
|
|
|
141
143
|
, {
|
|
142
144
|
// A first message has no session send to write the `@` mention blocks
|
|
143
145
|
// (`session-chat.tsx` `handleSend`), so they go into the text here.
|
|
144
|
-
onSend: (text, files, mentions, attachments, placement) => onSend(appendMentionRefs(text, mentions), files, { ...options(), placement }, attachments), promptAttachments: promptAttachments, onCommand: onCommand ? (cmd, args) => onCommand(cmd, args, options()) : undefined, clearOnSend: clearOnSend, isBusy: isBusy, sessionWorking: sessionWorking, runtimeReady: runtimeReady, stopDisabled: stopDisabled, isSending: isSending, disabled: disabled, autoFocus: autoFocus, placeholder: placeholder, prefill: deliveredPrefill, onPrefillApplied: onPrefillApplied, aboveSlot: aboveSlot, inputSlot: inputSlot, toolbarSlot: combinedToolbarSlot, underbarPlacement: underbarPlacement, slashMenuPlacement: slashMenuPlacement, cardClassName: cardClassName, parentClassName: parentClassName, sessionId: sessionId, projectId: projectId, providers: providers, agents: local.agent.list, selectedAgent: selectedAgentName, noAccessibleAgents: noAccessibleAgents, onAgentChange: (name) => local.agent.set(name ?? undefined), models: local.model.list, selectedModel: local.model.currentKey ?? null, onModelChange: (m) => local.model.set(m ?? undefined, { recent: true }), modelRequired: true, modelsLoading: providersLoading, variants: local.model.variant.list, selectedVariant: local.model.variant.current ?? null, onVariantChange: (v) => local.model.variant.set(v ?? undefined), commands: commands || [], commandsResolved: commands !== undefined, draftScope: draftScope, draftActive: draftActive, submitLabel: submitLabel, onArrowUpAtStart: onArrowUpAtStart }));
|
|
146
|
+
onSend: (text, files, mentions, attachments, placement) => onSend(appendMentionRefs(text, mentions), files, { ...options(), placement }, attachments), promptAttachments: promptAttachments, onCommand: onCommand ? (cmd, args) => onCommand(cmd, args, options()) : undefined, clearOnSend: clearOnSend, isBusy: isBusy, sessionWorking: sessionWorking, runtimeReady: runtimeReady, stopDisabled: stopDisabled, isSending: isSending, disabled: disabled, autoFocus: autoFocus, placeholder: placeholder, hint: hint, prefill: deliveredPrefill, onPrefillApplied: onPrefillApplied, aboveSlot: aboveSlot, inputSlot: inputSlot, toolbarSlot: combinedToolbarSlot, underbarPlacement: underbarPlacement, slashMenuPlacement: slashMenuPlacement, cardClassName: cardClassName, parentClassName: parentClassName, sessionId: sessionId, projectId: projectId, providers: providers, agents: local.agent.list, selectedAgent: selectedAgentName, noAccessibleAgents: noAccessibleAgents, onAgentChange: (name) => local.agent.set(name ?? undefined), models: local.model.list, selectedModel: local.model.currentKey ?? null, onModelChange: (m) => local.model.set(m ?? undefined, { recent: true }), modelRequired: true, modelsLoading: providersLoading, variants: local.model.variant.list, selectedVariant: local.model.variant.current ?? null, onVariantChange: (v) => local.model.variant.set(v ?? undefined), commands: commands || [], commandsResolved: commands !== undefined, draftScope: draftScope, draftActive: draftActive, submitLabel: submitLabel, onArrowUpAtStart: onArrowUpAtStart }));
|
|
145
147
|
}
|
|
@@ -245,6 +245,22 @@ export interface ShouldSubmitPrefillInput {
|
|
|
245
245
|
* submit would send the same message again, so each prefill id submits once.
|
|
246
246
|
*/
|
|
247
247
|
export declare function shouldSubmitPrefill({ prefillId, prefillSubmit, submittedPrefillId, }: ShouldSubmitPrefillInput): boolean;
|
|
248
|
+
export interface ShouldSubmitWhenReadyInput {
|
|
249
|
+
prefillId: number | undefined;
|
|
250
|
+
/** The id whose text is in the editor now, or null. */
|
|
251
|
+
landedPrefillId: number | null;
|
|
252
|
+
submittedPrefillId: number | null;
|
|
253
|
+
/** Send is refused right now: no model, no agent, a create in flight. */
|
|
254
|
+
submitDisabled: boolean;
|
|
255
|
+
/** The model catalog or entitlements are still loading. */
|
|
256
|
+
loading: boolean;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Whether a `submit: 'when-ready'` prefill sends now: its text has landed, a
|
|
260
|
+
* send is possible, and this id has not been sent before. The onboarding chat
|
|
261
|
+
* holds "Onboard me" this way until a model is connected.
|
|
262
|
+
*/
|
|
263
|
+
export declare function shouldSubmitWhenReady({ prefillId, landedPrefillId, submittedPrefillId, submitDisabled, loading, }: ShouldSubmitWhenReadyInput): boolean;
|
|
248
264
|
/** One "Reply" on a transcript selection, waiting to join the quote list. */
|
|
249
265
|
export interface QuoteRequest {
|
|
250
266
|
id: number;
|
|
@@ -228,6 +228,18 @@ export function shouldApplyPrefill({ prefillId, prefillText, prefillFiles, prefi
|
|
|
228
228
|
export function shouldSubmitPrefill({ prefillId, prefillSubmit, submittedPrefillId, }) {
|
|
229
229
|
return prefillSubmit && prefillId !== undefined && prefillId !== submittedPrefillId;
|
|
230
230
|
}
|
|
231
|
+
/**
|
|
232
|
+
* Whether a `submit: 'when-ready'` prefill sends now: its text has landed, a
|
|
233
|
+
* send is possible, and this id has not been sent before. The onboarding chat
|
|
234
|
+
* holds "Onboard me" this way until a model is connected.
|
|
235
|
+
*/
|
|
236
|
+
export function shouldSubmitWhenReady({ prefillId, landedPrefillId, submittedPrefillId, submitDisabled, loading, }) {
|
|
237
|
+
return (prefillId !== undefined &&
|
|
238
|
+
landedPrefillId === prefillId &&
|
|
239
|
+
submittedPrefillId !== prefillId &&
|
|
240
|
+
!submitDisabled &&
|
|
241
|
+
!loading);
|
|
242
|
+
}
|
|
231
243
|
/**
|
|
232
244
|
* The `quoteRequests` to append right now, in order.
|
|
233
245
|
*
|
|
@@ -49,6 +49,8 @@ export interface ComposerUnderbarProps {
|
|
|
49
49
|
* duplicated for it — same component, different packing.
|
|
50
50
|
*/
|
|
51
51
|
variant?: 'row' | 'inline';
|
|
52
|
+
/** See `SessionChatInputProps.agentPickerCompact`. */
|
|
53
|
+
agentPickerCompact?: boolean;
|
|
52
54
|
toolbarSlot?: React.ReactNode;
|
|
53
55
|
}
|
|
54
|
-
export declare function ComposerUnderbar({ onAttachClick, agents, selectedAgent, agentMenuOpen, onAgentMenuOpenChange, onAgentChange, noAccessibleAgents, messages, models, selectedModel, onContextClick, variant, toolbarSlot, }: ComposerUnderbarProps): import("react").JSX.Element;
|
|
56
|
+
export declare function ComposerUnderbar({ onAttachClick, agents, selectedAgent, agentMenuOpen, onAgentMenuOpenChange, onAgentChange, noAccessibleAgents, messages, models, selectedModel, onContextClick, variant, agentPickerCompact, toolbarSlot, }: ComposerUnderbarProps): import("react").JSX.Element;
|
|
@@ -14,7 +14,7 @@ import { TokenProgress } from './token-progress.js';
|
|
|
14
14
|
const NO_AGENT_SELECT = () => { };
|
|
15
15
|
/** Stable identity so the empty roster doesn't remount the picker per render. */
|
|
16
16
|
const EMPTY_AGENTS = [];
|
|
17
|
-
export function ComposerUnderbar({ onAttachClick, agents, selectedAgent, agentMenuOpen, onAgentMenuOpenChange, onAgentChange, noAccessibleAgents = false, messages, models, selectedModel, onContextClick, variant = 'row', toolbarSlot, }) {
|
|
17
|
+
export function ComposerUnderbar({ onAttachClick, agents, selectedAgent, agentMenuOpen, onAgentMenuOpenChange, onAgentChange, noAccessibleAgents = false, messages, models, selectedModel, onContextClick, variant = 'row', agentPickerCompact = false, toolbarSlot, }) {
|
|
18
18
|
const t = useTranslations('threads');
|
|
19
19
|
const { contextMeterEnabled } = useUiHostConfig();
|
|
20
20
|
/*
|
|
@@ -50,9 +50,10 @@ export function ComposerUnderbar({ onAttachClick, agents, selectedAgent, agentMe
|
|
|
50
50
|
// buttons stayed 32px on touch while the identical controls inside
|
|
51
51
|
// `.kortix-composer-toolbar` were 40px.
|
|
52
52
|
_jsxs("div", { className: inline
|
|
53
|
-
?
|
|
53
|
+
? // `shrink-0`: the model name truncates first (`ModelSelector`), never the agent.
|
|
54
|
+
'kortix-composer-underbar flex shrink-0 items-center gap-1'
|
|
54
55
|
: 'kortix-composer-underbar flex items-center justify-between gap-2 px-px pt-1.5 pb-2', children: [_jsxs("div", { className: "flex min-w-0 items-center gap-1", children: [_jsx(Hint, { side: "top", label: t('attachFiles'), children: _jsx(Button, { type: "button", variant: "ghost", size: "icon-base", onClick: onAttachClick, "aria-label": t('attachFiles'),
|
|
55
56
|
// `hit-area-3` — the ≈29px ghost chip clears the 44px mobile tap
|
|
56
57
|
// floor only with the shared pseudo-element extension.
|
|
57
|
-
className: "text-muted-foreground hit-area-3 rounded-lg", children: _jsx(Paperclip, { className: "size-4 shrink-0" }) }) }), _jsx(AgentSelector, { agents: noAccessibleAgents ? EMPTY_AGENTS : agents, selectedAgent: selectedAgent, open: agentMenuOpen, onOpenChange: onAgentMenuOpenChange, onSelect: onAgentChange ?? NO_AGENT_SELECT, triggerLabelClassName: "max-w-[7rem]", unavailableHint: noAccessibleAgents ? NO_AGENT_ACCESS_MESSAGE : undefined })] }), _jsxs("div", { className: "flex items-center gap-1", children: [(inline && !messages) || !contextMeterEnabled ? null : (_jsx(TokenProgress, { messages: messages, models: models, selectedModel: selectedModel, onContextClick: onContextClick })), toolbarSlot] })] }));
|
|
58
|
+
className: "text-muted-foreground hit-area-3 rounded-lg", children: _jsx(Paperclip, { className: "size-4 shrink-0" }) }) }), _jsx(AgentSelector, { compact: agentPickerCompact, agents: noAccessibleAgents ? EMPTY_AGENTS : agents, selectedAgent: selectedAgent, open: agentMenuOpen, onOpenChange: onAgentMenuOpenChange, onSelect: onAgentChange ?? NO_AGENT_SELECT, triggerLabelClassName: "max-w-[7rem]", unavailableHint: noAccessibleAgents ? NO_AGENT_ACCESS_MESSAGE : undefined })] }), _jsxs("div", { className: "flex items-center gap-1", children: [(inline && !messages) || !contextMeterEnabled ? null : (_jsx(TokenProgress, { messages: messages, models: models, selectedModel: selectedModel, onContextClick: onContextClick })), toolbarSlot] })] }));
|
|
58
59
|
}
|
|
@@ -153,6 +153,11 @@ export interface SessionChatInputProps {
|
|
|
153
153
|
* a spinner with no explanation, which was indistinguishable from broken.
|
|
154
154
|
*/
|
|
155
155
|
notice?: string | null;
|
|
156
|
+
/**
|
|
157
|
+
* The notice reports a sleeping computer: a moon, not a spinner. Default:
|
|
158
|
+
* `notice` is `SESSION_NOTICE.idle`. A host that rewords the notice says it.
|
|
159
|
+
*/
|
|
160
|
+
noticeAsleep?: boolean;
|
|
156
161
|
/**
|
|
157
162
|
* Renders a "Retry" action inline in the notice bar when set. Wired to
|
|
158
163
|
* `requestRuntimeReconnect()` for a confirmed-unreachable runtime, or a
|
|
@@ -190,8 +195,11 @@ export interface SessionChatInputProps {
|
|
|
190
195
|
* Enter. For one-click starters (the first chat's "Update memory"): the
|
|
191
196
|
* send still carries the composer's agent and model and still hits every
|
|
192
197
|
* refusal (no agent, no model, blocked images) a typed message would.
|
|
198
|
+
*
|
|
199
|
+
* `'when-ready'` holds the text until a send is possible, then submits once:
|
|
200
|
+
* the onboarding chat's "Onboard me" waits for a model to be connected.
|
|
193
201
|
*/
|
|
194
|
-
submit?: boolean;
|
|
202
|
+
submit?: boolean | 'when-ready';
|
|
195
203
|
} | null;
|
|
196
204
|
/**
|
|
197
205
|
* Called with `prefill.id` the moment that prefill has actually landed in the
|
|
@@ -240,6 +248,12 @@ export interface SessionChatInputProps {
|
|
|
240
248
|
* reads as a detached strip, so there the controls belong on the one bar.
|
|
241
249
|
*/
|
|
242
250
|
underbarPlacement?: 'below' | 'inline';
|
|
251
|
+
/**
|
|
252
|
+
* The agent picker shows the agent's tile alone, its name in the tooltip
|
|
253
|
+
* and the menu. A narrow inline toolbar (a channel's thread panel) gives
|
|
254
|
+
* the model name the width instead.
|
|
255
|
+
*/
|
|
256
|
+
agentPickerCompact?: boolean;
|
|
243
257
|
/**
|
|
244
258
|
* Where the `/` menu docks relative to the card. `'above'` (default) keeps
|
|
245
259
|
* it in flow above the composer — on the session page the card sits at the
|
|
@@ -25,7 +25,7 @@ import { ComposerCard } from './ComposerCard.js';
|
|
|
25
25
|
import { handleBillingError } from '../../internal/lib/error-handler.js';
|
|
26
26
|
import { attachedFileUploadId, attachmentsBlockSend, captureAttachmentSubmission, dispatchLatched, planAttachmentReplacement, refusedFilesToast, runComposerSend, heldTraySizes, splitComposerFiles, stageComposerFiles, takeNewBillingRefusals, } from './attachment-submission.js';
|
|
27
27
|
import { draftWillRunCommand, planCommandAttachments, planUnresolvedCommandChip, readCommandChipLabel, } from './command-attachments.js';
|
|
28
|
-
import { appendComposerQuote, classifyPaste, isUndoKey, popPasteUndo, extractReplyQuotes, nextPastedTextFileName, planDraftSubmission, planFailedSendRecovery, planPrefillMerge, planQuoteRequests, removeComposerQuote, resolveEditorPlaceholder, restoreComposerQuotes, shouldApplyPrefill, shouldSubmitPrefill, textToDocument, } from './composer-logic.js';
|
|
28
|
+
import { appendComposerQuote, classifyPaste, isUndoKey, popPasteUndo, extractReplyQuotes, nextPastedTextFileName, planDraftSubmission, planFailedSendRecovery, planPrefillMerge, planQuoteRequests, removeComposerQuote, resolveEditorPlaceholder, restoreComposerQuotes, shouldApplyPrefill, shouldSubmitPrefill, shouldSubmitWhenReady, textToDocument, } from './composer-logic.js';
|
|
29
29
|
import { getContextUsage } from './context-ring.js';
|
|
30
30
|
import { useComposerFocus } from './hooks/use-composer-focus.js';
|
|
31
31
|
import { useMenuRevalidation } from './hooks/use-file-search.js';
|
|
@@ -722,6 +722,8 @@ function ComposerImpl(props) {
|
|
|
722
722
|
// through this ref, bound in an effect right after that declaration.
|
|
723
723
|
const handleSubmitRef = useRef(() => undefined);
|
|
724
724
|
const submittedPrefillIdRef = useRef(null);
|
|
725
|
+
// The prefill id that landed in the editor: `'when-ready'` submits only after it.
|
|
726
|
+
const [landedPrefillId, setLandedPrefillId] = useState(null);
|
|
725
727
|
const onPrefillAppliedRef = useRef(onPrefillApplied);
|
|
726
728
|
useEffect(() => {
|
|
727
729
|
onPrefillAppliedRef.current = onPrefillApplied;
|
|
@@ -806,6 +808,7 @@ function ComposerImpl(props) {
|
|
|
806
808
|
// re-run the effect whenever the caller re-created it, and a `merge` prefill
|
|
807
809
|
// applied twice appends its text twice.
|
|
808
810
|
onPrefillAppliedRef.current?.(prefillId);
|
|
811
|
+
setLandedPrefillId(prefillId);
|
|
809
812
|
// Last, so the prefill is fully applied and reported before the submit
|
|
810
813
|
// takes the draft out of the editor.
|
|
811
814
|
if (shouldSubmitPrefill({
|
|
@@ -1361,6 +1364,21 @@ function ComposerImpl(props) {
|
|
|
1361
1364
|
useEffect(() => {
|
|
1362
1365
|
handleSubmitRef.current = () => void handleSubmit();
|
|
1363
1366
|
}, [handleSubmit]);
|
|
1367
|
+
const submitWhenReady = prefill?.submit === 'when-ready';
|
|
1368
|
+
useEffect(() => {
|
|
1369
|
+
if (!submitWhenReady ||
|
|
1370
|
+
!shouldSubmitWhenReady({
|
|
1371
|
+
prefillId,
|
|
1372
|
+
landedPrefillId,
|
|
1373
|
+
submittedPrefillId: submittedPrefillIdRef.current,
|
|
1374
|
+
submitDisabled,
|
|
1375
|
+
loading: modelsLoading || entitlementsPending,
|
|
1376
|
+
})) {
|
|
1377
|
+
return;
|
|
1378
|
+
}
|
|
1379
|
+
submittedPrefillIdRef.current = prefillId;
|
|
1380
|
+
handleSubmitRef.current();
|
|
1381
|
+
}, [submitWhenReady, prefillId, landedPrefillId, submitDisabled, modelsLoading, entitlementsPending]);
|
|
1364
1382
|
// A question lock owns the editor: Up there is a caret move, never a take-back.
|
|
1365
1383
|
const handleArrowUpAtStart = useCallback(() => (lockForQuestion ? false : (onArrowUpAtStart?.() ?? false)), [lockForQuestion, onArrowUpAtStart]);
|
|
1366
1384
|
const editorPlaceholder = resolveEditorPlaceholder({
|
|
@@ -13,6 +13,11 @@ export interface ContextBreakdown {
|
|
|
13
13
|
* compaction, whose usage is its summary reply's) with a positive token total.
|
|
14
14
|
* `sessionLogThreadMetrics(...).context` picks the same message, but prices the
|
|
15
15
|
* whole thread to do it.
|
|
16
|
+
*
|
|
17
|
+
* `reasoning` is a SUBSET of `output` (pi-ai `Usage`, and the same convention in
|
|
18
|
+
* OpenCode and the Kortix transcript): adding it again reads a session at 107%
|
|
19
|
+
* of a window the model has not filled, and hides the compaction that should
|
|
20
|
+
* have run. It stays in the breakdown for display, outside `total`.
|
|
16
21
|
*/
|
|
17
22
|
export declare function getLastAssistantTokenBreakdown(messages: SessionLogMessage[] | undefined): ContextBreakdown;
|
|
18
23
|
export declare function getLastAssistantTokenTotal(messages: SessionLogMessage[] | undefined): number;
|
|
@@ -10,6 +10,11 @@ const EMPTY_BREAKDOWN = {
|
|
|
10
10
|
* compaction, whose usage is its summary reply's) with a positive token total.
|
|
11
11
|
* `sessionLogThreadMetrics(...).context` picks the same message, but prices the
|
|
12
12
|
* whole thread to do it.
|
|
13
|
+
*
|
|
14
|
+
* `reasoning` is a SUBSET of `output` (pi-ai `Usage`, and the same convention in
|
|
15
|
+
* OpenCode and the Kortix transcript): adding it again reads a session at 107%
|
|
16
|
+
* of a window the model has not filled, and hides the compaction that should
|
|
17
|
+
* have run. It stays in the breakdown for display, outside `total`.
|
|
13
18
|
*/
|
|
14
19
|
export function getLastAssistantTokenBreakdown(messages) {
|
|
15
20
|
if (!messages)
|
|
@@ -25,7 +30,7 @@ export function getLastAssistantTokenBreakdown(messages) {
|
|
|
25
30
|
const output = t.output;
|
|
26
31
|
const reasoning = t.reasoning ?? 0;
|
|
27
32
|
const cache = t.cache_read + t.cache_write;
|
|
28
|
-
const total = input + output +
|
|
33
|
+
const total = input + output + cache;
|
|
29
34
|
if (total > 0)
|
|
30
35
|
return { input, output, reasoning, cache, total };
|
|
31
36
|
}
|
|
@@ -15,12 +15,16 @@ export type StoredUpload = PromptAttachment & {
|
|
|
15
15
|
* What a persisted composer draft is keyed by.
|
|
16
16
|
*
|
|
17
17
|
* Project scope is the home hero composer — one draft per project, because
|
|
18
|
-
* that composer has no session yet.
|
|
19
|
-
*
|
|
18
|
+
* that composer has no session yet. Space scope is a channel or DM composer.
|
|
19
|
+
* Session scope is every in-thread composer. Every id is a UUID, and each
|
|
20
|
+
* family has its own prefix, so they can never collide.
|
|
20
21
|
*/
|
|
21
22
|
export type DraftScope = {
|
|
22
23
|
kind: 'project';
|
|
23
24
|
projectId: string;
|
|
25
|
+
} | {
|
|
26
|
+
kind: 'space';
|
|
27
|
+
spaceId: string;
|
|
24
28
|
} | {
|
|
25
29
|
kind: 'session';
|
|
26
30
|
sessionId: string;
|
|
@@ -9,7 +9,11 @@ export const DRAFT_ENVELOPE_VERSION = 1;
|
|
|
9
9
|
export const MAX_DRAFT_BYTES = 131072;
|
|
10
10
|
/** The `<kind>:<id>` half of the storage key. The family prefix is the store's. */
|
|
11
11
|
export function draftScopeKey(scope) {
|
|
12
|
-
|
|
12
|
+
if (scope.kind === 'project')
|
|
13
|
+
return `project:${scope.projectId}`;
|
|
14
|
+
if (scope.kind === 'space')
|
|
15
|
+
return `space:${scope.spaceId}`;
|
|
16
|
+
return `session:${scope.sessionId}`;
|
|
13
17
|
}
|
|
14
18
|
const isRemote = (file) => file.kind === 'remote';
|
|
15
19
|
/**
|
|
@@ -117,5 +117,5 @@ export function ReasoningEffortSelector({ variants, selectedVariant, onVariantCh
|
|
|
117
117
|
// reads as Auto rather than an unlabeled value; the next explicit choice
|
|
118
118
|
// replaces it.
|
|
119
119
|
const current = selectedVariant && choices.includes(selectedVariant) ? selectedVariant : null;
|
|
120
|
-
return (_jsxs(DropdownMenu, { open: open, onOpenChange: setOpen, children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs(Button, { type: "button", variant: "ghost", size: "sm", "aria-label": t('thinkingEffort'), className: "text-foreground
|
|
120
|
+
return (_jsxs(DropdownMenu, { open: open, onOpenChange: setOpen, children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs(Button, { type: "button", variant: "ghost", size: "sm", "aria-label": t('thinkingEffort'), className: "text-muted-foreground gap-1.5 rounded-lg hit-area-y-3", children: [_jsx(EffortIcon, { value: current, className: "size-4 shrink-0" }), _jsx("span", { className: "max-w-[7rem] truncate", children: current ? label(current) : t('auto') }), _jsx(CaretDownIcon, { className: cn('size-3 opacity-50 transition-transform duration-200 ease-out', open && 'rotate-180') })] }) }), _jsx(DropdownMenuContent, { side: "top", align: "start", className: "min-w-[10rem]", children: _jsxs(DropdownMenuRadioGroup, { value: current ?? AUTO, onValueChange: onValueChange, children: [_jsxs(DropdownMenuRadioItem, { value: AUTO, children: [_jsx(EffortIcon, { value: null, className: "size-4 shrink-0" }), t('auto')] }), choices.map((value) => (_jsxs(DropdownMenuRadioItem, { value: value, children: [_jsx(EffortIcon, { value: value, className: "size-4 shrink-0" }), label(value)] }, value)))] }) })] }));
|
|
121
121
|
}
|
|
@@ -40,15 +40,15 @@ const HEADLINE_TIP_KEY = {
|
|
|
40
40
|
};
|
|
41
41
|
/**
|
|
42
42
|
* Breakdown rows, in a fixed order chosen by size rather than by the order the
|
|
43
|
-
* API happens to emit them: input dominates, cache is next, output
|
|
44
|
-
*
|
|
45
|
-
*
|
|
43
|
+
* API happens to emit them: input dominates, cache is next, output is the tail.
|
|
44
|
+
* A fixed order matters more than a sorted one here — rows must not reshuffle
|
|
45
|
+
* under the cursor as tokens stream in. `reasoning` is not a row: it is a subset
|
|
46
|
+
* of `output`, so counting it here would read context the model never sends.
|
|
46
47
|
*/
|
|
47
48
|
const BREAKDOWN_ROWS = [
|
|
48
49
|
{ key: 'input', labelKey: 'labelInput' },
|
|
49
50
|
{ key: 'cache', labelKey: 'labelCached' },
|
|
50
51
|
{ key: 'output', labelKey: 'labelOutput' },
|
|
51
|
-
{ key: 'reasoning', labelKey: 'labelReasoning' },
|
|
52
52
|
];
|
|
53
53
|
/**
|
|
54
54
|
* Exported for the `/` palette: the "Show context" row's detail pane renders
|
|
@@ -9,8 +9,9 @@ interface TranscriptSessionHeader {
|
|
|
9
9
|
}
|
|
10
10
|
/**
|
|
11
11
|
* The transcript's header: the runtime's session while the computer runs, else
|
|
12
|
-
* the session row the page shows (asleep, stopped, failed).
|
|
13
|
-
*
|
|
12
|
+
* the session row the page shows (asleep, stopped, failed). The start is the row's
|
|
13
|
+
* (`sessionStartedAt`): a pi box stamps its runtime session at boot. Null: nothing
|
|
14
|
+
* to name the export after yet.
|
|
14
15
|
*/
|
|
15
16
|
export declare function transcriptSessionHeader(runtime: {
|
|
16
17
|
id: string;
|
|
@@ -14,14 +14,17 @@ import { loadSessionExportMessages, useProjectSession, useRuntimeSession, useSes
|
|
|
14
14
|
import { CheckIcon as Check, CopyIcon as Copy, } from '@phosphor-icons/react';
|
|
15
15
|
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
16
16
|
import { Download } from '../../internal/icons/download.js';
|
|
17
|
+
import { sessionStartedAt } from '../thread/session-context-metrics.js';
|
|
17
18
|
/**
|
|
18
19
|
* The transcript's header: the runtime's session while the computer runs, else
|
|
19
|
-
* the session row the page shows (asleep, stopped, failed).
|
|
20
|
-
*
|
|
20
|
+
* the session row the page shows (asleep, stopped, failed). The start is the row's
|
|
21
|
+
* (`sessionStartedAt`): a pi box stamps its runtime session at boot. Null: nothing
|
|
22
|
+
* to name the export after yet.
|
|
21
23
|
*/
|
|
22
24
|
export function transcriptSessionHeader(runtime, row, sessionId) {
|
|
23
25
|
if (runtime) {
|
|
24
|
-
|
|
26
|
+
const created = sessionStartedAt(runtime, row) ?? runtime.time.created;
|
|
27
|
+
return { id: runtime.id, title: runtime.title || runtime.slug || 'Untitled', time: { ...runtime.time, created } };
|
|
25
28
|
}
|
|
26
29
|
if (!row)
|
|
27
30
|
return null;
|