@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.
Files changed (500) hide show
  1. package/package.json +4 -14
  2. package/src/__tests__/integration/login-email-acceptance.test.ts +16 -0
  3. package/src/__tests__/story-view.test.ts +33 -1
  4. package/src/components/agents/__tests__/agent-bindings-tab.test.tsx +221 -0
  5. package/src/components/agents/__tests__/agents-page.test.tsx +284 -0
  6. package/src/components/agents/agent-bindings-tab.tsx +59 -45
  7. package/src/components/agents/agent-form-dialog.tsx +3 -3
  8. package/src/components/agents/agent-selector.tsx +2 -3
  9. package/src/components/agents/agents-page.tsx +66 -31
  10. package/src/components/agents/slash-skill-menu.tsx +2 -3
  11. package/src/components/auth/__tests__/session-guard.test.tsx +74 -0
  12. package/src/components/auth/session-guard.tsx +8 -0
  13. package/src/components/billing/login-prompt-dialog.tsx +1 -1
  14. package/src/components/billing/subscription-provider.tsx +2 -16
  15. package/src/components/bug/__tests__/peek-modes.test.tsx +8 -0
  16. package/src/components/bug/__tests__/subgroup-header.test.tsx +202 -40
  17. package/src/components/bug/peek-panel.tsx +5 -3
  18. package/src/components/bug/views/bug-list/group.tsx +12 -2
  19. package/src/components/bug/views/bug-list/index.tsx +94 -67
  20. package/src/components/command/command-palette.tsx +10 -9
  21. package/src/components/design/canvas/document/frame-custom-presets.ts +9 -1
  22. package/src/components/design/canvas/panels/toolbar.tsx +21 -22
  23. package/src/components/design/canvas/react/__tests__/canvas-context-load-echo.test.tsx +199 -0
  24. package/src/components/design/canvas/react/__tests__/hooks.test.tsx +17 -3
  25. package/src/components/design/canvas/react/canvas-context.tsx +47 -26
  26. package/src/components/design/canvas/react/hooks.ts +39 -34
  27. package/src/components/design/editor/layout/__tests__/collab-param-wiring.test.tsx +17 -0
  28. package/src/components/design/editor/layout/__tests__/context-menu.test.tsx +17 -1
  29. package/src/components/design/editor/layout/__tests__/no-page-save-toast.test.tsx +17 -0
  30. package/src/components/design/editor/layout/__tests__/persistence-restore.test.tsx +17 -1
  31. package/src/components/design/editor/layout/__tests__/ssr-localstorage-smoke.test.tsx +17 -1
  32. package/src/components/design/editor/layout/design-editor-layout.tsx +13 -2
  33. package/src/components/design/editor/layout/hooks/use-design-auto-save.ts +3 -19
  34. package/src/components/devtools/devtools-panel.tsx +56 -0
  35. package/src/components/forms/__tests__/create-app-form.test.tsx +131 -0
  36. package/src/components/forms/app-field-error.tsx +21 -1
  37. package/src/components/forms/app-field.tsx +8 -8
  38. package/src/components/forms/app-submit.tsx +12 -9
  39. package/src/components/forms/create-app-form.tsx +124 -0
  40. package/src/components/forms/index.ts +2 -3
  41. package/src/components/harness/__tests__/gallery-behavior.test.tsx +37 -1
  42. package/src/components/harness/__tests__/harness-workbench-first-send.test.tsx +4 -1
  43. package/src/components/harness/__tests__/message-actions.test.tsx +7 -6
  44. package/src/components/harness/__tests__/use-video-generation.test.tsx +165 -0
  45. package/src/components/harness/ai-chat-history/index.tsx +5 -3
  46. package/src/components/harness/gallery/gallery-card.tsx +57 -35
  47. package/src/components/harness/gallery/gallery-grid.tsx +32 -15
  48. package/src/components/harness/gallery/gallery-types.ts +19 -0
  49. package/src/components/harness/gallery/gallery-video-card.tsx +54 -0
  50. package/src/components/harness/gallery/types.ts +2 -0
  51. package/src/components/harness/gallery/use-video-generation.ts +95 -0
  52. package/src/components/harness/harness-workbench-page.tsx +2 -3
  53. package/src/components/harness/message-actions.tsx +5 -3
  54. package/src/components/hotkeys/shortcuts-panel.tsx +28 -13
  55. package/src/components/iteration/__tests__/burndown-chart.test.tsx +118 -0
  56. package/src/components/iteration/burndown-chart.tsx +54 -23
  57. package/src/components/knowledge/editor/__tests__/knowledge-doc-editor-collab.test.tsx +96 -0
  58. package/src/components/knowledge/editor/knowledge-doc-editor.tsx +56 -1
  59. package/src/components/knowledge/editor/mindmap-doc-editor.tsx +12 -0
  60. package/src/components/knowledge/editor/use-auto-save-channels.ts +3 -1
  61. package/src/components/layout/sidebar-03/__tests__/nav-workspace.test.tsx +0 -4
  62. package/src/components/layout/sidebar-03/nav-knowledge.tsx +11 -11
  63. package/src/components/layout/sidebar-03/nav-main.tsx +12 -15
  64. package/src/components/layout/sidebar-03/nav-notifications.tsx +5 -8
  65. package/src/components/layout/sidebar-03/nav-workspace.tsx +11 -9
  66. package/src/components/notifications/__tests__/settings-notifications.test.tsx +158 -0
  67. package/src/components/notifications/settings-notifications.tsx +37 -13
  68. package/src/components/notifications/team-notifications.tsx +10 -14
  69. package/src/components/settings/personal-team/account/__tests__/account-client.test.tsx +170 -0
  70. package/src/components/settings/personal-team/account/account-client.tsx +44 -7
  71. package/src/components/settings/personal-team/team/team-client.tsx +17 -19
  72. package/src/components/shared-kit/list-kit/__tests__/frozen-header.test.ts +210 -41
  73. package/src/components/shared-kit/list-kit/frozen-header.ts +134 -21
  74. package/src/components/shared-kit/list-kit/kanban/frozen-header.ts +20 -27
  75. package/src/components/story/__tests__/peek-panel-patch-sync.test.tsx +8 -0
  76. package/src/components/story/__tests__/story-list-table.test.tsx +214 -0
  77. package/src/components/story/columns.tsx +11 -2
  78. package/src/components/story/peek-panel.tsx +4 -2
  79. package/src/components/story/story-list-table.tsx +16 -1
  80. package/src/components/story/views/story-list/__tests__/frozen-headers.test.tsx +186 -0
  81. package/src/components/story/views/story-list/group.tsx +12 -1
  82. package/src/components/story/views/story-list/index.tsx +101 -68
  83. package/src/components/testcase/__tests__/case-row.test.tsx +134 -2
  84. package/src/components/testcase/__tests__/peek-panel.test.tsx +8 -0
  85. package/src/components/testcase/__tests__/step-editor.test.tsx +106 -0
  86. package/src/components/testcase/list/grouped-list.tsx +50 -22
  87. package/src/components/testcase/peek-panel.tsx +7 -4
  88. package/src/components/testcase/step-editor.tsx +196 -150
  89. package/src/components/tiptap/notion-like/editor-extensions.ts +0 -3
  90. package/src/components/tiptap/notion-like/notion-like-editor-header.tsx +1 -31
  91. package/src/components/tiptap/notion-like/notion-like-editor.tsx +32 -1
  92. package/src/components/workspace/__tests__/dialogs/create-workspace-dialog.test.tsx +2 -28
  93. package/src/components/workspace/__tests__/dialogs/edit-workspace-dialog.test.tsx +2 -28
  94. package/src/components/workspace/dialogs/create-workspace-dialog.tsx +45 -43
  95. package/src/components/workspace/dialogs/edit-workspace-dialog.tsx +38 -36
  96. package/src/design-engine/engine/engine-decor.ts +2 -0
  97. package/src/design-engine/engine/engine-path.ts +2 -0
  98. package/src/hooks/__tests__/use-unsaved-guard.test.tsx +180 -0
  99. package/src/hooks/use-notifications.ts +9 -16
  100. package/src/hooks/use-unsaved-guard.tsx +87 -0
  101. package/src/lib/__tests__/pacer.test.ts +33 -96
  102. package/src/lib/__tests__/query-defaults.test.ts +169 -0
  103. package/src/lib/__tests__/query-global-error.test.ts +256 -0
  104. package/src/lib/anyhub/anyhub-store.ts +2 -2
  105. package/src/lib/changelog/sdk-versions.ts +2 -10
  106. package/src/lib/collab/presence-store.ts +5 -5
  107. package/src/lib/collab/use-presence-list-refresh.ts +2 -2
  108. package/src/lib/collab/use-share-presence.ts +2 -2
  109. package/src/lib/collections/query-keys.ts +7 -2
  110. package/src/lib/commands/__tests__/command-palette-state.test.ts +12 -14
  111. package/src/lib/commands/__tests__/registry.test.ts +6 -3
  112. package/src/lib/commands/command-palette-state.ts +8 -31
  113. package/src/lib/hotkeys/__tests__/registry.test.ts +71 -18
  114. package/src/lib/hotkeys/registry.ts +188 -85
  115. package/src/lib/hotkeys/types.ts +1 -13
  116. package/src/lib/pacer.ts +1 -79
  117. package/src/lib/queries/README.md +67 -0
  118. package/src/lib/queries/__tests__/agents-queries.test.ts +101 -0
  119. package/src/lib/queries/__tests__/compliance-queries.test.ts +136 -0
  120. package/src/lib/queries/__tests__/notifications-queries.test.ts +175 -0
  121. package/src/lib/queries/__tests__/team-queries.test.ts +87 -0
  122. package/src/lib/queries/agents.ts +40 -0
  123. package/src/lib/queries/compliance.ts +69 -0
  124. package/src/lib/queries/notifications.ts +63 -0
  125. package/src/lib/queries/team.ts +39 -0
  126. package/src/lib/query-defaults.ts +8 -0
  127. package/src/lib/query-global-error.ts +128 -0
  128. package/src/lib/remote-auth-client.ts +16 -0
  129. package/src/paraglide/README.md +1 -1
  130. package/src/paraglide/messages/_index.d.ts +11 -0
  131. package/src/paraglide/messages/_index.js +5659 -88285
  132. package/src/paraglide/messages/common_error_generic.d.ts +16 -0
  133. package/src/paraglide/messages/common_error_generic.js +29 -0
  134. package/src/paraglide/messages/common_unsaved_body.d.ts +16 -0
  135. package/src/paraglide/messages/common_unsaved_body.js +29 -0
  136. package/src/paraglide/messages/common_unsaved_leave.d.ts +16 -0
  137. package/src/paraglide/messages/common_unsaved_leave.js +29 -0
  138. package/src/paraglide/messages/common_unsaved_stay.d.ts +16 -0
  139. package/src/paraglide/messages/common_unsaved_stay.js +29 -0
  140. package/src/paraglide/messages/common_unsaved_title.d.ts +16 -0
  141. package/src/paraglide/messages/common_unsaved_title.js +29 -0
  142. package/src/paraglide/messages/gallery_videofailed1.d.ts +17 -0
  143. package/src/paraglide/messages/gallery_videofailed1.js +30 -0
  144. package/src/paraglide/messages/gallery_videogenerating1.d.ts +17 -0
  145. package/src/paraglide/messages/gallery_videogenerating1.js +30 -0
  146. package/src/paraglide/messages/gallery_videomissingprompt2.d.ts +17 -0
  147. package/src/paraglide/messages/gallery_videomissingprompt2.js +30 -0
  148. package/src/paraglide/messages/gallery_videoprogress1.d.ts +19 -0
  149. package/src/paraglide/messages/gallery_videoprogress1.js +30 -0
  150. package/src/paraglide/messages/gallery_videostop1.d.ts +17 -0
  151. package/src/paraglide/messages/gallery_videostop1.js +30 -0
  152. package/src/paraglide/messages/story_table_resizecolumn1.d.ts +17 -0
  153. package/src/paraglide/messages/story_table_resizecolumn1.js +30 -0
  154. package/src/providers/index.tsx +5 -50
  155. package/src/routeTree.gen.ts +21 -0
  156. package/src/router.tsx +21 -8
  157. package/src/routes/__root.tsx +2 -1
  158. package/src/routes/__tests__/-edition-routing.test.tsx +6 -1
  159. package/src/routes/_login/forgot-password/route.lazy.tsx +7 -6
  160. package/src/routes/_login/login/route.lazy.tsx +10 -9
  161. package/src/routes/_login/register/route.lazy.tsx +19 -18
  162. package/src/routes/_login/reset-password/route.lazy.tsx +10 -9
  163. package/src/routes/_nav/knowledge/compliance/$id.lazy.tsx +9 -12
  164. package/src/routes/_nav/knowledge/compliance/index.lazy.tsx +16 -13
  165. package/src/routes/_nav/knowledge/laws/$id.lazy.tsx +1 -1
  166. package/src/routes/_nav/notifications/route.tsx +6 -16
  167. package/src/routes/_nav/settings/-settings-tabs.tsx +9 -12
  168. package/src/routes/api/generate/__tests__/media.test.ts +378 -0
  169. package/src/routes/api/generate/media.ts +179 -0
  170. package/src/server/__tests__/agent-client-graph.test.ts +0 -1
  171. package/src/server/__tests__/agent-crud.test.ts +37 -4
  172. package/src/server/__tests__/bug-groups-two-level.test.ts +34 -1
  173. package/src/server/__tests__/chat-conversations.test.ts +37 -4
  174. package/src/server/__tests__/chat-list-messages.test.ts +40 -7
  175. package/src/server/__tests__/csv-export.test.ts +36 -3
  176. package/src/server/__tests__/desktop-bootstrap.test.ts +189 -0
  177. package/src/server/__tests__/remote-auth.test.ts +72 -0
  178. package/src/server/__tests__/skill-crud.test.ts +37 -4
  179. package/src/server/__tests__/sso-domain.test.ts +1 -1
  180. package/src/server/__tests__/sso-rate-limit-singleton.test.ts +123 -0
  181. package/src/server/__tests__/task-serverfn-crud.test.ts +35 -2
  182. package/src/server/__tests__/task-serverfn-queries.test.ts +35 -2
  183. package/src/server/__tests__/testcase-board.test.ts +38 -5
  184. package/src/server/__tests__/testcase-bulk.test.ts +38 -5
  185. package/src/server/__tests__/testcase-list-scope.test.ts +38 -5
  186. package/src/server/ai-gateway/__tests__/ai-output-guard.test.ts +126 -2
  187. package/src/server/ai-gateway/__tests__/chat-stream-builder-code-mode.test.ts +4 -0
  188. package/src/server/ai-gateway/__tests__/chat-stream-builder-memory.test.ts +4 -0
  189. package/src/server/ai-gateway/__tests__/chat-stream-builder-sandbox.test.ts +4 -0
  190. package/src/server/ai-gateway/__tests__/chat-stream-builder-skills.test.ts +4 -0
  191. package/src/server/ai-gateway/__tests__/pgvector-memory-adapter.test.ts +30 -0
  192. package/src/server/ai-gateway/__tests__/pgvector-memory-conformance.test.ts +92 -0
  193. package/src/server/ai-gateway/__tests__/source-mode.test.ts +49 -8
  194. package/src/server/ai-gateway/ai-output-guard.ts +50 -2
  195. package/src/server/ai-gateway/chat-stream-builder.ts +3 -0
  196. package/src/server/ai-gateway/media/index.ts +36 -29
  197. package/src/server/ai-gateway/media/trim-input.ts +52 -0
  198. package/src/server/ai-gateway/memory/pgvector-adapter.ts +27 -13
  199. package/src/server/ai-gateway/sandbox/__tests__/harness-sandbox.test.ts +252 -41
  200. package/src/server/ai-gateway/sandbox/harness-sandbox.ts +6 -67
  201. package/src/server/ai-gateway/source-mode.ts +24 -8
  202. package/src/server/desktop-bootstrap.ts +74 -0
  203. package/src/server/lib/__tests__/rate-limit.test.ts +0 -1
  204. package/src/server/lib/rate-limit.ts +0 -2
  205. package/src/server/middlewares/__tests__/auth-context.test.ts +156 -0
  206. package/src/server/middlewares/auth-context.ts +62 -0
  207. package/src/server/remote-auth.ts +58 -31
  208. package/src/server/serverFns/__tests__/ai-hosted-models.test.ts +47 -15
  209. package/src/server/serverFns/__tests__/ai-source-mode.test.ts +45 -15
  210. package/src/server/serverFns/__tests__/billing.test.ts +37 -2
  211. package/src/server/serverFns/__tests__/collab-snapshot.test.ts +41 -14
  212. package/src/server/serverFns/__tests__/collab.test.ts +41 -14
  213. package/src/server/serverFns/__tests__/compliance.test.ts +33 -1
  214. package/src/server/serverFns/__tests__/email-verification.test.ts +35 -1
  215. package/src/server/serverFns/__tests__/knowledge-breadcrumb.test.ts +46 -6
  216. package/src/server/serverFns/__tests__/knowledge-delete.test.ts +42 -14
  217. package/src/server/serverFns/__tests__/knowledge-kb-projects.test.ts +46 -6
  218. package/src/server/serverFns/__tests__/knowledge-public-compliance.test.ts +36 -2
  219. package/src/server/serverFns/__tests__/knowledge-readable-kb.test.ts +42 -10
  220. package/src/server/serverFns/__tests__/knowledge-search.test.ts +45 -9
  221. package/src/server/serverFns/__tests__/legal-code-canonical.test.ts +36 -2
  222. package/src/server/serverFns/__tests__/link-preview.test.ts +38 -4
  223. package/src/server/serverFns/__tests__/notifications-list.test.ts +36 -3
  224. package/src/server/serverFns/__tests__/ownership-merge.test.ts +38 -4
  225. package/src/server/serverFns/__tests__/project-delete-transaction.test.ts +39 -2
  226. package/src/server/serverFns/__tests__/project-kb.test.ts +34 -1
  227. package/src/server/serverFns/__tests__/project-member-idor.test.ts +34 -1
  228. package/src/server/serverFns/__tests__/project-team-assign.test.ts +34 -1
  229. package/src/server/serverFns/__tests__/read-write-merge.test.ts +38 -4
  230. package/src/server/serverFns/__tests__/story-comments.test.ts +38 -4
  231. package/src/server/serverFns/__tests__/story-crud-archive-detail.test.ts +38 -4
  232. package/src/server/serverFns/__tests__/story-crud-labels-users.test.ts +37 -3
  233. package/src/server/serverFns/__tests__/story-crud.test.ts +36 -3
  234. package/src/server/serverFns/__tests__/story-links.test.ts +38 -4
  235. package/src/server/serverFns/__tests__/story-reactions.test.ts +38 -4
  236. package/src/server/serverFns/__tests__/story-tree.test.ts +38 -4
  237. package/src/server/serverFns/__tests__/team-accept.test.ts +34 -1
  238. package/src/server/serverFns/__tests__/team-invitation.test.ts +34 -1
  239. package/src/server/serverFns/__tests__/team-join-request.test.ts +34 -1
  240. package/src/server/serverFns/__tests__/team-members.test.ts +34 -1
  241. package/src/server/serverFns/__tests__/team-ownership-merge.test.ts +34 -1
  242. package/src/server/serverFns/__tests__/update-bug-guard.test.ts +37 -3
  243. package/src/server/serverFns/__tests__/update-document-guard.test.ts +38 -4
  244. package/src/server/serverFns/__tests__/update-page-guard.test.ts +40 -4
  245. package/src/server/serverFns/__tests__/update-seats.test.ts +33 -1
  246. package/src/server/serverFns/__tests__/update-story-guard.test.ts +36 -3
  247. package/src/server/serverFns/__tests__/update-testcase-guard.test.ts +37 -3
  248. package/src/server/serverFns/__tests__/workspace-kb-idor.test.ts +36 -2
  249. package/src/server/serverFns/__tests__/workspace-kb.test.ts +36 -2
  250. package/src/server/serverFns/__tests__/workspace.test.ts +34 -1
  251. package/src/server/serverFns/activity.ts +10 -14
  252. package/src/server/serverFns/agents/agent-crud.ts +16 -15
  253. package/src/server/serverFns/agents/bindings.ts +12 -13
  254. package/src/server/serverFns/agents/skill-crud.ts +16 -15
  255. package/src/server/serverFns/ai/code-mode-readiness.ts +3 -4
  256. package/src/server/serverFns/ai/search-capability.ts +3 -4
  257. package/src/server/serverFns/anyhub/app.ts +10 -14
  258. package/src/server/serverFns/anyhub/index.ts +7 -10
  259. package/src/server/serverFns/anyhub/install.ts +4 -4
  260. package/src/server/serverFns/anyhub/permissions.ts +10 -14
  261. package/src/server/serverFns/anyhub/proxy.ts +4 -6
  262. package/src/server/serverFns/auth/email-verification.ts +4 -5
  263. package/src/server/serverFns/auth/session.ts +9 -0
  264. package/src/server/serverFns/billing.ts +18 -28
  265. package/src/server/serverFns/blob-upload.ts +6 -9
  266. package/src/server/serverFns/bug/__tests__/bug-access-tokens.test.ts +34 -1
  267. package/src/server/serverFns/bug/__tests__/bug-activities.test.ts +34 -1
  268. package/src/server/serverFns/bug/__tests__/bug-comments.test.ts +34 -1
  269. package/src/server/serverFns/bug/__tests__/bug-crud.test.ts +34 -1
  270. package/src/server/serverFns/bug/__tests__/bug-fix.test.ts +34 -1
  271. package/src/server/serverFns/bug/__tests__/bug-groups.test.ts +34 -1
  272. package/src/server/serverFns/bug/__tests__/bug-reactions.test.ts +34 -1
  273. package/src/server/serverFns/bug/__tests__/bug-reorder.test.ts +39 -5
  274. package/src/server/serverFns/bug/__tests__/bug-repro.test.ts +34 -1
  275. package/src/server/serverFns/bug/__tests__/bug-story.test.ts +34 -1
  276. package/src/server/serverFns/bug/__tests__/bug-webhooks.test.ts +34 -1
  277. package/src/server/serverFns/bug/bug-access-tokens.ts +16 -22
  278. package/src/server/serverFns/bug/bug-activities.ts +4 -6
  279. package/src/server/serverFns/bug/bug-collect-tokens.ts +13 -18
  280. package/src/server/serverFns/bug/bug-comments.ts +13 -18
  281. package/src/server/serverFns/bug/bug-crud/detail.ts +10 -14
  282. package/src/server/serverFns/bug/bug-crud.ts +28 -38
  283. package/src/server/serverFns/bug/bug-display-options.ts +8 -11
  284. package/src/server/serverFns/bug/bug-export.ts +5 -7
  285. package/src/server/serverFns/bug/bug-fix.ts +10 -14
  286. package/src/server/serverFns/bug/bug-groups.ts +10 -14
  287. package/src/server/serverFns/bug/bug-reactions.ts +10 -14
  288. package/src/server/serverFns/bug/bug-reorder.ts +4 -6
  289. package/src/server/serverFns/bug/bug-repro.ts +8 -11
  290. package/src/server/serverFns/bug/bug-story-bulk.ts +13 -18
  291. package/src/server/serverFns/bug/bug-story.ts +10 -14
  292. package/src/server/serverFns/bug/bug-views.ts +12 -18
  293. package/src/server/serverFns/bug/bug-webhooks.ts +13 -18
  294. package/src/server/serverFns/bug/test-bug-confirm.ts +7 -10
  295. package/src/server/serverFns/changelog/__tests__/fetch.test.ts +40 -1
  296. package/src/server/serverFns/changelog/fetch.ts +4 -6
  297. package/src/server/serverFns/chat/conversations.ts +17 -28
  298. package/src/server/serverFns/chat/list-messages.ts +4 -7
  299. package/src/server/serverFns/collab-presence.ts +11 -13
  300. package/src/server/serverFns/collab-snapshot.ts +6 -7
  301. package/src/server/serverFns/collab.ts +7 -7
  302. package/src/server/serverFns/compliance.ts +8 -8
  303. package/src/server/serverFns/design/__tests__/comments.test.ts +54 -10
  304. package/src/server/serverFns/design/__tests__/designs.test.ts +39 -16
  305. package/src/server/serverFns/design/__tests__/page-versions.test.ts +52 -14
  306. package/src/server/serverFns/design/__tests__/shares-password.test.ts +44 -14
  307. package/src/server/serverFns/design/__tests__/shares.test.ts +44 -14
  308. package/src/server/serverFns/design/__tests__/versions.test.ts +44 -14
  309. package/src/server/serverFns/design/ai/__tests__/agent-conversations.test.ts +50 -21
  310. package/src/server/serverFns/design/ai/__tests__/providers.test.ts +42 -8
  311. package/src/server/serverFns/design/ai/agent-conversations.ts +19 -26
  312. package/src/server/serverFns/design/ai/fill-annotation.ts +5 -7
  313. package/src/server/serverFns/design/ai/generate-prototype.ts +5 -7
  314. package/src/server/serverFns/design/ai/hosted-models.ts +4 -5
  315. package/src/server/serverFns/design/ai/providers.ts +30 -39
  316. package/src/server/serverFns/design/ai/source-mode.ts +10 -12
  317. package/src/server/serverFns/design/comments.ts +14 -13
  318. package/src/server/serverFns/design/designs.ts +13 -19
  319. package/src/server/serverFns/design/page-versions.ts +17 -18
  320. package/src/server/serverFns/design/pages.ts +17 -18
  321. package/src/server/serverFns/design/reviews.ts +8 -9
  322. package/src/server/serverFns/design/shares-password.ts +13 -19
  323. package/src/server/serverFns/design/shares.ts +22 -31
  324. package/src/server/serverFns/design/versions.ts +8 -9
  325. package/src/server/serverFns/harness/__tests__/attach-prototype.spec.ts +52 -2
  326. package/src/server/serverFns/harness/__tests__/attach-to-kb.spec.ts +52 -2
  327. package/src/server/serverFns/harness/__tests__/attach-to-story-ssrf.spec.ts +52 -2
  328. package/src/server/serverFns/harness/__tests__/attach-to-story.spec.ts +52 -2
  329. package/src/server/serverFns/harness/__tests__/cancel-run.test.ts +40 -15
  330. package/src/server/serverFns/harness/__tests__/extract-attachment.spec.ts +52 -2
  331. package/src/server/serverFns/harness/__tests__/gallery.spec.ts +76 -12
  332. package/src/server/serverFns/harness/__tests__/github-workspace.spec.ts +38 -6
  333. package/src/server/serverFns/harness/__tests__/media-prototype.spec.ts +50 -6
  334. package/src/server/serverFns/harness/__tests__/media.spec.ts +55 -11
  335. package/src/server/serverFns/harness/__tests__/sandbox-policy.test.ts +41 -16
  336. package/src/server/serverFns/harness/__tests__/workspace-files.test.ts +41 -16
  337. package/src/server/serverFns/harness/attach-prototype.ts +4 -4
  338. package/src/server/serverFns/harness/attach-to-kb.ts +4 -4
  339. package/src/server/serverFns/harness/attach-to-story.ts +4 -4
  340. package/src/server/serverFns/harness/cancel-run.ts +4 -6
  341. package/src/server/serverFns/harness/extract-attachment.ts +3 -4
  342. package/src/server/serverFns/harness/gallery.ts +19 -23
  343. package/src/server/serverFns/harness/github-workspace.ts +14 -21
  344. package/src/server/serverFns/harness/media.ts +18 -117
  345. package/src/server/serverFns/harness/sandbox-policy.ts +11 -10
  346. package/src/server/serverFns/harness/search-mention-candidates.ts +4 -6
  347. package/src/server/serverFns/harness/workspace-files.ts +19 -26
  348. package/src/server/serverFns/iteration/__tests__/iteration-auto-schedule.test.ts +35 -3
  349. package/src/server/serverFns/iteration/__tests__/iteration-crud.test.ts +35 -3
  350. package/src/server/serverFns/iteration/__tests__/iteration-stories.test.ts +35 -3
  351. package/src/server/serverFns/iteration/__tests__/iteration-transfer.test.ts +35 -3
  352. package/src/server/serverFns/iteration/iteration-auto-schedule.ts +7 -10
  353. package/src/server/serverFns/iteration/iteration-burndown.ts +4 -6
  354. package/src/server/serverFns/iteration/iteration-crud.ts +26 -35
  355. package/src/server/serverFns/iteration/iteration-stories.ts +10 -14
  356. package/src/server/serverFns/iteration/iteration-transfer.ts +4 -6
  357. package/src/server/serverFns/knowledge/public/bookmarks/categories.ts +11 -15
  358. package/src/server/serverFns/knowledge/public/bookmarks/create.ts +4 -6
  359. package/src/server/serverFns/knowledge/public/bookmarks/delete.ts +5 -7
  360. package/src/server/serverFns/knowledge/public/bookmarks/detail.ts +4 -6
  361. package/src/server/serverFns/knowledge/public/bookmarks/favorite.ts +4 -6
  362. package/src/server/serverFns/knowledge/public/bookmarks/list.ts +4 -6
  363. package/src/server/serverFns/knowledge/public/bookmarks/refresh-favicon.ts +4 -6
  364. package/src/server/serverFns/knowledge/public/bookmarks/share.ts +4 -6
  365. package/src/server/serverFns/knowledge/public/bookmarks/sync-github.ts +5 -7
  366. package/src/server/serverFns/knowledge/public/bookmarks/unshare.ts +4 -6
  367. package/src/server/serverFns/knowledge/public/bookmarks/update.ts +6 -8
  368. package/src/server/serverFns/knowledge/public/compliance/create.ts +4 -6
  369. package/src/server/serverFns/knowledge/public/compliance/delete.ts +5 -7
  370. package/src/server/serverFns/knowledge/public/compliance/detail.ts +4 -6
  371. package/src/server/serverFns/knowledge/public/compliance/list.ts +4 -6
  372. package/src/server/serverFns/knowledge/public/compliance/share.ts +4 -6
  373. package/src/server/serverFns/knowledge/public/compliance/unshare.ts +4 -6
  374. package/src/server/serverFns/knowledge/public/compliance/update.ts +5 -7
  375. package/src/server/serverFns/knowledge/public/dictionary/create.ts +4 -6
  376. package/src/server/serverFns/knowledge/public/dictionary/delete.ts +5 -7
  377. package/src/server/serverFns/knowledge/public/dictionary/detail.ts +4 -6
  378. package/src/server/serverFns/knowledge/public/dictionary/list.ts +4 -6
  379. package/src/server/serverFns/knowledge/public/dictionary/share.ts +4 -6
  380. package/src/server/serverFns/knowledge/public/dictionary/unshare.ts +4 -6
  381. package/src/server/serverFns/knowledge/public/dictionary/update.ts +5 -7
  382. package/src/server/serverFns/knowledge/public/entity-tags.ts +4 -6
  383. package/src/server/serverFns/knowledge/public/favorite.ts +7 -10
  384. package/src/server/serverFns/knowledge/public/legal/create.ts +4 -6
  385. package/src/server/serverFns/knowledge/public/legal/delete.ts +5 -7
  386. package/src/server/serverFns/knowledge/public/legal/detail.ts +4 -6
  387. package/src/server/serverFns/knowledge/public/legal/list.ts +4 -6
  388. package/src/server/serverFns/knowledge/public/legal/share.ts +4 -6
  389. package/src/server/serverFns/knowledge/public/legal/unshare.ts +4 -6
  390. package/src/server/serverFns/knowledge/public/legal/update.ts +5 -7
  391. package/src/server/serverFns/knowledge-index.ts +12 -16
  392. package/src/server/serverFns/knowledge.ts +50 -67
  393. package/src/server/serverFns/notifications.ts +25 -34
  394. package/src/server/serverFns/plugins/harness-plugins.ts +16 -23
  395. package/src/server/serverFns/project/module-overview.ts +7 -10
  396. package/src/server/serverFns/project.ts +48 -68
  397. package/src/server/serverFns/references/create.ts +4 -6
  398. package/src/server/serverFns/references/resolve.ts +4 -6
  399. package/src/server/serverFns/references/search.ts +4 -6
  400. package/src/server/serverFns/share/design/[designId]/events.ts +4 -6
  401. package/src/server/serverFns/sso.ts +1 -1
  402. package/src/server/serverFns/story/__tests__/bulk.test.ts +34 -1
  403. package/src/server/serverFns/story/__tests__/story-assoc.test.ts +34 -1
  404. package/src/server/serverFns/story/__tests__/story-attachments.test.ts +34 -1
  405. package/src/server/serverFns/story/__tests__/story-crud-date-key.test.ts +42 -17
  406. package/src/server/serverFns/story/__tests__/story-dependencies.test.ts +34 -1
  407. package/src/server/serverFns/story/__tests__/story-gantt-deps.test.ts +34 -1
  408. package/src/server/serverFns/story/__tests__/story-groups.test.ts +34 -1
  409. package/src/server/serverFns/story/__tests__/story-read-path-authz.test.ts +40 -4
  410. package/src/server/serverFns/story/__tests__/story-search.test.ts +34 -1
  411. package/src/server/serverFns/story/__tests__/story-transfer.test.ts +34 -1
  412. package/src/server/serverFns/story/link-preview.ts +5 -7
  413. package/src/server/serverFns/story/story-assoc.ts +28 -38
  414. package/src/server/serverFns/story/story-attachments.ts +7 -10
  415. package/src/server/serverFns/story/story-children.ts +4 -6
  416. package/src/server/serverFns/story/story-comments.ts +13 -18
  417. package/src/server/serverFns/story/story-crud/activities.ts +4 -6
  418. package/src/server/serverFns/story/story-crud/archive.ts +7 -10
  419. package/src/server/serverFns/story/story-crud/bulk.ts +10 -14
  420. package/src/server/serverFns/story/story-crud/detail.ts +7 -10
  421. package/src/server/serverFns/story/story-crud/label-suggest.ts +4 -6
  422. package/src/server/serverFns/story/story-crud/labels.ts +6 -9
  423. package/src/server/serverFns/story/story-crud/user-brief.ts +4 -6
  424. package/src/server/serverFns/story/story-crud.ts +13 -18
  425. package/src/server/serverFns/story/story-dependencies.ts +16 -22
  426. package/src/server/serverFns/story/story-groups.ts +10 -14
  427. package/src/server/serverFns/story/story-links.ts +13 -18
  428. package/src/server/serverFns/story/story-reactions.ts +13 -18
  429. package/src/server/serverFns/story/story-search.ts +7 -10
  430. package/src/server/serverFns/story/story-transfer.ts +10 -14
  431. package/src/server/serverFns/story/story-tree.ts +7 -10
  432. package/src/server/serverFns/story-display-options.ts +7 -8
  433. package/src/server/serverFns/story-view.ts +12 -18
  434. package/src/server/serverFns/tasks/task-crud.ts +13 -17
  435. package/src/server/serverFns/tasks/task-queries.ts +12 -18
  436. package/src/server/serverFns/team.ts +46 -66
  437. package/src/server/serverFns/testcase/__tests__/automation.test.ts +38 -5
  438. package/src/server/serverFns/testcase/__tests__/evidence-upload.test.ts +37 -3
  439. package/src/server/serverFns/testcase/__tests__/generation.test.ts +38 -5
  440. package/src/server/serverFns/testcase/__tests__/plans.test.ts +36 -3
  441. package/src/server/serverFns/testcase/__tests__/regression.test.ts +36 -3
  442. package/src/server/serverFns/testcase/__tests__/run-cases.test.ts +36 -3
  443. package/src/server/serverFns/testcase/__tests__/runs.test.ts +36 -3
  444. package/src/server/serverFns/testcase/__tests__/stats.test.ts +36 -3
  445. package/src/server/serverFns/testcase/__tests__/testcase-board.test.ts +39 -5
  446. package/src/server/serverFns/testcase/__tests__/testcase-crud.test.ts +36 -3
  447. package/src/server/serverFns/testcase/__tests__/testcase-folders.test.ts +36 -3
  448. package/src/server/serverFns/testcase/__tests__/testcase-groups.test.ts +38 -5
  449. package/src/server/serverFns/testcase/automation.ts +13 -17
  450. package/src/server/serverFns/testcase/bulk.ts +10 -14
  451. package/src/server/serverFns/testcase/evidence-upload.ts +5 -7
  452. package/src/server/serverFns/testcase/generation.ts +10 -13
  453. package/src/server/serverFns/testcase/plans.ts +23 -31
  454. package/src/server/serverFns/testcase/regression.ts +7 -10
  455. package/src/server/serverFns/testcase/run-cases.ts +13 -18
  456. package/src/server/serverFns/testcase/runs.ts +13 -18
  457. package/src/server/serverFns/testcase/stats.ts +13 -18
  458. package/src/server/serverFns/testcase/testcase-activities.ts +4 -6
  459. package/src/server/serverFns/testcase/testcase-board.ts +4 -6
  460. package/src/server/serverFns/testcase/testcase-crud.ts +20 -27
  461. package/src/server/serverFns/testcase/testcase-display-options.ts +8 -11
  462. package/src/server/serverFns/testcase/testcase-export.ts +5 -7
  463. package/src/server/serverFns/testcase/testcase-filter-views.ts +12 -18
  464. package/src/server/serverFns/testcase/testcase-folders.ts +16 -22
  465. package/src/server/serverFns/testcase/testcase-groups.ts +4 -6
  466. package/src/server/serverFns/testcase/testcase-reorder.ts +4 -6
  467. package/src/server/serverFns/translation.ts +4 -6
  468. package/src/server/serverFns/user/avatar.ts +4 -6
  469. package/src/server/serverFns/user/settings.ts +4 -6
  470. package/src/server/serverFns/user/update-locale.ts +4 -6
  471. package/src/server/serverFns/workspace-kb.ts +26 -35
  472. package/src/server/serverFns/workspace.ts +43 -59
  473. package/src/server/serverFns/ws.ts +4 -6
  474. package/src/server/serverfn-public-allowlist.ts +117 -0
  475. package/src/server/story/types.ts +0 -1
  476. package/src/server/sync/__tests__/scopes.test.ts +64 -0
  477. package/src/server/sync/scopes.ts +7 -0
  478. package/src/server/testcase/__tests__/auto-bug.test.ts +44 -12
  479. package/src/__tests__/bench/baselines/format-timestamp.json +0 -44
  480. package/src/__typeprobe__.d.ts +0 -4
  481. package/src/components/forms/app-form-dialog.tsx +0 -126
  482. package/src/components/forms/hooks/use-form-submit.ts +0 -57
  483. package/src/components/forms/types.ts +0 -34
  484. package/src/components/harness/code/workspace-picker.tsx +0 -239
  485. package/src/components/tiptap/extensions/local-file/insert-local-file.ts +0 -35
  486. package/src/components/tiptap/extensions/local-file/local-file-node.ts +0 -71
  487. package/src/devframe-docks/ai-chat-iframe.tsx +0 -29
  488. package/src/devframe-docks/session-iframe.tsx +0 -90
  489. package/src/lib/__tests__/desktop-detect.test.ts +0 -19
  490. package/src/lib/collections/index.ts +0 -22
  491. package/src/lib/collections/knowledge/index.ts +0 -18
  492. package/src/lib/collections/knowledge/knowledge-bases-collection.ts +0 -34
  493. package/src/lib/collections/reference/bookmark-categories-collection.ts +0 -31
  494. package/src/lib/collections/reference/labels-collection.ts +0 -31
  495. package/src/lib/collections/reference/projects-collection.ts +0 -31
  496. package/src/lib/collections/reference/users-brief-collection.ts +0 -35
  497. package/src/lib/collections/reference/workspaces-collection.ts +0 -34
  498. package/src/lib/desktop-detect.ts +0 -29
  499. package/src/paraglide/messages/en.js +0 -28260
  500. package/src/paraglide/messages/zh.js +0 -28258
