@allbluecn/web-app 0.9.1 → 0.9.3

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 (228) hide show
  1. package/package.json +32 -35
  2. package/src/__tests__/components/reference-inline.test.tsx +1 -1
  3. package/src/components/agents/agents-page.tsx +1 -1
  4. package/src/components/animated-icons/layout-panel-top.tsx +1 -1
  5. package/src/components/auth/auth-layout.tsx +1 -1
  6. package/src/components/devtools/ai-chat-panel.tsx +54 -0
  7. package/src/components/devtools/devtools-panel.tsx +100 -0
  8. package/src/components/{ui-shared/skeleton.tsx → devtools/index.ts} +3 -13
  9. package/src/components/devtools/session-panel.tsx +102 -0
  10. package/src/components/knowledge/dialog/knowledge-form-dialog.tsx +1 -1
  11. package/src/components/knowledge/editor/doc-header.tsx +1 -1
  12. package/src/components/knowledge-public/sharers-avatar-group.tsx +1 -1
  13. package/src/components/layout/sidebar-03/__tests__/nav-workspace.test.tsx +1 -1
  14. package/src/components/layout/sidebar-03/app-sidebar.tsx +1 -1
  15. package/src/components/layout/sidebar-03/nav-workspace.tsx +1 -1
  16. package/src/components/layout/sidebar-03/user-menu.tsx +1 -1
  17. package/src/components/magicui/animated-theme-toggler.tsx +1 -1
  18. package/src/components/magicui/grid-pattern.tsx +1 -1
  19. package/src/components/project/create-project-dialog.tsx +1 -1
  20. package/src/components/project/invite-member-dialog.tsx +1 -1
  21. package/src/components/project/project-activity-list.tsx +1 -1
  22. package/src/components/project/project-member-manager.tsx +1 -1
  23. package/src/components/settings/personal-team/account/avatar/notion-avatar.tsx +2 -2
  24. package/src/components/settings/personal-team/team/team-member-list.tsx +1 -1
  25. package/src/components/shadcn-space/blocks/hero-01/header.tsx +1 -1
  26. package/src/components/{ui-shared → shared-kit/auth}/auth-layout.tsx +1 -1
  27. package/src/components/{ui-shared → shared-kit/decorative}/grid-pattern.tsx +1 -1
  28. package/src/components/{ui-shared → shared-kit/dialogs}/name-confirm-dialog.tsx +6 -5
  29. package/src/components/{shared → shared-kit/icons}/__tests__/lucide-curated-icons.test.ts +2 -2
  30. package/src/components/{shared → shared-kit/icons}/__tests__/lucide-icon-data.test.ts +1 -1
  31. package/src/components/{shared → shared-kit/icons}/__tests__/lucide-icon-picker.test.tsx +5 -5
  32. package/src/components/{ui-shared → shared-kit}/index.ts +9 -6
  33. package/src/components/{ui-shared → shared-kit/layout}/layout-panel-top.tsx +1 -1
  34. package/src/components/{ui-shared → shared-kit/navigation}/nav-float-button.tsx +2 -2
  35. package/src/components/{ui-shared → shared-kit/theme}/animated-theme-toggler.tsx +1 -1
  36. package/src/components/story/columns.tsx +1 -1
  37. package/src/components/story/create-story-dialog.tsx +2 -2
  38. package/src/components/story/detail/__tests__/activity-timeline.test.tsx +1 -1
  39. package/src/components/story/detail/activity-timeline.tsx +2 -2
  40. package/src/components/story/detail/comment-item.tsx +1 -1
  41. package/src/components/story/detail/story-detail-body.tsx +2 -2
  42. package/src/components/story/detail/story-detail-toolbar/associated-attachments-panel.tsx +1 -1
  43. package/src/components/story/display/group-resolver.tsx +2 -2
  44. package/src/components/story/filters/applied-filters.tsx +1 -1
  45. package/src/components/story/inline-editors/assignee-editor.tsx +1 -1
  46. package/src/components/story/inline-editors/story-select-dialog.tsx +1 -1
  47. package/src/components/story/relations/story-ref-row.tsx +2 -2
  48. package/src/components/story/story-panel-header.tsx +1 -1
  49. package/src/components/story/story-toolbar.tsx +1 -1
  50. package/src/components/story/transfer-story-popover.tsx +1 -1
  51. package/src/components/story/views/create-view-dialog.tsx +1 -1
  52. package/src/components/story/views/kanban-card.tsx +1 -1
  53. package/src/components/story/views/story-list/index.tsx +1 -1
  54. package/src/components/story/views/story-list/inline-story-creator.tsx +1 -1
  55. package/src/components/tiptap/mindmap/mind-map.tsx +2 -2
  56. package/src/components/tiptap/mindmap/mindmap-fullscreen-dialog.tsx +1 -1
  57. package/src/components/tiptap/node/annotation-node/annotation-node-view.tsx +1 -1
  58. package/src/components/tiptap/node/doc-card-extension.tsx +2 -2
  59. package/src/components/tiptap/notion-like/notion-like-editor-header.tsx +2 -2
  60. package/src/components/tiptap/ui/doc-reference-interaction/doc-reference-interaction.tsx +2 -2
  61. package/src/components/tiptap/ui/mention-dropdown-menu/mention-dropdown-menu.tsx +2 -2
  62. package/src/components/tiptap/ui/reference-dropdown-menu/reference-dropdown-menu.tsx +1 -1
  63. package/src/components/tiptap/ui/slash-dropdown-menu/slash-dropdown-menu.tsx +1 -1
  64. package/src/components/ui/alert-dialog.tsx +216 -1
  65. package/src/components/ui/badge.tsx +66 -1
  66. package/src/components/ui/button.tsx +84 -1
  67. package/src/components/ui/card.tsx +120 -1
  68. package/src/components/ui/checkbox.tsx +50 -1
  69. package/src/components/ui/context-menu.tsx +280 -1
  70. package/src/components/ui/dialog.tsx +183 -1
  71. package/src/components/ui/dropdown-menu.tsx +286 -1
  72. package/src/components/ui/empty.tsx +121 -1
  73. package/src/components/ui/input.tsx +36 -1
  74. package/src/components/ui/label.tsx +39 -1
  75. package/src/components/ui/popover.tsx +106 -1
  76. package/src/components/ui/resizable.tsx +67 -1
  77. package/src/components/ui/select.tsx +207 -1
  78. package/src/components/ui/sidebar.tsx +708 -1
  79. package/src/components/ui/skeleton.tsx +30 -1
  80. package/src/components/ui/sonner.tsx +37 -1
  81. package/src/components/ui/switch.tsx +48 -1
  82. package/src/components/ui/textarea.tsx +35 -1
  83. package/src/components/ui/tooltip.tsx +72 -1
  84. package/src/components/workspace/create-workspace-dialog.tsx +1 -1
  85. package/src/lib/auth/auth-client.ts +1 -1
  86. package/src/lib/changelog/sdk-versions.ts +10 -3
  87. package/src/lib/perf.ts +1 -1
  88. package/src/lib/utils.ts +6 -1
  89. package/src/plugins/core/inspiration/pages/inspiration-page.tsx +1 -1
  90. package/src/plugins/core/inspiration/ui.tsx +1 -1
  91. package/src/plugins/core/prd/components/agent-input.tsx +3 -3
  92. package/src/plugins/core/prd/components/component-editor/collapsible-section.tsx +1 -1
  93. package/src/plugins/core/prd/components/component-editor/content-section.tsx +3 -3
  94. package/src/plugins/core/prd/components/component-editor/style-fields.tsx +3 -3
  95. package/src/plugins/core/prd/components/component-thumbnail.tsx +1 -1
  96. package/src/plugins/core/prd/components/dialog/create-prd-dialog.tsx +3 -3
  97. package/src/plugins/core/prd/components/dialog/prd-detail-client.tsx +4 -4
  98. package/src/plugins/core/prd/components/page-version-panel/components/create-version-dialog.tsx +2 -2
  99. package/src/plugins/core/prd/components/page-version-panel/components/delete-version-dialog.tsx +2 -2
  100. package/src/plugins/core/prd/components/page-version-panel/components/edit-version-dialog.tsx +2 -2
  101. package/src/plugins/core/prd/components/page-version-panel.tsx +9 -9
  102. package/src/plugins/core/prd/components/page-version-tree.tsx +5 -5
  103. package/src/plugins/core/prd/components/prd-agent-panel.tsx +3 -3
  104. package/src/plugins/core/prd/components/prd-comment-review-panel.tsx +7 -7
  105. package/src/plugins/core/prd/components/prd-component-editor-content.tsx +2 -2
  106. package/src/plugins/core/prd/components/prd-dashboard.tsx +8 -8
  107. package/src/plugins/core/prd/components/prd-doc-panel.tsx +2 -2
  108. package/src/plugins/core/prd/components/prd-editor-layout.tsx +4 -4
  109. package/src/plugins/core/prd/components/prd-filter-bar.tsx +1 -1
  110. package/src/plugins/core/prd/components/prd-left-sidebar.tsx +4 -4
  111. package/src/plugins/core/prd/components/prd-navigation.tsx +6 -6
  112. package/src/plugins/core/prd/components/prd-prototype-panel.tsx +2 -2
  113. package/src/plugins/core/prd/components/prd-right-sidebar.tsx +3 -3
  114. package/src/plugins/core/prd/components/prd-share-panel/components/single-version-share-card.tsx +7 -7
  115. package/src/plugins/core/prd/components/prd-share-panel.tsx +10 -10
  116. package/src/plugins/core/prd/components/prd-tree-page-tab.tsx +5 -5
  117. package/src/plugins/core/prd/components/prototype/PrototypeCanvas.tsx +2 -2
  118. package/src/plugins/core/prd/components/restore-version-dialog.tsx +2 -2
  119. package/src/plugins/core/prd/components/share/prd-share-client.tsx +1 -1
  120. package/src/plugins/core/prd/components/share/share-comment-panel.tsx +6 -6
  121. package/src/plugins/core/prd/components/share/share-comment-review-panel.tsx +2 -2
  122. package/src/plugins/core/prd/components/share/share-layout.tsx +1 -1
  123. package/src/plugins/core/prd/components/share/share-nav-bar.tsx +4 -4
  124. package/src/plugins/core/prd/components/share/share-password-gate.tsx +4 -4
  125. package/src/plugins/core/prd/components/share/share-prototype-view.tsx +1 -1
  126. package/src/plugins/core/prd/components/share/share-review-panel.tsx +5 -5
  127. package/src/plugins/core/prd/components/share/share-theme-toggle.tsx +1 -1
  128. package/src/plugins/core/prd/components/share/version-share-client.tsx +1 -1
  129. package/src/plugins/core/prd/pages/prd-detail-page.tsx +2 -2
  130. package/src/plugins/core/prd/pages/share-prd-page.tsx +1 -1
  131. package/src/plugins/core/prd/prd-nav.tsx +1 -1
  132. package/src/plugins/core/tags/nav-tag.tsx +7 -7
  133. package/src/plugins/core/tags/pages/tag-detail-page.tsx +1 -1
  134. package/src/plugins/core/tags/tag-badge.tsx +2 -2
  135. package/src/plugins/core/tags/tag-color-picker.tsx +1 -1
  136. package/src/plugins/core/tags/tag-manager.tsx +6 -6
  137. package/src/plugins/core/tags/tag-selector.tsx +3 -3
  138. package/src/providers/index.tsx +1 -1
  139. package/src/providers/timezone-provider.tsx +1 -1
  140. package/src/routes/__root.tsx +1 -1
  141. package/src/routes/_nav/acceptance-criteria/route.tsx +1 -1
  142. package/src/routes/_nav/apps/anyhub/$id/route.tsx +1 -1
  143. package/src/routes/_nav/apps/anyhub/route.tsx +1 -1
  144. package/src/routes/_nav/bugs/route.tsx +1 -1
  145. package/src/routes/_nav/dashboard/-components/avatar-group.tsx +1 -1
  146. package/src/routes/_nav/dashboard/route.lazy.tsx +1 -1
  147. package/src/routes/_nav/knowledge/$kbId/doc/$docId/route.lazy.tsx +1 -1
  148. package/src/routes/_nav/knowledge/index.lazy.tsx +1 -1
  149. package/src/routes/_nav/notion-like/route.tsx +1 -1
  150. package/src/routes/_nav/pricing-02/route.tsx +1 -1
  151. package/src/routes/_nav/projects/$projectId/$storyId/route.lazy.tsx +1 -1
  152. package/src/routes/_nav/projects/$projectId/index.lazy.tsx +3 -3
  153. package/src/routes/_nav/projects/$projectId/iterations/index.lazy.tsx +1 -1
  154. package/src/routes/_nav/projects/$projectId/settings/route.lazy.tsx +3 -3
  155. package/src/routes/_nav/route.lazy.tsx +1 -1
  156. package/src/routes/_nav/settings/general/route.lazy.tsx +1 -1
  157. package/src/routes/_nav/test-cases/route.tsx +1 -1
  158. package/src/routes/_nav/workspaces/$workspaceId/route.lazy.tsx +1 -1
  159. package/src/routes/_nav/workspaces/$workspaceId/settings/route.lazy.tsx +2 -2
  160. package/src/routes/_nav/workspaces/index.lazy.tsx +1 -1
  161. package/src/routes/invite/$token/route.lazy.tsx +1 -1
  162. package/src/server/__tests__/agent-client-graph.test.ts +1 -1
  163. package/src/components/shared/name-confirm-dialog.tsx +0 -1
  164. package/src/components/shared/nav-float-button.tsx +0 -1
  165. package/src/components/shared/placeholder-page.tsx +0 -1
  166. package/src/components/ui-shared/alert-dialog.tsx +0 -216
  167. package/src/components/ui-shared/avatar.tsx +0 -129
  168. package/src/components/ui-shared/badge.tsx +0 -66
  169. package/src/components/ui-shared/button.tsx +0 -84
  170. package/src/components/ui-shared/card.tsx +0 -120
  171. package/src/components/ui-shared/checkbox.tsx +0 -50
  172. package/src/components/ui-shared/context-menu.tsx +0 -280
  173. package/src/components/ui-shared/dialog.tsx +0 -183
  174. package/src/components/ui-shared/dropdown-menu.tsx +0 -286
  175. package/src/components/ui-shared/empty.tsx +0 -121
  176. package/src/components/ui-shared/input.tsx +0 -36
  177. package/src/components/ui-shared/item.tsx +0 -213
  178. package/src/components/ui-shared/kbd.tsx +0 -33
  179. package/src/components/ui-shared/label.tsx +0 -39
  180. package/src/components/ui-shared/popover.tsx +0 -106
  181. package/src/components/ui-shared/resizable.tsx +0 -67
  182. package/src/components/ui-shared/select.tsx +0 -207
  183. package/src/components/ui-shared/separator.tsx +0 -45
  184. package/src/components/ui-shared/sheet.tsx +0 -164
  185. package/src/components/ui-shared/sidebar.tsx +0 -708
  186. package/src/components/ui-shared/sonner.tsx +0 -37
  187. package/src/components/ui-shared/switch.tsx +0 -48
  188. package/src/components/ui-shared/textarea.tsx +0 -35
  189. package/src/components/ui-shared/tooltip.tsx +0 -72
  190. package/src/components/ui-shared/utils.ts +0 -6
  191. package/src/lib/utils.d.ts +0 -1
  192. package/src/plugins/.gen-manifest.json +0 -13
  193. package/src/plugins/modules.gen.ts +0 -20
  194. package/src/plugins/plugins.gen.ts +0 -20
  195. package/src/plugins/ui.gen.ts +0 -8
  196. package/src/routes/_nav/inspiration/route.tsx +0 -8
  197. package/src/routes/_nav/prd/$id/route.tsx +0 -9
  198. package/src/routes/_nav/prd/index.tsx +0 -9
  199. package/src/routes/_nav/prd/route.tsx +0 -8
  200. package/src/routes/_nav/tags/$id/route.tsx +0 -8
  201. package/src/routes/_nav/tags/index.tsx +0 -8
  202. package/src/routes/_nav/tags/route.tsx +0 -8
  203. package/src/routes/_nav/tags/settings/route.tsx +0 -9
  204. package/src/routes/share/prd/$prdId/route.tsx +0 -10
  205. package/src/types/open-file-viewer.d.ts +0 -14
  206. /package/src/components/{ui-shared → shared-kit/ai}/ai-command-button.tsx +0 -0
  207. /package/src/components/{ui-shared → shared-kit/ai}/ai-stream-text.tsx +0 -0
  208. /package/src/components/{ui-shared → shared-kit/auth}/auth-client.ts +0 -0
  209. /package/src/components/{ui-shared → shared-kit/avatars}/notion-avatar.tsx +0 -0
  210. /package/src/components/{ui-shared → shared-kit/avatars}/user-avatar.tsx +0 -0
  211. /package/src/components/{shared → shared-kit/data-viz}/contribution-graph-tooltip.tsx +0 -0
  212. /package/src/components/{shared → shared-kit/dev}/component-preview.tsx +0 -0
  213. /package/src/components/{ui-shared → shared-kit/hooks}/use-mobile.ts +0 -0
  214. /package/src/components/{shared → shared-kit/i18n}/language-switcher.tsx +0 -0
  215. /package/src/components/{shared → shared-kit/i18n}/translator-text.tsx +0 -0
  216. /package/src/components/{shared → shared-kit/icons}/lucide-icon-picker/curated-icons.ts +0 -0
  217. /package/src/components/{shared → shared-kit/icons}/lucide-icon-picker/icon-data.ts +0 -0
  218. /package/src/components/{shared → shared-kit/icons}/lucide-icon-picker/index.tsx +0 -0
  219. /package/src/components/{shared → shared-kit/icons}/lucide-icon-picker/lucide-icon-by-name.tsx +0 -0
  220. /package/src/components/{shared → shared-kit/icons}/lucide-icon-picker/panel.tsx +0 -0
  221. /package/src/components/{shared → shared-kit/loading}/wave-physics-loader.tsx +0 -0
  222. /package/src/components/{ui-shared → shared-kit/pages}/placeholder-page.tsx +0 -0
  223. /package/src/components/{ui-shared → shared-kit/reference}/reference-inline.tsx +0 -0
  224. /package/src/components/{ui-shared → shared-kit/reference}/reference-search.tsx +0 -0
  225. /package/src/components/{shared → shared-kit/theme}/theme-toggle.tsx +0 -0
  226. /package/src/components/{shared → shared-kit/timezone}/timezone-bootstrap.tsx +0 -0
  227. /package/src/components/{ui-shared → shared-kit/timezone}/timezone-provider.tsx +0 -0
  228. /package/src/components/{shared → shared-kit/timezone}/timezone-select.tsx +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allbluecn/web-app",
