@whispering233/ai-editor-server 0.0.21 → 0.0.29
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.
- package/client-dist/assets/index-0zEqGbv5.css +1 -0
- package/client-dist/assets/index-DMtHdMMq.js +521 -0
- package/client-dist/index.html +3 -3
- package/dist/backup.d.ts +78 -78
- package/dist/backup.d.ts.map +1 -1
- package/dist/backup.js +138 -139
- package/dist/backup.js.map +1 -1
- package/dist/consistency.d.ts +3 -3
- package/dist/consistency.d.ts.map +1 -1
- package/dist/consistency.js +4 -4
- package/dist/consistency.js.map +1 -1
- package/dist/debug.d.ts +1 -1
- package/dist/debug.js +7 -7
- package/dist/debug.js.map +1 -1
- package/dist/index.d.ts +9 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +37 -37
- package/dist/index.js.map +1 -1
- package/dist/middleware/error.d.ts +4 -4
- package/dist/middleware/error.d.ts.map +1 -1
- package/dist/middleware/error.js +7 -9
- package/dist/middleware/error.js.map +1 -1
- package/dist/middleware/project.d.ts +9 -9
- package/dist/middleware/project.d.ts.map +1 -1
- package/dist/middleware/project.js +23 -23
- package/dist/middleware/project.js.map +1 -1
- package/dist/reference-files.d.ts +12 -12
- package/dist/reference-files.d.ts.map +1 -1
- package/dist/reference-files.js +20 -21
- package/dist/reference-files.js.map +1 -1
- package/dist/routes/chat.d.ts +18 -18
- package/dist/routes/chat.d.ts.map +1 -1
- package/dist/routes/chat.js +70 -83
- package/dist/routes/chat.js.map +1 -1
- package/dist/routes/delta.d.ts.map +1 -1
- package/dist/routes/delta.js +27 -28
- package/dist/routes/delta.js.map +1 -1
- package/dist/routes/entity.d.ts.map +1 -1
- package/dist/routes/entity.js +44 -45
- package/dist/routes/entity.js.map +1 -1
- package/dist/routes/names.d.ts.map +1 -1
- package/dist/routes/names.js +8 -9
- package/dist/routes/names.js.map +1 -1
- package/dist/routes/outline.d.ts +1 -1
- package/dist/routes/outline.d.ts.map +1 -1
- package/dist/routes/outline.js +23 -24
- package/dist/routes/outline.js.map +1 -1
- package/dist/routes/project.d.ts +6 -6
- package/dist/routes/project.d.ts.map +1 -1
- package/dist/routes/project.js +91 -95
- package/dist/routes/project.js.map +1 -1
- package/dist/routes/proposal.d.ts.map +1 -1
- package/dist/routes/proposal.js +40 -42
- package/dist/routes/proposal.js.map +1 -1
- package/dist/routes/reference.d.ts.map +1 -1
- package/dist/routes/reference.js +1 -2
- package/dist/routes/reference.js.map +1 -1
- package/dist/routes/relation.d.ts.map +1 -1
- package/dist/routes/relation.js +14 -15
- package/dist/routes/relation.js.map +1 -1
- package/dist/routes/settings.d.ts +35 -17
- package/dist/routes/settings.d.ts.map +1 -1
- package/dist/routes/settings.js +157 -52
- package/dist/routes/settings.js.map +1 -1
- package/dist/routes/trash.d.ts.map +1 -1
- package/dist/routes/trash.js +15 -16
- package/dist/routes/trash.js.map +1 -1
- package/package.json +7 -7
- package/client-dist/assets/index-B51Kcb1K.css +0 -1
- package/client-dist/assets/index-zgl3whdc.js +0 -104
package/client-dist/index.html
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<!doctype html>
|
|
2
|
-
<html lang="zh-CN">
|
|
2
|
+
<html lang="zh-CN" class="ai-editor-theme">
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
// localStorage 不可用(隐私模式等)时静默跳过,默认浅色
|
|
14
14
|
}
|
|
15
15
|
</script>
|
|
16
|
-
<script type="module" crossorigin src="/assets/index-
|
|
17
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
16
|
+
<script type="module" crossorigin src="/assets/index-DMtHdMMq.js"></script>
|
|
17
|
+
<link rel="stylesheet" crossorigin href="/assets/index-0zEqGbv5.css">
|
|
18
18
|
</head>
|
|
19
19
|
<body>
|
|
20
20
|
<div id="root"></div>
|
package/dist/backup.d.ts
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
import { type BackupKind } from "@whispering233/ai-editor-shared";
|
|
2
2
|
import type { ProjectContext } from "./middleware/project.js";
|
|
3
|
-
/**
|
|
3
|
+
/** 备份目录名(项目目录内 .backups/,随书籍移动自然携带) */
|
|
4
4
|
export declare const BACKUPS_DIR_NAME = ".backups";
|
|
5
|
-
/**
|
|
5
|
+
/** 备份包条目白名单判定(三文件 + references/ 前缀——逐名比对天然防 zip 路径穿越;
|
|
6
6
|
* references/ 子路径拒绝含 `..` 的条目防相对路径逃逸) */
|
|
7
7
|
export declare function isAllowedBackupEntry(name: string): boolean;
|
|
8
|
-
/** 备份文件信息(GET /backups 列表项与 POST /backup
|
|
8
|
+
/** 备份文件信息(GET /backups 列表项与 POST /backup 响应,) */
|
|
9
9
|
export interface BackupFileInfo {
|
|
10
10
|
fileName: string;
|
|
11
11
|
size: number;
|
|
12
12
|
createdAt: string;
|
|
13
|
-
/**
|
|
13
|
+
/** 备份类型(由文件名 kind 段解析:auto = 自动/manual = 手动) */
|
|
14
14
|
kind: BackupKind;
|
|
15
|
-
/**
|
|
15
|
+
/** 手动备份自定义名称(由文件名解析,自动备份/快照/旧备份无此字段) */
|
|
16
16
|
name?: string;
|
|
17
17
|
}
|
|
18
18
|
/**
|
|
19
|
-
* 打包当前项目为 zip(
|
|
19
|
+
* 打包当前项目为 zip( export 同款管道):
|
|
20
20
|
* wal_checkpoint(TRUNCATE) 把 WAL 合并回主文件(zip 内 data.db 为完整快照,
|
|
21
21
|
* 无需附带 -wal/-shm)→ zipSync 打包(键序稳定:project.json → outline.json → data.db
|
|
22
|
-
* → references
|
|
22
|
+
* → references/**(参考资料目录含 .trash/ 随包——项目自包含))。
|
|
23
23
|
* 三文件缺失任一 → 抛错(打开的项目三文件必然齐全,缺失即损坏,不导出半成品包)。
|
|
24
24
|
*/
|
|
25
25
|
export declare function createBackupZip(project: ProjectContext): Uint8Array<ArrayBuffer>;
|
|
@@ -27,68 +27,68 @@ export declare function createBackupZip(project: ProjectContext): Uint8Array<Arr
|
|
|
27
27
|
* 立即备份当前项目(手动触发 / 自动定时器 / restore 覆盖前快照共用):
|
|
28
28
|
* 打包 → 写入 .backups/<时间戳>[-<kind>][-<名称>].zip(毫秒精度;同毫秒 +1ms 去重)→
|
|
29
29
|
* 触发保留策略清理(失败不阻塞)。
|
|
30
|
-
* 写盘失败向上抛(errorHandler → 500 INTERNAL_ERROR,
|
|
31
|
-
*
|
|
32
|
-
* @param opts.kind
|
|
33
|
-
*
|
|
34
|
-
* @param opts.name
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
30
|
+
* 写盘失败向上抛(errorHandler → 500 INTERNAL_ERROR, POST /backup 语义)。
|
|
31
|
+
*
|
|
32
|
+
* @param opts.kind 备份类型(缺省 "auto"):手动触发传 "manual"(文件名落 -m 段);
|
|
33
|
+
* 自动备份/覆盖前快照不传(auto,纯时间戳)
|
|
34
|
+
* @param opts.name 手动备份自定义名称(仅带名称的手动/重命名场景传入):
|
|
35
|
+
* sanitizeBackupName 是名称校验/规范化**唯一执行点**——非法(含路径分隔符/超长/纯点)→
|
|
36
|
+
* 400 VALIDATION_ERROR;自动备份/覆盖前快照不传 name,文件名保持纯时间戳。
|
|
37
|
+
* 注意:name 仅在 opts.name !== undefined 且 sanitize 通过后传入 formatBackupFileName。
|
|
38
38
|
*/
|
|
39
39
|
export declare function writeBackup(project: ProjectContext, opts?: {
|
|
40
40
|
name?: string;
|
|
41
41
|
kind?: BackupKind;
|
|
42
42
|
}): BackupFileInfo;
|
|
43
43
|
/**
|
|
44
|
-
* 重命名备份(POST /project/backup/rename
|
|
44
|
+
* 重命名备份(POST /project/backup/rename):**只改名称段**,时间戳与 kind 保持。
|
|
45
|
+
*
|
|
45
46
|
*
|
|
46
|
-
* 契约:
|
|
47
47
|
* 1. fileName 白名单校验:仅接受 parseBackupFileName 可解析的时间戳格式
|
|
48
|
-
*
|
|
49
|
-
*
|
|
48
|
+
* `<YYYYMMDD-HHmmssSSS>[-<kind>][-<名称>].zip`(含旧格式兼容,^$ 锚定 + 名称部分拒绝 /\\,
|
|
49
|
+
* 天然防路径分隔符与 `..` 穿越)→ 非法 400 VALIDATION_ERROR
|
|
50
50
|
* 2. 文件不存在 → 404 VALIDATION_ERROR
|
|
51
|
-
* 3.
|
|
52
|
-
*
|
|
51
|
+
* 3. 新名称解析:请求未传 name → 清除名称段;传空串/纯空白 → 清除名称段;
|
|
52
|
+
* 非空 → sanitizeBackupName 规范化(非法 → 400 VALIDATION_ERROR,文案同 writeBackup)
|
|
53
53
|
* 4. 新文件名 = formatBackupFileName(parsed.time, { kind: parsed.kind, name: 新名称 })——
|
|
54
|
-
*
|
|
54
|
+
* kind 不随重命名改变(auto 重命名后仍落 -a- 段、manual 仍落 -m- 段)
|
|
55
55
|
* 5. 幂等:新文件名 === 原文件名(如重命名为相同名称)→ 不移动文件,直接返回当前条目
|
|
56
|
-
*
|
|
57
|
-
* 6. **目标冲突防御(oracle P1-1
|
|
58
|
-
*
|
|
59
|
-
*
|
|
56
|
+
* (重新 stat 取 size;stat 失败 → 404「备份不存在」)
|
|
57
|
+
* 6. **目标冲突防御(oracle P1-1)**:新文件名已存在(≠ 原文件)→ 409
|
|
58
|
+
* BACKUP_TARGET_EXISTS——POSIX rename 目标存在时静默替换,可达路径:旧秒级改名后毫秒补
|
|
59
|
+
* 000 撞上毫秒为 0 的自动备份、同毫秒双 manual(T-m.zip + T-m-X.zip)清名覆盖;显式拒绝
|
|
60
60
|
* 7. renameSync 同目录原子改名(失败向上抛 → 500);改名后统一 stat 取 size
|
|
61
|
-
*
|
|
61
|
+
* (改名瞬间被删等竞态 → 404「备份不存在」)
|
|
62
62
|
*
|
|
63
63
|
* @throws HttpError 400(文件名非法/名称非法)、404(备份不存在)、409 BACKUP_TARGET_EXISTS
|
|
64
64
|
*/
|
|
65
65
|
export declare function renameBackup(project: ProjectContext, fileName: string, name?: string): BackupFileInfo;
|
|
66
66
|
/**
|
|
67
|
-
*
|
|
67
|
+
* 保留策略:每项目保留最近 MAX_BACKUPS_PER_PROJECT 份,超出删除最旧。
|
|
68
68
|
* 排序依据 = 文件名时间戳(可解析的才参与;非法文件名不参与保留判定)。
|
|
69
|
-
*
|
|
69
|
+
* 清理失败不阻塞调用方(记日志即可,「清理失败不阻塞备份主流程」)。
|
|
70
70
|
*/
|
|
71
71
|
export declare function pruneBackups(backupsDir: string): void;
|
|
72
72
|
/** 备份列表(GET /backups):时间倒序(最新在前);.backups/ 不存在 → 空数组(不报错) */
|
|
73
73
|
export declare function listBackups(project: ProjectContext): BackupFileInfo[];
|
|
74
74
|
/**
|
|
75
|
-
* 备份包完整校验(自
|
|
75
|
+
* 备份包完整校验(自 import 校验顺序 3-7 提取,restore 与 import 共用):
|
|
76
76
|
*
|
|
77
77
|
* 1. zip 解析(流式 + 解压总字节预算 200MB,zip 炸弹防御;失败 400「不是有效的项目备份包」)
|
|
78
78
|
* 2. 条目白名单(只接受 PROJECT_EXPORT_FILE_NAMES 三文件名,逐名比对天然防 zip 路径穿越)
|
|
79
79
|
* 3. 三文件齐全
|
|
80
|
-
* 4. 临时目录写入 → project.json / outline.json
|
|
80
|
+
* 4. 临时目录写入 → project.json / outline.json 顶层(JSON 损坏 / 不符 → 400)
|
|
81
81
|
* 5. data.db 校验(**大小 > 0 → 打开成功 → user_version**):
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
82
|
+
* - v === SCHEMA_VERSION → 接受(现状)
|
|
83
|
+
* - v < SCHEMA_VERSION → **有迁移路径** → 接受(open/restore 后自动前向迁移);
|
|
84
|
+
* **无迁移路径** → 409(文案标注版本过旧无路径)
|
|
85
|
+
* - v > SCHEMA_VERSION → 409(备份来自更高版本程序)
|
|
86
|
+
* 拒绝均不静默重建——恢复备份须明示版本不兼容。
|
|
87
87
|
*
|
|
88
88
|
* 校验在 mkdtemp 临时目录完成(finally 清理,无论成败);通过后返回解压内容与
|
|
89
89
|
* project_id(调用方负责搬入/替换)。**校验通过前不触碰目标项目任何数据**(零触碰)。
|
|
90
90
|
*
|
|
91
|
-
* @throws HttpError 400
|
|
91
|
+
* @throws HttpError 400(坏包/缺文件/未知条目/不符)/ 409 SCHEMA_VERSION_MISMATCH
|
|
92
92
|
*/
|
|
93
93
|
export declare function validateBackupPackage(zipData: Uint8Array): {
|
|
94
94
|
entries: Record<string, Uint8Array>;
|
|
@@ -97,11 +97,11 @@ export declare function validateBackupPackage(zipData: Uint8Array): {
|
|
|
97
97
|
/**
|
|
98
98
|
* 自动备份单次检查(定时器 tick 核心,纯同步、可单测):
|
|
99
99
|
*
|
|
100
|
-
* 1. 频率判定:关闭(null/0/非枚举)→ 直接返回 false
|
|
101
|
-
*
|
|
100
|
+
* 1. 频率判定:关闭(null/0/非枚举)→ 直接返回 false(null/0 = 关闭;
|
|
101
|
+
* B2.1 疑问裁决 2:读侧非枚举值按关闭处理,不开启自动备份)
|
|
102
102
|
* 2. 变更判定:`.backups/` 为空(无上次备份时刻)→ 需要备份;否则三文件 +
|
|
103
|
-
*
|
|
104
|
-
*
|
|
103
|
+
* data.db-wal 伴生文件(F2:WAL 模式写只刷新 -wal)mtime 均早于
|
|
104
|
+
* 「上次备份时刻 + 容差」→ 跳过(无变更不产生垃圾备份)
|
|
105
105
|
* 3. 有变更 → writeBackup(含保留策略清理)
|
|
106
106
|
*
|
|
107
107
|
* @returns 本次是否生成了备份
|
|
@@ -119,11 +119,11 @@ export declare function stopAutoBackup(): void;
|
|
|
119
119
|
/**
|
|
120
120
|
* 用备份包内容替换目录三文件(restore 与 import 分流共用,B2.3 提取):
|
|
121
121
|
*
|
|
122
|
-
* - project.json:JSON 解析后按 opts 覆盖——`keepId
|
|
123
|
-
*
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
*
|
|
122
|
+
* - project.json:JSON 解析后按 opts 覆盖——`keepId`(覆盖恢复以 project_id 为
|
|
123
|
+
* 唯一 key,换 id 即断连 chat_messages 会话历史——;备份包可能来自异项目,
|
|
124
|
+
* 防御性强制保留)与 `name`(「目录名 = 书名」不变式:import 覆盖归一为目录名、
|
|
125
|
+
* 新书导入同步为去重名);其余字段随备份替换。序列化走 2 空格缩进 + 尾换行
|
|
126
|
+
* (与 db 包 writeJsonAtomic 同款格式惯例)
|
|
127
127
|
* - outline.json / data.db:原样字节原子写
|
|
128
128
|
*
|
|
129
129
|
* 注意:本函数只管文件层,不含 data.db 连接管理(重连见 overwriteProjectFiles)。
|
|
@@ -134,15 +134,15 @@ export declare function writeProjectFilesFromBackup(dir: string, entries: Record
|
|
|
134
134
|
snapshotFileName?: string;
|
|
135
135
|
}): void;
|
|
136
136
|
/**
|
|
137
|
-
*
|
|
138
|
-
* 将 prompt 内容**原样**写入
|
|
139
|
-
* 迁移后
|
|
137
|
+
* 自动迁移:project.json 存在非空 `prompt` 且项目目录无 →
|
|
138
|
+
* 将 prompt 内容**原样**写入 (原子写, 同款),一次性——
|
|
139
|
+
* 迁移后 存在,条件不再满足,prompt 不再使用(字段可保留为遗留数据,宽松读取)。
|
|
140
140
|
*
|
|
141
141
|
* 触发点:打开项目时(detectProject 启动即打开 + open 路由)+ restore/import 覆盖路径
|
|
142
|
-
* (overwriteProjectFiles 同步 config 后——向无
|
|
143
|
-
* 内存 config 有 prompt 但
|
|
144
|
-
* open 前不注入)。**幂等**(prompt 非空且无
|
|
145
|
-
* 下次 open
|
|
142
|
+
* (overwriteProjectFiles 同步 config 后——向无 的项目恢复含遗留 prompt 的旧备份时,
|
|
143
|
+
* 内存 config 有 prompt 但 未创建,chat 读 为 null,恢复的 prompt 在下次
|
|
144
|
+
* open 前不注入)。**幂等**(prompt 非空且无 才迁移),**失败不阻塞**(记录日志,
|
|
145
|
+
* 下次 open 重试——「迁移在 open 流程内完成,失败不阻塞打开」)。
|
|
146
146
|
*
|
|
147
147
|
* 注:本函数置于 backup.ts 而非 middleware/project.ts——backup 模块不依赖 middleware
|
|
148
148
|
* (避免运行时循环依赖,见文件头注释),middleware 侧经 ../backup.js 导入复用。
|
|
@@ -154,49 +154,49 @@ export declare function migratePromptToAgents(project: ProjectContext): void;
|
|
|
154
154
|
* 覆盖管道(restore 与 import 覆盖当前打开的书共用,B2.3 从 restoreBackup 提取):
|
|
155
155
|
*
|
|
156
156
|
* 1. 释放当前 data.db 连接(替换 data.db 前必须;顺带清理陈旧 WAL/SHM 残留——
|
|
157
|
-
*
|
|
157
|
+
* 替换后新库不得复用旧 WAL)
|
|
158
158
|
* 2. writeProjectFilesFromBackup 原子替换三文件(保留当前项目 id;opts.name 归一)
|
|
159
|
-
* 3. 重连 + 版本对齐(v < 当前且有迁移路径 → 前向迁移,
|
|
160
|
-
*
|
|
159
|
+
* 3. 重连 + 版本对齐(v < 当前且有迁移路径 → 前向迁移,v === 当前 → 原样。
|
|
160
|
+
* 校验阶段已拒绝 v > 当前与无路径旧版,此处不会触发重建/拒绝)
|
|
161
161
|
* 4. 同步内存 config(刚原子写入,readProjectFile 必非 null;损坏抛错由 catch 恢复连接)
|
|
162
|
-
* 5.
|
|
162
|
+
* 5. migratePromptToAgents(恢复的 project.json 含遗留 prompt 且无 → 迁移)
|
|
163
163
|
* 6. 重启定时器(备份包内频率可能不同:5 → 60 等)
|
|
164
164
|
*
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
165
|
+
* 调用方职责:覆盖前自动快照 + 备份包校验(validateBackupPackage)。
|
|
166
|
+
* 失败时尝试恢复连接(原库可能未被替换或已替换为校验过的有效库),保证后续请求
|
|
167
|
+
* 不因悬挂连接报 500「connection not open」;**重连失败时连接悬挂**——由路由层
|
|
168
|
+
* (restore/import)在 catch 后检查 project.db.open 清空 currentProject 单例
|
|
169
|
+
* (backup 模块不依赖 middleware,避免运行时循环依赖)。
|
|
170
|
+
*/
|
|
171
171
|
export declare function overwriteProjectFiles(project: ProjectContext, entries: Record<string, Uint8Array>, opts?: {
|
|
172
172
|
name?: string;
|
|
173
173
|
snapshotFileName?: string;
|
|
174
174
|
}): void;
|
|
175
175
|
/**
|
|
176
|
-
* 为**未打开的书**生成覆盖前快照(import
|
|
176
|
+
* 为**未打开的书**生成覆盖前快照(import 覆盖书架其他书场景,「覆盖前自动快照」):
|
|
177
177
|
* 临时打开 data.db 连接走备份管道(wal_checkpoint 保证快照完整性),完成后关闭连接。
|
|
178
178
|
* 已打开的书走 writeBackup(project)(复用现有连接,见 import 路由分流)。
|
|
179
179
|
*/
|
|
180
180
|
export declare function snapshotBookDir(dir: string): BackupFileInfo;
|
|
181
181
|
/**
|
|
182
|
-
* 从备份恢复当前项目(POST /project/backup/restore
|
|
182
|
+
* 从备份恢复当前项目(POST /project/backup/restore):
|
|
183
183
|
*
|
|
184
|
-
* 1. fileName 白名单校验:仅允许 `.backups/`
|
|
185
|
-
*
|
|
186
|
-
*
|
|
187
|
-
*
|
|
184
|
+
* 1. fileName 白名单校验:仅允许 `.backups/` 下时间戳格式( 兼容四类:
|
|
185
|
+
* `<YYYYMMDD-HHmmssSSS>[-<kind>][-<名称>].zip` 毫秒级(含 kind 段)/ `<YYYYMMDD-HHmmssSSS>-<名称>.zip`
|
|
186
|
+
* 旧带名称 / 旧秒级 `<YYYYMMDD-HHmmss>.zip`——shared parseBackupFileName,^$ 锚定 + 名称部分
|
|
187
|
+
* 拒绝 /\\,天然防路径分隔符与 `..` 穿越);格式合法但文件不存在 → 404
|
|
188
188
|
* 2. **覆盖前自动快照**:当前三文件打包为快照存入 .backups/(复用备份管道,
|
|
189
|
-
*
|
|
190
|
-
* 3. 备份包校验(validateBackupPackage:zip
|
|
191
|
-
*
|
|
189
|
+
* 就是普通备份文件,自然参与保留策略——后悔药)
|
|
190
|
+
* 3. 备份包校验(validateBackupPackage:zip/白名单//user_version 三态,
|
|
191
|
+
* 拒绝时数据零触碰——校验通过前不触碰任何数据文件)
|
|
192
192
|
* 4. **原子替换**:closeDatabase(释放当前连接)→ 三文件逐文件原子写
|
|
193
|
-
*
|
|
194
|
-
*
|
|
195
|
-
*
|
|
196
|
-
* 5. 项目 id
|
|
193
|
+
* (临时文件 + rename;data.db 顺带清理 -wal/-shm 残留)→ 重新 openDatabase
|
|
194
|
+
* + ensureSchemaCompatible(校验阶段已保证 v ≤ 当前且有迁移路径或匹配——
|
|
195
|
+
* v < 有路径时此处前向迁移)→ project.config 同步新 project.json
|
|
196
|
+
* 5. 项目 id 保留(当前项目引用不变);重启定时器(频率可能随备份变化)
|
|
197
197
|
*
|
|
198
|
-
|
|
199
|
-
|
|
198
|
+
* @throws HttpError 400(文件名非法/坏包)、404(备份不存在)、409 SCHEMA_VERSION_MISMATCH
|
|
199
|
+
*/
|
|
200
200
|
export declare function restoreBackup(project: ProjectContext, fileName: string): {
|
|
201
201
|
snapshot: Pick<BackupFileInfo, "fileName" | "createdAt">;
|
|
202
202
|
};
|
package/dist/backup.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../src/backup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../src/backup.ts"],"names":[],"mappings":"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"}
|