@camstack/addon-pipeline 1.2.374 → 1.2.601

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 (35) hide show
  1. package/dist/audio-analyzer/index.js +3 -3
  2. package/dist/audio-analyzer/index.mjs +3 -3
  3. package/dist/{custom-model-catalog-1LDuDw8S.mjs → custom-model-catalog-CK9GK3N5.mjs} +2 -2
  4. package/dist/{custom-model-catalog-W0DHDhfo.js → custom-model-catalog-DgyafyuW.js} +2 -2
  5. package/dist/detection-pipeline/index.js +4 -4
  6. package/dist/detection-pipeline/index.mjs +4 -4
  7. package/dist/{dist-CmdLCb_F.mjs → dist-BaHsDOWa.mjs} +1124 -29
  8. package/dist/{dist-CBEUVjTS.js → dist-BqI10eLV.js} +1129 -28
  9. package/dist/{model-catalogs-BnCdB2A3.mjs → model-catalogs-DM5sVj1T.mjs} +1 -1
  10. package/dist/{model-catalogs-D5YksA5A.js → model-catalogs-DhGVt_sH.js} +1 -1
  11. package/dist/motion-wasm/index.js +1 -1
  12. package/dist/motion-wasm/index.mjs +1 -1
  13. package/dist/{node-C3r8kiOo.mjs → node-B0a0dXhg.mjs} +38 -3
  14. package/dist/{node-DMgi6pND.js → node-CgwqjGz0.js} +42 -1
  15. package/dist/pipeline-runner/index.js +4 -4
  16. package/dist/pipeline-runner/index.mjs +4 -4
  17. package/dist/{process-memory-GFR7fxpJ.js → process-memory-C0zbWvwD.js} +1 -1
  18. package/dist/{process-memory-X0ws1SGJ.mjs → process-memory-sfdcLVkW.mjs} +1 -1
  19. package/dist/recorder/index.js +357 -516
  20. package/dist/recorder/index.mjs +357 -516
  21. package/dist/{segment-demux-js-CSQVhbFI.js → segment-demux-js-B9lL2VCC.js} +1 -1
  22. package/dist/{segment-demux-js-IKEO1XBz.mjs → segment-demux-js-BB4CUAB5.mjs} +1 -1
  23. package/dist/stream-broker/_stub.js +2 -2
  24. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-DPFTlVoW.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-CbN9DjoK.mjs} +3 -3
  25. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-Boq8JqyD.mjs +26 -0
  26. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-B25q1OKG.mjs +26 -0
  27. package/dist/stream-broker/demux-worker-child.js +1 -1
  28. package/dist/stream-broker/demux-worker-child.mjs +1 -1
  29. package/dist/stream-broker/{hostInit-BOp1_Hhk.mjs → hostInit-BSYHAfPt.mjs} +3 -3
  30. package/dist/stream-broker/index.js +556 -32
  31. package/dist/stream-broker/index.mjs +556 -32
  32. package/dist/stream-broker/remoteEntry.js +1 -1
  33. package/package.json +1 -1
  34. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-B7wsxLrK.mjs +0 -26
  35. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-BohOb2Cl.mjs +0 -26
@@ -1,5 +1,5 @@
1
1
  import { createHash } from "node:crypto";
