@whispering233/ai-editor-shared 0.0.1

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 (69) hide show
  1. package/dist/constants/entity.d.ts +21 -0
  2. package/dist/constants/entity.d.ts.map +1 -0
  3. package/dist/constants/entity.js +35 -0
  4. package/dist/constants/entity.js.map +1 -0
  5. package/dist/constants/hook.d.ts +21 -0
  6. package/dist/constants/hook.d.ts.map +1 -0
  7. package/dist/constants/hook.js +35 -0
  8. package/dist/constants/hook.js.map +1 -0
  9. package/dist/constants/index.d.ts +5 -0
  10. package/dist/constants/index.d.ts.map +1 -0
  11. package/dist/constants/index.js +7 -0
  12. package/dist/constants/index.js.map +1 -0
  13. package/dist/constants/outline.d.ts +5 -0
  14. package/dist/constants/outline.d.ts.map +1 -0
  15. package/dist/constants/outline.js +7 -0
  16. package/dist/constants/outline.js.map +1 -0
  17. package/dist/constants/tool.d.ts +35 -0
  18. package/dist/constants/tool.d.ts.map +1 -0
  19. package/dist/constants/tool.js +82 -0
  20. package/dist/constants/tool.js.map +1 -0
  21. package/dist/index.d.ts +6 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +5 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/types/api.d.ts +728 -0
  26. package/dist/types/api.d.ts.map +1 -0
  27. package/dist/types/api.js +693 -0
  28. package/dist/types/api.js.map +1 -0
  29. package/dist/types/chat.d.ts +42 -0
  30. package/dist/types/chat.d.ts.map +1 -0
  31. package/dist/types/chat.js +4 -0
  32. package/dist/types/chat.js.map +1 -0
  33. package/dist/types/entity.d.ts +179 -0
  34. package/dist/types/entity.d.ts.map +1 -0
  35. package/dist/types/entity.js +6 -0
  36. package/dist/types/entity.js.map +1 -0
  37. package/dist/types/index.d.ts +7 -0
  38. package/dist/types/index.d.ts.map +1 -0
  39. package/dist/types/index.js +2 -0
  40. package/dist/types/index.js.map +1 -0
  41. package/dist/types/outline.d.ts +99 -0
  42. package/dist/types/outline.d.ts.map +1 -0
  43. package/dist/types/outline.js +6 -0
  44. package/dist/types/outline.js.map +1 -0
  45. package/dist/types/project.d.ts +33 -0
  46. package/dist/types/project.d.ts.map +1 -0
  47. package/dist/types/project.js +4 -0
  48. package/dist/types/project.js.map +1 -0
  49. package/dist/types/tool.d.ts +304 -0
  50. package/dist/types/tool.d.ts.map +1 -0
  51. package/dist/types/tool.js +296 -0
  52. package/dist/types/tool.js.map +1 -0
  53. package/dist/utils/format.d.ts +23 -0
  54. package/dist/utils/format.d.ts.map +1 -0
  55. package/dist/utils/format.js +57 -0
  56. package/dist/utils/format.js.map +1 -0
  57. package/dist/utils/id.d.ts +28 -0
  58. package/dist/utils/id.d.ts.map +1 -0
  59. package/dist/utils/id.js +48 -0
  60. package/dist/utils/id.js.map +1 -0
  61. package/dist/utils/index.d.ts +4 -0
  62. package/dist/utils/index.d.ts.map +1 -0
  63. package/dist/utils/index.js +6 -0
  64. package/dist/utils/index.js.map +1 -0
  65. package/dist/utils/mapping.d.ts +28 -0
  66. package/dist/utils/mapping.d.ts.map +1 -0
  67. package/dist/utils/mapping.js +223 -0
  68. package/dist/utils/mapping.js.map +1 -0
  69. package/package.json +42 -0
