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