@whispering233/ai-editor-shared 0.0.57 → 0.0.58

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 (47) hide show
  1. package/dist/authors/catalog.d.ts +14 -0
  2. package/dist/authors/catalog.d.ts.map +1 -0
  3. package/dist/authors/catalog.js +23 -0
  4. package/dist/authors/catalog.js.map +1 -0
  5. package/dist/authors/index.d.ts +4 -0
  6. package/dist/authors/index.d.ts.map +1 -0
  7. package/dist/authors/index.js +6 -0
  8. package/dist/authors/index.js.map +1 -0
  9. package/dist/authors/jiangnan.d.ts +3 -0
  10. package/dist/authors/jiangnan.d.ts.map +1 -0
  11. package/dist/authors/jiangnan.js +93 -0
  12. package/dist/authors/jiangnan.js.map +1 -0
  13. package/dist/authors/types.d.ts +18 -0
  14. package/dist/authors/types.d.ts.map +1 -0
  15. package/dist/authors/types.js +2 -0
  16. package/dist/authors/types.js.map +1 -0
  17. package/dist/constants/index.d.ts +2 -0
  18. package/dist/constants/index.d.ts.map +1 -1
  19. package/dist/constants/index.js +3 -1
  20. package/dist/constants/index.js.map +1 -1
  21. package/dist/constants/practice.d.ts +15 -0
  22. package/dist/constants/practice.d.ts.map +1 -0
  23. package/dist/constants/practice.js +21 -0
  24. package/dist/constants/practice.js.map +1 -0
  25. package/dist/constants/tool.d.ts +37 -2
  26. package/dist/constants/tool.d.ts.map +1 -1
  27. package/dist/constants/tool.js +58 -3
  28. package/dist/constants/tool.js.map +1 -1
  29. package/dist/constants/workspace.d.ts +22 -0
  30. package/dist/constants/workspace.d.ts.map +1 -0
  31. package/dist/constants/workspace.js +33 -0
  32. package/dist/constants/workspace.js.map +1 -0
  33. package/dist/index.d.ts +1 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +1 -0
  36. package/dist/index.js.map +1 -1
  37. package/dist/types/api.d.ts +201 -1
  38. package/dist/types/api.d.ts.map +1 -1
  39. package/dist/types/api.js +174 -2
  40. package/dist/types/api.js.map +1 -1
  41. package/dist/types/project.d.ts +25 -0
  42. package/dist/types/project.d.ts.map +1 -1
  43. package/dist/utils/mapping.d.ts +3 -3
  44. package/dist/utils/mapping.d.ts.map +1 -1
  45. package/dist/utils/mapping.js +9 -3
  46. package/dist/utils/mapping.js.map +1 -1
  47. package/package.json +1 -1
@@ -16,13 +16,18 @@ export declare const projectLanguageSchema: z.ZodEnum<{
16
16
  zh: "zh";
17
17
  en: "en";
18
18
  }>;
19
+ /** 工作区类型(project.json `kind`;枚举取值 = shared WORKSPACE_DIRS 键集) */
20
+ export declare const workspaceKindSchema: z.ZodEnum<{
21
+ novel: "novel";
22
+ practice: "practice";
23
+ }>;
19
24
  /**
20
25
  * 错误码全量枚举
21
26
  * 文档出处:各端点错误响应;DELTA_CONFLICT 为 2026-08 修订废弃码
22
27
  * (computeState 改为 skipped/conflicts 字段呈现,不再返回 409——保留枚举兼容历史引用);
23
28
  * 末尾四个为 命名(文档未给具体码名,按语义命名,供 SSE error 事件使用)
24
29
  */
25
- export declare const ERROR_CODES: readonly ["VALIDATION_ERROR", "ENTITY_NOT_FOUND", "RELATION_EXISTS", "EVENT_ALREADY_MOUNTED", "RELATION_NOT_FOUND", "OUTLINE_NODE_NOT_FOUND", "OUTLINE_ANCESTOR_DELETED", "INVALID_PROJECT_PATH", "PROPOSAL_STALE", "PROPOSAL_NOT_FOUND", "PROPOSAL_PROJECT_MISMATCH", "SCHEMA_VERSION_MISMATCH", "PROJECT_VERSION_NEWER", "BACKUP_TARGET_EXISTS", "SESSION_NOT_FOUND", "SESSION_BUSY", "CHAT_BUSY", "THINKING_NOT_FOUND", "DOCUMENT_STALE", "DELTA_CONFLICT", "TOOL_RESULT_TOO_LARGE"];
30
+ export declare const ERROR_CODES: readonly ["VALIDATION_ERROR", "ENTITY_NOT_FOUND", "RELATION_EXISTS", "EVENT_ALREADY_MOUNTED", "RELATION_NOT_FOUND", "OUTLINE_NODE_NOT_FOUND", "OUTLINE_ANCESTOR_DELETED", "INVALID_PROJECT_PATH", "KIND_MISMATCH", "PRACTICE_NOT_FOUND", "PROPOSAL_STALE", "PROPOSAL_NOT_FOUND", "PROPOSAL_PROJECT_MISMATCH", "SCHEMA_VERSION_MISMATCH", "PROJECT_VERSION_NEWER", "BACKUP_TARGET_EXISTS", "SESSION_NOT_FOUND", "SESSION_BUSY", "CHAT_BUSY", "THINKING_NOT_FOUND", "DOCUMENT_STALE", "DELTA_CONFLICT", "TOOL_RESULT_TOO_LARGE"];
26
31
  /** ErrorCode 枚举 schema */
