@camstack/addon-post-analysis 1.2.372 → 1.2.374
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/{clip-model-registry-YcxOhKAs.mjs → clip-model-registry-BIJ0ZD7t.mjs} +816 -90
- package/dist/{clip-model-registry-CJMlelSr.js → clip-model-registry-BRzN2GzR.js} +816 -90
- package/dist/embedding-encoder/index.js +1 -1
- package/dist/embedding-encoder/index.mjs +1 -1
- package/dist/pipeline-analytics/_stub.js +2 -2
- package/dist/pipeline-analytics/{_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-jrYcQzE9.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-BYu-s1rf.mjs} +2 -2
- package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-Ds_wGoAi.mjs +26 -0
- package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-BjCURGur.mjs +26 -0
- package/dist/pipeline-analytics/{hostInit-D3mojFCX.mjs → hostInit-DEl2xA0o.mjs} +2 -2
- package/dist/pipeline-analytics/index.js +55 -206
- package/dist/pipeline-analytics/index.mjs +55 -206
- package/dist/pipeline-analytics/remoteEntry.js +1 -1
- package/package.json +1 -1
- package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BrZNQ-qA.mjs +0 -26
- package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-XFjQPo0r.mjs +0 -26
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
-
//#region ../types/dist/event-category-
|
|
2
|
+
//#region ../types/dist/event-category-BvOFi6PY.mjs
|
|
3
3
|
var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
4
4
|
EventCategory["SystemBoot"] = "system.boot";
|
|
5
5
|
EventCategory["SystemAddonsReady"] = "system.addons-ready";
|
|
@@ -63,6 +63,24 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
|
63
63
|
* consumes this category and maps it to the `addon-crash-loop` kind.
|
|
64
64
|
*/
|
|
65
65
|
EventCategory["AddonRunnerFailed"] = "addon.runner-failed";
|
|
66
|
+
/**
|
|
67
|
+
* A runner whose addon refused to start with a typed reason (D877) - parked
|
|
68
|
+
* in `refused`, never counted by the crash breaker, retried on operator
|
|
69
|
+
* action. One event per refusal.
|
|
70
|
+
*/
|
|
71
|
+
EventCategory["AddonRunnerRefused"] = "addon.runner-refused";
|
|
72
|
+
/**
|
|
73
|
+
* A runner settled on a state (D877): `running` (READY), `crashed`, `failed` or
|
|
74
|
+
* `refused`. In-process telemetry for the boot check (re-evaluate while any
|
|
75
|
+
* runner is still pending) and the alert centre (close a recovered runner).
|
|
76
|
+
*/
|
|
77
|
+
EventCategory["ProcessStateChanged"] = "process.state-changed";
|
|
78
|
+
/**
|
|
79
|
+
* The node's one-shot runner boot check (D877): planned runners against the
|
|
80
|
+
* process service, `degraded` when any is failed, refused or missing. The
|
|
81
|
+
* alert centre turns it into one alert and a direct critical push.
|
|
82
|
+
*/
|
|
83
|
+
EventCategory["SystemRunnerCheck"] = "system.runner-check";
|
|
66
84
|
EventCategory["AddonError"] = "addon.error";
|
|
67
85
|
EventCategory["AddonPageReady"] = "addon.page-ready";
|
|
68
86
|
EventCategory["AddonWidgetReady"] = "addon.widget-ready";
|
|
@@ -5459,7 +5477,7 @@ var ZodIssueCode = {
|
|
|
5459
5477
|
var ZodFirstPartyTypeKind;
|
|
5460
5478
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
5461
5479
|
//#endregion
|
|
5462
|
-
//#region ../types/dist/sleep-
|
|
5480
|
+
//#region ../types/dist/sleep-WsrozGDL.mjs
|
|
5463
5481
|
/**
|
|
5464
5482
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
5465
5483
|
* window to float samples (D455).
|
|
@@ -5576,7 +5594,7 @@ function isKeychainStoredField(field) {
|
|
|
5576
5594
|
var SECRET_CLEAR = { $secretClear: true };
|
|
5577
5595
|
/** The `'***'` token D634 redaction writes for non-admins. */
|
|
5578
5596
|
var LEGACY_DEVICE_REDACTION = "***";
|
|
5579
|
-
function isRecord$
|
|
5597
|
+
function isRecord$4(value) {
|
|
5580
5598
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
5581
5599
|
}
|
|
5582
5600
|
function makeSecretMarker(ref) {
|
|
@@ -5587,12 +5605,12 @@ function makeSecretMarker(ref) {
|
|
|
5587
5605
|
}
|
|
5588
5606
|
/** A stored marker: an object whose `$secret` is a non-empty string. */
|
|
5589
5607
|
function isSecretMarker(value) {
|
|
5590
|
-
if (!isRecord$
|
|
5608
|
+
if (!isRecord$4(value)) return false;
|
|
5591
5609
|
const ref = value["$secret"];
|
|
5592
5610
|
return typeof ref === "string" && ref.length > 0;
|
|
5593
5611
|
}
|
|
5594
5612
|
function isSecretClear(value) {
|
|
5595
|
-
return isRecord$
|
|
5613
|
+
return isRecord$4(value) && value["$secretClear"] === true;
|
|
5596
5614
|
}
|
|
5597
5615
|
/**
|
|
5598
5616
|
* The UI view of a stored secret field value: a marker becomes "set", inline
|
|
@@ -6202,7 +6220,7 @@ var KeychainWriteRefusedError = class extends Error {
|
|
|
6202
6220
|
}
|
|
6203
6221
|
};
|
|
6204
6222
|
var KEEP = { kind: "keep" };
|
|
6205
|
-
function isRecord$
|
|
6223
|
+
function isRecord$3(value) {
|
|
6206
6224
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
6207
6225
|
}
|
|
6208
6226
|
function defaultMintId() {
|
|
@@ -6215,7 +6233,7 @@ function collectSecretMarkerRefs(value, out = []) {
|
|
|
6215
6233
|
return out;
|
|
6216
6234
|
}
|
|
6217
6235
|
if (Array.isArray(value)) for (const item of value) collectSecretMarkerRefs(item, out);
|
|
6218
|
-
else if (isRecord$
|
|
6236
|
+
else if (isRecord$3(value)) for (const child of Object.values(value)) collectSecretMarkerRefs(child, out);
|
|
6219
6237
|
return out;
|
|
6220
6238
|
}
|
|
6221
6239
|
async function storedValueEquals(secrets, marker, candidate) {
|
|
@@ -6270,7 +6288,7 @@ function rowId(row, idKey) {
|
|
|
6270
6288
|
return null;
|
|
6271
6289
|
}
|
|
6272
6290
|
async function writeArray(ctx, node, incoming, stored, fieldPath) {
|
|
6273
|
-
const storedRows = Array.isArray(stored) ? stored.filter(isRecord$
|
|
6291
|
+
const storedRows = Array.isArray(stored) ? stored.filter(isRecord$3) : [];
|
|
6274
6292
|
if (!Array.isArray(incoming)) {
|
|
6275
6293
|
ctx.deletes.push(...collectSecretMarkerRefs(storedRows));
|
|
6276
6294
|
return {
|
|
@@ -6286,7 +6304,7 @@ async function writeArray(ctx, node, incoming, stored, fieldPath) {
|
|
|
6286
6304
|
const kept = /* @__PURE__ */ new Set();
|
|
6287
6305
|
const rows = [];
|
|
6288
6306
|
for (const row of incoming) {
|
|
6289
|
-
if (!isRecord$
|
|
6307
|
+
if (!isRecord$3(row)) {
|
|
6290
6308
|
rows.push(row);
|
|
6291
6309
|
continue;
|
|
6292
6310
|
}
|
|
@@ -6311,7 +6329,7 @@ async function writeNode(ctx, node, incoming, stored, fieldPath) {
|
|
|
6311
6329
|
case "leaf": return writeLeaf(ctx, incoming, stored, fieldPath);
|
|
6312
6330
|
case "array": return writeArray(ctx, node, incoming, stored, fieldPath);
|
|
6313
6331
|
case "object": {
|
|
6314
|
-
if (!isRecord$
|
|
6332
|
+
if (!isRecord$3(incoming)) {
|
|
6315
6333
|
if (incoming === void 0) return KEEP;
|
|
6316
6334
|
ctx.deletes.push(...collectSecretMarkerRefs(stored));
|
|
6317
6335
|
return {
|
|
@@ -6319,7 +6337,7 @@ async function writeNode(ctx, node, incoming, stored, fieldPath) {
|
|
|
6319
6337
|
value: incoming
|
|
6320
6338
|
};
|
|
6321
6339
|
}
|
|
6322
|
-
const storedObj = isRecord$
|
|
6340
|
+
const storedObj = isRecord$3(stored) ? stored : {};
|
|
6323
6341
|
return {
|
|
6324
6342
|
kind: "value",
|
|
6325
6343
|
value: await writeMembers(ctx, node.children, incoming, storedObj, (m) => `${fieldPath}.${m}`)
|
|
@@ -6442,7 +6460,7 @@ async function resolveSecretMarkers(value, secrets, options = {}) {
|
|
|
6442
6460
|
value: items
|
|
6443
6461
|
};
|
|
6444
6462
|
}
|
|
6445
|
-
if (isRecord$
|
|
6463
|
+
if (isRecord$3(v)) {
|
|
6446
6464
|
const out = {};
|
|
6447
6465
|
for (const [k, child] of Object.entries(v)) {
|
|
6448
6466
|
const s = substitute(child);
|
|
@@ -6474,7 +6492,7 @@ var SecretOverwriteRefusedError = class extends Error {
|
|
|
6474
6492
|
this.name = "SecretOverwriteRefusedError";
|
|
6475
6493
|
}
|
|
6476
6494
|
};
|
|
6477
|
-
function isRecord(value) {
|
|
6495
|
+
function isRecord$2(value) {
|
|
6478
6496
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
6479
6497
|
}
|
|
6480
6498
|
function resolvedValue(pass, marker) {
|
|
@@ -6503,7 +6521,7 @@ function inArray(pass, incoming, stored) {
|
|
|
6503
6521
|
return incoming.map((item, index) => {
|
|
6504
6522
|
const twin = stored[index];
|
|
6505
6523
|
if (isSecretMarker(twin)) return typeof item === "string" && item === resolvedValue(pass, twin) ? twin : item;
|
|
6506
|
-
if (isRecord(item) && isRecord(twin)) return inArrayRow(pass, item, twin);
|
|
6524
|
+
if (isRecord$2(item) && isRecord$2(twin)) return inArrayRow(pass, item, twin);
|
|
6507
6525
|
if (Array.isArray(item) && Array.isArray(twin)) return inArray(pass, item, twin);
|
|
6508
6526
|
return item;
|
|
6509
6527
|
});
|
|
@@ -6514,7 +6532,7 @@ function inArrayRow(pass, incoming, stored) {
|
|
|
6514
6532
|
const twin = stored[key];
|
|
6515
6533
|
if (isSecretMarker(twin)) {
|
|
6516
6534
|
if (typeof value === "string" && value === resolvedValue(pass, twin)) out[key] = twin;
|
|
6517
|
-
} else if (isRecord(value) && isRecord(twin)) out[key] = inArrayRow(pass, value, twin);
|
|
6535
|
+
} else if (isRecord$2(value) && isRecord$2(twin)) out[key] = inArrayRow(pass, value, twin);
|
|
6518
6536
|
else if (Array.isArray(value) && Array.isArray(twin)) out[key] = inArray(pass, value, twin);
|
|
6519
6537
|
}
|
|
6520
6538
|
return out;
|
|
@@ -6522,7 +6540,7 @@ function inArrayRow(pass, incoming, stored) {
|
|
|
6522
6540
|
async function walk(pass, incoming, stored) {
|
|
6523
6541
|
if (isSecretMarker(stored)) return atMarker(pass, incoming, stored);
|
|
6524
6542
|
if (Array.isArray(incoming) && Array.isArray(stored)) return inArray(pass, incoming, stored);
|
|
6525
|
-
if (!isRecord(incoming) || !isRecord(stored)) return incoming;
|
|
6543
|
+
if (!isRecord$2(incoming) || !isRecord$2(stored)) return incoming;
|
|
6526
6544
|
const out = { ...incoming };
|
|
6527
6545
|
for (const [key, value] of Object.entries(incoming)) out[key] = await walk(pass, value, stored[key]);
|
|
6528
6546
|
return out;
|
|
@@ -6553,7 +6571,7 @@ async function restoreUnchangedSecrets(input) {
|
|
|
6553
6571
|
function isJsonEqual(a, b) {
|
|
6554
6572
|
if (Object.is(a, b)) return true;
|
|
6555
6573
|
if (Array.isArray(a)) return Array.isArray(b) && a.length === b.length && a.every((v, i) => isJsonEqual(v, b[i]));
|
|
6556
|
-
if (isRecord(a) && isRecord(b)) {
|
|
6574
|
+
if (isRecord$2(a) && isRecord$2(b)) {
|
|
6557
6575
|
const keys = Object.keys(a);
|
|
6558
6576
|
if (keys.length !== Object.keys(b).length) return false;
|
|
6559
6577
|
return keys.every((k) => Object.prototype.hasOwnProperty.call(b, k) && isJsonEqual(a[k], b[k]));
|
|
@@ -6577,7 +6595,7 @@ function markerKeysOf(blob, owner) {
|
|
|
6577
6595
|
}
|
|
6578
6596
|
function nodeFromStored(value, owner) {
|
|
6579
6597
|
if (isSecretMarker(value)) return isSecretRefOwnedBy(value.$secret, owner) ? { kind: "leaf" } : null;
|
|
6580
|
-
if (!isRecord(value)) return null;
|
|
6598
|
+
if (!isRecord$2(value)) return null;
|
|
6581
6599
|
const children = /* @__PURE__ */ new Map();
|
|
6582
6600
|
for (const [key, child] of Object.entries(value)) {
|
|
6583
6601
|
const node = nodeFromStored(child, owner);
|
|
@@ -7859,6 +7877,152 @@ var PeerBytesTicketSchema = object({
|
|
|
7859
7877
|
*/
|
|
7860
7878
|
declaredBytes: number().int().nonnegative().nullable()
|
|
7861
7879
|
});
|
|
7880
|
+
/** Limits and names of `ctx.records` (D881). One authority; the engine and the facade read it. */
|
|
7881
|
+
/** The files a kind may live in. `history` is device-history's (D850), never records. */
|
|
7882
|
+
var RECORD_DATABASES = ["settings", "events"];
|
|
7883
|
+
/** The classes of a kind: the `@durable` vocabulary, one authority (replaces the annotation). */
|
|
7884
|
+
var RECORD_CLASSES = [
|
|
7885
|
+
"config",
|
|
7886
|
+
"ledger",
|
|
7887
|
+
"audit",
|
|
7888
|
+
"mirror",
|
|
7889
|
+
"ephemeral"
|
|
7890
|
+
];
|
|
7891
|
+
var RECORD_DEFAULT_MAX_DATA_BYTES = 64 * 1024;
|
|
7892
|
+
var RECORD_MAX_DATA_BYTES = 1024 * 1024;
|
|
7893
|
+
var RECORD_BATCH_MAX = 1e3;
|
|
7894
|
+
var RECORD_QUERY_MAX = 1e3;
|
|
7895
|
+
function defOf(schema) {
|
|
7896
|
+
return schema._zod?.def ?? {};
|
|
7897
|
+
}
|
|
7898
|
+
function declaredHere(schema) {
|
|
7899
|
+
return globalRegistry.get(schema)?.secret === true;
|
|
7900
|
+
}
|
|
7901
|
+
/** Wrapper kinds whose `innerType` is the field itself. */
|
|
7902
|
+
var WRAPPERS = new Set([
|
|
7903
|
+
"optional",
|
|
7904
|
+
"nullable",
|
|
7905
|
+
"default",
|
|
7906
|
+
"prefault",
|
|
7907
|
+
"catch",
|
|
7908
|
+
"readonly",
|
|
7909
|
+
"nonoptional"
|
|
7910
|
+
]);
|
|
7911
|
+
/**
|
|
7912
|
+
* The schema layers that make up ONE field: the schema itself and every
|
|
7913
|
+
* wrapper below it (optional / default / nullable / readonly / catch), plus
|
|
7914
|
+
* both sides of a pipe (`z.preprocess` puts the real schema on `out`,
|
|
7915
|
+
* `.transform` on `in`).
|
|
7916
|
+
*/
|
|
7917
|
+
function layersOf(schema) {
|
|
7918
|
+
const out = [];
|
|
7919
|
+
const queue = [schema];
|
|
7920
|
+
while (queue.length > 0) {
|
|
7921
|
+
const s = queue.shift();
|
|
7922
|
+
if (!s || out.includes(s)) continue;
|
|
7923
|
+
out.push(s);
|
|
7924
|
+
const def = defOf(s);
|
|
7925
|
+
if (def.type !== void 0 && WRAPPERS.has(def.type) && def.innerType) queue.push(def.innerType);
|
|
7926
|
+
if (def.type === "pipe") {
|
|
7927
|
+
if (def.in) queue.push(def.in);
|
|
7928
|
+
if (def.out) queue.push(def.out);
|
|
7929
|
+
}
|
|
7930
|
+
}
|
|
7931
|
+
return out;
|
|
7932
|
+
}
|
|
7933
|
+
/** True when any layer of this field declares `.meta({ secret: true })`. */
|
|
7934
|
+
function isZodSecret(schema) {
|
|
7935
|
+
return layersOf(schema).some(declaredHere);
|
|
7936
|
+
}
|
|
7937
|
+
/**
|
|
7938
|
+
* Every declared secret path in a config schema: dotted keys, `[]` for "each
|
|
7939
|
+
* element of this array" (`connection.password`, `rows[].token`). A declared
|
|
7940
|
+
* object or array is reported as one path and not descended into — everything
|
|
7941
|
+
* under it is secret.
|
|
7942
|
+
*/
|
|
7943
|
+
function collectZodSecretPaths(schema, prefix = "") {
|
|
7944
|
+
if (isZodSecret(schema)) return prefix.length > 0 ? [prefix] : [];
|
|
7945
|
+
const paths = [];
|
|
7946
|
+
for (const layer of layersOf(schema)) {
|
|
7947
|
+
const def = defOf(layer);
|
|
7948
|
+
if (def.type === "object" && def.shape) for (const [key, child] of Object.entries(def.shape)) paths.push(...collectZodSecretPaths(child, prefix ? `${prefix}.${key}` : key));
|
|
7949
|
+
else if (def.type === "array" && def.element) paths.push(...collectZodSecretPaths(def.element, `${prefix}[]`));
|
|
7950
|
+
else if (def.type === "union" && def.options) for (const option of def.options) paths.push(...collectZodSecretPaths(option, prefix));
|
|
7951
|
+
else if (def.type === "intersection") {
|
|
7952
|
+
if (def.left) paths.push(...collectZodSecretPaths(def.left, prefix));
|
|
7953
|
+
if (def.right) paths.push(...collectZodSecretPaths(def.right, prefix));
|
|
7954
|
+
}
|
|
7955
|
+
}
|
|
7956
|
+
return [...new Set(paths)];
|
|
7957
|
+
}
|
|
7958
|
+
/**
|
|
7959
|
+
* Record kinds (D881): the declaration an addon makes of one kind of fact, the
|
|
7960
|
+
* Zod row schema that describes it, and the helper that turns the two into the
|
|
7961
|
+
* JSON the engine stores.
|
|
7962
|
+
*
|
|
7963
|
+
* A kind is declared ONCE, next to the code that owns it, and the engine's
|
|
7964
|
+
* reconciler creates its indexes - nothing creates DDL at runtime from a write.
|
|
7965
|
+
* Everything the generic machinery needs (secret fields, the entry descriptor)
|
|
7966
|
+
* is DERIVED from the Zod schema: `.meta({ secret: true })` marks a credential,
|
|
7967
|
+
* never a field name (D879).
|
|
7968
|
+
*/
|
|
7969
|
+
/** A JSON field path: `trackId`, `auth.accessToken`. Charset-restricted: it is rendered into DDL. */
|
|
7970
|
+
var RecordFieldPathSchema = string().regex(/^[A-Za-z_][A-Za-z0-9_]{0,63}(\.[A-Za-z_][A-Za-z0-9_]{0,63}){0,3}$/);
|
|
7971
|
+
var RecordIndexSchema = object({
|
|
7972
|
+
name: string().regex(/^[a-z][a-z0-9_]{0,31}$/),
|
|
7973
|
+
fields: array(RecordFieldPathSchema).min(1).max(4),
|
|
7974
|
+
unique: boolean().optional()
|
|
7975
|
+
}).strict();
|
|
7976
|
+
var RecordRetentionSchema = union([
|
|
7977
|
+
object({
|
|
7978
|
+
ttlMs: number().int().positive(),
|
|
7979
|
+
from: _enum(["at", "write"])
|
|
7980
|
+
}).strict(),
|
|
7981
|
+
object({
|
|
7982
|
+
maxRows: number().int().positive().optional(),
|
|
7983
|
+
maxRowsPerDevice: number().int().positive().optional()
|
|
7984
|
+
}).strict().refine((r) => r.maxRows !== void 0 || r.maxRowsPerDevice !== void 0, { message: "name maxRows, maxRowsPerDevice or both" }),
|
|
7985
|
+
object({
|
|
7986
|
+
owner: string().min(1),
|
|
7987
|
+
reason: string().min(1)
|
|
7988
|
+
}).strict(),
|
|
7989
|
+
object({ none: string().min(1) }).strict()
|
|
7990
|
+
]);
|
|
7991
|
+
/** The descriptor a generic entries UI reads (D881 "generic entries"). */
|
|
7992
|
+
var EntryDescriptorSchema = object({
|
|
7993
|
+
title: string().min(1),
|
|
7994
|
+
/** The record body field shown as the entry's name. */
|
|
7995
|
+
nameField: string().min(1),
|
|
7996
|
+
/** JSON Schema of the entry body; `secret: true` marks a password field. */
|
|
7997
|
+
fields: record(string(), unknown())
|
|
7998
|
+
}).strict();
|
|
7999
|
+
/** What crosses the wire and sits in the engine's catalog: JSON only, no Zod. */
|
|
8000
|
+
var RecordKindDeclarationSchema = object({
|
|
8001
|
+
database: _enum(RECORD_DATABASES).default("settings"),
|
|
8002
|
+
class: _enum(RECORD_CLASSES),
|
|
8003
|
+
writeTrigger: string().min(1),
|
|
8004
|
+
device: _enum([
|
|
8005
|
+
"required",
|
|
8006
|
+
"optional",
|
|
8007
|
+
"none"
|
|
8008
|
+
]).default("none"),
|
|
8009
|
+
at: _enum(["required", "none"]).default("none"),
|
|
8010
|
+
indexes: array(RecordIndexSchema).max(8).default([]),
|
|
8011
|
+
retention: RecordRetentionSchema,
|
|
8012
|
+
deviceRemoval: _enum(["delete", "none"]).default("none"),
|
|
8013
|
+
maxDataBytes: number().int().positive().max(RECORD_MAX_DATA_BYTES).default(RECORD_DEFAULT_MAX_DATA_BYTES),
|
|
8014
|
+
/** Derived from the Zod schema; never written by hand. */
|
|
8015
|
+
secretPaths: array(string().min(1)).default([]),
|
|
8016
|
+
/** The id key of each array that carries a secret (`{ headers: 'name' }`). */
|
|
8017
|
+
secretArrayKeys: record(string(), string()).default({}),
|
|
8018
|
+
/** The legacy table this kind adopts from; the boot guard reads it (D853: no migration code). */
|
|
8019
|
+
adoptsFrom: string().min(1).optional(),
|
|
8020
|
+
/** Kinds that must agree through `transact` sit in one file under one family name. */
|
|
8021
|
+
transactFamily: string().min(1).optional(),
|
|
8022
|
+
entry: EntryDescriptorSchema.optional()
|
|
8023
|
+
}).strict();
|
|
8024
|
+
/** The kind names: lower-case, dash separated, short enough for an index name. */
|
|
8025
|
+
var RecordKindNameSchema = string().regex(/^[a-z][a-z0-9-]{0,47}$/);
|
|
7862
8026
|
/** Shared Zod schemas used across streaming capabilities. */
|
|
7863
8027
|
var CamProfileSchema = _enum([
|
|
7864
8028
|
"high",
|
|
@@ -8404,69 +8568,6 @@ method(object({ deviceId: number() }), array(StreamSourceEntrySchema)), method(o
|
|
|
8404
8568
|
kind: "mutation",
|
|
8405
8569
|
auth: "admin"
|
|
8406
8570
|
}), method(object({ deviceId: number() }), unknown().nullable()), method(object({ deviceId: number() }), RawStateResultSchema.nullable(), { auth: "protected" });
|
|
8407
|
-
function defOf(schema) {
|
|
8408
|
-
return schema._zod?.def ?? {};
|
|
8409
|
-
}
|
|
8410
|
-
function declaredHere(schema) {
|
|
8411
|
-
return globalRegistry.get(schema)?.secret === true;
|
|
8412
|
-
}
|
|
8413
|
-
/** Wrapper kinds whose `innerType` is the field itself. */
|
|
8414
|
-
var WRAPPERS = new Set([
|
|
8415
|
-
"optional",
|
|
8416
|
-
"nullable",
|
|
8417
|
-
"default",
|
|
8418
|
-
"prefault",
|
|
8419
|
-
"catch",
|
|
8420
|
-
"readonly",
|
|
8421
|
-
"nonoptional"
|
|
8422
|
-
]);
|
|
8423
|
-
/**
|
|
8424
|
-
* The schema layers that make up ONE field: the schema itself and every
|
|
8425
|
-
* wrapper below it (optional / default / nullable / readonly / catch), plus
|
|
8426
|
-
* both sides of a pipe (`z.preprocess` puts the real schema on `out`,
|
|
8427
|
-
* `.transform` on `in`).
|
|
8428
|
-
*/
|
|
8429
|
-
function layersOf(schema) {
|
|
8430
|
-
const out = [];
|
|
8431
|
-
const queue = [schema];
|
|
8432
|
-
while (queue.length > 0) {
|
|
8433
|
-
const s = queue.shift();
|
|
8434
|
-
if (!s || out.includes(s)) continue;
|
|
8435
|
-
out.push(s);
|
|
8436
|
-
const def = defOf(s);
|
|
8437
|
-
if (def.type !== void 0 && WRAPPERS.has(def.type) && def.innerType) queue.push(def.innerType);
|
|
8438
|
-
if (def.type === "pipe") {
|
|
8439
|
-
if (def.in) queue.push(def.in);
|
|
8440
|
-
if (def.out) queue.push(def.out);
|
|
8441
|
-
}
|
|
8442
|
-
}
|
|
8443
|
-
return out;
|
|
8444
|
-
}
|
|
8445
|
-
/** True when any layer of this field declares `.meta({ secret: true })`. */
|
|
8446
|
-
function isZodSecret(schema) {
|
|
8447
|
-
return layersOf(schema).some(declaredHere);
|
|
8448
|
-
}
|
|
8449
|
-
/**
|
|
8450
|
-
* Every declared secret path in a config schema: dotted keys, `[]` for "each
|
|
8451
|
-
* element of this array" (`connection.password`, `rows[].token`). A declared
|
|
8452
|
-
* object or array is reported as one path and not descended into — everything
|
|
8453
|
-
* under it is secret.
|
|
8454
|
-
*/
|
|
8455
|
-
function collectZodSecretPaths(schema, prefix = "") {
|
|
8456
|
-
if (isZodSecret(schema)) return prefix.length > 0 ? [prefix] : [];
|
|
8457
|
-
const paths = [];
|
|
8458
|
-
for (const layer of layersOf(schema)) {
|
|
8459
|
-
const def = defOf(layer);
|
|
8460
|
-
if (def.type === "object" && def.shape) for (const [key, child] of Object.entries(def.shape)) paths.push(...collectZodSecretPaths(child, prefix ? `${prefix}.${key}` : key));
|
|
8461
|
-
else if (def.type === "array" && def.element) paths.push(...collectZodSecretPaths(def.element, `${prefix}[]`));
|
|
8462
|
-
else if (def.type === "union" && def.options) for (const option of def.options) paths.push(...collectZodSecretPaths(option, prefix));
|
|
8463
|
-
else if (def.type === "intersection") {
|
|
8464
|
-
if (def.left) paths.push(...collectZodSecretPaths(def.left, prefix));
|
|
8465
|
-
if (def.right) paths.push(...collectZodSecretPaths(def.right, prefix));
|
|
8466
|
-
}
|
|
8467
|
-
}
|
|
8468
|
-
return [...new Set(paths)];
|
|
8469
|
-
}
|
|
8470
8571
|
/**
|
|
8471
8572
|
* AUTO-GENERATED by scripts/generate-device-scoped-caps.ts — DO NOT EDIT.
|
|
8472
8573
|
*
|
|
@@ -8610,7 +8711,7 @@ function sleep(ms) {
|
|
|
8610
8711
|
return new Promise((resolve) => setTimeout(resolve, Math.max(0, ms)));
|
|
8611
8712
|
}
|
|
8612
8713
|
//#endregion
|
|
8613
|
-
//#region ../types/dist/err-msg
|
|
8714
|
+
//#region ../types/dist/err-msg--2RrYiLO.mjs
|
|
8614
8715
|
var DeviceType = /* @__PURE__ */ function(DeviceType) {
|
|
8615
8716
|
DeviceType["Camera"] = "camera";
|
|
8616
8717
|
DeviceType["Hub"] = "hub";
|
|
@@ -8879,6 +8980,9 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
|
|
|
8879
8980
|
/** Virtual HA toggle (input_boolean.*) — distinguishable from a
|
|
8880
8981
|
* real Switch device for UI rendering / export adapters. */
|
|
8881
8982
|
DeviceRole["BinaryHelper"] = "binary-helper";
|
|
8983
|
+
/** A smart plug: a `switch` whose source says it is an outlet (HA
|
|
8984
|
+
* `device_class: outlet`). The Alexa export shows it as a SMARTPLUG. */
|
|
8985
|
+
DeviceRole["Outlet"] = "outlet";
|
|
8882
8986
|
/** Generic motion / occupancy / moving event source. Distinct from
|
|
8883
8987
|
* the camera accessory PirSensor role: that one is a camera child;
|
|
8884
8988
|
* this is a standalone HA / 3rd-party motion sensor. */
|
|
@@ -8956,7 +9060,7 @@ function errMsg(err) {
|
|
|
8956
9060
|
return String(err);
|
|
8957
9061
|
}
|
|
8958
9062
|
//#endregion
|
|
8959
|
-
//#region ../types/dist/composition-
|
|
9063
|
+
//#region ../types/dist/composition-DOwQB_Ua.mjs
|
|
8960
9064
|
/**
|
|
8961
9065
|
* Deterministic SHA-256 hash of an arbitrary serialisable value. The
|
|
8962
9066
|
* canonical form sorts object keys alphabetically at every depth so two
|
|
@@ -16804,6 +16908,41 @@ var ComposableCapabilitiesSchema = object({ caps: array(object({
|
|
|
16804
16908
|
keyField: string()
|
|
16805
16909
|
}).optional()
|
|
16806
16910
|
})) });
|
|
16911
|
+
/**
|
|
16912
|
+
* The report of a one-shot "move this owner's plaintext secrets into the
|
|
16913
|
+
* keychain" run (D878). COUNTS only - never a value, never a ref.
|
|
16914
|
+
*
|
|
16915
|
+
* The owner runs it on its own rows, through its own write path; an operator
|
|
16916
|
+
* script (`scripts/hub/migrate-raw-secrets.ts`) calls the owner's cap method.
|
|
16917
|
+
* Dry run (`apply: false`) reports what WOULD move and changes nothing.
|
|
16918
|
+
*/
|
|
16919
|
+
var RawSecretMigrationInputSchema = object({
|
|
16920
|
+
/** `false` (the default of the script) = report only. */
|
|
16921
|
+
apply: boolean() });
|
|
16922
|
+
var RawSecretMigrationReportSchema = object({
|
|
16923
|
+
apply: boolean(),
|
|
16924
|
+
/** Rows that can carry a secret (a profile, an enrolment). */
|
|
16925
|
+
rows: number().int(),
|
|
16926
|
+
/** Rows whose secret was plaintext when the run started. */
|
|
16927
|
+
raw: number().int(),
|
|
16928
|
+
/** Rows that already held a keychain marker when the run started. */
|
|
16929
|
+
markers: number().int(),
|
|
16930
|
+
/** Plaintext rows moved by THIS run (always 0 on a dry run). */
|
|
16931
|
+
migrated: number().int(),
|
|
16932
|
+
/** Plaintext rows left in place because the move or its read-back failed. */
|
|
16933
|
+
failed: number().int(),
|
|
16934
|
+
/** After the run: rows still holding plaintext. */
|
|
16935
|
+
remainingRaw: number().int(),
|
|
16936
|
+
/** After the run: markers the keychain could not resolve right now. */
|
|
16937
|
+
unresolvedMarkers: number().int(),
|
|
16938
|
+
/**
|
|
16939
|
+
* A second, redundant copy of the secrets' rows that the run found (and, on
|
|
16940
|
+
* `apply`, deleted after verifying the first). Owners with a single copy omit it.
|
|
16941
|
+
*/
|
|
16942
|
+
redundantCopies: number().int().optional(),
|
|
16943
|
+
/** True when nothing is raw and every marker resolves. */
|
|
16944
|
+
verified: boolean()
|
|
16945
|
+
});
|
|
16807
16946
|
/** The block id behind a generated addon/runner id, or null when the id belongs
|
|
16808
16947
|
* to something else. The inverse of {@link coreBlockAddonId}. */
|
|
16809
16948
|
function coreBlockIdFromAddonId(addonId) {
|
|
@@ -17037,6 +17176,9 @@ method(object({}), object({ blocks: array(CoreBlockSchema) }), { auth: "admin" }
|
|
|
17037
17176
|
}), SettingsUpdateResultSchema, {
|
|
17038
17177
|
kind: "mutation",
|
|
17039
17178
|
auth: "admin"
|
|
17179
|
+
}), method(RawSecretMigrationInputSchema, RawSecretMigrationReportSchema, {
|
|
17180
|
+
kind: "mutation",
|
|
17181
|
+
auth: "admin"
|
|
17040
17182
|
}), method(object({}), object({ libs: array(object({
|
|
17041
17183
|
filePath: string(),
|
|
17042
17184
|
content: string()
|
|
@@ -17299,6 +17441,222 @@ id: union([string(), number()]) }), {
|
|
|
17299
17441
|
kind: "mutation",
|
|
17300
17442
|
auth: "admin"
|
|
17301
17443
|
});
|
|
17444
|
+
/**
|
|
17445
|
+
* records - an addon's own facts and documents (D881): ledgers, audit rows,
|
|
17446
|
+
* config documents, mirrors. The third storage API next to `ctx.settings`
|
|
17447
|
+
* (operator intent, D870) and device-history (numbers over time, D850).
|
|
17448
|
+
*
|
|
17449
|
+
* Who the OWNER is: `callerAddonId`, stamped by the transport on a call that
|
|
17450
|
+
* crossed a process and stated by a hub in-process caller (`ctx.records` does
|
|
17451
|
+
* that with the addon id closed over). It is deliberately NOT in any input
|
|
17452
|
+
* schema, so a session can never supply it, and a call with no stamp is refused
|
|
17453
|
+
* `records/no-caller`. A kind is readable and writable only by its owner; other
|
|
17454
|
+
* addons go through the owner's capability.
|
|
17455
|
+
*
|
|
17456
|
+
* Every read is three-way: a row, `null`, or the call THROWS. A failed read is
|
|
17457
|
+
* never `[]`. Secret fields are never on the wire: a read shows the
|
|
17458
|
+
* redaction token, `secretRefs` hands the owner's `ctx.secrets` the refs it
|
|
17459
|
+
* resolves itself, and a write may carry only a keychain marker bound to the
|
|
17460
|
+
* row's own ref.
|
|
17461
|
+
*
|
|
17462
|
+
* Internal: addons reach it through `ctx.records`, never directly.
|
|
17463
|
+
*/
|
|
17464
|
+
var RecordIdSchema = string().min(1).max(256);
|
|
17465
|
+
/** A JSON object body. Size is the engine's check (`maxDataBytes`), not a schema's. */
|
|
17466
|
+
var RecordBodySchema = record(string(), unknown());
|
|
17467
|
+
var RecordInputSchema = object({
|
|
17468
|
+
id: RecordIdSchema,
|
|
17469
|
+
/** The device this row belongs to (D865 removal, per-device reads). */
|
|
17470
|
+
deviceId: number().int().optional(),
|
|
17471
|
+
/** The domain clock, ms: observed / created / opened. */
|
|
17472
|
+
at: number().int().optional(),
|
|
17473
|
+
/** Producer-set expiry, ms. Refused on a kind whose retention is an engine TTL. */
|
|
17474
|
+
expiresAt: number().int().optional(),
|
|
17475
|
+
data: RecordBodySchema
|
|
17476
|
+
});
|
|
17477
|
+
var RecordViewSchema = object({
|
|
17478
|
+
id: string(),
|
|
17479
|
+
deviceId: number().int().nullable(),
|
|
17480
|
+
at: number().nullable(),
|
|
17481
|
+
expiresAt: number().nullable(),
|
|
17482
|
+
rev: number().int(),
|
|
17483
|
+
updatedAt: number(),
|
|
17484
|
+
data: RecordBodySchema
|
|
17485
|
+
});
|
|
17486
|
+
/** Declared index fields only. Anything else does not compile, by design. */
|
|
17487
|
+
var RecordWhereSchema = record(RecordFieldPathSchema, union([
|
|
17488
|
+
string(),
|
|
17489
|
+
number(),
|
|
17490
|
+
boolean(),
|
|
17491
|
+
object({ in: array(union([
|
|
17492
|
+
string(),
|
|
17493
|
+
number(),
|
|
17494
|
+
boolean()
|
|
17495
|
+
])).min(1).max(RECORD_BATCH_MAX) }),
|
|
17496
|
+
object({
|
|
17497
|
+
gt: union([string(), number()]).optional(),
|
|
17498
|
+
gte: union([string(), number()]).optional(),
|
|
17499
|
+
lt: union([string(), number()]).optional(),
|
|
17500
|
+
lte: union([string(), number()]).optional()
|
|
17501
|
+
}).refine((r) => Object.keys(r).length > 0, { message: "name at least one bound" })
|
|
17502
|
+
]));
|
|
17503
|
+
var KindShape = { kind: RecordKindNameSchema };
|
|
17504
|
+
var TimeWindowShape = {
|
|
17505
|
+
deviceId: number().int().optional(),
|
|
17506
|
+
atFrom: number().optional(),
|
|
17507
|
+
atTo: number().optional()
|
|
17508
|
+
};
|
|
17509
|
+
var RecordQueryInputSchema = object({
|
|
17510
|
+
...KindShape,
|
|
17511
|
+
...TimeWindowShape,
|
|
17512
|
+
where: RecordWhereSchema.optional(),
|
|
17513
|
+
/** Without `where`: `at` (default for a kind with a clock) or `id`. With `where` the order is the index's. */
|
|
17514
|
+
order: _enum(["at", "id"]).optional(),
|
|
17515
|
+
desc: boolean().optional(),
|
|
17516
|
+
limit: number().int().min(1).max(RECORD_QUERY_MAX).default(100),
|
|
17517
|
+
/** Opaque keyset cursor from a previous answer. There is no offset. */
|
|
17518
|
+
cursor: string().min(1).optional()
|
|
17519
|
+
});
|
|
17520
|
+
var RecordQueryResultSchema = object({
|
|
17521
|
+
records: array(RecordViewSchema),
|
|
17522
|
+
nextCursor: string().nullable()
|
|
17523
|
+
});
|
|
17524
|
+
var RecordKindStateSchema = _enum([
|
|
17525
|
+
"created",
|
|
17526
|
+
"unchanged",
|
|
17527
|
+
"updated"
|
|
17528
|
+
]);
|
|
17529
|
+
var DeclareKindResultSchema = object({
|
|
17530
|
+
kindId: number().int(),
|
|
17531
|
+
state: RecordKindStateSchema,
|
|
17532
|
+
createdIndexes: array(string()),
|
|
17533
|
+
/** The boot guard: the kind is empty while its legacy table still holds rows. */
|
|
17534
|
+
adoptionPending: object({
|
|
17535
|
+
legacyTable: string(),
|
|
17536
|
+
legacyRows: number().int()
|
|
17537
|
+
}).nullable()
|
|
17538
|
+
});
|
|
17539
|
+
/** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
|
|
17540
|
+
var SecretRefsList = array(string());
|
|
17541
|
+
var RecordSecretRefsSchema = record(string(), record(string(), string()));
|
|
17542
|
+
method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
|
|
17543
|
+
kind: "mutation",
|
|
17544
|
+
auth: "admin"
|
|
17545
|
+
}), method(object({
|
|
17546
|
+
...KindShape,
|
|
17547
|
+
id: RecordIdSchema
|
|
17548
|
+
}), RecordViewSchema.nullable(), { auth: "admin" }), method(object({
|
|
17549
|
+
...KindShape,
|
|
17550
|
+
ids: array(RecordIdSchema).min(1).max(RECORD_BATCH_MAX)
|
|
17551
|
+
}), array(RecordViewSchema), { auth: "admin" }), method(object({
|
|
17552
|
+
...KindShape,
|
|
17553
|
+
ids: array(RecordIdSchema).min(1).max(RECORD_BATCH_MAX)
|
|
17554
|
+
}), RecordSecretRefsSchema, { auth: "admin" }), method(object({
|
|
17555
|
+
...KindShape,
|
|
17556
|
+
record: RecordInputSchema,
|
|
17557
|
+
/** Compare-and-set. `0` means "the row must not exist". */
|
|
17558
|
+
ifRev: number().int().min(0).optional()
|
|
17559
|
+
}), object({
|
|
17560
|
+
rev: number().int(),
|
|
17561
|
+
releasedRefs: SecretRefsList
|
|
17562
|
+
}), {
|
|
17563
|
+
kind: "mutation",
|
|
17564
|
+
auth: "admin"
|
|
17565
|
+
}), method(object({
|
|
17566
|
+
...KindShape,
|
|
17567
|
+
records: array(RecordInputSchema).min(1).max(RECORD_BATCH_MAX)
|
|
17568
|
+
}), object({
|
|
17569
|
+
count: number().int(),
|
|
17570
|
+
releasedRefs: SecretRefsList
|
|
17571
|
+
}), {
|
|
17572
|
+
kind: "mutation",
|
|
17573
|
+
auth: "admin"
|
|
17574
|
+
}), method(object({
|
|
17575
|
+
...KindShape,
|
|
17576
|
+
id: RecordIdSchema,
|
|
17577
|
+
data: RecordBodySchema,
|
|
17578
|
+
at: number().int().nullable().optional(),
|
|
17579
|
+
expiresAt: number().int().nullable().optional(),
|
|
17580
|
+
ifRev: number().int().min(1).optional()
|
|
17581
|
+
}), object({
|
|
17582
|
+
rev: number().int(),
|
|
17583
|
+
releasedRefs: SecretRefsList
|
|
17584
|
+
}), {
|
|
17585
|
+
kind: "mutation",
|
|
17586
|
+
auth: "admin"
|
|
17587
|
+
}), method(object({
|
|
17588
|
+
...KindShape,
|
|
17589
|
+
id: RecordIdSchema
|
|
17590
|
+
}), object({
|
|
17591
|
+
deleted: boolean(),
|
|
17592
|
+
secretRefs: SecretRefsList
|
|
17593
|
+
}), {
|
|
17594
|
+
kind: "mutation",
|
|
17595
|
+
auth: "admin"
|
|
17596
|
+
}), method(object({
|
|
17597
|
+
...KindShape,
|
|
17598
|
+
ids: array(RecordIdSchema).min(1).max(RECORD_BATCH_MAX)
|
|
17599
|
+
}), object({
|
|
17600
|
+
deleted: number().int(),
|
|
17601
|
+
secretRefs: SecretRefsList
|
|
17602
|
+
}), {
|
|
17603
|
+
kind: "mutation",
|
|
17604
|
+
auth: "admin"
|
|
17605
|
+
}), method(RecordQueryInputSchema, RecordQueryResultSchema, { auth: "admin" }), method(object({
|
|
17606
|
+
...KindShape,
|
|
17607
|
+
...TimeWindowShape,
|
|
17608
|
+
where: RecordWhereSchema.optional()
|
|
17609
|
+
}), object({ count: number().int() }), { auth: "admin" }), method(object({
|
|
17610
|
+
...KindShape,
|
|
17611
|
+
deviceId: number().int().optional(),
|
|
17612
|
+
from: number(),
|
|
17613
|
+
to: number(),
|
|
17614
|
+
bucketMs: number().int().positive()
|
|
17615
|
+
}), object({ buckets: array(object({
|
|
17616
|
+
bucketStart: number(),
|
|
17617
|
+
count: number().int()
|
|
17618
|
+
})) }), { auth: "admin" }), method(object({
|
|
17619
|
+
...KindShape,
|
|
17620
|
+
op: _enum([
|
|
17621
|
+
"sum",
|
|
17622
|
+
"min",
|
|
17623
|
+
"max",
|
|
17624
|
+
"count"
|
|
17625
|
+
]),
|
|
17626
|
+
field: RecordFieldPathSchema.optional(),
|
|
17627
|
+
groupBy: RecordFieldPathSchema.optional(),
|
|
17628
|
+
where: RecordWhereSchema.optional()
|
|
17629
|
+
}), object({ rows: array(object({
|
|
17630
|
+
group: union([
|
|
17631
|
+
string(),
|
|
17632
|
+
number(),
|
|
17633
|
+
_null()
|
|
17634
|
+
]),
|
|
17635
|
+
value: number().nullable()
|
|
17636
|
+
})) }), { auth: "admin" }), method(object({
|
|
17637
|
+
...KindShape,
|
|
17638
|
+
deviceId: number().int().optional(),
|
|
17639
|
+
atBefore: number().optional(),
|
|
17640
|
+
where: RecordWhereSchema.optional()
|
|
17641
|
+
}), object({
|
|
17642
|
+
deleted: number().int(),
|
|
17643
|
+
secretRefs: SecretRefsList
|
|
17644
|
+
}), {
|
|
17645
|
+
kind: "mutation",
|
|
17646
|
+
auth: "admin"
|
|
17647
|
+
}), method(object({
|
|
17648
|
+
deviceId: number().int(),
|
|
17649
|
+
kinds: array(RecordKindNameSchema).optional()
|
|
17650
|
+
}), object({
|
|
17651
|
+
deleted: record(string(), number().int()),
|
|
17652
|
+
secretRefs: SecretRefsList
|
|
17653
|
+
}), {
|
|
17654
|
+
kind: "mutation",
|
|
17655
|
+
auth: "admin"
|
|
17656
|
+
}), method(object(KindShape), object({ id: number().int() }), {
|
|
17657
|
+
kind: "mutation",
|
|
17658
|
+
auth: "admin"
|
|
17659
|
+
});
|
|
17302
17660
|
/** One table of the settings database. */
|
|
17303
17661
|
var StorageTableSchema = object({
|
|
17304
17662
|
/** The table's full name, e.g. `recorder:addon-settings` or `addon-device-settings`. */
|
|
@@ -17311,6 +17669,28 @@ var StorageTableSchema = object({
|
|
|
17311
17669
|
/** Declared by an addon since this engine process started (a running addon claims it). */
|
|
17312
17670
|
declaredThisBoot: boolean()
|
|
17313
17671
|
});
|
|
17672
|
+
/** One declared record kind (D881) as System -> Data shows it. */
|
|
17673
|
+
var StorageKindSchema = object({
|
|
17674
|
+
owner: string(),
|
|
17675
|
+
kind: string(),
|
|
17676
|
+
database: _enum(["settings", "events"]),
|
|
17677
|
+
class: string(),
|
|
17678
|
+
state: _enum([
|
|
17679
|
+
"declared",
|
|
17680
|
+
"orphaned",
|
|
17681
|
+
"dropped"
|
|
17682
|
+
]),
|
|
17683
|
+
/** `null` when the caller asked for no counts (`counts: false`). */
|
|
17684
|
+
rows: number().int().nonnegative().nullable(),
|
|
17685
|
+
/** Rows x the average size of a sample; null for an empty kind. */
|
|
17686
|
+
bytesEstimate: number().int().nonnegative().nullable(),
|
|
17687
|
+
writeTrigger: string(),
|
|
17688
|
+
retention: RecordRetentionSchema,
|
|
17689
|
+
/** `true` when the kind is an entry kind (the generic entries UI lists it). */
|
|
17690
|
+
entry: boolean(),
|
|
17691
|
+
/** The whole declaration, secret paths and entry descriptor included (the entries service builds its handle from it). */
|
|
17692
|
+
declaration: RecordKindDeclarationSchema
|
|
17693
|
+
});
|
|
17314
17694
|
method(object({ ownerPrefix: string().min(1).optional() }), object({ tables: array(StorageTableSchema) }), { auth: "admin" }), method(object({
|
|
17315
17695
|
collection: string().min(1),
|
|
17316
17696
|
expectRows: number().int().nonnegative()
|
|
@@ -17320,6 +17700,77 @@ method(object({ ownerPrefix: string().min(1).optional() }), object({ tables: arr
|
|
|
17320
17700
|
}), {
|
|
17321
17701
|
kind: "mutation",
|
|
17322
17702
|
auth: "admin"
|
|
17703
|
+
}), method(object({
|
|
17704
|
+
owner: string().min(1).optional(),
|
|
17705
|
+
/** `false` skips the per-kind row count (a catalog read only). Default true. */
|
|
17706
|
+
counts: boolean().optional()
|
|
17707
|
+
}), object({ kinds: array(StorageKindSchema) }), { auth: "admin" }), method(RecordQueryInputSchema.extend({
|
|
17708
|
+
owner: string().min(1),
|
|
17709
|
+
kind: RecordKindNameSchema
|
|
17710
|
+
}), RecordQueryResultSchema, { auth: "admin" }), method(object({
|
|
17711
|
+
owner: string().min(1),
|
|
17712
|
+
kind: RecordKindNameSchema,
|
|
17713
|
+
records: array(RecordInputSchema).min(1).max(RECORD_BATCH_MAX),
|
|
17714
|
+
/** The LAST batch: the copy is complete, the boot guard stops asking. */
|
|
17715
|
+
complete: boolean().optional()
|
|
17716
|
+
}), object({ adopted: number().int() }), {
|
|
17717
|
+
kind: "mutation",
|
|
17718
|
+
auth: "admin"
|
|
17719
|
+
});
|
|
17720
|
+
/**
|
|
17721
|
+
* record-entries - the ONE admin surface for every list of user-created entries
|
|
17722
|
+
* (D881): notification targets, brokers, LLM profiles, anything an addon
|
|
17723
|
+
* declares as an ENTRY kind (`entry: { title }` in `defineRecordKinds`).
|
|
17724
|
+
*
|
|
17725
|
+
* The UI is generic. `listEntryKinds` hands it, per kind, the JSON Schema of
|
|
17726
|
+
* the entry body with `secret: true` on every credential field, so a password
|
|
17727
|
+
* field is derived from the schema and never from a name. `putEntry` takes the
|
|
17728
|
+
* redaction token for an untouched secret (the stored value is kept), a string
|
|
17729
|
+
* for a new one, and the clear instruction to remove one. A read never carries
|
|
17730
|
+
* a secret value, and a locked keychain refuses the write with
|
|
17731
|
+
* `records/secret-unavailable` instead of storing plaintext.
|
|
17732
|
+
*
|
|
17733
|
+
* Hub-only, served in-process (it acts for each entry's owner on the keychain).
|
|
17734
|
+
*/
|
|
17735
|
+
var EntryKindInfoSchema = object({
|
|
17736
|
+
owner: string(),
|
|
17737
|
+
kind: RecordKindNameSchema,
|
|
17738
|
+
title: string(),
|
|
17739
|
+
nameField: string(),
|
|
17740
|
+
/** JSON Schema of the body; `secret: true` marks a password field. */
|
|
17741
|
+
fields: record(string(), unknown()),
|
|
17742
|
+
secretPaths: array(string()),
|
|
17743
|
+
rows: number().int().nonnegative()
|
|
17744
|
+
});
|
|
17745
|
+
var EntryViewSchema = object({
|
|
17746
|
+
id: RecordIdSchema,
|
|
17747
|
+
name: string(),
|
|
17748
|
+
rev: number().int(),
|
|
17749
|
+
updatedAt: number(),
|
|
17750
|
+
/** Secret fields hold the redaction token. */
|
|
17751
|
+
data: RecordBodySchema
|
|
17752
|
+
});
|
|
17753
|
+
var EntryAddress = {
|
|
17754
|
+
owner: string().min(1),
|
|
17755
|
+
kind: RecordKindNameSchema
|
|
17756
|
+
};
|
|
17757
|
+
method(object({}), object({ kinds: array(EntryKindInfoSchema) }), { auth: "admin" }), method(object({ ...EntryAddress }), object({ entries: array(EntryViewSchema) }), { auth: "admin" }), method(object({
|
|
17758
|
+
...EntryAddress,
|
|
17759
|
+
id: RecordIdSchema.optional(),
|
|
17760
|
+
data: RecordBodySchema,
|
|
17761
|
+
ifRev: number().int().min(1).optional()
|
|
17762
|
+
}), object({
|
|
17763
|
+
id: string(),
|
|
17764
|
+
rev: number().int()
|
|
17765
|
+
}), {
|
|
17766
|
+
kind: "mutation",
|
|
17767
|
+
auth: "admin"
|
|
17768
|
+
}), method(object({
|
|
17769
|
+
...EntryAddress,
|
|
17770
|
+
id: RecordIdSchema
|
|
17771
|
+
}), object({ deleted: boolean() }), {
|
|
17772
|
+
kind: "mutation",
|
|
17773
|
+
auth: "admin"
|
|
17323
17774
|
});
|
|
17324
17775
|
/**
|
|
17325
17776
|
* `keychain` — the hub's encrypted store of secret values (D787).
|
|
@@ -40649,6 +41100,9 @@ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, {
|
|
|
40649
41100
|
}), _void(), { kind: "mutation" }), method(object({}), array(LlmProfileKindDescriptorSchema)), method(object({}), array(LlmProfileSchema)), method(object({ profile: LlmProfileSchema }), LlmProfileSchema, {
|
|
40650
41101
|
kind: "mutation",
|
|
40651
41102
|
auth: "admin"
|
|
41103
|
+
}), method(RawSecretMigrationInputSchema, RawSecretMigrationReportSchema, {
|
|
41104
|
+
kind: "mutation",
|
|
41105
|
+
auth: "admin"
|
|
40652
41106
|
}), method(ProfileRefInputSchema, _void(), {
|
|
40653
41107
|
kind: "mutation",
|
|
40654
41108
|
auth: "admin"
|
|
@@ -52980,6 +53434,41 @@ var ServerRollbackInfoSchema = object({
|
|
|
52980
53434
|
atMs: number(),
|
|
52981
53435
|
reason: string()
|
|
52982
53436
|
});
|
|
53437
|
+
/**
|
|
53438
|
+
* The runner boot check (D877): the runners this node PLANNED (hub: one per
|
|
53439
|
+
* `resolveRunnerId` over its forked addons; agent: the runners its process
|
|
53440
|
+
* service holds, because only the hub plans) against the states the process
|
|
53441
|
+
* service reports. Kept in memory, recomputed by the same one-shot check after
|
|
53442
|
+
* every boot, served on `getServerPackageStatus`.
|
|
53443
|
+
*
|
|
53444
|
+
* `failed` is the D6 breaker's terminal state, `refused` a deterministic Init
|
|
53445
|
+
* refusal (an addon that said "I will not start, and here is why"), `missing` a
|
|
53446
|
+
* planned runner the process service has no entry for.
|
|
53447
|
+
*/
|
|
53448
|
+
var RunnerRefusalSchema = object({
|
|
53449
|
+
runnerId: string(),
|
|
53450
|
+
addonIds: array(string()),
|
|
53451
|
+
reason: string()
|
|
53452
|
+
});
|
|
53453
|
+
var RunnerBootCheckSchema = object({
|
|
53454
|
+
checkedAtMs: number(),
|
|
53455
|
+
/** Runners planned for this node. */
|
|
53456
|
+
expected: number(),
|
|
53457
|
+
/** Planned runners whose process is `running`. */
|
|
53458
|
+
running: number(),
|
|
53459
|
+
failed: array(string()),
|
|
53460
|
+
refused: array(RunnerRefusalSchema),
|
|
53461
|
+
missing: array(string()),
|
|
53462
|
+
/**
|
|
53463
|
+
* Runners still on their way: `starting`, or `crashed` waiting on a backoff
|
|
53464
|
+
* respawn. The check is FINAL only when this is empty; until then nothing is
|
|
53465
|
+
* pushed and the verdict is re-evaluated on the next runner state change.
|
|
53466
|
+
* Optional for version skew (absent = settled).
|
|
53467
|
+
*/
|
|
53468
|
+
pending: array(string()).optional(),
|
|
53469
|
+
/** True when the plan is the hub's (`missing` is then meaningful); false on an agent. */
|
|
53470
|
+
planKnown: boolean()
|
|
53471
|
+
});
|
|
52983
53472
|
var ServerPackageStatusSchema = object({
|
|
52984
53473
|
/** Root package name (`@camstack/server` on the hub). */
|
|
52985
53474
|
packageName: string(),
|
|
@@ -53042,7 +53531,14 @@ var ServerPackageStatusSchema = object({
|
|
|
53042
53531
|
* for version skew: an older provider's payload simply omits it, and an
|
|
53043
53532
|
* absent wrapper is unknown — never `native`.
|
|
53044
53533
|
*/
|
|
53045
|
-
wrapper: WrapperIdentitySchema.optional()
|
|
53534
|
+
wrapper: WrapperIdentitySchema.optional(),
|
|
53535
|
+
/**
|
|
53536
|
+
* What this node PLANNED to run against what its process service reports
|
|
53537
|
+
* (D877). Absent until the one-shot boot check has run (~60 s after boot) and
|
|
53538
|
+
* on a provider that predates it. Absent is "not checked yet", never "all
|
|
53539
|
+
* well": a consumer that needs the answer treats it as pending.
|
|
53540
|
+
*/
|
|
53541
|
+
runners: RunnerBootCheckSchema.optional()
|
|
53046
53542
|
});
|
|
53047
53543
|
var ServerUpdateCheckResultSchema = object({
|
|
53048
53544
|
packageName: string(),
|
|
@@ -53093,6 +53589,13 @@ var ServerUpdateOutcomeSchema = _enum([
|
|
|
53093
53589
|
"refused",
|
|
53094
53590
|
"failed"
|
|
53095
53591
|
]);
|
|
53592
|
+
/** One addon the pre-flight found the target version would refuse (D877). */
|
|
53593
|
+
var UpdateBlockerSchema = object({
|
|
53594
|
+
addonId: string(),
|
|
53595
|
+
reason: string(),
|
|
53596
|
+
/** What the operator does about it. */
|
|
53597
|
+
remedy: string()
|
|
53598
|
+
});
|
|
53096
53599
|
var ServerUpdateActionResultSchema = object({
|
|
53097
53600
|
accepted: boolean(),
|
|
53098
53601
|
targetVersion: string().nullable(),
|
|
@@ -53110,14 +53613,27 @@ var ServerUpdateActionResultSchema = object({
|
|
|
53110
53613
|
* The failure itself, verbatim enough to act on (the npm output for a
|
|
53111
53614
|
* staging install). Non-null only for `failed`.
|
|
53112
53615
|
*/
|
|
53113
|
-
error: string().nullable().optional()
|
|
53616
|
+
error: string().nullable().optional(),
|
|
53617
|
+
/**
|
|
53618
|
+
* The addons the target version would refuse to start on this node's live
|
|
53619
|
+
* store (D877), present when the pre-flight refused the update
|
|
53620
|
+
* (`reason: 'addon-would-refuse'`). Optional for version skew.
|
|
53621
|
+
*/
|
|
53622
|
+
blockers: array(UpdateBlockerSchema).optional()
|
|
53114
53623
|
});
|
|
53115
53624
|
method(_void(), ServerPackageStatusSchema, { auth: "admin" }), method(_void(), ServerUpdateCheckResultSchema, {
|
|
53116
53625
|
kind: "mutation",
|
|
53117
53626
|
auth: "admin"
|
|
53118
|
-
}), method(object({
|
|
53119
|
-
/** Explicit target version; omitted = latest from the registry. */
|
|
53120
|
-
version: string().optional()
|
|
53627
|
+
}), method(object({
|
|
53628
|
+
/** Explicit target version; omitted = latest from the registry. */
|
|
53629
|
+
version: string().optional(),
|
|
53630
|
+
/**
|
|
53631
|
+
* Apply even though the pre-flight (D877) found addons the target would
|
|
53632
|
+
* refuse to start. Off by default: those addons stay down until the
|
|
53633
|
+
* remedy is run, which is the incident this gate exists to prevent.
|
|
53634
|
+
*/
|
|
53635
|
+
acknowledgeRefusals: boolean().optional()
|
|
53636
|
+
}), ServerUpdateActionResultSchema, {
|
|
53121
53637
|
kind: "mutation",
|
|
53122
53638
|
auth: "admin",
|
|
53123
53639
|
timeoutMs: 16 * 6e4
|
|
@@ -55597,7 +56113,9 @@ var ManifestShapeSchema = object({
|
|
|
55597
56113
|
var AddonProcessSchema = object({
|
|
55598
56114
|
pid: number().optional(),
|
|
55599
56115
|
mode: string(),
|
|
55600
|
-
state: string()
|
|
56116
|
+
state: string(),
|
|
56117
|
+
/** Why the runner is `refused` (an addon's own words), when it is (D877). */
|
|
56118
|
+
reason: string().optional()
|
|
55601
56119
|
});
|
|
55602
56120
|
/**
|
|
55603
56121
|
* Per-addon health snapshot from the kernel's AddonHealthMonitor.
|
|
@@ -57013,6 +57531,12 @@ var ClimateControlStatusSchema = object({
|
|
|
57013
57531
|
/** Horizontal louver swing on/off. Null when the device has no
|
|
57014
57532
|
* horizontal swing surface (gate with `DeviceFeature.ClimateSwingHorizontal`). */
|
|
57015
57533
|
swingHorizontal: boolean().nullable(),
|
|
57534
|
+
/** Lowest setpoint the device accepts, Celsius. Absent / null = not reported. */
|
|
57535
|
+
minTemp: number().nullable().optional(),
|
|
57536
|
+
/** Highest setpoint the device accepts, Celsius. Absent / null = not reported. */
|
|
57537
|
+
maxTemp: number().nullable().optional(),
|
|
57538
|
+
/** Setpoint granularity, Celsius (0.5, 1). Absent / null = not reported. */
|
|
57539
|
+
tempStep: number().positive().nullable().optional(),
|
|
57016
57540
|
/** Ms epoch when the slice was last updated (push or command). */
|
|
57017
57541
|
lastFetchedAt: number()
|
|
57018
57542
|
});
|
|
@@ -66548,7 +67072,11 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
|
|
|
66548
67072
|
kind: "mutation",
|
|
66549
67073
|
auth: "admin",
|
|
66550
67074
|
access: "delete"
|
|
66551
|
-
}), method(object({ userId: string() }), TotpStatusSchema, { auth: "admin" }), method(
|
|
67075
|
+
}), method(object({ userId: string() }), TotpStatusSchema, { auth: "admin" }), method(RawSecretMigrationInputSchema, RawSecretMigrationReportSchema, {
|
|
67076
|
+
kind: "mutation",
|
|
67077
|
+
auth: "admin",
|
|
67078
|
+
access: "create"
|
|
67079
|
+
}), method(object({
|
|
66552
67080
|
userId: string(),
|
|
66553
67081
|
code: string()
|
|
66554
67082
|
}), object({ valid: boolean() }), {
|
|
@@ -70250,6 +70778,12 @@ Object.freeze({
|
|
|
70250
70778
|
addonId: null,
|
|
70251
70779
|
access: "view"
|
|
70252
70780
|
},
|
|
70781
|
+
"coreBlocks.migrateRawSecrets": {
|
|
70782
|
+
capName: "core-blocks",
|
|
70783
|
+
capScope: "system",
|
|
70784
|
+
addonId: null,
|
|
70785
|
+
access: "create"
|
|
70786
|
+
},
|
|
70253
70787
|
"coreBlocks.restart": {
|
|
70254
70788
|
capName: "core-blocks",
|
|
70255
70789
|
capScope: "system",
|
|
@@ -72110,6 +72644,12 @@ Object.freeze({
|
|
|
72110
72644
|
addonId: null,
|
|
72111
72645
|
access: "view"
|
|
72112
72646
|
},
|
|
72647
|
+
"llm.migrateRawSecrets": {
|
|
72648
|
+
capName: "llm",
|
|
72649
|
+
capScope: "system",
|
|
72650
|
+
addonId: null,
|
|
72651
|
+
access: "create"
|
|
72652
|
+
},
|
|
72113
72653
|
"llm.resolveModelRef": {
|
|
72114
72654
|
capName: "llm",
|
|
72115
72655
|
capScope: "system",
|
|
@@ -74996,6 +75536,30 @@ Object.freeze({
|
|
|
74996
75536
|
addonId: null,
|
|
74997
75537
|
access: "create"
|
|
74998
75538
|
},
|
|
75539
|
+
"recordEntries.deleteEntry": {
|
|
75540
|
+
capName: "record-entries",
|
|
75541
|
+
capScope: "system",
|
|
75542
|
+
addonId: null,
|
|
75543
|
+
access: "delete"
|
|
75544
|
+
},
|
|
75545
|
+
"recordEntries.listEntries": {
|
|
75546
|
+
capName: "record-entries",
|
|
75547
|
+
capScope: "system",
|
|
75548
|
+
addonId: null,
|
|
75549
|
+
access: "view"
|
|
75550
|
+
},
|
|
75551
|
+
"recordEntries.listEntryKinds": {
|
|
75552
|
+
capName: "record-entries",
|
|
75553
|
+
capScope: "system",
|
|
75554
|
+
addonId: null,
|
|
75555
|
+
access: "view"
|
|
75556
|
+
},
|
|
75557
|
+
"recordEntries.putEntry": {
|
|
75558
|
+
capName: "record-entries",
|
|
75559
|
+
capScope: "system",
|
|
75560
|
+
addonId: null,
|
|
75561
|
+
access: "create"
|
|
75562
|
+
},
|
|
74999
75563
|
"recording.getAvailability": {
|
|
75000
75564
|
capName: "recording",
|
|
75001
75565
|
capScope: "device",
|
|
@@ -75296,6 +75860,102 @@ Object.freeze({
|
|
|
75296
75860
|
addonId: null,
|
|
75297
75861
|
access: "view"
|
|
75298
75862
|
},
|
|
75863
|
+
"records.aggregate": {
|
|
75864
|
+
capName: "records",
|
|
75865
|
+
capScope: "system",
|
|
75866
|
+
addonId: null,
|
|
75867
|
+
access: "view"
|
|
75868
|
+
},
|
|
75869
|
+
"records.allocateId": {
|
|
75870
|
+
capName: "records",
|
|
75871
|
+
capScope: "system",
|
|
75872
|
+
addonId: null,
|
|
75873
|
+
access: "create"
|
|
75874
|
+
},
|
|
75875
|
+
"records.count": {
|
|
75876
|
+
capName: "records",
|
|
75877
|
+
capScope: "system",
|
|
75878
|
+
addonId: null,
|
|
75879
|
+
access: "view"
|
|
75880
|
+
},
|
|
75881
|
+
"records.declareKinds": {
|
|
75882
|
+
capName: "records",
|
|
75883
|
+
capScope: "system",
|
|
75884
|
+
addonId: null,
|
|
75885
|
+
access: "create"
|
|
75886
|
+
},
|
|
75887
|
+
"records.delete": {
|
|
75888
|
+
capName: "records",
|
|
75889
|
+
capScope: "system",
|
|
75890
|
+
addonId: null,
|
|
75891
|
+
access: "delete"
|
|
75892
|
+
},
|
|
75893
|
+
"records.deleteDevice": {
|
|
75894
|
+
capName: "records",
|
|
75895
|
+
capScope: "system",
|
|
75896
|
+
addonId: null,
|
|
75897
|
+
access: "delete"
|
|
75898
|
+
},
|
|
75899
|
+
"records.deleteMany": {
|
|
75900
|
+
capName: "records",
|
|
75901
|
+
capScope: "system",
|
|
75902
|
+
addonId: null,
|
|
75903
|
+
access: "delete"
|
|
75904
|
+
},
|
|
75905
|
+
"records.deleteWhere": {
|
|
75906
|
+
capName: "records",
|
|
75907
|
+
capScope: "system",
|
|
75908
|
+
addonId: null,
|
|
75909
|
+
access: "delete"
|
|
75910
|
+
},
|
|
75911
|
+
"records.get": {
|
|
75912
|
+
capName: "records",
|
|
75913
|
+
capScope: "system",
|
|
75914
|
+
addonId: null,
|
|
75915
|
+
access: "view"
|
|
75916
|
+
},
|
|
75917
|
+
"records.getMany": {
|
|
75918
|
+
capName: "records",
|
|
75919
|
+
capScope: "system",
|
|
75920
|
+
addonId: null,
|
|
75921
|
+
access: "view"
|
|
75922
|
+
},
|
|
75923
|
+
"records.histogram": {
|
|
75924
|
+
capName: "records",
|
|
75925
|
+
capScope: "system",
|
|
75926
|
+
addonId: null,
|
|
75927
|
+
access: "view"
|
|
75928
|
+
},
|
|
75929
|
+
"records.patch": {
|
|
75930
|
+
capName: "records",
|
|
75931
|
+
capScope: "system",
|
|
75932
|
+
addonId: null,
|
|
75933
|
+
access: "create"
|
|
75934
|
+
},
|
|
75935
|
+
"records.put": {
|
|
75936
|
+
capName: "records",
|
|
75937
|
+
capScope: "system",
|
|
75938
|
+
addonId: null,
|
|
75939
|
+
access: "create"
|
|
75940
|
+
},
|
|
75941
|
+
"records.putMany": {
|
|
75942
|
+
capName: "records",
|
|
75943
|
+
capScope: "system",
|
|
75944
|
+
addonId: null,
|
|
75945
|
+
access: "create"
|
|
75946
|
+
},
|
|
75947
|
+
"records.query": {
|
|
75948
|
+
capName: "records",
|
|
75949
|
+
capScope: "system",
|
|
75950
|
+
addonId: null,
|
|
75951
|
+
access: "view"
|
|
75952
|
+
},
|
|
75953
|
+
"records.secretRefs": {
|
|
75954
|
+
capName: "records",
|
|
75955
|
+
capScope: "system",
|
|
75956
|
+
addonId: null,
|
|
75957
|
+
access: "view"
|
|
75958
|
+
},
|
|
75299
75959
|
"sceneMonitor.captureReference": {
|
|
75300
75960
|
capName: "scene-monitor",
|
|
75301
75961
|
capScope: "device",
|
|
@@ -75728,18 +76388,36 @@ Object.freeze({
|
|
|
75728
76388
|
addonId: null,
|
|
75729
76389
|
access: "create"
|
|
75730
76390
|
},
|
|
76391
|
+
"storageAdmin.adoptRecords": {
|
|
76392
|
+
capName: "storage-admin",
|
|
76393
|
+
capScope: "system",
|
|
76394
|
+
addonId: null,
|
|
76395
|
+
access: "create"
|
|
76396
|
+
},
|
|
75731
76397
|
"storageAdmin.dropCollection": {
|
|
75732
76398
|
capName: "storage-admin",
|
|
75733
76399
|
capScope: "system",
|
|
75734
76400
|
addonId: null,
|
|
75735
76401
|
access: "delete"
|
|
75736
76402
|
},
|
|
76403
|
+
"storageAdmin.listKinds": {
|
|
76404
|
+
capName: "storage-admin",
|
|
76405
|
+
capScope: "system",
|
|
76406
|
+
addonId: null,
|
|
76407
|
+
access: "view"
|
|
76408
|
+
},
|
|
75737
76409
|
"storageAdmin.listTables": {
|
|
75738
76410
|
capName: "storage-admin",
|
|
75739
76411
|
capScope: "system",
|
|
75740
76412
|
addonId: null,
|
|
75741
76413
|
access: "view"
|
|
75742
76414
|
},
|
|
76415
|
+
"storageAdmin.readRecords": {
|
|
76416
|
+
capName: "storage-admin",
|
|
76417
|
+
capScope: "system",
|
|
76418
|
+
addonId: null,
|
|
76419
|
+
access: "view"
|
|
76420
|
+
},
|
|
75743
76421
|
"storageEvictable.evict": {
|
|
75744
76422
|
capName: "storage-evictable",
|
|
75745
76423
|
capScope: "system",
|
|
@@ -76652,6 +77330,12 @@ Object.freeze({
|
|
|
76652
77330
|
addonId: null,
|
|
76653
77331
|
access: "view"
|
|
76654
77332
|
},
|
|
77333
|
+
"userManagement.migrateRawSecrets": {
|
|
77334
|
+
capName: "user-management",
|
|
77335
|
+
capScope: "system",
|
|
77336
|
+
addonId: null,
|
|
77337
|
+
access: "create"
|
|
77338
|
+
},
|
|
76655
77339
|
"userManagement.oauthExchangeCode": {
|
|
76656
77340
|
capName: "user-management",
|
|
76657
77341
|
capScope: "system",
|
|
@@ -79328,6 +80012,37 @@ Object.freeze({
|
|
|
79328
80012
|
form: "single",
|
|
79329
80013
|
optional: false
|
|
79330
80014
|
}],
|
|
80015
|
+
"records.count": [{
|
|
80016
|
+
name: "deviceId",
|
|
80017
|
+
form: "single",
|
|
80018
|
+
optional: true
|
|
80019
|
+
}],
|
|
80020
|
+
"records.deleteDevice": [{
|
|
80021
|
+
name: "deviceId",
|
|
80022
|
+
form: "single",
|
|
80023
|
+
optional: false
|
|
80024
|
+
}],
|
|
80025
|
+
"records.deleteWhere": [{
|
|
80026
|
+
name: "deviceId",
|
|
80027
|
+
form: "single",
|
|
80028
|
+
optional: true
|
|
80029
|
+
}],
|
|
80030
|
+
"records.histogram": [{
|
|
80031
|
+
name: "deviceId",
|
|
80032
|
+
form: "single",
|
|
80033
|
+
optional: true
|
|
80034
|
+
}],
|
|
80035
|
+
"records.putMany": [{
|
|
80036
|
+
name: "records",
|
|
80037
|
+
form: "object-array",
|
|
80038
|
+
optional: false,
|
|
80039
|
+
itemField: "deviceId"
|
|
80040
|
+
}],
|
|
80041
|
+
"records.query": [{
|
|
80042
|
+
name: "deviceId",
|
|
80043
|
+
form: "single",
|
|
80044
|
+
optional: true
|
|
80045
|
+
}],
|
|
79331
80046
|
"sceneMonitor.captureReference": [{
|
|
79332
80047
|
name: "deviceId",
|
|
79333
80048
|
form: "single",
|
|
@@ -79444,6 +80159,17 @@ Object.freeze({
|
|
|
79444
80159
|
form: "single",
|
|
79445
80160
|
optional: false
|
|
79446
80161
|
}],
|
|
80162
|
+
"storageAdmin.adoptRecords": [{
|
|
80163
|
+
name: "records",
|
|
80164
|
+
form: "object-array",
|
|
80165
|
+
optional: false,
|
|
80166
|
+
itemField: "deviceId"
|
|
80167
|
+
}],
|
|
80168
|
+
"storageAdmin.readRecords": [{
|
|
80169
|
+
name: "deviceId",
|
|
80170
|
+
form: "single",
|
|
80171
|
+
optional: true
|
|
80172
|
+
}],
|
|
79447
80173
|
"streamBroker.acquireEgressTranscode": [{
|
|
79448
80174
|
name: "deviceId",
|
|
79449
80175
|
form: "single",
|