3
- "version": "0.9.1",
3
+ "version": "0.9.3",
4
4
  "license": "AGPL-3.0-or-later",
5
5
  "type": "module",
6
6
  "files": [
@@ -14,32 +14,32 @@
14
14
  "default": "./vite.shared.ts"
15
15
  },
16
16
  "./lucide-icon-picker": {
17
- "types": "./src/components/shared/lucide-icon-picker/index.tsx",
18
- "default": "./src/components/shared/lucide-icon-picker/index.tsx"
17
+ "types": "./src/components/shared-kit/icons/lucide-icon-picker/index.tsx",
18
+ "default": "./src/components/shared-kit/icons/lucide-icon-picker/index.tsx"
19
19
  },
20
20
  "./lucide-icon-picker/panel": {
21
- "types": "./src/components/shared/lucide-icon-picker/panel.tsx",
22
- "default": "./src/components/shared/lucide-icon-picker/panel.tsx"
21
+ "types": "./src/components/shared-kit/icons/lucide-icon-picker/panel.tsx",
22
+ "default": "./src/components/shared-kit/icons/lucide-icon-picker/panel.tsx"
23
23
  },
24
24
  "./lucide-icon-picker/icon-data": {
25
- "types": "./src/components/shared/lucide-icon-picker/icon-data.ts",
26
- "default": "./src/components/shared/lucide-icon-picker/icon-data.ts"
25
+ "types": "./src/components/shared-kit/icons/lucide-icon-picker/icon-data.ts",
26
+ "default": "./src/components/shared-kit/icons/lucide-icon-picker/icon-data.ts"
27
27
  },