27
32
  export declare const errorCodeSchema: z.ZodEnum<{
28
33
  VALIDATION_ERROR: "VALIDATION_ERROR";
@@ -33,6 +38,8 @@ export declare const errorCodeSchema: z.ZodEnum<{
33
38
  OUTLINE_NODE_NOT_FOUND: "OUTLINE_NODE_NOT_FOUND";
34
39
  OUTLINE_ANCESTOR_DELETED: "OUTLINE_ANCESTOR_DELETED";
35
40
  INVALID_PROJECT_PATH: "INVALID_PROJECT_PATH";
41
+ KIND_MISMATCH: "KIND_MISMATCH";
42
+ PRACTICE_NOT_FOUND: "PRACTICE_NOT_FOUND";
36
43
  PROPOSAL_STALE: "PROPOSAL_STALE";
37
44
  PROPOSAL_NOT_FOUND: "PROPOSAL_NOT_FOUND";
38
45
  PROPOSAL_PROJECT_MISMATCH: "PROPOSAL_PROJECT_MISMATCH";
@@ -67,6 +74,8 @@ export declare const apiErrorSchema: z.ZodObject<{
67
74
  OUTLINE_NODE_NOT_FOUND: "OUTLINE_NODE_NOT_FOUND";
68
75
  OUTLINE_ANCESTOR_DELETED: "OUTLINE_ANCESTOR_DELETED";
69
76
  INVALID_PROJECT_PATH: "INVALID_PROJECT_PATH";
77
+ KIND_MISMATCH: "KIND_MISMATCH";
78
+ PRACTICE_NOT_FOUND: "PRACTICE_NOT_FOUND";
70
79
  PROPOSAL_STALE: "PROPOSAL_STALE";
71
80
  PROPOSAL_NOT_FOUND: "PROPOSAL_NOT_FOUND";
72
81
  PROPOSAL_PROJECT_MISMATCH: "PROPOSAL_PROJECT_MISMATCH";
@@ -256,6 +265,11 @@ export declare const projectCreateReqSchema: z.ZodObject<{
256
265
  zh: "zh";
257
266
  en: "en";
258
267
  }>>;
268
+ kind: z.ZodOptional<z.ZodEnum<{
269
+ novel: "novel";
270
+ practice: "practice";
271
+ }>>;
272
+ author_id: z.ZodOptional<z.ZodString>;
259
273
  }, z.core.$strict>>;
260
274
  }, z.core.$strict>;
261
275
  export declare const projectCreateResSchema: z.ZodObject<{
@@ -303,6 +317,11 @@ export declare const projectListResSchema: z.ZodObject<{
303
317
  id: z.ZodString;
304
318
  name: z.ZodString;
305
319
  path: z.ZodString;
320
+ kind: z.ZodEnum<{
321
+ novel: "novel";
322
+ practice: "practice";
323
+ }>;
324
+ authorId: z.ZodNullable<z.ZodString>;
306
325
  updatedAt: z.ZodString;
307
326
  }, z.core.$strip>>;
308
327
  }, z.core.$strip>;
@@ -758,6 +777,8 @@ export declare const chatSendReqSchema: z.ZodObject<{
758
777
  focus_entity_id: z.ZodOptional<z.ZodString>;
759
778
  focus_node_id: z.ZodOptional<z.ZodString>;
760
779
  focus_deduction: z.ZodOptional<z.ZodBoolean>;
780
+ practice_sample_id: z.ZodOptional<z.ZodString>;
781
+ practice_free_piece_id: z.ZodOptional<z.ZodString>;
761
782
  }, z.core.$strip>>;
762
783
  }, z.core.$strict>;
763
784
  export declare const chatSessionSummarySchema: z.ZodObject<{
@@ -956,6 +977,185 @@ export declare const namesResolveResSchema: z.ZodObject<{
956
977
  }, z.core.$strip>>>;
957
978
  }, z.core.$strip>;
958
979
  export type NamesResolveResult = z.infer<typeof namesResolveResSchema>;
