agl 21.0.2 → 22.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.
Files changed (65) hide show
  1. package/changelog.md +9 -0
  2. package/dist_serve/bundle.js +1 -1
  3. package/dist_ts/00_commitinfo_data.js +1 -1
  4. package/dist_ts/classes.aglhome.d.ts +25 -0
  5. package/dist_ts/classes.aglhome.js +65 -0
  6. package/dist_ts/classes.authmodels.js +7 -12
  7. package/dist_ts/classes.authstore.js +2 -29
  8. package/dist_ts/classes.cli.js +93 -35
  9. package/dist_ts/classes.config.d.ts +2 -11
  10. package/dist_ts/classes.config.js +14 -80
  11. package/dist_ts/classes.controller.d.ts +4 -1
  12. package/dist_ts/classes.controller.js +64 -26
  13. package/dist_ts/classes.embeddeddb.js +6 -5
  14. package/dist_ts/classes.gitreversion.js +3 -2
  15. package/dist_ts/classes.upgradecoordinator.d.ts +6 -1
  16. package/dist_ts/classes.upgradecoordinator.js +588 -177
  17. package/dist_ts/classes.upgradetransaction.js +46 -12
  18. package/dist_ts/classes.uploadmanager.d.ts +12 -0
  19. package/dist_ts/classes.uploadmanager.js +204 -2
  20. package/dist_ts/constants.upgradeenvironment.d.ts +2 -0
  21. package/dist_ts/constants.upgradeenvironment.js +3 -0
  22. package/dist_ts/functions.controllerdataroot.d.ts +4 -5
  23. package/dist_ts/functions.controllerdataroot.js +4 -29
  24. package/dist_ts/functions.embeddeddb.d.ts +1 -1
  25. package/dist_ts/functions.embeddeddb.js +8 -3
  26. package/dist_ts/functions.runtimeenvironment.js +2 -1
  27. package/dist_ts/index.d.ts +1 -0
  28. package/dist_ts/index.js +2 -1
  29. package/dist_ts/interfaces.config.d.ts +5 -7
  30. package/dist_ts_migration/classes.documentmigrationrunner.js +3 -1
  31. package/dist_ts_migration/index.d.ts +2 -0
  32. package/dist_ts_migration/index.js +3 -1
  33. package/dist_ts_migration/v23_aglhome.d.ts +91 -0
  34. package/dist_ts_migration/v23_aglhome.js +1775 -0
  35. package/dist_ts_migration/v23_runtimeconfig.d.ts +11 -0
  36. package/dist_ts_migration/v23_runtimeconfig.js +87 -0
  37. package/dist_ts_migration/v2_controllerdataroot.d.ts +5 -0
  38. package/dist_ts_migration/v2_controllerdataroot.js +176 -15
  39. package/package.json +1 -1
  40. package/readme.md +116 -35
  41. package/readme.plan.md +24 -9
  42. package/ts/00_commitinfo_data.ts +1 -1
  43. package/ts/classes.aglhome.ts +116 -0
  44. package/ts/classes.authmodels.ts +5 -13
  45. package/ts/classes.authstore.ts +1 -39
  46. package/ts/classes.cli.ts +92 -34
  47. package/ts/classes.config.ts +20 -117
  48. package/ts/classes.controller.ts +92 -26
  49. package/ts/classes.embeddeddb.ts +5 -4
  50. package/ts/classes.gitreversion.ts +3 -2
  51. package/ts/classes.upgradecoordinator.ts +668 -191
  52. package/ts/classes.upgradetransaction.ts +46 -11
  53. package/ts/classes.uploadmanager.ts +231 -1
  54. package/ts/constants.upgradeenvironment.ts +2 -0
  55. package/ts/functions.controllerdataroot.ts +11 -47
  56. package/ts/functions.embeddeddb.ts +13 -2
  57. package/ts/functions.runtimeenvironment.ts +1 -0
  58. package/ts/index.ts +1 -0
  59. package/ts/interfaces.config.ts +5 -7
  60. package/ts_migration/classes.documentmigrationrunner.ts +2 -0
  61. package/ts_migration/index.ts +2 -0
  62. package/ts_migration/v23_aglhome.ts +2101 -0
  63. package/ts_migration/v23_runtimeconfig.ts +112 -0
  64. package/ts_migration/v2_controllerdataroot.ts +174 -16
  65. package/ts_web/00_commitinfo_data.ts +1 -1
@@ -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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
@@ -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;