@kortix/ui 0.14.12 → 0.14.14
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/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 +1330 -53
- package/dist/i18n/en.js +1422 -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/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.js +13 -4
- 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/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/easy-panel.js +1 -1
- package/dist/session/panel/easy/step-icon.js +5 -1
- package/dist/session/panel/mobile-tool-drawer.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.js +24 -5
- 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 +10 -8
- 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
|
@@ -3,9 +3,10 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
3
3
|
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
|
4
4
|
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
5
5
|
import { useTranslations } from '../../../i18n/index.js';
|
|
6
|
-
import { ApiError, createAccountSecretResource, deleteAccountSecretResource, listAccountMembers, setAccountSecretResourceAccess, rotateAccountSecretResource, pollProjectProviderOAuth, startProjectProviderOAuth, } from '@kortix/sdk';
|
|
6
|
+
import { ApiError, createAccountSecretResource, deleteAccountSecretResource, listAccountMembers, setAccountSecretResourceAccess, rotateAccountSecretResource, pollProjectProviderOAuth, startProjectProviderOAuth, completeClaudeSubscriptionLogin, startClaudeSubscriptionLogin, } from '@kortix/sdk';
|
|
7
7
|
import { refreshProjectProviderState, useAccountSecretResources } from '@kortix/sdk/react';
|
|
8
8
|
import { ChatGptDeviceChallenge } from '../llm-provider/chatgpt-device-challenge.js';
|
|
9
|
+
import { ClaudeCodeStep } from '../llm-provider/claude-code-step.js';
|
|
9
10
|
import { Button } from '../../../primitives/button.js';
|
|
10
11
|
import { ConfirmDialog } from '../../../primitives/confirm-dialog.js';
|
|
11
12
|
import { Field, FieldLabel } from '../../../primitives/field.js';
|
|
@@ -112,11 +113,103 @@ function useChatGptAuthorization(projectId) {
|
|
|
112
113
|
}, [projectId]);
|
|
113
114
|
return { challenge, waiting, finishing, error, authorize, cancel, reset };
|
|
114
115
|
}
|
|
116
|
+
/**
|
|
117
|
+
* One Claude sign-in at a time, with the same contract as
|
|
118
|
+
* `useChatGptAuthorization`: `authorize` resolves once the account is stored,
|
|
119
|
+
* or with null. Between those, the server runs `claude setup-token`, claude.com
|
|
120
|
+
* opens in a tab, and the member pastes the code it shows (`submitCode`). The
|
|
121
|
+
* tab opens inside the click, so a popup blocker lets it through. A refused
|
|
122
|
+
* code ends the sign-in: the next try signs in again.
|
|
123
|
+
*/
|
|
124
|
+
function useClaudeAuthorization(projectId) {
|
|
125
|
+
const generation = useRef(0);
|
|
126
|
+
useEffect(() => () => { generation.current++; }, []);
|
|
127
|
+
const [challenge, setChallenge] = useState(null);
|
|
128
|
+
const [waiting, setWaiting] = useState(false);
|
|
129
|
+
const [finishing, setFinishing] = useState(false);
|
|
130
|
+
const [checking, setChecking] = useState(false);
|
|
131
|
+
const [error, setError] = useState(null);
|
|
132
|
+
const pending = useRef(null);
|
|
133
|
+
const settle = (value) => {
|
|
134
|
+
pending.current?.resolve(value);
|
|
135
|
+
pending.current = null;
|
|
136
|
+
};
|
|
137
|
+
const cancel = useCallback(() => { generation.current++; settle(null); }, []);
|
|
138
|
+
const reset = useCallback(() => {
|
|
139
|
+
generation.current++;
|
|
140
|
+
settle(null);
|
|
141
|
+
setWaiting(false);
|
|
142
|
+
setFinishing(false);
|
|
143
|
+
setChecking(false);
|
|
144
|
+
setChallenge(null);
|
|
145
|
+
setError(null);
|
|
146
|
+
}, []);
|
|
147
|
+
const authorize = useCallback(async (input, messages) => {
|
|
148
|
+
if (!projectId)
|
|
149
|
+
return null;
|
|
150
|
+
settle(null);
|
|
151
|
+
const current = ++generation.current;
|
|
152
|
+
setWaiting(true);
|
|
153
|
+
setFinishing(false);
|
|
154
|
+
setChallenge(null);
|
|
155
|
+
setError(null);
|
|
156
|
+
const popup = typeof window === 'undefined' ? null : window.open('about:blank', '_blank');
|
|
157
|
+
try {
|
|
158
|
+
const started = await startClaudeSubscriptionLogin(projectId, input);
|
|
159
|
+
if (current !== generation.current) {
|
|
160
|
+
popup?.close();
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
setChallenge({ url: started.authorize_url, code: null });
|
|
164
|
+
if (popup && !popup.closed)
|
|
165
|
+
popup.location.href = started.authorize_url;
|
|
166
|
+
return await new Promise((resolve) => {
|
|
167
|
+
pending.current = { flowId: started.flow_id, generation: current, failed: messages.failed, resolve };
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
popup?.close();
|
|
172
|
+
if (current === generation.current) {
|
|
173
|
+
setError(err instanceof Error && err.message ? err.message : messages.failed);
|
|
174
|
+
setWaiting(false);
|
|
175
|
+
setChallenge(null);
|
|
176
|
+
}
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
}, [projectId]);
|
|
180
|
+
const submitCode = useCallback(async (code) => {
|
|
181
|
+
const flow = pending.current;
|
|
182
|
+
if (!projectId || !flow || !code.trim())
|
|
183
|
+
return;
|
|
184
|
+
setChecking(true);
|
|
185
|
+
setError(null);
|
|
186
|
+
try {
|
|
187
|
+
const connected = await completeClaudeSubscriptionLogin(projectId, { flowId: flow.flowId, code: code.trim() });
|
|
188
|
+
if (flow.generation !== generation.current)
|
|
189
|
+
return;
|
|
190
|
+
setChallenge(null);
|
|
191
|
+
setFinishing(true);
|
|
192
|
+
settle(connected.secret_id);
|
|
193
|
+
}
|
|
194
|
+
catch (err) {
|
|
195
|
+
if (flow.generation !== generation.current)
|
|
196
|
+
return;
|
|
197
|
+
setError(err instanceof Error && err.message ? err.message : flow.failed);
|
|
198
|
+
setWaiting(false);
|
|
199
|
+
setChallenge(null);
|
|
200
|
+
settle(null);
|
|
201
|
+
}
|
|
202
|
+
finally {
|
|
203
|
+
setChecking(false);
|
|
204
|
+
}
|
|
205
|
+
}, [projectId]);
|
|
206
|
+
return { challenge, waiting, finishing, checking, error, authorize, cancel, reset, submitCode };
|
|
207
|
+
}
|
|
115
208
|
/**
|
|
116
209
|
* Provider keys live beside the provider they configure. The secret value stays
|
|
117
|
-
* write-only. With `oauth`, the panel manages ChatGPT accounts: any
|
|
118
|
-
* member can connect their own subscription ("Only you"); sharing one
|
|
119
|
-
* others needs `project.secret.write`, the same rule the API enforces.
|
|
210
|
+
* write-only. With `oauth`, the panel manages ChatGPT or Claude accounts: any
|
|
211
|
+
* project member can connect their own subscription ("Only you"); sharing one
|
|
212
|
+
* with others needs `project.secret.write`, the same rule the API enforces.
|
|
120
213
|
*/
|
|
121
214
|
export function AccountSecretResourcesPanel({ accountId, projectId, providerId, providerName, envVar, canWrite, oauth }) {
|
|
122
215
|
const t = useTranslations('pooledSecrets');
|
|
@@ -144,15 +237,23 @@ export function AccountSecretResourcesPanel({ accountId, projectId, providerId,
|
|
|
144
237
|
const [sharingMode, setSharingMode] = useState('project');
|
|
145
238
|
const [selectedMembers, setSelectedMembers] = useState(NO_MEMBERS);
|
|
146
239
|
const [deleting, setDeleting] = useState(null);
|
|
147
|
-
const
|
|
240
|
+
const claude = oauth?.kind === 'claude';
|
|
241
|
+
const chatGptAuthorization = useChatGptAuthorization(claude ? undefined : oauth?.projectId);
|
|
242
|
+
const claudeAuthorization = useClaudeAuthorization(claude ? oauth?.projectId : undefined);
|
|
243
|
+
const authorization = claude ? claudeAuthorization : chatGptAuthorization;
|
|
244
|
+
/** The ChatGPT string, or its Claude twin. */
|
|
245
|
+
const tAccount = (chatGptKey, claudeKey, values) => t(claude ? claudeKey : chatGptKey, values);
|
|
246
|
+
const signInStep = (challenge) => claude
|
|
247
|
+
? _jsx(ClaudeCodeStep, { url: challenge?.url ?? null, checking: claudeAuthorization.checking, onSubmit: (code) => void claudeAuthorization.submitCode(code) })
|
|
248
|
+
: challenge && _jsx(ChatGptDeviceChallenge, { url: challenge.url, code: challenge.code });
|
|
148
249
|
const members = useQuery({ queryKey: ['account-members', accountId], queryFn: () => listAccountMembers(accountId) });
|
|
149
250
|
const actorRole = members.data?.find((member) => member.user_id === user?.id)?.account_role;
|
|
150
251
|
const keys = (resources.data?.secrets ?? []).filter((secret) => secret.provider_id === providerId);
|
|
151
252
|
const manageable = (secret) => secret.created_by === user?.id || actorRole === 'owner' || actorRole === 'admin';
|
|
152
|
-
const authMessages = { expired: t('oauthExpired'), failed:
|
|
253
|
+
const authMessages = { expired: t('oauthExpired'), failed: tAccount('connectFailed', 'claudeConnectFailed') };
|
|
153
254
|
const defaultLabel = () => {
|
|
154
255
|
const name = labelOwnerName(user && { email: user.email, user_metadata: user.metadata });
|
|
155
|
-
return oauth && name ?
|
|
256
|
+
return oauth && name ? tAccount('defaultAccountLabel', 'claudeDefaultAccountLabel', { name }) : '';
|
|
156
257
|
};
|
|
157
258
|
const closeCreate = () => {
|
|
158
259
|
authorization.cancel();
|
|
@@ -173,7 +274,9 @@ export function AccountSecretResourcesPanel({ accountId, projectId, providerId,
|
|
|
173
274
|
finally {
|
|
174
275
|
refreshProjectProviderState(queryClient, projectId);
|
|
175
276
|
void queryClient.invalidateQueries({ queryKey: ['session-provider-secret-pools'] });
|
|
176
|
-
|
|
277
|
+
if (claude)
|
|
278
|
+
void queryClient.invalidateQueries({ queryKey: ['claude-subscription', projectId] });
|
|
279
|
+
oauth?.onConnected(claude ? 'claude-agent' : 'codex');
|
|
177
280
|
}
|
|
178
281
|
};
|
|
179
282
|
const connectOAuth = async () => {
|
|
@@ -187,7 +290,7 @@ export function AccountSecretResourcesPanel({ accountId, projectId, providerId,
|
|
|
187
290
|
return;
|
|
188
291
|
await finishConnection().catch(() => { });
|
|
189
292
|
setCreating(false);
|
|
190
|
-
successToast(
|
|
293
|
+
successToast(tAccount('accountConnected', 'claudeAccountConnected'));
|
|
191
294
|
};
|
|
192
295
|
const reconnectOAuth = async (secret) => {
|
|
193
296
|
const credential = await authorization.authorize({ resourceId: secret.secret_id }, authMessages);
|
|
@@ -195,7 +298,7 @@ export function AccountSecretResourcesPanel({ accountId, projectId, providerId,
|
|
|
195
298
|
return;
|
|
196
299
|
await finishConnection().catch(() => { });
|
|
197
300
|
setReconnecting(null);
|
|
198
|
-
successToast(
|
|
301
|
+
successToast(tAccount('accountReconnected', 'claudeAccountReconnected'));
|
|
199
302
|
};
|
|
200
303
|
const openReconnect = (secret) => {
|
|
201
304
|
authorization.reset();
|
|
@@ -269,8 +372,8 @@ export function AccountSecretResourcesPanel({ accountId, projectId, providerId,
|
|
|
269
372
|
const busy = save.isPending || authorization.waiting;
|
|
270
373
|
// Only a successful read can say "no accounts"; loading and errors say so themselves.
|
|
271
374
|
const empty = Boolean(oauth) && resources.isSuccess && keys.length === 0;
|
|
272
|
-
return (_jsxs("section", { className: "min-w-0 space-y-2", "aria-label": oauth ?
|
|
273
|
-
: oauth ? t('accountCount', { count: keys.length }) : t('keyCount', { count: keys.length }) }), canWrite && _jsx(Button, { size: "sm", variant: empty ? 'default' : 'secondary', onClick: openCreate, children: empty ?
|
|
375
|
+
return (_jsxs("section", { className: "min-w-0 space-y-2", "aria-label": oauth ? tAccount('chatGptAccounts', 'claudeAccounts') : t('providerKeysFor', { provider: providerName }), children: [_jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsx("p", { className: "text-muted-foreground text-xs", children: !resources.isSuccess ? null : empty ? tAccount('noChatGptAccounts', 'noClaudeAccounts')
|
|
376
|
+
: oauth ? t('accountCount', { count: keys.length }) : t('keyCount', { count: keys.length }) }), canWrite && _jsx(Button, { size: "sm", variant: empty ? 'default' : 'secondary', onClick: openCreate, children: empty ? tAccount('connectChatGpt', 'connectClaude') : oauth ? t('addAccount') : t('addKey') })] }), resources.isLoading ? _jsx("div", { role: "status", "aria-label": t('loadingKeys'), children: _jsx(Loading, {}) }) : resources.isError ? (_jsx(ErrorState, { size: "sm", title: t('loadError'), action: _jsx(Button, { size: "sm", variant: "secondary", disabled: resources.isFetching, onClick: () => void resources.refetch(), children: common('retry') }) })) : keys.length ? (_jsx("ul", { className: "space-y-1", children: keys.map((secret) => {
|
|
274
377
|
const canManage = canWrite && manageable(secret);
|
|
275
378
|
const canReconnect = Boolean(oauth) && canWrite && secret.created_by === user?.id;
|
|
276
379
|
const canChangeAccess = canManage && canShare;
|
|
@@ -280,16 +383,16 @@ export function AccountSecretResourcesPanel({ accountId, projectId, providerId,
|
|
|
280
383
|
const undecryptable = secret.status === 'undecryptable';
|
|
281
384
|
return (_jsxs("li", { className: "border-border flex min-w-0 items-center gap-3 rounded-md border px-3 py-1.5", children: [_jsxs("span", { className: "text-foreground min-w-0 flex-1 text-sm font-medium", children: [_jsx("span", { className: "block break-words", children: secret.label }), _jsx("span", { className: "text-muted-foreground block text-xs font-normal", children: accessLine(secret) }), stale && (_jsx("span", { className: "text-muted-foreground block text-xs font-normal", children: t('needsReconnection') })), secret.cooldown_until && Date.parse(secret.cooldown_until) > resources.dataUpdatedAt && (_jsx("span", { className: "text-muted-foreground block text-xs font-normal", children: t('coolingDown') }))] }), undecryptable && _jsx(UndecryptableValue, { hint: tUndecryptable(oauth ? 'loginHint' : 'keyHint') }), (stale || undecryptable) && canReconnect && (_jsx(Button, { size: "sm", variant: "secondary", "aria-label": t('reconnectTitle', { label: secret.label }), onClick: () => openReconnect(secret), children: t('reconnectAccount') })), undecryptable && canManage && !oauth && (_jsx(Button, { size: "sm", variant: "secondary", onClick: () => { setValue(''); save.reset(); setRotating(secret); }, children: tUndecryptable('reenterKey') })), (canManage || canReconnect) && _jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { size: "icon-sm", variant: "ghost", "aria-label": t('actionsFor', { label: secret.label }), children: _jsx(DotsThreeIcon, { className: "size-4" }) }) }), _jsxs(DropdownMenuContent, { align: "end", children: [canReconnect && _jsx(DropdownMenuItem, { onSelect: () => openReconnect(secret), children: t('reconnectAccount') }), canChangeAccess && _jsx(DropdownMenuItem, { onSelect: () => { changeGrant.reset(); setSharingMode(secret.access_mode); setSelectedMembers({ memberIds: secret.granted_user_ids, groupIds: [], inviteEmails: [] }); setSharing(secret); }, children: t('manageAccess') }), canManage && !oauth && _jsx(DropdownMenuItem, { onSelect: () => { setValue(''); save.reset(); setRotating(secret); }, children: t('rotateKey') }), canManage && _jsx(DropdownMenuItem, { onSelect: () => setDeleting(secret), children: oauth ? t('deleteAccount') : t('deleteKey') })] })] })] }, secret.secret_id));
|
|
282
385
|
}) })) : null, _jsx(Modal, { open: creating || rotating !== null, onOpenChange: (open) => { if (!open && !save.isPending && !authorization.finishing)
|
|
283
|
-
closeCreate(); }, children: _jsxs(ModalContent, { className: "lg:max-w-md", children: [_jsxs(ModalHeader, { children: [_jsx(ModalTitle, { children: rotating ? t('rotateLabel', { label: rotating.label }) : `${oauth ? t('addAccount') : t('addKey')} · ${providerName}` }), _jsx(ModalDescription, { children:
|
|
284
|
-
: authorization.challenge
|
|
285
|
-
_jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: `provider-key-value-${providerId}`, children: t('apiKey') }), _jsx(Input, { id: `provider-key-value-${providerId}`, type: "password", value: value, disabled: save.isPending, onChange: (event) => setValue(event.target.value), autoComplete: "off" })] }), !rotating && !authorization.challenge && !authorization.finishing && _jsxs("div", { className: "space-y-2", children: [_jsx(FieldLabel, { children: t('whoCanUse') }), _jsxs(RadioGroup, { value: createMode, onValueChange: (next) => setCreateMode(next), className: "space-y-2", children: [_jsx(RadioGroupItem, { value: "private", id: `create-${providerId}-private`, label: t('onlyYou'), description: t('onlyYouDescription'), size: "lg", variant: "outline", disabled: busy }), _jsx(RadioGroupItem, { value: "project", id: `create-${providerId}-project`, label: t('everyoneInProject'), description: t('everyoneDescription'), size: "lg", variant: "outline", disabled: busy || !canShare }), _jsx(RadioGroupItem, { value: "members", id: `create-${providerId}-members`, label: t('specificMembers'), description: t('specificDescription'), size: "lg", variant: "outline", disabled: busy || !canShare })] }), !canShare && _jsx("p", { className: "text-muted-foreground text-xs", children: t('shareRequiresPermission') }), createMode === 'members' && _jsx(PrincipalPicker, { scope: { kind: 'project', projectId }, selection: "multi", kinds: ['member'], value: selectedMembers, onChange: setSelectedMembers, disabled: busy, autoFocus: false })] })] }), _jsxs(ModalFooter, { children: [_jsx(Button, { variant: "secondary", disabled: save.isPending || authorization.finishing, onClick: closeCreate, children: t('cancel') }), _jsx(Button, { disabled: oauth ? authorization.waiting || !label.trim() : save.isPending || !value.trim() || (!rotating && !label.trim()), onClick: () => oauth ? void connectOAuth() : save.mutate(), children: oauth ? authorization.finishing ? t('saving') : authorization.waiting ? t('oauthWaiting') : authorization.error ? common('retry') : t('connectAccount') : save.isPending ? t('saving') : t('saveKey') })] })] }) }), oauth && _jsx(Modal, { open: reconnecting !== null, onOpenChange: (open) => { if (!open && !authorization.finishing)
|
|
286
|
-
closeReconnect(); }, children: _jsxs(ModalContent, { className: "lg:max-w-md", children: [_jsxs(ModalHeader, { children: [_jsx(ModalTitle, { children: t('reconnectTitle', { label: reconnectLabel }) }), _jsx(ModalDescription, { children:
|
|
386
|
+
closeCreate(); }, children: _jsxs(ModalContent, { className: "lg:max-w-md", children: [_jsxs(ModalHeader, { children: [_jsx(ModalTitle, { children: rotating ? t('rotateLabel', { label: rotating.label }) : `${oauth ? t('addAccount') : t('addKey')} · ${providerName}` }), _jsx(ModalDescription, { children: rotating ? t('valueNeverShown') : oauth ? tAccount('oauthCreationDescription', 'claudeOauthCreationDescription') : t('creationDescription') })] }), _jsxs(ModalBody, { className: "max-h-[60vh] space-y-3 overflow-y-auto", children: [save.isError && _jsx("p", { role: "alert", className: "text-destructive text-sm", children: save.error instanceof Error ? save.error.message : t('saveError') }), oauth && authorization.error && _jsx("p", { role: "alert", className: "text-destructive text-sm", children: authorization.error }), !rotating && _jsx(_Fragment, { children: _jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: `provider-key-label-${providerId}`, children: t('label') }), _jsx(Input, { id: `provider-key-label-${providerId}`, value: label, disabled: busy, onChange: (event) => setLabel(event.target.value), placeholder: oauth ? tAccount('accountLabelPlaceholder', 'claudeAccountLabelPlaceholder') : t('primaryKey'), maxLength: 100 })] }) }), oauth ? authorization.finishing ? _jsx(ChatGptSignInFinishing, { label: t('oauthFinishing') })
|
|
387
|
+
: (authorization.challenge || (claude && authorization.waiting)) && signInStep(authorization.challenge) :
|
|
388
|
+
_jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: `provider-key-value-${providerId}`, children: t('apiKey') }), _jsx(Input, { id: `provider-key-value-${providerId}`, type: "password", value: value, disabled: save.isPending, onChange: (event) => setValue(event.target.value), autoComplete: "off" })] }), !rotating && !authorization.challenge && !authorization.finishing && !(claude && authorization.waiting) && _jsxs("div", { className: "space-y-2", children: [_jsx(FieldLabel, { children: t('whoCanUse') }), _jsxs(RadioGroup, { value: createMode, onValueChange: (next) => setCreateMode(next), className: "space-y-2", children: [_jsx(RadioGroupItem, { value: "private", id: `create-${providerId}-private`, label: t('onlyYou'), description: t('onlyYouDescription'), size: "lg", variant: "outline", disabled: busy }), _jsx(RadioGroupItem, { value: "project", id: `create-${providerId}-project`, label: t('everyoneInProject'), description: t('everyoneDescription'), size: "lg", variant: "outline", disabled: busy || !canShare }), _jsx(RadioGroupItem, { value: "members", id: `create-${providerId}-members`, label: t('specificMembers'), description: t('specificDescription'), size: "lg", variant: "outline", disabled: busy || !canShare })] }), !canShare && _jsx("p", { className: "text-muted-foreground text-xs", children: t('shareRequiresPermission') }), createMode === 'members' && _jsx(PrincipalPicker, { scope: { kind: 'project', projectId }, selection: "multi", kinds: ['member'], value: selectedMembers, onChange: setSelectedMembers, disabled: busy, autoFocus: false })] })] }), _jsxs(ModalFooter, { children: [_jsx(Button, { variant: "secondary", disabled: save.isPending || authorization.finishing, onClick: closeCreate, children: t('cancel') }), _jsx(Button, { disabled: oauth ? authorization.waiting || !label.trim() : save.isPending || !value.trim() || (!rotating && !label.trim()), onClick: () => oauth ? void connectOAuth() : save.mutate(), children: oauth ? authorization.finishing ? t('saving') : authorization.waiting ? t('oauthWaiting') : authorization.error ? common('retry') : t('connectAccount') : save.isPending ? t('saving') : t('saveKey') })] })] }) }), oauth && _jsx(Modal, { open: reconnecting !== null, onOpenChange: (open) => { if (!open && !authorization.finishing)
|
|
389
|
+
closeReconnect(); }, children: _jsxs(ModalContent, { className: "lg:max-w-md", children: [_jsxs(ModalHeader, { children: [_jsx(ModalTitle, { children: t('reconnectTitle', { label: reconnectLabel }) }), _jsx(ModalDescription, { children: tAccount('reconnectDescription', 'claudeReconnectDescription') })] }), _jsxs(ModalBody, { className: "space-y-3", children: [authorization.error && _jsx("p", { role: "alert", className: "text-destructive text-sm", children: authorization.error }), authorization.finishing
|
|
287
390
|
? _jsx(ChatGptSignInFinishing, { label: t('oauthFinishing') })
|
|
288
|
-
: authorization.challenge
|
|
289
|
-
?
|
|
391
|
+
: authorization.challenge || (claude && authorization.waiting)
|
|
392
|
+
? signInStep(authorization.challenge)
|
|
290
393
|
: authorization.waiting && _jsx("div", { role: "status", "aria-label": t('oauthWaiting'), children: _jsx(Loading, {}) })] }), _jsxs(ModalFooter, { children: [_jsx(Button, { variant: "secondary", disabled: authorization.finishing, onClick: closeReconnect, children: t('cancel') }), _jsx(Button, { disabled: authorization.waiting || !reconnecting, onClick: () => { if (reconnecting)
|
|
291
394
|
void reconnectOAuth(reconnecting); }, children: authorization.finishing ? t('saving') : authorization.waiting ? t('oauthWaiting') : authorization.error ? common('retry') : t('reconnectAccount') })] })] }) }), _jsx(Modal, { open: sharing !== null, onOpenChange: (open) => { if (!open && !changeGrant.isPending)
|
|
292
395
|
setSharing(null); }, children: _jsxs(ModalContent, { className: "lg:max-w-md", children: [_jsxs(ModalHeader, { children: [_jsx(ModalTitle, { children: t('accessTo', { label: sharing?.label ?? '' }) }), _jsx(ModalDescription, { children: t('accessDescription') })] }), _jsxs(ModalBody, { className: "max-h-[60vh] space-y-4 overflow-y-auto", children: [changeGrant.isError && _jsx("p", { role: "alert", className: "text-destructive text-sm", children: t('accessError') }), _jsxs(RadioGroup, { value: sharingMode, onValueChange: (next) => setSharingMode(next), className: "space-y-2", children: [_jsx(RadioGroupItem, { value: "project", id: `access-${providerId}-project`, label: t('everyoneInProject'), description: t('everyoneDescription'), size: "lg", variant: "outline", disabled: changeGrant.isPending }), _jsx(RadioGroupItem, { value: "members", id: `access-${providerId}-members`, label: t('specificMembers'), description: t('specificDescription'), size: "lg", variant: "outline", disabled: changeGrant.isPending })] }), sharingMode === 'members' && _jsx(Field, { className: "gap-1.5", children: _jsx(PrincipalPicker, { scope: { kind: 'project', projectId }, selection: "multi", kinds: ['member'], value: selectedMembers, onChange: setSelectedMembers, disabled: changeGrant.isPending, autoFocus: false }) })] }), _jsxs(ModalFooter, { className: "sm:justify-between", children: [_jsx(Button, { size: "sm", variant: "outline-ghost", disabled: changeGrant.isPending, onClick: () => setSharing(null), children: t('cancel') }), _jsx(Button, { size: "sm", disabled: changeGrant.isPending, onClick: () => changeGrant.mutate(), children: changeGrant.isPending ? t('saving') : t('done') })] })] }) }), _jsx(ConfirmDialog, { open: deleting !== null, onOpenChange: (open) => { if (!open)
|
|
293
|
-
setDeleting(null); }, title:
|
|
396
|
+
setDeleting(null); }, title: oauth ? tAccount('deleteAccountConfirmTitle', 'claudeDeleteAccountConfirmTitle') : t('deleteConfirmTitle'), description: deleting ? t(oauth ? 'deleteAccountConfirmDescription' : 'deleteConfirmDescription', { label: deleting.label }) : '', confirmLabel: oauth ? t('deleteAccount') : t('deleteKey'), confirmVariant: "destructive", isPending: remove.isPending, onConfirm: () => { if (deleting)
|
|
294
397
|
remove.mutate(deleting.secret_id); } })] }));
|
|
295
398
|
}
|
|
@@ -33,7 +33,7 @@ export declare function SkillsSection({ draft, set, options }: GrantSectionProps
|
|
|
33
33
|
export declare function ConnectorsSection({ draft, set, options }: GrantSectionProps): import("react").JSX.Element;
|
|
34
34
|
export declare function SecretsSection({ draft, set, options }: GrantSectionProps): import("react").JSX.Element;
|
|
35
35
|
/**
|
|
36
|
-
* A
|
|
36
|
+
* A grant over a project registry: the declared subagents
|
|
37
37
|
* this agent may start, the registered commands it may run, the registered
|
|
38
38
|
* extensions a session of it loads. One card, the same All · Pick · None
|
|
39
39
|
* control as Skills.
|
|
@@ -20,6 +20,7 @@ import { CaretDownIcon, CubeIcon } from '@phosphor-icons/react';
|
|
|
20
20
|
import { UiLink as Link } from '../../../providers/ui-provider.js';
|
|
21
21
|
import { EditorSection, SettingRow } from './agent-editor-primitives.js';
|
|
22
22
|
import { pruneRequiredConnectors } from './connectors-personal.js';
|
|
23
|
+
import { plainGrant } from '../../shared/agent-resource-scope.js';
|
|
23
24
|
import { GrantSetField, KortixPermissionsField } from './grant-mode-field.js';
|
|
24
25
|
/**
|
|
25
26
|
* Marks one granted connector as required before session start.
|
|
@@ -60,7 +61,7 @@ export function ManageButton({ tab, href, }) {
|
|
|
60
61
|
*/
|
|
61
62
|
export function SkillsSection({ draft, set, options }) {
|
|
62
63
|
const tI18nComplete = useI18nTranslations('hardcodedUi.i18nComplete');
|
|
63
|
-
return (_jsx(EditorSection, { title: tI18nComplete.raw('text66d0f523a379'), description: tI18nComplete.raw('textb27e54100c96'), trailing: _jsx(ManageButton, { tab: "skills" }), lead: true, bare: true, children: _jsx(GrantSetField, { value: draft.skills, onChange: (v) => set('skills', v), options: options, emptyLabel: tI18nComplete.raw('text66e36043ff7c') }) }));
|
|
64
|
+
return (_jsx(EditorSection, { title: tI18nComplete.raw('text66d0f523a379'), description: tI18nComplete.raw('textb27e54100c96'), trailing: _jsx(ManageButton, { tab: "skills" }), lead: true, bare: true, children: _jsx(GrantSetField, { value: plainGrant(draft.skills), onChange: (v) => set('skills', v), options: options, emptyLabel: tI18nComplete.raw('text66e36043ff7c') }) }));
|
|
64
65
|
}
|
|
65
66
|
export function ConnectorsSection({ draft, set, options }) {
|
|
66
67
|
const tI18nComplete = useI18nTranslations('hardcodedUi.i18nComplete');
|
|
@@ -83,14 +84,14 @@ export function SecretsSection({ draft, set, options }) {
|
|
|
83
84
|
return (_jsx(EditorSection, { title: tI18nComplete.raw('textd8707d411d99'), description: tI18nComplete.raw('text7f619d9e30a8'), trailing: _jsx(ManageButton, { tab: "secrets" }), lead: true, bare: true, children: _jsx(GrantSetField, { value: draft.secrets, onChange: (v) => set('secrets', v), options: options, emptyLabel: tI18nComplete.raw('text82a37b8c2266') }) }));
|
|
84
85
|
}
|
|
85
86
|
/**
|
|
86
|
-
* A
|
|
87
|
+
* A grant over a project registry: the declared subagents
|
|
87
88
|
* this agent may start, the registered commands it may run, the registered
|
|
88
89
|
* extensions a session of it loads. One card, the same All · Pick · None
|
|
89
90
|
* control as Skills.
|
|
90
91
|
*/
|
|
91
92
|
export function RegistryGrantSection({ grant, draft, set, options, }) {
|
|
92
93
|
const t = useI18nTranslations('agents.grants');
|
|
93
|
-
return (_jsx(EditorSection, { title: t(`${grant}.title`), description: t(`${grant}.description`), lead: true, bare: true, children: _jsx(GrantSetField, { value: draft[grant], onChange: (v) => set(grant, v), options: options, emptyLabel: t(`${grant}.empty`) }) }));
|
|
94
|
+
return (_jsx(EditorSection, { title: t(`${grant}.title`), description: t(`${grant}.description`), lead: true, bare: true, children: _jsx(GrantSetField, { value: plainGrant(draft[grant]), onChange: (v) => set(grant, v), options: options, emptyLabel: t(`${grant}.empty`) }) }));
|
|
94
95
|
}
|
|
95
96
|
/** Kortix permissions (`kortix_permissions` in kortix.yaml): which project
|
|
96
97
|
* operations the agent may perform, through any surface. A block read from a
|
|
@@ -107,6 +108,7 @@ export function ProjectActionsSection({ draft, set }) {
|
|
|
107
108
|
export function WorkspaceSection({ draft, set, sandboxTemplates, defaultSandboxSlug, }) {
|
|
108
109
|
const tI18nComplete = useI18nTranslations('hardcodedUi.i18nComplete');
|
|
109
110
|
const tRepository = useI18nTranslations('repositoryAccess');
|
|
111
|
+
const tTabs = useI18nTranslations('agentEditor.tabs');
|
|
110
112
|
const pinned = draft.sandbox ? sandboxTemplates.find((t) => t.slug === draft.sandbox) : undefined;
|
|
111
113
|
const projectDefault = defaultSandboxSlug
|
|
112
114
|
? sandboxTemplates.find((t) => t.slug === defaultSandboxSlug)
|
|
@@ -125,5 +127,7 @@ export function WorkspaceSection({ draft, set, sandboxTemplates, defaultSandboxS
|
|
|
125
127
|
: tI18nComplete.raw('text64f405e80a8d'), children: _jsx(SandboxTemplateMenu, { items: sandboxTemplates, selectedSlug: draft.sandbox ?? null, resolvedSlug: defaultSandboxSlug, inherit: {
|
|
126
128
|
label: tI18nComplete.raw('texte8cb80e5c5cb'),
|
|
127
129
|
description: tI18nComplete.raw('textb23625948eee'),
|
|
128
|
-
}, onSelect: (slug) => set('sandbox', slug ?? undefined), align: "end", trigger: _jsxs(Button, { type: "button", variant: "outline", size: "sm", "aria-label": tI18nComplete.raw('text9e471951a1b4'), className: "w-full justify-between gap-2 font-normal", children: [_jsxs("span", { className: "flex min-w-0 items-center gap-2", children: [_jsx(PinnedIcon, { className: "text-muted-foreground size-3.5 shrink-0" }), _jsx("span", { className: cn('truncate', stalePin && 'text-kortix-orange font-mono'), children: pinned ? pinned.name : (stalePin ?? tI18nComplete.raw('texte8cb80e5c5cb')) })] }), _jsx(CaretDownIcon, { className: "text-muted-foreground size-3.5 shrink-0" })] }) }) }), _jsx(SettingRow, { label: tRepository('label'), help: tRepository(draft.repository_access === false ? 'disabled' : 'enabled'), children: _jsx(Switch, { "aria-label": tRepository('label'), checked: draft.repository_access ?? true, onCheckedChange: (enabled) => set('repository_access', enabled) }) })
|
|
130
|
+
}, onSelect: (slug) => set('sandbox', slug ?? undefined), align: "end", trigger: _jsxs(Button, { type: "button", variant: "outline", size: "sm", "aria-label": tI18nComplete.raw('text9e471951a1b4'), className: "w-full justify-between gap-2 font-normal", children: [_jsxs("span", { className: "flex min-w-0 items-center gap-2", children: [_jsx(PinnedIcon, { className: "text-muted-foreground size-3.5 shrink-0" }), _jsx("span", { className: cn('truncate', stalePin && 'text-kortix-orange font-mono'), children: pinned ? pinned.name : (stalePin ?? tI18nComplete.raw('texte8cb80e5c5cb')) })] }), _jsx(CaretDownIcon, { className: "text-muted-foreground size-3.5 shrink-0" })] }) }) }), _jsx(SettingRow, { label: tRepository('label'), help: tRepository(draft.repository_access === false ? 'disabled' : 'enabled'), children: _jsx(Switch, { "aria-label": tRepository('label'), checked: draft.repository_access ?? true, onCheckedChange: (enabled) => set('repository_access', enabled) }) }), _jsx(SettingRow, { label: tTabs('networkEgress'), children: _jsx("span", { className: "text-muted-foreground text-sm text-pretty sm:text-right", children: draft.network_egress
|
|
131
|
+
? tTabs('networkEgressDeclared')
|
|
132
|
+
: tTabs('networkEgressNone') }) })] }));
|
|
129
133
|
}
|
|
@@ -10,12 +10,15 @@ export declare function BasicsSection({ draft, set, oc, setOc, showDescription,
|
|
|
10
10
|
* instructions — pass `false` there so the field is not offered twice. */
|
|
11
11
|
showDescription?: boolean;
|
|
12
12
|
}): import("react").JSX.Element;
|
|
13
|
-
export declare function ModelSection({ oc, setOc, showPrompt, }: {
|
|
13
|
+
export declare function ModelSection({ oc, setOc, showPrompt, lead, }: {
|
|
14
14
|
oc: RuntimeAgentConfig;
|
|
15
15
|
setOc: SetRuntime;
|
|
16
16
|
/** The agent page gives the system prompt the whole left column — pass
|
|
17
17
|
* `false` there so the collapsed copy of it does not sit in this section. */
|
|
18
18
|
showPrompt?: boolean;
|
|
19
|
+
/** `false` under a host that already titles the pane (the Models page's
|
|
20
|
+
* "This agent" tab): the first section then takes a subsection header. */
|
|
21
|
+
lead?: boolean;
|
|
19
22
|
}): import("react").JSX.Element;
|
|
20
23
|
/**
|
|
21
24
|
* Whether a slider row is showing its default.
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from 'react';
|
|
3
4
|
import { useTranslations as useI18nTranslations } from '../../../i18n/index.js';
|
|
4
5
|
/**
|
|
5
6
|
* The first two sections of the agent editor: what the agent IS (Basics) and
|
|
@@ -33,11 +34,12 @@ import { EditorSection, InlineAction, SettingBlock, SettingRow } from './agent-e
|
|
|
33
34
|
const INHERIT = '__inherit__';
|
|
34
35
|
export function BasicsSection({ draft, set, oc, setOc, showDescription = true, }) {
|
|
35
36
|
const tI18nComplete = useI18nTranslations('hardcodedUi.i18nComplete');
|
|
37
|
+
const tSpace = useI18nTranslations('agentEditor.tabs');
|
|
36
38
|
return (_jsxs(EditorSection, { title: tI18nComplete.raw('text8fdd2ee8475e'), description: tI18nComplete.raw('text4e420a5186f0'), lead: true, children: [_jsx(SettingRow, { label: tI18nComplete.raw('text92c1cdfdf4cb'), help: tI18nComplete.raw('textbe90a56d29da'), children: _jsx("div", { className: "flex sm:justify-end", children: _jsx(Switch, { "aria-label": tI18nComplete.raw('text92c1cdfdf4cb'), checked: draft.enabled !== false, onCheckedChange: (v) => set('enabled', v ? undefined : false) }) }) }), showDescription ? (_jsx(SettingBlock, { label: tI18nComplete.raw('text526e0087cc3f'), help: oc.mode === 'subagent'
|
|
37
39
|
? tI18nComplete.raw('text77e2bc11f6ab')
|
|
38
|
-
: tI18nComplete.raw('text9965df7c3221'), children: _jsx(Textarea, { "aria-label": tI18nComplete.raw('text526e0087cc3f'), value: oc.description ?? '', placeholder: tI18nComplete.raw('text446f4eabf99f'), minHeight: 44, className: "text-sm", onChange: (e) => setOc('description', e.target.value) }) })) : null, _jsx(SettingRow, { label: tI18nComplete.raw('text12f67f8539c4'), help: oc.mode ? AGENT_MODE_HELP[oc.mode] : tI18nComplete.raw('text64f405e80a8d'), children: _jsxs(Select, { value: oc.mode ?? INHERIT, onValueChange: (value) => setOc('mode', value === INHERIT ? undefined : value), children: [_jsx(SelectTrigger, { "aria-label": tI18nComplete.raw('text12f67f8539c4'), className: "h-9 w-full", children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: INHERIT, children: tI18nComplete.raw('texte8cb80e5c5cb') }), AGENT_MODES.map((mode) => (_jsx(SelectItem, { value: mode, children: AGENT_MODE_LABEL[mode] }, mode)))] })] }) }), _jsx(SettingRow, { label: tI18nComplete.raw('textc7bcb471c03d'), help: tI18nComplete.raw('textdd4971af3f91'), children: _jsx("div", { className: "flex sm:justify-end", children: _jsx(Switch, { "aria-label": tI18nComplete.raw('textc7bcb471c03d'), checked: !oc.hidden, onCheckedChange: (v) => setOc('hidden', v ? undefined : true) }) }) })] }));
|
|
40
|
+
: tI18nComplete.raw('text9965df7c3221'), children: _jsx(Textarea, { "aria-label": tI18nComplete.raw('text526e0087cc3f'), value: oc.description ?? '', placeholder: tI18nComplete.raw('text446f4eabf99f'), minHeight: 44, className: "text-sm", onChange: (e) => setOc('description', e.target.value) }) })) : null, _jsx(SettingRow, { label: tI18nComplete.raw('text12f67f8539c4'), help: oc.mode ? AGENT_MODE_HELP[oc.mode] : tI18nComplete.raw('text64f405e80a8d'), children: _jsxs(Select, { value: oc.mode ?? INHERIT, onValueChange: (value) => setOc('mode', value === INHERIT ? undefined : value), children: [_jsx(SelectTrigger, { "aria-label": tI18nComplete.raw('text12f67f8539c4'), className: "h-9 w-full", children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: INHERIT, children: tI18nComplete.raw('texte8cb80e5c5cb') }), AGENT_MODES.map((mode) => (_jsx(SelectItem, { value: mode, children: AGENT_MODE_LABEL[mode] }, mode)))] })] }) }), _jsx(SettingRow, { label: tSpace('space'), help: tSpace('spaceHelp'), children: _jsx(Input, { "aria-label": tSpace('space'), className: "h-9 w-full sm:max-w-56", value: draft.space ?? '', placeholder: tSpace('spacePlaceholder'), onChange: (e) => set('space', e.target.value.toLowerCase() || undefined) }) }), _jsx(SettingRow, { label: tI18nComplete.raw('textc7bcb471c03d'), help: tI18nComplete.raw('textdd4971af3f91'), children: _jsx("div", { className: "flex sm:justify-end", children: _jsx(Switch, { "aria-label": tI18nComplete.raw('textc7bcb471c03d'), checked: !oc.hidden, onCheckedChange: (v) => setOc('hidden', v ? undefined : true) }) }) })] }));
|
|
39
41
|
}
|
|
40
|
-
export function ModelSection({ oc, setOc, showPrompt = true, }) {
|
|
42
|
+
export function ModelSection({ oc, setOc, showPrompt = true, lead = true, }) {
|
|
41
43
|
const tI18nComplete = useI18nTranslations('hardcodedUi.i18nComplete');
|
|
42
44
|
const { data: providers } = useRuntimeProviders();
|
|
43
45
|
const models = flattenModels(providers, { providerMode: modelProviderMode(providers) });
|
|
@@ -50,11 +52,38 @@ export function ModelSection({ oc, setOc, showPrompt = true, }) {
|
|
|
50
52
|
? models.find((m) => m.providerID === selectedModelKey.providerID && m.modelID === selectedModelKey.modelID)
|
|
51
53
|
: undefined;
|
|
52
54
|
const variantChoices = selectedModel?.variants ? Object.keys(selectedModel.variants) : [];
|
|
53
|
-
return (_jsxs(_Fragment, { children: [_jsxs(EditorSection, { title: tI18nComplete.raw('text5e2c614c23f0'), description: tI18nComplete.raw('text32398dbb68e2'), lead:
|
|
55
|
+
return (_jsxs(_Fragment, { children: [_jsxs(EditorSection, { title: tI18nComplete.raw('text5e2c614c23f0'), description: tI18nComplete.raw('text32398dbb68e2'), lead: lead, children: [_jsx(SettingRow, { label: tI18nComplete.raw('text34455bf1d857'), help: oc.model ? (_jsx(InlineAction, { onClick: () => setOc('model', undefined), children: tI18nComplete.raw('text9db60344e984') })) : (tI18nComplete.raw('text64f405e80a8d')), children: _jsx("div", { className: "flex sm:justify-end", children: _jsx(ModelSelector, { models: models, providers: providers, selectedModel: selectedModelKey, unsetLabel: tI18nComplete.raw('texte8cb80e5c5cb'), onSelect: (m) => setOc('model', m ? modelKeyToWire(m) : undefined) }) }) }), variantChoices.length > 0 ? (_jsx(SettingRow, { label: tI18nComplete.raw('text264c28cbf01c'), help: oc.variant
|
|
54
56
|
? tI18nComplete.raw('text4dd21464c579')
|
|
55
57
|
: tI18nComplete.raw('textf39c806f5724'), children: _jsx("div", { className: "flex sm:justify-end", children: _jsx(ReasoningEffortSelector, { variants: variantChoices, selectedVariant: oc.variant ?? null, onVariantChange: (v) => setOc('variant', v ?? undefined) }) }) })) : (_jsx(SettingRow, { label: tI18nComplete.raw('text3f19fe84a2de'), help: selectedModelKey
|
|
56
58
|
? tI18nComplete.raw('text0443f619cb33')
|
|
57
|
-
: tI18nComplete.raw('text6376d74077c0'), children: _jsx(Input, { "aria-label": tI18nComplete.raw('text3f19fe84a2de'), value: oc.variant ?? '', placeholder: tI18nComplete.raw('text352a25678fb9'), variant: "popover", className: "h-9 w-full text-sm", onChange: (e) => setOc('variant', e.target.value) }) })), showPrompt ? (_jsx(SettingBlock, { label: tI18nComplete.raw('text561257c019e5'), help: tI18nComplete.raw('textad63817393a7'), children: _jsxs(Disclosure, { variant: "outline", className: "overflow-hidden rounded-md", children: [_jsx(DisclosureTrigger, { variant: "outline", children: _jsxs(Button, { variant: "popover", className: "flex w-full items-center justify-between gap-3 rounded-none text-sm font-normal", children: [_jsx("span", { className: "min-w-0 truncate", children: oc.prompt ? firstLine(oc.prompt) : tI18nComplete.raw('textdaaf5ab03267') }), _jsx("span", { className: "text-muted-foreground shrink-0 text-xs", children: oc.prompt ? 'Edit' : tI18nComplete.raw('text47f3fe537320') })] }) }), _jsx(DisclosureContent, { variant: "outline", contentClassName: "border-border border-t", children: _jsx(Textarea, { "aria-label": tI18nComplete.raw('text561257c019e5'), value: oc.prompt ?? '', placeholder: tI18nComplete.raw('text94a18ea1d428'), minHeight: 160, className: "rounded-none border-0 font-mono text-xs focus-visible:border-0 focus-visible:ring-0", onChange: (e) => setOc('prompt', e.target.value) }) })] }) })) : null] }), _jsxs(EditorSection, { title: tI18nComplete.raw('text6d06116595a9'), description: tI18nComplete.raw('text33439eb47c9a'), children: [_jsx(SliderRow, { label: tI18nComplete.raw('textb958ce8b871a'), help: tI18nComplete.raw('textd380d30f3d60'), value: oc.temperature, fallback: 0, min: 0, max: 2, step: 0.05, onChange: (v) => setOc('temperature', v) }), _jsx(SliderRow, { label: tI18nComplete.raw('text714db3dbb0b7'), help: tI18nComplete.raw('text4f370db531ba'), value: oc.top_p, fallback: 1, min: 0, max: 1, step: 0.01, onChange: (v) => setOc('top_p', v) }), _jsx(SettingRow, { label: tI18nComplete.raw('textfdc639c47624'), help: tI18nComplete.raw('textbf7ff92baea3'), children: _jsx(Input, { "aria-label": tI18nComplete.raw('textfdc639c47624'), type: "number", min: 1, value: oc.steps ?? '', placeholder: tI18nComplete.raw('textf7fcff0d8fea'), variant: "popover", className: "h-9 w-full text-sm tabular-nums", onChange: (e) => setOc('steps', e.target.value ? Math.max(1, Number(e.target.value)) : undefined) }) })] })] }));
|
|
59
|
+
: tI18nComplete.raw('text6376d74077c0'), children: _jsx(Input, { "aria-label": tI18nComplete.raw('text3f19fe84a2de'), value: oc.variant ?? '', placeholder: tI18nComplete.raw('text352a25678fb9'), variant: "popover", className: "h-9 w-full text-sm", onChange: (e) => setOc('variant', e.target.value) }) })), showPrompt ? (_jsx(SettingBlock, { label: tI18nComplete.raw('text561257c019e5'), help: tI18nComplete.raw('textad63817393a7'), children: _jsxs(Disclosure, { variant: "outline", className: "overflow-hidden rounded-md", children: [_jsx(DisclosureTrigger, { variant: "outline", children: _jsxs(Button, { variant: "popover", className: "flex w-full items-center justify-between gap-3 rounded-none text-sm font-normal", children: [_jsx("span", { className: "min-w-0 truncate", children: oc.prompt ? firstLine(oc.prompt) : tI18nComplete.raw('textdaaf5ab03267') }), _jsx("span", { className: "text-muted-foreground shrink-0 text-xs", children: oc.prompt ? 'Edit' : tI18nComplete.raw('text47f3fe537320') })] }) }), _jsx(DisclosureContent, { variant: "outline", contentClassName: "border-border border-t", children: _jsx(Textarea, { "aria-label": tI18nComplete.raw('text561257c019e5'), value: oc.prompt ?? '', placeholder: tI18nComplete.raw('text94a18ea1d428'), minHeight: 160, className: "rounded-none border-0 font-mono text-xs focus-visible:border-0 focus-visible:ring-0", onChange: (e) => setOc('prompt', e.target.value) }) })] }) })) : null] }), _jsxs(EditorSection, { title: tI18nComplete.raw('text6d06116595a9'), description: tI18nComplete.raw('text33439eb47c9a'), children: [_jsx(SliderRow, { label: tI18nComplete.raw('textb958ce8b871a'), help: tI18nComplete.raw('textd380d30f3d60'), value: oc.temperature, fallback: 0, min: 0, max: 2, step: 0.05, onChange: (v) => setOc('temperature', v) }), _jsx(SliderRow, { label: tI18nComplete.raw('text714db3dbb0b7'), help: tI18nComplete.raw('text4f370db531ba'), value: oc.top_p, fallback: 1, min: 0, max: 1, step: 0.01, onChange: (v) => setOc('top_p', v) }), _jsx(SettingRow, { label: tI18nComplete.raw('textfdc639c47624'), help: tI18nComplete.raw('textbf7ff92baea3'), children: _jsx(Input, { "aria-label": tI18nComplete.raw('textfdc639c47624'), type: "number", min: 1, value: oc.steps ?? '', placeholder: tI18nComplete.raw('textf7fcff0d8fea'), variant: "popover", className: "h-9 w-full text-sm tabular-nums", onChange: (e) => setOc('steps', e.target.value ? Math.max(1, Number(e.target.value)) : undefined) }) }), _jsx(ProviderOptionsRow, { value: oc.options, onChange: (next) => setOc('options', next) })] })] }));
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* `options` (kortix.yaml): free-form provider settings as JSON. The draft
|
|
63
|
+
* changes only when the text parses to an object; an empty field clears it.
|
|
64
|
+
*/
|
|
65
|
+
function ProviderOptionsRow({ value, onChange, }) {
|
|
66
|
+
const t = useI18nTranslations('agentEditor.tabs');
|
|
67
|
+
const [text, setText] = useState(() => (value ? JSON.stringify(value, null, 2) : ''));
|
|
68
|
+
const [invalid, setInvalid] = useState(false);
|
|
69
|
+
const commit = (next) => {
|
|
70
|
+
setText(next);
|
|
71
|
+
if (!next.trim()) {
|
|
72
|
+
setInvalid(false);
|
|
73
|
+
return onChange(undefined);
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
const parsed = JSON.parse(next);
|
|
77
|
+
const ok = !!parsed && typeof parsed === 'object' && !Array.isArray(parsed);
|
|
78
|
+
setInvalid(!ok);
|
|
79
|
+
if (ok)
|
|
80
|
+
onChange(parsed);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
setInvalid(true);
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
return (_jsxs(SettingBlock, { label: t('providerOptions'), help: t('providerOptionsHelp'), children: [_jsx(Textarea, { "aria-label": t('providerOptions'), value: text, placeholder: JSON.stringify({ reasoning: 'high' }), className: "min-h-20 font-mono text-xs", "aria-invalid": invalid || undefined, onChange: (e) => commit(e.target.value) }), invalid ? _jsx("p", { className: "text-destructive text-xs", children: t('providerOptionsInvalid') }) : null] }));
|
|
58
87
|
}
|
|
59
88
|
/**
|
|
60
89
|
* Whether a slider row is showing its default.
|
|
@@ -19,8 +19,8 @@ export declare const THEME_COLOR_SWATCH: Record<(typeof THEME_COLORS)[number], s
|
|
|
19
19
|
export declare const PERMISSION_ACTIONS: readonly ["allow", "ask", "deny"];
|
|
20
20
|
/** Display names — see AGENT_MODE_LABEL. */
|
|
21
21
|
export declare const PERMISSION_ACTION_LABEL: Record<(typeof PERMISSION_ACTIONS)[number], string>;
|
|
22
|
-
export declare const PERMISSION_RULE_KEYS: readonly ["read", "edit", "glob", "grep", "
|
|
23
|
-
export declare const PERMISSION_ACTION_ONLY_KEYS: readonly ["
|
|
22
|
+
export declare const PERMISSION_RULE_KEYS: readonly ["read", "edit", "glob", "grep", "bash", "task", "skill", "external_directory"];
|
|
23
|
+
export declare const PERMISSION_ACTION_ONLY_KEYS: readonly ["question", "webfetch", "websearch"];
|
|
24
24
|
export declare const PERMISSION_RULE_GROUPS: {
|
|
25
25
|
label: string;
|
|
26
26
|
keys: (typeof PERMISSION_RULE_KEYS)[number][];
|
|
@@ -50,28 +50,24 @@ export const PERMISSION_ACTION_LABEL = {
|
|
|
50
50
|
// `skill` is intentionally EXCLUDED — the Skills governance control below owns
|
|
51
51
|
// `permission.skill` (the compiler maps `skills:` onto it), so exposing it here
|
|
52
52
|
// too would give two controls fighting over one key.
|
|
53
|
+
// The keys pi enforces (`harness/pi/interactions.ts`, `runtime.ts`): every new
|
|
54
|
+
// session runs pi. `list`, `lsp`, `todowrite` and `doom_loop` only ever meant
|
|
55
|
+
// something to OpenCode and are not offered; a manifest that sets one keeps it.
|
|
53
56
|
export const PERMISSION_RULE_KEYS = [
|
|
54
57
|
'read',
|
|
55
58
|
'edit',
|
|
56
59
|
'glob',
|
|
57
60
|
'grep',
|
|
58
|
-
'list',
|
|
59
61
|
'bash',
|
|
60
62
|
'task',
|
|
63
|
+
'skill',
|
|
61
64
|
'external_directory',
|
|
62
|
-
'lsp',
|
|
63
65
|
];
|
|
64
66
|
// Permission keys that only ever take a bare action (no glob-map form upstream).
|
|
65
|
-
export const PERMISSION_ACTION_ONLY_KEYS = [
|
|
66
|
-
'todowrite',
|
|
67
|
-
'question',
|
|
68
|
-
'webfetch',
|
|
69
|
-
'websearch',
|
|
70
|
-
'doom_loop',
|
|
71
|
-
];
|
|
67
|
+
export const PERMISSION_ACTION_ONLY_KEYS = ['question', 'webfetch', 'websearch'];
|
|
72
68
|
export const PERMISSION_RULE_GROUPS = [
|
|
73
|
-
{ label: 'Files and search', keys: ['read', 'edit', 'glob', 'grep'
|
|
74
|
-
{ label: 'Commands and tools', keys: ['bash', 'task', '
|
|
69
|
+
{ label: 'Files and search', keys: ['read', 'edit', 'glob', 'grep'] },
|
|
70
|
+
{ label: 'Commands and tools', keys: ['bash', 'task', 'skill', 'external_directory'] },
|
|
75
71
|
];
|
|
76
72
|
/** The heading over the keys that take a bare action and never a path rule. */
|
|
77
73
|
export const PERMISSION_ACTION_ONLY_GROUP_LABEL = 'Everything else';
|
|
@@ -91,6 +87,7 @@ export const PERMISSION_KEY_LABEL = {
|
|
|
91
87
|
list: 'List folders',
|
|
92
88
|
bash: 'Run shell commands',
|
|
93
89
|
task: 'Hand work to a subagent',
|
|
90
|
+
skill: 'Load a skill',
|
|
94
91
|
external_directory: 'Reach outside the project',
|
|
95
92
|
lsp: 'Use the language server',
|
|
96
93
|
todowrite: 'Keep a todo list',
|
|
@@ -106,7 +103,8 @@ export const PERMISSION_KEY_HELP = {
|
|
|
106
103
|
grep: 'Search file contents by pattern.',
|
|
107
104
|
list: 'List directory contents.',
|
|
108
105
|
bash: 'Run shell commands.',
|
|
109
|
-
task: '
|
|
106
|
+
task: 'Start a subagent (the agent tool). A pattern names the subagent.',
|
|
107
|
+
skill: 'Load a skill. A pattern names the skill.',
|
|
110
108
|
external_directory: 'Access paths outside this project workspace.',
|
|
111
109
|
lsp: 'Use language-server tooling — go-to-definition, diagnostics.',
|
|
112
110
|
todowrite: "Maintain the session's todo list.",
|
|
@@ -24,7 +24,7 @@ import { type ReactNode } from 'react';
|
|
|
24
24
|
* does not own their props — the shell sets the style once for everything
|
|
25
25
|
* under it.
|
|
26
26
|
*/
|
|
27
|
-
export type EditorSectionStyle = 'flat' | 'panel';
|
|
27
|
+
export type EditorSectionStyle = 'flat' | 'panel' | 'tab';
|
|
28
28
|
export declare function EditorSectionStyleProvider({ value, children, }: {
|
|
29
29
|
value: EditorSectionStyle;
|
|
30
30
|
children: ReactNode;
|
|
@@ -24,8 +24,8 @@ export function EditorSectionStyleProvider({ value, children, }) {
|
|
|
24
24
|
*/
|
|
25
25
|
export function EditorSection({ title, description, trailing, lead = false, bare = false, children, }) {
|
|
26
26
|
const style = useContext(EditorSectionStyleContext);
|
|
27
|
-
if (style === 'panel') {
|
|
28
|
-
return (_jsxs("section", { className: lead ? 'space-y-6' : 'space-y-3', children: [lead ? (
|
|
27
|
+
if (style === 'panel' || style === 'tab') {
|
|
28
|
+
return (_jsxs("section", { className: lead ? (style === 'tab' ? 'space-y-5' : 'space-y-6') : 'space-y-3', children: [lead ? (
|
|
29
29
|
// Headings stand alone (Jay, 2026-10-20): a sentence under every
|
|
30
30
|
// title made the page read as prose.
|
|
31
31
|
_jsx(SettingsSectionHeader, { title: title, action: trailing, className: "pb-1" })) : (_jsx(SettingsSubsectionHeader, { title: title, action: trailing })), bare ? children : _jsx(SettingsRowGroup, { children: children })] }));
|
|
@@ -50,7 +50,7 @@ export function EditorList({ className, ...props }) {
|
|
|
50
50
|
*/
|
|
51
51
|
export function SettingRow({ label, help, children, }) {
|
|
52
52
|
const style = useContext(EditorSectionStyleContext);
|
|
53
|
-
return (_jsxs("div", { className: cn('flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between sm:gap-6', style === '
|
|
53
|
+
return (_jsxs("div", { className: cn('flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between sm:gap-6', style === 'flat' ? 'py-3.5' : 'px-4 py-3'), children: [_jsx(SettingLabel, { label: label, help: help }), _jsx("div", { className: "w-full shrink-0 sm:w-52", children: children })] }));
|
|
54
54
|
}
|
|
55
55
|
/**
|
|
56
56
|
* Label and help above a full-width control — for anything a row cannot hold:
|
|
@@ -58,7 +58,7 @@ export function SettingRow({ label, help, children, }) {
|
|
|
58
58
|
*/
|
|
59
59
|
export function SettingBlock({ label, help, children, }) {
|
|
60
60
|
const style = useContext(EditorSectionStyleContext);
|
|
61
|
-
return (_jsxs("div", { className: cn('space-y-2.5', style === '
|
|
61
|
+
return (_jsxs("div", { className: cn('space-y-2.5', style === 'flat' ? 'py-3.5' : 'px-4 py-3'), children: [_jsx(SettingLabel, { label: label, help: help }), children] }));
|
|
62
62
|
}
|
|
63
63
|
/**
|
|
64
64
|
* The label pair. A plain `<span>`, not `<Label>`: none of these controls take
|