980
+ /**
981
+ * 评论卡(`GET /practice/samples/:id` / `GET /practice/free/:id` 的 `feedback`)。
982
+ * **卡内层字段恒 snake_case**——遵循公共约定的「嵌套对象内部字段原样透传」(docs/api/api-public.md),
983
+ * camelCase 映射只作用于 API 顶层契约字段。
984
+ * 两形态练习同形(同一份 schema、同一个前端卡面组件),差别只在**引用校验源**与页面标签:
985
+ * 仿写 = 范文(`sample_*` 即范文侧特征与引用)、自由练习 = 作家风格说明(`sample_*` 即风格说明侧)。
986
+ * **只描述形状、不做语义校验**:卡内形状校验在**写入侧**(提交点评工具),读取侧只做「非对象 → null」
987
+ * 的防御解析(db 层:非法 JSON / 数组 / 字符串 / `null` → null;**合法 JSON 对象一律透传**,`{}` 亦然)。
988
+ * `dimensions[]` 由 AI 从依据中提炼(非固定清单,上限 = `MAX_FEEDBACK_DIMENSIONS`,写入侧约束)。
989
+ */
990
+ export declare const practiceFeedbackSchema: z.ZodObject<{
991
+ dimensions: z.ZodArray<z.ZodObject<{
992
+ name: z.ZodString;
993
+ sample_trait: z.ZodString;
994
+ draft_trait: z.ZodString;
995
+ sample_quotes: z.ZodArray<z.ZodString>;
996
+ draft_quotes: z.ZodArray<z.ZodString>;
997
+ advice: z.ZodString;
998
+ }, z.core.$strip>>;
999
+ summary: z.ZodOptional<z.ZodString>;
1000
+ }, z.core.$strip>;
1001
+ export type PracticeFeedbackCard = z.infer<typeof practiceFeedbackSchema>;
1002
+ /** 自由练习的题目来源:用户自拟 / 让 AI 出题(`ai` + 空题目 = 待出题) */
1003
+ export declare const practiceTopicSourceSchema: z.ZodEnum<{
1004
+ user: "user";
1005
+ ai: "ai";
1006
+ }>;
1007
+ export type PracticeTopicSource = z.infer<typeof practiceTopicSourceSchema>;
1008
+ /** 范文样本列表项(**列表不回范文正文与稿件 / 卡体**) */
1009
+ export declare const practiceSampleSummarySchema: z.ZodObject<{
1010
+ id: z.ZodString;
1011
+ workId: z.ZodNullable<z.ZodString>;
1012
+ excerptLabel: z.ZodString;
1013
+ charCount: z.ZodNumber;
1014
+ hasDraft: z.ZodBoolean;
1015
+ hasFeedback: z.ZodBoolean;
1016
+ createdAt: z.ZodString;
1017
+ updatedAt: z.ZodString;
1018
+ }, z.core.$strip>;
1019
+ export type PracticeSampleSummary = z.infer<typeof practiceSampleSummarySchema>;
1020
+ export declare const practiceSamplesResSchema: z.ZodObject<{
1021
+ samples: z.ZodArray<z.ZodObject<{
1022
+ id: z.ZodString;
1023
+ workId: z.ZodNullable<z.ZodString>;
1024
+ excerptLabel: z.ZodString;
1025
+ charCount: z.ZodNumber;
1026
+ hasDraft: z.ZodBoolean;
1027
+ hasFeedback: z.ZodBoolean;
1028
+ createdAt: z.ZodString;
1029
+ updatedAt: z.ZodString;
1030
+ }, z.core.$strip>>;
1031
+ }, z.core.$strip>;
1032
+ export type PracticeSamplesRes = z.infer<typeof practiceSamplesResSchema>;
1033
+ export declare const practiceSampleCreateReqSchema: z.ZodObject<{
1034
+ work_id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1035
+ excerpt_label: z.ZodOptional<z.ZodString>;
1036
+ text: z.ZodString;
1037
+ }, z.core.$strict>;
1038
+ /**
1039
+ * 样本详情(`GET /practice/samples/:id`;**唯一返回范文全文与点评卡的读端点**)——
1040
+ * 也是新建样本的响应形状(新建时 `draft` = ""、`feedback` = null)。
1041
+ */
1042
+ export declare const practiceSampleDetailResSchema: z.ZodObject<{
1043
+ id: z.ZodString;
1044
+ workId: z.ZodNullable<z.ZodString>;
1045
+ excerptLabel: z.ZodString;
1046
+ text: z.ZodString;
1047
+ draft: z.ZodString;
1048
+ feedback: z.ZodNullable<z.ZodObject<{
1049
+ dimensions: z.ZodArray<z.ZodObject<{
1050
+ name: z.ZodString;
1051
+ sample_trait: z.ZodString;
1052
+ draft_trait: z.ZodString;
1053
+ sample_quotes: z.ZodArray<z.ZodString>;
1054
+ draft_quotes: z.ZodArray<z.ZodString>;
1055
+ advice: z.ZodString;
1056
+ }, z.core.$strip>>;
1057
+ summary: z.ZodOptional<z.ZodString>;
1058
+ }, z.core.$strip>>;
1059
+ createdAt: z.ZodString;
1060
+ updatedAt: z.ZodString;
1061
+ }, z.core.$strip>;
1062
+ export type PracticeSampleDetail = z.infer<typeof practiceSampleDetailResSchema>;
1063
+ /** 自由练习列表项(**列表不回稿件与卡体**) */
1064
+ export declare const practicePieceSummarySchema: z.ZodObject<{
1065
+ id: z.ZodString;
1066
+ topic: z.ZodString;
1067
+ brief: z.ZodString;
1068
+ topicSource: z.ZodEnum<{
1069
+ user: "user";
1070
+ ai: "ai";
1071
+ }>;
1072
+ charCount: z.ZodNumber;
1073
+ hasDraft: z.ZodBoolean;
1074
+ hasFeedback: z.ZodBoolean;
1075
+ createdAt: z.ZodString;
1076
+ updatedAt: z.ZodString;
1077
+ }, z.core.$strip>;
1078
+ export type PracticePieceSummary = z.infer<typeof practicePieceSummarySchema>;
1079
+ export declare const practicePiecesResSchema: z.ZodObject<{
1080
+ pieces: z.ZodArray<z.ZodObject<{
1081
+ id: z.ZodString;
1082
+ topic: z.ZodString;
1083
+ brief: z.ZodString;
1084
+ topicSource: z.ZodEnum<{
1085
+ user: "user";
1086
+ ai: "ai";
1087
+ }>;
1088
+ charCount: z.ZodNumber;
1089
+ hasDraft: z.ZodBoolean;
1090
+ hasFeedback: z.ZodBoolean;
1091
+ createdAt: z.ZodString;
1092
+ updatedAt: z.ZodString;
1093
+ }, z.core.$strip>>;
1094
+ }, z.core.$strip>;
1095
+ export type PracticePiecesRes = z.infer<typeof practicePiecesResSchema>;
1096
+ /**
1097
+ * POST /api/v1/practice/free。
1098
+ * `topic_source = "user"` ⇒ `topic` 必填(trim 非空);`= "ai"` ⇒ `topic` 必须省略或为空串
1099
+ * (建「待出题」空题行,题目由出题工具写入)——两条分支的一致性由 superRefine 表达,故不是 flat object。
1100
+ */
1101
+ export declare const practicePieceCreateReqSchema: z.ZodObject<{
1102
+ topic_source: z.ZodEnum<{
1103
+ user: "user";
1104
+ ai: "ai";
1105
+ }>;
1106
+ topic: z.ZodOptional<z.ZodString>;
1107
+ brief: z.ZodOptional<z.ZodString>;
1108
+ }, z.core.$strict>;
1109
+ /** 自由练习详情(`GET /practice/free/:id`;**唯一返回稿件全文与点评卡的读端点**)——也是新建的响应形状 */
1110
+ export declare const practicePieceDetailResSchema: z.ZodObject<{
1111
+ id: z.ZodString;
1112
+ topic: z.ZodString;
1113
+ brief: z.ZodString;
1114
+ topicSource: z.ZodEnum<{
1115
+ user: "user";
1116
+ ai: "ai";
1117
+ }>;
1118
+ draft: z.ZodString;
1119
+ feedback: z.ZodNullable<z.ZodObject<{
1120
+ dimensions: z.ZodArray<z.ZodObject<{
1121
+ name: z.ZodString;
1122
+ sample_trait: z.ZodString;
1123
+ draft_trait: z.ZodString;
1124
+ sample_quotes: z.ZodArray<z.ZodString>;
1125
+ draft_quotes: z.ZodArray<z.ZodString>;
1126
+ advice: z.ZodString;
1127
+ }, z.core.$strip>>;
1128
+ summary: z.ZodOptional<z.ZodString>;
1129
+ }, z.core.$strip>>;
1130
+ createdAt: z.ZodString;
1131
+ updatedAt: z.ZodString;
1132
+ }, z.core.$strip>;
1133
+ export type PracticePieceDetail = z.infer<typeof practicePieceDetailResSchema>;
1134
+ /** PUT /api/v1/practice/samples/:id 与 PUT /api/v1/practice/free/:id(**用户写稿唯一入口**;strict 单字段) */
1135
+ export declare const practiceDraftPutReqSchema: z.ZodObject<{
1136
+ draft: z.ZodString;
1137
+ }, z.core.$strict>;
1138
+ /** 版本戳(客户端据此判断保存结果;并发口径 = 后写覆盖,不带版本戳) */
1139
+ export declare const practiceDraftPutResSchema: z.ZodObject<{
1140
+ updatedAt: z.ZodString;
1141
+ }, z.core.$strip>;
1142
+ export type PracticeDraftPutRes = z.infer<typeof practiceDraftPutResSchema>;
1143
+ /** DELETE 两类练习(物理删) */
1144
+ export declare const practiceDeleteResSchema: z.ZodObject<{
1145
+ deleted: z.ZodLiteral<true>;
1146
+ }, z.core.$strip>;
1147
+ export type PracticeDeleted = z.infer<typeof practiceDeleteResSchema>;
1148
+ /** GET /api/v1/practice/style-pack:`content` = 用户覆盖 `??` 预置(恒非空) */
1149
+ export declare const practiceStylePackResSchema: z.ZodObject<{
1150
+ authorId: z.ZodString;
1151
+ content: z.ZodString;
1152
+ customized: z.ZodBoolean;
1153
+ updatedAt: z.ZodNullable<z.ZodString>;
1154
+ }, z.core.$strip>;
1155
+ export type PracticeStylePack = z.infer<typeof practiceStylePackResSchema>;
1156
+ export declare const practiceStylePackPutReqSchema: z.ZodObject<{
1157
+ content: z.ZodString;
1158
+ }, z.core.$strict>;
959
1159
  export declare const cloudConfigPutReqSchema: z.ZodObject<{
960
1160
  url: z.ZodOptional<z.ZodString>;
961
1161
  username: z.ZodOptional<z.ZodString>;
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/types/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/types/api.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAexB,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC/H,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAIlG,oDAAoD;AACpD,eAAO,MAAM,gBAAgB;;;;;;;;EAAuB,CAAC;AAErD,yBAAyB;AACzB,eAAO,MAAM,qBAAqB;;;EAAuB,CAAC;AAE1D,iEAAiE;AACjE,eAAO,MAAM,mBAAmB;;;EAA0B,CAAC;AAI3D;;;;;GAKG;AACH,eAAO,MAAM,WAAW,ggBA2Bd,CAAC;AAEX,0BAA0B;AAC1B,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;EAAsB,CAAC;AAEnD,6CAA6C;AAC7C,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAIxD,wCAAwC;AACxC,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC;;;kBAKlE;AAED,mEAAmE;AACnE,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAOzB,CAAC;AAEH,aAAa;AACb,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAItD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;iBAchB,CAAC;AAEjB;;;0EAG0E;AAC1E,eAAO,MAAM,iBAAiB;;;;;iBAOd,CAAC;AAEjB,8DAA8D;AAC9D,eAAO,MAAM,kBAAkB;;;;;iBAOf,CAAC;AAEjB,gHAAgH;AAChH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;iBAWX,CAAC;AAEjB,0DAA0D;AAC1D,eAAO,MAAM,eAAe;;;iBAKZ,CAAC;AAEjB,2EAA2E;AAC3E,eAAO,MAAM,mBAAmB,gCAA6B,CAAC;AAE9D;;;;;;+FAM+F;AAC/F,eAAO,MAAM,mBAAmB;;;;;iBAOhB,CAAC;AAEjB;;;;GAIG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAQtB,CAAC;AAIX;wCACwC;AACxC,eAAO,MAAM,mBAAmB,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAYvD,CAAC;AAGH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;kBAgBxB,CAAC;AAEZ,eAAO,MAAM,sBAAsB;;;;iBAIjC,CAAC;AAGH,eAAO,MAAM,oBAAoB;;kBAItB,CAAC;AAEZ,eAAO,MAAM,oBAAoB;;;;;;;;iBAK/B,CAAC;AAGH,eAAO,MAAM,qBAAqB;;iBAEhC,CAAC;AAQH,eAAO,MAAM,sBAAsB;;;;kBAMxB,CAAC;AAEZ,eAAO,MAAM,sBAAsB;;;;;;;;;;;iBASjC,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAGtE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;iBAqB/B,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;AAGpF,eAAO,MAAM,sBAAsB,qFAAsB,CAAC;AAG1D,eAAO,MAAM,4BAA4B;;;;;;;;;kBAmB9B,CAAC;AAEZ,eAAO,MAAM,4BAA4B;;iBAEvC,CAAC;AAKH,eAAO,MAAM,yBAAyB,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAI7D,CAAC;AAKH,eAAO,MAAM,yBAAyB;;kBAI3B,CAAC;AAEZ,eAAO,MAAM,yBAAyB;;;iBAGpC,CAAC;AAQH,eAAO,MAAM,sBAAsB;;kBAIxB,CAAC;AACZ,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAItE,eAAO,MAAM,4BAA4B;;;kBAK9B,CAAC;AACZ,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAIlF;;;GAGG;AACH,eAAO,MAAM,yBAAyB,sDAAuD,CAAC;AAE9F;;;;;;;;;;GAUG;AAYH,eAAO,MAAM,sBAAsB;;;;;;;;;iBAOjC,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAItE;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,CAWzD,CAAC;AAEH,uEAAuE;AACvE,eAAO,MAAM,mBAAmB,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAYvD,CAAC;AAGH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;iBAgBhC,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;iBAK9B,CAAC;AAGH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;iBAShC,CAAC;AAGH,eAAO,MAAM,qBAAqB;;;kBAKvB,CAAC;AAEZ,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;iBAMhC,CAAC;AAGH,eAAO,MAAM,qBAAqB;;;kBAKvB,CAAC;AAEZ,eAAO,MAAM,qBAAqB;;;iBAGhC,CAAC;AAGH,eAAO,MAAM,qBAAqB;;;;;;iBAMhC,CAAC;AAMH,qBAAqB;AACrB,eAAO,MAAM,kBAAkB;;;;;;;;;;;iBAG7B,CAAC;AAGH,eAAO,MAAM,mBAAmB;;;;;;;iBAO9B,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;iBAGjC,CAAC;AAIH,eAAO,MAAM,uBAAuB;;;;;;;kBAezB,CAAC;AAEZ,eAAO,MAAM,uBAAuB;;;;;;;;;iBASlC,CAAC;AAGH,eAAO,MAAM,2BAA2B;;kBAI7B,CAAC;AAGZ,eAAO,MAAM,uBAAuB;;iBAElC,CAAC;AAIH,mDAAmD;AACnD,eAAO,MAAM,aAAa;;;;;EAA6C,CAAC;AAExE,aAAa;AACb,eAAO,MAAM,iBAAiB;;;;;;;;;;;iBAM5B,CAAC;AAEH,2CAA2C;AAC3C,eAAO,MAAM,iBAAiB,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAUnD,CAAC;AAGH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;kBAQtB,CAAC;AAEZ,eAAO,MAAM,oBAAoB;;;iBAG/B,CAAC;AAGH,eAAO,MAAM,oBAAoB;;;iBAG/B,CAAC;AAGH,eAAO,MAAM,qBAAqB;;;;kBAMvB,CAAC;AAEZ,eAAO,MAAM,qBAAqB,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,CA8B9D,CAAC;AAIH;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe;;;;;;;;;iBAOZ,CAAC;AAEjB,eAAO,MAAM,iBAAiB;;;iBAKd,CAAC;AAEjB,eAAO,MAAM,gBAAgB;;;iBAKb,CAAC;AAEjB;;;GAGG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;CAI5B,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,CAAC,CAAC,UAoBjC,CAAC;AAEF,iCAAiC;AACjC,eAAO,MAAM,iBAAiB;;;;;iBAK5B,CAAC;AAGH,eAAO,MAAM,qBAAqB;;;;;iBAOhC,CAAC;AAGH,eAAO,MAAM,sBAAsB;;;;;;;;;;kBAQxB,CAAC;AAEZ,eAAO,MAAM,sBAAsB;;;;;;;;;;iBAMjC,CAAC;AAGH,eAAO,MAAM,sBAAsB;;;;kBAMxB,CAAC;AAEZ,eAAO,MAAM,sBAAsB;;iBAEjC,CAAC;AAGH,eAAO,MAAM,oBAAoB;;;kBAKtB,CAAC;AAEZ,eAAO,MAAM,oBAAoB;;;;iBAI/B,CAAC;AAGH,eAAO,MAAM,mBAAmB;;kBAOrB,CAAC;AAEZ,eAAO,MAAM,mBAAmB;;iBAE9B,CAAC;AAIH,eAAO,MAAM,oBAAoB;;;kBAQtB,CAAC;AAIZ,eAAO,MAAM,oBAAoB;;;kBAQtB,CAAC;AAGZ,eAAO,MAAM,sBAAsB;;;;;;;iBAOjC,CAAC;AAGH,eAAO,MAAM,oBAAoB;;;iBAG/B,CAAC;AAKH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;iBAO7B,CAAC;AAGH,eAAO,MAAM,2BAA2B;;;;iBAItC,CAAC;AAGH,eAAO,MAAM,yBAAyB;;;;;iBAKpC,CAAC;AAGH,eAAO,MAAM,mBAAmB;;iBAE9B,CAAC;AASH,eAAO,MAAM,sBAAsB;;;;;iBAKjC,CAAC;AAGH,eAAO,MAAM,sBAAsB;;;kBAKxB,CAAC;AAEZ,eAAO,MAAM,sBAAsB;;;;iBAIjC,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAKtE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;kBAyBnB,CAAC;AAGZ,eAAO,MAAM,wBAAwB;;;;;;;iBAQnC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;iBAEhC,CAAC;AAIH,sFAAsF;AACtF,eAAO,MAAM,sBAAsB;;;;iBAIjC,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE;;;GAGG;AACH,eAAO,MAAM,eAAe;;;;;;;;;iBAS1B,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,wDAAwD;AACxD,eAAO,MAAM,eAAe;;;;iBAI1B,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAIxD,gEAAgE;AAChE,eAAO,MAAM,yBAAyB;;;;;iBAKpC,CAAC;AAEH,wDAAwD;AACxD,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAC3F,2BAA2B;AAC3B,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAC5E,2BAA2B;AAC3B,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE1E,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAiBhC,CAAC;AAIH,eAAO,MAAM,qBAAqB;;iBAEhC,CAAC;AAGH,eAAO,MAAM,0BAA0B;;iBAErC,CAAC;AAKH,eAAO,MAAM,wBAAwB;;;iBAGnC,CAAC;AAGH,eAAO,MAAM,uBAAuB;;iBAElC,CAAC;AAIH,8GAA8G;AAC9G,eAAO,MAAM,eAAe,sEAAuE,CAAC;AACpG,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,mDAAmD;AACnD,eAAO,MAAM,eAAe;;;;;;;iBAO1B,CAAC;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE3D,0EAA0E;AAC1E,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;iBAOjC,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAItE,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;iBAKlC,CAAC;AAKH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;kBAOzB,CAAC;AAEZ,eAAO,MAAM,uBAAuB;;iBAElC,CAAC;AAMH,eAAO,MAAM,qBAAqB;;kBAIvB,CAAC;AAEZ,eAAO,MAAM,qBAAqB;;;;;iBAEhC,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAevE;;;;;;;;;GASG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;iBAYjC,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAE1E,iDAAiD;AACjD,eAAO,MAAM,yBAAyB;;;EAAyB,CAAC;AAChE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAI5E,oCAAoC;AACpC,eAAO,MAAM,2BAA2B;;;;;;;;;iBAStC,CAAC;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAGhF,eAAO,MAAM,wBAAwB;;;;;;;;;;;iBAA8D,CAAC;AACpG,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAI1E,eAAO,MAAM,6BAA6B;;;;kBAM/B,CAAC;AAEZ;;;GAGG;AACH,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;iBASxC,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAIjF,6BAA6B;AAC7B,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;iBAUrC,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAG9E,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;iBAA4D,CAAC;AACjG,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE;;;;GAIG;AACH,eAAO,MAAM,4BAA4B;;;;;;;kBAgBrC,CAAC;AAEL,uEAAuE;AACvE,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;iBASvC,CAAC;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAI/E,gGAAgG;AAChG,eAAO,MAAM,yBAAyB;;kBAI3B,CAAC;AAEZ,yCAAyC;AACzC,eAAO,MAAM,yBAAyB;;iBAAsC,CAAC;AAC7E,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,uBAAuB;AACvB,eAAO,MAAM,uBAAuB;;iBAAyC,CAAC;AAC9E,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAItE,oEAAoE;AACpE,eAAO,MAAM,0BAA0B;;;;;iBAKrC,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAG3E,eAAO,MAAM,6BAA6B;;kBAI/B,CAAC;AAYZ,eAAO,MAAM,uBAAuB;;;;;;kBAQzB,CAAC;AACZ,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAMxE,eAAO,MAAM,kBAAkB;;;kBAKpB,CAAC;AACZ,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAK9D,eAAO,MAAM,kBAAkB;;kBAIpB,CAAC;AACZ,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,gFAAgF;AAChF,eAAO,MAAM,sBAAsB,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAQ7D,CAAC;AAKH,eAAO,MAAM,yBAAyB,EAAE,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAUtE,CAAC;AAKH,eAAO,MAAM,wBAAwB;;;kBAK1B,CAAC;AACZ,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE1E,eAAO,MAAM,wBAAwB,EAAE,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAOpE,CAAC"}
package/dist/types/api.js CHANGED
@@ -10,11 +10,15 @@ import { normalizeRelationType, relationTypeSyntaxError } from "../utils/relatio
10
10
  import { HOOK_STATUSES, PAYOFF_TIMING } from "../constants/hook.js";
11
11
  import { CONFLICT_LEVELS } from "../constants/outline.js";
12
12
  import { BACKUP_FREQUENCIES } from "../constants/backup.js";
13
+ import { WORKSPACE_KINDS } from "../constants/workspace.js";
14
+ import { MAX_PRACTICE_BRIEF_CHARS, MAX_PRACTICE_DRAFT_CHARS, MAX_PRACTICE_EXCERPT_LABEL_CHARS, MAX_PRACTICE_SAMPLE_CHARS, MAX_PRACTICE_STYLE_PACK_CHARS, MAX_PRACTICE_TOPIC_CHARS, } from "../constants/practice.js";
13
15
  // ============ 基础 schema ============
14
16
  /** 实体类型(entities 表 CHECK 约束;与 ENTITY_TYPES 常量对齐) */
15
17
  export const entityTypeSchema = z.enum(ENTITY_TYPES);
16
18
  /** 项目语言(project.json) */
17
19
  export const projectLanguageSchema = z.enum(["zh", "en"]);
20
+ /** 工作区类型(project.json `kind`;枚举取值 = shared WORKSPACE_DIRS 键集) */
21
+ export const workspaceKindSchema = z.enum(WORKSPACE_KINDS);
18
22
  // ============ ErrorCode(单一来源:REST / SSE / 工具共用,「错误码」) ============
19
23
  /**
20
24
  * 错误码全量枚举
@@ -32,6 +36,8 @@ export const ERROR_CODES = [
32
36
  "OUTLINE_NODE_NOT_FOUND", // 404 大纲节点不存在(compute / path / restore / purge)
33
37
  "OUTLINE_ANCESTOR_DELETED", // 409 restore 时存在软删祖先
34
38
  "INVALID_PROJECT_PATH", // 400 create/open 路径校验失败
39
+ "KIND_MISMATCH", // 400 工作区类型不匹配:小说语义端点/字段被练习工作区(或反向)访问;文案固定为「该端点仅适用于小说工作区」/「该端点仅适用于练习工作区」
40
+ "PRACTICE_NOT_FOUND", // 404 练习样本 / 自由练习篇不存在
35
41
  "PROPOSAL_STALE", // 409 确认时引用快照不一致
36
42
  "PROPOSAL_NOT_FOUND", // 404 proposal_id 不存在
37
43
  "PROPOSAL_PROJECT_MISMATCH", // 409 提案所属项目 ≠ 当前项目
@@ -174,6 +180,8 @@ export const projectConfigSchema = z.object({
174
180
  id: z.string(),
175
181
  name: z.string(),
176
182
  language: projectLanguageSchema,
183
+ kind: workspaceKindSchema, // 工作区类型(恒下发;服务端兜底后输出,旧文件缺 kind → novel)
184
+ authorId: z.string().nullable(), // 预置作家 id(仅练习工作区有值;缺 author_id / 小说工作区 → null)
177
185
  schemaVersion: z.number().int(), //
178
186
  currentPosition: z.string().nullable(), // 「当前位置」节点 id;null = 未设置
179
187
  deductionNodes: z.array(z.string()), // 推演节点标记(章节点 id 数组;顺序 = 可见章先序;缺字段 = [] 由读侧兜底)
@@ -189,6 +197,9 @@ export const projectCreateReqSchema = z
189
197
  .object({
190
198
  name: z.string().optional(),
191
199
  language: projectLanguageSchema.optional(),
200
+ kind: workspaceKindSchema.optional(), // 工作区类型(缺省 novel);落 project.json,决定目录约定之外的工具集/提示词/导航
201
+ author_id: z.string().optional(), // **仅 kind = "practice"**:预置作家 id(shared AUTHOR_CATALOG 的键)——
202
+ // novel 传入 / 值不在预置清单 → 400 VALIDATION_ERROR(成员校验在路由层,见 docs/api/10-api-project.md)
192
203
  // prompt 已废弃:不再接受(strict schema 传入 → 400 VALIDATION_ERROR);
193
204
  // 项目规则改由 PUT /api/v1/project/agents 写入
194
205
  })
@@ -240,11 +251,11 @@ export const projectDeleteResSchema = z.object({
240
251
  /** delete_remote 失败:本地已删、云端保留(best-effort,UI 提示可去云盘网页手动清理) */
241
252
  remoteError: z.object({ code: z.string(), message: z.string() }).optional(),
242
253
  });
