@camstack/addon-post-analysis 1.2.372 → 1.2.374

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