@camstack/addon-post-analysis 1.2.373 → 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.
Files changed (15) hide show
  1. package/dist/{clip-model-registry-jeFu3pma.mjs → clip-model-registry-BIJ0ZD7t.mjs} +696 -110
  2. package/dist/{clip-model-registry-Cy2RokDO.js → clip-model-registry-BRzN2GzR.js} +696 -110
  3. package/dist/embedding-encoder/index.js +1 -1
  4. package/dist/embedding-encoder/index.mjs +1 -1
  5. package/dist/pipeline-analytics/_stub.js +2 -2
  6. package/dist/pipeline-analytics/{_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-ujfvEENv.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-BYu-s1rf.mjs} +2 -2
  7. 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
  8. 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
  9. package/dist/pipeline-analytics/{hostInit-Ddz0CyLk.mjs → hostInit-DEl2xA0o.mjs} +2 -2
  10. package/dist/pipeline-analytics/index.js +39 -206
  11. package/dist/pipeline-analytics/index.mjs +39 -206
  12. package/dist/pipeline-analytics/remoteEntry.js +1 -1
  13. package/package.json +1 -1
  14. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-CyYkqCmx.mjs +0 -26
  15. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-Kh1uHJki.mjs +0 -26
@@ -5477,7 +5477,7 @@ var ZodIssueCode = {
5477
5477
  var ZodFirstPartyTypeKind;
5478
5478
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5479
5479
  //#endregion
5480
- //#region ../types/dist/sleep-bgZLodYc.mjs
5480
+ //#region ../types/dist/sleep-WsrozGDL.mjs
5481
5481
  /**
5482
5482
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5483
5483
  * window to float samples (D455).
@@ -5594,7 +5594,7 @@ function isKeychainStoredField(field) {
5594
5594
  var SECRET_CLEAR = { $secretClear: true };
5595
5595
  /** The `'***'` token D634 redaction writes for non-admins. */
5596
5596
  var LEGACY_DEVICE_REDACTION = "***";
5597
- function isRecord$2(value) {
5597
+ function isRecord$4(value) {
5598
5598
  return typeof value === "object" && value !== null && !Array.isArray(value);
5599
5599
  }
5600
5600
  function makeSecretMarker(ref) {
@@ -5605,12 +5605,12 @@ function makeSecretMarker(ref) {
5605
5605
  }
5606
5606
  /** A stored marker: an object whose `$secret` is a non-empty string. */
5607
5607
  function isSecretMarker(value) {
5608
- if (!isRecord$2(value)) return false;
5608
+ if (!isRecord$4(value)) return false;
5609
5609
  const ref = value["$secret"];
5610
5610
  return typeof ref === "string" && ref.length > 0;
5611
5611
  }
5612
5612
  function isSecretClear(value) {
5613
- return isRecord$2(value) && value["$secretClear"] === true;
5613
+ return isRecord$4(value) && value["$secretClear"] === true;
5614
5614
  }
5615
5615
  /**
5616
5616
  * The UI view of a stored secret field value: a marker becomes "set", inline
@@ -6220,7 +6220,7 @@ var KeychainWriteRefusedError = class extends Error {
6220
6220
  }
6221
6221
  };
6222
6222
  var KEEP = { kind: "keep" };
6223
- function isRecord$1(value) {
6223
+ function isRecord$3(value) {
6224
6224
  return typeof value === "object" && value !== null && !Array.isArray(value);
6225
6225
  }
6226
6226
  function defaultMintId() {
@@ -6233,7 +6233,7 @@ function collectSecretMarkerRefs(value, out = []) {
6233
6233
  return out;
6234
6234
  }
6235
6235
  if (Array.isArray(value)) for (const item of value) collectSecretMarkerRefs(item, out);
6236
- else if (isRecord$1(value)) for (const child of Object.values(value)) collectSecretMarkerRefs(child, out);
6236
+ else if (isRecord$3(value)) for (const child of Object.values(value)) collectSecretMarkerRefs(child, out);
6237
6237
  return out;
6238
6238
  }
6239
6239
  async function storedValueEquals(secrets, marker, candidate) {
@@ -6288,7 +6288,7 @@ function rowId(row, idKey) {
6288
6288
  return null;
6289
6289
  }
6290
6290
  async function writeArray(ctx, node, incoming, stored, fieldPath) {
6291
- const storedRows = Array.isArray(stored) ? stored.filter(isRecord$1) : [];
6291
+ const storedRows = Array.isArray(stored) ? stored.filter(isRecord$3) : [];
6292
6292
  if (!Array.isArray(incoming)) {
6293
6293
  ctx.deletes.push(...collectSecretMarkerRefs(storedRows));
6294
6294
  return {
@@ -6304,7 +6304,7 @@ async function writeArray(ctx, node, incoming, stored, fieldPath) {
6304
6304
  const kept = /* @__PURE__ */ new Set();
6305
6305
  const rows = [];
6306
6306
  for (const row of incoming) {
6307
- if (!isRecord$1(row)) {
6307
+ if (!isRecord$3(row)) {
6308
6308
  rows.push(row);
6309
6309
  continue;
6310
6310
  }
@@ -6329,7 +6329,7 @@ async function writeNode(ctx, node, incoming, stored, fieldPath) {
6329
6329
  case "leaf": return writeLeaf(ctx, incoming, stored, fieldPath);
6330
6330
  case "array": return writeArray(ctx, node, incoming, stored, fieldPath);
6331
6331
  case "object": {
6332
- if (!isRecord$1(incoming)) {
6332
+ if (!isRecord$3(incoming)) {
6333
6333
  if (incoming === void 0) return KEEP;
6334
6334
  ctx.deletes.push(...collectSecretMarkerRefs(stored));
6335
6335
  return {
@@ -6337,7 +6337,7 @@ async function writeNode(ctx, node, incoming, stored, fieldPath) {
6337
6337
  value: incoming
6338
6338
  };
6339
6339
  }
6340
- const storedObj = isRecord$1(stored) ? stored : {};
6340
+ const storedObj = isRecord$3(stored) ? stored : {};
6341
6341
  return {
6342
6342
  kind: "value",
6343
6343
  value: await writeMembers(ctx, node.children, incoming, storedObj, (m) => `${fieldPath}.${m}`)
@@ -6460,7 +6460,7 @@ async function resolveSecretMarkers(value, secrets, options = {}) {
6460
6460
  value: items
6461
6461
  };
6462
6462
  }
6463
- if (isRecord$1(v)) {
6463
+ if (isRecord$3(v)) {
6464
6464
  const out = {};
6465
6465
  for (const [k, child] of Object.entries(v)) {
6466
6466
  const s = substitute(child);
@@ -6492,7 +6492,7 @@ var SecretOverwriteRefusedError = class extends Error {
6492
6492
  this.name = "SecretOverwriteRefusedError";
6493
6493
  }
6494
6494
  };
6495
- function isRecord(value) {
6495
+ function isRecord$2(value) {
6496
6496
  return typeof value === "object" && value !== null && !Array.isArray(value);
6497
6497
  }
6498
6498
  function resolvedValue(pass, marker) {
@@ -6521,7 +6521,7 @@ function inArray(pass, incoming, stored) {
6521
6521
  return incoming.map((item, index) => {
6522
6522
  const twin = stored[index];
6523
6523
  if (isSecretMarker(twin)) return typeof item === "string" && item === resolvedValue(pass, twin) ? twin : item;
6524
- if (isRecord(item) && isRecord(twin)) return inArrayRow(pass, item, twin);
6524
+ if (isRecord$2(item) && isRecord$2(twin)) return inArrayRow(pass, item, twin);
6525
6525
  if (Array.isArray(item) && Array.isArray(twin)) return inArray(pass, item, twin);
6526
6526
  return item;
6527
6527
  });
@@ -6532,7 +6532,7 @@ function inArrayRow(pass, incoming, stored) {
6532
6532
  const twin = stored[key];
6533
6533
  if (isSecretMarker(twin)) {
6534
6534
  if (typeof value === "string" && value === resolvedValue(pass, twin)) out[key] = twin;
6535
- } 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);
6536
6536
  else if (Array.isArray(value) && Array.isArray(twin)) out[key] = inArray(pass, value, twin);
6537
6537
  }
6538
6538
  return out;
@@ -6540,7 +6540,7 @@ function inArrayRow(pass, incoming, stored) {
6540
6540
  async function walk(pass, incoming, stored) {
6541
6541
  if (isSecretMarker(stored)) return atMarker(pass, incoming, stored);
6542
6542
  if (Array.isArray(incoming) && Array.isArray(stored)) return inArray(pass, incoming, stored);
6543
- if (!isRecord(incoming) || !isRecord(stored)) return incoming;
6543
+ if (!isRecord$2(incoming) || !isRecord$2(stored)) return incoming;
6544
6544
  const out = { ...incoming };
6545
6545
  for (const [key, value] of Object.entries(incoming)) out[key] = await walk(pass, value, stored[key]);
6546
6546
  return out;
@@ -6571,7 +6571,7 @@ async function restoreUnchangedSecrets(input) {
6571
6571
  function isJsonEqual(a, b) {
6572
6572
  if (Object.is(a, b)) return true;
6573
6573
  if (Array.isArray(a)) return Array.isArray(b) && a.length === b.length && a.every((v, i) => isJsonEqual(v, b[i]));
6574
- if (isRecord(a) && isRecord(b)) {
6574
+ if (isRecord$2(a) && isRecord$2(b)) {
6575
6575
  const keys = Object.keys(a);
6576
6576
  if (keys.length !== Object.keys(b).length) return false;
6577
6577
  return keys.every((k) => Object.prototype.hasOwnProperty.call(b, k) && isJsonEqual(a[k], b[k]));
@@ -6595,7 +6595,7 @@ function markerKeysOf(blob, owner) {
6595
6595
  }
6596
6596
  function nodeFromStored(value, owner) {
6597
6597
  if (isSecretMarker(value)) return isSecretRefOwnedBy(value.$secret, owner) ? { kind: "leaf" } : null;
6598
- if (!isRecord(value)) return null;
6598
+ if (!isRecord$2(value)) return null;
6599
6599
  const children = /* @__PURE__ */ new Map();
6600
6600
  for (const [key, child] of Object.entries(value)) {
6601
6601
  const node = nodeFromStored(child, owner);
@@ -7877,6 +7877,152 @@ var PeerBytesTicketSchema = object({
7877
7877
  */
7878
7878
  declaredBytes: number().int().nonnegative().nullable()
7879
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}$/);
7880
8026
  /** Shared Zod schemas used across streaming capabilities. */
7881
8027
  var CamProfileSchema = _enum([
7882
8028
  "high",
@@ -8422,69 +8568,6 @@ method(object({ deviceId: number() }), array(StreamSourceEntrySchema)), method(o
8422
8568
  kind: "mutation",
8423
8569
  auth: "admin"
8424
8570
  }), method(object({ deviceId: number() }), unknown().nullable()), method(object({ deviceId: number() }), RawStateResultSchema.nullable(), { auth: "protected" });
8425
- function defOf(schema) {
8426
- return schema._zod?.def ?? {};
8427
- }
8428
- function declaredHere(schema) {
8429
- return globalRegistry.get(schema)?.secret === true;
8430
- }
8431
- /** Wrapper kinds whose `innerType` is the field itself. */
8432
- var WRAPPERS = new Set([
8433
- "optional",
8434
- "nullable",
8435
- "default",
8436
- "prefault",
8437
- "catch",
8438
- "readonly",
8439
- "nonoptional"
8440
- ]);
8441
- /**
8442
- * The schema layers that make up ONE field: the schema itself and every
8443
- * wrapper below it (optional / default / nullable / readonly / catch), plus
8444
- * both sides of a pipe (`z.preprocess` puts the real schema on `out`,
8445
- * `.transform` on `in`).
8446
- */
8447
- function layersOf(schema) {
8448
- const out = [];
8449
- const queue = [schema];
8450
- while (queue.length > 0) {
8451
- const s = queue.shift();
8452
- if (!s || out.includes(s)) continue;
8453
- out.push(s);
8454
- const def = defOf(s);
8455
- if (def.type !== void 0 && WRAPPERS.has(def.type) && def.innerType) queue.push(def.innerType);
8456
- if (def.type === "pipe") {
8457
- if (def.in) queue.push(def.in);
8458
- if (def.out) queue.push(def.out);
8459
- }
8460
- }
8461
- return out;
8462
- }
8463
- /** True when any layer of this field declares `.meta({ secret: true })`. */
8464
- function isZodSecret(schema) {
8465
- return layersOf(schema).some(declaredHere);
8466
- }
8467
- /**
8468
- * Every declared secret path in a config schema: dotted keys, `[]` for "each
8469
- * element of this array" (`connection.password`, `rows[].token`). A declared
8470
- * object or array is reported as one path and not descended into — everything
8471
- * under it is secret.
8472
- */
8473
- function collectZodSecretPaths(schema, prefix = "") {
8474
- if (isZodSecret(schema)) return prefix.length > 0 ? [prefix] : [];
8475
- const paths = [];
8476
- for (const layer of layersOf(schema)) {
8477
- const def = defOf(layer);
8478
- if (def.type === "object" && def.shape) for (const [key, child] of Object.entries(def.shape)) paths.push(...collectZodSecretPaths(child, prefix ? `${prefix}.${key}` : key));
8479
- else if (def.type === "array" && def.element) paths.push(...collectZodSecretPaths(def.element, `${prefix}[]`));
8480
- else if (def.type === "union" && def.options) for (const option of def.options) paths.push(...collectZodSecretPaths(option, prefix));
8481
- else if (def.type === "intersection") {
8482
- if (def.left) paths.push(...collectZodSecretPaths(def.left, prefix));
8483
- if (def.right) paths.push(...collectZodSecretPaths(def.right, prefix));
8484
- }
8485
- }
8486
- return [...new Set(paths)];
8487
- }
8488
8571
  /**
8489
8572
  * AUTO-GENERATED by scripts/generate-device-scoped-caps.ts — DO NOT EDIT.
8490
8573
  *
@@ -16825,6 +16908,41 @@ var ComposableCapabilitiesSchema = object({ caps: array(object({
16825
16908
  keyField: string()
16826
16909
  }).optional()
16827
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
+ });
16828
16946
  /** The block id behind a generated addon/runner id, or null when the id belongs
16829
16947
  * to something else. The inverse of {@link coreBlockAddonId}. */
16830
16948
  function coreBlockIdFromAddonId(addonId) {
@@ -17058,6 +17176,9 @@ method(object({}), object({ blocks: array(CoreBlockSchema) }), { auth: "admin" }
17058
17176
  }), SettingsUpdateResultSchema, {
17059
17177
  kind: "mutation",
17060
17178
  auth: "admin"
17179
+ }), method(RawSecretMigrationInputSchema, RawSecretMigrationReportSchema, {
17180
+ kind: "mutation",
17181
+ auth: "admin"
17061
17182
  }), method(object({}), object({ libs: array(object({
17062
17183
  filePath: string(),
17063
17184
  content: string()
@@ -17320,6 +17441,222 @@ id: union([string(), number()]) }), {
17320
17441
  kind: "mutation",
17321
17442
  auth: "admin"
17322
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
+ });
17323
17660
  /** One table of the settings database. */
17324
17661
  var StorageTableSchema = object({
17325
17662
  /** The table's full name, e.g. `recorder:addon-settings` or `addon-device-settings`. */
@@ -17332,6 +17669,28 @@ var StorageTableSchema = object({
17332
17669
  /** Declared by an addon since this engine process started (a running addon claims it). */
17333
17670
  declaredThisBoot: boolean()
17334
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
+ });
17335
17694
  method(object({ ownerPrefix: string().min(1).optional() }), object({ tables: array(StorageTableSchema) }), { auth: "admin" }), method(object({
17336
17695
  collection: string().min(1),
17337
17696
  expectRows: number().int().nonnegative()
@@ -17341,6 +17700,77 @@ method(object({ ownerPrefix: string().min(1).optional() }), object({ tables: arr
17341
17700
  }), {
17342
17701
  kind: "mutation",
17343
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"
17344
17774
  });
17345
17775
  /**
17346
17776
  * `keychain` — the hub's encrypted store of secret values (D787).
@@ -40486,36 +40916,6 @@ method(LlmRuntimeCompleteInputSchema, LlmGenerateResultSchema, {
40486
40916
  timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
40487
40917
  });
40488
40918
  /**
40489
- * The report of a one-shot "move this owner's plaintext secrets into the
40490
- * keychain" run (D878). COUNTS only - never a value, never a ref.
40491
- *
40492
- * The owner runs it on its own rows, through its own write path; an operator
40493
- * script (`scripts/hub/migrate-raw-secrets.ts`) calls the owner's cap method.
40494
- * Dry run (`apply: false`) reports what WOULD move and changes nothing.
40495
- */
40496
- var RawSecretMigrationInputSchema = object({
40497
- /** `false` (the default of the script) = report only. */
40498
- apply: boolean() });
40499
- var RawSecretMigrationReportSchema = object({
40500
- apply: boolean(),
40501
- /** Rows that can carry a secret (a profile, an enrolment). */
40502
- rows: number().int(),
40503
- /** Rows whose secret was plaintext when the run started. */
40504
- raw: number().int(),
40505
- /** Rows that already held a keychain marker when the run started. */
40506
- markers: number().int(),
40507
- /** Plaintext rows moved by THIS run (always 0 on a dry run). */
40508
- migrated: number().int(),
40509
- /** Plaintext rows left in place because the move or its read-back failed. */
40510
- failed: number().int(),
40511
- /** After the run: rows still holding plaintext. */
40512
- remainingRaw: number().int(),
40513
- /** After the run: markers the keychain could not resolve right now. */
40514
- unresolvedMarkers: number().int(),
40515
- /** True when nothing is raw and every marker resolves. */
40516
- verified: boolean()
40517
- });
40518
- /**
40519
40919
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
40520
40920
  * methods concat-fan across providers; single-row methods route to ONE
40521
40921
  * provider by the `addonId` in the call input (the notification-output
@@ -70378,6 +70778,12 @@ Object.freeze({
70378
70778
  addonId: null,
70379
70779
  access: "view"
70380
70780
  },
70781
+ "coreBlocks.migrateRawSecrets": {
70782
+ capName: "core-blocks",
70783
+ capScope: "system",
70784
+ addonId: null,
70785
+ access: "create"
70786
+ },
70381
70787
  "coreBlocks.restart": {
70382
70788
  capName: "core-blocks",
70383
70789
  capScope: "system",
@@ -75130,6 +75536,30 @@ Object.freeze({
75130
75536
  addonId: null,
75131
75537
  access: "create"
75132
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
+ },
75133
75563
  "recording.getAvailability": {
75134
75564
  capName: "recording",
75135
75565
  capScope: "device",
@@ -75430,6 +75860,102 @@ Object.freeze({
75430
75860
  addonId: null,
75431
75861
  access: "view"
75432
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
+ },
75433
75959
  "sceneMonitor.captureReference": {
75434
75960
  capName: "scene-monitor",
75435
75961
  capScope: "device",
@@ -75862,18 +76388,36 @@ Object.freeze({
75862
76388
  addonId: null,
75863
76389
  access: "create"
75864
76390
  },
76391
+ "storageAdmin.adoptRecords": {
76392
+ capName: "storage-admin",
76393
+ capScope: "system",
76394
+ addonId: null,
76395
+ access: "create"
76396
+ },
75865
76397
  "storageAdmin.dropCollection": {
75866
76398
  capName: "storage-admin",
75867
76399
  capScope: "system",
75868
76400
  addonId: null,
75869
76401
  access: "delete"
75870
76402
  },
76403
+ "storageAdmin.listKinds": {
76404
+ capName: "storage-admin",
76405
+ capScope: "system",
76406
+ addonId: null,
76407
+ access: "view"
76408
+ },
75871
76409
  "storageAdmin.listTables": {
75872
76410
  capName: "storage-admin",
75873
76411
  capScope: "system",
75874
76412
  addonId: null,
75875
76413
  access: "view"
75876
76414
  },
76415
+ "storageAdmin.readRecords": {
76416
+ capName: "storage-admin",
76417
+ capScope: "system",
76418
+ addonId: null,
76419
+ access: "view"
76420
+ },
75877
76421
  "storageEvictable.evict": {
75878
76422
  capName: "storage-evictable",
75879
76423
  capScope: "system",
@@ -79468,6 +80012,37 @@ Object.freeze({
79468
80012
  form: "single",
79469
80013
  optional: false
79470
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
+ }],
79471
80046
  "sceneMonitor.captureReference": [{
79472
80047
  name: "deviceId",
79473
80048
  form: "single",
@@ -79584,6 +80159,17 @@ Object.freeze({
79584
80159
  form: "single",
79585
80160
  optional: false
79586
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
+ }],
79587
80173
  "streamBroker.acquireEgressTranscode": [{
79588
80174
  name: "deviceId",
79589
80175
  form: "single",