243
- // GET /api/v1/project/list(书架模式 S1.5:列出创作根 books/ 下的书,供 Dashboard 书架展示)
254
+ // GET /api/v1/project/list(书架模式 S1.5:列出创作根各工作区目录下的工作区,供根首页书架展示)
244
255
  export const projectListResSchema = z.object({
245
256
  /** 创作根(server 启动参数 projectRoot) */
246
257
  rootPath: z.string(),
247
- /** books/ 下含 project.json 的书,按 updatedAt 倒序(最近更新在前) */
258
+ /** 各工作区目录(books/ + practice/)下含 project.json 的工作区,按 updatedAt 倒序(跨目录统一排序) */
248
259
  books: z.array(z.object({
249
260
  /** project.json 的 id——**项目身份**:当前书高亮 / 已打开判定一律按它,不按 name */
250
261
  id: z.string(),
@@ -252,6 +263,11 @@ export const projectListResSchema = z.object({
252
263
  name: z.string(),
253
264
  /** 书目录绝对路径(books/<name>) */
254
265
  path: z.string(),
266
+ /** 工作区类型(旧文件缺 kind → 服务端经 shared 兜底 novel 后输出) */
267
+ kind: workspaceKindSchema,
268
+ /** 预置作家 id(**仅练习工作区**;project.json 的 author_id 缺失 / 未知 → null)——客户端据此
269
+ * 与预置作家清单对应,解析不到的练习行客户端不展示(存量目录留盘) */
270
+ authorId: z.string().nullable(),
255
271
  /** project.json 的 updated_at(ISO 8601,应用层写入) */
256
272
  updatedAt: z.string(),
257
273
  })),
@@ -816,6 +832,17 @@ export const chatSendReqSchema = z
816
832
  focus_node_id: z.string().optional(),
817
833
  /** true = 注入「推演节点集合」段(服务端现读 project.json 的 deduction_nodes 展开;无标记/全失效 → 静默省略) */
818
834
  focus_deduction: z.boolean().optional(),
835
+ /**
836
+ * 练习样本 id(`ps-*`)= 触发一次仿写点评:服务端**现读**样本,注入「样本 id + 作家名 +
837
+ * 作品名 + 片段说明」的事实段(**范文与用户稿绝不进 prompt**,走只读工具分页拉取);
838
+ * 样本不存在 → 静默省略该段。口径见 docs/design/60-practice.md §8。
839
+ */
840
+ practice_sample_id: z.string().optional(),
841
+ /**
842
+ * 自由练习篇 id(`pf-*`)= 触发一次自由练习点评 / 让 AI 出题:服务端**现读**该篇注入事实段
843
+ * (篇 id + 作家名 + 题目 + 写作要求)。口径与注入展开见 docs/design/60-practice.md §8。
844
+ */
845
+ practice_free_piece_id: z.string().optional(),
819
846
  })
820
847
  .optional(),
821
848
  })