@@ -24,7 +24,7 @@ import { getPrisma } from "@allbluecn/database/get-prisma";
24
24
  import { createServerFn } from "@tanstack/react-start";
25
25
  import { getRequest } from "@tanstack/react-start/server";
26
26
  import { z } from "zod";
27
- import { requireAuth } from "@/server/auth-helpers";
27
+ import { authContextMiddleware } from "@/server/middlewares/auth-context"
28
28
  import { requireFeature } from "@/server/entitlements";
29
29
  import { isProEdition } from "@/server/pro-services";
30
30
  import {
@@ -109,11 +109,9 @@ async function capPageSize(request: Request, pageSize: TestCasePageSize): Promis
109
109
  }
110
110
 
111
111
  /** 获取当前用户持久化的用例显示选项(非法/缺失字段已回退默认值) */
112
- export const getTestCaseDisplayOptionsFn = createServerFn({ method: "GET" }).handler(async () => {
112
+ export const getTestCaseDisplayOptionsFn = createServerFn({ method: "GET" }).middleware([authContextMiddleware]).handler(async ({ context }) => {
113
113
  const prisma = await getPrisma();
114
- const request = getRequest();
115
- const session = await requireAuth(request);
116
- const userId = session.user.id;
114
+ const userId = context.user.id;
117
115
 
118
116
  const row = await prisma.testCaseFilterView.findFirst({
119
117
  where: { userId, name: TESTCASE_DISPLAY_OPTIONS_VIEW_NAME },
@@ -121,23 +119,22 @@ export const getTestCaseDisplayOptionsFn = createServerFn({ method: "GET" }).han
121
119
  select: { displayOptions: true },
122
120
  });
123
121
  const options = parseStoredOptions(row?.displayOptions);
124
- options.pageSize = await capPageSize(request, options.pageSize);
122
+ options.pageSize = await capPageSize(getRequest(), options.pageSize);
125
123
  return options;
126
124
  });
127
125
 
128
126
  /** 保存当前用户的用例显示选项,返回更新后的完整对象 */
129
127
  export const updateTestCaseDisplayOptionsFn = createServerFn({ method: "POST" })
128
+ .middleware([authContextMiddleware])
130
129
  .validator(optionsSchema)
131
- .handler(async ({ data }) => {
130
+ .handler(async ({ data, context }) => {
132
131
  const prisma = await getPrisma();
133
- const request = getRequest();
134
- const session = await requireAuth(request);
135
- const userId = session.user.id;
132
+ const userId = context.user.id;
136
133
 
137
134
  // 服务端强制校验:pageSize > 200(500/1000)为 Pro 专属,前端锁定只是 UX
138
135
  const options: TestCaseDisplayOptions = {
139
136
  ...data,
140
- pageSize: await capPageSize(request, data.pageSize),
137
+ pageSize: await capPageSize(getRequest(), data.pageSize),
141
138
  };
142
139
 
143
140
  // 与 get 路径同一 orderBy:并发双保留行时读写对齐首行,避免保存后读不到
@@ -16,7 +16,7 @@
16
16
  // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
 
18
18
  // 用例列表 CSV 导出 serverFn(四期 Q8 任务 44,照 testcase-crud listTestCasesFn
19
- // 口径同构)。权限:首行 requireAuth + resolveStoryScopeProjectIds(projectId
19
+ // 口径同构)。权限:authContextMiddleware 鉴权 + resolveStoryScopeProjectIds(projectId
20
20
  // 缺省 → 成员关系内全部项目聚合;传值 → 单项目经鉴权,防越权导出)。筛选:
21
21
  // filters 为客户端 serializeFilters 产物(FilterCondition JSON 串),与列表共
22
22
  // 用 server/testcase/list-query.ts buildListWhere 翻译——导出范围=当前筛选/
@@ -27,10 +27,9 @@
27
27
  // 四项),DB 枚举原值输出保持机器可读。
28
28
  import { getPrisma } from "@allbluecn/database/get-prisma";
29
29
  import { createServerFn } from "@tanstack/react-start";
30
- import { getRequest } from "@tanstack/react-start/server";
31
30
  import { z } from "zod";
32
31
  import type { Prisma } from "@allbluecn/database";
33
- import { requireAuth } from "@/server/auth-helpers";
32
+ import { authContextMiddleware } from "@/server/middlewares/auth-context"
34
33
  import { resolveStoryScopeProjectIds } from "@/server/builtin-project";
35
34
  import { buildListWhere } from "@/server/testcase/list-query";
36
35
  import { CSV_EXPORT_MAX_ROWS, toCsv, type CsvCell } from "@/server/csv";
@@ -70,12 +69,11 @@ const TEST_CASE_EXPORT_SELECT = {
70
69
  type TestCaseExportRow = Prisma.TestCaseGetPayload<{ select: typeof TEST_CASE_EXPORT_SELECT }>;
71
70
 
72
71
  export const exportTestCasesFn = createServerFn({ method: "GET" })
72
+ .middleware([authContextMiddleware])
73
73
  .validator(exportSchema)
74
- .handler(async ({ data }) => {
74
+ .handler(async ({ data, context }) => {
75
75
  const prisma = await getPrisma();
76
- const request = getRequest();
77
- const session = await requireAuth(request);
78
- const userId = session.user.id;
76
+ const userId = context.user.id;
79
77
 
80
78
  const projectIds = await resolveStoryScopeProjectIds(data.projectId, userId);
81
79
 
@@ -24,10 +24,9 @@
24
24
  // update 无乐观锁(StoryFilterView 先例没有,任务 5 审查指针同口径)。
25
25
  import { getPrisma } from "@allbluecn/database/get-prisma";
26
26
  import { createServerFn } from "@tanstack/react-start";
27
- import { getRequest } from "@tanstack/react-start/server";
28
27
  import { z } from "zod";
29
28
  import type { Prisma } from "@allbluecn/database";
30
- import { requireAuth } from "@/server/auth-helpers";
29
+ import { authContextMiddleware } from "@/server/middlewares/auth-context"
31
30
  import { TESTCASE_DISPLAY_OPTIONS_VIEW_NAME } from "@/shared/testcase/field-configs";
32
31
 
33
32
  // 显示选项保留行(任务 20,testcase-display-options.ts 落点)对视图清单
@@ -125,11 +124,9 @@ function toJson(value: Record<string, unknown>): Prisma.InputJsonValue {
125
124
  return value as unknown as Prisma.InputJsonValue;
126
125
  }
127
126
 
128
- export const listFilterViewsFn = createServerFn({ method: "GET" }).handler(async () => {
127
+ export const listFilterViewsFn = createServerFn({ method: "GET" }).middleware([authContextMiddleware]).handler(async ({ context }) => {
129
128
  const prisma = await getPrisma();
130
- const request = getRequest();
131
- const session = await requireAuth(request);
132
- const userId = session.user.id;
129
+ const userId = context.user.id;
133
130
  const rows = await prisma.testCaseFilterView.findMany({
134
131
  where: { userId, ...NOT_RESERVED },
135
132
  orderBy: { sortOrder: "asc" },
@@ -150,15 +147,14 @@ const createSchema = z.object({
150
147
  });
151
148
 
152
149
  export const createFilterViewFn = createServerFn({ method: "POST" })
150
+ .middleware([authContextMiddleware])
153
151
  .validator(createSchema)
154
- .handler(async ({ data }) => {
152
+ .handler(async ({ data, context }) => {
155
153
  if (data.name === TESTCASE_DISPLAY_OPTIONS_VIEW_NAME) {
156
154
  throw new Error("该视图名称为系统保留,请换一个名称");
157
155
  }
158
156
  const prisma = await getPrisma();
159
- const request = getRequest();
160
- const session = await requireAuth(request);
161
- const userId = session.user.id;
157
+ const userId = context.user.id;
162
158
  const row = await prisma.testCaseFilterView.create({
163
159
  data: {
164
160
  userId,
@@ -185,15 +181,14 @@ const updateSchema = z.object({
185
181
  });
186
182
 
187
183
  export const updateFilterViewFn = createServerFn({ method: "POST" })
184
+ .middleware([authContextMiddleware])
188
185
  .validator(updateSchema)
189
- .handler(async ({ data }) => {
186
+ .handler(async ({ data, context }) => {
190
187
  if (data.name === TESTCASE_DISPLAY_OPTIONS_VIEW_NAME) {
191
188
  throw new Error("该视图名称为系统保留,请换一个名称");
192
189
  }
193
190
  const prisma = await getPrisma();
194
- const request = getRequest();
195
- const session = await requireAuth(request);
196
- const userId = session.user.id;
191
+ const userId = context.user.id;
197
192
  const { id, ...patch } = data;
198
193
  const updates: Record<string, unknown> = {};
199
194
  if (patch.name !== undefined) updates.name = patch.name;
@@ -214,12 +209,11 @@ export const updateFilterViewFn = createServerFn({ method: "POST" })
214
209
  const deleteSchema = z.object({ id: z.string().min(1) });
215
210
 
216
211
  export const deleteFilterViewFn = createServerFn({ method: "POST" })
212
+ .middleware([authContextMiddleware])
217
213
  .validator(deleteSchema)
218
- .handler(async ({ data }) => {
214
+ .handler(async ({ data, context }) => {
219
215
  const prisma = await getPrisma();
220
- const request = getRequest();
221
- const session = await requireAuth(request);
222
- const userId = session.user.id;
216
+ const userId = context.user.id;
223
217
  await prisma.testCaseFilterView.delete({
224
218
  // userId + 非保留名限定:他人视图与显示选项保留行均删不到(照 bug-views.ts)
225
219
  where: { id: data.id, userId, ...NOT_RESERVED },
@@ -21,9 +21,8 @@
21
21
  // 视同无权限)。create/delete 落 ProjectActivity(targetType=testcase)。
22
22
  import { getPrisma } from "@allbluecn/database/get-prisma";
23
23
  import { createServerFn } from "@tanstack/react-start";
24
- import { getRequest } from "@tanstack/react-start/server";
25
24
  import { z } from "zod";
26
- import { requireAuth } from "@/server/auth-helpers";
25
+ import { authContextMiddleware } from "@/server/middlewares/auth-context"
27
26
  import { ensureBuiltinIndependentProject, resolveStoryScopeProjectId } from "@/server/builtin-project";
28
27
  import { assertTestProjectMembership as assertProjectMembership } from "@/server/testcase/permissions";
29
28
 
@@ -32,12 +31,11 @@ import { assertTestProjectMembership as assertProjectMembership } from "@/server
32
31
  const listSchema = z.object({ projectId: z.string().optional() });
33
32
 
34
33
  export const listFoldersFn = createServerFn({ method: "GET" })
34
+ .middleware([authContextMiddleware])
35
35
  .validator(listSchema)
36
- .handler(async ({ data }) => {
36
+ .handler(async ({ data, context }) => {
37
37
  const prisma = await getPrisma();
38
- const request = getRequest();
39
- const session = await requireAuth(request);
40
- const userId = session.user.id;
38
+ const userId = context.user.id;
41
39
 
42
40
  const projectId = await resolveStoryScopeProjectId(data.projectId, userId);
43
41
 
@@ -58,12 +56,11 @@ const createSchema = z.object({
58
56
  });
59
57
 
60
58
  export const createFolderFn = createServerFn({ method: "POST" })
59
+ .middleware([authContextMiddleware])
61
60
  .validator(createSchema)
62
- .handler(async ({ data }) => {
61
+ .handler(async ({ data, context }) => {
63
62
  const prisma = await getPrisma();
64
- const request = getRequest();
65
- const session = await requireAuth(request);
66
- const userId = session.user.id;
63
+ const userId = context.user.id;
67
64
 
68
65
  let projectId = data.projectId;
69
66
  if (projectId) {
@@ -121,12 +118,11 @@ async function getFolderWithMembership(folderId: string, userId: string) {
121
118
  const renameSchema = z.object({ id: z.string(), name: z.string().min(1).max(100) });
122
119
 
123
120
  export const renameFolderFn = createServerFn({ method: "POST" })
121
+ .middleware([authContextMiddleware])
124
122
  .validator(renameSchema)
125
- .handler(async ({ data }) => {
123
+ .handler(async ({ data, context }) => {
126
124
  const prisma = await getPrisma();
127
- const request = getRequest();
128
- const session = await requireAuth(request);
129
- const userId = session.user.id;
125
+ const userId = context.user.id;
130
126
 
131
127
  await getFolderWithMembership(data.id, userId);
132
128
 
@@ -139,12 +135,11 @@ export const renameFolderFn = createServerFn({ method: "POST" })
139
135
  const deleteSchema = z.object({ id: z.string() });
140
136
 
141
137
  export const deleteFolderFn = createServerFn({ method: "POST" })
138
+ .middleware([authContextMiddleware])
142
139
  .validator(deleteSchema)
143
- .handler(async ({ data }) => {
140
+ .handler(async ({ data, context }) => {
144
141
  const prisma = await getPrisma();
145
- const request = getRequest();
146
- const session = await requireAuth(request);
147
- const userId = session.user.id;
142
+ const userId = context.user.id;
148
143
 
149
144
  const folder = await getFolderWithMembership(data.id, userId);
150
145
 
@@ -177,12 +172,11 @@ const reorderSchema = z.object({
177
172
  });
178
173
 
179
174
  export const reorderFolderFn = createServerFn({ method: "POST" })
175
+ .middleware([authContextMiddleware])
180
176
  .validator(reorderSchema)
181
- .handler(async ({ data }) => {
177
+ .handler(async ({ data, context }) => {
182
178
  const prisma = await getPrisma();
183
- const request = getRequest();
184
- const session = await requireAuth(request);
185
- const userId = session.user.id;
179
+ const userId = context.user.id;
186
180
 
187
181
  const folder = await getFolderWithMembership(data.id, userId);
188
182
 
@@ -23,10 +23,9 @@
23
23
  // unassigned,前端用已有模块树数据解析名称)。
24
24
  import { getPrisma } from "@allbluecn/database/get-prisma";
25
25
  import { createServerFn } from "@tanstack/react-start";
26
- import { getRequest } from "@tanstack/react-start/server";
27
26
  import { z } from "zod";
28
27
  import type { Prisma } from "@allbluecn/database";
29
- import { requireAuth } from "@/server/auth-helpers";
28
+ import { authContextMiddleware } from "@/server/middlewares/auth-context"
30
29
  import { resolveStoryScopeProjectIds } from "@/server/builtin-project";
31
30
  import { buildListWhere } from "@/server/testcase/list-query";
32
31
  import {
@@ -92,12 +91,11 @@ const listGroupsSchema = z.object({
92
91
  });
93
92
 
94
93
  export const listGroupsFn = createServerFn({ method: "GET" })
94
+ .middleware([authContextMiddleware])
95
95
  .validator(listGroupsSchema)
96
- .handler(async ({ data }) => {
96
+ .handler(async ({ data, context }) => {
97
97
  const prisma = await getPrisma();
98
- const request = getRequest();
99
- const session = await requireAuth(request);
100
- const userId = session.user.id;
98
+ const userId = context.user.id;
101
99
 
102
100
  // scope 解析与列表一致(同 story/story-groups 与 bug 域):未传 → 成员关系
103
101
  // 全部项目聚合;单项目经鉴权(无效/非成员 → 静默回退独立项目),防越权查询
@@ -23,9 +23,8 @@
23
23
  // 无 withCollabGuard/touchCollabSnapshot 接线。
24
24
  import { getPrisma } from "@allbluecn/database/get-prisma";
25
25
  import { createServerFn } from "@tanstack/react-start";
26
- import { getRequest } from "@tanstack/react-start/server";
27
26
  import { z } from "zod";
28
- import { requireAuth } from "@/server/auth-helpers";
27
+ import { authContextMiddleware } from "@/server/middlewares/auth-context"
29
28
 
30
29
  const reorderSchema = z.object({
31
30
  // 批量上限 500(story-crud/bulk idListSchema 同款):防误用超大拖垮 $transaction
@@ -40,15 +39,14 @@ const reorderSchema = z.object({
40
39
  });
41
40
 
42
41
  export const reorderTestCasesFn = createServerFn({ method: "POST" })
42
+ .middleware([authContextMiddleware])
43
43
  .validator(reorderSchema)
44
- .handler(async ({ data }) => {
44
+ .handler(async ({ data, context }) => {
45
45
  const prisma = await getPrisma();
46
- const request = getRequest();
47
- const session = await requireAuth(request);
48
46
  // 可见性过滤进 where(SEC-03:防跨项目改他人用例排序);updateMany 对
49
47
  // 越权/不存在 id 静默跳过,不中断整批合法排序
50
48
  const memberships = await prisma.projectMember.findMany({
51
- where: { userId: session.user.id, status: { not: "suspended" } },
49
+ where: { userId: context.user.id, status: { not: "suspended" } },
52
50
  select: { projectId: true },
53
51
  });
54
52
  const visibleProjectIds = memberships.map((m) => m.projectId);
@@ -16,9 +16,8 @@
16
16
  // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
 
18
18
  import { createServerFn } from '@tanstack/react-start'
19
- import { getRequest } from '@tanstack/react-start/server'
20
19
  import { z } from 'zod'
21
- import { requireAuth } from '@/server/auth-helpers'
20
+ import { authContextMiddleware } from '@/server/middlewares/auth-context'
22
21
  import { checkAiRateLimit } from '@/server/lib/rate-limit'
23
22
  import { hasAiKey } from "@/server/ai-gateway/adapter"
24
23
  import { runChatAsAgent } from "@/server/ai-gateway/runs/agent-runtime"
@@ -30,11 +29,10 @@ const schema = z.object({
30
29
  })
31
30
 
32
31
  export const translateFn = createServerFn({ method: 'POST' })
32
+ .middleware([authContextMiddleware])
33
33
  .validator(schema)
34
- .handler(async ({ data }) => {
35
- const request = getRequest()
36
- const session = await requireAuth(request)
37
- const userId = session.user.id
34
+ .handler(async ({ data, context }) => {
35
+ const userId = context.user.id
38
36
  // AI 昂贵调用独立限流(审计 🟠:对照 startGenerationFn 同款;先于 hasAiKey 消耗配额)
39
37
  await checkAiRateLimit(userId, "translation")
40
38
  if (!(await hasAiKey(userId))) throw new Error('AI 未配置')
@@ -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 { requireAuth } from '@/server/auth-helpers'
21
+ import { authContextMiddleware } from '@/server/middlewares/auth-context'
23
22
 
24
23
  const schema = z.object({
25
24
  avatarConfig: z.record(z.string(), z.number()),
@@ -28,13 +27,12 @@ const schema = z.object({
28
27
  })
29
28
 
30
29
  export const updateAvatarFn = createServerFn({ method: 'POST' })
30
+ .middleware([authContextMiddleware])
31
31
  .validator(schema)
32
- .handler(async ({ data }) => {
32
+ .handler(async ({ data, context }) => {
33
33
  const prisma = await getPrisma()
34
- const request = getRequest()
35
- const session = await requireAuth(request)
36
34
  const user = await prisma.user.update({
37
- where: { id: session.user.id },
35
+ where: { id: context.user.id },
38
36
  data: { ...data, avatarConfig: data.avatarConfig as object },
39
37
  })
40
38
  return { avatarConfig: user.avatarConfig, bgShape: user.bgShape, bgColor: user.bgColor }
@@ -17,22 +17,20 @@
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 { requireAuth } from '@/server/auth-helpers'
21
+ import { authContextMiddleware } from '@/server/middlewares/auth-context'
23
22
 
24
23
  const updateTimezoneSchema = z.object({
25
24
  timezone: z.string().min(1).max(50),
26
25
  })
27
26
 
28
27
  export const updateUserTimezoneFn = createServerFn({ method: 'POST' })
28
+ .middleware([authContextMiddleware])
29
29
  .validator(updateTimezoneSchema)
30
- .handler(async ({ data }) => {
30
+ .handler(async ({ data, context }) => {
31
31
  const prisma = await getPrisma()
32
- const request = getRequest()
33
- const session = await requireAuth(request)
34
32
  await prisma.user.update({
35
- where: { id: session.user.id },
33
+ where: { id: context.user.id },
36
34
  data: { timezone: data.timezone },
37
35
  })
38
36
  return { success: true }
@@ -2,17 +2,15 @@
2
2
  import { getPrisma } from "@allbluecn/database/get-prisma"
3
3
  import { createServerFn } from '@tanstack/react-start'
4
4
  import { z } from 'zod'
5
- import { requireAuth } from '@/server/auth-helpers'
6
- import { getRequest } from '@tanstack/react-start/server'
5
+ import { authContextMiddleware } from '@/server/middlewares/auth-context'
7
6
 
8
7
  export const updateLocaleFn = createServerFn({ method: 'POST' })
8
+ .middleware([authContextMiddleware])
9
9
  .validator(z.object({ locale: z.enum(['zh', 'en']) }))
10
- .handler(async ({ data }) => {
10
+ .handler(async ({ data, context }) => {
11
11
  const prisma = await getPrisma()
12
- const request = getRequest()
13
- const session = await requireAuth(request)
14
12
  await prisma.user.update({
15
- where: { id: session.user.id },
13
+ where: { id: context.user.id },
16
14
  data: { locale: data.locale },
17
15
  })
18
16
  return { success: true }
@@ -20,8 +20,7 @@
20
20
  import { getPrisma } from "@allbluecn/database/get-prisma"
21
21
  import { z } from "zod";
22
22
  import { createServerFn } from "@tanstack/react-start";
23
- import { getRequest } from "@tanstack/react-start/server";
24
- import { requireAuth } from "@/server/auth-helpers";
23
+ import { authContextMiddleware } from "@/server/middlewares/auth-context";
25
24
  import { GENERAL_GROUP_TABLES, GENERAL_GROUPS, type GeneralGroup } from "@/server/knowledge/kb-general";
26
25
  import type { QuickDocRow, WorkspaceKbCardData } from "./workspace-kb-utils";
27
26
  import {
@@ -76,12 +75,11 @@ async function generalGroupVisibleFilter(
76
75
  }
77
76
 
78
77
  export const getWorkspaceKbCardFn = createServerFn({ method: "GET" })
78
+ .middleware([authContextMiddleware])
79
79
  .validator(z.object({ workspaceId: z.string() }))
80
- .handler(async ({ data }): Promise<WorkspaceKbCardData> => {
80
+ .handler(async ({ data, context }): Promise<WorkspaceKbCardData> => {
81
81
  const prisma = await getPrisma()
82
- const request = getRequest();
83
- const session = await requireAuth(request);
84
- const userId = session.user.id;
82
+ const userId = context.user.id;
85
83
  await requireWorkspaceMember(data.workspaceId, userId);
86
84
 
87
85
  const [linkRows, quickRows] = await Promise.all([
@@ -169,12 +167,11 @@ export const getWorkspaceKbCardFn = createServerFn({ method: "GET" })
169
167
  });
170
168
 
171
169
  export const listWorkspaceAvailableKbsFn = createServerFn({ method: "GET" })
170
+ .middleware([authContextMiddleware])
172
171
  .validator(z.object({ workspaceId: z.string() }))
173
- .handler(async ({ data }) => {
172
+ .handler(async ({ data, context }) => {
174
173
  const prisma = await getPrisma()
175
- const request = getRequest();
176
- const session = await requireAuth(request);
177
- const userId = session.user.id;
174
+ const userId = context.user.id;
178
175
  await requireWorkspaceMember(data.workspaceId, userId);
179
176
 
180
177
  const linked = await prisma.workspaceKnowledgeBase.findMany({
@@ -195,12 +192,11 @@ export const listWorkspaceAvailableKbsFn = createServerFn({ method: "GET" })
195
192
  });
196
193
 
197
194
  export const setWorkspaceKbsFn = createServerFn({ method: "POST" })
195
+ .middleware([authContextMiddleware])
198
196
  .validator(z.object({ workspaceId: z.string(), kbIds: z.array(z.string()) }))
199
- .handler(async ({ data }) => {
197
+ .handler(async ({ data, context }) => {
200
198
  const prisma = await getPrisma()
201
- const request = getRequest();
202
- const session = await requireAuth(request);
203
- await requireWorkspaceMember(data.workspaceId, session.user.id);
199
+ await requireWorkspaceMember(data.workspaceId, context.user.id);
204
200
 
205
201
  // 校验与候选清单(listWorkspaceAvailableKbsFn)同口径(审计 🟡):
206
202
  // 本空间已关联 ∪ 本人 team 库——防凭 id 把任意他人 team 库挂入自己空间
@@ -215,7 +211,7 @@ export const setWorkspaceKbsFn = createServerFn({ method: "POST" })
215
211
  id: { in: data.kbIds },
216
212
  visibility: "team",
217
213
  isDeleted: false,
218
- OR: [{ id: { in: linkedIds } }, { userId: session.user.id }],
214
+ OR: [{ id: { in: linkedIds } }, { userId: context.user.id }],
219
215
  },
220
216
  select: { id: true },
221
217
  });
@@ -238,6 +234,7 @@ export const setWorkspaceKbsFn = createServerFn({ method: "POST" })
238
234
  });
239
235
 
240
236
  export const searchQuickDocCandidatesFn = createServerFn({ method: "GET" })
237
+ .middleware([authContextMiddleware])
241
238
  .validator(
242
239
  z.object({
243
240
  workspaceId: z.string(),
@@ -246,11 +243,9 @@ export const searchQuickDocCandidatesFn = createServerFn({ method: "GET" })
246
243
  query: z.string().default(""),
247
244
  }),
248
245
  )
249
- .handler(async ({ data }) => {
246
+ .handler(async ({ data, context }) => {
250
247
  const prisma = await getPrisma()
251
- const request = getRequest();
252
- const session = await requireAuth(request);
253
- const userId = session.user.id;
248
+ const userId = context.user.id;
254
249
  await requireWorkspaceMember(data.workspaceId, userId);
255
250
 
256
251
  if (data.generalGroup) {
@@ -290,12 +285,11 @@ export const searchQuickDocCandidatesFn = createServerFn({ method: "GET" })
290
285
  });
291
286
 
292
287
  export const addQuickDocsFn = createServerFn({ method: "POST" })
288
+ .middleware([authContextMiddleware])
293
289
  .validator(z.object({ workspaceId: z.string(), items: z.array(quickDocItemSchema).min(1) }))
294
- .handler(async ({ data }) => {
290
+ .handler(async ({ data, context }) => {
295
291
  const prisma = await getPrisma()
296
- const request = getRequest();
297
- const session = await requireAuth(request);
298
- const userId = session.user.id;
292
+ const userId = context.user.id;
299
293
  await requireWorkspaceMember(data.workspaceId, userId);
300
294
 
301
295
  // DB-01:批量快捷文档原每项 2~3 次串行查询(存在性 findFirst + 查重 findFirst + create)。
@@ -411,6 +405,7 @@ export const addQuickDocsFn = createServerFn({ method: "POST" })
411
405
  });
412
406
 
413
407
  export const renameQuickDocFn = createServerFn({ method: "POST" })
408
+ .middleware([authContextMiddleware])
414
409
  .validator(
415
410
  z.object({
416
411
  quickDocId: z.string(),
@@ -419,16 +414,14 @@ export const renameQuickDocFn = createServerFn({ method: "POST" })
419
414
  icon: z.string().optional(),
420
415
  }),
421
416
  )
422
- .handler(async ({ data }) => {
417
+ .handler(async ({ data, context }) => {
423
418
  const prisma = await getPrisma()
424
- const request = getRequest();
425
- const session = await requireAuth(request);
426
419
  const row = await prisma.workspaceQuickDoc.findUnique({
427
420
  where: { id: data.quickDocId },
428
421
  select: { workspaceId: true },
429
422
  });
430
423
  if (!row) throw new Error("快捷文档不存在");
431
- await requireWorkspaceMember(row.workspaceId, session.user.id);
424
+ await requireWorkspaceMember(row.workspaceId, context.user.id);
432
425
  await prisma.workspaceQuickDoc.update({
433
426
  where: { id: data.quickDocId },
434
427
  data: {
@@ -440,22 +433,22 @@ export const renameQuickDocFn = createServerFn({ method: "POST" })
440
433
  });
441
434
 
442
435
  export const removeQuickDocFn = createServerFn({ method: "POST" })
436
+ .middleware([authContextMiddleware])
443
437
  .validator(z.object({ quickDocId: z.string() }))
444
- .handler(async ({ data }) => {
438
+ .handler(async ({ data, context }) => {
445
439
  const prisma = await getPrisma()
446
- const request = getRequest();
447
- const session = await requireAuth(request);
448
440
  const row = await prisma.workspaceQuickDoc.findUnique({
449
441
  where: { id: data.quickDocId },
450
442
  select: { workspaceId: true },
451
443
  });
452
444
  if (!row) throw new Error("快捷文档不存在");
453
- await requireWorkspaceMember(row.workspaceId, session.user.id);
445
+ await requireWorkspaceMember(row.workspaceId, context.user.id);
454
446
  await prisma.workspaceQuickDoc.delete({ where: { id: data.quickDocId } });
455
447
  return { ok: true };
456
448
  });
457
449
 
458
450
  export const reorderQuickDocsFn = createServerFn({ method: "POST" })
451
+ .middleware([authContextMiddleware])
459
452
  .validator(
460
453
  z.object({
461
454
  workspaceId: z.string(),
@@ -467,11 +460,9 @@ export const reorderQuickDocsFn = createServerFn({ method: "POST" })
467
460
  .max(500),
468
461
  }),
469
462
  )
470
- .handler(async ({ data }) => {
463
+ .handler(async ({ data, context }) => {
471
464
  const prisma = await getPrisma()
472
- const request = getRequest();
473
- const session = await requireAuth(request);
474
- await requireWorkspaceMember(data.workspaceId, session.user.id);
465
+ await requireWorkspaceMember(data.workspaceId, context.user.id);
475
466
  const ids = data.items.map((item) => item.id);
476
467
  const owned = await prisma.workspaceQuickDoc.findMany({
477
468
  where: { id: { in: ids }, workspaceId: data.workspaceId },