2
- //#region ../types/dist/event-category-C4hVnRo8.mjs
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";
@@ -4105,6 +4123,12 @@ var numberProcessor = (schema, ctx, _json, _params) => {
4105
4123
  var booleanProcessor = (_schema, _ctx, json, _params) => {
4106
4124
  json.type = "boolean";
4107
4125
  };
4126
+ var bigintProcessor = (_schema, ctx, _json, _params) => {
4127
+ if (ctx.unrepresentable === "throw") throw new Error("BigInt cannot be represented in JSON Schema");
4128
+ };
4129
+ var symbolProcessor = (_schema, ctx, _json, _params) => {
4130
+ if (ctx.unrepresentable === "throw") throw new Error("Symbols cannot be represented in JSON Schema");
4131
+ };
4108
4132
  var nullProcessor = (_schema, ctx, json, _params) => {
4109
4133
  if (ctx.target === "openapi-3.0") {
4110
4134
  json.type = "string";
@@ -4112,12 +4136,17 @@ var nullProcessor = (_schema, ctx, json, _params) => {
4112
4136
  json.enum = [null];
4113
4137
  } else json.type = "null";
4114
4138
  };
4139
+ var undefinedProcessor = (_schema, ctx, _json, _params) => {
4140
+ if (ctx.unrepresentable === "throw") throw new Error("Undefined cannot be represented in JSON Schema");
4141
+ };
4115
4142
  var voidProcessor = (_schema, ctx, _json, _params) => {
4116
4143
  if (ctx.unrepresentable === "throw") throw new Error("Void cannot be represented in JSON Schema");
4117
4144
  };
4118
4145
  var neverProcessor = (_schema, _ctx, json, _params) => {
4119
4146
  json.not = {};
4120
4147
  };
4148
+ var anyProcessor = (_schema, _ctx, _json, _params) => {};
4149
+ var unknownProcessor = (_schema, _ctx, _json, _params) => {};
4121
4150
  var dateProcessor = (_schema, ctx, _json, _params) => {
4122
4151
  if (ctx.unrepresentable === "throw") throw new Error("Date cannot be represented in JSON Schema");
4123
4152
  };
@@ -4149,12 +4178,53 @@ var literalProcessor = (schema, ctx, json, _params) => {
4149
4178
  json.enum = vals;
4150
4179
  }
4151
4180
  };
4181
+ var nanProcessor = (_schema, ctx, _json, _params) => {
4182
+ if (ctx.unrepresentable === "throw") throw new Error("NaN cannot be represented in JSON Schema");
4183
+ };
4184
+ var templateLiteralProcessor = (schema, _ctx, json, _params) => {
4185
+ const _json = json;
4186
+ const pattern = schema._zod.pattern;
4187
+ if (!pattern) throw new Error("Pattern not found in template literal");
4188
+ _json.type = "string";
4189
+ _json.pattern = pattern.source;
4190
+ };
4191
+ var fileProcessor = (schema, _ctx, json, _params) => {
4192
+ const _json = json;
4193
+ const file = {
4194
+ type: "string",
4195
+ format: "binary",
4196
+ contentEncoding: "binary"
4197
+ };
4198
+ const { minimum, maximum, mime } = schema._zod.bag;
4199
+ if (minimum !== void 0) file.minLength = minimum;
4200
+ if (maximum !== void 0) file.maxLength = maximum;
4201
+ if (mime) if (mime.length === 1) {
4202
+ file.contentMediaType = mime[0];
4203
+ Object.assign(_json, file);
4204
+ } else {
4205
+ Object.assign(_json, file);
4206
+ _json.anyOf = mime.map((m) => ({ contentMediaType: m }));
4207
+ }
4208
+ else Object.assign(_json, file);
4209
+ };
4210
+ var successProcessor = (_schema, _ctx, json, _params) => {
4211
+ json.type = "boolean";
4212
+ };
4152
4213
  var customProcessor = (_schema, ctx, _json, _params) => {
4153
4214
  if (ctx.unrepresentable === "throw") throw new Error("Custom types cannot be represented in JSON Schema");
4154
4215
  };
4216
+ var functionProcessor = (_schema, ctx, _json, _params) => {
4217
+ if (ctx.unrepresentable === "throw") throw new Error("Function types cannot be represented in JSON Schema");
4218
+ };
4155
4219
  var transformProcessor = (_schema, ctx, _json, _params) => {
4156
4220
  if (ctx.unrepresentable === "throw") throw new Error("Transforms cannot be represented in JSON Schema");
4157
4221
  };
4222
+ var mapProcessor = (_schema, ctx, _json, _params) => {
4223
+ if (ctx.unrepresentable === "throw") throw new Error("Map cannot be represented in JSON Schema");
4224
+ };
4225
+ var setProcessor = (_schema, ctx, _json, _params) => {
4226
+ if (ctx.unrepresentable === "throw") throw new Error("Set cannot be represented in JSON Schema");
4227
+ };
4158
4228
  var arrayProcessor = (schema, ctx, _json, params) => {
4159
4229
  const json = _json;
4160
4230
  const def = schema._zod.def;
@@ -4359,6 +4429,12 @@ var readonlyProcessor = (schema, ctx, json, params) => {
4359
4429
  seen.ref = def.innerType;
4360
4430
  json.readOnly = true;
4361
4431
  };
4432
+ var promiseProcessor = (schema, ctx, _json, params) => {
4433
+ const def = schema._zod.def;
4434
+ process(def.innerType, ctx, params);
4435
+ const seen = ctx.seen.get(schema);
4436
+ seen.ref = def.innerType;
4437
+ };
4362
4438
  var optionalProcessor = (schema, ctx, _json, params) => {
4363
4439
  const def = schema._zod.def;
4364
4440
  process(def.innerType, ctx, params);
@@ -4371,6 +4447,81 @@ var lazyProcessor = (schema, ctx, _json, params) => {
4371
4447
  const seen = ctx.seen.get(schema);
4372
4448
  seen.ref = innerType;
4373
4449
  };
4450
+ var allProcessors = {
4451
+ string: stringProcessor,
4452
+ number: numberProcessor,
4453
+ boolean: booleanProcessor,
4454
+ bigint: bigintProcessor,
4455
+ symbol: symbolProcessor,
4456
+ null: nullProcessor,
4457
+ undefined: undefinedProcessor,
4458
+ void: voidProcessor,
4459
+ never: neverProcessor,
4460
+ any: anyProcessor,
4461
+ unknown: unknownProcessor,
4462
+ date: dateProcessor,
4463
+ enum: enumProcessor,
4464
+ literal: literalProcessor,
4465
+ nan: nanProcessor,
4466
+ template_literal: templateLiteralProcessor,
4467
+ file: fileProcessor,
4468
+ success: successProcessor,
4469
+ custom: customProcessor,
4470
+ function: functionProcessor,
4471
+ transform: transformProcessor,
4472
+ map: mapProcessor,
4473
+ set: setProcessor,
4474
+ array: arrayProcessor,
4475
+ object: objectProcessor,
4476
+ union: unionProcessor,
4477
+ intersection: intersectionProcessor,
4478
+ tuple: tupleProcessor,
4479
+ record: recordProcessor,
4480
+ nullable: nullableProcessor,
4481
+ nonoptional: nonoptionalProcessor,
4482
+ default: defaultProcessor,
4483
+ prefault: prefaultProcessor,
4484
+ catch: catchProcessor,
4485
+ pipe: pipeProcessor,
4486
+ readonly: readonlyProcessor,
4487
+ promise: promiseProcessor,
4488
+ optional: optionalProcessor,
4489
+ lazy: lazyProcessor
4490
+ };
4491
+ function toJSONSchema(input, params) {
4492
+ if ("_idmap" in input) {
4493
+ const registry = input;
4494
+ const ctx = initializeContext({
4495
+ ...params,
4496
+ processors: allProcessors
4497
+ });
4498
+ const defs = {};
4499
+ for (const entry of registry._idmap.entries()) {
4500
+ const [_, schema] = entry;
4501
+ process(schema, ctx);
4502
+ }
4503
+ const schemas = {};
4504
+ ctx.external = {
4505
+ registry,
4506
+ uri: params?.uri,
4507
+ defs
4508
+ };
4509
+ for (const entry of registry._idmap.entries()) {
4510
+ const [key, schema] = entry;
4511
+ extractDefs(ctx, schema);
4512
+ schemas[key] = finalize(ctx, schema);
4513
+ }
4514
+ if (Object.keys(defs).length > 0) schemas.__shared = { [ctx.target === "draft-2020-12" ? "$defs" : "definitions"]: defs };
4515
+ return { schemas };
4516
+ }
4517
+ const ctx = initializeContext({
4518
+ ...params,
4519
+ processors: allProcessors
4520
+ });
4521
+ process(input, ctx);
4522
+ extractDefs(ctx, input);
4523
+ return finalize(ctx, input);
4524
+ }
4374
4525
  //#endregion
4375
4526
  //#region ../../node_modules/zod/v4/classic/iso.js
4376
4527
  var ZodISODateTime = /*@__PURE__*/ $constructor("ZodISODateTime", (inst, def) => {
@@ -5387,7 +5538,7 @@ var ZodIssueCode = {
5387
5538
  var ZodFirstPartyTypeKind;
5388
5539
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5389
5540
  //#endregion
5390
- //#region ../types/dist/sleep-bwsTj221.mjs
5541
+ //#region ../types/dist/sleep-bZIhUvjd.mjs
5391
5542
  /**
5392
5543
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5393
5544
  * window to float samples (D455).
@@ -5536,7 +5687,7 @@ function isKeychainStoredField(field) {
5536
5687
  var SECRET_CLEAR = { $secretClear: true };
5537
5688
  /** The `'***'` token D634 redaction writes for non-admins. */
5538
5689
  var LEGACY_DEVICE_REDACTION = "***";
5539
- function isRecord$2$1(value) {
5690
+ function isRecord$5(value) {
5540
5691
  return typeof value === "object" && value !== null && !Array.isArray(value);
5541
5692
  }
5542
5693
  function makeSecretMarker(ref) {
@@ -5547,12 +5698,12 @@ function makeSecretMarker(ref) {
5547
5698
  }
5548
5699
  /** A stored marker: an object whose `$secret` is a non-empty string. */
5549
5700
  function isSecretMarker(value) {
5550
- if (!isRecord$2$1(value)) return false;
5701
+ if (!isRecord$5(value)) return false;
5551
5702
  const ref = value["$secret"];
5552
5703
  return typeof ref === "string" && ref.length > 0;
5553
5704
  }
5554
5705
  function isSecretClear(value) {
5555
- return isRecord$2$1(value) && value["$secretClear"] === true;
5706
+ return isRecord$5(value) && value["$secretClear"] === true;
5556
5707
  }
5557
5708
  /**
5558
5709
  * The UI view of a stored secret field value: a marker becomes "set", inline
@@ -6178,7 +6329,7 @@ var KeychainWriteRefusedError = class extends Error {
6178
6329
  }
6179
6330
  };
6180
6331
  var KEEP = { kind: "keep" };
6181
- function isRecord$1(value) {
6332
+ function isRecord$4(value) {
6182
6333
  return typeof value === "object" && value !== null && !Array.isArray(value);
6183
6334
  }
6184
6335
  function defaultMintId() {
@@ -6191,7 +6342,7 @@ function collectSecretMarkerRefs(value, out = []) {
6191
6342
  return out;
6192
6343
  }
6193
6344
  if (Array.isArray(value)) for (const item of value) collectSecretMarkerRefs(item, out);
6194
- else if (isRecord$1(value)) for (const child of Object.values(value)) collectSecretMarkerRefs(child, out);
6345
+ else if (isRecord$4(value)) for (const child of Object.values(value)) collectSecretMarkerRefs(child, out);
6195
6346
  return out;
6196
6347
  }
6197
6348
  async function storedValueEquals(secrets, marker, candidate) {
@@ -6246,7 +6397,7 @@ function rowId(row, idKey) {
6246
6397
  return null;
6247
6398
  }
6248
6399
  async function writeArray(ctx, node, incoming, stored, fieldPath) {
6249
- const storedRows = Array.isArray(stored) ? stored.filter(isRecord$1) : [];
6400
+ const storedRows = Array.isArray(stored) ? stored.filter(isRecord$4) : [];
6250
6401
  if (!Array.isArray(incoming)) {
6251
6402
  ctx.deletes.push(...collectSecretMarkerRefs(storedRows));
6252
6403
  return {
@@ -6262,7 +6413,7 @@ async function writeArray(ctx, node, incoming, stored, fieldPath) {
6262
6413
  const kept = /* @__PURE__ */ new Set();
6263
6414
  const rows = [];
6264
6415
  for (const row of incoming) {
6265
- if (!isRecord$1(row)) {
6416
+ if (!isRecord$4(row)) {
6266
6417
  rows.push(row);
6267
6418
  continue;
6268
6419
  }
@@ -6287,7 +6438,7 @@ async function writeNode(ctx, node, incoming, stored, fieldPath) {
6287
6438
  case "leaf": return writeLeaf(ctx, incoming, stored, fieldPath);
6288
6439
  case "array": return writeArray(ctx, node, incoming, stored, fieldPath);
6289
6440
  case "object": {
6290
- if (!isRecord$1(incoming)) {
6441
+ if (!isRecord$4(incoming)) {
6291
6442
  if (incoming === void 0) return KEEP;
6292
6443
  ctx.deletes.push(...collectSecretMarkerRefs(stored));
6293
6444
  return {
@@ -6295,7 +6446,7 @@ async function writeNode(ctx, node, incoming, stored, fieldPath) {
6295
6446
  value: incoming
6296
6447
  };
6297
6448
  }
6298
- const storedObj = isRecord$1(stored) ? stored : {};
6449
+ const storedObj = isRecord$4(stored) ? stored : {};
6299
6450
  return {
6300
6451
  kind: "value",
6301
6452
  value: await writeMembers(ctx, node.children, incoming, storedObj, (m) => `${fieldPath}.${m}`)
@@ -6418,7 +6569,7 @@ async function resolveSecretMarkers(value, secrets, options = {}) {
6418
6569
  value: items
6419
6570
  };
6420
6571
  }
6421
- if (isRecord$1(v)) {
6572
+ if (isRecord$4(v)) {
6422
6573
  const out = {};
6423
6574
  for (const [k, child] of Object.entries(v)) {
6424
6575
  const s = substitute(child);
@@ -6450,7 +6601,7 @@ var SecretOverwriteRefusedError = class extends Error {
6450
6601
  this.name = "SecretOverwriteRefusedError";
6451
6602
  }
6452
6603
  };
6453
- function isRecord(value) {
6604
+ function isRecord$3(value) {
6454
6605
  return typeof value === "object" && value !== null && !Array.isArray(value);
6455
6606
  }
6456
6607
  function resolvedValue(pass, marker) {
@@ -6479,7 +6630,7 @@ function inArray(pass, incoming, stored) {
6479
6630
  return incoming.map((item, index) => {
6480
6631
  const twin = stored[index];
6481
6632
  if (isSecretMarker(twin)) return typeof item === "string" && item === resolvedValue(pass, twin) ? twin : item;
6482
- if (isRecord(item) && isRecord(twin)) return inArrayRow(pass, item, twin);
6633
+ if (isRecord$3(item) && isRecord$3(twin)) return inArrayRow(pass, item, twin);
6483
6634
  if (Array.isArray(item) && Array.isArray(twin)) return inArray(pass, item, twin);
6484
6635
  return item;
6485
6636
  });
@@ -6490,7 +6641,7 @@ function inArrayRow(pass, incoming, stored) {
6490
6641
  const twin = stored[key];
6491
6642
  if (isSecretMarker(twin)) {
6492
6643
  if (typeof value === "string" && value === resolvedValue(pass, twin)) out[key] = twin;
6493
- } else if (isRecord(value) && isRecord(twin)) out[key] = inArrayRow(pass, value, twin);
6644
+ } else if (isRecord$3(value) && isRecord$3(twin)) out[key] = inArrayRow(pass, value, twin);
6494
6645
  else if (Array.isArray(value) && Array.isArray(twin)) out[key] = inArray(pass, value, twin);
6495
6646
  }
6496
6647
  return out;
@@ -6498,7 +6649,7 @@ function inArrayRow(pass, incoming, stored) {
6498
6649
  async function walk(pass, incoming, stored) {
6499
6650
  if (isSecretMarker(stored)) return atMarker(pass, incoming, stored);
6500
6651
  if (Array.isArray(incoming) && Array.isArray(stored)) return inArray(pass, incoming, stored);
6501
- if (!isRecord(incoming) || !isRecord(stored)) return incoming;
6652
+ if (!isRecord$3(incoming) || !isRecord$3(stored)) return incoming;
6502
6653
  const out = { ...incoming };
6503
6654
  for (const [key, value] of Object.entries(incoming)) out[key] = await walk(pass, value, stored[key]);
6504
6655
  return out;
@@ -6529,7 +6680,7 @@ async function restoreUnchangedSecrets(input) {
6529
6680
  function isJsonEqual(a, b) {
6530
6681
  if (Object.is(a, b)) return true;
6531
6682
  if (Array.isArray(a)) return Array.isArray(b) && a.length === b.length && a.every((v, i) => isJsonEqual(v, b[i]));
6532
- if (isRecord(a) && isRecord(b)) {
6683
+ if (isRecord$3(a) && isRecord$3(b)) {
6533
6684
  const keys = Object.keys(a);
6534
6685
  if (keys.length !== Object.keys(b).length) return false;
6535
6686
  return keys.every((k) => Object.prototype.hasOwnProperty.call(b, k) && isJsonEqual(a[k], b[k]));
@@ -6553,7 +6704,7 @@ function markerKeysOf(blob, owner) {
6553
6704
  }
6554
6705
  function nodeFromStored(value, owner) {
6555
6706
  if (isSecretMarker(value)) return isSecretRefOwnedBy(value.$secret, owner) ? { kind: "leaf" } : null;
6556
- if (!isRecord(value)) return null;
6707
+ if (!isRecord$3(value)) return null;
6557
6708
  const children = /* @__PURE__ */ new Map();
6558
6709
  for (const [key, child] of Object.entries(value)) {
6559
6710
  const node = nodeFromStored(child, owner);
@@ -7341,7 +7492,7 @@ var BaseAddon = class {
7341
7492
  if (!ctx) return;
7342
7493
  const addonId = ctx.id;
7343
7494
  setImmediate(() => {
7344
- ctx.api.addons?.restartAddon?.mutate({ addonId }).then(() => {
7495
+ ctx.api.addons.restartAddon.mutate({ addonId }).then(() => {
7345
7496
  ctx.logger.info("addon auto-restart triggered by restart-required setting change", { meta: { changedFields: patchKeys.filter((k) => restartKeys.has(k)) } });
7346
7497
  }).catch((err) => {
7347
7498
  ctx.logger.error("addon auto-restart failed", { meta: { error: err instanceof Error ? err.message : String(err) } });
@@ -7835,6 +7986,303 @@ var PeerBytesTicketSchema = object({
7835
7986
  */
7836
7987
  declaredBytes: number().int().nonnegative().nullable()
7837
7988
  });
7989
+ /** Limits and names of `ctx.records` (D881). One authority; the engine and the facade read it. */
7990
+ /** The files a kind may live in. `history` is device-history's (D850), never records. */
7991
+ var RECORD_DATABASES = ["settings", "events"];
7992
+ /** The classes of a kind: the `@durable` vocabulary, one authority (replaces the annotation). */
7993
+ var RECORD_CLASSES = [
7994
+ "config",
7995
+ "ledger",
7996
+ "audit",
7997
+ "mirror",
7998
+ "ephemeral"
7999
+ ];
8000
+ var RECORD_DEFAULT_MAX_DATA_BYTES = 64 * 1024;
8001
+ var RECORD_MAX_DATA_BYTES = 1024 * 1024;
8002
+ var RECORD_BATCH_MAX = 1e3;
8003
+ var RECORD_QUERY_MAX = 1e3;
8004
+ /** A kind in the `settings` file may not bound itself above this (D447: high volume is `events`). */
8005
+ var RECORD_SETTINGS_MAX_ROWS = 5e4;
8006
+ var PREFIX = "records/";
8007
+ /** The base of every records failure. `detail` is the human part of the message. */
8008
+ var RecordsError = class extends Error {
8009
+ code;
8010
+ detail;
8011
+ constructor(code, detail) {
8012
+ super(`${PREFIX}${code}: ${detail}`);
8013
+ this.name = "RecordsError";
8014
+ this.code = code;
8015
+ this.detail = detail;
8016
+ }
8017
+ };
8018
+ var InvalidRecordError = class extends RecordsError {
8019
+ constructor(detail) {
8020
+ super("invalid-record", detail);
8021
+ this.name = "InvalidRecordError";
8022
+ }
8023
+ };
8024
+ /** A kind declaration the engine refuses (non-additive change, bad shape, wrong file). */
8025
+ var DeclarationRefusedError = class extends RecordsError {
8026
+ constructor(detail) {
8027
+ super("declaration-refused", detail);
8028
+ this.name = "DeclarationRefusedError";
8029
+ }
8030
+ };
8031
+ function defOf(schema) {
8032
+ const zodBag = Reflect.get(schema, "_zod");
8033
+ if (typeof zodBag !== "object" || zodBag === null) return {};
8034
+ const def = Reflect.get(zodBag, "def");
8035
+ if (typeof def !== "object" || def === null) return {};
8036
+ return def;
8037
+ }
8038
+ function declaredHere(schema) {
8039
+ return globalRegistry.get(schema)?.secret === true;
8040
+ }
8041
+ /** Wrapper kinds whose `innerType` is the field itself. */
8042
+ var WRAPPERS = new Set([
8043
+ "optional",
8044
+ "nullable",
8045
+ "default",
8046
+ "prefault",
8047
+ "catch",
8048
+ "readonly",
8049
+ "nonoptional"
8050
+ ]);
8051
+ /**
8052
+ * The schema layers that make up ONE field: the schema itself and every
8053
+ * wrapper below it (optional / default / nullable / readonly / catch), plus
8054
+ * both sides of a pipe (`z.preprocess` puts the real schema on `out`,
8055
+ * `.transform` on `in`).
8056
+ */
8057
+ function layersOf(schema) {
8058
+ const out = [];
8059
+ const queue = [schema];
8060
+ while (queue.length > 0) {
8061
+ const s = queue.shift();
8062
+ if (!s || out.includes(s)) continue;
8063
+ out.push(s);
8064
+ const def = defOf(s);
8065
+ if (def.type !== void 0 && WRAPPERS.has(def.type) && def.innerType) queue.push(def.innerType);
8066
+ if (def.type === "pipe") {
8067
+ if (def.in) queue.push(def.in);
8068
+ if (def.out) queue.push(def.out);
8069
+ }
8070
+ }
8071
+ return out;
8072
+ }
8073
+ /** True when any layer of this field declares `.meta({ secret: true })`. */
8074
+ function isZodSecret(schema) {
8075
+ return layersOf(schema).some(declaredHere);
8076
+ }
8077
+ /**
8078
+ * Every declared secret path in a config schema: dotted keys, `[]` for "each
8079
+ * element of this array" (`connection.password`, `rows[].token`). A declared
8080
+ * object or array is reported as one path and not descended into — everything
8081
+ * under it is secret.
8082
+ */
8083
+ function collectZodSecretPaths(schema, prefix = "") {
8084
+ if (isZodSecret(schema)) return prefix.length > 0 ? [prefix] : [];
8085
+ const paths = [];
8086
+ for (const layer of layersOf(schema)) {
8087
+ const def = defOf(layer);
8088
+ if (def.type === "object" && def.shape) for (const [key, child] of Object.entries(def.shape)) paths.push(...collectZodSecretPaths(child, prefix ? `${prefix}.${key}` : key));
8089
+ else if (def.type === "array" && def.element) paths.push(...collectZodSecretPaths(def.element, `${prefix}[]`));
8090
+ else if (def.type === "union" && def.options) for (const option of def.options) paths.push(...collectZodSecretPaths(option, prefix));
8091
+ else if (def.type === "intersection") {
8092
+ if (def.left) paths.push(...collectZodSecretPaths(def.left, prefix));
8093
+ if (def.right) paths.push(...collectZodSecretPaths(def.right, prefix));
8094
+ }
8095
+ }
8096
+ return [...new Set(paths)];
8097
+ }
8098
+ /**
8099
+ * Secret fields of a record, addressed the way a Zod schema declares them
8100
+ * (`collectZodSecretPaths`): dotted keys, `[]` for "each element of this array"
8101
+ * (`auth.accessToken`, `headers[].value`).
8102
+ *
8103
+ * Array elements are matched by a DECLARED id key (`secretArrayKeys`:
8104
+ * `{ headers: 'name' }`), never by index, so reordering a list keeps every
8105
+ * keychain ref (the same rule as `arrayItemFieldPath`). The concrete path of a
8106
+ * leaf names its element: `headers[X-Api].value`.
8107
+ *
8108
+ * Pure and browser-safe. Nothing here mutates: every transform returns a new value.
8109
+ */
8110
+ /** The array prefixes (declared form, e.g. `headers` or `a.headers`) of a path. */
8111
+ function parseSecretPath(path) {
8112
+ if (path.length === 0) throw new InvalidRecordError("an empty secret path");
8113
+ return path.split(".").map((raw) => {
8114
+ const each = raw.endsWith("[]");
8115
+ const key = each ? raw.slice(0, -2) : raw;
8116
+ if (key.length === 0) throw new InvalidRecordError(`secret path "${path}" has an empty segment`);
8117
+ return {
8118
+ key,
8119
+ each
8120
+ };
8121
+ });
8122
+ }
8123
+ /** The declared array prefixes of `path` that need an id key (`headers`, `a.rows`). */
8124
+ function secretArrayPrefixes(path) {
8125
+ const segments = parseSecretPath(path);
8126
+ const prefixes = [];
8127
+ const walked = [];
8128
+ for (const segment of segments) {
8129
+ walked.push(segment.key);
8130
+ if (segment.each) prefixes.push(walked.join("."));
8131
+ }
8132
+ return prefixes;
8133
+ }
8134
+ /**
8135
+ * Record kinds (D881): the declaration an addon makes of one kind of fact, the
8136
+ * Zod row schema that describes it, and the helper that turns the two into the
8137
+ * JSON the engine stores.
8138
+ *
8139
+ * A kind is declared ONCE, next to the code that owns it, and the engine's
8140
+ * reconciler creates its indexes - nothing creates DDL at runtime from a write.
8141
+ * Everything the generic machinery needs (secret fields, the entry descriptor)
8142
+ * is DERIVED from the Zod schema: `.meta({ secret: true })` marks a credential,
8143
+ * never a field name (D879).
8144
+ */
8145
+ /** A JSON field path: `trackId`, `auth.accessToken`. Charset-restricted: it is rendered into DDL. */
8146
+ var RecordFieldPathSchema = string().regex(/^[A-Za-z_][A-Za-z0-9_]{0,63}(\.[A-Za-z_][A-Za-z0-9_]{0,63}){0,3}$/);
8147
+ var RecordIndexSchema = object({
8148
+ name: string().regex(/^[a-z][a-z0-9_]{0,31}$/),
8149
+ fields: array(RecordFieldPathSchema).min(1).max(4),
8150
+ unique: boolean().optional()
8151
+ }).strict();
8152
+ var RecordRetentionSchema = union([
8153
+ object({
8154
+ ttlMs: number().int().positive(),
8155
+ from: _enum(["at", "write"])
8156
+ }).strict(),
8157
+ object({
8158
+ maxRows: number().int().positive().optional(),
8159
+ maxRowsPerDevice: number().int().positive().optional()
8160
+ }).strict().refine((r) => r.maxRows !== void 0 || r.maxRowsPerDevice !== void 0, { message: "name maxRows, maxRowsPerDevice or both" }),
8161
+ object({
8162
+ owner: string().min(1),
8163
+ reason: string().min(1)
8164
+ }).strict(),
8165
+ object({ none: string().min(1) }).strict()
8166
+ ]);
8167
+ /** The descriptor a generic entries UI reads (D881 "generic entries"). */
8168
+ var EntryDescriptorSchema = object({
8169
+ title: string().min(1),
8170
+ /** The record body field shown as the entry's name. */
8171
+ nameField: string().min(1),
8172
+ /** JSON Schema of the entry body; `secret: true` marks a password field. */
8173
+ fields: record(string(), unknown())
8174
+ }).strict();
8175
+ /** What crosses the wire and sits in the engine's catalog: JSON only, no Zod. */
8176
+ var RecordKindDeclarationSchema = object({
8177
+ database: _enum(RECORD_DATABASES).default("settings"),
8178
+ class: _enum(RECORD_CLASSES),
8179
+ writeTrigger: string().min(1),
8180
+ device: _enum([
8181
+ "required",
8182
+ "optional",
8183
+ "none"
8184
+ ]).default("none"),
8185
+ at: _enum(["required", "none"]).default("none"),
8186
+ indexes: array(RecordIndexSchema).max(8).default([]),
8187
+ retention: RecordRetentionSchema,
8188
+ deviceRemoval: _enum(["delete", "none"]).default("none"),
8189
+ maxDataBytes: number().int().positive().max(RECORD_MAX_DATA_BYTES).default(RECORD_DEFAULT_MAX_DATA_BYTES),
8190
+ /** Derived from the Zod schema; never written by hand. */
8191
+ secretPaths: array(string().min(1)).default([]),
8192
+ /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
8193
+ secretArrayKeys: record(string(), string()).default({}),
8194
+ /** The legacy table this kind adopts from; the boot guard reads it (D853: no migration code). */
8195
+ adoptsFrom: string().min(1).optional(),
8196
+ /** Kinds that must agree through `transact` sit in one file under one family name. */
8197
+ transactFamily: string().min(1).optional(),
8198
+ entry: EntryDescriptorSchema.optional()
8199
+ }).strict();
8200
+ /** The kind names: lower-case, dash separated, short enough for an index name. */
8201
+ var RecordKindNameSchema = string().regex(/^[a-z][a-z0-9-]{0,47}$/);
8202
+ /** Cross-field rules a declaration must satisfy. Throws {@link DeclarationRefusedError}. */
8203
+ function assertValidDeclaration(name, decl) {
8204
+ const refuse = (why) => {
8205
+ throw new DeclarationRefusedError(`kind "${name}": ${why}`);
8206
+ };
8207
+ if (!RecordKindNameSchema.safeParse(name).success) refuse("the name must be lower-case-dashed");
8208
+ const seen = /* @__PURE__ */ new Set();
8209
+ for (const index of decl.indexes) {
8210
+ if (seen.has(index.name)) refuse(`index name "${index.name}" is declared twice`);
8211
+ seen.add(index.name);
8212
+ }
8213
+ const { retention } = decl;
8214
+ const hasSecrets = decl.secretPaths.length > 0;
8215
+ if ("ttlMs" in retention) {
8216
+ if (retention.from === "at" && decl.at !== "required") refuse("a ttl from \"at\" needs at: \"required\"");
8217
+ if (hasSecrets) refuse("a kind with secret fields cannot use engine TTL (its keychain values would be orphaned)");
8218
+ }
8219
+ if ("maxRows" in retention || "maxRowsPerDevice" in retention) {
8220
+ if (retention.maxRowsPerDevice !== void 0 && decl.device !== "required") refuse("maxRowsPerDevice needs device: \"required\"");
8221
+ if (decl.at !== "required") refuse("a row bound trims the oldest \"at\": it needs at: \"required\"");
8222
+ if (hasSecrets) refuse("a kind with secret fields cannot use an engine row bound");
8223
+ const bound = Math.max(retention.maxRows ?? 0, retention.maxRowsPerDevice ?? 0);
8224
+ if (decl.database === "settings" && bound > 5e4) refuse(`a row bound above ${RECORD_SETTINGS_MAX_ROWS} belongs in database: "events" (a big delete on the settings thread stalls every configuration read)`);
8225
+ }
8226
+ if (decl.deviceRemoval === "delete" && decl.device === "none") refuse("deviceRemoval: \"delete\" needs a device: \"required\" or \"optional\"");
8227
+ for (const path of decl.secretPaths) for (const prefix of secretArrayPrefixes(path)) if (decl.secretArrayKeys[prefix] === void 0) refuse(`secret path "${path}" crosses the array "${prefix}": declare its id key in secretArrayKeys`);
8228
+ }
8229
+ function bodyFieldsOf(schema) {
8230
+ return { ...toJSONSchema(schema, {
8231
+ unrepresentable: "any",
8232
+ io: "input"
8233
+ }) };
8234
+ }
8235
+ function isRecordLike(value) {
8236
+ return typeof value === "object" && value !== null && !Array.isArray(value);
8237
+ }
8238
+ /** Does every branch of the body schema carry `field`? (A discriminated union has several.) */
8239
+ function hasNameField(json, field) {
8240
+ const branches = json["oneOf"] ?? json["anyOf"];
8241
+ if (Array.isArray(branches)) return branches.length > 0 && branches.every((b) => isRecordLike(b) && hasNameField(b, field));
8242
+ const properties = json["properties"];
8243
+ return isRecordLike(properties) && Object.prototype.hasOwnProperty.call(properties, field);
8244
+ }
8245
+ /**
8246
+ * Declare the kinds of a package. The keys are the kind names. The result is
8247
+ * what `ctx.records.declare` sends to the engine and what `ctx.records.kind`
8248
+ * types its handle from.
8249
+ */
8250
+ function defineRecordKinds(specs) {
8251
+ const out = {};
8252
+ for (const [name, spec] of Object.entries(specs)) {
8253
+ const secretPaths = collectZodSecretPaths(spec.schema);
8254
+ const nameField = spec.entry?.nameField ?? "name";
8255
+ const fields = bodyFieldsOf(spec.schema);
8256
+ if (spec.entry !== void 0 && !hasNameField(fields, nameField)) throw new DeclarationRefusedError(`kind "${name}": an entry kind's schema needs a "${nameField}" field`);
8257
+ const parsed = RecordKindDeclarationSchema.parse({
8258
+ database: spec.database,
8259
+ class: spec.class,
8260
+ writeTrigger: spec.writeTrigger,
8261
+ device: spec.device,
8262
+ at: spec.at,
8263
+ indexes: spec.indexes === void 0 ? void 0 : [...spec.indexes],
8264
+ retention: spec.retention,
8265
+ deviceRemoval: spec.deviceRemoval,
8266
+ maxDataBytes: spec.maxDataBytes,
8267
+ secretPaths: [...secretPaths],
8268
+ secretArrayKeys: spec.secretArrayKeys === void 0 ? void 0 : { ...spec.secretArrayKeys },
8269
+ adoptsFrom: spec.adoptsFrom,
8270
+ transactFamily: spec.transactFamily,
8271
+ entry: spec.entry === void 0 ? void 0 : {
8272
+ title: spec.entry.title,
8273
+ nameField,
8274
+ fields
8275
+ }
8276
+ });
8277
+ assertValidDeclaration(name, parsed);
8278
+ out[name] = {
8279
+ name,
8280
+ schema: spec.schema,
8281
+ declaration: parsed
8282
+ };
8283
+ }
8284
+ return out;
8285
+ }
7838
8286
  /** Shared Zod schemas used across streaming capabilities. */
7839
8287
  var CamProfileSchema = _enum([
7840
8288
  "high",
@@ -8601,7 +9049,7 @@ function sleep(ms) {
8601
9049
  return new Promise((resolve) => setTimeout(resolve, Math.max(0, ms)));
8602
9050
  }
8603
9051
  //#endregion
8604
- //#region ../types/dist/err-msg-DLerKiVO.mjs
9052
+ //#region ../types/dist/err-msg--2RrYiLO.mjs
8605
9053
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
8606
9054
  DeviceType["Camera"] = "camera";
8607
9055
  DeviceType["Hub"] = "hub";
@@ -8870,6 +9318,9 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
8870
9318
  /** Virtual HA toggle (input_boolean.*) — distinguishable from a
8871
9319
  * real Switch device for UI rendering / export adapters. */
8872
9320
  DeviceRole["BinaryHelper"] = "binary-helper";
9321
+ /** A smart plug: a `switch` whose source says it is an outlet (HA
9322
+ * `device_class: outlet`). The Alexa export shows it as a SMARTPLUG. */
9323
+ DeviceRole["Outlet"] = "outlet";
8873
9324
  /** Generic motion / occupancy / moving event source. Distinct from
8874
9325
  * the camera accessory PirSensor role: that one is a camera child;
8875
9326
  * this is a standalone HA / 3rd-party motion sensor. */
@@ -8947,7 +9398,7 @@ function errMsg(err) {
8947
9398
  return String(err);
8948
9399
  }
8949
9400
  //#endregion
8950
- //#region ../types/dist/composition-EQ9Ok0Ee.mjs
9401
+ //#region ../types/dist/composition-DOwQB_Ua.mjs
8951
9402
  var AUDIO_ENCODER_BY_CODEC = {
8952
9403
  opus: "libopus",
8953
9404
  aac: "aac",
@@ -18410,6 +18861,41 @@ var ComposableCapabilitiesSchema = object({ caps: array(object({
18410
18861
  keyField: string()
18411
18862
  }).optional()
18412
18863
  })) });
18864
+ /**
18865
+ * The report of a one-shot "move this owner's plaintext secrets into the
18866
+ * keychain" run (D878). COUNTS only - never a value, never a ref.
18867
+ *
18868
+ * The owner runs it on its own rows, through its own write path; an operator
18869
+ * script (`scripts/hub/migrate-raw-secrets.ts`) calls the owner's cap method.
18870
+ * Dry run (`apply: false`) reports what WOULD move and changes nothing.
18871
+ */
18872
+ var RawSecretMigrationInputSchema = object({
18873
+ /** `false` (the default of the script) = report only. */
18874
+ apply: boolean() });
18875
+ var RawSecretMigrationReportSchema = object({
18876
+ apply: boolean(),
18877
+ /** Rows that can carry a secret (a profile, an enrolment). */
18878
+ rows: number().int(),
18879
+ /** Rows whose secret was plaintext when the run started. */
18880
+ raw: number().int(),
18881
+ /** Rows that already held a keychain marker when the run started. */
18882
+ markers: number().int(),
18883
+ /** Plaintext rows moved by THIS run (always 0 on a dry run). */
18884
+ migrated: number().int(),
18885
+ /** Plaintext rows left in place because the move or its read-back failed. */
18886
+ failed: number().int(),
18887
+ /** After the run: rows still holding plaintext. */
18888
+ remainingRaw: number().int(),
18889
+ /** After the run: markers the keychain could not resolve right now. */
18890
+ unresolvedMarkers: number().int(),
18891
+ /**
18892
+ * A second, redundant copy of the secrets' rows that the run found (and, on
18893
+ * `apply`, deleted after verifying the first). Owners with a single copy omit it.
18894
+ */
18895
+ redundantCopies: number().int().optional(),
18896
+ /** True when nothing is raw and every marker resolves. */
18897
+ verified: boolean()
18898
+ });
18413
18899
  /** Where a block runs. The operator chooses — a block driving a device on an
18414
18900
  * agent is the reason placement is not fixed to the hub. */
18415
18901
  var CoreBlockPlacementSchema = union([literal("hub"), string().min(1)]);
@@ -18636,6 +19122,9 @@ method(object({}), object({ blocks: array(CoreBlockSchema) }), { auth: "admin" }
18636
19122
  }), SettingsUpdateResultSchema, {
18637
19123
  kind: "mutation",
18638
19124
  auth: "admin"
19125
+ }), method(RawSecretMigrationInputSchema, RawSecretMigrationReportSchema, {
19126
+ kind: "mutation",
19127
+ auth: "admin"
18639
19128
  }), method(object({}), object({ libs: array(object({
18640
19129
  filePath: string(),
18641
19130
  content: string()
@@ -18898,6 +19387,222 @@ id: union([string(), number()]) }), {
18898
19387
  kind: "mutation",
18899
19388
  auth: "admin"
18900
19389
  });
19390
+ /**
19391
+ * records - an addon's own facts and documents (D881): ledgers, audit rows,
19392
+ * config documents, mirrors. The third storage API next to `ctx.settings`
19393
+ * (operator intent, D870) and device-history (numbers over time, D850).
19394
+ *
19395
+ * Who the OWNER is: `callerAddonId`, stamped by the transport on a call that
19396
+ * crossed a process and stated by a hub in-process caller (`ctx.records` does
19397
+ * that with the addon id closed over). It is deliberately NOT in any input
19398
+ * schema, so a session can never supply it, and a call with no stamp is refused
19399
+ * `records/no-caller`. A kind is readable and writable only by its owner; other
19400
+ * addons go through the owner's capability.
19401
+ *
19402
+ * Every read is three-way: a row, `null`, or the call THROWS. A failed read is
19403
+ * never `[]`. Secret fields are never on the wire: a read shows the
19404
+ * redaction token, `secretRefs` hands the owner's `ctx.secrets` the refs it
19405
+ * resolves itself, and a write may carry only a keychain marker bound to the
19406
+ * row's own ref.
19407
+ *
19408
+ * Internal: addons reach it through `ctx.records`, never directly.
19409
+ */
19410
+ var RecordIdSchema = string().min(1).max(256);
19411
+ /** A JSON object body. Size is the engine's check (`maxDataBytes`), not a schema's. */
19412
+ var RecordBodySchema = record(string(), unknown());
19413
+ var RecordInputSchema = object({
19414
+ id: RecordIdSchema,
19415
+ /** The device this row belongs to (D865 removal, per-device reads). */
19416
+ deviceId: number().int().optional(),
19417
+ /** The domain clock, ms: observed / created / opened. */
19418
+ at: number().int().optional(),
19419
+ /** Producer-set expiry, ms. Refused on a kind whose retention is an engine TTL. */
19420
+ expiresAt: number().int().optional(),
19421
+ data: RecordBodySchema
19422
+ });
19423
+ var RecordViewSchema = object({
19424
+ id: string(),
19425
+ deviceId: number().int().nullable(),
19426
+ at: number().nullable(),
19427
+ expiresAt: number().nullable(),
19428
+ rev: number().int(),
19429
+ updatedAt: number(),
19430
+ data: RecordBodySchema
19431
+ });
19432
+ /** Declared index fields only. Anything else does not compile, by design. */
19433
+ var RecordWhereSchema = record(RecordFieldPathSchema, union([
19434
+ string(),
19435
+ number(),
19436
+ boolean(),
19437
+ object({ in: array(union([
19438
+ string(),
19439
+ number(),
19440
+ boolean()
19441
+ ])).min(1).max(RECORD_BATCH_MAX) }),
19442
+ object({
19443
+ gt: union([string(), number()]).optional(),
19444
+ gte: union([string(), number()]).optional(),
19445
+ lt: union([string(), number()]).optional(),
19446
+ lte: union([string(), number()]).optional()
19447
+ }).refine((r) => Object.keys(r).length > 0, { message: "name at least one bound" })
19448
+ ]));
19449
+ var KindShape = { kind: RecordKindNameSchema };
19450
+ var TimeWindowShape = {
19451
+ deviceId: number().int().optional(),
19452
+ atFrom: number().optional(),
19453
+ atTo: number().optional()
19454
+ };
19455
+ var RecordQueryInputSchema = object({
19456
+ ...KindShape,
19457
+ ...TimeWindowShape,
19458
+ where: RecordWhereSchema.optional(),
19459
+ /** Without `where`: `at` (default for a kind with a clock) or `id`. With `where` the order is the index's. */
19460
+ order: _enum(["at", "id"]).optional(),
19461
+ desc: boolean().optional(),
19462
+ limit: number().int().min(1).max(RECORD_QUERY_MAX).default(100),
19463
+ /** Opaque keyset cursor from a previous answer. There is no offset. */
19464
+ cursor: string().min(1).optional()
19465
+ });
19466
+ var RecordQueryResultSchema = object({
19467
+ records: array(RecordViewSchema),
19468
+ nextCursor: string().nullable()
19469
+ });
19470
+ var RecordKindStateSchema = _enum([
19471
+ "created",
19472
+ "unchanged",
19473
+ "updated"
19474
+ ]);
19475
+ var DeclareKindResultSchema = object({
19476
+ kindId: number().int(),
19477
+ state: RecordKindStateSchema,
19478
+ createdIndexes: array(string()),
19479
+ /** The boot guard: the kind is empty while its legacy table still holds rows. */
19480
+ adoptionPending: object({
19481
+ legacyTable: string(),
19482
+ legacyRows: number().int()
19483
+ }).nullable()
19484
+ });
19485
+ /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
19486
+ var SecretRefsList = array(string());
19487
+ var RecordSecretRefsSchema = record(string(), record(string(), string()));
19488
+ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
19489
+ kind: "mutation",
19490
+ auth: "admin"
19491
+ }), method(object({
19492
+ ...KindShape,
19493
+ id: RecordIdSchema
19494
+ }), RecordViewSchema.nullable(), { auth: "admin" }), method(object({
19495
+ ...KindShape,
19496
+ ids: array(RecordIdSchema).min(1).max(RECORD_BATCH_MAX)
19497
+ }), array(RecordViewSchema), { auth: "admin" }), method(object({
19498
+ ...KindShape,
19499
+ ids: array(RecordIdSchema).min(1).max(RECORD_BATCH_MAX)
19500
+ }), RecordSecretRefsSchema, { auth: "admin" }), method(object({
19501
+ ...KindShape,
19502
+ record: RecordInputSchema,
19503
+ /** Compare-and-set. `0` means "the row must not exist". */
19504
+ ifRev: number().int().min(0).optional()
19505
+ }), object({
19506
+ rev: number().int(),
19507
+ releasedRefs: SecretRefsList
19508
+ }), {
19509
+ kind: "mutation",
19510
+ auth: "admin"
19511
+ }), method(object({
19512
+ ...KindShape,
19513
+ records: array(RecordInputSchema).min(1).max(RECORD_BATCH_MAX)
19514
+ }), object({
19515
+ count: number().int(),
19516
+ releasedRefs: SecretRefsList
19517
+ }), {
19518
+ kind: "mutation",
19519
+ auth: "admin"
19520
+ }), method(object({
19521
+ ...KindShape,
19522
+ id: RecordIdSchema,
19523
+ data: RecordBodySchema,
19524
+ at: number().int().nullable().optional(),
19525
+ expiresAt: number().int().nullable().optional(),
19526
+ ifRev: number().int().min(1).optional()
19527
+ }), object({
19528
+ rev: number().int(),
19529
+ releasedRefs: SecretRefsList
19530
+ }), {
19531
+ kind: "mutation",
19532
+ auth: "admin"
19533
+ }), method(object({
19534
+ ...KindShape,
19535
+ id: RecordIdSchema
19536
+ }), object({
19537
+ deleted: boolean(),
19538
+ secretRefs: SecretRefsList
19539
+ }), {
19540
+ kind: "mutation",
19541
+ auth: "admin"
19542
+ }), method(object({
19543
+ ...KindShape,
19544
+ ids: array(RecordIdSchema).min(1).max(RECORD_BATCH_MAX)
19545
+ }), object({
19546
+ deleted: number().int(),
19547
+ secretRefs: SecretRefsList
19548
+ }), {
19549
+ kind: "mutation",
19550
+ auth: "admin"
19551
+ }), method(RecordQueryInputSchema, RecordQueryResultSchema, { auth: "admin" }), method(object({
19552
+ ...KindShape,
19553
+ ...TimeWindowShape,
19554
+ where: RecordWhereSchema.optional()
19555
+ }), object({ count: number().int() }), { auth: "admin" }), method(object({
19556
+ ...KindShape,
19557
+ deviceId: number().int().optional(),
19558
+ from: number(),
19559
+ to: number(),
19560
+ bucketMs: number().int().positive()
19561
+ }), object({ buckets: array(object({
19562
+ bucketStart: number(),
19563
+ count: number().int()
19564
+ })) }), { auth: "admin" }), method(object({
19565
+ ...KindShape,
19566
+ op: _enum([
19567
+ "sum",
19568
+ "min",
19569
+ "max",
19570
+ "count"
19571
+ ]),
19572
+ field: RecordFieldPathSchema.optional(),
19573
+ groupBy: RecordFieldPathSchema.optional(),
19574
+ where: RecordWhereSchema.optional()
19575
+ }), object({ rows: array(object({
19576
+ group: union([
19577
+ string(),
19578
+ number(),
19579
+ _null()
19580
+ ]),
19581
+ value: number().nullable()
19582
+ })) }), { auth: "admin" }), method(object({
19583
+ ...KindShape,
19584
+ deviceId: number().int().optional(),
19585
+ atBefore: number().optional(),
19586
+ where: RecordWhereSchema.optional()
19587
+ }), object({
19588
+ deleted: number().int(),
19589
+ secretRefs: SecretRefsList
19590
+ }), {
19591
+ kind: "mutation",
19592
+ auth: "admin"
19593
+ }), method(object({
19594
+ deviceId: number().int(),
19595
+ kinds: array(RecordKindNameSchema).optional()
19596
+ }), object({
19597
+ deleted: record(string(), number().int()),
19598
+ secretRefs: SecretRefsList
19599
+ }), {
19600
+ kind: "mutation",
19601
+ auth: "admin"
19602
+ }), method(object(KindShape), object({ id: number().int() }), {
19603
+ kind: "mutation",
19604
+ auth: "admin"
19605
+ });
18901
19606
  /** One table of the settings database. */
18902
19607
  var StorageTableSchema = object({
18903
19608
  /** The table's full name, e.g. `recorder:addon-settings` or `addon-device-settings`. */
@@ -18910,6 +19615,28 @@ var StorageTableSchema = object({
18910
19615
  /** Declared by an addon since this engine process started (a running addon claims it). */
18911
19616
  declaredThisBoot: boolean()
18912
19617
  });
19618
+ /** One declared record kind (D881) as System -> Data shows it. */
19619
+ var StorageKindSchema = object({
19620
+ owner: string(),
19621
+ kind: string(),
19622
+ database: _enum(["settings", "events"]),
19623
+ class: string(),
19624
+ state: _enum([
19625
+ "declared",
19626
+ "orphaned",
19627
+ "dropped"
19628
+ ]),
19629
+ /** `null` when the caller asked for no counts (`counts: false`). */
19630
+ rows: number().int().nonnegative().nullable(),
19631
+ /** Rows x the average size of a sample; null for an empty kind. */
19632
+ bytesEstimate: number().int().nonnegative().nullable(),
19633
+ writeTrigger: string(),
19634
+ retention: RecordRetentionSchema,
19635
+ /** `true` when the kind is an entry kind (the generic entries UI lists it). */
19636
+ entry: boolean(),
19637
+ /** The whole declaration, secret paths and entry descriptor included (the entries service builds its handle from it). */
19638
+ declaration: RecordKindDeclarationSchema
19639
+ });
18913
19640
  method(object({ ownerPrefix: string().min(1).optional() }), object({ tables: array(StorageTableSchema) }), { auth: "admin" }), method(object({
18914
19641
  collection: string().min(1),
18915
19642
  expectRows: number().int().nonnegative()
@@ -18919,6 +19646,87 @@ method(object({ ownerPrefix: string().min(1).optional() }), object({ tables: arr
18919
19646
  }), {
18920
19647
  kind: "mutation",
18921
19648
  auth: "admin"
19649
+ }), method(object({
19650
+ owner: string().min(1).optional(),
19651
+ /** `false` skips the per-kind row count (a catalog read only). Default true. */
19652
+ counts: boolean().optional()
19653
+ }), object({ kinds: array(StorageKindSchema) }), { auth: "admin" }), method(RecordQueryInputSchema.extend({
19654
+ owner: string().min(1),
19655
+ kind: RecordKindNameSchema
19656
+ }), RecordQueryResultSchema, { auth: "admin" }), method(object({
19657
+ owner: string().min(1),
19658
+ kind: RecordKindNameSchema,
19659
+ records: array(RecordInputSchema).max(RECORD_BATCH_MAX),
19660
+ /** The LAST batch: the copy is complete, the boot guard stops asking. */
19661
+ complete: boolean().optional()
19662
+ }).refine((input) => input.records.length > 0 || input.complete === true, { message: "records must be non-empty unless complete is true" }), object({ adopted: number().int() }), {
19663
+ kind: "mutation",
19664
+ auth: "admin"
19665
+ }), method(object({
19666
+ collection: string().min(1),
19667
+ cursor: string().optional(),
19668
+ limit: number().int().min(1).max(1e3).optional()
19669
+ }), object({
19670
+ rows: array(object({
19671
+ id: string(),
19672
+ data: record(string(), unknown())
19673
+ })),
19674
+ nextCursor: string().nullable()
19675
+ }), { auth: "admin" }), method(object({ collection: string().min(1) }), object({ adopted: boolean() }), { auth: "admin" });
19676
+ /**
19677
+ * record-entries - the ONE admin surface for every list of user-created entries
19678
+ * (D881): notification targets, brokers, LLM profiles, anything an addon
19679
+ * declares as an ENTRY kind (`entry: { title }` in `defineRecordKinds`).
19680
+ *
19681
+ * The UI is generic. `listEntryKinds` hands it, per kind, the JSON Schema of
19682
+ * the entry body with `secret: true` on every credential field, so a password
19683
+ * field is derived from the schema and never from a name. `putEntry` takes the
19684
+ * redaction token for an untouched secret (the stored value is kept), a string
19685
+ * for a new one, and the clear instruction to remove one. A read never carries
19686
+ * a secret value, and a locked keychain refuses the write with
19687
+ * `records/secret-unavailable` instead of storing plaintext.
19688
+ *
19689
+ * Hub-only, served in-process (it acts for each entry's owner on the keychain).
19690
+ */
19691
+ var EntryKindInfoSchema = object({
19692
+ owner: string(),
19693
+ kind: RecordKindNameSchema,
19694
+ title: string(),
19695
+ nameField: string(),
19696
+ /** JSON Schema of the body; `secret: true` marks a password field. */
19697
+ fields: record(string(), unknown()),
19698
+ secretPaths: array(string()),
19699
+ rows: number().int().nonnegative()
19700
+ });
19701
+ var EntryViewSchema = object({
19702
+ id: RecordIdSchema,
19703
+ name: string(),
19704
+ rev: number().int(),
19705
+ updatedAt: number(),
19706
+ /** Secret fields hold the redaction token. */
19707
+ data: RecordBodySchema
19708
+ });
19709
+ var EntryAddress = {
19710
+ owner: string().min(1),
19711
+ kind: RecordKindNameSchema
19712
+ };
19713
+ method(object({}), object({ kinds: array(EntryKindInfoSchema) }), { auth: "admin" }), method(object({ ...EntryAddress }), object({ entries: array(EntryViewSchema) }), { auth: "admin" }), method(object({
19714
+ ...EntryAddress,
19715
+ id: RecordIdSchema.optional(),
19716
+ data: RecordBodySchema,
19717
+ ifRev: number().int().min(1).optional()
19718
+ }), object({
19719
+ id: string(),
19720
+ rev: number().int()
19721
+ }), {
19722
+ kind: "mutation",
19723
+ auth: "admin"
19724
+ }), method(object({
19725
+ ...EntryAddress,
19726
+ id: RecordIdSchema
19727
+ }), object({ deleted: boolean() }), {
19728
+ kind: "mutation",
19729
+ auth: "admin"
18922
19730
  });
18923
19731
  /**
18924
19732
  * `keychain` — the hub's encrypted store of secret values (D787).
@@ -42007,6 +42815,9 @@ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, {
42007
42815
  }), _void(), { kind: "mutation" }), method(object({}), array(LlmProfileKindDescriptorSchema)), method(object({}), array(LlmProfileSchema)), method(object({ profile: LlmProfileSchema }), LlmProfileSchema, {
42008
42816
  kind: "mutation",
42009
42817
  auth: "admin"
42818
+ }), method(RawSecretMigrationInputSchema, RawSecretMigrationReportSchema, {
42819
+ kind: "mutation",
42820
+ auth: "admin"
42010
42821
  }), method(ProfileRefInputSchema, _void(), {
42011
42822
  kind: "mutation",
42012
42823
  auth: "admin"
@@ -53263,6 +54074,41 @@ var ServerRollbackInfoSchema = object({
53263
54074
  atMs: number(),
53264
54075
  reason: string()
53265
54076
  });
54077
+ /**
54078
+ * The runner boot check (D877): the runners this node PLANNED (hub: one per
54079
+ * `resolveRunnerId` over its forked addons; agent: the runners its process
54080
+ * service holds, because only the hub plans) against the states the process
54081
+ * service reports. Kept in memory, recomputed by the same one-shot check after
54082
+ * every boot, served on `getServerPackageStatus`.
54083
+ *
54084
+ * `failed` is the D6 breaker's terminal state, `refused` a deterministic Init
54085
+ * refusal (an addon that said "I will not start, and here is why"), `missing` a
54086
+ * planned runner the process service has no entry for.
54087
+ */
54088
+ var RunnerRefusalSchema = object({
54089
+ runnerId: string(),
54090
+ addonIds: array(string()),
54091
+ reason: string()
54092
+ });
54093
+ var RunnerBootCheckSchema = object({
54094
+ checkedAtMs: number(),
54095
+ /** Runners planned for this node. */
54096
+ expected: number(),
54097
+ /** Planned runners whose process is `running`. */
54098
+ running: number(),
54099
+ failed: array(string()),
54100
+ refused: array(RunnerRefusalSchema),
54101
+ missing: array(string()),
54102
+ /**
54103
+ * Runners still on their way: `starting`, or `crashed` waiting on a backoff
54104
+ * respawn. The check is FINAL only when this is empty; until then nothing is
54105
+ * pushed and the verdict is re-evaluated on the next runner state change.
54106
+ * Optional for version skew (absent = settled).
54107
+ */
54108
+ pending: array(string()).optional(),
54109
+ /** True when the plan is the hub's (`missing` is then meaningful); false on an agent. */
54110
+ planKnown: boolean()
54111
+ });
53266
54112
  var ServerPackageStatusSchema = object({
53267
54113
  /** Root package name (`@camstack/server` on the hub). */
53268
54114
  packageName: string(),
@@ -53325,7 +54171,14 @@ var ServerPackageStatusSchema = object({
53325
54171
  * for version skew: an older provider's payload simply omits it, and an
53326
54172
  * absent wrapper is unknown — never `native`.
53327
54173
  */
53328
- wrapper: WrapperIdentitySchema.optional()
54174
+ wrapper: WrapperIdentitySchema.optional(),
54175
+ /**
54176
+ * What this node PLANNED to run against what its process service reports
54177
+ * (D877). Absent until the one-shot boot check has run (~60 s after boot) and
54178
+ * on a provider that predates it. Absent is "not checked yet", never "all
54179
+ * well": a consumer that needs the answer treats it as pending.
54180
+ */
54181
+ runners: RunnerBootCheckSchema.optional()
53329
54182
  });
53330
54183
  var ServerUpdateCheckResultSchema = object({
53331
54184
  packageName: string(),
@@ -53376,6 +54229,13 @@ var ServerUpdateOutcomeSchema = _enum([
53376
54229
  "refused",
53377
54230
  "failed"
53378
54231
  ]);
54232
+ /** One addon the pre-flight found the target version would refuse (D877). */
54233
+ var UpdateBlockerSchema = object({
54234
+ addonId: string(),
54235
+ reason: string(),
54236
+ /** What the operator does about it. */
54237
+ remedy: string()
54238
+ });
53379
54239
  var ServerUpdateActionResultSchema = object({
53380
54240
  accepted: boolean(),
53381
54241
  targetVersion: string().nullable(),
@@ -53393,14 +54253,27 @@ var ServerUpdateActionResultSchema = object({
53393
54253
  * The failure itself, verbatim enough to act on (the npm output for a
53394
54254
  * staging install). Non-null only for `failed`.
53395
54255
  */
53396
- error: string().nullable().optional()
54256
+ error: string().nullable().optional(),
54257
+ /**
54258
+ * The addons the target version would refuse to start on this node's live
54259
+ * store (D877), present when the pre-flight refused the update
54260
+ * (`reason: 'addon-would-refuse'`). Optional for version skew.
54261
+ */
54262
+ blockers: array(UpdateBlockerSchema).optional()
53397
54263
  });
53398
54264
  method(_void(), ServerPackageStatusSchema, { auth: "admin" }), method(_void(), ServerUpdateCheckResultSchema, {
53399
54265
  kind: "mutation",
53400
54266
  auth: "admin"
53401
- }), method(object({
53402
- /** Explicit target version; omitted = latest from the registry. */
53403
- version: string().optional() }), ServerUpdateActionResultSchema, {
54267
+ }), method(object({
54268
+ /** Explicit target version; omitted = latest from the registry. */
54269
+ version: string().optional(),
54270
+ /**
54271
+ * Apply even though the pre-flight (D877) found addons the target would
54272
+ * refuse to start. Off by default: those addons stay down until the
54273
+ * remedy is run, which is the incident this gate exists to prevent.
54274
+ */
54275
+ acknowledgeRefusals: boolean().optional()
54276
+ }), ServerUpdateActionResultSchema, {
53404
54277
  kind: "mutation",
53405
54278
  auth: "admin",
53406
54279
  timeoutMs: 16 * 6e4
@@ -56227,7 +57100,9 @@ var ManifestShapeSchema = object({
56227
57100
  var AddonProcessSchema = object({
56228
57101
  pid: number().optional(),
56229
57102
  mode: string(),
56230
- state: string()
57103
+ state: string(),
57104
+ /** Why the runner is `refused` (an addon's own words), when it is (D877). */
57105
+ reason: string().optional()
56231
57106
  });
56232
57107
  /**
56233
57108
  * Per-addon health snapshot from the kernel's AddonHealthMonitor.
@@ -57319,6 +58194,12 @@ object({
57319
58194
  /** Horizontal louver swing on/off. Null when the device has no
57320
58195
  * horizontal swing surface (gate with `DeviceFeature.ClimateSwingHorizontal`). */
57321
58196
  swingHorizontal: boolean().nullable(),
58197
+ /** Lowest setpoint the device accepts, Celsius. Absent / null = not reported. */
58198
+ minTemp: number().nullable().optional(),
58199
+ /** Highest setpoint the device accepts, Celsius. Absent / null = not reported. */
58200
+ maxTemp: number().nullable().optional(),
58201
+ /** Setpoint granularity, Celsius (0.5, 1). Absent / null = not reported. */
58202
+ tempStep: number().positive().nullable().optional(),
57322
58203
  /** Ms epoch when the slice was last updated (push or command). */
57323
58204
  lastFetchedAt: number()
57324
58205
  });
@@ -64863,7 +65744,11 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
64863
65744
  kind: "mutation",
64864
65745
  auth: "admin",
64865
65746
  access: "delete"
64866
- }), method(object({ userId: string() }), TotpStatusSchema, { auth: "admin" }), method(object({
65747
+ }), method(object({ userId: string() }), TotpStatusSchema, { auth: "admin" }), method(RawSecretMigrationInputSchema, RawSecretMigrationReportSchema, {
65748
+ kind: "mutation",
65749
+ auth: "admin",
65750
+ access: "create"
65751
+ }), method(object({
64867
65752
  userId: string(),
64868
65753
  code: string()
64869
65754
  }), object({ valid: boolean() }), {
@@ -67082,6 +67967,12 @@ Object.freeze({
67082
67967
  addonId: null,
67083
67968
  access: "view"
67084
67969
  },
67970
+ "coreBlocks.migrateRawSecrets": {
67971
+ capName: "core-blocks",
67972
+ capScope: "system",
67973
+ addonId: null,
67974
+ access: "create"
67975
+ },
67085
67976
  "coreBlocks.restart": {
67086
67977
  capName: "core-blocks",
67087
67978
  capScope: "system",
@@ -68942,6 +69833,12 @@ Object.freeze({
68942
69833
  addonId: null,
68943
69834
  access: "view"
68944
69835
  },
69836
+ "llm.migrateRawSecrets": {
69837
+ capName: "llm",
69838
+ capScope: "system",
69839
+ addonId: null,
69840
+ access: "create"
69841
+ },
68945
69842
  "llm.resolveModelRef": {
68946
69843
  capName: "llm",
68947
69844
  capScope: "system",
@@ -71828,6 +72725,30 @@ Object.freeze({
71828
72725
  addonId: null,
71829
72726
  access: "create"
71830
72727
  },
72728
+ "recordEntries.deleteEntry": {
72729
+ capName: "record-entries",
72730
+ capScope: "system",
72731
+ addonId: null,
72732
+ access: "delete"
72733
+ },
72734
+ "recordEntries.listEntries": {
72735
+ capName: "record-entries",
72736
+ capScope: "system",
72737
+ addonId: null,
72738
+ access: "view"
72739
+ },
72740
+ "recordEntries.listEntryKinds": {
72741
+ capName: "record-entries",
72742
+ capScope: "system",
72743
+ addonId: null,
72744
+ access: "view"
72745
+ },
72746
+ "recordEntries.putEntry": {
72747
+ capName: "record-entries",
72748
+ capScope: "system",
72749
+ addonId: null,
72750
+ access: "create"
72751
+ },
71831
72752
  "recording.getAvailability": {
71832
72753
  capName: "recording",
71833
72754
  capScope: "device",
@@ -72128,6 +73049,102 @@ Object.freeze({
72128
73049
  addonId: null,
72129
73050
  access: "view"
72130
73051
  },
73052
+ "records.aggregate": {
73053
+ capName: "records",
73054
+ capScope: "system",
73055
+ addonId: null,
73056
+ access: "view"
73057
+ },
73058
+ "records.allocateId": {
73059
+ capName: "records",
73060
+ capScope: "system",
73061
+ addonId: null,
73062
+ access: "create"
73063
+ },
73064
+ "records.count": {
73065
+ capName: "records",
73066
+ capScope: "system",
73067
+ addonId: null,
73068
+ access: "view"
73069
+ },
73070
+ "records.declareKinds": {
73071
+ capName: "records",
73072
+ capScope: "system",
73073
+ addonId: null,
73074
+ access: "create"
73075
+ },
73076
+ "records.delete": {
73077
+ capName: "records",
73078
+ capScope: "system",
73079
+ addonId: null,
73080
+ access: "delete"
73081
+ },
73082
+ "records.deleteDevice": {
73083
+ capName: "records",
73084
+ capScope: "system",
73085
+ addonId: null,
73086
+ access: "delete"
73087
+ },
73088
+ "records.deleteMany": {
73089
+ capName: "records",
73090
+ capScope: "system",
73091
+ addonId: null,
73092
+ access: "delete"
73093
+ },
73094
+ "records.deleteWhere": {
73095
+ capName: "records",
73096
+ capScope: "system",
73097
+ addonId: null,
73098
+ access: "delete"
73099
+ },
73100
+ "records.get": {
73101
+ capName: "records",
73102
+ capScope: "system",
73103
+ addonId: null,
73104
+ access: "view"
73105
+ },
73106
+ "records.getMany": {
73107
+ capName: "records",
73108
+ capScope: "system",
73109
+ addonId: null,
73110
+ access: "view"
73111
+ },
73112
+ "records.histogram": {
73113
+ capName: "records",
73114
+ capScope: "system",
73115
+ addonId: null,
73116
+ access: "view"
73117
+ },
73118
+ "records.patch": {
73119
+ capName: "records",
73120
+ capScope: "system",
73121
+ addonId: null,
73122
+ access: "create"
73123
+ },
73124
+ "records.put": {
73125
+ capName: "records",
73126
+ capScope: "system",
73127
+ addonId: null,
73128
+ access: "create"
73129
+ },
73130
+ "records.putMany": {
73131
+ capName: "records",
73132
+ capScope: "system",
73133
+ addonId: null,
73134
+ access: "create"
73135
+ },
73136
+ "records.query": {
73137
+ capName: "records",
73138
+ capScope: "system",
73139
+ addonId: null,
73140
+ access: "view"
73141
+ },
73142
+ "records.secretRefs": {
73143
+ capName: "records",
73144
+ capScope: "system",
73145
+ addonId: null,
73146
+ access: "view"
73147
+ },
72131
73148
  "sceneMonitor.captureReference": {
72132
73149
  capName: "scene-monitor",
72133
73150
  capScope: "device",
@@ -72560,18 +73577,48 @@ Object.freeze({
72560
73577
  addonId: null,
72561
73578
  access: "create"
72562
73579
  },
73580
+ "storageAdmin.adoptRecords": {
73581
+ capName: "storage-admin",
73582
+ capScope: "system",
73583
+ addonId: null,
73584
+ access: "create"
73585
+ },
72563
73586
  "storageAdmin.dropCollection": {
72564
73587
  capName: "storage-admin",
72565
73588
  capScope: "system",
72566
73589
  addonId: null,
72567
73590
  access: "delete"
72568
73591
  },
73592
+ "storageAdmin.isAdoptedLegacyTable": {
73593
+ capName: "storage-admin",
73594
+ capScope: "system",
73595
+ addonId: null,
73596
+ access: "view"
73597
+ },
73598
+ "storageAdmin.listKinds": {
73599
+ capName: "storage-admin",
73600
+ capScope: "system",
73601
+ addonId: null,
73602
+ access: "view"
73603
+ },
72569
73604
  "storageAdmin.listTables": {
72570
73605
  capName: "storage-admin",
72571
73606
  capScope: "system",
72572
73607
  addonId: null,
72573
73608
  access: "view"
72574
73609
  },
73610
+ "storageAdmin.readLegacyCollection": {
73611
+ capName: "storage-admin",
73612
+ capScope: "system",
73613
+ addonId: null,
73614
+ access: "view"
73615
+ },
73616
+ "storageAdmin.readRecords": {
73617
+ capName: "storage-admin",
73618
+ capScope: "system",
73619
+ addonId: null,
73620
+ access: "view"
73621
+ },
72575
73622
  "storageEvictable.evict": {
72576
73623
  capName: "storage-evictable",
72577
73624
  capScope: "system",
@@ -73484,6 +74531,12 @@ Object.freeze({
73484
74531
  addonId: null,
73485
74532
  access: "view"
73486
74533
  },
74534
+ "userManagement.migrateRawSecrets": {
74535
+ capName: "user-management",
74536
+ capScope: "system",
74537
+ addonId: null,
74538
+ access: "create"
74539
+ },
73487
74540
  "userManagement.oauthExchangeCode": {
73488
74541
  capName: "user-management",
73489
74542
  capScope: "system",
@@ -76160,6 +77213,37 @@ Object.freeze({
76160
77213
  form: "single",
76161
77214
  optional: false
76162
77215
  }],
77216
+ "records.count": [{
77217
+ name: "deviceId",
77218
+ form: "single",
77219
+ optional: true
77220
+ }],
77221
+ "records.deleteDevice": [{
77222
+ name: "deviceId",
77223
+ form: "single",
77224
+ optional: false
77225
+ }],
77226
+ "records.deleteWhere": [{
77227
+ name: "deviceId",
77228
+ form: "single",
77229
+ optional: true
77230
+ }],
77231
+ "records.histogram": [{
77232
+ name: "deviceId",
77233
+ form: "single",
77234
+ optional: true
77235
+ }],
77236
+ "records.putMany": [{
77237
+ name: "records",
77238
+ form: "object-array",
77239
+ optional: false,
77240
+ itemField: "deviceId"
77241
+ }],
77242
+ "records.query": [{
77243
+ name: "deviceId",
77244
+ form: "single",
77245
+ optional: true
77246
+ }],
76163
77247
  "sceneMonitor.captureReference": [{
76164
77248
  name: "deviceId",
76165
77249
  form: "single",
@@ -76276,6 +77360,17 @@ Object.freeze({
76276
77360
  form: "single",
76277
77361
  optional: false
76278
77362
  }],
77363
+ "storageAdmin.adoptRecords": [{
77364
+ name: "records",
77365
+ form: "object-array",
77366
+ optional: false,
77367
+ itemField: "deviceId"
77368
+ }],
77369
+ "storageAdmin.readRecords": [{
77370
+ name: "deviceId",
77371
+ form: "single",
77372
+ optional: true
77373
+ }],
76279
77374
  "streamBroker.acquireEgressTranscode": [{
76280
77375
  name: "deviceId",
76281
77376
  form: "single",
@@ -78997,4 +80092,4 @@ function armRemovalReconcile(opts) {
78997
80092
  return () => clearInterval(timer);
78998
80093
  }
78999
80094
  //#endregion
79000
- export { audioAnalyzerCapability as $, userError as $n, recordingArchiveCapability as $t, NativeLeaseAdmissionSchema as A, errMsg as An, gifFromMp4Args as At, RECORDING_SOURCE_CAMSTACK_ADDON as B, defineCustomActions as Bn, memoizePinnedFfmpeg as Bt, EVENT_PAD_MS as C, Fmp4BoxSplitter as Cn, evictionPolicyForMode as Ct, G711_SCALE_CORRECTION_DB as D, isSoftwareDecode as Dn, ffmpegRate as Dt, FailureCounters as E, invocationFromEncodeProfile as En, failureContributionCapability as Et, PoolMemoryWatchdog as F, HF_REPO as Fn, loadContributionCapability as Ft, VIDEOCLIPS_MAX_OFFER_BYTES as G, isSecretMarker as Gn, overlayClusterStepSettings as Gt, RecordingConfigSchema as H, hfModelUrl as Hn, modeMayWrite as Ht, RATE_CONTROL_RELAXED as I, MODEL_FORMATS as In, logChannelsCapability as It, addonWidgetsSourceCapability as J, maskUrlCredentials as Jn, pickDetailCropConvention as Jt, VISIT_MERGE_GAP_MS as K, makeProfileBrokerId as Kn, parseProcStatus as Kt, RATE_CONTROL_TIGHT as L, audioChunkBytesPerSample as Ln, mapAudioLabelToMacro as Lt, NodeBenchRunnerInputSchema as M, BaseAddon as Mn, isFirstLevelMacroClass as Mt, OpsLogEntrySchema as N, CAM_PROFILE_ORDER as Nn, linkedLabelStepId as Nt, LABEL_SUPPLY_MACRO as O, DeviceFeature as On, gbToBytes as Ot, PIPELINE_RAMP as P, CamProfileSchema as Pn, linkedStepOf as Pt, audioAnalysisCapability as Q, sleep as Qn, rankStreams as Qt, RECORDING_EXPORT_MAX_READ_BYTES as R, createEvent as Rn, mayReadLocation as Rt, EVENT_OWNER_TYPES as S, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as Sn, evaluateZoneRules as St, ExportRecordSchema as T, evaluateSensorEdge as Tn, exportSubjectOf as Tt, RecordingSignalStatusSchema as U, hydrateSchema as Un, modelBindingKey as Ut, ROOT_SUPPLIABLE_STEP_IDS as V, expandAudioChunkToF32le as Vn, migrateLegacyDeviceSignalConfig as Vt, RingBuffer as W, isEvent as Wn, motionDetectionCapability as Wt, applyModelBoundSettings as X, parseProfileBrokerId as Xn, pipelineExecutorCapability as Xt, allowedSuppliedEffect as Y, nodePin as Yn, pickNativeLeaseOverride as Yt, armRemovalReconcile as Z, selectAssignedProfileSlots as Zn, pipelineRunnerCapability as Zt, DEFAULT_DETAIL_CROP_CONVENTION as _, stripRetiredBandPreBufferSec as _n, detectionPipelineCapability as _t, BackgroundRunRegistry as a, resolveEgressDecodeHwAccel as an, literal as ar, clipExportFailure as at, DEVICE_BACKEND_TO_FORMAT as b, webrtcSessionCapability as bn, egressTransportFromRequest as bt, CLIP_STILL_REASON_CODE_HEADER as c, resolvePoolMemoryPolicy as cn, preprocess as cr, containingParentIndex as ct, CLUSTER_MODEL_SCOPED_STEPS as d, rootSuppliesOf as dn, union as dr, declareLogChannel as dt, recordingCapability as en, _enum as er, audioKindId as et, COCO_80_LABELS as f, runtimeDevices as fn, EventCategory as fr, defaultDeviceFor as ft, DEFAULT_CLUSTER_STEP_SETTINGS as g, streamBrokerCapability as gn, deriveRootFaceRefineRect as gt, DEFAULT_AUDIO_ANALYZER_CONFIG as h, storageOccupancyCapability as hn, deriveRecordingMode as ht, AUDIO_MACRO_LABELS as i, resolveCreateExportSubject as in, lazy as ir, cameraStreamsCapability as it, NativeLeaseSettingsSchema as j, BOOT_RECOVERY_BACKOFF_MS as jn, inferModelProvider as jt, LABEL_SUPPLY_VOCABULARIES as k, DeviceType as kn, gifDeriveSpeed as kt, CLIP_STILL_REASON_HEADER as l, resolveRecordingProfiles as ln, record as lr, createHwAccelCache as lt, CROP_SUPPLY_SOURCES as m, storageEvictableCapability as mn, deriveDetailCropRect as mt, APPLE_SA_TO_MACRO as n, recordingSignalCapability as nn, boolean as nr, buildBenchStepTree as nt, BatteryStatusSchema as o, resolveLocationMode as on, number as or, clipExportFailureOf as ot, COCO_TO_MACRO as p, stepModelRunsOnFormat as pn, deriveBatteryPresence as pt, YAMNET_TO_MACRO as q, makeSourceBrokerId as qn, pickClusterStepSettings as qt, AUDIO_BACKEND_CHOICES as r, resolveClusterStepModelId as rn, discriminatedUnion as rr, cameraOwnsMotionViaSensor as rt, CLIP_BROKER_PACED_RATES as s, resolveModelBoundSetting as sn, object as sr, collectModelBoundKeys as st, APPEARANCE_BLOCKS as t, recordingExportCapability as tn, array as tr, batteryCapability as tt, CLIP_STREAM_TRANSPORT_HEADER as u, resolveRootSupply as un, string as ur, createLogChannelsProvider as ut, DEFAULT_EVENTS_BAND_BUFFER_SEC as v, supportedRuntimes as vn, deviceRemovalHookCapability as vt, EncodeProfileSchema as w, buildFfmpegArgs as wn, evictionPolicyOfLocation as wt, DEVICE_RAMP as x, AUDIO_PRESETS as xn, enumerateInferenceDevices as xt, DEFAULT_NATIVE_LEASE_SETTINGS as y, videoclipsCapability as yn, egressTranscodeSharingKey as yt, RECORDING_SOURCE_CAMSTACK as z, customAction as zn, mayWriteToLocation as zt };
80095
+ export { audioAnalyzerCapability as $, sleep as $n, recordingArchiveCapability as $t, NativeLeaseAdmissionSchema as A, errMsg as An, gifFromMp4Args as At, RECORDING_SOURCE_CAMSTACK_ADDON as B, defineCustomActions as Bn, memoizePinnedFfmpeg as Bt, EVENT_PAD_MS as C, Fmp4BoxSplitter as Cn, evictionPolicyForMode as Ct, G711_SCALE_CORRECTION_DB as D, isSoftwareDecode as Dn, ffmpegRate as Dt, FailureCounters as E, invocationFromEncodeProfile as En, failureContributionCapability as Et, PoolMemoryWatchdog as F, HF_REPO as Fn, loadContributionCapability as Ft, VIDEOCLIPS_MAX_OFFER_BYTES as G, isEvent as Gn, overlayClusterStepSettings as Gt, RecordingConfigSchema as H, expandAudioChunkToF32le as Hn, modeMayWrite as Ht, RATE_CONTROL_RELAXED as I, MODEL_FORMATS as In, logChannelsCapability as It, addonWidgetsSourceCapability as J, makeSourceBrokerId as Jn, pickDetailCropConvention as Jt, VISIT_MERGE_GAP_MS as K, isSecretMarker as Kn, parseProcStatus as Kt, RATE_CONTROL_TIGHT as L, audioChunkBytesPerSample as Ln, mapAudioLabelToMacro as Lt, NodeBenchRunnerInputSchema as M, BaseAddon as Mn, isFirstLevelMacroClass as Mt, OpsLogEntrySchema as N, CAM_PROFILE_ORDER as Nn, linkedLabelStepId as Nt, LABEL_SUPPLY_MACRO as O, DeviceFeature as On, gbToBytes as Ot, PIPELINE_RAMP as P, CamProfileSchema as Pn, linkedStepOf as Pt, audioAnalysisCapability as Q, selectAssignedProfileSlots as Qn, rankStreams as Qt, RECORDING_EXPORT_MAX_READ_BYTES as R, createEvent as Rn, mayReadLocation as Rt, EVENT_OWNER_TYPES as S, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as Sn, evaluateZoneRules as St, ExportRecordSchema as T, evaluateSensorEdge as Tn, exportSubjectOf as Tt, RecordingSignalStatusSchema as U, hfModelUrl as Un, modelBindingKey as Ut, ROOT_SUPPLIABLE_STEP_IDS as V, defineRecordKinds as Vn, migrateLegacyDeviceSignalConfig as Vt, RingBuffer as W, hydrateSchema as Wn, motionDetectionCapability as Wt, applyModelBoundSettings as X, nodePin as Xn, pipelineExecutorCapability as Xt, allowedSuppliedEffect as Y, maskUrlCredentials as Yn, pickNativeLeaseOverride as Yt, armRemovalReconcile as Z, parseProfileBrokerId as Zn, pipelineRunnerCapability as Zt, DEFAULT_DETAIL_CROP_CONVENTION as _, stripRetiredBandPreBufferSec as _n, detectionPipelineCapability as _t, BackgroundRunRegistry as a, resolveEgressDecodeHwAccel as an, lazy as ar, clipExportFailure as at, DEVICE_BACKEND_TO_FORMAT as b, webrtcSessionCapability as bn, egressTransportFromRequest as bt, CLIP_STILL_REASON_CODE_HEADER as c, resolvePoolMemoryPolicy as cn, object as cr, containingParentIndex as ct, CLUSTER_MODEL_SCOPED_STEPS as d, rootSuppliesOf as dn, string as dr, declareLogChannel as dt, recordingCapability as en, userError as er, audioKindId as et, COCO_80_LABELS as f, runtimeDevices as fn, union as fr, defaultDeviceFor as ft, DEFAULT_CLUSTER_STEP_SETTINGS as g, streamBrokerCapability as gn, deriveRootFaceRefineRect as gt, DEFAULT_AUDIO_ANALYZER_CONFIG as h, storageOccupancyCapability as hn, deriveRecordingMode as ht, AUDIO_MACRO_LABELS as i, resolveCreateExportSubject as in, discriminatedUnion as ir, cameraStreamsCapability as it, NativeLeaseSettingsSchema as j, BOOT_RECOVERY_BACKOFF_MS as jn, inferModelProvider as jt, LABEL_SUPPLY_VOCABULARIES as k, DeviceType as kn, gifDeriveSpeed as kt, CLIP_STILL_REASON_HEADER as l, resolveRecordingProfiles as ln, preprocess as lr, createHwAccelCache as lt, CROP_SUPPLY_SOURCES as m, storageEvictableCapability as mn, deriveDetailCropRect as mt, APPLE_SA_TO_MACRO as n, recordingSignalCapability as nn, array as nr, buildBenchStepTree as nt, BatteryStatusSchema as o, resolveLocationMode as on, literal as or, clipExportFailureOf as ot, COCO_TO_MACRO as p, stepModelRunsOnFormat as pn, EventCategory as pr, deriveBatteryPresence as pt, YAMNET_TO_MACRO as q, makeProfileBrokerId as qn, pickClusterStepSettings as qt, AUDIO_BACKEND_CHOICES as r, resolveClusterStepModelId as rn, boolean as rr, cameraOwnsMotionViaSensor as rt, CLIP_BROKER_PACED_RATES as s, resolveModelBoundSetting as sn, number as sr, collectModelBoundKeys as st, APPEARANCE_BLOCKS as t, recordingExportCapability as tn, _enum as tr, batteryCapability as tt, CLIP_STREAM_TRANSPORT_HEADER as u, resolveRootSupply as un, record as ur, createLogChannelsProvider as ut, DEFAULT_EVENTS_BAND_BUFFER_SEC as v, supportedRuntimes as vn, deviceRemovalHookCapability as vt, EncodeProfileSchema as w, buildFfmpegArgs as wn, evictionPolicyOfLocation as wt, DEVICE_RAMP as x, AUDIO_PRESETS as xn, enumerateInferenceDevices as xt, DEFAULT_NATIVE_LEASE_SETTINGS as y, videoclipsCapability as yn, egressTranscodeSharingKey as yt, RECORDING_SOURCE_CAMSTACK as z, customAction as zn, mayWriteToLocation as zt };