@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
@@ -23,9 +23,8 @@
23
23
  import { getPrisma } from "@allbluecn/database/get-prisma";
24
24
  import type { Prisma } from "@allbluecn/database";
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
  import { generateProjectToken } from "@/server/bug-report/tokens";
30
29
  import { assertProjectMembership } from "@/server/bug/bug-permissions";
31
30
 
@@ -63,12 +62,11 @@ function parseCollectConfig(raw: unknown): CollectPageConfigValue {
63
62
  const projectIdSchema = z.object({ projectId: z.string().min(1) });
64
63
 
65
64
  export const listCollectTokensFn = createServerFn({ method: "GET" })
65
+ .middleware([authContextMiddleware])
66
66
  .validator(projectIdSchema)
67
- .handler(async ({ data }) => {
67
+ .handler(async ({ data, context }) => {
68
68
  const prisma = await getPrisma();
69
- const request = getRequest();
70
- const session = await requireAuth(request);
71
- const userId = session.user.id;
69
+ const userId = context.user.id;
72
70
  await assertProjectMembership(data.projectId, userId);
73
71
 
74
72
  const rows = await prisma.projectAccessToken.findMany({
@@ -104,12 +102,11 @@ const createCollectTokenSchema = z.object({
104
102
  });
105
103
 
106
104
  export const createCollectTokenFn = createServerFn({ method: "POST" })
105
+ .middleware([authContextMiddleware])
107
106
  .validator(createCollectTokenSchema)
108
- .handler(async ({ data }) => {
107
+ .handler(async ({ data, context }) => {
109
108
  const prisma = await getPrisma();
110
- const request = getRequest();
111
- const session = await requireAuth(request);
112
- const userId = session.user.id;
109
+ const userId = context.user.id;
113
110
  await assertProjectMembership(data.projectId, userId);
114
111
 
115
112
  const { plaintext, tokenHash, tokenPrefix } = generateProjectToken();
@@ -140,12 +137,11 @@ const revokeCollectTokenSchema = z.object({
140
137
  });
141
138
 
142
139
  export const revokeCollectTokenFn = createServerFn({ method: "POST" })
140
+ .middleware([authContextMiddleware])
143
141
  .validator(revokeCollectTokenSchema)
144
- .handler(async ({ data }) => {
142
+ .handler(async ({ data, context }) => {
145
143
  const prisma = await getPrisma();
146
- const request = getRequest();
147
- const session = await requireAuth(request);
148
- const userId = session.user.id;
144
+ const userId = context.user.id;
149
145
  await assertProjectMembership(data.projectId, userId);
150
146
 
151
147
  const revokedAt = new Date();
@@ -196,12 +192,11 @@ function mergeCollectConfig(
196
192
  }
197
193
 
198
194
  export const updateCollectConfigFn = createServerFn({ method: "POST" })
195
+ .middleware([authContextMiddleware])
199
196
  .validator(updateCollectConfigSchema)
200
- .handler(async ({ data }) => {
197
+ .handler(async ({ data, context }) => {
201
198
  const prisma = await getPrisma();
202
- const request = getRequest();
203
- const session = await requireAuth(request);
204
- const userId = session.user.id;
199
+ const userId = context.user.id;
205
200
  await assertProjectMembership(data.projectId, userId);
206
201
 
207
202
  const existing = await prisma.projectAccessToken.findFirst({
@@ -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
  import type { AvatarConfig } from "@allbluecn/kernel";
24
23
  import { BUG_USER_BRIEF_SELECT } from "@/shared/bug/types";
25
24
  import type { BugCommentWithReplies } from "@/shared/bug/types";
@@ -42,6 +41,7 @@ function castCommentUser(u: {
42
41
  // 契约从裸数组扩展为 { items, nextCursor }(对齐 listBugActivitiesFn 口径);
43
42
  // 回复树不单独分页:根页内所有回复整树随根返回,客户端渲染契约不变。
44
43
  export const listCommentsFn = createServerFn({ method: "GET" })
44
+ .middleware([authContextMiddleware])
45
45
  .validator(
46
46
  z.object({
47
47
  bugId: z.string(),
@@ -50,11 +50,9 @@ export const listCommentsFn = createServerFn({ method: "GET" })
50
50
  cursor: z.string().optional(),
51
51
  }),
52
52
  )
53
- .handler(async ({ data }) => {
53
+ .handler(async ({ data, context }) => {
54
54
  const prisma = await getPrisma();
55
- const request = getRequest();
56
- const session = await requireAuth(request);
57
- const userId = session.user.id;
55
+ const userId = context.user.id;
58
56
 
59
57
  await assertBugProjectMember(data.bugId, userId);
60
58
 
@@ -122,12 +120,11 @@ const commentCreateSchema = z.object({
122
120
  });
123
121
 
124
122
  export const createCommentFn = createServerFn({ method: "POST" })
123
+ .middleware([authContextMiddleware])
125
124
  .validator(commentCreateSchema)
126
- .handler(async ({ data }) => {
125
+ .handler(async ({ data, context }) => {
127
126
  const prisma = await getPrisma();
128
- const request = getRequest();
129
- const session = await requireAuth(request);
130
- const userId = session.user.id;
127
+ const userId = context.user.id;
131
128
 
132
129
  await assertBugProjectMember(data.bugId, userId);
133
130
 
@@ -189,12 +186,11 @@ const commentUpdateSchema = z.object({
189
186
  });
190
187
 
191
188
  export const updateCommentFn = createServerFn({ method: "POST" })
189
+ .middleware([authContextMiddleware])
192
190
  .validator(commentUpdateSchema)
193
- .handler(async ({ data }) => {
191
+ .handler(async ({ data, context }) => {
194
192
  const prisma = await getPrisma();
195
- const request = getRequest();
196
- const session = await requireAuth(request);
197
- const userId = session.user.id;
193
+ const userId = context.user.id;
198
194
 
199
195
  const existing = await prisma.bugComment.findUnique({
200
196
  where: { id: data.commentId },
@@ -226,12 +222,11 @@ export const updateCommentFn = createServerFn({ method: "POST" })
226
222
  });
227
223
 
228
224
  export const deleteCommentFn = createServerFn({ method: "POST" })
225
+ .middleware([authContextMiddleware])
229
226
  .validator(z.object({ commentId: z.string() }))
230
- .handler(async ({ data }) => {
227
+ .handler(async ({ data, context }) => {
231
228
  const prisma = await getPrisma();
232
- const request = getRequest();
233
- const session = await requireAuth(request);
234
- const userId = session.user.id;
229
+ const userId = context.user.id;
235
230
 
236
231
  const existing = await prisma.bugComment.findUnique({
237
232
  where: { id: data.commentId },
@@ -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
  import { castBugUsers } from "@/shared/bug/types";
24
23
  import type { BugDetail, ReproduceSteps } from "@/shared/bug/types";
25
24
  import { assertBugProjectMember } from "@/server/bug/bug-permissions";
@@ -28,12 +27,11 @@ import { BUG_DETAIL_SELECT, extractScreenshotBlobId } from "./detail-select";
28
27
  const bugIdSchema = z.object({ bugId: z.string() });
29
28
 
30
29
  export const getBugDetailFn = createServerFn({ method: "GET" })
30
+ .middleware([authContextMiddleware])
31
31
  .validator(bugIdSchema)
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
- const userId = session.user.id;
34
+ const userId = context.user.id;
37
35
 
38
36
  await assertBugProjectMember(data.bugId, userId);
39
37
 
@@ -57,12 +55,11 @@ export const getBugDetailFn = createServerFn({ method: "GET" })
57
55
  });
58
56
 
59
57
  export const getBugNeighborsFn = createServerFn({ method: "GET" })
58
+ .middleware([authContextMiddleware])
60
59
  .validator(bugIdSchema)
61
- .handler(async ({ data }) => {
60
+ .handler(async ({ data, context }) => {
62
61
  const prisma = await getPrisma();
63
- const request = getRequest();
64
- const session = await requireAuth(request);
65
- const userId = session.user.id;
62
+ const userId = context.user.id;
66
63
 
67
64
  // 成员校验 + 圈定 projectId(任一方向越权均拒绝)
68
65
  const projectId = await assertBugProjectMember(data.bugId, userId);
@@ -91,12 +88,11 @@ const listEventsSchema = z.object({
91
88
  });
92
89
 
93
90
  export const listBugEventsFn = createServerFn({ method: "GET" })
91
+ .middleware([authContextMiddleware])
94
92
  .validator(listEventsSchema)
95
- .handler(async ({ data }) => {
93
+ .handler(async ({ data, context }) => {
96
94
  const prisma = await getPrisma();
97
- const request = getRequest();
98
- const session = await requireAuth(request);
99
- const userId = session.user.id;
95
+ const userId = context.user.id;
100
96
 
101
97
  await assertBugProjectMember(data.bugId, userId);
102
98
 
@@ -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
  import { ensureBuiltinIndependentProject, resolveStoryScopeProjectIds } from "@/server/builtin-project";
24
23
  import { diffDescriptionBlocks } from "@/lib/story/description-diff";
25
24
  import {
@@ -81,12 +80,11 @@ const listSchema = z.object({
81
80
  });
82
81
 
83
82
  export const listBugsFn = createServerFn({ method: "GET" })
83
+ .middleware([authContextMiddleware])
84
84
  .validator(listSchema)
85
- .handler(async ({ data }) => {
85
+ .handler(async ({ data, context }) => {
86
86
  const prisma = await getPrisma();
87
- const request = getRequest();
88
- const session = await requireAuth(request);
89
- const userId = session.user.id;
87
+ const userId = context.user.id;
90
88
 
91
89
  // projectId === "__archived__" 为归档视图特殊值,直达 buildListWhere(跨项目成员圈定);
92
90
  // 其余走 scope 解析:未传 = 全部可访问项目聚合,无效/非成员 → 静默回退独立项目,防越权
@@ -156,12 +154,11 @@ const createSchema = z.object({
156
154
  });
157
155
 
158
156
  export const createBugFn = createServerFn({ method: "POST" })
157
+ .middleware([authContextMiddleware])
159
158
  .validator(createSchema)
160
- .handler(async ({ data }) => {
159
+ .handler(async ({ data, context }) => {
161
160
  const prisma = await getPrisma();
162
- const request = getRequest();
163
- const session = await requireAuth(request);
164
- const userId = session.user.id;
161
+ const userId = context.user.id;
165
162
 
166
163
  let projectId = data.projectId;
167
164
  if (projectId) {
@@ -356,12 +353,11 @@ const BUG_Y_UPDATE_KEYS = new Set([
356
353
 
357
354
 
358
355
  export const updateBugFn = createServerFn({ method: "POST" })
356
+ .middleware([authContextMiddleware])
359
357
  .validator(updateSchema)
360
- .handler(async ({ data }) => {
358
+ .handler(async ({ data, context }) => {
361
359
  const prisma = await getPrisma();
362
- const request = getRequest();
363
- const session = await requireAuth(request);
364
- const userId = session.user.id;
360
+ const userId = context.user.id;
365
361
 
366
362
  // ── Yjs 多人协作 §5.3 写入门卫(任务 22;T21 教训:提至 $transaction
367
363
  // 之前——门卫转发含网络 I/O(TTL 内重试最坏 ≈4s),事务内等待会击穿
@@ -585,12 +581,11 @@ export const updateBugFn = createServerFn({ method: "POST" })
585
581
  const deleteSchema = z.object({ bugId: z.string() });
586
582
 
587
583
  export const deleteBugFn = createServerFn({ method: "POST" })
584
+ .middleware([authContextMiddleware])
588
585
  .validator(deleteSchema)
589
- .handler(async ({ data }) => {
586
+ .handler(async ({ data, context }) => {
590
587
  const prisma = await getPrisma();
591
- const request = getRequest();
592
- const session = await requireAuth(request);
593
- const userId = session.user.id;
588
+ const userId = context.user.id;
594
589
 
595
590
  const bug = await prisma.bug.findUnique({
596
591
  where: { id: data.bugId },
@@ -617,12 +612,11 @@ export const deleteBugFn = createServerFn({ method: "POST" })
617
612
  const archiveSchema = z.object({ bugId: z.string() });
618
613
 
619
614
  export const archiveBugFn = createServerFn({ method: "POST" })
615
+ .middleware([authContextMiddleware])
620
616
  .validator(archiveSchema)
621
- .handler(async ({ data }) => {
617
+ .handler(async ({ data, context }) => {
622
618
  const prisma = await getPrisma();
623
- const request = getRequest();
624
- const session = await requireAuth(request);
625
- const userId = session.user.id;
619
+ const userId = context.user.id;
626
620
 
627
621
  // R7:与 bulk 归档同口径的项目成员校验(单条归档同属批量写权限语义)
628
622
  await assertBugsInMemberProjects([data.bugId], userId);
@@ -659,12 +653,11 @@ export const archiveBugFn = createServerFn({ method: "POST" })
659
653
  });
660
654
 
661
655
  export const unarchiveBugFn = createServerFn({ method: "POST" })
656
+ .middleware([authContextMiddleware])
662
657
  .validator(archiveSchema)
663
- .handler(async ({ data }) => {
658
+ .handler(async ({ data, context }) => {
664
659
  const prisma = await getPrisma();
665
- const request = getRequest();
666
- const session = await requireAuth(request);
667
- const userId = session.user.id;
660
+ const userId = context.user.id;
668
661
 
669
662
  await assertBugsInMemberProjects([data.bugId], userId);
670
663
 
@@ -707,12 +700,11 @@ const idListSchema = z.object({ bugIds: z.array(z.string()).min(1).max(500) });
707
700
  const BULK_TX_BATCH_SIZE = 100;
708
701
 
709
702
  export const bulkArchiveBugsFn = createServerFn({ method: "POST" })
703
+ .middleware([authContextMiddleware])
710
704
  .validator(idListSchema)
711
- .handler(async ({ data }) => {
705
+ .handler(async ({ data, context }) => {
712
706
  const prisma = await getPrisma();
713
- const request = getRequest();
714
- const session = await requireAuth(request);
715
- const userId = session.user.id;
707
+ const userId = context.user.id;
716
708
 
717
709
  await assertBugsInMemberProjects(data.bugIds, userId);
718
710
 
@@ -760,12 +752,11 @@ export const bulkArchiveBugsFn = createServerFn({ method: "POST" })
760
752
  });
761
753
 
762
754
  export const bulkDeleteBugsFn = createServerFn({ method: "POST" })
755
+ .middleware([authContextMiddleware])
763
756
  .validator(idListSchema)
764
- .handler(async ({ data }) => {
757
+ .handler(async ({ data, context }) => {
765
758
  const prisma = await getPrisma();
766
- const request = getRequest();
767
- const session = await requireAuth(request);
768
- const userId = session.user.id;
759
+ const userId = context.user.id;
769
760
 
770
761
  await assertBugsInMemberProjects(data.bugIds, userId);
771
762
 
@@ -795,12 +786,11 @@ const bulkUpdateSchema = z.object({
795
786
  });
796
787
 
797
788
  export const bulkUpdateBugsFn = createServerFn({ method: "POST" })
789
+ .middleware([authContextMiddleware])
798
790
  .validator(bulkUpdateSchema)
799
- .handler(async ({ data }) => {
791
+ .handler(async ({ data, context }) => {
800
792
  const prisma = await getPrisma();
801
- const request = getRequest();
802
- const session = await requireAuth(request);
803
- const userId = session.user.id;
793
+ const userId = context.user.id;
804
794
 
805
795
  await assertBugsInMemberProjects(data.bugIds, userId);
806
796
 
@@ -23,7 +23,7 @@ import { getPrisma } from "@allbluecn/database/get-prisma";
23
23
  import { createServerFn } from "@tanstack/react-start";
24
24
  import { getRequest } from "@tanstack/react-start/server";
25
25
  import { z } from "zod";
26
- import { requireAuth } from "@/server/auth-helpers";
26
+ import { authContextMiddleware } from "@/server/middlewares/auth-context"
27
27
  import { requireFeature } from "@/server/entitlements";
28
28
  import { isProEdition } from "@/server/pro-services";
29
29
  import { toJsonInput } from "@/server/lib/prisma-json";
@@ -112,11 +112,9 @@ async function capPageSize(request: Request, pageSize: BugPageSize): Promise<Bug
112
112
  }
113
113
 
114
114
  /** 获取当前用户持久化的 BUG 显示选项(非法/缺失字段已回退默认值) */
115
- export const getBugDisplayOptionsFn = createServerFn({ method: "GET" }).handler(async () => {
115
+ export const getBugDisplayOptionsFn = createServerFn({ method: "GET" }).middleware([authContextMiddleware]).handler(async ({ context }) => {
116
116
  const prisma = await getPrisma();
117
- const request = getRequest();
118
- const session = await requireAuth(request);
119
- const userId = session.user.id;
117
+ const userId = context.user.id;
120
118
 
121
119
  const row = await prisma.bugFilterView.findFirst({
122
120
  where: { userId, name: BUG_DISPLAY_OPTIONS_VIEW_NAME },
@@ -124,23 +122,22 @@ export const getBugDisplayOptionsFn = createServerFn({ method: "GET" }).handler(
124
122
  select: { displayOptions: true },
125
123
  });
126
124
  const options = parseStoredOptions(row?.displayOptions);
127
- options.pageSize = await capPageSize(request, options.pageSize);
125
+ options.pageSize = await capPageSize(getRequest(), options.pageSize);
128
126
  return options;
129
127
  });
130
128
 
131
129
  /** 保存当前用户的 BUG 显示选项,返回更新后的完整对象 */
132
130
  export const updateBugDisplayOptionsFn = createServerFn({ method: "POST" })
131
+ .middleware([authContextMiddleware])
133
132
  .validator(optionsSchema)
134
- .handler(async ({ data }) => {
133
+ .handler(async ({ data, context }) => {
135
134
  const prisma = await getPrisma();
136
- const request = getRequest();
137
- const session = await requireAuth(request);
138
- const userId = session.user.id;
135
+ const userId = context.user.id;
139
136
 
140
137
  // 服务端强制校验:pageSize > 200(500/1000)为 Pro 专属,前端锁定只是 UX
141
138
  const options: BugDisplayOptions = {
142
139
  ...data,
143
- pageSize: await capPageSize(request, data.pageSize),
140
+ pageSize: await capPageSize(getRequest(), data.pageSize),
144
141
  };
145
142
 
146
143
  // 与 get 路径同一 orderBy:并发双保留行时读写对齐首行,避免保存后读不到
@@ -16,7 +16,7 @@
16
16
  // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
 
18
18
  // BUG 列表 CSV 导出 serverFn(四期 Q8 任务 44,与 testcase-export.ts 同构;
19
- // 照 bug-crud listBugsFn 口径)。权限:首行 requireAuth + resolveStoryScope-
19
+ // 照 bug-crud listBugsFn 口径)。权限:authContextMiddleware 鉴权 + resolveStoryScope-
20
20
  // ProjectIds(projectId 缺省 → 成员关系内全部项目聚合;传值 → 单项目经鉴权)。
21
21
  // 特殊值 projectId="__archived__"(归档视图)与 listBugsFn 同款直达 buildListWhere
22
22
  // (跨项目成员圈定,防越权读他项目归档数据)。筛选:filters 为客户端
@@ -29,10 +29,9 @@
29
29
  // 原值输出保持机器可读。
30
30
  import { getPrisma } from "@allbluecn/database/get-prisma";
31
31
  import { createServerFn } from "@tanstack/react-start";
32
- import { getRequest } from "@tanstack/react-start/server";
33
32
  import { z } from "zod";
34
33
  import type { Prisma } from "@allbluecn/database";
35
- import { requireAuth } from "@/server/auth-helpers";
34
+ import { authContextMiddleware } from "@/server/middlewares/auth-context"
36
35
  import { checkRateLimit } from "@/server/middlewares/rate-limit-server-fn";
37
36
  import { resolveStoryScopeProjectIds } from "@/server/builtin-project";
38
37
  import { buildListWhere } from "./bug-list-query";
@@ -84,12 +83,11 @@ const BUG_EXPORT_SELECT = {
84
83
  type BugExportRow = Prisma.BugGetPayload<{ select: typeof BUG_EXPORT_SELECT }>;
85
84
 
86
85
  export const exportBugsFn = createServerFn({ method: "GET" })
86
+ .middleware([authContextMiddleware])
87
87
  .validator(exportSchema)
88
- .handler(async ({ data }) => {
88
+ .handler(async ({ data, context }) => {
89
89
  const prisma = await getPrisma();
90
- const request = getRequest();
91
- const session = await requireAuth(request);
92
- const userId = session.user.id;
90
+ const userId = context.user.id;
93
91
 
94
92
  const rl = checkRateLimit(`bug-export:${userId}`, EXPORT_RATE_LIMIT);
95
93
  if (!rl.allowed) {
@@ -23,9 +23,8 @@
23
23
  // 同 bug-comments.ts 先例);权限与序列化助手下沉独立模块。
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
  import { fireBugWebhook } from "@/server/bug-report/webhook-out";
30
29
  import { assertBugProjectMember } from "@/server/bug/bug-permissions";
31
30
 
@@ -126,12 +125,11 @@ function castProgress(row: ProgressRow): FixProgressItem {
126
125
  }
127
126
 
128
127
  export const requestBugFixFn = createServerFn({ method: "POST" })
128
+ .middleware([authContextMiddleware])
129
129
  .validator(z.object({ bugId: z.string() }))
130
- .handler(async ({ data }) => {
130
+ .handler(async ({ data, context }) => {
131
131
  const prisma = await getPrisma();
132
- const request = getRequest();
133
- const session = await requireAuth(request);
134
- const userId = session.user.id;
132
+ const userId = context.user.id;
135
133
 
136
134
  const projectId = await assertBugProjectMember(data.bugId, userId);
137
135
 
@@ -194,12 +192,11 @@ export const requestBugFixFn = createServerFn({ method: "POST" })
194
192
  });
195
193
 
196
194
  export const cancelBugFixFn = createServerFn({ method: "POST" })
195
+ .middleware([authContextMiddleware])
197
196
  .validator(z.object({ bugId: z.string() }))
198
- .handler(async ({ data }) => {
197
+ .handler(async ({ data, context }) => {
199
198
  const prisma = await getPrisma();
200
- const request = getRequest();
201
- const session = await requireAuth(request);
202
- const userId = session.user.id;
199
+ const userId = context.user.id;
203
200
 
204
201
  await assertBugProjectMember(data.bugId, userId);
205
202
 
@@ -230,12 +227,11 @@ export const cancelBugFixFn = createServerFn({ method: "POST" })
230
227
  });
231
228
 
232
229
  export const listFixRunsFn = createServerFn({ method: "GET" })
230
+ .middleware([authContextMiddleware])
233
231
  .validator(z.object({ bugId: z.string() }))
234
- .handler(async ({ data }) => {
232
+ .handler(async ({ data, context }) => {
235
233
  const prisma = await getPrisma();
236
- const request = getRequest();
237
- const session = await requireAuth(request);
238
- const userId = session.user.id;
234
+ const userId = context.user.id;
239
235
 
240
236
  await assertBugProjectMember(data.bugId, userId);
241
237
 
@@ -21,9 +21,8 @@
21
21
  // (缺省 = 全部可访问项目聚合,防越权只返回成员关系内项目)。
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 { resolveStoryScopeProjectIds } from "@/server/builtin-project";
28
27
  import {
29
28
  BUG_GROUP_KEYS,
@@ -93,12 +92,11 @@ const inGroupSchema = z.object({
93
92
  });
94
93
 
95
94
  export const listBugsInGroupFn = createServerFn({ method: "GET" })
95
+ .middleware([authContextMiddleware])
96
96
  .validator(inGroupSchema)
97
- .handler(async ({ data }) => {
97
+ .handler(async ({ data, context }) => {
98
98
  const prisma = await getPrisma();
99
- const request = getRequest();
100
- const session = await requireAuth(request);
101
- const userId = session.user.id;
99
+ const userId = context.user.id;
102
100
 
103
101
  const scope = await resolveReadScope(data.projectId, userId);
104
102
  const base = buildListWhere({
@@ -150,12 +148,11 @@ const allGroupsItemsSchema = z.object({
150
148
  });
151
149
 
152
150
  export const listAllGroupsItemsFn = createServerFn({ method: "GET" })
151
+ .middleware([authContextMiddleware])
153
152
  .validator(allGroupsItemsSchema)
154
- .handler(async ({ data }) => {
153
+ .handler(async ({ data, context }) => {
155
154
  const prisma = await getPrisma();
156
- const request = getRequest();
157
- const session = await requireAuth(request);
158
- const userId = session.user.id;
155
+ const userId = context.user.id;
159
156
 
160
157
  const scope = await resolveReadScope(data.projectId, userId);
161
158
  const base = buildListWhere({
@@ -202,12 +199,11 @@ const listGroupsSchema = z.object({
202
199
  });
203
200
 
204
201
  export const listBugGroupsFn = createServerFn({ method: "GET" })
202
+ .middleware([authContextMiddleware])
205
203
  .validator(listGroupsSchema)
206
- .handler(async ({ data }) => {
204
+ .handler(async ({ data, context }) => {
207
205
  const prisma = await getPrisma();
208
- const request = getRequest();
209
- const session = await requireAuth(request);
210
- const userId = session.user.id;
206
+ const userId = context.user.id;
211
207
 
212
208
  const scope = await resolveReadScope(data.projectId, userId);
213
209
  const where = buildListWhere({
@@ -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
  import { assertProjectMembership } from "@/server/bug/bug-permissions";
24
23
  import { aggregateReactions } from "@/server/story/types";
25
24
 
@@ -36,12 +35,11 @@ async function assertBugCommentProjectMember(commentId: string, userId: string)
36
35
  }
37
36
 
38
37
  export const listBugCommentReactionsFn = createServerFn({ method: "GET" })
38
+ .middleware([authContextMiddleware])
39
39
  .validator(z.object({ commentId: z.string() }))
40
- .handler(async ({ data }) => {
40
+ .handler(async ({ data, context }) => {
41
41
  const prisma = await getPrisma();
42
- const request = getRequest();
43
- const session = await requireAuth(request);
44
- const userId = session.user.id;
42
+ const userId = context.user.id;
45
43
 
46
44
  await assertBugCommentProjectMember(data.commentId, userId);
47
45
 
@@ -54,12 +52,11 @@ export const listBugCommentReactionsFn = createServerFn({ method: "GET" })
54
52
  });
55
53
 
56
54
  export const addBugCommentReactionFn = createServerFn({ method: "POST" })
55
+ .middleware([authContextMiddleware])
57
56
  .validator(z.object({ commentId: z.string(), emoji: z.string().min(1) }))
58
- .handler(async ({ data }) => {
57
+ .handler(async ({ data, context }) => {
59
58
  const prisma = await getPrisma();
60
- const request = getRequest();
61
- const session = await requireAuth(request);
62
- const userId = session.user.id;
59
+ const userId = context.user.id;
63
60
 
64
61
  await assertBugCommentProjectMember(data.commentId, userId);
65
62
 
@@ -87,12 +84,11 @@ export const addBugCommentReactionFn = createServerFn({ method: "POST" })
87
84
  });
88
85
 
89
86
  export const toggleBugCommentReactionFn = createServerFn({ method: "POST" })
87
+ .middleware([authContextMiddleware])
90
88
  .validator(z.object({ commentId: z.string(), emoji: z.string().min(1) }))
91
- .handler(async ({ data }) => {
89
+ .handler(async ({ data, context }) => {
92
90
  const prisma = await getPrisma();
93
- const request = getRequest();
94
- const session = await requireAuth(request);
95
- const userId = session.user.id;
91
+ const userId = context.user.id;
96
92
 
97
93
  await assertBugCommentProjectMember(data.commentId, userId);
98
94
 
@@ -21,9 +21,8 @@
21
21
  // story/testCase 的 boardOrder 直写先例一致,无 withCollabGuard 接线。
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 { getAccessibleProjectIds } from "@/server/bug/bug-permissions";
28
27
 
29
28
  const reorderSchema = z.object({
@@ -39,14 +38,13 @@ const reorderSchema = z.object({
39
38
  });
40
39
 
41
40
  export const reorderBugsFn = createServerFn({ method: "POST" })
41
+ .middleware([authContextMiddleware])
42
42
  .validator(reorderSchema)
43
- .handler(async ({ data }) => {
43
+ .handler(async ({ data, context }) => {
44
44
  const prisma = await getPrisma();
45
- const request = getRequest();
46
- const session = await requireAuth(request);
47
45
  // 可见性过滤进 where(SEC-03:防跨项目改他人 BUG 排序);updateMany 对
48
46
  // 越权/不存在 id 静默跳过,不中断整批合法排序
49
- const visibleProjectIds = await getAccessibleProjectIds(session.user.id);
47
+ const visibleProjectIds = await getAccessibleProjectIds(context.user.id);
50
48
 
51
49
  await prisma.$transaction(
52
50
  data.items.map((item) =>