@lemoncat7/dsh-partner 1.16.1 → 2.0.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 +23 -0
- package/cordis.patch.yml +1 -0
- package/docs/channel-reply-progress.md +18 -0
- package/docs/releases/1.16.2.md +11 -0
- package/docs/releases/2.0.0.md +34 -0
- package/docs/storage-migration.md +72 -0
- package/lib/agent-runtime.d.ts +2 -1
- package/lib/agent-runtime.d.ts.map +1 -1
- package/lib/agent-runtime.js +23 -8
- 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/direct/progress-transport.d.ts +15 -0
- package/lib/channels/direct/progress-transport.d.ts.map +1 -0
- package/lib/channels/direct/progress-transport.js +51 -0
- package/lib/channels/direct/progress-transport.js.map +1 -0
- package/lib/channels/direct/transport.d.ts +2 -0
- package/lib/channels/direct/transport.d.ts.map +1 -1
- package/lib/channels/direct/transport.js +6 -0
- package/lib/channels/direct/transport.js.map +1 -1
- package/lib/channels/manager.d.ts.map +1 -1
- package/lib/channels/manager.js +23 -6
- package/lib/channels/manager.js.map +1 -1
- package/lib/channels/reply-progress-controller.d.ts +32 -0
- package/lib/channels/reply-progress-controller.d.ts.map +1 -0
- package/lib/channels/reply-progress-controller.js +116 -0
- package/lib/channels/reply-progress-controller.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 +8657 -1564
- package/lib/client.js.map +4 -4
- 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/execution/reply-progress.d.ts +7 -0
- package/lib/execution/reply-progress.d.ts.map +1 -0
- package/lib/execution/reply-progress.js +15 -0
- package/lib/execution/reply-progress.js.map +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +162 -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/markdown.d.ts +6 -0
- package/lib/pendant/markdown.d.ts.map +1 -0
- package/lib/pendant/markdown.js +92 -0
- package/lib/pendant/markdown.js.map +1 -0
- package/lib/pendant/reader.d.ts.map +1 -1
- package/lib/pendant/reader.js +2 -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
package/lib/pendant/widget.js
CHANGED
|
@@ -6,6 +6,8 @@ import { usePendantPlacement } from './use-placement.js';
|
|
|
6
6
|
import { PendantReader } from './reader.js';
|
|
7
7
|
import { usePendantSettings } from './use-settings.js';
|
|
8
8
|
function messageLabel(notice) {
|
|
9
|
+
if (notice.kind === 'system')
|
|
10
|
+
return '需要升级迁移';
|
|
9
11
|
if (notice.kind === 'reply')
|
|
10
12
|
return '有新回复';
|
|
11
13
|
if (notice.kind === 'task' && notice.title.startsWith('遇到阻塞 · '))
|
|
@@ -77,7 +79,9 @@ function ActivePendant({ controller, settings }) {
|
|
|
77
79
|
const visit = async (item) => {
|
|
78
80
|
setNavigationError('');
|
|
79
81
|
try {
|
|
80
|
-
if (item.
|
|
82
|
+
if (item.kind === 'system' && item.action === 'storage-migration')
|
|
83
|
+
controller.open(undefined, { page: 'general' });
|
|
84
|
+
else if (item.routeId && item.sessionId)
|
|
81
85
|
await controller.openSession(item.routeId, item.sessionId);
|
|
82
86
|
else
|
|
83
87
|
controller.open(item.companionId, { page: item.kind === 'task' ? 'board' : item.kind === 'schedule' ? 'schedules' : 'home', ...(item.taskId ? { taskId: item.taskId } : {}) });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"widget.js","sourceRoot":"","sources":["../../src/pendant/widget.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"widget.js","sourceRoot":"","sources":["../../src/pendant/widget.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atomic.d.ts","sourceRoot":"","sources":["../../src/storage/atomic.ts"],"names":[],"mappings":"AAIA,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG/D;AACD,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAU5E"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { mkdir, open, rename, rm } from 'node:fs/promises';
|
|
2
|
+
import { dirname } from 'node:path';
|
|
3
|
+
import { randomUUID } from 'node:crypto';
|
|
4
|
+
export async function syncDirectory(path) {
|
|
5
|
+
if (process.platform === 'win32')
|
|
6
|
+
return;
|
|
7
|
+
const file = await open(path, 'r');
|
|
8
|
+
try {
|
|
9
|
+
await file.sync();
|
|
10
|
+
}
|
|
11
|
+
finally {
|
|
12
|
+
await file.close();
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export async function atomicJson(path, value) {
|
|
16
|
+
await mkdir(dirname(path), { recursive: true, mode: 0o700 });
|
|
17
|
+
const temp = `${path}.${randomUUID()}.tmp`;
|
|
18
|
+
try {
|
|
19
|
+
const file = await open(temp, 'wx', 0o600);
|
|
20
|
+
try {
|
|
21
|
+
await file.writeFile(JSON.stringify(value) + '\n');
|
|
22
|
+
await file.sync();
|
|
23
|
+
}
|
|
24
|
+
finally {
|
|
25
|
+
await file.close();
|
|
26
|
+
}
|
|
27
|
+
// Never unlink the previous committed file as a Windows fallback.
|
|
28
|
+
await rename(temp, path);
|
|
29
|
+
await syncDirectory(dirname(path));
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
await rm(temp, { force: true }).catch(() => { });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=atomic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atomic.js","sourceRoot":"","sources":["../../src/storage/atomic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY;IAC9C,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAM;IACxC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAAC,IAAI,CAAC;QAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;IAAC,CAAC;YAAS,CAAC;QAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAA;IAAC,CAAC;AAC9F,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY,EAAE,KAAc;IAC3D,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IAC5D,MAAM,IAAI,GAAG,GAAG,IAAI,IAAI,UAAU,EAAE,MAAM,CAAA;IAC1C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;QAC1C,IAAI,CAAC;YAAC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;QAAC,CAAC;gBAAS,CAAC;YAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAA;QAAC,CAAC;QAC5G,kEAAkE;QAClE,MAAM,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACxB,MAAM,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IACpC,CAAC;YAAS,CAAC;QAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface StorageConfig {
|
|
2
|
+
storageVersion: number;
|
|
3
|
+
transactionId: string;
|
|
4
|
+
workspaceRoot: string;
|
|
5
|
+
}
|
|
6
|
+
export declare const storageConfigPath: (statePath: string) => string;
|
|
7
|
+
export declare function readStorageConfig(statePath: string, root: string, configured?: number): Promise<StorageConfig>;
|
|
8
|
+
//# sourceMappingURL=bootstrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/storage/bootstrap.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAAG,cAAc,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE;AACvG,eAAO,MAAM,iBAAiB,GAAI,WAAU,MAAM,WAA4D,CAAA;AAC9G,wBAAsB,iBAAiB,CAAC,SAAS,EAAC,MAAM,EAAC,IAAI,EAAC,MAAM,EAAC,UAAU,SAAE,GAAE,OAAO,CAAC,aAAa,CAAC,CAkBxG"}
|
|
@@ -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"}
|