@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
@@ -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 { ACTIVITY_SELECT, toActivityItem } from "@/server/story/types";
24
23
  import { buildKbScopeWhere } from "./kb-scope";
25
24
  import {
@@ -48,12 +47,11 @@ import { assertStoryProjectMember } from "@/server/story/permissions";
48
47
  // 批量关联设计(PRD 文档与 UI 画板同源 Design 表,链接统一落 storyDesignLink)。
49
48
  // 设计单属主:仅本人未删除设计可关联(口径同 searchDesignsFn),越界 id 归 failed。
50
49
  export const linkDesignsFn = createServerFn({ method: "POST" })
50
+ .middleware([authContextMiddleware])
51
51
  .validator(z.object({ storyId: z.string(), designIds: z.array(z.string()).min(1) }))
52
- .handler(async ({ data }) => {
52
+ .handler(async ({ data, context }) => {
53
53
  const prisma = await getPrisma()
54
- const request = getRequest();
55
- const session = await requireAuth(request);
56
- const userId = session.user.id;
54
+ const userId = context.user.id;
57
55
 
58
56
  await assertStoryProjectMember(data.storyId, userId);
59
57
 
@@ -99,12 +97,11 @@ export const linkDesignsFn = createServerFn({ method: "POST" })
99
97
  });
100
98
 
101
99
  export const unlinkDesignFn = createServerFn({ method: "POST" })
100
+ .middleware([authContextMiddleware])
102
101
  .validator(z.object({ storyId: z.string(), designId: z.string() }))
103
- .handler(async ({ data }) => {
102
+ .handler(async ({ data, context }) => {
104
103
  const prisma = await getPrisma()
105
- const request = getRequest();
106
- const session = await requireAuth(request);
107
- const userId = session.user.id;
104
+ const userId = context.user.id;
108
105
 
109
106
  await assertStoryProjectMember(data.storyId, userId);
110
107
 
@@ -132,12 +129,11 @@ export const unlinkDesignFn = createServerFn({ method: "POST" })
132
129
  });
133
130
 
134
131
  export const getLinkedDesignsFn = createServerFn({ method: "GET" })
132
+ .middleware([authContextMiddleware])
135
133
  .validator(z.object({ storyId: z.string() }))
136
- .handler(async ({ data }) => {
134
+ .handler(async ({ data, context }) => {
137
135
  const prisma = await getPrisma()
138
- const request = getRequest();
139
- const session = await requireAuth(request);
140
- await assertStoryProjectMember(data.storyId, session.user.id);
136
+ await assertStoryProjectMember(data.storyId, context.user.id);
141
137
 
142
138
  const links = await prisma.storyDesignLink.findMany({
143
139
  where: { storyId: data.storyId, design: { isDeleted: false } },
@@ -160,12 +156,11 @@ export const getLinkedDesignsFn = createServerFn({ method: "GET" })
160
156
  });
161
157
 
162
158
  export const searchDesignsFn = createServerFn({ method: "GET" })
159
+ .middleware([authContextMiddleware])
163
160
  .validator(z.object({ query: z.string() }))
164
- .handler(async ({ data }) => {
161
+ .handler(async ({ data, context }) => {
165
162
  const prisma = await getPrisma()
166
- const request = getRequest();
167
- const session = await requireAuth(request);
168
- const userId = session.user.id;
163
+ const userId = context.user.id;
169
164
 
170
165
  // Design 单属主(无项目归属),口径同 listDesignsFn / attach-guards:仅返回本人未删除设计
171
166
  const prds = await prisma.design.findMany({
@@ -204,12 +199,11 @@ async function resolveStoryScope(storyId: string, userId: string) {
204
199
  }
205
200
 
206
201
  export const listStoryAvailableKbsFn = createServerFn({ method: "GET" })
202
+ .middleware([authContextMiddleware])
207
203
  .validator(z.object({ storyId: z.string() }))
208
- .handler(async ({ data }) => {
204
+ .handler(async ({ data, context }) => {
209
205
  const prisma = await getPrisma()
210
- const request = getRequest();
211
- const session = await requireAuth(request);
212
- const scope = await resolveStoryScope(data.storyId, session.user.id);
206
+ const scope = await resolveStoryScope(data.storyId, context.user.id);
213
207
  const kbs = await prisma.knowledgeBase.findMany({
214
208
  where: { AND: [scope, { isDeleted: false }] },
215
209
  select: { id: true, name: true, icon: true, visibility: true },
@@ -219,6 +213,7 @@ export const listStoryAvailableKbsFn = createServerFn({ method: "GET" })
219
213
  });
220
214
 
221
215
  export const searchKbDocsFn = createServerFn({ method: "GET" })
216
+ .middleware([authContextMiddleware])
222
217
  .validator(
223
218
  z.object({
224
219
  storyId: z.string(),
@@ -228,15 +223,13 @@ export const searchKbDocsFn = createServerFn({ method: "GET" })
228
223
  cursor: z.string().optional(),
229
224
  }),
230
225
  )
231
- .handler(async ({ data }) => {
226
+ .handler(async ({ data, context }) => {
232
227
  const prisma = await getPrisma()
233
- const request = getRequest();
234
- const session = await requireAuth(request);
235
- const scope = await resolveStoryScope(data.storyId, session.user.id);
228
+ const scope = await resolveStoryScope(data.storyId, context.user.id);
236
229
 
237
230
  if (data.generalGroup) {
238
231
  // 态③:通用知识库分组 → 平铺列表(周报月报暂无实体内容)
239
- const items = await searchGeneralGroupDocs(data.generalGroup, session.user.id, data.query);
232
+ const items = await searchGeneralGroupDocs(data.generalGroup, context.user.id, data.query);
240
233
  return { items, nextCursor: null };
241
234
  }
242
235
 
@@ -281,12 +274,11 @@ export const searchKbDocsFn = createServerFn({ method: "GET" })
281
274
  });
282
275
 
283
276
  export const linkDocsFn = createServerFn({ method: "POST" })
277
+ .middleware([authContextMiddleware])
284
278
  .validator(z.object({ storyId: z.string(), docIds: z.array(z.string()).min(1) }))
285
- .handler(async ({ data }) => {
279
+ .handler(async ({ data, context }) => {
286
280
  const prisma = await getPrisma()
287
- const request = getRequest();
288
- const session = await requireAuth(request);
289
- const userId = session.user.id;
281
+ const userId = context.user.id;
290
282
  await assertStoryProjectMember(data.storyId, userId);
291
283
  const scope = await resolveStoryScope(data.storyId, userId);
292
284
 
@@ -395,12 +387,11 @@ export const linkDocsFn = createServerFn({ method: "POST" })
395
387
  });
396
388
 
397
389
  export const unlinkDocFn = createServerFn({ method: "POST" })
390
+ .middleware([authContextMiddleware])
398
391
  .validator(z.object({ storyId: z.string(), docId: z.string() }))
399
- .handler(async ({ data }) => {
392
+ .handler(async ({ data, context }) => {
400
393
  const prisma = await getPrisma()
401
- const request = getRequest();
402
- const session = await requireAuth(request);
403
- const userId = session.user.id;
394
+ const userId = context.user.id;
404
395
 
405
396
  await assertStoryProjectMember(data.storyId, userId);
406
397
 
@@ -431,11 +422,10 @@ export const unlinkDocFn = createServerFn({ method: "POST" })
431
422
  });
432
423
 
433
424
  export const getLinkedDocsFn = createServerFn({ method: "GET" })
425
+ .middleware([authContextMiddleware])
434
426
  .validator(z.object({ storyId: z.string() }))
435
- .handler(async ({ data }) => {
427
+ .handler(async ({ data, context }) => {
436
428
  const prisma = await getPrisma()
437
- const request = getRequest();
438
- const session = await requireAuth(request);
439
429
  const links = await prisma.storyDocLink.findMany({
440
430
  where: { storyId: data.storyId },
441
431
  include: { doc: { select: DOC_SELECT } },
@@ -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 { ACTIVITY_SELECT, toActivityItem } from "@/server/story/types";
24
23
  import {
25
24
  assertStoryProjectMember,
@@ -27,12 +26,11 @@ import {
27
26
  } from "@/server/story/permissions";
28
27
 
29
28
  export const removeAttachmentFn = createServerFn({ method: "POST" })
29
+ .middleware([authContextMiddleware])
30
30
  .validator(z.object({ attachmentId: z.string() }))
31
- .handler(async ({ data }) => {
31
+ .handler(async ({ data, context }) => {
32
32
  const prisma = await getPrisma()
33
- const request = getRequest();
34
- const session = await requireAuth(request);
35
- const userId = session.user.id;
33
+ const userId = context.user.id;
36
34
 
37
35
  const attachment = await prisma.storyAttachment.findUnique({ where: { id: data.attachmentId } });
38
36
  // 反查附件所属需求的项目成员资格(SEC-03:防删他人需求的附件)
@@ -67,12 +65,11 @@ export const removeAttachmentFn = createServerFn({ method: "POST" })
67
65
  });
68
66
 
69
67
  export const getAttachmentsFn = createServerFn({ method: "GET" })
68
+ .middleware([authContextMiddleware])
70
69
  .validator(z.object({ storyId: z.string() }))
71
- .handler(async ({ data }) => {
70
+ .handler(async ({ data, context }) => {
72
71
  const prisma = await getPrisma()
73
- const request = getRequest();
74
- const session = await requireAuth(request);
75
- await assertStoryProjectMember(data.storyId, session.user.id);
72
+ await assertStoryProjectMember(data.storyId, context.user.id);
76
73
 
77
74
  const attachments = await prisma.storyAttachment.findMany({
78
75
  where: { storyId: data.storyId },
@@ -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 { assertStoryProjectMember } from "@/server/story/permissions";
24
23
  import { STORY_LIST_SELECT, castStoryUsers } from "@/server/story/types";
25
24
 
@@ -28,13 +27,12 @@ import type { StoryListItem } from "@/shared/story/types";
28
27
  const childrenSchema = z.object({ parentId: z.string() });
29
28
 
30
29
  export const listChildStoriesFn = createServerFn({ method: "GET" })
30
+ .middleware([authContextMiddleware])
31
31
  .validator(childrenSchema)
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
  // 经父需求反查项目做成员校验
37
- await assertStoryProjectMember(data.parentId, session.user.id);
35
+ await assertStoryProjectMember(data.parentId, context.user.id);
38
36
 
39
37
  const stories = await prisma.story.findMany({
40
38
  where: { parentId: data.parentId, archived: false },
@@ -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 { CommentWithReplies, ReactionGroup } from "@/shared/story/types";
24
23
  import { USER_BRIEF_SELECT, castUserBrief } from "@/server/story/user-brief";
25
24
  import { aggregateReactions } from "@/server/story/types";
@@ -28,12 +27,11 @@ import { assertStoryProjectMember, assertStoryProjectMembership as assertProject
28
27
 
29
28
 
30
29
  export const listCommentsFn = createServerFn({ method: "GET" })
30
+ .middleware([authContextMiddleware])
31
31
  .validator(z.object({ storyId: z.string() }))
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
  await assertStoryProjectMember(data.storyId, userId);
38
36
 
39
37
  const comments = await prisma.storyComment.findMany({
@@ -84,12 +82,11 @@ const commentCreateSchema = z.object({
84
82
  });
85
83
 
86
84
  export const createCommentFn = createServerFn({ method: "POST" })
85
+ .middleware([authContextMiddleware])
87
86
  .validator(commentCreateSchema)
88
- .handler(async ({ data }) => {
87
+ .handler(async ({ data, context }) => {
89
88
  const prisma = await getPrisma()
90
- const request = getRequest();
91
- const session = await requireAuth(request);
92
- const userId = session.user.id;
89
+ const userId = context.user.id;
93
90
 
94
91
  await assertStoryProjectMember(data.storyId, userId);
95
92
 
@@ -135,12 +132,11 @@ const commentUpdateSchema = z.object({
135
132
  });
136
133
 
137
134
  export const updateCommentFn = createServerFn({ method: "POST" })
135
+ .middleware([authContextMiddleware])
138
136
  .validator(commentUpdateSchema)
139
- .handler(async ({ data }) => {
137
+ .handler(async ({ data, context }) => {
140
138
  const prisma = await getPrisma()
141
- const request = getRequest();
142
- const session = await requireAuth(request);
143
- const userId = session.user.id;
139
+ const userId = context.user.id;
144
140
 
145
141
  const existing = await prisma.storyComment.findUnique({
146
142
  where: { id: data.commentId },
@@ -164,12 +160,11 @@ export const updateCommentFn = createServerFn({ method: "POST" })
164
160
  });
165
161
 
166
162
  export const deleteCommentFn = createServerFn({ method: "POST" })
163
+ .middleware([authContextMiddleware])
167
164
  .validator(z.object({ commentId: z.string() }))
168
- .handler(async ({ data }) => {
165
+ .handler(async ({ data, context }) => {
169
166
  const prisma = await getPrisma()
170
- const request = getRequest();
171
- const session = await requireAuth(request);
172
- const userId = session.user.id;
167
+ const userId = context.user.id;
173
168
 
174
169
  const existing = await prisma.storyComment.findUnique({
175
170
  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 { assertStoryProjectMember } from "@/server/story/permissions";
24
23
  import { USER_BRIEF_SELECT, castUserBrief } from "@/server/story/user-brief";
25
24
 
@@ -30,12 +29,11 @@ const listActivitiesSchema = z.object({
30
29
  });
31
30
 
32
31
  export const listActivitiesFn = createServerFn({ method: "GET" })
32
+ .middleware([authContextMiddleware])
33
33
  .validator(listActivitiesSchema)
34
- .handler(async ({ data }) => {
34
+ .handler(async ({ data, context }) => {
35
35
  const prisma = await getPrisma()
36
- const request = getRequest();
37
- const session = await requireAuth(request);
38
- await assertStoryProjectMember(data.storyId, session.user.id);
36
+ await assertStoryProjectMember(data.storyId, context.user.id);
39
37
 
40
38
  const activities = await prisma.storyActivity.findMany({
41
39
  where: {
@@ -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 { STORY_LIST_SELECT, castStoryUsers } from "@/server/story/types";
24
23
  import { buildRoomName } from "@allbluecn/collab-core/rooms";
25
24
  import { touchCollabSnapshot } from "@/server/collab/touch-snapshot";
@@ -30,12 +29,11 @@ const archiveStorySchema = z.object({ storyId: z.string() });
30
29
 
31
30
 
32
31
  export const archiveStoryFn = createServerFn({ method: "POST" })
32
+ .middleware([authContextMiddleware])
33
33
  .validator(archiveStorySchema)
34
- .handler(async ({ data }) => {
34
+ .handler(async ({ data, context }) => {
35
35
  const prisma = await getPrisma()
36
- const request = getRequest();
37
- const session = await requireAuth(request);
38
- const userId = session.user.id;
36
+ const userId = context.user.id;
39
37
 
40
38
  await assertStoryProjectMember(data.storyId, userId);
41
39
 
@@ -72,12 +70,11 @@ export const archiveStoryFn = createServerFn({ method: "POST" })
72
70
  });
73
71
 
74
72
  export const unarchiveStoryFn = createServerFn({ method: "POST" })
73
+ .middleware([authContextMiddleware])
75
74
  .validator(archiveStorySchema)
76
- .handler(async ({ data }) => {
75
+ .handler(async ({ data, context }) => {
77
76
  const prisma = await getPrisma()
78
- const request = getRequest();
79
- const session = await requireAuth(request);
80
- const userId = session.user.id;
77
+ const userId = context.user.id;
81
78
 
82
79
  await assertStoryProjectMember(data.storyId, userId);
83
80
 
@@ -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 { STORY_STATES, STORY_PRIORITIES, type StoryState, type StoryPriority } from "@/shared/story/constants";
24
23
  import { toDateKeyUtc } from "@/server/story/date-key";
25
24
  import type { Prisma } from "@allbluecn/database";
@@ -39,12 +38,11 @@ async function accessibleProjectIds(userId: string): Promise<string[]> {
39
38
  }
40
39
 
41
40
  export const bulkArchiveStoriesFn = createServerFn({ method: "POST" })
41
+ .middleware([authContextMiddleware])
42
42
  .validator(idListSchema)
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
- const userId = session.user.id;
45
+ const userId = context.user.id;
48
46
  const visibleProjectIds = await accessibleProjectIds(userId);
49
47
 
50
48
  return prisma.$transaction(async (tx) => {
@@ -82,13 +80,12 @@ export const bulkArchiveStoriesFn = createServerFn({ method: "POST" })
82
80
  });
83
81
 
84
82
  export const bulkDeleteStoriesFn = createServerFn({ method: "POST" })
83
+ .middleware([authContextMiddleware])
85
84
  .validator(idListSchema)
86
- .handler(async ({ data }) => {
85
+ .handler(async ({ data, context }) => {
87
86
  const prisma = await getPrisma()
88
- const request = getRequest();
89
- const session = await requireAuth(request);
90
87
  // 可见性过滤进 where:跨项目 id 静默跳过而非报错(SEC-03/DB-03:单语句消除跨项目删除)
91
- const visibleProjectIds = await accessibleProjectIds(session.user.id);
88
+ const visibleProjectIds = await accessibleProjectIds(context.user.id);
92
89
  const result = await prisma.story.deleteMany({
93
90
  where: { id: { in: data.storyIds }, projectId: { in: visibleProjectIds } },
94
91
  });
@@ -112,12 +109,11 @@ const bulkUpdateSchema = z.object({
112
109
  });
113
110
 
114
111
  export const bulkUpdateStoriesFn = createServerFn({ method: "POST" })
112
+ .middleware([authContextMiddleware])
115
113
  .validator(bulkUpdateSchema)
116
- .handler(async ({ data }) => {
114
+ .handler(async ({ data, context }) => {
117
115
  const prisma = await getPrisma()
118
- const request = getRequest();
119
- const session = await requireAuth(request);
120
- const userId = session.user.id;
116
+ const userId = context.user.id;
121
117
  const visibleProjectIds = await accessibleProjectIds(userId);
122
118
 
123
119
  return prisma.$transaction(async (tx) => {
@@ -17,20 +17,18 @@
17
17
 
18
18
  import { getPrisma } from "@allbluecn/database/get-prisma"
19
19
  import { createServerFn } from "@tanstack/react-start";
20
- import { getRequest } from "@tanstack/react-start/server";
21
20
  import { z } from "zod";
22
- import { requireAuth } from "@/server/auth-helpers";
21
+ import { authContextMiddleware } from "@/server/middlewares/auth-context"
23
22
  import { assertStoryProjectMember, assertStoryProjectMembership } from "@/server/story/permissions";
24
23
  import { STORY_LIST_SELECT, castStoryUsers } from "@/server/story/types";
25
24
 
26
25
  const detailSchema = z.object({ storyId: z.string() });
27
26
 
28
27
  export const getStoryNeighborsFn = createServerFn({ method: "GET" })
28
+ .middleware([authContextMiddleware])
29
29
  .validator(detailSchema)
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
 
35
33
  const current = await prisma.story.findUnique({
36
34
  where: { id: data.storyId },
@@ -38,7 +36,7 @@ export const getStoryNeighborsFn = createServerFn({ method: "GET" })
38
36
  });
39
37
  if (!current) return { prevId: null, nextId: null };
40
38
  // 读侧成员校验(复用已查到的 projectId,免二次反查)
41
- await assertStoryProjectMembership(current.projectId, session.user.id);
39
+ await assertStoryProjectMembership(current.projectId, context.user.id);
42
40
 
43
41
  const [prev, next] = await Promise.all([
44
42
  prisma.story.findFirst({
@@ -57,13 +55,12 @@ export const getStoryNeighborsFn = createServerFn({ method: "GET" })
57
55
  });
58
56
 
59
57
  export const getStoryDetailFn = createServerFn({ method: "GET" })
58
+ .middleware([authContextMiddleware])
60
59
  .validator(detailSchema)
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
62
  // 读侧与写侧同口径:须为需求所属项目的有效成员(审计 2026-10-25 story 域读路径缺口)
66
- await assertStoryProjectMember(data.storyId, session.user.id);
63
+ await assertStoryProjectMember(data.storyId, context.user.id);
67
64
  const story = await prisma.story.findUnique({
68
65
  where: { id: data.storyId },
69
66
  select: { ...STORY_LIST_SELECT, sequenceId: true },
@@ -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 { suggestLabelsCore } from "@/server/story/story-crud/label-suggest-core"
23
22
 
24
23
  const suggestSchema = z.object({
@@ -28,11 +27,10 @@ const suggestSchema = z.object({
28
27
  })
29
28
 
30
29
  export const suggestStoryLabelsFn = createServerFn({ method: "POST" })
30
+ .middleware([authContextMiddleware])
31
31
  .validator(suggestSchema)
32
- .handler(async ({ data }) => {
33
- const request = getRequest()
34
- const session = await requireAuth(request)
35
- const userId = session.user?.id
32
+ .handler(async ({ data, context }) => {
33
+ const userId = context.user.id
36
34
  if (!userId) throw new Error("用户未登录")
37
35
  return suggestLabelsCore(data, userId)
38
36
  })
@@ -17,10 +17,9 @@
17
17
 
18
18
  import { z } from "zod";
19
19
  import { getPrisma } from "@allbluecn/database/get-prisma";
20
- import { getRequest } from "@tanstack/react-start/server";
21
20
  import { createServerFn } from "@tanstack/react-start";
22
- import { requireAuth } from "@/server/auth-helpers";
23
- import type { Prisma } from '@allbluecn/database'
21
+ import { authContextMiddleware } from "@/server/middlewares/auth-context";
22
+ import type { Prisma } from "@allbluecn/database";
24
23
  import { upsertLabel } from "@/server/story/story-crud/label-upsert";
25
24
 
26
25
  const labelCreateSchema = z.object({
@@ -32,11 +31,10 @@ const labelCreateSchema = z.object({
32
31
 
33
32
  /** S24:标签范围 = 存量全局(projectId IS NULL)∪ 本项目归属。 */
34
33
  export const listLabelsFn = createServerFn({ method: "GET" })
34
+ .middleware([authContextMiddleware])
35
35
  .validator(z.object({ projectId: z.string().optional() }))
36
36
  .handler(async ({ data }) => {
37
37
  const prisma = await getPrisma()
38
- const request = getRequest();
39
- await requireAuth(request);
40
38
  // null 字面量与 Prisma Nullable 字段类型不可比(TS 限制),Json 边界同款
41
39
  // 单点断言收窄(S24)
42
40
  const where = {
@@ -53,10 +51,9 @@ export const listLabelsFn = createServerFn({ method: "GET" })
53
51
  );
54
52
 
55
53
  export const createLabelFn = createServerFn({ method: "POST" })
54
+ .middleware([authContextMiddleware])
56
55
  .validator(labelCreateSchema)
57
- .handler(async ({ data }) => {
56
+ .handler(async ({ data, context }) => {
58
57
  const prisma = await getPrisma()
59
- const request = getRequest();
60
- const session = await requireAuth(request);
61
- return upsertLabel(data.name, session.user.id, data.color, data.projectId);
58
+ return upsertLabel(data.name, context.user.id, data.color, data.projectId);
62
59
  });
@@ -6,18 +6,16 @@
6
6
  // 与标签 CRUD 无关的职责混装),迁出为单一职责文件,客户端消费方同步改 import。
7
7
  import { getPrisma } from "@allbluecn/database/get-prisma"
8
8
  import { createServerFn } from "@tanstack/react-start";
9
- import { getRequest } from "@tanstack/react-start/server";
10
- import { requireAuth } from "@/server/auth-helpers";
9
+ import { authContextMiddleware } from "@/server/middlewares/auth-context"
11
10
  import { assertStoryProjectMembership } from "@/server/story/permissions";
12
11
  import { USER_BRIEF_SELECT } from "@/server/story/user-brief";
13
12
 
14
13
  export const listUsersBriefFn = createServerFn({ method: "GET" })
14
+ .middleware([authContextMiddleware])
15
15
  .validator((data?: { projectId?: string }) => data)
16
- .handler(async ({ data }) => {
16
+ .handler(async ({ data, context }) => {
17
17
  const prisma = await getPrisma()
18
- const request = getRequest();
19
- const session = await requireAuth(request);
20
- const currentUserId = session.user.id;
18
+ const currentUserId = context.user.id;
21
19
 
22
20
  if (data?.projectId) {
23
21
  // 项目级别:只返回项目成员——且仅对该项目的有效成员开放(防跨项目成员枚举)
@@ -17,10 +17,9 @@
17
17
 
18
18
  import { getPrisma } from "@allbluecn/database/get-prisma"
19
19
  import { createServerFn } from "@tanstack/react-start";
20
- import { getRequest } from "@tanstack/react-start/server";
21
20
  import { z } from "zod";
22
21
  import { buildRoomName } from "@allbluecn/collab-core/rooms";
23
- import { requireAuth } from "@/server/auth-helpers";
22
+ import { authContextMiddleware } from "@/server/middlewares/auth-context"
24
23
  import { ensureBuiltinIndependentProject, resolveStoryScopeProjectIds } from "@/server/builtin-project";
25
24
  import { validateAssignee } from "@/server/lib/validate-assignee";
26
25
  import { withCollabGuard } from "@/server/collab/write-guard";
@@ -55,12 +54,11 @@ const listSchema = z.object({
55
54
  });
56
55
 
57
56
  export const listStoriesFn = createServerFn({ method: "GET" })
57
+ .middleware([authContextMiddleware])
58
58
  .validator(listSchema)
59
- .handler(async ({ data }) => {
59
+ .handler(async ({ data, context }) => {
60
60
  const prisma = await getPrisma()
61
- const request = getRequest();
62
- const session = await requireAuth(request);
63
- const userId = session.user.id;
61
+ const userId = context.user.id;
64
62
 
65
63
  const projectIds = await resolveStoryScopeProjectIds(data.projectId, userId);
66
64
 
@@ -99,12 +97,11 @@ const createSchema = z.object({
99
97
  });
100
98
 
101
99
  export const createStoryFn = createServerFn({ method: "POST" })
100
+ .middleware([authContextMiddleware])
102
101
  .validator(createSchema)
103
- .handler(async ({ data }) => {
102
+ .handler(async ({ data, context }) => {
104
103
  const prisma = await getPrisma()
105
- const request = getRequest();
106
- const session = await requireAuth(request);
107
- const userId = session.user.id;
104
+ const userId = context.user.id;
108
105
 
109
106
  let projectId = data.projectId;
110
107
  if (!projectId) {
@@ -200,12 +197,11 @@ function storyDescriptionToContent(description: string): { html: string; markdow
200
197
  }
201
198
 
202
199
  export const updateStoryFn = createServerFn({ method: "POST" })
200
+ .middleware([authContextMiddleware])
203
201
  .validator(updateSchema)
204
- .handler(async ({ data }) => {
202
+ .handler(async ({ data, context }) => {
205
203
  const prisma = await getPrisma()
206
- const request = getRequest();
207
- const session = await requireAuth(request);
208
- const userId = session.user.id;
204
+ const userId = context.user.id;
209
205
 
210
206
  // ── Yjs 多人协作 §5.3 写入门卫(任务 21;审查修正:提至 $transaction
211
207
  // 之前——门卫转发含网络 I/O(TTL 内重试最坏 ≈4s),事务内等待会击穿
@@ -514,12 +510,11 @@ export const updateStoryFn = createServerFn({ method: "POST" })
514
510
  const deleteSchema = z.object({ storyId: z.string() });
515
511
 
516
512
  export const deleteStoryFn = createServerFn({ method: "POST" })
513
+ .middleware([authContextMiddleware])
517
514
  .validator(deleteSchema)
518
- .handler(async ({ data }) => {
515
+ .handler(async ({ data, context }) => {
519
516
  const prisma = await getPrisma()
520
- const request = getRequest();
521
- const session = await requireAuth(request);
522
- const userId = session.user.id;
517
+ const userId = context.user.id;
523
518
 
524
519
  // 先取回目标行校验成员资格,再删(SEC-03:防跨项目删除他人需求)
525
520
  const existing = await prisma.story.findUnique({