@yandy0725/memory-core 2.0.0 → 2.1.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.
- package/dist/config.d.ts +66 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +69 -0
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +28 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +28 -5
- package/dist/index.js.map +1 -1
- package/dist/injection.d.ts.map +1 -1
- package/dist/injection.js +1 -1
- package/dist/injection.js.map +1 -1
- package/dist/orchestration/conversation.d.ts.map +1 -1
- package/dist/orchestration/conversation.js +1 -2
- package/dist/orchestration/conversation.js.map +1 -1
- package/dist/orchestration/ports.d.ts.map +1 -1
- package/dist/orchestration/task.d.ts.map +1 -1
- package/dist/orchestration/task.js +1 -1
- package/dist/orchestration/task.js.map +1 -1
- package/dist/store/filename.d.ts +43 -0
- package/dist/store/filename.d.ts.map +1 -1
- package/dist/store/filename.js +72 -0
- package/dist/store/filename.js.map +1 -1
- package/dist/store/fs-lock.d.ts.map +1 -1
- package/dist/store/fs-lock.js +1 -3
- package/dist/store/fs-lock.js.map +1 -1
- package/dist/store/memory-store.d.ts +37 -0
- package/dist/store/memory-store.d.ts.map +1 -1
- package/dist/store/memory-store.js +169 -17
- package/dist/store/memory-store.js.map +1 -1
- package/dist/store/paths.d.ts.map +1 -1
- package/dist/store/paths.js +8 -2
- package/dist/store/paths.js.map +1 -1
- package/dist/store/process-lock.d.ts.map +1 -1
- package/dist/store/process-lock.js.map +1 -1
- package/dist/sync/backend-git.d.ts +27 -0
- package/dist/sync/backend-git.d.ts.map +1 -0
- package/dist/sync/backend-git.js +815 -0
- package/dist/sync/backend-git.js.map +1 -0
- package/dist/sync/backend.d.ts +213 -0
- package/dist/sync/backend.d.ts.map +1 -0
- package/dist/sync/backend.js +31 -0
- package/dist/sync/backend.js.map +1 -0
- package/dist/sync/conflict.d.ts +74 -0
- package/dist/sync/conflict.d.ts.map +1 -0
- package/dist/sync/conflict.js +164 -0
- package/dist/sync/conflict.js.map +1 -0
- package/dist/sync/device.d.ts +45 -0
- package/dist/sync/device.d.ts.map +1 -0
- package/dist/sync/device.js +227 -0
- package/dist/sync/device.js.map +1 -0
- package/dist/sync/diff.d.ts +78 -0
- package/dist/sync/diff.d.ts.map +1 -0
- package/dist/sync/diff.js +115 -0
- package/dist/sync/diff.js.map +1 -0
- package/dist/sync/engine.d.ts +142 -0
- package/dist/sync/engine.d.ts.map +1 -0
- package/dist/sync/engine.js +960 -0
- package/dist/sync/engine.js.map +1 -0
- package/dist/sync/hash.d.ts +11 -0
- package/dist/sync/hash.d.ts.map +1 -0
- package/dist/sync/hash.js +14 -0
- package/dist/sync/hash.js.map +1 -0
- package/dist/sync/manifest.d.ts +63 -0
- package/dist/sync/manifest.d.ts.map +1 -0
- package/dist/sync/manifest.js +117 -0
- package/dist/sync/manifest.js.map +1 -0
- package/dist/sync/paths.d.ts +70 -0
- package/dist/sync/paths.d.ts.map +1 -0
- package/dist/sync/paths.js +111 -0
- package/dist/sync/paths.js.map +1 -0
- package/dist/sync/scan.d.ts +44 -0
- package/dist/sync/scan.d.ts.map +1 -0
- package/dist/sync/scan.js +102 -0
- package/dist/sync/scan.js.map +1 -0
- package/dist/sync/scheduler.d.ts +81 -0
- package/dist/sync/scheduler.d.ts.map +1 -0
- package/dist/sync/scheduler.js +183 -0
- package/dist/sync/scheduler.js.map +1 -0
- package/dist/sync/types.d.ts +21 -0
- package/dist/sync/types.d.ts.map +1 -0
- package/dist/sync/types.js +8 -0
- package/dist/sync/types.js.map +1 -0
- package/dist/tool/handler.d.ts.map +1 -1
- package/dist/tool/handler.js +1 -3
- package/dist/tool/handler.js.map +1 -1
- package/package.json +15 -3
- package/src/config.ts +121 -0
- package/src/index.ts +101 -5
- package/src/injection.ts +1 -3
- package/src/orchestration/conversation.ts +1 -2
- package/src/orchestration/dream.ts +0 -1
- package/src/orchestration/extract.ts +0 -1
- package/src/orchestration/ports.ts +1 -5
- package/src/orchestration/prompts.ts +0 -1
- package/src/orchestration/surfacing.ts +0 -1
- package/src/orchestration/task.ts +2 -10
- package/src/store/filename.ts +71 -0
- package/src/store/fs-lock.ts +2 -6
- package/src/store/memory-store.ts +311 -134
- package/src/store/paths.ts +12 -3
- package/src/store/process-lock.ts +4 -1
- package/src/sync/backend-git.ts +902 -0
- package/src/sync/backend.ts +220 -0
- package/src/sync/conflict.ts +247 -0
- package/src/sync/device.ts +266 -0
- package/src/sync/diff.ts +152 -0
- package/src/sync/engine.ts +1258 -0
- package/src/sync/hash.ts +14 -0
- package/src/sync/manifest.ts +148 -0
- package/src/sync/paths.ts +117 -0
- package/src/sync/scan.ts +115 -0
- package/src/sync/scheduler.ts +241 -0
- package/src/sync/types.ts +22 -0
- package/src/tool/handler.ts +1 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/sync/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 内容指纹。**这是端口契约,不是实现细节**:manifest 与三方 diff 直接比较它的输出,
|
|
3
|
+
* 任何 backend(本地目录、对象存储、……)都必须对同样的内容产出同样的值 —— 否则「没变」
|
|
4
|
+
* 会被判成「变了」,每次同步都凭空生出冲突副本。
|
|
5
|
+
*
|
|
6
|
+
* 因此不借用任何 backend 自带的摘要:git 的 blob sha1 掺了 `blob <长度>\0` 头,对象存储的
|
|
7
|
+
* ETag 掺了分片规则,两者不同源、也与这里的值不同源。换算责任在各自的 backend 身上,
|
|
8
|
+
* core 只认这一个函数。
|
|
9
|
+
*/
|
|
10
|
+
export declare function sha256Hex(raw: string): string;
|
|
11
|
+
//# sourceMappingURL=hash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../src/sync/hash.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7C"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
/**
|
|
3
|
+
* 内容指纹。**这是端口契约,不是实现细节**:manifest 与三方 diff 直接比较它的输出,
|
|
4
|
+
* 任何 backend(本地目录、对象存储、……)都必须对同样的内容产出同样的值 —— 否则「没变」
|
|
5
|
+
* 会被判成「变了」,每次同步都凭空生出冲突副本。
|
|
6
|
+
*
|
|
7
|
+
* 因此不借用任何 backend 自带的摘要:git 的 blob sha1 掺了 `blob <长度>\0` 头,对象存储的
|
|
8
|
+
* ETag 掺了分片规则,两者不同源、也与这里的值不同源。换算责任在各自的 backend 身上,
|
|
9
|
+
* core 只认这一个函数。
|
|
10
|
+
*/
|
|
11
|
+
export function sha256Hex(raw) {
|
|
12
|
+
return createHash("sha256").update(raw, "utf8").digest("hex");
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=hash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/sync/hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;;;;;GAQG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW;IACpC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { SyncFileInfo } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* manifest 的**格式**版本。形状一旦变化就加一 —— 读到不认识的版本按「无 base」处理,
|
|
4
|
+
* 见 `readManifest` 的说明。
|
|
5
|
+
*/
|
|
6
|
+
export declare const MANIFEST_VERSION = 2;
|
|
7
|
+
/** 基线所属的传输端点。只存 origin 的摘要,绝不把可能带凭据的 URL 写进 state。 */
|
|
8
|
+
export interface SyncTransport {
|
|
9
|
+
remoteHash: string;
|
|
10
|
+
branch: string;
|
|
11
|
+
}
|
|
12
|
+
/** 用 fetch 时读到的真实 origin 与配置分支构造传输身份。 */
|
|
13
|
+
export declare function syncTransport(remote: string, branch: string): SyncTransport;
|
|
14
|
+
/** 只有同一 origin 与同一 branch 的基线才能参与三方差集。 */
|
|
15
|
+
export declare function manifestMatchesTransport(manifest: SyncManifest, transport: SyncTransport): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* 上次成功同步留下的基线,即三方合并里「共同祖先」的那一侧。
|
|
18
|
+
*
|
|
19
|
+
* `base.revision` 是那次同步时远端的版本标识(空串表示还没有过基线),`base.syncedAt` 是
|
|
20
|
+
* 记录下来的同步时刻;`files` 是逐文件的指纹,diff 拿本地扫描、远端清单与它三者比对。
|
|
21
|
+
* 它只是**基线**:文件内容永远以 entry 文件本身为准,manifest 丢了不会丢内容。
|
|
22
|
+
*/
|
|
23
|
+
export interface SyncManifest {
|
|
24
|
+
version: number;
|
|
25
|
+
transport: SyncTransport;
|
|
26
|
+
base: {
|
|
27
|
+
revision: string;
|
|
28
|
+
syncedAt: string;
|
|
29
|
+
};
|
|
30
|
+
files: Record<string, SyncFileInfo>;
|
|
31
|
+
}
|
|
32
|
+
/** 没有基线的 manifest:版本已认、传输身份明确,但一个文件都不记得(等价首次同步)。 */
|
|
33
|
+
export declare function emptyManifest(transport: SyncTransport): SyncManifest;
|
|
34
|
+
/**
|
|
35
|
+
* 一个项目一份基线,落在 `<syncRoot>/state/<projectKey>.json`:key 里不含分隔符(远端布局
|
|
36
|
+
* 已把它压平),所以这里不会创建子目录,state 目录下永远是一层平铺的文件。
|
|
37
|
+
*/
|
|
38
|
+
export declare function manifestPath(syncRoot: string, projectKey: string): string;
|
|
39
|
+
/**
|
|
40
|
+
* 读基线。**任何读不懂的情况一律返回 `null`(= 没有基线体系),从不抛错**:
|
|
41
|
+
* 文件不存在、读不到(权限/损坏的盘)、JSON 坏掉、版本不认识、形状不对。
|
|
42
|
+
*
|
|
43
|
+
* 这不是吞错,是一条裁定:把「版本未知」降级成「首次同步」最坏只是多产生几条冲突副本
|
|
44
|
+
* (两边内容都还在,人可以选择),而报错会让同步彻底停摆,猜一份半可信的基线则可能
|
|
45
|
+
* 静默覆盖掉一端的内容。三者里只有降级是不丢文件的。
|
|
46
|
+
*/
|
|
47
|
+
export declare function readManifest(path: string): Promise<SyncManifest | null>;
|
|
48
|
+
/**
|
|
49
|
+
* 写基线,**原子**:先写同目录临时文件、再 `rename` 覆盖目标。
|
|
50
|
+
*
|
|
51
|
+
* 直接写目标文件会留下「写了一半的 JSON」这一窗口,而本地目录就可能是云盘同步目录 /
|
|
52
|
+
* 网络盘:读者(另一次同步、另一个进程)撞上它只会得到「读不懂 → 无 base」,
|
|
53
|
+
* 白白丢掉一次基线并多写出冲突副本。`rename` 在同一目录内是原子的替换,
|
|
54
|
+
* 读者要么看到旧文件、要么看到完整的新文件。
|
|
55
|
+
*
|
|
56
|
+
* **这里刻意不与 `device.ts` 共用一个 `writeJsonAtomic`**(这件事已经被提过两次,所以把决定写下来):
|
|
57
|
+
* 基线要的就是上面这一句「原子替换」—— 目标名上没有需要保护的东西,盖掉旧的即可;而身份文件要的是
|
|
58
|
+
* **排他创建**(`link` 原子失败于 `EEXIST`)+ 发布后读回 + 无硬链接时退回覆盖,那是三种发布形态。
|
|
59
|
+
* 合成一个函数必然带 flag,而 flag 恰好会把 `device.ts` 里那条论证清楚的排他性边界
|
|
60
|
+
*(何时排他、何时不排他、不排他时靠什么兜)压成一个参数默认值。两处重复的只有「写临时文件」这几行。
|
|
61
|
+
*/
|
|
62
|
+
export declare function writeManifest(path: string, manifest: SyncManifest): Promise<void>;
|
|
63
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/sync/manifest.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;;GAGG;AACH,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,sDAAsD;AACtD,MAAM,WAAW,aAAa;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CACf;AAED,yCAAyC;AACzC,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,CAE3E;AAED,0CAA0C;AAC1C,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,GAAG,OAAO,CAElG;AAED;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,aAAa,CAAC;IACzB,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CACpC;AAED,oDAAoD;AACpD,wBAAgB,aAAa,CAAC,SAAS,EAAE,aAAa,GAAG,YAAY,CAEpE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAEzE;AAgDD;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAY7E;AAOD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAKvF"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { sha256Hex } from "./hash.js";
|
|
5
|
+
/**
|
|
6
|
+
* manifest 的**格式**版本。形状一旦变化就加一 —— 读到不认识的版本按「无 base」处理,
|
|
7
|
+
* 见 `readManifest` 的说明。
|
|
8
|
+
*/
|
|
9
|
+
export const MANIFEST_VERSION = 2;
|
|
10
|
+
/** 用 fetch 时读到的真实 origin 与配置分支构造传输身份。 */
|
|
11
|
+
export function syncTransport(remote, branch) {
|
|
12
|
+
return { remoteHash: sha256Hex(remote), branch };
|
|
13
|
+
}
|
|
14
|
+
/** 只有同一 origin 与同一 branch 的基线才能参与三方差集。 */
|
|
15
|
+
export function manifestMatchesTransport(manifest, transport) {
|
|
16
|
+
return manifest.transport.remoteHash === transport.remoteHash && manifest.transport.branch === transport.branch;
|
|
17
|
+
}
|
|
18
|
+
/** 没有基线的 manifest:版本已认、传输身份明确,但一个文件都不记得(等价首次同步)。 */
|
|
19
|
+
export function emptyManifest(transport) {
|
|
20
|
+
return { version: MANIFEST_VERSION, transport, base: { revision: "", syncedAt: "" }, files: {} };
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 一个项目一份基线,落在 `<syncRoot>/state/<projectKey>.json`:key 里不含分隔符(远端布局
|
|
24
|
+
* 已把它压平),所以这里不会创建子目录,state 目录下永远是一层平铺的文件。
|
|
25
|
+
*/
|
|
26
|
+
export function manifestPath(syncRoot, projectKey) {
|
|
27
|
+
return join(syncRoot, "state", `${projectKey}.json`);
|
|
28
|
+
}
|
|
29
|
+
function isPlainObject(value) {
|
|
30
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
31
|
+
}
|
|
32
|
+
function isFileInfo(value) {
|
|
33
|
+
if (!isPlainObject(value))
|
|
34
|
+
return false;
|
|
35
|
+
return typeof value.hash === "string" && typeof value.modified === "string" && typeof value.bytes === "number";
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 把解析出来的 JSON 收窄成 `SyncManifest`;任一处不对返回 `null`。
|
|
39
|
+
* 逐个字段查是刻意的:manifest 是上次同步的**推断**,不是内容的权威来源,
|
|
40
|
+
* 半信半疑地用它比不用它危险得多。
|
|
41
|
+
*/
|
|
42
|
+
function asManifest(value) {
|
|
43
|
+
if (!isPlainObject(value))
|
|
44
|
+
return null;
|
|
45
|
+
if (value.version !== MANIFEST_VERSION)
|
|
46
|
+
return null;
|
|
47
|
+
const transport = value.transport;
|
|
48
|
+
if (!isPlainObject(transport) ||
|
|
49
|
+
typeof transport.remoteHash !== "string" ||
|
|
50
|
+
!/^[0-9a-f]{64}$/.test(transport.remoteHash) ||
|
|
51
|
+
typeof transport.branch !== "string" ||
|
|
52
|
+
transport.branch === "") {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
const base = value.base;
|
|
56
|
+
if (!isPlainObject(base) || typeof base.revision !== "string" || typeof base.syncedAt !== "string")
|
|
57
|
+
return null;
|
|
58
|
+
const files = value.files;
|
|
59
|
+
if (!isPlainObject(files))
|
|
60
|
+
return null;
|
|
61
|
+
for (const info of Object.values(files)) {
|
|
62
|
+
if (!isFileInfo(info))
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
version: MANIFEST_VERSION,
|
|
67
|
+
transport: { remoteHash: transport.remoteHash, branch: transport.branch },
|
|
68
|
+
base: { revision: base.revision, syncedAt: base.syncedAt },
|
|
69
|
+
files: files,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* 读基线。**任何读不懂的情况一律返回 `null`(= 没有基线体系),从不抛错**:
|
|
74
|
+
* 文件不存在、读不到(权限/损坏的盘)、JSON 坏掉、版本不认识、形状不对。
|
|
75
|
+
*
|
|
76
|
+
* 这不是吞错,是一条裁定:把「版本未知」降级成「首次同步」最坏只是多产生几条冲突副本
|
|
77
|
+
* (两边内容都还在,人可以选择),而报错会让同步彻底停摆,猜一份半可信的基线则可能
|
|
78
|
+
* 静默覆盖掉一端的内容。三者里只有降级是不丢文件的。
|
|
79
|
+
*/
|
|
80
|
+
export async function readManifest(path) {
|
|
81
|
+
const raw = await readFile(path, "utf8").catch(() => null);
|
|
82
|
+
if (raw === null)
|
|
83
|
+
return null;
|
|
84
|
+
let parsed;
|
|
85
|
+
try {
|
|
86
|
+
parsed = JSON.parse(raw);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
return asManifest(parsed);
|
|
92
|
+
}
|
|
93
|
+
/** 同目录下的临时文件名:`<path>.tmp-<pid>-<随机>`,不带目录层级,`rename` 因此不会跨卷。 */
|
|
94
|
+
function tempPath(path) {
|
|
95
|
+
return `${path}.tmp-${process.pid}-${randomBytes(6).toString("hex")}`;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* 写基线,**原子**:先写同目录临时文件、再 `rename` 覆盖目标。
|
|
99
|
+
*
|
|
100
|
+
* 直接写目标文件会留下「写了一半的 JSON」这一窗口,而本地目录就可能是云盘同步目录 /
|
|
101
|
+
* 网络盘:读者(另一次同步、另一个进程)撞上它只会得到「读不懂 → 无 base」,
|
|
102
|
+
* 白白丢掉一次基线并多写出冲突副本。`rename` 在同一目录内是原子的替换,
|
|
103
|
+
* 读者要么看到旧文件、要么看到完整的新文件。
|
|
104
|
+
*
|
|
105
|
+
* **这里刻意不与 `device.ts` 共用一个 `writeJsonAtomic`**(这件事已经被提过两次,所以把决定写下来):
|
|
106
|
+
* 基线要的就是上面这一句「原子替换」—— 目标名上没有需要保护的东西,盖掉旧的即可;而身份文件要的是
|
|
107
|
+
* **排他创建**(`link` 原子失败于 `EEXIST`)+ 发布后读回 + 无硬链接时退回覆盖,那是三种发布形态。
|
|
108
|
+
* 合成一个函数必然带 flag,而 flag 恰好会把 `device.ts` 里那条论证清楚的排他性边界
|
|
109
|
+
*(何时排他、何时不排他、不排他时靠什么兜)压成一个参数默认值。两处重复的只有「写临时文件」这几行。
|
|
110
|
+
*/
|
|
111
|
+
export async function writeManifest(path, manifest) {
|
|
112
|
+
await mkdir(dirname(path), { recursive: true });
|
|
113
|
+
const temp = tempPath(path);
|
|
114
|
+
await writeFile(temp, `${JSON.stringify(manifest, null, "\t")}\n`, "utf8");
|
|
115
|
+
await rename(temp, path);
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/sync/manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 远端的项目布局恒用 POSIX 命名规则,与宿主平台无关。
|
|
3
|
+
*
|
|
4
|
+
* 远端布局是用户自己仓库里的**数据格式**:写下去之后每台设备都按它找文件,迁移代价极高。
|
|
5
|
+
* 若跟随宿主平台,win32 上的 `windowsSafeName`(会把结尾的 `.`、空格改写成 `_2e`、`_20`)
|
|
6
|
+
* 与 cygwin git 打印的 POSIX 形态路径会让同一个仓库在两台设备上算出两个远端目录 ——
|
|
7
|
+
* 不报错,只静默分叉成两份记忆。见设计文档。
|
|
8
|
+
*
|
|
9
|
+
* 因此这里不含 `platform` 参数:平台无关是它存在的全部理由。
|
|
10
|
+
*/
|
|
11
|
+
export declare function remoteProjectKey(identityKey: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* 两个 remote 是否指向「同一个地方」。
|
|
14
|
+
*
|
|
15
|
+
* `normalizeRemoteUrl` 统一处理 http(s)/ssh/git 与 scp 写法;`file://` 与本地路径按 resolved 字节比较。
|
|
16
|
+
* 这是初始化共存检查与宿主配置漂移提示共用的唯一实现:两份比较器一旦漂移,一边会误拒初始化,
|
|
17
|
+
* 另一边却可能连提醒都不给。比不出来宁可归成「不同」(多一条 warning),不要拿猜测去拒绝用户。
|
|
18
|
+
*/
|
|
19
|
+
export declare function sameSyncRemote(left: string, right: string): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* 已经是 `remoteProjectKey` 输出的 key → 它在远端的前缀。
|
|
22
|
+
*
|
|
23
|
+
* 与 `remotePrefix` 的区别就在入参:那边收的是**身份 key**(会再派生一次),这边收的是
|
|
24
|
+
* 已经派生好的项目 key。拿错一个就是二次转义(`github.com__o__r` 变成 `github.com____o____r`),
|
|
25
|
+
* 而这个错不报错:只是远端从此多出一个谁也不认的目录,同步看起来正常但两边各存一份。
|
|
26
|
+
*/
|
|
27
|
+
export declare function remotePrefixFromKey(projectKey: string): string;
|
|
28
|
+
/** 单个项目在远端的前缀:`git/<远端 key>`。入参是**身份 key**,在这里派生成项目 key。 */
|
|
29
|
+
export declare function remotePrefix(identityKey: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* 同步状态目录在记忆根下的名字:`<记忆根>/.sync`。
|
|
32
|
+
*
|
|
33
|
+
* 这个字面值是**用户可见的布局契约**:它出现在记忆根下(用户自己的备份与清理脚本会撞上它),
|
|
34
|
+
* 而引擎、git backend、设备身份与 manifest 都把它当入参 `syncRoot` 收发。
|
|
35
|
+
* 它**不是**记忆内容:`createSnapshot` 收的是显式文件清单,扫的是项目记忆目录那一层,
|
|
36
|
+
* 所以快照里本来就不会有它 —— 不要为了「排除」而在哪里再加一条规则。适配层若各自写一遍
|
|
37
|
+
* `join(memoryRoot, ".sync")`,布局一改就要同步改若干处 —— 所以派生只留在这里一份,
|
|
38
|
+
* 适配层一律调 `syncRootPath`。
|
|
39
|
+
*/
|
|
40
|
+
export declare const SYNC_DIR_NAME = ".sync";
|
|
41
|
+
/**
|
|
42
|
+
* 记忆根 → 同步状态目录(`syncRoot`)。所有同步入口的 `syncRoot` 入参都由它派生,不要就地拼字符串。
|
|
43
|
+
*
|
|
44
|
+
* **入参是记忆根,不是某个项目的记忆目录**,也就是 `config.memoryDir` / {@link defaultMemoryRoot}
|
|
45
|
+
* 那一个(`resolveMemoryDir` 在它下面再派生出 `<kind>/<项目>` 两层)。这两者在代码里都叫过
|
|
46
|
+
* 「memoryDir」,传错**不会报错**,只会静默降级,而且**没有任何测试会红**(这正是它危险的地方):
|
|
47
|
+
*
|
|
48
|
+
* - `.sync` 是**整棵树共享一份**的状态:设备身份(`<hostname>-<id>`)、基线 manifest、以及那一个
|
|
49
|
+
* git 克隆(远端按 `git/<项目 key>/` 前缀区分项目)。传项目目录的话,每个项目各自克隆一遍整个
|
|
50
|
+
* 远端、各自生成一份设备身份、各自持一把根锁 —— 同一台机器在 `git log` 里变成好几台设备,
|
|
51
|
+
* 磁盘上多出 N 份整棵树大小的副本,而「一份 clone 服务全部项目」这个前提也没了。
|
|
52
|
+
* - 扫描器**看不见**它:`.sync` 以点开头,而 `#entryFiles` / `scanLocalEntries` / `snapshotFiles`
|
|
53
|
+
* 全都按「非点开头」过滤,所以没有任何扫描会把这份误放的状态报出来。别指望「跑一次测试或
|
|
54
|
+
* 看一次备份清单就能发现」。
|
|
55
|
+
*
|
|
56
|
+
* 所以参数名刻意不叫 `memoryDir`:调用点写出来必须看得出传的是根。
|
|
57
|
+
*/
|
|
58
|
+
export declare function syncRootPath(memoryRoot: string): string;
|
|
59
|
+
/**
|
|
60
|
+
* 根级 sync 锁的路径:`<syncRoot>/sync.lock`。
|
|
61
|
+
*
|
|
62
|
+
* 引擎的传输段与发布段各取一次这把锁(两段之间放开),而适配层还需要一个「清除遗弃根锁」的
|
|
63
|
+
* 入口:`tryWithLock` 对遗弃锁是**抛错**而不是返回 null(刻意设计),所以一次崩溃会让此后每一轮
|
|
64
|
+
* 同步都失败,而那句 “delete the file to clear it” 没人够得着。两边必须算出**同一个文件** ——
|
|
65
|
+
* 各自拼字符串的话,那条命令删的是一个没人用的文件,而真正卡住的锁永远在那里。
|
|
66
|
+
*/
|
|
67
|
+
export declare function syncLockPath(syncRoot: string): string;
|
|
68
|
+
/** 项目内某个文件在远端的路径。 */
|
|
69
|
+
export declare function remoteEntryPath(prefix: string, file: string): string;
|
|
70
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/sync/paths.ts"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAI5D;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAenE;AAUD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,4DAA4D;AAC5D,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,UAAU,CAAC;AAErC;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,qBAAqB;AACrB,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpE"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { join, resolve } from "node:path";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import { normalizeRemoteUrl, projectDirName } from "../store/paths.js";
|
|
4
|
+
/**
|
|
5
|
+
* 远端的项目布局恒用 POSIX 命名规则,与宿主平台无关。
|
|
6
|
+
*
|
|
7
|
+
* 远端布局是用户自己仓库里的**数据格式**:写下去之后每台设备都按它找文件,迁移代价极高。
|
|
8
|
+
* 若跟随宿主平台,win32 上的 `windowsSafeName`(会把结尾的 `.`、空格改写成 `_2e`、`_20`)
|
|
9
|
+
* 与 cygwin git 打印的 POSIX 形态路径会让同一个仓库在两台设备上算出两个远端目录 ——
|
|
10
|
+
* 不报错,只静默分叉成两份记忆。见设计文档。
|
|
11
|
+
*
|
|
12
|
+
* 因此这里不含 `platform` 参数:平台无关是它存在的全部理由。
|
|
13
|
+
*/
|
|
14
|
+
export function remoteProjectKey(identityKey) {
|
|
15
|
+
// `NodeJS.Platform` 没有 `posix` 这个值,而 `projectDirName` 只在 win32 上分支 ——
|
|
16
|
+
// 取任一非 win32 值(与 `store/paths.ts` 的测试同用 `linux`)得到的就是 POSIX 规则。
|
|
17
|
+
return projectDirName(identityKey, { platform: "linux" });
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 两个 remote 是否指向「同一个地方」。
|
|
21
|
+
*
|
|
22
|
+
* `normalizeRemoteUrl` 统一处理 http(s)/ssh/git 与 scp 写法;`file://` 与本地路径按 resolved 字节比较。
|
|
23
|
+
* 这是初始化共存检查与宿主配置漂移提示共用的唯一实现:两份比较器一旦漂移,一边会误拒初始化,
|
|
24
|
+
* 另一边却可能连提醒都不给。比不出来宁可归成「不同」(多一条 warning),不要拿猜测去拒绝用户。
|
|
25
|
+
*/
|
|
26
|
+
export function sameSyncRemote(left, right) {
|
|
27
|
+
const key = (value) => {
|
|
28
|
+
const normalized = normalizeRemoteUrl(value);
|
|
29
|
+
if (normalized !== null)
|
|
30
|
+
return `url:${normalized}`;
|
|
31
|
+
const raw = value.trim();
|
|
32
|
+
if (/^file:\/\//i.test(raw)) {
|
|
33
|
+
try {
|
|
34
|
+
return `path:${resolve(fileURLToPath(raw))}`;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return `path:${resolve(raw.replace(/^file:\/\//i, ""))}`;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return `path:${resolve(raw)}`;
|
|
41
|
+
};
|
|
42
|
+
return key(left) === key(right);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 远端布局里「全部记忆都放在这个目录下」的那一段:`git/`。
|
|
46
|
+
*
|
|
47
|
+
* 字面值只存这一份:引擎算 scope、适配层渲染远端路径、以及将来可能的「列出远端有哪些项目」
|
|
48
|
+
* 都靠它。多一处硬编码就多一处布局改动时会静默分叉的地方(与 `SYNC_DIR_NAME` 同一个理由)。
|
|
49
|
+
*/
|
|
50
|
+
const REMOTE_ROOT_DIR = "git";
|
|
51
|
+
/**
|
|
52
|
+
* 已经是 `remoteProjectKey` 输出的 key → 它在远端的前缀。
|
|
53
|
+
*
|
|
54
|
+
* 与 `remotePrefix` 的区别就在入参:那边收的是**身份 key**(会再派生一次),这边收的是
|
|
55
|
+
* 已经派生好的项目 key。拿错一个就是二次转义(`github.com__o__r` 变成 `github.com____o____r`),
|
|
56
|
+
* 而这个错不报错:只是远端从此多出一个谁也不认的目录,同步看起来正常但两边各存一份。
|
|
57
|
+
*/
|
|
58
|
+
export function remotePrefixFromKey(projectKey) {
|
|
59
|
+
return `${REMOTE_ROOT_DIR}/${projectKey}`;
|
|
60
|
+
}
|
|
61
|
+
/** 单个项目在远端的前缀:`git/<远端 key>`。入参是**身份 key**,在这里派生成项目 key。 */
|
|
62
|
+
export function remotePrefix(identityKey) {
|
|
63
|
+
return remotePrefixFromKey(remoteProjectKey(identityKey));
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 同步状态目录在记忆根下的名字:`<记忆根>/.sync`。
|
|
67
|
+
*
|
|
68
|
+
* 这个字面值是**用户可见的布局契约**:它出现在记忆根下(用户自己的备份与清理脚本会撞上它),
|
|
69
|
+
* 而引擎、git backend、设备身份与 manifest 都把它当入参 `syncRoot` 收发。
|
|
70
|
+
* 它**不是**记忆内容:`createSnapshot` 收的是显式文件清单,扫的是项目记忆目录那一层,
|
|
71
|
+
* 所以快照里本来就不会有它 —— 不要为了「排除」而在哪里再加一条规则。适配层若各自写一遍
|
|
72
|
+
* `join(memoryRoot, ".sync")`,布局一改就要同步改若干处 —— 所以派生只留在这里一份,
|
|
73
|
+
* 适配层一律调 `syncRootPath`。
|
|
74
|
+
*/
|
|
75
|
+
export const SYNC_DIR_NAME = ".sync";
|
|
76
|
+
/**
|
|
77
|
+
* 记忆根 → 同步状态目录(`syncRoot`)。所有同步入口的 `syncRoot` 入参都由它派生,不要就地拼字符串。
|
|
78
|
+
*
|
|
79
|
+
* **入参是记忆根,不是某个项目的记忆目录**,也就是 `config.memoryDir` / {@link defaultMemoryRoot}
|
|
80
|
+
* 那一个(`resolveMemoryDir` 在它下面再派生出 `<kind>/<项目>` 两层)。这两者在代码里都叫过
|
|
81
|
+
* 「memoryDir」,传错**不会报错**,只会静默降级,而且**没有任何测试会红**(这正是它危险的地方):
|
|
82
|
+
*
|
|
83
|
+
* - `.sync` 是**整棵树共享一份**的状态:设备身份(`<hostname>-<id>`)、基线 manifest、以及那一个
|
|
84
|
+
* git 克隆(远端按 `git/<项目 key>/` 前缀区分项目)。传项目目录的话,每个项目各自克隆一遍整个
|
|
85
|
+
* 远端、各自生成一份设备身份、各自持一把根锁 —— 同一台机器在 `git log` 里变成好几台设备,
|
|
86
|
+
* 磁盘上多出 N 份整棵树大小的副本,而「一份 clone 服务全部项目」这个前提也没了。
|
|
87
|
+
* - 扫描器**看不见**它:`.sync` 以点开头,而 `#entryFiles` / `scanLocalEntries` / `snapshotFiles`
|
|
88
|
+
* 全都按「非点开头」过滤,所以没有任何扫描会把这份误放的状态报出来。别指望「跑一次测试或
|
|
89
|
+
* 看一次备份清单就能发现」。
|
|
90
|
+
*
|
|
91
|
+
* 所以参数名刻意不叫 `memoryDir`:调用点写出来必须看得出传的是根。
|
|
92
|
+
*/
|
|
93
|
+
export function syncRootPath(memoryRoot) {
|
|
94
|
+
return join(memoryRoot, SYNC_DIR_NAME);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* 根级 sync 锁的路径:`<syncRoot>/sync.lock`。
|
|
98
|
+
*
|
|
99
|
+
* 引擎的传输段与发布段各取一次这把锁(两段之间放开),而适配层还需要一个「清除遗弃根锁」的
|
|
100
|
+
* 入口:`tryWithLock` 对遗弃锁是**抛错**而不是返回 null(刻意设计),所以一次崩溃会让此后每一轮
|
|
101
|
+
* 同步都失败,而那句 “delete the file to clear it” 没人够得着。两边必须算出**同一个文件** ——
|
|
102
|
+
* 各自拼字符串的话,那条命令删的是一个没人用的文件,而真正卡住的锁永远在那里。
|
|
103
|
+
*/
|
|
104
|
+
export function syncLockPath(syncRoot) {
|
|
105
|
+
return join(syncRoot, "sync.lock");
|
|
106
|
+
}
|
|
107
|
+
/** 项目内某个文件在远端的路径。 */
|
|
108
|
+
export function remoteEntryPath(prefix, file) {
|
|
109
|
+
return `${prefix}/${file}`;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/sync/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEvE;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IACnD,sEAAsE;IACtE,gEAAgE;IAChE,OAAO,cAAc,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,KAAa;IACzD,MAAM,GAAG,GAAG,CAAC,KAAa,EAAU,EAAE;QACrC,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,UAAU,KAAK,IAAI;YAAE,OAAO,OAAO,UAAU,EAAE,CAAC;QACpD,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACJ,OAAO,QAAQ,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC9C,CAAC;YAAC,MAAM,CAAC;gBACR,OAAO,QAAQ,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;YAC1D,CAAC;QACF,CAAC;QACD,OAAO,QAAQ,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;IAC/B,CAAC,CAAC;IACF,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC;AAED;;;;;GAKG;AACH,MAAM,eAAe,GAAG,KAAK,CAAC;AAE9B;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAAkB;IACrD,OAAO,GAAG,eAAe,IAAI,UAAU,EAAE,CAAC;AAC3C,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,YAAY,CAAC,WAAmB;IAC/C,OAAO,mBAAmB,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC;AAErC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,YAAY,CAAC,UAAkB;IAC9C,OAAO,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AACxC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC5C,OAAO,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AACpC,CAAC;AAED,qBAAqB;AACrB,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,IAAY;IAC3D,OAAO,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { SyncFileSet } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* 本地扫描的结果。`files` 是三方合并里「ours」这一侧;`unparsable` 是「看得见但同步不了」的清单,
|
|
4
|
+
* 单独列出来是刻意的:它们必须能被报给用户(「本地有 N 个 .md 解析不出,未同步」),
|
|
5
|
+
* 而不是既不在 `files` 里、也不在任何地方出现 —— 那就成了静默丢记忆。
|
|
6
|
+
*/
|
|
7
|
+
export interface LocalScan {
|
|
8
|
+
files: SyncFileSet;
|
|
9
|
+
unparsable: string[];
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* 扫描 memory 目录,产出每个 entry 的内容指纹、语义修改时间与字节数。
|
|
13
|
+
*
|
|
14
|
+
* 文件名过滤**只用**读方向的谓词(`isEntryFileNameForRead`),不在这里另抄一份判据:读路径(`MemoryStore`
|
|
15
|
+
* 的目录扫描)与同步扫描口径一旦漂移,就会出现「store 看得到、同步看不到」(或反过来)的记忆 ——
|
|
16
|
+
* 静默丢记忆。注意方向:这里扫的是**本机已经存在的文件**,所以用读口径(保留名按平台分支);
|
|
17
|
+
* 从网络进来的名字一律走写口径,理由写在引擎那一侧。
|
|
18
|
+
* **调用方必须传 store 配置里的 platform(`store.cfg.platform`),不是宿主平台**:`MemoryStore` 按
|
|
19
|
+
* `cfg.platform ?? process.platform` 解析,配置值没被透传时,保留设备名的口径会在两条路径上分叉。
|
|
20
|
+
* 保留设备名在 win32 上必须剔除(按名打开会命中控制台),而在 Linux / macOS 上 `con.md` 是
|
|
21
|
+
* 一条合法记忆,全平台剔除等于把它抹掉。
|
|
22
|
+
*
|
|
23
|
+
* 目录级失败**只有 `ENOENT` 降级成空结果**(首次同步前目录可能还没建,「目录不存在」正是「本机什么
|
|
24
|
+
* 都没有」的正确语义);其余 errno(`EACCES`/`EIO`/`EMFILE`/网络盘…)**必须抛出去**。这是数据安全线,
|
|
25
|
+
* 不是风格问题:扫描结果是三方合并的「ours」一侧,而「base 里有、ours 里没有、theirs 没动」在合并
|
|
26
|
+
* 语义里等于**用户在本地删了它**,引擎会把该删除传播到远端。一次瞬时或权限性的 readdir 失败若被
|
|
27
|
+
* 当成「目录是空的」,等于宣布「本机删光了全部记忆」,会把对端设备上的记忆全部删除 —— 而端口没有
|
|
28
|
+
* 别的通道能表达「扫描失败」,调用方无从分辨。抛出去之后由引擎捕获、把本轮变成跳过(fail-closed)。
|
|
29
|
+
*
|
|
30
|
+
* 文件级的两件「不抛」,是为了让一轮同步不因为一个文件而整体失败:
|
|
31
|
+
* - **单个文件读失败**(权限、刚被删掉)→ 该文件进 `unparsable`,其余照常扫描。同一口径也适用于符号
|
|
32
|
+
* 链接:目标`stat`失败时,只有 `ENOENT`/`ENOTDIR`(目标确实不存在)算「不是 entry」而跳过,
|
|
33
|
+
* 其余 errno 进 `unparsable` —— 理由与目录级相同,名字不能同时从两侧消失。
|
|
34
|
+
* - **`parseEntryFile` 返回 null** → 同样进 `unparsable`:解析不出 `modified` 就没法定序,也就无法安全参与合并。
|
|
35
|
+
* 单个坏文件与整个目录读不了是两件事:前者可报告可跳过,后者必须中止。
|
|
36
|
+
*
|
|
37
|
+
* 行尾算内容的一部分:`parseEntryFile` 解析前会归一 CRLF,但 hash 打的是**原始字节** —— 这是有意的,
|
|
38
|
+
* 归一再 hash 等于把归一化义务悄悄推给每个 backend 的字节契约。
|
|
39
|
+
*
|
|
40
|
+
* `bytes` 是 UTF-8 字节数而不是 JS 字符串长度:同一份记忆在不同设备上字符数必然相同,字节数才反映落盘体积。
|
|
41
|
+
* `modified` 取 frontmatter 里的值而不是文件系统 mtime —— mtime 会随复制、检出、`touch` 一起漂移。
|
|
42
|
+
*/
|
|
43
|
+
export declare function scanLocalEntries(memoryDir: string, platform?: NodeJS.Platform): Promise<LocalScan>;
|
|
44
|
+
//# sourceMappingURL=scan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/sync/scan.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAgB,WAAW,EAAE,MAAM,YAAY,CAAC;AAE5D;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACzB,KAAK,EAAE,WAAW,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAsB,gBAAgB,CACrC,SAAS,EAAE,MAAM,EACjB,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC1C,OAAO,CAAC,SAAS,CAAC,CA8DpB"}
|