@camstack/system 1.2.305 → 1.2.307

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 (60) hide show
  1. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +1 -1
  2. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +1 -1
  3. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
  4. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +1 -1
  5. package/dist/builtins/alerts/alerts.addon.js +1 -1
  6. package/dist/builtins/alerts/alerts.addon.mjs +1 -1
  7. package/dist/builtins/autotrack/index.js +1 -1
  8. package/dist/builtins/autotrack/index.mjs +1 -1
  9. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +1 -1
  10. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +1 -1
  11. package/dist/builtins/camera-grid/index.js +1 -1
  12. package/dist/builtins/camera-grid/index.mjs +1 -1
  13. package/dist/builtins/console-logging/index.js +1 -1
  14. package/dist/builtins/console-logging/index.mjs +1 -1
  15. package/dist/builtins/core-blocks/core-blocks.addon.js +1 -1
  16. package/dist/builtins/core-blocks/core-blocks.addon.mjs +1 -1
  17. package/dist/builtins/device-manager/device-extension-linked-slot.d.ts +19 -0
  18. package/dist/builtins/device-manager/device-linked-devices.d.ts +26 -18
  19. package/dist/builtins/device-manager/device-manager.addon.js +157 -135
  20. package/dist/builtins/device-manager/device-manager.addon.mjs +157 -135
  21. package/dist/builtins/doorbell/binding-mirror.d.ts +13 -7
  22. package/dist/builtins/doorbell/virtual-doorbell.addon.d.ts +12 -45
  23. package/dist/builtins/doorbell/virtual-doorbell.addon.js +29 -102
  24. package/dist/builtins/doorbell/virtual-doorbell.addon.mjs +29 -102
  25. package/dist/builtins/hub-forwarder/index.js +1 -1
  26. package/dist/builtins/hub-forwarder/index.mjs +1 -1
  27. package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
  28. package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
  29. package/dist/builtins/local-auth/local-auth.addon.js +1 -1
  30. package/dist/builtins/local-auth/local-auth.addon.mjs +1 -1
  31. package/dist/builtins/local-network/local-network.addon.js +1 -1
  32. package/dist/builtins/local-network/local-network.addon.mjs +1 -1
  33. package/dist/builtins/loki-logging/index.js +1 -1
  34. package/dist/builtins/loki-logging/index.mjs +1 -1
  35. package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
  36. package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
  37. package/dist/builtins/platform-probe/index.js +1 -1
  38. package/dist/builtins/platform-probe/index.mjs +1 -1
  39. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  40. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  41. package/dist/builtins/snapshot/index.js +1 -1
  42. package/dist/builtins/snapshot/index.mjs +1 -1
  43. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  44. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  45. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +0 -0
  46. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +0 -0
  47. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +1 -1
  48. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +1 -1
  49. package/dist/builtins/system-config/system-config.addon.js +1 -1
  50. package/dist/builtins/system-config/system-config.addon.mjs +1 -1
  51. package/dist/builtins/winston-logging/index.js +1 -1
  52. package/dist/builtins/winston-logging/index.mjs +1 -1
  53. package/dist/{dist-BK4iP6ab.js → dist-D3ch99WD.js} +66 -73
  54. package/dist/{dist-Df1NhKxm.mjs → dist-DdfJa8Zn.mjs} +67 -68
  55. package/dist/index.js +1 -1
  56. package/dist/index.mjs +1 -1
  57. package/dist/{retired-settings-keys-dC4ckbXJ.mjs → retired-settings-keys-BJNhhXap.mjs} +1 -1
  58. package/dist/{retired-settings-keys-DwWMph6F.js → retired-settings-keys-DG_LEPqC.js} +1 -1
  59. package/package.json +1 -1
  60. package/dist/builtins/device-manager/device-store-sections.d.ts +0 -26
@@ -1,4 +1,4 @@
1
- import { Mt as logDestinationCapability, _n as BaseAddon } from "../../dist-Df1NhKxm.mjs";
1
+ import { gn as BaseAddon, jt as logDestinationCapability } from "../../dist-DdfJa8Zn.mjs";
2
2
  import { t as formatLogLine } from "../../formatter-B7qW8bPJ.mjs";
3
3
  import * as path$1 from "node:path";
4
4
  import path from "node:path";
@@ -691,7 +691,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
691
691
  return EventCategory;
692
692
  }({});
693
693
  //#endregion
694
- //#region ../types/dist/sleep-BXv0ZcRa.mjs
694
+ //#region ../types/dist/sleep-DC-wdyeS.mjs
695
695
  /**
696
696
  * The audio chunk plane's byte format, and the ONE expansion from a coded
697
697
  * window to float samples (D455).
@@ -8144,12 +8144,32 @@ var AudioClassificationLabelSchema = zod.z.object({
8144
8144
  originalClass: zod.z.string().optional(),
8145
8145
  score: zod.z.number()
8146
8146
  });
8147
+ /**
8148
+ * Did the classifier RUN on this window? (D660)
8149
+ *
8150
+ * `classified` with no labels means the model heard nothing above the
8151
+ * camera's floor. `not-classified` means nobody listened — and until D660 the
8152
+ * two were the same shape (`classification` absent), so a window the global
8153
+ * busy gate threw away read downstream exactly like a quiet one (D393).
8154
+ */
8155
+ var AudioClassifyOutcomeSchema = zod.z.discriminatedUnion("state", [zod.z.object({ state: zod.z.literal("classified") }), zod.z.object({
8156
+ state: zod.z.literal("not-classified"),
8157
+ reason: zod.z.enum([
8158
+ "superseded",
8159
+ "error",
8160
+ "timeout",
8161
+ "disposed"
8162
+ ])
8163
+ })]);
8147
8164
  var AudioAnalysisResultSchema = zod.z.object({
8148
8165
  level: AudioLevelSchema,
8166
+ /** Labels at or above the camera's floor. Absent = none — read `classifyOutcome` to know whether the model ran at all. */
8149
8167
  classification: zod.z.object({
8150
8168
  labels: zod.z.array(AudioClassificationLabelSchema).readonly(),
8151
8169
  inferenceMs: zod.z.number()
8152
8170
  }).optional(),
8171
+ /** Whether the classifier ran on this window (D660). */
8172
+ classifyOutcome: AudioClassifyOutcomeSchema,
8153
8173
  timestamp: zod.z.number()
8154
8174
  });
