@allbluecn/web-app 0.19.2 → 0.19.4
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/package.json +45 -44
- package/public/fonts/Trap-font/Trap-Black.otf +0 -0
- package/public/fonts/Trap-font/Trap-Bold.otf +0 -0
- package/public/fonts/Trap-font/Trap-ExtraBold.otf +0 -0
- package/public/fonts/Trap-font/Trap-Light.otf +0 -0
- package/public/fonts/Trap-font/Trap-Medium.otf +0 -0
- package/public/fonts/Trap-font/Trap-Regular.otf +0 -0
- package/public/fonts/Trap-font/Trap-SemiBold.otf +0 -0
- package/public/fonts/buttersans-Rounded.otf +0 -0
- package/src/__tests__/desktop-connection-validate.test.ts +66 -0
- package/src/__tests__/knowledge/public/share-merge.test.ts +7 -1
- package/src/__tests__/security/xss-sanitize.test.ts +21 -0
- package/src/__tests__/setup.ts +5 -0
- package/src/__tests__/story-view.test.ts +24 -2
- package/src/components/agents/agent-bindings-tab.tsx +13 -7
- package/src/components/agents/agent-card.tsx +5 -10
- package/src/components/agents/agent-form-dialog.tsx +10 -3
- package/src/components/agents/agent-selector.tsx +6 -3
- package/src/components/agents/agents-page.tsx +5 -2
- package/src/components/agents/schemas/agent-form.ts +1 -1
- package/src/components/agents/skill-form-dialog.tsx +19 -5
- package/src/components/agents/use-agent-handlers.ts +3 -1
- package/src/components/ai/__tests__/ai-prompt-input-attach.test.tsx +0 -3
- package/src/components/ai/__tests__/web-search-card-url.test.tsx +87 -0
- package/src/components/ai/ai-chat-prompt.tsx +4 -13
- package/src/components/ai/ai-prompt-input/components/action-buttons.tsx +3 -18
- package/src/components/ai/ai-prompt-input/components/context-badge.tsx +1 -13
- package/src/components/ai/ai-prompt-input/components/kb-context-selector.tsx +15 -27
- package/src/components/ai/ai-prompt-input/components/model-select.tsx +21 -14
- package/src/components/ai/ai-prompt-input/constants.tsx +0 -18
- package/src/components/ai/ai-prompt-input/index.tsx +50 -113
- package/src/components/ai/ai-suggested-prompts.tsx +28 -15
- package/src/components/ai/global-harness-sidebar/index.tsx +42 -23
- package/src/components/ai/tool-cards/-shared.tsx +5 -1
- package/src/components/ai/tool-cards/fallback-tool-card.tsx +2 -2
- package/src/components/ai/tool-cards/knowledge-search-card.tsx +7 -53
- package/src/components/ai/tool-cards/web-search-card.tsx +29 -68
- package/src/components/anyhub/anyhub-app-card.tsx +53 -19
- package/src/components/anyhub/anyhub-app-runner.tsx +53 -20
- package/src/components/anyhub/anyhub-install-dialog.tsx +43 -15
- package/src/components/anyhub/anyhub-management-view.tsx +4 -3
- package/src/components/anyhub/anyhub-marketplace-view.tsx +16 -11
- package/src/components/anyhub/anyhub-permission-panel.tsx +50 -16
- package/src/components/anyhub/anyhub-top-nav.tsx +2 -2
- package/src/components/auth/auth-features.ts +32 -0
- package/src/components/auth/icon-input.tsx +3 -1
- package/src/components/auth/password-input.tsx +3 -2
- package/src/components/auth/session-guard.tsx +2 -1
- package/src/components/auth/sso-section.tsx +9 -4
- package/src/components/billing/__tests__/feature-label.test.ts +22 -0
- package/src/components/billing/billing-panel.tsx +8 -32
- package/src/components/billing/checkout-redirect.ts +3 -2
- package/src/components/billing/currency-toggle.tsx +62 -19
- package/src/components/billing/feature-gate.tsx +5 -0
- package/src/components/billing/feature-label.ts +51 -0
- package/src/components/billing/invoice-history.tsx +2 -2
- package/src/components/billing/login-prompt-dialog.tsx +5 -16
- package/src/components/billing/pricing-card.tsx +10 -11
- package/src/components/billing/pricing-page.tsx +26 -4
- package/src/components/billing/seats-manager.tsx +9 -2
- package/src/components/billing/subscription-card.tsx +5 -10
- package/src/components/billing/upgrade-prompt.tsx +2 -11
- package/src/components/billing/use-feature.ts +6 -1
- package/src/components/bug/__tests__/bug-display-dropdown.test.tsx +1 -1
- package/src/components/bug/__tests__/bug-list-loading-defer.test.tsx +1 -1
- package/src/components/bug/__tests__/saved-views.test.tsx +1 -1
- package/src/components/bug/__tests__/toolbar-shell.test.tsx +1 -1
- package/src/components/bug/__tests__/use-paged-bug-groups.test.tsx +1 -1
- package/src/components/bug/bug-list-view.tsx +31 -9
- package/src/components/bug/bug-panel-header.tsx +8 -3
- package/src/components/bug/bug-toolbar.tsx +1 -1
- package/src/components/bug/collect/collect-form.tsx +2 -0
- package/src/components/bug/create-bug-dialog.tsx +2 -1
- package/src/components/bug/detail/activity-tabs.tsx +12 -3
- package/src/components/bug/detail/bug-detail-body.tsx +2 -2
- package/src/components/bug/detail/comment-input.tsx +4 -2
- package/src/components/bug/detail/comment-item.tsx +5 -3
- package/src/components/bug/detail/comment-reactions.tsx +2 -1
- package/src/components/bug/detail/error-context.tsx +10 -0
- package/src/components/bug/detail/events-timeline.tsx +22 -6
- package/src/components/bug/detail/fix-timeline.tsx +20 -7
- package/src/components/bug/detail/props-section.tsx +2 -1
- package/src/components/bug/detail/repro-report-card.tsx +30 -9
- package/src/components/bug/detail/reproduce-steps-view.tsx +3 -2
- package/src/components/bug/display/constants.ts +1 -1
- package/src/components/bug/display/display-dropdown.tsx +1 -1
- package/src/components/bug/display/use-bug-display-options.ts +13 -7
- package/src/components/bug/display/use-paged-bug-groups.ts +16 -4
- package/src/components/bug/filters/field-configs.tsx +156 -174
- package/src/components/bug/inline-editors/assignee-editor.tsx +4 -1
- package/src/components/bug/inline-editors/date-editor.tsx +14 -5
- package/src/components/bug/inline-editors/severity-editor.tsx +14 -17
- package/src/components/bug/peek-panel.tsx +4 -1
- package/src/components/bug/select-bug-dialog.tsx +15 -1
- package/src/components/bug/settings/bug-settings-panel.tsx +24 -8
- package/src/components/bug/settings/collect-page-manager.tsx +10 -5
- package/src/components/bug/settings/webhook-manager.tsx +11 -0
- package/src/components/bug/story-bugs-panel.tsx +214 -227
- package/src/components/bug/views/board-view.tsx +2 -2
- package/src/components/bug/views/bug-list/group.tsx +1 -1
- package/src/components/bug/views/bug-list/index.tsx +1 -1
- package/src/components/bug/views/bug-list/inline-bug-creator.tsx +14 -10
- package/src/components/bug/views/bug-list/row.tsx +6 -3
- package/src/components/bug/views/view-types.ts +1 -1
- package/src/components/changelog/changelog-page.tsx +53 -38
- package/src/components/collab/__tests__/activity-attribution.test.tsx +25 -11
- package/src/components/collab/activity-attribution.tsx +27 -17
- package/src/components/command/command-palette.tsx +12 -4
- package/src/components/design/canvas/document/__tests__/ai.test.ts +71 -0
- package/src/components/design/canvas/document/__tests__/color-utils.test.ts +11 -0
- package/src/components/design/canvas/document/__tests__/frames.test.ts +13 -0
- package/src/components/design/canvas/document/__tests__/layer-order.test.ts +14 -1
- package/src/components/design/canvas/document/align.ts +1 -1
- package/src/components/design/canvas/document/constraints.ts +7 -1
- package/src/components/design/canvas/document/frames.ts +3 -2
- package/src/components/design/canvas/document/layer-order.ts +4 -0
- package/src/components/design/canvas/document/reconcile.ts +1 -5
- package/src/components/design/canvas/document/style/color-utils.ts +2 -2
- package/src/components/design/canvas/document/style/theme-color.ts +15 -0
- package/src/components/design/canvas/document/types.ts +6 -2
- package/src/components/design/canvas/panels/__tests__/color-paint-picker.test.tsx +77 -2
- package/src/components/design/canvas/panels/__tests__/number-drag-input.test.tsx +25 -0
- package/src/components/design/canvas/panels/__tests__/rows.test.tsx +1 -1
- package/src/components/design/canvas/panels/__tests__/toolbar.test.tsx +1 -2
- package/src/components/design/canvas/panels/component-library-data.ts +9 -1
- package/src/components/design/canvas/panels/controls/color-paint-picker.tsx +29 -14
- package/src/components/design/canvas/panels/controls/gradient-editor.tsx +34 -32
- package/src/components/design/canvas/panels/controls/number-drag-input.tsx +38 -53
- package/src/components/design/canvas/panels/controls/pattern-params.tsx +13 -2
- package/src/components/design/canvas/panels/controls/pointer-drag.ts +64 -0
- package/src/components/design/canvas/panels/controls/shader-picker-utils.ts +1 -1
- package/src/components/design/canvas/panels/controls/shader-picker.tsx +27 -4
- package/src/components/design/canvas/panels/controls/use-pointer-drag.ts +84 -0
- package/src/components/design/canvas/panels/frame-property-panel.tsx +60 -44
- package/src/components/design/canvas/panels/layer-panel.tsx +3 -18
- package/src/components/design/canvas/panels/paint-lists-panel.tsx +15 -6
- package/src/components/design/canvas/panels/panel-data.ts +1 -3
- package/src/components/design/canvas/panels/property-panel.tsx +19 -11
- package/src/components/design/canvas/panels/toolbar.tsx +4 -4
- package/src/components/design/canvas/panels/transform-layout-panel.tsx +14 -7
- package/src/components/design/canvas/plugins/geo/shift-by-world.ts +32 -0
- package/src/components/design/canvas/plugins/leafer-x-align/__tests__/align.test.ts +43 -0
- package/src/components/design/canvas/plugins/leafer-x-align/index.ts +23 -35
- package/src/components/design/canvas/plugins/leafer-x-clipboard/index.ts +5 -20
- package/src/components/design/canvas/plugins/leafer-x-history-lite/index.ts +17 -0
- package/src/components/design/canvas/react/__tests__/workbench.test.tsx +0 -2
- package/src/components/design/canvas/react/workbench.tsx +4 -7
- package/src/components/design/canvas/registry/__tests__/registry.test.ts +34 -6
- package/src/components/design/canvas/registry/builtin/button.ts +4 -2
- package/src/components/design/canvas/registry/builtin/card.ts +4 -2
- package/src/components/design/canvas/registry/builtin/default-labels.ts +22 -0
- package/src/components/design/canvas/registry/builtin/input.ts +4 -2
- package/src/components/design/canvas/registry/builtin/rect-shapes.ts +4 -2
- package/src/components/design/canvas/registry/builtin/text.ts +4 -2
- package/src/components/design/canvas/tools/__tests__/tools.test.ts +3 -3
- package/src/components/design/canvas/tools/frame-tool.ts +7 -2
- package/src/components/design/canvas/tools/pen-tool.ts +1 -4
- package/src/components/design/canvas/tools/polyline-tools.ts +1 -4
- package/src/components/design/canvas/tools/shape-tools.ts +7 -1
- package/src/components/design/canvas/tools/text-tool.ts +5 -3
- package/src/components/design/editor/annotation/annotation-node/annotation-node-view.tsx +62 -27
- package/src/components/design/editor/annotation/overlay/annotation-overlay.tsx +7 -5
- package/src/components/design/editor/collaboration/agent-input.tsx +28 -42
- package/src/components/design/editor/collaboration/design-agent-panel.tsx +97 -32
- package/src/components/design/editor/collaboration/design-comment-review-panel.tsx +77 -17
- package/src/components/design/editor/dashboard/create-design-dialog.tsx +13 -4
- package/src/components/design/editor/dashboard/design-dashboard.tsx +10 -14
- package/src/components/design/editor/dashboard/schemas/create-design.ts +1 -1
- package/src/components/design/editor/layout/__tests__/collab-param-wiring.test.tsx +7 -3
- package/src/components/design/editor/layout/design-doc-panel.tsx +21 -8
- package/src/components/design/editor/layout/design-editor-doc-utils.ts +9 -6
- package/src/components/design/editor/layout/design-editor-layout.tsx +1 -1
- package/src/components/design/editor/layout/design-left-sidebar.tsx +17 -10
- package/src/components/design/editor/layout/design-navigation.tsx +8 -1
- package/src/components/design/editor/layout/design-outline-tab.tsx +7 -4
- package/src/components/design/editor/layout/design-right-sidebar.tsx +31 -15
- package/src/components/design/editor/layout/hooks/use-design-auto-save.ts +12 -1
- package/src/components/design/editor/layout/hooks/use-design-page-load.ts +31 -6
- package/src/components/design/editor/pages/design-detail-page.tsx +2 -2
- package/src/components/design/editor/pages/share-design-page.tsx +3 -3
- package/src/components/design/editor/pages-tree/design-tree-page-tab.tsx +82 -46
- package/src/components/design/editor/pages-tree/design-tree-reducer.ts +3 -4
- package/src/components/design/editor/share/design-share-client.tsx +34 -42
- package/src/components/design/editor/share/design-share-panel/components/single-version-share-card.tsx +13 -14
- package/src/components/design/editor/share/design-share-panel/index.tsx +45 -46
- package/src/components/design/editor/share/design-share-panel/types.ts +30 -0
- package/src/components/design/editor/share/design-share-panel/utils.ts +28 -0
- package/src/components/design/editor/share/share-annotation-overlay.tsx +17 -4
- package/src/components/design/editor/share/share-comment-panel.tsx +11 -4
- package/src/components/design/editor/share/share-comment-review-panel.tsx +4 -2
- package/src/components/design/editor/share/share-directory-tree.tsx +14 -8
- package/src/components/design/editor/share/share-doc-view.tsx +16 -5
- package/src/components/design/editor/share/share-layout.tsx +47 -21
- package/src/components/design/editor/share/share-nav-bar.tsx +1 -2
- package/src/components/design/editor/share/share-password-gate.tsx +11 -5
- package/src/components/design/editor/share/share-review-panel.tsx +22 -4
- package/src/components/design/editor/share/share-sse-listener.tsx +6 -3
- package/src/components/design/editor/share/share-theme-toggle.tsx +6 -5
- package/src/components/design/editor/share/share-types.ts +38 -0
- package/src/components/design/editor/share/version-share-client.tsx +6 -4
- package/src/components/design/editor/versions/components/create-version-dialog.tsx +12 -3
- package/src/components/design/editor/versions/components/page-tree-selector.tsx +26 -10
- package/src/components/design/editor/versions/components/page-version-timeline.tsx +13 -9
- package/src/components/design/editor/versions/constants.tsx +3 -2
- package/src/components/design/editor/versions/hooks/use-design-versions.ts +21 -18
- package/src/components/design/editor/versions/hooks/use-page-tree-selection.ts +25 -6
- package/src/components/design/editor/versions/hooks/use-page-version-history.ts +51 -15
- package/src/components/design/editor/versions/lib/restore-version.ts +10 -14
- package/src/components/design/editor/versions/lib/semver.ts +25 -0
- package/src/components/design/editor/versions/page-version-panel.tsx +66 -51
- package/src/components/design/editor/versions/page-version-tree.tsx +30 -17
- package/src/components/error/global-error-boundary.tsx +12 -7
- package/src/components/forms/app-array-field.tsx +3 -1
- package/src/components/forms/app-combobox.tsx +41 -36
- package/src/components/forms/app-date-picker.tsx +25 -17
- package/src/components/forms/app-field-error.tsx +4 -1
- package/src/components/forms/app-field.tsx +15 -2
- package/src/components/forms/app-form-dialog.tsx +15 -3
- package/src/components/forms/app-submit.tsx +7 -10
- package/src/components/forms/hooks/use-form-submit.ts +2 -0
- package/src/components/forms/schemas/common.ts +2 -4
- package/src/components/harness/ai-chat-history/components/conversation-header.tsx +1 -0
- package/src/components/harness/ai-chat-history/components/conversation-item.tsx +24 -4
- package/src/components/harness/ai-chat-history/components/empty-state.tsx +1 -0
- package/src/components/harness/ai-chat-history/index.tsx +17 -7
- package/src/components/harness/ai-chat-history/utils/group-conversations.ts +11 -2
- package/src/components/harness/ai-citations/components/citation-item.tsx +4 -4
- package/src/components/harness/ai-citations/components/citations-list.tsx +5 -2
- package/src/components/harness/ai-citations/components/source-components.tsx +45 -16
- package/src/components/harness/ai-message/components/markdown-content.tsx +0 -1
- package/src/components/harness/ai-message/utils/__tests__/dom-utils.test.ts +38 -0
- package/src/components/harness/ai-message/utils/dom-utils.ts +7 -1
- package/src/components/harness/ai-thinking.tsx +8 -34
- package/src/components/harness/chat-ui.tsx +2 -1
- package/src/components/harness/code/changeset-panel.tsx +13 -4
- package/src/components/harness/code/code-workspace-sidebar.tsx +4 -6
- package/src/components/harness/code/file-tree.tsx +8 -10
- package/src/components/harness/code/preview-panel.tsx +2 -1
- package/src/components/harness/code/terminal-panel.tsx +19 -12
- package/src/components/harness/code/workspace-picker.tsx +4 -6
- package/src/components/harness/composer/attachments/attachment-policy.ts +4 -7
- package/src/components/harness/composer/attachments/attachment-tray.tsx +8 -4
- package/src/components/harness/composer/attachments/use-attachments.ts +42 -13
- package/src/components/harness/composer/composer-editor.tsx +9 -5
- package/src/components/harness/composer/context-meter.tsx +21 -12
- package/src/components/harness/composer/harness-composer.tsx +28 -6
- package/src/components/harness/composer/mention/mention-suggestion-menu.tsx +4 -2
- package/src/components/harness/composer/mention/use-mention-sources.ts +5 -4
- package/src/components/harness/composer/use-composer-submit.ts +2 -1
- package/src/components/harness/composer/use-drafts.ts +22 -2
- package/src/components/harness/dock/dock-panel-container.tsx +27 -10
- package/src/components/harness/dock/dock-registry.ts +7 -1
- package/src/components/harness/dock/resource-preview.tsx +74 -144
- package/src/components/{tiptap/notion-like/setup-error-message/index.tsx → harness/flatten-content.ts} +28 -2
- package/src/components/harness/gallery/gallery-card.tsx +4 -0
- package/src/components/harness/gallery/gallery-grid.tsx +15 -3
- package/src/components/harness/gallery/retranscribe-dialog.tsx +9 -8
- package/src/components/harness/harness-chat-slots.ts +41 -5
- package/src/components/harness/harness-layout.tsx +11 -0
- package/src/components/harness/harness-message.tsx +25 -6
- package/src/components/harness/harness-workbench-page.tsx +39 -7
- package/src/components/harness/image-lightbox.tsx +9 -3
- package/src/components/harness/plugin-mention-menu.tsx +5 -21
- package/src/components/harness/plugin-panel.tsx +27 -21
- package/src/components/harness/queue-bar.tsx +1 -19
- package/src/components/harness/queue-item.tsx +1 -25
- package/src/components/harness/transcript-width-handle.tsx +4 -24
- package/src/components/harness/turn-navigator.tsx +7 -4
- package/src/components/harness/use-column-resize.ts +64 -0
- package/src/components/harness/workbench/use-track-columns.ts +12 -3
- package/src/components/harness/workbench/workbench-shell.tsx +25 -44
- package/src/components/hextaui/ai-citations.tsx +39 -16
- package/src/components/hextaui/ai-file-upload.tsx +43 -20
- package/src/components/hextaui/ai-message.tsx +32 -13
- package/src/components/hextaui/ai-thinking.tsx +10 -115
- package/src/components/hextaui/command-menu.tsx +9 -2
- package/src/components/hotkeys/shortcuts-panel.tsx +4 -3
- package/src/components/iteration/auto-schedule-dialog.tsx +14 -8
- package/src/components/iteration/burndown-chart.tsx +1 -1
- package/src/components/iteration/create-iteration-dialog.tsx +2 -2
- package/src/components/iteration/iteration-card.tsx +3 -1
- package/src/components/iteration/iteration-editor.tsx +24 -10
- package/src/components/kibo-ui/contribution-graph/index.tsx +20 -4
- package/src/components/knowledge/dialog/knowledge-form-dialog.tsx +3 -2
- package/src/components/knowledge/doc-properties.tsx +9 -2
- package/src/components/knowledge/doc-type-meta.ts +47 -0
- package/src/components/knowledge/editor/knowledge-doc-editor.tsx +30 -58
- package/src/components/knowledge/editor/use-auto-save-channels.ts +93 -0
- package/src/components/knowledge/knowledge-homepage.tsx +11 -3
- package/src/components/knowledge/knowledge-tree-item.tsx +16 -28
- package/src/components/knowledge/knowledge-tree.tsx +18 -22
- package/src/components/knowledge/public/bookmark-card.tsx +10 -2
- package/src/components/knowledge/public/industry-options.ts +36 -0
- package/src/components/knowledge/public/legal-detail-actions.tsx +286 -0
- package/src/components/layout/sidebar-03/nav-main.tsx +2 -2
- package/src/components/magicui/__tests__/word-rotate.test.tsx +28 -0
- package/src/components/magicui/primitives/animate/slot.tsx +17 -9
- package/src/components/magicui/primitives/animate/tooltip.tsx +10 -0
- package/src/components/magicui/sparkles-text.tsx +17 -2
- package/src/components/magicui/word-rotate.tsx +7 -1
- package/src/components/react-bits/light-rays.jsx +8 -1
- package/src/components/settings/personal-team/account/account-client.tsx +1 -1
- package/src/components/settings/personal-team/account/avatar/notion-avatar-editor.tsx +1 -1
- package/src/components/settings/personal-team/account/settings-profile.tsx +1 -1
- package/src/components/share/public-doc-share-page.tsx +122 -0
- package/src/components/shared-kit/list-kit/display/__tests__/dropdown.test.tsx +1 -1
- package/src/components/shared-kit/list-kit/display/dropdown.tsx +1 -1
- package/src/components/shared-kit/list-kit/kanban/manual-order.ts +1 -1
- package/src/components/{testcase/views → shared-kit/list-kit}/move.ts +3 -2
- package/src/components/shared-kit/timezone/timezone-bootstrap.tsx +0 -1
- package/src/components/story/detail/story-detail-toolbar/associated-attachments-panel.tsx +10 -10
- package/src/components/story/display/types.ts +2 -2
- package/src/components/story/filters/filter-check-popover.tsx +104 -0
- package/src/components/story/inline-editors/state-editor.tsx +19 -17
- package/src/components/story/inline-editors/story-select-dialog.tsx +113 -134
- package/src/components/story/peek-panel.tsx +20 -12
- package/src/components/story/relations/attachment-manage-dialog.tsx +31 -19
- package/src/components/story/relations/design-select-dialog.tsx +28 -40
- package/src/components/story/relations/file-preview.tsx +8 -6
- package/src/components/story/relations/format.ts +70 -14
- package/src/components/story/relations/knowledge-select-dialog.tsx +41 -39
- package/src/components/story/relations/link-manage-dialog.tsx +25 -6
- package/src/components/story/relations/story-ref-row.tsx +4 -5
- package/src/components/story/relations/use-linked-selection.ts +72 -0
- package/src/components/story/search-popover.tsx +20 -5
- package/src/components/story/story-list-view.tsx +69 -28
- package/src/components/story/story-panel-header.tsx +9 -3
- package/src/components/story/story-toolbar.tsx +30 -11
- package/src/components/story/transfer-story-popover.tsx +17 -10
- package/src/components/story/types.ts +4 -1
- package/src/components/story/views/calendar-view.tsx +96 -99
- package/src/components/story/views/create-view-dialog.tsx +10 -6
- package/src/components/story/views/story-list/__tests__/move.test.ts +1 -1
- package/src/components/story/views/story-list/batch-preview-dialog.tsx +77 -117
- package/src/components/story/views/story-list/group.tsx +27 -23
- package/src/components/story/views/story-list/index.tsx +84 -52
- package/src/components/story/views/story-list/inline-story-creator.tsx +10 -2
- package/src/components/story/views/story-list/row.tsx +1 -2
- package/src/components/story/views/story-list/use-flat-rows.ts +10 -12
- package/src/components/story/views/timeline-view.tsx +11 -15
- package/src/components/story/views/view-list-section.tsx +59 -37
- package/src/components/testcase/__tests__/manual-move.test.ts +1 -1
- package/src/components/testcase/__tests__/step-stream.test.tsx +30 -0
- package/src/components/testcase/list-view.tsx +1 -1
- package/src/components/testcase/runs/run-matrix.tsx +36 -8
- package/src/components/testcase/runs/step-stream.tsx +24 -8
- package/src/components/testcase/testcase-toolbar.tsx +6 -2
- package/src/components/testcase/views/board-view.tsx +25 -9
- package/src/components/testcase/views/create-view-dialog.tsx +3 -1
- package/src/components/testcase/views/view-selector-button.tsx +33 -19
- package/src/components/tiptap/__tests__/audit-fixes.test.ts +147 -0
- package/src/components/tiptap/extensions/ai-extension.ts +110 -25
- package/src/components/tiptap/extensions/ai-suggestion-mark.ts +6 -2
- package/src/components/tiptap/extensions/local-file/local-file-node.ts +19 -15
- package/src/components/tiptap/extensions/node-background-extension.ts +21 -3
- package/src/components/tiptap/lib/advanced-utils.ts +6 -8
- package/src/components/tiptap/lib/collab-utils.ts +27 -23
- package/src/components/tiptap/lib/doc-group.ts +62 -0
- package/src/components/tiptap/lib/utils/platform.ts +10 -9
- package/src/components/tiptap/lib/utils/selection.ts +3 -3
- package/src/components/tiptap/lib/utils/url.ts +25 -11
- package/src/components/tiptap/mindmap/lib/menu-actions.ts +14 -2
- package/src/components/tiptap/mindmap/mind-map.tsx +42 -10
- package/src/components/tiptap/node/doc-card-node-view.tsx +35 -15
- package/src/components/tiptap/node/image-node/image-node-extension.ts +27 -8
- package/src/components/tiptap/node/image-node/image-node-view.tsx +7 -2
- package/src/components/tiptap/node/image-upload-node/image-upload-node.tsx +25 -20
- package/src/components/tiptap/node/mention-extension.ts +3 -9
- package/src/components/tiptap/node/table-node/extensions/table-handle/table-handle-plugin.ts +61 -40
- package/src/components/tiptap/node/table-node/extensions/table-node-extension.ts +7 -6
- package/src/components/tiptap/node/table-node/lib/table-dom.ts +4 -0
- package/src/components/tiptap/node/table-node/ui/table-handle/table-handle.tsx +2 -2
- package/src/components/tiptap/node/table-node/ui/table-handle-menu/table-handle-menu.tsx +4 -3
- package/src/components/tiptap/node/table-node/ui/table-selection-overlay/table-selection-overlay.tsx +16 -1
- package/src/components/tiptap/node/table-node/ui/table-sort-row-column-button/use-table-sort-row-column.ts +3 -7
- package/src/components/tiptap/node/toc-node/toc-node.tsx +4 -2
- package/src/components/tiptap/notion-like/editor-extensions.ts +11 -2
- package/src/components/tiptap/notion-like/notion-like-editor-header.tsx +2 -10
- package/src/components/tiptap/notion-like/notion-like-editor-toolbar-floating.tsx +9 -23
- package/src/components/tiptap/notion-like/notion-like-editor.tsx +66 -63
- package/src/components/tiptap/ui/ai-menu/ai-menu-hooks.ts +12 -0
- package/src/components/tiptap/ui/ai-menu/ai-menu-items/ai-menu-items.tsx +51 -129
- package/src/components/tiptap/ui/ai-menu/ai-menu-utils.ts +1 -1
- package/src/components/tiptap/ui/ai-menu/ai-menu.tsx +50 -30
- package/src/components/tiptap/ui/copy-anchor-link-button/use-scroll-to-hash.ts +6 -3
- package/src/components/tiptap/ui/doc-reference-floating/doc-reference-floating.tsx +4 -11
- package/src/components/tiptap/ui/drag-context-menu/drag-context-menu.tsx +11 -12
- package/src/components/tiptap/ui/image-download-button/use-image-download.ts +2 -1
- package/src/components/tiptap/ui/improve-dropdown/use-improve-dropdown.ts +15 -23
- package/src/components/tiptap/ui/link-popover/link-popover.tsx +19 -23
- package/src/components/tiptap/ui/link-popover/use-link-popover.ts +12 -2
- package/src/components/tiptap/ui/slash-dropdown-menu/use-slash-dropdown-menu.ts +9 -0
- package/src/components/workspace/dialogs/create-workspace-dialog.tsx +20 -13
- package/src/components/workspace/dialogs/delete-workspace-options.tsx +0 -3
- package/src/components/workspace/dialogs/edit-workspace-dialog.tsx +20 -13
- package/src/components/workspace/header/workspace-header.tsx +1 -1
- package/src/components/workspace/kb/workspace-kb-card.tsx +12 -4
- package/src/components/workspace/kb/workspace-kb-manage-dialog.tsx +8 -1
- package/src/components/workspace/kb/workspace-quick-doc-dialog.tsx +24 -7
- package/src/components/workspace/members/workspace-member-item.tsx +8 -12
- package/src/components/workspace/members/workspace-members-manager.tsx +38 -25
- package/src/components/workspace/projects/workspace-project-list.tsx +47 -63
- package/src/components/workspace/schemas/create-workspace.ts +14 -5
- package/src/config/sidebar-routes.tsx +2 -10
- package/src/design-engine/ai/ai.ts +75 -5
- package/src/design-engine/ai/server-registry.ts +8 -0
- package/src/design-engine/document/serialize-leafer-json.ts +17 -7
- package/src/design-engine/document/serialize-sanitize.ts +21 -3
- package/src/design-engine/engine/__tests__/app-commands.test.ts +156 -0
- package/src/design-engine/engine/__tests__/path-anchors.test.ts +43 -0
- package/src/design-engine/engine/app.ts +1 -0
- package/src/design-engine/engine/boolean-ops.ts +28 -8
- package/src/design-engine/engine/engine-actions.ts +13 -3
- package/src/design-engine/engine/engine-decor.ts +42 -21
- package/src/design-engine/engine/engine-doc.ts +21 -5
- package/src/design-engine/engine/engine-path.ts +29 -25
- package/src/design-engine/engine/export-node.ts +26 -4
- package/src/design-engine/engine/path-anchors.ts +88 -25
- package/src/devframe-docks/session-iframe.tsx +4 -0
- package/src/hooks/__tests__/use-entity-subscription.test.ts +39 -1
- package/src/hooks/use-entity-subscription.ts +36 -5
- package/src/hooks/use-load-more.ts +16 -6
- package/src/hooks/use-notifications.ts +6 -3
- package/src/hooks/use-paged-groups.ts +3 -2
- package/src/hooks/use-popover-outside-close.ts +46 -0
- package/src/hooks/use-scrolling.ts +18 -10
- package/src/hooks/use-translator.ts +45 -28
- package/src/lib/__tests__/ai-adapter.test.ts +40 -39
- package/src/lib/__tests__/annotation-prompt.test.ts +6 -2
- package/src/lib/__tests__/datetime.test.ts +6 -0
- package/src/lib/__tests__/github.test.ts +87 -0
- package/src/lib/__tests__/login-redirect.test.ts +80 -0
- package/src/lib/__tests__/project-display-id.test.ts +5 -4
- package/src/lib/__tests__/safe-url.test.ts +84 -0
- package/src/lib/__tests__/sse-transport.test.ts +20 -2
- package/src/lib/agents/skill-errors.ts +12 -0
- package/src/lib/ai/__tests__/story-jsonl.test.ts +15 -3
- package/src/lib/ai/chat-handoff.ts +63 -45
- package/src/lib/ai/default-model.ts +9 -0
- package/src/lib/ai/story-jsonl.ts +39 -6
- package/src/lib/ai/use-knowledge-bases.ts +20 -13
- package/src/lib/ai/use-selected-model.ts +72 -22
- package/src/lib/anyhub/anyhub-message-bridge.ts +83 -30
- package/src/lib/anyhub/anyhub-store.ts +11 -6
- package/src/lib/{pgvector.ts → anyhub/base-dir.ts} +10 -4
- package/src/lib/anyhub/capabilities.ts +34 -15
- package/src/lib/anyhub/local-path.ts +1 -1
- package/src/lib/anyhub/permissions.ts +18 -6
- package/src/lib/anyhub/proxy.ts +26 -4
- package/src/lib/anyhub/types.ts +3 -6
- package/src/lib/app-version.ts +8 -1
- package/src/lib/auth/__tests__/auth-config-profile-cache.test.ts +32 -4
- package/src/lib/auth/auth.config.ts +219 -94
- package/src/lib/auth/sso-authorize.ts +12 -3
- package/src/lib/auth/submit-credentials.ts +60 -0
- package/src/lib/changelog/sdk-versions.ts +8 -6
- package/src/lib/collab/__tests__/presence-store.test.ts +9 -0
- package/src/lib/collab/bindings/__tests__/canvas-tree-perf.test.ts +6 -2
- package/src/lib/collab/bindings/canvas-local.ts +22 -25
- package/src/lib/collab/bindings/canvas-presence.ts +11 -26
- package/src/lib/collab/bindings/canvas-remote.ts +9 -18
- package/src/lib/collab/bindings/steps.ts +6 -2
- package/src/lib/collab/module-map.ts +2 -1
- package/src/lib/collab/provider.ts +9 -6
- package/src/lib/collab/throttle-core.ts +87 -0
- package/src/lib/collab/use-collab-doc.ts +5 -0
- package/src/lib/collab/use-presence-report.ts +11 -4
- package/src/lib/collab/use-self-profile-broadcast.ts +13 -0
- package/src/lib/collab/use-share-presence.ts +14 -14
- package/src/lib/collections/reference/users-brief-collection.ts +5 -2
- package/src/lib/commands/registry.ts +3 -1
- package/src/lib/comment-utils.ts +8 -6
- package/src/lib/crypto/api-key-cipher.ts +5 -0
- package/src/lib/datetime.ts +17 -7
- package/src/lib/deploy-region.ts +12 -3
- package/src/lib/design-tree-utils.ts +30 -0
- package/src/lib/form/standard-schema-validator.ts +44 -0
- package/src/lib/fsap.ts +16 -8
- package/src/lib/github.ts +33 -59
- package/src/lib/hooks/use-story-panel-open.ts +79 -14
- package/src/lib/hotkeys/registry.ts +35 -26
- package/src/lib/hotkeys/types.ts +4 -2
- package/src/{server/serverFns/iteration/__tests__/burndown-core.test.ts → lib/iteration/__tests__/burndown.test.ts} +1 -1
- package/src/{server/serverFns/iteration/burndown-core.ts → lib/iteration/burndown.ts} +5 -0
- package/src/lib/knowledge/share-result-message.ts +26 -0
- package/src/lib/layout.shared.tsx +14 -2
- package/src/lib/login-redirect.ts +65 -0
- package/src/lib/optimistic/use-optimistic-mutation.ts +14 -3
- package/src/lib/outline-utils.ts +7 -0
- package/src/lib/plugin-runtime/bridge.ts +53 -7
- package/src/lib/plugin-runtime/plugin-client-tools.ts +37 -14
- package/src/lib/plugin-runtime/plugin-client.ts +45 -28
- package/src/lib/plugin-runtime/worker-realm-source.ts +51 -15
- package/src/lib/project-display-id.ts +7 -3
- package/src/lib/project-module-meta.ts +34 -11
- package/src/lib/query-client-seam.test.ts +6 -4
- package/src/lib/query-client-seam.ts +8 -0
- package/src/lib/redis.ts +14 -2
- package/src/lib/restore-version.ts +3 -0
- package/src/lib/router-context.ts +3 -0
- package/src/lib/safe-url.ts +91 -0
- package/src/lib/sanitize.ts +35 -2
- package/src/lib/share-events.ts +18 -2
- package/src/lib/sse-transport.ts +14 -6
- package/src/lib/story/description-diff.ts +12 -11
- package/src/lib/story/video-embed.ts +7 -2
- package/src/lib/tiptap/__tests__/link-policy.test.ts +35 -0
- package/src/lib/tiptap/link-policy.ts +25 -0
- package/src/lib/vector-store/allowlist.ts +33 -0
- package/src/lib/vector-store/pg-vector-store.ts +13 -6
- package/src/lib/vector-store/sqlite-vec-store.ts +87 -42
- package/src/providers/index.tsx +16 -1
- package/src/providers/theme-mode-provider.tsx +3 -2
- package/src/routes/-tests/attachments-content.test.ts +125 -0
- package/src/routes/__desktop/onboarding/route.lazy.tsx +45 -15
- package/src/routes/__root.tsx +8 -6
- package/src/routes/_login/changelog/confirm/route.tsx +2 -1
- package/src/routes/_login/email-unsubscribe/route.tsx +2 -1
- package/src/routes/_login/forgot-password/route.lazy.tsx +4 -8
- package/src/routes/_login/login/route.lazy.tsx +17 -73
- package/src/routes/_login/login/route.tsx +4 -3
- package/src/routes/_login/register/route.lazy.tsx +5 -9
- package/src/routes/_login/reset-password/route.lazy.tsx +4 -8
- package/src/routes/_login/schemas/-auth.ts +21 -0
- package/src/routes/_login/verify-email/route.lazy.tsx +33 -3
- package/src/routes/_login/verify-email/route.tsx +2 -1
- package/src/routes/_nav/-components/nav-not-found.tsx +19 -13
- package/src/routes/_nav/apps/anyhub/$id/route.lazy.tsx +1 -0
- package/src/routes/_nav/apps/anyhub/route.tsx +5 -3
- package/src/routes/_nav/bugs/$bugId/route.lazy.tsx +4 -4
- package/src/routes/_nav/bugs/$bugId/route.tsx +1 -1
- package/src/routes/_nav/changelog/route.tsx +5 -4
- package/src/routes/_nav/dashboard/-components/avatar-group.tsx +9 -5
- package/src/routes/_nav/dashboard/route.lazy.tsx +6 -18
- package/src/routes/_nav/dashboard/route.tsx +3 -1
- package/src/routes/_nav/design/canvas/$id/route.tsx +2 -1
- package/src/routes/_nav/harness/$threadId.lazy.tsx +3 -0
- package/src/routes/_nav/knowledge/$kbId/doc/$docId/route.lazy.tsx +3 -0
- package/src/routes/_nav/knowledge/$kbId/index.tsx +4 -1
- package/src/routes/_nav/knowledge/$kbId/route.lazy.tsx +44 -41
- package/src/routes/_nav/knowledge/$kbId/route.tsx +6 -2
- package/src/routes/_nav/knowledge/bookmarks/$id.lazy.tsx +15 -2
- package/src/routes/_nav/knowledge/bookmarks/index.lazy.tsx +9 -4
- package/src/routes/_nav/knowledge/compliance/$id.lazy.tsx +59 -148
- package/src/routes/_nav/knowledge/compliance/index.lazy.tsx +15 -21
- package/src/routes/_nav/knowledge/dictionaries/$id.lazy.tsx +45 -13
- package/src/routes/_nav/knowledge/dictionaries/index.lazy.tsx +6 -17
- package/src/routes/_nav/knowledge/index.lazy.tsx +14 -7
- package/src/routes/_nav/knowledge/laws/$id.lazy.tsx +59 -149
- package/src/routes/_nav/knowledge/laws/index.lazy.tsx +14 -6
- package/src/routes/_nav/knowledge/summary/index.lazy.tsx +23 -13
- package/src/routes/_nav/notifications/route.tsx +2 -1
- package/src/routes/_nav/notion-like/route.tsx +1 -1
- package/src/routes/_nav/pricing-02/route.tsx +1 -1
- package/src/routes/_nav/projects/$projectId/$storyId/route.lazy.tsx +2 -1
- package/src/routes/_nav/projects/$projectId/index.lazy.tsx +1 -1
- package/src/routes/_nav/projects/$projectId/iterations/$iterationId/route.lazy.tsx +55 -30
- package/src/routes/_nav/projects/$projectId/iterations/$iterationId/route.tsx +5 -2
- package/src/routes/_nav/projects/$projectId/settings/route.lazy.tsx +17 -9
- package/src/routes/_nav/route.lazy.tsx +2 -0
- package/src/routes/_nav/settings/-settings-tabs.tsx +7 -3
- package/src/routes/_nav/settings/account/route.lazy.tsx +11 -2
- package/src/routes/_nav/settings/account/route.tsx +17 -10
- package/src/routes/_nav/settings/ai/hosted/route.lazy.tsx +10 -3
- package/src/routes/_nav/settings/ai/hosted/route.tsx +3 -3
- package/src/routes/_nav/settings/ai/index/route.lazy.tsx +2 -1
- package/src/routes/_nav/settings/ai/providers/$providerId/route.lazy.tsx +5 -5
- package/src/routes/_nav/settings/ai/providers/$providerId/route.tsx +5 -2
- package/src/routes/_nav/settings/ai/route.tsx +7 -5
- package/src/routes/_nav/settings/billing/route.lazy.tsx +16 -3
- package/src/routes/_nav/settings/billing/route.tsx +6 -3
- package/src/routes/_nav/settings/privacy/route.lazy.tsx +6 -4
- package/src/routes/_nav/settings/route.tsx +0 -5
- package/src/routes/_nav/settings/team/route.lazy.tsx +11 -2
- package/src/routes/_nav/settings/team/route.tsx +13 -7
- package/src/routes/_nav/stories/$storyId/route.lazy.tsx +2 -1
- package/src/routes/_nav/stories/$storyId/route.tsx +5 -1
- package/src/routes/_nav/tasks/-components/ai-task-detail.tsx +2 -8
- package/src/routes/_nav/tasks/-components/ai-task-list.tsx +3 -9
- package/src/routes/_nav/tasks/-components/source-ai-exec-dialog.tsx +2 -8
- package/src/routes/_nav/tasks/-components/task-constants.ts +15 -0
- package/src/routes/_nav/test-cases/runs/$runId/route.lazy.tsx +2 -1
- package/src/routes/_nav/workspaces/$workspaceId/activities/route.lazy.tsx +3 -17
- package/src/routes/_nav/workspaces/$workspaceId/route.lazy.tsx +17 -44
- package/src/routes/_nav/workspaces/$workspaceId/route.tsx +0 -1
- package/src/routes/_nav/workspaces/$workspaceId/settings/route.lazy.tsx +7 -17
- package/src/routes/_nav/workspaces/index.lazy.tsx +16 -16
- package/src/routes/_public/pricing/route.tsx +5 -3
- package/src/routes/api/attachments/$id/content.ts +55 -11
- package/src/routes/api/attachments/upload.ts +72 -38
- package/src/routes/api/auth/desktop-callback.ts +46 -10
- package/src/routes/api/billing-webhook.ts +8 -4
- package/src/routes/api/blob/$id.ts +6 -1
- package/src/routes/api/cron/changelog-release.ts +6 -2
- package/src/routes/api/cron/subscription-reminders.ts +21 -14
- package/src/routes/api/design/prototype/route.ts +7 -4
- package/src/routes/api/license/activate/route.ts +24 -1
- package/src/routes/api/license/heartbeat/route.ts +14 -1
- package/src/routes/api/notifications/stream.ts +22 -15
- package/src/routes/api/share/design/$designId/events.ts +13 -0
- package/src/routes/api/story-ai.ts +11 -0
- package/src/routes/api/test-runs/$runId/events.ts +11 -7
- package/src/routes/design-files/$projectId/$artboardId/$filename.ts +22 -3
- package/src/routes/invite/$token/route.lazy.tsx +8 -7
- package/src/routes/server/ai-stream.ts +6 -0
- package/src/routes/server/ws.ts +11 -2
- package/src/routes/share/$versionId/route.lazy.tsx +3 -7
- package/src/routes/share/compliance/$id/route.lazy.tsx +13 -64
- package/src/routes/share/compliance/$id/route.tsx +6 -1
- package/src/routes/share/law/$id/route.lazy.tsx +13 -64
- package/src/routes/share/law/$id/route.tsx +6 -1
- package/src/server/__tests__/agent-crud.test.ts +8 -0
- package/src/server/__tests__/chat-conversations.test.ts +1 -0
- package/src/server/__tests__/fetch-guard.test.ts +67 -0
- package/src/{lib → server}/__tests__/rag.test.ts +1 -1
- package/src/server/__tests__/resources.license.test.ts +3 -2
- package/src/server/__tests__/resources.test.ts +29 -4
- package/src/server/__tests__/share-version.test.ts +64 -12
- package/src/server/__tests__/skill-crud.test.ts +9 -2
- package/src/server/__tests__/sso-domain.test.ts +1 -1
- package/src/server/__tests__/sso-tokens.test.ts +23 -3
- package/src/server/ai-gateway/__tests__/agent-runtime.test.ts +14 -11
- package/src/server/ai-gateway/__tests__/chat-handler-prompt-key.test.ts +1 -1
- package/src/server/ai-gateway/__tests__/chat-stream-builder-code-mode.test.ts +1 -1
- package/src/server/ai-gateway/__tests__/chat-stream-builder-memory.test.ts +1 -1
- package/src/server/ai-gateway/__tests__/chat-stream-builder-sandbox.test.ts +30 -6
- package/src/server/ai-gateway/__tests__/chat-stream-builder-skills.test.ts +1 -1
- package/src/server/ai-gateway/__tests__/code-mode-stack.test.ts +59 -8
- package/src/server/ai-gateway/__tests__/consume-attachments.test.ts +1 -1
- package/src/server/ai-gateway/__tests__/create-pr.test.ts +169 -0
- package/src/server/ai-gateway/__tests__/delegate-task.test.ts +121 -0
- package/src/server/ai-gateway/__tests__/embedding-request.test.ts +17 -1
- package/src/server/ai-gateway/__tests__/embedding.test.ts +23 -0
- package/src/server/ai-gateway/__tests__/interrupt-store.test.ts +98 -85
- package/src/server/ai-gateway/__tests__/knowledge-search-fence.test.ts +2 -2
- package/src/server/ai-gateway/__tests__/message-store.test.ts +53 -0
- package/src/server/ai-gateway/__tests__/pgvector-memory-adapter.test.ts +40 -39
- package/src/server/ai-gateway/__tests__/prompt-vars-contract.test.ts +1 -1
- package/src/server/ai-gateway/__tests__/provider-adapter.test.ts +56 -0
- package/src/server/ai-gateway/__tests__/run-store.test.ts +51 -15
- package/src/server/ai-gateway/__tests__/skills-resource-tool.test.ts +56 -0
- package/src/server/ai-gateway/__tests__/todo-plan-tools.test.ts +17 -4
- package/src/server/ai-gateway/__tests__/tool-error-sanitize.test.ts +119 -0
- package/src/server/ai-gateway/__tests__/tools-authorization.test.ts +211 -0
- package/src/server/ai-gateway/adapter.ts +35 -9
- package/src/server/ai-gateway/chat-handler.ts +81 -46
- package/src/server/ai-gateway/chat-stream-builder.ts +37 -4
- package/src/server/ai-gateway/code-mode/index.ts +11 -7
- package/src/server/ai-gateway/code-mode/sandbox.ts +59 -17
- package/src/server/ai-gateway/code-mode/vm-driver.ts +15 -16
- package/src/server/ai-gateway/durability/pg-stream.ts +10 -9
- package/src/server/ai-gateway/durability/reaper-driver.ts +3 -0
- package/src/server/ai-gateway/embedding.ts +22 -2
- package/src/server/ai-gateway/label-suggest.ts +14 -3
- package/src/server/ai-gateway/log-redact.ts +61 -0
- package/src/server/ai-gateway/media/adapters.ts +19 -0
- package/src/server/ai-gateway/media/index.ts +19 -0
- package/src/server/ai-gateway/media/recorder.ts +3 -1
- package/src/server/ai-gateway/memory/pgvector-adapter.ts +12 -24
- package/src/server/ai-gateway/middlewares/logger.ts +4 -1
- package/src/server/ai-gateway/middlewares/plan-approval.ts +33 -14
- package/src/server/ai-gateway/middlewares/rate-limit.ts +15 -0
- package/src/server/ai-gateway/middlewares/usage-log.ts +17 -1
- package/src/server/ai-gateway/model-fetch.ts +3 -0
- package/src/server/ai-gateway/persistence/interrupt-store.ts +42 -32
- package/src/server/ai-gateway/persistence/message-store.ts +30 -10
- package/src/server/ai-gateway/persistence/metadata-store.ts +13 -2
- package/src/server/ai-gateway/persistence/run-store.ts +25 -3
- package/src/server/ai-gateway/prompts/index.ts +1 -1
- package/src/server/ai-gateway/prompts/registry.ts +24 -2
- package/src/server/ai-gateway/prompts/seed.ts +22 -12
- package/src/server/ai-gateway/provider-router.ts +32 -32
- package/src/server/ai-gateway/rerank.ts +20 -1
- package/src/server/ai-gateway/runs/agent-runtime.ts +17 -50
- package/src/server/ai-gateway/runs/resolve-overrides.ts +10 -26
- package/src/server/ai-gateway/runs/user-agent.ts +75 -0
- package/src/server/ai-gateway/sandbox/__tests__/harness-sandbox.test.ts +136 -0
- package/src/server/ai-gateway/sandbox/__tests__/local-process.test.ts +144 -1
- package/src/server/ai-gateway/sandbox/__tests__/policy.test.ts +47 -0
- package/src/server/ai-gateway/sandbox/browser-policy.ts +45 -9
- package/src/server/ai-gateway/sandbox/harness-sandbox.ts +76 -10
- package/src/server/ai-gateway/sandbox/local-process.ts +212 -21
- package/src/server/ai-gateway/sandbox/policy.ts +39 -7
- package/src/server/ai-gateway/skills/builtin-source.ts +10 -0
- package/src/server/ai-gateway/skills/index.ts +6 -4
- package/src/server/ai-gateway/source-mode.ts +8 -2
- package/src/server/ai-gateway/storage/__tests__/blob-store.test.ts +17 -0
- package/src/server/ai-gateway/storage/db-blob-store.ts +16 -1
- package/src/server/ai-gateway/story-handler.ts +2 -1
- package/src/server/ai-gateway/story-prompt.ts +3 -1
- package/src/server/ai-gateway/tools/create-pr.ts +92 -55
- package/src/server/ai-gateway/tools/definitions.ts +2 -2
- package/src/server/ai-gateway/tools/delegate-task.ts +38 -18
- package/src/server/ai-gateway/tools/delete-project.ts +7 -1
- package/src/server/ai-gateway/tools/plan-submit.ts +12 -8
- package/src/server/ai-gateway/tools/plugin-lifecycle-server.ts +24 -3
- package/src/server/ai-gateway/tools/plugin-tools.ts +15 -4
- package/src/server/ai-gateway/tools/select.ts +8 -4
- package/src/server/ai-gateway/tools/server.ts +91 -19
- package/src/server/ai-gateway/tools/todo-write.ts +4 -3
- package/src/server/ai-gateway/tools/tool-errors.ts +38 -0
- package/src/server/ai-gateway/unified-router.ts +64 -54
- package/src/server/ai-ports.ts +22 -3
- package/src/server/ai-task/executor.ts +49 -27
- package/src/server/audit.ts +5 -2
- package/src/server/auth-helpers.ts +37 -4
- package/src/server/billing-email.ts +9 -1
- package/src/server/bug/bug-permissions.ts +15 -8
- package/src/server/bug-collect/collect-handler.ts +65 -51
- package/src/server/bug-report/report-handler.ts +131 -125
- package/src/server/bug-report/repro-runner.ts +5 -15
- package/src/server/bug-report/webhook-out.ts +13 -1
- package/src/server/bug-screenshot/screenshot-handler.ts +7 -3
- package/src/server/builtin-project.ts +43 -18
- package/src/server/collab/reindex-endpoint.ts +20 -0
- package/src/server/collab/seed.ts +20 -4
- package/src/server/collab/write-guard.ts +5 -0
- package/src/server/csv.ts +6 -3
- package/src/server/design/__tests__/share-access.test.ts +128 -0
- package/src/server/design/access.ts +136 -0
- package/src/server/design/annotation-prompt.ts +7 -1
- package/src/server/design/share-access.ts +109 -0
- package/src/server/design/share-generate.ts +42 -0
- package/src/server/desktop-guest.ts +3 -2
- package/src/server/email/deliverability.ts +9 -1
- package/src/server/email/drivers/resend.ts +8 -1
- package/src/server/email/drivers/smtp.ts +32 -18
- package/src/server/email/templates/product/changelog-release.tsx +1 -1
- package/src/server/email/templates/team/invite.tsx +1 -1
- package/src/server/entitlements-token.ts +8 -1
- package/src/server/entitlements.ts +7 -2
- package/src/server/fetch-guard.ts +67 -0
- package/src/server/iteration/auto-schedule-internal.ts +19 -8
- package/src/server/iteration/permissions.ts +40 -0
- package/src/server/iteration/transfer-internal.ts +19 -12
- package/src/server/keepalive/middleware.ts +12 -2
- package/src/server/knowledge/kb-doc-search.ts +20 -3
- package/src/server/knowledge/knowledge-index-utils.ts +21 -8
- package/src/server/knowledge/public/favicon.ts +24 -6
- package/src/server/knowledge/public/github-sync.ts +24 -4
- package/src/server/knowledge/public/share-merge.ts +51 -18
- package/src/server/lib/api-key-cipher.ts +2 -1
- package/src/server/lib/bug-sequence.ts +67 -0
- package/src/server/lib/cron-auth.ts +7 -3
- package/src/server/lib/display-options-schema.ts +52 -0
- package/src/server/lib/fixed-window-rate-limit.ts +105 -0
- package/src/server/lib/image-magic.ts +44 -0
- package/src/{components/design/editor/pages/design-layout.tsx → server/lib/prisma-json.ts} +12 -9
- package/src/server/lib/project-membership.ts +60 -0
- package/src/server/lib/rate-limit.ts +38 -5
- package/src/{lib/annotation-template.ts → server/lib/sse-chunk.ts} +10 -12
- package/src/server/lib/text-truncate.ts +51 -0
- package/src/{config/sidebar-teams.ts → server/lib/user-brief.ts} +11 -14
- package/src/server/lib/validate-assignee.ts +19 -0
- package/src/server/lib/validators.ts +16 -0
- package/src/server/lib/webhook-secret.ts +45 -0
- package/src/server/mcp/__tests__/json-rpc.test.ts +57 -5
- package/src/server/mcp/__tests__/tools.test.ts +12 -3
- package/src/server/mcp/json-rpc.ts +12 -0
- package/src/server/mcp/protocol.ts +50 -3
- package/src/server/mcp/tool-schemas.ts +8 -2
- package/src/server/mcp/tools.ts +28 -18
- package/src/server/middlewares/audit-recorder.ts +11 -3
- package/src/server/middlewares/audit.ts +33 -12
- package/src/server/middlewares/auth-rate-limit.ts +25 -39
- package/src/server/middlewares/rate-limit.ts +42 -15
- package/src/server/middlewares/security-headers.ts +14 -16
- package/src/server/notifications/__tests__/notification-service.test.ts +4 -0
- package/src/server/notifications/notification-service.ts +144 -59
- package/src/server/notifications/verify-reminder.ts +2 -0
- package/src/server/permissions.ts +17 -1
- package/src/{lib → server}/rag.ts +3 -1
- package/src/server/references/access.ts +117 -0
- package/src/server/references/engine.ts +46 -27
- package/src/server/remote-auth.ts +17 -3
- package/src/server/resources.ts +55 -43
- package/src/server/serverFns/__tests__/auth-server-schemas.test.ts +51 -9
- package/src/server/serverFns/__tests__/collab.test.ts +21 -0
- package/src/server/serverFns/__tests__/compliance.test.ts +31 -2
- package/src/server/serverFns/__tests__/knowledge-index.test.ts +1 -0
- package/src/server/serverFns/__tests__/knowledge-kb-projects.test.ts +141 -0
- package/src/server/serverFns/__tests__/knowledge-public-compliance.test.ts +163 -0
- package/src/server/serverFns/__tests__/knowledge-readable-kb.test.ts +194 -0
- package/src/server/serverFns/__tests__/legal-public.test.ts +91 -0
- package/src/server/serverFns/__tests__/notifications-list.test.ts +130 -0
- package/src/server/serverFns/__tests__/ownership-merge.test.ts +12 -4
- package/src/server/serverFns/__tests__/project-delete-transaction.test.ts +128 -0
- package/src/server/serverFns/__tests__/project-kb.test.ts +18 -0
- package/src/server/serverFns/__tests__/read-path-permissions.test.ts +107 -0
- package/src/server/serverFns/__tests__/read-write-merge.test.ts +29 -1
- package/src/server/serverFns/__tests__/references-access.test.ts +117 -0
- package/src/server/serverFns/__tests__/story-crud-labels-users.test.ts +18 -4
- package/src/server/serverFns/__tests__/story-links.test.ts +7 -5
- package/src/server/serverFns/__tests__/story-tree.test.ts +57 -121
- package/src/server/serverFns/__tests__/story-types.test.ts +4 -48
- package/src/server/serverFns/__tests__/update-page-guard.test.ts +2 -0
- package/src/server/serverFns/__tests__/workspace-kb.test.ts +63 -3
- package/src/server/serverFns/__tests__/workspace.test.ts +2 -1
- package/src/server/serverFns/activity.ts +26 -9
- package/src/server/serverFns/agents/agent-crud.ts +61 -61
- package/src/server/serverFns/agents/bindings.ts +21 -22
- package/src/server/serverFns/agents/skill-crud.ts +48 -45
- package/src/server/serverFns/ai/code-mode-readiness.ts +8 -2
- package/src/server/serverFns/ai/search-capability.ts +8 -2
- package/src/server/serverFns/analytics.ts +7 -3
- package/src/server/serverFns/anyhub/app.ts +31 -14
- package/src/server/serverFns/anyhub/index.ts +48 -32
- package/src/server/serverFns/anyhub/install.ts +21 -7
- package/src/server/serverFns/anyhub/permissions.ts +25 -4
- package/src/server/serverFns/anyhub/proxy.ts +1 -1
- package/src/server/serverFns/auth/email-verification.ts +8 -1
- package/src/server/serverFns/auth/forgot-password.ts +7 -2
- package/src/server/serverFns/auth/providers.ts +2 -0
- package/src/server/serverFns/auth/register.ts +1 -1
- package/src/server/serverFns/auth/registration-mode.ts +2 -0
- package/src/server/serverFns/auth/reset-password.ts +28 -17
- package/src/server/serverFns/auth/session.ts +30 -14
- package/src/server/serverFns/auth/setup.ts +2 -0
- package/src/server/serverFns/billing.ts +20 -14
- package/src/server/serverFns/blob-upload.ts +12 -1
- package/src/server/serverFns/bug/__tests__/bug-access-tokens.test.ts +1 -0
- package/src/server/serverFns/bug/__tests__/bug-activities.test.ts +30 -3
- package/src/server/serverFns/bug/__tests__/bug-collect.test.ts +47 -12
- package/src/server/serverFns/bug/__tests__/bug-comments.test.ts +47 -16
- package/src/server/serverFns/bug/__tests__/bug-groups.test.ts +2 -2
- package/src/server/serverFns/bug/__tests__/bug-list-query.test.ts +10 -0
- package/src/server/serverFns/bug/__tests__/bug-reactions.test.ts +21 -11
- package/src/server/serverFns/bug/__tests__/bug-webhooks.test.ts +13 -10
- package/src/server/serverFns/bug/bug-access-tokens.ts +13 -5
- package/src/server/serverFns/bug/bug-activities.ts +36 -5
- package/src/server/serverFns/bug/bug-collect-tokens.ts +4 -4
- package/src/server/serverFns/bug/bug-collect.ts +4 -2
- package/src/server/serverFns/bug/bug-comments.ts +55 -32
- package/src/server/serverFns/bug/bug-crud/detail.ts +3 -3
- package/src/server/serverFns/bug/bug-crud.ts +31 -29
- package/src/server/serverFns/bug/bug-display-options.ts +7 -11
- package/src/server/serverFns/bug/bug-export.ts +10 -1
- package/src/server/serverFns/bug/bug-fix.ts +3 -3
- package/src/server/serverFns/bug/bug-group-query.ts +1 -1
- package/src/server/serverFns/bug/bug-groups.ts +4 -4
- package/src/server/serverFns/bug/bug-list-query.ts +7 -3
- package/src/server/serverFns/bug/bug-reactions.ts +19 -6
- package/src/server/serverFns/bug/bug-reorder.ts +2 -5
- package/src/server/serverFns/bug/bug-repro.ts +2 -2
- package/src/server/serverFns/bug/bug-story-bulk.ts +7 -16
- package/src/server/serverFns/bug/bug-story.ts +3 -3
- package/src/server/serverFns/bug/bug-views.ts +27 -18
- package/src/server/serverFns/bug/bug-webhooks.ts +8 -5
- package/src/server/serverFns/bug/test-bug-confirm.ts +2 -2
- package/src/server/serverFns/changelog/__tests__/fetch.test.ts +80 -0
- package/src/server/serverFns/changelog/__tests__/subscribe.test.ts +4 -2
- package/src/server/serverFns/changelog/fetch.ts +12 -1
- package/src/server/serverFns/changelog/subscribe.ts +17 -3
- package/src/server/serverFns/chat/conversations.ts +11 -5
- package/src/server/serverFns/collab-presence.ts +1 -1
- package/src/server/serverFns/collab-snapshot.ts +1 -1
- package/src/server/serverFns/collab.ts +5 -0
- package/src/server/serverFns/compliance.ts +11 -8
- package/src/server/serverFns/design/__tests__/comments.test.ts +222 -0
- package/src/server/serverFns/design/__tests__/designs.test.ts +3 -1
- package/src/server/serverFns/design/__tests__/page-versions.test.ts +177 -0
- package/src/server/serverFns/design/__tests__/shares-password.test.ts +12 -6
- package/src/server/serverFns/design/ai/__tests__/agent-conversations.test.ts +131 -0
- package/src/server/serverFns/design/ai/__tests__/providers.test.ts +187 -0
- package/src/server/serverFns/design/ai/agent-conversations.ts +27 -7
- package/src/server/serverFns/design/ai/fill-annotation.ts +27 -17
- package/src/server/serverFns/design/ai/generate-prototype.ts +8 -3
- package/src/server/serverFns/design/ai/providers.ts +74 -36
- package/src/server/serverFns/design/comments.ts +51 -12
- package/src/server/serverFns/design/designs.ts +9 -7
- package/src/server/serverFns/design/detail.ts +12 -11
- package/src/server/serverFns/design/page-versions.ts +39 -23
- package/src/server/serverFns/design/pages.ts +15 -37
- package/src/server/serverFns/design/reviews.ts +17 -7
- package/src/server/serverFns/design/share/__tests__/share-metadata.test.ts +105 -0
- package/src/server/serverFns/design/share/__tests__/share-versions.test.ts +148 -0
- package/src/server/serverFns/design/share/__tests__/verify-password.test.ts +14 -3
- package/src/server/serverFns/design/share/verify-password.ts +4 -0
- package/src/server/serverFns/design/share/versions.ts +14 -30
- package/src/server/serverFns/design/share.ts +50 -5
- package/src/server/serverFns/design/shares-password.ts +28 -18
- package/src/server/serverFns/design/shares.ts +38 -39
- package/src/server/serverFns/design/versions.ts +14 -56
- package/src/server/serverFns/harness/__tests__/attach-to-kb.spec.ts +9 -9
- package/src/server/serverFns/harness/__tests__/attach-to-story.spec.ts +2 -1
- package/src/server/serverFns/harness/__tests__/extract-attachment.spec.ts +40 -0
- package/src/server/serverFns/harness/__tests__/github-workspace.spec.ts +107 -0
- package/src/server/serverFns/harness/attach-prototype.ts +5 -5
- package/src/server/serverFns/harness/attach-to-kb.ts +6 -9
- package/src/server/serverFns/harness/attach-to-story.ts +3 -3
- package/src/server/serverFns/harness/extract-attachment.ts +9 -1
- package/src/server/serverFns/harness/gallery.ts +2 -0
- package/src/server/serverFns/harness/github-workspace.ts +18 -11
- package/src/server/serverFns/harness/media.ts +7 -3
- package/src/server/serverFns/harness/sandbox-policy.ts +1 -2
- package/src/server/serverFns/harness/search-mention-candidates.ts +1 -1
- package/src/server/serverFns/iteration/__tests__/iteration-crud.test.ts +30 -1
- package/src/server/serverFns/iteration/__tests__/iteration-stories.test.ts +51 -4
- package/src/server/serverFns/iteration/__tests__/iteration-transfer.test.ts +9 -0
- package/src/server/serverFns/iteration/iteration-auto-schedule.ts +4 -13
- package/src/server/serverFns/iteration/iteration-burndown.ts +7 -3
- package/src/server/serverFns/iteration/iteration-crud.ts +16 -24
- package/src/server/serverFns/iteration/iteration-stories.ts +57 -54
- package/src/server/serverFns/iteration/iteration-transfer.ts +1 -1
- package/src/server/serverFns/knowledge/public/bookmarks/categories.ts +18 -14
- package/src/server/serverFns/knowledge/public/bookmarks/create.ts +35 -5
- package/src/server/serverFns/knowledge/public/bookmarks/delete.ts +2 -2
- package/src/server/serverFns/knowledge/public/bookmarks/detail.ts +1 -1
- package/src/server/serverFns/knowledge/public/bookmarks/favorite.ts +13 -3
- package/src/server/serverFns/knowledge/public/bookmarks/list.ts +5 -2
- package/src/server/serverFns/knowledge/public/bookmarks/refresh-favicon.ts +10 -4
- package/src/server/serverFns/knowledge/public/bookmarks/share.ts +4 -7
- package/src/server/serverFns/knowledge/public/bookmarks/sync-github.ts +12 -1
- package/src/server/serverFns/knowledge/public/bookmarks/unshare.ts +1 -1
- package/src/server/serverFns/knowledge/public/bookmarks/update.ts +52 -29
- package/src/server/serverFns/knowledge/public/compliance/create.ts +3 -2
- package/src/server/serverFns/knowledge/public/compliance/delete.ts +2 -2
- package/src/server/serverFns/knowledge/public/compliance/detail.ts +1 -1
- package/src/server/serverFns/knowledge/public/compliance/list.ts +6 -3
- package/src/server/serverFns/knowledge/public/compliance/public.ts +9 -5
- package/src/server/serverFns/knowledge/public/compliance/share.ts +4 -7
- package/src/server/serverFns/knowledge/public/compliance/unshare.ts +14 -1
- package/src/server/serverFns/knowledge/public/compliance/update.ts +10 -5
- package/src/server/serverFns/knowledge/public/dictionary/create.ts +5 -3
- package/src/server/serverFns/knowledge/public/dictionary/delete.ts +2 -2
- package/src/server/serverFns/knowledge/public/dictionary/detail.ts +1 -1
- package/src/server/serverFns/knowledge/public/dictionary/list.ts +3 -2
- package/src/server/serverFns/knowledge/public/dictionary/share.ts +4 -7
- package/src/server/serverFns/knowledge/public/dictionary/unshare.ts +1 -1
- package/src/server/serverFns/knowledge/public/dictionary/update.ts +4 -3
- package/src/server/serverFns/knowledge/public/entity-tags.ts +19 -13
- package/src/server/serverFns/knowledge/public/favorite.ts +17 -2
- package/src/server/serverFns/knowledge/public/legal/create.ts +3 -2
- package/src/server/serverFns/knowledge/public/legal/delete.ts +2 -2
- package/src/server/serverFns/knowledge/public/legal/detail.ts +1 -1
- package/src/server/serverFns/knowledge/public/legal/list.ts +6 -3
- package/src/server/serverFns/knowledge/public/legal/public.ts +12 -5
- package/src/server/serverFns/knowledge/public/legal/share.ts +4 -7
- package/src/server/serverFns/knowledge/public/legal/unshare.ts +1 -1
- package/src/server/serverFns/knowledge/public/legal/update.ts +10 -3
- package/src/server/serverFns/knowledge-index.ts +34 -9
- package/src/server/serverFns/knowledge.ts +143 -166
- package/src/server/serverFns/notifications.ts +30 -22
- package/src/server/serverFns/plugins/harness-plugins.ts +31 -26
- package/src/server/serverFns/plugins/plugin-precheck.ts +40 -23
- package/src/server/serverFns/project/module-overview.ts +7 -3
- package/src/server/serverFns/project.ts +48 -39
- package/src/server/serverFns/references/create.ts +17 -4
- package/src/server/serverFns/references/resolve.ts +10 -2
- package/src/server/serverFns/references/search.ts +9 -2
- package/src/server/serverFns/settings/account-team.ts +1 -1
- package/src/server/serverFns/share/design/[designId]/events.ts +6 -1
- package/src/server/serverFns/share/version.ts +44 -16
- package/src/server/serverFns/sso.ts +16 -0
- package/src/server/serverFns/story/__tests__/story-assoc.test.ts +17 -2
- package/src/server/serverFns/story/__tests__/story-dependencies.test.ts +8 -0
- package/src/server/serverFns/story/__tests__/story-read-path-authz.test.ts +141 -0
- package/src/server/serverFns/story/index.ts +1 -3
- package/src/server/serverFns/story/kb-scope.ts +9 -0
- package/src/server/serverFns/story/link-preview.ts +2 -1
- package/src/server/serverFns/story/story-assoc.ts +10 -30
- package/src/server/serverFns/story/story-attachments.ts +6 -13
- package/src/server/serverFns/story/story-children.ts +4 -1
- package/src/server/serverFns/story/story-comments.ts +7 -27
- package/src/server/serverFns/story/story-crud/activities.ts +3 -1
- package/src/server/serverFns/story/story-crud/archive.ts +4 -25
- package/src/server/serverFns/story/story-crud/bulk.ts +3 -3
- package/src/server/serverFns/story/story-crud/detail.ts +7 -2
- package/src/server/serverFns/story/story-crud/labels.ts +1 -58
- package/src/server/serverFns/story/story-crud/user-brief.ts +69 -0
- package/src/server/serverFns/story/story-crud.ts +9 -27
- package/src/server/serverFns/story/story-dependencies.ts +7 -28
- package/src/server/serverFns/story/story-groups.ts +5 -5
- package/src/server/serverFns/story/story-links.ts +9 -28
- package/src/server/serverFns/story/story-list-query.ts +1 -1
- package/src/server/serverFns/story/story-reactions.ts +7 -27
- package/src/server/serverFns/story/story-search.ts +2 -2
- package/src/server/serverFns/story/story-transfer.ts +7 -14
- package/src/server/serverFns/story/story-tree.ts +6 -58
- package/src/server/serverFns/story-display-options.ts +9 -32
- package/src/server/serverFns/story-view.ts +20 -17
- package/src/server/serverFns/tasks/task-crud.ts +3 -3
- package/src/server/serverFns/tasks/task-queries.ts +3 -3
- package/src/server/serverFns/team.ts +42 -18
- package/src/server/serverFns/testcase/__tests__/generation.test.ts +9 -4
- package/src/server/serverFns/testcase/__tests__/plans.test.ts +1 -0
- package/src/server/serverFns/testcase/__tests__/regression.test.ts +15 -0
- package/src/server/serverFns/testcase/__tests__/run-cases.test.ts +11 -6
- package/src/server/serverFns/testcase/__tests__/runs.test.ts +2 -0
- package/src/server/serverFns/testcase/__tests__/testgen-output.test.ts +3 -3
- package/src/server/serverFns/testcase/automation.ts +8 -15
- package/src/server/serverFns/testcase/bulk.ts +3 -3
- package/src/server/serverFns/testcase/generation.ts +26 -20
- package/src/server/serverFns/testcase/plans.ts +18 -40
- package/src/server/serverFns/testcase/regression.ts +12 -7
- package/src/server/serverFns/testcase/run-cases.ts +6 -15
- package/src/server/serverFns/testcase/runs.ts +17 -35
- package/src/server/serverFns/testcase/stats.ts +7 -18
- package/src/server/serverFns/testcase/testcase-activities.ts +3 -1
- package/src/server/serverFns/testcase/testcase-board.ts +6 -22
- package/src/server/serverFns/testcase/testcase-crud.ts +114 -150
- package/src/server/serverFns/testcase/testcase-display-options.ts +2 -2
- package/src/server/serverFns/testcase/testcase-export.ts +1 -1
- package/src/server/serverFns/testcase/testcase-filter-views.ts +4 -4
- package/src/server/serverFns/testcase/testcase-folders.ts +13 -23
- package/src/server/serverFns/testcase/testcase-groups.ts +1 -1
- package/src/server/serverFns/testcase/testcase-reorder.ts +1 -1
- package/src/server/serverFns/translation.ts +4 -1
- package/src/server/serverFns/user/avatar.ts +1 -1
- package/src/server/serverFns/user/settings.ts +1 -1
- package/src/server/serverFns/user/update-locale.ts +1 -1
- package/src/server/serverFns/workspace-kb.ts +84 -27
- package/src/server/serverFns/workspace.ts +41 -38
- package/src/server/serverFns/ws.ts +1 -1
- package/src/server/sso/tokens.ts +15 -3
- package/src/server/story/permissions.ts +56 -0
- package/src/server/story/types.ts +7 -33
- package/src/server/team-access.ts +5 -8
- package/src/server/testcase/__tests__/auto-bug.test.ts +5 -2
- package/src/server/testcase/__tests__/automation-rerun.test.ts +18 -0
- package/src/server/testcase/__tests__/builtin-executor.test.ts +43 -6
- package/src/server/testcase/__tests__/list-query.test.ts +11 -0
- package/src/server/testcase/__tests__/run-summary.test.ts +47 -15
- package/src/server/testcase/__tests__/sandbox-runner.test.ts +27 -1
- package/src/server/testcase/__tests__/triage.test.ts +17 -0
- package/src/server/testcase/auto-bug.ts +6 -6
- package/src/server/testcase/automation-rerun.ts +45 -8
- package/src/server/testcase/builtin-executor.ts +19 -0
- package/src/server/testcase/list-query.ts +18 -3
- package/src/server/testcase/permissions.ts +64 -0
- package/src/server/testcase/run-finalize.ts +19 -2
- package/src/server/testcase/run-webhook.ts +13 -1
- package/src/server/testcase/sandbox-runner.ts +21 -1
- package/src/server/testcase/triage.ts +38 -15
- package/src/server/web-search.ts +85 -0
- package/src/server-entry.ts +7 -1
- package/src/shared/ai-cli/__tests__/adapter.test.ts +39 -17
- package/src/shared/ai-cli/__tests__/cli-detector.test.ts +44 -13
- package/src/shared/ai-cli/adapter.ts +38 -15
- package/src/shared/ai-cli/cli-detector.ts +41 -16
- package/src/{components/bug/display/types.ts → shared/bug/display-types.ts} +1 -1
- package/src/shared/design-ai/ndjson.ts +13 -0
- package/src/{components/shared-kit/list-kit/display/types.ts → shared/list-kit/display-types.ts} +1 -1
- package/src/{components/shared-kit/list-kit/display/values.ts → shared/list-kit/display-values.ts} +1 -1
- package/src/start.ts +26 -10
- package/src/styles/globals.css +11 -0
- package/vite.shared.ts +39 -25
- package/LICENSE +0 -661
- package/src/components/ai/ai-prompt-input/components/page-user-context-selector.tsx +0 -183
- package/src/components/harness/turn-usage-pill.tsx +0 -60
- package/src/components/story/views/story-list/move.ts +0 -55
- package/src/components/tiptap/notion-like/notion-like-editor-theme-toggle.tsx +0 -63
- package/src/components/tiptap/notion-like/setup-error-message/setup-error-message.scss +0 -108
- package/src/components/tiptap/notion-like/setup-error-message/setup-error-message.tsx +0 -115
- package/src/lib/__tests__/pgvector.test.ts +0 -94
- package/src/lib/__tests__/rate-limit.test.ts +0 -80
- package/src/lib/analytics.ts +0 -78
- package/src/lib/collections/ai/index.ts +0 -17
- package/src/lib/plugin-runtime/worker-realm.ts +0 -225
- package/src/lib/prisma.ts +0 -18
- package/src/lib/rate-limit.ts +0 -70
- package/src/paraglide/.gitignore +0 -3
- package/src/paraglide/.prettierignore +0 -3
- package/src/paraglide/README.md +0 -162
- package/src/paraglide/messages/_index.js +0 -83424
- package/src/paraglide/messages/en.js +0 -26715
- package/src/paraglide/messages/zh.js +0 -26713
- package/src/paraglide/messages.js +0 -4
- package/src/paraglide/registry.js +0 -46
- package/src/paraglide/runtime.js +0 -2311
- package/src/paraglide/server.js +0 -294
- package/src/routes/_nav/dashboard/-components/quick-actions.tsx +0 -48
- /package/src/{components/settings/personal-team/account → lib}/avatar/avatar-config.ts +0 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
// AllBlue - 理想之海
|
|
3
|
+
// Copyright (C) 2026 AllBlue Contributors
|
|
4
|
+
//
|
|
5
|
+
// This program is free software: you can redistribute it and/or modify
|
|
6
|
+
// it under the terms of the GNU Affero General Public License as published by
|
|
7
|
+
// the Free Software Foundation, either version 3 of the License, or
|
|
8
|
+
// (at your option) any later version.
|
|
9
|
+
//
|
|
10
|
+
// This program is distributed in the hope that it will be useful,
|
|
11
|
+
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
+
// GNU Affero General Public License for more details.
|
|
14
|
+
//
|
|
15
|
+
// You should have received a copy of the GNU Affero General Public License
|
|
16
|
+
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
17
|
+
|
|
18
|
+
import { useCallback, useRef } from "react"
|
|
19
|
+
|
|
20
|
+
export interface ColumnResizeOptions {
|
|
21
|
+
/** pointerdown 时读取当前宽度(闭包内取最新值) */
|
|
22
|
+
getWidth: () => number
|
|
23
|
+
onChange: (width: number) => void
|
|
24
|
+
min: number
|
|
25
|
+
max: number
|
|
26
|
+
/** 1 = 宽度随鼠标右移增大(左栏),-1 = 随右移减小(右栏)。默认 1 */
|
|
27
|
+
direction?: 1 | -1
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* 列宽指针拖拽(setPointerCapture + onMove/onUp)。
|
|
32
|
+
* workbench-shell 的 sidebar/rail 分隔条与 transcript-width-handle 共用
|
|
33
|
+
* (审计 🔵:原三处内联同构实现)。
|
|
34
|
+
*/
|
|
35
|
+
export function useColumnResize({
|
|
36
|
+
getWidth,
|
|
37
|
+
onChange,
|
|
38
|
+
min,
|
|
39
|
+
max,
|
|
40
|
+
direction = 1,
|
|
41
|
+
}: ColumnResizeOptions) {
|
|
42
|
+
const dragBase = useRef<{ x: number; w: number } | null>(null)
|
|
43
|
+
|
|
44
|
+
return useCallback(
|
|
45
|
+
(e: React.PointerEvent) => {
|
|
46
|
+
dragBase.current = { x: e.clientX, w: getWidth() }
|
|
47
|
+
const el = e.currentTarget as HTMLElement
|
|
48
|
+
el.setPointerCapture(e.pointerId)
|
|
49
|
+
const onMove = (ev: PointerEvent) => {
|
|
50
|
+
if (!dragBase.current) return
|
|
51
|
+
const next = dragBase.current.w + direction * (ev.clientX - dragBase.current.x)
|
|
52
|
+
onChange(Math.min(max, Math.max(min, next)))
|
|
53
|
+
}
|
|
54
|
+
const onUp = () => {
|
|
55
|
+
dragBase.current = null
|
|
56
|
+
el.removeEventListener("pointermove", onMove)
|
|
57
|
+
el.removeEventListener("pointerup", onUp)
|
|
58
|
+
}
|
|
59
|
+
el.addEventListener("pointermove", onMove)
|
|
60
|
+
el.addEventListener("pointerup", onUp)
|
|
61
|
+
},
|
|
62
|
+
[getWidth, onChange, min, max, direction],
|
|
63
|
+
)
|
|
64
|
+
}
|
|
@@ -3,6 +3,7 @@ import { useCallback, useEffect, useState } from "react"
|
|
|
3
3
|
export const SIDEBAR_MIN = 264
|
|
4
4
|
export const SIDEBAR_MAX = 420
|
|
5
5
|
export const RAIL_MIN = 300
|
|
6
|
+
export const RAIL_MAX = 560
|
|
6
7
|
export const CENTER_MIN = 400
|
|
7
8
|
export const SIDEBAR_AUTO_COLLAPSE = 1024
|
|
8
9
|
const SIDEBAR_STORAGE = "allblue.harness.sidebarWidth"
|
|
@@ -17,7 +18,7 @@ const DEFAULT_PREFS: ColumnPrefs = { sidebar: 280, rail: 360 }
|
|
|
17
18
|
|
|
18
19
|
export function clampColumns(viewport: number, prefs: ColumnPrefs): ColumnsState {
|
|
19
20
|
const sidebar = Math.min(SIDEBAR_MAX, Math.max(SIDEBAR_MIN, prefs.sidebar))
|
|
20
|
-
const rail = Math.min(
|
|
21
|
+
const rail = Math.min(RAIL_MAX, Math.max(RAIL_MIN, prefs.rail))
|
|
21
22
|
const center = viewport - sidebar - rail
|
|
22
23
|
if (center >= CENTER_MIN) return { sidebar, rail, railVisible: true }
|
|
23
24
|
const centerShrunk = viewport - sidebar
|
|
@@ -50,11 +51,19 @@ export function useTrackColumns(railOpen: boolean) {
|
|
|
50
51
|
const autoCollapse = viewport < SIDEBAR_AUTO_COLLAPSE
|
|
51
52
|
const sidebarCollapsed = manualCollapse ?? autoCollapse
|
|
52
53
|
const setSidebarWidth = useCallback((w: number) => {
|
|
53
|
-
|
|
54
|
+
try {
|
|
55
|
+
localStorage.setItem(SIDEBAR_STORAGE, String(w))
|
|
56
|
+
} catch {
|
|
57
|
+
// 隐私模式/配额异常:丢弃持久化,会话内宽度仍然生效
|
|
58
|
+
}
|
|
54
59
|
setPrefs((p) => ({ ...p, sidebar: w }))
|
|
55
60
|
}, [])
|
|
56
61
|
const setRailWidth = useCallback((w: number) => {
|
|
57
|
-
|
|
62
|
+
try {
|
|
63
|
+
localStorage.setItem(RAIL_STORAGE, String(w))
|
|
64
|
+
} catch {
|
|
65
|
+
// 同上
|
|
66
|
+
}
|
|
58
67
|
setPrefs((p) => ({ ...p, rail: w }))
|
|
59
68
|
}, [])
|
|
60
69
|
return {
|
|
@@ -1,40 +1,34 @@
|
|
|
1
1
|
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import type { ReactNode } from "react"
|
|
3
|
+
import { PanelLeftOpen } from "lucide-react"
|
|
4
|
+
import { m } from "@/paraglide/messages.js"
|
|
5
|
+
import { useColumnResize } from "@/components/harness/use-column-resize"
|
|
6
|
+
import { RAIL_MAX, RAIL_MIN, SIDEBAR_MAX, SIDEBAR_MIN, useTrackColumns } from "./use-track-columns"
|
|
4
7
|
|
|
5
8
|
export interface WorkbenchShellProps {
|
|
6
9
|
sidebar: ReactNode
|
|
7
10
|
center: ReactNode
|
|
8
11
|
rail: ReactNode | null
|
|
9
|
-
onSidebarWidthChange?: (w: number) => void
|
|
10
12
|
}
|
|
11
13
|
|
|
12
14
|
export function WorkbenchShell({ sidebar, center, rail }: WorkbenchShellProps) {
|
|
13
15
|
const railOpen = rail !== null
|
|
14
16
|
const { columns, sidebarCollapsed, setManualCollapse, setSidebarWidth, setRailWidth } =
|
|
15
17
|
useTrackColumns(railOpen)
|
|
16
|
-
const dragBase = useRef<{ x: number; w: number } | null>(null)
|
|
17
18
|
|
|
18
|
-
const startSidebarDrag =
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
el.removeEventListener("pointerup", onUp)
|
|
32
|
-
}
|
|
33
|
-
el.addEventListener("pointermove", onMove)
|
|
34
|
-
el.addEventListener("pointerup", onUp)
|
|
35
|
-
},
|
|
36
|
-
[columns.sidebar, setSidebarWidth],
|
|
37
|
-
)
|
|
19
|
+
const startSidebarDrag = useColumnResize({
|
|
20
|
+
getWidth: () => columns.sidebar,
|
|
21
|
+
onChange: setSidebarWidth,
|
|
22
|
+
min: SIDEBAR_MIN,
|
|
23
|
+
max: SIDEBAR_MAX,
|
|
24
|
+
})
|
|
25
|
+
const startRailDrag = useColumnResize({
|
|
26
|
+
getWidth: () => columns.rail,
|
|
27
|
+
onChange: setRailWidth,
|
|
28
|
+
min: RAIL_MIN,
|
|
29
|
+
max: RAIL_MAX,
|
|
30
|
+
direction: -1,
|
|
31
|
+
})
|
|
38
32
|
|
|
39
33
|
return (
|
|
40
34
|
<div className="flex h-full min-h-0 overflow-hidden">
|
|
@@ -51,6 +45,7 @@ export function WorkbenchShell({ sidebar, center, rail }: WorkbenchShellProps) {
|
|
|
51
45
|
onPointerDown={startSidebarDrag}
|
|
52
46
|
role="separator"
|
|
53
47
|
aria-orientation="vertical"
|
|
48
|
+
aria-label={m.harness_workbench_resizeSidebar()}
|
|
54
49
|
/>
|
|
55
50
|
)}
|
|
56
51
|
<main className="flex min-w-0 flex-1 flex-col overflow-hidden">{center}</main>
|
|
@@ -58,25 +53,10 @@ export function WorkbenchShell({ sidebar, center, rail }: WorkbenchShellProps) {
|
|
|
58
53
|
<>
|
|
59
54
|
<div
|
|
60
55
|
className="z-10 w-1 shrink-0 cursor-col-resize bg-transparent hover:bg-border"
|
|
61
|
-
onPointerDown={
|
|
62
|
-
dragBase.current = { x: e.clientX, w: columns.rail }
|
|
63
|
-
const el = e.currentTarget as HTMLElement
|
|
64
|
-
el.setPointerCapture(e.pointerId)
|
|
65
|
-
const onMove = (ev: PointerEvent) => {
|
|
66
|
-
if (!dragBase.current) return
|
|
67
|
-
const next = dragBase.current.w - (ev.clientX - dragBase.current.x)
|
|
68
|
-
setRailWidth(Math.min(560, Math.max(300, next)))
|
|
69
|
-
}
|
|
70
|
-
const onUp = () => {
|
|
71
|
-
dragBase.current = null
|
|
72
|
-
el.removeEventListener("pointermove", onMove)
|
|
73
|
-
el.removeEventListener("pointerup", onUp)
|
|
74
|
-
}
|
|
75
|
-
el.addEventListener("pointermove", onMove)
|
|
76
|
-
el.addEventListener("pointerup", onUp)
|
|
77
|
-
}}
|
|
56
|
+
onPointerDown={startRailDrag}
|
|
78
57
|
role="separator"
|
|
79
58
|
aria-orientation="vertical"
|
|
59
|
+
aria-label={m.harness_workbench_resizeRail()}
|
|
80
60
|
/>
|
|
81
61
|
<aside
|
|
82
62
|
className="shrink-0 border-l"
|
|
@@ -89,11 +69,12 @@ export function WorkbenchShell({ sidebar, center, rail }: WorkbenchShellProps) {
|
|
|
89
69
|
)}
|
|
90
70
|
{sidebarCollapsed && (
|
|
91
71
|
<button
|
|
92
|
-
|
|
93
|
-
|
|
72
|
+
type="button"
|
|
73
|
+
aria-label={m.harness_workbench_expandSidebar()}
|
|
74
|
+
className="absolute bottom-4 left-14 z-20 rounded-md p-1 text-muted-foreground hover:bg-muted hover:text-foreground"
|
|
94
75
|
onClick={() => setManualCollapse(false)}
|
|
95
76
|
>
|
|
96
|
-
|
|
77
|
+
<PanelLeftOpen className="size-4" />
|
|
97
78
|
</button>
|
|
98
79
|
)}
|
|
99
80
|
</div>
|
|
@@ -207,12 +207,26 @@ interface SourcePreviewProps {
|
|
|
207
207
|
onSourceClick?: (source: CitationSource) => void;
|
|
208
208
|
}
|
|
209
209
|
|
|
210
|
+
// 仅放行 http(s) 链接:citation url 源自 AI 引用数据(LLM 产出/外部抓取),
|
|
211
|
+
// 组件自身设防 javascript:/data: scheme 注入(不依赖运行环境的默认拦截)
|
|
212
|
+
function safeHrefOf(url: string): string | null {
|
|
213
|
+
try {
|
|
214
|
+
const parsed = new URL(url);
|
|
215
|
+
return parsed.protocol === "http:" || parsed.protocol === "https:"
|
|
216
|
+
? parsed.toString()
|
|
217
|
+
: null;
|
|
218
|
+
} catch {
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
210
223
|
function SourcePreview({
|
|
211
224
|
source,
|
|
212
225
|
citationNumber,
|
|
213
226
|
onSourceClick,
|
|
214
227
|
}: SourcePreviewProps) {
|
|
215
228
|
const [isSnippetOpen, setIsSnippetOpen] = useState(false);
|
|
229
|
+
const safeHref = safeHrefOf(source.url);
|
|
216
230
|
const handleClick = useCallback(() => {
|
|
217
231
|
onSourceClick?.(source);
|
|
218
232
|
}, [onSourceClick, source]);
|
|
@@ -273,22 +287,31 @@ function SourcePreview({
|
|
|
273
287
|
/>
|
|
274
288
|
</CollapsibleTrigger>
|
|
275
289
|
)}
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
290
|
+
{safeHref ? (
|
|
291
|
+
<a
|
|
292
|
+
aria-label={`Open ${source.title} in new tab`}
|
|
293
|
+
className={cn(
|
|
294
|
+
"flex shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors",
|
|
295
|
+
"min-h-[44px] min-w-[44px] sm:min-h-[24px] sm:min-w-[24px]",
|
|
296
|
+
"hover:bg-background hover:text-foreground",
|
|
297
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1",
|
|
298
|
+
"[-webkit-tap-highlight-color:transparent] active:bg-background/80"
|
|
299
|
+
)}
|
|
300
|
+
href={safeHref}
|
|
301
|
+
onClick={(e) => e.stopPropagation()}
|
|
302
|
+
rel="noopener noreferrer"
|
|
303
|
+
target="_blank"
|
|
304
|
+
>
|
|
305
|
+
<ExternalLink aria-hidden="true" className="size-3.5" />
|
|
306
|
+
</a>
|
|
307
|
+
) : (
|
|
308
|
+
<span
|
|
309
|
+
aria-hidden="true"
|
|
310
|
+
className="flex size-6 shrink-0 items-center justify-center text-muted-foreground/40 sm:size-3.5"
|
|
311
|
+
>
|
|
312
|
+
<ExternalLink className="size-3.5" />
|
|
313
|
+
</span>
|
|
314
|
+
)}
|
|
292
315
|
</div>
|
|
293
316
|
</div>
|
|
294
317
|
{source.snippet && (
|
|
@@ -339,6 +339,10 @@ function FileUploadEmptyState({ maxFiles }: FileUploadEmptyStateProps) {
|
|
|
339
339
|
);
|
|
340
340
|
}
|
|
341
341
|
|
|
342
|
+
// 错误按文件唯一标识关联(name+size+lastModified):同名文件互相覆盖旧缺陷
|
|
343
|
+
const fileErrorKey = (file: File): string =>
|
|
344
|
+
`${file.name}:${file.size}:${file.lastModified}`;
|
|
345
|
+
|
|
342
346
|
export default function AIFileUpload({
|
|
343
347
|
onFilesSelected,
|
|
344
348
|
onFileRemove,
|
|
@@ -390,40 +394,47 @@ export default function AIFileUpload({
|
|
|
390
394
|
fileArray.forEach((file) => {
|
|
391
395
|
const error = validateFile(file);
|
|
392
396
|
if (error) {
|
|
393
|
-
newErrors[file
|
|
397
|
+
newErrors[fileErrorKey(file)] = error;
|
|
394
398
|
} else {
|
|
395
399
|
validFiles.push(file);
|
|
396
400
|
}
|
|
397
401
|
});
|
|
398
402
|
|
|
399
|
-
if (Object.keys(newErrors).length > 0) {
|
|
400
|
-
setErrors(newErrors);
|
|
401
|
-
if (errorTimeoutRef.current) {
|
|
402
|
-
clearTimeout(errorTimeoutRef.current);
|
|
403
|
-
}
|
|
404
|
-
errorTimeoutRef.current = setTimeout(() => {
|
|
405
|
-
setErrors((prev) => {
|
|
406
|
-
const next = { ...prev };
|
|
407
|
-
delete next._general;
|
|
408
|
-
return next;
|
|
409
|
-
});
|
|
410
|
-
}, 5000);
|
|
411
|
-
}
|
|
412
|
-
|
|
413
403
|
if (validFiles.length > 0) {
|
|
414
404
|
const remainingSlots = maxFiles - uploadedFiles.length;
|
|
415
405
|
const filesToAdd = validFiles.slice(0, remainingSlots);
|
|
416
406
|
|
|
417
407
|
if (filesToAdd.length < validFiles.length) {
|
|
418
408
|
const skipped = validFiles.length - filesToAdd.length;
|
|
419
|
-
newErrors
|
|
409
|
+
newErrors._general =
|
|
420
410
|
`${skipped} file${skipped !== 1 ? "s" : ""} skipped. Maximum ${maxFiles} files allowed.`;
|
|
421
|
-
setErrors(newErrors);
|
|
422
411
|
}
|
|
423
412
|
|
|
424
413
|
onFilesSelected?.(filesToAdd);
|
|
425
414
|
}
|
|
426
415
|
|
|
416
|
+
// 函数式合并:不覆盖其他来源的既有错误;本次添加成功的文件清掉旧错误
|
|
417
|
+
setErrors((prev) => {
|
|
418
|
+
const next = { ...prev };
|
|
419
|
+
for (const file of validFiles) delete next[fileErrorKey(file)];
|
|
420
|
+
return { ...next, ...newErrors };
|
|
421
|
+
});
|
|
422
|
+
|
|
423
|
+
// 定时器统一清理本次设置的 keys(此前文件级错误永不自动消失)
|
|
424
|
+
const errorKeys = Object.keys(newErrors);
|
|
425
|
+
if (errorKeys.length > 0) {
|
|
426
|
+
if (errorTimeoutRef.current) {
|
|
427
|
+
clearTimeout(errorTimeoutRef.current);
|
|
428
|
+
}
|
|
429
|
+
errorTimeoutRef.current = setTimeout(() => {
|
|
430
|
+
setErrors((prev) => {
|
|
431
|
+
const next = { ...prev };
|
|
432
|
+
for (const key of errorKeys) delete next[key];
|
|
433
|
+
return next;
|
|
434
|
+
});
|
|
435
|
+
}, 5000);
|
|
436
|
+
}
|
|
437
|
+
|
|
427
438
|
if (fileInputRef.current) {
|
|
428
439
|
fileInputRef.current.value = "";
|
|
429
440
|
}
|
|
@@ -453,9 +464,21 @@ export default function AIFileUpload({
|
|
|
453
464
|
setIsDragging(false);
|
|
454
465
|
|
|
455
466
|
if (uploadedFiles.length >= maxFiles) {
|
|
456
|
-
|
|
467
|
+
// 函数式合并:不覆盖刚设置的文件级错误,且同样纳入 5s 自动清理
|
|
468
|
+
setErrors((prev) => ({
|
|
469
|
+
...prev,
|
|
457
470
|
_general: `Maximum ${maxFiles} files allowed`,
|
|
458
|
-
});
|
|
471
|
+
}));
|
|
472
|
+
if (errorTimeoutRef.current) {
|
|
473
|
+
clearTimeout(errorTimeoutRef.current);
|
|
474
|
+
}
|
|
475
|
+
errorTimeoutRef.current = setTimeout(() => {
|
|
476
|
+
setErrors((prev) => {
|
|
477
|
+
const next = { ...prev };
|
|
478
|
+
delete next._general;
|
|
479
|
+
return next;
|
|
480
|
+
});
|
|
481
|
+
}, 5000);
|
|
459
482
|
return;
|
|
460
483
|
}
|
|
461
484
|
|
|
@@ -552,7 +575,7 @@ export default function AIFileUpload({
|
|
|
552
575
|
<div className="flex flex-col gap-2" role="list">
|
|
553
576
|
{uploadedFiles.map((uploadedFile) => (
|
|
554
577
|
<FileUploadItem
|
|
555
|
-
error={errors[uploadedFile.file
|
|
578
|
+
error={errors[fileErrorKey(uploadedFile.file)]}
|
|
556
579
|
key={uploadedFile.id}
|
|
557
580
|
onRemove={onFileRemove}
|
|
558
581
|
processingStatus={processingStatus}
|
|
@@ -289,6 +289,16 @@ function HighlightedCodeBlock({
|
|
|
289
289
|
};
|
|
290
290
|
}, [code, lang, theme, skipHighlighting]);
|
|
291
291
|
|
|
292
|
+
// DOMParser + domNodeToReact 在渲染期执行:highlightedCode 未变时缓存解析
|
|
293
|
+
// 与 React 树构建(此前每次渲染重复解析)。hooks 恒定调用,置于条件 return 前
|
|
294
|
+
const renderedCode = useMemo(() => {
|
|
295
|
+
if (!highlightedCode) return null;
|
|
296
|
+
const parser = new DOMParser();
|
|
297
|
+
const doc = parser.parseFromString(highlightedCode, "text/html");
|
|
298
|
+
const pre = doc.body.querySelector("pre");
|
|
299
|
+
return pre ? domNodeToReact(pre) : null;
|
|
300
|
+
}, [highlightedCode]);
|
|
301
|
+
|
|
292
302
|
if (skipHighlighting || error) {
|
|
293
303
|
return <CodeBlockFallback code={code} filename={filename} />;
|
|
294
304
|
}
|
|
@@ -297,22 +307,14 @@ function HighlightedCodeBlock({
|
|
|
297
307
|
return <CodeBlockSkeleton filename={filename} />;
|
|
298
308
|
}
|
|
299
309
|
|
|
300
|
-
if (!
|
|
301
|
-
return <CodeBlockFallback code={code} filename={filename} />;
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
const parser = new DOMParser();
|
|
305
|
-
const doc = parser.parseFromString(highlightedCode, "text/html");
|
|
306
|
-
const pre = doc.body.querySelector("pre");
|
|
307
|
-
|
|
308
|
-
if (!pre) {
|
|
310
|
+
if (!renderedCode) {
|
|
309
311
|
return <CodeBlockFallback code={code} filename={filename} />;
|
|
310
312
|
}
|
|
311
313
|
|
|
312
314
|
return (
|
|
313
315
|
<div className="rounded-lg border border-border bg-background">
|
|
314
316
|
<CodeBlockHeader filename={filename} />
|
|
315
|
-
<div className="overflow-x-auto">{
|
|
317
|
+
<div className="overflow-x-auto">{renderedCode}</div>
|
|
316
318
|
</div>
|
|
317
319
|
);
|
|
318
320
|
}
|
|
@@ -494,7 +496,7 @@ function MessageActions({
|
|
|
494
496
|
<span>{copied ? "Copied!" : "Copy"}</span>
|
|
495
497
|
<DropdownMenuShortcut>
|
|
496
498
|
{typeof navigator !== "undefined" &&
|
|
497
|
-
navigator.
|
|
499
|
+
navigator.userAgent.includes("Mac")
|
|
498
500
|
? "⌘"
|
|
499
501
|
: "Ctrl"}
|
|
500
502
|
C
|
|
@@ -553,18 +555,35 @@ export default function AIMessage({
|
|
|
553
555
|
const messageRef = useRef<HTMLDivElement>(null);
|
|
554
556
|
const messageId = useId();
|
|
555
557
|
const displayedContent = useStreamingText(content, isStreaming);
|
|
558
|
+
// 复制反馈定时器:卸载时清理(卸载后 setState 残留)
|
|
559
|
+
const copyFeedbackTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
560
|
+
|
|
561
|
+
useEffect(
|
|
562
|
+
() => () => {
|
|
563
|
+
if (copyFeedbackTimerRef.current) {
|
|
564
|
+
clearTimeout(copyFeedbackTimerRef.current);
|
|
565
|
+
}
|
|
566
|
+
},
|
|
567
|
+
[]
|
|
568
|
+
);
|
|
556
569
|
|
|
557
570
|
const handleCopy = useCallback(async () => {
|
|
558
571
|
try {
|
|
559
572
|
await navigator.clipboard.writeText(content);
|
|
560
573
|
setCopied(true);
|
|
561
574
|
setCopyError(false);
|
|
562
|
-
|
|
575
|
+
if (copyFeedbackTimerRef.current) {
|
|
576
|
+
clearTimeout(copyFeedbackTimerRef.current);
|
|
577
|
+
}
|
|
578
|
+
copyFeedbackTimerRef.current = setTimeout(() => {
|
|
563
579
|
setCopied(false);
|
|
564
580
|
}, COPY_FEEDBACK_DURATION);
|
|
565
581
|
} catch {
|
|
566
582
|
setCopyError(true);
|
|
567
|
-
|
|
583
|
+
if (copyFeedbackTimerRef.current) {
|
|
584
|
+
clearTimeout(copyFeedbackTimerRef.current);
|
|
585
|
+
}
|
|
586
|
+
copyFeedbackTimerRef.current = setTimeout(() => {
|
|
568
587
|
setCopyError(false);
|
|
569
588
|
}, COPY_FEEDBACK_DURATION);
|
|
570
589
|
}
|
|
@@ -18,97 +18,6 @@ const DIMENSIONS = {
|
|
|
18
18
|
FADE_HEIGHT: "80px",
|
|
19
19
|
} as const;
|
|
20
20
|
|
|
21
|
-
const SHIMMER_CONFIG = {
|
|
22
|
-
DURATION: "5s",
|
|
23
|
-
GRADIENT:
|
|
24
|
-
"linear-gradient(110deg, #404040 35%, #fff 50%, #404040 75%, #404040)",
|
|
25
|
-
BACKGROUND_SIZE: "200% 100%",
|
|
26
|
-
} as const;
|
|
27
|
-
|
|
28
|
-
const THINKING_CONTENT = `Okay, first I need to understand what HextaUI is. It seems to be a UI library or framework, likely for web development. I should check the web results for any mentions of HextaUI.
|
|
29
|
-
|
|
30
|
-
Looking at the web results, I see that HextaUI is mentioned in several contexts. It's described as a collection of modern, responsive, and customizable UI components for Next.js. It seems to be designed to help developers build websites more efficiently.
|
|
31
|
-
|
|
32
|
-
I should look for more specific details. The results mention that HextaUI provides components that can be copied, adapted, and personalized. It also mentions that it's open-source and has a community of contributors.
|
|
33
|
-
|
|
34
|
-
I should also check if there are any specific features or benefits mentioned. The results talk about the components being responsive and customizable, which are important for modern web development. It also mentions that the components are designed to be production-ready.
|
|
35
|
-
|
|
36
|
-
I should consider if there are any drawbacks or limitations mentioned. The results don't seem to mention any significant drawbacks, but I should keep in mind that any library or framework will have its own set of trade-offs.
|
|
37
|
-
|
|
38
|
-
I should also consider the credibility of the sources. The results include mentions from GitHub, Product Hunt, and other development-related websites, which are generally reliable sources for information about software libraries.
|
|
39
|
-
|
|
40
|
-
Based on the information from the web results, I can conclude that HextaUI is a UI component library for Next.js that provides modern, responsive, and customizable components for building websites. It's open-source and has a community of contributors.
|
|
41
|
-
|
|
42
|
-
I should also consider if there are any related posts on X that might provide additional context or opinions. The posts on X mention HextaUI v2 being released, with features like a complete design system, primitive components, and ready-made blocks. This suggests that HextaUI is actively maintained and updated.
|
|
43
|
-
|
|
44
|
-
I should consider if there are any specific use cases or examples mentioned. The web results mention that HextaUI components can be used to build stunning websites effortlessly, and that they are suitable for production applications.
|
|
45
|
-
|
|
46
|
-
I should also consider if there are any comparisons to other similar libraries or frameworks. The results don't mention any direct comparisons, but I can infer that HextaUI is similar to other UI component libraries like Shadcn/UI, which is mentioned in one of the results.
|
|
47
|
-
|
|
48
|
-
Based on the information from the web results and the posts on X, I can conclude that HextaUI is a UI component library for Next.js that provides modern, responsive, and customizable components for building websites. It's open-source, actively maintained, and has a community of contributors.
|
|
49
|
-
|
|
50
|
-
I should consider if there are any specific instructions or guidelines for using HextaUI. The web results mention that components can be copied and pasted into projects, and that there is a CLI tool for installing components.
|
|
51
|
-
|
|
52
|
-
I should also consider if there are any specific requirements or dependencies mentioned. The web results mention that HextaUI is designed for Next.js, so it likely requires a Next.js project to use.
|
|
53
|
-
|
|
54
|
-
Based on the information from the web results and the posts on X, I can conclude that HextaUI is a UI component library for Next.js that provides modern, responsive, and customizable components for building websites. It's open-source, actively maintained, and has a community of contributors. Components can be copied and pasted into projects, and there is a CLI tool for installing components.
|
|
55
|
-
|
|
56
|
-
I should consider if there are any specific examples or demos available. The web results mention that there is a website for HextaUI, which likely includes examples and documentation.
|
|
57
|
-
|
|
58
|
-
I should also consider if there are any specific licensing or usage terms mentioned. The web results mention that HextaUI is open-source, but I should check the specific license to understand the terms of use.
|
|
59
|
-
|
|
60
|
-
Based on the information from the web results and the posts on X, I can conclude that HextaUI is a UI component library for Next.js that provides modern, responsive, and customizable components for building websites. It's open-source, actively maintained, and has a community of contributors. Components can be copied and pasted into projects, and there is a CLI tool for installing components. The library is designed to be production-ready and supports features like dark mode.
|
|
61
|
-
|
|
62
|
-
I should consider if there are any specific installation or setup instructions mentioned. The web results mention that there is a CLI tool for installing components, and that components can be copied and pasted into projects.
|
|
63
|
-
|
|
64
|
-
I should also consider if there are any specific customization options mentioned. The web results mention that components are customizable through props and Tailwind CSS classes.
|
|
65
|
-
|
|
66
|
-
Based on the information from the web results and the posts on X, I can conclude that HextaUI is a UI component library for Next.js that provides modern, responsive, and customizable components for building websites. It's open-source, actively maintained, and has a community of contributors. Components can be copied and pasted into projects, and there is a CLI tool for installing components. The library is designed to be production-ready and supports features like dark mode. Components are customizable through props and Tailwind CSS classes.
|
|
67
|
-
|
|
68
|
-
I should consider if there are any specific community or support resources mentioned. The web results mention that there is a GitHub repository and a community for support and discussions.
|
|
69
|
-
|
|
70
|
-
I should also consider if there are any specific contribution guidelines mentioned. The web results mention that contributions are welcome and that there are guidelines for contributing.
|
|
71
|
-
|
|
72
|
-
Based on the information from the web results and the posts on X, I can conclude that HextaUI is a UI component library for Next.js that provides modern, responsive, and customizable components for building websites. It's open-source, actively maintained, and has a community of contributors. Components can be copied and pasted into projects, and there is a CLI tool for installing components. The library is designed to be production-ready and supports features like dark mode. Components are customizable through props and Tailwind CSS classes. There is a GitHub repository and a community for support and discussions, and contributions are welcome.
|
|
73
|
-
|
|
74
|
-
I should consider if there are any specific version or release information mentioned. The posts on X mention that HextaUI v2 has been released, with features like a complete design system, primitive components, and ready-made blocks.
|
|
75
|
-
|
|
76
|
-
I should also consider if there are any specific future plans or roadmap mentioned. The web results mention that there is a roadmap for upcoming features and improvements.
|
|
77
|
-
|
|
78
|
-
Based on the information from the web results and the posts on X, I can conclude that HextaUI is a UI component library for Next.js that provides modern, responsive, and customizable components for building websites. It's open-source, actively maintained, and has a community of contributors. Components can be copied and pasted into projects, and there is a CLI tool for installing components. The library is designed to be production-ready and supports features like dark mode. Components are customizable through props and Tailwind CSS classes. There is a GitHub repository and a community for support and discussions, and contributions are welcome. The latest version, HextaUI v2, includes a complete design system, primitive components, and ready-made blocks, and there is a roadmap for future features and improvements.
|
|
79
|
-
|
|
80
|
-
I think I have enough information to provide a comprehensive answer.
|
|
81
|
-
|
|
82
|
-
HextaUI is a UI component library specifically designed for Next.js applications. It provides a collection of modern, responsive, and customizable UI components that developers can easily copy, adapt, and personalize to build professional and visually appealing web interfaces. The library is open-source, actively maintained, and supported by a community of contributors, making it a reliable choice for developers looking to streamline their development process.
|
|
83
|
-
|
|
84
|
-
Key Features and Benefits:
|
|
85
|
-
|
|
86
|
-
Component-Based: HextaUI offers a wide range of pre-built components, such as buttons, forms, and navigation elements, which can be directly copied and pasted into your Next.js project. This allows for rapid prototyping and development.
|
|
87
|
-
|
|
88
|
-
Customization: Components are highly adaptable through props and Tailwind CSS classes, enabling developers to modify styles and behavior without altering the underlying code. This flexibility ensures that the components can fit the unique design requirements of any project.
|
|
89
|
-
|
|
90
|
-
Responsive and Production-Ready: The components are designed to be fully responsive, ensuring compatibility across devices. They are also tested to be production-ready, making them suitable for real-world applications.
|
|
91
|
-
|
|
92
|
-
CLI Tool: HextaUI includes a CLI tool that simplifies the installation of components. Developers can use commands like npx hexta-ui add button to quickly add components to their projects.
|
|
93
|
-
|
|
94
|
-
Dark Mode Support: The library includes built-in support for dark mode, enhancing accessibility and user experience.
|
|
95
|
-
|
|
96
|
-
Community and Support: HextaUI has an active community on GitHub, where developers can report bugs, request features, and contribute to the project. There are also contribution guidelines for those interested in improving the library.
|
|
97
|
-
|
|
98
|
-
Recent Updates:
|
|
99
|
-
|
|
100
|
-
HextaUI v2 was recently released, introducing several new features: A complete design system, Over 40 primitive components, Ready-made blocks for faster development.
|
|
101
|
-
|
|
102
|
-
The library is actively maintained, with a roadmap for future features and improvements, ensuring it stays up-to-date with modern development practices.
|
|
103
|
-
|
|
104
|
-
Usage and Installation:
|
|
105
|
-
|
|
106
|
-
To use HextaUI, you need a Next.js project. Components can be installed via the CLI or by copying and pasting code from the HextaUI website, which includes examples and documentation. The library is free and open-source, making it accessible to developers of all levels.
|
|
107
|
-
|
|
108
|
-
Conclusion:
|
|
109
|
-
|
|
110
|
-
HextaUI is an excellent choice for developers seeking to build modern, responsive, and customizable web interfaces with minimal effort. Its component-based approach, combined with strong community support and regular updates, makes it a valuable tool for accelerating the development of Next.js applications.`;
|
|
111
|
-
|
|
112
21
|
function useTimer() {
|
|
113
22
|
const [timer, setTimer] = useState(0);
|
|
114
23
|
const intervalRef = useRef<NodeJS.Timeout | null>(null);
|
|
@@ -254,28 +163,15 @@ function ContentCard({ contentRef, content }: ContentCardProps) {
|
|
|
254
163
|
);
|
|
255
164
|
}
|
|
256
165
|
|
|
257
|
-
function
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
@media (prefers-reduced-motion: reduce) {
|
|
270
|
-
[style*="shimmer"] {
|
|
271
|
-
animation: none;
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
`}</style>
|
|
275
|
-
);
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
export default function AIThinking({ className }: { className?: string }) {
|
|
166
|
+
export default function AIThinking({
|
|
167
|
+
className,
|
|
168
|
+
content = "",
|
|
169
|
+
}: {
|
|
170
|
+
className?: string;
|
|
171
|
+
/** 真实思考流内容由调用方注入;不传展示空白卡片(registry 演示假文案已删,
|
|
172
|
+
* 直接接入生产不再向用户展示伪造的 AI 思考过程) */
|
|
173
|
+
content?: string;
|
|
174
|
+
}) {
|
|
279
175
|
const contentRef = useRef<HTMLDivElement>(null);
|
|
280
176
|
const timer = useTimer();
|
|
281
177
|
useAutoScroll(contentRef);
|
|
@@ -283,8 +179,7 @@ export default function AIThinking({ className }: { className?: string }) {
|
|
|
283
179
|
return (
|
|
284
180
|
<div className={cn("flex max-w-xl flex-col gap-4", className)}>
|
|
285
181
|
<ThinkingHeader timer={timer} />
|
|
286
|
-
<ContentCard content={
|
|
287
|
-
<ShimmerStyles />
|
|
182
|
+
<ContentCard content={content} contentRef={contentRef} />
|
|
288
183
|
</div>
|
|
289
184
|
);
|
|
290
185
|
}
|
|
@@ -125,12 +125,18 @@ const CommandMenuContent = React.forwardRef<
|
|
|
125
125
|
) => {
|
|
126
126
|
const [value, setValue] = React.useState("");
|
|
127
127
|
const [selectedIndex, setSelectedIndex] = React.useState(0);
|
|
128
|
+
const contentRef = React.useRef<HTMLDivElement | null>(null);
|
|
128
129
|
|
|
129
130
|
React.useEffect(() => {
|
|
130
131
|
const handleKeyDown = (e: KeyboardEvent) => {
|
|
131
|
-
if (e.key
|
|
132
|
-
|
|
132
|
+
if (e.key !== "ArrowDown" && e.key !== "ArrowUp" && e.key !== "Enter") {
|
|
133
|
+
return;
|
|
133
134
|
}
|
|
135
|
+
// 仅拦截菜单自身导航:无条件 preventDefault 会吞掉整个文档的
|
|
136
|
+
// Enter/方向键默认行为(弹窗外表单提交、输入框光标移动失效)
|
|
137
|
+
const target = e.target as Node | null;
|
|
138
|
+
if (!target || !contentRef.current?.contains(target)) return;
|
|
139
|
+
e.preventDefault();
|
|
134
140
|
};
|
|
135
141
|
document.addEventListener("keydown", handleKeyDown);
|
|
136
142
|
return () => document.removeEventListener("keydown", handleKeyDown);
|
|
@@ -148,6 +154,7 @@ const CommandMenuContent = React.forwardRef<
|
|
|
148
154
|
"motion-safe:duration-200 motion-reduce:animate-none",
|
|
149
155
|
className
|
|
150
156
|
)}
|
|
157
|
+
ref={contentRef}
|
|
151
158
|
>
|
|
152
159
|
<CommandMenuProvider
|
|
153
160
|
scrollHideDelay={scrollHideDelay}
|