@allbluecn/web-app 0.22.4 → 0.23.1
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 +4 -14
- package/src/__tests__/integration/login-email-acceptance.test.ts +16 -0
- package/src/__tests__/story-view.test.ts +33 -1
- package/src/components/agents/__tests__/agent-bindings-tab.test.tsx +221 -0
- package/src/components/agents/__tests__/agents-page.test.tsx +284 -0
- package/src/components/agents/agent-bindings-tab.tsx +59 -45
- package/src/components/agents/agent-form-dialog.tsx +3 -3
- package/src/components/agents/agent-selector.tsx +2 -3
- package/src/components/agents/agents-page.tsx +66 -31
- package/src/components/agents/slash-skill-menu.tsx +2 -3
- package/src/components/auth/__tests__/session-guard.test.tsx +74 -0
- package/src/components/auth/session-guard.tsx +8 -0
- package/src/components/billing/login-prompt-dialog.tsx +1 -1
- package/src/components/billing/subscription-provider.tsx +2 -16
- package/src/components/bug/__tests__/peek-modes.test.tsx +8 -0
- package/src/components/bug/__tests__/subgroup-header.test.tsx +202 -40
- package/src/components/bug/peek-panel.tsx +5 -3
- package/src/components/bug/views/bug-list/group.tsx +12 -2
- package/src/components/bug/views/bug-list/index.tsx +94 -67
- package/src/components/command/command-palette.tsx +10 -9
- package/src/components/design/canvas/document/frame-custom-presets.ts +9 -1
- package/src/components/design/canvas/panels/toolbar.tsx +21 -22
- package/src/components/design/canvas/react/__tests__/canvas-context-load-echo.test.tsx +199 -0
- package/src/components/design/canvas/react/__tests__/hooks.test.tsx +17 -3
- package/src/components/design/canvas/react/canvas-context.tsx +47 -26
- package/src/components/design/canvas/react/hooks.ts +39 -34
- package/src/components/design/editor/layout/__tests__/collab-param-wiring.test.tsx +17 -0
- package/src/components/design/editor/layout/__tests__/context-menu.test.tsx +17 -1
- package/src/components/design/editor/layout/__tests__/no-page-save-toast.test.tsx +17 -0
- package/src/components/design/editor/layout/__tests__/persistence-restore.test.tsx +17 -1
- package/src/components/design/editor/layout/__tests__/ssr-localstorage-smoke.test.tsx +17 -1
- package/src/components/design/editor/layout/design-editor-layout.tsx +13 -2
- package/src/components/design/editor/layout/hooks/use-design-auto-save.ts +3 -19
- package/src/components/devtools/devtools-panel.tsx +56 -0
- package/src/components/forms/__tests__/create-app-form.test.tsx +131 -0
- package/src/components/forms/app-field-error.tsx +21 -1
- package/src/components/forms/app-field.tsx +8 -8
- package/src/components/forms/app-submit.tsx +12 -9
- package/src/components/forms/create-app-form.tsx +124 -0
- package/src/components/forms/index.ts +2 -3
- package/src/components/harness/__tests__/gallery-behavior.test.tsx +37 -1
- package/src/components/harness/__tests__/harness-workbench-first-send.test.tsx +4 -1
- package/src/components/harness/__tests__/message-actions.test.tsx +7 -6
- package/src/components/harness/__tests__/use-video-generation.test.tsx +165 -0
- package/src/components/harness/ai-chat-history/index.tsx +5 -3
- package/src/components/harness/gallery/gallery-card.tsx +57 -35
- package/src/components/harness/gallery/gallery-grid.tsx +32 -15
- package/src/components/harness/gallery/gallery-types.ts +19 -0
- package/src/components/harness/gallery/gallery-video-card.tsx +54 -0
- package/src/components/harness/gallery/types.ts +2 -0
- package/src/components/harness/gallery/use-video-generation.ts +95 -0
- package/src/components/harness/harness-workbench-page.tsx +2 -3
- package/src/components/harness/message-actions.tsx +5 -3
- package/src/components/hotkeys/shortcuts-panel.tsx +28 -13
- package/src/components/iteration/__tests__/burndown-chart.test.tsx +118 -0
- package/src/components/iteration/burndown-chart.tsx +54 -23
- package/src/components/knowledge/editor/__tests__/knowledge-doc-editor-collab.test.tsx +96 -0
- package/src/components/knowledge/editor/knowledge-doc-editor.tsx +56 -1
- package/src/components/knowledge/editor/mindmap-doc-editor.tsx +12 -0
- package/src/components/knowledge/editor/use-auto-save-channels.ts +3 -1
- package/src/components/layout/sidebar-03/__tests__/nav-workspace.test.tsx +0 -4
- package/src/components/layout/sidebar-03/nav-knowledge.tsx +11 -11
- package/src/components/layout/sidebar-03/nav-main.tsx +12 -15
- package/src/components/layout/sidebar-03/nav-notifications.tsx +5 -8
- package/src/components/layout/sidebar-03/nav-workspace.tsx +11 -9
- package/src/components/notifications/__tests__/settings-notifications.test.tsx +158 -0
- package/src/components/notifications/settings-notifications.tsx +37 -13
- package/src/components/notifications/team-notifications.tsx +10 -14
- package/src/components/settings/personal-team/account/__tests__/account-client.test.tsx +170 -0
- package/src/components/settings/personal-team/account/account-client.tsx +44 -7
- package/src/components/settings/personal-team/team/team-client.tsx +17 -19
- package/src/components/shared-kit/list-kit/__tests__/frozen-header.test.ts +210 -41
- package/src/components/shared-kit/list-kit/frozen-header.ts +134 -21
- package/src/components/shared-kit/list-kit/kanban/frozen-header.ts +20 -27
- package/src/components/story/__tests__/peek-panel-patch-sync.test.tsx +8 -0
- package/src/components/story/__tests__/story-list-table.test.tsx +214 -0
- package/src/components/story/columns.tsx +11 -2
- package/src/components/story/peek-panel.tsx +4 -2
- package/src/components/story/story-list-table.tsx +16 -1
- package/src/components/story/views/story-list/__tests__/frozen-headers.test.tsx +186 -0
- package/src/components/story/views/story-list/group.tsx +12 -1
- package/src/components/story/views/story-list/index.tsx +101 -68
- package/src/components/testcase/__tests__/case-row.test.tsx +134 -2
- package/src/components/testcase/__tests__/peek-panel.test.tsx +8 -0
- package/src/components/testcase/__tests__/step-editor.test.tsx +106 -0
- package/src/components/testcase/list/grouped-list.tsx +50 -22
- package/src/components/testcase/peek-panel.tsx +7 -4
- package/src/components/testcase/step-editor.tsx +196 -150
- package/src/components/tiptap/notion-like/editor-extensions.ts +0 -3
- package/src/components/tiptap/notion-like/notion-like-editor-header.tsx +1 -31
- package/src/components/tiptap/notion-like/notion-like-editor.tsx +32 -1
- package/src/components/workspace/__tests__/dialogs/create-workspace-dialog.test.tsx +2 -28
- package/src/components/workspace/__tests__/dialogs/edit-workspace-dialog.test.tsx +2 -28
- package/src/components/workspace/dialogs/create-workspace-dialog.tsx +45 -43
- package/src/components/workspace/dialogs/edit-workspace-dialog.tsx +38 -36
- package/src/design-engine/engine/engine-decor.ts +2 -0
- package/src/design-engine/engine/engine-path.ts +2 -0
- package/src/hooks/__tests__/use-unsaved-guard.test.tsx +180 -0
- package/src/hooks/use-notifications.ts +9 -16
- package/src/hooks/use-unsaved-guard.tsx +87 -0
- package/src/lib/__tests__/pacer.test.ts +33 -96
- package/src/lib/__tests__/query-defaults.test.ts +169 -0
- package/src/lib/__tests__/query-global-error.test.ts +256 -0
- package/src/lib/anyhub/anyhub-store.ts +2 -2
- package/src/lib/changelog/sdk-versions.ts +2 -10
- package/src/lib/collab/presence-store.ts +5 -5
- package/src/lib/collab/use-presence-list-refresh.ts +2 -2
- package/src/lib/collab/use-share-presence.ts +2 -2
- package/src/lib/collections/query-keys.ts +7 -2
- package/src/lib/commands/__tests__/command-palette-state.test.ts +12 -14
- package/src/lib/commands/__tests__/registry.test.ts +6 -3
- package/src/lib/commands/command-palette-state.ts +8 -31
- package/src/lib/hotkeys/__tests__/registry.test.ts +71 -18
- package/src/lib/hotkeys/registry.ts +188 -85
- package/src/lib/hotkeys/types.ts +1 -13
- package/src/lib/pacer.ts +1 -79
- package/src/lib/queries/README.md +67 -0
- package/src/lib/queries/__tests__/agents-queries.test.ts +101 -0
- package/src/lib/queries/__tests__/compliance-queries.test.ts +136 -0
- package/src/lib/queries/__tests__/notifications-queries.test.ts +175 -0
- package/src/lib/queries/__tests__/team-queries.test.ts +87 -0
- package/src/lib/queries/agents.ts +40 -0
- package/src/lib/queries/compliance.ts +69 -0
- package/src/lib/queries/notifications.ts +63 -0
- package/src/lib/queries/team.ts +39 -0
- package/src/lib/query-defaults.ts +8 -0
- package/src/lib/query-global-error.ts +128 -0
- package/src/lib/remote-auth-client.ts +16 -0
- package/src/paraglide/README.md +1 -1
- package/src/paraglide/messages/_index.d.ts +11 -0
- package/src/paraglide/messages/_index.js +5659 -88285
- package/src/paraglide/messages/common_error_generic.d.ts +16 -0
- package/src/paraglide/messages/common_error_generic.js +29 -0
- package/src/paraglide/messages/common_unsaved_body.d.ts +16 -0
- package/src/paraglide/messages/common_unsaved_body.js +29 -0
- package/src/paraglide/messages/common_unsaved_leave.d.ts +16 -0
- package/src/paraglide/messages/common_unsaved_leave.js +29 -0
- package/src/paraglide/messages/common_unsaved_stay.d.ts +16 -0
- package/src/paraglide/messages/common_unsaved_stay.js +29 -0
- package/src/paraglide/messages/common_unsaved_title.d.ts +16 -0
- package/src/paraglide/messages/common_unsaved_title.js +29 -0
- package/src/paraglide/messages/gallery_videofailed1.d.ts +17 -0
- package/src/paraglide/messages/gallery_videofailed1.js +30 -0
- package/src/paraglide/messages/gallery_videogenerating1.d.ts +17 -0
- package/src/paraglide/messages/gallery_videogenerating1.js +30 -0
- package/src/paraglide/messages/gallery_videomissingprompt2.d.ts +17 -0
- package/src/paraglide/messages/gallery_videomissingprompt2.js +30 -0
- package/src/paraglide/messages/gallery_videoprogress1.d.ts +19 -0
- package/src/paraglide/messages/gallery_videoprogress1.js +30 -0
- package/src/paraglide/messages/gallery_videostop1.d.ts +17 -0
- package/src/paraglide/messages/gallery_videostop1.js +30 -0
- package/src/paraglide/messages/story_table_resizecolumn1.d.ts +17 -0
- package/src/paraglide/messages/story_table_resizecolumn1.js +30 -0
- package/src/providers/index.tsx +5 -50
- package/src/routeTree.gen.ts +21 -0
- package/src/router.tsx +21 -8
- package/src/routes/__root.tsx +2 -1
- package/src/routes/__tests__/-edition-routing.test.tsx +6 -1
- package/src/routes/_login/forgot-password/route.lazy.tsx +7 -6
- package/src/routes/_login/login/route.lazy.tsx +10 -9
- package/src/routes/_login/register/route.lazy.tsx +19 -18
- package/src/routes/_login/reset-password/route.lazy.tsx +10 -9
- package/src/routes/_nav/knowledge/compliance/$id.lazy.tsx +9 -12
- package/src/routes/_nav/knowledge/compliance/index.lazy.tsx +16 -13
- package/src/routes/_nav/knowledge/laws/$id.lazy.tsx +1 -1
- package/src/routes/_nav/notifications/route.tsx +6 -16
- package/src/routes/_nav/settings/-settings-tabs.tsx +9 -12
- package/src/routes/api/generate/__tests__/media.test.ts +378 -0
- package/src/routes/api/generate/media.ts +179 -0
- package/src/server/__tests__/agent-client-graph.test.ts +0 -1
- package/src/server/__tests__/agent-crud.test.ts +37 -4
- package/src/server/__tests__/bug-groups-two-level.test.ts +34 -1
- package/src/server/__tests__/chat-conversations.test.ts +37 -4
- package/src/server/__tests__/chat-list-messages.test.ts +40 -7
- package/src/server/__tests__/csv-export.test.ts +36 -3
- package/src/server/__tests__/desktop-bootstrap.test.ts +189 -0
- package/src/server/__tests__/remote-auth.test.ts +72 -0
- package/src/server/__tests__/skill-crud.test.ts +37 -4
- package/src/server/__tests__/sso-domain.test.ts +1 -1
- package/src/server/__tests__/sso-rate-limit-singleton.test.ts +123 -0
- package/src/server/__tests__/task-serverfn-crud.test.ts +35 -2
- package/src/server/__tests__/task-serverfn-queries.test.ts +35 -2
- package/src/server/__tests__/testcase-board.test.ts +38 -5
- package/src/server/__tests__/testcase-bulk.test.ts +38 -5
- package/src/server/__tests__/testcase-list-scope.test.ts +38 -5
- package/src/server/ai-gateway/__tests__/ai-output-guard.test.ts +126 -2
- package/src/server/ai-gateway/__tests__/chat-stream-builder-code-mode.test.ts +4 -0
- package/src/server/ai-gateway/__tests__/chat-stream-builder-memory.test.ts +4 -0
- package/src/server/ai-gateway/__tests__/chat-stream-builder-sandbox.test.ts +4 -0
- package/src/server/ai-gateway/__tests__/chat-stream-builder-skills.test.ts +4 -0
- package/src/server/ai-gateway/__tests__/pgvector-memory-adapter.test.ts +30 -0
- package/src/server/ai-gateway/__tests__/pgvector-memory-conformance.test.ts +92 -0
- package/src/server/ai-gateway/__tests__/source-mode.test.ts +49 -8
- package/src/server/ai-gateway/ai-output-guard.ts +50 -2
- package/src/server/ai-gateway/chat-stream-builder.ts +3 -0
- package/src/server/ai-gateway/media/index.ts +36 -29
- package/src/server/ai-gateway/media/trim-input.ts +52 -0
- package/src/server/ai-gateway/memory/pgvector-adapter.ts +27 -13
- package/src/server/ai-gateway/sandbox/__tests__/harness-sandbox.test.ts +252 -41
- package/src/server/ai-gateway/sandbox/harness-sandbox.ts +6 -67
- package/src/server/ai-gateway/source-mode.ts +24 -8
- package/src/server/desktop-bootstrap.ts +74 -0
- package/src/server/lib/__tests__/rate-limit.test.ts +0 -1
- package/src/server/lib/rate-limit.ts +0 -2
- package/src/server/middlewares/__tests__/auth-context.test.ts +156 -0
- package/src/server/middlewares/auth-context.ts +62 -0
- package/src/server/remote-auth.ts +58 -31
- package/src/server/serverFns/__tests__/ai-hosted-models.test.ts +47 -15
- package/src/server/serverFns/__tests__/ai-source-mode.test.ts +45 -15
- package/src/server/serverFns/__tests__/billing.test.ts +37 -2
- package/src/server/serverFns/__tests__/collab-snapshot.test.ts +41 -14
- package/src/server/serverFns/__tests__/collab.test.ts +41 -14
- package/src/server/serverFns/__tests__/compliance.test.ts +33 -1
- package/src/server/serverFns/__tests__/email-verification.test.ts +35 -1
- package/src/server/serverFns/__tests__/knowledge-breadcrumb.test.ts +46 -6
- package/src/server/serverFns/__tests__/knowledge-delete.test.ts +42 -14
- package/src/server/serverFns/__tests__/knowledge-kb-projects.test.ts +46 -6
- package/src/server/serverFns/__tests__/knowledge-public-compliance.test.ts +36 -2
- package/src/server/serverFns/__tests__/knowledge-readable-kb.test.ts +42 -10
- package/src/server/serverFns/__tests__/knowledge-search.test.ts +45 -9
- package/src/server/serverFns/__tests__/legal-code-canonical.test.ts +36 -2
- package/src/server/serverFns/__tests__/link-preview.test.ts +38 -4
- package/src/server/serverFns/__tests__/notifications-list.test.ts +36 -3
- package/src/server/serverFns/__tests__/ownership-merge.test.ts +38 -4
- package/src/server/serverFns/__tests__/project-delete-transaction.test.ts +39 -2
- package/src/server/serverFns/__tests__/project-kb.test.ts +34 -1
- package/src/server/serverFns/__tests__/project-member-idor.test.ts +34 -1
- package/src/server/serverFns/__tests__/project-team-assign.test.ts +34 -1
- package/src/server/serverFns/__tests__/read-write-merge.test.ts +38 -4
- package/src/server/serverFns/__tests__/story-comments.test.ts +38 -4
- package/src/server/serverFns/__tests__/story-crud-archive-detail.test.ts +38 -4
- package/src/server/serverFns/__tests__/story-crud-labels-users.test.ts +37 -3
- package/src/server/serverFns/__tests__/story-crud.test.ts +36 -3
- package/src/server/serverFns/__tests__/story-links.test.ts +38 -4
- package/src/server/serverFns/__tests__/story-reactions.test.ts +38 -4
- package/src/server/serverFns/__tests__/story-tree.test.ts +38 -4
- package/src/server/serverFns/__tests__/team-accept.test.ts +34 -1
- package/src/server/serverFns/__tests__/team-invitation.test.ts +34 -1
- package/src/server/serverFns/__tests__/team-join-request.test.ts +34 -1
- package/src/server/serverFns/__tests__/team-members.test.ts +34 -1
- package/src/server/serverFns/__tests__/team-ownership-merge.test.ts +34 -1
- package/src/server/serverFns/__tests__/update-bug-guard.test.ts +37 -3
- package/src/server/serverFns/__tests__/update-document-guard.test.ts +38 -4
- package/src/server/serverFns/__tests__/update-page-guard.test.ts +40 -4
- package/src/server/serverFns/__tests__/update-seats.test.ts +33 -1
- package/src/server/serverFns/__tests__/update-story-guard.test.ts +36 -3
- package/src/server/serverFns/__tests__/update-testcase-guard.test.ts +37 -3
- package/src/server/serverFns/__tests__/workspace-kb-idor.test.ts +36 -2
- package/src/server/serverFns/__tests__/workspace-kb.test.ts +36 -2
- package/src/server/serverFns/__tests__/workspace.test.ts +34 -1
- package/src/server/serverFns/activity.ts +10 -14
- package/src/server/serverFns/agents/agent-crud.ts +16 -15
- package/src/server/serverFns/agents/bindings.ts +12 -13
- package/src/server/serverFns/agents/skill-crud.ts +16 -15
- package/src/server/serverFns/ai/code-mode-readiness.ts +3 -4
- package/src/server/serverFns/ai/search-capability.ts +3 -4
- package/src/server/serverFns/anyhub/app.ts +10 -14
- package/src/server/serverFns/anyhub/index.ts +7 -10
- package/src/server/serverFns/anyhub/install.ts +4 -4
- package/src/server/serverFns/anyhub/permissions.ts +10 -14
- package/src/server/serverFns/anyhub/proxy.ts +4 -6
- package/src/server/serverFns/auth/email-verification.ts +4 -5
- package/src/server/serverFns/auth/session.ts +9 -0
- package/src/server/serverFns/billing.ts +18 -28
- package/src/server/serverFns/blob-upload.ts +6 -9
- package/src/server/serverFns/bug/__tests__/bug-access-tokens.test.ts +34 -1
- package/src/server/serverFns/bug/__tests__/bug-activities.test.ts +34 -1
- package/src/server/serverFns/bug/__tests__/bug-comments.test.ts +34 -1
- package/src/server/serverFns/bug/__tests__/bug-crud.test.ts +34 -1
- package/src/server/serverFns/bug/__tests__/bug-fix.test.ts +34 -1
- package/src/server/serverFns/bug/__tests__/bug-groups.test.ts +34 -1
- package/src/server/serverFns/bug/__tests__/bug-reactions.test.ts +34 -1
- package/src/server/serverFns/bug/__tests__/bug-reorder.test.ts +39 -5
- package/src/server/serverFns/bug/__tests__/bug-repro.test.ts +34 -1
- package/src/server/serverFns/bug/__tests__/bug-story.test.ts +34 -1
- package/src/server/serverFns/bug/__tests__/bug-webhooks.test.ts +34 -1
- package/src/server/serverFns/bug/bug-access-tokens.ts +16 -22
- package/src/server/serverFns/bug/bug-activities.ts +4 -6
- package/src/server/serverFns/bug/bug-collect-tokens.ts +13 -18
- package/src/server/serverFns/bug/bug-comments.ts +13 -18
- package/src/server/serverFns/bug/bug-crud/detail.ts +10 -14
- package/src/server/serverFns/bug/bug-crud.ts +28 -38
- package/src/server/serverFns/bug/bug-display-options.ts +8 -11
- package/src/server/serverFns/bug/bug-export.ts +5 -7
- package/src/server/serverFns/bug/bug-fix.ts +10 -14
- package/src/server/serverFns/bug/bug-groups.ts +10 -14
- package/src/server/serverFns/bug/bug-reactions.ts +10 -14
- package/src/server/serverFns/bug/bug-reorder.ts +4 -6
- package/src/server/serverFns/bug/bug-repro.ts +8 -11
- package/src/server/serverFns/bug/bug-story-bulk.ts +13 -18
- package/src/server/serverFns/bug/bug-story.ts +10 -14
- package/src/server/serverFns/bug/bug-views.ts +12 -18
- package/src/server/serverFns/bug/bug-webhooks.ts +13 -18
- package/src/server/serverFns/bug/test-bug-confirm.ts +7 -10
- package/src/server/serverFns/changelog/__tests__/fetch.test.ts +40 -1
- package/src/server/serverFns/changelog/fetch.ts +4 -6
- package/src/server/serverFns/chat/conversations.ts +17 -28
- package/src/server/serverFns/chat/list-messages.ts +4 -7
- package/src/server/serverFns/collab-presence.ts +11 -13
- package/src/server/serverFns/collab-snapshot.ts +6 -7
- package/src/server/serverFns/collab.ts +7 -7
- package/src/server/serverFns/compliance.ts +8 -8
- package/src/server/serverFns/design/__tests__/comments.test.ts +54 -10
- package/src/server/serverFns/design/__tests__/designs.test.ts +39 -16
- package/src/server/serverFns/design/__tests__/page-versions.test.ts +52 -14
- package/src/server/serverFns/design/__tests__/shares-password.test.ts +44 -14
- package/src/server/serverFns/design/__tests__/shares.test.ts +44 -14
- package/src/server/serverFns/design/__tests__/versions.test.ts +44 -14
- package/src/server/serverFns/design/ai/__tests__/agent-conversations.test.ts +50 -21
- package/src/server/serverFns/design/ai/__tests__/providers.test.ts +42 -8
- package/src/server/serverFns/design/ai/agent-conversations.ts +19 -26
- package/src/server/serverFns/design/ai/fill-annotation.ts +5 -7
- package/src/server/serverFns/design/ai/generate-prototype.ts +5 -7
- package/src/server/serverFns/design/ai/hosted-models.ts +4 -5
- package/src/server/serverFns/design/ai/providers.ts +30 -39
- package/src/server/serverFns/design/ai/source-mode.ts +10 -12
- package/src/server/serverFns/design/comments.ts +14 -13
- package/src/server/serverFns/design/designs.ts +13 -19
- package/src/server/serverFns/design/page-versions.ts +17 -18
- package/src/server/serverFns/design/pages.ts +17 -18
- package/src/server/serverFns/design/reviews.ts +8 -9
- package/src/server/serverFns/design/shares-password.ts +13 -19
- package/src/server/serverFns/design/shares.ts +22 -31
- package/src/server/serverFns/design/versions.ts +8 -9
- package/src/server/serverFns/harness/__tests__/attach-prototype.spec.ts +52 -2
- package/src/server/serverFns/harness/__tests__/attach-to-kb.spec.ts +52 -2
- package/src/server/serverFns/harness/__tests__/attach-to-story-ssrf.spec.ts +52 -2
- package/src/server/serverFns/harness/__tests__/attach-to-story.spec.ts +52 -2
- package/src/server/serverFns/harness/__tests__/cancel-run.test.ts +40 -15
- package/src/server/serverFns/harness/__tests__/extract-attachment.spec.ts +52 -2
- package/src/server/serverFns/harness/__tests__/gallery.spec.ts +76 -12
- package/src/server/serverFns/harness/__tests__/github-workspace.spec.ts +38 -6
- package/src/server/serverFns/harness/__tests__/media-prototype.spec.ts +50 -6
- package/src/server/serverFns/harness/__tests__/media.spec.ts +55 -11
- package/src/server/serverFns/harness/__tests__/sandbox-policy.test.ts +41 -16
- package/src/server/serverFns/harness/__tests__/workspace-files.test.ts +41 -16
- package/src/server/serverFns/harness/attach-prototype.ts +4 -4
- package/src/server/serverFns/harness/attach-to-kb.ts +4 -4
- package/src/server/serverFns/harness/attach-to-story.ts +4 -4
- package/src/server/serverFns/harness/cancel-run.ts +4 -6
- package/src/server/serverFns/harness/extract-attachment.ts +3 -4
- package/src/server/serverFns/harness/gallery.ts +19 -23
- package/src/server/serverFns/harness/github-workspace.ts +14 -21
- package/src/server/serverFns/harness/media.ts +18 -117
- package/src/server/serverFns/harness/sandbox-policy.ts +11 -10
- package/src/server/serverFns/harness/search-mention-candidates.ts +4 -6
- package/src/server/serverFns/harness/workspace-files.ts +19 -26
- package/src/server/serverFns/iteration/__tests__/iteration-auto-schedule.test.ts +35 -3
- package/src/server/serverFns/iteration/__tests__/iteration-crud.test.ts +35 -3
- package/src/server/serverFns/iteration/__tests__/iteration-stories.test.ts +35 -3
- package/src/server/serverFns/iteration/__tests__/iteration-transfer.test.ts +35 -3
- package/src/server/serverFns/iteration/iteration-auto-schedule.ts +7 -10
- package/src/server/serverFns/iteration/iteration-burndown.ts +4 -6
- package/src/server/serverFns/iteration/iteration-crud.ts +26 -35
- package/src/server/serverFns/iteration/iteration-stories.ts +10 -14
- package/src/server/serverFns/iteration/iteration-transfer.ts +4 -6
- package/src/server/serverFns/knowledge/public/bookmarks/categories.ts +11 -15
- package/src/server/serverFns/knowledge/public/bookmarks/create.ts +4 -6
- package/src/server/serverFns/knowledge/public/bookmarks/delete.ts +5 -7
- package/src/server/serverFns/knowledge/public/bookmarks/detail.ts +4 -6
- package/src/server/serverFns/knowledge/public/bookmarks/favorite.ts +4 -6
- package/src/server/serverFns/knowledge/public/bookmarks/list.ts +4 -6
- package/src/server/serverFns/knowledge/public/bookmarks/refresh-favicon.ts +4 -6
- package/src/server/serverFns/knowledge/public/bookmarks/share.ts +4 -6
- package/src/server/serverFns/knowledge/public/bookmarks/sync-github.ts +5 -7
- package/src/server/serverFns/knowledge/public/bookmarks/unshare.ts +4 -6
- package/src/server/serverFns/knowledge/public/bookmarks/update.ts +6 -8
- package/src/server/serverFns/knowledge/public/compliance/create.ts +4 -6
- package/src/server/serverFns/knowledge/public/compliance/delete.ts +5 -7
- package/src/server/serverFns/knowledge/public/compliance/detail.ts +4 -6
- package/src/server/serverFns/knowledge/public/compliance/list.ts +4 -6
- package/src/server/serverFns/knowledge/public/compliance/share.ts +4 -6
- package/src/server/serverFns/knowledge/public/compliance/unshare.ts +4 -6
- package/src/server/serverFns/knowledge/public/compliance/update.ts +5 -7
- package/src/server/serverFns/knowledge/public/dictionary/create.ts +4 -6
- package/src/server/serverFns/knowledge/public/dictionary/delete.ts +5 -7
- package/src/server/serverFns/knowledge/public/dictionary/detail.ts +4 -6
- package/src/server/serverFns/knowledge/public/dictionary/list.ts +4 -6
- package/src/server/serverFns/knowledge/public/dictionary/share.ts +4 -6
- package/src/server/serverFns/knowledge/public/dictionary/unshare.ts +4 -6
- package/src/server/serverFns/knowledge/public/dictionary/update.ts +5 -7
- package/src/server/serverFns/knowledge/public/entity-tags.ts +4 -6
- package/src/server/serverFns/knowledge/public/favorite.ts +7 -10
- package/src/server/serverFns/knowledge/public/legal/create.ts +4 -6
- package/src/server/serverFns/knowledge/public/legal/delete.ts +5 -7
- package/src/server/serverFns/knowledge/public/legal/detail.ts +4 -6
- package/src/server/serverFns/knowledge/public/legal/list.ts +4 -6
- package/src/server/serverFns/knowledge/public/legal/share.ts +4 -6
- package/src/server/serverFns/knowledge/public/legal/unshare.ts +4 -6
- package/src/server/serverFns/knowledge/public/legal/update.ts +5 -7
- package/src/server/serverFns/knowledge-index.ts +12 -16
- package/src/server/serverFns/knowledge.ts +50 -67
- package/src/server/serverFns/notifications.ts +25 -34
- package/src/server/serverFns/plugins/harness-plugins.ts +16 -23
- package/src/server/serverFns/project/module-overview.ts +7 -10
- package/src/server/serverFns/project.ts +48 -68
- package/src/server/serverFns/references/create.ts +4 -6
- package/src/server/serverFns/references/resolve.ts +4 -6
- package/src/server/serverFns/references/search.ts +4 -6
- package/src/server/serverFns/share/design/[designId]/events.ts +4 -6
- package/src/server/serverFns/sso.ts +1 -1
- package/src/server/serverFns/story/__tests__/bulk.test.ts +34 -1
- package/src/server/serverFns/story/__tests__/story-assoc.test.ts +34 -1
- package/src/server/serverFns/story/__tests__/story-attachments.test.ts +34 -1
- package/src/server/serverFns/story/__tests__/story-crud-date-key.test.ts +42 -17
- package/src/server/serverFns/story/__tests__/story-dependencies.test.ts +34 -1
- package/src/server/serverFns/story/__tests__/story-gantt-deps.test.ts +34 -1
- package/src/server/serverFns/story/__tests__/story-groups.test.ts +34 -1
- package/src/server/serverFns/story/__tests__/story-read-path-authz.test.ts +40 -4
- package/src/server/serverFns/story/__tests__/story-search.test.ts +34 -1
- package/src/server/serverFns/story/__tests__/story-transfer.test.ts +34 -1
- package/src/server/serverFns/story/link-preview.ts +5 -7
- package/src/server/serverFns/story/story-assoc.ts +28 -38
- package/src/server/serverFns/story/story-attachments.ts +7 -10
- package/src/server/serverFns/story/story-children.ts +4 -6
- package/src/server/serverFns/story/story-comments.ts +13 -18
- package/src/server/serverFns/story/story-crud/activities.ts +4 -6
- package/src/server/serverFns/story/story-crud/archive.ts +7 -10
- package/src/server/serverFns/story/story-crud/bulk.ts +10 -14
- package/src/server/serverFns/story/story-crud/detail.ts +7 -10
- package/src/server/serverFns/story/story-crud/label-suggest.ts +4 -6
- package/src/server/serverFns/story/story-crud/labels.ts +6 -9
- package/src/server/serverFns/story/story-crud/user-brief.ts +4 -6
- package/src/server/serverFns/story/story-crud.ts +13 -18
- package/src/server/serverFns/story/story-dependencies.ts +16 -22
- package/src/server/serverFns/story/story-groups.ts +10 -14
- package/src/server/serverFns/story/story-links.ts +13 -18
- package/src/server/serverFns/story/story-reactions.ts +13 -18
- package/src/server/serverFns/story/story-search.ts +7 -10
- package/src/server/serverFns/story/story-transfer.ts +10 -14
- package/src/server/serverFns/story/story-tree.ts +7 -10
- package/src/server/serverFns/story-display-options.ts +7 -8
- package/src/server/serverFns/story-view.ts +12 -18
- package/src/server/serverFns/tasks/task-crud.ts +13 -17
- package/src/server/serverFns/tasks/task-queries.ts +12 -18
- package/src/server/serverFns/team.ts +46 -66
- package/src/server/serverFns/testcase/__tests__/automation.test.ts +38 -5
- package/src/server/serverFns/testcase/__tests__/evidence-upload.test.ts +37 -3
- package/src/server/serverFns/testcase/__tests__/generation.test.ts +38 -5
- package/src/server/serverFns/testcase/__tests__/plans.test.ts +36 -3
- package/src/server/serverFns/testcase/__tests__/regression.test.ts +36 -3
- package/src/server/serverFns/testcase/__tests__/run-cases.test.ts +36 -3
- package/src/server/serverFns/testcase/__tests__/runs.test.ts +36 -3
- package/src/server/serverFns/testcase/__tests__/stats.test.ts +36 -3
- package/src/server/serverFns/testcase/__tests__/testcase-board.test.ts +39 -5
- package/src/server/serverFns/testcase/__tests__/testcase-crud.test.ts +36 -3
- package/src/server/serverFns/testcase/__tests__/testcase-folders.test.ts +36 -3
- package/src/server/serverFns/testcase/__tests__/testcase-groups.test.ts +38 -5
- package/src/server/serverFns/testcase/automation.ts +13 -17
- package/src/server/serverFns/testcase/bulk.ts +10 -14
- package/src/server/serverFns/testcase/evidence-upload.ts +5 -7
- package/src/server/serverFns/testcase/generation.ts +10 -13
- package/src/server/serverFns/testcase/plans.ts +23 -31
- package/src/server/serverFns/testcase/regression.ts +7 -10
- package/src/server/serverFns/testcase/run-cases.ts +13 -18
- package/src/server/serverFns/testcase/runs.ts +13 -18
- package/src/server/serverFns/testcase/stats.ts +13 -18
- package/src/server/serverFns/testcase/testcase-activities.ts +4 -6
- package/src/server/serverFns/testcase/testcase-board.ts +4 -6
- package/src/server/serverFns/testcase/testcase-crud.ts +20 -27
- package/src/server/serverFns/testcase/testcase-display-options.ts +8 -11
- package/src/server/serverFns/testcase/testcase-export.ts +5 -7
- package/src/server/serverFns/testcase/testcase-filter-views.ts +12 -18
- package/src/server/serverFns/testcase/testcase-folders.ts +16 -22
- package/src/server/serverFns/testcase/testcase-groups.ts +4 -6
- package/src/server/serverFns/testcase/testcase-reorder.ts +4 -6
- package/src/server/serverFns/translation.ts +4 -6
- package/src/server/serverFns/user/avatar.ts +4 -6
- package/src/server/serverFns/user/settings.ts +4 -6
- package/src/server/serverFns/user/update-locale.ts +4 -6
- package/src/server/serverFns/workspace-kb.ts +26 -35
- package/src/server/serverFns/workspace.ts +43 -59
- package/src/server/serverFns/ws.ts +4 -6
- package/src/server/serverfn-public-allowlist.ts +117 -0
- package/src/server/story/types.ts +0 -1
- package/src/server/sync/__tests__/scopes.test.ts +64 -0
- package/src/server/sync/scopes.ts +7 -0
- package/src/server/testcase/__tests__/auto-bug.test.ts +44 -12
- package/src/__tests__/bench/baselines/format-timestamp.json +0 -44
- package/src/__typeprobe__.d.ts +0 -4
- package/src/components/forms/app-form-dialog.tsx +0 -126
- package/src/components/forms/hooks/use-form-submit.ts +0 -57
- package/src/components/forms/types.ts +0 -34
- package/src/components/harness/code/workspace-picker.tsx +0 -239
- package/src/components/tiptap/extensions/local-file/insert-local-file.ts +0 -35
- package/src/components/tiptap/extensions/local-file/local-file-node.ts +0 -71
- package/src/devframe-docks/ai-chat-iframe.tsx +0 -29
- package/src/devframe-docks/session-iframe.tsx +0 -90
- package/src/lib/__tests__/desktop-detect.test.ts +0 -19
- package/src/lib/collections/index.ts +0 -22
- package/src/lib/collections/knowledge/index.ts +0 -18
- package/src/lib/collections/knowledge/knowledge-bases-collection.ts +0 -34
- package/src/lib/collections/reference/bookmark-categories-collection.ts +0 -31
- package/src/lib/collections/reference/labels-collection.ts +0 -31
- package/src/lib/collections/reference/projects-collection.ts +0 -31
- package/src/lib/collections/reference/users-brief-collection.ts +0 -35
- package/src/lib/collections/reference/workspaces-collection.ts +0 -34
- package/src/lib/desktop-detect.ts +0 -29
- package/src/paraglide/messages/en.js +0 -28260
- package/src/paraglide/messages/zh.js +0 -28258
|
@@ -17,9 +17,8 @@
|
|
|
17
17
|
|
|
18
18
|
import { getPrisma } from "@allbluecn/database/get-prisma"
|
|
19
19
|
import { createServerFn } from '@tanstack/react-start'
|
|
20
|
-
import { getRequest } from '@tanstack/react-start/server'
|
|
21
20
|
import { z } from 'zod'
|
|
22
|
-
import {
|
|
21
|
+
import { authContextMiddleware } from '@/server/middlewares/auth-context'
|
|
23
22
|
import { legalCanonicalId } from '@/server/knowledge/public/canonical-id'
|
|
24
23
|
import { httpUrl } from "@/server/lib/validators";
|
|
25
24
|
|
|
@@ -39,11 +38,10 @@ const createSchema = z.object({
|
|
|
39
38
|
})
|
|
40
39
|
|
|
41
40
|
export const createLegalFn = createServerFn({ method: 'POST' })
|
|
41
|
+
.middleware([authContextMiddleware])
|
|
42
42
|
.validator(createSchema)
|
|
43
|
-
.handler(async ({ data }) => {
|
|
43
|
+
.handler(async ({ data, context }) => {
|
|
44
44
|
const prisma = await getPrisma()
|
|
45
|
-
const request = getRequest()
|
|
46
|
-
const session = await requireAuth(request)
|
|
47
45
|
const result = await prisma.legalRegulation.create({
|
|
48
46
|
data: {
|
|
49
47
|
canonicalId: legalCanonicalId({ title: data.title, code: data.code }),
|
|
@@ -62,7 +60,7 @@ export const createLegalFn = createServerFn({ method: 'POST' })
|
|
|
62
60
|
sourceUrl: data.sourceUrl || null,
|
|
63
61
|
tags: data.tags,
|
|
64
62
|
visibility: 'private',
|
|
65
|
-
userId:
|
|
63
|
+
userId: context.user.id,
|
|
66
64
|
},
|
|
67
65
|
select: { id: true },
|
|
68
66
|
})
|
|
@@ -17,20 +17,18 @@
|
|
|
17
17
|
|
|
18
18
|
import { getPrisma } from "@allbluecn/database/get-prisma"
|
|
19
19
|
import { createServerFn } from '@tanstack/react-start'
|
|
20
|
-
import { getRequest } from '@tanstack/react-start/server'
|
|
21
20
|
import { z } from 'zod'
|
|
22
|
-
import {
|
|
21
|
+
import { authContextMiddleware } from '@/server/middlewares/auth-context'
|
|
23
22
|
|
|
24
23
|
export const deleteLegalFn = createServerFn({ method: 'POST' })
|
|
24
|
+
.middleware([authContextMiddleware])
|
|
25
25
|
.validator(z.object({ id: z.string() }))
|
|
26
|
-
.handler(async ({ data }) => {
|
|
26
|
+
.handler(async ({ data, context }) => {
|
|
27
27
|
const prisma = await getPrisma()
|
|
28
|
-
const request = getRequest()
|
|
29
|
-
const session = await requireAuth(request)
|
|
30
28
|
const existing = await prisma.legalRegulation.findUnique({ where: { id: data.id } })
|
|
31
29
|
if (!existing) throw new Error('未找到')
|
|
32
|
-
const isOwner = existing.userId ===
|
|
33
|
-
const isAdmin =
|
|
30
|
+
const isOwner = existing.userId === context.user.id
|
|
31
|
+
const isAdmin = context.user.role === 'ADMIN' || context.user.role === 'SUPER_ADMIN'
|
|
34
32
|
if (!isOwner && !isAdmin) throw new Error('无权限')
|
|
35
33
|
await prisma.legalRegulation.update({ where: { id: data.id }, data: { isDeleted: true } })
|
|
36
34
|
return { success: true }
|
|
@@ -17,17 +17,15 @@
|
|
|
17
17
|
|
|
18
18
|
import { getPrisma } from "@allbluecn/database/get-prisma"
|
|
19
19
|
import { createServerFn } from '@tanstack/react-start'
|
|
20
|
-
import { getRequest } from '@tanstack/react-start/server'
|
|
21
20
|
import { z } from 'zod'
|
|
22
|
-
import {
|
|
21
|
+
import { authContextMiddleware } from '@/server/middlewares/auth-context'
|
|
23
22
|
import { aggregateSharers, type PublicSharer } from '@/server/knowledge/public/share-merge'
|
|
24
23
|
|
|
25
24
|
export const getLegalDetailFn = createServerFn({ method: 'GET' })
|
|
25
|
+
.middleware([authContextMiddleware])
|
|
26
26
|
.validator(z.object({ id: z.string() }))
|
|
27
|
-
.handler(async ({ data }) => {
|
|
27
|
+
.handler(async ({ data, context }) => {
|
|
28
28
|
const prisma = await getPrisma()
|
|
29
|
-
const request = getRequest()
|
|
30
|
-
const session = await requireAuth(request)
|
|
31
29
|
const item = await prisma.legalRegulation.findFirst({
|
|
32
30
|
where: { id: data.id, isDeleted: false },
|
|
33
31
|
include: {
|
|
@@ -37,7 +35,7 @@ export const getLegalDetailFn = createServerFn({ method: 'GET' })
|
|
|
37
35
|
},
|
|
38
36
|
})
|
|
39
37
|
if (!item) throw new Error('未找到')
|
|
40
|
-
if (item.visibility === 'private' && item.userId !==
|
|
38
|
+
if (item.visibility === 'private' && item.userId !== context.user.id) {
|
|
41
39
|
throw new Error('无权限')
|
|
42
40
|
}
|
|
43
41
|
let sharers: PublicSharer[] = []
|
|
@@ -18,9 +18,8 @@
|
|
|
18
18
|
import { getPrisma } from "@allbluecn/database/get-prisma"
|
|
19
19
|
import { Prisma } from '@allbluecn/database'
|
|
20
20
|
import { createServerFn } from '@tanstack/react-start'
|
|
21
|
-
import { getRequest } from '@tanstack/react-start/server'
|
|
22
21
|
import { z } from 'zod'
|
|
23
|
-
import {
|
|
22
|
+
import { authContextMiddleware } from '@/server/middlewares/auth-context'
|
|
24
23
|
import { aggregateSharers } from '@/server/knowledge/public/share-merge'
|
|
25
24
|
|
|
26
25
|
// 法规草稿的历史占位标题(早期创建表单未填标题时的默认值,当前代码已无写入点,
|
|
@@ -39,14 +38,13 @@ const listSchema = z.object({
|
|
|
39
38
|
})
|
|
40
39
|
|
|
41
40
|
export const listLegalFn = createServerFn({ method: 'GET' })
|
|
41
|
+
.middleware([authContextMiddleware])
|
|
42
42
|
.validator(listSchema)
|
|
43
|
-
.handler(async ({ data }) => {
|
|
43
|
+
.handler(async ({ data, context }) => {
|
|
44
44
|
const prisma = await getPrisma()
|
|
45
|
-
const request = getRequest()
|
|
46
|
-
const session = await requireAuth(request)
|
|
47
45
|
const where: Prisma.LegalRegulationWhereInput = { isDeleted: false }
|
|
48
46
|
where.NOT = { title: UNNAMED_LEGAL_TITLE }
|
|
49
|
-
const userId =
|
|
47
|
+
const userId = context.user.id
|
|
50
48
|
if (data.scope === 'private') {
|
|
51
49
|
where.userId = userId
|
|
52
50
|
where.visibility = 'private'
|
|
@@ -17,18 +17,16 @@
|
|
|
17
17
|
|
|
18
18
|
import { getPrisma } from "@allbluecn/database/get-prisma"
|
|
19
19
|
import { createServerFn } from '@tanstack/react-start'
|
|
20
|
-
import { getRequest } from '@tanstack/react-start/server'
|
|
21
20
|
import { z } from 'zod'
|
|
22
|
-
import {
|
|
21
|
+
import { authContextMiddleware } from '@/server/middlewares/auth-context'
|
|
23
22
|
import { shareToPublic, type ShareResult } from '@/server/knowledge/public/share-merge'
|
|
24
23
|
|
|
25
24
|
export const shareLegalFn = createServerFn({ method: 'POST' })
|
|
25
|
+
.middleware([authContextMiddleware])
|
|
26
26
|
.validator(z.object({ id: z.string() }))
|
|
27
|
-
.handler(async ({ data }) => {
|
|
27
|
+
.handler(async ({ data, context }) => {
|
|
28
28
|
const prisma = await getPrisma()
|
|
29
|
-
const
|
|
30
|
-
const session = await requireAuth(request)
|
|
31
|
-
const userId = session.user.id
|
|
29
|
+
const userId = context.user.id
|
|
32
30
|
const source = await prisma.legalRegulation.findFirst({
|
|
33
31
|
where: { id: data.id, userId, isDeleted: false },
|
|
34
32
|
})
|
|
@@ -17,18 +17,16 @@
|
|
|
17
17
|
|
|
18
18
|
import { getPrisma } from "@allbluecn/database/get-prisma"
|
|
19
19
|
import { createServerFn } from '@tanstack/react-start'
|
|
20
|
-
import { getRequest } from '@tanstack/react-start/server'
|
|
21
20
|
import { z } from 'zod'
|
|
22
|
-
import {
|
|
21
|
+
import { authContextMiddleware } from '@/server/middlewares/auth-context'
|
|
23
22
|
|
|
24
23
|
export const unshareLegalFn = createServerFn({ method: 'POST' })
|
|
24
|
+
.middleware([authContextMiddleware])
|
|
25
25
|
.validator(z.object({ canonicalId: z.string() }))
|
|
26
|
-
.handler(async ({ data }) => {
|
|
26
|
+
.handler(async ({ data, context }) => {
|
|
27
27
|
const prisma = await getPrisma()
|
|
28
|
-
const request = getRequest()
|
|
29
|
-
const session = await requireAuth(request)
|
|
30
28
|
await prisma.knowledgeShareRecord.deleteMany({
|
|
31
|
-
where: { entityType: 'legal', canonicalId: data.canonicalId, userId:
|
|
29
|
+
where: { entityType: 'legal', canonicalId: data.canonicalId, userId: context.user.id },
|
|
32
30
|
})
|
|
33
31
|
return { success: true }
|
|
34
32
|
})
|
|
@@ -18,9 +18,8 @@
|
|
|
18
18
|
import { getPrisma } from "@allbluecn/database/get-prisma"
|
|
19
19
|
import { Prisma } from '@allbluecn/database'
|
|
20
20
|
import { createServerFn } from '@tanstack/react-start'
|
|
21
|
-
import { getRequest } from '@tanstack/react-start/server'
|
|
22
21
|
import { z } from 'zod'
|
|
23
|
-
import {
|
|
22
|
+
import { authContextMiddleware } from '@/server/middlewares/auth-context'
|
|
24
23
|
import { legalCanonicalId } from '@/server/knowledge/public/canonical-id'
|
|
25
24
|
import { httpUrl } from "@/server/lib/validators";
|
|
26
25
|
|
|
@@ -41,16 +40,15 @@ const updateSchema = z.object({
|
|
|
41
40
|
})
|
|
42
41
|
|
|
43
42
|
export const updateLegalFn = createServerFn({ method: 'POST' })
|
|
43
|
+
.middleware([authContextMiddleware])
|
|
44
44
|
.validator(updateSchema)
|
|
45
|
-
.handler(async ({ data }) => {
|
|
45
|
+
.handler(async ({ data, context }) => {
|
|
46
46
|
const prisma = await getPrisma()
|
|
47
|
-
const request = getRequest()
|
|
48
|
-
const session = await requireAuth(request)
|
|
49
47
|
const { id, code, ...rest } = data
|
|
50
48
|
const existing = await prisma.legalRegulation.findUnique({ where: { id } })
|
|
51
49
|
if (!existing) throw new Error('未找到')
|
|
52
|
-
const isOwner = existing.userId ===
|
|
53
|
-
const isAdmin =
|
|
50
|
+
const isOwner = existing.userId === context.user.id
|
|
51
|
+
const isAdmin = context.user.role === 'ADMIN' || context.user.role === 'SUPER_ADMIN'
|
|
54
52
|
if (!isOwner && !isAdmin) throw new Error('无权限')
|
|
55
53
|
|
|
56
54
|
const updateData: Prisma.LegalRegulationUncheckedUpdateInput = { ...rest }
|
|
@@ -17,9 +17,8 @@
|
|
|
17
17
|
|
|
18
18
|
import { getPrisma } from "@allbluecn/database/get-prisma"
|
|
19
19
|
import { createServerFn } from "@tanstack/react-start"
|
|
20
|
-
import { getRequest } from "@tanstack/react-start/server"
|
|
21
20
|
import { z } from "zod"
|
|
22
|
-
import {
|
|
21
|
+
import { authContextMiddleware } from "@/server/middlewares/auth-context"
|
|
23
22
|
import { getVectorStore } from "@/lib/vector-store"
|
|
24
23
|
import { checkAiRateLimit } from "@/server/lib/rate-limit"
|
|
25
24
|
import { tryAcquireReindex, releaseReindex } from "@/server/knowledge/reindex-guard"
|
|
@@ -30,18 +29,17 @@ import {
|
|
|
30
29
|
} from "@/server/knowledge/knowledge-index-utils"
|
|
31
30
|
|
|
32
31
|
export const indexKnowledgeDocumentFn = createServerFn({ method: "POST" })
|
|
32
|
+
.middleware([authContextMiddleware])
|
|
33
33
|
.validator(z.object({ documentId: z.string() }))
|
|
34
|
-
.handler(async ({ data }) => {
|
|
34
|
+
.handler(async ({ data, context }) => {
|
|
35
35
|
const prisma = await getPrisma()
|
|
36
|
-
const request = getRequest()
|
|
37
|
-
const session = await requireAuth(request)
|
|
38
36
|
// embedding 是计费 AI 调用,入口限流(审计 2026-10-25,与 AI 域同口径)
|
|
39
|
-
await checkAiRateLimit(
|
|
37
|
+
await checkAiRateLimit(context.user.id, "kbIndex")
|
|
40
38
|
const doc = await prisma.knowledgeDocument.findFirst({
|
|
41
39
|
where: {
|
|
42
40
|
id: data.documentId,
|
|
43
41
|
isDeleted: false,
|
|
44
|
-
kb: { userId:
|
|
42
|
+
kb: { userId: context.user.id, isDeleted: false },
|
|
45
43
|
},
|
|
46
44
|
select: { id: true, kbId: true, title: true, content: true },
|
|
47
45
|
})
|
|
@@ -53,17 +51,16 @@ export const indexKnowledgeDocumentFn = createServerFn({ method: "POST" })
|
|
|
53
51
|
})
|
|
54
52
|
|
|
55
53
|
export const deleteKnowledgeEmbeddingsFn = createServerFn({ method: "POST" })
|
|
54
|
+
.middleware([authContextMiddleware])
|
|
56
55
|
.validator(z.object({ documentId: z.string() }))
|
|
57
|
-
.handler(async ({ data }) => {
|
|
56
|
+
.handler(async ({ data, context }) => {
|
|
58
57
|
const prisma = await getPrisma()
|
|
59
|
-
const request = getRequest()
|
|
60
|
-
const session = await requireAuth(request)
|
|
61
58
|
// 属主校验与 indexKnowledgeDocumentFn 同口径(审计 2026-10-25:裸 documentId 可删他人全部嵌入)
|
|
62
59
|
const doc = await prisma.knowledgeDocument.findFirst({
|
|
63
60
|
where: {
|
|
64
61
|
id: data.documentId,
|
|
65
62
|
isDeleted: false,
|
|
66
|
-
kb: { userId:
|
|
63
|
+
kb: { userId: context.user.id, isDeleted: false },
|
|
67
64
|
},
|
|
68
65
|
select: { id: true },
|
|
69
66
|
})
|
|
@@ -74,15 +71,14 @@ export const deleteKnowledgeEmbeddingsFn = createServerFn({ method: "POST" })
|
|
|
74
71
|
})
|
|
75
72
|
|
|
76
73
|
export const reindexKnowledgeBaseFn = createServerFn({ method: "POST" })
|
|
74
|
+
.middleware([authContextMiddleware])
|
|
77
75
|
.validator(z.object({ kbId: z.string() }))
|
|
78
|
-
.handler(async ({ data }) => {
|
|
76
|
+
.handler(async ({ data, context }) => {
|
|
79
77
|
const prisma = await getPrisma()
|
|
80
|
-
const request = getRequest()
|
|
81
|
-
const session = await requireAuth(request)
|
|
82
78
|
// embedding 是计费 AI 调用,入口限流(审计 2026-10-25,与 AI 域同口径)
|
|
83
|
-
await checkAiRateLimit(
|
|
79
|
+
await checkAiRateLimit(context.user.id, "kbIndex")
|
|
84
80
|
const kb = await prisma.knowledgeBase.findFirst({
|
|
85
|
-
where: { id: data.kbId, userId:
|
|
81
|
+
where: { id: data.kbId, userId: context.user.id, isDeleted: false },
|
|
86
82
|
select: { id: true },
|
|
87
83
|
})
|
|
88
84
|
if (!kb) throw new Error("未找到或无权限")
|
|
@@ -18,11 +18,10 @@
|
|
|
18
18
|
import { getPrisma } from "@allbluecn/database/get-prisma"
|
|
19
19
|
import { buildRoomName } from "@allbluecn/collab-core/rooms"
|
|
20
20
|
import { createServerFn } from '@tanstack/react-start'
|
|
21
|
-
import { getRequest } from '@tanstack/react-start/server'
|
|
22
21
|
import { z } from 'zod'
|
|
23
22
|
import { jsonSizeOk, documentIdFromEmbeddingRowId, MAX_DOC_CONTENT_JSON_CHARS, MAX_DOC_PROPERTIES_JSON_CHARS } from '@/server/knowledge/knowledge-helpers'
|
|
24
23
|
|
|
25
|
-
import {
|
|
24
|
+
import { authContextMiddleware } from '@/server/middlewares/auth-context'
|
|
26
25
|
import { indexDocumentById, resolveAiConfig, KB_EMBEDDINGS_TABLE } from '@/server/knowledge/knowledge-index-utils'
|
|
27
26
|
import { generateEmbedding } from '@/server/ai-gateway/embedding'
|
|
28
27
|
import { rerankCandidates, RECALL_MULTIPLIER } from '@/server/ai-gateway/rerank'
|
|
@@ -42,13 +41,12 @@ const READABLE_KB = (userId: string) => ({
|
|
|
42
41
|
})
|
|
43
42
|
|
|
44
43
|
export const listKnowledgeFn = createServerFn({ method: 'GET' })
|
|
44
|
+
.middleware([authContextMiddleware])
|
|
45
45
|
.validator(z.object({}).optional())
|
|
46
|
-
.handler(async () => {
|
|
46
|
+
.handler(async ({ context }) => {
|
|
47
47
|
const prisma = await getPrisma()
|
|
48
|
-
const request = getRequest()
|
|
49
|
-
const session = await requireAuth(request)
|
|
50
48
|
return prisma.knowledgeBase.findMany({
|
|
51
|
-
where: { userId:
|
|
49
|
+
where: { userId: context.user.id, isDeleted: false },
|
|
52
50
|
orderBy: [{ pinnedToSidebar: 'desc' }, { createdAt: 'asc' }],
|
|
53
51
|
select: {
|
|
54
52
|
id: true,
|
|
@@ -73,12 +71,11 @@ const createSchema = z.object({
|
|
|
73
71
|
})
|
|
74
72
|
|
|
75
73
|
export const createKnowledgeFn = createServerFn({ method: 'POST' })
|
|
74
|
+
.middleware([authContextMiddleware])
|
|
76
75
|
.validator(createSchema)
|
|
77
|
-
.handler(async ({ data }) => {
|
|
76
|
+
.handler(async ({ data, context }) => {
|
|
78
77
|
const prisma = await getPrisma()
|
|
79
|
-
const
|
|
80
|
-
const session = await requireAuth(request)
|
|
81
|
-
const userId = session.user.id
|
|
78
|
+
const userId = context.user.id
|
|
82
79
|
await requirePermission(userId, 'knowledge', 'write')
|
|
83
80
|
const kb = await prisma.$transaction(async (tx) => {
|
|
84
81
|
const knowledge = await tx.knowledgeBase.create({
|
|
@@ -109,13 +106,12 @@ export const createKnowledgeFn = createServerFn({ method: 'POST' })
|
|
|
109
106
|
const detailSchema = z.object({ id: z.string() })
|
|
110
107
|
|
|
111
108
|
export const getKnowledgeDetailFn = createServerFn({ method: 'GET' })
|
|
109
|
+
.middleware([authContextMiddleware])
|
|
112
110
|
.validator(detailSchema)
|
|
113
|
-
.handler(async ({ data }) => {
|
|
111
|
+
.handler(async ({ data, context }) => {
|
|
114
112
|
const prisma = await getPrisma()
|
|
115
|
-
const request = getRequest()
|
|
116
|
-
const session = await requireAuth(request)
|
|
117
113
|
const kb = await prisma.knowledgeBase.findFirst({
|
|
118
|
-
where: { id: data.id, ...READABLE_KB(
|
|
114
|
+
where: { id: data.id, ...READABLE_KB(context.user.id) },
|
|
119
115
|
select: { id: true, name: true, description: true, icon: true, tags: true, visibility: true, createdAt: true, updatedAt: true },
|
|
120
116
|
})
|
|
121
117
|
if (!kb) throw new Error('未找到或无权限')
|
|
@@ -125,12 +121,11 @@ export const getKnowledgeDetailFn = createServerFn({ method: 'GET' })
|
|
|
125
121
|
const deleteSchema = z.object({ id: z.string() })
|
|
126
122
|
|
|
127
123
|
export const deleteKnowledgeFn = createServerFn({ method: 'POST' })
|
|
124
|
+
.middleware([authContextMiddleware])
|
|
128
125
|
.validator(deleteSchema)
|
|
129
|
-
.handler(async ({ data }) => {
|
|
126
|
+
.handler(async ({ data, context }) => {
|
|
130
127
|
const prisma = await getPrisma()
|
|
131
|
-
const
|
|
132
|
-
const session = await requireAuth(request)
|
|
133
|
-
const userId = session.user.id
|
|
128
|
+
const userId = context.user.id
|
|
134
129
|
await requirePermission(userId, 'knowledge', 'write')
|
|
135
130
|
// DB-03:属主校验合并进软删(updateMany 计数判定),1 次查询替代 2 次并消除 TOCTOU。
|
|
136
131
|
// DB-07:审计经 pro-service 独立连接(OSS 为 no-op)且自带 try/catch best-effort 语义,
|
|
@@ -154,12 +149,11 @@ const updateSchema = z.object({
|
|
|
154
149
|
})
|
|
155
150
|
|
|
156
151
|
export const updateKnowledgeFn = createServerFn({ method: 'POST' })
|
|
152
|
+
.middleware([authContextMiddleware])
|
|
157
153
|
.validator(updateSchema)
|
|
158
|
-
.handler(async ({ data }) => {
|
|
154
|
+
.handler(async ({ data, context }) => {
|
|
159
155
|
const prisma = await getPrisma()
|
|
160
|
-
const
|
|
161
|
-
const session = await requireAuth(request)
|
|
162
|
-
const userId = session.user.id
|
|
156
|
+
const userId = context.user.id
|
|
163
157
|
await requirePermission(userId, 'knowledge', 'write')
|
|
164
158
|
// DB-03:属主校验合并进写入(updateManyAndReturn 单查询返回更新行)
|
|
165
159
|
const rows = await prisma.knowledgeBase.updateManyAndReturn({
|
|
@@ -179,15 +173,14 @@ export const updateKnowledgeFn = createServerFn({ method: 'POST' })
|
|
|
179
173
|
})
|
|
180
174
|
|
|
181
175
|
export const listDocumentsFn = createServerFn({ method: 'GET' })
|
|
176
|
+
.middleware([authContextMiddleware])
|
|
182
177
|
.validator(z.object({ kbId: z.string() }))
|
|
183
|
-
.handler(async ({ data }) => {
|
|
178
|
+
.handler(async ({ data, context }) => {
|
|
184
179
|
const prisma = await getPrisma()
|
|
185
|
-
const request = getRequest()
|
|
186
|
-
const session = await requireAuth(request)
|
|
187
180
|
// 读口径与 createDocumentFn(READABLE_KB)统一(审计 2026-10-25 🟠):
|
|
188
181
|
// 在他人 team/general KB 里建的文档必须能被列出,否则协作链路断裂
|
|
189
182
|
const kb = await prisma.knowledgeBase.findFirst({
|
|
190
|
-
where: { id: data.kbId, ...READABLE_KB(
|
|
183
|
+
where: { id: data.kbId, ...READABLE_KB(context.user.id) },
|
|
191
184
|
select: { id: true },
|
|
192
185
|
})
|
|
193
186
|
if (!kb) throw new Error('未找到或无权限')
|
|
@@ -218,15 +211,14 @@ const createDocSchema = z.object({
|
|
|
218
211
|
})
|
|
219
212
|
|
|
220
213
|
export const createDocumentFn = createServerFn({ method: 'POST' })
|
|
214
|
+
.middleware([authContextMiddleware])
|
|
221
215
|
.validator(createDocSchema)
|
|
222
|
-
.handler(async ({ data }) => {
|
|
216
|
+
.handler(async ({ data, context }) => {
|
|
223
217
|
const prisma = await getPrisma()
|
|
224
|
-
const
|
|
225
|
-
const session = await requireAuth(request)
|
|
226
|
-
const userId = session.user.id
|
|
218
|
+
const userId = context.user.id
|
|
227
219
|
await requirePermission(userId, 'knowledge', 'write')
|
|
228
220
|
const kb = await prisma.knowledgeBase.findFirst({
|
|
229
|
-
where: { id: data.kbId, ...READABLE_KB(
|
|
221
|
+
where: { id: data.kbId, ...READABLE_KB(context.user.id) },
|
|
230
222
|
select: { id: true },
|
|
231
223
|
})
|
|
232
224
|
if (!kb) throw new Error('未找到或无权限')
|
|
@@ -266,17 +258,16 @@ export const createDocumentFn = createServerFn({ method: 'POST' })
|
|
|
266
258
|
const getDocSchema = z.object({ id: z.string() })
|
|
267
259
|
|
|
268
260
|
export const getDocumentFn = createServerFn({ method: 'GET' })
|
|
261
|
+
.middleware([authContextMiddleware])
|
|
269
262
|
.validator(getDocSchema)
|
|
270
|
-
.handler(async ({ data }) => {
|
|
263
|
+
.handler(async ({ data, context }) => {
|
|
271
264
|
const prisma = await getPrisma()
|
|
272
|
-
const request = getRequest()
|
|
273
|
-
const session = await requireAuth(request)
|
|
274
265
|
const doc = await prisma.knowledgeDocument.findFirst({
|
|
275
266
|
where: {
|
|
276
267
|
id: data.id,
|
|
277
268
|
isDeleted: false,
|
|
278
269
|
// 读口径与 createDocumentFn(READABLE_KB)统一(审计 2026-10-25 🟠)
|
|
279
|
-
kb: READABLE_KB(
|
|
270
|
+
kb: READABLE_KB(context.user.id),
|
|
280
271
|
},
|
|
281
272
|
select: {
|
|
282
273
|
id: true,
|
|
@@ -322,12 +313,11 @@ const updateDocSchema = z
|
|
|
322
313
|
})
|
|
323
314
|
|
|
324
315
|
export const updateDocumentFn = createServerFn({ method: 'POST' })
|
|
316
|
+
.middleware([authContextMiddleware])
|
|
325
317
|
.validator(updateDocSchema)
|
|
326
|
-
.handler(async ({ data }) => {
|
|
318
|
+
.handler(async ({ data, context }) => {
|
|
327
319
|
const prisma = await getPrisma()
|
|
328
|
-
const
|
|
329
|
-
const session = await requireAuth(request)
|
|
330
|
-
const userId = session.user.id
|
|
320
|
+
const userId = context.user.id
|
|
331
321
|
await requirePermission(userId, 'knowledge', 'write')
|
|
332
322
|
// ── Yjs 多人协作 §5.3 写入门卫(任务 17):CollabDocument 存在且 patch 含
|
|
333
323
|
// content → 一律转发 collab 内部通道(room 活跃判定在 collab 侧:在线应用
|
|
@@ -469,12 +459,11 @@ export const updateDocumentFn = createServerFn({ method: 'POST' })
|
|
|
469
459
|
const deleteDocSchema = z.object({ id: z.string() })
|
|
470
460
|
|
|
471
461
|
export const deleteDocumentFn = createServerFn({ method: 'POST' })
|
|
462
|
+
.middleware([authContextMiddleware])
|
|
472
463
|
.validator(deleteDocSchema)
|
|
473
|
-
.handler(async ({ data }) => {
|
|
464
|
+
.handler(async ({ data, context }) => {
|
|
474
465
|
const prisma = await getPrisma()
|
|
475
|
-
const
|
|
476
|
-
const session = await requireAuth(request)
|
|
477
|
-
const userId = session.user.id
|
|
466
|
+
const userId = context.user.id
|
|
478
467
|
await requirePermission(userId, 'knowledge', 'write')
|
|
479
468
|
// 首页判定需回读行字段(isHomepage),属主校验走单查询 findFirst(行复用)
|
|
480
469
|
const doc = await assertOwned(
|
|
@@ -518,14 +507,13 @@ export const deleteDocumentFn = createServerFn({ method: 'POST' })
|
|
|
518
507
|
})
|
|
519
508
|
|
|
520
509
|
export const getHomepageDocumentFn = createServerFn({ method: 'GET' })
|
|
510
|
+
.middleware([authContextMiddleware])
|
|
521
511
|
.validator(z.object({ kbId: z.string() }))
|
|
522
|
-
.handler(async ({ data }) => {
|
|
512
|
+
.handler(async ({ data, context }) => {
|
|
523
513
|
const prisma = await getPrisma()
|
|
524
|
-
const request = getRequest()
|
|
525
|
-
const session = await requireAuth(request)
|
|
526
514
|
// 读口径与 createDocumentFn(READABLE_KB)统一(审计 2026-10-25 🟠)
|
|
527
515
|
const kb = await prisma.knowledgeBase.findFirst({
|
|
528
|
-
where: { id: data.kbId, ...READABLE_KB(
|
|
516
|
+
where: { id: data.kbId, ...READABLE_KB(context.user.id) },
|
|
529
517
|
select: { id: true },
|
|
530
518
|
})
|
|
531
519
|
if (!kb) throw new Error('未找到或无权限')
|
|
@@ -536,14 +524,13 @@ export const getHomepageDocumentFn = createServerFn({ method: 'GET' })
|
|
|
536
524
|
})
|
|
537
525
|
|
|
538
526
|
export const getDocBreadcrumbFn = createServerFn({ method: 'GET' })
|
|
527
|
+
.middleware([authContextMiddleware])
|
|
539
528
|
.validator(z.object({ docId: z.string(), kbId: z.string() }))
|
|
540
|
-
.handler(async ({ data }) => {
|
|
529
|
+
.handler(async ({ data, context }) => {
|
|
541
530
|
const prisma = await getPrisma()
|
|
542
|
-
const request = getRequest()
|
|
543
|
-
const session = await requireAuth(request)
|
|
544
531
|
// 读口径与 createDocumentFn(READABLE_KB)统一(审计 2026-10-25 🟠)
|
|
545
532
|
const kb = await prisma.knowledgeBase.findFirst({
|
|
546
|
-
where: { id: data.kbId, ...READABLE_KB(
|
|
533
|
+
where: { id: data.kbId, ...READABLE_KB(context.user.id) },
|
|
547
534
|
select: { id: true },
|
|
548
535
|
})
|
|
549
536
|
if (!kb) throw new Error('未找到或无权限')
|
|
@@ -642,12 +629,11 @@ const searchPublicKnowledge = async (
|
|
|
642
629
|
}
|
|
643
630
|
|
|
644
631
|
export const searchDocumentsFn = createServerFn({ method: 'GET' })
|
|
632
|
+
.middleware([authContextMiddleware])
|
|
645
633
|
.validator(z.object({ query: z.string(), currentKbId: z.string().optional() }))
|
|
646
|
-
.handler(async ({ data }) => {
|
|
634
|
+
.handler(async ({ data, context }) => {
|
|
647
635
|
const prisma = await getPrisma()
|
|
648
|
-
const
|
|
649
|
-
const session = await requireAuth(request)
|
|
650
|
-
const userId = session.user.id
|
|
636
|
+
const userId = context.user.id
|
|
651
637
|
const { query, currentKbId } = data
|
|
652
638
|
|
|
653
639
|
const kbs = await prisma.knowledgeBase.findMany({
|
|
@@ -728,14 +714,13 @@ export const searchDocumentsFn = createServerFn({ method: 'GET' })
|
|
|
728
714
|
})
|
|
729
715
|
|
|
730
716
|
export const listKbProjectsFn = createServerFn({ method: 'GET' })
|
|
717
|
+
.middleware([authContextMiddleware])
|
|
731
718
|
.validator(z.object({ kbId: z.string() }))
|
|
732
|
-
.handler(async ({ data }) => {
|
|
719
|
+
.handler(async ({ data, context }) => {
|
|
733
720
|
const prisma = await getPrisma()
|
|
734
|
-
const request = getRequest()
|
|
735
|
-
const session = await requireAuth(request)
|
|
736
721
|
await assertOwned(
|
|
737
722
|
prisma.knowledgeBase,
|
|
738
|
-
{ where: { id: data.kbId, ...READABLE_KB(
|
|
723
|
+
{ where: { id: data.kbId, ...READABLE_KB(context.user.id) }, select: { id: true } },
|
|
739
724
|
'知识库不存在',
|
|
740
725
|
)
|
|
741
726
|
const rows = await prisma.projectKnowledgeBase.findMany({
|
|
@@ -747,12 +732,11 @@ export const listKbProjectsFn = createServerFn({ method: 'GET' })
|
|
|
747
732
|
})
|
|
748
733
|
|
|
749
734
|
export const setKbProjectsFn = createServerFn({ method: 'POST' })
|
|
735
|
+
.middleware([authContextMiddleware])
|
|
750
736
|
.validator(z.object({ kbId: z.string(), projectIds: z.array(z.string()) }))
|
|
751
|
-
.handler(async ({ data }) => {
|
|
737
|
+
.handler(async ({ data, context }) => {
|
|
752
738
|
const prisma = await getPrisma()
|
|
753
|
-
const
|
|
754
|
-
const session = await requireAuth(request)
|
|
755
|
-
const userId = session.user.id
|
|
739
|
+
const userId = context.user.id
|
|
756
740
|
// 与其他知识库写路径同口径(审计 2026-10-25:其他写路径均有,此处曾漏)
|
|
757
741
|
await requirePermission(userId, 'knowledge', 'write')
|
|
758
742
|
const kb = await prisma.knowledgeBase.findFirst({
|
|
@@ -784,12 +768,11 @@ const togglePinSchema = z.object({
|
|
|
784
768
|
})
|
|
785
769
|
|
|
786
770
|
export const toggleKnowledgePinFn = createServerFn({ method: 'POST' })
|
|
771
|
+
.middleware([authContextMiddleware])
|
|
787
772
|
.validator(togglePinSchema)
|
|
788
|
-
.handler(async ({ data }) => {
|
|
773
|
+
.handler(async ({ data, context }) => {
|
|
789
774
|
const prisma = await getPrisma()
|
|
790
|
-
const
|
|
791
|
-
const session = await requireAuth(request)
|
|
792
|
-
const userId = session.user.id
|
|
775
|
+
const userId = context.user.id
|
|
793
776
|
// DB-03:属主校验合并进写入(updateManyAndReturn 单查询返回更新行)
|
|
794
777
|
const rows = await prisma.knowledgeBase.updateManyAndReturn({
|
|
795
778
|
where: { id: data.kbId, userId, isDeleted: false },
|