@allbluecn/web-app 0.19.2 → 0.19.4

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 (1073) hide show
  1. package/package.json +45 -44
  2. package/public/fonts/Trap-font/Trap-Black.otf +0 -0
  3. package/public/fonts/Trap-font/Trap-Bold.otf +0 -0
  4. package/public/fonts/Trap-font/Trap-ExtraBold.otf +0 -0
  5. package/public/fonts/Trap-font/Trap-Light.otf +0 -0
  6. package/public/fonts/Trap-font/Trap-Medium.otf +0 -0
  7. package/public/fonts/Trap-font/Trap-Regular.otf +0 -0
  8. package/public/fonts/Trap-font/Trap-SemiBold.otf +0 -0
  9. package/public/fonts/buttersans-Rounded.otf +0 -0
  10. package/src/__tests__/desktop-connection-validate.test.ts +66 -0
  11. package/src/__tests__/knowledge/public/share-merge.test.ts +7 -1
  12. package/src/__tests__/security/xss-sanitize.test.ts +21 -0
  13. package/src/__tests__/setup.ts +5 -0
  14. package/src/__tests__/story-view.test.ts +24 -2
  15. package/src/components/agents/agent-bindings-tab.tsx +13 -7
  16. package/src/components/agents/agent-card.tsx +5 -10
  17. package/src/components/agents/agent-form-dialog.tsx +10 -3
  18. package/src/components/agents/agent-selector.tsx +6 -3
  19. package/src/components/agents/agents-page.tsx +5 -2
  20. package/src/components/agents/schemas/agent-form.ts +1 -1
  21. package/src/components/agents/skill-form-dialog.tsx +19 -5
  22. package/src/components/agents/use-agent-handlers.ts +3 -1
  23. package/src/components/ai/__tests__/ai-prompt-input-attach.test.tsx +0 -3
  24. package/src/components/ai/__tests__/web-search-card-url.test.tsx +87 -0
  25. package/src/components/ai/ai-chat-prompt.tsx +4 -13
  26. package/src/components/ai/ai-prompt-input/components/action-buttons.tsx +3 -18
  27. package/src/components/ai/ai-prompt-input/components/context-badge.tsx +1 -13
  28. package/src/components/ai/ai-prompt-input/components/kb-context-selector.tsx +15 -27
  29. package/src/components/ai/ai-prompt-input/components/model-select.tsx +21 -14
  30. package/src/components/ai/ai-prompt-input/constants.tsx +0 -18
  31. package/src/components/ai/ai-prompt-input/index.tsx +50 -113
  32. package/src/components/ai/ai-suggested-prompts.tsx +28 -15
  33. package/src/components/ai/global-harness-sidebar/index.tsx +42 -23
  34. package/src/components/ai/tool-cards/-shared.tsx +5 -1
  35. package/src/components/ai/tool-cards/fallback-tool-card.tsx +2 -2
  36. package/src/components/ai/tool-cards/knowledge-search-card.tsx +7 -53
  37. package/src/components/ai/tool-cards/web-search-card.tsx +29 -68
  38. package/src/components/anyhub/anyhub-app-card.tsx +53 -19
  39. package/src/components/anyhub/anyhub-app-runner.tsx +53 -20
  40. package/src/components/anyhub/anyhub-install-dialog.tsx +43 -15
  41. package/src/components/anyhub/anyhub-management-view.tsx +4 -3
  42. package/src/components/anyhub/anyhub-marketplace-view.tsx +16 -11
  43. package/src/components/anyhub/anyhub-permission-panel.tsx +50 -16
  44. package/src/components/anyhub/anyhub-top-nav.tsx +2 -2
  45. package/src/components/auth/auth-features.ts +32 -0
  46. package/src/components/auth/icon-input.tsx +3 -1
  47. package/src/components/auth/password-input.tsx +3 -2
  48. package/src/components/auth/session-guard.tsx +2 -1
  49. package/src/components/auth/sso-section.tsx +9 -4
  50. package/src/components/billing/__tests__/feature-label.test.ts +22 -0
  51. package/src/components/billing/billing-panel.tsx +8 -32
  52. package/src/components/billing/checkout-redirect.ts +3 -2
  53. package/src/components/billing/currency-toggle.tsx +62 -19
  54. package/src/components/billing/feature-gate.tsx +5 -0
  55. package/src/components/billing/feature-label.ts +51 -0
  56. package/src/components/billing/invoice-history.tsx +2 -2
  57. package/src/components/billing/login-prompt-dialog.tsx +5 -16
  58. package/src/components/billing/pricing-card.tsx +10 -11
  59. package/src/components/billing/pricing-page.tsx +26 -4
  60. package/src/components/billing/seats-manager.tsx +9 -2
  61. package/src/components/billing/subscription-card.tsx +5 -10
  62. package/src/components/billing/upgrade-prompt.tsx +2 -11
  63. package/src/components/billing/use-feature.ts +6 -1
  64. package/src/components/bug/__tests__/bug-display-dropdown.test.tsx +1 -1
  65. package/src/components/bug/__tests__/bug-list-loading-defer.test.tsx +1 -1
  66. package/src/components/bug/__tests__/saved-views.test.tsx +1 -1
  67. package/src/components/bug/__tests__/toolbar-shell.test.tsx +1 -1
  68. package/src/components/bug/__tests__/use-paged-bug-groups.test.tsx +1 -1
  69. package/src/components/bug/bug-list-view.tsx +31 -9
  70. package/src/components/bug/bug-panel-header.tsx +8 -3
  71. package/src/components/bug/bug-toolbar.tsx +1 -1
  72. package/src/components/bug/collect/collect-form.tsx +2 -0
  73. package/src/components/bug/create-bug-dialog.tsx +2 -1
  74. package/src/components/bug/detail/activity-tabs.tsx +12 -3
  75. package/src/components/bug/detail/bug-detail-body.tsx +2 -2
  76. package/src/components/bug/detail/comment-input.tsx +4 -2
  77. package/src/components/bug/detail/comment-item.tsx +5 -3
  78. package/src/components/bug/detail/comment-reactions.tsx +2 -1
  79. package/src/components/bug/detail/error-context.tsx +10 -0
  80. package/src/components/bug/detail/events-timeline.tsx +22 -6
  81. package/src/components/bug/detail/fix-timeline.tsx +20 -7
  82. package/src/components/bug/detail/props-section.tsx +2 -1
  83. package/src/components/bug/detail/repro-report-card.tsx +30 -9
  84. package/src/components/bug/detail/reproduce-steps-view.tsx +3 -2
  85. package/src/components/bug/display/constants.ts +1 -1
  86. package/src/components/bug/display/display-dropdown.tsx +1 -1
  87. package/src/components/bug/display/use-bug-display-options.ts +13 -7
  88. package/src/components/bug/display/use-paged-bug-groups.ts +16 -4
  89. package/src/components/bug/filters/field-configs.tsx +156 -174
  90. package/src/components/bug/inline-editors/assignee-editor.tsx +4 -1
  91. package/src/components/bug/inline-editors/date-editor.tsx +14 -5
  92. package/src/components/bug/inline-editors/severity-editor.tsx +14 -17
  93. package/src/components/bug/peek-panel.tsx +4 -1
  94. package/src/components/bug/select-bug-dialog.tsx +15 -1
  95. package/src/components/bug/settings/bug-settings-panel.tsx +24 -8
  96. package/src/components/bug/settings/collect-page-manager.tsx +10 -5
  97. package/src/components/bug/settings/webhook-manager.tsx +11 -0
  98. package/src/components/bug/story-bugs-panel.tsx +214 -227
  99. package/src/components/bug/views/board-view.tsx +2 -2
  100. package/src/components/bug/views/bug-list/group.tsx +1 -1
  101. package/src/components/bug/views/bug-list/index.tsx +1 -1
  102. package/src/components/bug/views/bug-list/inline-bug-creator.tsx +14 -10
  103. package/src/components/bug/views/bug-list/row.tsx +6 -3
  104. package/src/components/bug/views/view-types.ts +1 -1
  105. package/src/components/changelog/changelog-page.tsx +53 -38
  106. package/src/components/collab/__tests__/activity-attribution.test.tsx +25 -11
  107. package/src/components/collab/activity-attribution.tsx +27 -17
  108. package/src/components/command/command-palette.tsx +12 -4
  109. package/src/components/design/canvas/document/__tests__/ai.test.ts +71 -0
  110. package/src/components/design/canvas/document/__tests__/color-utils.test.ts +11 -0
  111. package/src/components/design/canvas/document/__tests__/frames.test.ts +13 -0
  112. package/src/components/design/canvas/document/__tests__/layer-order.test.ts +14 -1
  113. package/src/components/design/canvas/document/align.ts +1 -1
  114. package/src/components/design/canvas/document/constraints.ts +7 -1
  115. package/src/components/design/canvas/document/frames.ts +3 -2
  116. package/src/components/design/canvas/document/layer-order.ts +4 -0
  117. package/src/components/design/canvas/document/reconcile.ts +1 -5
  118. package/src/components/design/canvas/document/style/color-utils.ts +2 -2
  119. package/src/components/design/canvas/document/style/theme-color.ts +15 -0
  120. package/src/components/design/canvas/document/types.ts +6 -2
  121. package/src/components/design/canvas/panels/__tests__/color-paint-picker.test.tsx +77 -2
  122. package/src/components/design/canvas/panels/__tests__/number-drag-input.test.tsx +25 -0
  123. package/src/components/design/canvas/panels/__tests__/rows.test.tsx +1 -1
  124. package/src/components/design/canvas/panels/__tests__/toolbar.test.tsx +1 -2
  125. package/src/components/design/canvas/panels/component-library-data.ts +9 -1
  126. package/src/components/design/canvas/panels/controls/color-paint-picker.tsx +29 -14
  127. package/src/components/design/canvas/panels/controls/gradient-editor.tsx +34 -32
  128. package/src/components/design/canvas/panels/controls/number-drag-input.tsx +38 -53
  129. package/src/components/design/canvas/panels/controls/pattern-params.tsx +13 -2
  130. package/src/components/design/canvas/panels/controls/pointer-drag.ts +64 -0
  131. package/src/components/design/canvas/panels/controls/shader-picker-utils.ts +1 -1
  132. package/src/components/design/canvas/panels/controls/shader-picker.tsx +27 -4
  133. package/src/components/design/canvas/panels/controls/use-pointer-drag.ts +84 -0
  134. package/src/components/design/canvas/panels/frame-property-panel.tsx +60 -44
  135. package/src/components/design/canvas/panels/layer-panel.tsx +3 -18
  136. package/src/components/design/canvas/panels/paint-lists-panel.tsx +15 -6
  137. package/src/components/design/canvas/panels/panel-data.ts +1 -3
  138. package/src/components/design/canvas/panels/property-panel.tsx +19 -11
  139. package/src/components/design/canvas/panels/toolbar.tsx +4 -4
  140. package/src/components/design/canvas/panels/transform-layout-panel.tsx +14 -7
  141. package/src/components/design/canvas/plugins/geo/shift-by-world.ts +32 -0
  142. package/src/components/design/canvas/plugins/leafer-x-align/__tests__/align.test.ts +43 -0
  143. package/src/components/design/canvas/plugins/leafer-x-align/index.ts +23 -35
  144. package/src/components/design/canvas/plugins/leafer-x-clipboard/index.ts +5 -20
  145. package/src/components/design/canvas/plugins/leafer-x-history-lite/index.ts +17 -0
  146. package/src/components/design/canvas/react/__tests__/workbench.test.tsx +0 -2
  147. package/src/components/design/canvas/react/workbench.tsx +4 -7
  148. package/src/components/design/canvas/registry/__tests__/registry.test.ts +34 -6
  149. package/src/components/design/canvas/registry/builtin/button.ts +4 -2
  150. package/src/components/design/canvas/registry/builtin/card.ts +4 -2
  151. package/src/components/design/canvas/registry/builtin/default-labels.ts +22 -0
  152. package/src/components/design/canvas/registry/builtin/input.ts +4 -2
  153. package/src/components/design/canvas/registry/builtin/rect-shapes.ts +4 -2
  154. package/src/components/design/canvas/registry/builtin/text.ts +4 -2
  155. package/src/components/design/canvas/tools/__tests__/tools.test.ts +3 -3
  156. package/src/components/design/canvas/tools/frame-tool.ts +7 -2
  157. package/src/components/design/canvas/tools/pen-tool.ts +1 -4
  158. package/src/components/design/canvas/tools/polyline-tools.ts +1 -4
  159. package/src/components/design/canvas/tools/shape-tools.ts +7 -1
  160. package/src/components/design/canvas/tools/text-tool.ts +5 -3
  161. package/src/components/design/editor/annotation/annotation-node/annotation-node-view.tsx +62 -27
  162. package/src/components/design/editor/annotation/overlay/annotation-overlay.tsx +7 -5
  163. package/src/components/design/editor/collaboration/agent-input.tsx +28 -42
  164. package/src/components/design/editor/collaboration/design-agent-panel.tsx +97 -32
  165. package/src/components/design/editor/collaboration/design-comment-review-panel.tsx +77 -17
  166. package/src/components/design/editor/dashboard/create-design-dialog.tsx +13 -4
  167. package/src/components/design/editor/dashboard/design-dashboard.tsx +10 -14
  168. package/src/components/design/editor/dashboard/schemas/create-design.ts +1 -1
  169. package/src/components/design/editor/layout/__tests__/collab-param-wiring.test.tsx +7 -3
  170. package/src/components/design/editor/layout/design-doc-panel.tsx +21 -8
  171. package/src/components/design/editor/layout/design-editor-doc-utils.ts +9 -6
  172. package/src/components/design/editor/layout/design-editor-layout.tsx +1 -1
  173. package/src/components/design/editor/layout/design-left-sidebar.tsx +17 -10
  174. package/src/components/design/editor/layout/design-navigation.tsx +8 -1
  175. package/src/components/design/editor/layout/design-outline-tab.tsx +7 -4
  176. package/src/components/design/editor/layout/design-right-sidebar.tsx +31 -15
  177. package/src/components/design/editor/layout/hooks/use-design-auto-save.ts +12 -1
  178. package/src/components/design/editor/layout/hooks/use-design-page-load.ts +31 -6
  179. package/src/components/design/editor/pages/design-detail-page.tsx +2 -2
  180. package/src/components/design/editor/pages/share-design-page.tsx +3 -3
  181. package/src/components/design/editor/pages-tree/design-tree-page-tab.tsx +82 -46
  182. package/src/components/design/editor/pages-tree/design-tree-reducer.ts +3 -4
  183. package/src/components/design/editor/share/design-share-client.tsx +34 -42
  184. package/src/components/design/editor/share/design-share-panel/components/single-version-share-card.tsx +13 -14
  185. package/src/components/design/editor/share/design-share-panel/index.tsx +45 -46
  186. package/src/components/design/editor/share/design-share-panel/types.ts +30 -0
  187. package/src/components/design/editor/share/design-share-panel/utils.ts +28 -0
  188. package/src/components/design/editor/share/share-annotation-overlay.tsx +17 -4
  189. package/src/components/design/editor/share/share-comment-panel.tsx +11 -4
  190. package/src/components/design/editor/share/share-comment-review-panel.tsx +4 -2
  191. package/src/components/design/editor/share/share-directory-tree.tsx +14 -8
  192. package/src/components/design/editor/share/share-doc-view.tsx +16 -5
  193. package/src/components/design/editor/share/share-layout.tsx +47 -21
  194. package/src/components/design/editor/share/share-nav-bar.tsx +1 -2
  195. package/src/components/design/editor/share/share-password-gate.tsx +11 -5
  196. package/src/components/design/editor/share/share-review-panel.tsx +22 -4
  197. package/src/components/design/editor/share/share-sse-listener.tsx +6 -3
  198. package/src/components/design/editor/share/share-theme-toggle.tsx +6 -5
  199. package/src/components/design/editor/share/share-types.ts +38 -0
  200. package/src/components/design/editor/share/version-share-client.tsx +6 -4
  201. package/src/components/design/editor/versions/components/create-version-dialog.tsx +12 -3
  202. package/src/components/design/editor/versions/components/page-tree-selector.tsx +26 -10
  203. package/src/components/design/editor/versions/components/page-version-timeline.tsx +13 -9
  204. package/src/components/design/editor/versions/constants.tsx +3 -2
  205. package/src/components/design/editor/versions/hooks/use-design-versions.ts +21 -18
  206. package/src/components/design/editor/versions/hooks/use-page-tree-selection.ts +25 -6
  207. package/src/components/design/editor/versions/hooks/use-page-version-history.ts +51 -15
  208. package/src/components/design/editor/versions/lib/restore-version.ts +10 -14
  209. package/src/components/design/editor/versions/lib/semver.ts +25 -0
  210. package/src/components/design/editor/versions/page-version-panel.tsx +66 -51
  211. package/src/components/design/editor/versions/page-version-tree.tsx +30 -17
  212. package/src/components/error/global-error-boundary.tsx +12 -7
  213. package/src/components/forms/app-array-field.tsx +3 -1
  214. package/src/components/forms/app-combobox.tsx +41 -36
  215. package/src/components/forms/app-date-picker.tsx +25 -17
  216. package/src/components/forms/app-field-error.tsx +4 -1
  217. package/src/components/forms/app-field.tsx +15 -2
  218. package/src/components/forms/app-form-dialog.tsx +15 -3
  219. package/src/components/forms/app-submit.tsx +7 -10
  220. package/src/components/forms/hooks/use-form-submit.ts +2 -0
  221. package/src/components/forms/schemas/common.ts +2 -4
  222. package/src/components/harness/ai-chat-history/components/conversation-header.tsx +1 -0
  223. package/src/components/harness/ai-chat-history/components/conversation-item.tsx +24 -4
  224. package/src/components/harness/ai-chat-history/components/empty-state.tsx +1 -0
  225. package/src/components/harness/ai-chat-history/index.tsx +17 -7
  226. package/src/components/harness/ai-chat-history/utils/group-conversations.ts +11 -2
  227. package/src/components/harness/ai-citations/components/citation-item.tsx +4 -4
  228. package/src/components/harness/ai-citations/components/citations-list.tsx +5 -2
  229. package/src/components/harness/ai-citations/components/source-components.tsx +45 -16
  230. package/src/components/harness/ai-message/components/markdown-content.tsx +0 -1
  231. package/src/components/harness/ai-message/utils/__tests__/dom-utils.test.ts +38 -0
  232. package/src/components/harness/ai-message/utils/dom-utils.ts +7 -1
  233. package/src/components/harness/ai-thinking.tsx +8 -34
  234. package/src/components/harness/chat-ui.tsx +2 -1
  235. package/src/components/harness/code/changeset-panel.tsx +13 -4
  236. package/src/components/harness/code/code-workspace-sidebar.tsx +4 -6
  237. package/src/components/harness/code/file-tree.tsx +8 -10
  238. package/src/components/harness/code/preview-panel.tsx +2 -1
  239. package/src/components/harness/code/terminal-panel.tsx +19 -12
  240. package/src/components/harness/code/workspace-picker.tsx +4 -6
  241. package/src/components/harness/composer/attachments/attachment-policy.ts +4 -7
  242. package/src/components/harness/composer/attachments/attachment-tray.tsx +8 -4
  243. package/src/components/harness/composer/attachments/use-attachments.ts +42 -13
  244. package/src/components/harness/composer/composer-editor.tsx +9 -5
  245. package/src/components/harness/composer/context-meter.tsx +21 -12
  246. package/src/components/harness/composer/harness-composer.tsx +28 -6
  247. package/src/components/harness/composer/mention/mention-suggestion-menu.tsx +4 -2
  248. package/src/components/harness/composer/mention/use-mention-sources.ts +5 -4
  249. package/src/components/harness/composer/use-composer-submit.ts +2 -1
  250. package/src/components/harness/composer/use-drafts.ts +22 -2
  251. package/src/components/harness/dock/dock-panel-container.tsx +27 -10
  252. package/src/components/harness/dock/dock-registry.ts +7 -1
  253. package/src/components/harness/dock/resource-preview.tsx +74 -144
  254. package/src/components/{tiptap/notion-like/setup-error-message/index.tsx → harness/flatten-content.ts} +28 -2
  255. package/src/components/harness/gallery/gallery-card.tsx +4 -0
  256. package/src/components/harness/gallery/gallery-grid.tsx +15 -3
  257. package/src/components/harness/gallery/retranscribe-dialog.tsx +9 -8
  258. package/src/components/harness/harness-chat-slots.ts +41 -5
  259. package/src/components/harness/harness-layout.tsx +11 -0
  260. package/src/components/harness/harness-message.tsx +25 -6
  261. package/src/components/harness/harness-workbench-page.tsx +39 -7
  262. package/src/components/harness/image-lightbox.tsx +9 -3
  263. package/src/components/harness/plugin-mention-menu.tsx +5 -21
  264. package/src/components/harness/plugin-panel.tsx +27 -21
  265. package/src/components/harness/queue-bar.tsx +1 -19
  266. package/src/components/harness/queue-item.tsx +1 -25
  267. package/src/components/harness/transcript-width-handle.tsx +4 -24
  268. package/src/components/harness/turn-navigator.tsx +7 -4
  269. package/src/components/harness/use-column-resize.ts +64 -0
  270. package/src/components/harness/workbench/use-track-columns.ts +12 -3
  271. package/src/components/harness/workbench/workbench-shell.tsx +25 -44
  272. package/src/components/hextaui/ai-citations.tsx +39 -16
  273. package/src/components/hextaui/ai-file-upload.tsx +43 -20
  274. package/src/components/hextaui/ai-message.tsx +32 -13
  275. package/src/components/hextaui/ai-thinking.tsx +10 -115
  276. package/src/components/hextaui/command-menu.tsx +9 -2
  277. package/src/components/hotkeys/shortcuts-panel.tsx +4 -3
  278. package/src/components/iteration/auto-schedule-dialog.tsx +14 -8
  279. package/src/components/iteration/burndown-chart.tsx +1 -1
  280. package/src/components/iteration/create-iteration-dialog.tsx +2 -2
  281. package/src/components/iteration/iteration-card.tsx +3 -1
  282. package/src/components/iteration/iteration-editor.tsx +24 -10
  283. package/src/components/kibo-ui/contribution-graph/index.tsx +20 -4
  284. package/src/components/knowledge/dialog/knowledge-form-dialog.tsx +3 -2
  285. package/src/components/knowledge/doc-properties.tsx +9 -2
  286. package/src/components/knowledge/doc-type-meta.ts +47 -0
  287. package/src/components/knowledge/editor/knowledge-doc-editor.tsx +30 -58
  288. package/src/components/knowledge/editor/use-auto-save-channels.ts +93 -0
  289. package/src/components/knowledge/knowledge-homepage.tsx +11 -3
  290. package/src/components/knowledge/knowledge-tree-item.tsx +16 -28
  291. package/src/components/knowledge/knowledge-tree.tsx +18 -22
  292. package/src/components/knowledge/public/bookmark-card.tsx +10 -2
  293. package/src/components/knowledge/public/industry-options.ts +36 -0
  294. package/src/components/knowledge/public/legal-detail-actions.tsx +286 -0
  295. package/src/components/layout/sidebar-03/nav-main.tsx +2 -2
  296. package/src/components/magicui/__tests__/word-rotate.test.tsx +28 -0
  297. package/src/components/magicui/primitives/animate/slot.tsx +17 -9
  298. package/src/components/magicui/primitives/animate/tooltip.tsx +10 -0
  299. package/src/components/magicui/sparkles-text.tsx +17 -2
  300. package/src/components/magicui/word-rotate.tsx +7 -1
  301. package/src/components/react-bits/light-rays.jsx +8 -1
  302. package/src/components/settings/personal-team/account/account-client.tsx +1 -1
  303. package/src/components/settings/personal-team/account/avatar/notion-avatar-editor.tsx +1 -1
  304. package/src/components/settings/personal-team/account/settings-profile.tsx +1 -1
  305. package/src/components/share/public-doc-share-page.tsx +122 -0
  306. package/src/components/shared-kit/list-kit/display/__tests__/dropdown.test.tsx +1 -1
  307. package/src/components/shared-kit/list-kit/display/dropdown.tsx +1 -1
  308. package/src/components/shared-kit/list-kit/kanban/manual-order.ts +1 -1
  309. package/src/components/{testcase/views → shared-kit/list-kit}/move.ts +3 -2
  310. package/src/components/shared-kit/timezone/timezone-bootstrap.tsx +0 -1
  311. package/src/components/story/detail/story-detail-toolbar/associated-attachments-panel.tsx +10 -10
  312. package/src/components/story/display/types.ts +2 -2
  313. package/src/components/story/filters/filter-check-popover.tsx +104 -0
  314. package/src/components/story/inline-editors/state-editor.tsx +19 -17
  315. package/src/components/story/inline-editors/story-select-dialog.tsx +113 -134
  316. package/src/components/story/peek-panel.tsx +20 -12
  317. package/src/components/story/relations/attachment-manage-dialog.tsx +31 -19
  318. package/src/components/story/relations/design-select-dialog.tsx +28 -40
  319. package/src/components/story/relations/file-preview.tsx +8 -6
  320. package/src/components/story/relations/format.ts +70 -14
  321. package/src/components/story/relations/knowledge-select-dialog.tsx +41 -39
  322. package/src/components/story/relations/link-manage-dialog.tsx +25 -6
  323. package/src/components/story/relations/story-ref-row.tsx +4 -5
  324. package/src/components/story/relations/use-linked-selection.ts +72 -0
  325. package/src/components/story/search-popover.tsx +20 -5
  326. package/src/components/story/story-list-view.tsx +69 -28
  327. package/src/components/story/story-panel-header.tsx +9 -3
  328. package/src/components/story/story-toolbar.tsx +30 -11
  329. package/src/components/story/transfer-story-popover.tsx +17 -10
  330. package/src/components/story/types.ts +4 -1
  331. package/src/components/story/views/calendar-view.tsx +96 -99
  332. package/src/components/story/views/create-view-dialog.tsx +10 -6
  333. package/src/components/story/views/story-list/__tests__/move.test.ts +1 -1
  334. package/src/components/story/views/story-list/batch-preview-dialog.tsx +77 -117
  335. package/src/components/story/views/story-list/group.tsx +27 -23
  336. package/src/components/story/views/story-list/index.tsx +84 -52
  337. package/src/components/story/views/story-list/inline-story-creator.tsx +10 -2
  338. package/src/components/story/views/story-list/row.tsx +1 -2
  339. package/src/components/story/views/story-list/use-flat-rows.ts +10 -12
  340. package/src/components/story/views/timeline-view.tsx +11 -15
  341. package/src/components/story/views/view-list-section.tsx +59 -37
  342. package/src/components/testcase/__tests__/manual-move.test.ts +1 -1
  343. package/src/components/testcase/__tests__/step-stream.test.tsx +30 -0
  344. package/src/components/testcase/list-view.tsx +1 -1
  345. package/src/components/testcase/runs/run-matrix.tsx +36 -8
  346. package/src/components/testcase/runs/step-stream.tsx +24 -8
  347. package/src/components/testcase/testcase-toolbar.tsx +6 -2
  348. package/src/components/testcase/views/board-view.tsx +25 -9
  349. package/src/components/testcase/views/create-view-dialog.tsx +3 -1
  350. package/src/components/testcase/views/view-selector-button.tsx +33 -19
  351. package/src/components/tiptap/__tests__/audit-fixes.test.ts +147 -0
  352. package/src/components/tiptap/extensions/ai-extension.ts +110 -25
  353. package/src/components/tiptap/extensions/ai-suggestion-mark.ts +6 -2
  354. package/src/components/tiptap/extensions/local-file/local-file-node.ts +19 -15
  355. package/src/components/tiptap/extensions/node-background-extension.ts +21 -3
  356. package/src/components/tiptap/lib/advanced-utils.ts +6 -8
  357. package/src/components/tiptap/lib/collab-utils.ts +27 -23
  358. package/src/components/tiptap/lib/doc-group.ts +62 -0
  359. package/src/components/tiptap/lib/utils/platform.ts +10 -9
  360. package/src/components/tiptap/lib/utils/selection.ts +3 -3
  361. package/src/components/tiptap/lib/utils/url.ts +25 -11
  362. package/src/components/tiptap/mindmap/lib/menu-actions.ts +14 -2
  363. package/src/components/tiptap/mindmap/mind-map.tsx +42 -10
  364. package/src/components/tiptap/node/doc-card-node-view.tsx +35 -15
  365. package/src/components/tiptap/node/image-node/image-node-extension.ts +27 -8
  366. package/src/components/tiptap/node/image-node/image-node-view.tsx +7 -2
  367. package/src/components/tiptap/node/image-upload-node/image-upload-node.tsx +25 -20
  368. package/src/components/tiptap/node/mention-extension.ts +3 -9
  369. package/src/components/tiptap/node/table-node/extensions/table-handle/table-handle-plugin.ts +61 -40
  370. package/src/components/tiptap/node/table-node/extensions/table-node-extension.ts +7 -6
  371. package/src/components/tiptap/node/table-node/lib/table-dom.ts +4 -0
  372. package/src/components/tiptap/node/table-node/ui/table-handle/table-handle.tsx +2 -2
  373. package/src/components/tiptap/node/table-node/ui/table-handle-menu/table-handle-menu.tsx +4 -3
  374. package/src/components/tiptap/node/table-node/ui/table-selection-overlay/table-selection-overlay.tsx +16 -1
  375. package/src/components/tiptap/node/table-node/ui/table-sort-row-column-button/use-table-sort-row-column.ts +3 -7
  376. package/src/components/tiptap/node/toc-node/toc-node.tsx +4 -2
  377. package/src/components/tiptap/notion-like/editor-extensions.ts +11 -2
  378. package/src/components/tiptap/notion-like/notion-like-editor-header.tsx +2 -10
  379. package/src/components/tiptap/notion-like/notion-like-editor-toolbar-floating.tsx +9 -23
  380. package/src/components/tiptap/notion-like/notion-like-editor.tsx +66 -63
  381. package/src/components/tiptap/ui/ai-menu/ai-menu-hooks.ts +12 -0
  382. package/src/components/tiptap/ui/ai-menu/ai-menu-items/ai-menu-items.tsx +51 -129
  383. package/src/components/tiptap/ui/ai-menu/ai-menu-utils.ts +1 -1
  384. package/src/components/tiptap/ui/ai-menu/ai-menu.tsx +50 -30
  385. package/src/components/tiptap/ui/copy-anchor-link-button/use-scroll-to-hash.ts +6 -3
  386. package/src/components/tiptap/ui/doc-reference-floating/doc-reference-floating.tsx +4 -11
  387. package/src/components/tiptap/ui/drag-context-menu/drag-context-menu.tsx +11 -12
  388. package/src/components/tiptap/ui/image-download-button/use-image-download.ts +2 -1
  389. package/src/components/tiptap/ui/improve-dropdown/use-improve-dropdown.ts +15 -23
  390. package/src/components/tiptap/ui/link-popover/link-popover.tsx +19 -23
  391. package/src/components/tiptap/ui/link-popover/use-link-popover.ts +12 -2
  392. package/src/components/tiptap/ui/slash-dropdown-menu/use-slash-dropdown-menu.ts +9 -0
  393. package/src/components/workspace/dialogs/create-workspace-dialog.tsx +20 -13
  394. package/src/components/workspace/dialogs/delete-workspace-options.tsx +0 -3
  395. package/src/components/workspace/dialogs/edit-workspace-dialog.tsx +20 -13
  396. package/src/components/workspace/header/workspace-header.tsx +1 -1
  397. package/src/components/workspace/kb/workspace-kb-card.tsx +12 -4
  398. package/src/components/workspace/kb/workspace-kb-manage-dialog.tsx +8 -1
  399. package/src/components/workspace/kb/workspace-quick-doc-dialog.tsx +24 -7
  400. package/src/components/workspace/members/workspace-member-item.tsx +8 -12
  401. package/src/components/workspace/members/workspace-members-manager.tsx +38 -25
  402. package/src/components/workspace/projects/workspace-project-list.tsx +47 -63
  403. package/src/components/workspace/schemas/create-workspace.ts +14 -5
  404. package/src/config/sidebar-routes.tsx +2 -10
  405. package/src/design-engine/ai/ai.ts +75 -5
  406. package/src/design-engine/ai/server-registry.ts +8 -0
  407. package/src/design-engine/document/serialize-leafer-json.ts +17 -7
  408. package/src/design-engine/document/serialize-sanitize.ts +21 -3
  409. package/src/design-engine/engine/__tests__/app-commands.test.ts +156 -0
  410. package/src/design-engine/engine/__tests__/path-anchors.test.ts +43 -0
  411. package/src/design-engine/engine/app.ts +1 -0
  412. package/src/design-engine/engine/boolean-ops.ts +28 -8
  413. package/src/design-engine/engine/engine-actions.ts +13 -3
  414. package/src/design-engine/engine/engine-decor.ts +42 -21
  415. package/src/design-engine/engine/engine-doc.ts +21 -5
  416. package/src/design-engine/engine/engine-path.ts +29 -25
  417. package/src/design-engine/engine/export-node.ts +26 -4
  418. package/src/design-engine/engine/path-anchors.ts +88 -25
  419. package/src/devframe-docks/session-iframe.tsx +4 -0
  420. package/src/hooks/__tests__/use-entity-subscription.test.ts +39 -1
  421. package/src/hooks/use-entity-subscription.ts +36 -5
  422. package/src/hooks/use-load-more.ts +16 -6
  423. package/src/hooks/use-notifications.ts +6 -3
  424. package/src/hooks/use-paged-groups.ts +3 -2
  425. package/src/hooks/use-popover-outside-close.ts +46 -0
  426. package/src/hooks/use-scrolling.ts +18 -10
  427. package/src/hooks/use-translator.ts +45 -28
  428. package/src/lib/__tests__/ai-adapter.test.ts +40 -39
  429. package/src/lib/__tests__/annotation-prompt.test.ts +6 -2
  430. package/src/lib/__tests__/datetime.test.ts +6 -0
  431. package/src/lib/__tests__/github.test.ts +87 -0
  432. package/src/lib/__tests__/login-redirect.test.ts +80 -0
  433. package/src/lib/__tests__/project-display-id.test.ts +5 -4
  434. package/src/lib/__tests__/safe-url.test.ts +84 -0
  435. package/src/lib/__tests__/sse-transport.test.ts +20 -2
  436. package/src/lib/agents/skill-errors.ts +12 -0
  437. package/src/lib/ai/__tests__/story-jsonl.test.ts +15 -3
  438. package/src/lib/ai/chat-handoff.ts +63 -45
  439. package/src/lib/ai/default-model.ts +9 -0
  440. package/src/lib/ai/story-jsonl.ts +39 -6
  441. package/src/lib/ai/use-knowledge-bases.ts +20 -13
  442. package/src/lib/ai/use-selected-model.ts +72 -22
  443. package/src/lib/anyhub/anyhub-message-bridge.ts +83 -30
  444. package/src/lib/anyhub/anyhub-store.ts +11 -6
  445. package/src/lib/{pgvector.ts → anyhub/base-dir.ts} +10 -4
  446. package/src/lib/anyhub/capabilities.ts +34 -15
  447. package/src/lib/anyhub/local-path.ts +1 -1
  448. package/src/lib/anyhub/permissions.ts +18 -6
  449. package/src/lib/anyhub/proxy.ts +26 -4
  450. package/src/lib/anyhub/types.ts +3 -6
  451. package/src/lib/app-version.ts +8 -1
  452. package/src/lib/auth/__tests__/auth-config-profile-cache.test.ts +32 -4
  453. package/src/lib/auth/auth.config.ts +219 -94
  454. package/src/lib/auth/sso-authorize.ts +12 -3
  455. package/src/lib/auth/submit-credentials.ts +60 -0
  456. package/src/lib/changelog/sdk-versions.ts +8 -6
  457. package/src/lib/collab/__tests__/presence-store.test.ts +9 -0
  458. package/src/lib/collab/bindings/__tests__/canvas-tree-perf.test.ts +6 -2
  459. package/src/lib/collab/bindings/canvas-local.ts +22 -25
  460. package/src/lib/collab/bindings/canvas-presence.ts +11 -26
  461. package/src/lib/collab/bindings/canvas-remote.ts +9 -18
  462. package/src/lib/collab/bindings/steps.ts +6 -2
  463. package/src/lib/collab/module-map.ts +2 -1
  464. package/src/lib/collab/provider.ts +9 -6
  465. package/src/lib/collab/throttle-core.ts +87 -0
  466. package/src/lib/collab/use-collab-doc.ts +5 -0
  467. package/src/lib/collab/use-presence-report.ts +11 -4
  468. package/src/lib/collab/use-self-profile-broadcast.ts +13 -0
  469. package/src/lib/collab/use-share-presence.ts +14 -14
  470. package/src/lib/collections/reference/users-brief-collection.ts +5 -2
  471. package/src/lib/commands/registry.ts +3 -1
  472. package/src/lib/comment-utils.ts +8 -6
  473. package/src/lib/crypto/api-key-cipher.ts +5 -0
  474. package/src/lib/datetime.ts +17 -7
  475. package/src/lib/deploy-region.ts +12 -3
  476. package/src/lib/design-tree-utils.ts +30 -0
  477. package/src/lib/form/standard-schema-validator.ts +44 -0
  478. package/src/lib/fsap.ts +16 -8
  479. package/src/lib/github.ts +33 -59
  480. package/src/lib/hooks/use-story-panel-open.ts +79 -14
  481. package/src/lib/hotkeys/registry.ts +35 -26
  482. package/src/lib/hotkeys/types.ts +4 -2
  483. package/src/{server/serverFns/iteration/__tests__/burndown-core.test.ts → lib/iteration/__tests__/burndown.test.ts} +1 -1
  484. package/src/{server/serverFns/iteration/burndown-core.ts → lib/iteration/burndown.ts} +5 -0
  485. package/src/lib/knowledge/share-result-message.ts +26 -0
  486. package/src/lib/layout.shared.tsx +14 -2
  487. package/src/lib/login-redirect.ts +65 -0
  488. package/src/lib/optimistic/use-optimistic-mutation.ts +14 -3
  489. package/src/lib/outline-utils.ts +7 -0
  490. package/src/lib/plugin-runtime/bridge.ts +53 -7
  491. package/src/lib/plugin-runtime/plugin-client-tools.ts +37 -14
  492. package/src/lib/plugin-runtime/plugin-client.ts +45 -28
  493. package/src/lib/plugin-runtime/worker-realm-source.ts +51 -15
  494. package/src/lib/project-display-id.ts +7 -3
  495. package/src/lib/project-module-meta.ts +34 -11
  496. package/src/lib/query-client-seam.test.ts +6 -4
  497. package/src/lib/query-client-seam.ts +8 -0
  498. package/src/lib/redis.ts +14 -2
  499. package/src/lib/restore-version.ts +3 -0
  500. package/src/lib/router-context.ts +3 -0
  501. package/src/lib/safe-url.ts +91 -0
  502. package/src/lib/sanitize.ts +35 -2
  503. package/src/lib/share-events.ts +18 -2
  504. package/src/lib/sse-transport.ts +14 -6
  505. package/src/lib/story/description-diff.ts +12 -11
  506. package/src/lib/story/video-embed.ts +7 -2
  507. package/src/lib/tiptap/__tests__/link-policy.test.ts +35 -0
  508. package/src/lib/tiptap/link-policy.ts +25 -0
  509. package/src/lib/vector-store/allowlist.ts +33 -0
  510. package/src/lib/vector-store/pg-vector-store.ts +13 -6
  511. package/src/lib/vector-store/sqlite-vec-store.ts +87 -42
  512. package/src/providers/index.tsx +16 -1
  513. package/src/providers/theme-mode-provider.tsx +3 -2
  514. package/src/routes/-tests/attachments-content.test.ts +125 -0
  515. package/src/routes/__desktop/onboarding/route.lazy.tsx +45 -15
  516. package/src/routes/__root.tsx +8 -6
  517. package/src/routes/_login/changelog/confirm/route.tsx +2 -1
  518. package/src/routes/_login/email-unsubscribe/route.tsx +2 -1
  519. package/src/routes/_login/forgot-password/route.lazy.tsx +4 -8
  520. package/src/routes/_login/login/route.lazy.tsx +17 -73
  521. package/src/routes/_login/login/route.tsx +4 -3
  522. package/src/routes/_login/register/route.lazy.tsx +5 -9
  523. package/src/routes/_login/reset-password/route.lazy.tsx +4 -8
  524. package/src/routes/_login/schemas/-auth.ts +21 -0
  525. package/src/routes/_login/verify-email/route.lazy.tsx +33 -3
  526. package/src/routes/_login/verify-email/route.tsx +2 -1
  527. package/src/routes/_nav/-components/nav-not-found.tsx +19 -13
  528. package/src/routes/_nav/apps/anyhub/$id/route.lazy.tsx +1 -0
  529. package/src/routes/_nav/apps/anyhub/route.tsx +5 -3
  530. package/src/routes/_nav/bugs/$bugId/route.lazy.tsx +4 -4
  531. package/src/routes/_nav/bugs/$bugId/route.tsx +1 -1
  532. package/src/routes/_nav/changelog/route.tsx +5 -4
  533. package/src/routes/_nav/dashboard/-components/avatar-group.tsx +9 -5
  534. package/src/routes/_nav/dashboard/route.lazy.tsx +6 -18
  535. package/src/routes/_nav/dashboard/route.tsx +3 -1
  536. package/src/routes/_nav/design/canvas/$id/route.tsx +2 -1
  537. package/src/routes/_nav/harness/$threadId.lazy.tsx +3 -0
  538. package/src/routes/_nav/knowledge/$kbId/doc/$docId/route.lazy.tsx +3 -0
  539. package/src/routes/_nav/knowledge/$kbId/index.tsx +4 -1
  540. package/src/routes/_nav/knowledge/$kbId/route.lazy.tsx +44 -41
  541. package/src/routes/_nav/knowledge/$kbId/route.tsx +6 -2
  542. package/src/routes/_nav/knowledge/bookmarks/$id.lazy.tsx +15 -2
  543. package/src/routes/_nav/knowledge/bookmarks/index.lazy.tsx +9 -4
  544. package/src/routes/_nav/knowledge/compliance/$id.lazy.tsx +59 -148
  545. package/src/routes/_nav/knowledge/compliance/index.lazy.tsx +15 -21
  546. package/src/routes/_nav/knowledge/dictionaries/$id.lazy.tsx +45 -13
  547. package/src/routes/_nav/knowledge/dictionaries/index.lazy.tsx +6 -17
  548. package/src/routes/_nav/knowledge/index.lazy.tsx +14 -7
  549. package/src/routes/_nav/knowledge/laws/$id.lazy.tsx +59 -149
  550. package/src/routes/_nav/knowledge/laws/index.lazy.tsx +14 -6
  551. package/src/routes/_nav/knowledge/summary/index.lazy.tsx +23 -13
  552. package/src/routes/_nav/notifications/route.tsx +2 -1
  553. package/src/routes/_nav/notion-like/route.tsx +1 -1
  554. package/src/routes/_nav/pricing-02/route.tsx +1 -1
  555. package/src/routes/_nav/projects/$projectId/$storyId/route.lazy.tsx +2 -1
  556. package/src/routes/_nav/projects/$projectId/index.lazy.tsx +1 -1
  557. package/src/routes/_nav/projects/$projectId/iterations/$iterationId/route.lazy.tsx +55 -30
  558. package/src/routes/_nav/projects/$projectId/iterations/$iterationId/route.tsx +5 -2
  559. package/src/routes/_nav/projects/$projectId/settings/route.lazy.tsx +17 -9
  560. package/src/routes/_nav/route.lazy.tsx +2 -0
  561. package/src/routes/_nav/settings/-settings-tabs.tsx +7 -3
  562. package/src/routes/_nav/settings/account/route.lazy.tsx +11 -2
  563. package/src/routes/_nav/settings/account/route.tsx +17 -10
  564. package/src/routes/_nav/settings/ai/hosted/route.lazy.tsx +10 -3
  565. package/src/routes/_nav/settings/ai/hosted/route.tsx +3 -3
  566. package/src/routes/_nav/settings/ai/index/route.lazy.tsx +2 -1
  567. package/src/routes/_nav/settings/ai/providers/$providerId/route.lazy.tsx +5 -5
  568. package/src/routes/_nav/settings/ai/providers/$providerId/route.tsx +5 -2
  569. package/src/routes/_nav/settings/ai/route.tsx +7 -5
  570. package/src/routes/_nav/settings/billing/route.lazy.tsx +16 -3
  571. package/src/routes/_nav/settings/billing/route.tsx +6 -3
  572. package/src/routes/_nav/settings/privacy/route.lazy.tsx +6 -4
  573. package/src/routes/_nav/settings/route.tsx +0 -5
  574. package/src/routes/_nav/settings/team/route.lazy.tsx +11 -2
  575. package/src/routes/_nav/settings/team/route.tsx +13 -7
  576. package/src/routes/_nav/stories/$storyId/route.lazy.tsx +2 -1
  577. package/src/routes/_nav/stories/$storyId/route.tsx +5 -1
  578. package/src/routes/_nav/tasks/-components/ai-task-detail.tsx +2 -8
  579. package/src/routes/_nav/tasks/-components/ai-task-list.tsx +3 -9
  580. package/src/routes/_nav/tasks/-components/source-ai-exec-dialog.tsx +2 -8
  581. package/src/routes/_nav/tasks/-components/task-constants.ts +15 -0
  582. package/src/routes/_nav/test-cases/runs/$runId/route.lazy.tsx +2 -1
  583. package/src/routes/_nav/workspaces/$workspaceId/activities/route.lazy.tsx +3 -17
  584. package/src/routes/_nav/workspaces/$workspaceId/route.lazy.tsx +17 -44
  585. package/src/routes/_nav/workspaces/$workspaceId/route.tsx +0 -1
  586. package/src/routes/_nav/workspaces/$workspaceId/settings/route.lazy.tsx +7 -17
  587. package/src/routes/_nav/workspaces/index.lazy.tsx +16 -16
  588. package/src/routes/_public/pricing/route.tsx +5 -3
  589. package/src/routes/api/attachments/$id/content.ts +55 -11
  590. package/src/routes/api/attachments/upload.ts +72 -38
  591. package/src/routes/api/auth/desktop-callback.ts +46 -10
  592. package/src/routes/api/billing-webhook.ts +8 -4
  593. package/src/routes/api/blob/$id.ts +6 -1
  594. package/src/routes/api/cron/changelog-release.ts +6 -2
  595. package/src/routes/api/cron/subscription-reminders.ts +21 -14
  596. package/src/routes/api/design/prototype/route.ts +7 -4
  597. package/src/routes/api/license/activate/route.ts +24 -1
  598. package/src/routes/api/license/heartbeat/route.ts +14 -1
  599. package/src/routes/api/notifications/stream.ts +22 -15
  600. package/src/routes/api/share/design/$designId/events.ts +13 -0
  601. package/src/routes/api/story-ai.ts +11 -0
  602. package/src/routes/api/test-runs/$runId/events.ts +11 -7
  603. package/src/routes/design-files/$projectId/$artboardId/$filename.ts +22 -3
  604. package/src/routes/invite/$token/route.lazy.tsx +8 -7
  605. package/src/routes/server/ai-stream.ts +6 -0
  606. package/src/routes/server/ws.ts +11 -2
  607. package/src/routes/share/$versionId/route.lazy.tsx +3 -7
  608. package/src/routes/share/compliance/$id/route.lazy.tsx +13 -64
  609. package/src/routes/share/compliance/$id/route.tsx +6 -1
  610. package/src/routes/share/law/$id/route.lazy.tsx +13 -64
  611. package/src/routes/share/law/$id/route.tsx +6 -1
  612. package/src/server/__tests__/agent-crud.test.ts +8 -0
  613. package/src/server/__tests__/chat-conversations.test.ts +1 -0
  614. package/src/server/__tests__/fetch-guard.test.ts +67 -0
  615. package/src/{lib → server}/__tests__/rag.test.ts +1 -1
  616. package/src/server/__tests__/resources.license.test.ts +3 -2
  617. package/src/server/__tests__/resources.test.ts +29 -4
  618. package/src/server/__tests__/share-version.test.ts +64 -12
  619. package/src/server/__tests__/skill-crud.test.ts +9 -2
  620. package/src/server/__tests__/sso-domain.test.ts +1 -1
  621. package/src/server/__tests__/sso-tokens.test.ts +23 -3
  622. package/src/server/ai-gateway/__tests__/agent-runtime.test.ts +14 -11
  623. package/src/server/ai-gateway/__tests__/chat-handler-prompt-key.test.ts +1 -1
  624. package/src/server/ai-gateway/__tests__/chat-stream-builder-code-mode.test.ts +1 -1
  625. package/src/server/ai-gateway/__tests__/chat-stream-builder-memory.test.ts +1 -1
  626. package/src/server/ai-gateway/__tests__/chat-stream-builder-sandbox.test.ts +30 -6
  627. package/src/server/ai-gateway/__tests__/chat-stream-builder-skills.test.ts +1 -1
  628. package/src/server/ai-gateway/__tests__/code-mode-stack.test.ts +59 -8
  629. package/src/server/ai-gateway/__tests__/consume-attachments.test.ts +1 -1
  630. package/src/server/ai-gateway/__tests__/create-pr.test.ts +169 -0
  631. package/src/server/ai-gateway/__tests__/delegate-task.test.ts +121 -0
  632. package/src/server/ai-gateway/__tests__/embedding-request.test.ts +17 -1
  633. package/src/server/ai-gateway/__tests__/embedding.test.ts +23 -0
  634. package/src/server/ai-gateway/__tests__/interrupt-store.test.ts +98 -85
  635. package/src/server/ai-gateway/__tests__/knowledge-search-fence.test.ts +2 -2
  636. package/src/server/ai-gateway/__tests__/message-store.test.ts +53 -0
  637. package/src/server/ai-gateway/__tests__/pgvector-memory-adapter.test.ts +40 -39
  638. package/src/server/ai-gateway/__tests__/prompt-vars-contract.test.ts +1 -1
  639. package/src/server/ai-gateway/__tests__/provider-adapter.test.ts +56 -0
  640. package/src/server/ai-gateway/__tests__/run-store.test.ts +51 -15
  641. package/src/server/ai-gateway/__tests__/skills-resource-tool.test.ts +56 -0
  642. package/src/server/ai-gateway/__tests__/todo-plan-tools.test.ts +17 -4
  643. package/src/server/ai-gateway/__tests__/tool-error-sanitize.test.ts +119 -0
  644. package/src/server/ai-gateway/__tests__/tools-authorization.test.ts +211 -0
  645. package/src/server/ai-gateway/adapter.ts +35 -9
  646. package/src/server/ai-gateway/chat-handler.ts +81 -46
  647. package/src/server/ai-gateway/chat-stream-builder.ts +37 -4
  648. package/src/server/ai-gateway/code-mode/index.ts +11 -7
  649. package/src/server/ai-gateway/code-mode/sandbox.ts +59 -17
  650. package/src/server/ai-gateway/code-mode/vm-driver.ts +15 -16
  651. package/src/server/ai-gateway/durability/pg-stream.ts +10 -9
  652. package/src/server/ai-gateway/durability/reaper-driver.ts +3 -0
  653. package/src/server/ai-gateway/embedding.ts +22 -2
  654. package/src/server/ai-gateway/label-suggest.ts +14 -3
  655. package/src/server/ai-gateway/log-redact.ts +61 -0
  656. package/src/server/ai-gateway/media/adapters.ts +19 -0
  657. package/src/server/ai-gateway/media/index.ts +19 -0
  658. package/src/server/ai-gateway/media/recorder.ts +3 -1
  659. package/src/server/ai-gateway/memory/pgvector-adapter.ts +12 -24
  660. package/src/server/ai-gateway/middlewares/logger.ts +4 -1
  661. package/src/server/ai-gateway/middlewares/plan-approval.ts +33 -14
  662. package/src/server/ai-gateway/middlewares/rate-limit.ts +15 -0
  663. package/src/server/ai-gateway/middlewares/usage-log.ts +17 -1
  664. package/src/server/ai-gateway/model-fetch.ts +3 -0
  665. package/src/server/ai-gateway/persistence/interrupt-store.ts +42 -32
  666. package/src/server/ai-gateway/persistence/message-store.ts +30 -10
  667. package/src/server/ai-gateway/persistence/metadata-store.ts +13 -2
  668. package/src/server/ai-gateway/persistence/run-store.ts +25 -3
  669. package/src/server/ai-gateway/prompts/index.ts +1 -1
  670. package/src/server/ai-gateway/prompts/registry.ts +24 -2
  671. package/src/server/ai-gateway/prompts/seed.ts +22 -12
  672. package/src/server/ai-gateway/provider-router.ts +32 -32
  673. package/src/server/ai-gateway/rerank.ts +20 -1
  674. package/src/server/ai-gateway/runs/agent-runtime.ts +17 -50
  675. package/src/server/ai-gateway/runs/resolve-overrides.ts +10 -26
  676. package/src/server/ai-gateway/runs/user-agent.ts +75 -0
  677. package/src/server/ai-gateway/sandbox/__tests__/harness-sandbox.test.ts +136 -0
  678. package/src/server/ai-gateway/sandbox/__tests__/local-process.test.ts +144 -1
  679. package/src/server/ai-gateway/sandbox/__tests__/policy.test.ts +47 -0
  680. package/src/server/ai-gateway/sandbox/browser-policy.ts +45 -9
  681. package/src/server/ai-gateway/sandbox/harness-sandbox.ts +76 -10
  682. package/src/server/ai-gateway/sandbox/local-process.ts +212 -21
  683. package/src/server/ai-gateway/sandbox/policy.ts +39 -7
  684. package/src/server/ai-gateway/skills/builtin-source.ts +10 -0
  685. package/src/server/ai-gateway/skills/index.ts +6 -4
  686. package/src/server/ai-gateway/source-mode.ts +8 -2
  687. package/src/server/ai-gateway/storage/__tests__/blob-store.test.ts +17 -0
  688. package/src/server/ai-gateway/storage/db-blob-store.ts +16 -1
  689. package/src/server/ai-gateway/story-handler.ts +2 -1
  690. package/src/server/ai-gateway/story-prompt.ts +3 -1
  691. package/src/server/ai-gateway/tools/create-pr.ts +92 -55
  692. package/src/server/ai-gateway/tools/definitions.ts +2 -2
  693. package/src/server/ai-gateway/tools/delegate-task.ts +38 -18
  694. package/src/server/ai-gateway/tools/delete-project.ts +7 -1
  695. package/src/server/ai-gateway/tools/plan-submit.ts +12 -8
  696. package/src/server/ai-gateway/tools/plugin-lifecycle-server.ts +24 -3
  697. package/src/server/ai-gateway/tools/plugin-tools.ts +15 -4
  698. package/src/server/ai-gateway/tools/select.ts +8 -4
  699. package/src/server/ai-gateway/tools/server.ts +91 -19
  700. package/src/server/ai-gateway/tools/todo-write.ts +4 -3
  701. package/src/server/ai-gateway/tools/tool-errors.ts +38 -0
  702. package/src/server/ai-gateway/unified-router.ts +64 -54
  703. package/src/server/ai-ports.ts +22 -3
  704. package/src/server/ai-task/executor.ts +49 -27
  705. package/src/server/audit.ts +5 -2
  706. package/src/server/auth-helpers.ts +37 -4
  707. package/src/server/billing-email.ts +9 -1
  708. package/src/server/bug/bug-permissions.ts +15 -8
  709. package/src/server/bug-collect/collect-handler.ts +65 -51
  710. package/src/server/bug-report/report-handler.ts +131 -125
  711. package/src/server/bug-report/repro-runner.ts +5 -15
  712. package/src/server/bug-report/webhook-out.ts +13 -1
  713. package/src/server/bug-screenshot/screenshot-handler.ts +7 -3
  714. package/src/server/builtin-project.ts +43 -18
  715. package/src/server/collab/reindex-endpoint.ts +20 -0
  716. package/src/server/collab/seed.ts +20 -4
  717. package/src/server/collab/write-guard.ts +5 -0
  718. package/src/server/csv.ts +6 -3
  719. package/src/server/design/__tests__/share-access.test.ts +128 -0
  720. package/src/server/design/access.ts +136 -0
  721. package/src/server/design/annotation-prompt.ts +7 -1
  722. package/src/server/design/share-access.ts +109 -0
  723. package/src/server/design/share-generate.ts +42 -0
  724. package/src/server/desktop-guest.ts +3 -2
  725. package/src/server/email/deliverability.ts +9 -1
  726. package/src/server/email/drivers/resend.ts +8 -1
  727. package/src/server/email/drivers/smtp.ts +32 -18
  728. package/src/server/email/templates/product/changelog-release.tsx +1 -1
  729. package/src/server/email/templates/team/invite.tsx +1 -1
  730. package/src/server/entitlements-token.ts +8 -1
  731. package/src/server/entitlements.ts +7 -2
  732. package/src/server/fetch-guard.ts +67 -0
  733. package/src/server/iteration/auto-schedule-internal.ts +19 -8
  734. package/src/server/iteration/permissions.ts +40 -0
  735. package/src/server/iteration/transfer-internal.ts +19 -12
  736. package/src/server/keepalive/middleware.ts +12 -2
  737. package/src/server/knowledge/kb-doc-search.ts +20 -3
  738. package/src/server/knowledge/knowledge-index-utils.ts +21 -8
  739. package/src/server/knowledge/public/favicon.ts +24 -6
  740. package/src/server/knowledge/public/github-sync.ts +24 -4
  741. package/src/server/knowledge/public/share-merge.ts +51 -18
  742. package/src/server/lib/api-key-cipher.ts +2 -1
  743. package/src/server/lib/bug-sequence.ts +67 -0
  744. package/src/server/lib/cron-auth.ts +7 -3
  745. package/src/server/lib/display-options-schema.ts +52 -0
  746. package/src/server/lib/fixed-window-rate-limit.ts +105 -0
  747. package/src/server/lib/image-magic.ts +44 -0
  748. package/src/{components/design/editor/pages/design-layout.tsx → server/lib/prisma-json.ts} +12 -9
  749. package/src/server/lib/project-membership.ts +60 -0
  750. package/src/server/lib/rate-limit.ts +38 -5
  751. package/src/{lib/annotation-template.ts → server/lib/sse-chunk.ts} +10 -12
  752. package/src/server/lib/text-truncate.ts +51 -0
  753. package/src/{config/sidebar-teams.ts → server/lib/user-brief.ts} +11 -14
  754. package/src/server/lib/validate-assignee.ts +19 -0
  755. package/src/server/lib/validators.ts +16 -0
  756. package/src/server/lib/webhook-secret.ts +45 -0
  757. package/src/server/mcp/__tests__/json-rpc.test.ts +57 -5
  758. package/src/server/mcp/__tests__/tools.test.ts +12 -3
  759. package/src/server/mcp/json-rpc.ts +12 -0
  760. package/src/server/mcp/protocol.ts +50 -3
  761. package/src/server/mcp/tool-schemas.ts +8 -2
  762. package/src/server/mcp/tools.ts +28 -18
  763. package/src/server/middlewares/audit-recorder.ts +11 -3
  764. package/src/server/middlewares/audit.ts +33 -12
  765. package/src/server/middlewares/auth-rate-limit.ts +25 -39
  766. package/src/server/middlewares/rate-limit.ts +42 -15
  767. package/src/server/middlewares/security-headers.ts +14 -16
  768. package/src/server/notifications/__tests__/notification-service.test.ts +4 -0
  769. package/src/server/notifications/notification-service.ts +144 -59
  770. package/src/server/notifications/verify-reminder.ts +2 -0
  771. package/src/server/permissions.ts +17 -1
  772. package/src/{lib → server}/rag.ts +3 -1
  773. package/src/server/references/access.ts +117 -0
  774. package/src/server/references/engine.ts +46 -27
  775. package/src/server/remote-auth.ts +17 -3
  776. package/src/server/resources.ts +55 -43
  777. package/src/server/serverFns/__tests__/auth-server-schemas.test.ts +51 -9
  778. package/src/server/serverFns/__tests__/collab.test.ts +21 -0
  779. package/src/server/serverFns/__tests__/compliance.test.ts +31 -2
  780. package/src/server/serverFns/__tests__/knowledge-index.test.ts +1 -0
  781. package/src/server/serverFns/__tests__/knowledge-kb-projects.test.ts +141 -0
  782. package/src/server/serverFns/__tests__/knowledge-public-compliance.test.ts +163 -0
  783. package/src/server/serverFns/__tests__/knowledge-readable-kb.test.ts +194 -0
  784. package/src/server/serverFns/__tests__/legal-public.test.ts +91 -0
  785. package/src/server/serverFns/__tests__/notifications-list.test.ts +130 -0
  786. package/src/server/serverFns/__tests__/ownership-merge.test.ts +12 -4
  787. package/src/server/serverFns/__tests__/project-delete-transaction.test.ts +128 -0
  788. package/src/server/serverFns/__tests__/project-kb.test.ts +18 -0
  789. package/src/server/serverFns/__tests__/read-path-permissions.test.ts +107 -0
  790. package/src/server/serverFns/__tests__/read-write-merge.test.ts +29 -1
  791. package/src/server/serverFns/__tests__/references-access.test.ts +117 -0
  792. package/src/server/serverFns/__tests__/story-crud-labels-users.test.ts +18 -4
  793. package/src/server/serverFns/__tests__/story-links.test.ts +7 -5
  794. package/src/server/serverFns/__tests__/story-tree.test.ts +57 -121
  795. package/src/server/serverFns/__tests__/story-types.test.ts +4 -48
  796. package/src/server/serverFns/__tests__/update-page-guard.test.ts +2 -0
  797. package/src/server/serverFns/__tests__/workspace-kb.test.ts +63 -3
  798. package/src/server/serverFns/__tests__/workspace.test.ts +2 -1
  799. package/src/server/serverFns/activity.ts +26 -9
  800. package/src/server/serverFns/agents/agent-crud.ts +61 -61
  801. package/src/server/serverFns/agents/bindings.ts +21 -22
  802. package/src/server/serverFns/agents/skill-crud.ts +48 -45
  803. package/src/server/serverFns/ai/code-mode-readiness.ts +8 -2
  804. package/src/server/serverFns/ai/search-capability.ts +8 -2
  805. package/src/server/serverFns/analytics.ts +7 -3
  806. package/src/server/serverFns/anyhub/app.ts +31 -14
  807. package/src/server/serverFns/anyhub/index.ts +48 -32
  808. package/src/server/serverFns/anyhub/install.ts +21 -7
  809. package/src/server/serverFns/anyhub/permissions.ts +25 -4
  810. package/src/server/serverFns/anyhub/proxy.ts +1 -1
  811. package/src/server/serverFns/auth/email-verification.ts +8 -1
  812. package/src/server/serverFns/auth/forgot-password.ts +7 -2
  813. package/src/server/serverFns/auth/providers.ts +2 -0
  814. package/src/server/serverFns/auth/register.ts +1 -1
  815. package/src/server/serverFns/auth/registration-mode.ts +2 -0
  816. package/src/server/serverFns/auth/reset-password.ts +28 -17
  817. package/src/server/serverFns/auth/session.ts +30 -14
  818. package/src/server/serverFns/auth/setup.ts +2 -0
  819. package/src/server/serverFns/billing.ts +20 -14
  820. package/src/server/serverFns/blob-upload.ts +12 -1
  821. package/src/server/serverFns/bug/__tests__/bug-access-tokens.test.ts +1 -0
  822. package/src/server/serverFns/bug/__tests__/bug-activities.test.ts +30 -3
  823. package/src/server/serverFns/bug/__tests__/bug-collect.test.ts +47 -12
  824. package/src/server/serverFns/bug/__tests__/bug-comments.test.ts +47 -16
  825. package/src/server/serverFns/bug/__tests__/bug-groups.test.ts +2 -2
  826. package/src/server/serverFns/bug/__tests__/bug-list-query.test.ts +10 -0
  827. package/src/server/serverFns/bug/__tests__/bug-reactions.test.ts +21 -11
  828. package/src/server/serverFns/bug/__tests__/bug-webhooks.test.ts +13 -10
  829. package/src/server/serverFns/bug/bug-access-tokens.ts +13 -5
  830. package/src/server/serverFns/bug/bug-activities.ts +36 -5
  831. package/src/server/serverFns/bug/bug-collect-tokens.ts +4 -4
  832. package/src/server/serverFns/bug/bug-collect.ts +4 -2
  833. package/src/server/serverFns/bug/bug-comments.ts +55 -32
  834. package/src/server/serverFns/bug/bug-crud/detail.ts +3 -3
  835. package/src/server/serverFns/bug/bug-crud.ts +31 -29
  836. package/src/server/serverFns/bug/bug-display-options.ts +7 -11
  837. package/src/server/serverFns/bug/bug-export.ts +10 -1
  838. package/src/server/serverFns/bug/bug-fix.ts +3 -3
  839. package/src/server/serverFns/bug/bug-group-query.ts +1 -1
  840. package/src/server/serverFns/bug/bug-groups.ts +4 -4
  841. package/src/server/serverFns/bug/bug-list-query.ts +7 -3
  842. package/src/server/serverFns/bug/bug-reactions.ts +19 -6
  843. package/src/server/serverFns/bug/bug-reorder.ts +2 -5
  844. package/src/server/serverFns/bug/bug-repro.ts +2 -2
  845. package/src/server/serverFns/bug/bug-story-bulk.ts +7 -16
  846. package/src/server/serverFns/bug/bug-story.ts +3 -3
  847. package/src/server/serverFns/bug/bug-views.ts +27 -18
  848. package/src/server/serverFns/bug/bug-webhooks.ts +8 -5
  849. package/src/server/serverFns/bug/test-bug-confirm.ts +2 -2
  850. package/src/server/serverFns/changelog/__tests__/fetch.test.ts +80 -0
  851. package/src/server/serverFns/changelog/__tests__/subscribe.test.ts +4 -2
  852. package/src/server/serverFns/changelog/fetch.ts +12 -1
  853. package/src/server/serverFns/changelog/subscribe.ts +17 -3
  854. package/src/server/serverFns/chat/conversations.ts +11 -5
  855. package/src/server/serverFns/collab-presence.ts +1 -1
  856. package/src/server/serverFns/collab-snapshot.ts +1 -1
  857. package/src/server/serverFns/collab.ts +5 -0
  858. package/src/server/serverFns/compliance.ts +11 -8
  859. package/src/server/serverFns/design/__tests__/comments.test.ts +222 -0
  860. package/src/server/serverFns/design/__tests__/designs.test.ts +3 -1
  861. package/src/server/serverFns/design/__tests__/page-versions.test.ts +177 -0
  862. package/src/server/serverFns/design/__tests__/shares-password.test.ts +12 -6
  863. package/src/server/serverFns/design/ai/__tests__/agent-conversations.test.ts +131 -0
  864. package/src/server/serverFns/design/ai/__tests__/providers.test.ts +187 -0
  865. package/src/server/serverFns/design/ai/agent-conversations.ts +27 -7
  866. package/src/server/serverFns/design/ai/fill-annotation.ts +27 -17
  867. package/src/server/serverFns/design/ai/generate-prototype.ts +8 -3
  868. package/src/server/serverFns/design/ai/providers.ts +74 -36
  869. package/src/server/serverFns/design/comments.ts +51 -12
  870. package/src/server/serverFns/design/designs.ts +9 -7
  871. package/src/server/serverFns/design/detail.ts +12 -11
  872. package/src/server/serverFns/design/page-versions.ts +39 -23
  873. package/src/server/serverFns/design/pages.ts +15 -37
  874. package/src/server/serverFns/design/reviews.ts +17 -7
  875. package/src/server/serverFns/design/share/__tests__/share-metadata.test.ts +105 -0
  876. package/src/server/serverFns/design/share/__tests__/share-versions.test.ts +148 -0
  877. package/src/server/serverFns/design/share/__tests__/verify-password.test.ts +14 -3
  878. package/src/server/serverFns/design/share/verify-password.ts +4 -0
  879. package/src/server/serverFns/design/share/versions.ts +14 -30
  880. package/src/server/serverFns/design/share.ts +50 -5
  881. package/src/server/serverFns/design/shares-password.ts +28 -18
  882. package/src/server/serverFns/design/shares.ts +38 -39
  883. package/src/server/serverFns/design/versions.ts +14 -56
  884. package/src/server/serverFns/harness/__tests__/attach-to-kb.spec.ts +9 -9
  885. package/src/server/serverFns/harness/__tests__/attach-to-story.spec.ts +2 -1
  886. package/src/server/serverFns/harness/__tests__/extract-attachment.spec.ts +40 -0
  887. package/src/server/serverFns/harness/__tests__/github-workspace.spec.ts +107 -0
  888. package/src/server/serverFns/harness/attach-prototype.ts +5 -5
  889. package/src/server/serverFns/harness/attach-to-kb.ts +6 -9
  890. package/src/server/serverFns/harness/attach-to-story.ts +3 -3
  891. package/src/server/serverFns/harness/extract-attachment.ts +9 -1
  892. package/src/server/serverFns/harness/gallery.ts +2 -0
  893. package/src/server/serverFns/harness/github-workspace.ts +18 -11
  894. package/src/server/serverFns/harness/media.ts +7 -3
  895. package/src/server/serverFns/harness/sandbox-policy.ts +1 -2
  896. package/src/server/serverFns/harness/search-mention-candidates.ts +1 -1
  897. package/src/server/serverFns/iteration/__tests__/iteration-crud.test.ts +30 -1
  898. package/src/server/serverFns/iteration/__tests__/iteration-stories.test.ts +51 -4
  899. package/src/server/serverFns/iteration/__tests__/iteration-transfer.test.ts +9 -0
  900. package/src/server/serverFns/iteration/iteration-auto-schedule.ts +4 -13
  901. package/src/server/serverFns/iteration/iteration-burndown.ts +7 -3
  902. package/src/server/serverFns/iteration/iteration-crud.ts +16 -24
  903. package/src/server/serverFns/iteration/iteration-stories.ts +57 -54
  904. package/src/server/serverFns/iteration/iteration-transfer.ts +1 -1
  905. package/src/server/serverFns/knowledge/public/bookmarks/categories.ts +18 -14
  906. package/src/server/serverFns/knowledge/public/bookmarks/create.ts +35 -5
  907. package/src/server/serverFns/knowledge/public/bookmarks/delete.ts +2 -2
  908. package/src/server/serverFns/knowledge/public/bookmarks/detail.ts +1 -1
  909. package/src/server/serverFns/knowledge/public/bookmarks/favorite.ts +13 -3
  910. package/src/server/serverFns/knowledge/public/bookmarks/list.ts +5 -2
  911. package/src/server/serverFns/knowledge/public/bookmarks/refresh-favicon.ts +10 -4
  912. package/src/server/serverFns/knowledge/public/bookmarks/share.ts +4 -7
  913. package/src/server/serverFns/knowledge/public/bookmarks/sync-github.ts +12 -1
  914. package/src/server/serverFns/knowledge/public/bookmarks/unshare.ts +1 -1
  915. package/src/server/serverFns/knowledge/public/bookmarks/update.ts +52 -29
  916. package/src/server/serverFns/knowledge/public/compliance/create.ts +3 -2
  917. package/src/server/serverFns/knowledge/public/compliance/delete.ts +2 -2
  918. package/src/server/serverFns/knowledge/public/compliance/detail.ts +1 -1
  919. package/src/server/serverFns/knowledge/public/compliance/list.ts +6 -3
  920. package/src/server/serverFns/knowledge/public/compliance/public.ts +9 -5
  921. package/src/server/serverFns/knowledge/public/compliance/share.ts +4 -7
  922. package/src/server/serverFns/knowledge/public/compliance/unshare.ts +14 -1
  923. package/src/server/serverFns/knowledge/public/compliance/update.ts +10 -5
  924. package/src/server/serverFns/knowledge/public/dictionary/create.ts +5 -3
  925. package/src/server/serverFns/knowledge/public/dictionary/delete.ts +2 -2
  926. package/src/server/serverFns/knowledge/public/dictionary/detail.ts +1 -1
  927. package/src/server/serverFns/knowledge/public/dictionary/list.ts +3 -2
  928. package/src/server/serverFns/knowledge/public/dictionary/share.ts +4 -7
  929. package/src/server/serverFns/knowledge/public/dictionary/unshare.ts +1 -1
  930. package/src/server/serverFns/knowledge/public/dictionary/update.ts +4 -3
  931. package/src/server/serverFns/knowledge/public/entity-tags.ts +19 -13
  932. package/src/server/serverFns/knowledge/public/favorite.ts +17 -2
  933. package/src/server/serverFns/knowledge/public/legal/create.ts +3 -2
  934. package/src/server/serverFns/knowledge/public/legal/delete.ts +2 -2
  935. package/src/server/serverFns/knowledge/public/legal/detail.ts +1 -1
  936. package/src/server/serverFns/knowledge/public/legal/list.ts +6 -3
  937. package/src/server/serverFns/knowledge/public/legal/public.ts +12 -5
  938. package/src/server/serverFns/knowledge/public/legal/share.ts +4 -7
  939. package/src/server/serverFns/knowledge/public/legal/unshare.ts +1 -1
  940. package/src/server/serverFns/knowledge/public/legal/update.ts +10 -3
  941. package/src/server/serverFns/knowledge-index.ts +34 -9
  942. package/src/server/serverFns/knowledge.ts +143 -166
  943. package/src/server/serverFns/notifications.ts +30 -22
  944. package/src/server/serverFns/plugins/harness-plugins.ts +31 -26
  945. package/src/server/serverFns/plugins/plugin-precheck.ts +40 -23
  946. package/src/server/serverFns/project/module-overview.ts +7 -3
  947. package/src/server/serverFns/project.ts +48 -39
  948. package/src/server/serverFns/references/create.ts +17 -4
  949. package/src/server/serverFns/references/resolve.ts +10 -2
  950. package/src/server/serverFns/references/search.ts +9 -2
  951. package/src/server/serverFns/settings/account-team.ts +1 -1
  952. package/src/server/serverFns/share/design/[designId]/events.ts +6 -1
  953. package/src/server/serverFns/share/version.ts +44 -16
  954. package/src/server/serverFns/sso.ts +16 -0
  955. package/src/server/serverFns/story/__tests__/story-assoc.test.ts +17 -2
  956. package/src/server/serverFns/story/__tests__/story-dependencies.test.ts +8 -0
  957. package/src/server/serverFns/story/__tests__/story-read-path-authz.test.ts +141 -0
  958. package/src/server/serverFns/story/index.ts +1 -3
  959. package/src/server/serverFns/story/kb-scope.ts +9 -0
  960. package/src/server/serverFns/story/link-preview.ts +2 -1
  961. package/src/server/serverFns/story/story-assoc.ts +10 -30
  962. package/src/server/serverFns/story/story-attachments.ts +6 -13
  963. package/src/server/serverFns/story/story-children.ts +4 -1
  964. package/src/server/serverFns/story/story-comments.ts +7 -27
  965. package/src/server/serverFns/story/story-crud/activities.ts +3 -1
  966. package/src/server/serverFns/story/story-crud/archive.ts +4 -25
  967. package/src/server/serverFns/story/story-crud/bulk.ts +3 -3
  968. package/src/server/serverFns/story/story-crud/detail.ts +7 -2
  969. package/src/server/serverFns/story/story-crud/labels.ts +1 -58
  970. package/src/server/serverFns/story/story-crud/user-brief.ts +69 -0
  971. package/src/server/serverFns/story/story-crud.ts +9 -27
  972. package/src/server/serverFns/story/story-dependencies.ts +7 -28
  973. package/src/server/serverFns/story/story-groups.ts +5 -5
  974. package/src/server/serverFns/story/story-links.ts +9 -28
  975. package/src/server/serverFns/story/story-list-query.ts +1 -1
  976. package/src/server/serverFns/story/story-reactions.ts +7 -27
  977. package/src/server/serverFns/story/story-search.ts +2 -2
  978. package/src/server/serverFns/story/story-transfer.ts +7 -14
  979. package/src/server/serverFns/story/story-tree.ts +6 -58
  980. package/src/server/serverFns/story-display-options.ts +9 -32
  981. package/src/server/serverFns/story-view.ts +20 -17
  982. package/src/server/serverFns/tasks/task-crud.ts +3 -3
  983. package/src/server/serverFns/tasks/task-queries.ts +3 -3
  984. package/src/server/serverFns/team.ts +42 -18
  985. package/src/server/serverFns/testcase/__tests__/generation.test.ts +9 -4
  986. package/src/server/serverFns/testcase/__tests__/plans.test.ts +1 -0
  987. package/src/server/serverFns/testcase/__tests__/regression.test.ts +15 -0
  988. package/src/server/serverFns/testcase/__tests__/run-cases.test.ts +11 -6
  989. package/src/server/serverFns/testcase/__tests__/runs.test.ts +2 -0
  990. package/src/server/serverFns/testcase/__tests__/testgen-output.test.ts +3 -3
  991. package/src/server/serverFns/testcase/automation.ts +8 -15
  992. package/src/server/serverFns/testcase/bulk.ts +3 -3
  993. package/src/server/serverFns/testcase/generation.ts +26 -20
  994. package/src/server/serverFns/testcase/plans.ts +18 -40
  995. package/src/server/serverFns/testcase/regression.ts +12 -7
  996. package/src/server/serverFns/testcase/run-cases.ts +6 -15
  997. package/src/server/serverFns/testcase/runs.ts +17 -35
  998. package/src/server/serverFns/testcase/stats.ts +7 -18
  999. package/src/server/serverFns/testcase/testcase-activities.ts +3 -1
  1000. package/src/server/serverFns/testcase/testcase-board.ts +6 -22
  1001. package/src/server/serverFns/testcase/testcase-crud.ts +114 -150
  1002. package/src/server/serverFns/testcase/testcase-display-options.ts +2 -2
  1003. package/src/server/serverFns/testcase/testcase-export.ts +1 -1
  1004. package/src/server/serverFns/testcase/testcase-filter-views.ts +4 -4
  1005. package/src/server/serverFns/testcase/testcase-folders.ts +13 -23
  1006. package/src/server/serverFns/testcase/testcase-groups.ts +1 -1
  1007. package/src/server/serverFns/testcase/testcase-reorder.ts +1 -1
  1008. package/src/server/serverFns/translation.ts +4 -1
  1009. package/src/server/serverFns/user/avatar.ts +1 -1
  1010. package/src/server/serverFns/user/settings.ts +1 -1
  1011. package/src/server/serverFns/user/update-locale.ts +1 -1
  1012. package/src/server/serverFns/workspace-kb.ts +84 -27
  1013. package/src/server/serverFns/workspace.ts +41 -38
  1014. package/src/server/serverFns/ws.ts +1 -1
  1015. package/src/server/sso/tokens.ts +15 -3
  1016. package/src/server/story/permissions.ts +56 -0
  1017. package/src/server/story/types.ts +7 -33
  1018. package/src/server/team-access.ts +5 -8
  1019. package/src/server/testcase/__tests__/auto-bug.test.ts +5 -2
  1020. package/src/server/testcase/__tests__/automation-rerun.test.ts +18 -0
  1021. package/src/server/testcase/__tests__/builtin-executor.test.ts +43 -6
  1022. package/src/server/testcase/__tests__/list-query.test.ts +11 -0
  1023. package/src/server/testcase/__tests__/run-summary.test.ts +47 -15
  1024. package/src/server/testcase/__tests__/sandbox-runner.test.ts +27 -1
  1025. package/src/server/testcase/__tests__/triage.test.ts +17 -0
  1026. package/src/server/testcase/auto-bug.ts +6 -6
  1027. package/src/server/testcase/automation-rerun.ts +45 -8
  1028. package/src/server/testcase/builtin-executor.ts +19 -0
  1029. package/src/server/testcase/list-query.ts +18 -3
  1030. package/src/server/testcase/permissions.ts +64 -0
  1031. package/src/server/testcase/run-finalize.ts +19 -2
  1032. package/src/server/testcase/run-webhook.ts +13 -1
  1033. package/src/server/testcase/sandbox-runner.ts +21 -1
  1034. package/src/server/testcase/triage.ts +38 -15
  1035. package/src/server/web-search.ts +85 -0
  1036. package/src/server-entry.ts +7 -1
  1037. package/src/shared/ai-cli/__tests__/adapter.test.ts +39 -17
  1038. package/src/shared/ai-cli/__tests__/cli-detector.test.ts +44 -13
  1039. package/src/shared/ai-cli/adapter.ts +38 -15
  1040. package/src/shared/ai-cli/cli-detector.ts +41 -16
  1041. package/src/{components/bug/display/types.ts → shared/bug/display-types.ts} +1 -1
  1042. package/src/shared/design-ai/ndjson.ts +13 -0
  1043. package/src/{components/shared-kit/list-kit/display/types.ts → shared/list-kit/display-types.ts} +1 -1
  1044. package/src/{components/shared-kit/list-kit/display/values.ts → shared/list-kit/display-values.ts} +1 -1
  1045. package/src/start.ts +26 -10
  1046. package/src/styles/globals.css +11 -0
  1047. package/vite.shared.ts +39 -25
  1048. package/LICENSE +0 -661
  1049. package/src/components/ai/ai-prompt-input/components/page-user-context-selector.tsx +0 -183
  1050. package/src/components/harness/turn-usage-pill.tsx +0 -60
  1051. package/src/components/story/views/story-list/move.ts +0 -55
  1052. package/src/components/tiptap/notion-like/notion-like-editor-theme-toggle.tsx +0 -63
  1053. package/src/components/tiptap/notion-like/setup-error-message/setup-error-message.scss +0 -108
  1054. package/src/components/tiptap/notion-like/setup-error-message/setup-error-message.tsx +0 -115
  1055. package/src/lib/__tests__/pgvector.test.ts +0 -94
  1056. package/src/lib/__tests__/rate-limit.test.ts +0 -80
  1057. package/src/lib/analytics.ts +0 -78
  1058. package/src/lib/collections/ai/index.ts +0 -17
  1059. package/src/lib/plugin-runtime/worker-realm.ts +0 -225
  1060. package/src/lib/prisma.ts +0 -18
  1061. package/src/lib/rate-limit.ts +0 -70
  1062. package/src/paraglide/.gitignore +0 -3
  1063. package/src/paraglide/.prettierignore +0 -3
  1064. package/src/paraglide/README.md +0 -162
  1065. package/src/paraglide/messages/_index.js +0 -83424
  1066. package/src/paraglide/messages/en.js +0 -26715
  1067. package/src/paraglide/messages/zh.js +0 -26713
  1068. package/src/paraglide/messages.js +0 -4
  1069. package/src/paraglide/registry.js +0 -46
  1070. package/src/paraglide/runtime.js +0 -2311
  1071. package/src/paraglide/server.js +0 -294
  1072. package/src/routes/_nav/dashboard/-components/quick-actions.tsx +0 -48
  1073. /package/src/{components/settings/personal-team/account → lib}/avatar/avatar-config.ts +0 -0
