@kortix/ui 0.14.11 → 0.14.13
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 +1 -1
- package/dist/_vendor/kortix-shared.js +521 -7045
- package/dist/_vendor/shared/app-config.d.ts +8 -0
- package/dist/_vendor/shared/artifact-annotations.d.ts +708 -0
- package/dist/_vendor/shared/artifact-comments.d.ts +327 -0
- package/dist/_vendor/shared/index.d.ts +3 -1
- package/dist/_vendor/shared/my-kortix-agent.d.ts +40 -0
- package/dist/_vendor/shared/peer-message-prompt.d.ts +35 -0
- package/dist/_vendor/shared/pixel-mark.d.ts +11 -0
- package/dist/_vendor/shared/prompt-attachments.d.ts +1 -0
- package/dist/_vendor/shared/reminder-prompt.d.ts +8 -2
- package/dist/_vendor/shared/runtime-versions.d.ts +8 -0
- package/dist/artifacts/artifact-frame.d.ts +1 -0
- package/dist/artifacts/artifact-frame.js +18 -5
- package/dist/artifacts/frame-policy.d.ts +1 -1
- package/dist/artifacts/frame-policy.js +10 -5
- package/dist/browser/browser-panel.d.ts +2 -1
- package/dist/browser/browser-panel.js +12 -2
- package/dist/customize/agents/agent-access-text.d.ts +16 -0
- package/dist/customize/agents/agent-access-text.js +54 -0
- package/dist/customize/agents/agent-approval-rules.d.ts +8 -0
- package/dist/customize/agents/agent-approval-rules.js +26 -0
- package/dist/customize/agents/agent-authority-card.js +4 -1
- package/dist/customize/agents/agent-cover-card.d.ts +4 -1
- package/dist/customize/agents/agent-cover-card.js +2 -2
- package/dist/customize/agents/agent-detail-aside.d.ts +1 -2
- package/dist/customize/agents/agent-detail-aside.js +8 -11
- package/dist/customize/agents/agent-drives-section.d.ts +23 -7
- package/dist/customize/agents/agent-drives-section.js +107 -41
- package/dist/customize/agents/agent-instructions.d.ts +11 -0
- package/dist/customize/agents/agent-instructions.js +114 -0
- package/dist/customize/agents/agent-model-view.d.ts +17 -0
- package/dist/customize/agents/agent-model-view.js +67 -0
- package/dist/customize/agents/agent-overview.d.ts +53 -0
- package/dist/customize/agents/agent-overview.js +242 -0
- package/dist/customize/agents/agent-page-chrome.d.ts +128 -0
- package/dist/customize/agents/agent-page-chrome.js +145 -0
- package/dist/customize/agents/agent-page.d.ts +13 -1
- package/dist/customize/agents/agent-page.js +478 -367
- package/dist/customize/agents/agent-pin-button.d.ts +10 -0
- package/dist/customize/agents/agent-pin-button.js +20 -0
- package/dist/customize/agents/agent-policy-sets-section.d.ts +16 -0
- package/dist/customize/agents/agent-policy-sets-section.js +80 -0
- package/dist/customize/agents/agent-policy-sets.js +1 -1
- package/dist/customize/agents/agent-section-rail.d.ts +21 -0
- package/dist/customize/agents/agent-section-rail.js +23 -0
- package/dist/customize/agents/agent-share-control.d.ts +4 -3
- package/dist/customize/agents/agent-share-control.js +15 -16
- package/dist/customize/agents/{agent-people-section.d.ts → agent-share-dialog.d.ts} +3 -1
- package/dist/customize/agents/{agent-people-section.js → agent-share-dialog.js} +21 -21
- package/dist/customize/agents/agent-tabs.d.ts +95 -0
- package/dist/customize/agents/agent-tabs.js +199 -0
- package/dist/customize/agents/agents-page.d.ts +0 -21
- package/dist/customize/agents/agents-page.js +104 -118
- package/dist/customize/agents/connectors-required.d.ts +16 -0
- package/dist/customize/agents/connectors-required.js +19 -0
- package/dist/customize/agents/create-agent-modal.d.ts +19 -0
- package/dist/customize/agents/create-agent-modal.js +94 -0
- package/dist/customize/connectors/agent-access.d.ts +4 -4
- package/dist/customize/connectors/agent-access.js +7 -10
- package/dist/customize/connectors/connector-identity.d.ts +12 -0
- package/dist/customize/connectors/connector-identity.js +15 -2
- package/dist/customize/connectors/connector-routes.js +2 -2
- package/dist/customize/connectors/connectors-page.d.ts +14 -1
- package/dist/customize/connectors/connectors-page.js +101 -32
- package/dist/customize/connectors/detail/app-page.js +1 -1
- package/dist/customize/connectors/detail/connector-agents.js +0 -3
- package/dist/customize/connectors/detail/connector-page.d.ts +1 -1
- package/dist/customize/connectors/detail/connector-page.js +5 -2
- package/dist/customize/connectors/detail/connector-policy-sets.js +1 -1
- package/dist/customize/connectors/detail/connector-triggers.js +2 -2
- package/dist/customize/connectors/use-agent-access.d.ts +7 -5
- package/dist/customize/connectors/use-agent-access.js +2 -6
- package/dist/customize/models/models-page.d.ts +7 -1
- package/dist/customize/models/models-page.js +2 -2
- package/dist/customize/project-settings/project-admin-sections.d.ts +63 -0
- package/dist/customize/project-settings/project-admin-sections.js +80 -0
- package/dist/customize/project-settings/project-settings-page.d.ts +1 -1
- package/dist/customize/project-settings/project-settings-page.js +4 -13
- package/dist/customize/project-settings/project-settings-sections.d.ts +5 -5
- package/dist/customize/project-settings/project-settings-sections.js +6 -20
- package/dist/customize/providers/provider-accordion.js +29 -17
- package/dist/customize/providers/provider-connect.js +1 -1
- package/dist/customize/providers/provider-sheet.d.ts +4 -1
- package/dist/customize/providers/provider-sheet.js +15 -5
- package/dist/customize/secrets/secrets-page.d.ts +5 -1
- package/dist/customize/secrets/secrets-page.js +2 -2
- package/dist/customize/sections/gateway-view.d.ts +10 -2
- package/dist/customize/sections/gateway-view.js +16 -4
- package/dist/customize/sections/llm-provider/chatgpt-subscription-connect.d.ts +12 -5
- package/dist/customize/sections/llm-provider/chatgpt-subscription-connect.js +131 -8
- package/dist/customize/sections/llm-provider/claude-code-step.d.ts +10 -0
- package/dist/customize/sections/llm-provider/claude-code-step.js +32 -0
- package/dist/customize/sections/llm-provider/models-tab.js +5 -1
- package/dist/customize/sections/view/account-secret-resources-panel.d.ts +5 -3
- package/dist/customize/sections/view/account-secret-resources-panel.js +122 -19
- package/dist/customize/sections/view/agent-editor-access-fields.d.ts +1 -1
- package/dist/customize/sections/view/agent-editor-access-fields.js +8 -4
- package/dist/customize/sections/view/agent-editor-basics-fields.d.ts +4 -1
- package/dist/customize/sections/view/agent-editor-basics-fields.js +33 -4
- package/dist/customize/sections/view/agent-editor-catalog.d.ts +2 -2
- package/dist/customize/sections/view/agent-editor-catalog.js +10 -12
- package/dist/customize/sections/view/agent-editor-primitives.d.ts +1 -1
- package/dist/customize/sections/view/agent-editor-primitives.js +4 -4
- package/dist/customize/sections/view/agent-editor.d.ts +37 -26
- package/dist/customize/sections/view/agent-editor.js +19 -19
- package/dist/customize/sections/view/grant-mode-field.d.ts +8 -20
- package/dist/customize/sections/view/grant-mode-field.js +31 -57
- package/dist/customize/sections/view/permission-editor.d.ts +3 -1
- package/dist/customize/sections/view/permission-editor.js +19 -10
- package/dist/customize/sections/view/review-view.d.ts +8 -0
- package/dist/customize/sections/view/review-view.js +12 -1
- package/dist/customize/sections/view/secret-delivery.js +1 -4
- package/dist/customize/sections/view/secrets-view.d.ts +7 -1
- package/dist/customize/sections/view/secrets-view.js +42 -6
- package/dist/customize/settings/rail.js +2 -8
- package/dist/customize/settings/settings-tabs.d.ts +2 -2
- package/dist/customize/settings/settings-tabs.js +17 -19
- package/dist/customize/settings/tabs/experimental-tab.d.ts +3 -0
- package/dist/customize/settings/tabs/experimental-tab.js +6 -1
- package/dist/customize/settings/tabs/sandbox-tab.d.ts +4 -6
- package/dist/customize/settings/tabs/sandbox-tab.js +9 -9
- package/dist/customize/shared/access-list.d.ts +39 -0
- package/dist/customize/shared/access-list.js +62 -0
- package/dist/customize/shared/agent-resource-scope.d.ts +87 -0
- package/dist/customize/shared/agent-resource-scope.js +123 -0
- package/dist/customize/shared/capability-library.d.ts +41 -0
- package/dist/customize/shared/capability-library.js +271 -0
- package/dist/customize/shared/capability-page-shell.d.ts +18 -1
- package/dist/customize/shared/capability-page-shell.js +21 -1
- package/dist/customize/shared/catalog/catalog-space-tabs.d.ts +14 -0
- package/dist/customize/shared/catalog/catalog-space-tabs.js +20 -0
- package/dist/customize/shared/customize-tab-bar.d.ts +13 -0
- package/dist/customize/shared/customize-tab-bar.js +95 -0
- package/dist/customize/shared/entity/entity-modal.d.ts +17 -1
- package/dist/customize/shared/entity/entity-modal.js +10 -9
- package/dist/customize/shared/leave-guard.d.ts +23 -0
- package/dist/customize/shared/leave-guard.js +87 -0
- package/dist/customize/shared/standalone-settings-nav.js +4 -1
- package/dist/customize/shared/tool-rules.d.ts +11 -0
- package/dist/customize/shared/tool-rules.js +29 -0
- package/dist/customize/skills/builtin-skill-modal.d.ts +6 -0
- package/dist/customize/skills/builtin-skill-modal.js +41 -0
- package/dist/customize/skills/skills-page.d.ts +21 -18
- package/dist/customize/skills/skills-page.js +16 -110
- package/dist/customize/triggers/runtime-triggers.d.ts +17 -0
- package/dist/customize/triggers/runtime-triggers.js +57 -0
- package/dist/customize/triggers/schedule/event-trigger-copy.js +2 -2
- package/dist/customize/triggers/schedule/post-to-field.js +2 -2
- package/dist/customize/triggers/schedule/schedule-copy.d.ts +11 -6
- package/dist/customize/triggers/schedule/schedule-copy.js +29 -8
- package/dist/customize/triggers/schedule/schedule-detail-sheet.js +7 -3
- package/dist/customize/triggers/schedule/trigger-composer-logic.d.ts +26 -1
- package/dist/customize/triggers/schedule/trigger-composer-logic.js +64 -3
- package/dist/customize/triggers/schedule/trigger-composer.js +57 -20
- package/dist/customize/triggers/schedule/trigger-edit-logic.js +18 -5
- package/dist/customize/triggers/schedule/trigger-filter.d.ts +10 -0
- package/dist/customize/triggers/schedule/trigger-filter.js +16 -0
- 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/use-trigger-mutations.d.ts +1 -1
- package/dist/customize/triggers/schedule/use-trigger-mutations.js +1 -1
- package/dist/customize/triggers/schedule/when-app.d.ts +15 -0
- package/dist/customize/triggers/schedule/when-app.js +21 -0
- package/dist/customize/triggers/schedule/when-change-request.d.ts +10 -0
- package/dist/customize/triggers/schedule/when-change-request.js +15 -0
- package/dist/customize/triggers/schedule-view.d.ts +17 -3
- package/dist/customize/triggers/schedule-view.js +46 -16
- package/dist/customize/triggers/triggers-page.d.ts +3 -3
- package/dist/customize/triggers/triggers-page.js +2 -2
- package/dist/customize/use-configure-thread.d.ts +8 -2
- package/dist/customize/use-configure-thread.js +30 -18
- package/dist/files/project/components/change-request-detail-dialog.js +2 -3
- package/dist/files/project/components/drive-explorer.js +6 -5
- package/dist/files/project/explorer-source.d.ts +3 -0
- package/dist/files/project/upload-batch.d.ts +3 -3
- package/dist/files/project/upload-batch.js +7 -6
- package/dist/files/runtime/sandbox-explorer-source.js +3 -3
- package/dist/i18n/en.d.ts +1331 -53
- package/dist/i18n/en.js +1423 -145
- package/dist/i18n/ui-catalog/remaining-ui-translation-keys.generated.js +16 -7
- package/dist/internal/auth/auth-primitives.d.ts +1 -3
- package/dist/internal/auth/auth-primitives.js +2 -2
- package/dist/internal/billing/session-cost-format.d.ts +1 -0
- package/dist/internal/billing/session-cost-format.js +11 -0
- package/dist/internal/components/agent-mark.d.ts +12 -1
- package/dist/internal/components/agent-mark.js +34 -11
- package/dist/internal/components/nav-rail.d.ts +22 -0
- package/dist/internal/components/nav-rail.js +16 -0
- package/dist/internal/components/repository-disconnected.js +2 -2
- package/dist/internal/goals/goal-meta.d.ts +15 -1
- package/dist/internal/goals/goal-meta.js +42 -2
- package/dist/internal/hooks/projects/use-agent-config.d.ts +11 -7
- package/dist/internal/hooks/projects/use-agent-config.js +28 -11
- package/dist/internal/hooks/use-slash-focus.d.ts +7 -1
- package/dist/internal/hooks/use-slash-focus.js +9 -3
- package/dist/internal/layout/project-capability-nav.d.ts +24 -0
- package/dist/internal/layout/project-capability-nav.js +86 -0
- package/dist/internal/layout/project-page-header.d.ts +1 -1
- package/dist/internal/layout/project-page-header.js +1 -1
- package/dist/internal/layout/project-settings-nav.d.ts +3 -2
- package/dist/internal/layout/project-settings-nav.js +5 -3
- package/dist/internal/lib/browser-noise/rules/extensions.js +3 -0
- package/dist/internal/lib/browser-noise/rules/old-browsers.js +1 -1
- package/dist/internal/lib/capability-tab-routes.d.ts +34 -3
- package/dist/internal/lib/capability-tab-routes.js +76 -8
- package/dist/internal/lib/manifest-health.d.ts +10 -0
- package/dist/internal/lib/manifest-health.js +20 -0
- package/dist/internal/lib/pixel-mark.d.ts +4 -1
- package/dist/internal/lib/pixel-mark.js +33 -6
- package/dist/internal/lib/project-actions.d.ts +1 -1
- package/dist/internal/lib/project-actions.js +0 -4
- package/dist/internal/lib/provider-branding.js +2 -0
- package/dist/internal/lib/space-scope.d.ts +29 -0
- package/dist/internal/lib/space-scope.js +28 -0
- package/dist/internal/lib/use-project-feature-flags.js +3 -3
- package/dist/internal/lib/web-notifications.d.ts +74 -8
- package/dist/internal/lib/web-notifications.js +243 -117
- package/dist/internal/notifications/notification-rows.d.ts +14 -7
- package/dist/internal/notifications/notification-rows.js +21 -14
- package/dist/internal/notifications/session-toast-cards.d.ts +2 -2
- package/dist/internal/reminders/reminder-format.d.ts +6 -2
- package/dist/internal/reminders/reminder-format.js +7 -1
- package/dist/internal/stores/active-space-store.d.ts +35 -0
- package/dist/internal/stores/active-space-store.js +29 -0
- package/dist/internal/stores/kortix-computer-store.d.ts +2 -1
- package/dist/internal/stores/kortix-computer-store.js +18 -7
- package/dist/internal/stores/pinned-agents-store.d.ts +26 -0
- package/dist/internal/stores/pinned-agents-store.js +20 -0
- package/dist/internal/stores/session-panel-memory-store.js +3 -0
- package/dist/internal/stores/turn-attention-store.d.ts +5 -4
- package/dist/lib/routes.d.ts +16 -1
- package/dist/lib/routes.js +15 -3
- package/dist/markdown/doc-editor/doc-embed.d.ts +31 -0
- package/dist/markdown/doc-editor/doc-embed.js +168 -0
- package/dist/markdown/doc-editor/doc-extensions.d.ts +26 -0
- package/dist/markdown/doc-editor/doc-extensions.js +149 -0
- package/dist/markdown/doc-editor/doc-menus.d.ts +9 -0
- package/dist/markdown/doc-editor/doc-menus.js +56 -0
- package/dist/markdown/doc-editor/markdown.d.ts +12 -0
- package/dist/markdown/doc-editor/markdown.js +140 -0
- package/dist/markdown/genui/components/inline.d.ts +1 -1
- package/dist/primitives/badge.d.ts +1 -1
- package/dist/primitives/button.d.ts +1 -1
- package/dist/primitives/pixel-kortix-mark.d.ts +5 -4
- package/dist/primitives/pixel-kortix-mark.js +5 -15
- package/dist/primitives/tag.d.ts +1 -1
- package/dist/primitives/textarea.js +14 -0
- package/dist/primitives/toast.d.ts +2 -0
- package/dist/primitives/toast.js +4 -2
- package/dist/providers/ui-provider.d.ts +16 -0
- package/dist/session/actions/session-label.d.ts +1 -1
- package/dist/session/actions/session-label.js +3 -3
- package/dist/session/agents/agent-model.d.ts +92 -0
- package/dist/session/agents/agent-model.js +123 -0
- package/dist/session/agents/agent-state-mark.d.ts +10 -0
- package/dist/session/agents/agent-state-mark.js +22 -0
- package/dist/session/agents/agent-strip.d.ts +58 -0
- package/dist/session/agents/agent-strip.js +259 -0
- package/dist/session/agents/held-messages.d.ts +33 -0
- package/dist/session/agents/held-messages.js +50 -0
- package/dist/session/agents/legacy-subagent-chat.d.ts +11 -0
- package/dist/session/agents/legacy-subagent-chat.js +19 -0
- package/dist/session/agents/session-peek.d.ts +20 -0
- package/dist/session/agents/session-peek.js +67 -0
- package/dist/session/agents/session-prompt.d.ts +13 -0
- package/dist/session/agents/session-prompt.js +18 -0
- package/dist/session/agents/steer-session.d.ts +13 -0
- package/dist/session/agents/steer-session.js +29 -0
- package/dist/session/agents/subagent-dialog-content.d.ts +11 -0
- package/dist/session/agents/subagent-dialog-content.js +115 -0
- package/dist/session/agents/subagent-view.d.ts +8 -0
- package/dist/session/agents/subagent-view.js +18 -0
- package/dist/session/agents/tasks-panel.d.ts +13 -0
- package/dist/session/agents/tasks-panel.js +41 -0
- package/dist/session/agents/workflow-run-controls.d.ts +43 -0
- package/dist/session/agents/workflow-run-controls.js +141 -0
- package/dist/session/composer/ComposerCard.d.ts +1 -1
- package/dist/session/composer/ComposerCard.js +3 -3
- package/dist/session/composer/agent-selector.js +13 -19
- package/dist/session/composer/composer-underbar.d.ts +3 -1
- package/dist/session/composer/composer-underbar.js +2 -2
- package/dist/session/composer/composer.d.ts +5 -0
- package/dist/session/composer/composer.js +16 -10
- package/dist/session/composer/editor/composer-editor.js +19 -8
- package/dist/session/composer/editor/ultracode.d.ts +34 -0
- package/dist/session/composer/editor/ultracode.js +127 -0
- package/dist/session/composer/index.d.ts +1 -0
- package/dist/session/composer/index.js +1 -0
- package/dist/session/composer/send-blockers.d.ts +1 -11
- package/dist/session/composer/send-blockers.js +1 -11
- package/dist/session/composer/session-composer-readiness.d.ts +1 -28
- package/dist/session/composer/session-composer-readiness.js +5 -16
- package/dist/session/header/reminder-parts.d.ts +1 -1
- package/dist/session/header/session-site-header.js +6 -3
- package/dist/session/header/subagent-hover-card.d.ts +0 -2
- package/dist/session/header/subagent-hover-card.js +1 -4
- package/dist/session/models/claude-connection-slot.d.ts +11 -0
- package/dist/session/models/claude-connection-slot.js +30 -0
- package/dist/session/models/model-availability.d.ts +3 -1
- package/dist/session/models/model-availability.js +3 -0
- package/dist/session/models/model-selector.js +11 -12
- package/dist/session/models/model-tags.d.ts +9 -0
- package/dist/session/models/model-tags.js +8 -0
- package/dist/session/panel/easy/detail-view.js +7 -0
- package/dist/session/panel/easy/easy-panel.js +1 -1
- package/dist/session/panel/easy/step-icon.js +5 -1
- package/dist/session/panel/mobile-tool-drawer.js +7 -3
- package/dist/session/panel/open-session-quick-view.js +1 -1
- package/dist/session/panel/session-action-panel-column.js +1 -1
- package/dist/session/panel/session-desktop.js +41 -14
- package/dist/session/panel/session-panel-provider.d.ts +1 -1
- package/dist/session/panel/session-panel-provider.js +7 -11
- package/dist/session/prompts/question-prompt.js +3 -1
- package/dist/session/status/session-error-banner.js +4 -1
- package/dist/session/thread/session-chat.js +286 -296
- package/dist/session/thread/session-context-modal.js +29 -10
- package/dist/session/thread/session-context-spawned-sessions.d.ts +13 -0
- package/dist/session/thread/session-context-spawned-sessions.js +44 -0
- package/dist/session/thread/session-context-sub-sessions.js +3 -8
- package/dist/session/thread/transcript.d.ts +3 -0
- package/dist/session/thread/transcript.js +32 -8
- package/dist/session/tool/shared/full-view-action.d.ts +29 -0
- package/dist/session/tool/shared/full-view-action.js +43 -0
- package/dist/session/tool/tool-part-renderer.js +10 -2
- package/dist/session/tool/tools/agent-message-tool.js +2 -2
- package/dist/session/tool/tools/agent-spawn-tool.js +2 -2
- package/dist/session/tool/tools/agent-status-tool.js +2 -2
- package/dist/session/tool/tools/kortix-action-tool.d.ts +2 -0
- package/dist/session/tool/tools/kortix-action-tool.js +148 -0
- package/dist/session/tool/tools/kortix-tool-card.d.ts +83 -0
- package/dist/session/tool/tools/kortix-tool-card.js +186 -0
- package/dist/session/tool/tools/multi-agent-tool-bodies.d.ts +11 -0
- package/dist/session/tool/tools/multi-agent-tool-bodies.js +141 -0
- package/dist/session/tool/tools/multi-agent-tool-data.d.ts +63 -0
- package/dist/session/tool/tools/multi-agent-tool-data.js +118 -0
- package/dist/session/tool/tools/multi-agent-tools.d.ts +9 -0
- package/dist/session/tool/tools/multi-agent-tools.js +38 -0
- package/dist/session/tool/tools/question-tool.js +1 -1
- package/dist/session/tool/tools/register.d.ts +3 -0
- package/dist/session/tool/tools/register.js +3 -0
- package/dist/session/tool/tools/session-spawn-tool.js +2 -2
- package/dist/session/tool/tools/task-tool.d.ts +1 -1
- package/dist/session/tool/tools/task-tool.js +29 -41
- package/dist/session/tool/tools/workflow-progress.d.ts +34 -0
- package/dist/session/tool/tools/workflow-progress.js +186 -0
- package/dist/session/tool/tools/workflow-run.d.ts +128 -0
- package/dist/session/tool/tools/workflow-run.js +251 -0
- package/dist/session/tool/tools/workflow-tool.d.ts +9 -0
- package/dist/session/tool/tools/workflow-tool.js +253 -0
- package/dist/session/turn/notice-batch-group.d.ts +12 -0
- package/dist/session/turn/notice-batch-group.js +17 -0
- package/dist/session/turn/peer-message-row.d.ts +14 -0
- package/dist/session/turn/peer-message-row.js +57 -0
- package/dist/session/turn/subagent-notice-row.d.ts +4 -0
- package/dist/session/turn/subagent-notice-row.js +50 -0
- package/dist/session/turn/subagent-notice.d.ts +58 -0
- package/dist/session/turn/subagent-notice.js +111 -0
- package/dist/session/turn/user-message.d.ts +5 -4
- package/dist/session/turn/user-message.js +31 -10
- package/dist/styles/tokens.css +2 -0
- package/dist/styles.css +1 -1
- package/dist/terminal/session-terminal-connect-bar.js +1 -1
- package/dist/workspace/admin/project-admin-dashboard.d.ts +53 -0
- package/dist/workspace/admin/project-admin-dashboard.js +252 -0
- package/dist/workspace/admin/project-admin-nav.d.ts +20 -0
- package/dist/workspace/admin/project-admin-nav.js +41 -0
- package/dist/workspace/home/welcome-body.js +25 -3
- package/dist/workspace/index.d.ts +6 -2
- package/dist/workspace/index.js +12 -2
- package/dist/workspace/layout/new-session-create.js +3 -3
- package/dist/workspace/layout/project-home.js +3 -3
- package/dist/workspace/memory/memory-labels.js +5 -0
- package/dist/workspace/repository-disconnected.js +2 -2
- package/dist/workspace/sessions/board-dispatch.d.ts +52 -0
- package/dist/workspace/sessions/board-dispatch.js +110 -0
- package/dist/workspace/sessions/board-grouping.d.ts +63 -0
- package/dist/workspace/sessions/board-grouping.js +141 -0
- package/dist/workspace/sessions/board-peek.d.ts +15 -0
- package/dist/workspace/sessions/board-peek.js +54 -0
- package/dist/workspace/sessions/board-state-mark.d.ts +15 -0
- package/dist/workspace/sessions/board-state-mark.js +24 -0
- package/dist/workspace/sessions/project-sessions-view.js +42 -31
- package/dist/workspace/sessions/sessions-board.d.ts +12 -0
- package/dist/workspace/sessions/sessions-board.js +214 -0
- package/dist/workspace/sidebar/footer/project-manifest-issues-alert.d.ts +46 -0
- package/dist/workspace/sidebar/footer/project-manifest-issues-alert.js +85 -0
- package/dist/workspace/sidebar/footer/sidebar-alert.js +1 -1
- package/dist/workspace/sidebar/new-agent-modal-provider.d.ts +12 -0
- package/dist/workspace/sidebar/new-agent-modal-provider.js +19 -0
- package/dist/workspace/sidebar/project-nav-items.d.ts +3 -1
- package/dist/workspace/sidebar/project-nav-items.js +53 -5
- package/dist/workspace/sidebar/project-session-list.js +35 -12
- package/dist/workspace/sidebar/project-sidebar.js +6 -3
- package/dist/workspace/sidebar/session-filter-menu.js +2 -1
- package/dist/workspace/space/space-blocks.d.ts +25 -0
- package/dist/workspace/space/space-blocks.js +124 -0
- package/dist/workspace/space/space-filter-tabs.d.ts +17 -0
- package/dist/workspace/space/space-filter-tabs.js +31 -0
- package/dist/workspace/space/space-page.d.ts +24 -0
- package/dist/workspace/space/space-page.js +157 -0
- package/dist/workspace/space/space-room.d.ts +20 -0
- package/dist/workspace/space/space-room.js +27 -0
- package/dist/workspace/space/space-tab-menu.d.ts +14 -0
- package/dist/workspace/space/space-tab-menu.js +127 -0
- package/dist/workspace/space/space-tab-panels.d.ts +9 -0
- package/dist/workspace/space/space-tab-panels.js +203 -0
- package/dist/workspace/space/space-templates.d.ts +34 -0
- package/dist/workspace/space/space-templates.js +71 -0
- package/dist/workspace/space/use-space-filter.d.ts +10 -0
- package/dist/workspace/space/use-space-filter.js +40 -0
- package/dist/workspace/space/use-space-manifest.d.ts +8 -0
- package/dist/workspace/space/use-space-manifest.js +27 -0
- package/dist/workspace/spaces/space-timeline.js +2 -2
- package/package.json +56 -53
- package/skills/kortix-ui/SKILL.md +1 -1
- package/skills/kortix-ui/references/custom-dashboard.md +10 -4
- package/skills/kortix-ui/references/modules.md +11 -9
- package/dist/_vendor/shared/meta-agent.d.ts +0 -7
- package/dist/customize/agents/agent-grant-pages.d.ts +0 -37
- package/dist/customize/agents/agent-grant-pages.js +0 -226
- package/dist/customize/agents/agent-triggers-section.d.ts +0 -17
- package/dist/customize/agents/agent-triggers-section.js +0 -109
- package/dist/customize/migrate-to-v2/index.d.ts +0 -5
- package/dist/customize/migrate-to-v2/index.js +0 -5
- package/dist/customize/migrate-to-v2/migration-prompt.d.ts +0 -16
- package/dist/customize/migrate-to-v2/migration-prompt.js +0 -59
- package/dist/customize/migrate-to-v2/upgrade-defs.d.ts +0 -30
- package/dist/customize/migrate-to-v2/upgrade-defs.js +0 -43
- package/dist/customize/migrate-to-v2/upgrade-view.d.ts +0 -32
- package/dist/customize/migrate-to-v2/upgrade-view.js +0 -152
- package/dist/customize/migrate-to-v2/use-run-upgrade.d.ts +0 -18
- package/dist/customize/migrate-to-v2/use-run-upgrade.js +0 -16
- package/dist/customize/shared/capability-tabs.d.ts +0 -3
- package/dist/customize/shared/capability-tabs.js +0 -137
- package/dist/customize/skills/skill-scope.d.ts +0 -14
- package/dist/customize/skills/skill-scope.js +0 -18
- package/dist/internal/lib/manifest-version.d.ts +0 -21
- package/dist/internal/lib/manifest-version.js +0 -55
- package/dist/session/composer/hooks/use-composer-escape-stop.d.ts +0 -6
- package/dist/session/composer/hooks/use-composer-escape-stop.js +0 -28
- package/dist/session/thread/sub-session-modal-content.d.ts +0 -8
- package/dist/session/thread/sub-session-modal-content.js +0 -23
- package/dist/session/thread/sub-session-modal.d.ts +0 -2
- package/dist/session/thread/sub-session-modal.js +0 -14
- package/dist/workspace/sidebar/footer/project-manifest-upgrade-alert.d.ts +0 -13
- package/dist/workspace/sidebar/footer/project-manifest-upgrade-alert.js +0 -48
|
@@ -5,7 +5,8 @@ import { useUiHostConfig } from '../../providers/ui-provider.js';
|
|
|
5
5
|
import { useTranslations } from '../../i18n/index.js';
|
|
6
6
|
import { cn } from '../../lib/utils.js';
|
|
7
7
|
import { isImageFile } from '../../internal/lib/utils/file-utils.js';
|
|
8
|
-
import { usePromptAttachments, useRuntimeSessions } from '@kortix/sdk/react';
|
|
8
|
+
import { useProjectConfig, usePromptAttachments, useRuntimeSessions } from '@kortix/sdk/react';
|
|
9
|
+
import { useActiveSpace } from '../../internal/stores/active-space-store.js';
|
|
9
10
|
import { newPastedContentId, splitPastedContent, trimPastedText } from '../../_vendor/kortix-shared.js';
|
|
10
11
|
import { memo, useCallback, useEffect, useId, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore, } from 'react';
|
|
11
12
|
import { extractClipboardFiles } from './clipboard-files.js';
|
|
@@ -16,7 +17,6 @@ import { isModelRequiredButUnavailable, NO_MODEL_AVAILABLE_ACTION_MESSAGE, NO_MO
|
|
|
16
17
|
import { useModelConnectionGate } from '../models/use-model-connection-gate.js';
|
|
17
18
|
import { NO_AGENT_ACCESS_HINT, NO_AGENT_ACCESS_LABEL } from './composer-agent-access.js';
|
|
18
19
|
import { useComposerDropZone } from './composer-drop-zone.js';
|
|
19
|
-
import { useComposerEscapeStop } from './hooks/use-composer-escape-stop.js';
|
|
20
20
|
import { finishedDraftUploads, keepUnsentUploadFile, restoreDraftUploads } from './draft/draft-uploads.js';
|
|
21
21
|
import { useComposerDraft } from './draft/use-composer-draft.js';
|
|
22
22
|
import { commandBlocker, sendBlocker, sendBlockerMessage } from './send-blockers.js';
|
|
@@ -110,7 +110,7 @@ function setDocumentWithoutStealingFocus(handle, doc) {
|
|
|
110
110
|
}
|
|
111
111
|
}
|
|
112
112
|
function ComposerImpl(props) {
|
|
113
|
-
const { onSend, promptAttachments: hostPromptAttachments, isBusy = false, sessionWorking, runtimeReady = true, onStop, stopDisabled = false,
|
|
113
|
+
const { onSend, promptAttachments: hostPromptAttachments, isBusy = false, sessionWorking, runtimeReady = true, onStop, stopDisabled = false, isSending = false, rewind, agents = EMPTY_AGENTS, selectedAgent = null, onAgentChange, noAccessibleAgents = false, commands: runtimeCommands = EMPTY_COMMANDS,
|
|
114
114
|
/** Whether the live command list has EVER resolved — see `planUnresolvedCommandChip`. */
|
|
115
115
|
commandsResolved = false, slashFiles = EMPTY_SLASH_FILES, onCommand, onHoldCommand, models = EMPTY_MODELS, selectedModel = null, onModelChange, modelDefaultControls, variants = EMPTY_VARIANTS, selectedVariant = null, onVariantChange, messages, sessionId, projectId, draftScope = null, draftActive = true, disabled = false, notice = null, onNoticeRetry, clearOnSend = true, modelRequired = false, modelsLoading = false, autoFocus, placeholder = 'Ask anything…', hint, onArrowUpAtStart, prefill = null, onPrefillApplied, attachRequestId = null, providers, onContextClick, onCompactClick, inputSlot, toolbarSlot, underbarPlacement = 'below', slashMenuPlacement = 'above', cardClassName, quoteRequests = NO_QUOTE_REQUESTS, onQuoteRequestsApplied, lockForQuestion = false, lockForApproval = false, onCustomAnswer, questionButtonLabel = null, questionCanAct = true, onQuestionAction, escCount = 0, parentClassName, } = props;
|
|
116
116
|
const tI18nComplete = useTranslations('hardcodedUi.i18nComplete');
|
|
@@ -317,7 +317,19 @@ function ComposerImpl(props) {
|
|
|
317
317
|
handleDocChange(doc, isEmpty);
|
|
318
318
|
}, [handleDocChange]);
|
|
319
319
|
const { data: allSessions } = useRuntimeSessions();
|
|
320
|
-
|
|
320
|
+
// Scope the startable agents to the active space (the sidebar's Spaces
|
|
321
|
+
// selection): in a space you start only that space's agents. The current
|
|
322
|
+
// agent is always kept so a session's own agent never disappears while you
|
|
323
|
+
// are viewing another space. No space selected = every agent, as before.
|
|
324
|
+
const [activeSpace] = useActiveSpace(projectId ?? '');
|
|
325
|
+
const scopeConfig = useProjectConfig(projectId);
|
|
326
|
+
const primaryAgents = useMemo(() => {
|
|
327
|
+
const base = agents.filter((a) => !a.hidden && a.mode !== 'subagent');
|
|
328
|
+
if (!activeSpace || !scopeConfig)
|
|
329
|
+
return base;
|
|
330
|
+
const spaceByName = new Map(scopeConfig.agents.map((a) => [a.name, a.space ?? null]));
|
|
331
|
+
return base.filter((a) => spaceByName.get(a.name) === activeSpace || a.name === selectedAgent);
|
|
332
|
+
}, [agents, activeSpace, scopeConfig, selectedAgent]);
|
|
321
333
|
const editorDisabled = disabled || lockForApproval;
|
|
322
334
|
const appendAttachedFiles = useCallback((files) => {
|
|
323
335
|
// The host keeps files in its own store: they go there, not to the session.
|
|
@@ -676,12 +688,6 @@ function ComposerImpl(props) {
|
|
|
676
688
|
const canSubmit = !isEmpty ||
|
|
677
689
|
attachedFiles.length > 0 ||
|
|
678
690
|
(!lockForQuestion && (quotes.length > 0 || pastes.length > 0));
|
|
679
|
-
useComposerEscapeStop({
|
|
680
|
-
editorElement,
|
|
681
|
-
enabled: isBusy && canStop && !stopDisabled && !isSending && !lockForQuestion && !props.submitLabel,
|
|
682
|
-
hasDraft: canSubmit,
|
|
683
|
-
onStop,
|
|
684
|
-
});
|
|
685
691
|
/**
|
|
686
692
|
* No agent may run this prompt. Refused here rather than at the server:
|
|
687
693
|
* `lockForQuestion` is exempt because answering an open question is not a new
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
3
|
import { useTranslations } from '../../../i18n/index.js';
|
|
4
4
|
import { cn } from '../../../lib/utils.js';
|
|
5
5
|
import { EditorContent, useEditor } from '@tiptap/react';
|
|
6
|
-
import { forwardRef, useEffect, useImperativeHandle, useMemo, useRef } from 'react';
|
|
6
|
+
import { forwardRef, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
|
|
7
7
|
import { textToParagraphs } from '../composer-logic.js';
|
|
8
8
|
import { COMPOSER_TEXT_METRICS } from '../composer-text-metrics.js';
|
|
9
9
|
import { useLatestRef } from '../hooks/use-latest-ref.js';
|
|
@@ -15,6 +15,7 @@ import { isCursorOnFirstVisualLine } from './first-visual-line.js';
|
|
|
15
15
|
import { MentionNode } from './mention-node.js';
|
|
16
16
|
import { serializeDocument } from './serialize.js';
|
|
17
17
|
import { createSuggestionExtension } from './suggestion.js';
|
|
18
|
+
import { UltracodeHighlight } from './ultracode.js';
|
|
18
19
|
/**
|
|
19
20
|
* Wraps `onEmptyChange` so it fires ONLY on the empty<->non-empty boundary.
|
|
20
21
|
* Exported (rather than kept as an inline `useEditor({ onUpdate })` closure)
|
|
@@ -161,8 +162,16 @@ export function insertTextAtCursor(editor, text) {
|
|
|
161
162
|
return;
|
|
162
163
|
editor.commands.insertContent(content);
|
|
163
164
|
}
|
|
165
|
+
/** The dismiss shortcut as the person's keyboard prints it. */
|
|
166
|
+
function dismissKeyLabel() {
|
|
167
|
+
const platform = typeof navigator !== 'undefined' ? navigator.platform || navigator.userAgent : '';
|
|
168
|
+
return /Mac|iPhone|iPad/.test(platform) ? '⌥W' : 'Alt+W';
|
|
169
|
+
}
|
|
164
170
|
export const ComposerEditor = forwardRef(function ComposerEditor({ placeholder, disabled, autoFocus = false, onSubmit, onArrowUpAtStart, onEmptyChange, onDocChange, agents, sessions, currentSessionId, commands, onSelectCommand, onSelectAction, actions, files, slashDockSelector, onMenuOpenChange, }, ref) {
|
|
165
171
|
const t = useTranslations('threads');
|
|
172
|
+
const tUltracode = useTranslations('multiAgent.ultracode');
|
|
173
|
+
// A marked `ultracode` keyword: the one-line hint under the text says what it does.
|
|
174
|
+
const [ultracodeActive, setUltracodeActive] = useState(false);
|
|
166
175
|
const tI18nComplete = useTranslations('hardcodedUi.i18nComplete');
|
|
167
176
|
const defaultActions = useMemo(() => localizedSlashActions(tI18nComplete), [tI18nComplete]);
|
|
168
177
|
// Mirrors use-composer-focus.ts's onTypeAheadRef: @tiptap/react only
|
|
@@ -277,6 +286,8 @@ export const ComposerEditor = forwardRef(function ComposerEditor({ placeholder,
|
|
|
277
286
|
extensions: [
|
|
278
287
|
...baseExtensions(() => placeholderRef.current),
|
|
279
288
|
MentionNode,
|
|
289
|
+
// `setUltracodeActive` is a state setter: stable, so freezing it at construction is safe.
|
|
290
|
+
UltracodeHighlight.configure({ onActiveChange: setUltracodeActive }),
|
|
280
291
|
// The one `@tiptap/suggestion` code path both `@` and `/` register
|
|
281
292
|
// through (editor/suggestion.ts's `createSuggestionExtension`).
|
|
282
293
|
// Built fresh every render like every extension above, but only the
|
|
@@ -427,10 +438,10 @@ export const ComposerEditor = forwardRef(function ComposerEditor({ placeholder,
|
|
|
427
438
|
isEmpty: () => editor?.isEmpty ?? true,
|
|
428
439
|
getElement: () => (editor && !editor.isDestroyed ? editor.view.dom : null),
|
|
429
440
|
}), [editor]);
|
|
430
|
-
return (_jsx(EditorContent, { editor: editor, className: cn(
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
441
|
+
return (_jsxs(_Fragment, { children: [_jsx(EditorContent, { editor: editor, className: cn(
|
|
442
|
+
// `text-base` (16px) on mobile, NOT 15px: iOS Safari force-zooms the
|
|
443
|
+
// page on focus for any input under 16px, and the composer is the one
|
|
444
|
+
// field on the screen. `sm:text-sm` above 640px, which is the size
|
|
445
|
+
// `styles/components.css`'s slash-trigger rule already documents.
|
|
446
|
+
'kortix-composer-editor w-full text-sm', disabled && 'opacity-50') }), ultracodeActive ? (_jsxs("p", { "data-slot": "ultracode-hint", className: "text-muted-foreground mt-1 truncate text-xs", children: [tUltracode('hint'), _jsx("span", { "aria-hidden": true, className: "px-1", children: "\u00B7" }), tUltracode('dismiss', { key: dismissKeyLabel() })] })) : null] }));
|
|
436
447
|
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Extension } from '@tiptap/core';
|
|
2
|
+
import type { Node as ProseMirrorNode } from '@tiptap/pm/model';
|
|
3
|
+
import { PluginKey, type EditorState, type Transaction } from '@tiptap/pm/state';
|
|
4
|
+
import { DecorationSet } from '@tiptap/pm/view';
|
|
5
|
+
/** The utility classes of a marked keyword: the mention chip's tint, no padding (the caret must not jump). */
|
|
6
|
+
export declare const ULTRACODE_MARK_CLASS = "kortix-ultracode rounded-sm bg-primary/[0.08] font-medium text-foreground";
|
|
7
|
+
export interface UltracodeRange {
|
|
8
|
+
from: number;
|
|
9
|
+
to: number;
|
|
10
|
+
}
|
|
11
|
+
/** Every occurrence of the keyword in a document, as document positions. */
|
|
12
|
+
export declare function findUltracodeRanges(doc: ProseMirrorNode): UltracodeRange[];
|
|
13
|
+
/** True for a plain-text keyword check (the sent prompt, a test). Same rule as the editor mark. */
|
|
14
|
+
export declare function hasUltracodeKeyword(text: string): boolean;
|
|
15
|
+
export interface UltracodeState {
|
|
16
|
+
/** The person dismissed the keyword for this prompt. */
|
|
17
|
+
dismissed: boolean;
|
|
18
|
+
ranges: UltracodeRange[];
|
|
19
|
+
/** At least one marked keyword: the host shows the hint. */
|
|
20
|
+
active: boolean;
|
|
21
|
+
decorations: DecorationSet;
|
|
22
|
+
}
|
|
23
|
+
export declare const ultracodePluginKey: PluginKey<UltracodeState>;
|
|
24
|
+
/** The next state after a transaction: a dismiss meta sets it, an empty document resets it. */
|
|
25
|
+
export declare function nextUltracodeState(tr: Transaction, previous: UltracodeState, state: EditorState): UltracodeState;
|
|
26
|
+
/** Dismiss the keyword for this prompt. Returns false when nothing is marked. */
|
|
27
|
+
export declare function dismissUltracode(state: EditorState, dispatch?: (tr: Transaction) => void): boolean;
|
|
28
|
+
/** Alt+W anywhere, or Backspace with the caret right after a marked keyword. */
|
|
29
|
+
export declare function isUltracodeDismissKey(event: Pick<KeyboardEvent, 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'>, state: EditorState): boolean;
|
|
30
|
+
export interface UltracodeOptions {
|
|
31
|
+
/** Fires when the hint should appear or go: a marked keyword exists, or none does. */
|
|
32
|
+
onActiveChange?: (active: boolean) => void;
|
|
33
|
+
}
|
|
34
|
+
export declare const UltracodeHighlight: Extension<UltracodeOptions, any>;
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { Extension } from '@tiptap/core';
|
|
2
|
+
import { Plugin, PluginKey } from '@tiptap/pm/state';
|
|
3
|
+
import { Decoration, DecorationSet } from '@tiptap/pm/view';
|
|
4
|
+
/**
|
|
5
|
+
* The `ultracode` keyword, as Claude Code's dynamic workflows treat it: a
|
|
6
|
+
* prompt that holds the word runs as a workflow of agents. The composer marks
|
|
7
|
+
* each occurrence in place and the host shows a one-line hint, so the person
|
|
8
|
+
* sees the opt-in before they send. The prompt text never changes: the word
|
|
9
|
+
* is sent as typed, and the agent reads it.
|
|
10
|
+
*
|
|
11
|
+
* Alt+W (Option+W on a Mac), or Backspace right after a marked word, dismisses
|
|
12
|
+
* the mark and the hint for this prompt. A dismissed prompt stays dismissed
|
|
13
|
+
* while the person keeps typing; an empty composer (the prompt was sent or
|
|
14
|
+
* cleared) arms the keyword again.
|
|
15
|
+
*/
|
|
16
|
+
/** Whole word, any case. `\b` keeps `ultracoder` and `myultracode` plain text. */
|
|
17
|
+
const KEYWORD = /\bultracode\b/gi;
|
|
18
|
+
/** The utility classes of a marked keyword: the mention chip's tint, no padding (the caret must not jump). */
|
|
19
|
+
export const ULTRACODE_MARK_CLASS = 'kortix-ultracode rounded-sm bg-primary/[0.08] font-medium text-foreground';
|
|
20
|
+
/** Every occurrence of the keyword in a document, as document positions. */
|
|
21
|
+
export function findUltracodeRanges(doc) {
|
|
22
|
+
const ranges = [];
|
|
23
|
+
doc.descendants((node, pos) => {
|
|
24
|
+
if (!node.isText || !node.text)
|
|
25
|
+
return;
|
|
26
|
+
for (const match of node.text.matchAll(KEYWORD)) {
|
|
27
|
+
const from = pos + (match.index ?? 0);
|
|
28
|
+
ranges.push({ from, to: from + match[0].length });
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
return ranges;
|
|
32
|
+
}
|
|
33
|
+
/** True for a plain-text keyword check (the sent prompt, a test). Same rule as the editor mark. */
|
|
34
|
+
export function hasUltracodeKeyword(text) {
|
|
35
|
+
KEYWORD.lastIndex = 0;
|
|
36
|
+
const found = KEYWORD.test(text);
|
|
37
|
+
KEYWORD.lastIndex = 0;
|
|
38
|
+
return found;
|
|
39
|
+
}
|
|
40
|
+
export const ultracodePluginKey = new PluginKey('ultracode');
|
|
41
|
+
const isBlank = (doc) => doc.textContent.trim().length === 0;
|
|
42
|
+
function stateFor(doc, dismissed) {
|
|
43
|
+
const ranges = dismissed ? [] : findUltracodeRanges(doc);
|
|
44
|
+
return {
|
|
45
|
+
dismissed,
|
|
46
|
+
ranges,
|
|
47
|
+
active: ranges.length > 0,
|
|
48
|
+
decorations: ranges.length
|
|
49
|
+
? DecorationSet.create(doc, ranges.map(({ from, to }) => Decoration.inline(from, to, { class: ULTRACODE_MARK_CLASS, 'data-ultracode': '' })))
|
|
50
|
+
: DecorationSet.empty,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/** The next state after a transaction: a dismiss meta sets it, an empty document resets it. */
|
|
54
|
+
export function nextUltracodeState(tr, previous, state) {
|
|
55
|
+
const meta = tr.getMeta(ultracodePluginKey);
|
|
56
|
+
let dismissed = meta?.dismiss ? true : previous.dismissed;
|
|
57
|
+
if (dismissed && isBlank(state.doc))
|
|
58
|
+
dismissed = false;
|
|
59
|
+
if (!tr.docChanged && dismissed === previous.dismissed)
|
|
60
|
+
return previous;
|
|
61
|
+
return stateFor(state.doc, dismissed);
|
|
62
|
+
}
|
|
63
|
+
/** Dismiss the keyword for this prompt. Returns false when nothing is marked. */
|
|
64
|
+
export function dismissUltracode(state, dispatch) {
|
|
65
|
+
if (!ultracodePluginKey.getState(state)?.active)
|
|
66
|
+
return false;
|
|
67
|
+
dispatch?.(state.tr.setMeta(ultracodePluginKey, { dismiss: true }));
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
/** Alt+W anywhere, or Backspace with the caret right after a marked keyword. */
|
|
71
|
+
export function isUltracodeDismissKey(event, state) {
|
|
72
|
+
const plugin = ultracodePluginKey.getState(state);
|
|
73
|
+
if (!plugin?.active)
|
|
74
|
+
return false;
|
|
75
|
+
// `code`, not `key`: Option+W on a Mac types `∑`.
|
|
76
|
+
if (event.altKey && !event.ctrlKey && !event.metaKey && event.code === 'KeyW')
|
|
77
|
+
return true;
|
|
78
|
+
if (event.key !== 'Backspace' || event.altKey || event.ctrlKey || event.metaKey || event.shiftKey)
|
|
79
|
+
return false;
|
|
80
|
+
const { empty, from } = state.selection;
|
|
81
|
+
return empty && plugin.ranges.some((range) => range.to === from);
|
|
82
|
+
}
|
|
83
|
+
export const UltracodeHighlight = Extension.create({
|
|
84
|
+
name: 'ultracodeHighlight',
|
|
85
|
+
addOptions() {
|
|
86
|
+
return { onActiveChange: undefined };
|
|
87
|
+
},
|
|
88
|
+
addProseMirrorPlugins() {
|
|
89
|
+
const options = this.options;
|
|
90
|
+
return [
|
|
91
|
+
new Plugin({
|
|
92
|
+
key: ultracodePluginKey,
|
|
93
|
+
state: {
|
|
94
|
+
init: (_config, state) => stateFor(state.doc, false),
|
|
95
|
+
apply: (tr, previous, _old, state) => nextUltracodeState(tr, previous, state),
|
|
96
|
+
},
|
|
97
|
+
props: {
|
|
98
|
+
decorations: (state) => ultracodePluginKey.getState(state)?.decorations ?? DecorationSet.empty,
|
|
99
|
+
handleKeyDown: (view, event) => {
|
|
100
|
+
if (!isUltracodeDismissKey(event, view.state))
|
|
101
|
+
return false;
|
|
102
|
+
event.preventDefault();
|
|
103
|
+
return dismissUltracode(view.state, view.dispatch);
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
view: (view) => {
|
|
107
|
+
let reported = ultracodePluginKey.getState(view.state)?.active ?? false;
|
|
108
|
+
if (reported)
|
|
109
|
+
options.onActiveChange?.(true);
|
|
110
|
+
return {
|
|
111
|
+
update: (next) => {
|
|
112
|
+
const active = ultracodePluginKey.getState(next.state)?.active ?? false;
|
|
113
|
+
if (active === reported)
|
|
114
|
+
return;
|
|
115
|
+
reported = active;
|
|
116
|
+
options.onActiveChange?.(active);
|
|
117
|
+
},
|
|
118
|
+
destroy: () => {
|
|
119
|
+
if (reported)
|
|
120
|
+
options.onActiveChange?.(false);
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
},
|
|
124
|
+
}),
|
|
125
|
+
];
|
|
126
|
+
},
|
|
127
|
+
});
|
|
@@ -15,6 +15,7 @@ export { type DraftScope } from './draft/composer-draft.js';
|
|
|
15
15
|
export { ComposerEditor, type ComposerEditorHandle } from './editor/composer-editor.js';
|
|
16
16
|
export { baseExtensions } from './editor/extensions.js';
|
|
17
17
|
export { MentionNode } from './editor/mention-node.js';
|
|
18
|
+
export { MentionChip } from '../thread/mention-chip.js';
|
|
18
19
|
export { baseSuggestion, type MenuController } from './editor/suggestion.js';
|
|
19
20
|
export { ReasoningEffortSelector } from './reasoning-effort-selector.js';
|
|
20
21
|
export { SessionChatInput, type SessionChatInputProps } from './session-chat-input.js';
|
|
@@ -14,6 +14,7 @@ export { ComposerUnderbar } from './composer-underbar.js';
|
|
|
14
14
|
export { ComposerEditor } from './editor/composer-editor.js';
|
|
15
15
|
export { baseExtensions } from './editor/extensions.js';
|
|
16
16
|
export { MentionNode } from './editor/mention-node.js';
|
|
17
|
+
export { MentionChip } from '../thread/mention-chip.js';
|
|
17
18
|
export { baseSuggestion } from './editor/suggestion.js';
|
|
18
19
|
export { ReasoningEffortSelector } from './reasoning-effort-selector.js';
|
|
19
20
|
export { SessionChatInput } from './session-chat-input.js';
|
|
@@ -26,17 +26,7 @@ import type { UiTranslator } from '../../i18n/index.js';
|
|
|
26
26
|
*
|
|
27
27
|
* Two gates from the old set are deliberately NOT here:
|
|
28
28
|
*
|
|
29
|
-
* - `revertStaged`.
|
|
30
|
-
* the user had asked to discard. There is no auto-drain, and a staged
|
|
31
|
-
* revert is precisely the state in which the user types their REPLACEMENT
|
|
32
|
-
* prompt — refusing it would make edit-and-resend impossible. The
|
|
33
|
-
* replacement prompt IS what commits the revert: OpenCode truncates on the
|
|
34
|
-
* next delivery, from any producer. The server's own guard
|
|
35
|
-
* (`queuedContinueHasStagedRevert`,
|
|
36
|
-
* `apps/api/src/projects/session-lifecycle/engine.ts`) lets a prompt that
|
|
37
|
-
* never waited commit the revert for that reason, and refuses the rows that
|
|
38
|
-
* queued BEFORE it — for every client, which a gate in this tab could never
|
|
39
|
-
* do.
|
|
29
|
+
* - `revertStaged`. No runtime stages a revert: pi answers rewind `501`.
|
|
40
30
|
* - `isServerBusy`, for a PROMPT. That is the inbox's decision now.
|
|
41
31
|
* - `runtimeReady`, for a PROMPT. A prompt typed at a sleeping box becomes an
|
|
42
32
|
* inbox row and is delivered when the box answers. A COMMAND cannot: see
|
|
@@ -25,17 +25,7 @@
|
|
|
25
25
|
*
|
|
26
26
|
* Two gates from the old set are deliberately NOT here:
|
|
27
27
|
*
|
|
28
|
-
* - `revertStaged`.
|
|
29
|
-
* the user had asked to discard. There is no auto-drain, and a staged
|
|
30
|
-
* revert is precisely the state in which the user types their REPLACEMENT
|
|
31
|
-
* prompt — refusing it would make edit-and-resend impossible. The
|
|
32
|
-
* replacement prompt IS what commits the revert: OpenCode truncates on the
|
|
33
|
-
* next delivery, from any producer. The server's own guard
|
|
34
|
-
* (`queuedContinueHasStagedRevert`,
|
|
35
|
-
* `apps/api/src/projects/session-lifecycle/engine.ts`) lets a prompt that
|
|
36
|
-
* never waited commit the revert for that reason, and refuses the rows that
|
|
37
|
-
* queued BEFORE it — for every client, which a gate in this tab could never
|
|
38
|
-
* do.
|
|
28
|
+
* - `revertStaged`. No runtime stages a revert: pi answers rewind `501`.
|
|
39
29
|
* - `isServerBusy`, for a PROMPT. That is the inbox's decision now.
|
|
40
30
|
* - `runtimeReady`, for a PROMPT. A prompt typed at a sleeping box becomes an
|
|
41
31
|
* inbox row and is delivered when the box answers. A COMMAND cannot: see
|
|
@@ -26,7 +26,6 @@
|
|
|
26
26
|
* — the composer stays usable, and this module's job shrinks to one thing:
|
|
27
27
|
* saying what is going on.
|
|
28
28
|
*/
|
|
29
|
-
import { type SessionConnection } from '@kortix/sdk';
|
|
30
29
|
export interface SessionComposerReadiness {
|
|
31
30
|
/** The runtime is up. False means a submit becomes a queued inbox row rather
|
|
32
31
|
* than a delivery. */
|
|
@@ -86,11 +85,6 @@ export declare function serverHoldsOpenTurn(working: {
|
|
|
86
85
|
}): boolean;
|
|
87
86
|
export declare function sessionComposerReadiness(input: {
|
|
88
87
|
runtimeReady: boolean;
|
|
89
|
-
/** A prompt sent from this page is waiting for the computer. Its turn
|
|
90
|
-
* already shows it working; do not ask for another message. */
|
|
91
|
-
pendingPrompt?: boolean;
|
|
92
|
-
/** A queued status already describes this send; do not ask for another. */
|
|
93
|
-
pendingDelivery?: boolean;
|
|
94
88
|
/**
|
|
95
89
|
* The CONTROL PLANE holds an open turn for this session right now — pass
|
|
96
90
|
* `serverHoldsOpenTurn(working)`, never `working.source === 'server'`.
|
|
@@ -115,27 +109,6 @@ export declare function sessionComposerReadiness(input: {
|
|
|
115
109
|
* "indistinguishable from stuck" failure this module exists to prevent.
|
|
116
110
|
*/
|
|
117
111
|
stalled?: boolean;
|
|
118
|
-
/**
|
|
119
|
-
* This page's own `/start` is bringing the computer up: its stage is
|
|
120
|
-
* `provisioning` or `starting`, or it has not answered yet. A stopped
|
|
121
|
-
* computer is then WAKING, not idle, and the composer must not claim the
|
|
122
|
-
* next message is what wakes it.
|
|
123
|
-
*/
|
|
124
|
-
starting?: boolean;
|
|
125
|
-
/**
|
|
126
|
-
* The shared connection projection (`projectSessionConnection`).
|
|
127
|
-
*
|
|
128
|
-
* This is what replaced a settle TIMER here. The timer was the same mistake
|
|
129
|
-
* this module keeps having to unlearn: it guessed how long to stay quiet
|
|
130
|
-
* instead of asking whether anything was actually wrong, so it was always
|
|
131
|
-
* either too short (the notice flashed over a live session) or too long (a
|
|
132
|
-
* genuinely parked box announced itself late).
|
|
133
|
-
*
|
|
134
|
-
* `unknown` and `connecting` are WAITS. Only `waking` with no wake under
|
|
135
|
-
* way — the control plane saying the box is down, and nothing bringing it
|
|
136
|
-
* up — earns a notice: the asleep one.
|
|
137
|
-
*/
|
|
138
|
-
connection?: SessionConnection;
|
|
139
112
|
}): SessionComposerReadiness;
|
|
140
113
|
/**
|
|
141
114
|
* The last turn's shimmer, decided once in `SessionChat` and passed down to
|
|
@@ -145,7 +118,7 @@ export declare function sessionComposerReadiness(input: {
|
|
|
145
118
|
* `GET .../turn`), already delay-hidden 300ms by the caller — never the raw
|
|
146
119
|
* SSE slot, which this tab can miss frames from: a dropped end-of-turn frame
|
|
147
120
|
* latched the slot busy and shimmered a finished answer until reload. A
|
|
148
|
-
* transient sub-session (`
|
|
121
|
+
* transient sub-session (`legacy-subagent-chat.tsx` mounts `SessionChat` with no
|
|
149
122
|
* `projectSessionId`) has no Kortix session row for `/turn` to answer about,
|
|
150
123
|
* so it keeps the raw slot — the same split `session-layout.tsx` makes for
|
|
151
124
|
* its busy indicator. A non-last turn is NEVER working: that is a fact about
|
|
@@ -92,22 +92,11 @@ export function sessionComposerReadiness(input) {
|
|
|
92
92
|
retryable: true,
|
|
93
93
|
};
|
|
94
94
|
}
|
|
95
|
-
|
|
96
|
-
// A PARKED / idle box: the control plane says the sandbox is not up, and
|
|
97
|
-
// nothing is actively booting — a genuine boot-stall is caught by `stalled`
|
|
98
|
-
// above, and the SDK no longer arms the stall clock for a parked box
|
|
99
|
-
// (`setOpenCodeHealth({ parked })`), so this never escalates to an infinite
|
|
100
|
-
// "taking longer than usual" spinner. The box resumes on the next SEND, so
|
|
101
|
-
// say exactly that: an honest idle state (RC-3). A wake already under way
|
|
102
|
-
// says nothing: opening the session wakes its computer in the background,
|
|
103
|
-
// and a send goes out as soon as it is up.
|
|
104
|
-
const waking = input.pendingPrompt || input.pendingDelivery || input.starting;
|
|
105
|
-
return { ready: false, notice: waking ? null : SESSION_NOTICE.idle, retryable: false };
|
|
106
|
-
}
|
|
107
|
-
// A wait is not a fault, and a routine wake is silent: `unknown` means
|
|
95
|
+
// A wait is not a fault, and sleep and wake are silent: `unknown` means
|
|
108
96
|
// nothing has answered, `connecting` that the box is up and the runtime has
|
|
109
|
-
// not reached us yet, and
|
|
110
|
-
//
|
|
97
|
+
// not reached us yet, and `waking` that the box is parked or coming up. A
|
|
98
|
+
// parked box wakes on the next send, so the user never needs to know it
|
|
99
|
+
// slept. A wake that goes wrong speaks through `stalled` or
|
|
111
100
|
// `unreachable` above.
|
|
112
101
|
return { ready: false, notice: null, retryable: false };
|
|
113
102
|
}
|
|
@@ -119,7 +108,7 @@ export function sessionComposerReadiness(input) {
|
|
|
119
108
|
* `GET .../turn`), already delay-hidden 300ms by the caller — never the raw
|
|
120
109
|
* SSE slot, which this tab can miss frames from: a dropped end-of-turn frame
|
|
121
110
|
* latched the slot busy and shimmered a finished answer until reload. A
|
|
122
|
-
* transient sub-session (`
|
|
111
|
+
* transient sub-session (`legacy-subagent-chat.tsx` mounts `SessionChat` with no
|
|
123
112
|
* `projectSessionId`) has no Kortix session row for `/turn` to answer about,
|
|
124
113
|
* so it keeps the raw slot — the same split `session-layout.tsx` makes for
|
|
125
114
|
* its busy indicator. A non-last turn is NEVER working: that is a fact about
|
|
@@ -22,7 +22,7 @@ export declare function useReminderView(now: number): (reminder: SessionReminder
|
|
|
22
22
|
nextAt: number;
|
|
23
23
|
countdown: [string, string | null];
|
|
24
24
|
share: number | null;
|
|
25
|
-
tone: "
|
|
25
|
+
tone: "red" | "purple";
|
|
26
26
|
pauseLabel: string;
|
|
27
27
|
schedule: string;
|
|
28
28
|
meta: string;
|
|
@@ -25,7 +25,8 @@ import { SessionPendingApprovalsIndicator } from './session-pending-approvals-in
|
|
|
25
25
|
import { SessionGoalIndicator } from './session-goal-indicator.js';
|
|
26
26
|
import { SessionRemindersIndicator } from './session-reminders-indicator.js';
|
|
27
27
|
import { SessionTitleInput } from './session-title-input.js';
|
|
28
|
-
import {
|
|
28
|
+
import { subagentTitle } from '../agents/agent-model.js';
|
|
29
|
+
import { SubagentHoverCard } from './subagent-hover-card.js';
|
|
29
30
|
import { Copy } from '../../icons/copy.js';
|
|
30
31
|
import { Home } from '../../internal/icons/home.js';
|
|
31
32
|
import { openSessionQuickView } from '../panel/open-session-quick-view.js';
|
|
@@ -41,7 +42,7 @@ import { cn } from '../../lib/utils.js';
|
|
|
41
42
|
import { useSessionHistoryViewStore } from '../../internal/stores/session-history-view-store.js';
|
|
42
43
|
import { useIsActionPanelOpen, useReadyChip, useToggleActionPanel, } from '../../internal/stores/kortix-computer-store.js';
|
|
43
44
|
import { createProjectSession, directSubsessions, restartProjectSession, stopProjectSession } from '@kortix/sdk';
|
|
44
|
-
import { qk, useProjectSession, useRuntimeSupports, useSessionParticipants, useSessionWatch, } from '@kortix/sdk/react';
|
|
45
|
+
import { qk, useHasSessionDesktop, useProjectSession, useRuntimeSupports, useSessionParticipants, useSessionWatch, } from '@kortix/sdk/react';
|
|
45
46
|
import { ArchiveIcon, ArrowsClockwiseIcon, BellIcon, BellSlashIcon, CaretDoubleLeftIcon, GitForkIcon, LinkSimpleIcon, CaretDownIcon, CodeSimpleIcon as Code2, FileArrowDownIcon as FileDown, FolderSimpleIcon, GlobeSimpleIcon, MonitorIcon, StackIcon as Layers, PencilSimpleIcon, PushPinIcon, PushPinSlashIcon, ArrowCounterClockwiseIcon as RotateCcw, ShareIcon as Share, SquareIcon as Square, TerminalIcon, TrashIcon, } from '@phosphor-icons/react';
|
|
46
47
|
import { useMutation, useQueryClient } from '@tanstack/react-query';
|
|
47
48
|
import { useMemo, useRef, useState } from 'react';
|
|
@@ -64,7 +65,9 @@ export function SessionSiteHeader({ sessionId, sessionTitle, isMobileView, leadi
|
|
|
64
65
|
const localizedDevTools = useLocalizedUiCatalog(DEV_TOOLS);
|
|
65
66
|
// A host that cannot reach the pty WebSocket turns the terminal off (`config.terminalEnabled`).
|
|
66
67
|
const { terminalEnabled } = useUiHostConfig();
|
|
67
|
-
|
|
68
|
+
// A template on a base other than Ubuntu 24.04, or an old image, has no desktop.
|
|
69
|
+
const hasDesktop = useHasSessionDesktop() === true;
|
|
70
|
+
const devTools = useMemo(() => localizedDevTools.filter((tool) => (tool.view !== 'terminal' || terminalEnabled) && (tool.view !== 'desktop' || hasDesktop)), [localizedDevTools, terminalEnabled, hasDesktop]);
|
|
68
71
|
const router = useUiRouter();
|
|
69
72
|
const pathname = useUiPathname();
|
|
70
73
|
const queryClient = useQueryClient();
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import type { ProjectRuntimeSession } from '@kortix/sdk';
|
|
2
2
|
import { type ReactElement } from 'react';
|
|
3
|
-
/** A subsession's own title, without OpenCode's "(@general subagent)" suffix. */
|
|
4
|
-
export declare function subagentTitle(title: string): string;
|
|
5
3
|
/**
|
|
6
4
|
* The parent session's title, on hover: the subagent sessions it spawned.
|
|
7
5
|
*
|
|
@@ -9,11 +9,8 @@ import { shortRelative } from '../actions/project-session-list-helpers.js';
|
|
|
9
9
|
import { useTranslations } from '../../i18n/index.js';
|
|
10
10
|
import { formatDistanceToNowStrict } from 'date-fns';
|
|
11
11
|
import { useState } from 'react';
|
|
12
|
+
import { subagentTitle } from '../agents/agent-model.js';
|
|
12
13
|
import { childSessionHref } from '../tool/tools/session-spawn-urls.js';
|
|
13
|
-
/** A subsession's own title, without OpenCode's "(@general subagent)" suffix. */
|
|
14
|
-
export function subagentTitle(title) {
|
|
15
|
-
return title.replace(/\s*\(@[^)]*subagent\)$/, '');
|
|
16
|
-
}
|
|
17
14
|
/**
|
|
18
15
|
* The parent session's title, on hover: the subagent sessions it spawned.
|
|
19
16
|
*
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Which Claude fix a failed turn needs, from the error text, if any. */
|
|
2
|
+
export declare function claudeConnectionAction(text: string | null | undefined): 'connect' | 'reconnect' | null;
|
|
3
|
+
/**
|
|
4
|
+
* The fix for a turn that failed on the viewer's Claude login: the provider
|
|
5
|
+
* list (Customize → Models → Providers), where Anthropic signs in with Claude,
|
|
6
|
+
* as every other subscription does. Renders on a project route only.
|
|
7
|
+
*/
|
|
8
|
+
export declare function ClaudeConnectionSlot({ action, className }: {
|
|
9
|
+
action: 'connect' | 'reconnect';
|
|
10
|
+
className?: string;
|
|
11
|
+
}): import("react").JSX.Element | null;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Button } from '../../primitives/button.js';
|
|
4
|
+
import { useTranslations } from '../../i18n/index.js';
|
|
5
|
+
import { useModelConnectionGate } from './use-model-connection-gate.js';
|
|
6
|
+
/** The turn error kortixd writes when the session user has no Claude login (`CLAUDE_CONNECT_MESSAGE`). */
|
|
7
|
+
const CLAUDE_CONNECT_MESSAGE = 'Connect your Claude subscription to use Claude models.';
|
|
8
|
+
/** The turn error kortixd writes when Anthropic refused the stored login (`CLAUDE_RECONNECT_MESSAGE`). */
|
|
9
|
+
const CLAUDE_RECONNECT_MESSAGE = 'Your Claude subscription login stopped working. Reconnect Claude to continue.';
|
|
10
|
+
/** Which Claude fix a failed turn needs, from the error text, if any. */
|
|
11
|
+
export function claudeConnectionAction(text) {
|
|
12
|
+
const value = (text ?? '').trim();
|
|
13
|
+
if (value.includes(CLAUDE_CONNECT_MESSAGE))
|
|
14
|
+
return 'connect';
|
|
15
|
+
if (value.includes(CLAUDE_RECONNECT_MESSAGE))
|
|
16
|
+
return 'reconnect';
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The fix for a turn that failed on the viewer's Claude login: the provider
|
|
21
|
+
* list (Customize → Models → Providers), where Anthropic signs in with Claude,
|
|
22
|
+
* as every other subscription does. Renders on a project route only.
|
|
23
|
+
*/
|
|
24
|
+
export function ClaudeConnectionSlot({ action, className = 'mt-2 pl-7' }) {
|
|
25
|
+
const t = useTranslations('claudeSubscription');
|
|
26
|
+
const { canConnectProvider, openConnectProvider, modal } = useModelConnectionGate();
|
|
27
|
+
if (!canConnectProvider)
|
|
28
|
+
return null;
|
|
29
|
+
return (_jsxs("div", { className: className, children: [modal, _jsx(Button, { size: "sm", className: "active:scale-[0.96]", onClick: () => openConnectProvider('providers'), children: t(action === 'reconnect' ? 'reconnectClaude' : 'connectClaude') })] }));
|
|
30
|
+
}
|
|
@@ -21,9 +21,11 @@ export declare function unavailableModelConnection(model: {
|
|
|
21
21
|
enabled?: boolean;
|
|
22
22
|
available?: boolean;
|
|
23
23
|
availability?: 'login' | 'provider';
|
|
24
|
+
providerID?: string;
|
|
25
|
+
provider?: string | null;
|
|
24
26
|
}, options: {
|
|
25
27
|
chatGptAvailable: boolean;
|
|
26
|
-
}): 'chatgpt' | 'provider' | null;
|
|
28
|
+
}): 'chatgpt' | 'claude' | 'provider' | null;
|
|
27
29
|
export declare function resolveAvailableSelectedModel(selectedModel: ModelKey | null | undefined, isSelectableModel: (model: ModelKey) => boolean): ModelKey | null;
|
|
28
30
|
/**
|
|
29
31
|
* The name of the selected model when it cannot read an attached image, else null.
|
|
@@ -18,6 +18,9 @@ export function isRunnableModel(model) {
|
|
|
18
18
|
export function unavailableModelConnection(model, options) {
|
|
19
19
|
if (model.available !== false)
|
|
20
20
|
return null;
|
|
21
|
+
// A Claude subscription model needs the caller's own Claude login, never a project provider.
|
|
22
|
+
if (model.providerID === 'claude-agent' || model.provider === 'claude-agent')
|
|
23
|
+
return 'claude';
|
|
21
24
|
return model.availability === 'login' && options.chatGptAvailable ? 'chatgpt' : 'provider';
|
|
22
25
|
}
|
|
23
26
|
export function resolveAvailableSelectedModel(selectedModel, isSelectableModel) {
|