28
28
  "./lucide-icon-picker/curated-icons": {
29
- "types": "./src/components/shared/lucide-icon-picker/curated-icons.ts",
30
- "default": "./src/components/shared/lucide-icon-picker/curated-icons.ts"
29
+ "types": "./src/components/shared-kit/icons/lucide-icon-picker/curated-icons.ts",
30
+ "default": "./src/components/shared-kit/icons/lucide-icon-picker/curated-icons.ts"
31
31
  },
32
32
  "./lucide-icon-picker/lucide-icon-by-name": {
33
- "types": "./src/components/shared/lucide-icon-picker/lucide-icon-by-name.tsx",
34
- "default": "./src/components/shared/lucide-icon-picker/lucide-icon-by-name.tsx"
33
+ "types": "./src/components/shared-kit/icons/lucide-icon-picker/lucide-icon-by-name.tsx",
34
+ "default": "./src/components/shared-kit/icons/lucide-icon-picker/lucide-icon-by-name.tsx"
35
35
  },
36
36
  "./prototype": {
37
37
  "types": "./src/components/prototype/index.ts",
38
38
  "default": "./src/components/prototype/index.ts"
39
39
  },
40
40
  "./user-avatar": {
41
- "types": "./src/components/ui-shared/user-avatar.tsx",
42
- "default": "./src/components/ui-shared/user-avatar.tsx"
41
+ "types": "./src/components/shared-kit/avatars/user-avatar.tsx",
42
+ "default": "./src/components/shared-kit/avatars/user-avatar.tsx"
43
43
  },
