@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,110 @@
|
|
|
1
|
+
/** Claude Code rejects a dispatch under 4 characters with "Too short". */
|
|
2
|
+
export const DISPATCH_MIN_CHARS = 4;
|
|
3
|
+
const STATE_WORDS = {
|
|
4
|
+
working: ['working'],
|
|
5
|
+
needs_input: ['needs_input'],
|
|
6
|
+
input: ['needs_input'],
|
|
7
|
+
blocked: ['needs_input'],
|
|
8
|
+
idle: ['idle'],
|
|
9
|
+
completed: ['completed'],
|
|
10
|
+
done: ['completed'],
|
|
11
|
+
failed: ['failed'],
|
|
12
|
+
stopped: ['stopped'],
|
|
13
|
+
ended: ['failed', 'stopped'],
|
|
14
|
+
};
|
|
15
|
+
/** Split the leading `s:` / `a:` filter tokens off the input. An unknown state word is prompt text. */
|
|
16
|
+
export function parseBoardInput(input) {
|
|
17
|
+
const states = [];
|
|
18
|
+
const agents = [];
|
|
19
|
+
const words = input.trimStart().split(/(\s+)/);
|
|
20
|
+
let index = 0;
|
|
21
|
+
for (; index < words.length; index += 2) {
|
|
22
|
+
const word = words[index] ?? '';
|
|
23
|
+
const state = /^s:(\S+)$/i.exec(word)?.[1]?.toLowerCase();
|
|
24
|
+
const agent = /^a:(\S+)$/i.exec(word)?.[1];
|
|
25
|
+
if (state && STATE_WORDS[state]) {
|
|
26
|
+
for (const value of STATE_WORDS[state])
|
|
27
|
+
if (!states.includes(value))
|
|
28
|
+
states.push(value);
|
|
29
|
+
}
|
|
30
|
+
else if (agent) {
|
|
31
|
+
if (!agents.includes(agent))
|
|
32
|
+
agents.push(agent);
|
|
33
|
+
}
|
|
34
|
+
else
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
return { states, agents, rest: words.slice(index).join('').trim() };
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* What Enter does with the prompt part of the input. `agents` is the project's
|
|
41
|
+
* agent names; a match is case-insensitive and returns the agent's own spelling.
|
|
42
|
+
*/
|
|
43
|
+
export function parseDispatch(text, agents) {
|
|
44
|
+
const trimmed = text.trim();
|
|
45
|
+
if (!trimmed)
|
|
46
|
+
return { kind: 'empty' };
|
|
47
|
+
if (trimmed.length < DISPATCH_MIN_CHARS)
|
|
48
|
+
return { kind: 'too_short' };
|
|
49
|
+
const [first = '', ...more] = trimmed.split(/\s+/);
|
|
50
|
+
const named = first.startsWith('@') ? first.slice(1) : first;
|
|
51
|
+
const agent = agents.find((name) => name.toLowerCase() === named.toLowerCase());
|
|
52
|
+
const rest = trimmed.slice(first.length).trim();
|
|
53
|
+
if (agent && more.length > 0) {
|
|
54
|
+
// The prompt the agent gets must stand on its own: "@reviewer hi" is still too short.
|
|
55
|
+
if (rest.length < DISPATCH_MIN_CHARS)
|
|
56
|
+
return { kind: 'too_short' };
|
|
57
|
+
return { kind: 'dispatch', prompt: rest, agent };
|
|
58
|
+
}
|
|
59
|
+
return { kind: 'dispatch', prompt: trimmed };
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* The board's keys when the list has focus: ↑/↓ move, Space opens or closes the
|
|
63
|
+
* peek, Enter opens the session, x stops it, Escape closes the peek. A key typed
|
|
64
|
+
* into a field, or with a modifier, belongs to the field or the browser.
|
|
65
|
+
*/
|
|
66
|
+
export function boardKeyAction(event, target) {
|
|
67
|
+
if (event.altKey || event.ctrlKey || event.metaKey)
|
|
68
|
+
return null;
|
|
69
|
+
const tag = target?.tagName ?? '';
|
|
70
|
+
if (target?.isContentEditable || tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT')
|
|
71
|
+
return null;
|
|
72
|
+
// A focused button or link inside a row answers Enter and Space itself.
|
|
73
|
+
if ((tag === 'BUTTON' || tag === 'A') && (event.key === 'Enter' || event.key === ' '))
|
|
74
|
+
return null;
|
|
75
|
+
switch (event.key) {
|
|
76
|
+
case 'ArrowUp':
|
|
77
|
+
return 'up';
|
|
78
|
+
case 'ArrowDown':
|
|
79
|
+
return 'down';
|
|
80
|
+
case ' ':
|
|
81
|
+
return 'peek';
|
|
82
|
+
case 'Enter':
|
|
83
|
+
return 'open';
|
|
84
|
+
case 'x':
|
|
85
|
+
return event.shiftKey ? null : 'stop';
|
|
86
|
+
case 'Escape':
|
|
87
|
+
return 'close';
|
|
88
|
+
default:
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/** The row the selection moves to; it stays inside the list. */
|
|
93
|
+
export function moveBoardSelection(order, current, step) {
|
|
94
|
+
if (order.length === 0)
|
|
95
|
+
return null;
|
|
96
|
+
const index = current ? order.indexOf(current) : -1;
|
|
97
|
+
if (index === -1)
|
|
98
|
+
return step === 1 ? order[0] : order[order.length - 1];
|
|
99
|
+
return order[Math.min(order.length - 1, Math.max(0, index + step))];
|
|
100
|
+
}
|
|
101
|
+
export const sessionsLayoutOf = (view) => (view === 'board' ? 'board' : 'list');
|
|
102
|
+
/** The query string after the List/Board toggle: `view=board`, or no `view` for the list. */
|
|
103
|
+
export function withSessionsLayout(search, layout) {
|
|
104
|
+
const params = new URLSearchParams(search);
|
|
105
|
+
if (layout === 'board')
|
|
106
|
+
params.set('view', 'board');
|
|
107
|
+
else if (params.get('view') === 'board')
|
|
108
|
+
params.delete('view');
|
|
109
|
+
return params.toString();
|
|
110
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { ProjectSession, SessionBoardState } from '@kortix/sdk';
|
|
2
|
+
/** The board's groups, top to bottom. */
|
|
3
|
+
export declare const BOARD_GROUPS: readonly ["pinned", "needs_input", "working", "review", "completed", "ended"];
|
|
4
|
+
export type BoardGroupId = (typeof BOARD_GROUPS)[number];
|
|
5
|
+
/** Rows a folding group shows before "… N more". */
|
|
6
|
+
export declare const BOARD_FOLD_LIMIT = 5;
|
|
7
|
+
/**
|
|
8
|
+
* A session's board state: the API's `board_state`, else derived from the row
|
|
9
|
+
* an older API serves. `needs_input` wins when the session waits on its person
|
|
10
|
+
* (`attention`) or the review inbox holds an item for it.
|
|
11
|
+
*/
|
|
12
|
+
export declare function boardStateOf(session: ProjectSession, needsYouCount?: number): SessionBoardState;
|
|
13
|
+
/**
|
|
14
|
+
* The group a session sits in.
|
|
15
|
+
*
|
|
16
|
+
* "Ready for review": Claude Code puts a session there when it opened a pull
|
|
17
|
+
* request. A Kortix session row carries no change request, so the rule here is
|
|
18
|
+
* the closest fact the row has: the session is idle (its turn ended, it waits
|
|
19
|
+
* for the next prompt) and it left an answer (`result_excerpt`). That is a
|
|
20
|
+
* result for the person to read. An idle session with no answer is finished
|
|
21
|
+
* work with nothing to read: Completed.
|
|
22
|
+
*/
|
|
23
|
+
export declare function boardGroupOf(session: ProjectSession, needsYouCount?: number): BoardGroupId;
|
|
24
|
+
/** When the session last did something, for the row's age and the sort. */
|
|
25
|
+
export declare function boardActivityAt(session: ProjectSession): string;
|
|
26
|
+
export interface BoardFilters {
|
|
27
|
+
/** Board states to keep; empty keeps every state. */
|
|
28
|
+
states?: readonly SessionBoardState[];
|
|
29
|
+
/** Agent names or handles to keep; empty keeps every agent. */
|
|
30
|
+
agents?: readonly string[];
|
|
31
|
+
/** Case-insensitive text the title or result must contain. */
|
|
32
|
+
text?: string;
|
|
33
|
+
}
|
|
34
|
+
/** The agent a row names: the handle an agent gave it, else the agent it runs. */
|
|
35
|
+
export declare function boardAgentOf(session: ProjectSession): string | null;
|
|
36
|
+
/** The agent a row shows: the handle an agent gave it, else the agent it runs as a person reads it ("My Kortix"). */
|
|
37
|
+
export declare function boardAgentLabel(session: ProjectSession): string | null;
|
|
38
|
+
export declare function matchesBoardFilters(session: ProjectSession, filters: BoardFilters, title: string, needsYouCount?: number): boolean;
|
|
39
|
+
export interface BoardGroup {
|
|
40
|
+
id: BoardGroupId;
|
|
41
|
+
/** The rows shown. */
|
|
42
|
+
sessions: ProjectSession[];
|
|
43
|
+
/** Rows past the fold ("… N more"); 0 when the group shows every row. */
|
|
44
|
+
hidden: number;
|
|
45
|
+
total: number;
|
|
46
|
+
}
|
|
47
|
+
export interface GroupBoardOptions {
|
|
48
|
+
needsYouBySession?: Record<string, number>;
|
|
49
|
+
/** Groups the person unfolded with "… N more". */
|
|
50
|
+
expanded?: ReadonlySet<BoardGroupId>;
|
|
51
|
+
/** A filter is active: every group shows every match, as Claude's filters expand collapsed groups. */
|
|
52
|
+
filtering?: boolean;
|
|
53
|
+
foldLimit?: number;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* The sessions in board order: groups in `BOARD_GROUPS` order, newest activity
|
|
57
|
+
* first inside a group, empty groups dropped, a long finished group folded.
|
|
58
|
+
*/
|
|
59
|
+
export declare function groupBoard(sessions: readonly ProjectSession[], options?: GroupBoardOptions): BoardGroup[];
|
|
60
|
+
/** The rows the keyboard walks, top to bottom: every shown row of every group. */
|
|
61
|
+
export declare function boardRowOrder(groups: readonly BoardGroup[]): string[];
|
|
62
|
+
/** The row's age as Claude Code prints it: `now`, `3m`, `2h`, `4d`. */
|
|
63
|
+
export declare function compactAge(fromIso: string, nowMs: number): string;
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The agent board (`/projects/<id>/sessions?view=board`): every session of the
|
|
3
|
+
* project grouped by what it needs from the person, as Claude Code's agent view
|
|
4
|
+
* groups background sessions. Pure functions; the board component renders them.
|
|
5
|
+
*/
|
|
6
|
+
import { agentDisplayName } from '../../internal/components/agent-mark.js';
|
|
7
|
+
/** The board's groups, top to bottom. */
|
|
8
|
+
export const BOARD_GROUPS = ['pinned', 'needs_input', 'working', 'review', 'completed', 'ended'];
|
|
9
|
+
/** Rows a folding group shows before "… N more". */
|
|
10
|
+
export const BOARD_FOLD_LIMIT = 5;
|
|
11
|
+
/** Groups that fold: they collect finished sessions and grow without bound. */
|
|
12
|
+
const FOLDING_GROUPS = new Set(['completed', 'ended']);
|
|
13
|
+
/**
|
|
14
|
+
* A session's board state: the API's `board_state`, else derived from the row
|
|
15
|
+
* an older API serves. `needs_input` wins when the session waits on its person
|
|
16
|
+
* (`attention`) or the review inbox holds an item for it.
|
|
17
|
+
*/
|
|
18
|
+
export function boardStateOf(session, needsYouCount = 0) {
|
|
19
|
+
if (session.attention || needsYouCount > 0)
|
|
20
|
+
return 'needs_input';
|
|
21
|
+
if (session.board_state)
|
|
22
|
+
return session.board_state;
|
|
23
|
+
switch (session.status) {
|
|
24
|
+
case 'completed':
|
|
25
|
+
return 'completed';
|
|
26
|
+
case 'failed':
|
|
27
|
+
return 'failed';
|
|
28
|
+
case 'stopped':
|
|
29
|
+
return 'stopped';
|
|
30
|
+
case 'running':
|
|
31
|
+
return session.working?.state === 'idle' ? 'idle' : 'working';
|
|
32
|
+
default:
|
|
33
|
+
// queued, branching, provisioning: the session is starting, which is work in progress.
|
|
34
|
+
return 'working';
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The group a session sits in.
|
|
39
|
+
*
|
|
40
|
+
* "Ready for review": Claude Code puts a session there when it opened a pull
|
|
41
|
+
* request. A Kortix session row carries no change request, so the rule here is
|
|
42
|
+
* the closest fact the row has: the session is idle (its turn ended, it waits
|
|
43
|
+
* for the next prompt) and it left an answer (`result_excerpt`). That is a
|
|
44
|
+
* result for the person to read. An idle session with no answer is finished
|
|
45
|
+
* work with nothing to read: Completed.
|
|
46
|
+
*/
|
|
47
|
+
export function boardGroupOf(session, needsYouCount = 0) {
|
|
48
|
+
if (session.pinned_at)
|
|
49
|
+
return 'pinned';
|
|
50
|
+
const state = boardStateOf(session, needsYouCount);
|
|
51
|
+
switch (state) {
|
|
52
|
+
case 'needs_input':
|
|
53
|
+
return 'needs_input';
|
|
54
|
+
case 'working':
|
|
55
|
+
return 'working';
|
|
56
|
+
case 'idle':
|
|
57
|
+
return session.result_excerpt?.trim() ? 'review' : 'completed';
|
|
58
|
+
case 'completed':
|
|
59
|
+
return 'completed';
|
|
60
|
+
case 'failed':
|
|
61
|
+
case 'stopped':
|
|
62
|
+
return 'ended';
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/** When the session last did something, for the row's age and the sort. */
|
|
66
|
+
export function boardActivityAt(session) {
|
|
67
|
+
return session.last_activity_at || session.updated_at || session.created_at;
|
|
68
|
+
}
|
|
69
|
+
/** The agent a row names: the handle an agent gave it, else the agent it runs. */
|
|
70
|
+
export function boardAgentOf(session) {
|
|
71
|
+
return session.agent_handle || session.agent_name || null;
|
|
72
|
+
}
|
|
73
|
+
/** The agent a row shows: the handle an agent gave it, else the agent it runs as a person reads it ("My Kortix"). */
|
|
74
|
+
export function boardAgentLabel(session) {
|
|
75
|
+
if (session.agent_handle)
|
|
76
|
+
return session.agent_handle;
|
|
77
|
+
return session.agent_name ? agentDisplayName(session.agent_name) : null;
|
|
78
|
+
}
|
|
79
|
+
export function matchesBoardFilters(session, filters, title, needsYouCount = 0) {
|
|
80
|
+
if (filters.states?.length && !filters.states.includes(boardStateOf(session, needsYouCount)))
|
|
81
|
+
return false;
|
|
82
|
+
if (filters.agents?.length) {
|
|
83
|
+
const names = [session.agent_handle, session.agent_name].filter((name) => !!name);
|
|
84
|
+
if (!filters.agents.some((agent) => names.some((name) => name.toLowerCase() === agent.toLowerCase())))
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
const text = filters.text?.trim().toLowerCase();
|
|
88
|
+
if (text && !`${title}\n${session.result_excerpt ?? ''}`.toLowerCase().includes(text))
|
|
89
|
+
return false;
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* The sessions in board order: groups in `BOARD_GROUPS` order, newest activity
|
|
94
|
+
* first inside a group, empty groups dropped, a long finished group folded.
|
|
95
|
+
*/
|
|
96
|
+
export function groupBoard(sessions, options = {}) {
|
|
97
|
+
const limit = options.foldLimit ?? BOARD_FOLD_LIMIT;
|
|
98
|
+
const byGroup = new Map();
|
|
99
|
+
for (const session of sessions) {
|
|
100
|
+
const group = boardGroupOf(session, options.needsYouBySession?.[session.session_id] ?? 0);
|
|
101
|
+
const list = byGroup.get(group);
|
|
102
|
+
if (list)
|
|
103
|
+
list.push(session);
|
|
104
|
+
else
|
|
105
|
+
byGroup.set(group, [session]);
|
|
106
|
+
}
|
|
107
|
+
const groups = [];
|
|
108
|
+
for (const id of BOARD_GROUPS) {
|
|
109
|
+
const list = byGroup.get(id);
|
|
110
|
+
if (!list?.length)
|
|
111
|
+
continue;
|
|
112
|
+
list.sort((a, b) => Date.parse(boardActivityAt(b)) - Date.parse(boardActivityAt(a)));
|
|
113
|
+
const fold = FOLDING_GROUPS.has(id) && !options.filtering && !options.expanded?.has(id) && list.length > limit + 1;
|
|
114
|
+
groups.push({
|
|
115
|
+
id,
|
|
116
|
+
sessions: fold ? list.slice(0, limit) : list,
|
|
117
|
+
hidden: fold ? list.length - limit : 0,
|
|
118
|
+
total: list.length,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
return groups;
|
|
122
|
+
}
|
|
123
|
+
/** The rows the keyboard walks, top to bottom: every shown row of every group. */
|
|
124
|
+
export function boardRowOrder(groups) {
|
|
125
|
+
return groups.flatMap((group) => group.sessions.map((session) => session.session_id));
|
|
126
|
+
}
|
|
127
|
+
/** The row's age as Claude Code prints it: `now`, `3m`, `2h`, `4d`. */
|
|
128
|
+
export function compactAge(fromIso, nowMs) {
|
|
129
|
+
const then = Date.parse(fromIso);
|
|
130
|
+
if (!Number.isFinite(then))
|
|
131
|
+
return '';
|
|
132
|
+
const minutes = Math.floor(Math.max(0, nowMs - then) / 60_000);
|
|
133
|
+
if (minutes < 1)
|
|
134
|
+
return 'now';
|
|
135
|
+
if (minutes < 60)
|
|
136
|
+
return `${minutes}m`;
|
|
137
|
+
const hours = Math.floor(minutes / 60);
|
|
138
|
+
if (hours < 24)
|
|
139
|
+
return `${hours}h`;
|
|
140
|
+
return `${Math.floor(hours / 24)}d`;
|
|
141
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ProjectSession } from '@kortix/sdk';
|
|
2
|
+
/**
|
|
3
|
+
* The board's peek (Claude Code's `Space`): a side sheet with the session's
|
|
4
|
+
* transcript, live, read from the API (`SessionPeek`): a preview wakes no
|
|
5
|
+
* computer and never moves the app's runtime. One reply input steers the
|
|
6
|
+
* running turn. ↑/↓ outside the input move the peek to the next row.
|
|
7
|
+
*/
|
|
8
|
+
export declare function BoardPeek({ projectId, session, title, needsYouCount, onClose, onMove, }: {
|
|
9
|
+
projectId: string;
|
|
10
|
+
session: ProjectSession | null;
|
|
11
|
+
title: string;
|
|
12
|
+
needsYouCount: number;
|
|
13
|
+
onClose: () => void;
|
|
14
|
+
onMove: (step: 1 | -1) => void;
|
|
15
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { ArrowSquareOutIcon, PaperPlaneRightIcon } from '@phosphor-icons/react';
|
|
4
|
+
import { useState } from 'react';
|
|
5
|
+
import { useTranslations } from '../../i18n/index.js';
|
|
6
|
+
import { uiRoutes } from '../../lib/routes.js';
|
|
7
|
+
import { Button } from '../../primitives/button.js';
|
|
8
|
+
import { Input } from '../../primitives/input.js';
|
|
9
|
+
import Loading from '../../primitives/loading.js';
|
|
10
|
+
import { Sheet, SheetContent, SheetDescription, SheetTitle } from '../../primitives/sheet.js';
|
|
11
|
+
import { errorToast, successToast } from '../../primitives/toast.js';
|
|
12
|
+
import { UiLink } from '../../providers/ui-provider.js';
|
|
13
|
+
import { SessionPeek } from '../../session/agents/session-peek.js';
|
|
14
|
+
import { useSteerSession } from '../../session/agents/steer-session.js';
|
|
15
|
+
import { boardAgentLabel, boardStateOf } from './board-grouping.js';
|
|
16
|
+
import { BoardStateMark } from './board-state-mark.js';
|
|
17
|
+
/**
|
|
18
|
+
* The board's peek (Claude Code's `Space`): a side sheet with the session's
|
|
19
|
+
* transcript, live, read from the API (`SessionPeek`): a preview wakes no
|
|
20
|
+
* computer and never moves the app's runtime. One reply input steers the
|
|
21
|
+
* running turn. ↑/↓ outside the input move the peek to the next row.
|
|
22
|
+
*/
|
|
23
|
+
export function BoardPeek({ projectId, session, title, needsYouCount, onClose, onMove, }) {
|
|
24
|
+
const t = useTranslations('multiAgent.board');
|
|
25
|
+
const [reply, setReply] = useState('');
|
|
26
|
+
const send = useSteerSession(projectId, {
|
|
27
|
+
onSent: () => {
|
|
28
|
+
setReply('');
|
|
29
|
+
successToast(t('replySent'));
|
|
30
|
+
},
|
|
31
|
+
onError: (error) => errorToast(t('replyFailed'), { description: error instanceof Error ? error.message : undefined }),
|
|
32
|
+
});
|
|
33
|
+
const submit = () => {
|
|
34
|
+
const text = reply.trim();
|
|
35
|
+
if (!session || !text || send.isPending)
|
|
36
|
+
return;
|
|
37
|
+
send.mutate({ sessionId: session.session_id, text });
|
|
38
|
+
};
|
|
39
|
+
const onKeyDown = (event) => {
|
|
40
|
+
const target = event.target;
|
|
41
|
+
if (target.tagName === 'INPUT' || target.isContentEditable)
|
|
42
|
+
return;
|
|
43
|
+
if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {
|
|
44
|
+
event.preventDefault();
|
|
45
|
+
onMove(event.key === 'ArrowDown' ? 1 : -1);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
const state = session ? boardStateOf(session, needsYouCount) : null;
|
|
49
|
+
const agent = session ? boardAgentLabel(session) : null;
|
|
50
|
+
return (_jsx(Sheet, { open: !!session, onOpenChange: (open) => !open && onClose(), children: _jsx(SheetContent, { side: "right", className: "w-full gap-0 p-0 sm:max-w-xl", overlayClassName: "bg-transparent", onKeyDown: onKeyDown, "aria-describedby": undefined, children: session && state ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "border-border flex shrink-0 items-start gap-3 border-b px-4 py-3 pr-14", children: [_jsxs("div", { className: "min-w-0 flex-1 space-y-1", children: [_jsx(SheetTitle, { className: "text-foreground truncate text-sm font-medium", children: title }), _jsx(SheetDescription, { asChild: true, children: _jsxs("div", { className: "text-muted-foreground flex min-w-0 items-center gap-1.5 text-xs", children: [_jsx(BoardStateMark, { state: state }), agent ? (_jsxs(_Fragment, { children: [_jsx("span", { "aria-hidden": true, children: "\u00B7" }), _jsx("span", { className: "truncate", children: agent })] })) : null] }) })] }), _jsx(Button, { asChild: true, variant: "outline", size: "sm", className: "shrink-0 gap-1.5", children: _jsxs(UiLink, { href: uiRoutes().session(projectId, session.session_id), children: [_jsx(ArrowSquareOutIcon, { className: "size-3.5 shrink-0" }), t('openSession')] }) })] }), _jsx("div", { className: "flex min-h-0 flex-1 flex-col", children: _jsx(SessionPeek, { projectId: projectId, sessionId: session.session_id, working: state === 'working', density: "compact" }, session.session_id) }), _jsxs("form", { className: "border-border flex shrink-0 items-center gap-2 border-t px-4 py-3", onSubmit: (event) => {
|
|
51
|
+
event.preventDefault();
|
|
52
|
+
submit();
|
|
53
|
+
}, children: [_jsx(Input, { value: reply, onChange: (event) => setReply(event.target.value), placeholder: t('replyPlaceholder'), "aria-label": t('replyLabel', { title }), disabled: send.isPending, className: "min-w-0 flex-1" }), _jsxs(Button, { type: "submit", size: "sm", className: "shrink-0 gap-1.5", disabled: !reply.trim() || send.isPending, children: [send.isPending ? (_jsx(Loading, { className: "size-3.5 shrink-0" })) : (_jsx(PaperPlaneRightIcon, { className: "size-3.5 shrink-0" })), t('sendReply')] })] })] })) : null }) }));
|
|
54
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { SessionBoardState } from '@kortix/sdk';
|
|
2
|
+
import { type StatusTone } from '../../primitives/status.js';
|
|
3
|
+
/**
|
|
4
|
+
* One hue per state (color.md, D5): working is live (green), needs input asks
|
|
5
|
+
* for attention (orange), completed succeeded (green), failed broke (red);
|
|
6
|
+
* idle and stopped carry no hue. The word beside the dot says the state, so
|
|
7
|
+
* the color is never the only carrier.
|
|
8
|
+
*/
|
|
9
|
+
export declare const BOARD_STATE_TONE: Record<SessionBoardState, StatusTone>;
|
|
10
|
+
/** The state dot and its word. A working dot pulses: it is the one state that changes while you watch. */
|
|
11
|
+
export declare function BoardStateMark({ state, showLabel, className, }: {
|
|
12
|
+
state: SessionBoardState;
|
|
13
|
+
showLabel?: boolean;
|
|
14
|
+
className?: string;
|
|
15
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useTranslations } from '../../i18n/index.js';
|
|
4
|
+
import { cn } from '../../lib/utils.js';
|
|
5
|
+
import { StatusDot } from '../../primitives/status.js';
|
|
6
|
+
/**
|
|
7
|
+
* One hue per state (color.md, D5): working is live (green), needs input asks
|
|
8
|
+
* for attention (orange), completed succeeded (green), failed broke (red);
|
|
9
|
+
* idle and stopped carry no hue. The word beside the dot says the state, so
|
|
10
|
+
* the color is never the only carrier.
|
|
11
|
+
*/
|
|
12
|
+
export const BOARD_STATE_TONE = {
|
|
13
|
+
working: 'success',
|
|
14
|
+
needs_input: 'warning',
|
|
15
|
+
idle: 'neutral',
|
|
16
|
+
completed: 'success',
|
|
17
|
+
failed: 'destructive',
|
|
18
|
+
stopped: 'neutral',
|
|
19
|
+
};
|
|
20
|
+
/** The state dot and its word. A working dot pulses: it is the one state that changes while you watch. */
|
|
21
|
+
export function BoardStateMark({ state, showLabel = true, className, }) {
|
|
22
|
+
const t = useTranslations('multiAgent.board.state');
|
|
23
|
+
return (_jsxs("span", { className: cn('inline-flex shrink-0 items-center gap-1.5', className), "data-board-state": state, children: [_jsx(StatusDot, { tone: BOARD_STATE_TONE[state], pulse: state === 'working', className: "motion-reduce:animate-none" }), _jsx("span", { className: cn(showLabel ? 'text-muted-foreground text-xs' : 'sr-only'), children: t(state) })] }));
|
|
24
|
+
}
|
|
@@ -7,7 +7,7 @@ import { Button } from '../../primitives/button.js';
|
|
|
7
7
|
import { Disclosure, DisclosureContent, DisclosureTrigger } from '../../primitives/disclosure.js';
|
|
8
8
|
import { FadedScrollArea } from '../../primitives/faded-scroll-area.js';
|
|
9
9
|
import { Skeleton } from '../../primitives/skeleton.js';
|
|
10
|
-
import { Tabs, TabsListCompact, TabsTriggerCompact } from '../../primitives/tabs.js';
|
|
10
|
+
import { Tabs, TabsList, TabsListCompact, TabsTrigger, TabsTriggerCompact } from '../../primitives/tabs.js';
|
|
11
11
|
import { errorToast, successToast, warningToast } from '../../primitives/toast.js';
|
|
12
12
|
import { EmptyState } from '../../primitives/empty-state.js';
|
|
13
13
|
import { ErrorState } from '../../primitives/error-state.js';
|
|
@@ -27,7 +27,7 @@ import { selectExpandedIds, useSessionExpandedStore, } from '../../internal/stor
|
|
|
27
27
|
import { selectCollapsedSections, selectGroupMode, selectHiddenSections, selectOrderMode, selectSourceFilters, selectLabelFilters, selectAccessFilters, selectOwnerFilters, selectStatusFilters, useSessionFilterStore, } from '../../internal/stores/session-filter-store.js';
|
|
28
28
|
import { deleteProjectSession, restartProjectSession, setSessionArchived, stopProjectSession, } from '@kortix/sdk';
|
|
29
29
|
import { qk, removeCachedProjectSession, useFeatureFlag, useProjectSessions, useSessionChildren, } from '@kortix/sdk/react';
|
|
30
|
-
import { CaretRightIcon, MagnifyingGlassIcon } from '@phosphor-icons/react';
|
|
30
|
+
import { CaretRightIcon, KanbanIcon, ListIcon, MagnifyingGlassIcon } from '@phosphor-icons/react';
|
|
31
31
|
import { useMutation, useQueryClient } from '@tanstack/react-query';
|
|
32
32
|
import { format, formatDistanceToNowStrict } from 'date-fns';
|
|
33
33
|
import { useUiPathname, useUiRouter, useUiSearchParams } from '../../providers/ui-provider.js';
|
|
@@ -41,6 +41,8 @@ import { SessionRow } from './session-row.js';
|
|
|
41
41
|
import { SessionsEmptyState } from './sessions-empty-state.js';
|
|
42
42
|
import { SessionsSelectionBar } from './sessions-selection-bar.js';
|
|
43
43
|
import { SessionsToolbar } from './sessions-toolbar.js';
|
|
44
|
+
import { sessionsLayoutOf, withSessionsLayout } from './board-dispatch.js';
|
|
45
|
+
import { SessionsBoard } from './sessions-board.js';
|
|
44
46
|
/**
|
|
45
47
|
* This page's view state is its OWN — narrowing the manager inventory here must not
|
|
46
48
|
* narrow the sidebar you navigate with. It still OPENS matching the sidebar:
|
|
@@ -136,6 +138,7 @@ export function ProjectSessionsView({ projectId }) {
|
|
|
136
138
|
const tPinArchive = useTranslations('sidebar.pinArchive');
|
|
137
139
|
const tDeleted = useTranslations('sidebar.recentlyDeleted');
|
|
138
140
|
const tSessionDelete = useTranslations('sessionDelete');
|
|
141
|
+
const tBoard = useTranslations('multiAgent.board');
|
|
139
142
|
const queryClient = useQueryClient();
|
|
140
143
|
const router = useUiRouter();
|
|
141
144
|
const pathname = useUiPathname();
|
|
@@ -157,6 +160,14 @@ export function ProjectSessionsView({ projectId }) {
|
|
|
157
160
|
if (tab)
|
|
158
161
|
setStartedBy(tab);
|
|
159
162
|
}
|
|
163
|
+
// `?view=board` is the agent board (Claude Code's agent view); the toggle writes it.
|
|
164
|
+
const layout = sessionsLayoutOf(viewParam);
|
|
165
|
+
const selectLayout = (next) => {
|
|
166
|
+
if (next === layout)
|
|
167
|
+
return;
|
|
168
|
+
const query = withSessionsLayout(searchParams?.toString() ?? '', next);
|
|
169
|
+
router.replace(query ? `${pathname}?${query}` : pathname, { scroll: false });
|
|
170
|
+
};
|
|
160
171
|
// A tab writes `?view=`: a reload keeps it, and the sidebar link opens the
|
|
161
172
|
// view again after the viewer picked another tab.
|
|
162
173
|
const selectTab = (tab) => {
|
|
@@ -535,35 +546,35 @@ export function ProjectSessionsView({ projectId }) {
|
|
|
535
546
|
} })) : null }), childrenOpen ? (_jsx(SessionChildrenRows, { projectId: projectId, parentId: session.session_id, q: searching && session.search_match === 'child' ? searchQuery : undefined, renderRow: (child) => renderRow(child) })) : null] }, session.session_id));
|
|
536
547
|
};
|
|
537
548
|
const header = selectMode ? (_jsx(SessionsSelectionBar, { selectedCount: selectedCount, selectableCount: selectableSessions.length, allSelected: allSelected, onSelectAll: () => setSelected(new Set(selectableSessions.map((session) => session.session_id))), onClearSelection: () => setSelected(new Set()), onExit: exitSelectMode, onDelete: () => setBulkConfirmOpen(true), deleting: bulkDeleteMutation.isPending, onArchive: () => bulkArchiveMutation.mutate({ sessionIds: [...visibleSelection], archived: !archivedTab }), archiveLabel: tPinArchive(archivedTab ? 'bulkUnarchive' : 'bulkArchive'), archiving: bulkArchiveMutation.isPending })) : (_jsx(SessionsToolbar, { projectId: projectId, sessions: sessions, reviewCountBySession: needsYouBySession, search: search, onSearchChange: setSearch, searchOpen: searchOpen, onSearchOpenChange: setSearchOpen, onEnterSelectMode: () => setSelectMode(true), creatingSession: creatingSession, canSelect: sessions.length > 0 && !deletedTab, showNewSession: !channelsOn }));
|
|
538
|
-
return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "relative flex h-full min-h-0 flex-col overflow-hidden", children: [_jsx(SidebarToggle, { placement: "floating" }), _jsxs("header", { className: cn('mx-auto w-full max-w-4xl shrink-0 px-4 pt-10 pb-5 lg:pt-20', 'flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between'), children: [_jsx("div", { className: "space-y-1", children: _jsx("h2", { className: "text-foreground text-xl font-medium", children: tI18nComplete.raw('text6fa3cbf451b2') }) }),
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
549
|
+
return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "relative flex h-full min-h-0 flex-col overflow-hidden", children: [_jsx(SidebarToggle, { placement: "floating" }), _jsxs("header", { className: cn('mx-auto w-full max-w-4xl shrink-0 px-4 pt-10 pb-5 lg:pt-20', 'flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between'), children: [_jsx("div", { className: "space-y-1", children: _jsx("h2", { className: "text-foreground text-xl font-medium", children: tI18nComplete.raw('text6fa3cbf451b2') }) }), _jsxs("div", { className: "mt-2 flex shrink-0 items-center gap-2 sm:mt-0", children: [_jsx(Tabs, { value: layout, onValueChange: (value) => selectLayout(value), children: _jsxs(TabsList, { "aria-label": tBoard('layoutLabel'), children: [_jsxs(TabsTrigger, { value: "list", size: "sm", className: "gap-1.5", children: [_jsx(ListIcon, { className: "size-3.5" }), tBoard('layoutList')] }), _jsxs(TabsTrigger, { value: "board", size: "sm", className: "gap-1.5", children: [_jsx(KanbanIcon, { className: "size-3.5" }), tBoard('layoutBoard')] })] }) }), layout === 'list' ? header : null] })] }), _jsx("div", { className: cn('mx-auto flex min-h-0 w-full max-w-4xl flex-1 flex-col px-4 pb-4'), children: layout === 'board' ? (_jsx(SessionsBoard, { projectId: projectId })) : (_jsxs(_Fragment, { children: [_jsx(Tabs, { value: startedBy, onValueChange: (value) => selectTab(value), className: "shrink-0", children: _jsxs(TabsListCompact, { "aria-label": tSidebar('startedBy.label'), children: [STARTED_BY_FILTERS.map((value) => (_jsx(TabsTriggerCompact, { value: value, children: tSidebar(`startedBy.${value}`) }, value))), _jsx(TabsTriggerCompact, { value: "archived", children: tPinArchive('view') }), _jsx(TabsTriggerCompact, { value: "deleted", children: tDeleted('view') })] }) }), listState === 'loading' ? (_jsx(SessionListSkeleton, {})) : listState === 'error' ? (_jsx(ErrorState, { size: "sm", title: tI18nComplete.raw('textb6d85433a7ee'), description: sessionsQuery.error instanceof Error ? sessionsQuery.error.message : undefined, action: _jsx(Button, { variant: "outline", size: "sm", onClick: () => sessionsQuery.refetch(), children: tI18nComplete.raw('text942087cc2d41') }) })) : listState === 'more' ? (
|
|
550
|
+
// No row the viewer can see on the pages read so far, and more
|
|
551
|
+
// pages exist (KRTX-1727): offer them, never "No sessions yet".
|
|
552
|
+
_jsx("div", { className: "pt-6", children: loadMoreButton })) : listState === 'empty' && !searching && archivedTab ? (_jsx(EmptyState, { size: "sm", title: tPinArchive('empty') })) : listState === 'empty' && !searching && deletedTab ? (_jsx(EmptyState, { size: "sm", title: tDeleted('empty', { days: RESTORE_DAYS }) })) : deletedTab && listState !== 'empty' ? (
|
|
553
|
+
// Flat, newest first as the server pages it. No grouping or client
|
|
554
|
+
// facets: these are the rows the restore route would still take.
|
|
555
|
+
_jsx("div", { className: "relative min-h-0 flex-1", children: _jsx("div", { className: "absolute inset-0", children: _jsx(FadedScrollArea, { fadeColor: "from-background", className: "pt-4", children: _jsxs("div", { className: "space-y-2 pb-6", "aria-live": "polite", "data-recently-deleted": true, children: [sessions.map((session) => (_jsx(DeletedSessionRow, { session: session, restoring: restoreMutation.isPending &&
|
|
556
|
+
restoreMutation.variables?.session_id === session.session_id, onRestore: restoreSession }, session.session_id))), sessionsQuery.hasNextPage && loadMoreButton] }) }) }) })) : listState === 'empty' && !searching && startedBy === 'all' ? (_jsx(SessionsEmptyState, { className: "flex-1 pb-24" })) : grouped.sections.length === 0 || listState === 'empty' ? (
|
|
557
|
+
// Covers BOTH "the filters/search match nothing" and "every section
|
|
558
|
+
// was hidden via the menu's Show list" — `visibleSessions.length`
|
|
559
|
+
// alone cannot see the second, and the list would otherwise render
|
|
560
|
+
// an empty scroll area with no explanation.
|
|
561
|
+
_jsx(EmptyState, { size: "sm", icon: MagnifyingGlassIcon, title: tI18nComplete.raw('text2732406e3be5'), description: visibleSessions.length > 0
|
|
562
|
+
? tI18nComplete.raw('text67f2187d81d7')
|
|
563
|
+
: tI18nComplete.raw('text2749b54ef956'), action: _jsx(Button, { variant: "outline", size: "sm", onClick: () => {
|
|
564
|
+
resetFilters(projectId, SURFACE);
|
|
565
|
+
setSearch('');
|
|
566
|
+
selectTab('all');
|
|
567
|
+
}, children: tI18nComplete.raw('text7179ea0035fc') }) })) : (
|
|
568
|
+
/* The list gets a containing block whose height cannot depend on
|
|
569
|
+
its children. `FadedScrollArea` sizes its outer element with
|
|
570
|
+
`h-full`, and `height: 100%` only resolves against a definite
|
|
571
|
+
height — inside a flex chain still being measured from content it
|
|
572
|
+
resolves to `auto`, so the component grows to fit every row and
|
|
573
|
+
the whole app shell scrolls instead of the list. An
|
|
574
|
+
`absolute inset-0` layer is out of flow, so this parent
|
|
575
|
+
contributes no content height and takes only what flexbox gives
|
|
576
|
+
it, which makes the percentage definite. */
|
|
577
|
+
_jsx("div", { className: "relative min-h-0 flex-1", children: _jsx("div", { className: "absolute inset-0", children: _jsx(FadedScrollArea, { fadeColor: "from-background", className: "pt-4", children: _jsxs("div", { className: "space-y-4 pb-6", "aria-live": "polite", children: [grouped.sections.map((section) => (_jsx(SessionsSection, { section: section, showHeader: grouped.showHeaders, open: !collapsedSectionSet.has(section.id), onOpenChange: () => toggleSectionCollapsed(projectId, section.id, SURFACE), children: section.sessions.map((session) => renderRow(session, true)) }, section.id))), sessionsQuery.hasNextPage && loadMoreButton] }) }) }) }))] })) })] }), _jsx(SessionsBulkDeleteDialog, { count: selectedCount, open: bulkConfirmOpen, isPending: bulkDeleteMutation.isPending, onOpenChange: setBulkConfirmOpen, onConfirm: () => bulkDeleteMutation.mutate([...visibleSelection]) }), _jsx(ShareSessionModal, { projectId: projectId, session: sessionToShare, open: !!sessionToShare, onOpenChange: (open) => !open && setSessionToShare(null), onSaved: invalidateSessions }), _jsx(SessionLabelsModal, { projectId: projectId, session: sessionToLabel, open: !!sessionToLabel, onOpenChange: (open) => !open && setSessionToLabel(null) }), _jsx(RenameSessionModal, { projectId: projectId, sessionId: sessionToRename?.id ?? null, currentName: sessionToRename?.name, open: !!sessionToRename, onOpenChange: (open) => !open && setSessionToRename(null) }), _jsx(SessionDeleteModal, { projectId: projectId, sessionId: sessionToDelete?.id ?? null, sessionLabel: sessionToDelete?.label, open: !!sessionToDelete, onOpenChange: (open) => !open && setSessionToDelete(null),
|
|
567
578
|
// The modal's own onSuccess already invalidates qk.project.sessionsScope
|
|
568
579
|
// — the prefix that reaches the 'project'-scoped key this view reads
|
|
569
580
|
// — so this is a harmless duplicate, kept so the two do not silently
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The agent board (`/projects/<id>/sessions?view=board`), Claude Code's agent
|
|
3
|
+
* view in Kortix's own look: every session of the project, child sessions
|
|
4
|
+
* included, grouped by what it needs (Pinned, Needs input, Working, Ready for
|
|
5
|
+
* review, Completed, Failed · Stopped). One input on top starts a session
|
|
6
|
+
* (`@agent prompt` or a plain prompt) or filters the board (`s:working`,
|
|
7
|
+
* `a:reviewer`). The list owns the keys: ↑/↓ move, Space peeks, Enter opens,
|
|
8
|
+
* x stops.
|
|
9
|
+
*/
|
|
10
|
+
export declare function SessionsBoard({ projectId }: {
|
|
11
|
+
projectId: string;
|
|
12
|
+
}): import("react").JSX.Element;
|