agl 21.0.2 → 22.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/changelog.md +19 -0
- package/dist_serve/bundle.js +520 -509
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.aglhome.d.ts +25 -0
- package/dist_ts/classes.aglhome.js +65 -0
- package/dist_ts/classes.authmodels.js +7 -12
- package/dist_ts/classes.authstore.d.ts +1 -2
- package/dist_ts/classes.authstore.js +2 -34
- package/dist_ts/classes.cli.js +93 -35
- package/dist_ts/classes.config.d.ts +2 -11
- package/dist_ts/classes.config.js +14 -80
- package/dist_ts/classes.controller.d.ts +4 -1
- package/dist_ts/classes.controller.js +109 -46
- package/dist_ts/classes.embeddeddb.js +6 -5
- package/dist_ts/classes.gitreversion.js +3 -2
- package/dist_ts/classes.upgradecoordinator.d.ts +6 -1
- package/dist_ts/classes.upgradecoordinator.js +588 -177
- package/dist_ts/classes.upgradetransaction.js +46 -12
- package/dist_ts/classes.uploadmanager.d.ts +12 -0
- package/dist_ts/classes.uploadmanager.js +204 -2
- package/dist_ts/constants.upgradeenvironment.d.ts +2 -0
- package/dist_ts/constants.upgradeenvironment.js +3 -0
- package/dist_ts/functions.controllerdataroot.d.ts +4 -5
- package/dist_ts/functions.controllerdataroot.js +4 -29
- package/dist_ts/functions.embeddeddb.d.ts +1 -1
- package/dist_ts/functions.embeddeddb.js +8 -3
- package/dist_ts/functions.runtimeenvironment.js +2 -1
- package/dist_ts/index.d.ts +1 -0
- package/dist_ts/index.js +2 -1
- package/dist_ts/interfaces.config.d.ts +5 -7
- package/dist_ts_migration/classes.documentmigrationrunner.js +5 -1
- package/dist_ts_migration/index.d.ts +4 -0
- package/dist_ts_migration/index.js +5 -1
- package/dist_ts_migration/v23_aglhome.d.ts +91 -0
- package/dist_ts_migration/v23_aglhome.js +1775 -0
- package/dist_ts_migration/v23_runtimeconfig.d.ts +11 -0
- package/dist_ts_migration/v23_runtimeconfig.js +87 -0
- package/dist_ts_migration/v24_legacyterminallayout.d.ts +18 -0
- package/dist_ts_migration/v24_legacyterminallayout.js +79 -0
- package/dist_ts_migration/v24_legacyterminallayoutmigration.d.ts +6 -0
- package/dist_ts_migration/v24_legacyterminallayoutmigration.js +67 -0
- package/dist_ts_migration/v2_controllerdataroot.d.ts +5 -0
- package/dist_ts_migration/v2_controllerdataroot.js +176 -15
- package/package.json +1 -1
- package/readme.md +116 -35
- package/readme.plan.md +24 -9
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.aglhome.ts +116 -0
- package/ts/classes.authmodels.ts +5 -13
- package/ts/classes.authstore.ts +1 -54
- package/ts/classes.cli.ts +92 -34
- package/ts/classes.config.ts +20 -117
- package/ts/classes.controller.ts +146 -52
- package/ts/classes.embeddeddb.ts +5 -4
- package/ts/classes.gitreversion.ts +3 -2
- package/ts/classes.upgradecoordinator.ts +668 -191
- package/ts/classes.upgradetransaction.ts +46 -11
- package/ts/classes.uploadmanager.ts +231 -1
- package/ts/constants.upgradeenvironment.ts +2 -0
- package/ts/functions.controllerdataroot.ts +11 -47
- package/ts/functions.embeddeddb.ts +13 -2
- package/ts/functions.runtimeenvironment.ts +1 -0
- package/ts/index.ts +1 -0
- package/ts/interfaces.config.ts +5 -7
- package/ts_migration/classes.documentmigrationrunner.ts +4 -0
- package/ts_migration/index.ts +4 -0
- package/ts_migration/v23_aglhome.ts +2101 -0
- package/ts_migration/v23_runtimeconfig.ts +112 -0
- package/ts_migration/v24_legacyterminallayout.ts +131 -0
- package/ts_migration/v24_legacyterminallayoutmigration.ts +88 -0
- package/ts_migration/v2_controllerdataroot.ts +174 -16
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/elements.harnesscontrollerapp.ts +32 -2
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as plugins from '../dist_ts/plugins.js';
|
|
2
|
+
import { type IControllerAuthDocument } from '../dist_ts/interfaces.auth.js';
|
|
3
|
+
export declare const migrateV23RuntimeConfigDocument: (valueArg: Record<string, unknown>) => {
|
|
4
|
+
document: IControllerAuthDocument;
|
|
5
|
+
migrated: boolean;
|
|
6
|
+
};
|
|
7
|
+
export declare class RuntimeConfigV23Migration {
|
|
8
|
+
private readonly database;
|
|
9
|
+
constructor(database: plugins.smartdata.SmartdataDb | undefined);
|
|
10
|
+
run(): Promise<void>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import * as plugins from '../dist_ts/plugins.js';
|
|
2
|
+
import { assertControllerAuthDocument, ControllerAuthModel, } from '../dist_ts/classes.authmodels.js';
|
|
3
|
+
import { AuthError } from '../dist_ts/interfaces.auth.js';
|
|
4
|
+
const migrationPageLimit = 128;
|
|
5
|
+
const assertRuntimeConfigDocument = assertControllerAuthDocument;
|
|
6
|
+
const persistedBodyFromRawDocument = (valueArg) => {
|
|
7
|
+
const body = { ...valueArg };
|
|
8
|
+
delete body._id;
|
|
9
|
+
delete body._smartdataRevision;
|
|
10
|
+
return body;
|
|
11
|
+
};
|
|
12
|
+
const isAbsoluteNormalizedPath = (valueArg) => (typeof valueArg === 'string'
|
|
13
|
+
&& valueArg.length > 0
|
|
14
|
+
&& plugins.path.isAbsolute(valueArg)
|
|
15
|
+
&& plugins.path.normalize(valueArg) === valueArg);
|
|
16
|
+
export const migrateV23RuntimeConfigDocument = (valueArg) => {
|
|
17
|
+
const config = valueArg.config;
|
|
18
|
+
if (!config || typeof config !== 'object' || Array.isArray(config)) {
|
|
19
|
+
throw new Error('Invalid legacy controller runtime configuration.');
|
|
20
|
+
}
|
|
21
|
+
const configRecord = config;
|
|
22
|
+
if (!Object.hasOwn(configRecord, 'workspaceDirectory')) {
|
|
23
|
+
assertRuntimeConfigDocument(valueArg);
|
|
24
|
+
return { document: valueArg, migrated: false };
|
|
25
|
+
}
|
|
26
|
+
if (!isAbsoluteNormalizedPath(configRecord.workspaceDirectory)) {
|
|
27
|
+
throw new Error('Legacy controller workspace is not an absolute normalized path.');
|
|
28
|
+
}
|
|
29
|
+
const projectsRoot = Object.hasOwn(configRecord, 'projectsRoot')
|
|
30
|
+
? configRecord.projectsRoot
|
|
31
|
+
: configRecord.workspaceDirectory;
|
|
32
|
+
if (!isAbsoluteNormalizedPath(projectsRoot)) {
|
|
33
|
+
throw new Error('Legacy controller projects root is not an absolute normalized path.');
|
|
34
|
+
}
|
|
35
|
+
const migratedConfig = { ...configRecord, projectsRoot };
|
|
36
|
+
delete migratedConfig.workspaceDirectory;
|
|
37
|
+
const migrated = { ...valueArg, config: migratedConfig };
|
|
38
|
+
assertRuntimeConfigDocument(migrated);
|
|
39
|
+
return { document: migrated, migrated: true };
|
|
40
|
+
};
|
|
41
|
+
export class RuntimeConfigV23Migration {
|
|
42
|
+
database;
|
|
43
|
+
constructor(database) {
|
|
44
|
+
this.database = database;
|
|
45
|
+
}
|
|
46
|
+
async run() {
|
|
47
|
+
if (!this.database) {
|
|
48
|
+
throw new AuthError('not_initialized', 'The authentication store database is unavailable.');
|
|
49
|
+
}
|
|
50
|
+
const collection = ControllerAuthModel.collection.mongoDbCollection;
|
|
51
|
+
let lastId;
|
|
52
|
+
while (true) {
|
|
53
|
+
const cursor = collection.find(lastId ? { _id: { $gt: lastId } } : {}).sort({ _id: 1 }).limit(migrationPageLimit);
|
|
54
|
+
let documents;
|
|
55
|
+
try {
|
|
56
|
+
documents = await cursor.toArray();
|
|
57
|
+
}
|
|
58
|
+
finally {
|
|
59
|
+
await cursor.close();
|
|
60
|
+
}
|
|
61
|
+
for (const raw of documents) {
|
|
62
|
+
const migration = migrateV23RuntimeConfigDocument(persistedBodyFromRawDocument(raw));
|
|
63
|
+
if (!migration.migrated)
|
|
64
|
+
continue;
|
|
65
|
+
const selector = raw._smartdataRevision === undefined
|
|
66
|
+
? { _id: raw._id, _smartdataRevision: { $exists: false } }
|
|
67
|
+
: { _id: raw._id, _smartdataRevision: raw._smartdataRevision };
|
|
68
|
+
const replaced = await collection.findOneAndReplace(selector, { _id: raw._id, ...migration.document, _smartdataRevision: plugins.crypto.randomUUID() }, { returnDocument: 'after', includeResultMetadata: false, upsert: false });
|
|
69
|
+
if (replaced)
|
|
70
|
+
continue;
|
|
71
|
+
const concurrent = await collection.findOne({ _id: raw._id });
|
|
72
|
+
if (!concurrent) {
|
|
73
|
+
throw new AuthError('concurrent_change', 'The runtime configuration migration changed concurrently.');
|
|
74
|
+
}
|
|
75
|
+
const reconciled = migrateV23RuntimeConfigDocument(persistedBodyFromRawDocument(concurrent));
|
|
76
|
+
if (reconciled.migrated) {
|
|
77
|
+
throw new AuthError('concurrent_change', 'The runtime configuration migration changed concurrently.');
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const last = documents.at(-1);
|
|
81
|
+
if (!last || documents.length < migrationPageLimit)
|
|
82
|
+
break;
|
|
83
|
+
lastId = last._id;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidjIzX3J1bnRpbWVjb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19taWdyYXRpb24vdjIzX3J1bnRpbWVjb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLG1CQUFtQixHQUNwQixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxTQUFTLEVBQWdDLE1BQU0sMEJBQTBCLENBQUM7QUFFbkYsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLENBQUM7QUFDL0IsTUFBTSwyQkFBMkIsR0FFa0IsNEJBQTRCLENBQUM7QUFFaEYsTUFBTSw0QkFBNEIsR0FBRyxDQUNuQyxRQUFpQyxFQUNSLEVBQUU7SUFDM0IsTUFBTSxJQUFJLEdBQUcsRUFBRSxHQUFHLFFBQVEsRUFBRSxDQUFDO0lBQzdCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNoQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUMvQixPQUFPLElBQUksQ0FBQztBQUNkLENBQUMsQ0FBQztBQUVGLE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxRQUFpQixFQUFzQixFQUFFLENBQUMsQ0FDMUUsT0FBTyxRQUFRLEtBQUssUUFBUTtPQUN6QixRQUFRLENBQUMsTUFBTSxHQUFHLENBQUM7T0FDbkIsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO09BQ2pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFFBQVEsQ0FDakQsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFHLENBQzdDLFFBQWlDLEVBQ3lCLEVBQUU7SUFDNUQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztJQUMvQixJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFB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
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface IV24LegacySessionGroup {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
sessionIds: unknown[];
|
|
5
|
+
}
|
|
6
|
+
export interface IV24LegacySessionGroupsDocument {
|
|
7
|
+
id: string;
|
|
8
|
+
controllerId: string;
|
|
9
|
+
projectId: string;
|
|
10
|
+
groups: IV24LegacySessionGroup[];
|
|
11
|
+
ungroupedSessionIds?: unknown[];
|
|
12
|
+
revision?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface IV24LayoutMigrationResult {
|
|
15
|
+
document: IV24LegacySessionGroupsDocument;
|
|
16
|
+
migrated: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare const migrateV24LegacyTerminalLayoutDocument: (valueArg: unknown) => IV24LayoutMigrationResult;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
const legacyOpenCodePtyIdPattern = /^pty_[0-9a-f]{12}[0-9A-Za-z]{14}$/;
|
|
2
|
+
const legacyControllerTerminalIdPattern = /^terminal_[A-Za-z0-9_-]{22}$/;
|
|
3
|
+
const isPlainObject = (valueArg) => {
|
|
4
|
+
if (typeof valueArg !== 'object' || valueArg === null || Array.isArray(valueArg))
|
|
5
|
+
return false;
|
|
6
|
+
const prototype = Object.getPrototypeOf(valueArg);
|
|
7
|
+
return prototype === Object.prototype || prototype === null;
|
|
8
|
+
};
|
|
9
|
+
const hasExactKeys = (valueArg, requiredArg, optionalArg = []) => {
|
|
10
|
+
const allowed = new Set([...requiredArg, ...optionalArg]);
|
|
11
|
+
return requiredArg.every((key) => Object.hasOwn(valueArg, key))
|
|
12
|
+
&& Object.keys(valueArg).every((key) => allowed.has(key));
|
|
13
|
+
};
|
|
14
|
+
const isCanonicalControllerTerminalId = (valueArg) => {
|
|
15
|
+
if (!legacyControllerTerminalIdPattern.test(valueArg))
|
|
16
|
+
return false;
|
|
17
|
+
const suffix = valueArg.slice('terminal_'.length);
|
|
18
|
+
const decoded = Buffer.from(suffix, 'base64url');
|
|
19
|
+
return decoded.length === 16 && decoded.toString('base64url') === suffix;
|
|
20
|
+
};
|
|
21
|
+
const isLegacyTerminalNativeId = (valueArg) => (typeof valueArg === 'string'
|
|
22
|
+
&& (legacyOpenCodePtyIdPattern.test(valueArg)
|
|
23
|
+
|| isCanonicalControllerTerminalId(valueArg)));
|
|
24
|
+
const isLegacyTerminalLayoutReference = (valueArg) => {
|
|
25
|
+
if (typeof valueArg === 'string')
|
|
26
|
+
return isLegacyTerminalNativeId(valueArg);
|
|
27
|
+
if (!isPlainObject(valueArg)
|
|
28
|
+
|| Object.keys(valueArg).length !== 2
|
|
29
|
+
|| !Object.hasOwn(valueArg, 'harnessId')
|
|
30
|
+
|| !Object.hasOwn(valueArg, 'nativeId')
|
|
31
|
+
|| typeof valueArg.nativeId !== 'string')
|
|
32
|
+
return false;
|
|
33
|
+
if (valueArg.harnessId === 'controller')
|
|
34
|
+
return true;
|
|
35
|
+
return valueArg.harnessId === 'opencode' && isLegacyTerminalNativeId(valueArg.nativeId);
|
|
36
|
+
};
|
|
37
|
+
export const migrateV24LegacyTerminalLayoutDocument = (valueArg) => {
|
|
38
|
+
if (!isPlainObject(valueArg)
|
|
39
|
+
|| !hasExactKeys(valueArg, ['id', 'controllerId', 'projectId', 'groups'], ['ungroupedSessionIds', 'revision'])
|
|
40
|
+
|| !Array.isArray(valueArg.groups)) {
|
|
41
|
+
throw new Error('Invalid legacy terminal layout migration document.');
|
|
42
|
+
}
|
|
43
|
+
const sourceGroups = valueArg.groups;
|
|
44
|
+
const groups = sourceGroups.map((groupArg) => {
|
|
45
|
+
if (!isPlainObject(groupArg)
|
|
46
|
+
|| !hasExactKeys(groupArg, ['id', 'name', 'sessionIds'])
|
|
47
|
+
|| !Array.isArray(groupArg.sessionIds)) {
|
|
48
|
+
throw new Error('Invalid legacy terminal layout group.');
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
...groupArg,
|
|
52
|
+
sessionIds: groupArg.sessionIds.filter((sessionId) => (!isLegacyTerminalLayoutReference(sessionId))),
|
|
53
|
+
};
|
|
54
|
+
});
|
|
55
|
+
const hasUngroupedSessionIds = Object.hasOwn(valueArg, 'ungroupedSessionIds');
|
|
56
|
+
if (hasUngroupedSessionIds && !Array.isArray(valueArg.ungroupedSessionIds)) {
|
|
57
|
+
throw new Error('Invalid legacy terminal ungrouped layout list.');
|
|
58
|
+
}
|
|
59
|
+
const ungroupedSessionIds = hasUngroupedSessionIds
|
|
60
|
+
? valueArg.ungroupedSessionIds.filter((sessionId) => (!isLegacyTerminalLayoutReference(sessionId)))
|
|
61
|
+
: undefined;
|
|
62
|
+
const migrated = groups.some((group, index) => (group.sessionIds.length !== sourceGroups[index].sessionIds.length)) || (hasUngroupedSessionIds
|
|
63
|
+
&& ungroupedSessionIds.length !== valueArg.ungroupedSessionIds.length);
|
|
64
|
+
if (!migrated) {
|
|
65
|
+
return {
|
|
66
|
+
document: valueArg,
|
|
67
|
+
migrated: false,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
document: {
|
|
72
|
+
...valueArg,
|
|
73
|
+
groups,
|
|
74
|
+
...(hasUngroupedSessionIds ? { ungroupedSessionIds } : {}),
|
|
75
|
+
},
|
|
76
|
+
migrated: true,
|
|
77
|
+
};
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidjI0X2xlZ2FjeXRlcm1pbmFsbGF5b3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfbWlncmF0aW9uL3YyNF9sZWdhY3l0ZXJtaW5hbGxheW91dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLDBCQUEwQixHQUFHLG1DQUFtQyxDQUFDO0FBQ3ZFLE1BQU0saUNBQWlDLEdBQUcsOEJBQThCLENBQUM7QUFzQnpFLE1BQU0sYUFBYSxHQUFHLENBQUMsUUFBaUIsRUFBdUIsRUFBRTtJQUMvRCxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxRQUFRLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDL0YsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsRCxPQUFPLFNBQVMsS0FBSyxNQUFNLENBQUMsU0FBUyxJQUFJLFNBQVMsS0FBSyxJQUFJLENBQUM7QUFDOUQsQ0FBQyxDQUFDO0FBRUYsTUFBTSxZQUFZLEdBQUcsQ0FDbkIsUUFBaUIsRUFDakIsV0FBOEIsRUFDOUIsY0FBaUMsRUFBRSxFQUMxQixFQUFFO0lBQ1gsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLFdBQVcsRUFBRSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDMUQsT0FBTyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztXQUMxRCxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzlELENBQUMsQ0FBQztBQUVGLE1BQU0sK0JB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
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import * as plugins from '../dist_ts/plugins.js';
|
|
2
|
+
import { assertControllerSessionGroupsDocument, ControllerSessionGroupsModel, } from '../dist_ts/classes.authmodels.js';
|
|
3
|
+
import { AuthError } from '../dist_ts/interfaces.auth.js';
|
|
4
|
+
import { migrateProtocolV6SessionGroupsDocument } from './v6_protocoldocuments.js';
|
|
5
|
+
import { migrateV24LegacyTerminalLayoutDocument } from './v24_legacyterminallayout.js';
|
|
6
|
+
const migrationPageLimit = 128;
|
|
7
|
+
const persistedBodyFromRawDocument = (valueArg) => {
|
|
8
|
+
const body = { ...valueArg };
|
|
9
|
+
delete body._id;
|
|
10
|
+
delete body._smartdataRevision;
|
|
11
|
+
return body;
|
|
12
|
+
};
|
|
13
|
+
const assertProtocolV6NormalizableLayout = (valueArg) => {
|
|
14
|
+
const normalized = migrateProtocolV6SessionGroupsDocument(valueArg);
|
|
15
|
+
assertControllerSessionGroupsDocument(normalized.document);
|
|
16
|
+
};
|
|
17
|
+
export class LegacyTerminalLayoutV24Migration {
|
|
18
|
+
database;
|
|
19
|
+
constructor(database) {
|
|
20
|
+
this.database = database;
|
|
21
|
+
}
|
|
22
|
+
async run() {
|
|
23
|
+
if (!this.database) {
|
|
24
|
+
throw new AuthError('not_initialized', 'The authentication store database is unavailable.');
|
|
25
|
+
}
|
|
26
|
+
const collection = ControllerSessionGroupsModel.collection.mongoDbCollection;
|
|
27
|
+
let lastId;
|
|
28
|
+
while (true) {
|
|
29
|
+
const cursor = collection.find(lastId ? { _id: { $gt: lastId } } : {})
|
|
30
|
+
.sort({ _id: 1 })
|
|
31
|
+
.limit(migrationPageLimit);
|
|
32
|
+
let documents;
|
|
33
|
+
try {
|
|
34
|
+
documents = await cursor.toArray();
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
await cursor.close();
|
|
38
|
+
}
|
|
39
|
+
for (const raw of documents) {
|
|
40
|
+
const migration = migrateV24LegacyTerminalLayoutDocument(persistedBodyFromRawDocument(raw));
|
|
41
|
+
if (!migration.migrated)
|
|
42
|
+
continue;
|
|
43
|
+
assertProtocolV6NormalizableLayout(migration.document);
|
|
44
|
+
const selector = raw._smartdataRevision === undefined
|
|
45
|
+
? { _id: raw._id, _smartdataRevision: { $exists: false } }
|
|
46
|
+
: { _id: raw._id, _smartdataRevision: raw._smartdataRevision };
|
|
47
|
+
const replaced = await collection.findOneAndReplace(selector, { _id: raw._id, ...migration.document, _smartdataRevision: plugins.crypto.randomUUID() }, { returnDocument: 'after', includeResultMetadata: false, upsert: false });
|
|
48
|
+
if (!replaced) {
|
|
49
|
+
const concurrent = await collection.findOne({ _id: raw._id });
|
|
50
|
+
if (!concurrent) {
|
|
51
|
+
throw new AuthError('concurrent_change', 'The legacy terminal layout migration changed concurrently.');
|
|
52
|
+
}
|
|
53
|
+
const remaining = migrateV24LegacyTerminalLayoutDocument(persistedBodyFromRawDocument(concurrent));
|
|
54
|
+
assertProtocolV6NormalizableLayout(remaining.document);
|
|
55
|
+
if (remaining.migrated) {
|
|
56
|
+
throw new AuthError('concurrent_change', 'The legacy terminal layout migration changed concurrently.');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const last = documents.at(-1);
|
|
61
|
+
if (!last || documents.length < migrationPageLimit)
|
|
62
|
+
break;
|
|
63
|
+
lastId = last._id;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidjI0X2xlZ2FjeXRlcm1pbmFsbGF5b3V0bWlncmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfbWlncmF0aW9uL3YyNF9sZWdhY3l0ZXJtaW5hbGxheW91dG1pZ3JhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFDTCxxQ0FBcUMsRUFDckMsNEJBQTRCLEdBQzdCLE1BQU0sNkJBQTZCLENBQUM7QUFDckMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXJELE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ25GLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBR3ZGLE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxDQUFDO0FBRS9CLE1BQU0sNEJBQTRCLEdBQUcsQ0FDbkMsUUFBaUMsRUFDQSxFQUFFO0lBQ25DLE1BQU0sSUFBSSxHQUFHLEVBQUUsR0FBRyxRQUFRLEVBQUUsQ0FBQztJQUM3QixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDaEIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDL0IsT0FBTyxJQUFrRCxDQUFDO0FBQzVELENBQUMsQ0FBQztBQUVGLE1BQU0sa0NBQWtDLEdBQUcsQ0FDekMsUUFBeUMsRUFDbkMsRUFBRTtJQUNSLE1BQU0sVUFBVSxHQUFHLHNDQUFzQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BFLHFDQUFxQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUM3RCxDQUFDLENBQUM7QUFFRixNQUFNLE9BQU8sZ0NBQWdDO0lBQ2Q7SUFBN0IsWUFBNkIsUUFBbUQ7UUFBbkQsYUFBUSxHQUFSLFFBQVEsQ0FBMkM7SUFBRyxDQUFDO0lBRTdFLEtBQUssQ0FBQyxHQUFHO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixNQUFNLElBQUksU0FBUyxDQUFDLGlCQUFpQixFQUFFLG1EQUFtRCxDQUFDLENBQUM7UUFDOUYsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLDRCQUE0QixDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQztRQUM3RSxJQUFJLE1BQThGLENBQUM7UUFDbkcsT0FBTyxJQUFJLEVBQUUsQ0FBQztZQUNaLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7aUJBQ25FLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztpQkFDaEIsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDN0IsSUFBSSxTQUFxRCxDQUFDO1lBQzFELElBQUksQ0FBQztnQkFDSCxTQUFTLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDckMsQ0FBQztvQkFBUyxDQUFDO2dCQUNULE1BQU0sTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3ZCLENBQUM7WUFDRCxLQUFLLE1BQU0sR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUM1QixNQUFNLFNBQVMsR0FBRyxzQ0FBc0MsQ0FDdEQsNEJBQTRCLENBQUMsR0FBRyxDQUFDLENBQ2xDLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRO29CQUFFLFNBQVM7Z0JBQ2xDLGtDQUFrQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDdkQsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLGtCQUFrQixLQUFLLFNBQVM7b0JBQ25ELENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLGtCQUFrQixFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFO29CQUMxRCxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxrQkFBa0IsRUFBRSxHQUFHLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDakUsTUFBTSxRQUFRLEdBQUcsTUFBTSxVQUFVLENBQUMsaUJBQWlCLENBQ2pELFFBQVEsRUFDUixFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDLFFBQVEsRUFBRSxrQkFBa0IsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQ3hGLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUN6RSxDQUFDO2dCQUNGLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDZCxNQUFNLFVBQVUsR0FBRyxNQUFNLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7b0JBQzlELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQzt3QkFDaEIsTUFBTSxJQUFJLFNBQVMsQ0FDakIsbUJBQW1CLEVBQ25CLDREQUE0RCxDQUM3RCxDQUFDO29CQUNKLENBQUM7b0JBQ0QsTUFBTSxTQUFTLEdBQUcsc0NBQXNDLENBQ3RELDRCQUE0QixDQUFDLFVBQVUsQ0FBQyxDQUN6QyxDQUFDO29CQUNGLGtDQUFrQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDdkQsSUFBSSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQ3ZCLE1BQU0sSUFBSSxTQUFTLENBQ2pCLG1CQUFtQixFQUNuQiw0REFBNEQsQ0FDN0QsQ0FBQztvQkFDSixDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBQ0QsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxrQkFBa0I7Z0JBQUUsTUFBTTtZQUMxRCxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQztDQUNGIn0=
|
|
@@ -58,6 +58,7 @@ export interface IControllerDataRootMigrationOptions {
|
|
|
58
58
|
newEmbeddedSocketPath: string;
|
|
59
59
|
invokerPid: number;
|
|
60
60
|
listDataWriterProcesses: () => Promise<readonly IControllerDataWriterProcessRecord[]>;
|
|
61
|
+
preserveEmbeddedDataDirectory?: boolean;
|
|
61
62
|
isSocketListening?: (socketPathArg: string) => Promise<boolean>;
|
|
62
63
|
relocateCredentialStore?: (intentArg: Readonly<IControllerCredentialRelocationIntent>, signalArg?: AbortSignal) => Promise<void>;
|
|
63
64
|
relocateStoppedDatabaseRoot?: (inputArg: Readonly<plugins.smartdb.ILocalSmartDbStoppedStorageRootRelocationInput>, signalArg?: AbortSignal) => Promise<plugins.smartdb.ILocalSmartDbStoppedStorageRootRelocationReceipt>;
|
|
@@ -85,6 +86,8 @@ export declare class ControllerDataRootMigrationRunner {
|
|
|
85
86
|
private readonly relocateStoppedDatabaseRoot;
|
|
86
87
|
constructor(options: IControllerDataRootMigrationOptions);
|
|
87
88
|
prepareStartup(): Promise<IControllerDataRootStartupPreparation>;
|
|
89
|
+
/** Validates all authoritative v2 state without creating roots, locks, or journals. */
|
|
90
|
+
preflight(): Promise<void>;
|
|
88
91
|
run(): Promise<IControllerDataRootMigrationResult>;
|
|
89
92
|
private normalizeDatabaseConfiguration;
|
|
90
93
|
private validateCommonParent;
|
|
@@ -99,6 +102,8 @@ export declare class ControllerDataRootMigrationRunner {
|
|
|
99
102
|
private assertTargetMarker;
|
|
100
103
|
private runLocked;
|
|
101
104
|
private result;
|
|
105
|
+
private preservedTargetDatabasePath;
|
|
106
|
+
private targetContainsOnlyPreservedDatabase;
|
|
102
107
|
private assertNoConflictingWriters;
|
|
103
108
|
private createInitialJournal;
|
|
104
109
|
private readBoundedDirectory;
|