@allbluecn/web-app 0.19.5 → 0.21.0

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 (235) hide show
  1. package/package.json +3 -3
  2. package/src/components/bug/__tests__/board-subgroups.test.tsx +1 -1
  3. package/src/components/bug/__tests__/board-view.test.tsx +1 -1
  4. package/src/components/bug/__tests__/comment-reactions.test.tsx +1 -1
  5. package/src/components/bug/__tests__/create-bug-dialog.test.tsx +2 -2
  6. package/src/components/bug/__tests__/filters-compat.test.tsx +1 -1
  7. package/src/components/bug/__tests__/fix-request-race.test.tsx +1 -1
  8. package/src/components/bug/__tests__/peek-modes.test.tsx +1 -1
  9. package/src/components/bug/__tests__/use-paged-bug-groups.test.tsx +1 -1
  10. package/src/components/bug/__tests__/view-type.test.tsx +1 -1
  11. package/src/components/bug/bug-list-view.tsx +2 -2
  12. package/src/components/bug/bug-toolbar.tsx +1 -1
  13. package/src/components/bug/create-bug-dialog.tsx +3 -3
  14. package/src/components/bug/detail/__tests__/activity-timeline.test.tsx +1 -1
  15. package/src/components/bug/detail/__tests__/bug-detail-collab.test.tsx +1 -1
  16. package/src/components/bug/detail/__tests__/repro-report-card.test.tsx +1 -1
  17. package/src/components/bug/detail/activity-tabs.tsx +34 -3
  18. package/src/components/bug/detail/activity-timeline.tsx +1 -1
  19. package/src/components/bug/detail/bug-detail-body.tsx +3 -3
  20. package/src/components/bug/detail/comment-input.tsx +1 -1
  21. package/src/components/bug/detail/comment-item.tsx +1 -1
  22. package/src/components/bug/detail/comment-reactions.tsx +1 -1
  23. package/src/components/bug/detail/comment-thread.tsx +1 -1
  24. package/src/components/bug/detail/props-section.tsx +2 -2
  25. package/src/components/bug/detail/repro-report-card.tsx +1 -1
  26. package/src/components/bug/detail/reproduce-steps-view.tsx +1 -1
  27. package/src/components/bug/display/use-paged-bug-groups.ts +2 -2
  28. package/src/components/bug/filters/field-configs.tsx +1 -1
  29. package/src/components/bug/inline-editors/assignee-editor.tsx +1 -1
  30. package/src/components/bug/peek-panel.tsx +2 -2
  31. package/src/components/bug/reproduce-steps-editor.tsx +1 -1
  32. package/src/components/bug/story-bugs-panel.tsx +10 -6
  33. package/src/components/bug/views/board-view.tsx +2 -2
  34. package/src/components/bug/views/bug-list/batch-toolbar.tsx +1 -1
  35. package/src/components/bug/views/bug-list/group.tsx +1 -1
  36. package/src/components/bug/views/bug-list/index.tsx +1 -1
  37. package/src/components/bug/views/bug-list/inline-bug-creator.tsx +1 -1
  38. package/src/components/bug/views/bug-list/row.tsx +2 -2
  39. package/src/components/bug/views/create-view-dialog.tsx +1 -1
  40. package/src/components/design/editor/versions/hooks/use-design-versions.ts +11 -4
  41. package/src/components/design/editor/versions/page-version-panel.tsx +30 -11
  42. package/src/components/harness/code/workspace-context.tsx +5 -1
  43. package/src/components/harness/code/workspace-picker.tsx +19 -6
  44. package/src/components/harness/composer/harness-composer.tsx +25 -3
  45. package/src/components/harness/composer/mention/mention-resolvers.ts +2 -0
  46. package/src/components/harness/composer/mention/mention-suggestion-menu.tsx +6 -3
  47. package/src/components/harness/composer/mention/use-mention-sources.ts +1 -1
  48. package/src/components/iteration/iteration-progress-bar.tsx +2 -2
  49. package/src/components/knowledge/public/legal-compliance-editor.tsx +1 -1
  50. package/src/components/layout/sidebar-03/nav-knowledge.tsx +1 -1
  51. package/src/components/layout/sidebar-03/nav-workspace.tsx +1 -1
  52. package/src/components/project/invite-member-dialog.tsx +2 -2
  53. package/src/components/project/project-member-manager.tsx +0 -3
  54. package/src/components/shared-kit/list-kit/kanban/__tests__/instance-key.test.ts +1 -1
  55. package/src/components/story/__tests__/constants.test.ts +1 -1
  56. package/src/components/story/__tests__/dependency-type-badge.test.ts +1 -1
  57. package/src/components/story/__tests__/peek-panel-patch-sync.test.tsx +1 -1
  58. package/src/components/story/__tests__/story-list-view-peek-sync.test.tsx +1 -1
  59. package/src/components/story/ai/story-ai-panel.tsx +1 -1
  60. package/src/components/story/ai/story-ai-preview-list.tsx +2 -2
  61. package/src/components/story/ai/use-story-ai-model.ts +17 -4
  62. package/src/components/story/columns.tsx +2 -2
  63. package/src/components/story/create-story-dialog.tsx +4 -4
  64. package/src/components/story/detail/__tests__/activity-timeline.test.tsx +1 -1
  65. package/src/components/story/detail/__tests__/associated-attachments-panel.test.tsx +1 -1
  66. package/src/components/story/detail/__tests__/story-collab.test.tsx +1 -1
  67. package/src/components/story/detail/activity-tabs.tsx +1 -1
  68. package/src/components/story/detail/activity-timeline.tsx +36 -17
  69. package/src/components/story/detail/comment-input.tsx +1 -1
  70. package/src/components/story/detail/comment-item.tsx +1 -1
  71. package/src/components/story/detail/comment-thread.tsx +1 -1
  72. package/src/components/story/detail/reaction-bar.tsx +1 -1
  73. package/src/components/story/detail/story-detail-body.tsx +4 -4
  74. package/src/components/story/detail/story-detail-toolbar/__tests__/attachment-cache.test.ts +83 -0
  75. package/src/components/story/detail/story-detail-toolbar/associated-attachments-panel.tsx +50 -9
  76. package/src/components/story/detail/story-detail-toolbar/children.tsx +3 -3
  77. package/src/components/story/detail/story-detail-toolbar/dependency-panel.tsx +9 -8
  78. package/src/components/story/detail/story-detail-toolbar/index.tsx +8 -8
  79. package/src/components/story/detail/story-detail-toolbar/related-test-cases.tsx +2 -2
  80. package/src/components/story/detail/story-properties.tsx +2 -2
  81. package/src/components/story/display/__tests__/flatten-story-groups.test.ts +1 -1
  82. package/src/components/story/display/__tests__/group-fields.test.ts +1 -1
  83. package/src/components/story/display/__tests__/group-resolver.test.ts +2 -2
  84. package/src/components/story/display/__tests__/order-resolver.test.ts +1 -1
  85. package/src/components/story/display/__tests__/use-grouped-stories.test.ts +1 -1
  86. package/src/components/story/display/__tests__/use-paged-story-groups.test.ts +1 -1
  87. package/src/components/story/display/flatten-story-groups.ts +1 -1
  88. package/src/components/story/display/group-fields.ts +2 -2
  89. package/src/components/story/display/group-resolver.tsx +4 -4
  90. package/src/components/story/display/order-resolver.ts +3 -3
  91. package/src/components/story/display/types.ts +5 -4
  92. package/src/components/story/display/use-grouped-stories.ts +5 -5
  93. package/src/components/story/display/use-paged-story-groups.ts +11 -4
  94. package/src/components/story/entity-overlay.ts +24 -0
  95. package/src/components/story/filters/field-configs.tsx +2 -2
  96. package/src/components/story/inline-editors/assignee-editor.tsx +1 -1
  97. package/src/components/story/inline-editors/dependency-type-select.tsx +1 -1
  98. package/src/components/story/inline-editors/parent-story-editor.tsx +2 -2
  99. package/src/components/story/inline-editors/priority-editor.tsx +2 -2
  100. package/src/components/story/inline-editors/state-editor.tsx +2 -2
  101. package/src/components/story/inline-editors/story-select-dialog.tsx +2 -2
  102. package/src/components/story/peek-panel.tsx +6 -5
  103. package/src/components/story/priority-icon.tsx +2 -2
  104. package/src/components/story/relations/__tests__/attachment-manage-dialog.test.tsx +1 -1
  105. package/src/components/story/relations/__tests__/design-select-dialog.test.tsx +1 -1
  106. package/src/components/story/relations/__tests__/knowledge-select-dialog.test.tsx +1 -1
  107. package/src/components/story/relations/__tests__/link-manage-dialog.test.tsx +1 -1
  108. package/src/components/story/relations/attachment-manage-dialog.tsx +4 -4
  109. package/src/components/story/relations/design-select-dialog.tsx +2 -2
  110. package/src/components/story/relations/knowledge-select-dialog.tsx +2 -2
  111. package/src/components/story/relations/link-manage-dialog.tsx +2 -2
  112. package/src/components/story/relations/story-ref-row.tsx +3 -3
  113. package/src/components/story/story-list-table.tsx +1 -1
  114. package/src/components/story/story-list-view.tsx +1 -1
  115. package/src/components/story/story-toolbar.tsx +1 -1
  116. package/src/components/story/transfer-story-popover.tsx +3 -2
  117. package/src/components/story/views/__tests__/calendar-view.test.tsx +1 -1
  118. package/src/components/story/views/__tests__/kanban-drop-subgroup.test.ts +1 -1
  119. package/src/components/story/views/__tests__/kanban-peek-sync.test.tsx +2 -2
  120. package/src/components/story/views/__tests__/kanban-view-membership-sync.test.tsx +1 -1
  121. package/src/components/story/views/__tests__/timeline-view.test.tsx +1 -1
  122. package/src/components/story/views/calendar/__tests__/mappers.test.ts +1 -1
  123. package/src/components/story/views/calendar/mappers.ts +1 -1
  124. package/src/components/story/views/calendar-view.tsx +1 -1
  125. package/src/components/story/views/create-view-dialog.tsx +1 -1
  126. package/src/components/story/views/kanban-view.tsx +2 -2
  127. package/src/components/story/views/story-list/batch-preview-dialog.tsx +2 -2
  128. package/src/components/story/views/story-list/batch-toolbar.tsx +3 -3
  129. package/src/components/story/views/story-list/group.tsx +18 -5
  130. package/src/components/story/views/story-list/index.tsx +4 -2
  131. package/src/components/story/views/story-list/inline-story-creator.tsx +2 -2
  132. package/src/components/story/views/story-list/row.tsx +2 -2
  133. package/src/components/story/views/story-list/use-flat-rows.ts +1 -1
  134. package/src/components/story/views/timeline/__tests__/mappers.test.ts +2 -2
  135. package/src/components/story/views/timeline/mappers.ts +2 -2
  136. package/src/components/story/views/timeline/use-date-commit.ts +1 -1
  137. package/src/components/story/views/timeline-view.tsx +2 -2
  138. package/src/components/testcase/__tests__/case-row.test.tsx +1 -1
  139. package/src/components/testcase/__tests__/create-dialog-scope.test.tsx +1 -1
  140. package/src/components/testcase/__tests__/display-options.test.tsx +1 -1
  141. package/src/components/testcase/__tests__/export-entry.test.tsx +1 -1
  142. package/src/components/testcase/__tests__/list-view.test.tsx +1 -1
  143. package/src/components/testcase/__tests__/step-editor.test.tsx +4 -2
  144. package/src/components/testcase/__tests__/toolbar.test.tsx +1 -1
  145. package/src/components/testcase/create-testcase-dialog.tsx +6 -5
  146. package/src/components/testcase/detail/case-detail-body.tsx +1 -1
  147. package/src/components/testcase/detail/properties.tsx +1 -1
  148. package/src/components/testcase/display/display-dropdown.tsx +2 -2
  149. package/src/components/testcase/display/use-testcase-display-options.ts +1 -1
  150. package/src/components/testcase/filters/field-configs.tsx +1 -1
  151. package/src/components/testcase/generation/draft-card.tsx +2 -2
  152. package/src/components/testcase/inline-editors/assignee-editor.tsx +1 -1
  153. package/src/components/testcase/list/case-row.tsx +1 -1
  154. package/src/components/testcase/list/grouped-list.tsx +1 -1
  155. package/src/components/testcase/list-view.tsx +2 -2
  156. package/src/components/testcase/runs/convert-bug-button.tsx +2 -2
  157. package/src/components/testcase/step-editor.tsx +13 -2
  158. package/src/components/testcase/testcase-toolbar.tsx +2 -2
  159. package/src/components/testcase/views/batch-toolbar.tsx +1 -1
  160. package/src/components/testcase/views/board-view.tsx +2 -2
  161. package/src/lib/changelog/sdk-versions.ts +2 -2
  162. package/src/lib/collections/knowledge/knowledge-bases-collection.ts +2 -1
  163. package/src/lib/collections/query-keys.ts +18 -0
  164. package/src/lib/collections/reference/users-brief-collection.ts +2 -1
  165. package/src/lib/collections/reference/workspaces-collection.ts +2 -1
  166. package/src/lib/story/__tests__/activity-grouper.test.ts +1 -1
  167. package/src/lib/story/activity-grouper.ts +1 -1
  168. package/src/paraglide/messages/_index.d.ts +2 -0
  169. package/src/paraglide/messages/_index.js +88269 -5642
  170. package/src/paraglide/messages/en.js +28255 -0
  171. package/src/paraglide/messages/story_group_loadfailed1.d.ts +17 -0
  172. package/src/paraglide/messages/story_group_loadfailed1.js +30 -0
  173. package/src/paraglide/messages/story_group_retry.d.ts +16 -0
  174. package/src/paraglide/messages/story_group_retry.js +29 -0
  175. package/src/paraglide/messages/zh.js +28253 -0
  176. package/src/routes/_nav/bugs/$bugId/route.lazy.tsx +2 -2
  177. package/src/routes/_nav/projects/$projectId/iterations/$iterationId/route.lazy.tsx +1 -1
  178. package/src/routes/_nav/route.tsx +1 -2
  179. package/src/routes/_nav/stories/$storyId/route.lazy.tsx +2 -2
  180. package/src/routes/_nav/stories/$storyId/route.tsx +1 -1
  181. package/src/routes/api/design/prototype/__tests__/route.test.ts +4 -1
  182. package/src/server/__tests__/task-executor.test.ts +7 -0
  183. package/src/server/ai-gateway/__tests__/ai-output-guard.test.ts +4 -4
  184. package/src/server/ai-gateway/__tests__/tools-authorization.test.ts +25 -0
  185. package/src/server/ai-gateway/tools/server.ts +24 -15
  186. package/src/server/knowledge/reindex-guard.ts +35 -0
  187. package/src/server/lib/__tests__/cron-auth.test.ts +1 -1
  188. package/src/server/serverFns/__tests__/legal-code-canonical.test.ts +169 -0
  189. package/src/server/serverFns/__tests__/story-tree.test.ts +0 -1
  190. package/src/server/serverFns/__tests__/story-types.test.ts +2 -1
  191. package/src/server/serverFns/__tests__/update-bug-guard.test.ts +1 -1
  192. package/src/server/serverFns/bug/__tests__/bug-comments.test.ts +95 -44
  193. package/src/server/serverFns/bug/__tests__/bug-crud.test.ts +46 -18
  194. package/src/server/serverFns/bug/__tests__/bug-groups.test.ts +1 -1
  195. package/src/server/serverFns/bug/bug-activities.ts +2 -2
  196. package/src/server/serverFns/bug/bug-comments.ts +44 -19
  197. package/src/server/serverFns/bug/bug-crud/detail-select.ts +1 -1
  198. package/src/server/serverFns/bug/bug-crud/detail.ts +2 -2
  199. package/src/server/serverFns/bug/bug-crud.ts +142 -110
  200. package/src/server/serverFns/bug/bug-group-query.ts +1 -1
  201. package/src/server/serverFns/bug/bug-groups.ts +2 -2
  202. package/src/server/serverFns/bug/bug-story-utils.ts +1 -1
  203. package/src/server/serverFns/chat/conversations.ts +27 -13
  204. package/src/server/serverFns/harness/github-workspace.ts +32 -25
  205. package/src/server/serverFns/harness/search-mention-candidates.ts +3 -1
  206. package/src/server/serverFns/iteration/iteration-crud.ts +1 -1
  207. package/src/server/serverFns/knowledge/public/legal/create.ts +3 -0
  208. package/src/server/serverFns/knowledge/public/legal/update.ts +8 -8
  209. package/src/server/serverFns/knowledge-index.ts +12 -5
  210. package/src/server/serverFns/project.ts +5 -11
  211. package/src/server/serverFns/story/__tests__/story-dependencies.test.ts +15 -4
  212. package/src/server/serverFns/story/__tests__/story-transfer.test.ts +20 -0
  213. package/src/server/serverFns/story/link-preview.ts +3 -2
  214. package/src/server/serverFns/story/story-children.ts +1 -1
  215. package/src/server/serverFns/story/story-comments.ts +1 -1
  216. package/src/server/serverFns/story/story-crud/bulk.ts +1 -1
  217. package/src/server/serverFns/story/story-crud.ts +1 -1
  218. package/src/server/serverFns/story/story-dependencies.ts +61 -69
  219. package/src/server/serverFns/story/story-groups.ts +1 -1
  220. package/src/server/serverFns/story/story-transfer.ts +8 -20
  221. package/src/server/serverFns/testcase/__tests__/automation.test.ts +21 -0
  222. package/src/server/serverFns/testcase/__tests__/testcase-groups.test.ts +1 -1
  223. package/src/server/serverFns/testcase/automation.ts +24 -1
  224. package/src/server/serverFns/testcase/testcase-board.ts +1 -1
  225. package/src/server/serverFns/testcase/testcase-crud.ts +1 -1
  226. package/src/server/serverFns/testcase/testcase-display-options.ts +1 -1
  227. package/src/server/serverFns/testcase/testcase-filter-views.ts +1 -1
  228. package/src/server/serverFns/testcase/types.ts +1 -1
  229. package/src/server/story/types.ts +7 -3
  230. package/src/shared/bug/__tests__/constants.test.ts +1 -1
  231. package/src/{components → shared}/bug/types.ts +4 -3
  232. package/src/{components → shared}/story/constants.ts +1 -1
  233. package/src/{components → shared}/story/types.ts +1 -7
  234. package/src/types/project.ts +1 -2
  235. /package/src/{components/testcase/display → shared/testcase}/field-configs.ts +0 -0
