@allbluecn/web-app 0.22.4 → 0.23.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (500) hide show
  1. package/package.json +4 -14
  2. package/src/__tests__/integration/login-email-acceptance.test.ts +16 -0
  3. package/src/__tests__/story-view.test.ts +33 -1
  4. package/src/components/agents/__tests__/agent-bindings-tab.test.tsx +221 -0
  5. package/src/components/agents/__tests__/agents-page.test.tsx +284 -0
  6. package/src/components/agents/agent-bindings-tab.tsx +59 -45
  7. package/src/components/agents/agent-form-dialog.tsx +3 -3
  8. package/src/components/agents/agent-selector.tsx +2 -3
  9. package/src/components/agents/agents-page.tsx +66 -31
  10. package/src/components/agents/slash-skill-menu.tsx +2 -3
  11. package/src/components/auth/__tests__/session-guard.test.tsx +74 -0
  12. package/src/components/auth/session-guard.tsx +8 -0
  13. package/src/components/billing/login-prompt-dialog.tsx +1 -1
  14. package/src/components/billing/subscription-provider.tsx +2 -16
  15. package/src/components/bug/__tests__/peek-modes.test.tsx +8 -0
  16. package/src/components/bug/__tests__/subgroup-header.test.tsx +202 -40
  17. package/src/components/bug/peek-panel.tsx +5 -3
  18. package/src/components/bug/views/bug-list/group.tsx +12 -2
  19. package/src/components/bug/views/bug-list/index.tsx +94 -67
  20. package/src/components/command/command-palette.tsx +10 -9
  21. package/src/components/design/canvas/document/frame-custom-presets.ts +9 -1
  22. package/src/components/design/canvas/panels/toolbar.tsx +21 -22
  23. package/src/components/design/canvas/react/__tests__/canvas-context-load-echo.test.tsx +199 -0
  24. package/src/components/design/canvas/react/__tests__/hooks.test.tsx +17 -3
  25. package/src/components/design/canvas/react/canvas-context.tsx +47 -26
  26. package/src/components/design/canvas/react/hooks.ts +39 -34
  27. package/src/components/design/editor/layout/__tests__/collab-param-wiring.test.tsx +17 -0
  28. package/src/components/design/editor/layout/__tests__/context-menu.test.tsx +17 -1
  29. package/src/components/design/editor/layout/__tests__/no-page-save-toast.test.tsx +17 -0
  30. package/src/components/design/editor/layout/__tests__/persistence-restore.test.tsx +17 -1
  31. package/src/components/design/editor/layout/__tests__/ssr-localstorage-smoke.test.tsx +17 -1
  32. package/src/components/design/editor/layout/design-editor-layout.tsx +13 -2
  33. package/src/components/design/editor/layout/hooks/use-design-auto-save.ts +3 -19
  34. package/src/components/devtools/devtools-panel.tsx +56 -0
  35. package/src/components/forms/__tests__/create-app-form.test.tsx +131 -0
  36. package/src/components/forms/app-field-error.tsx +21 -1
  37. package/src/components/forms/app-field.tsx +8 -8
  38. package/src/components/forms/app-submit.tsx +12 -9
  39. package/src/components/forms/create-app-form.tsx +124 -0
  40. package/src/components/forms/index.ts +2 -3
  41. package/src/components/harness/__tests__/gallery-behavior.test.tsx +37 -1
  42. package/src/components/harness/__tests__/harness-workbench-first-send.test.tsx +4 -1
  43. package/src/components/harness/__tests__/message-actions.test.tsx +7 -6
  44. package/src/components/harness/__tests__/use-video-generation.test.tsx +165 -0
  45. package/src/components/harness/ai-chat-history/index.tsx +5 -3
  46. package/src/components/harness/gallery/gallery-card.tsx +57 -35
  47. package/src/components/harness/gallery/gallery-grid.tsx +32 -15
  48. package/src/components/harness/gallery/gallery-types.ts +19 -0
  49. package/src/components/harness/gallery/gallery-video-card.tsx +54 -0
  50. package/src/components/harness/gallery/types.ts +2 -0
  51. package/src/components/harness/gallery/use-video-generation.ts +95 -0
  52. package/src/components/harness/harness-workbench-page.tsx +2 -3
  53. package/src/components/harness/message-actions.tsx +5 -3
  54. package/src/components/hotkeys/shortcuts-panel.tsx +28 -13
  55. package/src/components/iteration/__tests__/burndown-chart.test.tsx +118 -0
  56. package/src/components/iteration/burndown-chart.tsx +54 -23
  57. package/src/components/knowledge/editor/__tests__/knowledge-doc-editor-collab.test.tsx +96 -0
  58. package/src/components/knowledge/editor/knowledge-doc-editor.tsx +56 -1
  59. package/src/components/knowledge/editor/mindmap-doc-editor.tsx +12 -0
  60. package/src/components/knowledge/editor/use-auto-save-channels.ts +3 -1
  61. package/src/components/layout/sidebar-03/__tests__/nav-workspace.test.tsx +0 -4
  62. package/src/components/layout/sidebar-03/nav-knowledge.tsx +11 -11
  63. package/src/components/layout/sidebar-03/nav-main.tsx +12 -15
  64. package/src/components/layout/sidebar-03/nav-notifications.tsx +5 -8
  65. package/src/components/layout/sidebar-03/nav-workspace.tsx +11 -9
  66. package/src/components/notifications/__tests__/settings-notifications.test.tsx +158 -0
  67. package/src/components/notifications/settings-notifications.tsx +37 -13
  68. package/src/components/notifications/team-notifications.tsx +10 -14
  69. package/src/components/settings/personal-team/account/__tests__/account-client.test.tsx +170 -0
  70. package/src/components/settings/personal-team/account/account-client.tsx +44 -7
  71. package/src/components/settings/personal-team/team/team-client.tsx +17 -19
  72. package/src/components/shared-kit/list-kit/__tests__/frozen-header.test.ts +210 -41
  73. package/src/components/shared-kit/list-kit/frozen-header.ts +134 -21
  74. package/src/components/shared-kit/list-kit/kanban/frozen-header.ts +20 -27
  75. package/src/components/story/__tests__/peek-panel-patch-sync.test.tsx +8 -0
  76. package/src/components/story/__tests__/story-list-table.test.tsx +214 -0
  77. package/src/components/story/columns.tsx +11 -2
  78. package/src/components/story/peek-panel.tsx +4 -2
  79. package/src/components/story/story-list-table.tsx +16 -1
  80. package/src/components/story/views/story-list/__tests__/frozen-headers.test.tsx +186 -0
  81. package/src/components/story/views/story-list/group.tsx +12 -1
  82. package/src/components/story/views/story-list/index.tsx +101 -68
  83. package/src/components/testcase/__tests__/case-row.test.tsx +134 -2
  84. package/src/components/testcase/__tests__/peek-panel.test.tsx +8 -0
  85. package/src/components/testcase/__tests__/step-editor.test.tsx +106 -0
  86. package/src/components/testcase/list/grouped-list.tsx +50 -22
  87. package/src/components/testcase/peek-panel.tsx +7 -4
  88. package/src/components/testcase/step-editor.tsx +196 -150
  89. package/src/components/tiptap/notion-like/editor-extensions.ts +0 -3
  90. package/src/components/tiptap/notion-like/notion-like-editor-header.tsx +1 -31
  91. package/src/components/tiptap/notion-like/notion-like-editor.tsx +32 -1
  92. package/src/components/workspace/__tests__/dialogs/create-workspace-dialog.test.tsx +2 -28
  93. package/src/components/workspace/__tests__/dialogs/edit-workspace-dialog.test.tsx +2 -28
  94. package/src/components/workspace/dialogs/create-workspace-dialog.tsx +45 -43
  95. package/src/components/workspace/dialogs/edit-workspace-dialog.tsx +38 -36
  96. package/src/design-engine/engine/engine-decor.ts +2 -0
  97. package/src/design-engine/engine/engine-path.ts +2 -0
  98. package/src/hooks/__tests__/use-unsaved-guard.test.tsx +180 -0
  99. package/src/hooks/use-notifications.ts +9 -16
  100. package/src/hooks/use-unsaved-guard.tsx +87 -0
  101. package/src/lib/__tests__/pacer.test.ts +33 -96
  102. package/src/lib/__tests__/query-defaults.test.ts +169 -0
  103. package/src/lib/__tests__/query-global-error.test.ts +256 -0
  104. package/src/lib/anyhub/anyhub-store.ts +2 -2
  105. package/src/lib/changelog/sdk-versions.ts +2 -10
  106. package/src/lib/collab/presence-store.ts +5 -5
  107. package/src/lib/collab/use-presence-list-refresh.ts +2 -2
  108. package/src/lib/collab/use-share-presence.ts +2 -2
  109. package/src/lib/collections/query-keys.ts +7 -2
  110. package/src/lib/commands/__tests__/command-palette-state.test.ts +12 -14
  111. package/src/lib/commands/__tests__/registry.test.ts +6 -3
  112. package/src/lib/commands/command-palette-state.ts +8 -31
  113. package/src/lib/hotkeys/__tests__/registry.test.ts +71 -18
  114. package/src/lib/hotkeys/registry.ts +188 -85
  115. package/src/lib/hotkeys/types.ts +1 -13
  116. package/src/lib/pacer.ts +1 -79
  117. package/src/lib/queries/README.md +67 -0
  118. package/src/lib/queries/__tests__/agents-queries.test.ts +101 -0
  119. package/src/lib/queries/__tests__/compliance-queries.test.ts +136 -0
  120. package/src/lib/queries/__tests__/notifications-queries.test.ts +175 -0
  121. package/src/lib/queries/__tests__/team-queries.test.ts +87 -0
  122. package/src/lib/queries/agents.ts +40 -0
  123. package/src/lib/queries/compliance.ts +69 -0
  124. package/src/lib/queries/notifications.ts +63 -0
  125. package/src/lib/queries/team.ts +39 -0
  126. package/src/lib/query-defaults.ts +8 -0
  127. package/src/lib/query-global-error.ts +128 -0
  128. package/src/lib/remote-auth-client.ts +16 -0
  129. package/src/paraglide/README.md +1 -1
  130. package/src/paraglide/messages/_index.d.ts +11 -0
  131. package/src/paraglide/messages/_index.js +5659 -88285
  132. package/src/paraglide/messages/common_error_generic.d.ts +16 -0
  133. package/src/paraglide/messages/common_error_generic.js +29 -0
  134. package/src/paraglide/messages/common_unsaved_body.d.ts +16 -0
  135. package/src/paraglide/messages/common_unsaved_body.js +29 -0
  136. package/src/paraglide/messages/common_unsaved_leave.d.ts +16 -0
  137. package/src/paraglide/messages/common_unsaved_leave.js +29 -0
  138. package/src/paraglide/messages/common_unsaved_stay.d.ts +16 -0
  139. package/src/paraglide/messages/common_unsaved_stay.js +29 -0
  140. package/src/paraglide/messages/common_unsaved_title.d.ts +16 -0
  141. package/src/paraglide/messages/common_unsaved_title.js +29 -0
  142. package/src/paraglide/messages/gallery_videofailed1.d.ts +17 -0
  143. package/src/paraglide/messages/gallery_videofailed1.js +30 -0
  144. package/src/paraglide/messages/gallery_videogenerating1.d.ts +17 -0
  145. package/src/paraglide/messages/gallery_videogenerating1.js +30 -0
  146. package/src/paraglide/messages/gallery_videomissingprompt2.d.ts +17 -0
  147. package/src/paraglide/messages/gallery_videomissingprompt2.js +30 -0
  148. package/src/paraglide/messages/gallery_videoprogress1.d.ts +19 -0
  149. package/src/paraglide/messages/gallery_videoprogress1.js +30 -0
  150. package/src/paraglide/messages/gallery_videostop1.d.ts +17 -0
  151. package/src/paraglide/messages/gallery_videostop1.js +30 -0
  152. package/src/paraglide/messages/story_table_resizecolumn1.d.ts +17 -0
  153. package/src/paraglide/messages/story_table_resizecolumn1.js +30 -0
  154. package/src/providers/index.tsx +5 -50
  155. package/src/routeTree.gen.ts +21 -0
  156. package/src/router.tsx +21 -8
  157. package/src/routes/__root.tsx +2 -1
  158. package/src/routes/__tests__/-edition-routing.test.tsx +6 -1
  159. package/src/routes/_login/forgot-password/route.lazy.tsx +7 -6
  160. package/src/routes/_login/login/route.lazy.tsx +10 -9
  161. package/src/routes/_login/register/route.lazy.tsx +19 -18
  162. package/src/routes/_login/reset-password/route.lazy.tsx +10 -9
  163. package/src/routes/_nav/knowledge/compliance/$id.lazy.tsx +9 -12
  164. package/src/routes/_nav/knowledge/compliance/index.lazy.tsx +16 -13
  165. package/src/routes/_nav/knowledge/laws/$id.lazy.tsx +1 -1
  166. package/src/routes/_nav/notifications/route.tsx +6 -16
  167. package/src/routes/_nav/settings/-settings-tabs.tsx +9 -12
  168. package/src/routes/api/generate/__tests__/media.test.ts +378 -0
  169. package/src/routes/api/generate/media.ts +179 -0
  170. package/src/server/__tests__/agent-client-graph.test.ts +0 -1
  171. package/src/server/__tests__/agent-crud.test.ts +37 -4
  172. package/src/server/__tests__/bug-groups-two-level.test.ts +34 -1
  173. package/src/server/__tests__/chat-conversations.test.ts +37 -4
  174. package/src/server/__tests__/chat-list-messages.test.ts +40 -7
  175. package/src/server/__tests__/csv-export.test.ts +36 -3
  176. package/src/server/__tests__/desktop-bootstrap.test.ts +189 -0
  177. package/src/server/__tests__/remote-auth.test.ts +72 -0
  178. package/src/server/__tests__/skill-crud.test.ts +37 -4
  179. package/src/server/__tests__/sso-domain.test.ts +1 -1
  180. package/src/server/__tests__/sso-rate-limit-singleton.test.ts +123 -0
  181. package/src/server/__tests__/task-serverfn-crud.test.ts +35 -2
  182. package/src/server/__tests__/task-serverfn-queries.test.ts +35 -2
  183. package/src/server/__tests__/testcase-board.test.ts +38 -5
  184. package/src/server/__tests__/testcase-bulk.test.ts +38 -5
  185. package/src/server/__tests__/testcase-list-scope.test.ts +38 -5
  186. package/src/server/ai-gateway/__tests__/ai-output-guard.test.ts +126 -2
  187. package/src/server/ai-gateway/__tests__/chat-stream-builder-code-mode.test.ts +4 -0
  188. package/src/server/ai-gateway/__tests__/chat-stream-builder-memory.test.ts +4 -0
  189. package/src/server/ai-gateway/__tests__/chat-stream-builder-sandbox.test.ts +4 -0
  190. package/src/server/ai-gateway/__tests__/chat-stream-builder-skills.test.ts +4 -0
  191. package/src/server/ai-gateway/__tests__/pgvector-memory-adapter.test.ts +30 -0
  192. package/src/server/ai-gateway/__tests__/pgvector-memory-conformance.test.ts +92 -0
  193. package/src/server/ai-gateway/__tests__/source-mode.test.ts +49 -8
  194. package/src/server/ai-gateway/ai-output-guard.ts +50 -2
  195. package/src/server/ai-gateway/chat-stream-builder.ts +3 -0
  196. package/src/server/ai-gateway/media/index.ts +36 -29
  197. package/src/server/ai-gateway/media/trim-input.ts +52 -0
  198. package/src/server/ai-gateway/memory/pgvector-adapter.ts +27 -13
  199. package/src/server/ai-gateway/sandbox/__tests__/harness-sandbox.test.ts +252 -41
  200. package/src/server/ai-gateway/sandbox/harness-sandbox.ts +6 -67
  201. package/src/server/ai-gateway/source-mode.ts +24 -8
  202. package/src/server/desktop-bootstrap.ts +74 -0
  203. package/src/server/lib/__tests__/rate-limit.test.ts +0 -1
  204. package/src/server/lib/rate-limit.ts +0 -2
  205. package/src/server/middlewares/__tests__/auth-context.test.ts +156 -0
  206. package/src/server/middlewares/auth-context.ts +62 -0
  207. package/src/server/remote-auth.ts +58 -31
  208. package/src/server/serverFns/__tests__/ai-hosted-models.test.ts +47 -15
  209. package/src/server/serverFns/__tests__/ai-source-mode.test.ts +45 -15
  210. package/src/server/serverFns/__tests__/billing.test.ts +37 -2
  211. package/src/server/serverFns/__tests__/collab-snapshot.test.ts +41 -14
  212. package/src/server/serverFns/__tests__/collab.test.ts +41 -14
  213. package/src/server/serverFns/__tests__/compliance.test.ts +33 -1
  214. package/src/server/serverFns/__tests__/email-verification.test.ts +35 -1
  215. package/src/server/serverFns/__tests__/knowledge-breadcrumb.test.ts +46 -6
  216. package/src/server/serverFns/__tests__/knowledge-delete.test.ts +42 -14
  217. package/src/server/serverFns/__tests__/knowledge-kb-projects.test.ts +46 -6
  218. package/src/server/serverFns/__tests__/knowledge-public-compliance.test.ts +36 -2
  219. package/src/server/serverFns/__tests__/knowledge-readable-kb.test.ts +42 -10
  220. package/src/server/serverFns/__tests__/knowledge-search.test.ts +45 -9
  221. package/src/server/serverFns/__tests__/legal-code-canonical.test.ts +36 -2
  222. package/src/server/serverFns/__tests__/link-preview.test.ts +38 -4
  223. package/src/server/serverFns/__tests__/notifications-list.test.ts +36 -3
  224. package/src/server/serverFns/__tests__/ownership-merge.test.ts +38 -4
  225. package/src/server/serverFns/__tests__/project-delete-transaction.test.ts +39 -2
  226. package/src/server/serverFns/__tests__/project-kb.test.ts +34 -1
  227. package/src/server/serverFns/__tests__/project-member-idor.test.ts +34 -1
  228. package/src/server/serverFns/__tests__/project-team-assign.test.ts +34 -1
  229. package/src/server/serverFns/__tests__/read-write-merge.test.ts +38 -4
  230. package/src/server/serverFns/__tests__/story-comments.test.ts +38 -4
  231. package/src/server/serverFns/__tests__/story-crud-archive-detail.test.ts +38 -4
  232. package/src/server/serverFns/__tests__/story-crud-labels-users.test.ts +37 -3
  233. package/src/server/serverFns/__tests__/story-crud.test.ts +36 -3
  234. package/src/server/serverFns/__tests__/story-links.test.ts +38 -4
  235. package/src/server/serverFns/__tests__/story-reactions.test.ts +38 -4
  236. package/src/server/serverFns/__tests__/story-tree.test.ts +38 -4
  237. package/src/server/serverFns/__tests__/team-accept.test.ts +34 -1
  238. package/src/server/serverFns/__tests__/team-invitation.test.ts +34 -1
  239. package/src/server/serverFns/__tests__/team-join-request.test.ts +34 -1
  240. package/src/server/serverFns/__tests__/team-members.test.ts +34 -1
  241. package/src/server/serverFns/__tests__/team-ownership-merge.test.ts +34 -1
  242. package/src/server/serverFns/__tests__/update-bug-guard.test.ts +37 -3
  243. package/src/server/serverFns/__tests__/update-document-guard.test.ts +38 -4
  244. package/src/server/serverFns/__tests__/update-page-guard.test.ts +40 -4
  245. package/src/server/serverFns/__tests__/update-seats.test.ts +33 -1
  246. package/src/server/serverFns/__tests__/update-story-guard.test.ts +36 -3
  247. package/src/server/serverFns/__tests__/update-testcase-guard.test.ts +37 -3
  248. package/src/server/serverFns/__tests__/workspace-kb-idor.test.ts +36 -2
  249. package/src/server/serverFns/__tests__/workspace-kb.test.ts +36 -2
  250. package/src/server/serverFns/__tests__/workspace.test.ts +34 -1
  251. package/src/server/serverFns/activity.ts +10 -14
  252. package/src/server/serverFns/agents/agent-crud.ts +16 -15
  253. package/src/server/serverFns/agents/bindings.ts +12 -13
  254. package/src/server/serverFns/agents/skill-crud.ts +16 -15
  255. package/src/server/serverFns/ai/code-mode-readiness.ts +3 -4
  256. package/src/server/serverFns/ai/search-capability.ts +3 -4
  257. package/src/server/serverFns/anyhub/app.ts +10 -14
  258. package/src/server/serverFns/anyhub/index.ts +7 -10
  259. package/src/server/serverFns/anyhub/install.ts +4 -4
  260. package/src/server/serverFns/anyhub/permissions.ts +10 -14
  261. package/src/server/serverFns/anyhub/proxy.ts +4 -6
  262. package/src/server/serverFns/auth/email-verification.ts +4 -5
  263. package/src/server/serverFns/auth/session.ts +9 -0
  264. package/src/server/serverFns/billing.ts +18 -28
  265. package/src/server/serverFns/blob-upload.ts +6 -9
  266. package/src/server/serverFns/bug/__tests__/bug-access-tokens.test.ts +34 -1
  267. package/src/server/serverFns/bug/__tests__/bug-activities.test.ts +34 -1
  268. package/src/server/serverFns/bug/__tests__/bug-comments.test.ts +34 -1
  269. package/src/server/serverFns/bug/__tests__/bug-crud.test.ts +34 -1
  270. package/src/server/serverFns/bug/__tests__/bug-fix.test.ts +34 -1
  271. package/src/server/serverFns/bug/__tests__/bug-groups.test.ts +34 -1
  272. package/src/server/serverFns/bug/__tests__/bug-reactions.test.ts +34 -1
  273. package/src/server/serverFns/bug/__tests__/bug-reorder.test.ts +39 -5
  274. package/src/server/serverFns/bug/__tests__/bug-repro.test.ts +34 -1
  275. package/src/server/serverFns/bug/__tests__/bug-story.test.ts +34 -1
  276. package/src/server/serverFns/bug/__tests__/bug-webhooks.test.ts +34 -1
  277. package/src/server/serverFns/bug/bug-access-tokens.ts +16 -22
  278. package/src/server/serverFns/bug/bug-activities.ts +4 -6
  279. package/src/server/serverFns/bug/bug-collect-tokens.ts +13 -18
  280. package/src/server/serverFns/bug/bug-comments.ts +13 -18
  281. package/src/server/serverFns/bug/bug-crud/detail.ts +10 -14
  282. package/src/server/serverFns/bug/bug-crud.ts +28 -38
  283. package/src/server/serverFns/bug/bug-display-options.ts +8 -11
  284. package/src/server/serverFns/bug/bug-export.ts +5 -7
  285. package/src/server/serverFns/bug/bug-fix.ts +10 -14
  286. package/src/server/serverFns/bug/bug-groups.ts +10 -14
  287. package/src/server/serverFns/bug/bug-reactions.ts +10 -14
  288. package/src/server/serverFns/bug/bug-reorder.ts +4 -6
  289. package/src/server/serverFns/bug/bug-repro.ts +8 -11
  290. package/src/server/serverFns/bug/bug-story-bulk.ts +13 -18
  291. package/src/server/serverFns/bug/bug-story.ts +10 -14
  292. package/src/server/serverFns/bug/bug-views.ts +12 -18
  293. package/src/server/serverFns/bug/bug-webhooks.ts +13 -18
  294. package/src/server/serverFns/bug/test-bug-confirm.ts +7 -10
  295. package/src/server/serverFns/changelog/__tests__/fetch.test.ts +40 -1
  296. package/src/server/serverFns/changelog/fetch.ts +4 -6
  297. package/src/server/serverFns/chat/conversations.ts +17 -28
  298. package/src/server/serverFns/chat/list-messages.ts +4 -7
  299. package/src/server/serverFns/collab-presence.ts +11 -13
  300. package/src/server/serverFns/collab-snapshot.ts +6 -7
  301. package/src/server/serverFns/collab.ts +7 -7
  302. package/src/server/serverFns/compliance.ts +8 -8
  303. package/src/server/serverFns/design/__tests__/comments.test.ts +54 -10
  304. package/src/server/serverFns/design/__tests__/designs.test.ts +39 -16
  305. package/src/server/serverFns/design/__tests__/page-versions.test.ts +52 -14
  306. package/src/server/serverFns/design/__tests__/shares-password.test.ts +44 -14
  307. package/src/server/serverFns/design/__tests__/shares.test.ts +44 -14
  308. package/src/server/serverFns/design/__tests__/versions.test.ts +44 -14
  309. package/src/server/serverFns/design/ai/__tests__/agent-conversations.test.ts +50 -21
  310. package/src/server/serverFns/design/ai/__tests__/providers.test.ts +42 -8
  311. package/src/server/serverFns/design/ai/agent-conversations.ts +19 -26
  312. package/src/server/serverFns/design/ai/fill-annotation.ts +5 -7
  313. package/src/server/serverFns/design/ai/generate-prototype.ts +5 -7
  314. package/src/server/serverFns/design/ai/hosted-models.ts +4 -5
  315. package/src/server/serverFns/design/ai/providers.ts +30 -39
  316. package/src/server/serverFns/design/ai/source-mode.ts +10 -12
  317. package/src/server/serverFns/design/comments.ts +14 -13
  318. package/src/server/serverFns/design/designs.ts +13 -19
  319. package/src/server/serverFns/design/page-versions.ts +17 -18
  320. package/src/server/serverFns/design/pages.ts +17 -18
  321. package/src/server/serverFns/design/reviews.ts +8 -9
  322. package/src/server/serverFns/design/shares-password.ts +13 -19
  323. package/src/server/serverFns/design/shares.ts +22 -31
  324. package/src/server/serverFns/design/versions.ts +8 -9
  325. package/src/server/serverFns/harness/__tests__/attach-prototype.spec.ts +52 -2
  326. package/src/server/serverFns/harness/__tests__/attach-to-kb.spec.ts +52 -2
  327. package/src/server/serverFns/harness/__tests__/attach-to-story-ssrf.spec.ts +52 -2
  328. package/src/server/serverFns/harness/__tests__/attach-to-story.spec.ts +52 -2
  329. package/src/server/serverFns/harness/__tests__/cancel-run.test.ts +40 -15
  330. package/src/server/serverFns/harness/__tests__/extract-attachment.spec.ts +52 -2
  331. package/src/server/serverFns/harness/__tests__/gallery.spec.ts +76 -12
  332. package/src/server/serverFns/harness/__tests__/github-workspace.spec.ts +38 -6
  333. package/src/server/serverFns/harness/__tests__/media-prototype.spec.ts +50 -6
  334. package/src/server/serverFns/harness/__tests__/media.spec.ts +55 -11
  335. package/src/server/serverFns/harness/__tests__/sandbox-policy.test.ts +41 -16
  336. package/src/server/serverFns/harness/__tests__/workspace-files.test.ts +41 -16
  337. package/src/server/serverFns/harness/attach-prototype.ts +4 -4
  338. package/src/server/serverFns/harness/attach-to-kb.ts +4 -4
  339. package/src/server/serverFns/harness/attach-to-story.ts +4 -4
  340. package/src/server/serverFns/harness/cancel-run.ts +4 -6
  341. package/src/server/serverFns/harness/extract-attachment.ts +3 -4
  342. package/src/server/serverFns/harness/gallery.ts +19 -23
  343. package/src/server/serverFns/harness/github-workspace.ts +14 -21
  344. package/src/server/serverFns/harness/media.ts +18 -117
  345. package/src/server/serverFns/harness/sandbox-policy.ts +11 -10
  346. package/src/server/serverFns/harness/search-mention-candidates.ts +4 -6
  347. package/src/server/serverFns/harness/workspace-files.ts +19 -26
  348. package/src/server/serverFns/iteration/__tests__/iteration-auto-schedule.test.ts +35 -3
  349. package/src/server/serverFns/iteration/__tests__/iteration-crud.test.ts +35 -3
  350. package/src/server/serverFns/iteration/__tests__/iteration-stories.test.ts +35 -3
  351. package/src/server/serverFns/iteration/__tests__/iteration-transfer.test.ts +35 -3
  352. package/src/server/serverFns/iteration/iteration-auto-schedule.ts +7 -10
  353. package/src/server/serverFns/iteration/iteration-burndown.ts +4 -6
  354. package/src/server/serverFns/iteration/iteration-crud.ts +26 -35
  355. package/src/server/serverFns/iteration/iteration-stories.ts +10 -14
  356. package/src/server/serverFns/iteration/iteration-transfer.ts +4 -6
  357. package/src/server/serverFns/knowledge/public/bookmarks/categories.ts +11 -15
  358. package/src/server/serverFns/knowledge/public/bookmarks/create.ts +4 -6
  359. package/src/server/serverFns/knowledge/public/bookmarks/delete.ts +5 -7
  360. package/src/server/serverFns/knowledge/public/bookmarks/detail.ts +4 -6
  361. package/src/server/serverFns/knowledge/public/bookmarks/favorite.ts +4 -6
  362. package/src/server/serverFns/knowledge/public/bookmarks/list.ts +4 -6
  363. package/src/server/serverFns/knowledge/public/bookmarks/refresh-favicon.ts +4 -6
  364. package/src/server/serverFns/knowledge/public/bookmarks/share.ts +4 -6
  365. package/src/server/serverFns/knowledge/public/bookmarks/sync-github.ts +5 -7
  366. package/src/server/serverFns/knowledge/public/bookmarks/unshare.ts +4 -6
  367. package/src/server/serverFns/knowledge/public/bookmarks/update.ts +6 -8
  368. package/src/server/serverFns/knowledge/public/compliance/create.ts +4 -6
  369. package/src/server/serverFns/knowledge/public/compliance/delete.ts +5 -7
  370. package/src/server/serverFns/knowledge/public/compliance/detail.ts +4 -6
  371. package/src/server/serverFns/knowledge/public/compliance/list.ts +4 -6
  372. package/src/server/serverFns/knowledge/public/compliance/share.ts +4 -6
  373. package/src/server/serverFns/knowledge/public/compliance/unshare.ts +4 -6
  374. package/src/server/serverFns/knowledge/public/compliance/update.ts +5 -7
  375. package/src/server/serverFns/knowledge/public/dictionary/create.ts +4 -6
  376. package/src/server/serverFns/knowledge/public/dictionary/delete.ts +5 -7
  377. package/src/server/serverFns/knowledge/public/dictionary/detail.ts +4 -6
  378. package/src/server/serverFns/knowledge/public/dictionary/list.ts +4 -6
  379. package/src/server/serverFns/knowledge/public/dictionary/share.ts +4 -6
  380. package/src/server/serverFns/knowledge/public/dictionary/unshare.ts +4 -6
  381. package/src/server/serverFns/knowledge/public/dictionary/update.ts +5 -7
  382. package/src/server/serverFns/knowledge/public/entity-tags.ts +4 -6
  383. package/src/server/serverFns/knowledge/public/favorite.ts +7 -10
  384. package/src/server/serverFns/knowledge/public/legal/create.ts +4 -6
  385. package/src/server/serverFns/knowledge/public/legal/delete.ts +5 -7
  386. package/src/server/serverFns/knowledge/public/legal/detail.ts +4 -6
  387. package/src/server/serverFns/knowledge/public/legal/list.ts +4 -6
  388. package/src/server/serverFns/knowledge/public/legal/share.ts +4 -6
  389. package/src/server/serverFns/knowledge/public/legal/unshare.ts +4 -6
  390. package/src/server/serverFns/knowledge/public/legal/update.ts +5 -7
  391. package/src/server/serverFns/knowledge-index.ts +12 -16
  392. package/src/server/serverFns/knowledge.ts +50 -67
  393. package/src/server/serverFns/notifications.ts +25 -34
  394. package/src/server/serverFns/plugins/harness-plugins.ts +16 -23
  395. package/src/server/serverFns/project/module-overview.ts +7 -10
  396. package/src/server/serverFns/project.ts +48 -68
  397. package/src/server/serverFns/references/create.ts +4 -6
  398. package/src/server/serverFns/references/resolve.ts +4 -6
  399. package/src/server/serverFns/references/search.ts +4 -6
  400. package/src/server/serverFns/share/design/[designId]/events.ts +4 -6
  401. package/src/server/serverFns/sso.ts +1 -1
  402. package/src/server/serverFns/story/__tests__/bulk.test.ts +34 -1
  403. package/src/server/serverFns/story/__tests__/story-assoc.test.ts +34 -1
  404. package/src/server/serverFns/story/__tests__/story-attachments.test.ts +34 -1
  405. package/src/server/serverFns/story/__tests__/story-crud-date-key.test.ts +42 -17
  406. package/src/server/serverFns/story/__tests__/story-dependencies.test.ts +34 -1
  407. package/src/server/serverFns/story/__tests__/story-gantt-deps.test.ts +34 -1
  408. package/src/server/serverFns/story/__tests__/story-groups.test.ts +34 -1
  409. package/src/server/serverFns/story/__tests__/story-read-path-authz.test.ts +40 -4
  410. package/src/server/serverFns/story/__tests__/story-search.test.ts +34 -1
  411. package/src/server/serverFns/story/__tests__/story-transfer.test.ts +34 -1
  412. package/src/server/serverFns/story/link-preview.ts +5 -7
  413. package/src/server/serverFns/story/story-assoc.ts +28 -38
  414. package/src/server/serverFns/story/story-attachments.ts +7 -10
  415. package/src/server/serverFns/story/story-children.ts +4 -6
  416. package/src/server/serverFns/story/story-comments.ts +13 -18
  417. package/src/server/serverFns/story/story-crud/activities.ts +4 -6
  418. package/src/server/serverFns/story/story-crud/archive.ts +7 -10
  419. package/src/server/serverFns/story/story-crud/bulk.ts +10 -14
  420. package/src/server/serverFns/story/story-crud/detail.ts +7 -10
  421. package/src/server/serverFns/story/story-crud/label-suggest.ts +4 -6
  422. package/src/server/serverFns/story/story-crud/labels.ts +6 -9
  423. package/src/server/serverFns/story/story-crud/user-brief.ts +4 -6
  424. package/src/server/serverFns/story/story-crud.ts +13 -18
  425. package/src/server/serverFns/story/story-dependencies.ts +16 -22
  426. package/src/server/serverFns/story/story-groups.ts +10 -14
  427. package/src/server/serverFns/story/story-links.ts +13 -18
  428. package/src/server/serverFns/story/story-reactions.ts +13 -18
  429. package/src/server/serverFns/story/story-search.ts +7 -10
  430. package/src/server/serverFns/story/story-transfer.ts +10 -14
  431. package/src/server/serverFns/story/story-tree.ts +7 -10
  432. package/src/server/serverFns/story-display-options.ts +7 -8
  433. package/src/server/serverFns/story-view.ts +12 -18
  434. package/src/server/serverFns/tasks/task-crud.ts +13 -17
  435. package/src/server/serverFns/tasks/task-queries.ts +12 -18
  436. package/src/server/serverFns/team.ts +46 -66
  437. package/src/server/serverFns/testcase/__tests__/automation.test.ts +38 -5
  438. package/src/server/serverFns/testcase/__tests__/evidence-upload.test.ts +37 -3
  439. package/src/server/serverFns/testcase/__tests__/generation.test.ts +38 -5
  440. package/src/server/serverFns/testcase/__tests__/plans.test.ts +36 -3
  441. package/src/server/serverFns/testcase/__tests__/regression.test.ts +36 -3
  442. package/src/server/serverFns/testcase/__tests__/run-cases.test.ts +36 -3
  443. package/src/server/serverFns/testcase/__tests__/runs.test.ts +36 -3
  444. package/src/server/serverFns/testcase/__tests__/stats.test.ts +36 -3
  445. package/src/server/serverFns/testcase/__tests__/testcase-board.test.ts +39 -5
  446. package/src/server/serverFns/testcase/__tests__/testcase-crud.test.ts +36 -3
  447. package/src/server/serverFns/testcase/__tests__/testcase-folders.test.ts +36 -3
  448. package/src/server/serverFns/testcase/__tests__/testcase-groups.test.ts +38 -5
  449. package/src/server/serverFns/testcase/automation.ts +13 -17
  450. package/src/server/serverFns/testcase/bulk.ts +10 -14
  451. package/src/server/serverFns/testcase/evidence-upload.ts +5 -7
  452. package/src/server/serverFns/testcase/generation.ts +10 -13
  453. package/src/server/serverFns/testcase/plans.ts +23 -31
  454. package/src/server/serverFns/testcase/regression.ts +7 -10
  455. package/src/server/serverFns/testcase/run-cases.ts +13 -18
  456. package/src/server/serverFns/testcase/runs.ts +13 -18
  457. package/src/server/serverFns/testcase/stats.ts +13 -18
  458. package/src/server/serverFns/testcase/testcase-activities.ts +4 -6
  459. package/src/server/serverFns/testcase/testcase-board.ts +4 -6
  460. package/src/server/serverFns/testcase/testcase-crud.ts +20 -27
  461. package/src/server/serverFns/testcase/testcase-display-options.ts +8 -11
  462. package/src/server/serverFns/testcase/testcase-export.ts +5 -7
  463. package/src/server/serverFns/testcase/testcase-filter-views.ts +12 -18
  464. package/src/server/serverFns/testcase/testcase-folders.ts +16 -22
  465. package/src/server/serverFns/testcase/testcase-groups.ts +4 -6
  466. package/src/server/serverFns/testcase/testcase-reorder.ts +4 -6
  467. package/src/server/serverFns/translation.ts +4 -6
  468. package/src/server/serverFns/user/avatar.ts +4 -6
  469. package/src/server/serverFns/user/settings.ts +4 -6
  470. package/src/server/serverFns/user/update-locale.ts +4 -6
  471. package/src/server/serverFns/workspace-kb.ts +26 -35
  472. package/src/server/serverFns/workspace.ts +43 -59
  473. package/src/server/serverFns/ws.ts +4 -6
  474. package/src/server/serverfn-public-allowlist.ts +117 -0
  475. package/src/server/story/types.ts +0 -1
  476. package/src/server/sync/__tests__/scopes.test.ts +64 -0
  477. package/src/server/sync/scopes.ts +7 -0
  478. package/src/server/testcase/__tests__/auto-bug.test.ts +44 -12
  479. package/src/__tests__/bench/baselines/format-timestamp.json +0 -44
  480. package/src/__typeprobe__.d.ts +0 -4
  481. package/src/components/forms/app-form-dialog.tsx +0 -126
  482. package/src/components/forms/hooks/use-form-submit.ts +0 -57
  483. package/src/components/forms/types.ts +0 -34
  484. package/src/components/harness/code/workspace-picker.tsx +0 -239
  485. package/src/components/tiptap/extensions/local-file/insert-local-file.ts +0 -35
  486. package/src/components/tiptap/extensions/local-file/local-file-node.ts +0 -71
  487. package/src/devframe-docks/ai-chat-iframe.tsx +0 -29
  488. package/src/devframe-docks/session-iframe.tsx +0 -90
  489. package/src/lib/__tests__/desktop-detect.test.ts +0 -19
  490. package/src/lib/collections/index.ts +0 -22
  491. package/src/lib/collections/knowledge/index.ts +0 -18
  492. package/src/lib/collections/knowledge/knowledge-bases-collection.ts +0 -34
  493. package/src/lib/collections/reference/bookmark-categories-collection.ts +0 -31
  494. package/src/lib/collections/reference/labels-collection.ts +0 -31
  495. package/src/lib/collections/reference/projects-collection.ts +0 -31
  496. package/src/lib/collections/reference/users-brief-collection.ts +0 -35
  497. package/src/lib/collections/reference/workspaces-collection.ts +0 -34
  498. package/src/lib/desktop-detect.ts +0 -29
  499. package/src/paraglide/messages/en.js +0 -28260
  500. package/src/paraglide/messages/zh.js +0 -28258
