@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 { legalCanonicalId } from '@/server/knowledge/public/canonical-id'
24
23
  import { httpUrl } from "@/server/lib/validators";
25
24
 
@@ -39,11 +38,10 @@ const createSchema = z.object({
39
38
  })
40
39
 
41
40
  export const createLegalFn = createServerFn({ method: 'POST' })
41
+ .middleware([authContextMiddleware])
42
42
  .validator(createSchema)
43
- .handler(async ({ data }) => {
43
+ .handler(async ({ data, context }) => {
44
44
  const prisma = await getPrisma()
45
- const request = getRequest()
46
- const session = await requireAuth(request)
47
45
  const result = await prisma.legalRegulation.create({
48
46
  data: {
49
47
  canonicalId: legalCanonicalId({ title: data.title, code: data.code }),
@@ -62,7 +60,7 @@ export const createLegalFn = createServerFn({ method: 'POST' })
62
60
  sourceUrl: data.sourceUrl || null,
63
61
  tags: data.tags,
64
62
  visibility: 'private',
65
- userId: session.user.id,
63
+ userId: context.user.id,
66
64
  },
67
65
  select: { id: true },
68
66
  })
@@ -17,20 +17,18 @@
17
17
 
18
18
  import { getPrisma } from "@allbluecn/database/get-prisma"
19
19
  import { createServerFn } from '@tanstack/react-start'
20
- import { getRequest } from '@tanstack/react-start/server'
21
20
  import { z } from 'zod'
22
- import { requireAuth } from '@/server/auth-helpers'
21
+ import { authContextMiddleware } from '@/server/middlewares/auth-context'
23
22
 
24
23
  export const deleteLegalFn = createServerFn({ method: 'POST' })
24
+ .middleware([authContextMiddleware])
25
25
  .validator(z.object({ id: z.string() }))
26
- .handler(async ({ data }) => {
26
+ .handler(async ({ data, context }) => {
27
27
  const prisma = await getPrisma()
28
- const request = getRequest()
29
- const session = await requireAuth(request)
30
28
  const existing = await prisma.legalRegulation.findUnique({ where: { id: data.id } })
31
29
  if (!existing) throw new Error('未找到')
32
- const isOwner = existing.userId === session.user.id
33
- const isAdmin = session.user.role === 'ADMIN' || session.user.role === 'SUPER_ADMIN'
30
+ const isOwner = existing.userId === context.user.id
31
+ const isAdmin = context.user.role === 'ADMIN' || context.user.role === 'SUPER_ADMIN'
34
32
  if (!isOwner && !isAdmin) throw new Error('无权限')
35
33
  await prisma.legalRegulation.update({ where: { id: data.id }, data: { isDeleted: true } })
36
34
  return { success: true }
@@ -17,17 +17,15 @@
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 { aggregateSharers, type PublicSharer } from '@/server/knowledge/public/share-merge'
24
23
 
25
24
  export const getLegalDetailFn = createServerFn({ method: 'GET' })
25
+ .middleware([authContextMiddleware])
26
26
  .validator(z.object({ id: z.string() }))
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
29
  const item = await prisma.legalRegulation.findFirst({
32
30
  where: { id: data.id, isDeleted: false },
33
31
  include: {
@@ -37,7 +35,7 @@ export const getLegalDetailFn = createServerFn({ method: 'GET' })
37
35
  },
38
36
  })
39
37
  if (!item) throw new Error('未找到')
40
- if (item.visibility === 'private' && item.userId !== session.user.id) {
38
+ if (item.visibility === 'private' && item.userId !== context.user.id) {
41
39
  throw new Error('无权限')
42
40
  }
43
41
  let sharers: PublicSharer[] = []
@@ -18,9 +18,8 @@
18
18
  import { getPrisma } from "@allbluecn/database/get-prisma"
19
19
  import { Prisma } from '@allbluecn/database'
20
20
  import { createServerFn } from '@tanstack/react-start'
21
- import { getRequest } from '@tanstack/react-start/server'
22
21
  import { z } from 'zod'
23
- import { requireAuth } from '@/server/auth-helpers'
22
+ import { authContextMiddleware } from '@/server/middlewares/auth-context'
24
23
  import { aggregateSharers } from '@/server/knowledge/public/share-merge'
25
24
 
26
25
  // 法规草稿的历史占位标题(早期创建表单未填标题时的默认值,当前代码已无写入点,
@@ -39,14 +38,13 @@ const listSchema = z.object({
39
38
  })
40
39
 
41
40
  export const listLegalFn = createServerFn({ method: 'GET' })
41
+ .middleware([authContextMiddleware])
42
42
  .validator(listSchema)
43
- .handler(async ({ data }) => {
43
+ .handler(async ({ data, context }) => {
44
44
  const prisma = await getPrisma()
45
- const request = getRequest()
46
- const session = await requireAuth(request)
47
45
  const where: Prisma.LegalRegulationWhereInput = { isDeleted: false }
48
46
  where.NOT = { title: UNNAMED_LEGAL_TITLE }
49
- const userId = session.user.id
47
+ const userId = context.user.id
50
48
  if (data.scope === 'private') {
51
49
  where.userId = userId
52
50
  where.visibility = 'private'
@@ -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 { shareToPublic, type ShareResult } from '@/server/knowledge/public/share-merge'
24
23
 
25
24
  export const shareLegalFn = createServerFn({ method: 'POST' })
25
+ .middleware([authContextMiddleware])
26
26
  .validator(z.object({ id: z.string() }))
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
  const source = await prisma.legalRegulation.findFirst({
33
31
  where: { id: data.id, userId, isDeleted: false },
34
32
  })
@@ -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
 
24
23
  export const unshareLegalFn = createServerFn({ method: 'POST' })
24
+ .middleware([authContextMiddleware])
25
25
  .validator(z.object({ canonicalId: z.string() }))
26
- .handler(async ({ data }) => {
26
+ .handler(async ({ data, context }) => {
27
27
  const prisma = await getPrisma()
28
- const request = getRequest()
29
- const session = await requireAuth(request)
30
28
  await prisma.knowledgeShareRecord.deleteMany({
31
- where: { entityType: 'legal', canonicalId: data.canonicalId, userId: session.user.id },
29
+ where: { entityType: 'legal', canonicalId: data.canonicalId, userId: context.user.id },
32
30
  })
33
31
  return { success: true }
34
32
  })
@@ -18,9 +18,8 @@
18
18
  import { getPrisma } from "@allbluecn/database/get-prisma"
19
19
  import { Prisma } from '@allbluecn/database'
20
20
  import { createServerFn } from '@tanstack/react-start'
21
- import { getRequest } from '@tanstack/react-start/server'
22
21
  import { z } from 'zod'
23
- import { requireAuth } from '@/server/auth-helpers'
22
+ import { authContextMiddleware } from '@/server/middlewares/auth-context'
24
23
  import { legalCanonicalId } from '@/server/knowledge/public/canonical-id'
25
24
  import { httpUrl } from "@/server/lib/validators";
26
25
 
@@ -41,16 +40,15 @@ const updateSchema = z.object({
41
40
  })
42
41
 
43
42
  export const updateLegalFn = createServerFn({ method: 'POST' })
43
+ .middleware([authContextMiddleware])
44
44
  .validator(updateSchema)
45
- .handler(async ({ data }) => {
45
+ .handler(async ({ data, context }) => {
46
46
  const prisma = await getPrisma()
47
- const request = getRequest()
48
- const session = await requireAuth(request)
49
47
  const { id, code, ...rest } = data
50
48
  const existing = await prisma.legalRegulation.findUnique({ where: { id } })
51
49
  if (!existing) throw new Error('未找到')
52
- const isOwner = existing.userId === session.user.id
53
- const isAdmin = session.user.role === 'ADMIN' || session.user.role === 'SUPER_ADMIN'
50
+ const isOwner = existing.userId === context.user.id
51
+ const isAdmin = context.user.role === 'ADMIN' || context.user.role === 'SUPER_ADMIN'
54
52
  if (!isOwner && !isAdmin) throw new Error('无权限')
55
53
 
56
54
  const updateData: Prisma.LegalRegulationUncheckedUpdateInput = { ...rest }
@@ -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 { getVectorStore } from "@/lib/vector-store"
24
23
  import { checkAiRateLimit } from "@/server/lib/rate-limit"
25
24
  import { tryAcquireReindex, releaseReindex } from "@/server/knowledge/reindex-guard"
@@ -30,18 +29,17 @@ import {
30
29
  } from "@/server/knowledge/knowledge-index-utils"
31
30
 
32
31
  export const indexKnowledgeDocumentFn = createServerFn({ method: "POST" })
32
+ .middleware([authContextMiddleware])
33
33
  .validator(z.object({ documentId: z.string() }))
34
- .handler(async ({ data }) => {
34
+ .handler(async ({ data, context }) => {
35
35
  const prisma = await getPrisma()
36
- const request = getRequest()
37
- const session = await requireAuth(request)
38
36
  // embedding 是计费 AI 调用,入口限流(审计 2026-10-25,与 AI 域同口径)
39
- await checkAiRateLimit(session.user.id, "kbIndex")
37
+ await checkAiRateLimit(context.user.id, "kbIndex")
40
38
  const doc = await prisma.knowledgeDocument.findFirst({
41
39
  where: {
42
40
  id: data.documentId,
43
41
  isDeleted: false,
44
- kb: { userId: session.user.id, isDeleted: false },
42
+ kb: { userId: context.user.id, isDeleted: false },
45
43
  },
46
44
  select: { id: true, kbId: true, title: true, content: true },
47
45
  })
@@ -53,17 +51,16 @@ export const indexKnowledgeDocumentFn = createServerFn({ method: "POST" })
53
51
  })
54
52
 
55
53
  export const deleteKnowledgeEmbeddingsFn = createServerFn({ method: "POST" })
54
+ .middleware([authContextMiddleware])
56
55
  .validator(z.object({ documentId: z.string() }))
57
- .handler(async ({ data }) => {
56
+ .handler(async ({ data, context }) => {
58
57
  const prisma = await getPrisma()
59
- const request = getRequest()
60
- const session = await requireAuth(request)
61
58
  // 属主校验与 indexKnowledgeDocumentFn 同口径(审计 2026-10-25:裸 documentId 可删他人全部嵌入)
62
59
  const doc = await prisma.knowledgeDocument.findFirst({
63
60
  where: {
64
61
  id: data.documentId,
65
62
  isDeleted: false,
66
- kb: { userId: session.user.id, isDeleted: false },
63
+ kb: { userId: context.user.id, isDeleted: false },
67
64
  },
68
65
  select: { id: true },
69
66
  })
@@ -74,15 +71,14 @@ export const deleteKnowledgeEmbeddingsFn = createServerFn({ method: "POST" })
74
71
  })
75
72
 
76
73
  export const reindexKnowledgeBaseFn = createServerFn({ method: "POST" })
74
+ .middleware([authContextMiddleware])
77
75
  .validator(z.object({ kbId: z.string() }))
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
78
  // embedding 是计费 AI 调用,入口限流(审计 2026-10-25,与 AI 域同口径)
83
- await checkAiRateLimit(session.user.id, "kbIndex")
79
+ await checkAiRateLimit(context.user.id, "kbIndex")
84
80
  const kb = await prisma.knowledgeBase.findFirst({
85
- where: { id: data.kbId, userId: session.user.id, isDeleted: false },
81
+ where: { id: data.kbId, userId: context.user.id, isDeleted: false },
86
82
  select: { id: true },
87
83
  })
88
84
  if (!kb) throw new Error("未找到或无权限")
@@ -18,11 +18,10 @@
18
18
  import { getPrisma } from "@allbluecn/database/get-prisma"
19
19
  import { buildRoomName } from "@allbluecn/collab-core/rooms"
20
20
  import { createServerFn } from '@tanstack/react-start'
21
- import { getRequest } from '@tanstack/react-start/server'
22
21
  import { z } from 'zod'
23
22
  import { jsonSizeOk, documentIdFromEmbeddingRowId, MAX_DOC_CONTENT_JSON_CHARS, MAX_DOC_PROPERTIES_JSON_CHARS } from '@/server/knowledge/knowledge-helpers'
24
23
 
25
- import { requireAuth } from '@/server/auth-helpers'
24
+ import { authContextMiddleware } from '@/server/middlewares/auth-context'
26
25
  import { indexDocumentById, resolveAiConfig, KB_EMBEDDINGS_TABLE } from '@/server/knowledge/knowledge-index-utils'
27
26
  import { generateEmbedding } from '@/server/ai-gateway/embedding'
28
27
  import { rerankCandidates, RECALL_MULTIPLIER } from '@/server/ai-gateway/rerank'
@@ -42,13 +41,12 @@ const READABLE_KB = (userId: string) => ({
42
41
  })
43
42
 
44
43
  export const listKnowledgeFn = createServerFn({ method: 'GET' })
44
+ .middleware([authContextMiddleware])
45
45
  .validator(z.object({}).optional())
46
- .handler(async () => {
46
+ .handler(async ({ context }) => {
47
47
  const prisma = await getPrisma()
48
- const request = getRequest()
49
- const session = await requireAuth(request)
50
48
  return prisma.knowledgeBase.findMany({
51
- where: { userId: session.user.id, isDeleted: false },
49
+ where: { userId: context.user.id, isDeleted: false },
52
50
  orderBy: [{ pinnedToSidebar: 'desc' }, { createdAt: 'asc' }],
53
51
  select: {
54
52
  id: true,
@@ -73,12 +71,11 @@ const createSchema = z.object({
73
71
  })
74
72
 
75
73
  export const createKnowledgeFn = createServerFn({ method: 'POST' })
74
+ .middleware([authContextMiddleware])
76
75
  .validator(createSchema)
77
- .handler(async ({ data }) => {
76
+ .handler(async ({ data, context }) => {
78
77
  const prisma = await getPrisma()
79
- const request = getRequest()
80
- const session = await requireAuth(request)
81
- const userId = session.user.id
78
+ const userId = context.user.id
82
79
  await requirePermission(userId, 'knowledge', 'write')
83
80
  const kb = await prisma.$transaction(async (tx) => {
84
81
  const knowledge = await tx.knowledgeBase.create({
@@ -109,13 +106,12 @@ export const createKnowledgeFn = createServerFn({ method: 'POST' })
109
106
  const detailSchema = z.object({ id: z.string() })
110
107
 
111
108
  export const getKnowledgeDetailFn = createServerFn({ method: 'GET' })
109
+ .middleware([authContextMiddleware])
112
110
  .validator(detailSchema)
113
- .handler(async ({ data }) => {
111
+ .handler(async ({ data, context }) => {
114
112
  const prisma = await getPrisma()
115
- const request = getRequest()
116
- const session = await requireAuth(request)
117
113
  const kb = await prisma.knowledgeBase.findFirst({
118
- where: { id: data.id, ...READABLE_KB(session.user.id) },
114
+ where: { id: data.id, ...READABLE_KB(context.user.id) },
119
115
  select: { id: true, name: true, description: true, icon: true, tags: true, visibility: true, createdAt: true, updatedAt: true },
120
116
  })
121
117
  if (!kb) throw new Error('未找到或无权限')
@@ -125,12 +121,11 @@ export const getKnowledgeDetailFn = createServerFn({ method: 'GET' })
125
121
  const deleteSchema = z.object({ id: z.string() })
126
122
 
127
123
  export const deleteKnowledgeFn = createServerFn({ method: 'POST' })
124
+ .middleware([authContextMiddleware])
128
125
  .validator(deleteSchema)
129
- .handler(async ({ data }) => {
126
+ .handler(async ({ data, context }) => {
130
127
  const prisma = await getPrisma()
131
- const request = getRequest()
132
- const session = await requireAuth(request)
133
- const userId = session.user.id
128
+ const userId = context.user.id
134
129
  await requirePermission(userId, 'knowledge', 'write')
135
130
  // DB-03:属主校验合并进软删(updateMany 计数判定),1 次查询替代 2 次并消除 TOCTOU。
136
131
  // DB-07:审计经 pro-service 独立连接(OSS 为 no-op)且自带 try/catch best-effort 语义,
@@ -154,12 +149,11 @@ const updateSchema = z.object({
154
149
  })
155
150
 
156
151
  export const updateKnowledgeFn = createServerFn({ method: 'POST' })
152
+ .middleware([authContextMiddleware])
157
153
  .validator(updateSchema)
158
- .handler(async ({ data }) => {
154
+ .handler(async ({ data, context }) => {
159
155
  const prisma = await getPrisma()
160
- const request = getRequest()
161
- const session = await requireAuth(request)
162
- const userId = session.user.id
156
+ const userId = context.user.id
163
157
  await requirePermission(userId, 'knowledge', 'write')
164
158
  // DB-03:属主校验合并进写入(updateManyAndReturn 单查询返回更新行)
165
159
  const rows = await prisma.knowledgeBase.updateManyAndReturn({
@@ -179,15 +173,14 @@ export const updateKnowledgeFn = createServerFn({ method: 'POST' })
179
173
  })
180
174
 
181
175
  export const listDocumentsFn = createServerFn({ method: 'GET' })
176
+ .middleware([authContextMiddleware])
182
177
  .validator(z.object({ kbId: z.string() }))
183
- .handler(async ({ data }) => {
178
+ .handler(async ({ data, context }) => {
184
179
  const prisma = await getPrisma()
185
- const request = getRequest()
186
- const session = await requireAuth(request)
187
180
  // 读口径与 createDocumentFn(READABLE_KB)统一(审计 2026-10-25 🟠):
188
181
  // 在他人 team/general KB 里建的文档必须能被列出,否则协作链路断裂
189
182
  const kb = await prisma.knowledgeBase.findFirst({
190
- where: { id: data.kbId, ...READABLE_KB(session.user.id) },
183
+ where: { id: data.kbId, ...READABLE_KB(context.user.id) },
191
184
  select: { id: true },
192
185
  })
193
186
  if (!kb) throw new Error('未找到或无权限')
@@ -218,15 +211,14 @@ const createDocSchema = z.object({
218
211
  })
219
212
 
220
213
  export const createDocumentFn = createServerFn({ method: 'POST' })
214
+ .middleware([authContextMiddleware])
221
215
  .validator(createDocSchema)
222
- .handler(async ({ data }) => {
216
+ .handler(async ({ data, context }) => {
223
217
  const prisma = await getPrisma()
224
- const request = getRequest()
225
- const session = await requireAuth(request)
226
- const userId = session.user.id
218
+ const userId = context.user.id
227
219
  await requirePermission(userId, 'knowledge', 'write')
228
220
  const kb = await prisma.knowledgeBase.findFirst({
229
- where: { id: data.kbId, ...READABLE_KB(session.user.id) },
221
+ where: { id: data.kbId, ...READABLE_KB(context.user.id) },
230
222
  select: { id: true },
231
223
  })
232
224
  if (!kb) throw new Error('未找到或无权限')
@@ -266,17 +258,16 @@ export const createDocumentFn = createServerFn({ method: 'POST' })
266
258
  const getDocSchema = z.object({ id: z.string() })
267
259
 
268
260
  export const getDocumentFn = createServerFn({ method: 'GET' })
261
+ .middleware([authContextMiddleware])
269
262
  .validator(getDocSchema)
270
- .handler(async ({ data }) => {
263
+ .handler(async ({ data, context }) => {
271
264
  const prisma = await getPrisma()
272
- const request = getRequest()
273
- const session = await requireAuth(request)
274
265
  const doc = await prisma.knowledgeDocument.findFirst({
275
266
  where: {
276
267
  id: data.id,
277
268
  isDeleted: false,
278
269
  // 读口径与 createDocumentFn(READABLE_KB)统一(审计 2026-10-25 🟠)
279
- kb: READABLE_KB(session.user.id),
270
+ kb: READABLE_KB(context.user.id),
280
271
  },
281
272
  select: {
282
273
  id: true,
@@ -322,12 +313,11 @@ const updateDocSchema = z
322
313
  })
323
314
 
324
315
  export const updateDocumentFn = createServerFn({ method: 'POST' })
316
+ .middleware([authContextMiddleware])
325
317
  .validator(updateDocSchema)
326
- .handler(async ({ data }) => {
318
+ .handler(async ({ data, context }) => {
327
319
  const prisma = await getPrisma()
328
- const request = getRequest()
329
- const session = await requireAuth(request)
330
- const userId = session.user.id
320
+ const userId = context.user.id
331
321
  await requirePermission(userId, 'knowledge', 'write')
332
322
  // ── Yjs 多人协作 §5.3 写入门卫(任务 17):CollabDocument 存在且 patch 含
333
323
  // content → 一律转发 collab 内部通道(room 活跃判定在 collab 侧:在线应用
@@ -469,12 +459,11 @@ export const updateDocumentFn = createServerFn({ method: 'POST' })
469
459
  const deleteDocSchema = z.object({ id: z.string() })
470
460
 
471
461
  export const deleteDocumentFn = createServerFn({ method: 'POST' })
462
+ .middleware([authContextMiddleware])
472
463
  .validator(deleteDocSchema)
473
- .handler(async ({ data }) => {
464
+ .handler(async ({ data, context }) => {
474
465
  const prisma = await getPrisma()
475
- const request = getRequest()
476
- const session = await requireAuth(request)
477
- const userId = session.user.id
466
+ const userId = context.user.id
478
467
  await requirePermission(userId, 'knowledge', 'write')
479
468
  // 首页判定需回读行字段(isHomepage),属主校验走单查询 findFirst(行复用)
480
469
  const doc = await assertOwned(
@@ -518,14 +507,13 @@ export const deleteDocumentFn = createServerFn({ method: 'POST' })
518
507
  })
519
508
 
520
509
  export const getHomepageDocumentFn = createServerFn({ method: 'GET' })
510
+ .middleware([authContextMiddleware])
521
511
  .validator(z.object({ kbId: z.string() }))
522
- .handler(async ({ data }) => {
512
+ .handler(async ({ data, context }) => {
523
513
  const prisma = await getPrisma()
524
- const request = getRequest()
525
- const session = await requireAuth(request)
526
514
  // 读口径与 createDocumentFn(READABLE_KB)统一(审计 2026-10-25 🟠)
527
515
  const kb = await prisma.knowledgeBase.findFirst({
528
- where: { id: data.kbId, ...READABLE_KB(session.user.id) },
516
+ where: { id: data.kbId, ...READABLE_KB(context.user.id) },
529
517
  select: { id: true },
530
518
  })
531
519
  if (!kb) throw new Error('未找到或无权限')
@@ -536,14 +524,13 @@ export const getHomepageDocumentFn = createServerFn({ method: 'GET' })
536
524
  })
537
525
 
538
526
  export const getDocBreadcrumbFn = createServerFn({ method: 'GET' })
527
+ .middleware([authContextMiddleware])
539
528
  .validator(z.object({ docId: z.string(), kbId: z.string() }))
540
- .handler(async ({ data }) => {
529
+ .handler(async ({ data, context }) => {
541
530
  const prisma = await getPrisma()
542
- const request = getRequest()
543
- const session = await requireAuth(request)
544
531
  // 读口径与 createDocumentFn(READABLE_KB)统一(审计 2026-10-25 🟠)
545
532
  const kb = await prisma.knowledgeBase.findFirst({
546
- where: { id: data.kbId, ...READABLE_KB(session.user.id) },
533
+ where: { id: data.kbId, ...READABLE_KB(context.user.id) },
547
534
  select: { id: true },
548
535
  })
549
536
  if (!kb) throw new Error('未找到或无权限')
@@ -642,12 +629,11 @@ const searchPublicKnowledge = async (
642
629
  }
643
630
 
644
631
  export const searchDocumentsFn = createServerFn({ method: 'GET' })
632
+ .middleware([authContextMiddleware])
645
633
  .validator(z.object({ query: z.string(), currentKbId: z.string().optional() }))
646
- .handler(async ({ data }) => {
634
+ .handler(async ({ data, context }) => {
647
635
  const prisma = await getPrisma()
648
- const request = getRequest()
649
- const session = await requireAuth(request)
650
- const userId = session.user.id
636
+ const userId = context.user.id
651
637
  const { query, currentKbId } = data
652
638
 
653
639
  const kbs = await prisma.knowledgeBase.findMany({
@@ -728,14 +714,13 @@ export const searchDocumentsFn = createServerFn({ method: 'GET' })
728
714
  })
729
715
 
730
716
  export const listKbProjectsFn = createServerFn({ method: 'GET' })
717
+ .middleware([authContextMiddleware])
731
718
  .validator(z.object({ kbId: z.string() }))
732
- .handler(async ({ data }) => {
719
+ .handler(async ({ data, context }) => {
733
720
  const prisma = await getPrisma()
734
- const request = getRequest()
735
- const session = await requireAuth(request)
736
721
  await assertOwned(
737
722
  prisma.knowledgeBase,
738
- { where: { id: data.kbId, ...READABLE_KB(session.user.id) }, select: { id: true } },
723
+ { where: { id: data.kbId, ...READABLE_KB(context.user.id) }, select: { id: true } },
739
724
  '知识库不存在',
740
725
  )
741
726
  const rows = await prisma.projectKnowledgeBase.findMany({
@@ -747,12 +732,11 @@ export const listKbProjectsFn = createServerFn({ method: 'GET' })
747
732
  })
748
733
 
749
734
  export const setKbProjectsFn = createServerFn({ method: 'POST' })
735
+ .middleware([authContextMiddleware])
750
736
  .validator(z.object({ kbId: z.string(), projectIds: z.array(z.string()) }))
751
- .handler(async ({ data }) => {
737
+ .handler(async ({ data, context }) => {
752
738
  const prisma = await getPrisma()
753
- const request = getRequest()
754
- const session = await requireAuth(request)
755
- const userId = session.user.id
739
+ const userId = context.user.id
756
740
  // 与其他知识库写路径同口径(审计 2026-10-25:其他写路径均有,此处曾漏)
757
741
  await requirePermission(userId, 'knowledge', 'write')
758
742
  const kb = await prisma.knowledgeBase.findFirst({
@@ -784,12 +768,11 @@ const togglePinSchema = z.object({
784
768
  })
785
769
 
786
770
  export const toggleKnowledgePinFn = createServerFn({ method: 'POST' })
771
+ .middleware([authContextMiddleware])
787
772
  .validator(togglePinSchema)
788
- .handler(async ({ data }) => {
773
+ .handler(async ({ data, context }) => {
789
774
  const prisma = await getPrisma()
790
- const request = getRequest()
791
- const session = await requireAuth(request)
792
- const userId = session.user.id
775
+ const userId = context.user.id
793
776
  // DB-03:属主校验合并进写入(updateManyAndReturn 单查询返回更新行)
794
777
  const rows = await prisma.knowledgeBase.updateManyAndReturn({
795
778
  where: { id: data.kbId, userId, isDeleted: false },