@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
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The agent page's address: four tabs, and a view inside Access and Runtime.
|
|
3
|
+
* The page draws them as ONE rail (2026-10-28): Overview, Triggers, then the
|
|
4
|
+
* Access views and the Runtime views under their group labels. The address
|
|
5
|
+
* keeps its two levels, so every link still resolves.
|
|
6
|
+
*
|
|
7
|
+
* ?tab=overview | access | runtime | triggers
|
|
8
|
+
* ?tab=access&view=connectors | secrets | skills | tools | extensions | drives | apps | permissions | …
|
|
9
|
+
* ?tab=runtime&view=model | workspace
|
|
10
|
+
*
|
|
11
|
+
* The page used to be a rail of seventeen `?section=<key>` topics, then six
|
|
12
|
+
* tabs. Tools moved from Runtime to Access (2026-10-27): `?tab=runtime&view=tools`
|
|
13
|
+
* opens Access. Every old link still resolves: `resolveAgentLocation` maps
|
|
14
|
+
* `?section=` onto a tab and a view (Basics became the Overview's
|
|
15
|
+
* Availability panel). Instructions and People are no tabs any more: the
|
|
16
|
+
* instructions are edited on the Overview, and People is the header's Share
|
|
17
|
+
* dialog. Their old links open the Overview with the instructions in focus or
|
|
18
|
+
* the Share dialog open (`open`).
|
|
19
|
+
*/
|
|
20
|
+
export const AGENT_TABS = ['overview', 'access', 'runtime', 'triggers'];
|
|
21
|
+
/** Access views, in the order of an `agents.<name>` block in kortix.yaml. */
|
|
22
|
+
export const ACCESS_VIEWS = [
|
|
23
|
+
'tools',
|
|
24
|
+
'skills',
|
|
25
|
+
'subagents',
|
|
26
|
+
'commands',
|
|
27
|
+
'extensions',
|
|
28
|
+
'connectors',
|
|
29
|
+
'secrets',
|
|
30
|
+
'apps',
|
|
31
|
+
'actions',
|
|
32
|
+
// Last: the one row that is not an `agents.<name>` key (Files folder grants).
|
|
33
|
+
'drives',
|
|
34
|
+
];
|
|
35
|
+
export const RUNTIME_VIEWS = ['model', 'workspace'];
|
|
36
|
+
/** The URL word for a view. `actions` reads as `permissions` in a link. */
|
|
37
|
+
export function viewParam(view) {
|
|
38
|
+
return view === 'actions' ? 'permissions' : view;
|
|
39
|
+
}
|
|
40
|
+
function viewFromParam(value) {
|
|
41
|
+
if (!value)
|
|
42
|
+
return null;
|
|
43
|
+
if (value === 'permissions')
|
|
44
|
+
return 'actions';
|
|
45
|
+
return value;
|
|
46
|
+
}
|
|
47
|
+
/** Which tab owns a legacy `?section=` key. */
|
|
48
|
+
function tabOfSection(section) {
|
|
49
|
+
if (ACCESS_VIEWS.includes(section))
|
|
50
|
+
return 'access';
|
|
51
|
+
if (RUNTIME_VIEWS.includes(section))
|
|
52
|
+
return 'runtime';
|
|
53
|
+
if (section === 'basics' || section === 'instructions' || section === 'people')
|
|
54
|
+
return 'overview';
|
|
55
|
+
return section;
|
|
56
|
+
}
|
|
57
|
+
const RETIRED_TABS = { instructions: 'instructions', people: 'share' };
|
|
58
|
+
/**
|
|
59
|
+
* The tab and view a URL names, limited to what this agent has (`tabs`, and
|
|
60
|
+
* `views` for Access and Runtime). An unknown or unavailable value falls back
|
|
61
|
+
* to the first entry, never to a blank page.
|
|
62
|
+
*/
|
|
63
|
+
export function resolveAgentLocation(params, tabs, views) {
|
|
64
|
+
const retired = RETIRED_TABS[params.tab ?? ''] ?? (params.tab ? undefined : RETIRED_TABS[params.section ?? '']);
|
|
65
|
+
if (retired)
|
|
66
|
+
return { tab: 'overview', view: null, open: retired };
|
|
67
|
+
let tab = params.tab ?? null;
|
|
68
|
+
let view = viewFromParam(params.view);
|
|
69
|
+
const legacy = viewFromParam(params.section);
|
|
70
|
+
if (!tab && legacy) {
|
|
71
|
+
tab = tabOfSection(legacy);
|
|
72
|
+
view = tab === 'access' || tab === 'runtime' ? legacy : null;
|
|
73
|
+
}
|
|
74
|
+
// A view that moved tabs (Tools: Runtime → Access) follows its view.
|
|
75
|
+
if ((tab === 'access' || tab === 'runtime') && view && tabOfSection(view) !== tab) {
|
|
76
|
+
const owner = tabOfSection(view);
|
|
77
|
+
if (owner === 'access' || owner === 'runtime')
|
|
78
|
+
tab = owner;
|
|
79
|
+
}
|
|
80
|
+
if (!tab || !tabs.includes(tab))
|
|
81
|
+
tab = tabs[0] ?? 'overview';
|
|
82
|
+
if (tab !== 'access' && tab !== 'runtime')
|
|
83
|
+
return { tab, view: null };
|
|
84
|
+
const own = (tab === 'access' ? ACCESS_VIEWS : RUNTIME_VIEWS);
|
|
85
|
+
const available = own.filter((key) => views.includes(key));
|
|
86
|
+
return { tab, view: view && available.includes(view) ? view : (available[0] ?? null) };
|
|
87
|
+
}
|
|
88
|
+
export function agentLocationHref(pathname, tab, view) {
|
|
89
|
+
if (tab === 'overview' && !view)
|
|
90
|
+
return pathname;
|
|
91
|
+
return view ? `${pathname}?tab=${tab}&view=${viewParam(view)}` : `${pathname}?tab=${tab}`;
|
|
92
|
+
}
|
|
93
|
+
/** The href of a legacy section key: where an old Overview row or link lands now. */
|
|
94
|
+
export function sectionLocationHref(pathname, section) {
|
|
95
|
+
const tab = tabOfSection(section);
|
|
96
|
+
return agentLocationHref(pathname, tab, tab === 'access' || tab === 'runtime' ? section : null);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Where every `agents.<name>` key in kortix.yaml is edited: one rail row per
|
|
100
|
+
* key. `agent-tabs.test.ts` fails when the manifest schema gains a key this
|
|
101
|
+
* map lacks, so no key is ever invisible on the agent page.
|
|
102
|
+
*/
|
|
103
|
+
const OVERVIEW_ROW = 'overview';
|
|
104
|
+
export const YAML_KEY_ROW = {
|
|
105
|
+
description: OVERVIEW_ROW,
|
|
106
|
+
prompt: OVERVIEW_ROW,
|
|
107
|
+
prompt_file: 'overview',
|
|
108
|
+
enabled: 'overview',
|
|
109
|
+
hidden: 'overview',
|
|
110
|
+
mode: 'overview',
|
|
111
|
+
space: 'overview',
|
|
112
|
+
color: 'overview',
|
|
113
|
+
model: 'model',
|
|
114
|
+
variant: 'model',
|
|
115
|
+
temperature: 'model',
|
|
116
|
+
top_p: 'model',
|
|
117
|
+
steps: 'model',
|
|
118
|
+
options: 'model',
|
|
119
|
+
tools: 'tools',
|
|
120
|
+
codemode: 'tools',
|
|
121
|
+
permission: 'tools',
|
|
122
|
+
skills: 'skills',
|
|
123
|
+
subagents: 'subagents',
|
|
124
|
+
commands: 'commands',
|
|
125
|
+
extensions: 'extensions',
|
|
126
|
+
connectors: 'connectors',
|
|
127
|
+
connectors_required: 'connectors',
|
|
128
|
+
policy_sets: 'connectors',
|
|
129
|
+
secrets: 'secrets',
|
|
130
|
+
apps: 'apps',
|
|
131
|
+
kortix_permissions: 'actions',
|
|
132
|
+
workspace: 'workspace',
|
|
133
|
+
sandbox: 'workspace',
|
|
134
|
+
network_egress: 'workspace',
|
|
135
|
+
};
|
|
136
|
+
/** The editor draft's wire names for a kortix.yaml key (v2 aliases included). */
|
|
137
|
+
const WIRE_KEY = {
|
|
138
|
+
file: 'prompt_file',
|
|
139
|
+
repository_access: 'workspace',
|
|
140
|
+
kortix_cli: 'kortix_permissions',
|
|
141
|
+
connectors_personal: 'connectors_required',
|
|
142
|
+
};
|
|
143
|
+
function fields(block) {
|
|
144
|
+
const out = new Map();
|
|
145
|
+
for (const [key, value] of Object.entries(block)) {
|
|
146
|
+
if (key === 'behavior' && value && typeof value === 'object') {
|
|
147
|
+
for (const [inner, v] of Object.entries(value))
|
|
148
|
+
out.set(`behavior.${inner}`, JSON.stringify(v));
|
|
149
|
+
}
|
|
150
|
+
else
|
|
151
|
+
out.set(key, JSON.stringify(value));
|
|
152
|
+
}
|
|
153
|
+
return out;
|
|
154
|
+
}
|
|
155
|
+
/** The rail row a location shows. */
|
|
156
|
+
export function railKeyOf(location) {
|
|
157
|
+
return location.view ?? (location.tab === 'triggers' ? 'triggers' : 'overview');
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* The rail rows that hold an unsaved edit: each changed field of the draft,
|
|
161
|
+
* mapped to the row that edits it (`YAML_KEY_ROW`). An unknown field lands
|
|
162
|
+
* on Model, the row for the agent's runtime knobs.
|
|
163
|
+
*/
|
|
164
|
+
export function changedItems(draft, baseline) {
|
|
165
|
+
const a = fields(draft);
|
|
166
|
+
const b = fields(baseline);
|
|
167
|
+
const changed = new Set();
|
|
168
|
+
for (const key of new Set([...a.keys(), ...b.keys()])) {
|
|
169
|
+
if (a.get(key) === b.get(key))
|
|
170
|
+
continue;
|
|
171
|
+
const yamlKey = WIRE_KEY[key] ?? key.replace(/^behavior\./, '');
|
|
172
|
+
changed.add(YAML_KEY_ROW[yamlKey] ?? 'model');
|
|
173
|
+
}
|
|
174
|
+
return [...changed];
|
|
175
|
+
}
|
|
176
|
+
/** Edit distance, for the not-found page's "did you mean". */
|
|
177
|
+
function distance(a, b) {
|
|
178
|
+
const row = Array.from({ length: b.length + 1 }, (_, i) => i);
|
|
179
|
+
for (let i = 1; i <= a.length; i++) {
|
|
180
|
+
let prev = row[0];
|
|
181
|
+
row[0] = i;
|
|
182
|
+
for (let j = 1; j <= b.length; j++) {
|
|
183
|
+
const next = row[j];
|
|
184
|
+
row[j] = Math.min(row[j] + 1, row[j - 1] + 1, prev + (a[i - 1] === b[j - 1] ? 0 : 1));
|
|
185
|
+
prev = next;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return row[b.length];
|
|
189
|
+
}
|
|
190
|
+
/** The agent name closest to a missing one, when it is close enough to be a typo. */
|
|
191
|
+
export function closestAgentName(missing, names) {
|
|
192
|
+
let best = null;
|
|
193
|
+
for (const name of names) {
|
|
194
|
+
const d = name.includes(missing) || missing.includes(name) ? 1 : distance(missing, name);
|
|
195
|
+
if (!best || d < best.d)
|
|
196
|
+
best = { name, d };
|
|
197
|
+
}
|
|
198
|
+
return best && best.d <= Math.max(2, Math.floor(missing.length / 3)) ? best.name : null;
|
|
199
|
+
}
|
|
@@ -1,24 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* /projects/[id]/agent — the Agents list, and the landing page of Customize.
|
|
3
|
-
*
|
|
4
|
-
* Customize is agent-centric (Marko, 2026-09-01). An agent is the one object
|
|
5
|
-
* a project manager grants a person or a group — every other resource is
|
|
6
|
-
* reached THROUGH an agent — so it is the object this whole surface is built
|
|
7
|
-
* around, and this list is where the sidebar's Customize row lands. Each card
|
|
8
|
-
* is a link to that agent's page (`agentHref`): its instructions, model,
|
|
9
|
-
* triggers, grants and who may use it, on one routed screen. The cards used to
|
|
10
|
-
* open a detail modal with the editor swapped into its source pane; a modal
|
|
11
|
-
* has no URL and buried the editor two clicks deep.
|
|
12
|
-
*
|
|
13
|
-
* Reads `config.agents` off the shared `['project-detail', projectId]` query,
|
|
14
|
-
* so this page and everything else showing a project's agents cannot disagree
|
|
15
|
-
* about what they are. `toArray` because the API can return the field as
|
|
16
|
-
* `undefined` for a repo-less / capability-gated / config-build-failure
|
|
17
|
-
* project, and `.filter` on that throws into prod Sentry.
|
|
18
|
-
*
|
|
19
|
-
* The trigger count on each card comes from the same `qk.project.triggers`
|
|
20
|
-
* list the Triggers tab reads — one request, counted per agent name.
|
|
21
|
-
*/
|
|
22
1
|
export declare function AgentsPage({ projectId }: {
|
|
23
2
|
projectId: string;
|
|
24
3
|
}): import("react").JSX.Element;
|
|
@@ -1,74 +1,82 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
/**
|
|
4
|
+
* /projects/[id]/customize/agents: the Agents index, where the sidebar's
|
|
5
|
+
* Customize row lands.
|
|
6
|
+
*
|
|
7
|
+
* Customize is agent-first. My Kortix is not listed: the project home starts
|
|
8
|
+
* it. The page lists the agents a person starts, as cover cards (the default first), then the subagents other
|
|
9
|
+
* agents call, as their own section: prod's catalog layout. Each card's facts
|
|
10
|
+
* line reads what the configuration grants (KRTX-3025), never the agent's
|
|
11
|
+
* prose. A space filter appears when the project splits into spaces.
|
|
12
|
+
*
|
|
13
|
+
* New agent opens `CreateAgentModal`; `?new=1` opens it too (the sidebar's
|
|
14
|
+
* New agent row links here).
|
|
15
|
+
*
|
|
16
|
+
* Reads `config.agents` off the shared project-detail query, so this page and
|
|
17
|
+
* everything else showing a project's agents agree. The trigger and grant
|
|
18
|
+
* counts read the same lists the agent page reads.
|
|
19
|
+
*/
|
|
20
|
+
import { getProjectDetail, groupBySpace, listProjectResourceGrants, listProjectTriggers, updateProjectDefaultAgent, } from '@kortix/sdk';
|
|
21
|
+
import { contract, qk, useProjectAccountId } from '@kortix/sdk/react';
|
|
22
|
+
import { MagnifyingGlassIcon, PlusIcon } from '@phosphor-icons/react';
|
|
23
|
+
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
|
7
24
|
import { useMemo, useRef, useState } from 'react';
|
|
25
|
+
import { useTranslations as useI18nTranslations } from '../../i18n/index.js';
|
|
26
|
+
import { useSlashFocus } from '../../internal/hooks/index.js';
|
|
27
|
+
import { AgentMark, agentDisplayName } from '../../internal/components/agent-mark.js';
|
|
28
|
+
import { prefetchAgentConfig } from '../../internal/hooks/projects/use-agent-config.js';
|
|
29
|
+
import { agentHref } from '../../internal/lib/capability-tab-routes.js';
|
|
30
|
+
import { PROJECT_ACTIONS } from '../../internal/lib/project-actions.js';
|
|
31
|
+
import { useProjectCan } from '../../internal/lib/use-project-can.js';
|
|
32
|
+
import { useActiveSpace } from '../../internal/stores/active-space-store.js';
|
|
33
|
+
import { useSpacesEnabled } from '../../internal/lib/space-scope.js';
|
|
8
34
|
import { Badge } from '../../primitives/badge.js';
|
|
9
35
|
import { Button } from '../../primitives/button.js';
|
|
10
|
-
import { InputGroupSearch, InputGroupSearchClear, InputGroupSearchIcon, InputGroupSearchInput, } from '../../primitives/input-group.js';
|
|
11
36
|
import Loading from '../../primitives/loading.js';
|
|
12
|
-
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue
|
|
37
|
+
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../primitives/select.js';
|
|
13
38
|
import { errorToast, successToast } from '../../primitives/toast.js';
|
|
14
|
-
import { EmptyState } from '../../primitives/empty-state.js';
|
|
15
|
-
import { detectManifestVersion } from '../../internal/lib/manifest-version.js';
|
|
16
|
-
import { toArray } from '../shared/utils.js';
|
|
17
|
-
import { newConfigPrompt, useConfigureThread, } from '../use-configure-thread.js';
|
|
18
|
-
import { PROJECT_ACTIONS } from '../../internal/lib/project-actions.js';
|
|
19
|
-
import { useProjectCan } from '../../internal/lib/use-project-can.js';
|
|
20
39
|
import { cn } from '../../internal/lib/utils.js';
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
|
26
|
-
import { CapabilityPageShell } from '../shared/capability-page-shell.js';
|
|
27
|
-
import { agentHref } from '../../internal/lib/capability-tab-routes.js';
|
|
28
|
-
import { prefetchAgentConfig } from '../../internal/hooks/projects/use-agent-config.js';
|
|
29
|
-
import { catalogEmptyKind } from '../shared/catalog/catalog-empty.js';
|
|
40
|
+
import { EmptyState } from '../../primitives/empty-state.js';
|
|
41
|
+
import { ErrorState } from '../../primitives/error-state.js';
|
|
42
|
+
import { InputGroupSearch, InputGroupSearchClear, InputGroupSearchIcon, InputGroupSearchInput, } from '../../primitives/input-group.js';
|
|
43
|
+
import { useUiPathname, useUiRouter, useUiSearchParams } from '../../providers/ui-provider.js';
|
|
30
44
|
import { CatalogNoMatch } from '../shared/catalog/catalog-empty-state.js';
|
|
31
|
-
import {
|
|
45
|
+
import { CatalogGridSkeleton } from '../shared/catalog/catalog-grid.js';
|
|
32
46
|
import { GRID_CLASSNAME } from '../shared/catalog/catalog-grid-tokens.js';
|
|
33
|
-
import {
|
|
47
|
+
import { ALL_SPACES, CatalogSpaceTabs } from '../shared/catalog/catalog-space-tabs.js';
|
|
48
|
+
import { toArray } from '../shared/utils.js';
|
|
49
|
+
import { AgentAccessText } from './agent-access-text.js';
|
|
34
50
|
import { AgentCoverCard } from './agent-cover-card.js';
|
|
35
51
|
import { agentInMode, filterAgents } from './agent-filter.js';
|
|
36
|
-
import {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
*
|
|
40
|
-
* Customize is agent-centric (Marko, 2026-09-01). An agent is the one object
|
|
41
|
-
* a project manager grants a person or a group — every other resource is
|
|
42
|
-
* reached THROUGH an agent — so it is the object this whole surface is built
|
|
43
|
-
* around, and this list is where the sidebar's Customize row lands. Each card
|
|
44
|
-
* is a link to that agent's page (`agentHref`): its instructions, model,
|
|
45
|
-
* triggers, grants and who may use it, on one routed screen. The cards used to
|
|
46
|
-
* open a detail modal with the editor swapped into its source pane; a modal
|
|
47
|
-
* has no URL and buried the editor two clicks deep.
|
|
48
|
-
*
|
|
49
|
-
* Reads `config.agents` off the shared `['project-detail', projectId]` query,
|
|
50
|
-
* so this page and everything else showing a project's agents cannot disagree
|
|
51
|
-
* about what they are. `toArray` because the API can return the field as
|
|
52
|
-
* `undefined` for a repo-less / capability-gated / config-build-failure
|
|
53
|
-
* project, and `.filter` on that throws into prod Sentry.
|
|
54
|
-
*
|
|
55
|
-
* The trigger count on each card comes from the same `qk.project.triggers`
|
|
56
|
-
* list the Triggers tab reads — one request, counted per agent name.
|
|
57
|
-
*/
|
|
52
|
+
import { AgentTabBody, CustomizeHeader } from './agent-page-chrome.js';
|
|
53
|
+
import { CreateAgentModal } from './create-agent-modal.js';
|
|
54
|
+
import { AgentPinButton } from './agent-pin-button.js';
|
|
58
55
|
export function AgentsPage({ projectId }) {
|
|
59
56
|
const tI18nComplete = useI18nTranslations('hardcodedUi.i18nComplete');
|
|
60
|
-
|
|
61
|
-
|
|
57
|
+
const t = useI18nTranslations('agentEditor.tabs');
|
|
58
|
+
const tPage = useI18nTranslations('agentEditor.page');
|
|
62
59
|
const accountId = useProjectAccountId(projectId);
|
|
63
60
|
const canWrite = useProjectCan(projectId, PROJECT_ACTIONS.PROJECT_AGENT_WRITE, { accountId }).allowed === true;
|
|
64
61
|
const canReadTriggers = useProjectCan(projectId, PROJECT_ACTIONS.PROJECT_TRIGGER_READ, { accountId }).allowed === true;
|
|
65
|
-
const canManageMembers = useProjectCan(projectId, PROJECT_ACTIONS.PROJECT_MEMBERS_MANAGE, { accountId }).allowed ===
|
|
66
|
-
true;
|
|
67
|
-
const configure = useConfigureThread(projectId);
|
|
62
|
+
const canManageMembers = useProjectCan(projectId, PROJECT_ACTIONS.PROJECT_MEMBERS_MANAGE, { accountId }).allowed === true;
|
|
68
63
|
const queryClient = useQueryClient();
|
|
64
|
+
const params = useUiSearchParams();
|
|
65
|
+
const router = useUiRouter();
|
|
66
|
+
const pathname = useUiPathname();
|
|
67
|
+
const [creating, setCreating] = useState(false);
|
|
68
|
+
// `?new=1` opens the create modal; closing it drops the param.
|
|
69
|
+
const askedNew = params.get('new') === '1';
|
|
70
|
+
const createOpen = canWrite && (creating || askedNew);
|
|
71
|
+
const setCreateOpen = (open) => {
|
|
72
|
+
setCreating(open);
|
|
73
|
+
if (!open && askedNew)
|
|
74
|
+
router.replace(pathname);
|
|
75
|
+
};
|
|
69
76
|
const [query, setQuery] = useState('');
|
|
70
77
|
const searchRef = useRef(null);
|
|
71
|
-
|
|
78
|
+
// The table is the page's main content, not the search: no focus on arrival.
|
|
79
|
+
useSlashFocus(searchRef, true, { focusOnArrival: false });
|
|
72
80
|
const detailQuery = useQuery({
|
|
73
81
|
queryKey: qk.project.detail(projectId),
|
|
74
82
|
queryFn: () => getProjectDetail(projectId),
|
|
@@ -81,8 +89,6 @@ export function AgentsPage({ projectId }) {
|
|
|
81
89
|
enabled: canReadTriggers,
|
|
82
90
|
...contract('config'),
|
|
83
91
|
});
|
|
84
|
-
// A trigger stored as `default` counts for the project's default agent —
|
|
85
|
-
// see `triggerStartsAgent`.
|
|
86
92
|
const triggerCounts = useMemo(() => {
|
|
87
93
|
const counts = new Map();
|
|
88
94
|
const fallback = config?.default_agent ?? config?.open_code_default_agent ?? null;
|
|
@@ -92,8 +98,6 @@ export function AgentsPage({ projectId }) {
|
|
|
92
98
|
}
|
|
93
99
|
return counts;
|
|
94
100
|
}, [triggersQuery.data, config]);
|
|
95
|
-
// Who is granted each agent. Same key the agent page's People section
|
|
96
|
-
// reads, manager-gated like it.
|
|
97
101
|
const grantsQuery = useQuery({
|
|
98
102
|
queryKey: qk.project.resourceGrants(projectId),
|
|
99
103
|
queryFn: () => listProjectResourceGrants(projectId),
|
|
@@ -110,73 +114,60 @@ export function AgentsPage({ projectId }) {
|
|
|
110
114
|
}
|
|
111
115
|
return counts;
|
|
112
116
|
}, [grantsQuery.data]);
|
|
113
|
-
const facts = (agent) => (_jsx(AgentCardFacts, { agent: agent, triggerCount: triggerCounts.get(agent.name) ?? 0, grantCount: grantCounts.get(agent.name) ?? 0 }));
|
|
114
117
|
const agents = useMemo(() => toArray(config?.agents), [config]);
|
|
115
118
|
const filtered = useMemo(() => filterAgents(agents, { mode: null, query }), [agents, query]);
|
|
116
119
|
const defaultAgent = config?.default_agent ?? config?.open_code_default_agent ?? null;
|
|
117
|
-
//
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
const
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
//
|
|
130
|
-
|
|
131
|
-
//
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
function accessLabelOf(access, t) {
|
|
155
|
-
if (!access)
|
|
156
|
-
return null;
|
|
157
|
-
if (access.kind === 'full')
|
|
158
|
-
return t.raw('textf19611c61ca5');
|
|
159
|
-
const connectors = access.parts.find((part) => part.kind === 'connectors')?.value ?? 0;
|
|
160
|
-
if (connectors === 'all')
|
|
161
|
-
return t.raw('textd83250185d41');
|
|
162
|
-
return connectors > 0 ? t('text15589a542412', { count: connectors }) : null;
|
|
120
|
+
// The agents a person starts first (the default leading), subagents after.
|
|
121
|
+
const work = useMemo(() => filtered
|
|
122
|
+
.filter((agent) => !agent.platform)
|
|
123
|
+
.sort((a, b) => Number(agentInMode(b, 'primary')) - Number(agentInMode(a, 'primary')) ||
|
|
124
|
+
Number(b.name === defaultAgent) - Number(a.name === defaultAgent) ||
|
|
125
|
+
agentDisplayName(a.name).localeCompare(agentDisplayName(b.name))), [filtered, defaultAgent]);
|
|
126
|
+
// Spaces are Work in progress: with `project_channels` off, no space filter and no Space column.
|
|
127
|
+
const spacesOn = useSpacesEnabled(projectId);
|
|
128
|
+
const groups = useMemo(() => (spacesOn ? groupBySpace(work, config?.spaces) : []), [spacesOn, work, config?.spaces]);
|
|
129
|
+
const [activeSpace, setActiveSpace] = useActiveSpace(projectId);
|
|
130
|
+
const spaceFilter = activeSpace ?? ALL_SPACES;
|
|
131
|
+
const shown = spaceFilter === ALL_SPACES ? work : (groups.find((g) => g.name === spaceFilter)?.items ?? work);
|
|
132
|
+
// Agents first, subagents second (Marko, 2026-10-17): the agents a person
|
|
133
|
+
// starts get the cover cards, the default first; the ones other agents call
|
|
134
|
+
// sit in their own section. `all` is usable both ways and stays with the first.
|
|
135
|
+
const primaryAgents = shown.filter((agent) => agentInMode(agent, 'primary'));
|
|
136
|
+
const subagents = shown.filter((agent) => !agentInMode(agent, 'primary'));
|
|
137
|
+
const card = (agent, cover) => (_jsx(AgentCoverCard, { slug: agent.name, href: agentHref(projectId, agent.name), onIntent: () => prefetchAgentConfig(queryClient, projectId, agent.name), title: agentDisplayName(agent.name), description: agent.description, badges: _jsx(AgentCardBadges, { agent: agent }), coverLabel: cover, action: _jsx(AgentPinButton, { projectId: projectId, agent: agent.name, onCard: true }), meta: _jsx(AgentCardFacts, { agent: agent, triggerCount: triggerCounts.get(agent.name) ?? 0, grantCount: grantCounts.get(agent.name) ?? 0 }) }, agent.name));
|
|
138
|
+
const newButton = canWrite ? (_jsxs(Button, { size: "sm", onClick: () => setCreating(true), className: "gap-1.5", children: [_jsx(PlusIcon, { className: "size-4" }), t('newAgent')] })) : null;
|
|
139
|
+
const body = (() => {
|
|
140
|
+
if (detailQuery.isLoading)
|
|
141
|
+
return _jsx(CatalogGridSkeleton, {});
|
|
142
|
+
if (detailQuery.isError) {
|
|
143
|
+
return (_jsx(ErrorState, { size: "sm", title: t('agentsLoadError'), action: _jsx(Button, { variant: "outline", size: "sm", onClick: () => void detailQuery.refetch(), children: tI18nComplete.raw('text942087cc2d41') }) }));
|
|
144
|
+
}
|
|
145
|
+
if (agents.length === 0) {
|
|
146
|
+
return _jsx(EmptyState, { size: "sm", title: tI18nComplete.raw('text971b61f8cb4d'), description: tI18nComplete.raw('textc4e4294c6777') });
|
|
147
|
+
}
|
|
148
|
+
if (filtered.length === 0)
|
|
149
|
+
return _jsx(CatalogNoMatch, { query: query });
|
|
150
|
+
return (_jsx("div", { className: "space-y-8", children: work.length > 0 ? (_jsxs("section", { className: "space-y-3", children: [groups.length > 0 ? (_jsx(CatalogSpaceTabs, { groups: groups, value: spaceFilter, onValueChange: (v) => setActiveSpace(v === ALL_SPACES ? null : v) })) : null, primaryAgents.length > 0 ? (_jsx("div", { className: GRID_CLASSNAME, children: primaryAgents.map((agent) => card(agent, agent.name === defaultAgent ? tPage('default') : undefined)) })) : null, subagents.length > 0 ? (_jsxs("section", { "aria-labelledby": "subagents-heading", className: cn('space-y-2', primaryAgents.length > 0 && 'pt-5'), children: [_jsxs("div", { children: [_jsxs("h2", { id: "subagents-heading", className: "text-foreground text-sm font-medium", children: [tI18nComplete.raw('agentsListSubagentsTitle'), ' ', _jsx("span", { className: "text-muted-foreground font-normal tabular-nums", children: subagents.length })] }), _jsx("p", { className: "text-muted-foreground mt-1 text-xs", children: tI18nComplete.raw('agentsListSubagentsHint') })] }), _jsx("div", { className: GRID_CLASSNAME, children: subagents.map((agent) => card(agent)) })] })) : null] })) : null }));
|
|
151
|
+
})();
|
|
152
|
+
const search = (ref) => (_jsxs(InputGroupSearch, { children: [_jsx(InputGroupSearchIcon, { children: _jsx(MagnifyingGlassIcon, {}) }), _jsx(InputGroupSearchInput, { ref: ref, "aria-label": tI18nComplete.raw('text212fd04a1d20'), placeholder: tI18nComplete.raw('text212fd04a1d20'), value: query, onChange: (event) => setQuery(event.target.value), variant: "popover", size: "sm" }), query ? _jsx(InputGroupSearchClear, { onClick: () => setQuery('') }) : null] }));
|
|
153
|
+
// The same header as the agent page, My Kortix and Review (`CustomizeHeader`),
|
|
154
|
+
// so the title never jumps between them. Search sits in it from `md`; below
|
|
155
|
+
// that it is the first row of the list.
|
|
156
|
+
return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex h-full min-h-0 flex-1 flex-col", children: [_jsx(CustomizeHeader, { title: tI18nComplete.raw('text279b44d2ab4b'), rule: true, actions: _jsxs(_Fragment, { children: [_jsx("div", { className: "hidden w-64 md:block", children: search(searchRef) }), config ? _jsx(DefaultAgentSelector, { projectId: projectId, config: config, canWrite: canWrite }) : null, newButton] }) }), _jsxs(AgentTabBody, { className: "mx-auto max-w-6xl space-y-5 pb-5", children: [_jsx("div", { className: "md:hidden", children: search() }), body] })] }), canWrite ? (_jsx(CreateAgentModal, { open: createOpen, onOpenChange: setCreateOpen, projectId: projectId, config: config })) : null] }));
|
|
163
157
|
}
|
|
164
158
|
/**
|
|
165
|
-
* The card's facts line
|
|
166
|
-
*
|
|
167
|
-
*
|
|
159
|
+
* The card's facts line: what the configuration grants (KRTX-3025), in the
|
|
160
|
+
* one grant vocabulary (All, None or a count, `AgentAccessText`), then the
|
|
161
|
+
* agent's own model, triggers and grants. A fact with nothing to say is left
|
|
162
|
+
* out: no "0 triggers", no "Default model".
|
|
168
163
|
*/
|
|
169
164
|
function AgentCardFacts({ agent, triggerCount, grantCount, }) {
|
|
170
|
-
const tI18nComplete = useI18nTranslations('hardcodedUi.i18nComplete');
|
|
171
165
|
const facts = [
|
|
172
|
-
accessLabelOf(agentAccess(agent.scope), tI18nComplete),
|
|
173
166
|
agent.model ? agent.model.split('/').pop() : null,
|
|
174
167
|
triggerCount > 0 ? `${triggerCount} ${triggerCount === 1 ? 'trigger' : 'triggers'}` : null,
|
|
175
168
|
grantCount > 0 ? `${grantCount} ${grantCount === 1 ? 'grant' : 'grants'}` : null,
|
|
176
169
|
].filter((fact) => Boolean(fact));
|
|
177
|
-
|
|
178
|
-
return null;
|
|
179
|
-
return (_jsx("span", { className: "truncate tabular-nums", children: facts.map((fact, index) => (_jsxs("span", { children: [index > 0 ? (_jsx("span", { "aria-hidden": true, className: "px-1.5", children: "\u2022" })) : null, fact] }, fact))) }));
|
|
170
|
+
return (_jsxs("span", { className: "flex min-w-0 flex-wrap items-center gap-x-3 gap-y-0.5 tabular-nums", children: [_jsx(AgentAccessText, { agent: agent }), facts.map((fact) => (_jsx("span", { className: "truncate", children: fact }, fact)))] }));
|
|
180
171
|
}
|
|
181
172
|
/**
|
|
182
173
|
* Card badges — "also a subagent", disabled. The default agent is marked on
|
|
@@ -195,22 +186,17 @@ function AgentCardBadges({ agent }) {
|
|
|
195
186
|
* Which agent a new chat in this project starts with. Rides the filter row
|
|
196
187
|
* rather than a banner of its own — it is one setting, and giving it a titled
|
|
197
188
|
* block above the grid would outweigh the list it belongs to.
|
|
198
|
-
*
|
|
199
|
-
* v2-only: the default agent is a `kortix.yaml` concept, so a v1 project gets
|
|
200
|
-
* no control instead of one that cannot persist.
|
|
201
189
|
*/
|
|
202
190
|
function DefaultAgentSelector({ projectId, config, canWrite, }) {
|
|
203
191
|
const tI18nComplete = useI18nTranslations('hardcodedUi.i18nComplete');
|
|
204
192
|
const queryClient = useQueryClient();
|
|
205
|
-
// v2 and v3 declare `default_agent` in kortix.yaml; v1 has no such key.
|
|
206
|
-
const declaresDefaultAgent = detectManifestVersion(config.manifest_raw) >= 2;
|
|
207
193
|
// A subagent cannot start a chat, so it is not offered as the default.
|
|
208
194
|
const availableAgents = toArray(config.agents).filter((agent) => agent.enabled !== false && agentInMode(agent, 'primary'));
|
|
209
195
|
const current = config.default_agent ?? config.open_code_default_agent;
|
|
210
196
|
const mutation = useMutation({
|
|
211
197
|
mutationFn: (agentName) => updateProjectDefaultAgent(projectId, agentName),
|
|
212
198
|
onSuccess: async (result) => {
|
|
213
|
-
successToast(tI18nComplete('text0bb557895b32', { value0:
|
|
199
|
+
successToast(tI18nComplete('text0bb557895b32', { value0: agentDisplayName(result.default_agent) }));
|
|
214
200
|
// One invalidation, not two: the project CONFIG is a `select` projection
|
|
215
201
|
// over this same `qk.project.detail(id)` entry (`useProjectConfig`), not
|
|
216
202
|
// its own fetch. The retired standalone `['project-config', id]` slot no
|
|
@@ -219,7 +205,7 @@ function DefaultAgentSelector({ projectId, config, canWrite, }) {
|
|
|
219
205
|
},
|
|
220
206
|
onError: (error) => errorToast(error.message || tI18nComplete.raw('text7f724c2ad694')),
|
|
221
207
|
});
|
|
222
|
-
if (
|
|
208
|
+
if (availableAgents.length === 0 || !current)
|
|
223
209
|
return null;
|
|
224
|
-
return (_jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [mutation.isPending ? _jsx(Loading, { className: "size-4 shrink-0" }) : null, _jsxs(Select, { value: current, onValueChange: (agentName) => mutation.mutate(agentName), disabled: !canWrite || mutation.isPending, children: [_jsx(SelectTrigger, { "aria-label": tI18nComplete.raw('text94da52ecd6c5'), className: "h-9 w-44 shrink-0", size: "sm", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { align: "end", children: availableAgents.map((agent) => (_jsx(SelectItem, { value: agent.name, children: _jsxs("span", { className: "flex min-w-0 items-center gap-2", children: [_jsx(AgentMark, { slug: agent.name }), _jsx("span", { className: "truncate", children:
|
|
210
|
+
return (_jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [mutation.isPending ? _jsx(Loading, { className: "size-4 shrink-0" }) : null, _jsxs(Select, { value: current, onValueChange: (agentName) => mutation.mutate(agentName), disabled: !canWrite || mutation.isPending, children: [_jsx(SelectTrigger, { "aria-label": tI18nComplete.raw('text94da52ecd6c5'), className: "h-9 w-44 shrink-0", size: "sm", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { align: "end", children: availableAgents.map((agent) => (_jsx(SelectItem, { value: agent.name, children: _jsxs("span", { className: "flex min-w-0 items-center gap-2", children: [_jsx(AgentMark, { slug: agent.name }), _jsx("span", { className: "truncate", children: agentDisplayName(agent.name) })] }) }, agent.name))) })] })] }));
|
|
225
211
|
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agents.<name>.connectors_required`: the connectors a session needs connected
|
|
3
|
+
* before it starts. A connector is required only while the agent is granted it
|
|
4
|
+
* by name (Specific): under All or None no single connector is picked. Pure,
|
|
5
|
+
* so the agent page's rules are testable without a render.
|
|
6
|
+
*/
|
|
7
|
+
import type { AgentGrantSetV2 } from '@kortix/sdk';
|
|
8
|
+
/** `undefined` stands for an empty list: the key leaves kortix.yaml. */
|
|
9
|
+
type RequiredList = string[] | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* The required list after the grant changes to `next`. A connector dropped
|
|
12
|
+
* from the pick list, or a switch to All or None, drops its Required flag.
|
|
13
|
+
* Returns `required` itself when nothing changes, so the caller writes nothing.
|
|
14
|
+
*/
|
|
15
|
+
export declare function pruneRequiredConnectors(required: RequiredList, next: AgentGrantSetV2): RequiredList;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agents.<name>.connectors_required`: the connectors a session needs connected
|
|
3
|
+
* before it starts. A connector is required only while the agent is granted it
|
|
4
|
+
* by name (Specific): under All or None no single connector is picked. Pure,
|
|
5
|
+
* so the agent page's rules are testable without a render.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* The required list after the grant changes to `next`. A connector dropped
|
|
9
|
+
* from the pick list, or a switch to All or None, drops its Required flag.
|
|
10
|
+
* Returns `required` itself when nothing changes, so the caller writes nothing.
|
|
11
|
+
*/
|
|
12
|
+
export function pruneRequiredConnectors(required, next) {
|
|
13
|
+
const current = required ?? [];
|
|
14
|
+
const picked = new Set(Array.isArray(next) ? next : []);
|
|
15
|
+
const kept = current.filter((slug) => picked.has(slug));
|
|
16
|
+
if (kept.length === current.length)
|
|
17
|
+
return required;
|
|
18
|
+
return kept.length ? kept : undefined;
|
|
19
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ProjectConfigSummary } from '@kortix/sdk';
|
|
2
|
+
import type * as React from 'react';
|
|
3
|
+
export type CreateAgentStart = 'describe' | 'blank' | 'duplicate';
|
|
4
|
+
/** The request My Kortix receives. English, like every configure prompt. */
|
|
5
|
+
export declare function createAgentPrompt(input: {
|
|
6
|
+
start: CreateAgentStart;
|
|
7
|
+
name: string;
|
|
8
|
+
description: string;
|
|
9
|
+
from?: {
|
|
10
|
+
name: string;
|
|
11
|
+
path: string;
|
|
12
|
+
};
|
|
13
|
+
}): string;
|
|
14
|
+
export declare function CreateAgentModal({ open, onOpenChange, projectId, config, }: {
|
|
15
|
+
open: boolean;
|
|
16
|
+
onOpenChange: (open: boolean) => void;
|
|
17
|
+
projectId: string;
|
|
18
|
+
config: ProjectConfigSummary | null;
|
|
19
|
+
}): React.JSX.Element;
|