@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 { resolveStoryScopeProjectIds } from "@/server/builtin-project";
|
|
24
23
|
import { STORY_LIST_SELECT, castStoryUsers, ACTIVITY_SELECT, toActivityItem } from "@/server/story/types";
|
|
25
24
|
import type { Prisma } from "@allbluecn/database";
|
|
@@ -76,6 +75,7 @@ async function graphReaches(
|
|
|
76
75
|
}
|
|
77
76
|
|
|
78
77
|
export const addDependenciesFn = createServerFn({ method: "POST" })
|
|
78
|
+
.middleware([authContextMiddleware])
|
|
79
79
|
.validator(
|
|
80
80
|
z.object({
|
|
81
81
|
items: z
|
|
@@ -89,11 +89,9 @@ export const addDependenciesFn = createServerFn({ method: "POST" })
|
|
|
89
89
|
.min(1),
|
|
90
90
|
}),
|
|
91
91
|
)
|
|
92
|
-
.handler(async ({ data }) => {
|
|
92
|
+
.handler(async ({ data, context }) => {
|
|
93
93
|
const prisma = await getPrisma()
|
|
94
|
-
const
|
|
95
|
-
const session = await requireAuth(request);
|
|
96
|
-
const userId = session.user.id;
|
|
94
|
+
const userId = context.user.id;
|
|
97
95
|
|
|
98
96
|
// 本批全部端点需求的项目成员资格(SEC-03:防跨项目建依赖边)
|
|
99
97
|
await assertStoriesProjectMember(
|
|
@@ -196,6 +194,7 @@ export const addDependenciesFn = createServerFn({ method: "POST" })
|
|
|
196
194
|
});
|
|
197
195
|
|
|
198
196
|
export const updateDependencyFn = createServerFn({ method: "POST" })
|
|
197
|
+
.middleware([authContextMiddleware])
|
|
199
198
|
.validator(
|
|
200
199
|
z.object({
|
|
201
200
|
depId: z.string(),
|
|
@@ -204,11 +203,9 @@ export const updateDependencyFn = createServerFn({ method: "POST" })
|
|
|
204
203
|
type: edgeTypeSchema,
|
|
205
204
|
}),
|
|
206
205
|
)
|
|
207
|
-
.handler(async ({ data }) => {
|
|
206
|
+
.handler(async ({ data, context }) => {
|
|
208
207
|
const prisma = await getPrisma()
|
|
209
|
-
const
|
|
210
|
-
const session = await requireAuth(request);
|
|
211
|
-
const userId = session.user.id;
|
|
208
|
+
const userId = context.user.id;
|
|
212
209
|
|
|
213
210
|
const dep = await prisma.storyDependency.findUnique({ where: { id: data.depId } });
|
|
214
211
|
if (!dep) throw new Error("依赖关系不存在");
|
|
@@ -272,12 +269,11 @@ export const updateDependencyFn = createServerFn({ method: "POST" })
|
|
|
272
269
|
});
|
|
273
270
|
|
|
274
271
|
export const removeDependencyFn = createServerFn({ method: "POST" })
|
|
272
|
+
.middleware([authContextMiddleware])
|
|
275
273
|
.validator(z.object({ depId: z.string() }))
|
|
276
|
-
.handler(async ({ data }) => {
|
|
274
|
+
.handler(async ({ data, context }) => {
|
|
277
275
|
const prisma = await getPrisma()
|
|
278
|
-
const
|
|
279
|
-
const session = await requireAuth(request);
|
|
280
|
-
const userId = session.user.id;
|
|
276
|
+
const userId = context.user.id;
|
|
281
277
|
|
|
282
278
|
const dep = await prisma.storyDependency.findUnique({ where: { id: data.depId } });
|
|
283
279
|
if (!dep) return null;
|
|
@@ -308,12 +304,11 @@ export const removeDependencyFn = createServerFn({ method: "POST" })
|
|
|
308
304
|
});
|
|
309
305
|
|
|
310
306
|
export const getDependenciesFn = createServerFn({ method: "GET" })
|
|
307
|
+
.middleware([authContextMiddleware])
|
|
311
308
|
.validator(z.object({ storyId: z.string() }))
|
|
312
|
-
.handler(async ({ data }) => {
|
|
309
|
+
.handler(async ({ data, context }) => {
|
|
313
310
|
const prisma = await getPrisma()
|
|
314
|
-
|
|
315
|
-
const session = await requireAuth(request);
|
|
316
|
-
await assertStoryProjectMember(data.storyId, session.user.id);
|
|
311
|
+
await assertStoryProjectMember(data.storyId, context.user.id);
|
|
317
312
|
|
|
318
313
|
const deps = await prisma.storyDependency.findMany({
|
|
319
314
|
where: { OR: [{ targetId: data.storyId }, { sourceId: data.storyId }] },
|
|
@@ -351,12 +346,11 @@ export const getDependenciesFn = createServerFn({ method: "GET" })
|
|
|
351
346
|
|
|
352
347
|
// 甘特图依赖箭头数据源(列表/分组场景):按项目范围聚合批量取依赖边
|
|
353
348
|
export const listStoryDependenciesFn = createServerFn({ method: "GET" })
|
|
349
|
+
.middleware([authContextMiddleware])
|
|
354
350
|
.validator(z.object({ projectId: z.string().optional() }))
|
|
355
|
-
.handler(async ({ data }) => {
|
|
351
|
+
.handler(async ({ data, context }) => {
|
|
356
352
|
const prisma = await getPrisma();
|
|
357
|
-
const
|
|
358
|
-
const session = await requireAuth(request);
|
|
359
|
-
const userId = session.user.id;
|
|
353
|
+
const userId = context.user.id;
|
|
360
354
|
|
|
361
355
|
// 「全部项目」聚合语义:缺省 → 成员关系内全部 projectId;显式 → 单元素数组(含鉴权)
|
|
362
356
|
const projectIds = await resolveStoryScopeProjectIds(data.projectId, userId);
|
|
@@ -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 { resolveStoryScopeProjectIds } from "@/server/builtin-project";
|
|
24
23
|
import { GROUP_KEYS, ORDER_KEYS, ORDER_DIRECTIONS, resolveOrderDir } from "@/shared/list-kit/display-values";
|
|
25
24
|
import type { GroupKey, OrderKey } from "@/shared/list-kit/display-types";
|
|
@@ -57,12 +56,11 @@ const schema = z.object({
|
|
|
57
56
|
});
|
|
58
57
|
|
|
59
58
|
export const listStoriesInGroupFn = createServerFn({ method: "GET" })
|
|
59
|
+
.middleware([authContextMiddleware])
|
|
60
60
|
.validator(schema)
|
|
61
|
-
.handler(async ({ data }) => {
|
|
61
|
+
.handler(async ({ data, context }) => {
|
|
62
62
|
const prisma = await getPrisma()
|
|
63
|
-
const
|
|
64
|
-
const session = await requireAuth(request);
|
|
65
|
-
const userId = session.user.id;
|
|
63
|
+
const userId = context.user.id;
|
|
66
64
|
|
|
67
65
|
const projectIds = await resolveStoryScopeProjectIds(data.projectId, userId);
|
|
68
66
|
|
|
@@ -120,12 +118,11 @@ const allGroupsItemsSchema = z.object({
|
|
|
120
118
|
});
|
|
121
119
|
|
|
122
120
|
export const listAllGroupsItemsFn = createServerFn({ method: "GET" })
|
|
121
|
+
.middleware([authContextMiddleware])
|
|
123
122
|
.validator(allGroupsItemsSchema)
|
|
124
|
-
.handler(async ({ data }) => {
|
|
123
|
+
.handler(async ({ data, context }) => {
|
|
125
124
|
const prisma = await getPrisma()
|
|
126
|
-
const
|
|
127
|
-
const session = await requireAuth(request);
|
|
128
|
-
const userId = session.user.id;
|
|
125
|
+
const userId = context.user.id;
|
|
129
126
|
|
|
130
127
|
const projectIds = await resolveStoryScopeProjectIds(data.projectId, userId);
|
|
131
128
|
|
|
@@ -235,12 +232,11 @@ function sortGroupKeys(groupBy: GroupKey, keys: string[]): string[] {
|
|
|
235
232
|
}
|
|
236
233
|
|
|
237
234
|
export const listStoryGroupsFn = createServerFn({ method: "GET" })
|
|
235
|
+
.middleware([authContextMiddleware])
|
|
238
236
|
.validator(listGroupsSchema)
|
|
239
|
-
.handler(async ({ data }) => {
|
|
237
|
+
.handler(async ({ data, context }) => {
|
|
240
238
|
const prisma = await getPrisma()
|
|
241
|
-
const
|
|
242
|
-
const session = await requireAuth(request);
|
|
243
|
-
const userId = session.user.id;
|
|
239
|
+
const userId = context.user.id;
|
|
244
240
|
|
|
245
241
|
const projectIds = await resolveStoryScopeProjectIds(data.projectId, userId);
|
|
246
242
|
|
|
@@ -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 { ACTIVITY_SELECT, toActivityItem } from "@/server/story/types";
|
|
24
23
|
import { assertStoryProjectMember, assertStoryProjectMembership as assertProjectMembership } from "@/server/story/permissions";
|
|
25
24
|
import { httpUrl } from "@/server/lib/validators";
|
|
@@ -27,12 +26,11 @@ import { httpUrl } from "@/server/lib/validators";
|
|
|
27
26
|
|
|
28
27
|
|
|
29
28
|
export const addLinkFn = createServerFn({ method: "POST" })
|
|
29
|
+
.middleware([authContextMiddleware])
|
|
30
30
|
.validator(z.object({ storyId: z.string(), url: httpUrl, title: z.string().optional(), description: z.string().optional() }))
|
|
31
|
-
.handler(async ({ data }) => {
|
|
31
|
+
.handler(async ({ data, context }) => {
|
|
32
32
|
const prisma = await getPrisma()
|
|
33
|
-
const
|
|
34
|
-
const session = await requireAuth(request);
|
|
35
|
-
const userId = session.user.id;
|
|
33
|
+
const userId = context.user.id;
|
|
36
34
|
|
|
37
35
|
await assertStoryProjectMember(data.storyId, userId);
|
|
38
36
|
|
|
@@ -59,12 +57,11 @@ export const addLinkFn = createServerFn({ method: "POST" })
|
|
|
59
57
|
});
|
|
60
58
|
|
|
61
59
|
export const updateLinkFn = createServerFn({ method: "POST" })
|
|
60
|
+
.middleware([authContextMiddleware])
|
|
62
61
|
.validator(z.object({ linkId: z.string(), url: httpUrl.optional(), title: z.string().optional(), description: z.string().optional() }))
|
|
63
|
-
.handler(async ({ data }) => {
|
|
62
|
+
.handler(async ({ data, context }) => {
|
|
64
63
|
const prisma = await getPrisma()
|
|
65
|
-
const
|
|
66
|
-
const session = await requireAuth(request);
|
|
67
|
-
const userId = session.user.id;
|
|
64
|
+
const userId = context.user.id;
|
|
68
65
|
|
|
69
66
|
// 反查链接所属需求的项目成员资格(SEC-03:防改他人需求的链接)
|
|
70
67
|
const existing = await prisma.storyLink.findUnique({
|
|
@@ -97,12 +94,11 @@ export const updateLinkFn = createServerFn({ method: "POST" })
|
|
|
97
94
|
});
|
|
98
95
|
|
|
99
96
|
export const removeLinkFn = createServerFn({ method: "POST" })
|
|
97
|
+
.middleware([authContextMiddleware])
|
|
100
98
|
.validator(z.object({ linkId: z.string() }))
|
|
101
|
-
.handler(async ({ data }) => {
|
|
99
|
+
.handler(async ({ data, context }) => {
|
|
102
100
|
const prisma = await getPrisma()
|
|
103
|
-
const
|
|
104
|
-
const session = await requireAuth(request);
|
|
105
|
-
const userId = session.user.id;
|
|
101
|
+
const userId = context.user.id;
|
|
106
102
|
|
|
107
103
|
const link = await prisma.storyLink.findUnique({
|
|
108
104
|
where: { id: data.linkId },
|
|
@@ -131,12 +127,11 @@ export const removeLinkFn = createServerFn({ method: "POST" })
|
|
|
131
127
|
});
|
|
132
128
|
|
|
133
129
|
export const getLinksFn = createServerFn({ method: "GET" })
|
|
130
|
+
.middleware([authContextMiddleware])
|
|
134
131
|
.validator(z.object({ storyId: z.string() }))
|
|
135
|
-
.handler(async ({ data }) => {
|
|
132
|
+
.handler(async ({ data, context }) => {
|
|
136
133
|
const prisma = await getPrisma()
|
|
137
|
-
|
|
138
|
-
const session = await requireAuth(request);
|
|
139
|
-
await assertStoryProjectMember(data.storyId, session.user.id);
|
|
134
|
+
await assertStoryProjectMember(data.storyId, context.user.id);
|
|
140
135
|
|
|
141
136
|
const links = await prisma.storyLink.findMany({
|
|
142
137
|
where: { storyId: data.storyId },
|
|
@@ -17,21 +17,19 @@
|
|
|
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 { aggregateReactions } from "@/server/story/types";
|
|
24
23
|
import { assertStoryProjectMember, assertStoryProjectMembership as assertProjectMembership } from "@/server/story/permissions";
|
|
25
24
|
|
|
26
25
|
|
|
27
26
|
|
|
28
27
|
export const listStoryReactionsFn = createServerFn({ method: "GET" })
|
|
28
|
+
.middleware([authContextMiddleware])
|
|
29
29
|
.validator(z.object({ storyId: z.string() }))
|
|
30
|
-
.handler(async ({ data }) => {
|
|
30
|
+
.handler(async ({ data, context }) => {
|
|
31
31
|
const prisma = await getPrisma()
|
|
32
|
-
const
|
|
33
|
-
const session = await requireAuth(request);
|
|
34
|
-
const userId = session.user.id;
|
|
32
|
+
const userId = context.user.id;
|
|
35
33
|
await assertStoryProjectMember(data.storyId, userId);
|
|
36
34
|
|
|
37
35
|
const reactions = await prisma.storyReaction.findMany({
|
|
@@ -43,12 +41,11 @@ export const listStoryReactionsFn = createServerFn({ method: "GET" })
|
|
|
43
41
|
});
|
|
44
42
|
|
|
45
43
|
export const addStoryReactionFn = createServerFn({ method: "POST" })
|
|
44
|
+
.middleware([authContextMiddleware])
|
|
46
45
|
.validator(z.object({ storyId: z.string(), emoji: z.string().min(1) }))
|
|
47
|
-
.handler(async ({ data }) => {
|
|
46
|
+
.handler(async ({ data, context }) => {
|
|
48
47
|
const prisma = await getPrisma()
|
|
49
|
-
const
|
|
50
|
-
const session = await requireAuth(request);
|
|
51
|
-
const userId = session.user.id;
|
|
48
|
+
const userId = context.user.id;
|
|
52
49
|
|
|
53
50
|
await assertStoryProjectMember(data.storyId, userId);
|
|
54
51
|
|
|
@@ -75,12 +72,11 @@ export const addStoryReactionFn = createServerFn({ method: "POST" })
|
|
|
75
72
|
});
|
|
76
73
|
|
|
77
74
|
export const toggleStoryReactionFn = createServerFn({ method: "POST" })
|
|
75
|
+
.middleware([authContextMiddleware])
|
|
78
76
|
.validator(z.object({ storyId: z.string(), emoji: z.string().min(1) }))
|
|
79
|
-
.handler(async ({ data }) => {
|
|
77
|
+
.handler(async ({ data, context }) => {
|
|
80
78
|
const prisma = await getPrisma()
|
|
81
|
-
const
|
|
82
|
-
const session = await requireAuth(request);
|
|
83
|
-
const userId = session.user.id;
|
|
79
|
+
const userId = context.user.id;
|
|
84
80
|
|
|
85
81
|
await assertStoryProjectMember(data.storyId, userId);
|
|
86
82
|
|
|
@@ -111,12 +107,11 @@ export const toggleStoryReactionFn = createServerFn({ method: "POST" })
|
|
|
111
107
|
});
|
|
112
108
|
|
|
113
109
|
export const toggleCommentReactionFn = createServerFn({ method: "POST" })
|
|
110
|
+
.middleware([authContextMiddleware])
|
|
114
111
|
.validator(z.object({ commentId: z.string(), emoji: z.string().min(1) }))
|
|
115
|
-
.handler(async ({ data }) => {
|
|
112
|
+
.handler(async ({ data, context }) => {
|
|
116
113
|
const prisma = await getPrisma()
|
|
117
|
-
const
|
|
118
|
-
const session = await requireAuth(request);
|
|
119
|
-
const userId = session.user.id;
|
|
114
|
+
const userId = context.user.id;
|
|
120
115
|
|
|
121
116
|
// 反查评论所属需求的项目成员资格(SEC-03:防对他人需求评论表态)
|
|
122
117
|
const comment = await prisma.storyComment.findUnique({
|
|
@@ -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 { ensureBuiltinIndependentProject, resolveStoryScopeProjectId } from "@/server/builtin-project";
|
|
24
23
|
|
|
25
24
|
export const searchStoriesFn = createServerFn({ method: "GET" })
|
|
25
|
+
.middleware([authContextMiddleware])
|
|
26
26
|
.validator(z.object({ query: z.string(), excludeIds: z.array(z.string()).optional(), projectId: z.string().optional() }))
|
|
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
|
// R11:可选 projectId scope(BUG 详情关联需求选择器按 bug 所属项目搜索)。
|
|
33
31
|
// 不传保持既有行为(用户独立项目);传无效/非成员项目时
|
|
34
32
|
// resolveStoryScopeProjectId 静默回退独立项目,与列表 scope 解析同口径。
|
|
@@ -69,15 +67,14 @@ const reorderStoriesSchema = z.object({
|
|
|
69
67
|
});
|
|
70
68
|
|
|
71
69
|
export const reorderStoriesFn = createServerFn({ method: "POST" })
|
|
70
|
+
.middleware([authContextMiddleware])
|
|
72
71
|
.validator(reorderStoriesSchema)
|
|
73
|
-
.handler(async ({ data }) => {
|
|
72
|
+
.handler(async ({ data, context }) => {
|
|
74
73
|
const prisma = await getPrisma()
|
|
75
|
-
const request = getRequest();
|
|
76
|
-
const session = await requireAuth(request);
|
|
77
74
|
// 可见性过滤进 where(SEC-03:防跨项目改他人需求排序);updateMany 对
|
|
78
75
|
// 越权/不存在 id 静默跳过,不中断整批合法排序
|
|
79
76
|
const memberships = await prisma.projectMember.findMany({
|
|
80
|
-
where: { userId:
|
|
77
|
+
where: { userId: context.user.id, status: { not: "suspended" } },
|
|
81
78
|
select: { projectId: true },
|
|
82
79
|
});
|
|
83
80
|
const visibleProjectIds = memberships.map((m) => m.projectId);
|
|
@@ -17,11 +17,10 @@
|
|
|
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
21
|
import { buildRoomName } from "@allbluecn/collab-core/rooms";
|
|
23
22
|
import type { Prisma } from "@allbluecn/database";
|
|
24
|
-
import {
|
|
23
|
+
import { authContextMiddleware } from "@/server/middlewares/auth-context"
|
|
25
24
|
import { BUILTIN_INDEPENDENT_DISPLAY_ID } from "@/lib/builtin-project";
|
|
26
25
|
import { resolveStoryScopeProjectId } from "@/server/builtin-project";
|
|
27
26
|
import { withCollabGuard } from "@/server/collab/write-guard";
|
|
@@ -139,12 +138,11 @@ const transferToProjectSchema = z.object({
|
|
|
139
138
|
});
|
|
140
139
|
|
|
141
140
|
export const transferStoryToProjectFn = createServerFn({ method: "POST" })
|
|
141
|
+
.middleware([authContextMiddleware])
|
|
142
142
|
.validator(transferToProjectSchema)
|
|
143
|
-
.handler(async ({ data }) => {
|
|
143
|
+
.handler(async ({ data, context }) => {
|
|
144
144
|
const prisma = await getPrisma()
|
|
145
|
-
const
|
|
146
|
-
const session = await requireAuth(request);
|
|
147
|
-
const userId = session.user.id;
|
|
145
|
+
const userId = context.user.id;
|
|
148
146
|
|
|
149
147
|
return runTransferWithIdentifierRetry(async (tx) => {
|
|
150
148
|
const existing = await tx.story.findUnique({
|
|
@@ -222,12 +220,11 @@ const transferAsChildSchema = z.object({
|
|
|
222
220
|
});
|
|
223
221
|
|
|
224
222
|
export const transferStoryAsChildFn = createServerFn({ method: "POST" })
|
|
223
|
+
.middleware([authContextMiddleware])
|
|
225
224
|
.validator(transferAsChildSchema)
|
|
226
|
-
.handler(async ({ data }) => {
|
|
225
|
+
.handler(async ({ data, context }) => {
|
|
227
226
|
const prisma = await getPrisma()
|
|
228
|
-
const
|
|
229
|
-
const session = await requireAuth(request);
|
|
230
|
-
const userId = session.user.id;
|
|
227
|
+
const userId = context.user.id;
|
|
231
228
|
|
|
232
229
|
if (data.storyId === data.parentStoryId) {
|
|
233
230
|
throw new Error("不能将需求设为自身的子需求");
|
|
@@ -420,12 +417,11 @@ const listProjectStoriesSchema = z.object({
|
|
|
420
417
|
});
|
|
421
418
|
|
|
422
419
|
export const listProjectStoriesFn = createServerFn({ method: "GET" })
|
|
420
|
+
.middleware([authContextMiddleware])
|
|
423
421
|
.validator(listProjectStoriesSchema)
|
|
424
|
-
.handler(async ({ data }) => {
|
|
422
|
+
.handler(async ({ data, context }) => {
|
|
425
423
|
const prisma = await getPrisma()
|
|
426
|
-
const
|
|
427
|
-
const session = await requireAuth(request);
|
|
428
|
-
const userId = session.user.id;
|
|
424
|
+
const userId = context.user.id;
|
|
429
425
|
|
|
430
426
|
// 读门槛与列表 scope 同口径(SEC-03):传 projectId 走 resolveStoryScopeProjectId
|
|
431
427
|
// (非成员静默回退独立项目);不传(「全部项目」选择器)只返回用户为有效成员的项目
|
|
@@ -19,21 +19,19 @@
|
|
|
19
19
|
// 无 rootId 时返回全部项目的根需求全字段(跨项目泄露)、二者均无成员校验。可从 git 恢复。
|
|
20
20
|
import { getPrisma } from "@allbluecn/database/get-prisma"
|
|
21
21
|
import { createServerFn } from "@tanstack/react-start";
|
|
22
|
-
import { getRequest } from "@tanstack/react-start/server";
|
|
23
22
|
import { z } from "zod";
|
|
24
23
|
import { buildRoomName } from "@allbluecn/collab-core/rooms";
|
|
25
|
-
import {
|
|
24
|
+
import { authContextMiddleware } from "@/server/middlewares/auth-context"
|
|
26
25
|
import { withCollabGuard } from "@/server/collab/write-guard";
|
|
27
26
|
import { checkDescendant } from "@/server/story/types";
|
|
28
27
|
import { assertStoryProjectMembership as assertProjectMembership } from "@/server/story/permissions";
|
|
29
28
|
|
|
30
29
|
export const addChildFn = createServerFn({ method: "POST" })
|
|
30
|
+
.middleware([authContextMiddleware])
|
|
31
31
|
.validator(z.object({ parentId: z.string(), childId: z.string() }))
|
|
32
|
-
.handler(async ({ data }) => {
|
|
32
|
+
.handler(async ({ data, context }) => {
|
|
33
33
|
const prisma = await getPrisma()
|
|
34
|
-
const
|
|
35
|
-
const session = await requireAuth(request);
|
|
36
|
-
const userId = session.user.id;
|
|
34
|
+
const userId = context.user.id;
|
|
37
35
|
|
|
38
36
|
const existingChild = await prisma.story.findUnique({
|
|
39
37
|
where: { id: data.childId },
|
|
@@ -119,12 +117,11 @@ export const addChildFn = createServerFn({ method: "POST" })
|
|
|
119
117
|
});
|
|
120
118
|
|
|
121
119
|
export const removeChildFn = createServerFn({ method: "POST" })
|
|
120
|
+
.middleware([authContextMiddleware])
|
|
122
121
|
.validator(z.object({ childId: z.string() }))
|
|
123
|
-
.handler(async ({ data }) => {
|
|
122
|
+
.handler(async ({ data, context }) => {
|
|
124
123
|
const prisma = await getPrisma()
|
|
125
|
-
const
|
|
126
|
-
const session = await requireAuth(request);
|
|
127
|
-
const userId = session.user.id;
|
|
124
|
+
const userId = context.user.id;
|
|
128
125
|
|
|
129
126
|
const existing = await prisma.story.findUnique({
|
|
130
127
|
where: { id: data.childId },
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
import { getPrisma } from "@allbluecn/database/get-prisma"
|
|
20
20
|
import { createServerFn } from "@tanstack/react-start"
|
|
21
21
|
import { getRequest } from "@tanstack/react-start/server"
|
|
22
|
-
import {
|
|
22
|
+
import { authContextMiddleware } from '@/server/middlewares/auth-context'
|
|
23
23
|
import { requireFeature } from "@/server/entitlements"
|
|
24
24
|
import { isProEdition } from "@/server/pro-services"
|
|
25
25
|
import { toJsonInput } from "@/server/lib/prisma-json"
|
|
@@ -102,12 +102,11 @@ function parseStoredOptions(raw: unknown): DisplayOptions {
|
|
|
102
102
|
// story-view.ts 共用单一来源,审计 🔵/🟡 2026-10-25)
|
|
103
103
|
|
|
104
104
|
/** 获取当前用户持久化的 Display Options(非法/缺失字段已回退默认值) */
|
|
105
|
-
export const getStoryDisplayOptionsFn = createServerFn({ method: "GET" }).handler(
|
|
106
|
-
async () => {
|
|
105
|
+
export const getStoryDisplayOptionsFn = createServerFn({ method: "GET" }).middleware([authContextMiddleware]).handler(
|
|
106
|
+
async ({ context }) => {
|
|
107
107
|
const prisma = await getPrisma()
|
|
108
108
|
const request = getRequest()
|
|
109
|
-
const
|
|
110
|
-
const userId = session.user.id
|
|
109
|
+
const userId = context.user.id
|
|
111
110
|
|
|
112
111
|
const user = await prisma.user.findUnique({
|
|
113
112
|
where: { id: userId },
|
|
@@ -134,12 +133,12 @@ export const getStoryDisplayOptionsFn = createServerFn({ method: "GET" }).handle
|
|
|
134
133
|
|
|
135
134
|
/** 保存当前用户的 Display Options,返回更新后的完整对象 */
|
|
136
135
|
export const updateStoryDisplayOptionsFn = createServerFn({ method: "POST" })
|
|
136
|
+
.middleware([authContextMiddleware])
|
|
137
137
|
.validator(displayOptionsSchema)
|
|
138
|
-
.handler(async ({ data }) => {
|
|
138
|
+
.handler(async ({ data, context }) => {
|
|
139
139
|
const prisma = await getPrisma()
|
|
140
140
|
const request = getRequest()
|
|
141
|
-
const
|
|
142
|
-
const userId = session.user.id
|
|
141
|
+
const userId = context.user.id
|
|
143
142
|
|
|
144
143
|
// 服务端强制校验:pageSize > 200(500/1000)为 Pro 专属,前端锁定只是 UX
|
|
145
144
|
// OSS 环境直接 cap 到 200;Pro 环境走 feature gate
|
|
@@ -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 { toJsonInput } from "@/server/lib/prisma-json";
|
|
24
23
|
import { displayOptionsSchema } from "@/server/lib/display-options-schema";
|
|
25
24
|
import { toSavedView } from "@/components/story/views/view-types";
|
|
@@ -40,11 +39,9 @@ const SELECT = {
|
|
|
40
39
|
updatedAt: true,
|
|
41
40
|
} satisfies Prisma.StoryFilterViewDefaultArgs["select"];
|
|
42
41
|
|
|
43
|
-
export const listStoryViewsFn = createServerFn({ method: "GET" }).handler(async () => {
|
|
42
|
+
export const listStoryViewsFn = createServerFn({ method: "GET" }).middleware([authContextMiddleware]).handler(async ({ context }) => {
|
|
44
43
|
const prisma = await getPrisma()
|
|
45
|
-
const
|
|
46
|
-
const session = await requireAuth(request);
|
|
47
|
-
const userId = session.user.id;
|
|
44
|
+
const userId = context.user.id;
|
|
48
45
|
const rows = await prisma.storyFilterView.findMany({
|
|
49
46
|
where: { userId },
|
|
50
47
|
orderBy: { sortOrder: "asc" },
|
|
@@ -74,12 +71,11 @@ const createSchema = z.object({
|
|
|
74
71
|
});
|
|
75
72
|
|
|
76
73
|
export const createStoryViewFn = createServerFn({ method: "POST" })
|
|
74
|
+
.middleware([authContextMiddleware])
|
|
77
75
|
.validator(createSchema)
|
|
78
|
-
.handler(async ({ data }) => {
|
|
76
|
+
.handler(async ({ data, context }) => {
|
|
79
77
|
const prisma = await getPrisma()
|
|
80
|
-
const
|
|
81
|
-
const session = await requireAuth(request);
|
|
82
|
-
const userId = session.user.id;
|
|
78
|
+
const userId = context.user.id;
|
|
83
79
|
// 写入闸门:非法形状(缺 orderDir/pageSize 等)在落库前被拒
|
|
84
80
|
const displayOptions = displayOptionsSchema.parse(data.displayOptions);
|
|
85
81
|
const row = await prisma.storyFilterView.create({
|
|
@@ -108,12 +104,11 @@ const updateSchema = z.object({
|
|
|
108
104
|
});
|
|
109
105
|
|
|
110
106
|
export const updateStoryViewFn = createServerFn({ method: "POST" })
|
|
107
|
+
.middleware([authContextMiddleware])
|
|
111
108
|
.validator(updateSchema)
|
|
112
|
-
.handler(async ({ data }) => {
|
|
109
|
+
.handler(async ({ data, context }) => {
|
|
113
110
|
const prisma = await getPrisma()
|
|
114
|
-
const
|
|
115
|
-
const session = await requireAuth(request);
|
|
116
|
-
const userId = session.user.id;
|
|
111
|
+
const userId = context.user.id;
|
|
117
112
|
const { id, ...patch } = data;
|
|
118
113
|
const data2: Record<string, unknown> = {};
|
|
119
114
|
if (patch.name !== undefined) data2.name = patch.name;
|
|
@@ -135,12 +130,11 @@ export const updateStoryViewFn = createServerFn({ method: "POST" })
|
|
|
135
130
|
const deleteSchema = z.object({ id: z.string() });
|
|
136
131
|
|
|
137
132
|
export const deleteStoryViewFn = createServerFn({ method: "POST" })
|
|
133
|
+
.middleware([authContextMiddleware])
|
|
138
134
|
.validator(deleteSchema)
|
|
139
|
-
.handler(async ({ data }) => {
|
|
135
|
+
.handler(async ({ data, context }) => {
|
|
140
136
|
const prisma = await getPrisma()
|
|
141
|
-
const
|
|
142
|
-
const session = await requireAuth(request);
|
|
143
|
-
const userId = session.user.id;
|
|
137
|
+
const userId = context.user.id;
|
|
144
138
|
await prisma.storyFilterView.delete({ where: { id: data.id, userId } });
|
|
145
139
|
return { success: true };
|
|
146
140
|
});
|
|
@@ -4,16 +4,15 @@
|
|
|
4
4
|
// 核心)与 lookupCreateSource 等辅助逻辑一律文件内非导出成员——createAiTaskFn 的
|
|
5
5
|
// runNow 与 runAiTaskFn 复用同一个 runTaskExecution,保证两条入口的限流/占位/建
|
|
6
6
|
// run/调度执行体行为完全同款。
|
|
7
|
-
// 鉴权惯例(同 task-queries):serverFn 是独立 RPC 入口,路由层守卫拦不到,
|
|
8
|
-
//
|
|
7
|
+
// 鉴权惯例(同 task-queries):serverFn 是独立 RPC 入口,路由层守卫拦不到,
|
|
8
|
+
// 链上挂 authContextMiddleware 注入 context.user;run 入口鉴权后先过
|
|
9
9
|
// checkAiRateLimit(userId, "aiTask"),再做属主/成员校验。
|
|
10
10
|
// 并发裁决(双击防重入):updateMany 以 status:{not:"running"} 做条件更新占位,
|
|
11
11
|
// count===0 即已有在跑实例,抛「任务正在运行」,不建 run 不调执行体。
|
|
12
12
|
import { getPrisma } from "@allbluecn/database/get-prisma";
|
|
13
13
|
import { createServerFn } from "@tanstack/react-start";
|
|
14
|
-
import { getRequest } from "@tanstack/react-start/server";
|
|
15
14
|
import { z } from "zod";
|
|
16
|
-
import {
|
|
15
|
+
import { authContextMiddleware } from '@/server/middlewares/auth-context'
|
|
17
16
|
import { assertProjectMembership } from "@/server/bug/bug-permissions";
|
|
18
17
|
import { checkAiRateLimit } from "@/server/lib/rate-limit";
|
|
19
18
|
import { executeAiTaskRun } from "@/server/ai-task/executor";
|
|
@@ -142,11 +141,10 @@ const createAiTaskSchema = z
|
|
|
142
141
|
* 做最小存在性校验(仅上下文提示、非权限边界);源型落库以源条目的项目为准(run 前
|
|
143
142
|
* 成员重校验的基准,显式传值不覆盖),runNow 复用执行核心 */
|
|
144
143
|
export const createAiTaskFn = createServerFn({ method: "POST" })
|
|
144
|
+
.middleware([authContextMiddleware])
|
|
145
145
|
.validator(createAiTaskSchema)
|
|
146
|
-
.handler(async ({ data }): Promise<{ id: string; runId?: string }> => {
|
|
147
|
-
const
|
|
148
|
-
const session = await requireAuth(request);
|
|
149
|
-
const userId = session.user.id;
|
|
146
|
+
.handler(async ({ data, context }): Promise<{ id: string; runId?: string }> => {
|
|
147
|
+
const userId = context.user.id;
|
|
150
148
|
|
|
151
149
|
|
|
152
150
|
const prisma = await getPrisma();
|
|
@@ -211,13 +209,12 @@ export const createAiTaskFn = createServerFn({ method: "POST" })
|
|
|
211
209
|
return { id: task.id };
|
|
212
210
|
});
|
|
213
211
|
|
|
214
|
-
/**
|
|
212
|
+
/** 手动运行一次:鉴权 middleware → 限流 → 执行核心(属主/成员/并发占位/建 run/调度) */
|
|
215
213
|
export const runAiTaskFn = createServerFn({ method: "POST" })
|
|
214
|
+
.middleware([authContextMiddleware])
|
|
216
215
|
.validator(z.object({ id: z.string().min(1) }))
|
|
217
|
-
.handler(async ({ data }): Promise<{ runId: string }> => {
|
|
218
|
-
const
|
|
219
|
-
const session = await requireAuth(request);
|
|
220
|
-
const userId = session.user.id;
|
|
216
|
+
.handler(async ({ data, context }): Promise<{ runId: string }> => {
|
|
217
|
+
const userId = context.user.id;
|
|
221
218
|
|
|
222
219
|
await checkAiRateLimit(userId, "aiTask");
|
|
223
220
|
|
|
@@ -227,11 +224,10 @@ export const runAiTaskFn = createServerFn({ method: "POST" })
|
|
|
227
224
|
|
|
228
225
|
/** 删除任务:属主过滤 + running 拒绝;runs 级联由 schema Cascade 承担 */
|
|
229
226
|
export const deleteAiTaskFn = createServerFn({ method: "POST" })
|
|
227
|
+
.middleware([authContextMiddleware])
|
|
230
228
|
.validator(z.object({ id: z.string().min(1) }))
|
|
231
|
-
.handler(async ({ data }): Promise<{ ok: true }> => {
|
|
232
|
-
const
|
|
233
|
-
const session = await requireAuth(request);
|
|
234
|
-
const userId = session.user.id;
|
|
229
|
+
.handler(async ({ data, context }): Promise<{ ok: true }> => {
|
|
230
|
+
const userId = context.user.id;
|
|
235
231
|
|
|
236
232
|
|
|
237
233
|
const prisma = await getPrisma();
|