@@ -202,6 +202,27 @@ beforeEach(() => {
202
202
  });
203
203
 
204
204
  describe("generateArtifactFn", () => {
205
+ it("S22:同 case+kind 并发生成被服务端守卫拒绝,完成后可再次生成", async () => {
206
+ M.runChatAsAgent.mockImplementation(async () => {
207
+ // 拉长首例生成,制造 in-flight 窗口
208
+ await new Promise((r) => setTimeout(r, 30));
209
+ return aiOutput();
210
+ });
211
+ M.runVitestSpec.mockResolvedValue(runResult());
212
+
213
+ const first = generateArtifactFn({ data: { caseId: CASE_ID, kind: "unit" } });
214
+ await expect(
215
+ generateArtifactFn({ data: { caseId: CASE_ID, kind: "unit" } }),
216
+ ).rejects.toThrow("正在生成中");
217
+ await expect(first).resolves.toMatchObject({ artifact: expect.anything() });
218
+
219
+ // 释放后可再次生成
220
+ M.runChatAsAgent.mockResolvedValue(aiOutput());
221
+ await expect(
222
+ generateArtifactFn({ data: { caseId: CASE_ID, kind: "unit" } }),
223
+ ).resolves.toMatchObject({ artifact: expect.anything() });
224
+ });
225
+
205
226
  it("requireFeature 第一行门控 + AI 调用走 testgen bizKey + testcase.automation promptKey 覆盖", async () => {
206
227
  M.runChatAsAgent.mockResolvedValue(aiOutput());
207
228
  M.runVitestSpec.mockResolvedValue(runResult());
@@ -94,7 +94,7 @@ import {
94
94
  updateFilterViewFn,
95
95
  deleteFilterViewFn,
96
96
  } from "../testcase-filter-views";
97
- import { TESTCASE_DISPLAY_OPTIONS_VIEW_NAME } from "@/components/testcase/display/field-configs";
97
+ import { TESTCASE_DISPLAY_OPTIONS_VIEW_NAME } from "@/shared/testcase/field-configs";
98
98
 
99
99
  const U = "u-1";
100
100
  const P = "pr-1";
@@ -170,6 +170,12 @@ const generateArtifactInputSchema = z.object({
170
170
  targetSourcePath: z.string().min(1).optional(),
171
171
  });
172
172
 
173
+ // S22(审计 A2x ⚪ 防重入半部):同 case+kind 的生成任务进程内互斥——长链路
174
+ // (2 轮 AI + 2 轮沙箱)期间重复触发会双倍消耗配额并产生并发写。进程内存态
175
+ // (与 reindex-guard/rate-limit 同边界声明:多实例不共享);全量异步化(任务
176
+ // 队列 + 轮询 UI)属架构任务,需产品确认进度/取消交互后另行立项。
177
+ const inFlightArtifactJobs = new Set<string>();
178
+
173
179
  export const generateArtifactFn = createServerFn({ method: "POST" })
174
180
  .validator(generateArtifactInputSchema)
175
181
  .handler(async ({ data }) => {
@@ -184,6 +190,23 @@ export const generateArtifactFn = createServerFn({ method: "POST" })
184
190
  throw new Error("AI 未配置,请先前往 AI 设置页配置 API Key");
185
191
  }
186
192
 
193
+ const jobKey = `${data.caseId}:${data.kind}`;
194
+ if (inFlightArtifactJobs.has(jobKey)) {
195
+ throw new Error("该用例的同类产物正在生成中,请稍候");
196
+ }
197
+ inFlightArtifactJobs.add(jobKey);
198
+ try {
199
+ return await runArtifactGeneration(data, userId);
200
+ } finally {
201
+ inFlightArtifactJobs.delete(jobKey);
202
+ }
203
+ });
204
+
205
+ async function runArtifactGeneration(
206
+ data: { caseId: string; kind: string; targetSourcePath?: string },
207
+ userId: string,
208
+ ): Promise<{ artifact: ReturnType<typeof castArtifact> }> {
209
+
187
210
  const prisma = await getPrisma();
188
211
  const testCase = await prisma.testCase.findUnique({
189
212
  where: { id: data.caseId },
@@ -321,7 +344,7 @@ export const generateArtifactFn = createServerFn({ method: "POST" })
321
344
  })) as unknown as ArtifactRow;
322
345
 
323
346
  return { artifact: castArtifact(artifact, testCase.version) };
324
- });
347
+ }
325
348
 
