@camstack/system 1.2.444 → 1.2.446
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/addon-runner.js +40 -31
- package/dist/addon-runner.mjs +41 -32
- package/dist/{agent-https-DlpTMDqA.js → agent-https-5DYAOJMO.js} +810 -12
- package/dist/{agent-https-U0d4uvn2.mjs → agent-https-BWUEf6ev.mjs} +697 -13
- package/dist/auth/admin-token-manager.d.ts +9 -3
- package/dist/auth/api-key-manager.d.ts +9 -3
- package/dist/auth/auth-audit-log.d.ts +9 -3
- package/dist/auth/device-credential-manager.d.ts +5 -1
- package/dist/auth/external-identity-manager.d.ts +8 -21
- package/dist/auth/login-session-manager.d.ts +11 -3
- package/dist/auth/scoped-token-manager.d.ts +8 -52
- package/dist/auth/totp-manager.d.ts +11 -3
- package/dist/auth/user-manager.d.ts +10 -17
- package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +1 -1
- package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +1 -1
- package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
- package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +1 -1
- package/dist/builtins/alerts/alert-store.d.ts +32 -0
- package/dist/builtins/alerts/alerts.addon.d.ts +9 -2
- package/dist/builtins/alerts/alerts.addon.js +373 -154
- package/dist/builtins/alerts/alerts.addon.mjs +372 -154
- package/dist/builtins/alerts/critical-push.d.ts +4 -0
- package/dist/builtins/alerts/emit-alert-policy.d.ts +28 -0
- package/dist/builtins/alerts/record-kinds.d.ts +15 -0
- package/dist/builtins/autotrack/index.js +1 -1
- package/dist/builtins/autotrack/index.mjs +1 -1
- package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.d.ts +1 -0
- package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +134 -193
- package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +134 -193
- package/dist/builtins/backup-orchestrator/destination-policy.d.ts +4 -2
- package/dist/builtins/backup-orchestrator/encryption-key-store.d.ts +4 -2
- package/dist/builtins/backup-orchestrator/record-kinds.d.ts +58 -0
- package/dist/builtins/backup-orchestrator/schedule-store.d.ts +4 -2
- package/dist/builtins/backup-orchestrator/seed-marker-store.d.ts +4 -2
- package/dist/builtins/calendars/calendar-prefs-store.d.ts +13 -5
- package/dist/builtins/calendars/calendars.addon.d.ts +2 -2
- package/dist/builtins/calendars/calendars.addon.js +67 -64
- package/dist/builtins/calendars/calendars.addon.mjs +59 -64
- package/dist/builtins/calendars/record-kinds.d.ts +18 -0
- package/dist/builtins/camera-grid/index.js +1 -1
- package/dist/builtins/camera-grid/index.mjs +1 -1
- package/dist/builtins/cluster-agent/record-kinds.d.ts +36 -0
- package/dist/builtins/composer/composer.addon.js +2 -2
- package/dist/builtins/composer/composer.addon.mjs +2 -2
- package/dist/builtins/console-logging/index.js +1 -1
- package/dist/builtins/console-logging/index.mjs +1 -1
- package/dist/builtins/core-blocks/block-settings-store.d.ts +8 -4
- package/dist/builtins/core-blocks/core-block-store.d.ts +8 -16
- package/dist/builtins/core-blocks/core-blocks.addon.js +85 -112
- package/dist/builtins/core-blocks/core-blocks.addon.mjs +86 -113
- package/dist/builtins/core-blocks/index.mjs +1 -1
- package/dist/builtins/core-blocks/record-kinds.d.ts +26 -0
- package/dist/builtins/device-manager/device-manager.addon.js +111 -187
- package/dist/builtins/device-manager/device-manager.addon.mjs +110 -187
- package/dist/builtins/device-manager/device-tombstone-store.d.ts +9 -48
- package/dist/builtins/device-manager/record-kinds.d.ts +14 -0
- package/dist/builtins/hub-forwarder/index.js +1 -1
- package/dist/builtins/hub-forwarder/index.mjs +1 -1
- package/dist/builtins/keychain/index.js +152 -22
- package/dist/builtins/keychain/index.mjs +152 -22
- package/dist/builtins/keychain/keychain-service.d.ts +3 -2
- package/dist/builtins/keychain/keychain-store.d.ts +13 -2
- package/dist/builtins/keychain/record-kinds.d.ts +16 -0
- package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
- package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
- package/dist/builtins/local-auth/auth-schema.d.ts +3 -1
- package/dist/builtins/local-auth/local-auth.addon.js +2903 -2123
- package/dist/builtins/local-auth/local-auth.addon.mjs +2904 -2124
- package/dist/builtins/local-auth/oauth-session-manager.d.ts +8 -48
- package/dist/builtins/local-auth/record-kinds.d.ts +141 -0
- package/dist/builtins/local-network/local-network.addon.js +2 -2
- package/dist/builtins/local-network/local-network.addon.mjs +2 -2
- package/dist/builtins/loki-logging/index.js +1 -1
- package/dist/builtins/loki-logging/index.mjs +1 -1
- package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
- package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
- package/dist/builtins/platform-probe/index.js +1 -1
- package/dist/builtins/platform-probe/index.mjs +1 -1
- package/dist/builtins/record-entries/index.js +1 -1
- package/dist/builtins/record-entries/index.mjs +1 -1
- package/dist/builtins/records/legacy-table-row-count.d.ts +5 -0
- package/dist/builtins/records/phase6-declare-gate.d.ts +28 -0
- package/dist/builtins/records-isolated.d.ts +10 -0
- package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
- package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
- package/dist/builtins/snapshot/index.js +1 -1
- package/dist/builtins/snapshot/index.mjs +1 -1
- package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
- package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
- package/dist/builtins/sqlite-storage/index.js +1 -1
- package/dist/builtins/sqlite-storage/index.mjs +1 -1
- package/dist/builtins/sqlite-storage/integration-record-kinds.d.ts +30 -0
- package/dist/builtins/sqlite-storage/integration-registry.d.ts +10 -16
- package/dist/builtins/sqlite-storage/records/count-settings-array-legacy.d.ts +5 -0
- package/dist/builtins/sqlite-storage/records/count-settings-brokers-legacy.d.ts +6 -0
- package/dist/builtins/sqlite-storage/records/records-engine-types.d.ts +5 -0
- package/dist/builtins/sqlite-storage/records/records-engine.d.ts +4 -0
- package/dist/builtins/sqlite-storage/records/records-provider.d.ts +5 -1
- package/dist/builtins/sqlite-storage/sqlite-settings-backend.d.ts +17 -0
- package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +111 -3
- package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +111 -3
- package/dist/builtins/sqlite-storage/storage-admin-provider.d.ts +9 -1
- package/dist/builtins/storage-orchestrator/drain-state-store.d.ts +5 -2
- package/dist/builtins/storage-orchestrator/location-store.d.ts +7 -2
- package/dist/builtins/storage-orchestrator/record-kinds.d.ts +38 -0
- package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.d.ts +2 -0
- package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +196 -5
- package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +195 -6
- package/dist/builtins/system-config/record-kinds.d.ts +32 -0
- package/dist/builtins/system-config/system-config.addon.js +53 -618
- package/dist/builtins/system-config/system-config.addon.mjs +29 -577
- package/dist/builtins/winston-logging/index.js +1 -1
- package/dist/builtins/winston-logging/index.mjs +1 -1
- package/dist/{composition-sources-C3rKncIF.mjs → composition-sources-BmC5jAUv.mjs} +1 -1
- package/dist/{composition-sources-NAPZddic.js → composition-sources-BwIIltnZ.js} +1 -1
- package/dist/{constants-BKX2QnIg.mjs → constants-6XHGmEUF.mjs} +1 -1
- package/dist/{constants-BXiNEIeV.js → constants-DA_tjzIk.js} +1 -1
- package/dist/{device-ca-jxjSL8Ov.mjs → device-ca-Bh_ClxMO.mjs} +1 -1
- package/dist/{device-ca-DT9X2S6d.js → device-ca-CnbrgfmW.js} +1 -1
- package/dist/{dist-D1vECb_6.js → dist-BkNfEJKa.js} +521 -64
- package/dist/{dist-DERK-gP5.mjs → dist-CkZIrsAP.mjs} +462 -65
- package/dist/file-host-worker.js +1 -1
- package/dist/file-host-worker.mjs +1 -1
- package/dist/{hub-mdns-ciao-CRaC97V0.mjs → hub-mdns-ciao-CoyIUWHC.mjs} +2 -2
- package/dist/{hub-mdns-ciao-Cah9GCIg.js → hub-mdns-ciao-m5LIr4oA.js} +2 -2
- package/dist/index.d.ts +7 -0
- package/dist/index.js +3095 -2821
- package/dist/index.mjs +3067 -2810
- package/dist/kernel/index.d.ts +2 -0
- package/dist/kernel/moleculer/event-bus.d.ts +3 -1
- package/dist/kernel/moleculer/mesh-mtls/mesh-certificate-registry.d.ts +5 -1
- package/dist/kernel/moleculer/remote-logger.d.ts +2 -2
- package/dist/kernel/transport/cap-route-resolver.d.ts +9 -38
- package/dist/phase6-declare-gate-BDWZuB2n.mjs +93 -0
- package/dist/phase6-declare-gate-Bl7KocEs.js +98 -0
- package/dist/read-all-rows-CVoO1ONM.js +29 -0
- package/dist/read-all-rows-TaPqdWNF.mjs +25 -0
- package/dist/records/read-all-rows.d.ts +6 -0
- package/dist/{restore-archive-Dy-qKTdF.js → restore-archive-B57xI5Ue.js} +353 -5
- package/dist/{restore-archive-daKyE24F.mjs → restore-archive-CMr4V7Fi.mjs} +339 -9
- package/dist/tls/agent-https-names.d.ts +9 -13
- package/dist/{wal-maintenance-zRc24mOC.mjs → wal-maintenance-Bqm4zrNA.mjs} +0 -0
- package/dist/{wal-maintenance-dAv4IdzC.js → wal-maintenance-CuG1DUca.js} +0 -0
- package/package.json +1 -1
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Alert } from "@camstack/types";
|
|
2
|
+
import { type PushState } from "./critical-push.js";
|
|
3
|
+
export declare function episodeKeyFromMetadata(metadata: Record<string, unknown> | undefined): string | undefined;
|
|
4
|
+
export interface EmitMergeInput {
|
|
5
|
+
readonly existing: {
|
|
6
|
+
readonly read?: boolean;
|
|
7
|
+
readonly episodeKey?: string;
|
|
8
|
+
readonly status?: string;
|
|
9
|
+
} | null;
|
|
10
|
+
readonly incoming: Alert;
|
|
11
|
+
}
|
|
12
|
+
export interface EmitMergeResult {
|
|
13
|
+
readonly alert: Alert;
|
|
14
|
+
readonly queuePush: boolean;
|
|
15
|
+
}
|
|
16
|
+
/** Completed episodes start fresh — prior push must not suppress the next digest. */
|
|
17
|
+
export declare function shouldDropPriorPush(existingStatus: string | undefined): boolean;
|
|
18
|
+
export declare function alertWithRetainedPush(toStore: Alert, existingPush: PushState | undefined, existingStatus: string | undefined): Alert;
|
|
19
|
+
/**
|
|
20
|
+
* Re-emit of the same alert id: preserve read when the episode is unchanged
|
|
21
|
+
* and still active. A completed episode starts again. Queue a critical push
|
|
22
|
+
* only for active, unread critical findings.
|
|
23
|
+
*/
|
|
24
|
+
export declare function mergeEmitAlert(input: EmitMergeInput): EmitMergeResult;
|
|
25
|
+
export declare function criticalPushPayload(alert: Alert): {
|
|
26
|
+
readonly key: string;
|
|
27
|
+
readonly line: string;
|
|
28
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Record kinds owned by alert-center (records plan phase 4).
|
|
3
|
+
*/
|
|
4
|
+
import { type Alert, type DefinedRecordKind } from "@camstack/types";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
/** Legacy collection / adoptsFrom target (canonical KV before phase 4). */
|
|
7
|
+
export declare const ALERTS_COLLECTION = "alerts";
|
|
8
|
+
export type AlertBody = Omit<Alert, "id">;
|
|
9
|
+
export declare const AlertBodySchema: z.ZodType<AlertBody>;
|
|
10
|
+
export type AlertCenterRecordKindsMap = {
|
|
11
|
+
readonly alerts: DefinedRecordKind<z.ZodType<AlertBody>>;
|
|
12
|
+
};
|
|
13
|
+
export declare const alertCenterRecordKinds: AlertCenterRecordKindsMap;
|
|
14
|
+
/** Narrow kind for `records.kind()` — `IsolatedRecordKinds` string index is `| undefined`. */
|
|
15
|
+
export declare const alertsRecordKind: DefinedRecordKind<z.ZodType<AlertBody>>;
|
|
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
|
|
|
3
3
|
[Symbol.toStringTag]: { value: "Module" }
|
|
4
4
|
});
|
|
5
5
|
require("../../chunk-Cek0wNdY.js");
|
|
6
|
-
const require_dist = require("../../dist-
|
|
6
|
+
const require_dist = require("../../dist-BkNfEJKa.js");
|
|
7
7
|
//#region src/builtins/autotrack/autotrack-config.ts
|
|
8
8
|
var DEFAULT_AUTOTRACK_LOOP_CONFIG = {
|
|
9
9
|
deadZoneFraction: .5,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Lr as errMsg, P as FIRST_LEVEL_MACRO_CLASSES, Pi as isEvent, Rr as BaseAddon, ht as bareAddonId, la as EventCategory, zn as ptzAutotrackCapability } from "../../dist-CkZIrsAP.mjs";
|
|
2
2
|
//#region src/builtins/autotrack/autotrack-config.ts
|
|
3
3
|
var DEFAULT_AUTOTRACK_LOOP_CONFIG = {
|
|
4
4
|
deadZoneFraction: .5,
|
|
@@ -2,6 +2,7 @@ import type { ProviderRegistration } from "@camstack/types";
|
|
|
2
2
|
import { BaseAddon } from "@camstack/types";
|
|
3
3
|
export declare class BackupOrchestratorAddon extends BaseAddon<Record<string, never>> {
|
|
4
4
|
private systemBackup;
|
|
5
|
+
private backupRecords;
|
|
5
6
|
private policies;
|
|
6
7
|
private schedules;
|
|
7
8
|
/** Backup encryption keys — PUBLIC keys only (see encryption-key-store.ts). */
|
|
@@ -3,8 +3,9 @@ Object.defineProperties(exports, {
|
|
|
3
3
|
[Symbol.toStringTag]: { value: "Module" }
|
|
4
4
|
});
|
|
5
5
|
const require_chunk = require("../../chunk-Cek0wNdY.js");
|
|
6
|
-
const require_dist = require("../../dist-
|
|
7
|
-
const
|
|
6
|
+
const require_dist = require("../../dist-BkNfEJKa.js");
|
|
7
|
+
const require_read_all_rows$1 = require("../../read-all-rows-CVoO1ONM.js");
|
|
8
|
+
const require_restore_archive = require("../../restore-archive-B57xI5Ue.js");
|
|
8
9
|
let node_crypto = require("node:crypto");
|
|
9
10
|
let node_fs_promises = require("node:fs/promises");
|
|
10
11
|
node_fs_promises = require_chunk.__toESM(node_fs_promises);
|
|
@@ -84,66 +85,6 @@ async function seedWeeklySchedule(store, markers) {
|
|
|
84
85
|
return seed;
|
|
85
86
|
}
|
|
86
87
|
//#endregion
|
|
87
|
-
//#region src/builtins/backup-orchestrator/seed-marker-store.ts
|
|
88
|
-
/**
|
|
89
|
-
* @durable class=config owner=backup-orchestrator
|
|
90
|
-
* write="the orchestrator inserts one row per seed id the first time that
|
|
91
|
-
* seed is created (or found already created); never updated"
|
|
92
|
-
* retention="none — one tiny row per seed ever made; deleting it lets the
|
|
93
|
-
* seed be re-created once more on the next boot"
|
|
94
|
-
*/
|
|
95
|
-
var BACKUP_SEED_MARKERS_COLLECTION = "backup_seed_markers";
|
|
96
|
-
var COLUMNS$1 = [{
|
|
97
|
-
name: "seed_id",
|
|
98
|
-
type: "TEXT",
|
|
99
|
-
primaryKey: true
|
|
100
|
-
}, {
|
|
101
|
-
name: "seeded_at",
|
|
102
|
-
type: "INTEGER",
|
|
103
|
-
notNull: true
|
|
104
|
-
}];
|
|
105
|
-
var BackupSeedMarkerStore = class {
|
|
106
|
-
store;
|
|
107
|
-
now;
|
|
108
|
-
declared = false;
|
|
109
|
-
constructor(store, now = Date.now) {
|
|
110
|
-
this.store = store;
|
|
111
|
-
this.now = now;
|
|
112
|
-
}
|
|
113
|
-
async ensureDeclared() {
|
|
114
|
-
if (this.declared) return;
|
|
115
|
-
await this.store.declareCollection({
|
|
116
|
-
collection: BACKUP_SEED_MARKERS_COLLECTION,
|
|
117
|
-
columns: COLUMNS$1
|
|
118
|
-
});
|
|
119
|
-
this.declared = true;
|
|
120
|
-
}
|
|
121
|
-
async has(seedId) {
|
|
122
|
-
await this.ensureDeclared();
|
|
123
|
-
return (await this.store.query({
|
|
124
|
-
collection: BACKUP_SEED_MARKERS_COLLECTION,
|
|
125
|
-
filter: {
|
|
126
|
-
where: { seed_id: seedId },
|
|
127
|
-
limit: 1
|
|
128
|
-
}
|
|
129
|
-
})).length > 0;
|
|
130
|
-
}
|
|
131
|
-
async mark(seedId) {
|
|
132
|
-
await this.ensureDeclared();
|
|
133
|
-
if (await this.has(seedId)) return;
|
|
134
|
-
await this.store.insert({
|
|
135
|
-
collection: BACKUP_SEED_MARKERS_COLLECTION,
|
|
136
|
-
record: {
|
|
137
|
-
id: seedId,
|
|
138
|
-
data: {
|
|
139
|
-
seed_id: seedId,
|
|
140
|
-
seeded_at: this.now()
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
};
|
|
146
|
-
//#endregion
|
|
147
88
|
//#region ../../node_modules/croner/dist/croner.js
|
|
148
89
|
function T(s) {
|
|
149
90
|
return Date.UTC(s.y, s.m - 1, s.d, s.h, s.i, s.s);
|
|
@@ -938,6 +879,7 @@ function previewNextRuns(cron, count, after) {
|
|
|
938
879
|
}
|
|
939
880
|
//#endregion
|
|
940
881
|
//#region src/builtins/backup-orchestrator/destination-policy.ts
|
|
882
|
+
var import_read_all_rows = require_read_all_rows$1.require_read_all_rows();
|
|
941
883
|
/**
|
|
942
884
|
* @durable class=config owner=backup-orchestrator
|
|
943
885
|
* write="`ensureDefault` auto-creates one row the first time a `backups` storage
|
|
@@ -992,8 +934,10 @@ var BACKUP_DESTINATION_POLICIES_COLUMNS = [
|
|
|
992
934
|
var BackupDestinationPolicyService = class {
|
|
993
935
|
store;
|
|
994
936
|
declared = false;
|
|
995
|
-
|
|
937
|
+
policiesKind;
|
|
938
|
+
constructor(store, policiesKind = null) {
|
|
996
939
|
this.store = store;
|
|
940
|
+
this.policiesKind = policiesKind;
|
|
997
941
|
}
|
|
998
942
|
/**
|
|
999
943
|
* Lazy `declareCollection` — called from every read/write path.
|
|
@@ -1005,6 +949,7 @@ var BackupDestinationPolicyService = class {
|
|
|
1005
949
|
await this.ensureDeclared();
|
|
1006
950
|
}
|
|
1007
951
|
async ensureDeclared() {
|
|
952
|
+
if (this.policiesKind !== null) return;
|
|
1008
953
|
if (this.declared) return;
|
|
1009
954
|
await this.store.declareCollection({
|
|
1010
955
|
collection: BACKUP_DESTINATION_POLICIES,
|
|
@@ -1014,6 +959,17 @@ var BackupDestinationPolicyService = class {
|
|
|
1014
959
|
}
|
|
1015
960
|
async list() {
|
|
1016
961
|
await this.ensureDeclared();
|
|
962
|
+
const kind = this.policiesKind;
|
|
963
|
+
if (kind !== null) {
|
|
964
|
+
const rows = await (0, import_read_all_rows.readAllRows)(kind);
|
|
965
|
+
rows.sort((a, b) => a.id.localeCompare(b.id));
|
|
966
|
+
const out = [];
|
|
967
|
+
for (const row of rows) {
|
|
968
|
+
const mapped = bodyToPolicy(row.id, row.data);
|
|
969
|
+
if (mapped) out.push(mapped);
|
|
970
|
+
}
|
|
971
|
+
return out;
|
|
972
|
+
}
|
|
1017
973
|
const rows = await this.store.query({
|
|
1018
974
|
collection: BACKUP_DESTINATION_POLICIES,
|
|
1019
975
|
filter: { orderBy: {
|
|
@@ -1030,6 +986,11 @@ var BackupDestinationPolicyService = class {
|
|
|
1030
986
|
}
|
|
1031
987
|
async get(locationId) {
|
|
1032
988
|
await this.ensureDeclared();
|
|
989
|
+
const kind = this.policiesKind;
|
|
990
|
+
if (kind !== null) {
|
|
991
|
+
const row = await kind.get(locationId);
|
|
992
|
+
return row === null ? null : bodyToPolicy(locationId, row.data);
|
|
993
|
+
}
|
|
1033
994
|
const rows = await this.store.query({
|
|
1034
995
|
collection: BACKUP_DESTINATION_POLICIES,
|
|
1035
996
|
filter: {
|
|
@@ -1045,6 +1006,16 @@ var BackupDestinationPolicyService = class {
|
|
|
1045
1006
|
*/
|
|
1046
1007
|
async upsert(p) {
|
|
1047
1008
|
await this.ensureDeclared();
|
|
1009
|
+
const kind = this.policiesKind;
|
|
1010
|
+
if (kind !== null) {
|
|
1011
|
+
const body = policyToBody(p);
|
|
1012
|
+
const data = require_restore_archive.backupOrchestratorRecordKinds["destination-policies"].schema.parse(body);
|
|
1013
|
+
await kind.put({
|
|
1014
|
+
id: p.locationId,
|
|
1015
|
+
data
|
|
1016
|
+
});
|
|
1017
|
+
return;
|
|
1018
|
+
}
|
|
1048
1019
|
await this.store.deleteWhere({
|
|
1049
1020
|
collection: BACKUP_DESTINATION_POLICIES,
|
|
1050
1021
|
filter: { where: { location_id: p.locationId } }
|
|
@@ -1059,6 +1030,11 @@ var BackupDestinationPolicyService = class {
|
|
|
1059
1030
|
}
|
|
1060
1031
|
async delete(locationId) {
|
|
1061
1032
|
await this.ensureDeclared();
|
|
1033
|
+
const kind = this.policiesKind;
|
|
1034
|
+
if (kind !== null) {
|
|
1035
|
+
await kind.delete(locationId);
|
|
1036
|
+
return;
|
|
1037
|
+
}
|
|
1062
1038
|
await this.store.deleteWhere({
|
|
1063
1039
|
collection: BACKUP_DESTINATION_POLICIES,
|
|
1064
1040
|
filter: { where: { location_id: locationId } }
|
|
@@ -1110,6 +1086,26 @@ var BackupDestinationPolicyService = class {
|
|
|
1110
1086
|
});
|
|
1111
1087
|
}
|
|
1112
1088
|
};
|
|
1089
|
+
function policyToBody(p) {
|
|
1090
|
+
return {
|
|
1091
|
+
enabled: p.enabled,
|
|
1092
|
+
retentionCount: p.retentionCount,
|
|
1093
|
+
...p.label !== void 0 ? { label: p.label } : {},
|
|
1094
|
+
...p.lastAttemptAt !== void 0 ? { lastAttemptAt: p.lastAttemptAt } : {},
|
|
1095
|
+
...p.lastError !== void 0 ? { lastError: p.lastError } : {}
|
|
1096
|
+
};
|
|
1097
|
+
}
|
|
1098
|
+
function bodyToPolicy(locationId, body) {
|
|
1099
|
+
if (!locationId) return null;
|
|
1100
|
+
return {
|
|
1101
|
+
locationId,
|
|
1102
|
+
enabled: body.enabled,
|
|
1103
|
+
retentionCount: body.retentionCount,
|
|
1104
|
+
...body.label !== void 0 ? { label: body.label } : {},
|
|
1105
|
+
...body.lastAttemptAt !== void 0 ? { lastAttemptAt: body.lastAttemptAt } : {},
|
|
1106
|
+
...body.lastError !== void 0 ? { lastError: body.lastError } : {}
|
|
1107
|
+
};
|
|
1108
|
+
}
|
|
1113
1109
|
function mapPolicyToRow(p) {
|
|
1114
1110
|
return {
|
|
1115
1111
|
location_id: p.locationId,
|
|
@@ -1213,131 +1209,6 @@ async function downloadArchiveToCache(input) {
|
|
|
1213
1209
|
}
|
|
1214
1210
|
}
|
|
1215
1211
|
//#endregion
|
|
1216
|
-
//#region src/builtins/backup-orchestrator/encryption-key-store.ts
|
|
1217
|
-
/**
|
|
1218
|
-
* @durable class=config owner=backup-orchestrator
|
|
1219
|
-
* write="`setupEncryption` inserts one row per generated key and retires the
|
|
1220
|
-
* previous active row; `disableEncryption` retires the active row"
|
|
1221
|
-
* retention="none — one small row per key ever generated; a retired row
|
|
1222
|
-
* names the key older archives need"
|
|
1223
|
-
*/
|
|
1224
|
-
var BACKUP_ENCRYPTION_KEYS_COLLECTION = "backup_encryption_keys";
|
|
1225
|
-
var COLUMNS = [
|
|
1226
|
-
{
|
|
1227
|
-
name: "key_id",
|
|
1228
|
-
type: "TEXT",
|
|
1229
|
-
primaryKey: true
|
|
1230
|
-
},
|
|
1231
|
-
{
|
|
1232
|
-
name: "public_key",
|
|
1233
|
-
type: "TEXT",
|
|
1234
|
-
notNull: true
|
|
1235
|
-
},
|
|
1236
|
-
{
|
|
1237
|
-
name: "created_at",
|
|
1238
|
-
type: "INTEGER",
|
|
1239
|
-
notNull: true
|
|
1240
|
-
},
|
|
1241
|
-
{
|
|
1242
|
-
name: "retired_at",
|
|
1243
|
-
type: "INTEGER"
|
|
1244
|
-
}
|
|
1245
|
-
];
|
|
1246
|
-
var BackupEncryptionKeyStore = class {
|
|
1247
|
-
store;
|
|
1248
|
-
now;
|
|
1249
|
-
declared = false;
|
|
1250
|
-
constructor(store, now = Date.now) {
|
|
1251
|
-
this.store = store;
|
|
1252
|
-
this.now = now;
|
|
1253
|
-
}
|
|
1254
|
-
async ensureDeclared() {
|
|
1255
|
-
if (this.declared) return;
|
|
1256
|
-
await this.store.declareCollection({
|
|
1257
|
-
collection: BACKUP_ENCRYPTION_KEYS_COLLECTION,
|
|
1258
|
-
columns: COLUMNS
|
|
1259
|
-
});
|
|
1260
|
-
this.declared = true;
|
|
1261
|
-
}
|
|
1262
|
-
/** Every key, newest first. */
|
|
1263
|
-
async list() {
|
|
1264
|
-
await this.ensureDeclared();
|
|
1265
|
-
const rows = await this.store.query({
|
|
1266
|
-
collection: BACKUP_ENCRYPTION_KEYS_COLLECTION,
|
|
1267
|
-
filter: { orderBy: {
|
|
1268
|
-
field: "created_at",
|
|
1269
|
-
direction: "desc"
|
|
1270
|
-
} }
|
|
1271
|
-
});
|
|
1272
|
-
const out = [];
|
|
1273
|
-
for (const row of rows) {
|
|
1274
|
-
const record = toRecord(row.data);
|
|
1275
|
-
if (record !== null) out.push(record);
|
|
1276
|
-
}
|
|
1277
|
-
return out;
|
|
1278
|
-
}
|
|
1279
|
-
/** The key new archives are encrypted to; `null` = encryption off. */
|
|
1280
|
-
async active() {
|
|
1281
|
-
return (await this.list()).find((k) => k.retiredAt === null) ?? null;
|
|
1282
|
-
}
|
|
1283
|
-
/** Make `publicKey` the active key; the previous one is retired, kept listed. */
|
|
1284
|
-
async activate(input) {
|
|
1285
|
-
const parsed = require_restore_archive.parseBackupPublicKey(input.publicKey);
|
|
1286
|
-
const t = this.now();
|
|
1287
|
-
await this.retireActive(t);
|
|
1288
|
-
const record = {
|
|
1289
|
-
keyId: parsed.keyId,
|
|
1290
|
-
publicKey: input.publicKey.trim(),
|
|
1291
|
-
createdAt: t,
|
|
1292
|
-
retiredAt: null
|
|
1293
|
-
};
|
|
1294
|
-
await this.write(record);
|
|
1295
|
-
return record;
|
|
1296
|
-
}
|
|
1297
|
-
/** Encryption off: the active key is retired. Archives already made keep needing it. */
|
|
1298
|
-
async disable() {
|
|
1299
|
-
await this.retireActive(this.now());
|
|
1300
|
-
}
|
|
1301
|
-
async retireActive(at) {
|
|
1302
|
-
for (const key of await this.list()) if (key.retiredAt === null) await this.write({
|
|
1303
|
-
...key,
|
|
1304
|
-
retiredAt: at
|
|
1305
|
-
});
|
|
1306
|
-
}
|
|
1307
|
-
async write(record) {
|
|
1308
|
-
await this.ensureDeclared();
|
|
1309
|
-
await this.store.deleteWhere({
|
|
1310
|
-
collection: BACKUP_ENCRYPTION_KEYS_COLLECTION,
|
|
1311
|
-
filter: { where: { key_id: record.keyId } }
|
|
1312
|
-
});
|
|
1313
|
-
await this.store.insert({
|
|
1314
|
-
collection: BACKUP_ENCRYPTION_KEYS_COLLECTION,
|
|
1315
|
-
record: {
|
|
1316
|
-
id: record.keyId,
|
|
1317
|
-
data: {
|
|
1318
|
-
key_id: record.keyId,
|
|
1319
|
-
public_key: record.publicKey,
|
|
1320
|
-
created_at: record.createdAt,
|
|
1321
|
-
retired_at: record.retiredAt
|
|
1322
|
-
}
|
|
1323
|
-
}
|
|
1324
|
-
});
|
|
1325
|
-
}
|
|
1326
|
-
};
|
|
1327
|
-
function toRecord(row) {
|
|
1328
|
-
const keyId = row["key_id"];
|
|
1329
|
-
const publicKey = row["public_key"];
|
|
1330
|
-
const createdAt = row["created_at"];
|
|
1331
|
-
if (typeof keyId !== "string" || typeof publicKey !== "string") return null;
|
|
1332
|
-
const retired = row["retired_at"];
|
|
1333
|
-
return {
|
|
1334
|
-
keyId,
|
|
1335
|
-
publicKey,
|
|
1336
|
-
createdAt: typeof createdAt === "number" ? createdAt : Number(createdAt ?? 0),
|
|
1337
|
-
retiredAt: typeof retired === "number" ? retired : null
|
|
1338
|
-
};
|
|
1339
|
-
}
|
|
1340
|
-
//#endregion
|
|
1341
1212
|
//#region src/builtins/backup-orchestrator/manifest-store.ts
|
|
1342
1213
|
/** File path (relative to the location root) where the index lives. */
|
|
1343
1214
|
var MANIFESTS_FILENAME = "manifests.json";
|
|
@@ -1873,13 +1744,16 @@ var BACKUP_SCHEDULES_COLUMNS = [
|
|
|
1873
1744
|
var BackupScheduleService = class {
|
|
1874
1745
|
store;
|
|
1875
1746
|
declared = false;
|
|
1876
|
-
|
|
1747
|
+
schedulesKind;
|
|
1748
|
+
constructor(store, schedulesKind = null) {
|
|
1877
1749
|
this.store = store;
|
|
1750
|
+
this.schedulesKind = schedulesKind;
|
|
1878
1751
|
}
|
|
1879
1752
|
async initialize() {
|
|
1880
1753
|
await this.ensureDeclared();
|
|
1881
1754
|
}
|
|
1882
1755
|
async ensureDeclared() {
|
|
1756
|
+
if (this.schedulesKind !== null) return;
|
|
1883
1757
|
if (this.declared) return;
|
|
1884
1758
|
await this.store.declareCollection({
|
|
1885
1759
|
collection: BACKUP_SCHEDULES,
|
|
@@ -1889,6 +1763,17 @@ var BackupScheduleService = class {
|
|
|
1889
1763
|
}
|
|
1890
1764
|
async list() {
|
|
1891
1765
|
await this.ensureDeclared();
|
|
1766
|
+
const kind = this.schedulesKind;
|
|
1767
|
+
if (kind !== null) {
|
|
1768
|
+
const rows = await (0, import_read_all_rows.readAllRows)(kind);
|
|
1769
|
+
rows.sort((a, b) => a.id.localeCompare(b.id));
|
|
1770
|
+
const out = [];
|
|
1771
|
+
for (const row of rows) {
|
|
1772
|
+
const mapped = bodyToSchedule(row.id, row.data);
|
|
1773
|
+
if (mapped) out.push(mapped);
|
|
1774
|
+
}
|
|
1775
|
+
return out;
|
|
1776
|
+
}
|
|
1892
1777
|
const rows = await this.store.query({
|
|
1893
1778
|
collection: BACKUP_SCHEDULES,
|
|
1894
1779
|
filter: { orderBy: {
|
|
@@ -1905,6 +1790,11 @@ var BackupScheduleService = class {
|
|
|
1905
1790
|
}
|
|
1906
1791
|
async get(id) {
|
|
1907
1792
|
await this.ensureDeclared();
|
|
1793
|
+
const kind = this.schedulesKind;
|
|
1794
|
+
if (kind !== null) {
|
|
1795
|
+
const row = await kind.get(id);
|
|
1796
|
+
return row === null ? null : bodyToSchedule(id, row.data);
|
|
1797
|
+
}
|
|
1908
1798
|
const rows = await this.store.query({
|
|
1909
1799
|
collection: BACKUP_SCHEDULES,
|
|
1910
1800
|
filter: {
|
|
@@ -1917,6 +1807,16 @@ var BackupScheduleService = class {
|
|
|
1917
1807
|
/** Replace-or-insert (delete + insert — mirrors the policy store). */
|
|
1918
1808
|
async upsert(s) {
|
|
1919
1809
|
await this.ensureDeclared();
|
|
1810
|
+
const kind = this.schedulesKind;
|
|
1811
|
+
if (kind !== null) {
|
|
1812
|
+
const body = scheduleToBody(s);
|
|
1813
|
+
const data = require_restore_archive.backupOrchestratorRecordKinds.schedules.schema.parse(body);
|
|
1814
|
+
await kind.put({
|
|
1815
|
+
id: s.id,
|
|
1816
|
+
data
|
|
1817
|
+
});
|
|
1818
|
+
return;
|
|
1819
|
+
}
|
|
1920
1820
|
await this.store.deleteWhere({
|
|
1921
1821
|
collection: BACKUP_SCHEDULES,
|
|
1922
1822
|
filter: { where: { id: s.id } }
|
|
@@ -1931,12 +1831,47 @@ var BackupScheduleService = class {
|
|
|
1931
1831
|
}
|
|
1932
1832
|
async delete(id) {
|
|
1933
1833
|
await this.ensureDeclared();
|
|
1834
|
+
const kind = this.schedulesKind;
|
|
1835
|
+
if (kind !== null) {
|
|
1836
|
+
await kind.delete(id);
|
|
1837
|
+
return;
|
|
1838
|
+
}
|
|
1934
1839
|
await this.store.deleteWhere({
|
|
1935
1840
|
collection: BACKUP_SCHEDULES,
|
|
1936
1841
|
filter: { where: { id } }
|
|
1937
1842
|
});
|
|
1938
1843
|
}
|
|
1939
1844
|
};
|
|
1845
|
+
function scheduleToBody(s) {
|
|
1846
|
+
return {
|
|
1847
|
+
label: s.label,
|
|
1848
|
+
cron: s.cron,
|
|
1849
|
+
enabled: s.enabled,
|
|
1850
|
+
locationIds: [...s.locationIds],
|
|
1851
|
+
retentionCount: s.retentionCount,
|
|
1852
|
+
...s.dataSources !== void 0 ? { dataSources: [...s.dataSources] } : {},
|
|
1853
|
+
...s.databases !== void 0 ? { databases: [...s.databases] } : {},
|
|
1854
|
+
...s.lastAttemptAt !== void 0 ? { lastAttemptAt: s.lastAttemptAt } : {},
|
|
1855
|
+
...s.lastSuccessAt !== void 0 ? { lastSuccessAt: s.lastSuccessAt } : {},
|
|
1856
|
+
...s.lastError !== void 0 ? { lastError: s.lastError } : {}
|
|
1857
|
+
};
|
|
1858
|
+
}
|
|
1859
|
+
function bodyToSchedule(id, body) {
|
|
1860
|
+
if (!id) return null;
|
|
1861
|
+
return {
|
|
1862
|
+
id,
|
|
1863
|
+
label: body.label,
|
|
1864
|
+
cron: body.cron,
|
|
1865
|
+
enabled: body.enabled,
|
|
1866
|
+
locationIds: [...body.locationIds],
|
|
1867
|
+
retentionCount: body.retentionCount,
|
|
1868
|
+
...body.dataSources !== void 0 ? { dataSources: [...body.dataSources] } : {},
|
|
1869
|
+
...body.databases !== void 0 && body.databases.length > 0 ? { databases: [...body.databases] } : {},
|
|
1870
|
+
...body.lastAttemptAt !== void 0 ? { lastAttemptAt: body.lastAttemptAt } : {},
|
|
1871
|
+
...body.lastSuccessAt !== void 0 ? { lastSuccessAt: body.lastSuccessAt } : {},
|
|
1872
|
+
...body.lastError !== void 0 ? { lastError: body.lastError } : {}
|
|
1873
|
+
};
|
|
1874
|
+
}
|
|
1940
1875
|
function mapScheduleToRow(s) {
|
|
1941
1876
|
return {
|
|
1942
1877
|
id: s.id,
|
|
@@ -2191,6 +2126,7 @@ var UPLOAD_CHUNK_BYTES = 8 * 1024 * 1024;
|
|
|
2191
2126
|
var ORCHESTRATOR_ADDON_ID = "backup-orchestrator";
|
|
2192
2127
|
var BackupOrchestratorAddon = class extends require_dist.BaseAddon {
|
|
2193
2128
|
systemBackup = null;
|
|
2129
|
+
backupRecords = null;
|
|
2194
2130
|
policies = null;
|
|
2195
2131
|
schedules = null;
|
|
2196
2132
|
/** Backup encryption keys — PUBLIC keys only (see encryption-key-store.ts). */
|
|
@@ -2232,6 +2168,11 @@ var BackupOrchestratorAddon = class extends require_dist.BaseAddon {
|
|
|
2232
2168
|
super({});
|
|
2233
2169
|
}
|
|
2234
2170
|
async onInitialize() {
|
|
2171
|
+
const records = this.ctx.records;
|
|
2172
|
+
if (records !== void 0) {
|
|
2173
|
+
await records.declare(require_restore_archive.backupOrchestratorRecordKinds);
|
|
2174
|
+
this.backupRecords = require_restore_archive.backupRecordStoresOf(records);
|
|
2175
|
+
}
|
|
2235
2176
|
this.dataDir = this.ctx.nodeDataDir;
|
|
2236
2177
|
this.stagingDir = resolveStagingDir(this.ctx.nodeDataDir);
|
|
2237
2178
|
this.systemBackup = new require_restore_archive.SystemBackupService(this.dataDir, this.ctx.logger);
|
|
@@ -2253,7 +2194,7 @@ var BackupOrchestratorAddon = class extends require_dist.BaseAddon {
|
|
|
2253
2194
|
}
|
|
2254
2195
|
await this.seedWeekly();
|
|
2255
2196
|
const settingsStore = this.ctx.kernel.capabilityRegistry?.getSingleton("settings-store");
|
|
2256
|
-
this.encryptionKeys = settingsStore ? new BackupEncryptionKeyStore(settingsStore) : null;
|
|
2197
|
+
this.encryptionKeys = settingsStore ? new require_restore_archive.BackupEncryptionKeyStore(settingsStore, Date.now, this.backupRecords?.encryptionKeys ?? null) : null;
|
|
2257
2198
|
const provider = {
|
|
2258
2199
|
listDestinations: () => this.listDestinations(),
|
|
2259
2200
|
list: () => this.aggregatedList(),
|
|
@@ -3256,7 +3197,7 @@ var BackupOrchestratorAddon = class extends require_dist.BaseAddon {
|
|
|
3256
3197
|
try {
|
|
3257
3198
|
const store = this.ctx.kernel.capabilityRegistry?.getSingleton("settings-store");
|
|
3258
3199
|
if (!store) return;
|
|
3259
|
-
const seed = await seedWeeklySchedule(this.schedules, new BackupSeedMarkerStore(store));
|
|
3200
|
+
const seed = await seedWeeklySchedule(this.schedules, new require_restore_archive.BackupSeedMarkerStore(store, Date.now, this.backupRecords?.seedMarkers ?? null));
|
|
3260
3201
|
if (seed === null) return;
|
|
3261
3202
|
this.ctx.logger.info("backup: seeded the weekly events & history schedule", { meta: {
|
|
3262
3203
|
scheduleId: seed.id,
|
|
@@ -3413,7 +3354,7 @@ var BackupOrchestratorAddon = class extends require_dist.BaseAddon {
|
|
|
3413
3354
|
this.ctx.logger.warn("backup-orchestrator: no settings-store provider — backup schedules will not persist");
|
|
3414
3355
|
return null;
|
|
3415
3356
|
}
|
|
3416
|
-
return new BackupScheduleService(store);
|
|
3357
|
+
return new BackupScheduleService(store, this.backupRecords?.schedules ?? null);
|
|
3417
3358
|
}
|
|
3418
3359
|
resolvePolicyService() {
|
|
3419
3360
|
const reg = this.ctx.kernel.capabilityRegistry;
|
|
@@ -3423,7 +3364,7 @@ var BackupOrchestratorAddon = class extends require_dist.BaseAddon {
|
|
|
3423
3364
|
this.ctx.logger.warn("backup-orchestrator: no settings-store provider — destination policies will not persist");
|
|
3424
3365
|
return null;
|
|
3425
3366
|
}
|
|
3426
|
-
return new BackupDestinationPolicyService(store);
|
|
3367
|
+
return new BackupDestinationPolicyService(store, this.backupRecords?.destinationPolicies ?? null);
|
|
3427
3368
|
}
|
|
3428
3369
|
/**
|
|
3429
3370
|
* Narrow `ctx.api.storage` to the subset the manifest helpers need.
|