@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
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsx as _jsx,
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useTranslations } from '../../i18n/index.js';
|
|
4
4
|
/**
|
|
5
5
|
* Triggers — the single capability page at `/projects/<id>/triggers`,
|
|
@@ -46,7 +46,7 @@ import { newConfigPrompt, useConfigureThread, } from '../use-configure-thread.js
|
|
|
46
46
|
import { useProjectFeatureFlags } from '../../internal/lib/use-project-feature-flags.js';
|
|
47
47
|
import { hasOpenFloatingLayer } from '../../lib/z-stack.js';
|
|
48
48
|
import { deleteProjectTrigger, fireProjectTrigger, listProjectTriggers, setProjectTriggersActivation, updateProjectTrigger, } from '@kortix/sdk';
|
|
49
|
-
import { contract, qk, useProjectTriggerEventApps, useTriggerRuns } from '@kortix/sdk/react';
|
|
49
|
+
import { contract, qk, useProjectApps, useUnifiedTriggers, useProjectTriggerEventApps, useTriggerRuns, } from '@kortix/sdk/react';
|
|
50
50
|
import { CheckSquareIcon, DotsThreeIcon, LightningIcon, PauseIcon, PlayIcon, PlusIcon, MagnifyingGlassIcon as SearchIcon, } from '@phosphor-icons/react';
|
|
51
51
|
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
|
52
52
|
import { useUiPathname, useUiRouter, useUiSearchParams } from '../../providers/ui-provider.js';
|
|
@@ -57,9 +57,11 @@ import { EventAppsStrip } from './schedule/event-apps-strip.js';
|
|
|
57
57
|
import { describeWhen, isCustomerTrigger, isTriggerKind, localizedKindCopy, localizedTriggersCopy, matchesQuery, triggerName, } from './schedule/schedule-copy.js';
|
|
58
58
|
import { ScheduleDetailSplitContent } from './schedule/schedule-detail-sheet.js';
|
|
59
59
|
import { TriggerComposer } from './schedule/trigger-composer.js';
|
|
60
|
+
import { eventSendingApps } from './schedule/trigger-composer-logic.js';
|
|
60
61
|
import { useTriggerControls } from './schedule/trigger-controls.js';
|
|
61
|
-
import { TRIGGER_FILTERS, filterTriggers, groupTriggersByApp, parseTriggerFilter, readTriggerSheet, triggerSheetHref, } from './schedule/trigger-filter.js';
|
|
62
|
+
import { TRIGGER_FILTERS, filterTriggers, groupTriggersByApp, parseTriggerFilter, readTriggerSheet, triggerSheetHref, triggersForAgent, } from './schedule/trigger-filter.js';
|
|
62
63
|
import { TriggerList } from './schedule/trigger-list.js';
|
|
64
|
+
import { RuntimeTriggers, runtimeRowsFor } from './runtime-triggers.js';
|
|
63
65
|
import { runsInFlight } from './schedule/trigger-runs-logic.js';
|
|
64
66
|
import { runsOf } from './schedule/trigger-runs-panel.js';
|
|
65
67
|
import { bulkTargets, runSequentially, selectAllShown, selectRange, toggleSlug, visibleSelection, } from './schedule/trigger-selection.js';
|
|
@@ -72,6 +74,7 @@ const FILTER_LABEL_KEY = {
|
|
|
72
74
|
event: 'text0ba357fa63f8',
|
|
73
75
|
app: 'text4b4847a6fb87',
|
|
74
76
|
webhook: 'text45808d75bf89',
|
|
77
|
+
change_request: 'text5ffd973e20ed',
|
|
75
78
|
};
|
|
76
79
|
/**
|
|
77
80
|
* Pure: no hooks, no data fetching. The toolbar's ⋯ menu (Paper C03 `6O9-0`
|
|
@@ -81,13 +84,15 @@ const FILTER_LABEL_KEY = {
|
|
|
81
84
|
* {@link TriggerActivationMenu} so the gate renders under
|
|
82
85
|
* `renderToStaticMarkup` without a QueryClient.
|
|
83
86
|
*/
|
|
84
|
-
export function TriggerToolbarMenu({ canManage, paused, isPending, onToggle, onSelectMode, }) {
|
|
87
|
+
export function TriggerToolbarMenu({ canManage, paused, isPending, onToggle, onSelectMode, projectSwitch = true, }) {
|
|
85
88
|
const tI18nComplete = useTranslations('hardcodedUi.i18nComplete');
|
|
86
89
|
if (!canManage)
|
|
87
90
|
return null;
|
|
91
|
+
if (!projectSwitch && !onSelectMode)
|
|
92
|
+
return null;
|
|
88
93
|
return (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { variant: "secondary", size: "icon-base",
|
|
89
94
|
// `size-9`: the New trigger button and the search input beside it are `h-9`.
|
|
90
|
-
className: "size-9", disabled: isPending, "aria-label": tI18nComplete.raw('textd47d7cb0e4f8'), children: _jsx(DotsThreeIcon, { className: "text-muted-foreground size-4 shrink-0" }) }) }), _jsxs(DropdownMenuContent, { align: "end", className: "w-76", children: [_jsx(DropdownMenuItem, { className: RICH_ROW_CLASS, disabled: paused, onSelect: () => onToggle(true), children: _jsx(RichRowBody, { icon: PauseIcon, title: tI18nComplete.raw('text0b6258b50010'), description: tI18nComplete.raw('textdae75dce541f') }) }), _jsx(DropdownMenuItem, { className: RICH_ROW_CLASS, disabled: !paused, onSelect: () => onToggle(false), children: _jsx(RichRowBody, { icon: PlayIcon, title: tI18nComplete.raw('text43e673c5503d'), description: tI18nComplete.raw('textced57bebd466') }) }), onSelectMode ? (_jsxs(_Fragment, { children: [_jsx(DropdownMenuSeparator, {}), _jsxs(DropdownMenuItem, { onSelect: onSelectMode, children: [_jsx(CheckSquareIcon, {}), tI18nComplete.raw('text2a78025de6aa')] })] })) : null] })] }));
|
|
95
|
+
className: "size-9", disabled: isPending, "aria-label": tI18nComplete.raw('textd47d7cb0e4f8'), children: _jsx(DotsThreeIcon, { className: "text-muted-foreground size-4 shrink-0" }) }) }), _jsxs(DropdownMenuContent, { align: "end", className: "w-76", children: [projectSwitch ? (_jsxs(_Fragment, { children: [_jsx(DropdownMenuItem, { className: RICH_ROW_CLASS, disabled: paused, onSelect: () => onToggle(true), children: _jsx(RichRowBody, { icon: PauseIcon, title: tI18nComplete.raw('text0b6258b50010'), description: tI18nComplete.raw('textdae75dce541f') }) }), _jsx(DropdownMenuItem, { className: RICH_ROW_CLASS, disabled: !paused, onSelect: () => onToggle(false), children: _jsx(RichRowBody, { icon: PlayIcon, title: tI18nComplete.raw('text43e673c5503d'), description: tI18nComplete.raw('textced57bebd466') }) })] })) : null, onSelectMode ? (_jsxs(_Fragment, { children: [projectSwitch ? _jsx(DropdownMenuSeparator, {}) : null, _jsxs(DropdownMenuItem, { onSelect: onSelectMode, children: [_jsx(CheckSquareIcon, {}), tI18nComplete.raw('text2a78025de6aa')] })] })) : null] })] }));
|
|
91
96
|
}
|
|
92
97
|
/**
|
|
93
98
|
* The project-wide pause switch (`PATCH /projects/:id/triggers/activation`):
|
|
@@ -132,7 +137,7 @@ export function useTriggersActivation(projectId) {
|
|
|
132
137
|
*
|
|
133
138
|
* Exported for `trigger-activation-menu.test.tsx`, which renders it per role.
|
|
134
139
|
*/
|
|
135
|
-
export function TriggerActivationMenu({ projectId, onSelectMode, }) {
|
|
140
|
+
export function TriggerActivationMenu({ projectId, onSelectMode, projectSwitch, }) {
|
|
136
141
|
const queryKey = qk.project.triggers(projectId);
|
|
137
142
|
const triggersQuery = useQuery({
|
|
138
143
|
queryKey,
|
|
@@ -145,13 +150,26 @@ export function TriggerActivationMenu({ projectId, onSelectMode, }) {
|
|
|
145
150
|
// is the update control rather than `ScheduleView`'s create gate.
|
|
146
151
|
const canManage = useTriggerControls(projectId).canUpdate;
|
|
147
152
|
const mutation = useTriggersActivation(projectId);
|
|
148
|
-
return (_jsx(TriggerToolbarMenu, { canManage: canManage, paused: paused, isPending: mutation.isPending || triggersQuery.isLoading, onToggle: (v) => mutation.mutate(v), onSelectMode: onSelectMode }));
|
|
153
|
+
return (_jsx(TriggerToolbarMenu, { canManage: canManage, paused: paused, isPending: mutation.isPending || triggersQuery.isLoading, onToggle: (v) => mutation.mutate(v), onSelectMode: onSelectMode, projectSwitch: projectSwitch }));
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* The seed prompt of New trigger → Chat. On one agent's page it names the
|
|
157
|
+
* agent, as the manual path preselects it (`initialAgent`).
|
|
158
|
+
*/
|
|
159
|
+
function triggerChatPrompt(agentName) {
|
|
160
|
+
if (!agentName)
|
|
161
|
+
return newConfigPrompt('trigger');
|
|
162
|
+
return (`I want to set up a trigger that starts the "${agentName}" agent in this project. ` +
|
|
163
|
+
'Ask me what it should do and on what schedule or event, then create it with the ' +
|
|
164
|
+
'Kortix CLI and show me the result.');
|
|
149
165
|
}
|
|
150
|
-
export function ScheduleView({ projectId }) {
|
|
166
|
+
export function ScheduleView({ projectId, surface = { kind: 'global' }, defaultAgent, }) {
|
|
167
|
+
const agentName = surface.kind === 'agent' ? surface.agentName : null;
|
|
168
|
+
const tAgentScope = useTranslations('agentScope');
|
|
151
169
|
const router = useUiRouter();
|
|
152
170
|
const pathname = useUiPathname();
|
|
153
171
|
const tI18nComplete = useTranslations('hardcodedUi.i18nComplete');
|
|
154
|
-
const
|
|
172
|
+
const tPauseAll = useTranslations('automationsPause');
|
|
155
173
|
const copy = localizedTriggersCopy(tI18nComplete);
|
|
156
174
|
const kindCopy = localizedKindCopy(tI18nComplete);
|
|
157
175
|
const queryClient = useQueryClient();
|
|
@@ -168,6 +186,8 @@ export function ScheduleView({ projectId }) {
|
|
|
168
186
|
...contract('config'),
|
|
169
187
|
refetchInterval: 10_000,
|
|
170
188
|
});
|
|
189
|
+
// Runtime triggers (loops included) list below the kortix.yaml ones (`RuntimeTriggers`).
|
|
190
|
+
const hasRuntime = runtimeRowsFor(useUnifiedTriggers(projectId).data?.triggers ?? [], agentName).length > 0;
|
|
171
191
|
const [query, setQuery] = useState('');
|
|
172
192
|
// The input shows every keystroke; the list filters 200 ms after the last one.
|
|
173
193
|
const { debouncedValue: debouncedQuery } = useDebounce(query, 200);
|
|
@@ -189,9 +209,11 @@ export function ScheduleView({ projectId }) {
|
|
|
189
209
|
// closed: until the flag resolves on, nothing that lists, browses or requests events renders.
|
|
190
210
|
const featureFlags = useProjectFeatureFlags(projectId);
|
|
191
211
|
const eventsOn = featureFlags.flags.event_triggers === true;
|
|
192
|
-
// The App events tab shows once
|
|
212
|
+
// The App events tab shows once the project has an App that sends events, or an App event trigger.
|
|
213
|
+
const hasKortixApps = eventSendingApps(useProjectApps(projectId).data).length > 0;
|
|
193
214
|
const hasAppTriggers = (triggersQuery.data?.triggers ?? []).some((t) => t.type === 'app');
|
|
194
|
-
const
|
|
215
|
+
const showAppFilter = hasKortixApps || hasAppTriggers;
|
|
216
|
+
const filters = useMemo(() => TRIGGER_FILTERS.filter((f) => (f !== 'event' || eventsOn) && (f !== 'app' || showAppFilter)), [eventsOn, showAppFilter]);
|
|
195
217
|
// `?type=cron|event|webhook` is the kind filter; anything else, and `event` while events are off, is all.
|
|
196
218
|
const filter = parseTriggerFilter(searchParams?.get('type'), filters);
|
|
197
219
|
const setFilter = (next) => {
|
|
@@ -250,7 +272,10 @@ export function ScheduleView({ projectId }) {
|
|
|
250
272
|
// every new project: hiding it keeps the empty state reachable on a fresh
|
|
251
273
|
// project without making the customer delete a trigger they never created.
|
|
252
274
|
// It still schedules and fires — this is display only.
|
|
253
|
-
const triggers = useMemo(() =>
|
|
275
|
+
const triggers = useMemo(() => {
|
|
276
|
+
const shown = (triggersQuery.data?.triggers ?? []).filter((t) => isTriggerKind(t.type) && isCustomerTrigger(t));
|
|
277
|
+
return agentName ? triggersForAgent(shown, agentName, defaultAgent) : shown;
|
|
278
|
+
}, [triggersQuery.data, agentName, defaultAgent]);
|
|
254
279
|
// The search only renders over a non-empty list; focus it once it does.
|
|
255
280
|
const searchRef = useRef(null);
|
|
256
281
|
useSlashFocus(searchRef, showContent && triggers.length > 0);
|
|
@@ -382,7 +407,7 @@ export function ScheduleView({ projectId }) {
|
|
|
382
407
|
pane switched by `type`. It read the Settings rail while
|
|
383
408
|
Schedules/Webhooks were overlay panes; a capability page has no rail
|
|
384
409
|
entry, and a rail lookup that misses renders no heading at all. */
|
|
385
|
-
title: copy.title, description: copy.description,
|
|
410
|
+
title: copy.title, description: agentName ? tAgentScope('triggersDescription') : copy.description,
|
|
386
411
|
// Beside an open trigger the list is a 40% column: stack the header so
|
|
387
412
|
// search, Pause all and New trigger share one full-width row.
|
|
388
413
|
stacked: !!selected, search: showContent && triggers.length > 0 ? (_jsxs(InputGroupSearch, { children: [_jsx(InputGroupSearchIcon, { children: _jsx(SearchIcon, {}) }), _jsx(InputGroupSearchInput, { ref: searchRef, placeholder: copy.searchPlaceholder, value: query, onChange: (e) => setQuery(e.target.value), variant: "popover", size: "sm" }), _jsx(InputGroupSearchClear, { onClick: () => setQuery('') })] })) : undefined, filters: showFilter ? (_jsx(Tabs, { value: filter, onValueChange: (next) => setFilter(parseTriggerFilter(next, filters)), className: "max-w-full overflow-x-auto", children: _jsx(TabsList, { type: "underline", underlineSize: "md", size: "sm", "aria-label": tI18nComplete.raw('text51035b5b67dc'), className: "h-8 justify-start gap-5", children: filters.map((value) => (_jsx(TabsTrigger, { value: value, className: "flex-none px-0 text-xs font-medium", children: tI18nComplete.raw(FILTER_LABEL_KEY[value]) }, value))) }) })) : undefined, action:
|
|
@@ -393,9 +418,14 @@ export function ScheduleView({ projectId }) {
|
|
|
393
418
|
on an error or a 403. */
|
|
394
419
|
showContent ? (
|
|
395
420
|
// Search, then one group: ⋯ and New trigger, both `secondary` at `h-9`, the search input's height.
|
|
396
|
-
_jsxs(ButtonGroup, { children: [triggers.length > 0 || paused ? (_jsx(TriggerActivationMenu, { projectId: projectId, onSelectMode: triggers.length > 0 ? enterSelectMode : undefined })) : null, canWrite ? (_jsx(NewEntityMenu, { label: copy.createLabel, pending: configure.pending, onChat: () => configure.start(
|
|
421
|
+
_jsxs(ButtonGroup, { children: [triggers.length > 0 || (paused && !agentName) ? (_jsx(TriggerActivationMenu, { projectId: projectId, onSelectMode: triggers.length > 0 ? enterSelectMode : undefined, projectSwitch: !agentName })) : null, canWrite ? (_jsx(NewEntityMenu, { label: copy.createLabel, pending: configure.pending, onChat: () => configure.start(triggerChatPrompt(agentName)), manual: { onSelect: () => openCreate() }, caret: false })) : null] })) : undefined, children: [_jsxs("div", { className: "space-y-4", children: [accountPaused && showContent && (_jsxs(Alert, { variant: "warning", children: [_jsx(AlertTitle, { children: tPauseAll('bannerTitle') }), _jsx(AlertDescription, { children: tPauseAll('bannerDescription') })] })), paused && showContent && (_jsxs(Alert, { variant: "warning", children: [_jsx(AlertTitle, { children: tI18nComplete.raw('textb18b93a52cd2') }), _jsx(AlertDescription, { children: agentName ? tAgentScope('projectPaused') : tI18nComplete.raw('textc9e9d972eda2') }), controls.canUpdate && !agentName ? (_jsx(AlertActions, { children: _jsxs(Button, { variant: "outline", size: "sm", disabled: resumeAll.isPending, onClick: () => resumeAll.mutate(false), children: [resumeAll.isPending ? _jsx(Loading, { className: "size-3.5 shrink-0" }) : null, tI18nComplete.raw('text43e673c5503d')] }) })) : null] })), triggersQuery.isLoading ? (_jsx("div", { className: "space-y-1", children: Array.from({ length: 5 }).map((_, i) => (
|
|
397
422
|
// biome-ignore lint/suspicious/noArrayIndexKey: fixed-length placeholder
|
|
398
|
-
_jsx(Skeleton, { className: "h-10 rounded-md" }, i))) })) : isForbidden ? (_jsxs(Alert, { variant: "warning", children: [_jsx(AlertTitle, { children: tI18nComplete.raw('textabb84be05cfa') }), _jsxs(AlertDescription, { children: [tI18nComplete.raw('text22cd1f210415'), " ", copy.noun, tI18nComplete.raw('text382584f2456e')] })] })) : triggersQuery.isError ? (_jsx(ErrorState, { size: "sm", title: tI18nComplete('text7ce02a51e3dd', { value0: copy.noun }), description: triggersQuery.error?.message ?? tI18nComplete.raw('text0c953ab32c60'), action: _jsx(Button, { variant: "outline", size: "sm", onClick: () => triggersQuery.refetch(), children: tI18nComplete.raw('textd8b8392e2c54') }) })) : filter
|
|
423
|
+
_jsx(Skeleton, { className: "h-10 rounded-md" }, i))) })) : isForbidden ? (_jsxs(Alert, { variant: "warning", children: [_jsx(AlertTitle, { children: tI18nComplete.raw('textabb84be05cfa') }), _jsxs(AlertDescription, { children: [tI18nComplete.raw('text22cd1f210415'), " ", copy.noun, tI18nComplete.raw('text382584f2456e')] })] })) : triggersQuery.isError ? (_jsx(ErrorState, { size: "sm", title: tI18nComplete('text7ce02a51e3dd', { value0: copy.noun }), description: triggersQuery.error?.message ?? tI18nComplete.raw('text0c953ab32c60'), action: _jsx(Button, { variant: "outline", size: "sm", onClick: () => triggersQuery.refetch(), children: tI18nComplete.raw('textd8b8392e2c54') }) })) : filter === 'app' && ofKind.length === 0 ? (
|
|
424
|
+
// The App events tab can show before the first one exists: say what it is and offer one.
|
|
425
|
+
_jsx(EmptyState, { size: "sm", title: kindCopy.app.emptyTitle, description: kindCopy.app.emptyBody, action: canWrite ? (_jsxs(Button, { variant: "outline", size: "sm", className: "gap-1.5", onClick: () => openCreate('app'), children: [_jsx(PlusIcon, { className: "size-4 shrink-0" }), kindCopy.app.createLabel] })) : undefined })) : filter !== 'all' && ofKind.length === 0 ? (_jsx(EmptyState, { size: "sm", title: kindCopy[filter].emptyTitle })) : triggers.length === 0 && hasRuntime ? null : triggers.length === 0 && agentName ? (
|
|
426
|
+
// One muted line (brand: no icon tile). New trigger is already
|
|
427
|
+
// in the header, preselected to this agent.
|
|
428
|
+
_jsx(EmptyState, { size: "sm", title: tAgentScope('triggersEmpty') })) : triggers.length === 0 ? (_jsx(EmptyState, { icon: LightningIcon, title: copy.emptyTitle, description: copy.emptyBody, className: "py-12", action: canWrite ? (_jsxs(Button, { variant: "outline", size: "sm", className: "gap-1.5", onClick: () => openCreate(), children: [_jsx(PlusIcon, { className: "size-4 shrink-0" }), copy.createLabel] })) : undefined })) : filtered.length === 0 ? (_jsxs("p", { className: "text-muted-foreground px-3 py-6 text-center text-xs", children: [tI18nComplete.raw('text965b516df3ba'), ' ', _jsx("span", { className: "text-foreground font-medium", children: debouncedQuery }), "."] })) : (_jsx(TriggerList, { triggers: filtered, groups: appGroups, eventNames: eventNames, projectPaused: paused, selectedSlug: selected?.slug ?? null, runningSlug: run.isPending ? (run.variables?.slug ?? null) : liveSlug, onOpen: (t) => openTrigger(t.slug), selection: selectMode
|
|
399
429
|
? {
|
|
400
430
|
selected: selectedSlugs,
|
|
401
431
|
onToggle: (t, range) => {
|
|
@@ -405,7 +435,7 @@ export function ScheduleView({ projectId }) {
|
|
|
405
435
|
setAnchorSlug(t.slug);
|
|
406
436
|
},
|
|
407
437
|
}
|
|
408
|
-
: null })), showContent && eventsOn && filter === 'event' ? (_jsx(EventAppsStrip, { projectId: projectId, disabled: !canWrite, onPick: (app) => openCreate('event', { app: app.app, source: app.source, provider: app.provider }) })) : null, parseErrors.length > 0 && (_jsxs(Alert, { variant: "warning", children: [_jsx(AlertTitle, { children: tI18nComplete.raw('text5f6dc605ac36') }), _jsx(AlertDescription, { children: _jsx("ul", { className: "space-y-0.5 text-xs", children: parseErrors.map((err) => (_jsxs("li", { children: [_jsx("code", { className: "font-mono", children: err.path }), " \u2014 ", err.error] }, err.slug))) }) })] }))] }), _jsx(TriggerComposer, { projectId: projectId, open: createOpen, onOpenChange: setCreateOpen, initialKind: createKind, initialApp: createApp, onCreated: (slug) => {
|
|
438
|
+
: null })), showContent && filter === 'all' ? _jsx(RuntimeTriggers, { projectId: projectId, agentName: agentName }) : null, showContent && eventsOn && filter === 'event' ? (_jsx(EventAppsStrip, { projectId: projectId, disabled: !canWrite, onPick: (app) => openCreate('event', { app: app.app, source: app.source, provider: app.provider }) })) : null, parseErrors.length > 0 && (_jsxs(Alert, { variant: "warning", children: [_jsx(AlertTitle, { children: tI18nComplete.raw('text5f6dc605ac36') }), _jsx(AlertDescription, { children: _jsx("ul", { className: "space-y-0.5 text-xs", children: parseErrors.map((err) => (_jsxs("li", { children: [_jsx("code", { className: "font-mono", children: err.path }), " \u2014 ", err.error] }, err.slug))) }) })] }))] }), _jsx(TriggerComposer, { projectId: projectId, open: createOpen, onOpenChange: setCreateOpen, initialKind: createKind, initialApp: createApp, initialAgent: agentName, onCreated: (slug) => {
|
|
409
439
|
setCreateOpen(false);
|
|
410
440
|
invalidate();
|
|
411
441
|
// Drop straight into the new entry so the address or the first run
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { ComponentProps } from 'react';
|
|
2
|
+
import { ScheduleView } from './schedule-view.js';
|
|
1
3
|
/**
|
|
2
4
|
* The page body for /projects/[id]/triggers — the capability tab that
|
|
3
5
|
* graduated out of the Settings overlay. A trigger is one resource with two
|
|
@@ -16,6 +18,4 @@
|
|
|
16
18
|
* `max-w-2xl` heading — which is exactly what made this tab read as a
|
|
17
19
|
* different product from the three beside it.
|
|
18
20
|
*/
|
|
19
|
-
export declare function TriggersPage(
|
|
20
|
-
projectId: string;
|
|
21
|
-
}): import("react").JSX.Element;
|
|
21
|
+
export declare function TriggersPage(props: ComponentProps<typeof ScheduleView>): import("react").JSX.Element;
|
|
@@ -19,6 +19,6 @@ import { ScheduleView } from './schedule-view.js';
|
|
|
19
19
|
* `max-w-2xl` heading — which is exactly what made this tab read as a
|
|
20
20
|
* different product from the three beside it.
|
|
21
21
|
*/
|
|
22
|
-
export function TriggersPage(
|
|
23
|
-
return _jsx(ScheduleView, {
|
|
22
|
+
export function TriggersPage(props) {
|
|
23
|
+
return _jsx(ScheduleView, { ...props });
|
|
24
24
|
}
|
|
@@ -3,7 +3,7 @@ export { editConfigPrompt, newConfigPrompt, type ConfigureKind } from '../_vendo
|
|
|
3
3
|
export interface ConfigureThread {
|
|
4
4
|
/** Spin up a configure session for `prompt`, then close Customize + navigate.
|
|
5
5
|
* A bare string becomes the default durable payload; a `PendingSessionPrompt`
|
|
6
|
-
* (
|
|
6
|
+
* (an agent pick, as `ProjectManifestIssuesAlert` sends) is passed through unchanged. */
|
|
7
7
|
start: (prompt: string | PendingSessionPrompt) => void;
|
|
8
8
|
/**
|
|
9
9
|
* True while a session is being created. Creating one is a network round-trip
|
|
@@ -12,4 +12,10 @@ export interface ConfigureThread {
|
|
|
12
12
|
*/
|
|
13
13
|
pending: boolean;
|
|
14
14
|
}
|
|
15
|
-
|
|
15
|
+
/**
|
|
16
|
+
* `resetOnNavigate`: free the button once the new session opens. For a control that
|
|
17
|
+
* stays on screen (the sidebar); an overlay closes instead, so it keeps `pending`.
|
|
18
|
+
*/
|
|
19
|
+
export declare function useConfigureThread(projectId: string, { resetOnNavigate }?: {
|
|
20
|
+
resetOnNavigate?: boolean;
|
|
21
|
+
}): ConfigureThread;
|
|
@@ -14,34 +14,46 @@
|
|
|
14
14
|
import { useCallback, useState } from 'react';
|
|
15
15
|
import { useNewProjectSession } from '../internal/hooks/projects/use-new-project-session.js';
|
|
16
16
|
import { useSettingsPanelStore } from '../internal/stores/settings-panel-store.js';
|
|
17
|
+
import { useGuardedLeave } from './shared/leave-guard.js';
|
|
17
18
|
export { editConfigPrompt, newConfigPrompt } from '../_vendor/kortix-shared.js';
|
|
18
|
-
|
|
19
|
+
/**
|
|
20
|
+
* `resetOnNavigate`: free the button once the new session opens. For a control that
|
|
21
|
+
* stays on screen (the sidebar); an overlay closes instead, so it keeps `pending`.
|
|
22
|
+
*/
|
|
23
|
+
export function useConfigureThread(projectId, { resetOnNavigate = false } = {}) {
|
|
19
24
|
const closeCustomize = useSettingsPanelStore((s) => s.close);
|
|
20
25
|
const [pending, setPending] = useState(false);
|
|
21
26
|
const newSession = useNewProjectSession(projectId);
|
|
27
|
+
const guardedLeave = useGuardedLeave();
|
|
22
28
|
const start = useCallback((prompt) => {
|
|
23
29
|
const pendingPrompt = typeof prompt === 'string' ? { text: prompt, agent: null, model: null, variant: null } : prompt;
|
|
24
30
|
// Guard re-entry: ignore extra clicks while a session is being minted so
|
|
25
31
|
// we don't fire two creates (two billed sessions for one click).
|
|
26
32
|
if (pending)
|
|
27
33
|
return;
|
|
28
|
-
|
|
29
|
-
//
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
//
|
|
37
|
-
//
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
34
|
+
// Under a page with unsaved edits (the agent editor), the new session
|
|
35
|
+
// waits until the person chooses to leave them.
|
|
36
|
+
guardedLeave(() => {
|
|
37
|
+
setPending(true);
|
|
38
|
+
// Optimistic, identical to the project-home composer: mint the session,
|
|
39
|
+
// stash the seed prompt, close the overlay, and drop into the instant shell
|
|
40
|
+
// — which shows the prompt + inline boot status and auto-sends it once the
|
|
41
|
+
// runtime is ready (the hook persists + bounces on a terminal failure).
|
|
42
|
+
// Leave `pending` true: we're navigating away and the overlay is closing,
|
|
43
|
+
// so flipping it back would only flash the idle button.
|
|
44
|
+
newSession({
|
|
45
|
+
// The prompt is a durable inbox row from the create itself — the API
|
|
46
|
+
// converts `pending_prompt` inside the session-create transaction, so
|
|
47
|
+
// a closed tab between here and the workbench cannot lose it. No
|
|
48
|
+
// start-stash: there are no picks to hand off.
|
|
49
|
+
create: { pending_prompt: pendingPrompt },
|
|
50
|
+
onNavigate: () => {
|
|
51
|
+
closeCustomize();
|
|
52
|
+
if (resetOnNavigate)
|
|
53
|
+
setPending(false);
|
|
54
|
+
},
|
|
55
|
+
});
|
|
44
56
|
});
|
|
45
|
-
}, [pending, newSession, closeCustomize]);
|
|
57
|
+
}, [pending, newSession, closeCustomize, guardedLeave, resetOnNavigate]);
|
|
46
58
|
return { start, pending };
|
|
47
59
|
}
|
|
@@ -26,7 +26,7 @@ import { Skeleton } from '../../../primitives/skeleton.js';
|
|
|
26
26
|
import { errorToast, successToast } from '../../../primitives/toast.js';
|
|
27
27
|
import { ChangeList, ChangeSummary, DiffLayoutToggle, ExpandAllButton, diffViewportClass, entryFromCommitFile, fileCount, proposedChangeTimeline, splitUnifiedPatch, useChangeExpansion, } from '../../../changes/index.js';
|
|
28
28
|
import { EmptyState } from '../../../primitives/empty-state.js';
|
|
29
|
-
import {
|
|
29
|
+
import { useProjectManifestHealth } from '../../../internal/lib/manifest-health.js';
|
|
30
30
|
import { useProjectCans } from '../../../internal/lib/use-project-can.js';
|
|
31
31
|
import { REVIEW_CONTROL_ACTIONS, changeRequestControlsFrom } from '@kortix/sdk';
|
|
32
32
|
import { ArrowCounterClockwiseIcon, CheckIcon, FileDashedIcon, SparkleIcon, WarningIcon, XIcon, } from '@phosphor-icons/react';
|
|
@@ -55,8 +55,7 @@ export function ChangeRequestDetailDialog({ crId, onClose, onOpenChangeRequest }
|
|
|
55
55
|
const projectContext = useProjectContext();
|
|
56
56
|
const projectId = projectContext?.projectId ?? '';
|
|
57
57
|
const defaultBranch = projectContext?.defaultBranch ?? 'main';
|
|
58
|
-
const
|
|
59
|
-
const manifestFile = manifestFilename(manifestVersion);
|
|
58
|
+
const manifestFile = useProjectManifestHealth(projectId)?.path ?? 'kortix.yaml';
|
|
60
59
|
// Each decision shows only for a viewer who holds the leaves its route
|
|
61
60
|
// asserts (KRTX-1720), the same mapping as the Review Center: Apply changes
|
|
62
61
|
// merges (project.write + project.gitops.merge), Dismiss and Reopen close
|
|
@@ -19,7 +19,7 @@ import { useTranslations } from '../../../i18n/index.js';
|
|
|
19
19
|
import { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore, } from 'react';
|
|
20
20
|
import { useFileExplorerSource } from '../explorer-source.js';
|
|
21
21
|
import { buildGitStatusMap } from '../hooks/index.js';
|
|
22
|
-
import { forEachLimit, partitionUploadBatch, resolveUploadTarget, UPLOAD_CONCURRENCY, } from '../upload-batch.js';
|
|
22
|
+
import { forEachLimit, MAX_UPLOAD_BYTES, partitionUploadBatch, resolveUploadTarget, UPLOAD_CONCURRENCY, } from '../upload-batch.js';
|
|
23
23
|
import { droppedEntries, hasFolder, readDroppedTree, treeLevels, } from '../drop-tree.js';
|
|
24
24
|
import { DriveCreateDialog, } from './drive-create-dialog.js';
|
|
25
25
|
import { DriveGridView } from './drive-grid-view.js';
|
|
@@ -71,6 +71,7 @@ export function DriveExplorer({ embedded = false, shareContext, leading, trailin
|
|
|
71
71
|
? { ...source.capabilities, write: false, search: false }
|
|
72
72
|
: source.capabilities;
|
|
73
73
|
const canWrite = capabilities.write;
|
|
74
|
+
const uploadLimit = capabilities.maxUploadBytes === undefined ? MAX_UPLOAD_BYTES : capabilities.maxUploadBytes;
|
|
74
75
|
const currentPath = useFilesStore((s) => s.currentPath);
|
|
75
76
|
const navigateToPath = useFilesStore((s) => s.navigateToPath);
|
|
76
77
|
const viewMode = useFilesStore((s) => s.viewMode);
|
|
@@ -461,7 +462,7 @@ export function DriveExplorer({ embedded = false, shareContext, leading, trailin
|
|
|
461
462
|
* One failed file never stops the rest; its tray row offers Retry.
|
|
462
463
|
*/
|
|
463
464
|
const handleUploadFiles = useCallback(async (fileList, targetDirPath) => {
|
|
464
|
-
const { accepted, rejected } = partitionUploadBatch(Array.from(fileList));
|
|
465
|
+
const { accepted, rejected } = partitionUploadBatch(Array.from(fileList), uploadLimit);
|
|
465
466
|
for (const { reason } of rejected)
|
|
466
467
|
errorToast(reason);
|
|
467
468
|
if (accepted.length === 0)
|
|
@@ -480,14 +481,14 @@ export function DriveExplorer({ embedded = false, shareContext, leading, trailin
|
|
|
480
481
|
]);
|
|
481
482
|
}
|
|
482
483
|
await startBatch(accepted.map((file) => ({ file, targetPath })), shownIn, targetDirPath ?? currentPath);
|
|
483
|
-
}, [currentPath, isRootPath, pendingNode, startBatch]);
|
|
484
|
+
}, [currentPath, isRootPath, pendingNode, startBatch, uploadLimit]);
|
|
484
485
|
/**
|
|
485
486
|
* Upload a tree (a picked or dropped folder) into `base`: its folders are
|
|
486
487
|
* made first, one depth at a time (a level in parallel), then its files go
|
|
487
488
|
* up into them. Top folders landing in the folder in view show at once.
|
|
488
489
|
*/
|
|
489
490
|
const uploadTree = useCallback(async (tree, base) => {
|
|
490
|
-
const { accepted, rejected } = partitionUploadBatch(tree.map((t) => t.file));
|
|
491
|
+
const { accepted, rejected } = partitionUploadBatch(tree.map((t) => t.file), uploadLimit);
|
|
491
492
|
for (const { reason } of rejected)
|
|
492
493
|
errorToast(reason);
|
|
493
494
|
const acceptedSet = new Set(accepted);
|
|
@@ -529,7 +530,7 @@ export function DriveExplorer({ embedded = false, shareContext, leading, trailin
|
|
|
529
530
|
await startBatch(items.map(({ file, dir: rel }) => ({ file, targetPath: at(rel) || undefined })),
|
|
530
531
|
// Loose files dropped beside the folders land in the view.
|
|
531
532
|
inView ? currentPath : null, tops.length === 1 ? at(tops[0]) : root || '/');
|
|
532
|
-
}, [currentPath, normalizedCurrentPath, pendingNode, settlePending, mkdirMutation, startBatch, tHardcodedUi]);
|
|
533
|
+
}, [currentPath, normalizedCurrentPath, pendingNode, settlePending, mkdirMutation, startBatch, tHardcodedUi, uploadLimit]);
|
|
533
534
|
/** The folder picker (`webkitRelativePath` is `Picked/sub/file.png`). The browser already asked. */
|
|
534
535
|
const handleUploadFolder = useCallback((fileList) => uploadTree(Array.from(fileList).map((file) => ({
|
|
535
536
|
file,
|
|
@@ -37,6 +37,9 @@ export interface ExplorerCapabilities {
|
|
|
37
37
|
/** True for a folder that holds the tree together (Files' `Company`, `Users`,
|
|
38
38
|
* a person's own folder): no rename, cut or delete. Absent means none. */
|
|
39
39
|
fixedAt?: (path: string) => boolean;
|
|
40
|
+
/** Largest file an upload takes, in bytes; null takes any size. Absent means
|
|
41
|
+
* `MAX_UPLOAD_BYTES` (50 MB), the limit of a sandbox's own upload. */
|
|
42
|
+
maxUploadBytes?: number | null;
|
|
40
43
|
}
|
|
41
44
|
export interface ExplorerQueryResult<T> {
|
|
42
45
|
data: T | undefined;
|
|
@@ -38,9 +38,9 @@ export interface UploadBatchPartition<T extends UploadCandidate> {
|
|
|
38
38
|
* can only surface "Upload failed (413): Request Entity Too Large", naming
|
|
39
39
|
* neither the file nor a limit.
|
|
40
40
|
*/
|
|
41
|
-
export declare function uploadRejectionReason(file: UploadCandidate): string | null;
|
|
42
|
-
/** Split a batch into what will be sent and what is refused up front. */
|
|
43
|
-
export declare function partitionUploadBatch<T extends UploadCandidate>(files: readonly T[]): UploadBatchPartition<T>;
|
|
41
|
+
export declare function uploadRejectionReason(file: UploadCandidate, limit?: number | null): string | null;
|
|
42
|
+
/** Split a batch into what will be sent and what is refused up front. `limit` null takes any size. */
|
|
43
|
+
export declare function partitionUploadBatch<T extends UploadCandidate>(files: readonly T[], limit?: number | null): UploadBatchPartition<T>;
|
|
44
44
|
/**
|
|
45
45
|
* Share of the run sent, 0-1, by bytes: a finished file counts whole, a failed
|
|
46
46
|
* one drops out. An all-empty batch falls back to counting files.
|
|
@@ -25,17 +25,18 @@ export const MAX_UPLOAD_LABEL = `${UPLOAD_LIMITS.MAX_FILE_SIZE_MB} MB`;
|
|
|
25
25
|
* can only surface "Upload failed (413): Request Entity Too Large", naming
|
|
26
26
|
* neither the file nor a limit.
|
|
27
27
|
*/
|
|
28
|
-
export function uploadRejectionReason(file) {
|
|
29
|
-
if (file.size <=
|
|
28
|
+
export function uploadRejectionReason(file, limit = MAX_UPLOAD_BYTES) {
|
|
29
|
+
if (limit === null || file.size <= limit)
|
|
30
30
|
return null;
|
|
31
|
-
|
|
31
|
+
const label = limit === MAX_UPLOAD_BYTES ? MAX_UPLOAD_LABEL : formatFileSize(limit);
|
|
32
|
+
return `${file.name} is ${formatFileSize(file.size)} — the upload limit is ${label}`;
|
|
32
33
|
}
|
|
33
|
-
/** Split a batch into what will be sent and what is refused up front. */
|
|
34
|
-
export function partitionUploadBatch(files) {
|
|
34
|
+
/** Split a batch into what will be sent and what is refused up front. `limit` null takes any size. */
|
|
35
|
+
export function partitionUploadBatch(files, limit = MAX_UPLOAD_BYTES) {
|
|
35
36
|
const accepted = [];
|
|
36
37
|
const rejected = [];
|
|
37
38
|
for (const file of files) {
|
|
38
|
-
const reason = uploadRejectionReason(file);
|
|
39
|
+
const reason = uploadRejectionReason(file, limit);
|
|
39
40
|
if (reason)
|
|
40
41
|
rejected.push({ file, reason });
|
|
41
42
|
else
|
|
@@ -41,9 +41,9 @@ export const sandboxExplorerSource = {
|
|
|
41
41
|
* parked Platinum box: the daemon answers `503 sandbox_not_ready` in 2ms
|
|
42
42
|
* while the mirror returns the tree in 33ms.
|
|
43
43
|
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
* back empty. `DriveExplorer` treats "parked and empty" as idle rather than as
|
|
44
|
+
* A session that never published has no branch of its own: the files
|
|
45
|
+
* routes then read its base branch, which is what the box checked out. A
|
|
46
|
+
* read can still fail and come back empty. `DriveExplorer` treats "parked and empty" as idle rather than as
|
|
47
47
|
* an empty folder, which is the one case this must not state as fact.
|
|
48
48
|
*
|
|
49
49
|
* Both hooks run every render; only one is ever enabled.
|