326
349
  // ── 采纳 / 拒绝 ──
327
350
 
@@ -35,7 +35,7 @@ import {
35
35
  TESTCASE_ORDER_DIRECTIONS,
36
36
  TESTCASE_ORDER_FIELD_MAP,
37
37
  TESTCASE_ORDER_KEYS,
38
- } from "@/components/testcase/display/field-configs";
38
+ } from "@/shared/testcase/field-configs";
39
39
  import type { TestCaseSummary, TestCaseSteps } from "./types";
40
40
  import type { TestCaseAutomation, TestCasePriority, TestCaseState, TestCaseType } from "./constants";
41
41
 
@@ -37,7 +37,7 @@ import {
37
37
  TESTCASE_ORDER_DIRECTIONS,
38
38
  TESTCASE_ORDER_FIELD_MAP,
39
39
  TESTCASE_ORDER_KEYS,
40
- } from "@/components/testcase/display/field-configs";
40
+ } from "@/shared/testcase/field-configs";
41
41
  import { CreateTestCaseInputSchema, UpdateTestCaseInputSchema } from "./schemas";
42
42
  import {
43
43
  TEST_CASE_AUTOMATION_VALUES,
@@ -41,7 +41,7 @@ import {
41
41
  type TestCaseOrderDirection,
42
42
  type TestCaseOrderKey,
43
43
  type TestCasePageSize,
44
- } from "@/components/testcase/display/field-configs";
44
+ } from "@/shared/testcase/field-configs";
45
45
  import type { Prisma } from "@allbluecn/database";