8155
8175
  var AudioAnalysisSettingsSchema = zod.z.object({
@@ -12699,8 +12719,22 @@ var LinkedDeviceSchema = zod.z.object({
12699
12719
  * The `linked-devices` extension slot's editable value (D648): the operator's
12700
12720
  * pick list, exactly what `_linkedDeviceIds` persists. Tree children are NOT
12701
12721
  * in it — they are always linked and are not a pick.
12722
+ *
12723
+ * `trackedDeviceIds` (D655) is the tracked-event opt-in, exactly what
12724
+ * `_linkedDeviceTrackedIds` persists: which linked devices materialize a
12725
+ * synthetic tracked event on the camera. A read always carries it AS STORED
12726
+ * (an absent key reads as `[]`, which is what the resolver makes of it —
12727
+ * NONE). On a write it is optional: absent leaves the opt-in untouched, so a
12728
+ * card built before D655 cannot erase it by saving the pick list. A present
12729
+ * list REPLACES the opt-in; each id must be a pick, a device the camera links
12730
+ * by structure (the row's `impliedSources`: tree children, a picked
12731
+ * container's child) or already stored — so what was read can always be
12732
+ * written back unchanged, and a NEW opt-in outside the linked set is refused.
12702
12733
  */
12703
- var LinkedDevicesSlotValueSchema = zod.z.object({ deviceIds: zod.z.array(zod.z.number().int().positive()) });
12734
+ var LinkedDevicesSlotValueSchema = zod.z.object({
12735
+ deviceIds: zod.z.array(zod.z.number().int().positive()),
12736
+ trackedDeviceIds: zod.z.array(zod.z.number().int().positive()).optional()
12737
+ });
12704
12738
  /**
12705
12739
  * The `linked-devices` slot — a camera's companion devices, owned by the
12706
12740
  * device manager over `_linkedDeviceIds` (D648, D356). Any device may be a
@@ -12867,7 +12901,6 @@ var deviceManagerCapability = {
12867
12901
  scope: "system",
12868
12902
  mode: "singleton",
12869
12903
  extensionSlots: [LINKED_DEVICES_SLOT],
12870
- exposesDeviceSettings: true,
12871
12904
  methods: {
12872
12905
  /** Reserve (or re-resolve) a progressive numeric id for `(addonId, stableId)`.
12873
12906
  * Idempotent: returns the existing id if one is already persisted for the
@@ -13374,8 +13407,8 @@ var deviceManagerCapability = {
13374
13407
  * operator's persisted pick list (`mode` is always `manual` since D356:
13375
13408
  * same-location devices are suggested by the picker, never linked on
13376
13409
  * their own). Excludes the camera itself; deduped. The list is written by
13377
- * the settings section or the `linked-devices` extension slot, both over
13378
- * `_linkedDeviceIds` (see the module docblock).
13410
+ * the `linked-devices` extension slot over `_linkedDeviceIds` (see the
13411
+ * module docblock).
13379
13412
  */
13380
13413
  getLinkedDevices: method(zod.z.object({ deviceId: zod.z.number() }), zod.z.object({
13381
13414
  mode: LinkedDevicesModeSchema,
@@ -20357,6 +20390,13 @@ var AudioEventSchema = zod.z.object({
20357
20390
  originalClass: zod.z.string().optional(),
20358
20391
  score: zod.z.number()
20359
20392
  }).optional(),
20393
+ /**
20394
+ * Whether the classifier RAN on the window behind this row (D660). Absent
20395
+ * on rows written before D660 — unknown, NOT classified: until then a
20396
+ * window the analyzer's busy gate threw away was stored exactly like one
20397
+ * that heard nothing above the floor.
20398
+ */
20399
+ classifyOutcome: AudioClassifyOutcomeSchema.optional(),
20360
20400
  /** Populated by B5 (recording playback URL for this event). */
20361
20401
  mediaUrl: zod.z.string().optional()
20362
20402
  });
@@ -22765,7 +22805,14 @@ var pipelineExecutorCapability = {
22765
22805
  */
22766
22806
  inferCached: method(zod.z.object({
22767
22807
  stepId: zod.z.string(),
22768
- frameId: zod.z.number().int()
22808
+ frameId: zod.z.number().int(),
22809
+ /**
22810
+ * The model to time — REQUIRED (D658). Without it the pool answered the
22811
+ * step's ACTIVE variant (the first loaded after boot), so a benchmark
22812
+ * of model B silently timed model A. Callers pass the `rootModelId`
22813
+ * their warmup `runPipeline` reported: the model that actually ran.
22814
+ */
22815
+ modelId: zod.z.string().min(1)
22769
22816
  }), zod.z.record(zod.z.string(), zod.z.unknown()), { kind: "mutation" }),
22770
22817
  /**
22771
22818
  * Release a cached frame from the Python pool's memory.
@@ -28095,28 +28142,6 @@ var SOURCE_CAP_CHANGED_AT_FIELD = {
28095
28142
  };
28096
28143
  /** Cap names whose presence in a device's bindings qualify it as a source. */
28097
28144
  var SOURCE_CAPS = Object.keys(SOURCE_CAP_ACTIVE_FIELD);
28098
- /**
28099
- * Device `type` values (from `DeviceType`) that can host a binary/switch
28100
- * source cap. Used by the camera's `device-multiselect` picker as the
28101
- * CLIENT-SIDE filter, alongside `SOURCE_CAPS`.
28102
- *
28103
- * Why types and not caps alone: the shared picker filters
28104
- * `deviceManager.listAll` rows client-side, and those rows carry only the
28105
- * device's advertised `features` — NOT its registered cap list. On the live
28106
- * cluster binary sensors and switches advertise EMPTY features (features
28107
- * mirror only a handful of caps like `motion-trigger`), so a caps-only
28108
- * filter matched against `features` would list nothing (the very bug this
28109
- * replaced, which relied on the now-empty `getAllBindings`). Matching by
28110
- * `type` is the reliable client-side signal; the union with `SOURCE_CAPS`
28111
- * still captures any device that DOES advertise a source-cap feature.
28112
- * `sensor` covers contact/motion/flood/gas/smoke/CO/vibration/tamper,
28113
- * `switch` covers switches, `control` covers generic binary actuators.
28114
- */
28115
- var SOURCE_DEVICE_TYPES = [
28116
- "sensor",
28117
- "switch",
28118
- "control"
28119
- ];
28120
28145
  /** True when a cap is a recognised binary/switch source. */
28121
28146
  function isSourceCap(capName) {
28122
28147
  return Object.prototype.hasOwnProperty.call(SOURCE_CAP_ACTIVE_FIELD, capName);
@@ -28262,7 +28287,6 @@ var doorbellCapability = {
28262
28287
  kind: "wrapper",
28263
28288
  defaultActive: false,
28264
28289
  deviceTypes: [DeviceType.Button, DeviceType.Camera],
28265
- exposesDeviceSettings: true,
28266
28290
  extensionSlots: [DOORBELL_SOURCE_SLOT],
28267
28291
  methods: {},
28268
28292
  events: {
@@ -28371,7 +28395,17 @@ var ExtensionSlotStateSchema = zod.z.object({
28371
28395
  projects: zod.z.string().nullable(),
28372
28396
  activation: ExtensionSlotActivationSchema.nullable(),
28373
28397
  value: ExtensionSlotValueSchema,
28374
- sources: zod.z.array(ExtensionSlotSourceSchema)
28398
+ sources: zod.z.array(ExtensionSlotSourceSchema),
28399
+ /**
28400
+ * Devices the owner links to the host ON ITS OWN, by structure, and that
28401
+ * are therefore not in `value` (D655): a camera's device-tree children, and
28402
+ * the child a picked container stands for (D356 — a container is never a
28403
+ * pick, its children are). Read-only; the editor shows them and may offer
28404
+ * per-device options on them (the linked-devices tracked-event opt-in).
28405
+ * Absent when the owner links nothing beyond the picks, and from an owner
28406
+ * older than D655.
28407
+ */
28408
+ impliedSources: zod.z.array(ExtensionSlotSourceSchema).optional()
28375
28409
  });
28376
28410
  /**
28377
28411
  * A provider that could not answer `listSlots` at all. It could not name its
@@ -41567,7 +41601,8 @@ function createDeviceExtensionProvider(options) {
41567
41601
  projects: EXTENSION_SLOTS[slot.slot].descriptor.projects ?? null,
41568
41602
  activation: listing.activation,
41569
41603
  value: listing.value,
41570
- sources: [...listing.sources]
41604
+ sources: [...listing.sources],
41605
+ ...listing.impliedSources !== void 0 ? { impliedSources: [...listing.impliedSources] } : {}
41571
41606
  });
41572
41607
  }
41573
41608
  return rows;
@@ -46126,12 +46161,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
46126
46161
  addonId: null,
46127
46162
  access: "create"
46128
46163
  },
46129
- "deviceManager.applyDeviceSettingsPatch": {
46130
- capName: "device-manager",
46131
- capScope: "system",
46132
- addonId: null,
46133
- access: "create"
46134
- },
46135
46164
  "deviceManager.applyInitialMeta": {
46136
46165
  capName: "device-manager",
46137
46166
  capScope: "system",
@@ -46234,12 +46263,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
46234
46263
  addonId: null,
46235
46264
  access: "view"
46236
46265
  },
46237
- "deviceManager.getDeviceLiveContribution": {
46238
- capName: "device-manager",
46239
- capScope: "system",
46240
- addonId: null,
46241
- access: "view"
46242
- },
46243
46266
  "deviceManager.getDeviceLiveInfoAggregate": {
46244
46267
  capName: "device-manager",
46245
46268
  capScope: "system",
@@ -46252,12 +46275,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
46252
46275
  addonId: null,
46253
46276
  access: "view"
46254
46277
  },
46255
- "deviceManager.getDeviceSettingsContribution": {
46256
- capName: "device-manager",
46257
- capScope: "system",
46258
- addonId: null,
46259
- access: "view"
46260
- },
46261
46278
  "deviceManager.getDeviceStatusAggregate": {
46262
46279
  capName: "device-manager",
46263
46280
  capScope: "system",
@@ -46762,24 +46779,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
46762
46779
  addonId: null,
46763
46780
  access: "view"
46764
46781
  },
46765
- "doorbell.applyDeviceSettingsPatch": {
46766
- capName: "doorbell",
46767
- capScope: "device",
46768
- addonId: null,
46769
- access: "create"
46770
- },
46771
- "doorbell.getDeviceLiveContribution": {
46772
- capName: "doorbell",
46773
- capScope: "device",
46774
- addonId: null,
46775
- access: "view"
46776
- },
46777
- "doorbell.getDeviceSettingsContribution": {
46778
- capName: "doorbell",
46779
- capScope: "device",
46780
- addonId: null,
46781
- access: "view"
46782
- },
46783
46782
  "doorbell.getStatus": {
46784
46783
  capName: "doorbell",
46785
46784
  capScope: "device",
@@ -55326,12 +55325,6 @@ Object.defineProperty(exports, "SOURCE_CAPS", {
55326
55325
  return SOURCE_CAPS;
55327
55326
  }
55328
55327
  });
55329
- Object.defineProperty(exports, "SOURCE_DEVICE_TYPES", {
55330
- enumerable: true,
55331
- get: function() {
55332
- return SOURCE_DEVICE_TYPES;
55333
- }
55334
- });
55335
55328
  Object.defineProperty(exports, "STORAGE_ACCESS_FALLBACK", {
55336
55329
  enumerable: true,
55337
55330
  get: function() {
@@ -691,7 +691,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
691
691
  return EventCategory;
692
692
  }({});
693
693
  //#endregion
694
- //#region ../types/dist/sleep-BXv0ZcRa.mjs
694
+ //#region ../types/dist/sleep-DC-wdyeS.mjs
695
695
  /**
696
696
  * The audio chunk plane's byte format, and the ONE expansion from a coded
697
697
  * window to float samples (D455).
@@ -8144,12 +8144,32 @@ var AudioClassificationLabelSchema = z.object({
8144
8144
  originalClass: z.string().optional(),
8145
8145
  score: z.number()
8146
8146
  });
8147
+ /**
8148
+ * Did the classifier RUN on this window? (D660)
8149
+ *
8150
+ * `classified` with no labels means the model heard nothing above the
8151
+ * camera's floor. `not-classified` means nobody listened — and until D660 the
8152
+ * two were the same shape (`classification` absent), so a window the global
8153
+ * busy gate threw away read downstream exactly like a quiet one (D393).
8154
+ */
8155
+ var AudioClassifyOutcomeSchema = z.discriminatedUnion("state", [z.object({ state: z.literal("classified") }), z.object({
8156
+ state: z.literal("not-classified"),
8157
+ reason: z.enum([
8158
+ "superseded",
8159
+ "error",
8160
+ "timeout",
8161
+ "disposed"
8162
+ ])
8163
+ })]);
8147
8164
  var AudioAnalysisResultSchema = z.object({
8148
8165
  level: AudioLevelSchema,
8166
+ /** Labels at or above the camera's floor. Absent = none — read `classifyOutcome` to know whether the model ran at all. */
8149
8167
  classification: z.object({
8150
8168
  labels: z.array(AudioClassificationLabelSchema).readonly(),
8151
8169
  inferenceMs: z.number()
8152
8170
  }).optional(),
8171
+ /** Whether the classifier ran on this window (D660). */
8172
+ classifyOutcome: AudioClassifyOutcomeSchema,
8153
8173
  timestamp: z.number()
8154
8174
  });
8155
8175
  var AudioAnalysisSettingsSchema = z.object({
@@ -12699,8 +12719,22 @@ var LinkedDeviceSchema = z.object({
12699
12719
  * The `linked-devices` extension slot's editable value (D648): the operator's
12700
12720
  * pick list, exactly what `_linkedDeviceIds` persists. Tree children are NOT
12701
12721
  * in it — they are always linked and are not a pick.
12722
+ *
12723
+ * `trackedDeviceIds` (D655) is the tracked-event opt-in, exactly what
12724
+ * `_linkedDeviceTrackedIds` persists: which linked devices materialize a
12725
+ * synthetic tracked event on the camera. A read always carries it AS STORED
12726
+ * (an absent key reads as `[]`, which is what the resolver makes of it —
12727
+ * NONE). On a write it is optional: absent leaves the opt-in untouched, so a
12728
+ * card built before D655 cannot erase it by saving the pick list. A present
12729
+ * list REPLACES the opt-in; each id must be a pick, a device the camera links
12730
+ * by structure (the row's `impliedSources`: tree children, a picked
12731
+ * container's child) or already stored — so what was read can always be
12732
+ * written back unchanged, and a NEW opt-in outside the linked set is refused.
12702
12733
  */
12703
- var LinkedDevicesSlotValueSchema = z.object({ deviceIds: z.array(z.number().int().positive()) });
12734
+ var LinkedDevicesSlotValueSchema = z.object({
12735
+ deviceIds: z.array(z.number().int().positive()),
12736
+ trackedDeviceIds: z.array(z.number().int().positive()).optional()
12737
+ });
12704
12738
  /**
12705
12739
  * The `linked-devices` slot — a camera's companion devices, owned by the
12706
12740
  * device manager over `_linkedDeviceIds` (D648, D356). Any device may be a
@@ -12867,7 +12901,6 @@ var deviceManagerCapability = {
12867
12901
  scope: "system",
12868
12902
  mode: "singleton",
12869
12903
  extensionSlots: [LINKED_DEVICES_SLOT],
12870
- exposesDeviceSettings: true,
12871
12904
  methods: {
12872
12905
  /** Reserve (or re-resolve) a progressive numeric id for `(addonId, stableId)`.
12873
12906
  * Idempotent: returns the existing id if one is already persisted for the
@@ -13374,8 +13407,8 @@ var deviceManagerCapability = {
13374
13407
  * operator's persisted pick list (`mode` is always `manual` since D356:
13375
13408
  * same-location devices are suggested by the picker, never linked on
13376
13409
  * their own). Excludes the camera itself; deduped. The list is written by
13377
- * the settings section or the `linked-devices` extension slot, both over
13378
- * `_linkedDeviceIds` (see the module docblock).
13410
+ * the `linked-devices` extension slot over `_linkedDeviceIds` (see the
13411
+ * module docblock).
13379
13412
  */
13380
13413
  getLinkedDevices: method(z.object({ deviceId: z.number() }), z.object({
13381
13414
  mode: LinkedDevicesModeSchema,
@@ -20357,6 +20390,13 @@ var AudioEventSchema = z.object({
20357
20390
  originalClass: z.string().optional(),
20358
20391
  score: z.number()
20359
20392
  }).optional(),
20393
+ /**
20394
+ * Whether the classifier RAN on the window behind this row (D660). Absent
20395
+ * on rows written before D660 — unknown, NOT classified: until then a
20396
+ * window the analyzer's busy gate threw away was stored exactly like one
20397
+ * that heard nothing above the floor.
20398
+ */
20399
+ classifyOutcome: AudioClassifyOutcomeSchema.optional(),
20360
20400
  /** Populated by B5 (recording playback URL for this event). */
20361
20401
  mediaUrl: z.string().optional()
20362
20402
  });
@@ -22765,7 +22805,14 @@ var pipelineExecutorCapability = {
22765
22805
  */
22766
22806
  inferCached: method(z.object({
22767
22807
  stepId: z.string(),
22768
- frameId: z.number().int()
22808
+ frameId: z.number().int(),
22809
+ /**
22810
+ * The model to time — REQUIRED (D658). Without it the pool answered the
22811
+ * step's ACTIVE variant (the first loaded after boot), so a benchmark
22812
+ * of model B silently timed model A. Callers pass the `rootModelId`
22813
+ * their warmup `runPipeline` reported: the model that actually ran.
22814
+ */
22815
+ modelId: z.string().min(1)
22769
22816
  }), z.record(z.string(), z.unknown()), { kind: "mutation" }),
22770
22817
  /**
22771
22818
  * Release a cached frame from the Python pool's memory.
@@ -28095,28 +28142,6 @@ var SOURCE_CAP_CHANGED_AT_FIELD = {
28095
28142
  };
28096
28143
  /** Cap names whose presence in a device's bindings qualify it as a source. */
28097
28144
  var SOURCE_CAPS = Object.keys(SOURCE_CAP_ACTIVE_FIELD);
28098
- /**
28099
- * Device `type` values (from `DeviceType`) that can host a binary/switch
28100
- * source cap. Used by the camera's `device-multiselect` picker as the
28101
- * CLIENT-SIDE filter, alongside `SOURCE_CAPS`.
28102
- *
28103
- * Why types and not caps alone: the shared picker filters
28104
- * `deviceManager.listAll` rows client-side, and those rows carry only the
28105
- * device's advertised `features` — NOT its registered cap list. On the live
28106
- * cluster binary sensors and switches advertise EMPTY features (features
28107
- * mirror only a handful of caps like `motion-trigger`), so a caps-only
28108
- * filter matched against `features` would list nothing (the very bug this
28109
- * replaced, which relied on the now-empty `getAllBindings`). Matching by
28110
- * `type` is the reliable client-side signal; the union with `SOURCE_CAPS`
28111
- * still captures any device that DOES advertise a source-cap feature.
28112
- * `sensor` covers contact/motion/flood/gas/smoke/CO/vibration/tamper,
28113
- * `switch` covers switches, `control` covers generic binary actuators.
28114
- */
28115
- var SOURCE_DEVICE_TYPES = [
28116
- "sensor",
28117
- "switch",
28118
- "control"
28119
- ];
28120
28145
  /** True when a cap is a recognised binary/switch source. */
28121
28146
  function isSourceCap(capName) {
28122
28147
  return Object.prototype.hasOwnProperty.call(SOURCE_CAP_ACTIVE_FIELD, capName);
@@ -28262,7 +28287,6 @@ var doorbellCapability = {
28262
28287
  kind: "wrapper",
28263
28288
  defaultActive: false,
28264
28289
  deviceTypes: [DeviceType.Button, DeviceType.Camera],
28265
- exposesDeviceSettings: true,
28266
28290
  extensionSlots: [DOORBELL_SOURCE_SLOT],
28267
28291
  methods: {},
28268
28292
  events: {
@@ -28371,7 +28395,17 @@ var ExtensionSlotStateSchema = z.object({
28371
28395
  projects: z.string().nullable(),
28372
28396
  activation: ExtensionSlotActivationSchema.nullable(),
28373
28397
  value: ExtensionSlotValueSchema,
28374
- sources: z.array(ExtensionSlotSourceSchema)
28398
+ sources: z.array(ExtensionSlotSourceSchema),
28399
+ /**
28400
+ * Devices the owner links to the host ON ITS OWN, by structure, and that
28401
+ * are therefore not in `value` (D655): a camera's device-tree children, and
28402
+ * the child a picked container stands for (D356 — a container is never a
28403
+ * pick, its children are). Read-only; the editor shows them and may offer
28404
+ * per-device options on them (the linked-devices tracked-event opt-in).
28405
+ * Absent when the owner links nothing beyond the picks, and from an owner
28406
+ * older than D655.
28407
+ */
28408
+ impliedSources: z.array(ExtensionSlotSourceSchema).optional()
28375
28409
  });
28376
28410
  /**
28377
28411
  * A provider that could not answer `listSlots` at all. It could not name its
@@ -41567,7 +41601,8 @@ function createDeviceExtensionProvider(options) {
41567
41601
  projects: EXTENSION_SLOTS[slot.slot].descriptor.projects ?? null,
41568
41602
  activation: listing.activation,
41569
41603
  value: listing.value,
41570
- sources: [...listing.sources]
41604
+ sources: [...listing.sources],
41605
+ ...listing.impliedSources !== void 0 ? { impliedSources: [...listing.impliedSources] } : {}
41571
41606
  });
41572
41607
  }
41573
41608
  return rows;
@@ -46126,12 +46161,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
46126
46161
  addonId: null,
46127
46162
  access: "create"
46128
46163
  },
46129
- "deviceManager.applyDeviceSettingsPatch": {
46130
- capName: "device-manager",
46131
- capScope: "system",
46132
- addonId: null,
46133
- access: "create"
46134
- },
46135
46164
  "deviceManager.applyInitialMeta": {
46136
46165
  capName: "device-manager",
46137
46166
  capScope: "system",
@@ -46234,12 +46263,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
46234
46263
  addonId: null,
46235
46264
  access: "view"
46236
46265
  },
46237
- "deviceManager.getDeviceLiveContribution": {
46238
- capName: "device-manager",
46239
- capScope: "system",
46240
- addonId: null,
46241
- access: "view"
46242
- },
46243
46266
  "deviceManager.getDeviceLiveInfoAggregate": {
46244
46267
  capName: "device-manager",
46245
46268
  capScope: "system",
@@ -46252,12 +46275,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
46252
46275
  addonId: null,
46253
46276
  access: "view"
46254
46277
  },
46255
- "deviceManager.getDeviceSettingsContribution": {
46256
- capName: "device-manager",
46257
- capScope: "system",
46258
- addonId: null,
46259
- access: "view"
46260
- },
46261
46278
  "deviceManager.getDeviceStatusAggregate": {
46262
46279
  capName: "device-manager",
46263
46280
  capScope: "system",
@@ -46762,24 +46779,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
46762
46779
  addonId: null,
46763
46780
  access: "view"
46764
46781
  },
46765
- "doorbell.applyDeviceSettingsPatch": {
46766
- capName: "doorbell",
46767
- capScope: "device",
46768
- addonId: null,
46769
- access: "create"
46770
- },
46771
- "doorbell.getDeviceLiveContribution": {
46772
- capName: "doorbell",
46773
- capScope: "device",
46774
- addonId: null,
46775
- access: "view"
46776
- },
46777
- "doorbell.getDeviceSettingsContribution": {
46778
- capName: "doorbell",
46779
- capScope: "device",
46780
- addonId: null,
46781
- access: "view"
46782
- },
46783
46782
  "doorbell.getStatus": {
46784
46783
  capName: "doorbell",
46785
46784
  capScope: "device",
@@ -55104,4 +55103,4 @@ function enumerateInferenceDevices(hw) {
55104
55103
  return out;
55105
55104
  }
55106
55105
  //#endregion
55107
- export { declarationOwnerNodeId as $, scopesAllowDeviceCap as $t, STREAM_PROFILE_META as A, createEvent as An, localNetworkCapability as At, alertsCapability as B, readinessKey as Bn, normalizeUnit as Bt, RECORDING_SOURCE_CAMSTACK_ADDON as C, DeviceType as Cn, isSameAddonId as Ct, SOURCE_CAPS as D, asJsonObject as Dn, legacyAutoLinkIds as Dt, RecordingStatusSchema as E, WELL_KNOWN_TAB_MAP as En, kebabToCamel as Et, StorageMigrationJobSchema as F, isDeviceConfigCap as Fn, mayReadLocation as Ft, buildStreamParamsConfigSchema as G, procedureAuthKey as Gt, backupCapability as H, scopeKey as Hn, objectInputDeclaresRequiredDeviceId as Ht, UserRecordSchema as I, isEvent as In, mayWriteToLocation as It, coreBlockAddonId as J, resolveBucketMs as Jt, cameraGridLayoutCapability as K, ptzAutotrackCapability as Kt, addonPagesCapability as L, nodePin as Ln, metricsProviderCapability as Lt, StorageCleanupJobSchema as M, emitReadiness as Mn, logDestinationCapability as Mt, StorageLocationModeSchema as N, expandCapMethods as Nn, logLevelAtMost as Nt, SOURCE_DEVICE_TYPES as O, asNumber as On, legacyModeOf as Ot, StorageLocationTypeSchema as P, hydrateSchema as Pn, looseSchema as Pt, dataStoreProviderCapability as Q, scopesAllowAddon as Qt, addonSettingsCapability as R, parseJsonObject as Rn, modeMayWrite as Rt, MOTION_CLOSE_AFTER_MS as S, DeviceRole as Sn, isObjectInput as St, RUNTIME_DEFAULTS as T, ReadinessTimeoutError as Tn, isVoidInput as Tt, bareAddonId as U, sleep as Un, parseStreamParamsFormPatch as Ut, authProviderCapability as V, resolveCapMount as Vn, objectInputDeclaresAddonId as Vt, batteryCapability as W, EventCategory as Wn, platformProbeCapability as Wt, coreBlocksCapability as X, resolveMethodAuth as Xt, coreBlockIdFromAddonId as Y, resolveLocationMode as Yt, createDeviceExtensionProvider as Z, runtimeStatePolicyFor as Zt, LOG_LEVEL_RANK as _, BaseAddon as _n, formatMinutes as _t, BatteryStatusSchema as a, storageMigrationCapability as an, deviceStateCapability as at, METHOD_ACCESS_MAP as b, DEVICE_STATUS_METHOD as bn, isCollectionArrayMethod as bt, CORE_BLOCKS_ADDON_ID as c, streamCatalogCapability as cn, enumerateInferenceDevices as ct, DAY_NAMES as d, vectorDimFromBase64 as dn, evaluateSensorEdge as dt, scoreRuntimes as en, decodeVectorBase64 as et, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as f, vectorIndexDimConflictError as fn, evictionPolicyOfLocation as ft, FIRST_LEVEL_MACRO_CLASSES as g, buildFfmpegArgs as gn, foldSnapshotByFunction as gt, DeviceStatusSchema as h, errMsg as hn, filesystemBrowseCapability as ht, BaseDevice as i, storageCapability as in, deviceManagerCapability as it, ScopedTokenSchema as j, emitDownForOwnedCaps as jn, locationIconKey as jt, STORAGE_ACCESS_FALLBACK as k, asString as kn, lifecycleJobSchema as kt, CORE_BLOCK_ADDON_PREFIX as l, streamQualityLabel as ln, enumerateItemArrayFields as lt, DeclaredDevices as m, withLocationMode as mn, extractNestedAddonId as mt, AlertSchema as n, siteZoneKey as nn, deriveBatteryPresence as nt, CAMERA_SWITCH_ORDER as o, storageOccupancyCapability as on, deviceStatusCapability as ot, DERIVED_CAMERA_SILENCED_CAP_NAMES as p, vectorStoreCapability as pn, expandContainer as pt, collectSecretConfigKeys as q, reducePoints as qt, ApiKeyRecordSchema as r, snapshotCapability as rn, deviceExtensionCapability as rt, CAP_NAMES_WITH_STATUS as s, storageProviderCapability as sn, doorbellCapability as st, ALL_CAPABILITY_DEFINITIONS as t, settingsStoreCapability as tn, defineExtensionSlotProvider as tt, CoreBlockSchema as u, userManagementCapability as un, enumerateSchemaFields as ut, LegacyStorageLocationDefaultSchema as v, DATAPLANE_SECRET_HEADER as vn, gbToBytes as vt, REDACTED_SECRET as w, ReadinessRegistry as wn, isSourceCap as wt, MINUTES_PER_DAY as x, DeviceFeature as xn, isLocationEnabled as xt, LocationIconIdSchema as y, DEVICE_SETTINGS_CONTRIBUTION_METHODS as yn, isArrayOutputSchema as yt, addonWidgetsCapability as z, parseJsonUnknown as zn, motionCapability as zt };
55106
+ export { decodeVectorBase64 as $, scoreRuntimes as $t, ScopedTokenSchema as A, emitDownForOwnedCaps as An, locationIconKey as At, authProviderCapability as B, resolveCapMount as Bn, objectInputDeclaresAddonId as Bt, RECORDING_SOURCE_CAMSTACK_ADDON as C, ReadinessRegistry as Cn, isSourceCap as Ct, SOURCE_CAPS as D, asNumber as Dn, legacyModeOf as Dt, RecordingStatusSchema as E, asJsonObject as En, legacyAutoLinkIds as Et, UserRecordSchema as F, isEvent as Fn, mayWriteToLocation as Ft, cameraGridLayoutCapability as G, ptzAutotrackCapability as Gt, bareAddonId as H, sleep as Hn, parseStreamParamsFormPatch as Ht, addonPagesCapability as I, nodePin as In, metricsProviderCapability as It, coreBlockIdFromAddonId as J, resolveLocationMode as Jt, collectSecretConfigKeys as K, reducePoints as Kt, addonSettingsCapability as L, parseJsonObject as Ln, modeMayWrite as Lt, StorageLocationModeSchema as M, expandCapMethods as Mn, logLevelAtMost as Mt, StorageLocationTypeSchema as N, hydrateSchema as Nn, looseSchema as Nt, STORAGE_ACCESS_FALLBACK as O, asString as On, lifecycleJobSchema as Ot, StorageMigrationJobSchema as P, isDeviceConfigCap as Pn, mayReadLocation as Pt, declarationOwnerNodeId as Q, scopesAllowDeviceCap as Qt, addonWidgetsCapability as R, parseJsonUnknown as Rn, motionCapability as Rt, MOTION_CLOSE_AFTER_MS as S, DeviceType as Sn, isSameAddonId as St, RUNTIME_DEFAULTS as T, WELL_KNOWN_TAB_MAP as Tn, kebabToCamel as Tt, batteryCapability as U, EventCategory as Un, platformProbeCapability as Ut, backupCapability as V, scopeKey as Vn, objectInputDeclaresRequiredDeviceId as Vt, buildStreamParamsConfigSchema as W, procedureAuthKey as Wt, createDeviceExtensionProvider as X, runtimeStatePolicyFor as Xt, coreBlocksCapability as Y, resolveMethodAuth as Yt, dataStoreProviderCapability as Z, scopesAllowAddon as Zt, LOG_LEVEL_RANK as _, DATAPLANE_SECRET_HEADER as _n, gbToBytes as _t, BatteryStatusSchema as a, storageOccupancyCapability as an, deviceStatusCapability as at, METHOD_ACCESS_MAP as b, DeviceFeature as bn, isLocationEnabled as bt, CORE_BLOCKS_ADDON_ID as c, streamQualityLabel as cn, enumerateItemArrayFields as ct, DAY_NAMES as d, vectorIndexDimConflictError as dn, evictionPolicyOfLocation as dt, settingsStoreCapability as en, defineExtensionSlotProvider as et, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as f, vectorStoreCapability as fn, expandContainer as ft, FIRST_LEVEL_MACRO_CLASSES as g, BaseAddon as gn, formatMinutes as gt, DeviceStatusSchema as h, buildFfmpegArgs as hn, foldSnapshotByFunction as ht, BaseDevice as i, storageMigrationCapability as in, deviceStateCapability as it, StorageCleanupJobSchema as j, emitReadiness as jn, logDestinationCapability as jt, STREAM_PROFILE_META as k, createEvent as kn, localNetworkCapability as kt, CORE_BLOCK_ADDON_PREFIX as l, userManagementCapability as ln, enumerateSchemaFields as lt, DeclaredDevices as m, errMsg as mn, filesystemBrowseCapability as mt, AlertSchema as n, snapshotCapability as nn, deviceExtensionCapability as nt, CAMERA_SWITCH_ORDER as o, storageProviderCapability as on, doorbellCapability as ot, DERIVED_CAMERA_SILENCED_CAP_NAMES as p, withLocationMode as pn, extractNestedAddonId as pt, coreBlockAddonId as q, resolveBucketMs as qt, ApiKeyRecordSchema as r, storageCapability as rn, deviceManagerCapability as rt, CAP_NAMES_WITH_STATUS as s, streamCatalogCapability as sn, enumerateInferenceDevices as st, ALL_CAPABILITY_DEFINITIONS as t, siteZoneKey as tn, deriveBatteryPresence as tt, CoreBlockSchema as u, vectorDimFromBase64 as un, evaluateSensorEdge as ut, LegacyStorageLocationDefaultSchema as v, DEVICE_SETTINGS_CONTRIBUTION_METHODS as vn, isArrayOutputSchema as vt, REDACTED_SECRET as w, ReadinessTimeoutError as wn, isVoidInput as wt, MINUTES_PER_DAY as x, DeviceRole as xn, isObjectInput as xt, LocationIconIdSchema as y, DEVICE_STATUS_METHOD as yn, isCollectionArrayMethod as yt, alertsCapability as z, readinessKey as zn, normalizeUnit as zt };
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_chunk = require("./chunk-Cek0wNdY.js");
3
- const require_dist = require("./dist-BK4iP6ab.js");
3
+ const require_dist = require("./dist-D3ch99WD.js");
4
4
  const require_builtins_alerts_alerts_addon = require("./builtins/alerts/alerts.addon.js");
5
5
  require("./builtins/alerts/index.js");
6
6
  const require_formatter = require("./formatter-DqAKDlvN.js");
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import { a as __toCommonJS, i as __require, n as __esmMin, o as __toESM$1, r as __exportAll, t as __commonJSMin$1 } from "./chunk-CNf5ZN-e.mjs";
2
- import { $t as scopesAllowDeviceCap, An as createEvent, Bn as readinessKey, Dn as asJsonObject$1, Et as kebabToCamel, Gt as procedureAuthKey, Hn as scopeKey, Ht as objectInputDeclaresRequiredDeviceId, Nn as expandCapMethods, Nt as logLevelAtMost, On as asNumber, Pt as looseSchema, Qt as scopesAllowAddon, R as addonSettingsCapability, Rn as parseJsonObject, St as isObjectInput, T as RUNTIME_DEFAULTS, Tn as ReadinessTimeoutError, Tt as isVoidInput, Vn as resolveCapMount, Vt as objectInputDeclaresAddonId, Wn as EventCategory$1, Xt as resolveMethodAuth, _ as LOG_LEVEL_RANK, b as METHOD_ACCESS_MAP, bn as DEVICE_STATUS_METHOD, bt as isCollectionArrayMethod, hn as errMsg$1, jn as emitDownForOwnedCaps, kn as asString$1, kt as lifecycleJobSchema, mt as extractNestedAddonId, t as ALL_CAPABILITY_DEFINITIONS, vn as DATAPLANE_SECRET_HEADER$1, wn as ReadinessRegistry, yn as DEVICE_SETTINGS_CONTRIBUTION_METHODS, yt as isArrayOutputSchema, zn as parseJsonUnknown } from "./dist-Df1NhKxm.mjs";
2
+ import { An as emitDownForOwnedCaps, Bn as resolveCapMount, Bt as objectInputDeclaresAddonId, Cn as ReadinessRegistry, Dn as asNumber, En as asJsonObject$1, L as addonSettingsCapability, Ln as parseJsonObject, Mn as expandCapMethods, Mt as logLevelAtMost, Nt as looseSchema, On as asString$1, Ot as lifecycleJobSchema, Qt as scopesAllowDeviceCap, Rn as parseJsonUnknown, T as RUNTIME_DEFAULTS, Tt as kebabToCamel, Un as EventCategory$1, Vn as scopeKey, Vt as objectInputDeclaresRequiredDeviceId, Wt as procedureAuthKey, Yt as resolveMethodAuth, Zt as scopesAllowAddon, _ as LOG_LEVEL_RANK, _n as DATAPLANE_SECRET_HEADER$1, b as METHOD_ACCESS_MAP, kn as createEvent, mn as errMsg$1, pt as extractNestedAddonId, t as ALL_CAPABILITY_DEFINITIONS, vn as DEVICE_SETTINGS_CONTRIBUTION_METHODS, vt as isArrayOutputSchema, wn as ReadinessTimeoutError, wt as isVoidInput, xt as isObjectInput, yn as DEVICE_STATUS_METHOD, yt as isCollectionArrayMethod, zn as readinessKey } from "./dist-DdfJa8Zn.mjs";
3
3
  import { AlertCenterAddon } from "./builtins/alerts/alerts.addon.mjs";
4
4
  import "./builtins/alerts/index.mjs";
5
5
  import { t as formatLogLine } from "./formatter-B7qW8bPJ.mjs";
@@ -1,4 +1,4 @@
1
- import { Dn as asJsonObject } from "./dist-Df1NhKxm.mjs";
1
+ import { En as asJsonObject } from "./dist-DdfJa8Zn.mjs";
2
2
  //#region src/builtins/sqlite-storage/retired-settings-keys.ts
3
3
  /**
4
4
  * Is THIS node the one whose settings store is the cluster's authority?
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-BK4iP6ab.js");
1
+ const require_dist = require("./dist-D3ch99WD.js");
2
2
  //#region src/builtins/sqlite-storage/retired-settings-keys.ts
3
3
  /**
4
4
  * Is THIS node the one whose settings store is the cluster's authority?
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/system",
3
- "version": "1.2.305",
3
+ "version": "1.2.307",
4
4
  "description": "Core addon for CamStack — builtins, pipeline, process management, auth, logging, events",
5
5
  "keywords": [
6
6
  "camstack",
@@ -1,26 +0,0 @@
1
- import { ProviderContext } from './device-provider-context.js';
2
- /** One device-store-backed section: the keys it owns + how to persist them. */
3
- export interface DeviceStoreSection {
4
- /** Reserved config keys this section owns (must not reach the driver). */
5
- readonly keys: readonly string[];
6
- /** Persist this section's slice of a save into the device-store blob. */
7
- apply(pctx: Pick<ProviderContext, 'settings'>, deviceId: number, patch: Record<string, unknown>): Promise<unknown>;
8
- }
9
- /** The device-manager's device-store-backed sections. Add an entry to extend. */
10
- export declare const DEVICE_STORE_SECTIONS: readonly DeviceStoreSection[];
11
- /** Result of splitting a `device-manager`-writer patch by persistence target. */
12
- export interface DeviceStoreSplit {
13
- /** Per-section slices that persist to the device-store blob. */
14
- readonly storeGroups: ReadonlyArray<{
15
- section: DeviceStoreSection;
16
- patch: Record<string, unknown>;
17
- }>;
18
- /** The remaining keys, destined for the device driver's own config. */
19
- readonly driverPatch: Record<string, unknown>;
20
- }
21
- /**
22
- * Split a `writerCapName: 'device-manager'` patch into device-store slices
23
- * (one per matching registered section) and the leftover driver patch.
24
- * Generic — consults {@link DEVICE_STORE_SECTIONS}, no hardcoded key list.
25
- */
26
- export declare function splitDeviceStoreKeys(patch: Record<string, unknown>): DeviceStoreSplit;