@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
|
@@ -10,13 +10,18 @@ import type { ChannelPlatform } from './channel-message.js';
|
|
|
10
10
|
* The hues are the platforms' own brand colors, not themeable tokens — which
|
|
11
11
|
* is why they live here as named constants rather than as classes. Slack has
|
|
12
12
|
* none to tint a label with: its mark is four colors and its wordmark is the
|
|
13
|
-
* text color, black or white. It was Material pink (#E91E63).
|
|
13
|
+
* text color, black or white. It was Material pink (#E91E63). Email is no
|
|
14
|
+
* brand: its envelope and its label take the text color too.
|
|
14
15
|
*/
|
|
15
16
|
export declare const CHANNEL_BRAND_COLOR: Record<ChannelPlatform, string | undefined>;
|
|
16
|
-
/**
|
|
17
|
+
/**
|
|
18
|
+
* The platform's own mark, in its brand colors. Email draws the envelope an
|
|
19
|
+
* email session wears in the sidebar. A platform this build does not know (a
|
|
20
|
+
* newer `@kortix/shared`) draws a neutral chat glyph, never another brand.
|
|
21
|
+
*/
|
|
17
22
|
export declare function ChannelBrandMark({ platform, className, }: {
|
|
18
23
|
platform: ChannelPlatform;
|
|
19
24
|
className?: string;
|
|
20
25
|
}): import("react").JSX.Element;
|
|
21
|
-
/** The platform's display name
|
|
26
|
+
/** The platform's display name: Teams (its full name) and Email have catalog strings, the brands are their own words. */
|
|
22
27
|
export declare function channelPlatformLabel(platform: ChannelPlatform, tI18nComplete: UiTranslator): string;
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { ChatCircleIcon } from '@phosphor-icons/react';
|
|
4
|
+
import { Email } from '../../internal/icons/email.js';
|
|
3
5
|
import { MicrosoftTeams } from '../../internal/icons/microsoft-teams.js';
|
|
4
6
|
import { Slack } from '../../internal/icons/slack.js';
|
|
5
7
|
/**
|
|
@@ -12,23 +14,37 @@ import { Slack } from '../../internal/icons/slack.js';
|
|
|
12
14
|
* The hues are the platforms' own brand colors, not themeable tokens — which
|
|
13
15
|
* is why they live here as named constants rather than as classes. Slack has
|
|
14
16
|
* none to tint a label with: its mark is four colors and its wordmark is the
|
|
15
|
-
* text color, black or white. It was Material pink (#E91E63).
|
|
17
|
+
* text color, black or white. It was Material pink (#E91E63). Email is no
|
|
18
|
+
* brand: its envelope and its label take the text color too.
|
|
16
19
|
*/
|
|
17
20
|
export const CHANNEL_BRAND_COLOR = {
|
|
18
21
|
Telegram: '#29B6F6',
|
|
19
22
|
Slack: undefined,
|
|
20
23
|
Teams: '#5B5FC7',
|
|
24
|
+
Email: undefined,
|
|
21
25
|
};
|
|
22
26
|
const TELEGRAM_PATH = 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm4.64 6.8c-.15 1.58-.8 5.42-1.13 7.19-.14.75-.42 1-.68 1.03-.58.05-1.02-.38-1.58-.75-.88-.58-1.38-.94-2.23-1.5-.99-.65-.35-1.01.22-1.59.15-.15 2.71-2.48 2.76-2.69a.2.2 0 00-.05-.18c-.06-.05-.14-.03-.21-.02-.09.02-1.49.95-4.22 2.79-.4.27-.76.41-1.08.4-.36-.01-1.04-.2-1.55-.37-.63-.2-1.12-.31-1.08-.66.02-.18.27-.36.74-.55 2.92-1.27 4.86-2.11 5.83-2.51 2.78-1.16 3.35-1.36 3.73-1.36.08 0 .27.02.39.12.1.08.13.19.14.27-.01.06.01.24 0 .38z';
|
|
23
|
-
/**
|
|
27
|
+
/**
|
|
28
|
+
* The platform's own mark, in its brand colors. Email draws the envelope an
|
|
29
|
+
* email session wears in the sidebar. A platform this build does not know (a
|
|
30
|
+
* newer `@kortix/shared`) draws a neutral chat glyph, never another brand.
|
|
31
|
+
*/
|
|
24
32
|
export function ChannelBrandMark({ platform, className = 'size-3.5 shrink-0', }) {
|
|
25
33
|
if (platform === 'Teams')
|
|
26
34
|
return _jsx(MicrosoftTeams, { className: className });
|
|
27
35
|
if (platform === 'Slack')
|
|
28
36
|
return _jsx(Slack, { className: className });
|
|
37
|
+
if (platform === 'Email')
|
|
38
|
+
return _jsx(Email, { className: className });
|
|
39
|
+
if (platform !== 'Telegram')
|
|
40
|
+
return _jsx(ChatCircleIcon, { className: className, "aria-hidden": "true" });
|
|
29
41
|
return (_jsx("svg", { className: className, viewBox: "0 0 24 24", fill: CHANNEL_BRAND_COLOR.Telegram, "aria-hidden": "true", children: _jsx("path", { d: TELEGRAM_PATH }) }));
|
|
30
42
|
}
|
|
31
|
-
/** The platform's display name
|
|
43
|
+
/** The platform's display name: Teams (its full name) and Email have catalog strings, the brands are their own words. */
|
|
32
44
|
export function channelPlatformLabel(platform, tI18nComplete) {
|
|
33
|
-
|
|
45
|
+
if (platform === 'Teams')
|
|
46
|
+
return tI18nComplete.raw('texta7b52b269a23');
|
|
47
|
+
if (platform === 'Email')
|
|
48
|
+
return tI18nComplete.raw('text969ccbd3cf63');
|
|
49
|
+
return platform;
|
|
34
50
|
}
|
|
@@ -9,6 +9,7 @@ import { useTranslations } from '../../i18n/index.js';
|
|
|
9
9
|
import { useProjectSessionHref } from '../../internal/lib/navigation/session-href.js';
|
|
10
10
|
import { CheckIcon } from '@phosphor-icons/react';
|
|
11
11
|
import { KortixLogo } from '../../primitives/kortix-logo.js';
|
|
12
|
+
import { AgentMark } from '../../internal/components/agent-mark.js';
|
|
12
13
|
import { SourceCard, SourcePill } from './source-pill.js';
|
|
13
14
|
/** The sending session's name, as a link to it when the project route resolves. */
|
|
14
15
|
function SenderName({ sessionId, name }) {
|
|
@@ -23,7 +24,7 @@ export function MessageAuthorLabel({ author }) {
|
|
|
23
24
|
if (author.kind === 'session') {
|
|
24
25
|
return _jsx(SessionAuthorLabel, { author: author });
|
|
25
26
|
}
|
|
26
|
-
return (_jsxs("span", { className: "text-muted-foreground flex items-center gap-1.5 text-xs font-medium", "data-testid": "message-author", children: [_jsx(UserAvatar, { email: author.email ?? '', name: author.name, size: "xs" }), author.name] }));
|
|
27
|
+
return (_jsxs("span", { className: "text-muted-foreground flex items-center gap-1.5 text-xs font-medium", "data-testid": "message-author", children: [_jsx(UserAvatar, { email: author.email ?? '', name: author.name, hint: author.name, size: "xs" }), author.name] }));
|
|
27
28
|
}
|
|
28
29
|
/**
|
|
29
30
|
* A prompt another Kortix session sent (`kortix sessions new`, a coordinator,
|
|
@@ -43,7 +44,10 @@ function SessionAuthorLabel({ author }) {
|
|
|
43
44
|
label: tI18nComplete('text6959b4159575'),
|
|
44
45
|
value: _jsx(SenderName, { sessionId: author.session_id, name: sessionName }),
|
|
45
46
|
},
|
|
46
|
-
{
|
|
47
|
+
{
|
|
48
|
+
label: tI18nComplete('text11b39c93777e'),
|
|
49
|
+
value: author.agent ? (_jsxs("span", { className: "inline-flex items-center gap-1.5", children: [_jsx(AgentMark, { slug: author.agent }), author.agent] })) : null,
|
|
50
|
+
},
|
|
47
51
|
{
|
|
48
52
|
label: tI18nComplete('textcb9ac5c561da'),
|
|
49
53
|
value: author.session_id ? _jsx(CopySessionId, { sessionId: author.session_id }) : null,
|
|
@@ -44,4 +44,12 @@ export declare function stoppedByName(data: SessionMessageAuthors | undefined, m
|
|
|
44
44
|
export declare function awaitsAgent(prompt: {
|
|
45
45
|
no_reply?: boolean;
|
|
46
46
|
}): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* The user messages the viewer may edit and rewind to: their own, with no
|
|
49
|
+
* other person's message after it (a rewind deletes everything after the
|
|
50
|
+
* target). An agent's message, or one with no recorded author, belongs to the
|
|
51
|
+
* thread's starter and never blocks a later rewind. The server applies the same
|
|
52
|
+
* rule (`rewind-authority.ts`). Null with no viewer id: nothing to filter on.
|
|
53
|
+
*/
|
|
54
|
+
export declare function rewindableMessageIds(messageIds: readonly string[], authors: ReadonlyMap<string, SessionMessageAuthor>, viewerId: string | undefined, starterId: string | null | undefined): Set<string> | null;
|
|
47
55
|
export {};
|
|
@@ -73,3 +73,27 @@ export function stoppedByName(data, messageId, viewerId) {
|
|
|
73
73
|
export function awaitsAgent(prompt) {
|
|
74
74
|
return !prompt.no_reply;
|
|
75
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* The user messages the viewer may edit and rewind to: their own, with no
|
|
78
|
+
* other person's message after it (a rewind deletes everything after the
|
|
79
|
+
* target). An agent's message, or one with no recorded author, belongs to the
|
|
80
|
+
* thread's starter and never blocks a later rewind. The server applies the same
|
|
81
|
+
* rule (`rewind-authority.ts`). Null with no viewer id: nothing to filter on.
|
|
82
|
+
*/
|
|
83
|
+
export function rewindableMessageIds(messageIds, authors, viewerId, starterId) {
|
|
84
|
+
if (viewerId === undefined)
|
|
85
|
+
return null;
|
|
86
|
+
const allowed = new Set();
|
|
87
|
+
for (let i = messageIds.length - 1; i >= 0; i--) {
|
|
88
|
+
const author = authors.get(messageIds[i]);
|
|
89
|
+
if (author?.kind === 'member') {
|
|
90
|
+
if (author.user_id !== viewerId)
|
|
91
|
+
break;
|
|
92
|
+
allowed.add(messageIds[i]);
|
|
93
|
+
}
|
|
94
|
+
else if (!starterId || starterId === viewerId) {
|
|
95
|
+
allowed.add(messageIds[i]);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return allowed;
|
|
99
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* A message body's type: the app's default `text-sm` at 500. A row's markdown
|
|
4
|
+
* answer is set to `text-sm` too (`MessageRow`'s body), so a prompt, its answer
|
|
5
|
+
* and the channel row of the same prompt read at one size and weight. The 600
|
|
6
|
+
* name above it, at the same size, carries the row's hierarchy.
|
|
7
|
+
*/
|
|
8
|
+
export declare const MESSAGE_TEXT_CLASS = "text-foreground text-sm leading-relaxed font-medium";
|
|
9
|
+
/**
|
|
10
|
+
* One message in a channel or a thread: the author's 36px avatar in a fixed
|
|
11
|
+
* gutter, the name and the time on one baseline, the body under them. The
|
|
12
|
+
* channel timeline and the thread panel draw every row with it, so a reply
|
|
13
|
+
* reads the same as the message it answers.
|
|
14
|
+
*
|
|
15
|
+
* A `compact` row continues the author's previous message: no avatar, no
|
|
16
|
+
* name. Its time shows in the gutter on hover, inside the gutter's own width,
|
|
17
|
+
* so it never touches the body.
|
|
18
|
+
*
|
|
19
|
+
* The hover fill is instant: a dense list re-hovers too often to animate.
|
|
20
|
+
*/
|
|
21
|
+
export declare function MessageRow({ avatar, name, time, compact, selected, toolbar, className, children, }: {
|
|
22
|
+
/** The 36px avatar: `UserAvatar size="lg"` for a person, `EntityAvatar size="lg"` for an agent. */
|
|
23
|
+
avatar?: ReactNode;
|
|
24
|
+
name?: ReactNode;
|
|
25
|
+
/** `label` beside the name; `gutter` (a shorter form) in a compact row's gutter; `title`, the full date, in the hover hint. */
|
|
26
|
+
time?: {
|
|
27
|
+
iso: string;
|
|
28
|
+
label: string;
|
|
29
|
+
gutter?: string;
|
|
30
|
+
title: string;
|
|
31
|
+
} | null;
|
|
32
|
+
compact?: boolean;
|
|
33
|
+
selected?: boolean;
|
|
34
|
+
/** The row's actions, floating at its top-right on hover or keyboard focus. */
|
|
35
|
+
toolbar?: ReactNode;
|
|
36
|
+
className?: string;
|
|
37
|
+
children?: ReactNode;
|
|
38
|
+
}): import("react").JSX.Element;
|
|
39
|
+
/**
|
|
40
|
+
* The floating action group at a row's top-right. Transparent, not unmounted,
|
|
41
|
+
* so Tab reaches its buttons and their focus reveals it. `p-[2px]`: the group
|
|
42
|
+
* is `rounded-lg` (10px), so 2px of inset gives the `rounded-md` (8px)
|
|
43
|
+
* buttons concentric corners. Its buttons are `icon-sm` (h-7), so the group is
|
|
44
|
+
* ~32px tall; `-top-3.5` sits it on the row's top edge, half above it.
|
|
45
|
+
*
|
|
46
|
+
* A thread's first message is the one row whose overhang is cut off (its turn
|
|
47
|
+
* paints with `content-visibility: auto`, which clips to the turn): that row
|
|
48
|
+
* moves the group inside with `[&_[data-slot=row-toolbar]]:top-0.5`.
|
|
49
|
+
*/
|
|
50
|
+
export declare function RowToolbar({ children }: {
|
|
51
|
+
children: ReactNode;
|
|
52
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { cn } from '../../lib/utils.js';
|
|
4
|
+
import Hint from '../../primitives/hint.js';
|
|
5
|
+
/**
|
|
6
|
+
* A message body's type: the app's default `text-sm` at 500. A row's markdown
|
|
7
|
+
* answer is set to `text-sm` too (`MessageRow`'s body), so a prompt, its answer
|
|
8
|
+
* and the channel row of the same prompt read at one size and weight. The 600
|
|
9
|
+
* name above it, at the same size, carries the row's hierarchy.
|
|
10
|
+
*/
|
|
11
|
+
export const MESSAGE_TEXT_CLASS = 'text-foreground text-sm leading-relaxed font-medium';
|
|
12
|
+
/**
|
|
13
|
+
* One message in a channel or a thread: the author's 36px avatar in a fixed
|
|
14
|
+
* gutter, the name and the time on one baseline, the body under them. The
|
|
15
|
+
* channel timeline and the thread panel draw every row with it, so a reply
|
|
16
|
+
* reads the same as the message it answers.
|
|
17
|
+
*
|
|
18
|
+
* A `compact` row continues the author's previous message: no avatar, no
|
|
19
|
+
* name. Its time shows in the gutter on hover, inside the gutter's own width,
|
|
20
|
+
* so it never touches the body.
|
|
21
|
+
*
|
|
22
|
+
* The hover fill is instant: a dense list re-hovers too often to animate.
|
|
23
|
+
*/
|
|
24
|
+
export function MessageRow({ avatar, name, time, compact = false, selected = false, toolbar, className, children, }) {
|
|
25
|
+
return (_jsxs("div", { "data-slot": "message-row", className: cn('group/message hover:bg-hover relative flex gap-2 px-5',
|
|
26
|
+
// Baseline: a compact row's gutter time sits on the body's first line.
|
|
27
|
+
compact ? 'items-baseline py-0.5' : 'items-start pt-2 pb-1.5', selected && 'bg-active hover:bg-active', className), children: [_jsx("div", { className: "w-10 shrink-0 [&_[data-slot=avatar]]:rounded-md [&_[data-slot=avatar]]:after:hidden", children: compact ? (time ? (_jsx(Hint, { label: time.title, side: "top", sideOffset: 6, children: _jsx("time", { dateTime: time.iso, className: "text-muted-foreground invisible block cursor-default text-right text-xs font-normal whitespace-nowrap tabular-nums group-focus-within/message:visible group-hover/message:visible", children: time.gutter ?? time.label }) })) : null) : (avatar) }), _jsxs("div", { className: "min-w-0 flex-1 [&_.kortix-markdown]:text-sm", children: [compact ? null : (_jsxs("div", { className: "flex min-w-0 items-baseline gap-2", children: [_jsx("span", { className: "text-foreground truncate text-sm font-semibold", children: name }), time ? (
|
|
28
|
+
// The full date in the app's tooltip, not the browser's `title`.
|
|
29
|
+
_jsx(Hint, { label: time.title, side: "top", sideOffset: 6, children: _jsx("time", { dateTime: time.iso, className: "text-muted-foreground shrink-0 cursor-default text-xs font-normal tabular-nums", children: time.label }) })) : null] })), children] }), toolbar ? _jsx(RowToolbar, { children: toolbar }) : null] }));
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* The floating action group at a row's top-right. Transparent, not unmounted,
|
|
33
|
+
* so Tab reaches its buttons and their focus reveals it. `p-[2px]`: the group
|
|
34
|
+
* is `rounded-lg` (10px), so 2px of inset gives the `rounded-md` (8px)
|
|
35
|
+
* buttons concentric corners. Its buttons are `icon-sm` (h-7), so the group is
|
|
36
|
+
* ~32px tall; `-top-3.5` sits it on the row's top edge, half above it.
|
|
37
|
+
*
|
|
38
|
+
* A thread's first message is the one row whose overhang is cut off (its turn
|
|
39
|
+
* paints with `content-visibility: auto`, which clips to the turn): that row
|
|
40
|
+
* moves the group inside with `[&_[data-slot=row-toolbar]]:top-0.5`.
|
|
41
|
+
*/
|
|
42
|
+
export function RowToolbar({ children }) {
|
|
43
|
+
return (_jsx("div", { "data-slot": "row-toolbar", className: "bg-popover pointer-events-none absolute -top-3.5 right-5 z-10 flex items-center rounded-lg border p-[2px] opacity-0 shadow-md group-focus-within/message:pointer-events-auto group-focus-within/message:opacity-100 group-hover/message:pointer-events-auto group-hover/message:opacity-100 has-[[data-state=open]]:pointer-events-auto has-[[data-state=open]]:opacity-100", children: children }));
|
|
44
|
+
}
|
|
@@ -20,13 +20,14 @@
|
|
|
20
20
|
* is live, and `chatPlanAnchorId` turns this whole module off for the other.
|
|
21
21
|
* See `action-panel/easy/plan-card.tsx`.
|
|
22
22
|
*
|
|
23
|
-
* No React import.
|
|
23
|
+
* No React import.
|
|
24
24
|
*/
|
|
25
25
|
import { type SessionLogTurn } from '@kortix/sdk';
|
|
26
26
|
/**
|
|
27
27
|
* A tool call that writes the plan. The runtime emits more than one spelling
|
|
28
28
|
* (`todowrite`, `todo_write`); `toolKind` owns them. The todo READ shares the
|
|
29
29
|
* kind and never renders (`shouldShowToolPart`), so it is not a plan write.
|
|
30
|
+
* @deprecated Renders an OpenCode-only tool or todo list in an OpenCode session (pi has none). OpenCode is sunset (2026-10-23): no new code; delete with OpenCode.
|
|
30
31
|
*/
|
|
31
32
|
export declare function isPlanWriteTool(tool: string): boolean;
|
|
32
33
|
/**
|
|
@@ -80,6 +81,7 @@ export interface PlanSurfaceState {
|
|
|
80
81
|
* whether the panel is OPEN deliberately does not enter into it. */
|
|
81
82
|
isMobile: boolean;
|
|
82
83
|
}
|
|
84
|
+
/** @deprecated Renders an OpenCode-only tool or todo list in an OpenCode session (pi has none). OpenCode is sunset (2026-10-23): no new code; delete with OpenCode. */
|
|
83
85
|
export declare function planBelongsToChat(state: PlanSurfaceState): boolean;
|
|
84
86
|
/**
|
|
85
87
|
* The anchor the CHAT should use — which is "none" unless the chat is the
|
|
@@ -88,5 +90,6 @@ export declare function planBelongsToChat(state: PlanSurfaceState): boolean;
|
|
|
88
90
|
* The gate wraps the lookup rather than sitting beside it: returning `null` (which matches no message id) means every `ownsPlan`
|
|
89
91
|
* downstream, including the user bubble's own column cap, falls out of ONE
|
|
90
92
|
* decision instead of two that can disagree.
|
|
93
|
+
* @deprecated Renders an OpenCode-only tool or todo list in an OpenCode session (pi has none). OpenCode is sunset (2026-10-23): no new code; delete with OpenCode.
|
|
91
94
|
*/
|
|
92
95
|
export declare function chatPlanAnchorId(turns: ReadonlyArray<Pick<SessionLogTurn, 'id' | 'plan'>> | null | undefined, chatOwnsPlan: boolean): string | null;
|
|
@@ -20,13 +20,14 @@
|
|
|
20
20
|
* is live, and `chatPlanAnchorId` turns this whole module off for the other.
|
|
21
21
|
* See `action-panel/easy/plan-card.tsx`.
|
|
22
22
|
*
|
|
23
|
-
* No React import.
|
|
23
|
+
* No React import.
|
|
24
24
|
*/
|
|
25
25
|
import { shouldShowToolPart, toolKind } from '@kortix/sdk';
|
|
26
26
|
/**
|
|
27
27
|
* A tool call that writes the plan. The runtime emits more than one spelling
|
|
28
28
|
* (`todowrite`, `todo_write`); `toolKind` owns them. The todo READ shares the
|
|
29
29
|
* kind and never renders (`shouldShowToolPart`), so it is not a plan write.
|
|
30
|
+
* @deprecated Renders an OpenCode-only tool or todo list in an OpenCode session (pi has none). OpenCode is sunset (2026-10-23): no new code; delete with OpenCode.
|
|
30
31
|
*/
|
|
31
32
|
export function isPlanWriteTool(tool) {
|
|
32
33
|
return toolKind(tool) === 'todowrite' && shouldShowToolPart({ tool });
|
|
@@ -41,6 +42,7 @@ export function isPlanWriteTool(tool) {
|
|
|
41
42
|
export function planAnchorMessageId(turns) {
|
|
42
43
|
return turns.find((turn) => turn.plan)?.id ?? null;
|
|
43
44
|
}
|
|
45
|
+
/** @deprecated Renders an OpenCode-only tool or todo list in an OpenCode session (pi has none). OpenCode is sunset (2026-10-23): no new code; delete with OpenCode. */
|
|
44
46
|
export function planBelongsToChat(state) {
|
|
45
47
|
return state.isMobile;
|
|
46
48
|
}
|
|
@@ -51,6 +53,7 @@ export function planBelongsToChat(state) {
|
|
|
51
53
|
* The gate wraps the lookup rather than sitting beside it: returning `null` (which matches no message id) means every `ownsPlan`
|
|
52
54
|
* downstream, including the user bubble's own column cap, falls out of ONE
|
|
53
55
|
* decision instead of two that can disagree.
|
|
56
|
+
* @deprecated Renders an OpenCode-only tool or todo list in an OpenCode session (pi has none). OpenCode is sunset (2026-10-23): no new code; delete with OpenCode.
|
|
54
57
|
*/
|
|
55
58
|
export function chatPlanAnchorId(turns, chatOwnsPlan) {
|
|
56
59
|
if (!chatOwnsPlan || !turns)
|
|
@@ -28,6 +28,7 @@ export declare function planRingState(done: number, total: number, running: bool
|
|
|
28
28
|
* ticks are precise but need counting, a pie is instant but coarse. Together
|
|
29
29
|
* the glyph answers "roughly how far?" at a glance and "exactly how far?" on a
|
|
30
30
|
* second look — at 18px, where a single encoding would have to pick one.
|
|
31
|
+
* @deprecated Renders an OpenCode-only tool or todo list in an OpenCode session (pi has none). OpenCode is sunset (2026-10-23): no new code; delete with OpenCode.
|
|
31
32
|
*/
|
|
32
33
|
export declare function PlanRing({ done, total, running, className, }: {
|
|
33
34
|
done: number;
|
|
@@ -43,8 +44,10 @@ export declare function PlanRing({ done, total, running, className, }: {
|
|
|
43
44
|
* when a plan sits under it, and `ownsPlan` alone is not that answer: the anchor
|
|
44
45
|
* falls back to the last turn when no turn ever wrote todos, so a session with
|
|
45
46
|
* zero todos still nominates an owner.
|
|
47
|
+
* @deprecated Renders an OpenCode-only tool or todo list in an OpenCode session (pi has none). OpenCode is sunset (2026-10-23): no new code; delete with OpenCode.
|
|
46
48
|
*/
|
|
47
49
|
export declare function useHasPlan(sessionId: string): boolean;
|
|
50
|
+
/** @deprecated Renders an OpenCode-only tool or todo list in an OpenCode session (pi has none). OpenCode is sunset (2026-10-23): no new code; delete with OpenCode. */
|
|
48
51
|
export declare function planSummary(todos: ReadonlyArray<{
|
|
49
52
|
status: string;
|
|
50
53
|
content: string;
|
|
@@ -71,6 +74,7 @@ export declare function planSummary(todos: ReadonlyArray<{
|
|
|
71
74
|
* Filtering AFTER `keyTodos` is deliberate. Keying first means the surviving
|
|
72
75
|
* rows keep the keys they had while the running row was present, so React's
|
|
73
76
|
* state stays attached to a row as the agent advances past it.
|
|
77
|
+
* @deprecated Renders an OpenCode-only tool or todo list in an OpenCode session (pi has none). OpenCode is sunset (2026-10-23): no new code; delete with OpenCode.
|
|
74
78
|
*/
|
|
75
79
|
export declare function planListTodos(keyed: ReadonlyArray<{
|
|
76
80
|
todo: TodoItem;
|
|
@@ -84,11 +88,13 @@ export declare function planListTodos(keyed: ReadonlyArray<{
|
|
|
84
88
|
* repeats a line often enough ("Run the tests" twice) that keying on it alone
|
|
85
89
|
* collides. An occurrence counter disambiguates the repeat, which keeps React's
|
|
86
90
|
* state attached to the row rather than to its position.
|
|
91
|
+
* @deprecated Renders an OpenCode-only tool or todo list in an OpenCode session (pi has none). OpenCode is sunset (2026-10-23): no new code; delete with OpenCode.
|
|
87
92
|
*/
|
|
88
93
|
export declare function keyTodos(todos: ReadonlyArray<TodoItem>): Array<{
|
|
89
94
|
todo: TodoItem;
|
|
90
95
|
key: string;
|
|
91
96
|
}>;
|
|
97
|
+
/** @deprecated Renders an OpenCode-only tool or todo list in an OpenCode session (pi has none). OpenCode is sunset (2026-10-23): no new code; delete with OpenCode. */
|
|
92
98
|
export declare function PlanCard({ sessionId }: {
|
|
93
99
|
sessionId: string;
|
|
94
100
|
}): import("react").JSX.Element | null;
|
|
@@ -103,6 +109,7 @@ export declare function PlanCard({ sessionId }: {
|
|
|
103
109
|
*
|
|
104
110
|
* Takes rows already keyed and filtered (`planListTodos(keyTodos(todos))`) —
|
|
105
111
|
* the caller decides what the list is; this decides what it looks like.
|
|
112
|
+
* @deprecated Renders an OpenCode-only tool or todo list in an OpenCode session (pi has none). OpenCode is sunset (2026-10-23): no new code; delete with OpenCode.
|
|
106
113
|
*/
|
|
107
114
|
export declare function PlanSteps({ rows, className, }: {
|
|
108
115
|
rows: ReadonlyArray<{
|
|
@@ -200,6 +200,7 @@ const RING_TONE = {
|
|
|
200
200
|
* ticks are precise but need counting, a pie is instant but coarse. Together
|
|
201
201
|
* the glyph answers "roughly how far?" at a glance and "exactly how far?" on a
|
|
202
202
|
* second look — at 18px, where a single encoding would have to pick one.
|
|
203
|
+
* @deprecated Renders an OpenCode-only tool or todo list in an OpenCode session (pi has none). OpenCode is sunset (2026-10-23): no new code; delete with OpenCode.
|
|
203
204
|
*/
|
|
204
205
|
export function PlanRing({ done, total, running, className, }) {
|
|
205
206
|
const tI18nComplete = useTranslations('hardcodedUi.i18nComplete');
|
|
@@ -221,11 +222,13 @@ export function PlanRing({ done, total, running, className, }) {
|
|
|
221
222
|
* when a plan sits under it, and `ownsPlan` alone is not that answer: the anchor
|
|
222
223
|
* falls back to the last turn when no turn ever wrote todos, so a session with
|
|
223
224
|
* zero todos still nominates an owner.
|
|
225
|
+
* @deprecated Renders an OpenCode-only tool or todo list in an OpenCode session (pi has none). OpenCode is sunset (2026-10-23): no new code; delete with OpenCode.
|
|
224
226
|
*/
|
|
225
227
|
export function useHasPlan(sessionId) {
|
|
226
228
|
const { data } = useRuntimeSessionTodo(sessionId);
|
|
227
229
|
return parseTodos(data).length > 0;
|
|
228
230
|
}
|
|
231
|
+
/** @deprecated Renders an OpenCode-only tool or todo list in an OpenCode session (pi has none). OpenCode is sunset (2026-10-23): no new code; delete with OpenCode. */
|
|
229
232
|
export function planSummary(todos) {
|
|
230
233
|
const total = todos.length;
|
|
231
234
|
const done = todos.filter((todo) => todo.status === 'completed').length;
|
|
@@ -255,6 +258,7 @@ export function planSummary(todos) {
|
|
|
255
258
|
* Filtering AFTER `keyTodos` is deliberate. Keying first means the surviving
|
|
256
259
|
* rows keep the keys they had while the running row was present, so React's
|
|
257
260
|
* state stays attached to a row as the agent advances past it.
|
|
261
|
+
* @deprecated Renders an OpenCode-only tool or todo list in an OpenCode session (pi has none). OpenCode is sunset (2026-10-23): no new code; delete with OpenCode.
|
|
258
262
|
*/
|
|
259
263
|
export function planListTodos(keyed) {
|
|
260
264
|
return keyed.filter(({ todo }) => todo.status !== 'in_progress');
|
|
@@ -264,6 +268,7 @@ export function planListTodos(keyed) {
|
|
|
264
268
|
* repeats a line often enough ("Run the tests" twice) that keying on it alone
|
|
265
269
|
* collides. An occurrence counter disambiguates the repeat, which keeps React's
|
|
266
270
|
* state attached to the row rather than to its position.
|
|
271
|
+
* @deprecated Renders an OpenCode-only tool or todo list in an OpenCode session (pi has none). OpenCode is sunset (2026-10-23): no new code; delete with OpenCode.
|
|
267
272
|
*/
|
|
268
273
|
export function keyTodos(todos) {
|
|
269
274
|
const seen = new Map();
|
|
@@ -273,6 +278,7 @@ export function keyTodos(todos) {
|
|
|
273
278
|
return { todo, key: n === 0 ? todo.content : `${todo.content}#${n}` };
|
|
274
279
|
});
|
|
275
280
|
}
|
|
281
|
+
/** @deprecated Renders an OpenCode-only tool or todo list in an OpenCode session (pi has none). OpenCode is sunset (2026-10-23): no new code; delete with OpenCode. */
|
|
276
282
|
export function PlanCard({ sessionId }) {
|
|
277
283
|
const tI18nComplete = useTranslations('hardcodedUi.i18nComplete');
|
|
278
284
|
const { data } = useRuntimeSessionTodo(sessionId);
|
|
@@ -306,6 +312,7 @@ export function PlanCard({ sessionId }) {
|
|
|
306
312
|
*
|
|
307
313
|
* Takes rows already keyed and filtered (`planListTodos(keyTodos(todos))`) —
|
|
308
314
|
* the caller decides what the list is; this decides what it looks like.
|
|
315
|
+
* @deprecated Renders an OpenCode-only tool or todo list in an OpenCode session (pi has none). OpenCode is sunset (2026-10-23): no new code; delete with OpenCode.
|
|
309
316
|
*/
|
|
310
317
|
export function PlanSteps({ rows, className, }) {
|
|
311
318
|
return (
|
|
@@ -248,7 +248,13 @@ export declare function UserMessageBubble({ canExpand, expanded, onToggle, fullW
|
|
|
248
248
|
* Shared with `OptimisticTurn` so the pending turn and the server turn cannot
|
|
249
249
|
* drift — the same reason `MessageAttachments` is shared.
|
|
250
250
|
*/
|
|
251
|
-
export declare function UserMessageActions({ timestamp, copyText, messageId, rewindPromptText, onRewind, rewindDisabled, deliveryStatus, }: {
|
|
251
|
+
export declare function UserMessageActions({ timestamp, copyText, messageId, rewindPromptText, onRewind, rewindDisabled, deliveryStatus, toolbar, }: {
|
|
252
|
+
/**
|
|
253
|
+
* A message row (`TranscriptRowsContext`): the row's header shows the time,
|
|
254
|
+
* so the buttons float in its toolbar and only the delivery status stays in
|
|
255
|
+
* the flow.
|
|
256
|
+
*/
|
|
257
|
+
toolbar?: boolean;
|
|
252
258
|
/** Epoch milliseconds, or `null` when the backend never stamped one. */
|
|
253
259
|
timestamp: number | null;
|
|
254
260
|
/** Omitted when there is nothing to copy — the row then carries meta alone
|
|
@@ -6,13 +6,15 @@ import { getFileCategory } from '../../files/viewer/preview-policy.js';
|
|
|
6
6
|
import { uiRoutes } from '../../lib/routes.js';
|
|
7
7
|
import { MessageSenderAbove } from '../participants/session-participants.js';
|
|
8
8
|
import { MessageAuthorLabel } from './message-author-label.js';
|
|
9
|
+
import { MESSAGE_TEXT_CLASS, RowToolbar } from './message-row.js';
|
|
10
|
+
import { TranscriptRowsContext } from '../thread/transcript-rows.js';
|
|
9
11
|
import { errorToast } from '../../primitives/toast.js';
|
|
10
12
|
import { fetchSessionAttachment, isSessionAttachmentRef, } from '@kortix/sdk';
|
|
11
13
|
/** Moved from session-chat.tsx (`UserMessageRow`) so the turn module owns the
|
|
12
14
|
* user-message card. Full-width card, no reference chips. */
|
|
13
15
|
import { useTranslations } from '../../i18n/index.js';
|
|
14
16
|
import { expandPastedContent, neutralizePastedTags, sanitizePromptUploadFilename, serializePromptWithPastes, splitPastedContent, } from '../../_vendor/kortix-shared.js';
|
|
15
|
-
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
17
|
+
import { useContext, useEffect, useMemo, useRef, useState } from 'react';
|
|
16
18
|
import { PencilSimpleIcon, AlarmIcon, ChatsTeardropIcon, LightningIcon, } from '@phosphor-icons/react';
|
|
17
19
|
import { CopyButton } from '../../markdown/copy-button.js';
|
|
18
20
|
import { HoverPrefetchLink } from '../../internal/components/hover-prefetch-link.js';
|
|
@@ -672,7 +674,7 @@ export function UserMessageBubble({ canExpand, expanded, onToggle, fullWidth, te
|
|
|
672
674
|
* Shared with `OptimisticTurn` so the pending turn and the server turn cannot
|
|
673
675
|
* drift — the same reason `MessageAttachments` is shared.
|
|
674
676
|
*/
|
|
675
|
-
export function UserMessageActions({ timestamp, copyText, messageId, rewindPromptText, onRewind, rewindDisabled, deliveryStatus, }) {
|
|
677
|
+
export function UserMessageActions({ timestamp, copyText, messageId, rewindPromptText, onRewind, rewindDisabled, deliveryStatus, toolbar = false, }) {
|
|
676
678
|
const tI18nComplete = useTranslations('hardcodedUi.i18nComplete');
|
|
677
679
|
// Copy stays available while the agent is busy / rewind is locked.
|
|
678
680
|
// Only edit-from-here is gated — hiding the whole bar was wrong.
|
|
@@ -681,6 +683,15 @@ export function UserMessageActions({ timestamp, copyText, messageId, rewindPromp
|
|
|
681
683
|
// Nothing to say and nothing to do — don't leave an empty row behind.
|
|
682
684
|
if (!hasMeta && !copyText && !deliveryStatus)
|
|
683
685
|
return null;
|
|
686
|
+
const buttons = copyText ? (_jsxs("div", { className: "flex shrink-0 items-center gap-0.5", children: [canRewind && (_jsx(Hint, { label: tI18nComplete.raw('textc72e5d059e24'), side: "top", align: "center", children: _jsx(Button, { type: "button", variant: "ghost", size: toolbar ? 'icon-sm' : 'icon-xs',
|
|
687
|
+
// 24px visible, 40px target — grown with a pseudo-element so the
|
|
688
|
+
// dense action row keeps its rhythm.
|
|
689
|
+
className: toolbar ? undefined : 'hit-area-2', "aria-label": tI18nComplete.raw('text673d6a594efa'), onClick: () => onRewind?.(messageId, rewindPromptText ?? ''), children: _jsx(PencilSimpleIcon, { weight: "regular", className: cn('text-foreground', toolbar ? 'size-3.5' : 'size-4') }) }) })), _jsx(CopyButton, { code: copyText, size: toolbar ? 'md' : 'sm',
|
|
690
|
+
// In a row's toolbar every glyph is 14px (`size-3.5`), the channel row's too.
|
|
691
|
+
className: toolbar ? 'focus-visible:ring-ring focus-visible:ring-2 [&_svg]:size-3.5!' : undefined, hintSide: "top", label: tI18nComplete.raw('texte21f935f11d7') })] })) : null;
|
|
692
|
+
if (toolbar) {
|
|
693
|
+
return (_jsxs(_Fragment, { children: [deliveryStatus, buttons ? _jsx(RowToolbar, { children: buttons }) : null] }));
|
|
694
|
+
}
|
|
684
695
|
return (
|
|
685
696
|
// The fade sits on the ROW, so the timestamp and the buttons reveal
|
|
686
697
|
// together as one object rather than a label with controls growing out of
|
|
@@ -710,10 +721,7 @@ export function UserMessageActions({ timestamp, copyText, messageId, rewindPromp
|
|
|
710
721
|
// counterpart. The two `opacity-100` variants it sits beside
|
|
711
722
|
// agree with it, so no ordering assumption is being made and the
|
|
712
723
|
// desktop string is unchanged.
|
|
713
|
-
'opacity-0 group-hover/turn:opacity-100 focus-within:opacity-100 max-md:opacity-100'), children: [hasMeta && (_jsx(InlineMeta, { children: timestamp !== null && _jsx(MessageTimeLabel, { timestamp: timestamp }) })),
|
|
714
|
-
// 24px visible, 40px target — grown with a pseudo-element so the
|
|
715
|
-
// dense action row keeps its rhythm.
|
|
716
|
-
className: "hit-area-2", "aria-label": tI18nComplete.raw('text673d6a594efa'), onClick: () => onRewind?.(messageId, rewindPromptText ?? ''), children: _jsx(PencilSimpleIcon, { weight: "regular", className: "text-foreground size-4" }) }) })), _jsx(CopyButton, { code: copyText, size: "sm", hintSide: "top", label: tI18nComplete.raw('texte21f935f11d7') })] }))] }), deliveryStatus] }));
|
|
724
|
+
'opacity-0 group-hover/turn:opacity-100 focus-within:opacity-100 max-md:opacity-100'), children: [hasMeta && (_jsx(InlineMeta, { children: timestamp !== null && _jsx(MessageTimeLabel, { timestamp: timestamp }) })), buttons] }), deliveryStatus] }));
|
|
717
725
|
}
|
|
718
726
|
// ============================================================================
|
|
719
727
|
// Inline edit-from-here editor
|
|
@@ -908,7 +916,8 @@ export function UserMessage({ message, author, showAuthor, agentNames, commandIn
|
|
|
908
916
|
// `copyText` is gated on `onRewind` to keep the buttons exactly as they were:
|
|
909
917
|
// a read-only turn shows no controls. The row itself still renders, because
|
|
910
918
|
// the timestamp is meta, not a control, and should not vanish with them.
|
|
911
|
-
const
|
|
919
|
+
const rows = useContext(TranscriptRowsContext) !== null;
|
|
920
|
+
const actions = (_jsx(UserMessageActions, { toolbar: rows, timestamp: Number.isFinite(createdAt) && createdAt > 0 ? createdAt : null, copyText: copyText && onRewind ? copyText : undefined, messageId: message.message_id, rewindPromptText: rewindPromptText, onRewind: onRewind, rewindDisabled: rewindDisabled, deliveryStatus: deliveryStatus }));
|
|
912
921
|
const [expanded, setExpanded] = useState(false);
|
|
913
922
|
const [canExpand, setCanExpand] = useState(false);
|
|
914
923
|
const textRef = useRef(null);
|
|
@@ -1074,6 +1083,11 @@ export function UserMessage({ message, author, showAuthor, agentNames, commandIn
|
|
|
1074
1083
|
// branch returned before the main path — silently dropped the message's
|
|
1075
1084
|
// attachments. A command is now just a message whose first token is a chip,
|
|
1076
1085
|
// so it falls through to the one bubble below.
|
|
1086
|
+
// A message row: the row draws the author and the time, so the message is
|
|
1087
|
+
// its text, left-aligned and unboxed, with its files under it.
|
|
1088
|
+
if (rows) {
|
|
1089
|
+
return (_jsxs("div", { className: "flex w-full min-w-0 flex-col items-start gap-1.5", children: [(bodyText || quotedPieces || effectiveCommandInfo) && (_jsx("div", { className: cn(MESSAGE_TEXT_CLASS, 'w-full min-w-0 whitespace-pre-wrap wrap-anywhere select-text'), children: quotedPieces ? (_jsx(QuotedMessageBody, { pieces: quotedPieces, renderText: renderQuotedRun })) : (_jsxs(_Fragment, { children: [commandLead, renderSegments(segments)] })) })), (allAttachments.length > 0 || uploadStatus?.state === 'failed') && (_jsx(MessageAttachments, { attachments: allAttachments, status: uploadStatus, onOpenPastedContent: onOpenPastedContent })), systemNotifications.length > 0 && !effectiveCommandInfo && (_jsx("div", { className: "flex w-full flex-col gap-1.5", children: withContentKeys(systemNotifications, (n) => `mixed-${n.tag}`).map(({ key, item }) => (_jsx(SystemNotificationCard, { notification: item }, key))) })), actions] }));
|
|
1090
|
+
}
|
|
1077
1091
|
return (
|
|
1078
1092
|
// The whole message is ONE right-aligned column capped at 80%, so the
|
|
1079
1093
|
// bubble, its attachments and its actions all hang off the same rail and
|