@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
@@ -42,7 +42,7 @@ import { selectTools } from './tools/select'
42
42
  import { deleteProject } from './tools/delete-project'
43
43
  import { pluginLifecycleTools } from './tools/plugin-lifecycle-server'
44
44
  import { buildPluginTools } from './tools/plugin-tools'
45
- import { isSearxngEnabled } from '@/server/serverFns/web-search'
45
+ import { isSearxngEnabled } from '@/server/web-search'
46
46
  import { buildSkillsStack } from './skills'
47
47
  import { buildMemoryMiddleware } from './memory'
48
48
  import { buildCodeModeStack } from './code-mode'
@@ -90,14 +90,41 @@ interface BuildChatStreamParams {
90
90
  | { type: "cloud"; workspaceId: string }
91
91
  /**
92
92
  * attach 续接模式:true 时读已有沙箱 journal 而非新开 agent。
93
- * 由 reaper drive 等后台消费路径设置——journal 已终态时 adapter 仅回放已存事件。
93
+ * 由 reaper drive 等后台消费路径设置——journal 已终态时 adapter 仅回放已存事件,
94
+ * 允许 adapter 传 null(后台无 adapter 可用);非 attach 模式 adapter 必填。
94
95
  */
95
96
  attach?: boolean
96
97
  }
97
98
 
