@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,86 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { adminPath } from '../../lib/routes.js';
|
|
4
|
+
import { useProjectConfig } from '@kortix/sdk/react';
|
|
5
|
+
import { CpuIcon, GearSixIcon, ListIcon, TrayIcon } from '@phosphor-icons/react';
|
|
6
|
+
import { createContext, useContext } from 'react';
|
|
7
|
+
import { useTranslations as useI18nTranslations } from '../../i18n/index.js';
|
|
8
|
+
import { AgentMark, agentDisplayName } from '../components/agent-mark.js';
|
|
9
|
+
import { CountBadge } from '../../primitives/count-badge.js';
|
|
10
|
+
import { cn } from '../../lib/utils.js';
|
|
11
|
+
import { SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, useSidebar, } from '../../primitives/sidebar.js';
|
|
12
|
+
import { UiLink as Link, useUiPathname } from '../../providers/ui-provider.js';
|
|
13
|
+
import { useIsMobile } from '../hooks/index.js';
|
|
14
|
+
import { activeCapabilityTab, agentHref, capabilityTabHref } from '../lib/capability-tab-routes.js';
|
|
15
|
+
import { useReviewSessionSummary } from '../hooks/use-review-session-summary.js';
|
|
16
|
+
import { usePinnedAgents } from '../stores/pinned-agents-store.js';
|
|
17
|
+
import { useCapabilityAccess } from './project-settings-nav.js';
|
|
18
|
+
/** Customize lists this many agents when none is pinned; All agents holds the rest. */
|
|
19
|
+
const SIDEBAR_AGENT_LIMIT = 5;
|
|
20
|
+
export const NewAgentContext = createContext(null);
|
|
21
|
+
/** Opens the New agent modal mounted beside the sidebar; null outside `NewAgentModalProvider`. */
|
|
22
|
+
export function useOpenNewAgent() {
|
|
23
|
+
return useContext(NewAgentContext);
|
|
24
|
+
}
|
|
25
|
+
/** Every agent by display name, hidden agents last. */
|
|
26
|
+
export function sortCustomizeAgents(agents) {
|
|
27
|
+
return [...agents].sort((a, b) => {
|
|
28
|
+
const hidden = Number(a.hidden === true) - Number(b.hidden === true);
|
|
29
|
+
return hidden || agentDisplayName(a.name).localeCompare(agentDisplayName(b.name));
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/** Whether the pathname is a Project admin (Settings) page. The locale prefix
|
|
33
|
+
* the host may not strip is tolerated. */
|
|
34
|
+
export function isProjectAdminPath(pathname) {
|
|
35
|
+
return !!pathname && /\/projects\/[^/]+\/admin(?:[/?#]|$)/.test(pathname);
|
|
36
|
+
}
|
|
37
|
+
/** A row's glyph in a 20px box (literal px, as the sidebar's agent marks), so
|
|
38
|
+
* every label starts on one column. */
|
|
39
|
+
function RowGlyph({ children }) {
|
|
40
|
+
return (_jsx("span", { "aria-hidden": true, className: "text-muted-foreground flex shrink-0 items-center justify-center", style: { width: 20, height: 20 }, children: children }));
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* What Customize opens to, kept short on purpose: most configuration happens
|
|
44
|
+
* by asking an agent in a session, so the sidebar lists only the agents you
|
|
45
|
+
* pinned (none pinned: the first five) and All agents when more exist, then Review (with its "needs you" count), Models, and Settings
|
|
46
|
+
* (Project admin, whose top bar holds every library and Members).
|
|
47
|
+
* The header's + and All agents buttons sit on the Customize row itself.
|
|
48
|
+
*/
|
|
49
|
+
export function ProjectCapabilityNav({ projectId }) {
|
|
50
|
+
const pathname = useUiPathname();
|
|
51
|
+
const config = useProjectConfig(projectId);
|
|
52
|
+
const access = useCapabilityAccess(projectId);
|
|
53
|
+
const needsYou = useReviewSessionSummary(projectId, { enabled: true }).totalNeedsYou;
|
|
54
|
+
const isMobile = useIsMobile();
|
|
55
|
+
const { setOpenMobile } = useSidebar();
|
|
56
|
+
const tTabs = useI18nTranslations('agentEditor.tabs');
|
|
57
|
+
const pinned = usePinnedAgents(projectId);
|
|
58
|
+
if (!access.settled)
|
|
59
|
+
return null;
|
|
60
|
+
const allAgents = access.tabs.includes('agent')
|
|
61
|
+
? sortCustomizeAgents((config?.agents ?? []).filter((agent) => !agent.platform))
|
|
62
|
+
: [];
|
|
63
|
+
// The agents you pinned, in pin order; none pinned, the first few. A
|
|
64
|
+
// project with a hundred agents keeps a short sidebar either way.
|
|
65
|
+
const pinnedAgents = pinned.flatMap((name) => allAgents.filter((agent) => agent.name === name));
|
|
66
|
+
const agents = pinnedAgents.length > 0 ? pinnedAgents : allAgents.slice(0, SIDEBAR_AGENT_LIMIT);
|
|
67
|
+
const moreAgents = allAgents.length > agents.length;
|
|
68
|
+
const showReview = access.tabs.includes('review');
|
|
69
|
+
const onReview = pathname ? activeCapabilityTab(pathname) === 'review' : false;
|
|
70
|
+
const hasModels = access.tabs.includes('models');
|
|
71
|
+
const onModels = !!pathname && /\/admin\/models(\/|$)/.test(pathname);
|
|
72
|
+
const hasSettings = access.tabs.includes('config');
|
|
73
|
+
const close = () => {
|
|
74
|
+
if (isMobile)
|
|
75
|
+
setOpenMobile(false);
|
|
76
|
+
};
|
|
77
|
+
if (agents.length === 0 && !showReview && !hasModels && !hasSettings)
|
|
78
|
+
return null;
|
|
79
|
+
// `mr-0 pr-0`: the rows reach the sidebar's right edge like the rows above;
|
|
80
|
+
// the left indent and guide line stay.
|
|
81
|
+
return (_jsxs(SidebarMenuSub, { className: "mr-0 pr-0", children: [agents.map((agent) => {
|
|
82
|
+
const href = agentHref(projectId, agent.name);
|
|
83
|
+
const active = !!pathname && (pathname === href || pathname.startsWith(`${href}/`));
|
|
84
|
+
return (_jsx(SidebarMenuSubItem, { children: _jsx(SidebarMenuSubButton, { asChild: true, isActive: active, children: _jsxs(Link, { href: href, prefetch: false, onClick: close, children: [_jsx(RowGlyph, { children: _jsx(AgentMark, { slug: agent.name, size: 14 }) }), _jsx("span", { className: cn('truncate', agent.hidden && 'text-muted-foreground'), children: agentDisplayName(agent.name) })] }) }) }, agent.name));
|
|
85
|
+
}), moreAgents ? (_jsx(SidebarMenuSubItem, { children: _jsx(SidebarMenuSubButton, { asChild: true, isActive: !!pathname && pathname.endsWith('/customize/agents'), children: _jsxs(Link, { href: capabilityTabHref(projectId, 'agent'), prefetch: false, onClick: close, children: [_jsx(RowGlyph, { children: _jsx(ListIcon, { className: "size-3.5" }) }), _jsx("span", { className: "truncate", children: tTabs('allAgents') }), _jsx("span", { className: "text-muted-foreground ml-auto shrink-0 text-xs tabular-nums", children: allAgents.length })] }) }) })) : null, showReview ? (_jsx(SidebarMenuSubItem, { children: _jsx(SidebarMenuSubButton, { asChild: true, isActive: onReview, children: _jsxs(Link, { href: capabilityTabHref(projectId, 'review'), prefetch: false, onClick: close, children: [_jsx(RowGlyph, { children: _jsx(TrayIcon, { className: "size-3.5" }) }), _jsx("span", { className: "truncate", children: tTabs('review') }), needsYou > 0 ? (_jsx("span", { className: "ml-auto flex shrink-0 items-center", children: _jsx(CountBadge, { count: needsYou, tone: "waiting" }) })) : null] }) }) })) : null, hasModels ? (_jsx(SidebarMenuSubItem, { children: _jsx(SidebarMenuSubButton, { asChild: true, isActive: onModels, children: _jsxs(Link, { href: adminPath(projectId, 'models'), prefetch: false, onClick: close, children: [_jsx(RowGlyph, { children: _jsx(CpuIcon, { className: "size-3.5" }) }), _jsx("span", { className: "truncate", children: tTabs('models') })] }) }) })) : null, hasSettings ? (_jsx(SidebarMenuSubItem, { children: _jsx(SidebarMenuSubButton, { asChild: true, isActive: isProjectAdminPath(pathname) && !onModels, children: _jsxs(Link, { href: adminPath(projectId, 'general'), prefetch: false, onClick: close, children: [_jsx(RowGlyph, { children: _jsx(GearSixIcon, { className: "size-3.5" }) }), _jsx("span", { className: "truncate", children: tTabs('settings') })] }) }) })) : null] }));
|
|
86
|
+
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* The header of a standalone project page (Files, Apps):
|
|
4
4
|
* the sidebar toggle, then the page title as the page's `<h1>`. It uses the
|
|
5
|
-
* same title-bar classes as the
|
|
5
|
+
* same title-bar classes as the agent identity header (`agent-page-chrome.tsx`), so it
|
|
6
6
|
* has the same height and clears the desktop window controls the same way.
|
|
7
7
|
* A page has one view, so the title is plain text, not a one-tab underline
|
|
8
8
|
* bar. `titleAccessory` sits right after the title (a docs link). `children`
|
|
@@ -5,7 +5,7 @@ import { SidebarToggle } from './sidebar-toggle.js';
|
|
|
5
5
|
/**
|
|
6
6
|
* The header of a standalone project page (Files, Apps):
|
|
7
7
|
* the sidebar toggle, then the page title as the page's `<h1>`. It uses the
|
|
8
|
-
* same title-bar classes as the
|
|
8
|
+
* same title-bar classes as the agent identity header (`agent-page-chrome.tsx`), so it
|
|
9
9
|
* has the same height and clears the desktop window controls the same way.
|
|
10
10
|
* A page has one view, so the title is plain text, not a one-tab underline
|
|
11
11
|
* bar. `titleAccessory` sits right after the title (a docs link). `children`
|
|
@@ -5,8 +5,9 @@ import { type CanResult } from '../lib/use-project-can.js';
|
|
|
5
5
|
/**
|
|
6
6
|
* The one project-configuration entry in the sidebar:
|
|
7
7
|
* ProjectCustomizeNavItem, top of the panel under New session, navigating to
|
|
8
|
-
* the capability pages (
|
|
9
|
-
*
|
|
8
|
+
* the capability pages (Agents, Repo, Review, Settings — the libraries Skills /
|
|
9
|
+
* Connectors / Triggers / Reminders / Models / Secrets moved to `/admin`,
|
|
10
|
+
* `ADMIN_MANAGED_TABS`). Gated, because those pages can 403.
|
|
10
11
|
*
|
|
11
12
|
* The bottom-of-footer "Settings" row that used to sit beside it is gone
|
|
12
13
|
* (Jay, 2026-08-17): it opened the same User Settings overlay a click on the
|
|
@@ -41,8 +41,9 @@ const TAB_ICONS = {
|
|
|
41
41
|
/**
|
|
42
42
|
* The one project-configuration entry in the sidebar:
|
|
43
43
|
* ProjectCustomizeNavItem, top of the panel under New session, navigating to
|
|
44
|
-
* the capability pages (
|
|
45
|
-
*
|
|
44
|
+
* the capability pages (Agents, Repo, Review, Settings — the libraries Skills /
|
|
45
|
+
* Connectors / Triggers / Reminders / Models / Secrets moved to `/admin`,
|
|
46
|
+
* `ADMIN_MANAGED_TABS`). Gated, because those pages can 403.
|
|
46
47
|
*
|
|
47
48
|
* The bottom-of-footer "Settings" row that used to sit beside it is gone
|
|
48
49
|
* (Jay, 2026-08-17): it opened the same User Settings overlay a click on the
|
|
@@ -138,7 +139,7 @@ export const TAB_PREFERENCE = [
|
|
|
138
139
|
action: PROJECT_ACTIONS.PROJECT_REVIEW_READ,
|
|
139
140
|
manage: [PROJECT_ACTIONS.PROJECT_REVIEW_ACT],
|
|
140
141
|
},
|
|
141
|
-
// Settings (`/projects/<id>/
|
|
142
|
+
// Settings (`/projects/<id>/admin/general`) is configuration by
|
|
142
143
|
// definition: its read leaf is already a write leaf.
|
|
143
144
|
{ key: 'config', action: PROJECT_ACTIONS.PROJECT_SETTINGS_WRITE },
|
|
144
145
|
];
|
|
@@ -222,6 +223,7 @@ export function ProjectCustomizeNavItem({ projectId }) {
|
|
|
222
223
|
// redirects) AND on any capability tab — the row stays lit while browsing
|
|
223
224
|
// Connectors or one agent's page, not just on the landing tab.
|
|
224
225
|
const isActive = !!pathname &&
|
|
226
|
+
pathname.includes('/customize') &&
|
|
225
227
|
(pathname === customizePath(projectId) || activeCapabilityTab(pathname) !== null);
|
|
226
228
|
const card = useNavHoverCard({ enabled: !!tab && !!projectId });
|
|
227
229
|
if (!tab)
|
|
@@ -555,7 +555,7 @@ export function isUndefinedVariableThirdPartyNoise(input) {
|
|
|
555
555
|
// (Kortix Frontend prod, application_id 2346967, KRTX-2393): `TypeError`,
|
|
556
556
|
// 39 occurrences / 0 identified users, ALL on 2026-10-14 17:05:37–17:05:39
|
|
557
557
|
// UTC in ONE session (Firefox 140.0, Linux x86_64, release `1ecba158…`,
|
|
558
|
-
// turbopack), on `/projects/<project_id>/
|
|
558
|
+
// turbopack), on `/projects/<project_id>/admin/connectors/<app>/<connec
|
|
559
559
|
// tor>?src=apps` (the connector detail page, Tools tab), mechanism
|
|
560
560
|
// `auto.browser.global_handlers.onerror` (UNCAUGHT, `handled:false`). The
|
|
561
561
|
// stack is the deciding evidence: the ONLY frame is the page DOCUMENT itself
|
|
@@ -86,6 +86,30 @@ export declare const CAPABILITY_TABS: readonly CapabilityTab[];
|
|
|
86
86
|
* hairline seam after it, and it is the landing tab.
|
|
87
87
|
*/
|
|
88
88
|
export declare const PRIMARY_TABS: readonly CapabilityTab['key'][];
|
|
89
|
+
/**
|
|
90
|
+
* The capability libraries that moved to the account-level `/admin` dashboard
|
|
91
|
+
* (Marko, 2026-10-24: authorization is per-agent, so Customize is agent-
|
|
92
|
+
* centric — you add a connector, skill, trigger, reminder, model or secret TO
|
|
93
|
+
* an agent, never standalone). Customize no longer lists these as tabs or
|
|
94
|
+
* sidebar rows. It keeps Agents (the primary surface), Repo, Review and
|
|
95
|
+
* Settings; what an agent draws on is configured per agent, on the agent's own
|
|
96
|
+
* page.
|
|
97
|
+
*
|
|
98
|
+
* Their standalone pages still RESOLVE by URL — `capabilityAccess()` keeps the
|
|
99
|
+
* keys, so `CapabilityAccessGate` renders them and the `/customize` redirect
|
|
100
|
+
* still works. Only the two nav surfaces (`CapabilityTabs`,
|
|
101
|
+
* `ProjectCapabilityNav`) drop them, through `customizeNavTabs`.
|
|
102
|
+
*/
|
|
103
|
+
export declare const ADMIN_MANAGED_TABS: readonly CapabilityTab['key'][];
|
|
104
|
+
/** Tabs that moved INTO Settings (Marko, 2026-10-24): Repo lives in the
|
|
105
|
+
* Settings rail (Repositories). Review is NOT here — it is its own standalone
|
|
106
|
+
* row in the Customize sidebar (Marko, 2026-10-24). */
|
|
107
|
+
export declare const SETTINGS_MANAGED_TABS: readonly CapabilityTab['key'][];
|
|
108
|
+
/** The capability tabs Customize still lists, in bar order: the caller's
|
|
109
|
+
* allowed tabs minus the libraries that moved to `/admin` and the ones that
|
|
110
|
+
* moved into Settings. Customize is agent-centric, so the bar leads with
|
|
111
|
+
* Agents; the rest is configured per agent or under `/admin` / Settings. */
|
|
112
|
+
export declare function customizeNavTabs(tabs: readonly CapabilityTab['key'][]): CapabilityTab['key'][];
|
|
89
113
|
/**
|
|
90
114
|
* A tab's URL segment. Keys are stable identifiers used across the app
|
|
91
115
|
* (`TAB_PREFERENCE`, the palette, tests); segments are what a person reads in
|
|
@@ -99,12 +123,19 @@ export declare const CAPABILITY_SEGMENT: Record<CapabilityTab['key'], string>;
|
|
|
99
123
|
/** The root every capability tab hangs off (Marko, 2026-09-03: "always
|
|
100
124
|
* /customize/agents, /customize/skills"). */
|
|
101
125
|
export declare function customizeHref(projectId: string): string;
|
|
102
|
-
/**
|
|
126
|
+
/**
|
|
127
|
+
* The libraries and settings that live in Project admin (`/projects/<id>/admin/<section>`),
|
|
128
|
+
* by Customize key. Customize keeps only Agents and Review; every other tab is
|
|
129
|
+
* one place, Project admin (Marko, 2026-10-27: "no duplications").
|
|
130
|
+
*/
|
|
131
|
+
export declare const ADMIN_SECTION: Partial<Record<CapabilityTab['key'], string>>;
|
|
132
|
+
/** The tab's URL: its Project admin section, else the host's `customize` route. */
|
|
103
133
|
export declare function capabilityTabHref(projectId: string, key: CapabilityTab['key']): string;
|
|
104
134
|
/**
|
|
105
135
|
* A link to a capability tab from outside the customize pages (sidebar, session
|
|
106
136
|
* header, hover cards). Null when the host serves no customize pages
|
|
107
|
-
* (`setUiRoutes({ customize: () => null })`
|
|
137
|
+
* (`setUiRoutes({ customize: () => null })`, or `admin` for a Project admin
|
|
138
|
+
* section): the caller hides the link.
|
|
108
139
|
* `capabilityTabHref` is the customize pages' own tab URL and never null.
|
|
109
140
|
*/
|
|
110
141
|
export declare function capabilityLinkHref(projectId: string, key: CapabilityTab['key']): string | null;
|
|
@@ -146,7 +177,7 @@ export declare function channelsHref(projectId: string): string;
|
|
|
146
177
|
* shapes this group owns: `agentHref`'s `/projects/<id>/customize/agents/<name>`,
|
|
147
178
|
* which lights the Agents tab (an agent's page is the Agents tab, opened on
|
|
148
179
|
* one agent), and the app and connector pages under
|
|
149
|
-
* `/projects/<id>/
|
|
180
|
+
* `/projects/<id>/admin/connectors`, which light Connectors.
|
|
150
181
|
*
|
|
151
182
|
* The shape check is load-bearing, not defensive tidying. This used to match on
|
|
152
183
|
* the LAST segment alone, which was harmless while every key was unique to this
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { customizePath, uiRoutes } from '../../lib/routes.js';
|
|
1
|
+
import { adminPath, customizePath, uiRoutes } from '../../lib/routes.js';
|
|
2
2
|
/**
|
|
3
3
|
* This array is the tab order, the sidebar order, and — via the first entry
|
|
4
4
|
* the caller may read — the landing tab. `TAB_PREFERENCE` in
|
|
@@ -47,7 +47,7 @@ export const CAPABILITY_TABS = [
|
|
|
47
47
|
{ key: 'skills', label: 'Skills' },
|
|
48
48
|
{ key: 'connectors', label: 'Connectors' },
|
|
49
49
|
{ key: 'triggers', label: 'Triggers' },
|
|
50
|
-
{ key: 'reminders', label: '
|
|
50
|
+
{ key: 'reminders', label: 'Loops' },
|
|
51
51
|
{ key: 'models', label: 'Models' },
|
|
52
52
|
{ key: 'secrets', label: 'Secrets' },
|
|
53
53
|
{ key: 'files', label: 'Repo' },
|
|
@@ -61,6 +61,39 @@ export const CAPABILITY_TABS = [
|
|
|
61
61
|
* hairline seam after it, and it is the landing tab.
|
|
62
62
|
*/
|
|
63
63
|
export const PRIMARY_TABS = ['agent'];
|
|
64
|
+
/**
|
|
65
|
+
* The capability libraries that moved to the account-level `/admin` dashboard
|
|
66
|
+
* (Marko, 2026-10-24: authorization is per-agent, so Customize is agent-
|
|
67
|
+
* centric — you add a connector, skill, trigger, reminder, model or secret TO
|
|
68
|
+
* an agent, never standalone). Customize no longer lists these as tabs or
|
|
69
|
+
* sidebar rows. It keeps Agents (the primary surface), Repo, Review and
|
|
70
|
+
* Settings; what an agent draws on is configured per agent, on the agent's own
|
|
71
|
+
* page.
|
|
72
|
+
*
|
|
73
|
+
* Their standalone pages still RESOLVE by URL — `capabilityAccess()` keeps the
|
|
74
|
+
* keys, so `CapabilityAccessGate` renders them and the `/customize` redirect
|
|
75
|
+
* still works. Only the two nav surfaces (`CapabilityTabs`,
|
|
76
|
+
* `ProjectCapabilityNav`) drop them, through `customizeNavTabs`.
|
|
77
|
+
*/
|
|
78
|
+
export const ADMIN_MANAGED_TABS = [
|
|
79
|
+
'skills',
|
|
80
|
+
'connectors',
|
|
81
|
+
'triggers',
|
|
82
|
+
'reminders',
|
|
83
|
+
'models',
|
|
84
|
+
'secrets',
|
|
85
|
+
];
|
|
86
|
+
/** Tabs that moved INTO Settings (Marko, 2026-10-24): Repo lives in the
|
|
87
|
+
* Settings rail (Repositories). Review is NOT here — it is its own standalone
|
|
88
|
+
* row in the Customize sidebar (Marko, 2026-10-24). */
|
|
89
|
+
export const SETTINGS_MANAGED_TABS = ['files'];
|
|
90
|
+
/** The capability tabs Customize still lists, in bar order: the caller's
|
|
91
|
+
* allowed tabs minus the libraries that moved to `/admin` and the ones that
|
|
92
|
+
* moved into Settings. Customize is agent-centric, so the bar leads with
|
|
93
|
+
* Agents; the rest is configured per agent or under `/admin` / Settings. */
|
|
94
|
+
export function customizeNavTabs(tabs) {
|
|
95
|
+
return tabs.filter((key) => !ADMIN_MANAGED_TABS.includes(key) && !SETTINGS_MANAGED_TABS.includes(key));
|
|
96
|
+
}
|
|
64
97
|
/**
|
|
65
98
|
* A tab's URL segment. Keys are stable identifiers used across the app
|
|
66
99
|
* (`TAB_PREFERENCE`, the palette, tests); segments are what a person reads in
|
|
@@ -87,18 +120,37 @@ export const CAPABILITY_SEGMENT = {
|
|
|
87
120
|
export function customizeHref(projectId) {
|
|
88
121
|
return customizePath(projectId);
|
|
89
122
|
}
|
|
90
|
-
/**
|
|
123
|
+
/**
|
|
124
|
+
* The libraries and settings that live in Project admin (`/projects/<id>/admin/<section>`),
|
|
125
|
+
* by Customize key. Customize keeps only Agents and Review; every other tab is
|
|
126
|
+
* one place, Project admin (Marko, 2026-10-27: "no duplications").
|
|
127
|
+
*/
|
|
128
|
+
export const ADMIN_SECTION = {
|
|
129
|
+
skills: 'skills',
|
|
130
|
+
connectors: 'connectors',
|
|
131
|
+
triggers: 'triggers',
|
|
132
|
+
// Loops are triggers: one page since 2026-10-28.
|
|
133
|
+
reminders: 'triggers',
|
|
134
|
+
models: 'models',
|
|
135
|
+
secrets: 'secrets',
|
|
136
|
+
files: 'repo',
|
|
137
|
+
config: 'general',
|
|
138
|
+
};
|
|
139
|
+
/** The tab's URL: its Project admin section, else the host's `customize` route. */
|
|
91
140
|
export function capabilityTabHref(projectId, key) {
|
|
92
|
-
|
|
141
|
+
const section = ADMIN_SECTION[key];
|
|
142
|
+
return section ? adminPath(projectId, section) : customizePath(projectId, CAPABILITY_SEGMENT[key]);
|
|
93
143
|
}
|
|
94
144
|
/**
|
|
95
145
|
* A link to a capability tab from outside the customize pages (sidebar, session
|
|
96
146
|
* header, hover cards). Null when the host serves no customize pages
|
|
97
|
-
* (`setUiRoutes({ customize: () => null })`
|
|
147
|
+
* (`setUiRoutes({ customize: () => null })`, or `admin` for a Project admin
|
|
148
|
+
* section): the caller hides the link.
|
|
98
149
|
* `capabilityTabHref` is the customize pages' own tab URL and never null.
|
|
99
150
|
*/
|
|
100
151
|
export function capabilityLinkHref(projectId, key) {
|
|
101
|
-
|
|
152
|
+
const section = ADMIN_SECTION[key];
|
|
153
|
+
return section ? uiRoutes().admin(projectId, section) : uiRoutes().customize(projectId, CAPABILITY_SEGMENT[key]);
|
|
102
154
|
}
|
|
103
155
|
/**
|
|
104
156
|
* The Review Center: the Customize Review tab, or null when the host serves no
|
|
@@ -146,7 +198,7 @@ export function channelsHref(projectId) {
|
|
|
146
198
|
* shapes this group owns: `agentHref`'s `/projects/<id>/customize/agents/<name>`,
|
|
147
199
|
* which lights the Agents tab (an agent's page is the Agents tab, opened on
|
|
148
200
|
* one agent), and the app and connector pages under
|
|
149
|
-
* `/projects/<id>/
|
|
201
|
+
* `/projects/<id>/admin/connectors`, which light Connectors.
|
|
150
202
|
*
|
|
151
203
|
* The shape check is load-bearing, not defensive tidying. This used to match on
|
|
152
204
|
* the LAST segment alone, which was harmless while every key was unique to this
|
|
@@ -158,7 +210,23 @@ export function channelsHref(projectId) {
|
|
|
158
210
|
* `agent`, never on the last one.
|
|
159
211
|
*/
|
|
160
212
|
export function activeCapabilityTab(pathname) {
|
|
161
|
-
const
|
|
213
|
+
const all = pathname.split('/').filter(Boolean);
|
|
214
|
+
// Tolerate a leading locale segment (`/en/projects/…`): anchor on `projects`
|
|
215
|
+
// wherever it sits, so the match works whether the host strips the locale or
|
|
216
|
+
// not. A project id is never the literal `projects`, so the first hit is the
|
|
217
|
+
// route segment.
|
|
218
|
+
const start = all.indexOf('projects');
|
|
219
|
+
if (start === -1)
|
|
220
|
+
return null;
|
|
221
|
+
const segments = all.slice(start);
|
|
222
|
+
// A Project admin library (`/admin/<section>`, and below Connectors an app
|
|
223
|
+
// or a connector page) is that tab.
|
|
224
|
+
if (segments[0] === 'projects' && segments[2] === 'admin' && segments.length >= 4) {
|
|
225
|
+
const key = Object.keys(ADMIN_SECTION).find((k) => ADMIN_SECTION[k] === segments[3]);
|
|
226
|
+
if (!key)
|
|
227
|
+
return null;
|
|
228
|
+
return segments.length === 4 || (key === 'connectors' && segments.length <= 6) ? key : null;
|
|
229
|
+
}
|
|
162
230
|
if (segments[0] !== 'projects' || segments[2] !== 'customize')
|
|
163
231
|
return null;
|
|
164
232
|
if (segments.length === 5 && segments[3] === CAPABILITY_SEGMENT.agent)
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** @internal Kortix apps only. No semver: it may change in any release. */
|
|
2
|
+
/**
|
|
3
|
+
* The project's `manifest_health`, read from the `qk.project.detail(id)` query
|
|
4
|
+
* the rest of Customize already shares: no second request. `undefined` while
|
|
5
|
+
* the read is in flight, and from an API that does not serve the field yet.
|
|
6
|
+
* The server reads and validates `kortix.yaml`; a client never parses it to
|
|
7
|
+
* decide what state it is in.
|
|
8
|
+
*/
|
|
9
|
+
import { type ProjectManifestHealth } from '@kortix/sdk';
|
|
10
|
+
export declare function useProjectManifestHealth(projectId: string): ProjectManifestHealth | undefined;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
/**
|
|
3
|
+
* The project's `manifest_health`, read from the `qk.project.detail(id)` query
|
|
4
|
+
* the rest of Customize already shares: no second request. `undefined` while
|
|
5
|
+
* the read is in flight, and from an API that does not serve the field yet.
|
|
6
|
+
* The server reads and validates `kortix.yaml`; a client never parses it to
|
|
7
|
+
* decide what state it is in.
|
|
8
|
+
*/
|
|
9
|
+
import { getProjectDetail } from '@kortix/sdk';
|
|
10
|
+
import { contract, qk } from '@kortix/sdk/react';
|
|
11
|
+
import { useQuery } from '@tanstack/react-query';
|
|
12
|
+
export function useProjectManifestHealth(projectId) {
|
|
13
|
+
return useQuery({
|
|
14
|
+
queryKey: qk.project.detail(projectId),
|
|
15
|
+
queryFn: () => getProjectDetail(projectId),
|
|
16
|
+
select: (detail) => detail.config?.manifest_health,
|
|
17
|
+
enabled: !!projectId,
|
|
18
|
+
...contract('config'),
|
|
19
|
+
}).data;
|
|
20
|
+
}
|
|
@@ -26,8 +26,11 @@ export declare function fnv1a(input: string): number;
|
|
|
26
26
|
/** Readable at 14px, fills the frame, one connected body. */
|
|
27
27
|
export declare function passesPixelMarkGate(grid: Grid): boolean;
|
|
28
28
|
export declare function pixelMark(slug: string): {
|
|
29
|
-
grid:
|
|
29
|
+
grid: boolean[][];
|
|
30
30
|
path: string;
|
|
31
|
+
ditherPath: string;
|
|
32
|
+
width: number;
|
|
33
|
+
height: number;
|
|
31
34
|
tone: PixelMarkTone;
|
|
32
35
|
};
|
|
33
36
|
export {};
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* Changing SIZE, MASK, the gate or PALETTES changes every agent's mark — the
|
|
11
11
|
* golden test in `pixel-mark.test.ts` exists to make that a deliberate act.
|
|
12
12
|
*/
|
|
13
|
+
import { PIXEL_KORTIX_ROWS } from '../../primitives/pixel-kortix-mark.js';
|
|
13
14
|
export const PIXEL_MARK_SIZE = 7;
|
|
14
15
|
const HALF = 4;
|
|
15
16
|
const MAX_ATTEMPTS = 256;
|
|
@@ -41,7 +42,7 @@ export const PIXEL_MARK_TONES = [
|
|
|
41
42
|
tone('clay', '#F3E6E0', '#7A4532'),
|
|
42
43
|
tone('slate', '#E4E7EC', '#3B4656'),
|
|
43
44
|
];
|
|
44
|
-
/** The
|
|
45
|
+
/** The starter's `kortix` agent and My Kortix (slug `mykortix`) keep the brand tile. */
|
|
45
46
|
const BRAND = {
|
|
46
47
|
name: 'brand',
|
|
47
48
|
tile: '#1F1F1F',
|
|
@@ -49,7 +50,11 @@ const BRAND = {
|
|
|
49
50
|
tileDark: '#2C2C2C',
|
|
50
51
|
inkDark: '#FFFFFF',
|
|
51
52
|
};
|
|
52
|
-
const RESERVED = { kortix: BRAND, meta: BRAND };
|
|
53
|
+
const RESERVED = { kortix: BRAND, mykortix: BRAND, meta: BRAND };
|
|
54
|
+
/** My Kortix (slug `mykortix`) wears the Kortix symbol itself, the same 12 × 10
|
|
55
|
+
* grid as `PixelKortixMark` and the merch chips. `+` cells are the dithered
|
|
56
|
+
* curve cells; at agent-mark sizes they paint at half ink. */
|
|
57
|
+
const RESERVED_ROWS = { mykortix: PIXEL_KORTIX_ROWS, meta: PIXEL_KORTIX_ROWS };
|
|
53
58
|
export function fnv1a(input) {
|
|
54
59
|
let h = 0x811c9dc5;
|
|
55
60
|
for (let i = 0; i < input.length; i++) {
|
|
@@ -126,27 +131,49 @@ export function passesPixelMarkGate(grid) {
|
|
|
126
131
|
return false;
|
|
127
132
|
return largestComponent(grid) >= Math.ceil(filled * 0.85);
|
|
128
133
|
}
|
|
129
|
-
/** One SVG path, horizontal runs merged
|
|
134
|
+
/** One SVG path, horizontal runs merged, in grid units. */
|
|
130
135
|
function toPath(grid) {
|
|
131
136
|
let d = '';
|
|
132
137
|
grid.forEach((row, y) => {
|
|
133
|
-
for (let x = 0; x <
|
|
138
|
+
for (let x = 0; x < row.length;) {
|
|
134
139
|
if (!row[x]) {
|
|
135
140
|
x++;
|
|
136
141
|
continue;
|
|
137
142
|
}
|
|
138
143
|
const start = x;
|
|
139
|
-
while (x <
|
|
144
|
+
while (x < row.length && row[x])
|
|
140
145
|
x++;
|
|
141
146
|
d += `M${start} ${y}h${x - start}v1h-${x - start}z`;
|
|
142
147
|
}
|
|
143
148
|
});
|
|
144
149
|
return d;
|
|
145
150
|
}
|
|
151
|
+
/** Runs of one cell character on one row, as an SVG path. */
|
|
152
|
+
function rowsToPath(rows, cell) {
|
|
153
|
+
return toPath(rows.map((row) => [...row].map((c) => c === cell)));
|
|
154
|
+
}
|
|
146
155
|
export function pixelMark(slug) {
|
|
156
|
+
const rows = RESERVED_ROWS[slug];
|
|
157
|
+
if (rows) {
|
|
158
|
+
return {
|
|
159
|
+
grid: rows.map((row) => [...row].map((c) => c !== ' ')),
|
|
160
|
+
path: rowsToPath(rows, '#'),
|
|
161
|
+
ditherPath: rowsToPath(rows, '+'),
|
|
162
|
+
width: rows[0].length,
|
|
163
|
+
height: rows.length,
|
|
164
|
+
tone: RESERVED[slug] ?? BRAND,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
147
167
|
let grid = draw(fnv1a(slug));
|
|
148
168
|
for (let attempt = 1; !passesPixelMarkGate(grid) && attempt < MAX_ATTEMPTS; attempt++)
|
|
149
169
|
grid = draw(fnv1a(`${slug}:${attempt}`));
|
|
150
170
|
const tone = RESERVED[slug] ?? PIXEL_MARK_TONES[fnv1a(`${slug}#tone`) % PIXEL_MARK_TONES.length];
|
|
151
|
-
return {
|
|
171
|
+
return {
|
|
172
|
+
grid,
|
|
173
|
+
path: toPath(grid),
|
|
174
|
+
ditherPath: '',
|
|
175
|
+
width: PIXEL_MARK_SIZE,
|
|
176
|
+
height: PIXEL_MARK_SIZE,
|
|
177
|
+
tone,
|
|
178
|
+
};
|
|
152
179
|
}
|
|
@@ -28,7 +28,7 @@ export { PROJECT_ACTIONS, type ProjectAction };
|
|
|
28
28
|
* maps a `SettingsTab` onto one of these ids to reuse the IAM read leaf below
|
|
29
29
|
* — the ids themselves never reach the UI as tab names anymore.
|
|
30
30
|
*/
|
|
31
|
-
export type CustomizeSection = 'git' | 'review' | 'commands' | 'marketplace' | 'secrets' | 'llm-management' | 'llm-overview' | 'llm-providers' | 'llm-logs' | 'llm-budgets' | 'llm-keys' | 'llm-api' | 'members' | 'schedules' | 'webhooks' | 'channels' | 'sandbox' | 'settings' | 'feature-flags'
|
|
31
|
+
export type CustomizeSection = 'git' | 'review' | 'commands' | 'marketplace' | 'secrets' | 'llm-management' | 'llm-overview' | 'llm-providers' | 'llm-logs' | 'llm-budgets' | 'llm-keys' | 'llm-api' | 'members' | 'schedules' | 'webhooks' | 'channels' | 'sandbox' | 'settings' | 'feature-flags';
|
|
32
32
|
/**
|
|
33
33
|
* Per-section gating leaves.
|
|
34
34
|
*
|
|
@@ -102,10 +102,6 @@ export const CUSTOMIZE_SECTION_ACCESS = {
|
|
|
102
102
|
read: PROJECT_ACTIONS.PROJECT_READ,
|
|
103
103
|
write: PROJECT_ACTIONS.PROJECT_SETTINGS_WRITE,
|
|
104
104
|
},
|
|
105
|
-
// `upgrade` (migrate the manifest to v2) starts an agent session that edits the
|
|
106
|
-
// repo and opens a CR — the session itself asserts the real leaves; visibility
|
|
107
|
-
// follows settings.
|
|
108
|
-
upgrade: { read: PROJECT_ACTIONS.PROJECT_READ, write: PROJECT_ACTIONS.PROJECT_WRITE },
|
|
109
105
|
};
|
|
110
106
|
/** The distinct read leaves used to gate section visibility — handy for a single
|
|
111
107
|
* batched probe over every section the rail might show. */
|
|
@@ -38,6 +38,8 @@ const PROVIDER_ICON_MAP = {
|
|
|
38
38
|
anthropic: { icon: 'anthropic', fallback: 'AN' },
|
|
39
39
|
openai: { icon: 'openai', fallback: 'OA' },
|
|
40
40
|
codex: { icon: 'openai', fallback: 'GPT' },
|
|
41
|
+
// Claude subscription models (`claude-agent/<id>`), run through Claude Code.
|
|
42
|
+
'claude-agent': { icon: 'anthropic', fallback: 'CL' },
|
|
41
43
|
opencode: { icon: 'opencode', fallback: 'OC' },
|
|
42
44
|
'opencode-go': { icon: 'opencode', fallback: 'OC' },
|
|
43
45
|
'github-copilot': { icon: 'github-copilot', fallback: 'GH' },
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** @internal Kortix apps only. No semver: it may change in any release. */
|
|
2
|
+
import { type ManifestSpace, type ResourceBinding, type SpaceGroup } from '@kortix/sdk';
|
|
3
|
+
/**
|
|
4
|
+
* Spaces are Work in progress. A space is a channel (`spaces:` in kortix.yaml,
|
|
5
|
+
* `agents.<name>.space`, a resource's `space` binding), so the `project_channels`
|
|
6
|
+
* flag gates them. Off (the default), no surface shows a space, a space
|
|
7
|
+
* filter, a space column or "Move to space"; the bindings stay in the files.
|
|
8
|
+
*/
|
|
9
|
+
export declare const SPACES_FLAG: "project_channels";
|
|
10
|
+
/** True only while the project's `project_channels` flag is on. False while it loads. */
|
|
11
|
+
export declare function useSpacesEnabled(projectId: string | null | undefined): boolean;
|
|
12
|
+
type SpacesConfig = {
|
|
13
|
+
agents?: ReadonlyArray<{
|
|
14
|
+
name: string;
|
|
15
|
+
space?: string | null;
|
|
16
|
+
}>;
|
|
17
|
+
spaces?: ManifestSpace[];
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* The spaces a list page (Artifacts, Goals) offers, its groups, and the space
|
|
21
|
+
* of each item. Off: no spaces, and every item is project-wide, so the page
|
|
22
|
+
* shows no filter, no space chip and no "Move to space".
|
|
23
|
+
*/
|
|
24
|
+
export declare function spaceScope<T>(items: readonly T[], config: SpacesConfig | null | undefined, enabled: boolean, bindingOf: (item: T) => ResourceBinding | null | undefined): {
|
|
25
|
+
spaces: ManifestSpace[];
|
|
26
|
+
groups: Array<SpaceGroup<T>>;
|
|
27
|
+
spaceOf: (item: T) => string;
|
|
28
|
+
};
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { PROJECT_WIDE_SPACE, bindingSpace, groupBySpace, listSpaces, } from '@kortix/sdk';
|
|
3
|
+
import { useFeatureFlag } from '@kortix/sdk/react';
|
|
4
|
+
/**
|
|
5
|
+
* Spaces are Work in progress. A space is a channel (`spaces:` in kortix.yaml,
|
|
6
|
+
* `agents.<name>.space`, a resource's `space` binding), so the `project_channels`
|
|
7
|
+
* flag gates them. Off (the default), no surface shows a space, a space
|
|
8
|
+
* filter, a space column or "Move to space"; the bindings stay in the files.
|
|
9
|
+
*/
|
|
10
|
+
export const SPACES_FLAG = 'project_channels';
|
|
11
|
+
/** True only while the project's `project_channels` flag is on. False while it loads. */
|
|
12
|
+
export function useSpacesEnabled(projectId) {
|
|
13
|
+
return useFeatureFlag(projectId, SPACES_FLAG).enabled === true;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* The spaces a list page (Artifacts, Goals) offers, its groups, and the space
|
|
17
|
+
* of each item. Off: no spaces, and every item is project-wide, so the page
|
|
18
|
+
* shows no filter, no space chip and no "Move to space".
|
|
19
|
+
*/
|
|
20
|
+
export function spaceScope(items, config, enabled, bindingOf) {
|
|
21
|
+
const agents = config?.agents ?? [];
|
|
22
|
+
const spaceOf = (item) => (enabled ? (bindingSpace(bindingOf(item), agents) ?? PROJECT_WIDE_SPACE) : PROJECT_WIDE_SPACE);
|
|
23
|
+
return {
|
|
24
|
+
spaces: enabled ? listSpaces(config) : [],
|
|
25
|
+
groups: groupBySpace([...items], enabled ? config?.spaces : undefined, spaceOf),
|
|
26
|
+
spaceOf,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
@@ -27,7 +27,6 @@ export function useProjectFeatureFlags(projectId) {
|
|
|
27
27
|
const warmSessions = useFeatureFlag(projectId, 'warm_sessions');
|
|
28
28
|
const secretsEgress = useFeatureFlag(projectId, 'secrets_egress');
|
|
29
29
|
const pooledProviderSecrets = useFeatureFlag(projectId, 'pooled_provider_secrets');
|
|
30
|
-
const genui = useFeatureFlag(projectId, 'genui');
|
|
31
30
|
const usRegion = useFeatureFlag(projectId, 'us_region');
|
|
32
31
|
const eventTriggers = useFeatureFlag(projectId, 'event_triggers');
|
|
33
32
|
const notificationCenter = useFeatureFlag(projectId, 'notification_center');
|
|
@@ -44,6 +43,7 @@ export function useProjectFeatureFlags(projectId) {
|
|
|
44
43
|
const workspaceVolume = useFeatureFlag(projectId, 'workspace_volume');
|
|
45
44
|
const sessionGroups = useFeatureFlag(projectId, 'session_groups');
|
|
46
45
|
const chrome = useFeatureFlag(projectId, 'chrome');
|
|
46
|
+
const agentTeams = useFeatureFlag(projectId, 'agent_teams');
|
|
47
47
|
return {
|
|
48
48
|
flags: {
|
|
49
49
|
marketplace: marketplace.enabled,
|
|
@@ -52,7 +52,6 @@ export function useProjectFeatureFlags(projectId) {
|
|
|
52
52
|
warm_sessions: warmSessions.enabled,
|
|
53
53
|
secrets_egress: secretsEgress.enabled,
|
|
54
54
|
pooled_provider_secrets: pooledProviderSecrets.enabled,
|
|
55
|
-
genui: genui.enabled,
|
|
56
55
|
us_region: usRegion.enabled,
|
|
57
56
|
event_triggers: eventTriggers.enabled,
|
|
58
57
|
notification_center: notificationCenter.enabled,
|
|
@@ -69,8 +68,9 @@ export function useProjectFeatureFlags(projectId) {
|
|
|
69
68
|
workspace_volume: workspaceVolume.enabled,
|
|
70
69
|
session_groups: sessionGroups.enabled,
|
|
71
70
|
chrome: chrome.enabled,
|
|
71
|
+
agent_teams: agentTeams.enabled,
|
|
72
72
|
},
|
|
73
73
|
// The trailing hook's loading state — keep this on the LAST hook above.
|
|
74
|
-
isLoading:
|
|
74
|
+
isLoading: agentTeams.isLoading,
|
|
75
75
|
};
|
|
76
76
|
}
|