44
44
  "./lib/datetime": {
45
45
  "types": "./src/lib/datetime.ts",
@@ -57,26 +57,7 @@
57
57
  "publishConfig": {
58
58
  "access": "public"
59
59
  },
60
- "packageManager": "pnpm@11.20.0",
61
- "scripts": {
62
- "dev": "vite --port 3000",
63
- "build": "vite build",
64
- "start": "vite preview",
65
- "lint": "eslint",
66
- "test": "vitest",
67
- "test:ui": "vitest --ui",
68
- "test:run": "vitest run",
69
- "setup": "pnpm --filter @allbluecn/database generate && pnpm --filter @allbluecn/database migrate:dev",
70
- "check:features": "tsx scripts/check-feature-keys.ts",
71
- "assemble": "TSX_TSCONFIG_PATH=apps/web/tsconfig.json pnpm -w exec tsx packages/kernel/src/bin.ts --profile oss --assemble --app-dir apps/web",
72
- "predev": "pnpm assemble && node scripts/check-sdk-versions.mjs",
73
- "prebuild": "pnpm assemble && node scripts/check-sdk-versions.mjs",
74
- "pretest": "pnpm assemble",
75
- "pretest:run": "pnpm assemble",
76
- "prepublishOnly": "node scripts/check-sdk-versions.mjs"
77
- },
78
60
  "dependencies": {
79
- "@allbluecn/database": "workspace:*",
80
61
  "@ariakit/react": "^0.4.28",
81
62
  "@auth/core": "^0.41.2",
82
63
  "@auth/prisma-adapter": "^2.11.2",
@@ -199,10 +180,10 @@
199
180
  "zod": "^4.4.3",
200
181
  "@open-file-viewer/core": "^0.1.43",
201
182
  "@open-file-viewer/react": "^0.1.43",
202
- "@allbluecn/kernel": "0.5.1"
183
+ "@allbluecn/kernel": "0.5.2",
184
+ "@allbluecn/database": "0.4.17"
203
185
  },
204
186
  "devDependencies": {
205
- "@allblue/devtools": "workspace:*",
206
187
  "@babel/parser": "^8.0.4",
207
188
  "@babel/traverse": "^8.0.4",
208
189
  "@cloudflare/vite-plugin": "^1.40.1",
@@ -242,5 +223,21 @@
242
223
  },
243
224
  "optionalDependencies": {
244
225
  "@tauri-apps/api": "^2.11.1"
226
+ },
227
+ "scripts": {
228
+ "dev": "vite --port 3000",
229
+ "build": "vite build",
230
+ "start": "vite preview",
231
+ "lint": "eslint",
232
+ "test": "vitest",
233
+ "test:ui": "vitest --ui",
234
+ "test:run": "vitest run",
235
+ "setup": "pnpm --filter @allbluecn/database generate && pnpm --filter @allbluecn/database migrate:dev",
236
+ "check:features": "tsx scripts/check-feature-keys.ts",
237
+ "assemble": "TSX_TSCONFIG_PATH=apps/web/tsconfig.json pnpm -w exec tsx packages/kernel/src/bin.ts --profile oss --assemble --app-dir apps/web",
238
+ "predev": "pnpm assemble && node scripts/check-sdk-versions.mjs",
239
+ "prebuild": "pnpm assemble && node scripts/check-sdk-versions.mjs",
240
+ "pretest": "pnpm assemble",
241
+ "pretest:run": "pnpm assemble"
245
242
  }
246
- }
243
+ }
@@ -17,7 +17,7 @@
17
17
 