@@ -23,8 +23,12 @@ import { beforeEach, describe, expect, it, vi } from "vitest";
23
23
 
24
24
  vi.mock("@tanstack/react-start", () => {
25
25
  const createServerFn = () => {
26
- const capture: { validator?: unknown; handler?: unknown } = {};
26
+ const capture: { validator?: unknown; handler?: unknown; middlewares?: unknown[] } = {};
27
27
  const api = {
28
+ middleware: (mws: unknown[]) => {
29
+ capture.middlewares = [...(capture.middlewares ?? []), ...mws];
30
+ return api;
31
+ },
28
32
  validator: (v: unknown) => {
29
33
  capture.validator = v;
30
34
  return api;
@@ -34,13 +38,42 @@ vi.mock("@tanstack/react-start", () => {
34
38
  return async (args: { data: unknown }) => {
35
39
  const v = capture.validator as { parse?: (d: unknown) => unknown } | undefined;
36
40
  const data = v && v.parse ? v.parse(args.data) : args.data;
37
- return (h as (p: { data: unknown }) => Promise<unknown>)({ data });
41
+ // 迁移后经 .middleware([authContextMiddleware]) 注入 context.user:
42
+ // mock 依序执行 middleware 的 server 段,真实鉴权链由被 mock 的
43
+ // auth-helpers/getRequest 承接
44
+ let context: any = {};
45
+ for (const mw of capture.middlewares ?? []) {
46
+ const serverFn = (mw as any)?.options?.server;
47
+ if (!serverFn) continue;
48
+ const result = await serverFn({
49
+ data,
50
+ context,
51
+ method: "POST",
52
+ serverFnMeta: {},
53
+ signal: new AbortController().signal,
54
+ next: async (inner: any) => ({ context: { ...context, ...(inner?.context ?? {}) } }),
55
+ });
56
+ context = result.context;
57
+ }
58
+ return (h as (p: { data: unknown; context: unknown }) => Promise<unknown>)({ data, context });
38
59
  };
39
60
  },
40
61
  };
41
62
  return api;
42
63
  };
43
- return { createServerFn };
64
+ return {
65
+ // auth-context.ts 依赖 createMiddleware({ type: 'function' }).server(fn):
66
+ // mock 产出与真实 middleware 同构的 { options: { server } } 形状
67
+ createServerFn,
68
+ createMiddleware: (opts: any) => {
69
+ const mw: any = { options: { type: opts?.type } };
70
+ mw.server = (fn: Function) => {
71
+ mw.options.server = fn;
72
+ return mw;
73
+ };
74
+ return mw;
75
+ },
76
+ };
44
77
  });
45
78
  vi.mock("@tanstack/react-start/server", () => ({ getRequest: () => ({}) }));
46
79
 
@@ -69,8 +102,11 @@ const PRISMA = H.prisma;
69
102
  vi.mock("@allbluecn/database/get-prisma", () => ({
70
103
  getPrisma: async () => H.prisma,
71
104
  }));
105
+ // 迁移后 requireAuth 消费入口:authContextMiddleware 内部调用
106
+ vi.mock("@/server/auth-helpers", () => ({
107
+ requireAuth: H.fns.requireAuth,
108
+ }));
72
109
  vi.mock("@allbluecn/kernel", () => ({
73
- getServerSeam: () => ({ requireAuth: H.fns.requireAuth }),
74
110
  // database 主入口(pages.ts 的 Prisma 值导入连带加载)模块顶层注册 seam,mock 须提供
75
111
  registerPrismaSeam: () => {},
76
112
  }));
@@ -21,6 +21,11 @@ vi.mock('@tanstack/react-start', () => ({
21
21
  createServerFn: (_config: any) => {
22
22
  const api: any = {
23
23
  _validator: undefined,
24
+ _middlewares: [] as any[],
25
+ middleware(mws: any[]) {
26
+ this._middlewares.push(...mws)
27
+ return this
28
+ },
24
29
  validator(schema: any) {
25
30
  this._validator = schema
26
31
  return this
@@ -31,13 +36,40 @@ vi.mock('@tanstack/react-start', () => ({
31
36
  if (this._validator && data !== undefined) {
32
37
  data = this._validator.parse ? this._validator.parse(data) : data
33
38
  }
34
- return fn({ data })
39
+ // 迁移后经 .middleware([authContextMiddleware]) 注入 context.user:
40
+ // 依序执行 middleware 的 server 段,真实鉴权链由被 mock 的 auth-helpers 承接
41
+ let context: any = {}
42
+ for (const mw of this._middlewares) {
43
+ const serverFn = mw?.options?.server
44
+ if (!serverFn) continue
45
+ const result = await serverFn({
46
+ data,
47
+ context,
48
+ method: 'POST',
49
+ serverFnMeta: {},
50
+ signal: new AbortController().signal,
51
+ next: async (inner: any) => ({ context: { ...context, ...(inner?.context ?? {}) } }),
52
+ })
53
+ context = result.context
54
+ }
55
+ return fn({ data, context })
35
56
  }
36
57
  return wrapped
37
58
  },
38
59
  }
39
60
  return api
40
61
  },
62
+ // auth-context.ts 依赖 createMiddleware({ type: 'function' }).server(fn):
63
+ // mock 产出与真实 middleware 同构的 { options: { server } } 形状,
64
+ // 供上方 handler 包装器执行 server 段注入 context.user
65
+ createMiddleware: (opts: any) => {
66
+ const mw: any = { options: { type: opts?.type } }
67
+ mw.server = (fn: Function) => {
68
+ mw.options.server = fn
69
+ return mw
70
+ }
71
+ return mw
72
+ },
41
73
  }))
42
74
 
43
75
  vi.mock('@tanstack/react-start/server', () => ({
@@ -32,24 +32,57 @@ import { beforeEach, describe, expect, it, vi } from "vitest";
32
32
 
33
33
  vi.mock("@tanstack/react-start", () => {
34
34
  const createServerFn = () => {
35
- const capture: { validator?: unknown; handler?: unknown } = {};
35
+ const capture: { validator?: unknown; handler?: unknown; middlewares?: unknown[] } = {};
36
36
  const api = {
37
37
  validator: (v: unknown) => {
38
38
  capture.validator = v;
39
39
  return api;
40
40
  },
41
+ middleware: (mws: unknown[]) => {
42
+ capture.middlewares = mws;
43
+ return api;
44
+ },
41
45
  handler: (h: unknown) => {
42
46
  capture.handler = h;
43
47
  return async (args: { data: unknown }) => {
44
48
  const v = capture.validator as { parse?: (d: unknown) => unknown } | undefined;
45
49
  const data = v && v.parse ? v.parse(args.data) : args.data;
46
- return (h as (p: { data: unknown }) => Promise<unknown>)({ data });
50
+ // 迁移后经 .middleware([authContextMiddleware]) 注入 context.user:
51
+ // 依序执行 middleware 的 server 段,真实鉴权链由被 mock 的 auth-helpers 承接
52
+ let context: Record<string, unknown> = {};
53
+ for (const mw of capture.middlewares ?? []) {
54
+ const serverFn = (mw as { options?: { server?: unknown } })?.options?.server;
55
+ if (typeof serverFn !== "function") continue;
56
+ const result = await (
57
+ serverFn as (p: unknown) => Promise<{ context?: unknown }>
58
+ )({
59
+ data,
60
+ context,
61
+ method: "POST",
62
+ serverFnMeta: {},
63
+ signal: new AbortController().signal,
64
+ next: async (inner: { context?: unknown }) => ({
65
+ context: { ...context, ...(inner?.context ?? {}) },
66
+ }),
67
+ });
68
+ context = (result?.context ?? context) as Record<string, unknown>;
69
+ }
70
+ return (h as (p: { data: unknown; context: unknown }) => Promise<unknown>)({ data, context });
47
71
  };
48
72
  },
49
73
  };
50
74
  return api;
51
75
  };
52
- return { createServerFn };
76
+ // auth-context.ts 依赖 createMiddleware({ type: 'function' }).server(fn)
77
+ const createMiddleware = (opts?: { type?: string }) => {
78
+ const mw: { options: { type?: string; server?: unknown }; server?: unknown } = { options: { type: opts?.type } };
79
+ mw.server = (fn: unknown) => {
80
+ mw.options.server = fn;
81
+ return mw;
82
+ };
83
+ return mw;
84
+ };
85
+ return { createServerFn, createMiddleware };
53
86
  });
54
87
  vi.mock("@tanstack/react-start/server", () => ({ getRequest: () => ({}) }));
55
88
 
@@ -21,25 +21,59 @@
21
21
  import { beforeEach, describe, expect, it, vi } from "vitest";
22
22
 
23
23
  vi.mock("@tanstack/react-start", () => {
24
+ // 每个 serverFn 实例独立持有自己的 capture,避免同模块多实例共用导致 validator 串号
24
25
  const createServerFn = () => {
25
- const capture: { validator?: unknown; handler?: unknown } = {};
26
+ const capture: { validator?: unknown; handler?: unknown; middlewares?: unknown[] } = {};
26
27
  const api = {
27
28
  validator: (v: unknown) => {
28
29
  capture.validator = v;
29
30
  return api;
30
31
  },
32
+ middleware: (mws: unknown[]) => {
33
+ capture.middlewares = mws;
34
+ return api;
35
+ },
31
36
  handler: (h: unknown) => {
32
37
  capture.handler = h;
33
38
  return async (args: { data: unknown }) => {
34
39
  const v = capture.validator as { parse?: (d: unknown) => unknown } | undefined;
35
40
  const data = v && v.parse ? v.parse(args.data) : args.data;
36
- return (h as (p: { data: unknown }) => Promise<unknown>)({ data });
41
+ // 迁移后经 .middleware([authContextMiddleware]) 注入 context.user:
42
+ // 依序执行 middleware 的 server 段,真实鉴权链由被 mock 的 auth-helpers 承接
43
+ let context: Record<string, unknown> = {};
44
+ for (const mw of capture.middlewares ?? []) {
45
+ const serverFn = (mw as { options?: { server?: unknown } })?.options?.server;
46
+ if (typeof serverFn !== "function") continue;
47
+ const result = await (
48
+ serverFn as (p: unknown) => Promise<{ context?: unknown }>
49
+ )({
50
+ data,
51
+ context,
52
+ method: "POST",
53
+ serverFnMeta: {},
54
+ signal: new AbortController().signal,
55
+ next: async (inner: { context?: unknown }) => ({
56
+ context: { ...context, ...(inner?.context ?? {}) },
57
+ }),
58
+ });
59
+ context = (result?.context ?? context) as Record<string, unknown>;
60
+ }
61
+ return (h as (p: { data: unknown; context: unknown }) => Promise<unknown>)({ data, context });
37
62
  };
38
63
  },
39
64
  };
40
65
  return api;
41
66
  };
42
- return { createServerFn };
67
+ // auth-context.ts 依赖 createMiddleware({ type: 'function' }).server(fn)
68
+ const createMiddleware = (opts?: { type?: string }) => {
69
+ const mw: { options: { type?: string; server?: unknown }; server?: unknown } = { options: { type: opts?.type } };
70
+ mw.server = (fn: unknown) => {
71
+ mw.options.server = fn;
72
+ return mw;
73
+ };
74
+ return mw;
75
+ };
76
+ return { createServerFn, createMiddleware };
43
77
  });
44
78
  vi.mock("@tanstack/react-start/server", () => ({ getRequest: () => ({}) }));
45
79
 
@@ -26,22 +26,56 @@ vi.mock("@tanstack/react-start", () => ({
26
26
  createServerFn: (config: any) => {
27
27
  const api: any = {
28
28
  _validator: undefined,
29
+ _middlewares: [] as any[],
30
+ middleware(mws: any[]) {
31
+ this._middlewares.push(...mws);
32
+ return this;
33
+ },
29
34
  validator(schema: any) {
30
35
  this._validator = schema;
31
36
  return this;
32
37
  },
33
38
  handler(fn: Function) {
34
- return async (args: any) => {
39
+ const wrapped = async (args: any) => {
35
40
  let data = args?.data;
36
41
  if (this._validator && data !== undefined) {
37
42
  data = this._validator.parse ? this._validator.parse(data) : data;
38
43
  }
39
- return fn({ data });
44
+ // 迁移后经 .middleware([authContextMiddleware]) 注入 context.user:
45
+ // mock 依序执行 middleware 的 server 段(复现框架 executeMiddleware 的
46
+ // context 合并语义),真实鉴权链由被 mock 的 auth-helpers 承接
47
+ let context: any = {}
48
+ for (const mw of this._middlewares) {
49
+ const serverFn = mw?.options?.server
50
+ if (!serverFn) continue
51
+ const result = await serverFn({
52
+ data,
53
+ context,
54
+ method: "POST",
55
+ serverFnMeta: {},
56
+ signal: new AbortController().signal,
57
+ next: async (inner: any) => ({ context: { ...context, ...(inner?.context ?? {}) } }),
58
+ })
59
+ context = result.context
60
+ }
61
+ return fn({ data, context });
40
62
  };
63
+ return wrapped;
41
64
  },
42
65
  };
43
66
  return api;
44
67
  },
68
+ // auth-context.ts 依赖 createMiddleware({ type: 'function' }).server(fn):
69
+ // mock 产出与真实 middleware 同构的 { options: { server } } 形状,
70
+ // 供上方 handler 包装器执行 server 段注入 context.user
71
+ createMiddleware: (opts: any) => {
72
+ const mw: any = { options: { type: opts?.type } }
73
+ mw.server = (fn: Function) => {
74
+ mw.options.server = fn
75
+ return mw
76
+ }
77
+ return mw
78
+ },
45
79
  }));
46
80
  vi.mock("@tanstack/react-start/server", () => ({ getRequest: () => ({}) }));
47
81
 
@@ -21,22 +21,56 @@ vi.mock("@tanstack/react-start", () => ({
21
21
  createServerFn: (config: any) => {
22
22
  const api: any = {
23
23
  _validator: undefined,
24
+ _middlewares: [] as any[],
25
+ middleware(mws: any[]) {
26
+ this._middlewares.push(...mws);
27
+ return this;
28
+ },
24
29
  validator(schema: any) {
25
30
  this._validator = schema;
26
31
  return this;
27
32
  },
28
33
  handler(fn: Function) {
29
- return async (args: any) => {
34
+ const wrapped = async (args: any) => {
30
35
  let data = args?.data;
31
36
  if (this._validator && data !== undefined) {
32
37
  data = this._validator.parse ? this._validator.parse(data) : data;
33
38
  }
34
- return fn({ data });
39
+ // 迁移后经 .middleware([authContextMiddleware]) 注入 context.user:
40
+ // mock 依序执行 middleware 的 server 段(复现框架 executeMiddleware 的
41
+ // context 合并语义),真实鉴权链由被 mock 的 auth-helpers 承接
42
+ let context: any = {}
43
+ for (const mw of this._middlewares) {
44
+ const serverFn = mw?.options?.server
45
+ if (!serverFn) continue
46
+ const result = await serverFn({
47
+ data,
48
+ context,
49
+ method: "POST",
50
+ serverFnMeta: {},
51
+ signal: new AbortController().signal,
52
+ next: async (inner: any) => ({ context: { ...context, ...(inner?.context ?? {}) } }),
53
+ })
54
+ context = result.context
55
+ }
56
+ return fn({ data, context });
35
57
  };
58
+ return wrapped;
36
59
  },
37
60
  };
38
61
  return api;
39
62
  },
63
+ // auth-context.ts 依赖 createMiddleware({ type: 'function' }).server(fn):
64
+ // mock 产出与真实 middleware 同构的 { options: { server } } 形状,
65
+ // 供上方 handler 包装器执行 server 段注入 context.user
66
+ createMiddleware: (opts: any) => {
67
+ const mw: any = { options: { type: opts?.type } }
68
+ mw.server = (fn: Function) => {
69
+ mw.options.server = fn
70
+ return mw
71
+ }
72
+ return mw
73
+ },
40
74
  }));
41
75
  vi.mock("@tanstack/react-start/server", () => ({ getRequest: () => ({}) }));
42
76
 
@@ -21,6 +21,11 @@ vi.mock("@tanstack/react-start", () => ({
21
21
  createServerFn: (config: any) => {
22
22
  const api: any = {
23
23
  _validator: undefined,
24
+ _middlewares: [] as any[],
25
+ middleware(mws: any[]) {
26
+ this._middlewares.push(...mws);
27
+ return this;
28
+ },
24
29
  validator(schema: any) {
25
30
  this._validator = schema;
26
31
  return this;
@@ -31,13 +36,41 @@ vi.mock("@tanstack/react-start", () => ({
31
36
  if (this._validator && data !== undefined) {
32
37
  data = this._validator.parse ? this._validator.parse(data) : data;
33
38
  }
34
- return fn({ data });
39
+ // 迁移后经 .middleware([authContextMiddleware]) 注入 context.user:
40
+ // mock 依序执行 middleware 的 server 段(复现框架 executeMiddleware 的
41
+ // context 合并语义),真实鉴权链由被 mock 的 auth-helpers 承接
42
+ let context: any = {}
43
+ for (const mw of this._middlewares) {
44
+ const serverFn = mw?.options?.server
45
+ if (!serverFn) continue
46
+ const result = await serverFn({
47
+ data,
48
+ context,
49
+ method: "POST",
50
+ serverFnMeta: {},
51
+ signal: new AbortController().signal,
52
+ next: async (inner: any) => ({ context: { ...context, ...(inner?.context ?? {}) } }),
53
+ })
54
+ context = result.context
55
+ }
56
+ return fn({ data, context });
35
57
  };
36
58
  return wrapped;
37
59
  },
38
60
  };
39
61
  return api;
40
62
  },
63
+ // auth-context.ts 依赖 createMiddleware({ type: 'function' }).server(fn):
64
+ // mock 产出与真实 middleware 同构的 { options: { server } } 形状,
65
+ // 供上方 handler 包装器执行 server 段注入 context.user
66
+ createMiddleware: (opts: any) => {
67
+ const mw: any = { options: { type: opts?.type } }
68
+ mw.server = (fn: Function) => {
69
+ mw.options.server = fn
70
+ return mw
71
+ }
72
+ return mw
73
+ },
41
74
  }));
42
75
 
43
76
  vi.mock("@tanstack/react-start/server", () => ({
@@ -17,8 +17,7 @@
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
- import { requireAuth } from '@/server/auth-helpers'
20
+ import { authContextMiddleware } from '@/server/middlewares/auth-context'
22
21
  import { addDays, startOfDay, startOfMonth, subMonths, eachDayOfInterval } from 'date-fns'
23
22
  import { formatInTimeZone, toZonedTime, fromZonedTime } from 'date-fns-tz'
24
23
  import { z } from 'zod'
@@ -67,12 +66,11 @@ const activityQuerySchema = z.object({
67
66
  })
68
67
 
69
68
  export const getActivityDataFn = createServerFn({ method: 'GET' })
69
+ .middleware([authContextMiddleware])
70
70
  .validator(activityQuerySchema)
71
- .handler(async ({ data }) => {
71
+ .handler(async ({ data, context }) => {
72
72
  const prisma = await getPrisma()
73
- const request = getRequest()
74
- const session = await requireAuth(request)
75
- const userId = session.user.id
73
+ const userId = context.user.id
76
74
  const timezone = normalizeTimeZone(data.timezone)
77
75
 
78
76
  const now = new Date()
@@ -135,11 +133,10 @@ export const getActivityDataFn = createServerFn({ method: 'GET' })
135
133
  // ── S16(裁决:dashboard 真数据最小范围)──
136
134
 
137
135
  /** 统计卡四项:PRD 总数 / 今日完成动态 / 未读评论(占位 0,读模型未建)/ 已装应用 */
138
- export const getDashboardStatsFn = createServerFn({ method: "GET" }).handler(async () => {
136
+ export const getDashboardStatsFn = createServerFn({ method: "GET" })
137
+ .middleware([authContextMiddleware]).handler(async ({ context }) => {
139
138
  const prisma = await getPrisma()
140
- const request = getRequest()
141
- const session = await requireAuth(request)
142
- const userId = session.user.id
139
+ const userId = context.user.id
143
140
  const now = new Date()
144
141
 
145
142
  const [prdCount, todayDone, installedApps] = await Promise.all([
@@ -164,12 +161,11 @@ const recentActivitiesSchema = z.object({ take: z.number().int().min(1).max(50).
164
161
  /** 最近动态流:本人 storyActivity 最近 N 条(跨项目),action 经 ACTIVITY_LABEL
165
162
  * 本地化在客户端做(shared 常量同源)。 */
166
163
  export const getRecentActivitiesFn = createServerFn({ method: "GET" })
164
+ .middleware([authContextMiddleware])
167
165
  .validator(recentActivitiesSchema)
168
- .handler(async ({ data }) => {
166
+ .handler(async ({ data, context }) => {
169
167
  const prisma = await getPrisma()
170
- const request = getRequest()
171
- const session = await requireAuth(request)
172
- const userId = session.user.id
168
+ const userId = context.user.id
173
169
 
174
170
  const rows = await prisma.storyActivity.findMany({
175
171
  where: { userId },
@@ -17,6 +17,7 @@
17
17
 
18
18
  import { getPrisma } from "@allbluecn/database/get-prisma"
19
19
  import { createServerFn } from "@tanstack/react-start"
20
+ import { authContextMiddleware } from "@/server/middlewares/auth-context"
20
21
  import { getRequest } from "@tanstack/react-start/server"
21
22
  import { z } from "zod"
22
23
  // AGENT_TOOL_KEYS 在模块顶层(zod schema)被消费,会保留进客户端 split stub——
@@ -24,7 +25,6 @@ import { z } from "zod"
24
25
  import { AGENT_TOOL_KEYS } from "@/server/ai-gateway/tools/select"
25
26
  import { requireFeature } from "@/server/entitlements"
26
27
  import { requireResource } from "@/server/resources"
27
- import { requireUserId } from "@/server/auth-helpers"
28
28
 
29
29
  const agentInputSchema = z.object({
30
30
  name: z.string().min(1).max(64),
@@ -92,10 +92,10 @@ const AGENT_DTO_SELECT = {
92
92
  updatedAt: true,
93
93
  } as const
94
94
 
95
- export const listAgentsFn = createServerFn({ method: "GET" }).handler(async () => {
95
+ export const listAgentsFn = createServerFn({ method: "GET" })
96
+ .middleware([authContextMiddleware]).handler(async ({ context }) => {
96
97
  const prisma = await getPrisma()
97
- const request = getRequest()
98
- const userId = await requireUserId(request)
98
+ const userId = context.user.id
99
99
 
100
100
  const agents = await prisma.userAgent.findMany({
101
101
  where: { userId, isDeleted: false },
@@ -107,11 +107,12 @@ export const listAgentsFn = createServerFn({ method: "GET" }).handler(async () =
107
107
  })
108
108
 
109
109
  export const createAgentFn = createServerFn({ method: "POST" })
110
+ .middleware([authContextMiddleware])
110
111
  .validator(agentInputSchema)
111
- .handler(async ({ data }) => {
112
+ .handler(async ({ data, context }) => {
112
113
  const prisma = await getPrisma()
113
114
  const request = getRequest()
114
- const userId = await requireUserId(request)
115
+ const userId = context.user.id
115
116
 
116
117
  await requireFeature(request, "customAgents")
117
118
  await requireResource(request, "agentQuota", 1)
@@ -139,11 +140,11 @@ export const createAgentFn = createServerFn({ method: "POST" })
139
140
  const getAgentSchema = z.object({ id: z.string() })
140
141
 
141
142
  export const getAgentFn = createServerFn({ method: "GET" })
143
+ .middleware([authContextMiddleware])
142
144
  .validator(getAgentSchema)
143
- .handler(async ({ data }) => {
145
+ .handler(async ({ data, context }) => {
144
146
  const prisma = await getPrisma()
145
- const request = getRequest()
146
- const userId = await requireUserId(request)
147
+ const userId = context.user.id
147
148
 
148
149
  const agent = await prisma.userAgent.findFirst({
149
150
  where: { id: data.id, userId, isDeleted: false },
@@ -194,11 +195,11 @@ function buildAgentUpdatePayload(input: AgentUpdateInput): Record<string, unknow
194
195
  }
195
196
 
196
197
  export const updateAgentFn = createServerFn({ method: "POST" })
198
+ .middleware([authContextMiddleware])
197
199
  .validator(agentUpdateSchema)
198
- .handler(async ({ data }) => {
200
+ .handler(async ({ data, context }) => {
199
201
  const prisma = await getPrisma()
200
- const request = getRequest()
201
- const userId = await requireUserId(request)
202
+ const userId = context.user.id
202
203
 
203
204
  // DB-03:属主校验合并进写入(updateMany 计数判定),1 次查询替代 2 次
204
205
  const update = buildAgentUpdatePayload(data)
@@ -216,11 +217,11 @@ export const updateAgentFn = createServerFn({ method: "POST" })
216
217
  const deleteAgentSchema = z.object({ id: z.string() })
217
218
 
218
219
  export const deleteAgentFn = createServerFn({ method: "POST" })
220
+ .middleware([authContextMiddleware])
219
221
  .validator(deleteAgentSchema)
220
- .handler(async ({ data }) => {
222
+ .handler(async ({ data, context }) => {
221
223
  const prisma = await getPrisma()
222
- const request = getRequest()
223
- const userId = await requireUserId(request)
224
+ const userId = context.user.id
224
225
 
225
226
  // DB-03:属主校验合并进写入(updateMany 计数判定)
226
227
  const res = await prisma.userAgent.updateMany({
@@ -1,17 +1,16 @@
1
1
  import { getPrisma } from "@allbluecn/database/get-prisma"
2
2
  import { createServerFn } from "@tanstack/react-start"
3
- import { getRequest } from "@tanstack/react-start/server"
3
+ import { authContextMiddleware } from "@/server/middlewares/auth-context"
4
4
  import { z } from "zod"
5
5
  import { BIZ_AGENT_KEYS } from "@/server/ai-gateway/runs/biz-keys"
6
6
  import { resolveSystemPrompt } from "@/server/ai-gateway/prompts/registry"
7
- import { requireUserId } from "@/server/auth-helpers"
8
7
 
9
8
  const bizKeySchema = z.enum(BIZ_AGENT_KEYS)
10
9
 
11
- export const listBindingsFn = createServerFn({ method: "GET" }).handler(async () => {
10
+ export const listBindingsFn = createServerFn({ method: "GET" })
11
+ .middleware([authContextMiddleware]).handler(async ({ context }) => {
12
12
  const prisma = await getPrisma()
13
- const request = getRequest()
14
- const userId = await requireUserId(request)
13
+ const userId = context.user.id
15
14
 
16
15
  const rows = await prisma.businessAgentBinding.findMany({
17
16
  where: { userId },
@@ -43,11 +42,11 @@ const upsertBindingSchema = z.object({
43
42
  })
44
43
 
45
44
  export const upsertBindingFn = createServerFn({ method: "POST" })
45
+ .middleware([authContextMiddleware])
46
46
  .validator(upsertBindingSchema)
47
- .handler(async ({ data }) => {
47
+ .handler(async ({ data, context }) => {
48
48
  const prisma = await getPrisma()
49
- const request = getRequest()
50
- const userId = await requireUserId(request)
49
+ const userId = context.user.id
51
50
 
52
51
  if (data.agentId === null) {
53
52
  await prisma.businessAgentBinding.deleteMany({
@@ -72,11 +71,11 @@ export const upsertBindingFn = createServerFn({ method: "POST" })
72
71
  const setDefaultSchema = z.object({ agentId: z.string().nullable() })
73
72
 
74
73
  export const setDefaultAgentFn = createServerFn({ method: "POST" })
74
+ .middleware([authContextMiddleware])
75
75
  .validator(setDefaultSchema)
76
- .handler(async ({ data }) => {
76
+ .handler(async ({ data, context }) => {
77
77
  const prisma = await getPrisma()
78
- const request = getRequest()
79
- const userId = await requireUserId(request)
78
+ const userId = context.user.id
80
79
 
81
80
  const agentId = data.agentId
82
81
  if (agentId === null) {
@@ -106,8 +105,8 @@ export const setDefaultAgentFn = createServerFn({ method: "POST" })
106
105
  })
107
106
 
108
107
  // 登录后智能体表单使用的内置 persona 提示词摘要(内容非机密,但端点仅面向已登录用户)
109
- export const getPersonaHintFn = createServerFn({ method: "GET" }).handler(async () => {
110
- await requireUserId(getRequest())
108
+ export const getPersonaHintFn = createServerFn({ method: "GET" })
109
+ .middleware([authContextMiddleware]).handler(async ({ context }) => {
111
110
  const sections = await resolveSystemPrompt("harness.agent-persona", {})
112
111
  return { hint: sections[0] ?? "" }
113
112
  })