46
46
 
47
47
  function toJson<T>(value: T): Prisma.InputJsonValue {
@@ -28,7 +28,7 @@ import { getRequest } from "@tanstack/react-start/server";
28
28
  import { z } from "zod";
29
29
  import type { Prisma } from "@allbluecn/database";
30
30
  import { requireAuth } from "@/server/auth-helpers";
31
- import { TESTCASE_DISPLAY_OPTIONS_VIEW_NAME } from "@/components/testcase/display/field-configs";
31
+ import { TESTCASE_DISPLAY_OPTIONS_VIEW_NAME } from "@/shared/testcase/field-configs";
32
32
 
33
33
  // 显示选项保留行(任务 20,testcase-display-options.ts 落点)对视图清单
34
34
  // 不可见、不可建/改(bug-views.ts NOT_RESERVED 同构收口)。
@@ -17,7 +17,7 @@
17
17
 
18
18
  // 测试域共享 DTO 类型(纯类型模块,双端安全):列表/详情 serverFn 返回与客户端组件共用。
19
19
  // 日期字段跨 JSON 边界一律 string(ISO),与 bug 列表 DTO castToISO 惯例一致。
20
- import type { UserBrief } from "@/components/story/types";
20
+ import type { UserBrief } from "@/shared/story/types";
21
21
  import type { TestRunSummaryJson } from "@/server/testcase/run-summary";
22
22
  import type {
23
23
  TestCaseAutomation,
@@ -18,12 +18,13 @@
18
18
  import type { Prisma } from "@allbluecn/database";
19
19
  import { getPrisma } from "@allbluecn/database/get-prisma";
20
20
  import type { AvatarConfig } from "@allbluecn/kernel";
21
- import type { StoryState, StoryPriority } from "@/components/story/constants";
21
+ import type { StoryState, StoryPriority } from "@/shared/story/constants";
22
+ import type { StoryDetail } from "@/shared/story/types";
22
23
  import type {
23
24
  UserBrief,
24
25
  ReactionGroup,
25
26
  ActivityItem,
26
- } from "@/components/story/types";
27
+ } from "@/shared/story/types";
27
28
 
28
29
  export const USER_BRIEF_SELECT = {
29
30
  id: true,
@@ -86,7 +87,10 @@ export type StoryListRow = Prisma.StoryGetPayload<{ select: typeof STORY_LIST_SE
86
87
 
87
88
  export type StoryListRowLight = Prisma.StoryGetPayload<{ select: typeof STORY_LIST_SELECT_LIGHT }>;
88
89
 
89
- export function castStoryUsers<S extends StoryListRow>(s: S) {
90
+ // 显式返回 StoryDetail:STORY_LIST_SELECT 恒含 sequenceId 与 updatedBy(Date/
91
+ // enum string/Json avatar 亦在此单点转换),select 行经此即为客户端完整行类型,
92
+ // 列表/详情/依赖边消费方均无需再 as 强转(S14)。
93
+ export function castStoryUsers<S extends StoryListRow>(s: S): StoryDetail {
90
94
  return {
91
95
  ...s,
92
96
  state: s.state as StoryState,
@@ -51,7 +51,7 @@ import {
51
51
  BUG_LIST_SELECT,
52
52
  castBugUsers,
53
53
  type ReproduceSteps,
54
- } from "../../../components/bug/types";
54
+ } from "@/shared/bug/types";
55
55
 
56
56
  // 规格 §3.3 权威 action 全集(§3.1/§3.3 原文枚举 + 详情分区可产生的字段 diff)
57
57
  const SPEC_ACTIONS = [
@@ -15,12 +15,13 @@
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
- // BUG 域前端类型 + Prisma select 常量。Prisma 仅 type-only 导入(编译期擦除),
19
- // 运行时零依赖,客户端安全;禁止把本文件内容上移到 shared/bug(select 常量不进 shared 层)。
18
+ // BUG 域类型 + Prisma select 常量(S45 服务端/UI 边界专项迁入 src/shared:
19
+ // serverFn 与 UI 共用 select 常量与 cast 函数)。Prisma 仅 type-only 导入
20
+ // (编译期擦除),运行时零依赖,客户端安全。
20
21
  import type { Prisma } from "@allbluecn/database";
21
22
  import type { AvatarConfig } from "@allbluecn/kernel";
22
23
  import type { BugState, BugSeverity, BugSource } from "@/shared/bug/constants";
23
- import type { ReactionGroup, UserBrief } from "@/components/story/types";
24
+ import type { ReactionGroup, UserBrief } from "@/shared/story/types";
24
25
 
25
26
  /** 用户 brief select(与 serverFns/story USER_BRIEF_SELECT 字段一致,本地声明避免运行时依赖 server 层) */
26
27
  export const BUG_USER_BRIEF_SELECT = {
@@ -17,7 +17,7 @@
17
17
 
18
18
  import { GitPullRequestArrow, CircleFadingArrowUp, Repeat, Repeat2, CalendarPlus2, Hash, MessageCircleCheck, RefreshCcwDot, CircleFadingPlus, CircleArrowUp, CircleArrowRight, CircleArrowDown, CircleSlash, CircleDashed, CircleCheckBig, LoaderCircle, CheckCircle2, XCircle, FilePenLine, FilePlus2, Flag, UserRound, CalendarCheck, Tags, TextInitial, ListTree, ArrowLeftRight, Link2, Paperclip, BookOpen, Unlink, Trash2, BookX, FileX, ArrowRightFromLine, ArrowLeftToLine, ArrowUpFromDot, ListChecks, Bug, type LucideIcon } from "lucide-react";
19
19
  import { m } from '@/paraglide/messages.js';
20
- import type { DependencyEdgeType, DependencyGroup } from "./types";
20
+ import type { DependencyEdgeType, DependencyGroup } from "@/shared/story/types";
21
21
 
22
22
  export type StoryState = "backlog" | "todo" | "in_progress" | "done" | "cancelled";
23
23
  export type StoryPriority = "urgent" | "high" | "medium" | "low" | "none";
@@ -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 type { StoryState, StoryPriority } from "./constants";
18
+ import type { StoryState, StoryPriority } from "@/shared/story/constants";
19
19
  import type { AvatarConfig } from "@allbluecn/kernel";
20
20
 
21
21
  export interface UserBrief {
@@ -212,9 +212,3 @@ export interface DependencyGroup {
212
212
  dependents: DependencyRow[]; // 依赖此需求的(我领先,边 sourceId = 我)
213
213
  }
214
214
 
215
- // ====== Peek 面板内实体叠加层(用例/BUG 行的面板内打开) ======
216
- // case 携带列表行数据 + 面板已加载的模块树(实体 peek 属性区解析用);
217
- // bug 由实体 peek 面板按 id 自取详情。
218
- export type StoryEntityOverlay =
219
- | { kind: "case"; item: import("@/server/serverFns/testcase/types").TestCaseSummary; folders: import("@/components/testcase/folder-tree").FolderNodeDto[] }
220
- | { kind: "bug"; id: string };
@@ -21,11 +21,10 @@ import type { LucideIcon } from "lucide-react";
21
21
  export type ProjectRole = "owner" | "admin" | "member" | "viewer";
22
22
  export type MemberStatus = "active" | "invited" | "suspended";
23
23
 
24
- // 用户精简信息(用于成员/活动展示)
24
+ // 用户精简信息(用于成员/活动展示;S41 最小披露——项目域不下发 email)
25
25
  export interface ProjectUserBrief {
26
26
  id: string;
27
27
  username: string;
28
- email: string;
29
28
  avatarConfig?: unknown;
30
29
  bgShape?: string | null;
31
30
  bgColor?: string | null;