@lemoncat7/dsh-partner 1.16.2 → 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/README.md +21 -0
- package/cordis.patch.yml +1 -0
- package/docs/channel-questions-and-avatar.md +30 -0
- package/docs/releases/2.0.0.md +34 -0
- package/docs/releases/2.1.0.md +13 -0
- package/docs/storage-migration.md +72 -0
- package/lib/agent-runtime.d.ts +1 -0
- package/lib/agent-runtime.d.ts.map +1 -1
- package/lib/agent-runtime.js +15 -3
- package/lib/agent-runtime.js.map +1 -1
- package/lib/api.d.ts +2 -0
- package/lib/api.d.ts.map +1 -1
- package/lib/api.js +49 -1
- package/lib/api.js.map +1 -1
- package/lib/attachments/service.d.ts +10 -0
- package/lib/attachments/service.d.ts.map +1 -1
- package/lib/attachments/service.js +68 -9
- package/lib/attachments/service.js.map +1 -1
- package/lib/channels/avatar-file.d.ts +3 -0
- package/lib/channels/avatar-file.d.ts.map +1 -0
- package/lib/channels/avatar-file.js +43 -0
- package/lib/channels/avatar-file.js.map +1 -0
- package/lib/channels/avatar-tool.d.ts +12 -0
- package/lib/channels/avatar-tool.d.ts.map +1 -0
- package/lib/channels/avatar-tool.js +78 -0
- package/lib/channels/avatar-tool.js.map +1 -0
- package/lib/channels/direct/avatar.d.ts +11 -0
- package/lib/channels/direct/avatar.d.ts.map +1 -0
- package/lib/channels/direct/avatar.js +57 -0
- package/lib/channels/direct/avatar.js.map +1 -0
- package/lib/channels/manager.d.ts +1 -0
- package/lib/channels/manager.d.ts.map +1 -1
- package/lib/channels/manager.js +67 -14
- package/lib/channels/manager.js.map +1 -1
- package/lib/channels/question-origin.d.ts +5 -0
- package/lib/channels/question-origin.d.ts.map +1 -0
- package/lib/channels/question-origin.js +14 -0
- package/lib/channels/question-origin.js.map +1 -0
- package/lib/client-controller.d.ts +1 -1
- package/lib/client-controller.d.ts.map +1 -1
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +460 -239
- package/lib/client.js.map +4 -4
- package/lib/collaboration/composition.d.ts +2 -0
- package/lib/collaboration/composition.d.ts.map +1 -1
- package/lib/collaboration/composition.js +4 -0
- package/lib/collaboration/composition.js.map +1 -1
- package/lib/companions/removal.d.ts.map +1 -1
- package/lib/companions/removal.js +3 -0
- package/lib/companions/removal.js.map +1 -1
- package/lib/concern-store.d.ts +5 -1
- package/lib/concern-store.d.ts.map +1 -1
- package/lib/concern-store.js +13 -4
- package/lib/concern-store.js.map +1 -1
- package/lib/config.d.ts +1 -0
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +6 -0
- package/lib/config.js.map +1 -1
- package/lib/domain.d.ts +2 -0
- package/lib/domain.d.ts.map +1 -1
- package/lib/domain.js.map +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +165 -132
- package/lib/index.js.map +1 -1
- package/lib/memory-store.d.ts +4 -1
- package/lib/memory-store.d.ts.map +1 -1
- package/lib/memory-store.js +10 -2
- package/lib/memory-store.js.map +1 -1
- package/lib/notifications/domain.d.ts +2 -1
- package/lib/notifications/domain.d.ts.map +1 -1
- package/lib/notifications/store.d.ts +8 -0
- package/lib/notifications/store.d.ts.map +1 -1
- package/lib/notifications/store.js +81 -17
- package/lib/notifications/store.js.map +1 -1
- package/lib/pendant/reader.js +1 -1
- package/lib/pendant/reader.js.map +1 -1
- package/lib/pendant/widget.d.ts.map +1 -1
- package/lib/pendant/widget.js +5 -1
- package/lib/pendant/widget.js.map +1 -1
- package/lib/storage/atomic.d.ts +3 -0
- package/lib/storage/atomic.d.ts.map +1 -0
- package/lib/storage/atomic.js +35 -0
- package/lib/storage/atomic.js.map +1 -0
- package/lib/storage/bootstrap.d.ts +8 -0
- package/lib/storage/bootstrap.d.ts.map +1 -0
- package/lib/storage/bootstrap.js +31 -0
- package/lib/storage/bootstrap.js.map +1 -0
- package/lib/storage/coordinator.d.ts +36 -0
- package/lib/storage/coordinator.d.ts.map +1 -0
- package/lib/storage/coordinator.js +103 -0
- package/lib/storage/coordinator.js.map +1 -0
- package/lib/storage/layout.d.ts +13 -0
- package/lib/storage/layout.d.ts.map +1 -0
- package/lib/storage/layout.js +30 -0
- package/lib/storage/layout.js.map +1 -0
- package/lib/storage/lease.d.ts +5 -0
- package/lib/storage/lease.d.ts.map +1 -0
- package/lib/storage/lease.js +25 -0
- package/lib/storage/lease.js.map +1 -0
- package/lib/storage/legacy-backups.d.ts +3 -0
- package/lib/storage/legacy-backups.d.ts.map +1 -0
- package/lib/storage/legacy-backups.js +14 -0
- package/lib/storage/legacy-backups.js.map +1 -0
- package/lib/storage/migrate-layout.d.ts +18 -0
- package/lib/storage/migrate-layout.d.ts.map +1 -0
- package/lib/storage/migrate-layout.js +204 -0
- package/lib/storage/migrate-layout.js.map +1 -0
- package/lib/storage/migrations/index.d.ts +3 -0
- package/lib/storage/migrations/index.d.ts.map +1 -0
- package/lib/storage/migrations/index.js +4 -0
- package/lib/storage/migrations/index.js.map +1 -0
- package/lib/storage/migrations/registry.d.ts +19 -0
- package/lib/storage/migrations/registry.d.ts.map +1 -0
- package/lib/storage/migrations/registry.js +40 -0
- package/lib/storage/migrations/registry.js.map +1 -0
- package/lib/storage/migrations/v0-to-v1.d.ts +5 -0
- package/lib/storage/migrations/v0-to-v1.d.ts.map +1 -0
- package/lib/storage/migrations/v0-to-v1.js +11 -0
- package/lib/storage/migrations/v0-to-v1.js.map +1 -0
- package/lib/storage/notice.d.ts +4 -0
- package/lib/storage/notice.d.ts.map +1 -0
- package/lib/storage/notice.js +13 -0
- package/lib/storage/notice.js.map +1 -0
- package/lib/storage/preflight.d.ts +40 -0
- package/lib/storage/preflight.d.ts.map +1 -0
- package/lib/storage/preflight.js +208 -0
- package/lib/storage/preflight.js.map +1 -0
- package/lib/storage/safe-files.d.ts +6 -0
- package/lib/storage/safe-files.d.ts.map +1 -0
- package/lib/storage/safe-files.js +125 -0
- package/lib/storage/safe-files.js.map +1 -0
- package/lib/storage/source-archive.d.ts +14 -0
- package/lib/storage/source-archive.d.ts.map +1 -0
- package/lib/storage/source-archive.js +98 -0
- package/lib/storage/source-archive.js.map +1 -0
- package/lib/storage/split-state.d.ts +14 -0
- package/lib/storage/split-state.d.ts.map +1 -0
- package/lib/storage/split-state.js +107 -0
- package/lib/storage/split-state.js.map +1 -0
- package/lib/store.d.ts +5 -0
- package/lib/store.d.ts.map +1 -1
- package/lib/store.js +12 -1
- package/lib/store.js.map +1 -1
- package/lib/ui/storage-recovery-marker.d.ts +4 -0
- package/lib/ui/storage-recovery-marker.d.ts.map +1 -0
- package/lib/ui/storage-recovery-marker.js +19 -0
- package/lib/ui/storage-recovery-marker.js.map +1 -0
- package/lib/ui/storage-recovery.d.ts +20 -0
- package/lib/ui/storage-recovery.d.ts.map +1 -0
- package/lib/ui/storage-recovery.js +39 -0
- package/lib/ui/storage-recovery.js.map +1 -0
- package/lib/ui/storage-settings.d.ts +2 -0
- package/lib/ui/storage-settings.d.ts.map +1 -0
- package/lib/ui/storage-settings.js +90 -0
- package/lib/ui/storage-settings.js.map +1 -0
- package/lib/ui/workspace-navigation.d.ts +78 -0
- package/lib/ui/workspace-navigation.d.ts.map +1 -0
- package/lib/ui/workspace-navigation.js +28 -0
- package/lib/ui/workspace-navigation.js.map +1 -0
- package/package.json +5 -1
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { dirname, join, resolve } from 'node:path';
|
|
3
|
+
import { storageLayout, storageVersion, TARGET_STORAGE_VERSION } from './layout.js';
|
|
4
|
+
import { exists } from './safe-files.js';
|
|
5
|
+
export const storageConfigPath = (statePath) => join(dirname(resolve(statePath)), 'storage-config.json');
|
|
6
|
+
export async function readStorageConfig(statePath, root, configured = 0) {
|
|
7
|
+
const path = storageConfigPath(statePath);
|
|
8
|
+
if (!await exists(path)) {
|
|
9
|
+
if (configured !== 0)
|
|
10
|
+
throw Error('缺少迁移提交配置,不能手动启用新版目录');
|
|
11
|
+
return { storageVersion: 0, transactionId: '', workspaceRoot: resolve(root) };
|
|
12
|
+
}
|
|
13
|
+
const value = JSON.parse(await readFile(path, 'utf8'));
|
|
14
|
+
if (!value || typeof value !== 'object' || !Number.isInteger(value.storageVersion) || typeof value.transactionId !== 'string')
|
|
15
|
+
throw Error('存储配置无效,拒绝猜测数据版本');
|
|
16
|
+
const version = storageVersion(value.storageVersion);
|
|
17
|
+
if (version > TARGET_STORAGE_VERSION)
|
|
18
|
+
throw Error('数据版本高于插件支持版本,拒绝写入');
|
|
19
|
+
if (value.workspaceRoot !== resolve(root))
|
|
20
|
+
throw Error('数据根目录已变化,请恢复配置后再迁移,不能静默创建新伙伴数据');
|
|
21
|
+
if (configured > version)
|
|
22
|
+
throw Error('插件配置与已提交的数据版本不一致');
|
|
23
|
+
if (version === 1) {
|
|
24
|
+
const layout = storageLayout(resolve(statePath), resolve(root));
|
|
25
|
+
const manifest = JSON.parse(await readFile(join(layout.publicRoot, 'migration-owner.json'), 'utf8'));
|
|
26
|
+
if (manifest.transactionId !== value.transactionId)
|
|
27
|
+
throw Error('迁移配置与目录提交标记不一致');
|
|
28
|
+
}
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/storage/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACnF,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAGxC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,SAAgB,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAC,qBAAqB,CAAC,CAAA;AAC9G,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,SAAgB,EAAC,IAAW,EAAC,UAAU,GAAC,CAAC;IAC/E,MAAM,IAAI,GAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;IACvC,IAAG,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,IAAG,UAAU,KAAG,CAAC;YAAC,MAAM,KAAK,CAAC,qBAAqB,CAAC,CAAA;QACpD,OAAO,EAAC,cAAc,EAAC,CAAC,EAAC,aAAa,EAAC,EAAE,EAAC,aAAa,EAAC,OAAO,CAAC,IAAI,CAAC,EAAC,CAAA;IACxE,CAAC;IACD,MAAM,KAAK,GAAC,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAC,MAAM,CAAC,CAAkB,CAAA;IACpE,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,OAAO,KAAK,CAAC,aAAa,KAAK,QAAQ;QAAE,MAAM,KAAK,CAAC,iBAAiB,CAAC,CAAA;IAC7J,MAAM,OAAO,GAAC,cAAc,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA;IAClD,IAAG,OAAO,GAAC,sBAAsB;QAAC,MAAM,KAAK,CAAC,mBAAmB,CAAC,CAAA;IAClE,IAAG,KAAK,CAAC,aAAa,KAAG,OAAO,CAAC,IAAI,CAAC;QAAC,MAAM,KAAK,CAAC,gCAAgC,CAAC,CAAA;IACpF,IAAG,UAAU,GAAC,OAAO;QAAC,MAAM,KAAK,CAAC,kBAAkB,CAAC,CAAA;IACrD,IAAG,OAAO,KAAG,CAAC,EAAE,CAAC;QACf,MAAM,MAAM,GAAC,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;QAC5D,MAAM,QAAQ,GAAC,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAC,sBAAsB,CAAC,EAAC,MAAM,CAAC,CAAC,CAAA;QAChG,IAAG,QAAQ,CAAC,aAAa,KAAG,KAAK,CAAC,aAAa;YAAC,MAAM,KAAK,CAAC,gBAAgB,CAAC,CAAA;IAC/E,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { PartnerState } from '../domain.js';
|
|
2
|
+
import { StoragePreflight } from './preflight.js';
|
|
3
|
+
import { type MigrationResult } from './migrate-layout.js';
|
|
4
|
+
interface Ports {
|
|
5
|
+
busy(): boolean;
|
|
6
|
+
quiesce(): Promise<void>;
|
|
7
|
+
snapshot(): PartnerState;
|
|
8
|
+
restart(): Promise<void>;
|
|
9
|
+
report(error: unknown): void;
|
|
10
|
+
}
|
|
11
|
+
export declare class StorageCoordinator extends StoragePreflight {
|
|
12
|
+
private readonly configPath;
|
|
13
|
+
private readonly workspaceRoot;
|
|
14
|
+
private readonly currentVersion;
|
|
15
|
+
private readonly ports;
|
|
16
|
+
private migrating;
|
|
17
|
+
private requests;
|
|
18
|
+
enterRequest(): () => void;
|
|
19
|
+
get running(): boolean;
|
|
20
|
+
constructor(configPath: string, workspaceRoot: string, currentVersion: number, ports: Ports);
|
|
21
|
+
status(): Promise<{
|
|
22
|
+
currentVersion: number;
|
|
23
|
+
targetVersion: number;
|
|
24
|
+
running: boolean;
|
|
25
|
+
backupPath: string | undefined;
|
|
26
|
+
cleanupPending: number;
|
|
27
|
+
lastError: string | undefined;
|
|
28
|
+
}>;
|
|
29
|
+
private validate;
|
|
30
|
+
start(expectedVersion: number): void;
|
|
31
|
+
startCleanup(): void;
|
|
32
|
+
private reload;
|
|
33
|
+
migrate(expectedVersion: number): Promise<MigrationResult>;
|
|
34
|
+
}
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=coordinator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordinator.d.ts","sourceRoot":"","sources":["../../src/storage/coordinator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAoD,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAQ5G,UAAU,KAAK;IAAG,IAAI,IAAG,OAAO,CAAC;IAAC,OAAO,IAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,QAAQ,IAAG,YAAY,CAAC;IAAC,OAAO,IAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,MAAM,CAAC,KAAK,EAAC,OAAO,GAAE,IAAI,CAAA;CAAE;AACzI,qBAAa,kBAAmB,SAAQ,gBAAgB;IAS1C,OAAO,CAAC,QAAQ,CAAC,UAAU;IAAQ,OAAO,CAAC,QAAQ,CAAC,aAAa;IAAQ,OAAO,CAAC,QAAQ,CAAC,cAAc;IAAQ,OAAO,CAAC,QAAQ,CAAC,KAAK;IARlJ,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,QAAQ,CAAE;IAClB,YAAY,IAAG,MAAI,IAAI;IAKvB,IAAI,OAAO,IAAG,OAAO,CAAuB;gBACf,UAAU,EAAC,MAAM,EAAkB,aAAa,EAAC,MAAM,EAAkB,cAAc,EAAC,MAAM,EAAkB,KAAK,EAAC,KAAK;IAClJ,MAAM;;;;;;;;IAWZ,OAAO,CAAC,QAAQ;IAMhB,KAAK,CAAC,eAAe,EAAC,MAAM,GAAE,IAAI;IAMlC,YAAY,IAAG,IAAI;IAUnB,OAAO,CAAC,MAAM;IACR,OAAO,CAAC,eAAe,EAAC,MAAM,GAAE,OAAO,CAAC,eAAe,CAAC;CAmB/D"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { StoragePreflight } from './preflight.js';
|
|
2
|
+
import { commitLayoutVersion } from './migrate-layout.js';
|
|
3
|
+
import { runMigrationPath, storageMigrations } from './migrations/index.js';
|
|
4
|
+
import { dirname, join } from 'node:path';
|
|
5
|
+
import { readFile } from 'node:fs/promises';
|
|
6
|
+
import { atomicJson } from './atomic.js';
|
|
7
|
+
import { readStorageConfig } from './bootstrap.js';
|
|
8
|
+
import { archiveRoot, cleanupArchivedSources } from './source-archive.js';
|
|
9
|
+
export class StorageCoordinator extends StoragePreflight {
|
|
10
|
+
configPath;
|
|
11
|
+
workspaceRoot;
|
|
12
|
+
currentVersion;
|
|
13
|
+
ports;
|
|
14
|
+
migrating = false;
|
|
15
|
+
requests = 0;
|
|
16
|
+
enterRequest() {
|
|
17
|
+
if (this.migrating)
|
|
18
|
+
throw Error('伙伴正在升级迁移,请稍后刷新');
|
|
19
|
+
this.requests++;
|
|
20
|
+
return () => { this.requests--; };
|
|
21
|
+
}
|
|
22
|
+
get running() { return this.migrating; }
|
|
23
|
+
constructor(configPath, workspaceRoot, currentVersion, ports) {
|
|
24
|
+
super(configPath, workspaceRoot, currentVersion, ports.snapshot);
|
|
25
|
+
this.configPath = configPath;
|
|
26
|
+
this.workspaceRoot = workspaceRoot;
|
|
27
|
+
this.currentVersion = currentVersion;
|
|
28
|
+
this.ports = ports;
|
|
29
|
+
}
|
|
30
|
+
async status() {
|
|
31
|
+
const config = await readStorageConfig(this.configPath, this.workspaceRoot);
|
|
32
|
+
let cleanupPending = 0, backupPath;
|
|
33
|
+
if (config.storageVersion === 1) {
|
|
34
|
+
backupPath = archiveRoot(this.configPath, config.transactionId);
|
|
35
|
+
try {
|
|
36
|
+
cleanupPending = JSON.parse(await readFile(join(backupPath, 'cleanup.json'), 'utf8')).pending;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
cleanupPending = 1;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
let lastError;
|
|
43
|
+
try {
|
|
44
|
+
const saved = JSON.parse(await readFile(join(dirname(this.configPath), 'storage-last-result.json'), 'utf8'));
|
|
45
|
+
if (saved.version === config.storageVersion)
|
|
46
|
+
lastError = saved.error;
|
|
47
|
+
}
|
|
48
|
+
catch { }
|
|
49
|
+
return { currentVersion: config.storageVersion, targetVersion: 1, running: this.migrating, backupPath, cleanupPending, lastError };
|
|
50
|
+
}
|
|
51
|
+
validate(expectedVersion) {
|
|
52
|
+
if (this.migrating)
|
|
53
|
+
throw Error('升级迁移正在执行,请勿重复提交');
|
|
54
|
+
if (this.requests > 1)
|
|
55
|
+
throw Error('还有页面请求正在处理,请稍后重试');
|
|
56
|
+
if (expectedVersion !== 0 || this.currentVersion !== expectedVersion)
|
|
57
|
+
throw Error('迁移版本已变化,请重新检查');
|
|
58
|
+
if (this.ports.busy())
|
|
59
|
+
throw Error('伙伴仍有会话、记忆整理或任务执行中,请结束后再迁移');
|
|
60
|
+
}
|
|
61
|
+
start(expectedVersion) {
|
|
62
|
+
this.validate(expectedVersion);
|
|
63
|
+
// Return HTTP 202 immediately; the runtime gate owns execution, not the
|
|
64
|
+
// lifetime of the browser/proxy request. Never start a second operation.
|
|
65
|
+
void this.migrate(expectedVersion).catch(error => this.ports.report(error));
|
|
66
|
+
}
|
|
67
|
+
startCleanup() {
|
|
68
|
+
if (this.migrating || this.requests > 1 || this.ports.busy())
|
|
69
|
+
throw Error('伙伴仍在执行或处理请求,请稍后清理');
|
|
70
|
+
if (this.currentVersion !== 1)
|
|
71
|
+
throw Error('尚未完成目录升级,不能清理');
|
|
72
|
+
this.migrating = true;
|
|
73
|
+
void (async () => {
|
|
74
|
+
await this.ports.quiesce();
|
|
75
|
+
const config = await readStorageConfig(this.configPath, this.workspaceRoot);
|
|
76
|
+
await cleanupArchivedSources(this.configPath, this.workspaceRoot, config.transactionId);
|
|
77
|
+
})().catch(error => this.ports.report(error)).finally(() => this.reload());
|
|
78
|
+
}
|
|
79
|
+
reload() { setTimeout(() => { void this.ports.restart().catch(error => this.ports.report(error)); }, 200); }
|
|
80
|
+
async migrate(expectedVersion) {
|
|
81
|
+
this.validate(expectedVersion);
|
|
82
|
+
this.migrating = true;
|
|
83
|
+
try {
|
|
84
|
+
await this.ports.quiesce();
|
|
85
|
+
const context = { statePath: this.configPath, root: this.workspaceRoot, state: this.ports.snapshot() };
|
|
86
|
+
await runMigrationPath(storageMigrations, 0, 1, context, (from, to) => commitLayoutVersion(context, from, to));
|
|
87
|
+
if (!context.result)
|
|
88
|
+
throw Error('迁移未返回结果');
|
|
89
|
+
return context.result;
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
const config = await readStorageConfig(this.configPath, this.workspaceRoot).catch(() => undefined);
|
|
93
|
+
await atomicJson(join(dirname(this.configPath), 'storage-last-result.json'), { version: config?.storageVersion ?? this.currentVersion, error: error instanceof Error ? error.message : '迁移执行失败' }).catch(() => { });
|
|
94
|
+
throw error;
|
|
95
|
+
}
|
|
96
|
+
finally {
|
|
97
|
+
// Reload either the unchanged legacy layout or the committed new layout.
|
|
98
|
+
// Never resume old service objects after any migration failure.
|
|
99
|
+
this.reload();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=coordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../src/storage/coordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Storage format versions are independent of package and PartnerState versions. */
|
|
2
|
+
export declare const TARGET_STORAGE_VERSION = 1;
|
|
3
|
+
export declare const READABLE_STORAGE_VERSION = 1;
|
|
4
|
+
export declare function storageVersion(value: unknown): number;
|
|
5
|
+
export declare function companionDirectory(root: string, id: string): string;
|
|
6
|
+
export declare function storageLayout(statePath: string, root: string): {
|
|
7
|
+
legacyPublic: string;
|
|
8
|
+
publicRoot: string;
|
|
9
|
+
legacySkills: string;
|
|
10
|
+
privateRoot: (id: string) => string;
|
|
11
|
+
legacyCompanion: (id: string) => string;
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/storage/layout.ts"],"names":[],"mappings":"AAEA,oFAAoF;AACpF,eAAO,MAAM,sBAAsB,IAAI,CAAA;AACvC,eAAO,MAAM,wBAAwB,IAAI,CAAA;AAEzC,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAIrD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAGnE;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;;;sBAQvC,MAAM;0BACF,MAAM;EAE/B"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { dirname, isAbsolute, join, resolve } from 'node:path';
|
|
2
|
+
/** Storage format versions are independent of package and PartnerState versions. */
|
|
3
|
+
export const TARGET_STORAGE_VERSION = 1;
|
|
4
|
+
export const READABLE_STORAGE_VERSION = 1;
|
|
5
|
+
export function storageVersion(value) {
|
|
6
|
+
if (value === undefined)
|
|
7
|
+
return 0;
|
|
8
|
+
if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 0)
|
|
9
|
+
throw new Error('storageVersion 必须是非负整数');
|
|
10
|
+
return value;
|
|
11
|
+
}
|
|
12
|
+
export function companionDirectory(root, id) {
|
|
13
|
+
if (!id || id === '.' || id === '..' || /[/\\\0:]/.test(id))
|
|
14
|
+
throw new Error('伙伴目录标识无效');
|
|
15
|
+
return join(resolve(root), 'partners', id);
|
|
16
|
+
}
|
|
17
|
+
export function storageLayout(statePath, root) {
|
|
18
|
+
// Relative paths must be resolved once at initialization, not per request.
|
|
19
|
+
if (!isAbsolute(statePath) || !isAbsolute(root))
|
|
20
|
+
throw new Error('存储检查要求绝对路径');
|
|
21
|
+
const legacyPublic = dirname(statePath);
|
|
22
|
+
return {
|
|
23
|
+
legacyPublic,
|
|
24
|
+
publicRoot: join(legacyPublic, 'storage-v1'),
|
|
25
|
+
legacySkills: join(root, 'partner-system', 'skills'),
|
|
26
|
+
privateRoot: (id) => join(companionDirectory(root, id), '.partner'),
|
|
27
|
+
legacyCompanion: (id) => companionDirectory(root, id),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/storage/layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAE9D,oFAAoF;AACpF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAA;AACvC,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAA;AAEzC,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,CAAC,CAAA;IACjC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;IACrH,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,EAAU;IACzD,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,CAAA;IACxF,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC,CAAA;AAC5C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,SAAiB,EAAE,IAAY;IAC3D,2EAA2E;IAC3E,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAA;IAC9E,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;IACvC,OAAO;QACL,YAAY;QACZ,UAAU,EAAE,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC;QAC5C,YAAY,EAAE,IAAI,CAAC,IAAI,EAAE,gBAAgB,EAAE,QAAQ,CAAC;QACpD,WAAW,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,UAAU,CAAC;QAC3E,eAAe,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC;KAC9D,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** OS-backed SQLite lock: another process/container cannot use the same plugin
|
|
2
|
+
* data concurrently; a process crash releases it without stale PID lock files.
|
|
3
|
+
*/
|
|
4
|
+
export declare function acquireStorageLease(statePath: string): Promise<() => void>;
|
|
5
|
+
//# sourceMappingURL=lease.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lease.d.ts","sourceRoot":"","sources":["../../src/storage/lease.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,SAAS,EAAC,MAAM,GAAE,OAAO,CAAC,MAAI,IAAI,CAAC,CAO5E"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { mkdir, chmod } from 'node:fs/promises';
|
|
2
|
+
import { dirname, join, resolve } from 'node:path';
|
|
3
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
4
|
+
/** OS-backed SQLite lock: another process/container cannot use the same plugin
|
|
5
|
+
* data concurrently; a process crash releases it without stale PID lock files.
|
|
6
|
+
*/
|
|
7
|
+
export async function acquireStorageLease(statePath) {
|
|
8
|
+
const directory = dirname(resolve(statePath));
|
|
9
|
+
await mkdir(directory, { recursive: true, mode: 0o700 });
|
|
10
|
+
const path = join(directory, 'storage-runtime.sqlite'), db = new DatabaseSync(path);
|
|
11
|
+
try {
|
|
12
|
+
await chmod(path, 0o600);
|
|
13
|
+
db.exec('PRAGMA busy_timeout=0; BEGIN EXCLUSIVE');
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
db.close();
|
|
17
|
+
throw Error('该伙伴数据目录已被另一个插件实例使用,拒绝并发运行或迁移');
|
|
18
|
+
}
|
|
19
|
+
let closed = false;
|
|
20
|
+
return () => { if (!closed) {
|
|
21
|
+
closed = true;
|
|
22
|
+
db.close();
|
|
23
|
+
} };
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=lease.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lease.js","sourceRoot":"","sources":["../../src/storage/lease.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,SAAgB;IACxD,MAAM,SAAS,GAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAAA,MAAM,KAAK,CAAC,SAAS,EAAC,EAAC,SAAS,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,CAAC,CAAA;IAC9F,MAAM,IAAI,GAAC,IAAI,CAAC,SAAS,EAAC,wBAAwB,CAAC,EAAC,EAAE,GAAC,IAAI,YAAY,CAAC,IAAI,CAAC,CAAA;IAC7E,IAAI,CAAC;QAAA,MAAM,KAAK,CAAC,IAAI,EAAC,KAAK,CAAC,CAAC;QAAA,EAAE,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAA;IAAA,CAAC;IAC/E,MAAK,CAAC;QAAA,EAAE,CAAC,KAAK,EAAE,CAAC;QAAA,MAAM,KAAK,CAAC,8BAA8B,CAAC,CAAA;IAAA,CAAC;IAC7D,IAAI,MAAM,GAAC,KAAK,CAAA;IAChB,OAAO,GAAE,EAAE,GAAC,IAAG,CAAC,MAAM,EAAC,CAAC;QAAA,MAAM,GAAC,IAAI,CAAC;QAAA,EAAE,CAAC,KAAK,EAAE,CAAA;IAAA,CAAC,CAAA,CAAC,CAAA;AAClD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy-backups.d.ts","sourceRoot":"","sources":["../../src/storage/legacy-backups.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,oBAAoB,GAAI,MAAM,MAAM,KAAG,OAAiF,CAAA;AACrI,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAGzE"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { readdir } from 'node:fs/promises';
|
|
2
|
+
// Only known legacy naming families; never sweep arbitrary user documents.
|
|
3
|
+
export const isLegacyMemoryBackup = (name) => /^memory[-_](?:backup|back)(?:[-_][a-z0-9][a-z0-9._-]*)?$/i.test(name);
|
|
4
|
+
export async function legacyMemoryBackups(root) {
|
|
5
|
+
try {
|
|
6
|
+
return (await readdir(root)).filter(isLegacyMemoryBackup).sort();
|
|
7
|
+
}
|
|
8
|
+
catch (error) {
|
|
9
|
+
if (error.code === 'ENOENT')
|
|
10
|
+
return [];
|
|
11
|
+
throw error;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=legacy-backups.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy-backups.js","sourceRoot":"","sources":["../../src/storage/legacy-backups.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAE1C,2EAA2E;AAC3E,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,2DAA2D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACrI,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAY;IACpD,IAAI,CAAC;QAAC,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,IAAI,EAAE,CAAA;IAAC,CAAC;IACxE,OAAO,KAAK,EAAE,CAAC;QAAC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QAAC,MAAM,KAAK,CAAA;IAAC,CAAC;AAClG,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { PartnerState } from '../domain.js';
|
|
2
|
+
export interface MigrationResult {
|
|
3
|
+
storageVersion: number;
|
|
4
|
+
backupPath: string;
|
|
5
|
+
retainedLegacy: boolean;
|
|
6
|
+
cleanupPending?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface LayoutMigrationContext {
|
|
9
|
+
statePath: string;
|
|
10
|
+
root: string;
|
|
11
|
+
state: PartnerState;
|
|
12
|
+
result?: MigrationResult;
|
|
13
|
+
}
|
|
14
|
+
/** Called only after every legacy writer has been stopped and drained. */
|
|
15
|
+
export declare function migrateLayout(statePath: string, root: string, state: PartnerState): Promise<MigrationResult>;
|
|
16
|
+
export declare function verifyInstalledLayout(context: LayoutMigrationContext): Promise<void>;
|
|
17
|
+
export declare function commitLayoutVersion(context: LayoutMigrationContext, expected: number, next: number): Promise<void>;
|
|
18
|
+
//# sourceMappingURL=migrate-layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate-layout.d.ts","sourceRoot":"","sources":["../../src/storage/migrate-layout.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAYhD,MAAM,WAAW,eAAe;IAAG,cAAc,EAAC,MAAM,CAAC;IAAC,UAAU,EAAC,MAAM,CAAC;IAAC,cAAc,EAAC,OAAO,CAAC;IAAC,cAAc,CAAC,EAAC,MAAM,CAAA;CAAE;AAC7H,MAAM,WAAW,sBAAsB;IAAG,SAAS,EAAC,MAAM,CAAC;IAAC,IAAI,EAAC,MAAM,CAAC;IAAC,KAAK,EAAC,YAAY,CAAC;IAAC,MAAM,CAAC,EAAC,eAAe,CAAA;CAAE;AACtH,0EAA0E;AAC1E,wBAAsB,aAAa,CAAC,SAAS,EAAC,MAAM,EAAC,IAAI,EAAC,MAAM,EAAC,KAAK,EAAC,YAAY,GAAE,OAAO,CAAC,eAAe,CAAC,CAkF5G;AACD,wBAAsB,qBAAqB,CAAC,OAAO,EAAC,sBAAsB,GAAE,OAAO,CAAC,IAAI,CAAC,CAUxF;AACD,wBAAsB,mBAAmB,CAAC,OAAO,EAAC,sBAAsB,EAAC,QAAQ,EAAC,MAAM,EAAC,IAAI,EAAC,MAAM,GAAE,OAAO,CAAC,IAAI,CAAC,CAiBlH"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { mkdir, readFile, readdir, rename, rm, rmdir } from 'node:fs/promises';
|
|
3
|
+
import { dirname, join, relative, resolve, sep, isAbsolute } from 'node:path';
|
|
4
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
5
|
+
import { PartnerInboxStore } from '../notifications/store.js';
|
|
6
|
+
import { AttachmentDeliveryService } from '../attachments/service.js';
|
|
7
|
+
import { storageLayout } from './layout.js';
|
|
8
|
+
import { atomicJson, syncDirectory } from './atomic.js';
|
|
9
|
+
import { copyVerified, exists, safeTree, verifyDatabases } from './safe-files.js';
|
|
10
|
+
import { SplitStatePersistence, privateStateOwners } from './split-state.js';
|
|
11
|
+
import { storageConfigPath, readStorageConfig } from './bootstrap.js';
|
|
12
|
+
import { legacyMemoryBackups } from './legacy-backups.js';
|
|
13
|
+
import { prepareSourceArchive, cleanupArchivedSources } from './source-archive.js';
|
|
14
|
+
/** Called only after every legacy writer has been stopped and drained. */
|
|
15
|
+
export async function migrateLayout(statePath, root, state) {
|
|
16
|
+
statePath = resolve(statePath);
|
|
17
|
+
root = resolve(root);
|
|
18
|
+
const layout = storageLayout(statePath, root), journalPath = join(layout.legacyPublic, 'storage-migration.json');
|
|
19
|
+
const current = await readStorageConfig(statePath, root);
|
|
20
|
+
if (current.storageVersion === 1)
|
|
21
|
+
return { storageVersion: 1, backupPath: join(layout.legacyPublic, 'migration-backups', current.transactionId), retainedLegacy: true };
|
|
22
|
+
const oldJournal = await exists(journalPath) ? JSON.parse(await readFile(journalPath, 'utf8')) : undefined;
|
|
23
|
+
if (oldJournal) {
|
|
24
|
+
if (!/^[a-f0-9-]{36}$/.test(oldJournal.id) || !Array.isArray(oldJournal.owners))
|
|
25
|
+
throw Error('迁移恢复清单无效');
|
|
26
|
+
// Only remove this transaction's uncommitted generated targets, never old data.
|
|
27
|
+
for (const target of [layout.publicRoot, ...oldJournal.owners.map(id => layout.privateRoot(id))]) {
|
|
28
|
+
for (const path of [target, target + '.migrate-' + oldJournal.id])
|
|
29
|
+
if (await exists(path)) {
|
|
30
|
+
await safeTree(path);
|
|
31
|
+
if (path !== target && (await readdir(path)).length === 0) {
|
|
32
|
+
await rmdir(path);
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
const marker = JSON.parse(await readFile(join(path, 'migration-owner.json'), 'utf8'));
|
|
36
|
+
if (marker.transactionId !== oldJournal.id)
|
|
37
|
+
throw Error('迁移目标不是当前事务创建,拒绝覆盖');
|
|
38
|
+
await rm(path, { recursive: true, force: false });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const id = randomUUID(), owners = new Set(privateStateOwners(state));
|
|
43
|
+
const inboxPath = join(layout.legacyPublic, 'partner-inbox.sqlite');
|
|
44
|
+
let notices = [];
|
|
45
|
+
if (await exists(inboxPath)) {
|
|
46
|
+
await safeTree(inboxPath);
|
|
47
|
+
const db = new DatabaseSync(inboxPath, { readOnly: true });
|
|
48
|
+
try {
|
|
49
|
+
notices = db.prepare('SELECT payload,read_at FROM notices').all().map(row => ({ ...JSON.parse(String(row.payload)), ...(row.read_at === null ? {} : { readAt: Number(row.read_at) }) }));
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
db.close();
|
|
53
|
+
}
|
|
54
|
+
for (const notice of notices)
|
|
55
|
+
if (notice.kind !== 'system')
|
|
56
|
+
owners.add(notice.companionId);
|
|
57
|
+
if (notices.length > 200)
|
|
58
|
+
throw Error('消息库超出预期保留数量,拒绝截断迁移');
|
|
59
|
+
}
|
|
60
|
+
const deliveryRoot = join(layout.legacyPublic, 'attachment-deliveries'), deliveryDb = join(deliveryRoot, 'deliveries.sqlite');
|
|
61
|
+
let deliveries = [];
|
|
62
|
+
if (await exists(deliveryDb)) {
|
|
63
|
+
await safeTree(deliveryRoot);
|
|
64
|
+
const db = new DatabaseSync(deliveryDb, { readOnly: true });
|
|
65
|
+
try {
|
|
66
|
+
deliveries = db.prepare('SELECT payload FROM deliveries').all().map(row => JSON.parse(String(row.payload)));
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
db.close();
|
|
70
|
+
}
|
|
71
|
+
for (const item of deliveries)
|
|
72
|
+
owners.add(item.companionId);
|
|
73
|
+
}
|
|
74
|
+
for (const owner of owners)
|
|
75
|
+
layout.privateRoot(owner);
|
|
76
|
+
const targets = [layout.publicRoot, ...[...owners].map(owner => layout.privateRoot(owner))];
|
|
77
|
+
const sources = [layout.legacySkills, deliveryRoot, ...[...owners].flatMap(owner => ['memory', 'concerns', 'memory-backup'].map(name => join(layout.legacyCompanion(owner), name)))];
|
|
78
|
+
for (const owner of owners)
|
|
79
|
+
for (const name of await legacyMemoryBackups(layout.legacyCompanion(owner)))
|
|
80
|
+
sources.push(join(layout.legacyCompanion(owner), name));
|
|
81
|
+
for (const target of targets)
|
|
82
|
+
for (const source of sources)
|
|
83
|
+
if (target === source || target.startsWith(source + sep) || source.startsWith(target + sep))
|
|
84
|
+
throw Error('迁移源与目标目录重叠,拒绝执行');
|
|
85
|
+
for (const target of targets) {
|
|
86
|
+
await safeTree(target);
|
|
87
|
+
if (await exists(target))
|
|
88
|
+
throw Error('目标目录已存在,拒绝覆盖:' + target);
|
|
89
|
+
}
|
|
90
|
+
const journal = { id, phase: 'copying', owners: [...owners] };
|
|
91
|
+
await atomicJson(journalPath, journal);
|
|
92
|
+
const staging = (path) => path + '.migrate-' + id;
|
|
93
|
+
const privateStage = (owner) => staging(layout.privateRoot(owner));
|
|
94
|
+
for (const target of targets) {
|
|
95
|
+
await mkdir(staging(target), { recursive: true, mode: 0o700 });
|
|
96
|
+
await atomicJson(join(staging(target), 'migration-owner.json'), { transactionId: id });
|
|
97
|
+
}
|
|
98
|
+
const backup = join(layout.legacyPublic, 'migration-backups', id);
|
|
99
|
+
await copyVerified(statePath, join(backup, 'state.json'));
|
|
100
|
+
await prepareSourceArchive(statePath, root, id, [...owners]);
|
|
101
|
+
// Original directories remain untouched and serve as the pre-upgrade backup.
|
|
102
|
+
await atomicJson(join(backup, 'sources.json'), { transactionId: id, workspaceRoot: root, retained: targets.slice(1).map((_, i) => layout.legacyCompanion(journal.owners[i])), publicSource: layout.legacyPublic });
|
|
103
|
+
for (const owner of owners) {
|
|
104
|
+
const source = layout.legacyCompanion(owner), target = privateStage(owner);
|
|
105
|
+
await copyVerified(join(source, 'memory'), join(target, 'memory'));
|
|
106
|
+
await copyVerified(join(source, 'concerns'), join(target, 'concerns'));
|
|
107
|
+
// Preserve legacy backups opaquely; never merge their contents into live memory.
|
|
108
|
+
for (const name of await legacyMemoryBackups(source))
|
|
109
|
+
await copyVerified(join(source, name), join(target, 'backups', 'legacy-memory', name));
|
|
110
|
+
}
|
|
111
|
+
await copyVerified(layout.legacySkills, join(staging(layout.publicRoot), 'skills'));
|
|
112
|
+
const next = structuredClone(state);
|
|
113
|
+
next.notificationDeliveries ??= [];
|
|
114
|
+
for (const skill of next.skills) {
|
|
115
|
+
const rel = relative(layout.legacySkills, resolve(skill.rootPath));
|
|
116
|
+
if (isAbsolute(rel) || rel === '..' || rel.startsWith('../') || rel.startsWith('..\\') || resolve(layout.legacySkills, rel) !== resolve(skill.rootPath))
|
|
117
|
+
throw Error('Skill 不在已登记的公共目录中');
|
|
118
|
+
skill.rootPath = join(layout.publicRoot, 'skills', rel);
|
|
119
|
+
}
|
|
120
|
+
const split = new SplitStatePersistence(staging(layout.publicRoot), privateStage);
|
|
121
|
+
await split.write(next);
|
|
122
|
+
if (JSON.stringify(await split.read()) !== JSON.stringify(next)) {
|
|
123
|
+
// Field/array order can change during partition; compare canonical state below.
|
|
124
|
+
if (canonical(await split.read()) !== canonical(next))
|
|
125
|
+
throw Error('公共和私有配置拆分校验失败');
|
|
126
|
+
}
|
|
127
|
+
const inbox = await PartnerInboxStore.openPartitioned(join(staging(layout.publicRoot), 'indexes', 'inbox.sqlite'), privateStage);
|
|
128
|
+
try {
|
|
129
|
+
for (const notice of notices) {
|
|
130
|
+
inbox.append(notice);
|
|
131
|
+
if (notice.readAt !== undefined)
|
|
132
|
+
inbox.markRead([notice.id], notice.readAt);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
finally {
|
|
136
|
+
inbox.close();
|
|
137
|
+
}
|
|
138
|
+
const attachments = await AttachmentDeliveryService.openPartitioned(join(staging(layout.publicRoot), 'indexes', 'attachments'), privateStage);
|
|
139
|
+
try {
|
|
140
|
+
for (const item of deliveries) {
|
|
141
|
+
if (!/^[a-f0-9]{64}$/.test(item.id))
|
|
142
|
+
throw Error('附件迁移标识无效');
|
|
143
|
+
await safeTree(join(deliveryRoot, item.id));
|
|
144
|
+
await attachments.importExisting(item, await readFile(join(deliveryRoot, item.id)));
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
finally {
|
|
148
|
+
attachments.close();
|
|
149
|
+
}
|
|
150
|
+
for (const target of targets)
|
|
151
|
+
await verifyDatabases(staging(target));
|
|
152
|
+
for (const target of targets) {
|
|
153
|
+
await rename(staging(target), target);
|
|
154
|
+
await syncDirectory(dirname(target));
|
|
155
|
+
}
|
|
156
|
+
await atomicJson(journalPath, { ...journal, phase: 'installed' });
|
|
157
|
+
return { storageVersion: 1, backupPath: backup, retainedLegacy: true };
|
|
158
|
+
}
|
|
159
|
+
export async function verifyInstalledLayout(context) {
|
|
160
|
+
const layout = storageLayout(resolve(context.statePath), resolve(context.root));
|
|
161
|
+
const journal = JSON.parse(await readFile(join(layout.legacyPublic, 'storage-migration.json'), 'utf8'));
|
|
162
|
+
if (journal.phase !== 'installed')
|
|
163
|
+
throw Error('迁移尚未完成安装');
|
|
164
|
+
await new SplitStatePersistence(layout.publicRoot, layout.privateRoot).read();
|
|
165
|
+
for (const target of [layout.publicRoot, ...journal.owners.map(id => layout.privateRoot(id))]) {
|
|
166
|
+
const marker = JSON.parse(await readFile(join(target, 'migration-owner.json'), 'utf8'));
|
|
167
|
+
if (marker.transactionId !== journal.id)
|
|
168
|
+
throw Error('迁移目标标记不一致');
|
|
169
|
+
await verifyDatabases(target);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
export async function commitLayoutVersion(context, expected, next) {
|
|
173
|
+
if (expected !== 0 || next !== 1)
|
|
174
|
+
throw Error('布局迁移版本无效');
|
|
175
|
+
const root = resolve(context.root), statePath = resolve(context.statePath), layout = storageLayout(statePath, root);
|
|
176
|
+
const current = await readStorageConfig(statePath, root);
|
|
177
|
+
if (current.storageVersion !== expected)
|
|
178
|
+
throw Error('迁移版本已被其他操作更新');
|
|
179
|
+
const journalPath = join(layout.legacyPublic, 'storage-migration.json');
|
|
180
|
+
const journal = JSON.parse(await readFile(journalPath, 'utf8'));
|
|
181
|
+
if (journal.phase !== 'installed')
|
|
182
|
+
throw Error('没有可提交的迁移');
|
|
183
|
+
await atomicJson(storageConfigPath(statePath), { storageVersion: next, transactionId: journal.id, workspaceRoot: root });
|
|
184
|
+
await atomicJson(journalPath, { ...journal, phase: 'committed' }).catch(() => { });
|
|
185
|
+
// Activation is durable. Cleanup failures must not be reported as a rollback.
|
|
186
|
+
try {
|
|
187
|
+
const cleanup = await cleanupArchivedSources(statePath, root, journal.id);
|
|
188
|
+
if (context.result) {
|
|
189
|
+
context.result.retainedLegacy = cleanup.pending > 0;
|
|
190
|
+
context.result.cleanupPending = cleanup.pending;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
if (context.result) {
|
|
195
|
+
context.result.retainedLegacy = true;
|
|
196
|
+
context.result.cleanupPending = 1;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
function canonical(value) {
|
|
201
|
+
const normalize = (v) => Array.isArray(v) ? v.map(normalize).sort((a, b) => JSON.stringify(a).localeCompare(JSON.stringify(b))) : v && typeof v === 'object' ? Object.fromEntries(Object.entries(v).filter(([, x]) => x !== undefined).sort(([a], [b]) => a.localeCompare(b)).map(([k, x]) => [k, normalize(x)])) : v;
|
|
202
|
+
return JSON.stringify(normalize(value));
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=migrate-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate-layout.js","sourceRoot":"","sources":["../../src/storage/migrate-layout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/storage/migrations/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAC/D,eAAO,MAAM,iBAAiB,4GAAoB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/storage/migrations/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAC/D,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAAM,CAAU,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** A version is a complete public + private layout transition, never one
|
|
2
|
+
* companion. The coordinator supplies the exclusive gate and durable journal.
|
|
3
|
+
*/
|
|
4
|
+
export interface StorageMigration<Context> {
|
|
5
|
+
id: string;
|
|
6
|
+
from: number;
|
|
7
|
+
to: number;
|
|
8
|
+
title: string;
|
|
9
|
+
/** Absent while a step is inspection-only; do not expose an execute button. */
|
|
10
|
+
execute?: (context: Context) => Promise<void>;
|
|
11
|
+
verify?: (context: Context) => Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
export declare function migrationPath<Context>(steps: readonly StorageMigration<Context>[], from: number, to: number): StorageMigration<Context>[];
|
|
14
|
+
/** The caller must hold its runtime write gate throughout. On any error stop:
|
|
15
|
+
* reopen the persisted version/journal before retrying (including commit errors).
|
|
16
|
+
* This runner does not guess whether a failed commit reached durable storage.
|
|
17
|
+
*/
|
|
18
|
+
export declare function runMigrationPath<Context>(steps: readonly StorageMigration<Context>[], from: number, to: number, context: Context, commitVersion: (expected: number, next: number, migrationId: string) => Promise<void>): Promise<void>;
|
|
19
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/storage/migrations/registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,gBAAgB,CAAC,OAAO;IACvC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,+EAA+E;IAC/E,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7C,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC7C;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,gBAAgB,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAiBzI;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,gBAAgB,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAS7O"}
|