@camstack/addon-admin-ui 1.2.433 → 1.2.435
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/assets/{AddonAssetIcon-BN2L5zYR.js → AddonAssetIcon-DwyvMm0j.js} +1 -1
- package/dist/assets/{Addons-IVSrpQ1E.js → Addons-N1hcMjwi.js} +1 -1
- package/dist/assets/{AdminPage-BN12I-qw.js → AdminPage-Dla2hgly.js} +1 -1
- package/dist/assets/{AdminSectionedPage-32bbJRJv.js → AdminSectionedPage-C6laWV2D.js} +1 -1
- package/dist/assets/{AiProfiles-0jvT_Qwx.js → AiProfiles-CW5cr9nz.js} +1 -1
- package/dist/assets/{BrokerForm-Dgr4eoOb.js → BrokerForm-XPsm7VqN.js} +1 -1
- package/dist/assets/{Build-Cu6tKrLQ.js → Build-Dg7gaee7.js} +1 -1
- package/dist/assets/{Calendars-Bk15Hwva.js → Calendars-D9aQ6xfy.js} +1 -1
- package/dist/assets/{Cluster-BdEsq5J1.js → Cluster-NV3ZrTk7.js} +1 -1
- package/dist/assets/{ClusterStepModel-Bdu1erTg.js → ClusterStepModel-BUROhnKA.js} +1 -1
- package/dist/assets/{CompositionEditor-Dx68KXOf.js → CompositionEditor-Djw5jKF1.js} +1 -1
- package/dist/assets/{CompositionEditorPage-C439CHpw.js → CompositionEditorPage-BNAhOgDE.js} +1 -1
- package/dist/assets/{Data-BwCbkEKL.js → Data-Bkq3Cr_h.js} +1 -1
- package/dist/assets/{DeviceDetail-O6lp6wGS.js → DeviceDetail-BR_FSl-i.js} +1 -1
- package/dist/assets/{DeviceDoActionFields-C9lcQjsE.js → DeviceDoActionFields-DLWA9-J9.js} +1 -1
- package/dist/assets/{Devices-DJLRZ1gB.js → Devices-C1k3PqRv.js} +1 -1
- package/dist/assets/{EmbedPlayerPage-BS7XG8ND.js → EmbedPlayerPage-Dz0lVYTn.js} +1 -1
- package/dist/assets/{Identity-CBJqopOJ.js → Identity-CJN1MNrJ.js} +1 -1
- package/dist/assets/{IntegrationDetail-ClLd4MXh.js → IntegrationDetail-DomJ4oV8.js} +1 -1
- package/dist/assets/{IntegrationHub-DLGn7tol.js → IntegrationHub-BTJM3uSD.js} +1 -1
- package/dist/assets/{Integrations-CWLFbroL.js → Integrations-B3EhTwi-.js} +1 -1
- package/dist/assets/{Integrations-DwGGLX0o.js → Integrations-w1Zb-AYc.js} +1 -1
- package/dist/assets/{Library-CLDkRGXt.js → Library-BLUxFISX.js} +1 -1
- package/dist/assets/{Locations-B0gmUpSi.js → Locations-5WWzr64x.js} +1 -1
- package/dist/assets/{Logs-BrWt8ZO7.js → Logs-C5wdcV2o.js} +1 -1
- package/dist/assets/{MaskShapeCanvas-D_fehNld.js → MaskShapeCanvas-WPSz6MvT.js} +1 -1
- package/dist/assets/{MotionZonesSettings-CrnUBRrN.js → MotionZonesSettings-CxZucl1G.js} +1 -1
- package/dist/assets/{MyAccess-B3zd07Xt.js → MyAccess-2bAujGDI.js} +1 -1
- package/dist/assets/{Network-DWFicIZW.js → Network-DFt5Vib8.js} +1 -1
- package/dist/assets/{NodeAddonsSettingsPanel-DpiOL1Ze.js → NodeAddonsSettingsPanel-CSyREPja.js} +1 -1
- package/dist/assets/{Notifications-CWachKDI.js → Notifications-KG9O3i8q.js} +1 -1
- package/dist/assets/{PrivacyMaskSettings-1Gn-79PY.js → PrivacyMaskSettings-DQ7Xe8cq.js} +1 -1
- package/dist/assets/{Recordings-BuuW-Zcu.js → Recordings-BbQTlUaN.js} +1 -1
- package/dist/assets/{ScanNetworkModal-C7uRGWAy.js → ScanNetworkModal-Dw7_YiJk.js} +1 -1
- package/dist/assets/{SceneMonitorEditor-BiCDEoco.js → SceneMonitorEditor-CQtUJ-Cg.js} +1 -1
- package/dist/assets/{SessionsList-BdFbtv3Z.js → SessionsList-BuiRHWv-.js} +1 -1
- package/dist/assets/{Showroom-m2vZPqGf.js → Showroom-DZRq9gks.js} +1 -1
- package/dist/assets/{System-BXLdiSS2.js → System-n6EeqhH2.js} +1 -1
- package/dist/assets/{Terminal-Dhk0sGr6.js → Terminal-Dt_ribAu.js} +1 -1
- package/dist/assets/{Viewer-Dsadw_E6.js → Viewer-DbBh61dj.js} +1 -1
- package/dist/assets/__vite-browser-external-BlMfPwfH.js +64 -0
- package/dist/assets/{_virtual_mf-localSharedImportMap___mfe_internal__admin_ui_host-veeSdFYk.js → _virtual_mf-localSharedImportMap___mfe_internal__admin_ui_host-CEvIRFB4.js} +1 -1
- package/dist/assets/{addon-icons-context-IBurbMO3.js → addon-icons-context-r49093mC.js} +1 -1
- package/dist/assets/{archive-CFXN2ykw.js → archive-CgDcyTmT.js} +1 -1
- package/dist/assets/{authed-media-CMSX10jh.js → authed-media-CN55sP4S.js} +1 -1
- package/dist/assets/{bell-off-DXKLMEY7.js → bell-off-CdHPL528.js} +1 -1
- package/dist/assets/{boxes-Bmu9l4XP.js → boxes-DJvrVSZy.js} +1 -1
- package/dist/assets/circle-slash-BvkFL8F1.js +1 -0
- package/dist/assets/client-CVIfL49c.js +358 -0
- package/dist/assets/{cloud-upload-0ACTrw2z.js → cloud-upload-BkTrXwKr.js} +1 -1
- package/dist/assets/crop-DUVdBcFC.js +1 -0
- package/dist/assets/{device-integration-icon-CLWfAoNu.js → device-integration-icon-CViPS882.js} +1 -1
- package/dist/assets/device-picker-model-mxypQ5EF.js +1 -0
- package/dist/assets/{dist-B4Z8jDGs.js → dist-0P_zMe7Y.js} +1 -1
- package/dist/assets/dist-U5_IP253.js +358 -0
- package/dist/assets/{eraser-CiNxLDkc.js → eraser-BCiOGK5K.js} +1 -1
- package/dist/assets/{hard-drive-download-BRScR_dE.js → hard-drive-download-Df-zlQQG.js} +1 -1
- package/dist/assets/{history-BdpOCM60.js → history-CWpQe6k9.js} +1 -1
- package/dist/assets/{hostInit-oc6MTKNx.js → hostInit-Cnw529bc.js} +1 -1
- package/dist/assets/{icons-CqawGiX4.js → icons-aI8aLvw4.js} +1 -1
- package/dist/assets/{index-DmLRwCOJ.js → index-DkNBNJNl.js} +3 -3
- package/dist/assets/{key-CbIla85G.js → key-CZcpRn4A.js} +1 -1
- package/dist/assets/{key-round-B5K63Sum.js → key-round-BBPO5HDK.js} +1 -1
- package/dist/assets/{layers-cAOItMFb.js → layers-DLOgDOBH.js} +1 -1
- package/dist/assets/{linked-devices-model-BemXG-ca.js → linked-devices-model-f_SAvOZs.js} +1 -1
- package/dist/assets/{list-ordered-DPhkTIKi.js → list-ordered-BaNkdvWk.js} +1 -1
- package/dist/assets/{location-owned-usage-DlLHa0e9.js → location-owned-usage-BFxIuzRL.js} +1 -1
- package/dist/assets/{log-in-DGvtILIO.js → log-in-CL3_o1dD.js} +1 -1
- package/dist/assets/{memory-stick-BEpCAEGl.js → memory-stick-CHkvUw7C.js} +1 -1
- package/dist/assets/{message-square-plus-DoTcuOzO.js → message-square-plus-CIeWtcNn.js} +1 -1
- package/dist/assets/{mf-entry-bootstrap-0-80e86115.js → mf-entry-bootstrap-0-657dd3ff.js} +2 -2
- package/dist/assets/{mic-off-DcStq35W.js → mic-off-DS8OGDQW.js} +1 -1
- package/dist/assets/{monitor-off-C-97xYe0.js → monitor-off-DC9Xug5Z.js} +1 -1
- package/dist/assets/{monitor-smartphone-CO0bB1t2.js → monitor-smartphone-CS_5BZqr.js} +1 -1
- package/dist/assets/mount-mxypQ5EF.js +1 -0
- package/dist/assets/{notification-schedule-field-Dk2EwHr3.js → notification-schedule-field-aMkV5LtX.js} +1 -1
- package/dist/assets/{octagon-alert-DNnHqguO.js → octagon-alert-Cdtac8l_.js} +1 -1
- package/dist/assets/{player-overlays-DAkqwPfz.js → player-overlays-CZXV2ES3.js} +1 -1
- package/dist/assets/{recycle-CYGYs1R0.js → recycle-wY_-o-u0.js} +1 -1
- package/dist/assets/remoteEntry-BFNP-i5_.js +1 -0
- package/dist/assets/{scan-eye-jlDwlrp9.js → scan-eye-A6IBODIs.js} +1 -1
- package/dist/assets/{scissors-KJj8onDS.js → scissors-BzZpfzIa.js} +1 -1
- package/dist/assets/{search-x-BKi_eBw1.js → search-x-DqjVJK7_.js} +1 -1
- package/dist/assets/{send-DCu2jIlN.js → send-BDCQEx8-.js} +1 -1
- package/dist/assets/{settings-2-DBU7cgzi.js → settings-2-BBgeb4tF.js} +1 -1
- package/dist/assets/{speaker-5ejvh-Bn.js → speaker-Bw_8wVkA.js} +1 -1
- package/dist/assets/{src-Cy0DaR_s.js → src-DOs8Kg5s.js} +17 -17
- package/dist/assets/{timer-reset-DSuKvwUU.js → timer-reset-CNH944ar.js} +1 -1
- package/dist/assets/{ungroup-D7NCV2Lj.js → ungroup-D4fdKtA6.js} +1 -1
- package/dist/assets/{unlink-C8DgAMZK.js → unlink-BKDNubwr.js} +1 -1
- package/dist/assets/{usb-CeNgKfW_.js → usb-CU5DhEWn.js} +1 -1
- package/dist/assets/{use-scenes-feed-CCpBk3yA.js → use-scenes-feed-Bk660KRI.js} +1 -1
- package/dist/assets/{use-stationary-objects-BM_xse0L.js → use-stationary-objects-BVxOU14q.js} +1 -1
- package/dist/assets/useEventInvalidation-mxypQ5EF.js +1 -0
- package/dist/assets/{useNodeUrlSelection-ml8Lvw9I.js → useNodeUrlSelection-Bg0rHiIl.js} +1 -1
- package/dist/assets/user-round-CYlbEszq.js +1 -0
- package/dist/assets/{user-x-aUe-OIlE.js → user-x-DRzptq94.js} +1 -1
- package/dist/assets/{video-CizbhiMO.js → video-CEzO-5-D.js} +1 -1
- package/dist/assets/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__admin_ui_host__remoteEntry-_hash_-DfTFurdS.js → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__admin_ui_host__remoteEntry-_hash_-DzDhE-1_.js} +2 -2
- package/dist/index.html +10 -10
- package/dist/server/addon.js +634 -48
- package/package.json +1 -1
- package/dist/assets/__vite-browser-external-DF8Eb0aa.js +0 -64
- package/dist/assets/circle-slash-DSwW3p-p.js +0 -1
- package/dist/assets/client-CUNqxW78.js +0 -358
- package/dist/assets/crop-uQYFVj7C.js +0 -1
- package/dist/assets/device-picker-model-Bjy90-ZC.js +0 -1
- package/dist/assets/dist-GOV92hHi.js +0 -358
- package/dist/assets/mount-Bjy90-ZC.js +0 -1
- package/dist/assets/remoteEntry-BFWX_ydx.js +0 -1
- package/dist/assets/useEventInvalidation-Bjy90-ZC.js +0 -1
- package/dist/assets/user-round-yAJ0vDoi.js +0 -1
package/dist/server/addon.js
CHANGED
|
@@ -5406,7 +5406,7 @@ var ZodIssueCode = {
|
|
|
5406
5406
|
var ZodFirstPartyTypeKind;
|
|
5407
5407
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
5408
5408
|
//#endregion
|
|
5409
|
-
//#region ../types/dist/sleep-
|
|
5409
|
+
//#region ../types/dist/sleep-WsrozGDL.mjs
|
|
5410
5410
|
/**
|
|
5411
5411
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
5412
5412
|
* window to float samples (D455).
|
|
@@ -5523,7 +5523,7 @@ function isKeychainStoredField(field) {
|
|
|
5523
5523
|
var SECRET_CLEAR = { $secretClear: true };
|
|
5524
5524
|
/** The `'***'` token D634 redaction writes for non-admins. */
|
|
5525
5525
|
var LEGACY_DEVICE_REDACTION = "***";
|
|
5526
|
-
function isRecord$
|
|
5526
|
+
function isRecord$4(value) {
|
|
5527
5527
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
5528
5528
|
}
|
|
5529
5529
|
function makeSecretMarker(ref) {
|
|
@@ -5534,12 +5534,12 @@ function makeSecretMarker(ref) {
|
|
|
5534
5534
|
}
|
|
5535
5535
|
/** A stored marker: an object whose `$secret` is a non-empty string. */
|
|
5536
5536
|
function isSecretMarker(value) {
|
|
5537
|
-
if (!isRecord$
|
|
5537
|
+
if (!isRecord$4(value)) return false;
|
|
5538
5538
|
const ref = value["$secret"];
|
|
5539
5539
|
return typeof ref === "string" && ref.length > 0;
|
|
5540
5540
|
}
|
|
5541
5541
|
function isSecretClear(value) {
|
|
5542
|
-
return isRecord$
|
|
5542
|
+
return isRecord$4(value) && value["$secretClear"] === true;
|
|
5543
5543
|
}
|
|
5544
5544
|
/**
|
|
5545
5545
|
* The UI view of a stored secret field value: a marker becomes "set", inline
|
|
@@ -6149,7 +6149,7 @@ var KeychainWriteRefusedError = class extends Error {
|
|
|
6149
6149
|
}
|
|
6150
6150
|
};
|
|
6151
6151
|
var KEEP = { kind: "keep" };
|
|
6152
|
-
function isRecord$
|
|
6152
|
+
function isRecord$3(value) {
|
|
6153
6153
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
6154
6154
|
}
|
|
6155
6155
|
function defaultMintId() {
|
|
@@ -6162,7 +6162,7 @@ function collectSecretMarkerRefs(value, out = []) {
|
|
|
6162
6162
|
return out;
|
|
6163
6163
|
}
|
|
6164
6164
|
if (Array.isArray(value)) for (const item of value) collectSecretMarkerRefs(item, out);
|
|
6165
|
-
else if (isRecord$
|
|
6165
|
+
else if (isRecord$3(value)) for (const child of Object.values(value)) collectSecretMarkerRefs(child, out);
|
|
6166
6166
|
return out;
|
|
6167
6167
|
}
|
|
6168
6168
|
async function storedValueEquals(secrets, marker, candidate) {
|
|
@@ -6217,7 +6217,7 @@ function rowId(row, idKey) {
|
|
|
6217
6217
|
return null;
|
|
6218
6218
|
}
|
|
6219
6219
|
async function writeArray(ctx, node, incoming, stored, fieldPath) {
|
|
6220
|
-
const storedRows = Array.isArray(stored) ? stored.filter(isRecord$
|
|
6220
|
+
const storedRows = Array.isArray(stored) ? stored.filter(isRecord$3) : [];
|
|
6221
6221
|
if (!Array.isArray(incoming)) {
|
|
6222
6222
|
ctx.deletes.push(...collectSecretMarkerRefs(storedRows));
|
|
6223
6223
|
return {
|
|
@@ -6233,7 +6233,7 @@ async function writeArray(ctx, node, incoming, stored, fieldPath) {
|
|
|
6233
6233
|
const kept = /* @__PURE__ */ new Set();
|
|
6234
6234
|
const rows = [];
|
|
6235
6235
|
for (const row of incoming) {
|
|
6236
|
-
if (!isRecord$
|
|
6236
|
+
if (!isRecord$3(row)) {
|
|
6237
6237
|
rows.push(row);
|
|
6238
6238
|
continue;
|
|
6239
6239
|
}
|
|
@@ -6258,7 +6258,7 @@ async function writeNode(ctx, node, incoming, stored, fieldPath) {
|
|
|
6258
6258
|
case "leaf": return writeLeaf(ctx, incoming, stored, fieldPath);
|
|
6259
6259
|
case "array": return writeArray(ctx, node, incoming, stored, fieldPath);
|
|
6260
6260
|
case "object": {
|
|
6261
|
-
if (!isRecord$
|
|
6261
|
+
if (!isRecord$3(incoming)) {
|
|
6262
6262
|
if (incoming === void 0) return KEEP;
|
|
6263
6263
|
ctx.deletes.push(...collectSecretMarkerRefs(stored));
|
|
6264
6264
|
return {
|
|
@@ -6266,7 +6266,7 @@ async function writeNode(ctx, node, incoming, stored, fieldPath) {
|
|
|
6266
6266
|
value: incoming
|
|
6267
6267
|
};
|
|
6268
6268
|
}
|
|
6269
|
-
const storedObj = isRecord$
|
|
6269
|
+
const storedObj = isRecord$3(stored) ? stored : {};
|
|
6270
6270
|
return {
|
|
6271
6271
|
kind: "value",
|
|
6272
6272
|
value: await writeMembers(ctx, node.children, incoming, storedObj, (m) => `${fieldPath}.${m}`)
|
|
@@ -6389,7 +6389,7 @@ async function resolveSecretMarkers(value, secrets, options = {}) {
|
|
|
6389
6389
|
value: items
|
|
6390
6390
|
};
|
|
6391
6391
|
}
|
|
6392
|
-
if (isRecord$
|
|
6392
|
+
if (isRecord$3(v)) {
|
|
6393
6393
|
const out = {};
|
|
6394
6394
|
for (const [k, child] of Object.entries(v)) {
|
|
6395
6395
|
const s = substitute(child);
|
|
@@ -6421,7 +6421,7 @@ var SecretOverwriteRefusedError = class extends Error {
|
|
|
6421
6421
|
this.name = "SecretOverwriteRefusedError";
|
|
6422
6422
|
}
|
|
6423
6423
|
};
|
|
6424
|
-
function isRecord(value) {
|
|
6424
|
+
function isRecord$2(value) {
|
|
6425
6425
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
6426
6426
|
}
|
|
6427
6427
|
function resolvedValue(pass, marker) {
|
|
@@ -6450,7 +6450,7 @@ function inArray(pass, incoming, stored) {
|
|
|
6450
6450
|
return incoming.map((item, index) => {
|
|
6451
6451
|
const twin = stored[index];
|
|
6452
6452
|
if (isSecretMarker(twin)) return typeof item === "string" && item === resolvedValue(pass, twin) ? twin : item;
|
|
6453
|
-
if (isRecord(item) && isRecord(twin)) return inArrayRow(pass, item, twin);
|
|
6453
|
+
if (isRecord$2(item) && isRecord$2(twin)) return inArrayRow(pass, item, twin);
|
|
6454
6454
|
if (Array.isArray(item) && Array.isArray(twin)) return inArray(pass, item, twin);
|
|
6455
6455
|
return item;
|
|
6456
6456
|
});
|
|
@@ -6461,7 +6461,7 @@ function inArrayRow(pass, incoming, stored) {
|
|
|
6461
6461
|
const twin = stored[key];
|
|
6462
6462
|
if (isSecretMarker(twin)) {
|
|
6463
6463
|
if (typeof value === "string" && value === resolvedValue(pass, twin)) out[key] = twin;
|
|
6464
|
-
} else if (isRecord(value) && isRecord(twin)) out[key] = inArrayRow(pass, value, twin);
|
|
6464
|
+
} else if (isRecord$2(value) && isRecord$2(twin)) out[key] = inArrayRow(pass, value, twin);
|
|
6465
6465
|
else if (Array.isArray(value) && Array.isArray(twin)) out[key] = inArray(pass, value, twin);
|
|
6466
6466
|
}
|
|
6467
6467
|
return out;
|
|
@@ -6469,7 +6469,7 @@ function inArrayRow(pass, incoming, stored) {
|
|
|
6469
6469
|
async function walk(pass, incoming, stored) {
|
|
6470
6470
|
if (isSecretMarker(stored)) return atMarker(pass, incoming, stored);
|
|
6471
6471
|
if (Array.isArray(incoming) && Array.isArray(stored)) return inArray(pass, incoming, stored);
|
|
6472
|
-
if (!isRecord(incoming) || !isRecord(stored)) return incoming;
|
|
6472
|
+
if (!isRecord$2(incoming) || !isRecord$2(stored)) return incoming;
|
|
6473
6473
|
const out = { ...incoming };
|
|
6474
6474
|
for (const [key, value] of Object.entries(incoming)) out[key] = await walk(pass, value, stored[key]);
|
|
6475
6475
|
return out;
|
|
@@ -6500,7 +6500,7 @@ async function restoreUnchangedSecrets(input) {
|
|
|
6500
6500
|
function isJsonEqual(a, b) {
|
|
6501
6501
|
if (Object.is(a, b)) return true;
|
|
6502
6502
|
if (Array.isArray(a)) return Array.isArray(b) && a.length === b.length && a.every((v, i) => isJsonEqual(v, b[i]));
|
|
6503
|
-
if (isRecord(a) && isRecord(b)) {
|
|
6503
|
+
if (isRecord$2(a) && isRecord$2(b)) {
|
|
6504
6504
|
const keys = Object.keys(a);
|
|
6505
6505
|
if (keys.length !== Object.keys(b).length) return false;
|
|
6506
6506
|
return keys.every((k) => Object.prototype.hasOwnProperty.call(b, k) && isJsonEqual(a[k], b[k]));
|
|
@@ -6524,7 +6524,7 @@ function markerKeysOf(blob, owner) {
|
|
|
6524
6524
|
}
|
|
6525
6525
|
function nodeFromStored(value, owner) {
|
|
6526
6526
|
if (isSecretMarker(value)) return isSecretRefOwnedBy(value.$secret, owner) ? { kind: "leaf" } : null;
|
|
6527
|
-
if (!isRecord(value)) return null;
|
|
6527
|
+
if (!isRecord$2(value)) return null;
|
|
6528
6528
|
const children = /* @__PURE__ */ new Map();
|
|
6529
6529
|
for (const [key, child] of Object.entries(value)) {
|
|
6530
6530
|
const node = nodeFromStored(child, owner);
|
|
@@ -7806,6 +7806,89 @@ var PeerBytesTicketSchema = object({
|
|
|
7806
7806
|
*/
|
|
7807
7807
|
declaredBytes: number().int().nonnegative().nullable()
|
|
7808
7808
|
});
|
|
7809
|
+
/** Limits and names of `ctx.records` (D881). One authority; the engine and the facade read it. */
|
|
7810
|
+
/** The files a kind may live in. `history` is device-history's (D850), never records. */
|
|
7811
|
+
var RECORD_DATABASES = ["settings", "events"];
|
|
7812
|
+
/** The classes of a kind: the `@durable` vocabulary, one authority (replaces the annotation). */
|
|
7813
|
+
var RECORD_CLASSES = [
|
|
7814
|
+
"config",
|
|
7815
|
+
"ledger",
|
|
7816
|
+
"audit",
|
|
7817
|
+
"mirror",
|
|
7818
|
+
"ephemeral"
|
|
7819
|
+
];
|
|
7820
|
+
var RECORD_DEFAULT_MAX_DATA_BYTES = 64 * 1024;
|
|
7821
|
+
var RECORD_MAX_DATA_BYTES = 1024 * 1024;
|
|
7822
|
+
var RECORD_BATCH_MAX = 1e3;
|
|
7823
|
+
var RECORD_QUERY_MAX = 1e3;
|
|
7824
|
+
/**
|
|
7825
|
+
* Record kinds (D881): the declaration an addon makes of one kind of fact, the
|
|
7826
|
+
* Zod row schema that describes it, and the helper that turns the two into the
|
|
7827
|
+
* JSON the engine stores.
|
|
7828
|
+
*
|
|
7829
|
+
* A kind is declared ONCE, next to the code that owns it, and the engine's
|
|
7830
|
+
* reconciler creates its indexes - nothing creates DDL at runtime from a write.
|
|
7831
|
+
* Everything the generic machinery needs (secret fields, the entry descriptor)
|
|
7832
|
+
* is DERIVED from the Zod schema: `.meta({ secret: true })` marks a credential,
|
|
7833
|
+
* never a field name (D879).
|
|
7834
|
+
*/
|
|
7835
|
+
/** A JSON field path: `trackId`, `auth.accessToken`. Charset-restricted: it is rendered into DDL. */
|
|
7836
|
+
var RecordFieldPathSchema = string().regex(/^[A-Za-z_][A-Za-z0-9_]{0,63}(\.[A-Za-z_][A-Za-z0-9_]{0,63}){0,3}$/);
|
|
7837
|
+
var RecordIndexSchema = object({
|
|
7838
|
+
name: string().regex(/^[a-z][a-z0-9_]{0,31}$/),
|
|
7839
|
+
fields: array(RecordFieldPathSchema).min(1).max(4),
|
|
7840
|
+
unique: boolean().optional()
|
|
7841
|
+
}).strict();
|
|
7842
|
+
var RecordRetentionSchema = union([
|
|
7843
|
+
object({
|
|
7844
|
+
ttlMs: number().int().positive(),
|
|
7845
|
+
from: _enum(["at", "write"])
|
|
7846
|
+
}).strict(),
|
|
7847
|
+
object({
|
|
7848
|
+
maxRows: number().int().positive().optional(),
|
|
7849
|
+
maxRowsPerDevice: number().int().positive().optional()
|
|
7850
|
+
}).strict().refine((r) => r.maxRows !== void 0 || r.maxRowsPerDevice !== void 0, { message: "name maxRows, maxRowsPerDevice or both" }),
|
|
7851
|
+
object({
|
|
7852
|
+
owner: string().min(1),
|
|
7853
|
+
reason: string().min(1)
|
|
7854
|
+
}).strict(),
|
|
7855
|
+
object({ none: string().min(1) }).strict()
|
|
7856
|
+
]);
|
|
7857
|
+
/** The descriptor a generic entries UI reads (D881 "generic entries"). */
|
|
7858
|
+
var EntryDescriptorSchema = object({
|
|
7859
|
+
title: string().min(1),
|
|
7860
|
+
/** The record body field shown as the entry's name. */
|
|
7861
|
+
nameField: string().min(1),
|
|
7862
|
+
/** JSON Schema of the entry body; `secret: true` marks a password field. */
|
|
7863
|
+
fields: record(string(), unknown())
|
|
7864
|
+
}).strict();
|
|
7865
|
+
/** What crosses the wire and sits in the engine's catalog: JSON only, no Zod. */
|
|
7866
|
+
var RecordKindDeclarationSchema = object({
|
|
7867
|
+
database: _enum(RECORD_DATABASES).default("settings"),
|
|
7868
|
+
class: _enum(RECORD_CLASSES),
|
|
7869
|
+
writeTrigger: string().min(1),
|
|
7870
|
+
device: _enum([
|
|
7871
|
+
"required",
|
|
7872
|
+
"optional",
|
|
7873
|
+
"none"
|
|
7874
|
+
]).default("none"),
|
|
7875
|
+
at: _enum(["required", "none"]).default("none"),
|
|
7876
|
+
indexes: array(RecordIndexSchema).max(8).default([]),
|
|
7877
|
+
retention: RecordRetentionSchema,
|
|
7878
|
+
deviceRemoval: _enum(["delete", "none"]).default("none"),
|
|
7879
|
+
maxDataBytes: number().int().positive().max(RECORD_MAX_DATA_BYTES).default(RECORD_DEFAULT_MAX_DATA_BYTES),
|
|
7880
|
+
/** Derived from the Zod schema; never written by hand. */
|
|
7881
|
+
secretPaths: array(string().min(1)).default([]),
|
|
7882
|
+
/** The id key of each array that carries a secret (`{ headers: 'name' }`). */
|
|
7883
|
+
secretArrayKeys: record(string(), string()).default({}),
|
|
7884
|
+
/** The legacy table this kind adopts from; the boot guard reads it (D853: no migration code). */
|
|
7885
|
+
adoptsFrom: string().min(1).optional(),
|
|
7886
|
+
/** Kinds that must agree through `transact` sit in one file under one family name. */
|
|
7887
|
+
transactFamily: string().min(1).optional(),
|
|
7888
|
+
entry: EntryDescriptorSchema.optional()
|
|
7889
|
+
}).strict();
|
|
7890
|
+
/** The kind names: lower-case, dash separated, short enough for an index name. */
|
|
7891
|
+
var RecordKindNameSchema = string().regex(/^[a-z][a-z0-9-]{0,47}$/);
|
|
7809
7892
|
/** Shared Zod schemas used across streaming capabilities. */
|
|
7810
7893
|
var CamProfileSchema = _enum([
|
|
7811
7894
|
"high",
|
|
@@ -15462,6 +15545,41 @@ var ComposableCapabilitiesSchema = object({ caps: array(object({
|
|
|
15462
15545
|
keyField: string()
|
|
15463
15546
|
}).optional()
|
|
15464
15547
|
})) });
|
|
15548
|
+
/**
|
|
15549
|
+
* The report of a one-shot "move this owner's plaintext secrets into the
|
|
15550
|
+
* keychain" run (D878). COUNTS only - never a value, never a ref.
|
|
15551
|
+
*
|
|
15552
|
+
* The owner runs it on its own rows, through its own write path; an operator
|
|
15553
|
+
* script (`scripts/hub/migrate-raw-secrets.ts`) calls the owner's cap method.
|
|
15554
|
+
* Dry run (`apply: false`) reports what WOULD move and changes nothing.
|
|
15555
|
+
*/
|
|
15556
|
+
var RawSecretMigrationInputSchema = object({
|
|
15557
|
+
/** `false` (the default of the script) = report only. */
|
|
15558
|
+
apply: boolean() });
|
|
15559
|
+
var RawSecretMigrationReportSchema = object({
|
|
15560
|
+
apply: boolean(),
|
|
15561
|
+
/** Rows that can carry a secret (a profile, an enrolment). */
|
|
15562
|
+
rows: number().int(),
|
|
15563
|
+
/** Rows whose secret was plaintext when the run started. */
|
|
15564
|
+
raw: number().int(),
|
|
15565
|
+
/** Rows that already held a keychain marker when the run started. */
|
|
15566
|
+
markers: number().int(),
|
|
15567
|
+
/** Plaintext rows moved by THIS run (always 0 on a dry run). */
|
|
15568
|
+
migrated: number().int(),
|
|
15569
|
+
/** Plaintext rows left in place because the move or its read-back failed. */
|
|
15570
|
+
failed: number().int(),
|
|
15571
|
+
/** After the run: rows still holding plaintext. */
|
|
15572
|
+
remainingRaw: number().int(),
|
|
15573
|
+
/** After the run: markers the keychain could not resolve right now. */
|
|
15574
|
+
unresolvedMarkers: number().int(),
|
|
15575
|
+
/**
|
|
15576
|
+
* A second, redundant copy of the secrets' rows that the run found (and, on
|
|
15577
|
+
* `apply`, deleted after verifying the first). Owners with a single copy omit it.
|
|
15578
|
+
*/
|
|
15579
|
+
redundantCopies: number().int().optional(),
|
|
15580
|
+
/** True when nothing is raw and every marker resolves. */
|
|
15581
|
+
verified: boolean()
|
|
15582
|
+
});
|
|
15465
15583
|
/** Where a block runs. The operator chooses — a block driving a device on an
|
|
15466
15584
|
* agent is the reason placement is not fixed to the hub. */
|
|
15467
15585
|
var CoreBlockPlacementSchema = union([literal("hub"), string().min(1)]);
|
|
@@ -15688,6 +15806,9 @@ method(object({}), object({ blocks: array(CoreBlockSchema) }), { auth: "admin" }
|
|
|
15688
15806
|
}), SettingsUpdateResultSchema, {
|
|
15689
15807
|
kind: "mutation",
|
|
15690
15808
|
auth: "admin"
|
|
15809
|
+
}), method(RawSecretMigrationInputSchema, RawSecretMigrationReportSchema, {
|
|
15810
|
+
kind: "mutation",
|
|
15811
|
+
auth: "admin"
|
|
15691
15812
|
}), method(object({}), object({ libs: array(object({
|
|
15692
15813
|
filePath: string(),
|
|
15693
15814
|
content: string()
|
|
@@ -15950,6 +16071,222 @@ id: union([string(), number()]) }), {
|
|
|
15950
16071
|
kind: "mutation",
|
|
15951
16072
|
auth: "admin"
|
|
15952
16073
|
});
|
|
16074
|
+
/**
|
|
16075
|
+
* records - an addon's own facts and documents (D881): ledgers, audit rows,
|
|
16076
|
+
* config documents, mirrors. The third storage API next to `ctx.settings`
|
|
16077
|
+
* (operator intent, D870) and device-history (numbers over time, D850).
|
|
16078
|
+
*
|
|
16079
|
+
* Who the OWNER is: `callerAddonId`, stamped by the transport on a call that
|
|
16080
|
+
* crossed a process and stated by a hub in-process caller (`ctx.records` does
|
|
16081
|
+
* that with the addon id closed over). It is deliberately NOT in any input
|
|
16082
|
+
* schema, so a session can never supply it, and a call with no stamp is refused
|
|
16083
|
+
* `records/no-caller`. A kind is readable and writable only by its owner; other
|
|
16084
|
+
* addons go through the owner's capability.
|
|
16085
|
+
*
|
|
16086
|
+
* Every read is three-way: a row, `null`, or the call THROWS. A failed read is
|
|
16087
|
+
* never `[]`. Secret fields are never on the wire: a read shows the
|
|
16088
|
+
* redaction token, `secretRefs` hands the owner's `ctx.secrets` the refs it
|
|
16089
|
+
* resolves itself, and a write may carry only a keychain marker bound to the
|
|
16090
|
+
* row's own ref.
|
|
16091
|
+
*
|
|
16092
|
+
* Internal: addons reach it through `ctx.records`, never directly.
|
|
16093
|
+
*/
|
|
16094
|
+
var RecordIdSchema = string().min(1).max(256);
|
|
16095
|
+
/** A JSON object body. Size is the engine's check (`maxDataBytes`), not a schema's. */
|
|
16096
|
+
var RecordBodySchema = record(string(), unknown());
|
|
16097
|
+
var RecordInputSchema = object({
|
|
16098
|
+
id: RecordIdSchema,
|
|
16099
|
+
/** The device this row belongs to (D865 removal, per-device reads). */
|
|
16100
|
+
deviceId: number().int().optional(),
|
|
16101
|
+
/** The domain clock, ms: observed / created / opened. */
|
|
16102
|
+
at: number().int().optional(),
|
|
16103
|
+
/** Producer-set expiry, ms. Refused on a kind whose retention is an engine TTL. */
|
|
16104
|
+
expiresAt: number().int().optional(),
|
|
16105
|
+
data: RecordBodySchema
|
|
16106
|
+
});
|
|
16107
|
+
var RecordViewSchema = object({
|
|
16108
|
+
id: string(),
|
|
16109
|
+
deviceId: number().int().nullable(),
|
|
16110
|
+
at: number().nullable(),
|
|
16111
|
+
expiresAt: number().nullable(),
|
|
16112
|
+
rev: number().int(),
|
|
16113
|
+
updatedAt: number(),
|
|
16114
|
+
data: RecordBodySchema
|
|
16115
|
+
});
|
|
16116
|
+
/** Declared index fields only. Anything else does not compile, by design. */
|
|
16117
|
+
var RecordWhereSchema = record(RecordFieldPathSchema, union([
|
|
16118
|
+
string(),
|
|
16119
|
+
number(),
|
|
16120
|
+
boolean(),
|
|
16121
|
+
object({ in: array(union([
|
|
16122
|
+
string(),
|
|
16123
|
+
number(),
|
|
16124
|
+
boolean()
|
|
16125
|
+
])).min(1).max(RECORD_BATCH_MAX) }),
|
|
16126
|
+
object({
|
|
16127
|
+
gt: union([string(), number()]).optional(),
|
|
16128
|
+
gte: union([string(), number()]).optional(),
|
|
16129
|
+
lt: union([string(), number()]).optional(),
|
|
16130
|
+
lte: union([string(), number()]).optional()
|
|
16131
|
+
}).refine((r) => Object.keys(r).length > 0, { message: "name at least one bound" })
|
|
16132
|
+
]));
|
|
16133
|
+
var KindShape = { kind: RecordKindNameSchema };
|
|
16134
|
+
var TimeWindowShape = {
|
|
16135
|
+
deviceId: number().int().optional(),
|
|
16136
|
+
atFrom: number().optional(),
|
|
16137
|
+
atTo: number().optional()
|
|
16138
|
+
};
|
|
16139
|
+
var RecordQueryInputSchema = object({
|
|
16140
|
+
...KindShape,
|
|
16141
|
+
...TimeWindowShape,
|
|
16142
|
+
where: RecordWhereSchema.optional(),
|
|
16143
|
+
/** Without `where`: `at` (default for a kind with a clock) or `id`. With `where` the order is the index's. */
|
|
16144
|
+
order: _enum(["at", "id"]).optional(),
|
|
16145
|
+
desc: boolean().optional(),
|
|
16146
|
+
limit: number().int().min(1).max(RECORD_QUERY_MAX).default(100),
|
|
16147
|
+
/** Opaque keyset cursor from a previous answer. There is no offset. */
|
|
16148
|
+
cursor: string().min(1).optional()
|
|
16149
|
+
});
|
|
16150
|
+
var RecordQueryResultSchema = object({
|
|
16151
|
+
records: array(RecordViewSchema),
|
|
16152
|
+
nextCursor: string().nullable()
|
|
16153
|
+
});
|
|
16154
|
+
var RecordKindStateSchema = _enum([
|
|
16155
|
+
"created",
|
|
16156
|
+
"unchanged",
|
|
16157
|
+
"updated"
|
|
16158
|
+
]);
|
|
16159
|
+
var DeclareKindResultSchema = object({
|
|
16160
|
+
kindId: number().int(),
|
|
16161
|
+
state: RecordKindStateSchema,
|
|
16162
|
+
createdIndexes: array(string()),
|
|
16163
|
+
/** The boot guard: the kind is empty while its legacy table still holds rows. */
|
|
16164
|
+
adoptionPending: object({
|
|
16165
|
+
legacyTable: string(),
|
|
16166
|
+
legacyRows: number().int()
|
|
16167
|
+
}).nullable()
|
|
16168
|
+
});
|
|
16169
|
+
/** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
|
|
16170
|
+
var SecretRefsList = array(string());
|
|
16171
|
+
var RecordSecretRefsSchema = record(string(), record(string(), string()));
|
|
16172
|
+
method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
|
|
16173
|
+
kind: "mutation",
|
|
16174
|
+
auth: "admin"
|
|
16175
|
+
}), method(object({
|
|
16176
|
+
...KindShape,
|
|
16177
|
+
id: RecordIdSchema
|
|
16178
|
+
}), RecordViewSchema.nullable(), { auth: "admin" }), method(object({
|
|
16179
|
+
...KindShape,
|
|
16180
|
+
ids: array(RecordIdSchema).min(1).max(RECORD_BATCH_MAX)
|
|
16181
|
+
}), array(RecordViewSchema), { auth: "admin" }), method(object({
|
|
16182
|
+
...KindShape,
|
|
16183
|
+
ids: array(RecordIdSchema).min(1).max(RECORD_BATCH_MAX)
|
|
16184
|
+
}), RecordSecretRefsSchema, { auth: "admin" }), method(object({
|
|
16185
|
+
...KindShape,
|
|
16186
|
+
record: RecordInputSchema,
|
|
16187
|
+
/** Compare-and-set. `0` means "the row must not exist". */
|
|
16188
|
+
ifRev: number().int().min(0).optional()
|
|
16189
|
+
}), object({
|
|
16190
|
+
rev: number().int(),
|
|
16191
|
+
releasedRefs: SecretRefsList
|
|
16192
|
+
}), {
|
|
16193
|
+
kind: "mutation",
|
|
16194
|
+
auth: "admin"
|
|
16195
|
+
}), method(object({
|
|
16196
|
+
...KindShape,
|
|
16197
|
+
records: array(RecordInputSchema).min(1).max(RECORD_BATCH_MAX)
|
|
16198
|
+
}), object({
|
|
16199
|
+
count: number().int(),
|
|
16200
|
+
releasedRefs: SecretRefsList
|
|
16201
|
+
}), {
|
|
16202
|
+
kind: "mutation",
|
|
16203
|
+
auth: "admin"
|
|
16204
|
+
}), method(object({
|
|
16205
|
+
...KindShape,
|
|
16206
|
+
id: RecordIdSchema,
|
|
16207
|
+
data: RecordBodySchema,
|
|
16208
|
+
at: number().int().nullable().optional(),
|
|
16209
|
+
expiresAt: number().int().nullable().optional(),
|
|
16210
|
+
ifRev: number().int().min(1).optional()
|
|
16211
|
+
}), object({
|
|
16212
|
+
rev: number().int(),
|
|
16213
|
+
releasedRefs: SecretRefsList
|
|
16214
|
+
}), {
|
|
16215
|
+
kind: "mutation",
|
|
16216
|
+
auth: "admin"
|
|
16217
|
+
}), method(object({
|
|
16218
|
+
...KindShape,
|
|
16219
|
+
id: RecordIdSchema
|
|
16220
|
+
}), object({
|
|
16221
|
+
deleted: boolean(),
|
|
16222
|
+
secretRefs: SecretRefsList
|
|
16223
|
+
}), {
|
|
16224
|
+
kind: "mutation",
|
|
16225
|
+
auth: "admin"
|
|
16226
|
+
}), method(object({
|
|
16227
|
+
...KindShape,
|
|
16228
|
+
ids: array(RecordIdSchema).min(1).max(RECORD_BATCH_MAX)
|
|
16229
|
+
}), object({
|
|
16230
|
+
deleted: number().int(),
|
|
16231
|
+
secretRefs: SecretRefsList
|
|
16232
|
+
}), {
|
|
16233
|
+
kind: "mutation",
|
|
16234
|
+
auth: "admin"
|
|
16235
|
+
}), method(RecordQueryInputSchema, RecordQueryResultSchema, { auth: "admin" }), method(object({
|
|
16236
|
+
...KindShape,
|
|
16237
|
+
...TimeWindowShape,
|
|
16238
|
+
where: RecordWhereSchema.optional()
|
|
16239
|
+
}), object({ count: number().int() }), { auth: "admin" }), method(object({
|
|
16240
|
+
...KindShape,
|
|
16241
|
+
deviceId: number().int().optional(),
|
|
16242
|
+
from: number(),
|
|
16243
|
+
to: number(),
|
|
16244
|
+
bucketMs: number().int().positive()
|
|
16245
|
+
}), object({ buckets: array(object({
|
|
16246
|
+
bucketStart: number(),
|
|
16247
|
+
count: number().int()
|
|
16248
|
+
})) }), { auth: "admin" }), method(object({
|
|
16249
|
+
...KindShape,
|
|
16250
|
+
op: _enum([
|
|
16251
|
+
"sum",
|
|
16252
|
+
"min",
|
|
16253
|
+
"max",
|
|
16254
|
+
"count"
|
|
16255
|
+
]),
|
|
16256
|
+
field: RecordFieldPathSchema.optional(),
|
|
16257
|
+
groupBy: RecordFieldPathSchema.optional(),
|
|
16258
|
+
where: RecordWhereSchema.optional()
|
|
16259
|
+
}), object({ rows: array(object({
|
|
16260
|
+
group: union([
|
|
16261
|
+
string(),
|
|
16262
|
+
number(),
|
|
16263
|
+
_null()
|
|
16264
|
+
]),
|
|
16265
|
+
value: number().nullable()
|
|
16266
|
+
})) }), { auth: "admin" }), method(object({
|
|
16267
|
+
...KindShape,
|
|
16268
|
+
deviceId: number().int().optional(),
|
|
16269
|
+
atBefore: number().optional(),
|
|
16270
|
+
where: RecordWhereSchema.optional()
|
|
16271
|
+
}), object({
|
|
16272
|
+
deleted: number().int(),
|
|
16273
|
+
secretRefs: SecretRefsList
|
|
16274
|
+
}), {
|
|
16275
|
+
kind: "mutation",
|
|
16276
|
+
auth: "admin"
|
|
16277
|
+
}), method(object({
|
|
16278
|
+
deviceId: number().int(),
|
|
16279
|
+
kinds: array(RecordKindNameSchema).optional()
|
|
16280
|
+
}), object({
|
|
16281
|
+
deleted: record(string(), number().int()),
|
|
16282
|
+
secretRefs: SecretRefsList
|
|
16283
|
+
}), {
|
|
16284
|
+
kind: "mutation",
|
|
16285
|
+
auth: "admin"
|
|
16286
|
+
}), method(object(KindShape), object({ id: number().int() }), {
|
|
16287
|
+
kind: "mutation",
|
|
16288
|
+
auth: "admin"
|
|
16289
|
+
});
|
|
15953
16290
|
/** One table of the settings database. */
|
|
15954
16291
|
var StorageTableSchema = object({
|
|
15955
16292
|
/** The table's full name, e.g. `recorder:addon-settings` or `addon-device-settings`. */
|
|
@@ -15962,6 +16299,28 @@ var StorageTableSchema = object({
|
|
|
15962
16299
|
/** Declared by an addon since this engine process started (a running addon claims it). */
|
|
15963
16300
|
declaredThisBoot: boolean()
|
|
15964
16301
|
});
|
|
16302
|
+
/** One declared record kind (D881) as System -> Data shows it. */
|
|
16303
|
+
var StorageKindSchema = object({
|
|
16304
|
+
owner: string(),
|
|
16305
|
+
kind: string(),
|
|
16306
|
+
database: _enum(["settings", "events"]),
|
|
16307
|
+
class: string(),
|
|
16308
|
+
state: _enum([
|
|
16309
|
+
"declared",
|
|
16310
|
+
"orphaned",
|
|
16311
|
+
"dropped"
|
|
16312
|
+
]),
|
|
16313
|
+
/** `null` when the caller asked for no counts (`counts: false`). */
|
|
16314
|
+
rows: number().int().nonnegative().nullable(),
|
|
16315
|
+
/** Rows x the average size of a sample; null for an empty kind. */
|
|
16316
|
+
bytesEstimate: number().int().nonnegative().nullable(),
|
|
16317
|
+
writeTrigger: string(),
|
|
16318
|
+
retention: RecordRetentionSchema,
|
|
16319
|
+
/** `true` when the kind is an entry kind (the generic entries UI lists it). */
|
|
16320
|
+
entry: boolean(),
|
|
16321
|
+
/** The whole declaration, secret paths and entry descriptor included (the entries service builds its handle from it). */
|
|
16322
|
+
declaration: RecordKindDeclarationSchema
|
|
16323
|
+
});
|
|
15965
16324
|
method(object({ ownerPrefix: string().min(1).optional() }), object({ tables: array(StorageTableSchema) }), { auth: "admin" }), method(object({
|
|
15966
16325
|
collection: string().min(1),
|
|
15967
16326
|
expectRows: number().int().nonnegative()
|
|
@@ -15971,6 +16330,77 @@ method(object({ ownerPrefix: string().min(1).optional() }), object({ tables: arr
|
|
|
15971
16330
|
}), {
|
|
15972
16331
|
kind: "mutation",
|
|
15973
16332
|
auth: "admin"
|
|
16333
|
+
}), method(object({
|
|
16334
|
+
owner: string().min(1).optional(),
|
|
16335
|
+
/** `false` skips the per-kind row count (a catalog read only). Default true. */
|
|
16336
|
+
counts: boolean().optional()
|
|
16337
|
+
}), object({ kinds: array(StorageKindSchema) }), { auth: "admin" }), method(RecordQueryInputSchema.extend({
|
|
16338
|
+
owner: string().min(1),
|
|
16339
|
+
kind: RecordKindNameSchema
|
|
16340
|
+
}), RecordQueryResultSchema, { auth: "admin" }), method(object({
|
|
16341
|
+
owner: string().min(1),
|
|
16342
|
+
kind: RecordKindNameSchema,
|
|
16343
|
+
records: array(RecordInputSchema).min(1).max(RECORD_BATCH_MAX),
|
|
16344
|
+
/** The LAST batch: the copy is complete, the boot guard stops asking. */
|
|
16345
|
+
complete: boolean().optional()
|
|
16346
|
+
}), object({ adopted: number().int() }), {
|
|
16347
|
+
kind: "mutation",
|
|
16348
|
+
auth: "admin"
|
|
16349
|
+
});
|
|
16350
|
+
/**
|
|
16351
|
+
* record-entries - the ONE admin surface for every list of user-created entries
|
|
16352
|
+
* (D881): notification targets, brokers, LLM profiles, anything an addon
|
|
16353
|
+
* declares as an ENTRY kind (`entry: { title }` in `defineRecordKinds`).
|
|
16354
|
+
*
|
|
16355
|
+
* The UI is generic. `listEntryKinds` hands it, per kind, the JSON Schema of
|
|
16356
|
+
* the entry body with `secret: true` on every credential field, so a password
|
|
16357
|
+
* field is derived from the schema and never from a name. `putEntry` takes the
|
|
16358
|
+
* redaction token for an untouched secret (the stored value is kept), a string
|
|
16359
|
+
* for a new one, and the clear instruction to remove one. A read never carries
|
|
16360
|
+
* a secret value, and a locked keychain refuses the write with
|
|
16361
|
+
* `records/secret-unavailable` instead of storing plaintext.
|
|
16362
|
+
*
|
|
16363
|
+
* Hub-only, served in-process (it acts for each entry's owner on the keychain).
|
|
16364
|
+
*/
|
|
16365
|
+
var EntryKindInfoSchema = object({
|
|
16366
|
+
owner: string(),
|
|
16367
|
+
kind: RecordKindNameSchema,
|
|
16368
|
+
title: string(),
|
|
16369
|
+
nameField: string(),
|
|
16370
|
+
/** JSON Schema of the body; `secret: true` marks a password field. */
|
|
16371
|
+
fields: record(string(), unknown()),
|
|
16372
|
+
secretPaths: array(string()),
|
|
16373
|
+
rows: number().int().nonnegative()
|
|
16374
|
+
});
|
|
16375
|
+
var EntryViewSchema = object({
|
|
16376
|
+
id: RecordIdSchema,
|
|
16377
|
+
name: string(),
|
|
16378
|
+
rev: number().int(),
|
|
16379
|
+
updatedAt: number(),
|
|
16380
|
+
/** Secret fields hold the redaction token. */
|
|
16381
|
+
data: RecordBodySchema
|
|
16382
|
+
});
|
|
16383
|
+
var EntryAddress = {
|
|
16384
|
+
owner: string().min(1),
|
|
16385
|
+
kind: RecordKindNameSchema
|
|
16386
|
+
};
|
|
16387
|
+
method(object({}), object({ kinds: array(EntryKindInfoSchema) }), { auth: "admin" }), method(object({ ...EntryAddress }), object({ entries: array(EntryViewSchema) }), { auth: "admin" }), method(object({
|
|
16388
|
+
...EntryAddress,
|
|
16389
|
+
id: RecordIdSchema.optional(),
|
|
16390
|
+
data: RecordBodySchema,
|
|
16391
|
+
ifRev: number().int().min(1).optional()
|
|
16392
|
+
}), object({
|
|
16393
|
+
id: string(),
|
|
16394
|
+
rev: number().int()
|
|
16395
|
+
}), {
|
|
16396
|
+
kind: "mutation",
|
|
16397
|
+
auth: "admin"
|
|
16398
|
+
}), method(object({
|
|
16399
|
+
...EntryAddress,
|
|
16400
|
+
id: RecordIdSchema
|
|
16401
|
+
}), object({ deleted: boolean() }), {
|
|
16402
|
+
kind: "mutation",
|
|
16403
|
+
auth: "admin"
|
|
15974
16404
|
});
|
|
15975
16405
|
/**
|
|
15976
16406
|
* `keychain` — the hub's encrypted store of secret values (D787).
|
|
@@ -38808,36 +39238,6 @@ method(LlmRuntimeCompleteInputSchema, LlmGenerateResultSchema, {
|
|
|
38808
39238
|
timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
|
|
38809
39239
|
});
|
|
38810
39240
|
/**
|
|
38811
|
-
* The report of a one-shot "move this owner's plaintext secrets into the
|
|
38812
|
-
* keychain" run (D878). COUNTS only - never a value, never a ref.
|
|
38813
|
-
*
|
|
38814
|
-
* The owner runs it on its own rows, through its own write path; an operator
|
|
38815
|
-
* script (`scripts/hub/migrate-raw-secrets.ts`) calls the owner's cap method.
|
|
38816
|
-
* Dry run (`apply: false`) reports what WOULD move and changes nothing.
|
|
38817
|
-
*/
|
|
38818
|
-
var RawSecretMigrationInputSchema = object({
|
|
38819
|
-
/** `false` (the default of the script) = report only. */
|
|
38820
|
-
apply: boolean() });
|
|
38821
|
-
var RawSecretMigrationReportSchema = object({
|
|
38822
|
-
apply: boolean(),
|
|
38823
|
-
/** Rows that can carry a secret (a profile, an enrolment). */
|
|
38824
|
-
rows: number().int(),
|
|
38825
|
-
/** Rows whose secret was plaintext when the run started. */
|
|
38826
|
-
raw: number().int(),
|
|
38827
|
-
/** Rows that already held a keychain marker when the run started. */
|
|
38828
|
-
markers: number().int(),
|
|
38829
|
-
/** Plaintext rows moved by THIS run (always 0 on a dry run). */
|
|
38830
|
-
migrated: number().int(),
|
|
38831
|
-
/** Plaintext rows left in place because the move or its read-back failed. */
|
|
38832
|
-
failed: number().int(),
|
|
38833
|
-
/** After the run: rows still holding plaintext. */
|
|
38834
|
-
remainingRaw: number().int(),
|
|
38835
|
-
/** After the run: markers the keychain could not resolve right now. */
|
|
38836
|
-
unresolvedMarkers: number().int(),
|
|
38837
|
-
/** True when nothing is raw and every marker resolves. */
|
|
38838
|
-
verified: boolean()
|
|
38839
|
-
});
|
|
38840
|
-
/**
|
|
38841
39241
|
* `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
|
|
38842
39242
|
* methods concat-fan across providers; single-row methods route to ONE
|
|
38843
39243
|
* provider by the `addonId` in the call input (the notification-output
|
|
@@ -62296,6 +62696,12 @@ Object.freeze({
|
|
|
62296
62696
|
addonId: null,
|
|
62297
62697
|
access: "view"
|
|
62298
62698
|
},
|
|
62699
|
+
"coreBlocks.migrateRawSecrets": {
|
|
62700
|
+
capName: "core-blocks",
|
|
62701
|
+
capScope: "system",
|
|
62702
|
+
addonId: null,
|
|
62703
|
+
access: "create"
|
|
62704
|
+
},
|
|
62299
62705
|
"coreBlocks.restart": {
|
|
62300
62706
|
capName: "core-blocks",
|
|
62301
62707
|
capScope: "system",
|
|
@@ -67048,6 +67454,30 @@ Object.freeze({
|
|
|
67048
67454
|
addonId: null,
|
|
67049
67455
|
access: "create"
|
|
67050
67456
|
},
|
|
67457
|
+
"recordEntries.deleteEntry": {
|
|
67458
|
+
capName: "record-entries",
|
|
67459
|
+
capScope: "system",
|
|
67460
|
+
addonId: null,
|
|
67461
|
+
access: "delete"
|
|
67462
|
+
},
|
|
67463
|
+
"recordEntries.listEntries": {
|
|
67464
|
+
capName: "record-entries",
|
|
67465
|
+
capScope: "system",
|
|
67466
|
+
addonId: null,
|
|
67467
|
+
access: "view"
|
|
67468
|
+
},
|
|
67469
|
+
"recordEntries.listEntryKinds": {
|
|
67470
|
+
capName: "record-entries",
|
|
67471
|
+
capScope: "system",
|
|
67472
|
+
addonId: null,
|
|
67473
|
+
access: "view"
|
|
67474
|
+
},
|
|
67475
|
+
"recordEntries.putEntry": {
|
|
67476
|
+
capName: "record-entries",
|
|
67477
|
+
capScope: "system",
|
|
67478
|
+
addonId: null,
|
|
67479
|
+
access: "create"
|
|
67480
|
+
},
|
|
67051
67481
|
"recording.getAvailability": {
|
|
67052
67482
|
capName: "recording",
|
|
67053
67483
|
capScope: "device",
|
|
@@ -67348,6 +67778,102 @@ Object.freeze({
|
|
|
67348
67778
|
addonId: null,
|
|
67349
67779
|
access: "view"
|
|
67350
67780
|
},
|
|
67781
|
+
"records.aggregate": {
|
|
67782
|
+
capName: "records",
|
|
67783
|
+
capScope: "system",
|
|
67784
|
+
addonId: null,
|
|
67785
|
+
access: "view"
|
|
67786
|
+
},
|
|
67787
|
+
"records.allocateId": {
|
|
67788
|
+
capName: "records",
|
|
67789
|
+
capScope: "system",
|
|
67790
|
+
addonId: null,
|
|
67791
|
+
access: "create"
|
|
67792
|
+
},
|
|
67793
|
+
"records.count": {
|
|
67794
|
+
capName: "records",
|
|
67795
|
+
capScope: "system",
|
|
67796
|
+
addonId: null,
|
|
67797
|
+
access: "view"
|
|
67798
|
+
},
|
|
67799
|
+
"records.declareKinds": {
|
|
67800
|
+
capName: "records",
|
|
67801
|
+
capScope: "system",
|
|
67802
|
+
addonId: null,
|
|
67803
|
+
access: "create"
|
|
67804
|
+
},
|
|
67805
|
+
"records.delete": {
|
|
67806
|
+
capName: "records",
|
|
67807
|
+
capScope: "system",
|
|
67808
|
+
addonId: null,
|
|
67809
|
+
access: "delete"
|
|
67810
|
+
},
|
|
67811
|
+
"records.deleteDevice": {
|
|
67812
|
+
capName: "records",
|
|
67813
|
+
capScope: "system",
|
|
67814
|
+
addonId: null,
|
|
67815
|
+
access: "delete"
|
|
67816
|
+
},
|
|
67817
|
+
"records.deleteMany": {
|
|
67818
|
+
capName: "records",
|
|
67819
|
+
capScope: "system",
|
|
67820
|
+
addonId: null,
|
|
67821
|
+
access: "delete"
|
|
67822
|
+
},
|
|
67823
|
+
"records.deleteWhere": {
|
|
67824
|
+
capName: "records",
|
|
67825
|
+
capScope: "system",
|
|
67826
|
+
addonId: null,
|
|
67827
|
+
access: "delete"
|
|
67828
|
+
},
|
|
67829
|
+
"records.get": {
|
|
67830
|
+
capName: "records",
|
|
67831
|
+
capScope: "system",
|
|
67832
|
+
addonId: null,
|
|
67833
|
+
access: "view"
|
|
67834
|
+
},
|
|
67835
|
+
"records.getMany": {
|
|
67836
|
+
capName: "records",
|
|
67837
|
+
capScope: "system",
|
|
67838
|
+
addonId: null,
|
|
67839
|
+
access: "view"
|
|
67840
|
+
},
|
|
67841
|
+
"records.histogram": {
|
|
67842
|
+
capName: "records",
|
|
67843
|
+
capScope: "system",
|
|
67844
|
+
addonId: null,
|
|
67845
|
+
access: "view"
|
|
67846
|
+
},
|
|
67847
|
+
"records.patch": {
|
|
67848
|
+
capName: "records",
|
|
67849
|
+
capScope: "system",
|
|
67850
|
+
addonId: null,
|
|
67851
|
+
access: "create"
|
|
67852
|
+
},
|
|
67853
|
+
"records.put": {
|
|
67854
|
+
capName: "records",
|
|
67855
|
+
capScope: "system",
|
|
67856
|
+
addonId: null,
|
|
67857
|
+
access: "create"
|
|
67858
|
+
},
|
|
67859
|
+
"records.putMany": {
|
|
67860
|
+
capName: "records",
|
|
67861
|
+
capScope: "system",
|
|
67862
|
+
addonId: null,
|
|
67863
|
+
access: "create"
|
|
67864
|
+
},
|
|
67865
|
+
"records.query": {
|
|
67866
|
+
capName: "records",
|
|
67867
|
+
capScope: "system",
|
|
67868
|
+
addonId: null,
|
|
67869
|
+
access: "view"
|
|
67870
|
+
},
|
|
67871
|
+
"records.secretRefs": {
|
|
67872
|
+
capName: "records",
|
|
67873
|
+
capScope: "system",
|
|
67874
|
+
addonId: null,
|
|
67875
|
+
access: "view"
|
|
67876
|
+
},
|
|
67351
67877
|
"sceneMonitor.captureReference": {
|
|
67352
67878
|
capName: "scene-monitor",
|
|
67353
67879
|
capScope: "device",
|
|
@@ -67780,18 +68306,36 @@ Object.freeze({
|
|
|
67780
68306
|
addonId: null,
|
|
67781
68307
|
access: "create"
|
|
67782
68308
|
},
|
|
68309
|
+
"storageAdmin.adoptRecords": {
|
|
68310
|
+
capName: "storage-admin",
|
|
68311
|
+
capScope: "system",
|
|
68312
|
+
addonId: null,
|
|
68313
|
+
access: "create"
|
|
68314
|
+
},
|
|
67783
68315
|
"storageAdmin.dropCollection": {
|
|
67784
68316
|
capName: "storage-admin",
|
|
67785
68317
|
capScope: "system",
|
|
67786
68318
|
addonId: null,
|
|
67787
68319
|
access: "delete"
|
|
67788
68320
|
},
|
|
68321
|
+
"storageAdmin.listKinds": {
|
|
68322
|
+
capName: "storage-admin",
|
|
68323
|
+
capScope: "system",
|
|
68324
|
+
addonId: null,
|
|
68325
|
+
access: "view"
|
|
68326
|
+
},
|
|
67789
68327
|
"storageAdmin.listTables": {
|
|
67790
68328
|
capName: "storage-admin",
|
|
67791
68329
|
capScope: "system",
|
|
67792
68330
|
addonId: null,
|
|
67793
68331
|
access: "view"
|
|
67794
68332
|
},
|
|
68333
|
+
"storageAdmin.readRecords": {
|
|
68334
|
+
capName: "storage-admin",
|
|
68335
|
+
capScope: "system",
|
|
68336
|
+
addonId: null,
|
|
68337
|
+
access: "view"
|
|
68338
|
+
},
|
|
67795
68339
|
"storageEvictable.evict": {
|
|
67796
68340
|
capName: "storage-evictable",
|
|
67797
68341
|
capScope: "system",
|
|
@@ -71386,6 +71930,37 @@ Object.freeze({
|
|
|
71386
71930
|
form: "single",
|
|
71387
71931
|
optional: false
|
|
71388
71932
|
}],
|
|
71933
|
+
"records.count": [{
|
|
71934
|
+
name: "deviceId",
|
|
71935
|
+
form: "single",
|
|
71936
|
+
optional: true
|
|
71937
|
+
}],
|
|
71938
|
+
"records.deleteDevice": [{
|
|
71939
|
+
name: "deviceId",
|
|
71940
|
+
form: "single",
|
|
71941
|
+
optional: false
|
|
71942
|
+
}],
|
|
71943
|
+
"records.deleteWhere": [{
|
|
71944
|
+
name: "deviceId",
|
|
71945
|
+
form: "single",
|
|
71946
|
+
optional: true
|
|
71947
|
+
}],
|
|
71948
|
+
"records.histogram": [{
|
|
71949
|
+
name: "deviceId",
|
|
71950
|
+
form: "single",
|
|
71951
|
+
optional: true
|
|
71952
|
+
}],
|
|
71953
|
+
"records.putMany": [{
|
|
71954
|
+
name: "records",
|
|
71955
|
+
form: "object-array",
|
|
71956
|
+
optional: false,
|
|
71957
|
+
itemField: "deviceId"
|
|
71958
|
+
}],
|
|
71959
|
+
"records.query": [{
|
|
71960
|
+
name: "deviceId",
|
|
71961
|
+
form: "single",
|
|
71962
|
+
optional: true
|
|
71963
|
+
}],
|
|
71389
71964
|
"sceneMonitor.captureReference": [{
|
|
71390
71965
|
name: "deviceId",
|
|
71391
71966
|
form: "single",
|
|
@@ -71502,6 +72077,17 @@ Object.freeze({
|
|
|
71502
72077
|
form: "single",
|
|
71503
72078
|
optional: false
|
|
71504
72079
|
}],
|
|
72080
|
+
"storageAdmin.adoptRecords": [{
|
|
72081
|
+
name: "records",
|
|
72082
|
+
form: "object-array",
|
|
72083
|
+
optional: false,
|
|
72084
|
+
itemField: "deviceId"
|
|
72085
|
+
}],
|
|
72086
|
+
"storageAdmin.readRecords": [{
|
|
72087
|
+
name: "deviceId",
|
|
72088
|
+
form: "single",
|
|
72089
|
+
optional: true
|
|
72090
|
+
}],
|
|
71505
72091
|
"streamBroker.acquireEgressTranscode": [{
|
|
71506
72092
|
name: "deviceId",
|
|
71507
72093
|
form: "single",
|
|
@@ -72970,7 +73556,7 @@ var AdminUIAddon = class extends BaseAddon {
|
|
|
72970
73556
|
capability: adminUiCapability,
|
|
72971
73557
|
provider: {
|
|
72972
73558
|
getStaticDir: async () => ({ staticDir: resolveAdminUiDistDir() }),
|
|
72973
|
-
getVersion: async () => ({ version: "1.2.
|
|
73559
|
+
getVersion: async () => ({ version: "1.2.435" })
|
|
72974
73560
|
}
|
|
72975
73561
|
}];
|
|
72976
73562
|
}
|