99
+ /**
100
+ * runId 形状白名单(审计 2026-10-25 🟠):runId 由客户端 body 可控,是 journal
101
+ * 文件名成分(@tanstack/ai-sandbox journal 落 /tmp/tanstack-runs/<encoded>.ndjson)
102
+ * 与 DB run 记录主键。包内 encodeRunId 已把 `/` 等转义为 _xx(无目录分隔符可存活),
103
+ * 这里再加一层服务端形状收窄,防垃圾 id 污染 journal/DB 命名空间并杜绝任何
104
+ * 编码边界下的路径成分风险。
105
+ */
106
+ const RUN_ID_RE = /^[A-Za-z0-9][A-Za-z0-9._-]{0,99}$/
107
+
108
+ function assertSafeRunId(runId: string): string {
109
+ if (!RUN_ID_RE.test(runId) || runId.includes("..")) {
110
+ throw new Error(
111
+ `非法 runId(仅允许字母数字与 . _ -,不超过 100 字符):${JSON.stringify(runId.slice(0, 120))}`,
112
+ )
113
+ }
114
+ return runId
115
+ }
116
+
98
117
  export async function buildChatStreamWithTools(
99
118
  params: BuildChatStreamParams,
100
119
  ): Promise<AsyncIterable<StreamChunk>> {
120
+ // 非 attach 模式 adapter 必填:attach(reaper journal 重放)允许 null——
121
+ // journal 已终态时 adapter 不会被调用。非 attach 传 null 会在真实模型调用时
122
+ // 空指针崩在深水区,这里在装配口给出带上下文的明确错误(审计 2026-10-25:
123
+ // reaper-driver `adapter: null as never` 依赖包内隐式契约,缺显式守卫)。
124
+ if (!params.adapter && params.attach !== true) {
125
+ throw new Error("buildChatStreamWithTools: 非 attach 模式必须提供 adapter")
126
+ }
127
+
101
128
  const nativeSearchTools = buildProviderWebSearchTools(
102
129
  params.providerConfigKind,
103
130
  ) as any[]
@@ -130,6 +157,8 @@ export async function buildChatStreamWithTools(
130
157
  // id:/tmp/tanstack-runs/<runId>.ndjson 需能被后继宿主重算)。harness 路由不
131
158
  // 发送 runId,故在此铸造一次并同步给 chat()——两处必须同源,否则 journal 与
132
159
  // run 记录会对不上。非沙箱请求保持原样(undefined 时由 chat 内部生成)。
160
+ // 客户端提供的 runId 先过形状白名单(见 assertSafeRunId)。
161
+ if (params.runId !== undefined) assertSafeRunId(params.runId)
133
162
  const effectiveRunId = params.runId ?? (params.sandbox ? randomUUID() : undefined)
134
163
 
135
164
  // 1.0 起 chat() 的 threadId 为必填:调用方缺省时由服务端兜底生成
@@ -191,8 +220,12 @@ export async function buildChatStreamWithTools(
191
220
  // effectiveThreadId 已兜底恒有值,沙箱装配实质收敛为 sandbox 开关(1.0 threadId 必填)。
192
221
  if (params.sandbox) {
193
222
  let policyLevel = SANDBOX_DEFAULT_POLICY_LEVEL
194
- const thread = await prisma.chatThread.findUnique({
195
- where: { id: effectiveThreadId },
223
+ // threadId 属主校验(审计 2026-10-25 🟠,与 memory/scope.ts 同一口径):
224
+ // threadId 源自客户端 body,裸按 id 查会读到他人线程的沙箱策略并附着/
225
+ // 复用他人沙箱实例。查不到(含不属于当前用户)一律回落默认档,
226
+ // 不放宽也不报错(与既有「线程不存在回落默认档」行为一致)。
227
+ const thread = await prisma.chatThread.findFirst({
228
+ where: { id: effectiveThreadId, userId: params.userId },
196
229
  select: { sandboxPolicy: true },
197
230
  })
198
231
  if (isSandboxPolicyLevel(thread?.sandboxPolicy)) {
@@ -98,7 +98,9 @@ export type CodeModeReadinessReason = "disabled" | "sandbox-unavailable" | null
98
98
  export interface CodeModeReadiness {
99
99
  enabled: boolean
100
100
  reason: CodeModeReadinessReason
101
- detail?: string
101
+ // 不含 detail:探测失败原因(可含模块路径/Node 版本/原生编译错误等部署细节)
102
+ // 经 code-mode-readiness serverFn 直通客户端,属部署环境泄露面(审计 2026-10-25),
103
+ // 只进服务端日志(见 getCodeModeReadiness)。
102
104
  }
103
105
 
104
106
  export function isCodeModeEnvEnabled(): boolean {
@@ -216,11 +218,8 @@ export async function getCodeModeReadiness(): Promise<CodeModeReadiness> {
216
218
  }
217
219
  const sandbox = await loadSandbox()
218
220
  if (sandbox.kind === "unavailable") {
219
- return {
220
- enabled: false,
221
- reason: "sandbox-unavailable",
222
- detail: sandbox.reason,
223
- }
221
+ console.warn(`[code-mode] readiness: sandbox-unavailable: ${sandbox.reason}`)
222
+ return { enabled: false, reason: "sandbox-unavailable" }
224
223
  }
225
224
  return { enabled: true, reason: null }
226
225
  }
@@ -231,4 +230,9 @@ export function resetCodeModeCacheForTest(): void {
231
230
  warnedSecrets.clear()
232
231
  }
233
232
 
234
- export { setSandboxLoaderForTest, setSandboxRuntimeProbeForTest } from "./sandbox"
233
+ export {
234
+ CODE_MODE_UNSAFE_VM_FALLBACK_ENV_KEY,
235
+ isUnsafeVmFallbackAllowed,
236
+ setSandboxLoaderForTest,
237
+ setSandboxRuntimeProbeForTest,
238
+ } from "./sandbox"
@@ -15,7 +15,7 @@
15
15
  // You should have received a copy of the GNU Affero General Public License
16
16
  // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
 
18
- import { spawnSync } from "node:child_process"
18
+ import { spawn } from "node:child_process"
19
19
  import type { IsolateDriver } from "@tanstack/ai-code-mode"
20
20
 
21
21
  import { createVmIsolateDriver } from "./vm-driver"
@@ -68,6 +68,10 @@ function resolveDriverUrl(): string | null {
68
68
  * 用子进程的退出码/信号判定,宿主进程始终不受影响。
69
69
  *
70
70
  * 探测失败一律降级(跳过深探测、回落到普通工具调用),绝不在宿主进程内执行。
71
+ *
72
+ * 异步 spawn(审计 2026-10-25 🟠):原 spawnSync 最坏阻塞事件循环 20s
73
+ * (DEEP_PROBE_TIMEOUT_MS),生产冷启动后首个请求会拖停该实例全部流量。
74
+ * 探测结果由 loadSandbox 的进程内单例 promise 缓存,每进程至多执行一次。
71
75
  */
72
76
  async function defaultRuntimeProbe(driverUrl: string): Promise<boolean> {
73
77
  const script = `
@@ -89,16 +93,30 @@ if (result.success && result.value === 1) process.exit(0);
89
93
  process.exit(4);
90
94
  `
91
95
  try {
92
- const result = spawnSync(
93
- process.execPath,
94
- ["--input-type=module", "-e", script, driverUrl],
95
- { timeout: DEEP_PROBE_TIMEOUT_MS, encoding: "utf8" },
96
- )
97
- if (result.error) return false
98
- if (result.signal) {
99
- return false
100
- }
101
- return result.status === 0
96
+ return await new Promise<boolean>((resolve) => {
97
+ // 子进程输出仅用于人工排查,不在宿主侧消费,直接丢弃
98
+ const child = spawn(
99
+ process.execPath,
100
+ ["--input-type=module", "-e", script, driverUrl],
101
+ { stdio: "ignore" },
102
+ )
103
+ let settled = false
104
+ const timer = setTimeout(() => {
105
+ child.kill("SIGKILL")
106
+ settle(false)
107
+ }, DEEP_PROBE_TIMEOUT_MS)
108
+ function settle(value: boolean) {
109
+ if (settled) return
110
+ settled = true
111
+ clearTimeout(timer)
112
+ resolve(value)
113
+ }
114
+ child.once("error", () => settle(false))
115
+ child.once("close", (code, signal) => {
116
+ // 与 spawnSync 语义对齐:被信号终止(含本函数超时 kill)一律判不兼容
117
+ settle(signal === null && code === 0)
118
+ })
119
+ })
102
120
  } catch {
103
121
  return false
104
122
  }
@@ -170,18 +188,42 @@ async function probeIsolatedVmDriver(): Promise<SandboxState> {
170
188
  }
171
189
  }
172
190
 
191
+ /** 显式放行 node:vm 兜底的开关(值 "1"/"true");desktop 单用户形态默认放行。 */
192
+ export const CODE_MODE_UNSAFE_VM_FALLBACK_ENV_KEY = "CODE_MODE_ALLOW_UNSAFE_VM_FALLBACK"
193
+
194
+ /**
195
+ * node:vm 不是安全边界(Node 官方:vm 模块不得用于运行不可信代码):沙箱内
196
+ * `({}).constructor.constructor("return process")()` 即取回宿主 process,进而读全部
197
+ * env 密钥 / require child_process(审计 2026-10-25 🔴)。多租户服务端绝不能把它
198
+ * 当隔离层——只允许 desktop(单用户、代码跑在用户自己机器上)或运维显式确认的
199
+ * 场景回落,其余一律视为 sandbox-unavailable(code-mode 关闭,退回普通工具调用)。
200
+ */
201
+ export function isUnsafeVmFallbackAllowed(): boolean {
202
+ if (process.env.DEPLOY_TARGET === "desktop") return true
203
+ const flag = process.env[CODE_MODE_UNSAFE_VM_FALLBACK_ENV_KEY]
204
+ return flag === "1" || flag === "true"
205
+ }
206
+
173
207
  async function probeSandbox(): Promise<SandboxState> {
174
208
  const isolated = await probeIsolatedVmDriver()
175
209
  if (isolated.kind === "ready") return isolated
176
210
 
211
+ if (!isUnsafeVmFallbackAllowed()) {
212
+ console.warn(
213
+ `[code-mode] isolated-vm 不可用,且 node:vm 兜底已禁用(非隔离驱动,仅 desktop 或 ` +
214
+ `${CODE_MODE_UNSAFE_VM_FALLBACK_ENV_KEY}=true 放行):${isolated.reason}`,
215
+ )
216
+ return {
217
+ kind: "unavailable",
218
+ reason: `isolated-vm 不可用且禁止 node:vm 兜底:${isolated.reason}`,
219
+ }
220
+ }
221
+
177
222
  // node:vm 兜底:isolated-vm 原生模块编译失败(托管运行时无 prebuilds)时,
178
- // 用零原生依赖的 node:vm 驱动让编排模式在生产环境可用,而非整体不可用。
179
- console.warn(`[code-mode] isolated-vm 不可用,回落 node:vm 驱动:${isolated.reason}`)
223
+ // 用零原生依赖的 node:vm 驱动让编排模式可用。仅限上方放行场景。
224
+ console.warn(`[code-mode] isolated-vm 不可用,回落 node:vm 驱动(非安全隔离):${isolated.reason}`)
180
225
  try {
181
- const driver = createVmIsolateDriver({
182
- memoryLimit: CODE_MODE_MEMORY_LIMIT_MB,
183
- timeout: CODE_MODE_TIMEOUT_MS,
184
- })
226
+ const driver = createVmIsolateDriver({ timeout: CODE_MODE_TIMEOUT_MS })
185
227
  return { kind: "ready", driver }
186
228
  } catch (err) {
187
229
  return {
@@ -28,23 +28,25 @@ import {
28
28
  } from "@tanstack/ai-code-mode"
29
29
 
30
30
  /**
31
- * node:vm 实现的 IsolateDriver —— 零原生依赖,生产可用。
31
+ * node:vm 实现的 IsolateDriver —— 零原生依赖,但**不是安全沙箱**。
32
32
  *
33
33
  * 存在原因:`@tanstack/ai-isolate-node` 依赖 isolated-vm 原生 addon,
34
34
  * isolated-vm 6.2.0 不带 prebuilds、必须源码编译;托管运行时的工具链无法保证
35
35
  * 编译成功(本机 macOS 27 实测 `fatal error: 'memory' file not found`),导致
36
- * 编排模式在线上恒为不可用。node:vm 是 Node 内建模块,无需编译,任何 Node
37
- * 运行时(Vercel / self-hosted / desktop sidecar)均可用。
36
+ * 编排模式恒为不可用。node:vm 是 Node 内建模块,无需编译。
38
37
  *
39
- * 安全边界与官方 isolated-vm driver 对齐,取舍已注明:
40
- * - 干净上下文:不注入 require / process / Buffer / module / setTimeout / fetch,
41
- * 沙箱内只有 JS 标准内建与白名单工具函数。isolated-vm isolate 同样默认无计时器。
42
- * - CPU 炸弹:runInContext 的运行参数 timeout 按 CPU 时间中止同步死循环。
43
- * - 墙钟超时:async 代码的 await 链需额外 Promise.race 兜底。
44
- * 等价取舍:node:vm 无法在运行中终止 vm 上下文,超时后后台代码理论上仍可继续
45
- * 占用 CPU;用 MAX_TOOL_CALLS_PER_RUN 限制工具调用次数作实际边界(无限 async
46
- * 循环必然反复调用白名单工具,超预算即抛错终止)。isolated-vm 可 terminate
47
- * isolate,这是唯一实质弱化点。
38
+ * 安全边界如实说明(审计 2026-10-25 🔴,此前注释声称「与 isolated-vm 对齐」属误导):
39
+ * - node:vm 的 contextify 不隔离原型链:`({}).constructor.constructor("return process")()`
40
+ * 即取回宿主 process(进而 process.env 全量密钥、process.mainModule.require);注入的
41
+ * external_* 绑定本身就是宿主 realm 的函数对象,`.constructor.constructor` 同样拿到
42
+ * 宿主 Function。Node 官方文档明确 vm 模块不得用于运行不可信代码。
43
+ * - 因此本驱动只允许在 desktop(单用户、代码跑在用户本机)或运维显式开启
44
+ * CODE_MODE_ALLOW_UNSAFE_VM_FALLBACK 时装配(见 sandbox.ts isUnsafeVmFallbackAllowed),
45
+ * 多租户服务端一律不回落。
46
+ * - 不支持 memoryLimit:node:vm 上下文无内存配额,调用方不得假设存在该限制。
47
+ * - 墙钟超时:runInContext 的 timeout 只对同步代码生效;async 代码超时后 execute 提前
48
+ * 返回,但底层 continuation 不会被终止(vm 无法 terminate 上下文),纯计算型 async 循环
49
+ * 可持续占用 CPU;工具调用型循环由 MAX_TOOL_CALLS_PER_RUN 兜底。
48
50
  */
49
51
 
50
52
  const DEFAULT_TIMEOUT_MS = 30_000
@@ -189,9 +191,6 @@ class VmIsolateDriver implements IsolateDriver {
189
191
  }
190
192
  }
191
193
 
192
- export function createVmIsolateDriver(options?: {
193
- timeout?: number
194
- memoryLimit?: number
195
- }): IsolateDriver {
194
+ export function createVmIsolateDriver(options?: { timeout?: number }): IsolateDriver {
196
195
  return new VmIsolateDriver(options?.timeout ?? DEFAULT_TIMEOUT_MS)
197
196
  }
@@ -97,16 +97,17 @@ async function tailRow(runId: string): Promise<ChunkRow | null> {
97
97
 
98
98
  async function appendChunks(runId: string, chunks: DurabilityChunk[]): Promise<string[]> {
99
99
  if (chunks.length === 0) return []
100
- return prisma.$transaction(async (tx) => {
101
- const offsets: string[] = []
102
- for (const chunk of chunks) {
103
- const row = await tx.aiStreamChunk.create({
104
- data: { runId, chunk: toJson(chunk) },
105
- })
106
- offsets.push(String(row.id))
107
- }
108
- return offsets
100
+ // 单语句批量插入(审计 2026-10-25 🟡):替代事务内逐条 create 的 N 次 DB 往返
101
+ // 与长事务持锁。id 由 bigserial 按插入序单调分配,按 id 升序对齐 RETURNING 行,
102
+ // 保证 offsets 与输入 chunks 一一对应(resume 游标 / upsert 连续性校验依赖该顺序)。
103
+ const rows = await prisma.aiStreamChunk.createManyAndReturn({
104
+ data: chunks.map((chunk) => ({ runId, chunk: toJson(chunk) })),
105
+ select: { id: true },
109
106
  })
107
+ return rows
108
+ .map((row) => row.id)
109
+ .sort((a, b) => (a < b ? -1 : a > b ? 1 : 0))
110
+ .map((id) => String(id))
110
111
  }
111
112
 
112
113
  async function closeRun(runId: string): Promise<void> {
@@ -50,6 +50,9 @@ export function buildReaperDrive(): ReapOptions["drive"] | null {
50
50
  const overrides = await resolveOverrides(thread.userId, thread.agentId ?? undefined)
51
51
  const userMessages = [{ role: "user" as const, content: "" }]
52
52
 
53
+ // adapter 传 null 依赖「attach 模式且 journal 已终态时 adapter 不被调用」的
54
+ // 包内契约;buildChatStreamWithTools 已加显式守卫——非 attach 场景传 null
55
+ // 会在装配口抛带上下文的错误,而不是空指针崩在后台 reaper 深水区。
53
56
  const stream = await buildChatStreamWithTools({
54
57
  adapter: null as never,
55
58
  userId: thread.userId,
@@ -19,6 +19,7 @@ import { embed } from "@tanstack/ai"
19
19
  import { createOpenaiEmbedding } from "@tanstack/ai-openai"
20
20
  import type { OpenAIEmbeddingModel } from "@tanstack/ai-openai"
21
21
  import { envApiKey, ENV_OPENAI_API_KEY, ENV_OPENROUTER_API_KEY } from "./env-key"
22
+ import { assertFetchableUrl, isDesktopRuntime } from "@/server/fetch-guard"
22
23
 
23
24
  export const EMBEDDING_MODEL = "text-embedding-3-small" as const
24
25
 
@@ -40,6 +41,13 @@ export async function generateEmbedding(
40
41
  }
41
42
  const baseURL =
42
43
  opts?.baseUrl ?? (envApiKey(ENV_OPENAI_API_KEY) ? undefined : OPENROUTER_BASE_URL)
44
+ // SEC-08:opts.baseUrl 来自用户 provider 配置(knowledge-index-utils
45
+ // resolveAiConfig 返回 cfg.baseUrl,与 adapter.ts 同一 SSRF 面),进 adapter
46
+ // 前统一出口校验;OPENROUTER_BASE_URL 为内置常量、env 路径为运维配置,均无需校验。
47
+ // 桌面端单机形态放行本地 embedding 服务。
48
+ if (opts?.baseUrl) {
49
+ assertFetchableUrl(opts.baseUrl, { allowPrivate: isDesktopRuntime() })
50
+ }
43
51
  const model = (
44
52
  baseURL ? `openai/${EMBEDDING_MODEL}` : EMBEDDING_MODEL
45
53
  ) as OpenAIEmbeddingModel
@@ -54,8 +62,15 @@ export async function generateEmbedding(
54
62
  return vector
55
63
  }
56
64
 
65
+ // 分句正则:终止符含中英文句读(。!?);第二分支兜住结尾无终止符的尾段。
66
+ // 两个分支并集覆盖全部字符——任何非空输入都不会被静默丢弃(审计 2026-10-25:
67
+ // 旧正则 /[^.!?]+[.!?]+/g 只捕获以终止符结尾的片段,"Intro. body without final
68
+ // period" 的尾段不入向量库,检索永远召回不到;中文句读不在终止符类中,纯中文
69
+ // 长文会整篇成单 chunk 使 chunkSize 失效)。
70
+ const SENTENCE_RE = /[^.!?。!?]*[.!?。!?]+|[^.!?。!?]+/g
71
+
57
72
  export function chunkText(text: string, chunkSize = 500): string[] {
58
- const sentences = text.match(/[^.!?]+[.!?]+/g) || [text]
73
+ const sentences = text.match(SENTENCE_RE) || [text]
59
74
  const chunks: string[] = []
60
75
  let current = ""
61
76
  for (const s of sentences) {
@@ -63,9 +78,14 @@ export function chunkText(text: string, chunkSize = 500): string[] {
63
78
  chunks.push(current.trim())
64
79
  current = s
65
80
  } else {
66
- current += " " + s
81
+ // 分句 token 自带句间空白(正则前导段消费空白字符),直接拼接即可
82
+ // 无损还原原文,不再额外插空格(中文文本插空格属噪声)。
83
+ current += s
67
84
  }
68
85
  }
69
86
  if (current.trim()) chunks.push(current.trim())
70
87
  return chunks
88
+ // 维度/模型契约不变(1536,text-embedding-3-small),本函数只改分块。
89
+ // ⚠ 存量索引按旧分块落库,新分块仅影响增量索引——新旧 chunk 边界不一致
90
+ // 属预期;对检索质量有疑虑的库走既有重索引链路全量重建。
71
91
  }
@@ -17,6 +17,7 @@
17
17
 
18
18
  import { z } from "zod"
19
19
  import { resolveSystemPrompt } from "./prompts/registry"
20
+ import { fenceLlmData } from "./llm-fence"
20
21
 
21
22
  export interface LabelSuggestionInput {
22
23
  name: string
@@ -32,6 +33,10 @@ export interface LabelSuggestionResult {
32
33
  const MAX_TOTAL = 5
33
34
  const MAX_NEW_NAME_CHARS = 4
34
35
  const MAX_DESCRIPTION_CHARS = 2000
36
+ // 需求名 / 标签名同为用户可控自由文本:长度截断 + fence(审计 2026-10-25:
37
+ // description 有截断而 name / 标签名列表裸拼,可携带超长内容或提示词注入)
38
+ const MAX_NAME_CHARS = 200
39
+ const MAX_LABEL_NAMES = 30
35
40
 
36
41
  /** 元素级保持 unknown 宽容(既有非 string 项 continue 跳过语义),仅校验对象形状 */
37
42
  const labelSuggestionSchema = z
@@ -44,8 +49,13 @@ const labelSuggestionSchema = z
44
49
  export async function buildLabelSuggestSystemPrompt(
45
50
  availableLabels: string[],
46
51
  ): Promise<string[]> {
52
+ // 标签名过围栏后再拼进系统提示词(防换行/伪指令形态的提示词注入),
53
+ // 与 user message 侧 currentLabels 的防护口径一致
54
+ const joined = availableLabels.length > 0
55
+ ? fenceLlmData("available_labels", availableLabels.slice(0, MAX_LABEL_NAMES).join("、"))
56
+ : "(暂无)"
47
57
  return resolveSystemPrompt("story.label-suggest", {
48
- availableLabels: availableLabels.length > 0 ? availableLabels.join("、") : "(暂无)",
58
+ availableLabels: joined,
49
59
  })
50
60
  }
51
61
 
@@ -53,11 +63,12 @@ export function buildLabelSuggestUserMessage(input: LabelSuggestionInput): strin
53
63
  const desc = input.description
54
64
  ? input.description.slice(0, MAX_DESCRIPTION_CHARS)
55
65
  : undefined
66
+ const name = input.name.slice(0, MAX_NAME_CHARS)
56
67
  const current =
57
68
  input.currentLabelNames && input.currentLabelNames.length > 0
58
- ? `\n当前已选标签(不要重复推荐):${input.currentLabelNames.join("、")}`
69
+ ? `\n当前已选标签(不要重复推荐):${fenceLlmData("current_labels", input.currentLabelNames.slice(0, MAX_LABEL_NAMES).join("、"))}`
59
70
  : ""
60
- return `需求名称:${input.name}\n需求描述:${desc ?? "无"}${current}`
71
+ return `需求名称:${name}\n需求描述:${desc ?? "无"}${current}`
61
72
  }
62
73
 
63
74
  function stripCodeFence(raw: string): string {
@@ -0,0 +1,61 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // AllBlue - 理想之海
3
+ // Copyright (C) 2026 AllBlue Contributors
4
+ //
5
+ // This program is free software: you can redistribute it and/or modify
6
+ // it under the terms of the GNU Affero General Public License as published by
7
+ // the Free Software Foundation, either version 3 of the License, or
8
+ // (at your option) any later version.
9
+ //
10
+ // This program is distributed in the hope that it will be useful,
11
+ // but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ // GNU Affero General Public License for more details.
14
+ //
15
+ // You should have received a copy of the GNU Affero General Public License
16
+ // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+
18
+ // 日志脱敏(审计 2026-10-25):provider/HTTP 层错误 message 常把完整 URL 嵌进
19
+ // 文本(fetch failed / invalid URL),gemini 的 `?key=`、openai 的 `sk-` 随之进
20
+ // 服务端日志,日志聚合后成为第二泄露面。规则与 ai-output-guard 同源思路,但
21
+ // 方向相反:这里是「写日志前抹除」,命中即替换为占位符。
22
+
23
+ /** 每条规则命中后替换为 `[REDACTED:<type>]` */
24
+ const REDACT_RULES: Array<{ type: string; pattern: RegExp }> = [
25
+ // openai / openrouter / anthropic 形态密钥(含 URL 里的裸 key)
26
+ { type: "api-key", pattern: /\bsk-(?:proj-|ant-|or-)?[A-Za-z0-9_-]{16,}\b/g },
27
+ // gemini 官方鉴权风格 ?key=<apiKey>(connectivity-check / 探活 URL)
28
+ { type: "url-key-param", pattern: /([?&]key=)[^&\s'"]+/gi },
29
+ // Bearer token / JWT
30
+ { type: "bearer", pattern: /\bBearer\s+[A-Za-z0-9._-]{16,}\b/g },
31
+ { type: "jwt", pattern: /\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]*/g },
32
+ // 数据库连接串(postgres://user:pass@host/...)
33
+ { type: "db-connection", pattern: /\b(?:postgres(?:ql)?|mysql|redis):\/\/[^\s"']+/g },
34
+ ]
35
+
36
+ /**
37
+ * 对将写入日志的文本做密钥形态脱敏。纯函数;规则带 g flag,
38
+ * 每次调用前复位 lastIndex 保证结果稳定。
39
+ */
40
+ export function redactSecretsForLog(input: unknown): string {
41
+ const text =
42
+ input instanceof Error
43
+ ? input.stack ?? `${input.name}: ${input.message}`
44
+ : typeof input === "string"
45
+ ? input
46
+ : (() => {
47
+ try {
48
+ return JSON.stringify(input) ?? String(input)
49
+ } catch {
50
+ return String(input)
51
+ }
52
+ })()
53
+ let out = text
54
+ for (const rule of REDACT_RULES) {
55
+ rule.pattern.lastIndex = 0
56
+ out = out.replace(rule.pattern, (match: string, prefix?: string) =>
57
+ prefix ? `${prefix}[REDACTED:${rule.type}]` : `[REDACTED:${rule.type}]`,
58
+ )
59
+ }
60
+ return out
61
+ }
@@ -44,6 +44,7 @@ import { createGrokTranscription } from "@tanstack/ai-grok"
44
44
  import { createBytePlusTranscription } from "@tanstack/ai-byteplus"
45
45
  import { falTranscription } from "@tanstack/ai-fal"
46
46
  import type { AnyImageAdapter, AnyVideoAdapter, AnyTTSAdapter, AnyTranscriptionAdapter } from "@tanstack/ai"
47
+ import { assertFetchableUrl, isDesktopRuntime } from "@/server/fetch-guard"
47
48
 
48
49
  // 单一事实源:AdapterKind 由 @allbluecn/kernel 定义。
49
50
  // 媒体生成实际只支持 kernel AdapterKind 的子集("openai" | "gemini" | "grok" | "byteplus" | "fal"),
@@ -86,6 +87,18 @@ function isMediaAdapterKind(kind: string): kind is MediaAdapterKind {
86
87
  return MEDIA_ADAPTER_KINDS.has(kind as MediaAdapterKind)
87
88
  }
88
89
 
90
+ /**
91
+ * SEC-08:媒体生成 adapter 的 baseURL / voiceBaseUrl 出口校验(与 connectivity-check、
92
+ * adapter.ts 同一口径)。两者均来自用户 provider 配置(含 byteplus 独立 voice 主机),
93
+ * 服务端将以该 URL 为目标 fetch 并携带 apiKey——云端严拦私网/回环/云元数据;
94
+ * 桌面端单机形态放行本地服务。违规抛 FetchGuardError(fail-closed),
95
+ * 由调用方(generate*ForUser)冒泡为生成失败。
96
+ */
97
+ function assertMediaBaseUrl(url: string | undefined): void {
98
+ if (!url) return
99
+ assertFetchableUrl(url, { allowPrivate: isDesktopRuntime() })
100
+ }
101
+
89
102
  /**
90
103
  * fal adapter 采用方案 B:仅支持 env `FAL_KEY`,不接受用户自定义 apiKey。
91
104
  * `@tanstack/ai-fal@0.14.1` 内部通过 `configureFalClient()` 全局态维护 key,
@@ -113,6 +126,7 @@ export function resolveImageAdapter(opts: ResolveAdapterOptions): ImageAdapterRe
113
126
  const { adapterKind, apiKey, model, baseURL } = opts
114
127
 
115
128
  if (!isMediaAdapterKind(adapterKind)) return { kind: "unavailable" }
129
+ assertMediaBaseUrl(baseURL)
116
130
  switch (adapterKind) {
117
131
  case "openai":
118
132
  return createOpenaiImage(model as Parameters<typeof createOpenaiImage>[0], apiKey, baseURL ? { baseURL } : undefined) as ImageAdapterResult
@@ -138,6 +152,7 @@ export function resolveVideoAdapter(opts: ResolveAdapterOptions): VideoAdapterRe
138
152
  const { adapterKind, apiKey, model, baseURL } = opts
139
153
 
140
154
  if (!isMediaAdapterKind(adapterKind)) return { kind: "unavailable" }
155
+ assertMediaBaseUrl(baseURL)
141
156
  switch (adapterKind) {
142
157
  case "openai":
143
158
  return createOpenaiVideo(model as Parameters<typeof createOpenaiVideo>[0], apiKey, baseURL ? { baseURL } : undefined) as VideoAdapterResult
@@ -165,6 +180,8 @@ export function resolveSpeechAdapter(opts: ResolveAdapterOptions): SpeechAdapter
165
180
  const { adapterKind, apiKey, model, baseURL, voiceBaseUrl, voiceApiKey } = opts
166
181
 
167
182
  if (!isMediaAdapterKind(adapterKind)) return { kind: "unavailable" }
183
+ assertMediaBaseUrl(baseURL)
184
+ assertMediaBaseUrl(voiceBaseUrl)
168
185
  switch (adapterKind) {
169
186
  case "openai":
170
187
  return createOpenaiSpeech(model as Parameters<typeof createOpenaiSpeech>[0], apiKey, baseURL ? { baseURL } : undefined) as SpeechAdapterResult
@@ -196,6 +213,8 @@ export function resolveTranscriptionAdapter(opts: ResolveAdapterOptions): Transc
196
213
  const { adapterKind, apiKey, model, baseURL, voiceBaseUrl, voiceApiKey } = opts
197
214
 
198
215
  if (!isMediaAdapterKind(adapterKind)) return { kind: "unavailable" }
216
+ assertMediaBaseUrl(baseURL)
217
+ assertMediaBaseUrl(voiceBaseUrl)
199
218
  switch (adapterKind) {
200
219
  case "openai":
201
220
  return createOpenaiTranscription(model as Parameters<typeof createOpenaiTranscription>[0], apiKey, baseURL ? { baseURL } : undefined) as TranscriptionAdapterResult
@@ -201,8 +201,27 @@ export async function generateSpeechForUser(opts: MediaGenOptions & { text: stri
201
201
 
202
202
  type TranscriptionArtifact = PersistedArtifactRef & { audioBlobRef?: string; content?: string }
203
203
 
204
+ // 转写音频入参上限(与 MAX_IMAGE_BYTES 同量级):string(data URL)/File/Blob/
205
+ // ArrayBuffer 均先在服务端缓冲再转发 provider,无上限即可被大载荷打满内存
206
+ // (审计 2026-10-25 🟡)。
207
+ const MAX_TRANSCRIPTION_AUDIO_BYTES = 25 * 1024 * 1024
208
+
209
+ function assertAudioSize(audio: string | File | Blob | ArrayBuffer): void {
210
+ const size =
211
+ typeof audio === "string"
212
+ ? Math.floor((audio.length * 3) / 4) // data URL base64 近似还原字节数
213
+ : audio instanceof Blob
214
+ ? audio.size
215
+ : audio.byteLength
216
+ if (!Number.isFinite(size) || size <= 0) throw new Error("Empty audio")
217
+ if (size > MAX_TRANSCRIPTION_AUDIO_BYTES) {
218
+ throw new Error("Audio too large")
219
+ }
220
+ }
221
+
204
222
  export async function generateTranscriptionForUser(opts: MediaGenOptions & { audio: string | File | Blob | ArrayBuffer; language?: string; prompt?: string; audioBlobRef?: string; mimeType?: string }) {
205
223
  await requireThread(opts)
224
+ assertAudioSize(opts.audio)
206
225
  const adapter = resolveTranscriptionAdapter(opts)
207
226
  if (adapter.kind === "unavailable") throw new Error(`Transcription is not available for adapter kind: ${opts.adapterKind}`)
208
227
  const runId = randomUUID()
@@ -41,7 +41,9 @@ export interface RecordGenerationRunInput {
41
41
  }
42
42
 
43
43
  function toJson(value: unknown): Prisma.InputJsonValue {
44
- return value as unknown as Prisma.InputJsonValue
44
+ // round-trip 剥掉 undefined 字段与 class 外壳(Date/Map 等),与 media/index.ts
45
+ // 及 pg-stream 的落库口径一致——直通断言会把运行时校验错拖到 Prisma 层才爆。
46
+ return JSON.parse(JSON.stringify(value)) as Prisma.InputJsonValue
45
47
  }
46
48
 
47
49
  /** 终态写入 finishedAt(与 startedAt 同值,二者成对才有时长可算)。 */
@@ -96,11 +96,9 @@ export function createPgVectorMemoryAdapter(
96
96
  userId: string,
97
97
  limit: number,
98
98
  ): Promise<Array<StoredFactRow>> {
99
- return (await prisma.$queryRawUnsafe(
100
- `SELECT "id", "content", "threadId", "createdAt" FROM "memory_facts" WHERE "userId" = $1 ORDER BY "createdAt" DESC LIMIT $2`,
101
- userId,
102
- limit,
103
- )) as Array<StoredFactRow>
99
+ return (await prisma.$queryRaw<Array<StoredFactRow>>`
100
+ SELECT "id", "content", "threadId", "createdAt" FROM "memory_facts" WHERE "userId" = ${userId} ORDER BY "createdAt" DESC LIMIT ${limit}`
101
+ )
104
102
  }
105
103
 
106
104
  async function searchFacts(
@@ -110,20 +108,15 @@ export function createPgVectorMemoryAdapter(
110
108
  const embedding = await generateEmbedding(query)
111
109
  if (!Array.isArray(embedding) || embedding.length === 0) return []
112
110
  const embeddingStr = formatVector(embedding)
113
- return (await prisma.$queryRawUnsafe(
114
- `SELECT "id", "content", "threadId", "createdAt", 1 - (embedding <=> $1::vector) AS similarity FROM "memory_facts" WHERE "userId" = $2 ORDER BY embedding <=> $3::vector LIMIT $4`,
115
- embeddingStr,
116
- userId,
117
- embeddingStr,
118
- candidateLimit,
119
- )) as Array<StoredFactRow>
111
+ return (await prisma.$queryRaw<Array<StoredFactRow>>`
112
+ SELECT "id", "content", "threadId", "createdAt", 1 - (embedding <=> ${embeddingStr}::vector) AS similarity
113
+ FROM "memory_facts" WHERE "userId" = ${userId} ORDER BY embedding <=> ${embeddingStr}::vector LIMIT ${candidateLimit}`
114
+ )
120
115
  }
121
116
 
122
117
  async function countFacts(userId: string): Promise<MemoryStatsRow> {
123
- const rows = (await prisma.$queryRawUnsafe(
124
- `SELECT COUNT(*)::int AS "c", COALESCE(MAX("createdAt"), NOW()) AS "lastWrite" FROM "memory_facts" WHERE "userId" = $1`,
125
- userId,
126
- )) as Array<MemoryStatsRow>
118
+ const rows = await prisma.$queryRaw<Array<MemoryStatsRow>>`
119
+ SELECT COUNT(*)::int AS "c", COALESCE(MAX("createdAt"), NOW()) AS "lastWrite" FROM "memory_facts" WHERE "userId" = ${userId}`
127
120
  return rows[0] ?? { c: 0, lastWrite: null }
128
121
  }
129
122
 
@@ -184,14 +177,9 @@ export function createPgVectorMemoryAdapter(
184
177
  return [{ ok: false, error: "embedding returned an empty vector" }]
185
178
  }
186
179
  const id = randomUUID()
187
- await prisma.$executeRawUnsafe(
188
- `INSERT INTO "memory_facts" ("id", "userId", "threadId", "content", "embedding") VALUES ($1, $2, $3, $4, $5::vector)`,
189
- id,
190
- scope.userId,
191
- scope.threadId,
192
- content,
193
- formatVector(embedding),
194
- )
180
+ await prisma.$executeRaw`
181
+ INSERT INTO "memory_facts" ("id", "userId", "threadId", "content", "embedding")
182
+ VALUES (${id}, ${scope.userId}, ${scope.threadId}, ${content}, ${formatVector(embedding)}::vector)`
195
183
  return [
196
184
  {
197
185
  ok: true,