@@ -0,0 +1,57 @@
1
+ // 文本格式化工具(纯函数,零 Node 依赖——client 浏览器打包安全)
2
+ // 契约来源:doc/api/endpoints.md(会话列表 lastMessage「截断」、settings apiKeyMasked 掩码示例)
3
+ /**
4
+ * ISO 8601 时间戳 → 本地化 `YYYY-MM-DD HH:mm`(schema.md 时间约定:统一 ISO 8601 字符串)
5
+ * 非法输入(含空串)原样返回,防御性处理
6
+ */
7
+ export function formatTimestamp(iso) {
8
+ const date = new Date(iso);
9
+ if (Number.isNaN(date.getTime()))
10
+ return iso;
11
+ const pad = (n) => String(n).padStart(2, "0");
12
+ return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}`;
13
+ }
14
+ /**
15
+ * 截断文本:返回总长(含省略号)不超过 maxLen 的字符串;未超长原样返回
16
+ * 用途:会话列表 lastMessage、长文本展示(endpoints.md)
17
+ * 边界:maxLen <= 0 返回空串;maxLen = 1 时返回单个省略号
18
+ */
19
+ export function truncate(text, maxLen) {
20
+ if (maxLen <= 0)
21
+ return "";
22
+ if (text.length <= maxLen)
23
+ return text;
24
+ return `${text.slice(0, maxLen - 1)}…`;
25
+ }
26
+ /**
27
+ * API key 掩码展示(endpoints.md settings apiKeyMasked 示例 `sk-****1234`:保留前 3 后 4)
28
+ * 过短 key(<= 7 字符,前后缀重叠)整体掩码为 "****";空串返回 "****"
29
+ */
30
+ export function maskApiKey(key) {
31
+ if (key.length <= 7)
32
+ return "****";
33
+ return `${key.slice(0, 3)}****${key.slice(-4)}`;
34
+ }
35
+ /**
36
+ * 相对时间(会话行/概览最近更新展示):刚刚 / n 分钟前 / n 小时前 / n 天前;
37
+ * ≥30 天回退绝对时间(formatTimestamp);非法输入(含空串)原样返回
38
+ * 说明:从 client Dashboard/Sidebar 抽离(U4 oracle L1:两处重复实现 → shared 共享可单测)
39
+ */
40
+ export function formatRelativeTime(iso) {
41
+ const date = new Date(iso);
42
+ if (Number.isNaN(date.getTime()))
43
+ return iso;
44
+ const diffMin = Math.floor((Date.now() - date.getTime()) / 60_000);
45
+ if (diffMin < 1)
46
+ return "刚刚";
47
+ if (diffMin < 60)
48
+ return `${diffMin} 分钟前`;
49
+ const diffHours = Math.floor(diffMin / 60);
50
+ if (diffHours < 24)
51
+ return `${diffHours} 小时前`;
52
+ const diffDays = Math.floor(diffHours / 24);
53
+ if (diffDays < 30)
54
+ return `${diffDays} 天前`;
55
+ return formatTimestamp(iso);
56
+ }
57
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,6EAA6E;AAE7E;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAAE,OAAO,GAAG,CAAC;IAC7C,MAAM,GAAG,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9D,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC;AACtI,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,MAAc;IACnD,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3B,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM;QAAE,OAAO,IAAI,CAAC;IACvC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC;AACzC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IACnC,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAClD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAAE,OAAO,GAAG,CAAC;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;IACnE,IAAI,OAAO,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7B,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,MAAM,CAAC;IAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IAC3C,IAAI,SAAS,GAAG,EAAE;QAAE,OAAO,GAAG,SAAS,MAAM,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC;IAC5C,IAAI,QAAQ,GAAG,EAAE;QAAE,OAAO,GAAG,QAAQ,KAAK,CAAC;IAC3C,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { EntityType } from "../types/entity.js";
2
+ import type { OutlineNodeType } from "../types/outline.js";
3
+ /** 实体类型 → id 前缀(endpoints.md id 约定) */
4
+ export declare const ENTITY_ID_PREFIX: Record<EntityType, string>;
5
+ /** 大纲节点类型 → id 前缀(endpoints.md id 约定;root 不生成 id) */
6
+ export declare const OUTLINE_NODE_ID_PREFIX: Record<Exclude<OutlineNodeType, "root">, string>;
7
+ /** 运行时对象 id 前缀(endpoints.md:提案 prop_/会话 sess_/工具调用 call_,下划线分隔) */
8
+ export declare const RUNTIME_ID_PREFIX: {
9
+ readonly proposal: "prop_";
10
+ readonly session: "sess_";
11
+ readonly toolCall: "call_";
12
+ };
13
+ /** 运行时对象种类(prop_/sess_/call_) */
14
+ export type RuntimeIdKind = keyof typeof RUNTIME_ID_PREFIX;
15
+ /**
16
+ * 生成 `{prefix}{nanoid}` 形式 id(nanoid 默认 21 字符,URL 安全字母表)
17
+ * 示例:generateId("char-") → "char-9f3k2m..."
18
+ */
19
+ export declare function generateId(prefix: string): string;
20
+ /** 生成实体 id(按类型映射前缀:character→char-、setting→set-、location→loc-、hook→hook-) */
21
+ export declare function generateEntityId(type: EntityType): string;
22
+ /** 生成大纲节点 id(按类型映射前缀:volume→vol-、chapter→ch-、scene→sc-) */
23
+ export declare function generateOutlineNodeId(type: Exclude<OutlineNodeType, "root">): string;
24
+ /** 生成项目 id(proj- 前缀,跨启动稳定,决策 8/10) */
25
+ export declare function generateProjectId(): string;
26
+ /** 生成运行时对象 id(提案 prop_ / 会话 sess_ / 工具调用 call_,不落盘或仅内存) */
27
+ export declare function generateRuntimeId(kind: RuntimeIdKind): string;
28
+ //# sourceMappingURL=id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id.d.ts","sourceRoot":"","sources":["../../src/utils/id.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,uCAAuC;AACvC,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAKvD,CAAC;AAEF,qDAAqD;AACrD,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,EAAE,MAAM,CAInF,CAAC;AAEF,mEAAmE;AACnE,eAAO,MAAM,iBAAiB;;;;CAIpB,CAAC;AAEX,iCAAiC;AACjC,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,iBAAiB,CAAC;AAE3D;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAEzD;AAED,2DAA2D;AAC3D,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,GAAG,MAAM,CAEpF;AAED,sCAAsC;AACtC,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,2DAA2D;AAC3D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAE7D"}
@@ -0,0 +1,48 @@
1
+ // ID 生成工具
2
+ // 契约来源:doc/api/endpoints.md「id 约定」:{前缀}-{nanoid};前缀表 char-/set-/loc-/hook-、
3
+ // sc-/ch-/vol-、proj-(连字符分隔);prop_/sess_/call_(下划线分隔的运行时对象)
4
+ // nanoid 为环境无关包(浏览器可用),仅在本模块引入,无副作用
5
+ import { nanoid } from "nanoid";
6
+ /** 实体类型 → id 前缀(endpoints.md id 约定) */
7
+ export const ENTITY_ID_PREFIX = {
8
+ character: "char-",
9
+ setting: "set-",
10
+ location: "loc-",
11
+ hook: "hook-",
12
+ };
13
+ /** 大纲节点类型 → id 前缀(endpoints.md id 约定;root 不生成 id) */
14
+ export const OUTLINE_NODE_ID_PREFIX = {
15
+ volume: "vol-",
16
+ chapter: "ch-",
17
+ scene: "sc-",
18
+ };
19
+ /** 运行时对象 id 前缀(endpoints.md:提案 prop_/会话 sess_/工具调用 call_,下划线分隔) */
20
+ export const RUNTIME_ID_PREFIX = {
21
+ proposal: "prop_",
22
+ session: "sess_",
23
+ toolCall: "call_",
24
+ };
25
+ /**
26
+ * 生成 `{prefix}{nanoid}` 形式 id(nanoid 默认 21 字符,URL 安全字母表)
27
+ * 示例:generateId("char-") → "char-9f3k2m..."
28
+ */
29
+ export function generateId(prefix) {
30
+ return `${prefix}${nanoid()}`;
31
+ }
32
+ /** 生成实体 id(按类型映射前缀:character→char-、setting→set-、location→loc-、hook→hook-) */
33
+ export function generateEntityId(type) {
34
+ return generateId(ENTITY_ID_PREFIX[type]);
35
+ }
36
+ /** 生成大纲节点 id(按类型映射前缀:volume→vol-、chapter→ch-、scene→sc-) */
37
+ export function generateOutlineNodeId(type) {
38
+ return generateId(OUTLINE_NODE_ID_PREFIX[type]);
39
+ }
40
+ /** 生成项目 id(proj- 前缀,跨启动稳定,决策 8/10) */
41
+ export function generateProjectId() {
42
+ return generateId("proj-");
43
+ }
44
+ /** 生成运行时对象 id(提案 prop_ / 会话 sess_ / 工具调用 call_,不落盘或仅内存) */
45
+ export function generateRuntimeId(kind) {
46
+ return generateId(RUNTIME_ID_PREFIX[kind]);
47
+ }
48
+ //# sourceMappingURL=id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id.js","sourceRoot":"","sources":["../../src/utils/id.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,4EAA4E;AAC5E,6DAA6D;AAC7D,oCAAoC;AAEpC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIhC,uCAAuC;AACvC,MAAM,CAAC,MAAM,gBAAgB,GAA+B;IAC1D,SAAS,EAAE,OAAO;IAClB,OAAO,EAAE,MAAM;IACf,QAAQ,EAAE,MAAM;IAChB,IAAI,EAAE,OAAO;CACd,CAAC;AAEF,qDAAqD;AACrD,MAAM,CAAC,MAAM,sBAAsB,GAAqD;IACtF,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,KAAK;IACd,KAAK,EAAE,KAAK;CACb,CAAC;AAEF,mEAAmE;AACnE,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,QAAQ,EAAE,OAAO;IACjB,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE,OAAO;CACT,CAAC;AAKX;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,OAAO,GAAG,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC;AAChC,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,gBAAgB,CAAC,IAAgB;IAC/C,OAAO,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,qBAAqB,CAAC,IAAsC;IAC1E,OAAO,UAAU,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,iBAAiB;IAC/B,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,iBAAiB,CAAC,IAAmB;IACnD,OAAO,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from "./id.js";
2
+ export * from "./format.js";
3
+ export * from "./mapping.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAEA,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,6 @@
1
+ // 纯工具函数聚合出口
2
+ // 文件划分见 doc/design/architecture.md(utils/:id.ts / validate.ts / format.ts;validate.ts 随 Zod 于 T1.4 引入)
3
+ export * from "./id.js";
4
+ export * from "./format.js";
5
+ export * from "./mapping.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,YAAY;AACZ,uGAAuG;AACvG,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { DeltaRecord, DeltaRow, Entity, EntityRow, RelationRecord, RelationRow } from "../types/entity.js";
2
+ import type { OutlineFileTree, OutlineTree } from "../types/outline.js";
3
+ import type { ProjectConfig, ProjectFileConfig } from "../types/project.js";
4
+ /** 单层键映射:snake_case → camelCase(仅用于顶层契约字段,不递归 data) */
5
+ export declare function snakeToCamelKey(key: string): string;
6
+ /** 单层键映射:camelCase → snake_case */
7
+ export declare function camelToSnakeKey(key: string): string;
8
+ /** EntityRow → Entity(created_at → createdAt、deleted_at → deletedAt;data 原样透传) */
9
+ export declare function mapRowToEntity(row: EntityRow): Entity;
10
+ /** Entity → EntityRow(API → 存储;deletedAt 缺失时置 null) */
11
+ export declare function mapEntityToRow(entity: Entity): EntityRow;
12
+ /**
13
+ * RelationRow → RelationRecord(字段映射;metadata NULL → undefined)
14
+ * 注意:存储的 updated_at / deleted_at 在 API 形态中不暴露(endpoints.md RelationRecord 仅 createdAt);
15
+ * sourceName/targetName 为服务端联表填充,Row 本身不含
16
+ */
17
+ export declare function mapRowToRelation(row: RelationRow): RelationRecord;
18
+ /** DeltaRow → DeltaRecord(字段映射;changes 原样透传) */
19
+ export declare function mapRowToDelta(row: DeltaRow): DeltaRecord;
20
+ /** OutlineFileTree → OutlineTree(schema_version → schemaVersion;软删字段 deleted_at ↔ deletedAt 一并映射) */
21
+ export declare function mapOutlineFileToTree(file: OutlineFileTree): OutlineTree;
22
+ /** OutlineTree → OutlineFileTree(updatedAt ↔ updated_at、schemaVersion ↔ schema_version) */
23
+ export declare function mapTreeToOutlineFile(tree: OutlineTree): OutlineFileTree;
24
+ /** ProjectFileConfig → ProjectConfig(schema_version → schemaVersion、current_position → currentPosition) */
25
+ export declare function mapProjectFileToConfig(file: ProjectFileConfig): ProjectConfig;
26
+ /** ProjectConfig → ProjectFileConfig */
27
+ export declare function mapConfigToProjectFile(config: ProjectConfig): ProjectFileConfig;
28
+ //# sourceMappingURL=mapping.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapping.d.ts","sourceRoot":"","sources":["../../src/utils/mapping.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAChH,OAAO,KAAK,EAKV,eAAe,EAIf,WAAW,EAEZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE5E,uDAAuD;AACvD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,mCAAmC;AACnC,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnD;AAID,kFAAkF;AAClF,wBAAgB,cAAc,CAAC,GAAG,EAAE,SAAS,GAAG,MAAM,CAUrD;AAED,uDAAuD;AACvD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAUxD;AAID;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,CAWjE;AAID,gDAAgD;AAChD,wBAAgB,aAAa,CAAC,GAAG,EAAE,QAAQ,GAAG,WAAW,CAWxD;AA4DD,qGAAqG;AACrG,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,eAAe,GAAG,WAAW,CAQvE;AA0DD,2FAA2F;AAC3F,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW,GAAG,eAAe,CAOvE;AAID,2GAA2G;AAC3G,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,iBAAiB,GAAG,aAAa,CAW7E;AAED,wCAAwC;AACxC,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,aAAa,GAAG,iBAAiB,CAW/E"}
@@ -0,0 +1,223 @@
1
+ // 文件字段 ↔ API 字段映射(endpoints.md 通用约定指定位置:@whispering233/ai-editor-shared/utils)
2
+ // 约定(endpoints.md 第 10 行):请求体/查询参数 snake_case,响应体 camelCase,
3
+ // outline.json / project.json / data.db 行内部 snake_case;
4
+ // **嵌套 data 对象内部字段原样透传**(如 expected_payoff 保持 snake_case,2026-08 修订),
5
+ // camelCase 映射仅应用于 API 顶层契约字段。
6
+ // 两侧锚点:T1.1 定义的双套类型(*Row / OutlineFile* / ProjectFileConfig ↔ API 形态)
7
+ /** 单层键映射:snake_case → camelCase(仅用于顶层契约字段,不递归 data) */
8
+ export function snakeToCamelKey(key) {
9
+ return key.replace(/_([a-z])/g, (_m, c) => c.toUpperCase());
10
+ }
11
+ /** 单层键映射:camelCase → snake_case */
12
+ export function camelToSnakeKey(key) {
13
+ return key.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`);
14
+ }
15
+ // ============ 实体(entities 表 ↔ API) ============
16
+ /** EntityRow → Entity(created_at → createdAt、deleted_at → deletedAt;data 原样透传) */
17
+ export function mapRowToEntity(row) {
18
+ return {
19
+ id: row.id,
20
+ type: row.type,
21
+ name: row.name,
22
+ data: row.data, // 嵌套对象原样透传(2026-08 修订),不做递归 camelCase
23
+ createdAt: row.created_at,
24
+ updatedAt: row.updated_at,
25
+ deletedAt: row.deleted_at,
26
+ };
27
+ }
28
+ /** Entity → EntityRow(API → 存储;deletedAt 缺失时置 null) */
29
+ export function mapEntityToRow(entity) {
30
+ return {
31
+ id: entity.id,
32
+ type: entity.type,
33
+ name: entity.name,
34
+ data: entity.data,
35
+ created_at: entity.createdAt,
36
+ updated_at: entity.updatedAt,
37
+ deleted_at: entity.deletedAt ?? null,
38
+ };
39
+ }
40
+ // ============ 关系(relation_records 表 ↔ API) ============
41
+ /**
42
+ * RelationRow → RelationRecord(字段映射;metadata NULL → undefined)
43
+ * 注意:存储的 updated_at / deleted_at 在 API 形态中不暴露(endpoints.md RelationRecord 仅 createdAt);
44
+ * sourceName/targetName 为服务端联表填充,Row 本身不含
45
+ */
46
+ export function mapRowToRelation(row) {
47
+ return {
48
+ id: row.id,
49
+ sourceType: row.source_type,
50
+ sourceId: row.source_id,
51
+ targetType: row.target_type,
52
+ targetId: row.target_id,
53
+ relationType: row.relation_type,
54
+ metadata: row.metadata ?? undefined,
55
+ createdAt: row.created_at,
56
+ };
57
+ }
58
+ // ============ Delta(delta_records 表 ↔ API) ============
59
+ /** DeltaRow → DeltaRecord(字段映射;changes 原样透传) */
60
+ export function mapRowToDelta(row) {
61
+ return {
62
+ id: row.id,
63
+ nodeId: row.node_id,
64
+ targetType: row.target_type,
65
+ targetId: row.target_id,
66
+ changes: row.changes,
67
+ description: row.description,
68
+ order: row.order,
69
+ createdAt: row.created_at,
70
+ };
71
+ }
72
+ // ============ 大纲(outline.json ↔ API,children 递归映射) ============
73
+ /** OutlineFileVolume → OutlineVolume(递归映射 children) */
74
+ function mapFileVolumeToVolume(file) {
75
+ return {
76
+ id: file.id,
77
+ type: "volume",
78
+ title: file.title,
79
+ summary: file.summary,
80
+ data: file.data, // 嵌套 data 原样透传(决策 23,不做递归 camelCase)
81
+ updatedAt: file.updated_at,
82
+ deleted: file.deleted,
83
+ deletedAt: file.deleted_at,
84
+ children: file.children?.map(mapFileChapterToChapter),
85
+ };
86
+ }
87
+ /** OutlineFileChapter → OutlineChapter(递归映射 children) */
88
+ function mapFileChapterToChapter(file) {
89
+ return {
90
+ id: file.id,
91
+ type: "chapter",
92
+ title: file.title,
93
+ summary: file.summary,
94
+ data: file.data, // 嵌套 data 原样透传(决策 23)
95
+ updatedAt: file.updated_at,
96
+ deleted: file.deleted,
97
+ deletedAt: file.deleted_at,
98
+ children: file.children?.map(mapFileSceneToScene),
99
+ };
100
+ }
101
+ /** OutlineFileScene → OutlineScene(叶子,无 children) */
102
+ function mapFileSceneToScene(file) {
103
+ return {
104
+ id: file.id,
105
+ type: "scene",
106
+ title: file.title,
107
+ summary: file.summary,
108
+ data: file.data, // 嵌套 data 原样透传(决策 23)
109
+ updatedAt: file.updated_at,
110
+ deleted: file.deleted,
111
+ deletedAt: file.deleted_at,
112
+ };
113
+ }
114
+ /** OutlineFileNode → OutlineNode(按 type 分派递归映射;支持决策 19「chapter 直挂 root」) */
115
+ function mapFileNodeToNode(file) {
116
+ switch (file.type) {
117
+ case "volume":
118
+ return mapFileVolumeToVolume(file);
119
+ case "chapter":
120
+ return mapFileChapterToChapter(file);
121
+ case "scene":
122
+ return mapFileSceneToScene(file);
123
+ }
124
+ }
125
+ /** OutlineFileTree → OutlineTree(schema_version → schemaVersion;软删字段 deleted_at ↔ deletedAt 一并映射) */
126
+ export function mapOutlineFileToTree(file) {
127
+ return {
128
+ id: file.id,
129
+ type: "root",
130
+ schemaVersion: file.schema_version,
131
+ // root.children 为 (volume|chapter) 联合(决策 19 允许直挂章),按 type 分派映射
132
+ children: file.children.map(mapFileNodeToNode),
133
+ };
134
+ }
135
+ /** OutlineVolume → OutlineFileVolume */
136
+ function mapVolumeToFileVolume(node) {
137
+ return {
138
+ id: node.id,
139
+ type: "volume",
140
+ title: node.title,
141
+ summary: node.summary,
142
+ data: node.data, // 嵌套 data 原样透传(决策 23)
143
+ updated_at: node.updatedAt,
144
+ deleted: node.deleted,
145
+ deleted_at: node.deletedAt,
146
+ children: node.children?.map(mapChapterToFileChapter),
147
+ };
148
+ }
149
+ /** OutlineChapter → OutlineFileChapter */
150
+ function mapChapterToFileChapter(node) {
151
+ return {
152
+ id: node.id,
153
+ type: "chapter",
154
+ title: node.title,
155
+ summary: node.summary,
156
+ data: node.data, // 嵌套 data 原样透传(决策 23)
157
+ updated_at: node.updatedAt,
158
+ deleted: node.deleted,
159
+ deleted_at: node.deletedAt,
160
+ children: node.children?.map(mapSceneToFileScene),
161
+ };
162
+ }
163
+ /** OutlineScene → OutlineFileScene */
164
+ function mapSceneToFileScene(node) {
165
+ return {
166
+ id: node.id,
167
+ type: "scene",
168
+ title: node.title,
169
+ summary: node.summary,
170
+ data: node.data, // 嵌套 data 原样透传(决策 23)
171
+ updated_at: node.updatedAt,
172
+ deleted: node.deleted,
173
+ deleted_at: node.deletedAt,
174
+ };
175
+ }
176
+ /** OutlineNode → OutlineFileNode(按 type 分派递归映射;支持决策 19「chapter 直挂 root」) */
177
+ function mapNodeToFileNode(node) {
178
+ switch (node.type) {
179
+ case "volume":
180
+ return mapVolumeToFileVolume(node);
181
+ case "chapter":
182
+ return mapChapterToFileChapter(node);
183
+ case "scene":
184
+ return mapSceneToFileScene(node);
185
+ }
186
+ }
187
+ /** OutlineTree → OutlineFileTree(updatedAt ↔ updated_at、schemaVersion ↔ schema_version) */
188
+ export function mapTreeToOutlineFile(tree) {
189
+ return {
190
+ id: tree.id,
191
+ type: "root",
192
+ schema_version: tree.schemaVersion,
193
+ children: tree.children.map(mapNodeToFileNode),
194
+ };
195
+ }
196
+ // ============ 项目(project.json ↔ API) ============
197
+ /** ProjectFileConfig → ProjectConfig(schema_version → schemaVersion、current_position → currentPosition) */
198
+ export function mapProjectFileToConfig(file) {
199
+ return {
200
+ id: file.id,
201
+ name: file.name,
202
+ language: file.language,
203
+ prompt: file.prompt,
204
+ schemaVersion: file.schema_version,
205
+ currentPosition: file.current_position,
206
+ createdAt: file.created_at,
207
+ updatedAt: file.updated_at,
208
+ };
209
+ }
210
+ /** ProjectConfig → ProjectFileConfig */
211
+ export function mapConfigToProjectFile(config) {
212
+ return {
213
+ id: config.id,
214
+ name: config.name,
215
+ language: config.language,
216
+ prompt: config.prompt,
217
+ schema_version: config.schemaVersion,
218
+ current_position: config.currentPosition,
219
+ created_at: config.createdAt,
220
+ updated_at: config.updatedAt,
221
+ };
222
+ }
223
+ //# sourceMappingURL=mapping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapping.js","sourceRoot":"","sources":["../../src/utils/mapping.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@whispering233/ai-editor-shared",
3
+ "version": "0.0.1",
4
+ "description": "前后端共享层:纯类型 + 常量 + 纯函数(零 Node 依赖)",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ },
13
+ "./schemas": {
14
+ "types": "./dist/types/api.d.ts",
15
+ "import": "./dist/types/api.js"
16
+ },
17
+ "./schemas/tools": {
18
+ "types": "./dist/types/tool.d.ts",
19
+ "import": "./dist/types/tool.js"
20
+ }
21
+ },
22
+ "files": [
23
+ "dist"
24
+ ],
25
+ "publishConfig": {
26
+ "access": "public"
27
+ },
28
+ "scripts": {
29
+ "build": "tsc -p tsconfig.json",
30
+ "dev": "tsc --watch",
31
+ "test": "vitest run",
32
+ "prepack": "node ../../scripts/prepare-package-for-publish.mjs",
33
+ "postpack": "node ../../scripts/restore-package-json.mjs"
34
+ },
35
+ "dependencies": {
36
+ "nanoid": "^5.1.0",
37
+ "zod": "^4.0.0"
38
+ },
39
+ "devDependencies": {
40
+ "typescript": "^5.8.0"
41
+ }
42
+ }