@@ -957,6 +984,151 @@ export const namesResolveReqSchema = z
957
984
  export const namesResolveResSchema = z.object({
958
985
  names: z.record(z.string(), z.object({ label: z.string(), name: z.string() }).nullable()),
959
986
  });
987
+ // ============ practice 端点(「作家文风练习」,docs/api/120-api-practice.md) ============
988
+ //
989
+ // 全部端点要求当前工作区 kind = "practice"(反向守卫 requireKind("practice") 的挂载点只在
990
+ // server/src/index.ts,且在该组 app.route 之前)**且** project.json 的 `author_id` 能解析到预置作家
991
+ // (shared `resolveAuthor`);kind 不符 → 400 KIND_MISMATCH,作家缺失/未知 → 400 VALIDATION_ERROR
992
+ // (文案「练习工作区未关联预置作家」);无当前工作区 → 409 NO_PROJECT_OPEN。
993
+ // 请求字段 snake_case、响应顶层字段 camelCase(**嵌套对象内部字段按公共约定原样透传**,
994
+ // 即点评卡内层恒 snake_case,见 `practiceFeedbackSchema`);**长度上限一律取 shared 常量**
995
+ // (constants/practice.ts,schema 里不复述数字)⇒ 超限 400 VALIDATION_ERROR;
996
+ // 样本 / 自由练习不存在 → 404 PRACTICE_NOT_FOUND。点评链路(触发 / 落库 / 渲染)不在本模块。
997
+ // **作家素材(介绍 / 作品清单 / 风格说明预置文本)没有端点**——客户端与服务端都直读 shared 常量,
998
+ // 本模块只有「风格说明的用户覆盖」三个端点。
999
+ /**
1000
+ * 评论卡(`GET /practice/samples/:id` / `GET /practice/free/:id` 的 `feedback`)。
1001
+ * **卡内层字段恒 snake_case**——遵循公共约定的「嵌套对象内部字段原样透传」(docs/api/api-public.md),
1002
+ * camelCase 映射只作用于 API 顶层契约字段。
1003
+ * 两形态练习同形(同一份 schema、同一个前端卡面组件),差别只在**引用校验源**与页面标签:
1004
+ * 仿写 = 范文(`sample_*` 即范文侧特征与引用)、自由练习 = 作家风格说明(`sample_*` 即风格说明侧)。
1005
+ * **只描述形状、不做语义校验**:卡内形状校验在**写入侧**(提交点评工具),读取侧只做「非对象 → null」
1006
+ * 的防御解析(db 层:非法 JSON / 数组 / 字符串 / `null` → null;**合法 JSON 对象一律透传**,`{}` 亦然)。
1007
+ * `dimensions[]` 由 AI 从依据中提炼(非固定清单,上限 = `MAX_FEEDBACK_DIMENSIONS`,写入侧约束)。
1008
+ */
1009
+ export const practiceFeedbackSchema = z.object({
1010
+ dimensions: z.array(z.object({
1011
+ name: z.string(), // 维度名(如「句长节奏」)
1012
+ sample_trait: z.string(), // 依据侧(仿写 = 范文;自由练习 = 风格说明)在该维度上的表现
1013
+ draft_trait: z.string(), // 用户稿在该维度上的表现
1014
+ sample_quotes: z.array(z.string()), // 依据原句(写入侧已校验 = 依据子串)
1015
+ draft_quotes: z.array(z.string()), // 用户稿原句(= 稿件子串)
1016
+ advice: z.string(), // 可执行建议
1017
+ })),
1018
+ summary: z.string().optional(), // 一句话总评
1019
+ });
1020
+ /** 自由练习的题目来源:用户自拟 / 让 AI 出题(`ai` + 空题目 = 待出题) */
1021
+ export const practiceTopicSourceSchema = z.enum(["user", "ai"]);
1022
+ // ---- 范文样本
1023
+ /** 范文样本列表项(**列表不回范文正文与稿件 / 卡体**) */
1024
+ export const practiceSampleSummarySchema = z.object({
1025
+ id: z.string(),
1026
+ workId: z.string().nullable(), // 关联作品 id(预置作品清单内的 slug;null = 「其他」)
1027
+ excerptLabel: z.string(), // 片段说明(空串 = 未填)
1028
+ charCount: z.number().int(), // 范文快照字符数(列表展示用;不返回正文)
1029
+ hasDraft: z.boolean(), // 是否已写稿
1030
+ hasFeedback: z.boolean(), // 是否已有点评卡
1031
+ createdAt: z.string(),
1032
+ updatedAt: z.string(),
1033
+ });
1034
+ // GET /api/v1/practice/samples(本工作区全部样本,按 updatedAt 倒序)
1035
+ export const practiceSamplesResSchema = z.object({ samples: z.array(practiceSampleSummarySchema) });
1036
+ // POST /api/v1/practice/samples
1037
+ // `work_id` 省略 / null = 「其他」;给了必须在预置作品清单内(**成员校验在路由层**,shared 无常量级 schema)
1038
+ export const practiceSampleCreateReqSchema = z
1039
+ .object({
1040
+ work_id: z.string().nullable().optional(),
1041
+ excerpt_label: z.string().trim().max(MAX_PRACTICE_EXCERPT_LABEL_CHARS).optional(), // 片段说明:可省略(空串 = 未填;写入前 trim)
1042
+ text: z.string().trim().min(1).max(MAX_PRACTICE_SAMPLE_CHARS), // 范文快照(落库后不可变)
1043
+ })
1044
+ .strict();
1045
+ /**
1046
+ * 样本详情(`GET /practice/samples/:id`;**唯一返回范文全文与点评卡的读端点**)——
1047
+ * 也是新建样本的响应形状(新建时 `draft` = ""、`feedback` = null)。
1048
+ */
1049
+ export const practiceSampleDetailResSchema = z.object({
1050
+ id: z.string(),
1051
+ workId: z.string().nullable(),
1052
+ excerptLabel: z.string(),
1053
+ text: z.string(), // 范文快照全文
1054
+ draft: z.string(), // 用户仿写稿(未写 = "")
1055
+ feedback: practiceFeedbackSchema.nullable(), // 未点评 = null(db 层只把「非对象」按 null,合法 JSON 对象一律透传)
1056
+ createdAt: z.string(),
1057
+ updatedAt: z.string(),
1058
+ });
1059
+ // ---- 自由练习
1060
+ /** 自由练习列表项(**列表不回稿件与卡体**) */
1061
+ export const practicePieceSummarySchema = z.object({
1062
+ id: z.string(),
1063
+ topic: z.string(), // 题目(空串 = 待出题)
1064
+ brief: z.string(), // 写作要求(空串 = 无)
1065
+ topicSource: practiceTopicSourceSchema,
1066
+ charCount: z.number().int(), // 稿件字符数
1067
+ hasDraft: z.boolean(),
1068
+ hasFeedback: z.boolean(),
1069
+ createdAt: z.string(),
1070
+ updatedAt: z.string(),
1071
+ });
1072
+ // GET /api/v1/practice/free(本工作区全部自由练习篇,按 updatedAt 倒序)
1073
+ export const practicePiecesResSchema = z.object({ pieces: z.array(practicePieceSummarySchema) });
1074
+ /**
1075
+ * POST /api/v1/practice/free。
1076
+ * `topic_source = "user"` ⇒ `topic` 必填(trim 非空);`= "ai"` ⇒ `topic` 必须省略或为空串
1077
+ * (建「待出题」空题行,题目由出题工具写入)——两条分支的一致性由 superRefine 表达,故不是 flat object。
1078
+ */
1079
+ export const practicePieceCreateReqSchema = z
1080
+ .object({
1081
+ topic_source: practiceTopicSourceSchema,
1082
+ topic: z.string().trim().max(MAX_PRACTICE_TOPIC_CHARS).optional(),
1083
+ brief: z.string().trim().max(MAX_PRACTICE_BRIEF_CHARS).optional(), // 写作要求:可省略(空串 = 无;写入前 trim)
1084
+ })
1085
+ .strict()
1086
+ .superRefine((value, ctx) => {
1087
+ const topic = value.topic ?? "";
1088
+ if (value.topic_source === "user" && topic === "") {
1089
+ ctx.addIssue({ code: "custom", path: ["topic"], message: "用户自拟题目不能为空" });
1090
+ return;
1091
+ }
1092
+ if (value.topic_source === "ai" && topic !== "") {
1093
+ ctx.addIssue({ code: "custom", path: ["topic"], message: "让 AI 出题时题目必须留空" });
1094
+ }
1095
+ });
1096
+ /** 自由练习详情(`GET /practice/free/:id`;**唯一返回稿件全文与点评卡的读端点**)——也是新建的响应形状 */
1097
+ export const practicePieceDetailResSchema = z.object({
1098
+ id: z.string(),
1099
+ topic: z.string(), // 空串 = 待出题
1100
+ brief: z.string(),
1101
+ topicSource: practiceTopicSourceSchema,
1102
+ draft: z.string(),
1103
+ feedback: practiceFeedbackSchema.nullable(), // 形状同仿写(`sample_*` = 风格说明侧特征与引用)
1104
+ createdAt: z.string(),
1105
+ updatedAt: z.string(),
1106
+ });
1107
+ // ---- 两类练习共用的写稿 / 删除契约(仿写与自由练习完全同口径,见 docs/api/120-api-practice.md)
1108
+ /** PUT /api/v1/practice/samples/:id 与 PUT /api/v1/practice/free/:id(**用户写稿唯一入口**;strict 单字段) */
1109
+ export const practiceDraftPutReqSchema = z
1110
+ .object({
1111
+ draft: z.string().max(MAX_PRACTICE_DRAFT_CHARS), // 允许空串 = 清空稿件
1112
+ })
1113
+ .strict();
1114
+ /** 版本戳(客户端据此判断保存结果;并发口径 = 后写覆盖,不带版本戳) */
1115
+ export const practiceDraftPutResSchema = z.object({ updatedAt: z.string() });
1116
+ /** DELETE 两类练习(物理删) */
1117
+ export const practiceDeleteResSchema = z.object({ deleted: z.literal(true) });
1118
+ // ---- 作家风格说明素材包(用户覆盖;预置文本在 shared 常量,无端点)
1119
+ /** GET /api/v1/practice/style-pack:`content` = 用户覆盖 `??` 预置(恒非空) */
1120
+ export const practiceStylePackResSchema = z.object({
1121
+ authorId: z.string(), // 当前工作区的预置作家 id
1122
+ content: z.string(),
1123
+ customized: z.boolean(), // 是否有用户覆盖
1124
+ updatedAt: z.string().nullable(), // 用户覆盖的写入时刻;无覆盖 = null
1125
+ });
1126
+ // PUT /api/v1/practice/style-pack(清空请用 DELETE——空覆盖等于恢复预置)
1127
+ export const practiceStylePackPutReqSchema = z
1128
+ .object({
1129
+ content: z.string().trim().min(1).max(MAX_PRACTICE_STYLE_PACK_CHARS),
1130
+ })
1131
+ .strict();
960
1132
  // ============ 云端存档(卡 2:账号配置段) ============
961
1133
  //
962
1134
  // PUT /api/v1/cloud/config:写入云端账号配置与设备名、自动推送开关