@@ -26,6 +26,7 @@ import { z } from "zod";
26
26
  import { requireAuth } from "@/server/auth-helpers";
27
27
  import { requireFeature } from "@/server/entitlements";
28
28
  import { isProEdition } from "@/server/pro-services";
29
+ import { toJsonInput } from "@/server/lib/prisma-json";
29
30
  import {
30
31
  BUG_DISPLAY_OPTIONS_VIEW_NAME,
31
32
  BUG_GROUP_KEYS,
@@ -40,12 +41,7 @@ import {
40
41
  type BugOrderKey,
41
42
  type BugOrderDirection,
42
43
  type BugPageSize,
43
- } from "@/components/bug/display/types";
44
- import type { Prisma } from "@allbluecn/database";
45
-
46
- function toJson<T>(value: T): Prisma.InputJsonValue {
47
- return value as unknown as Prisma.InputJsonValue;
48
- }
44
+ } from "@/shared/bug/display-types";
49
45
 
50
46
  /** 解析存储的 JSON 偏好,非法/缺失字段逐项回退默认值(照 story parseStoredOptions) */
51
47
  function parseStoredOptions(raw: unknown): BugDisplayOptions {
@@ -120,7 +116,7 @@ export const getBugDisplayOptionsFn = createServerFn({ method: "GET" }).handler(
120
116
  const prisma = await getPrisma();
121
117
  const request = getRequest();
122
118
  const session = await requireAuth(request);
123
- const userId = session.user!.id!;
119
+ const userId = session.user.id;
124
120
 
125
121
  const row = await prisma.bugFilterView.findFirst({
126
122
  where: { userId, name: BUG_DISPLAY_OPTIONS_VIEW_NAME },
@@ -139,7 +135,7 @@ export const updateBugDisplayOptionsFn = createServerFn({ method: "POST" })
139
135
  const prisma = await getPrisma();
140
136
  const request = getRequest();
141
137
  const session = await requireAuth(request);
142
- const userId = session.user!.id!;
138
+ const userId = session.user.id;
143
139
 
144
140
  // 服务端强制校验:pageSize > 200(500/1000)为 Pro 专属,前端锁定只是 UX
145
141
  const options: BugDisplayOptions = {
@@ -156,15 +152,15 @@ export const updateBugDisplayOptionsFn = createServerFn({ method: "POST" })
156
152
  if (existing) {
157
153
  await prisma.bugFilterView.update({
158
154
  where: { id: existing.id },
159
- data: { displayOptions: toJson(options) },
155
+ data: { displayOptions: toJsonInput(options) },
160
156
  });
161
157
  } else {
162
158
  await prisma.bugFilterView.create({
163
159
  data: {
164
160
  userId,
165
161
  name: BUG_DISPLAY_OPTIONS_VIEW_NAME,
166
- filters: toJson([]),
167
- displayOptions: toJson(options),
162
+ filters: toJsonInput([]),
163
+ displayOptions: toJsonInput(options),
168
164
  },
169
165
  });
170
166
  }
@@ -33,6 +33,7 @@ import { getRequest } from "@tanstack/react-start/server";
33
33
  import { z } from "zod";
34
34
  import type { Prisma } from "@allbluecn/database";
35
35
  import { requireAuth } from "@/server/auth-helpers";
36
+ import { checkRateLimit } from "@/server/middlewares/rate-limit-server-fn";
36
37
  import { resolveStoryScopeProjectIds } from "@/server/builtin-project";
37
38
  import { buildListWhere } from "./bug-list-query";
38
39
  import { CSV_EXPORT_MAX_ROWS, toCsv, type CsvCell } from "@/server/csv";
@@ -64,6 +65,9 @@ const EXPORT_HEADERS: Record<"zh" | "en", string[]> = {
64
65
  /** offset 聚合批大小 */
65
66
  const BATCH_SIZE = 1000;
66
67
 
68
+ /** 导出为昂贵读操作(2 万行封顶的多次翻页聚合),per-user 频控防刷 */
69
+ const EXPORT_RATE_LIMIT = { max: 10, windowMs: 60_000 };
70
+
67
71
  /** 导出列 = 列表显示属性(user brief 仅取 username;labels 展平取 name) */
68
72
  const BUG_EXPORT_SELECT = {
69
73
  identifier: true,
@@ -85,7 +89,12 @@ export const exportBugsFn = createServerFn({ method: "GET" })
85
89
  const prisma = await getPrisma();
86
90
  const request = getRequest();
87
91
  const session = await requireAuth(request);
88
- const userId = session.user!.id!;
92
+ const userId = session.user.id;
93
+
94
+ const rl = checkRateLimit(`bug-export:${userId}`, EXPORT_RATE_LIMIT);
95
+ if (!rl.allowed) {
96
+ throw new Error("导出请求过于频繁,请稍后再试");
97
+ }
89
98
 
90
99
  const isArchivedView = data.projectId === "__archived__";
91
100
  const projectIds = isArchivedView
@@ -131,7 +131,7 @@ export const requestBugFixFn = createServerFn({ method: "POST" })
131
131
  const prisma = await getPrisma();
132
132
  const request = getRequest();
133
133
  const session = await requireAuth(request);
134
- const userId = session.user!.id!;
134
+ const userId = session.user.id;
135
135
 
136
136
  const projectId = await assertBugProjectMember(data.bugId, userId);
137
137
 
@@ -199,7 +199,7 @@ export const cancelBugFixFn = createServerFn({ method: "POST" })
199
199
  const prisma = await getPrisma();
200
200
  const request = getRequest();
201
201
  const session = await requireAuth(request);
202
- const userId = session.user!.id!;
202
+ const userId = session.user.id;
203
203
 
204
204
  await assertBugProjectMember(data.bugId, userId);
205
205
 
@@ -235,7 +235,7 @@ export const listFixRunsFn = createServerFn({ method: "GET" })
235
235
  const prisma = await getPrisma();
236
236
  const request = getRequest();
237
237
  const session = await requireAuth(request);
238
- const userId = session.user!.id!;
238
+ const userId = session.user.id;
239
239
 
240
240
  await assertBugProjectMember(data.bugId, userId);
241
241
 
@@ -24,7 +24,7 @@ import {
24
24
  BUG_GROUP_DISPLAY_ORDER,
25
25
  type BugGroupKey,
26
26
  type BugOrderKey,
27
- } from "@/components/bug/display/types";
27
+ } from "@/shared/bug/display-types";
28
28
  import { BUG_LIST_SELECT, type BugListRow } from "@/components/bug/types";
29
29
 
30
30
  /** prisma.groupBy 的 by 字段映射(assignee/createdBy 用外键列分组计数) */
@@ -30,7 +30,7 @@ import {
30
30
  BUG_ORDER_KEYS,
31
31
  BUG_ORDER_DIRECTIONS,
32
32
  type BugGroupKey,
33
- } from "@/components/bug/display/types";
33
+ } from "@/shared/bug/display-types";
34
34
  import { BUG_LIST_SELECT, castBugUsers } from "@/components/bug/types";
35
35
  import { buildListWhere } from "./bug-list-query";
36
36
  import {
@@ -98,7 +98,7 @@ export const listBugsInGroupFn = createServerFn({ method: "GET" })
98
98
  const prisma = await getPrisma();
99
99
  const request = getRequest();
100
100
  const session = await requireAuth(request);
101
- const userId = session.user!.id!;
101
+ const userId = session.user.id;
102
102
 
103
103
  const scope = await resolveReadScope(data.projectId, userId);
104
104
  const base = buildListWhere({
@@ -155,7 +155,7 @@ export const listAllGroupsItemsFn = createServerFn({ method: "GET" })
155
155
  const prisma = await getPrisma();
156
156
  const request = getRequest();
157
157
  const session = await requireAuth(request);
158
- const userId = session.user!.id!;
158
+ const userId = session.user.id;
159
159
 
160
160
  const scope = await resolveReadScope(data.projectId, userId);
161
161
  const base = buildListWhere({
@@ -207,7 +207,7 @@ export const listBugGroupsFn = createServerFn({ method: "GET" })
207
207
  const prisma = await getPrisma();
208
208
  const request = getRequest();
209
209
  const session = await requireAuth(request);
210
- const userId = session.user!.id!;
210
+ const userId = session.user.id;
211
211
 
212
212
  const scope = await resolveReadScope(data.projectId, userId);
213
213
  const where = buildListWhere({
@@ -132,9 +132,13 @@ export function buildListWhere(data: {
132
132
  } else if (hasNone && realIds.length === 0) {
133
133
  andConditions.push(isNeg ? { assigneeId: { not: null } } : { assigneeId: null });
134
134
  } else if (hasNone) {
135
- andConditions.push({
136
- OR: [{ assigneeId: null }, { assigneeId: isNeg ? { notIn: realIds } : { in: realIds } }],
137
- });
135
+ // is_not 语义 NOT(未指派 OR in realIds) = 非空且 notIn(testcase list-query 同款修复:
136
+ // 原 `OR: [null, notIn]` 把未指派重新包含进结果,勾选「不属于:未指派、张三」时未指派 BUG 仍命中)
137
+ andConditions.push(
138
+ isNeg
139
+ ? { AND: [{ assigneeId: { not: null } }, { assigneeId: { notIn: realIds } }] }
140
+ : { OR: [{ assigneeId: null }, { assigneeId: { in: realIds } }] },
141
+ );
138
142
  } else if (realIds.length > 0) {
139
143
  andConditions.push({
140
144
  assigneeId: isNeg
@@ -41,7 +41,7 @@ export const listBugCommentReactionsFn = createServerFn({ method: "GET" })
41
41
  const prisma = await getPrisma();
42
42
  const request = getRequest();
43
43
  const session = await requireAuth(request);
44
- const userId = session.user!.id!;
44
+ const userId = session.user.id;
45
45
 
46
46
  await assertBugCommentProjectMember(data.commentId, userId);
47
47
 
@@ -59,7 +59,7 @@ export const addBugCommentReactionFn = createServerFn({ method: "POST" })
59
59
  const prisma = await getPrisma();
60
60
  const request = getRequest();
61
61
  const session = await requireAuth(request);
62
- const userId = session.user!.id!;
62
+ const userId = session.user.id;
63
63
 
64
64
  await assertBugCommentProjectMember(data.commentId, userId);
65
65
 
@@ -92,7 +92,7 @@ export const toggleBugCommentReactionFn = createServerFn({ method: "POST" })
92
92
  const prisma = await getPrisma();
93
93
  const request = getRequest();
94
94
  const session = await requireAuth(request);
95
- const userId = session.user!.id!;
95
+ const userId = session.user.id;
96
96
 
97
97
  await assertBugCommentProjectMember(data.commentId, userId);
98
98
 
@@ -107,10 +107,23 @@ export const toggleBugCommentReactionFn = createServerFn({ method: "POST" })
107
107
  });
108
108
 
109
109
  if (existing) {
110
- await prisma.bugCommentReaction.delete({ where: { id: existing.id } });
110
+ // deleteMany 按三元组删除:并发双击时一方删空为 0 行,不抛 P2025(幂等)
111
+ await prisma.bugCommentReaction.deleteMany({
112
+ where: { commentId: data.commentId, userId, emoji: data.emoji },
113
+ });
111
114
  } else {
112
- await prisma.bugCommentReaction.create({
113
- data: { commentId: data.commentId, userId, emoji: data.emoji },
115
+ // 与 add 同款 upsert:并发双击双 create 时一方撞三元组唯一键,
116
+ // update:{} 吞掉为幂等跳过,不再以裸 P2002 抛错
117
+ await prisma.bugCommentReaction.upsert({
118
+ where: {
119
+ commentId_userId_emoji: {
120
+ commentId: data.commentId,
121
+ userId,
122
+ emoji: data.emoji,
123
+ },
124
+ },
125
+ update: {},
126
+ create: { commentId: data.commentId, userId, emoji: data.emoji },
114
127
  });
115
128
  }
116
129
 
@@ -24,6 +24,7 @@ import { createServerFn } from "@tanstack/react-start";
24
24
  import { getRequest } from "@tanstack/react-start/server";
25
25
  import { z } from "zod";
26
26
  import { requireAuth } from "@/server/auth-helpers";
27
+ import { getAccessibleProjectIds } from "@/server/bug/bug-permissions";
27
28
 
28
29
  const reorderSchema = z.object({
29
30
  // 批量上限 500(story-crud/bulk idListSchema 同款):防误用超大拖垮 $transaction
@@ -45,11 +46,7 @@ export const reorderBugsFn = createServerFn({ method: "POST" })
45
46
  const session = await requireAuth(request);
46
47
  // 可见性过滤进 where(SEC-03:防跨项目改他人 BUG 排序);updateMany 对
47
48
  // 越权/不存在 id 静默跳过,不中断整批合法排序
48
- const memberships = await prisma.projectMember.findMany({
49
- where: { userId: session.user!.id!, status: { not: "suspended" } },
50
- select: { projectId: true },
51
- });
52
- const visibleProjectIds = memberships.map((m) => m.projectId);
49
+ const visibleProjectIds = await getAccessibleProjectIds(session.user.id);
53
50
 
54
51
  await prisma.$transaction(
55
52
  data.items.map((item) =>
@@ -78,7 +78,7 @@ export const runBugReproFn = createServerFn({ method: "POST" })
78
78
  .handler(async ({ data }) => {
79
79
  const request = getRequest();
80
80
  const session = await requireAuth(request);
81
- const userId = session.user!.id!;
81
+ const userId = session.user.id;
82
82
 
83
83
  await assertBugProjectMember(data.bugId, userId);
84
84
 
@@ -91,7 +91,7 @@ export const listReproRunsFn = createServerFn({ method: "GET" })
91
91
  const prisma = await getPrisma();
92
92
  const request = getRequest();
93
93
  const session = await requireAuth(request);
94
- const userId = session.user!.id!;
94
+ const userId = session.user.id;
95
95
 
96
96
  await assertBugProjectMember(data.bugId, userId);
97
97
 
@@ -25,19 +25,10 @@ import { createServerFn } from "@tanstack/react-start";
25
25
  import { getRequest } from "@tanstack/react-start/server";
26
26
  import { z } from "zod";
27
27
  import { requireAuth } from "@/server/auth-helpers";
28
+ import { getAccessibleProjectIds } from "@/server/bug/bug-permissions";
28
29
 
29
30
  const idListSchema = z.object({ bugIds: z.array(z.string()).min(1).max(500) });
30
31
 
31
- /** 一次取用户可访问(有效成员,suspended 视同无权限)的项目 id 集合(bulk.ts 同款口径) */
32
- async function accessibleProjectIds(userId: string): Promise<string[]> {
33
- const prisma = await getPrisma();
34
- const rows = await prisma.projectMember.findMany({
35
- where: { userId, status: { not: "suspended" } },
36
- select: { projectId: true },
37
- });
38
- return rows.map((r) => r.projectId);
39
- }
40
-
41
32
  const bulkLinkSchema = z.object({
42
33
  bugIds: z.array(z.string()).min(1).max(500),
43
34
  storyId: z.string(),
@@ -49,8 +40,8 @@ export const bulkLinkBugsToStoryFn = createServerFn({ method: "POST" })
49
40
  const prisma = await getPrisma();
50
41
  const request = getRequest();
51
42
  const session = await requireAuth(request);
52
- const userId = session.user!.id!;
53
- const visibleProjectIds = await accessibleProjectIds(userId);
43
+ const userId = session.user.id;
44
+ const visibleProjectIds = await getAccessibleProjectIds(userId);
54
45
 
55
46
  // story 归属校验(防跨项目挂载,testcase bulk 同口径)
56
47
  const story = await prisma.story.findUnique({
@@ -104,8 +95,8 @@ export const bulkUnlinkBugsFromStoryFn = createServerFn({ method: "POST" })
104
95
  const prisma = await getPrisma();
105
96
  const request = getRequest();
106
97
  const session = await requireAuth(request);
107
- const userId = session.user!.id!;
108
- const visibleProjectIds = await accessibleProjectIds(userId);
98
+ const userId = session.user.id;
99
+ const visibleProjectIds = await getAccessibleProjectIds(userId);
109
100
 
110
101
  return prisma.$transaction(async (tx) => {
111
102
  const bugs = await tx.bug.findMany({
@@ -170,7 +161,7 @@ export const listBugsByStoryFn = createServerFn({ method: "GET" })
170
161
  const prisma = await getPrisma();
171
162
  const request = getRequest();
172
163
  const session = await requireAuth(request);
173
- const userId = session.user!.id!;
164
+ const userId = session.user.id;
174
165
 
175
166
  // story 可见性:非成员静默回退空(防越权探测 storyId)
176
167
  const story = await prisma.story.findUnique({
@@ -230,7 +221,7 @@ export const listBugsForSelectFn = createServerFn({ method: "GET" })
230
221
  const prisma = await getPrisma();
231
222
  const request = getRequest();
232
223
  const session = await requireAuth(request);
233
- const userId = session.user!.id!;
224
+ const userId = session.user.id;
234
225
  const projectId = await (async () => {
235
226
  // scope 解析同 listBugsFn:无效/非成员 → 回退独立项目
236
227
  const { resolveStoryScopeProjectId } = await import("@/server/builtin-project");
@@ -44,7 +44,7 @@ export const convertBugToStoryFn = createServerFn({ method: "POST" })
44
44
  const prisma = await getPrisma();
45
45
  const request = getRequest();
46
46
  const session = await requireAuth(request);
47
- const userId = session.user!.id!;
47
+ const userId = session.user.id;
48
48
 
49
49
  await assertBugProjectMember(data.bugId, userId);
50
50
 
@@ -102,7 +102,7 @@ export const linkBugToStoryFn = createServerFn({ method: "POST" })
102
102
  const prisma = await getPrisma();
103
103
  const request = getRequest();
104
104
  const session = await requireAuth(request);
105
- const userId = session.user!.id!;
105
+ const userId = session.user.id;
106
106
 
107
107
  const projectId = await assertBugProjectMember(data.bugId, userId);
108
108
 
@@ -140,7 +140,7 @@ export const unlinkBugFromStoryFn = createServerFn({ method: "POST" })
140
140
  const prisma = await getPrisma();
141
141
  const request = getRequest();
142
142
  const session = await requireAuth(request);
143
- const userId = session.user!.id!;
143
+ const userId = session.user.id;
144
144
 
145
145
  await assertBugProjectMember(data.bugId, userId);
146
146
 
@@ -23,17 +23,14 @@ import { createServerFn } from "@tanstack/react-start";
23
23
  import { getRequest } from "@tanstack/react-start/server";
24
24
  import { z } from "zod";
25
25
  import { requireAuth } from "@/server/auth-helpers";
26
+ import { toJsonInput } from "@/server/lib/prisma-json";
26
27
  import {
27
28
  BUG_DISPLAY_OPTIONS_VIEW_NAME,
28
29
  type BugSavedView,
29
30
  type BugViewFilterCondition,
30
- } from "@/components/bug/display/types";
31
+ } from "@/shared/bug/display-types";
31
32
  import type { Prisma } from "@allbluecn/database";
32
33
 
33
- function toJson<T>(value: T): Prisma.InputJsonValue {
34
- return value as unknown as Prisma.InputJsonValue;
35
- }
36
-
37
34
  function toBugSavedView(row: {
38
35
  id: string;
39
36
  name: string;
@@ -70,7 +67,7 @@ export const listBugViewsFn = createServerFn({ method: "GET" }).handler(async ()
70
67
  const prisma = await getPrisma();
71
68
  const request = getRequest();
72
69
  const session = await requireAuth(request);
73
- const userId = session.user!.id!;
70
+ const userId = session.user.id;
74
71
  const rows = await prisma.bugFilterView.findMany({
75
72
  where: { userId, ...NOT_RESERVED },
76
73
  orderBy: { createdAt: "asc" },
@@ -80,15 +77,25 @@ export const listBugViewsFn = createServerFn({ method: "GET" }).handler(async ()
80
77
  });
81
78
 
82
79
  const filterConditionSchema = z.object({
83
- property: z.string(),
84
- operator: z.string(),
85
- value: z.string(),
80
+ property: z.string().max(100),
81
+ operator: z.string().max(64),
82
+ value: z.string().max(2000),
86
83
  });
87
84
 
85
+ // filters 条数封顶(单行膨胀/存储滥用防线)
86
+ const FILTERS_MAX = 50;
87
+
88
+ /** displayOptions 为客户端状态快照 JSON(含视图 icon 侧信道字段),只限尺寸不收敛形状 */
89
+ function assertDisplayOptionsSize(value: unknown): void {
90
+ if (JSON.stringify(value ?? {}).length > 65536) {
91
+ throw new Error("视图显示快照过大");
92
+ }
93
+ }
94
+
88
95
  const createSchema = z.object({
89
96
  name: z.string().min(1).max(50),
90
97
  projectId: z.string().nullable().optional(),
91
- filters: z.array(filterConditionSchema),
98
+ filters: z.array(filterConditionSchema).max(FILTERS_MAX),
92
99
  displayOptions: z.unknown(),
93
100
  });
94
101
 
@@ -101,14 +108,15 @@ export const createBugViewFn = createServerFn({ method: "POST" })
101
108
  throw new Error("该视图名称为系统保留,请换一个名称");
102
109
  }
103
110
  const prisma = await getPrisma();
104
- const userId = session.user!.id!;
111
+ const userId = session.user.id;
112
+ assertDisplayOptionsSize(data.displayOptions);
105
113
  const row = await prisma.bugFilterView.create({
106
114
  data: {
107
115
  userId,
108
116
  name: data.name,
109
117
  projectId: data.projectId ?? null,
110
- filters: toJson(data.filters as BugViewFilterCondition[]),
111
- displayOptions: toJson(data.displayOptions),
118
+ filters: toJsonInput(data.filters as BugViewFilterCondition[]),
119
+ displayOptions: toJsonInput(data.displayOptions),
112
120
  },
113
121
  select: VIEW_SELECT,
114
122
  });
@@ -119,7 +127,7 @@ const updateSchema = z.object({
119
127
  id: z.string(),
120
128
  name: z.string().min(1).max(50).optional(),
121
129
  projectId: z.string().nullable().optional(),
122
- filters: z.array(filterConditionSchema).optional(),
130
+ filters: z.array(filterConditionSchema).max(FILTERS_MAX).optional(),
123
131
  displayOptions: z.unknown().optional(),
124
132
  });
125
133
 
@@ -132,13 +140,14 @@ export const updateBugViewFn = createServerFn({ method: "POST" })
132
140
  throw new Error("该视图名称为系统保留,请换一个名称");
133
141
  }
134
142
  const prisma = await getPrisma();
135
- const userId = session.user!.id!;
143
+ const userId = session.user.id;
136
144
  const { id, ...patch } = data;
145
+ if (patch.displayOptions !== undefined) assertDisplayOptionsSize(patch.displayOptions);
137
146
  const updates: Record<string, unknown> = {};
138
147
  if (patch.name !== undefined) updates.name = patch.name;
139
148
  if (patch.projectId !== undefined) updates.projectId = patch.projectId;
140
- if (patch.filters !== undefined) updates.filters = toJson(patch.filters as BugViewFilterCondition[]);
141
- if (patch.displayOptions !== undefined) updates.displayOptions = toJson(patch.displayOptions);
149
+ if (patch.filters !== undefined) updates.filters = toJsonInput(patch.filters as BugViewFilterCondition[]);
150
+ if (patch.displayOptions !== undefined) updates.displayOptions = toJsonInput(patch.displayOptions);
142
151
  const row = await prisma.bugFilterView.update({
143
152
  // userId + 非保留名限定:他人视图与显示选项保留行均改不到(P2025 由调用方感知)
144
153
  where: { id, userId, ...NOT_RESERVED },
@@ -156,7 +165,7 @@ export const deleteBugViewFn = createServerFn({ method: "POST" })
156
165
  const prisma = await getPrisma();
157
166
  const request = getRequest();
158
167
  const session = await requireAuth(request);
159
- const userId = session.user!.id!;
168
+ const userId = session.user.id;
160
169
  await prisma.bugFilterView.delete({
161
170
  where: { id: data.id, userId, ...NOT_RESERVED },
162
171
  });
@@ -30,6 +30,7 @@ import { assertFetchableUrl } from "@/server/fetch-guard";
30
30
  import { BUG_WEBHOOK_EVENTS } from "@/shared/bug/constants";
31
31
  import { TEST_RUN_WEBHOOK_EVENTS } from "../testcase/constants";
32
32
  import { assertProjectMembership } from "@/server/bug/bug-permissions";
33
+ import { encryptWebhookSecret } from "@/server/lib/webhook-secret"
33
34
 
34
35
  /** 签名密钥:32 字节 CSPRNG → 64 字符 hex(webhook-out HMAC-SHA256 用) */
35
36
  const generateWebhookSecret = (): string => randomBytes(32).toString("hex");
@@ -63,7 +64,7 @@ export const listBugWebhooksFn = createServerFn({ method: "GET" })
63
64
  const prisma = await getPrisma();
64
65
  const request = getRequest();
65
66
  const session = await requireAuth(request);
66
- const userId = session.user!.id!;
67
+ const userId = session.user.id;
67
68
  await assertProjectMembership(data.projectId, userId);
68
69
 
69
70
  const rows = await prisma.projectWebhook.findMany({
@@ -94,7 +95,7 @@ export const createBugWebhookFn = createServerFn({ method: "POST" })
94
95
  const prisma = await getPrisma();
95
96
  const request = getRequest();
96
97
  const session = await requireAuth(request);
97
- const userId = session.user!.id!;
98
+ const userId = session.user.id;
98
99
  await assertProjectMembership(data.projectId, userId);
99
100
 
100
101
  // SEC-07 注册时校验:成员即可注册 webhook,私网/回环目标会形成服务端盲
@@ -107,7 +108,9 @@ export const createBugWebhookFn = createServerFn({ method: "POST" })
107
108
  data: {
108
109
  projectId: data.projectId,
109
110
  url: data.url,
110
- secret,
111
+ // 静态加密(审计 A4x-3 🟡 待决策收口):入库为 AES-256-GCM 密文(enc:v1: 前缀),
112
+ // 明文仅本次响应回显一次;两处投递端经 decryptWebhookSecret 解密(存量明文回退)
113
+ secret: encryptWebhookSecret(secret),
111
114
  events: data.events,
112
115
  enabled: true,
113
116
  },
@@ -134,7 +137,7 @@ export const deleteBugWebhookFn = createServerFn({ method: "POST" })
134
137
  const prisma = await getPrisma();
135
138
  const request = getRequest();
136
139
  const session = await requireAuth(request);
137
- const userId = session.user!.id!;
140
+ const userId = session.user.id;
138
141
  await assertProjectMembership(data.projectId, userId);
139
142
 
140
143
  // findFirst 带 projectId 收敛:越权 webhookId 与不存在同话术
@@ -155,7 +158,7 @@ export const toggleBugWebhookFn = createServerFn({ method: "POST" })
155
158
  const prisma = await getPrisma();
156
159
  const request = getRequest();
157
160
  const session = await requireAuth(request);
158
- const userId = session.user!.id!;
161
+ const userId = session.user.id;
159
162
  await assertProjectMembership(data.projectId, userId);
160
163
 
161
164
  const existing = await prisma.projectWebhook.findFirst({
@@ -47,7 +47,7 @@ export const listPendingTestRunBugsFn = createServerFn({ method: "GET" })
47
47
  const prisma = await getPrisma();
48
48
  const request = getRequest();
49
49
  const session = await requireAuth(request);
50
- const userId = session.user!.id!;
50
+ const userId = session.user.id;
51
51
 
52
52
  const run = await prisma.testRun.findUnique({
53
53
  where: { id: data.runId },
@@ -85,7 +85,7 @@ export const confirmTestRunBugFn = createServerFn({ method: "POST" })
85
85
  const prisma = await getPrisma();
86
86
  const request = getRequest();
87
87
  const session = await requireAuth(request);
88
- const userId = session.user!.id!;
88
+ const userId = session.user.id;
89
89
 
90
90
  const bug = await prisma.bug.findUnique({
91
91
  where: { id: data.bugId },
@@ -0,0 +1,80 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // AllBlue - 理想之海
3
+ // Copyright (C) 2026 AllBlue Contributors
4
+
5
+ // fetchChangelogFn 读路径鉴权自查(审计 A2x-serverfns-2 条目 1):
6
+ // changelog 页在 _nav 登录墙内,但 serverFn 是独立 RPC 入口——未登录直调必须拒绝,
7
+ // 且 findMany 带 take 封顶防全表拉取。
8
+ import { beforeEach, describe, expect, it, vi } from "vitest";
9
+
10
+ const mocks = vi.hoisted(() => ({
11
+ requireAuth: vi.fn(),
12
+ developerLogFindMany: vi.fn(),
13
+ }));
14
+
15
+ vi.mock("@tanstack/react-start", () => ({
16
+ createServerFn: () => ({
17
+ handler(fn: Function) {
18
+ return async (args?: { data?: unknown }) => fn({ data: args?.data });
19
+ },
20
+ }),
21
+ }));
22
+
23
+ vi.mock("@tanstack/react-start/server", () => ({
24
+ getRequest: () => new Request("https://allblue.test/changelog"),
25
+ }));
26
+
27
+ vi.mock("@/server/auth-helpers", () => ({
28
+ requireAuth: mocks.requireAuth,
29
+ }));
30
+
31
+ vi.mock("@allbluecn/database/get-prisma", () => ({
32
+ getPrisma: async () => ({
33
+ developerLog: { findMany: mocks.developerLogFindMany },
34
+ }),
35
+ }));
36
+
37
+ import { fetchChangelogFn } from "../fetch";
38
+
39
+ const row = {
40
+ id: "log1",
41
+ date: "2026-10-01",
42
+ year: 2026,
43
+ title: "t",
44
+ desc: "d",
45
+ tags: ["a"],
46
+ commitSha: "abc",
47
+ createdAt: new Date("2026-10-01T00:00:00Z"),
48
+ updatedAt: new Date("2026-10-01T00:00:00Z"),
49
+ };
50
+
51
+ beforeEach(() => {
52
+ vi.clearAllMocks();
53
+ mocks.requireAuth.mockResolvedValue({ user: { id: "u1" } });
54
+ mocks.developerLogFindMany.mockResolvedValue([row]);
55
+ });
56
+
57
+ describe("fetchChangelogFn 读路径鉴权", () => {
58
+ it("未登录拒绝且不查询 developerLog", async () => {
59
+ mocks.requireAuth.mockRejectedValue(new Error("UNAUTHORIZED"));
60
+ await expect(fetchChangelogFn()).rejects.toThrow("UNAUTHORIZED");
61
+ expect(mocks.developerLogFindMany).not.toHaveBeenCalled();
62
+ });
63
+
64
+ it("登录后放行:findMany 带 isDeleted 过滤 + take 封顶,tags 归一为数组", async () => {
65
+ const res = await fetchChangelogFn();
66
+
67
+ expect(mocks.developerLogFindMany).toHaveBeenCalledTimes(1);
68
+ const arg = mocks.developerLogFindMany.mock.calls[0][0];
69
+ expect(arg.where).toEqual({ isDeleted: false });
70
+ expect(arg.take).toBe(500);
71
+ expect(arg.orderBy).toEqual([{ year: "desc" }, { createdAt: "desc" }]);
72
+ expect(res).toEqual([
73
+ {
74
+ ...row,
75
+ createdAt: "2026-10-01T00:00:00.000Z",
76
+ updatedAt: "2026-10-01T00:00:00.000Z",
77
+ },
78
+ ]);
79
+ });
80
+ });
@@ -95,8 +95,10 @@ describe('subscribeChangelogFn', () => {
95
95
  expect(sendTemplateEmailMock).toHaveBeenCalledTimes(1)
96
96
  })
97
97
 
98
- it('email 为空 → zod 拒绝', async () => {
99
- await expect(invoke(subscribeChangelogFn, { email: 'nope' })).rejects.toThrow()
98
+ it('email 非法 → 返回 invalid_email(结构化 code,不抛错)', async () => {
99
+ const r = await invoke(subscribeChangelogFn, { email: 'nope' })
100
+ expect(r).toEqual({ status: 'invalid_email' })
101
+ expect(emailSubscriberMock.findUnique).not.toHaveBeenCalled()
100
102
  })
101
103
  })
102
104