@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
@@ -1,9 +1,8 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-or-later
2
2
  import { getPrisma } from "@allbluecn/database/get-prisma"
3
3
  import { createServerFn } from '@tanstack/react-start'
4
- import { getRequest } from '@tanstack/react-start/server'
5
4
  import { z } from 'zod'
6
- import { requireAuth } from '@/server/auth-helpers'
5
+ import { authContextMiddleware } from '@/server/middlewares/auth-context'
7
6
  import {
8
7
  NOTIFICATION_CATEGORIES,
9
8
  NOTIFICATION_FREQUENCIES,
@@ -27,12 +26,11 @@ const listSchema = z.object({
27
26
  })
28
27
 
29
28
  export const listNotificationsFn = createServerFn({ method: 'GET' })
29
+ .middleware([authContextMiddleware])
30
30
  .validator(listSchema)
31
- .handler(async ({ data }): Promise<NotificationListResult> => {
31
+ .handler(async ({ data, context }): Promise<NotificationListResult> => {
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 where = {
38
36
  userId,
@@ -72,12 +70,11 @@ export const listNotificationsFn = createServerFn({ method: 'GET' })
72
70
  const markReadSchema = z.object({ id: z.string().min(1) })
73
71
 
74
72
  export const markNotificationReadFn = createServerFn({ method: 'POST' })
73
+ .middleware([authContextMiddleware])
75
74
  .validator(markReadSchema)
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
  await prisma.notification.updateMany({
82
79
  where: { id: data.id, userId, readAt: null },
83
80
  data: { readAt: new Date() },
@@ -86,12 +83,11 @@ export const markNotificationReadFn = createServerFn({ method: 'POST' })
86
83
  })
87
84
 
88
85
  export const markAllNotificationsReadFn = createServerFn({ method: 'POST' })
86
+ .middleware([authContextMiddleware])
89
87
  .validator(z.object({}).optional())
90
- .handler(async () => {
88
+ .handler(async ({ context }) => {
91
89
  const prisma = await getPrisma()
92
- const request = getRequest()
93
- const session = await requireAuth(request)
94
- const userId = session.user.id
90
+ const userId = context.user.id
95
91
  const result = await prisma.notification.updateMany({
96
92
  where: { userId, readAt: null },
97
93
  data: { readAt: new Date() },
@@ -102,34 +98,31 @@ export const markAllNotificationsReadFn = createServerFn({ method: 'POST' })
102
98
  const deleteSchema = z.object({ id: z.string().min(1) })
103
99
 
104
100
  export const deleteNotificationFn = createServerFn({ method: 'POST' })
101
+ .middleware([authContextMiddleware])
105
102
  .validator(deleteSchema)
106
- .handler(async ({ data }) => {
103
+ .handler(async ({ data, context }) => {
107
104
  const prisma = await getPrisma()
108
- const request = getRequest()
109
- const session = await requireAuth(request)
110
- const userId = session.user.id
105
+ const userId = context.user.id
111
106
  await prisma.notification.deleteMany({ where: { id: data.id, userId } })
112
107
  return { success: true }
113
108
  })
114
109
 
115
110
  export const clearNotificationsFn = createServerFn({ method: 'POST' })
111
+ .middleware([authContextMiddleware])
116
112
  .validator(z.object({}).optional())
117
- .handler(async () => {
113
+ .handler(async ({ context }) => {
118
114
  const prisma = await getPrisma()
119
- const request = getRequest()
120
- const session = await requireAuth(request)
121
- const userId = session.user.id
115
+ const userId = context.user.id
122
116
  const result = await prisma.notification.deleteMany({ where: { userId } })
123
117
  return { success: true, count: result.count }
124
118
  })
125
119
 
126
120
  export const getUnreadCountFn = createServerFn({ method: 'GET' })
121
+ .middleware([authContextMiddleware])
127
122
  .validator(z.object({}).optional())
128
- .handler(async () => {
123
+ .handler(async ({ context }) => {
129
124
  const prisma = await getPrisma()
130
- const request = getRequest()
131
- const session = await requireAuth(request)
132
- const userId = session.user.id
125
+ const userId = context.user.id
133
126
  const count = await prisma.notification.count({
134
127
  where: { userId, readAt: null },
135
128
  })
@@ -137,12 +130,11 @@ export const getUnreadCountFn = createServerFn({ method: 'GET' })
137
130
  })
138
131
 
139
132
  export const getNotificationPreferencesFn = createServerFn({ method: 'GET' })
133
+ .middleware([authContextMiddleware])
140
134
  .validator(z.object({}).optional())
141
- .handler(async () => {
135
+ .handler(async ({ context }) => {
142
136
  const prisma = await getPrisma()
143
- const request = getRequest()
144
- const session = await requireAuth(request)
145
- return getOrCreatePreferences(session.user.id)
137
+ return getOrCreatePreferences(context.user.id)
146
138
  })
147
139
 
148
140
  const preferencesSchema = z.object({
@@ -160,12 +152,11 @@ const preferencesSchema = z.object({
160
152
  export const updateNotificationPreferencesFn = createServerFn({
161
153
  method: 'POST',
162
154
  })
155
+ .middleware([authContextMiddleware])
163
156
  .validator(preferencesSchema)
164
- .handler(async ({ data }) => {
157
+ .handler(async ({ data, context }) => {
165
158
  const prisma = await getPrisma()
166
- const request = getRequest()
167
- const session = await requireAuth(request)
168
- const userId = session.user.id
159
+ const userId = context.user.id
169
160
  const categories = { ...DEFAULT_CATEGORIES } as CategoryFrequencies
170
161
  for (const c of NOTIFICATION_CATEGORIES) {
171
162
  const v = data.categories[c]
@@ -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 {
25
24
  precheckPluginCode,
@@ -62,12 +61,10 @@ const deletePluginSchema = z.object({
62
61
  id: z.string(),
63
62
  });
64
63
 
65
- export const listPluginsFn = createServerFn({ method: "GET" }).handler(
66
- async () => {
64
+ export const listPluginsFn = createServerFn({ method: "GET" }).middleware([authContextMiddleware]).handler(
65
+ async ({ context }) => {
67
66
  const prisma = await getPrisma()
68
- const request = getRequest();
69
- const session = await requireAuth(request);
70
- const userId = session.user.id;
67
+ const userId = context.user.id;
71
68
 
72
69
  const plugins = await prisma.harnessPlugin.findMany({
73
70
  where: { userId, isDeleted: false },
@@ -91,12 +88,11 @@ export const listPluginsFn = createServerFn({ method: "GET" }).handler(
91
88
  );
92
89
 
93
90
  export const upsertPluginFn = createServerFn({ method: "POST" })
91
+ .middleware([authContextMiddleware])
94
92
  .validator(upsertPluginSchema)
95
- .handler(async ({ data }) => {
93
+ .handler(async ({ data, context }) => {
96
94
  const prisma = await getPrisma()
97
- const request = getRequest();
98
- const session = await requireAuth(request);
99
- const userId = session.user.id;
95
+ const userId = context.user.id;
100
96
 
101
97
  const precheck = precheckPluginCode(data);
102
98
  if (!precheck.ok) {
@@ -142,12 +138,11 @@ export const upsertPluginFn = createServerFn({ method: "POST" })
142
138
  });
143
139
 
144
140
  export const setPluginStatusFn = createServerFn({ method: "POST" })
141
+ .middleware([authContextMiddleware])
145
142
  .validator(setPluginStatusSchema)
146
- .handler(async ({ data }) => {
143
+ .handler(async ({ data, context }) => {
147
144
  const prisma = await getPrisma()
148
- const request = getRequest();
149
- const session = await requireAuth(request);
150
- const userId = session.user.id;
145
+ const userId = context.user.id;
151
146
 
152
147
  // DB-03:属主校验合并进写入(updateMany 计数判定),1 次查询替代 findFirst+update 2 次
153
148
  const res = await prisma.harnessPlugin.updateMany({
@@ -163,12 +158,11 @@ export const setPluginStatusFn = createServerFn({ method: "POST" })
163
158
  });
164
159
 
165
160
  export const setPluginToolsFn = createServerFn({ method: "POST" })
161
+ .middleware([authContextMiddleware])
166
162
  .validator(setPluginToolsSchema)
167
- .handler(async ({ data }) => {
163
+ .handler(async ({ data, context }) => {
168
164
  const prisma = await getPrisma()
169
- const request = getRequest();
170
- const session = await requireAuth(request);
171
- const userId = session.user.id;
165
+ const userId = context.user.id;
172
166
 
173
167
  for (const tool of data.tools) {
174
168
  if (!tool.name || tool.name.trim().length === 0) {
@@ -193,12 +187,11 @@ export const setPluginToolsFn = createServerFn({ method: "POST" })
193
187
  });
194
188
 
195
189
  export const deletePluginFn = createServerFn({ method: "POST" })
190
+ .middleware([authContextMiddleware])
196
191
  .validator(deletePluginSchema)
197
- .handler(async ({ data }) => {
192
+ .handler(async ({ data, context }) => {
198
193
  const prisma = await getPrisma()
199
- const request = getRequest();
200
- const session = await requireAuth(request);
201
- const userId = session.user.id;
194
+ const userId = context.user.id;
202
195
 
203
196
  // DB-03:软删属主校验合并进写入(updateMany 计数判定)
204
197
  const res = await prisma.harnessPlugin.updateMany({
@@ -17,9 +17,8 @@
17
17
 
18
18
  import { getPrisma } from "@allbluecn/database/get-prisma"
19
19
  import { createServerFn } from "@tanstack/react-start";
20
- import { getRequest } from "@tanstack/react-start/server";
21
20
  import { z } from "zod";
22
- import { requireAuth } from "@/server/auth-helpers";
21
+ import { authContextMiddleware } from "@/server/middlewares/auth-context";
23
22
  import { assertProjectMembership } from "@/server/lib/project-membership";
24
23
 
25
24
  const projectIdSchema = z.object({ projectId: z.string().min(1) });
@@ -36,12 +35,11 @@ const moduleStorySchema = z.object({
36
35
  export type ModuleStoryItem = z.infer<typeof moduleStorySchema>;
37
36
 
38
37
  export const getModuleOverviewFn = createServerFn({ method: "GET" })
38
+ .middleware([authContextMiddleware])
39
39
  .validator(projectIdSchema)
40
- .handler(async ({ data }) => {
40
+ .handler(async ({ data, context }) => {
41
41
  const prisma = await getPrisma()
42
- const request = getRequest();
43
- const session = await requireAuth(request);
44
- await assertProjectMembership(data.projectId, session.user.id);
42
+ await assertProjectMembership(data.projectId, context.user.id);
45
43
 
46
44
  const [storyAgg, prdLinks] = await Promise.all([
47
45
  prisma.story.aggregate({
@@ -82,12 +80,11 @@ export const getModuleOverviewFn = createServerFn({ method: "GET" })
82
80
  });
83
81
 
84
82
  export const listModuleStoriesFn = createServerFn({ method: "GET" })
83
+ .middleware([authContextMiddleware])
85
84
  .validator(projectIdSchema)
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
- await assertProjectMembership(data.projectId, session.user.id);
87
+ await assertProjectMembership(data.projectId, context.user.id);
91
88
  const stories = await prisma.story.findMany({
92
89
  where: { projectId: data.projectId, archived: false },
93
90
  orderBy: { updatedAt: "desc" },
@@ -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 { auditLog } from "@/server/audit";
24
23
  import { validateDisplayId } from "@/lib/project-display-id";
25
24
  import { ensureBuiltinIndependentProject, migrateStoriesToIndependentProject } from "@/server/builtin-project";
@@ -85,12 +84,11 @@ const checkDisplayIdSchema = z.object({
85
84
  });
86
85
 
87
86
  export const checkDisplayIdAvailableFn = createServerFn({ method: "GET" })
87
+ .middleware([authContextMiddleware])
88
88
  .validator(checkDisplayIdSchema)
89
- .handler(async ({ data }) => {
89
+ .handler(async ({ data, context }) => {
90
90
  const prisma = await getPrisma()
91
- const request = getRequest();
92
- const session = await requireAuth(request);
93
- const userId = session.user.id;
91
+ const userId = context.user.id;
94
92
 
95
93
  const formatError = validateDisplayId(data.displayId.toUpperCase());
96
94
  if (formatError) return { available: false, reason: formatError };
@@ -111,12 +109,10 @@ export const checkDisplayIdAvailableFn = createServerFn({ method: "GET" })
111
109
  });
112
110
 
113
111
  // 列出当前用户参与的项目
114
- export const listProjectsFn = createServerFn({ method: "GET" }).handler(
115
- async () => {
112
+ export const listProjectsFn = createServerFn({ method: "GET" }).middleware([authContextMiddleware]).handler(
113
+ async ({ context }) => {
116
114
  const prisma = await getPrisma()
117
- const request = getRequest();
118
- const session = await requireAuth(request);
119
- const userId = session.user.id;
115
+ const userId = context.user.id;
120
116
 
121
117
  const memberships = await prisma.projectMember.findMany({
122
118
  where: { userId, status: { not: "suspended" } },
@@ -149,12 +145,10 @@ export const listProjectsFn = createServerFn({ method: "GET" }).handler(
149
145
  );
150
146
 
151
147
  // 项目精简列表(供 story 等模块创建表单选择用)
152
- export const listProjectsBriefFn = createServerFn({ method: "GET" }).handler(
153
- async () => {
148
+ export const listProjectsBriefFn = createServerFn({ method: "GET" }).middleware([authContextMiddleware]).handler(
149
+ async ({ context }) => {
154
150
  const prisma = await getPrisma()
155
- const request = getRequest();
156
- const session = await requireAuth(request);
157
- const userId = session.user.id;
151
+ const userId = context.user.id;
158
152
 
159
153
  await ensureBuiltinIndependentProject(userId);
160
154
 
@@ -183,12 +177,11 @@ const createSchema = z.object({
183
177
  });
184
178
 
185
179
  export const createProjectFn = createServerFn({ method: "POST" })
180
+ .middleware([authContextMiddleware])
186
181
  .validator(createSchema)
187
- .handler(async ({ data }) => {
182
+ .handler(async ({ data, context }) => {
188
183
  const prisma = await getPrisma()
189
- const request = getRequest();
190
- const session = await requireAuth(request);
191
- const userId = session.user.id;
184
+ const userId = context.user.id;
192
185
 
193
186
  const workspace = await prisma.workspace.findUnique({
194
187
  where: { id: data.workspaceId },
@@ -228,12 +221,11 @@ export const createProjectFn = createServerFn({ method: "POST" })
228
221
  const detailSchema = z.object({ projectId: z.string() });
229
222
 
230
223
  export const getProjectDetailFn = createServerFn({ method: "GET" })
224
+ .middleware([authContextMiddleware])
231
225
  .validator(detailSchema)
232
- .handler(async ({ data }) => {
226
+ .handler(async ({ data, context }) => {
233
227
  const prisma = await getPrisma()
234
- const request = getRequest();
235
- const session = await requireAuth(request);
236
- const userId = session.user.id;
228
+ const userId = context.user.id;
237
229
  await requireProjectMember(data.projectId, userId);
238
230
 
239
231
  const project = await prisma.project.findUnique({
@@ -270,12 +262,11 @@ const updateSchema = z.object({
270
262
  });
271
263
 
272
264
  export const updateProjectFn = createServerFn({ method: "POST" })
265
+ .middleware([authContextMiddleware])
273
266
  .validator(updateSchema)
274
- .handler(async ({ data }) => {
267
+ .handler(async ({ data, context }) => {
275
268
  const prisma = await getPrisma()
276
- const request = getRequest();
277
- const session = await requireAuth(request);
278
- const userId = session.user.id;
269
+ const userId = context.user.id;
279
270
  await requireProjectMember(data.projectId, userId, ["owner", "admin"]);
280
271
 
281
272
  const { projectId, displayId, ...rest } = data;
@@ -303,12 +294,11 @@ const deleteSchema = z.object({
303
294
  });
304
295
 
305
296
  export const deleteProjectFn = createServerFn({ method: "POST" })
297
+ .middleware([authContextMiddleware])
306
298
  .validator(deleteSchema)
307
- .handler(async ({ data }) => {
299
+ .handler(async ({ data, context }) => {
308
300
  const prisma = await getPrisma()
309
- const request = getRequest();
310
- const session = await requireAuth(request);
311
- const userId = session.user.id;
301
+ const userId = context.user.id;
312
302
  await requireProjectMember(data.projectId, userId, ["owner"]);
313
303
 
314
304
  const storyCount = await prisma.story.count({ where: { projectId: data.projectId } });
@@ -340,12 +330,11 @@ export const deleteProjectFn = createServerFn({ method: "POST" })
340
330
 
341
331
  // 列出项目成员
342
332
  export const listProjectMembersFn = createServerFn({ method: "GET" })
333
+ .middleware([authContextMiddleware])
343
334
  .validator(detailSchema)
344
- .handler(async ({ data }) => {
335
+ .handler(async ({ data, context }) => {
345
336
  const prisma = await getPrisma()
346
- const request = getRequest();
347
- const session = await requireAuth(request);
348
- const userId = session.user.id;
337
+ const userId = context.user.id;
349
338
  await requireProjectMember(data.projectId, userId);
350
339
 
351
340
  const project = await prisma.project.findUnique({
@@ -383,12 +372,11 @@ const addMemberSchema = z.object({
383
372
  });
384
373
 
385
374
  export const addProjectMemberFromTeamFn = createServerFn({ method: "POST" })
375
+ .middleware([authContextMiddleware])
386
376
  .validator(addMemberSchema)
387
- .handler(async ({ data }) => {
377
+ .handler(async ({ data, context }) => {
388
378
  const prisma = await getPrisma()
389
- const request = getRequest();
390
- const session = await requireAuth(request);
391
- const currentUserId = session.user.id;
379
+ const currentUserId = context.user.id;
392
380
  await requireProjectMember(data.projectId, currentUserId, ["owner", "admin"]);
393
381
 
394
382
  const project = await prisma.project.findUnique({
@@ -444,12 +432,11 @@ const removeMemberSchema = z.object({
444
432
  });
445
433
 
446
434
  export const removeProjectMemberFn = createServerFn({ method: "POST" })
435
+ .middleware([authContextMiddleware])
447
436
  .validator(removeMemberSchema)
448
- .handler(async ({ data }) => {
437
+ .handler(async ({ data, context }) => {
449
438
  const prisma = await getPrisma()
450
- const request = getRequest();
451
- const session = await requireAuth(request);
452
- const currentUserId = session.user.id;
439
+ const currentUserId = context.user.id;
453
440
  const membership = await requireProjectMember(
454
441
  data.projectId,
455
442
  currentUserId,
@@ -486,12 +473,11 @@ const updateRoleSchema = z.object({
486
473
  });
487
474
 
488
475
  export const updateMemberRoleFn = createServerFn({ method: "POST" })
476
+ .middleware([authContextMiddleware])
489
477
  .validator(updateRoleSchema)
490
- .handler(async ({ data }) => {
478
+ .handler(async ({ data, context }) => {
491
479
  const prisma = await getPrisma()
492
- const request = getRequest();
493
- const session = await requireAuth(request);
494
- const currentUserId = session.user.id;
480
+ const currentUserId = context.user.id;
495
481
  await requireProjectMember(data.projectId, currentUserId, ["owner"]);
496
482
 
497
483
  // SEC-04:按 projectId 收敛查找,防止跨项目 memberId 操作(IDOR)
@@ -524,12 +510,11 @@ const activitiesSchema = z.object({
524
510
  });
525
511
 
526
512
  export const listProjectActivitiesFn = createServerFn({ method: "GET" })
513
+ .middleware([authContextMiddleware])
527
514
  .validator(activitiesSchema)
528
- .handler(async ({ data }) => {
515
+ .handler(async ({ data, context }) => {
529
516
  const prisma = await getPrisma()
530
- const request = getRequest();
531
- const session = await requireAuth(request);
532
- const userId = session.user.id;
517
+ const userId = context.user.id;
533
518
  await requireProjectMember(data.projectId, userId);
534
519
 
535
520
  return prisma.projectActivity.findMany({
@@ -557,12 +542,11 @@ const projectActivityDataSchema = z.object({
557
542
  });
558
543
 
559
544
  export const getProjectActivityDataFn = createServerFn({ method: "GET" })
545
+ .middleware([authContextMiddleware])
560
546
  .validator(projectActivityDataSchema)
561
- .handler(async ({ data }) => {
547
+ .handler(async ({ data, context }) => {
562
548
  const prisma = await getPrisma()
563
- const request = getRequest();
564
- const session = await requireAuth(request);
565
- const userId = session.user.id;
549
+ const userId = context.user.id;
566
550
  await requireProjectMember(data.projectId, userId);
567
551
 
568
552
  const timezone = data.timezone || "Asia/Shanghai";
@@ -596,23 +580,20 @@ export const getProjectActivityDataFn = createServerFn({ method: "GET" })
596
580
  });
597
581
 
598
582
  // 确保用户拥有内置独立需求项目(供客户端调用)
599
- export const ensureBuiltinProjectFn = createServerFn({ method: "GET" }).handler(async () => {
583
+ export const ensureBuiltinProjectFn = createServerFn({ method: "GET" }).middleware([authContextMiddleware]).handler(async ({ context }) => {
600
584
  const prisma = await getPrisma()
601
- const request = getRequest();
602
- const session = await requireAuth(request);
603
- const userId = session.user.id;
585
+ const userId = context.user.id;
604
586
  const projectId = await ensureBuiltinIndependentProject(userId);
605
587
  return { id: projectId, name: BUILTIN_INDEPENDENT_NAME, displayId: BUILTIN_INDEPENDENT_DISPLAY_ID, icon: BUILTIN_INDEPENDENT_ICON };
606
588
  });
607
589
 
608
590
  export const listProjectKbsFn = createServerFn({ method: "GET" })
591
+ .middleware([authContextMiddleware])
609
592
  .validator(z.object({ projectId: z.string() }))
610
- .handler(async ({ data }) => {
593
+ .handler(async ({ data, context }) => {
611
594
  const prisma = await getPrisma()
612
- const request = getRequest();
613
- const session = await requireAuth(request);
614
595
  // 读侧成员校验(审计 2026-10-25:任意登录用户可枚举任意项目关联的知识库)
615
- await requireProjectMember(data.projectId, session.user.id);
596
+ await requireProjectMember(data.projectId, context.user.id);
616
597
  const rows = await prisma.projectKnowledgeBase.findMany({
617
598
  where: { projectId: data.projectId },
618
599
  select: {
@@ -624,13 +605,12 @@ export const listProjectKbsFn = createServerFn({ method: "GET" })
624
605
  });
625
606
 
626
607
  export const setProjectKbsFn = createServerFn({ method: "POST" })
608
+ .middleware([authContextMiddleware])
627
609
  .validator(z.object({ projectId: z.string(), kbIds: z.array(z.string()) }))
628
- .handler(async ({ data }) => {
610
+ .handler(async ({ data, context }) => {
629
611
  const prisma = await getPrisma()
630
- const request = getRequest();
631
- const session = await requireAuth(request);
632
612
  // 关联知识库改变项目全员可见范围:限 owner / admin(与其余项目级写路径口径一致)
633
- await requireProjectMember(data.projectId, session.user.id, ["owner", "admin"]);
613
+ await requireProjectMember(data.projectId, context.user.id, ["owner", "admin"]);
634
614
  if (data.kbIds.length > 0) {
635
615
  const valid = await prisma.knowledgeBase.findMany({
636
616
  where: { id: { in: data.kbIds }, visibility: "team", isDeleted: false },
@@ -16,11 +16,10 @@
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
20
  import { createReference } from '@/server/references/engine'
22
21
  import { assertEntityAccessible } from '@/server/references/access'
23
- import { requireAuth } from '@/server/auth-helpers'
22
+ import { authContextMiddleware } from '@/server/middlewares/auth-context'
24
23
 
25
24
  const createReferenceSchema = z.object({
26
25
  sourceModule: z.string().min(1),
@@ -34,11 +33,10 @@ const createReferenceSchema = z.object({
34
33
  })
35
34
 
36
35
  export const createReferenceFn = createServerFn({ method: 'POST' })
36
+ .middleware([authContextMiddleware])
37
37
  .validator(createReferenceSchema)
38
- .handler(async ({ data }) => {
39
- const request = getRequest()
40
- const session = await requireAuth(request)
41
- const userId = session.user.id
38
+ .handler(async ({ data, context }) => {
39
+ const userId = context.user.id
42
40
  // 审计 🟠(2026-10-25):engine 无属主校验,source/target 须逐一断言归属
43
41
  await assertEntityAccessible(userId, data.sourceModule, data.sourceEntityId, data.entityType)
44
42
  await assertEntityAccessible(userId, data.targetModule, data.targetEntityId, data.entityType)
@@ -16,11 +16,10 @@
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
20
  import { resolveReferences } from '@/server/references/engine'
22
21
  import { assertEntityAccessible, filterAccessibleRefs } from '@/server/references/access'
23
- import { requireAuth } from '@/server/auth-helpers'
22
+ import { authContextMiddleware } from '@/server/middlewares/auth-context'
24
23
 
25
24
  const schema = z.object({
26
25
  sourceModule: z.string().min(1),
@@ -28,11 +27,10 @@ const schema = z.object({
28
27
  })
29
28
 
30
29
  export const resolveReferencesFn = createServerFn({ method: 'POST' })
30
+ .middleware([authContextMiddleware])
31
31
  .validator(schema)
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
  // 审计 🟠(2026-10-25):engine 无属主过滤——先断言 source 归属,再过滤
37
35
  // target 不可访问(他人/未登记模块)的引用行,防跨用户枚举
38
36
  await assertEntityAccessible(userId, data.sourceModule, data.sourceEntityId)
@@ -16,11 +16,10 @@
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
20
  import { searchReferences } from '@/server/references/engine'
22
21
  import { filterAccessibleRefs } from '@/server/references/access'
23
- import { requireAuth } from '@/server/auth-helpers'
22
+ import { authContextMiddleware } from '@/server/middlewares/auth-context'
24
23
 
25
24
  const schema = z.object({
26
25
  q: z.string().default(''),
@@ -28,11 +27,10 @@ const schema = z.object({
28
27
  })
29
28
 
30
29
  export const searchReferencesFn = createServerFn({ method: 'POST' })
30
+ .middleware([authContextMiddleware])
31
31
  .validator(schema)
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
  const types = data.types?.split(',').filter(Boolean)
37
35
  const results = await searchReferences(data.q, types)
38
36
  // 审计 🟠(2026-10-25):engine 为全局索引(无用户/项目维度),按结果行
@@ -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 { assertDesignReadable } from '@/server/design/access'
23
22
 
24
23
  const schema = z.object({
@@ -29,10 +28,9 @@ const schema = z.object({
29
28
  // 可读(属主或存在有效分享),防对任意/不存在 designId 恒返回已订阅的假契约
30
29
  // (审计 🟡 2026-10-25)。真实事件推送落地时须替换为实际订阅语义并重命名。
31
30
  export const shareEventsFn = createServerFn({ method: 'GET' })
31
+ .middleware([authContextMiddleware])
32
32
  .validator(schema)
33
- .handler(async ({ data }) => {
34
- const request = getRequest()
35
- const session = await requireAuth(request)
36
- await assertDesignReadable(data.designId, session.user.id)
33
+ .handler(async ({ data, context }) => {
34
+ await assertDesignReadable(data.designId, context.user.id)
37
35
  return { designId: data.designId, subscribed: true }
38
36
  })
@@ -3,7 +3,7 @@ import { createServerFn } from '@tanstack/react-start'
3
3
  import { getRequest } from '@tanstack/react-start/server'
4
4
  import { z } from 'zod'
5
5
  import { getProService } from '@/server/pro-services'
6
- import { checkRateLimit } from '@/lib/pacer'
6
+ import { checkRateLimit } from '@/server/lib/rate-limit'
7
7
 
8
8
  const SSO_DOMAIN_RATE_LIMIT = { max: 20, windowMs: 60_000 }
9
9
  // 审计 ⚪(2026-10-25):仅按 domain 限流时,攻击者可轮换不同 domain 无限探测