18
18
  import { describe, it, expect } from 'vitest'
19
19
  import { render, screen } from '@testing-library/react'
20
- import { ReferenceInline } from '@/components/ui-shared'
20
+ import { ReferenceInline } from '@/components/shared-kit'
21
21
 
22
22
  describe('ReferenceInline', () => {
23
23
  it('renders title', () => {
@@ -14,7 +14,7 @@ import {
14
14
  } from '@/components/ui/tabs'
15
15
  import { Button } from '@/components/ui/button'
16
16
  import { FeatureGate } from '@/components/billing/feature-gate'
17
- import { NameConfirmDialog } from '@/components/shared/name-confirm-dialog'
17
+ import { NameConfirmDialog } from '@/components/shared-kit/dialogs/name-confirm-dialog'
18
18
  import { listAgentsFn } from '@/server/serverFns/agents/agent-crud'
19
19
  import { listSkillsFn, deleteSkillFn } from '@/server/serverFns/agents/skill-crud'
20
20
  import { deleteAgentFn } from '@/server/serverFns/agents/agent-crud'
@@ -1 +1 @@
1
- export * from '@/components/ui-shared/layout-panel-top'
1
+ export * from '@/components/shared-kit/layout/layout-panel-top'
@@ -1 +1 @@
1
- export * from '@/components/ui-shared/auth-layout'
1
+ export * from '@/components/shared-kit/auth/auth-layout'
@@ -0,0 +1,54 @@
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
+ export function AIChatPanel() {
19
+ return (
20
+ <div className="flex h-full flex-col gap-4 overflow-auto p-3">
21
+ <div className="space-y-2">
22
+ <h4 className="text-sm font-semibold">AI Chat 监控</h4>
23
+ <p className="text-xs text-muted-foreground">
24
+ 预留面板:监控 AI 对话状态、模型选择和 Token 消耗。
25
+ </p>
26
+ </div>
27
+ <div className="space-y-2">
28
+ <h4 className="text-sm font-semibold">配置</h4>
29
+ <div className="rounded border p-3 space-y-2">
30
+ <div className="text-xs">
31
+ <span className="text-muted-foreground">SSE 端点: </span>
32
+ <code>/api/chat</code>
33
+ </div>
34
+ <div className="text-xs">
35
+ <span className="text-muted-foreground">Adapter: </span>
36
+ <span>TanStack AI + OpenRouter/Anthropic/Gemini/…</span>
37
+ </div>
38
+ <div className="text-xs">
39
+ <span className="text-muted-foreground">持久化: </span>
40
+ <span>Prisma (AiProviderConfig)</span>
41
+ </div>
42
+ </div>
43
+ </div>
44
+ <div className="space-y-2">
45
+ <h4 className="text-sm font-semibold">调试提示</h4>
46
+ <div className="rounded border border-amber-200 bg-amber-50 p-2">
47
+ <p className="text-xs text-amber-800">
48
+ 使用浏览器 DevTools Network 面板查看 <code>/api/chat</code> SSE 连接。
49
+ </p>
50
+ </div>
51
+ </div>
52
+ </div>
53
+ )
54
+ }
@@ -0,0 +1,100 @@
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
+ import { useEffect, useState, useCallback } from 'react'
19
+ import { AIChatPanel } from './ai-chat-panel'
20
+ import { SessionPanel } from './session-panel'
21
+
22
+ type TabName = 'ai-chat' | 'session'
23
+
24
+ interface TabConfig {
25
+ id: TabName
26
+ label: string
27
+ }
28
+
29
+ const TABS: TabConfig[] = [
30
+ { id: 'ai-chat', label: 'AI Chat' },
31
+ { id: 'session', label: 'Session' },
32
+ ]
33
+
34
+ export function DevtoolsPanel() {
35
+ const [isOpen, setIsOpen] = useState(false)
36
+ const [activeTab, setActiveTab] = useState<TabName>('ai-chat')
37
+
38
+ const toggle = useCallback(() => setIsOpen((v) => !v), [])
39
+
40
+ useEffect(() => {
41
+ const handleEsc = (e: KeyboardEvent) => {
42
+ if (e.key === 'Escape') setIsOpen(false)
43
+ }
44
+ const handleModD = (e: KeyboardEvent) => {
45
+ if ((e.metaKey || e.ctrlKey) && e.shiftKey && e.key === 'D') {
46
+ e.preventDefault()
47
+ toggle()
48
+ }
49
+ }
50
+ document.addEventListener('keydown', handleEsc)
51
+ document.addEventListener('keydown', handleModD)
52
+ return () => {
53
+ document.removeEventListener('keydown', handleEsc)
54
+ document.removeEventListener('keydown', handleModD)
55
+ }
56
+ }, [toggle])
57
+
58
+ const panel = activeTab === 'ai-chat' ? <AIChatPanel /> : <SessionPanel />
59
+
60
+ return (
61
+ <>
62
+ <button
63
+ onClick={toggle}
64
+ className="fixed left-4 bottom-4 z-[10000] rounded-full bg-blue-600 px-3 py-1.5 text-xs text-white shadow-lg hover:bg-blue-700"
65
+ >
66
+ AllBlue Dev
67
+ </button>
68
+ {isOpen && (
69
+ <div className="fixed right-4 top-4 z-[10000] h-96 w-11/12 max-w-md overflow-hidden rounded-lg border bg-background shadow-2xl">
70
+ <div className="flex items-center justify-between border-b px-3 py-2">
71
+ <div className="flex gap-1">
72
+ {TABS.map((tab) => (
73
+ <button
74
+ key={tab.id}
75
+ onClick={() => setActiveTab(tab.id)}
76
+ className={`rounded px-2 py-1 text-xs font-medium ${
77
+ activeTab === tab.id
78
+ ? 'bg-primary text-primary-foreground'
79
+ : 'text-muted-foreground hover:text-foreground'
80
+ }`}
81
+ >
82
+ {tab.label}
83
+ </button>
84
+ ))}
85
+ </div>
86
+ <button
87
+ onClick={() => setIsOpen(false)}
88
+ className="text-muted-foreground hover:text-foreground"
89
+ >
90
+ <span className="text-sm">×</span>
91
+ </button>
92
+ </div>
93
+ <div className="h-[calc(100%-44px)] overflow-auto">
94
+ {panel}
95
+ </div>
96
+ </div>
97
+ )}
98
+ </>
99
+ )
100
+ }
@@ -15,16 +15,6 @@
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 { cn } from "./utils"
19
-
20
- function Skeleton({ className, ...props }: React.ComponentProps<"div">) {
21
- return (
22
- <div
23
- data-slot="skeleton"
24
- className={cn("animate-pulse rounded-md bg-muted", className)}
25
- {...props}
26
- />
27
- )
28
- }
29
-
30
- export { Skeleton }
18
+ export { AIChatPanel } from './ai-chat-panel'
19
+ export { DevtoolsPanel } from './devtools-panel'
20
+ export { SessionPanel } from './session-panel'
@@ -0,0 +1,102 @@
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
+ import { useEffect, useState } from 'react'
19
+
20
+ type UserInfo = {
21
+ id: string
22
+ email: string
23
+ name: string | null
24
+ role: string
25
+ aiProvider?: string | null
26
+ aiModel?: string | null
27
+ hasAiKey?: boolean | null
28
+ }
29
+
30
+ export function SessionPanel() {
31
+ const [user, setUser] = useState<UserInfo | null>(null)
32
+ const [loading, setLoading] = useState(true)
33
+
34
+ useEffect(() => {
35
+ fetch('/api/auth/session', { credentials: 'include' })
36
+ .then((res) => res.ok ? res.json() : null)
37
+ .then((data) => {
38
+ setUser(data?.user ?? null)
39
+ setLoading(false)
40
+ })
41
+ .catch(() => setLoading(false))
42
+ }, [])
43
+
44
+ if (loading) {
45
+ return (
46
+ <div className="flex h-full items-center justify-center">
47
+ <span className="text-sm text-muted-foreground">加载中…</span>
48
+ </div>
49
+ )
50
+ }
51
+
52
+ if (!user) {
53
+ return (
54
+ <div className="flex h-full items-center justify-center">
55
+ <span className="text-sm text-muted-foreground">未登录</span>
56
+ </div>
57
+ )
58
+ }
59
+
60
+ return (
61
+ <div className="flex h-full flex-col gap-4 overflow-auto p-3">
62
+ <div className="space-y-2">
63
+ <h4 className="text-sm font-semibold">当前用户</h4>
64
+ <div className="grid grid-cols-2 gap-2 text-xs">
65
+ <div>
66
+ <span className="text-muted-foreground">ID: </span>
67
+ <code>{user.id}</code>
68
+ </div>
69
+ <div>
70
+ <span className="text-muted-foreground">Email: </span>
71
+ <span>{user.email}</span>
72
+ </div>
73
+ <div>
74
+ <span className="text-muted-foreground">Name: </span>
75
+ <span>{user.name || '-'}</span>
76
+ </div>
77
+ <div>
78
+ <span className="text-muted-foreground">Role: </span>
79
+ <span className="font-medium">{user.role}</span>
80
+ </div>
81
+ </div>
82
+ </div>
83
+ <div className="space-y-2">
84
+ <h4 className="text-sm font-semibold">AI 配置</h4>
85
+ <div className="grid grid-cols-2 gap-2 text-xs">
86
+ <div>
87
+ <span className="text-muted-foreground">Provider: </span>
88
+ <span>{user.aiProvider || '未配置'}</span>
89
+ </div>
90
+ <div>
91
+ <span className="text-muted-foreground">Model: </span>
92
+ <span>{user.aiModel || '未配置'}</span>
93
+ </div>
94
+ <div>
95
+ <span className="text-muted-foreground">Has Key: </span>
96
+ <span>{user.hasAiKey ? '是' : '否'}</span>
97
+ </div>
98
+ </div>
99
+ </div>
100
+ </div>
101
+ )
102
+ }
@@ -28,7 +28,7 @@ import {
28
28
  DialogHeader,
29
29
  DialogTitle,
30
30
  } from "@/components/ui/dialog";
31
- import { LucideIconPicker } from "@/components/shared/lucide-icon-picker";
31
+ import { LucideIconPicker } from "@/components/shared-kit/icons/lucide-icon-picker";
32
32
  import { createKnowledgeFn, updateKnowledgeFn } from "@/server/serverFns/knowledge";
33
33
  import { knowledgeFormSchema, type KnowledgeFormValues } from "../schemas/knowledge-form";
34
34
 
@@ -20,7 +20,7 @@ import { BookOpen, Clock, Dot, Plus } from 'lucide-react'
20
20
  import { cn } from '@/lib/utils'
21
21
  import { formatSaveTime } from '@/lib/time-format'
22
22
  import { useTimezone } from '@/providers/timezone-provider'
23
- import { UserAvatar } from '@/components/ui-shared'
23
+ import { UserAvatar } from '@/components/shared-kit'
24
24
  import { TagSelector } from '@/plugins/core/tags/tag-selector'
25
25
  import { TagBadge } from '@/plugins/core/tags/tag-badge'
26
26
  import { listTagsFn } from '@/plugins/core/tags/serverFns'
@@ -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 { UserAvatar } from '@/components/ui-shared'
18
+ import { UserAvatar } from '@/components/shared-kit'
19
19
  import { AvatarGroup, AvatarGroupTooltip } from '@/components/magicui/components/animate/avatar-group'
20
20
  import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
21
21
  import { cn } from '@/lib/utils'
@@ -63,7 +63,7 @@ vi.mock("@/lib/sidebar-utils", () => ({
63
63
  isParentActive: (pathname: string, target: string) => pathname.startsWith(target),
64
64
  }));
65
65
 
66
- vi.mock("@/components/shared/lucide-icon-picker/lucide-icon-by-name", () => ({
66
+ vi.mock("@/components/shared-kit/icons/lucide-icon-picker/lucide-icon-by-name", () => ({
67
67
  LucideIconByName: ({ name }: any) => <span data-testid="project-icon">{name}</span>,
68
68
  }));
69
69
 
@@ -33,7 +33,7 @@ import { NavKnowledge } from "@/components/layout/sidebar-03/nav-knowledge";
33
33
  import { NavWorkspace } from "@/components/layout/sidebar-03/nav-workspace";
34
34
  import { Logo } from "@/components/layout/sidebar-03/logo";
35
35
  import { UserMenu } from "@/components/layout/sidebar-03/user-menu";
36
- import { ThemeToggle } from "@/components/shared/theme-toggle";
36
+ import { ThemeToggle } from "@/components/shared-kit/theme/theme-toggle";
37
37
  import { AnimatedThemeToggler } from '@/components/magicui/animated-theme-toggler'
38
38
  import { Badge } from "@/components/ui/badge"
39
39
  import { workspaceRoutes } from "@/config/sidebar-routes";
@@ -28,7 +28,7 @@ import {
28
28
  } from "@/components/ui/sidebar";
29
29
  import { cn } from "@/lib/utils";
30
30
  import { isParentActive } from "@/lib/sidebar-utils";
31
- import { LucideIconByName } from "@/components/shared/lucide-icon-picker/lucide-icon-by-name";
31
+ import { LucideIconByName } from "@/components/shared-kit/icons/lucide-icon-picker/lucide-icon-by-name";
32
32
  import { CreateWorkspaceDialog } from "@/components/workspace/create-workspace-dialog";
33
33
  import { useLiveQuery } from "@tanstack/react-db";
34
34
  import { workspacesCollection } from "@/lib/collections/reference/workspaces-collection";
@@ -47,7 +47,7 @@ import { signOut, useSession } from "@/lib/auth/auth-client";
47
47
  import { useRouter, useMatches } from "@tanstack/react-router";
48
48
  import { useTranslation } from "react-i18next";
49
49
  import { getQueryClient } from "@/lib/query-client-seam";
50
- import { UserAvatar } from "@/components/ui-shared";
50
+ import { UserAvatar } from "@/components/shared-kit";
51
51
  import type { AvatarConfig, ShapeType } from "@allbluecn/kernel";
52
52
  import { SparklesText } from "@/components/magicui/sparkles-text";
53
53
 
@@ -1 +1 @@
1
- export * from '@/components/ui-shared/animated-theme-toggler'
1
+ export * from '@/components/shared-kit/theme/animated-theme-toggler'
@@ -1 +1 @@
1
- export * from '@/components/ui-shared/grid-pattern'
1
+ export * from '@/components/shared-kit/decorative/grid-pattern'
@@ -36,7 +36,7 @@ import {
36
36
  DialogHeader,
37
37
  DialogTitle,
38
38
  } from "@/components/ui/dialog";
39
- import { LucideIconPicker } from "@/components/shared/lucide-icon-picker";
39
+ import { LucideIconPicker } from "@/components/shared-kit/icons/lucide-icon-picker";
40
40
  import { extractDisplayId, validateDisplayId } from "@/lib/project-display-id";
41
41
  import { checkDisplayIdAvailableFn, createProjectFn } from "@/server/serverFns/project";
42
42
  import { listWorkspacesBriefFn } from "@/server/serverFns/workspace";
@@ -41,7 +41,7 @@ import {
41
41
  import { addProjectMemberFromTeamFn } from "@/server/serverFns/project";
42
42
  import { listTeamUsersFn } from "@/server/serverFns/team";
43
43
  import type { ProjectRole } from "@/types/project";
44
- import { UserAvatar } from "@/components/ui-shared";
44
+ import { UserAvatar } from "@/components/shared-kit";
45
45
 
46
46
  interface AssignMemberDialogProps {
47
47
  open: boolean;
@@ -17,7 +17,7 @@
17
17
 
18
18
  import { useTranslation } from "react-i18next"
19
19
  import { getClientI18n } from "@/i18n/client"
20
- import { UserAvatar } from "@/components/ui-shared";
20
+ import { UserAvatar } from "@/components/shared-kit";
21
21
  import type { AvatarConfig, ShapeType } from "@allbluecn/kernel";
22
22
  import { cn } from "@/lib/utils";
23
23
  import { formatDate } from "@/lib/datetime";
@@ -39,7 +39,7 @@ import {
39
39
  AlertDialogHeader,
40
40
  AlertDialogTitle,
41
41
  } from "@/components/ui/alert-dialog";
42
- import { UserAvatar } from "@/components/ui-shared";
42
+ import { UserAvatar } from "@/components/shared-kit";
43
43
  import type { AvatarConfig, ShapeType } from "@allbluecn/kernel";
44
44
  import { InviteMemberDialog } from "./invite-member-dialog";
45
45
  import {
@@ -15,6 +15,6 @@
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
- export { NotionAvatar as default } from "@/components/ui-shared"
19
- export { NotionAvatar } from "@/components/ui-shared"
18
+ export { NotionAvatar as default } from "@/components/shared-kit"
19
+ export { NotionAvatar } from "@/components/shared-kit"
20
20
  export type { ShapeType } from "@allbluecn/kernel"
@@ -15,7 +15,7 @@ import { useTranslation } from "react-i18next"
15
15
  import { cn } from "@/lib/utils"
16
16
  import { formatDate } from "@/lib/datetime"
17
17
  import { useTimezone } from "@/providers/timezone-provider"
18
- import { UserAvatar } from "@/components/ui-shared"
18
+ import { UserAvatar } from "@/components/shared-kit"
19
19
  import type { AvatarConfig, ShapeType } from "@allbluecn/kernel"
20
20
  import { Badge } from "@/components/ui/badge"
21
21
  import { Button } from "@/components/ui/button"
@@ -28,7 +28,7 @@ import { m } from "motion/react";
28
28
  import { InteractiveHoverButton } from "@/components/magicui/interactive-hover-button";
29
29
  import { useSession } from "@/lib/auth/auth-client";
30
30
  import { useRouter } from "@tanstack/react-router";
31
- import { ThemeToggle } from "@/components/shared/theme-toggle";
31
+ import { ThemeToggle } from "@/components/shared-kit/theme/theme-toggle";
32
32
  import { AnimatedThemeToggler } from '@/components/magicui/animated-theme-toggler'
33
33
 
34
34
  export type NavigationSection = {
@@ -16,7 +16,7 @@
16
16
  // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
 
18
18
  import type { ReactNode } from 'react'
19
- import { AnimatedThemeToggler } from './animated-theme-toggler'
19
+ import { AnimatedThemeToggler } from '@/components/shared-kit/theme/animated-theme-toggler'
20
20
 
21
21
  interface AuthLayoutProps {
22
22
  children: ReactNode
@@ -17,7 +17,7 @@
17
17
 
18
18
  import { useId } from "react"
19
19
 
20
- import { cn } from "./utils"
20
+ import { cn } from "@/lib/utils"
21
21
 
22
22
  interface GridPatternProps extends React.SVGProps<SVGSVGElement> {
23
23
  width?: number
@@ -17,12 +17,13 @@
17
17
 
18
18
 
19
19
  import { useState } from "react";
20
+ import * as React from "react";
20
21
  import type { ReactNode } from "react";
21
22
  import { toast } from "sonner";
22
23
  import { useTranslation } from "react-i18next";
23
- import { Button } from "./button";
24
- import { Input } from "./input";
25
- import { Tooltip, TooltipContent, TooltipTrigger } from "./tooltip";
24
+ import { Button } from "@/components/ui/button";
25
+ import { Input } from "@/components/ui/input";
26
+ import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip";
26
27
  import {
27
28
  Dialog,
28
29
  DialogContent,
@@ -30,7 +31,7 @@ import {
30
31
  DialogFooter,
31
32
  DialogHeader,
32
33
  DialogTitle,
33
- } from "./dialog";
34
+ } from "@/components/ui/dialog";
34
35
 
35
36
  interface NameConfirmDialogProps {
36
37
  open: boolean;
@@ -120,7 +121,7 @@ export function NameConfirmDialog({
120
121
  </p>
121
122
  <Input
122
123
  value={inputValue}
123
- onChange={(e) => {
124
+ onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
124
125
  setInputValue(e.target.value);
125
126
  setError("");
126
127
  }}