@camstack/system 1.2.233 → 1.2.235

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/addon-runner.js +1 -1
  2. package/dist/addon-runner.mjs +1 -1
  3. package/dist/addon-utils.js +1 -1
  4. package/dist/addon-utils.mjs +1 -1
  5. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +1 -1
  6. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +1 -1
  7. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
  8. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +1 -1
  9. package/dist/builtins/alerts/alerts.addon.js +1 -1
  10. package/dist/builtins/alerts/alerts.addon.mjs +1 -1
  11. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +1 -1
  12. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.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/contribution-cache.d.ts +68 -0
  18. package/dist/builtins/device-manager/device-config-contribution.d.ts +0 -1
  19. package/dist/builtins/device-manager/device-manager.addon.js +176 -83
  20. package/dist/builtins/device-manager/device-manager.addon.mjs +177 -84
  21. package/dist/builtins/doorbell/virtual-doorbell.addon.js +1 -1
  22. package/dist/builtins/doorbell/virtual-doorbell.addon.mjs +1 -1
  23. package/dist/builtins/hub-forwarder/index.js +1 -1
  24. package/dist/builtins/hub-forwarder/index.mjs +1 -1
  25. package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
  26. package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
  27. package/dist/builtins/local-auth/local-auth.addon.js +1 -1
  28. package/dist/builtins/local-auth/local-auth.addon.mjs +1 -1
  29. package/dist/builtins/local-network/local-network.addon.js +1 -1
  30. package/dist/builtins/local-network/local-network.addon.mjs +1 -1
  31. package/dist/builtins/loki-logging/index.js +1 -1
  32. package/dist/builtins/loki-logging/index.mjs +1 -1
  33. package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
  34. package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
  35. package/dist/builtins/platform-probe/index.js +1 -1
  36. package/dist/builtins/platform-probe/index.mjs +1 -1
  37. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  38. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  39. package/dist/builtins/snapshot/index.js +1 -1
  40. package/dist/builtins/snapshot/index.mjs +1 -1
  41. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  42. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  43. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +0 -0
  44. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +0 -0
  45. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +1 -1
  46. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +1 -1
  47. package/dist/builtins/system-config/system-config.addon.js +1 -1
  48. package/dist/builtins/system-config/system-config.addon.mjs +1 -1
  49. package/dist/builtins/winston-logging/index.js +1 -1
  50. package/dist/builtins/winston-logging/index.mjs +1 -1
  51. package/dist/{custom-action-registry-CFHYDHAu.mjs → custom-action-registry-B4Cf4O_X.mjs} +1 -1
  52. package/dist/{custom-action-registry-CWFK5UDj.js → custom-action-registry-acBY3mHA.js} +2 -2
  53. package/dist/{dist-BIvXRexm.mjs → dist-CGG0rSEx.mjs} +78 -35
  54. package/dist/{dist-D3lJV9M7.js → dist-Ctn_E3-0.js} +77 -40
  55. package/dist/index.js +2 -2
  56. package/dist/index.mjs +2 -2
  57. package/dist/{retired-settings-keys-YPsd2Exa.js → retired-settings-keys-B209Nykf.js} +1 -1
  58. package/dist/{retired-settings-keys-CV3ZLGnJ.mjs → retired-settings-keys-oo4mt1CU.mjs} +1 -1
  59. package/package.json +1 -1
  60. package/dist/builtins/device-manager/native-object-detection-config-schema.d.ts +0 -3
@@ -690,7 +690,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
690
690
  return EventCategory;
691
691
  }({});
692
692
  //#endregion
693
- //#region ../types/dist/sleep-BEyvfshj.mjs
693
+ //#region ../types/dist/sleep-B9qx0cEV.mjs
694
694
  /**
695
695
  * The audio chunk plane's byte format, and the ONE expansion from a coded
696
696
  * window to float samples (D455).
@@ -8558,6 +8558,21 @@ var streamSignalsCapability = {
8558
8558
  mode: "singleton",
8559
8559
  deviceTypes: Object.values(DeviceType),
8560
8560
  runtimeState: StreamSignalsStatusSchema,
8561
+ /**
8562
+ * Runtime-state durability: **session** — mirrored in RAM, never written.
8563
+ *
8564
+ * The slice holds what the DEVICE says it can emit. That is a probed fact,
8565
+ * not an operator choice: the provider re-declares it on every registration,
8566
+ * so losing it loses nothing and persisting it would freeze an answer the
8567
+ * camera is entitled to change. Measured the same day on the sibling case —
8568
+ * `native-object-detection.supportedClasses` was persisted, and a firmware
8569
+ * class the camera really detected stayed missing for the life of the row
8570
+ * because the fix could not reach it.
8571
+ *
8572
+ * See `RuntimeStateDurability`. Enforced by
8573
+ * `scripts/check-runtime-state-durability.ts`.
8574
+ */
8575
+ durability: "session",
8561
8576
  methods: {
8562
8577
  /**
8563
8578
  * What this device can emit. Empty is a valid and common answer — most
@@ -10056,17 +10071,6 @@ var coreBlocksCapability = {
10056
10071
  })) }), { auth: "admin" })
10057
10072
  }
10058
10073
  };
10059
- /** Strip a catalog to what crosses the wire. Pure; the schemas are not touched. */
10060
- function describeCustomActions(catalog) {
10061
- const out = {};
10062
- for (const [name, spec] of Object.entries(catalog)) out[name] = {
10063
- kind: spec.kind,
10064
- auth: spec.auth,
10065
- scope: spec.scope,
10066
- ...spec.caller === "required" ? { caller: "required" } : {}
10067
- };
10068
- return out;
10069
- }
10070
10074
  /**
10071
10075
  * `custom-model-registry` — collection cap exposing operator-registered
10072
10076
  * custom detection models. Each provider (today: `addon-model-studio`)
@@ -21208,6 +21212,14 @@ var MotionSourceEnum = z.enum([
21208
21212
  */
21209
21213
  var MotionSourcesSchema = z.array(MotionSourceEnum);
21210
21214
  /**
21215
+ * Which root detectors a camera runs. Deliberately the SAME vocabulary
21216
+ * post-analysis already tags every detection with (`DetectionSource`) rather
21217
+ * than a second spelling of the same two ideas — the value an operator picks
21218
+ * here is the value that comes back on the track, the overlay and the debug
21219
+ * row.
21220
+ */
21221
+ var DetectionSourcesSchema = z.array(DetectionSourceSchema);
21222
+ /**
21211
21223
  * Input shape for `pipeline-runner.reportMotion` cap method. Exported
21212
21224
  * so cap-side consumers (the orchestrator forward, the runner addon's
21213
21225
  * cap implementation, tests) can reuse the type instead of redeclaring
@@ -21358,6 +21370,35 @@ var RunnerCameraConfigSchema = z.object({
21358
21370
  * events; the orchestrator forwards to `reportMotion`.
21359
21371
  */
21360
21372
  motionSources: MotionSourcesSchema.default(["analyzer"]),
21373
+ /**
21374
+ * WHICH root detector runs for this camera. The detection counterpart of
21375
+ * {@link motionSources}, same shape and same discipline: a per-camera list
21376
+ * of sources the system understands, vendor-agnostic, owned here.
21377
+ *
21378
+ * - `pipeline` — this runner's own root step on decoded pixels (`steps`).
21379
+ * - `onboard` — the CAMERA's own detector, admitted only when it is named
21380
+ * here. Its boxes reach post-analysis on the same
21381
+ * `PipelineInferenceResult` payload as the pipeline's, so an onboard-born
21382
+ * track gets the same tracker, the same overlay and the same detail
21383
+ * subtree (face / plate / embedding).
21384
+ *
21385
+ * `['onboard']` alone is the REPLACEMENT: this runner's root step does not
21386
+ * run, and that is where a camera with a usable onboard detector buys back
21387
+ * its share of the accelerator. It saves the root inference, not the decode
21388
+ * — the detail subtree still needs pixels to cut crops from.
21389
+ *
21390
+ * A camera whose onboard detections carry no geometry cannot serve as a root
21391
+ * step at all (there is nothing to track), and the cap that knows this says
21392
+ * so on `native-object-detection.getOptions().geometry`. On Reolink that is
21393
+ * every battery camera: the boxes ride a sub-stream a battery camera never
21394
+ * attaches, so such a camera stays on `['pipeline']` and its onboard AI is
21395
+ * worth exactly what it already is — a wake signal with a class.
21396
+ *
21397
+ * Defaults to `['pipeline']`, which is byte-for-byte today's behaviour: a
21398
+ * vendor never turns a detector on for the operator, and neither does a
21399
+ * default.
21400
+ */
21401
+ detectionSources: DetectionSourcesSchema.default(["pipeline"]),
21361
21402
  pipelineEnabled: z.boolean().default(true),
21362
21403
  /** Ordered tree of video steps. Absent → runner skips video detection. */
21363
21404
  steps: z.array(PipelineStepInputSchema).readonly().optional(),
@@ -30182,31 +30223,38 @@ var NativeObjectDetectionStatusSchema = z.object({
30182
30223
  /**
30183
30224
  * Whether forwarding of onboard AI detections is enabled for this device.
30184
30225
  *
30185
- * The COLD-START default is the provider's, and it is not one value for
30186
- * every camera: a mains camera carries the boxed side-channel and its
30187
- * detections are usable subjects, so it defaults ON; a battery camera never
30188
- * attaches that channel, so the same toggle would buy it nothing but a write
30189
- * — it defaults OFF and an operator who wants it turns it on knowing what it
30190
- * costs. {@link NativeObjectDetectionOptionsSchema.geometry} is how the UI
30191
- * says which of the two a camera is.
30226
+ * Cold-start OFF on every camera. A vendor does not decide which detector a
30227
+ * camera runs — that is the operator's choice, and it is made where every
30228
+ * other detection choice is made. `geometry` on
30229
+ * {@link NativeObjectDetectionOptionsSchema} is how the form says what the
30230
+ * choice would buy this particular camera.
30192
30231
  */
30193
30232
  enabled: z.boolean()
30194
30233
  });
30195
30234
  /**
30196
- * What a camera's onboard detections actually CARRY.
30235
+ * WHEN a camera's onboard detections carry geometry.
30197
30236
  *
30198
- * `boxed` — the firmware ships a bounding box with the class, so a detection is
30199
- * a subject the pipeline can track, crop and score.
30200
- * `flag-only` — the firmware ships the class and nothing else. The pipeline
30201
- * needs geometry to make a subject out of it, so such a push reaches the
30202
- * tracker as motion and no further. On Reolink this is every battery camera:
30203
- * the boxes ride the BcMedia sub-stream, which a battery camera never attaches.
30237
+ * - `boxed` — always. The provider holds a standing channel for the boxes, so
30238
+ * a detection is a trackable subject whenever the camera sees one.
30239
+ * - `while-streaming` — only while some stream of this camera is already open.
30240
+ * The boxes ride the video's own side-channel rather than a feed of their
30241
+ * own, so they cost nothing and they exist only when something is pulling.
30242
+ * On Reolink this is every BATTERY camera: a persistent second feed is real
30243
+ * radio drain, but a camera that is awake is awake precisely because
30244
+ * something is in front of it, and its stream is already being pulled.
30245
+ * - `flag-only` — never. The firmware ships the class and nothing else; the
30246
+ * pipeline needs geometry to make a subject, so such a push reaches the
30247
+ * tracker as motion and no further.
30204
30248
  *
30205
30249
  * Reported and not inferred, because the operator's question in front of the
30206
- * toggle is "what do I get", and "a class with no box" and "a subject" are
30207
- * different answers (D14: the derived form is only as honest as `getOptions`).
30250
+ * picker is "what do I get", and these are three different answers (D14: the
30251
+ * derived form is only as honest as `getOptions`).
30208
30252
  */
30209
- var NativeObjectGeometryEnum = z.enum(["boxed", "flag-only"]);
30253
+ var NativeObjectGeometryEnum = z.enum([
30254
+ "boxed",
30255
+ "while-streaming",
30256
+ "flag-only"
30257
+ ]);
30210
30258
  var NativeObjectDetectionOptionsSchema = z.object({
30211
30259
  /** Classes this firmware can detect — the same list the status reports. */
30212
30260
  supportedClasses: z.array(NativeObjectClassEnum).readonly(),
@@ -30223,11 +30271,6 @@ var nativeObjectDetectionCapability = {
30223
30271
  deviceNative: true,
30224
30272
  mode: "singleton",
30225
30273
  deviceTypes: [DeviceType.Camera],
30226
- deviceConfig: { ui: {
30227
- kind: "derived-form",
30228
- builderId: "native-object-detection",
30229
- tab: "motion"
30230
- } },
30231
30274
  methods: {
30232
30275
  getOptions: method(z.object({ deviceId: z.number() }), NativeObjectDetectionOptionsSchema),
30233
30276
  setSettings: method(z.object({
@@ -46358,4 +46401,4 @@ function enumerateInferenceDevices(hw) {
46358
46401
  return out;
46359
46402
  }
46360
46403
  //#endregion
46361
- export { evaluateSensorEdge as $, DeviceFeature as $t, addonSettingsCapability as A, resolveContainerPrimaryChild as At, coreBlockIdFromAddonId as B, storageMigrationCapability as Bt, ScopedTokenSchema as C, normalizeUnit as Ct, StorageMigrationJobSchema as D, procedureAuthKey as Dt, StorageLocationTypeSchema as E, platformProbeCapability as Et, bareAddonId as F, scopesAllowDeviceCap as Ft, describeCustomActions as G, vectorDimFromBase64 as Gt, dataStoreProviderCapability as H, storageProviderCapability as Ht, batteryCapability as I, scoreRuntimes as It, deviceStatusCapability as J, errMsg as Jt, deviceManagerCapability as K, vectorStoreCapability as Kt, buildStreamParamsConfigSchema as L, settingsStoreCapability as Lt, alertsCapability as M, resolveMethodAuth as Mt, authProviderCapability as N, runtimeStatePolicyFor as Nt, UserRecordSchema as O, reducePoints as Ot, backupCapability as P, scopesAllowAddon as Pt, enumerateSchemaFields as Q, DEVICE_STATUS_METHOD as Qt, collectSecretConfigKeys as R, snapshotCapability as Rt, STREAM_PROFILE_META as S, modeMayWrite as St, StorageLocationModeSchema as T, parseStreamParamsFormPatch as Tt, decodeVectorBase64 as U, streamQualityLabel as Ut, coreBlocksCapability as V, storageOccupancyCapability as Vt, deriveBatteryPresence as W, userManagementCapability as Wt, enumerateInferenceDevices as X, DATAPLANE_SECRET_HEADER as Xt, doorbellCapability as Y, BaseAddon as Yt, enumerateItemArrayFields as Z, DEVICE_SETTINGS_CONTRIBUTION_METHODS as Zt, RUNTIME_DEFAULTS as _, readinessKey as _n, logLevelAtMost as _t, CAMERA_SWITCH_ORDER as a, asJsonObject as an, isArrayOutputSchema as at, SOURCE_DEVICE_TYPES as b, sleep as bn, mayWriteToLocation as bt, CORE_BLOCK_ADDON_PREFIX as c, createEvent as cn, isObjectInput as ct, DeclaredDevices as d, expandCapMethods as dn, isVoidInput as dt, DeviceRole as en, evictionPolicyOfLocation as et, DeviceStatusSchema as f, hydrateSchema as fn, kebabToCamel as ft, REDACTED_SECRET as g, parseJsonUnknown as gn, logDestinationCapability as gt, METHOD_ACCESS_MAP as h, parseJsonObject as hn, localNetworkCapability as ht, BatteryStatusSchema as i, WELL_KNOWN_TAB_MAP as in, gbToBytes as it, addonWidgetsCapability as j, resolveLocationMode as jt, addonPagesCapability as k, resolveBucketMs as kt, CoreBlockSchema as l, emitDownForOwnedCaps as ln, isSameAddonId as lt, LegacyStorageLocationDefaultSchema as m, nodePin as mn, lifecycleJobSchema as mt, AlertSchema as n, ReadinessRegistry as nn, filesystemBrowseCapability as nt, CAP_NAMES_WITH_STATUS as o, asNumber as on, isCollectionArrayMethod as ot, LOG_LEVEL_RANK as p, isDeviceConfigCap as pn, legacyModeOf as pt, deviceStateCapability as q, withLocationMode as qt, ApiKeyRecordSchema as r, ReadinessTimeoutError as rn, foldSnapshotByFunction as rt, CORE_BLOCKS_ADDON_ID as s, asString as sn, isLocationEnabled as st, ALL_CAPABILITY_DEFINITIONS as t, DeviceType as tn, extractNestedAddonId as tt, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as u, emitReadiness as un, isSourceCap as ut, RecordingStatusSchema as v, resolveCapMount as vn, looseSchema as vt, StorageCleanupJobSchema as w, objectInputDeclaresAddonId as wt, STORAGE_ACCESS_FALLBACK as x, EventCategory as xn, metricsProviderCapability as xt, SOURCE_CAPS as y, scopeKey as yn, mayReadLocation as yt, coreBlockAddonId as z, storageCapability as zt };
46404
+ export { evictionPolicyOfLocation as $, DeviceRole as $t, addonSettingsCapability as A, resolveLocationMode as At, coreBlockIdFromAddonId as B, storageOccupancyCapability as Bt, ScopedTokenSchema as C, objectInputDeclaresAddonId as Ct, StorageMigrationJobSchema as D, reducePoints as Dt, StorageLocationTypeSchema as E, procedureAuthKey as Et, bareAddonId as F, scoreRuntimes as Ft, deviceManagerCapability as G, vectorStoreCapability as Gt, dataStoreProviderCapability as H, streamQualityLabel as Ht, batteryCapability as I, settingsStoreCapability as It, doorbellCapability as J, BaseAddon as Jt, deviceStateCapability as K, withLocationMode as Kt, buildStreamParamsConfigSchema as L, snapshotCapability as Lt, alertsCapability as M, runtimeStatePolicyFor as Mt, authProviderCapability as N, scopesAllowAddon as Nt, UserRecordSchema as O, resolveBucketMs as Ot, backupCapability as P, scopesAllowDeviceCap as Pt, evaluateSensorEdge as Q, DeviceFeature as Qt, collectSecretConfigKeys as R, storageCapability as Rt, STREAM_PROFILE_META as S, normalizeUnit as St, StorageLocationModeSchema as T, platformProbeCapability as Tt, decodeVectorBase64 as U, userManagementCapability as Ut, coreBlocksCapability as V, storageProviderCapability as Vt, deriveBatteryPresence as W, vectorDimFromBase64 as Wt, enumerateItemArrayFields as X, DEVICE_SETTINGS_CONTRIBUTION_METHODS as Xt, enumerateInferenceDevices as Y, DATAPLANE_SECRET_HEADER as Yt, enumerateSchemaFields as Z, DEVICE_STATUS_METHOD as Zt, RUNTIME_DEFAULTS as _, resolveCapMount as _n, looseSchema as _t, CAMERA_SWITCH_ORDER as a, asNumber as an, isCollectionArrayMethod as at, SOURCE_DEVICE_TYPES as b, EventCategory as bn, metricsProviderCapability as bt, CORE_BLOCK_ADDON_PREFIX as c, emitDownForOwnedCaps as cn, isSameAddonId as ct, DeclaredDevices as d, hydrateSchema as dn, kebabToCamel as dt, DeviceType as en, extractNestedAddonId as et, DeviceStatusSchema as f, isDeviceConfigCap as fn, legacyModeOf as ft, REDACTED_SECRET as g, readinessKey as gn, logLevelAtMost as gt, METHOD_ACCESS_MAP as h, parseJsonUnknown as hn, logDestinationCapability as ht, BatteryStatusSchema as i, asJsonObject as in, isArrayOutputSchema as it, addonWidgetsCapability as j, resolveMethodAuth as jt, addonPagesCapability as k, resolveContainerPrimaryChild as kt, CoreBlockSchema as l, emitReadiness as ln, isSourceCap as lt, LegacyStorageLocationDefaultSchema as m, parseJsonObject as mn, localNetworkCapability as mt, AlertSchema as n, ReadinessTimeoutError as nn, foldSnapshotByFunction as nt, CAP_NAMES_WITH_STATUS as o, asString as on, isLocationEnabled as ot, LOG_LEVEL_RANK as p, nodePin as pn, lifecycleJobSchema as pt, deviceStatusCapability as q, errMsg as qt, ApiKeyRecordSchema as r, WELL_KNOWN_TAB_MAP as rn, gbToBytes as rt, CORE_BLOCKS_ADDON_ID as s, createEvent as sn, isObjectInput as st, ALL_CAPABILITY_DEFINITIONS as t, ReadinessRegistry as tn, filesystemBrowseCapability as tt, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as u, expandCapMethods as un, isVoidInput as ut, RecordingStatusSchema as v, scopeKey as vn, mayReadLocation as vt, StorageCleanupJobSchema as w, parseStreamParamsFormPatch as wt, STORAGE_ACCESS_FALLBACK as x, modeMayWrite as xt, SOURCE_CAPS as y, sleep as yn, mayWriteToLocation as yt, coreBlockAddonId as z, storageMigrationCapability as zt };
@@ -690,7 +690,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
690
690
  return EventCategory;
691
691
  }({});
692
692
  //#endregion
693
- //#region ../types/dist/sleep-BEyvfshj.mjs
693
+ //#region ../types/dist/sleep-B9qx0cEV.mjs
694
694
  /**
695
695
  * The audio chunk plane's byte format, and the ONE expansion from a coded
696
696
  * window to float samples (D455).
@@ -8558,6 +8558,21 @@ var streamSignalsCapability = {
8558
8558
  mode: "singleton",
8559
8559
  deviceTypes: Object.values(DeviceType),
8560
8560
  runtimeState: StreamSignalsStatusSchema,
8561
+ /**
8562
+ * Runtime-state durability: **session** — mirrored in RAM, never written.
8563
+ *
8564
+ * The slice holds what the DEVICE says it can emit. That is a probed fact,
8565
+ * not an operator choice: the provider re-declares it on every registration,
8566
+ * so losing it loses nothing and persisting it would freeze an answer the
8567
+ * camera is entitled to change. Measured the same day on the sibling case —
8568
+ * `native-object-detection.supportedClasses` was persisted, and a firmware
8569
+ * class the camera really detected stayed missing for the life of the row
8570
+ * because the fix could not reach it.
8571
+ *
8572
+ * See `RuntimeStateDurability`. Enforced by
8573
+ * `scripts/check-runtime-state-durability.ts`.
8574
+ */
8575
+ durability: "session",
8561
8576
  methods: {
8562
8577
  /**
8563
8578
  * What this device can emit. Empty is a valid and common answer — most
@@ -10056,17 +10071,6 @@ var coreBlocksCapability = {
10056
10071
  })) }), { auth: "admin" })
10057
10072
  }
10058
10073
  };
10059
- /** Strip a catalog to what crosses the wire. Pure; the schemas are not touched. */
10060
- function describeCustomActions(catalog) {
10061
- const out = {};
10062
- for (const [name, spec] of Object.entries(catalog)) out[name] = {
10063
- kind: spec.kind,
10064
- auth: spec.auth,
10065
- scope: spec.scope,
10066
- ...spec.caller === "required" ? { caller: "required" } : {}
10067
- };
10068
- return out;
10069
- }
10070
10074
  /**
10071
10075
  * `custom-model-registry` — collection cap exposing operator-registered
10072
10076
  * custom detection models. Each provider (today: `addon-model-studio`)
@@ -21208,6 +21212,14 @@ var MotionSourceEnum = zod.z.enum([
21208
21212
  */
21209
21213
  var MotionSourcesSchema = zod.z.array(MotionSourceEnum);
21210
21214
  /**
21215
+ * Which root detectors a camera runs. Deliberately the SAME vocabulary
21216
+ * post-analysis already tags every detection with (`DetectionSource`) rather
21217
+ * than a second spelling of the same two ideas — the value an operator picks
21218
+ * here is the value that comes back on the track, the overlay and the debug
21219
+ * row.
21220
+ */
21221
+ var DetectionSourcesSchema = zod.z.array(DetectionSourceSchema);
21222
+ /**
21211
21223
  * Input shape for `pipeline-runner.reportMotion` cap method. Exported
21212
21224
  * so cap-side consumers (the orchestrator forward, the runner addon's
21213
21225
  * cap implementation, tests) can reuse the type instead of redeclaring
@@ -21358,6 +21370,35 @@ var RunnerCameraConfigSchema = zod.z.object({
21358
21370
  * events; the orchestrator forwards to `reportMotion`.
21359
21371
  */
21360
21372
  motionSources: MotionSourcesSchema.default(["analyzer"]),
21373
+ /**
21374
+ * WHICH root detector runs for this camera. The detection counterpart of
21375
+ * {@link motionSources}, same shape and same discipline: a per-camera list
21376
+ * of sources the system understands, vendor-agnostic, owned here.
21377
+ *
21378
+ * - `pipeline` — this runner's own root step on decoded pixels (`steps`).
21379
+ * - `onboard` — the CAMERA's own detector, admitted only when it is named
21380
+ * here. Its boxes reach post-analysis on the same
21381
+ * `PipelineInferenceResult` payload as the pipeline's, so an onboard-born
21382
+ * track gets the same tracker, the same overlay and the same detail
21383
+ * subtree (face / plate / embedding).
21384
+ *
21385
+ * `['onboard']` alone is the REPLACEMENT: this runner's root step does not
21386
+ * run, and that is where a camera with a usable onboard detector buys back
21387
+ * its share of the accelerator. It saves the root inference, not the decode
21388
+ * — the detail subtree still needs pixels to cut crops from.
21389
+ *
21390
+ * A camera whose onboard detections carry no geometry cannot serve as a root
21391
+ * step at all (there is nothing to track), and the cap that knows this says
21392
+ * so on `native-object-detection.getOptions().geometry`. On Reolink that is
21393
+ * every battery camera: the boxes ride a sub-stream a battery camera never
21394
+ * attaches, so such a camera stays on `['pipeline']` and its onboard AI is
21395
+ * worth exactly what it already is — a wake signal with a class.
21396
+ *
21397
+ * Defaults to `['pipeline']`, which is byte-for-byte today's behaviour: a
21398
+ * vendor never turns a detector on for the operator, and neither does a
21399
+ * default.
21400
+ */
21401
+ detectionSources: DetectionSourcesSchema.default(["pipeline"]),
21361
21402
  pipelineEnabled: zod.z.boolean().default(true),
21362
21403
  /** Ordered tree of video steps. Absent → runner skips video detection. */
21363
21404
  steps: zod.z.array(PipelineStepInputSchema).readonly().optional(),
@@ -30182,31 +30223,38 @@ var NativeObjectDetectionStatusSchema = zod.z.object({
30182
30223
  /**
30183
30224
  * Whether forwarding of onboard AI detections is enabled for this device.
30184
30225
  *
30185
- * The COLD-START default is the provider's, and it is not one value for
30186
- * every camera: a mains camera carries the boxed side-channel and its
30187
- * detections are usable subjects, so it defaults ON; a battery camera never
30188
- * attaches that channel, so the same toggle would buy it nothing but a write
30189
- * — it defaults OFF and an operator who wants it turns it on knowing what it
30190
- * costs. {@link NativeObjectDetectionOptionsSchema.geometry} is how the UI
30191
- * says which of the two a camera is.
30226
+ * Cold-start OFF on every camera. A vendor does not decide which detector a
30227
+ * camera runs — that is the operator's choice, and it is made where every
30228
+ * other detection choice is made. `geometry` on
30229
+ * {@link NativeObjectDetectionOptionsSchema} is how the form says what the
30230
+ * choice would buy this particular camera.
30192
30231
  */
30193
30232
  enabled: zod.z.boolean()
30194
30233
  });
30195
30234
  /**
30196
- * What a camera's onboard detections actually CARRY.
30235
+ * WHEN a camera's onboard detections carry geometry.
30197
30236
  *
30198
- * `boxed` — the firmware ships a bounding box with the class, so a detection is
30199
- * a subject the pipeline can track, crop and score.
30200
- * `flag-only` — the firmware ships the class and nothing else. The pipeline
30201
- * needs geometry to make a subject out of it, so such a push reaches the
30202
- * tracker as motion and no further. On Reolink this is every battery camera:
30203
- * the boxes ride the BcMedia sub-stream, which a battery camera never attaches.
30237
+ * - `boxed` — always. The provider holds a standing channel for the boxes, so
30238
+ * a detection is a trackable subject whenever the camera sees one.
30239
+ * - `while-streaming` — only while some stream of this camera is already open.
30240
+ * The boxes ride the video's own side-channel rather than a feed of their
30241
+ * own, so they cost nothing and they exist only when something is pulling.
30242
+ * On Reolink this is every BATTERY camera: a persistent second feed is real
30243
+ * radio drain, but a camera that is awake is awake precisely because
30244
+ * something is in front of it, and its stream is already being pulled.
30245
+ * - `flag-only` — never. The firmware ships the class and nothing else; the
30246
+ * pipeline needs geometry to make a subject, so such a push reaches the
30247
+ * tracker as motion and no further.
30204
30248
  *
30205
30249
  * Reported and not inferred, because the operator's question in front of the
30206
- * toggle is "what do I get", and "a class with no box" and "a subject" are
30207
- * different answers (D14: the derived form is only as honest as `getOptions`).
30250
+ * picker is "what do I get", and these are three different answers (D14: the
30251
+ * derived form is only as honest as `getOptions`).
30208
30252
  */
30209
- var NativeObjectGeometryEnum = zod.z.enum(["boxed", "flag-only"]);
30253
+ var NativeObjectGeometryEnum = zod.z.enum([
30254
+ "boxed",
30255
+ "while-streaming",
30256
+ "flag-only"
30257
+ ]);
30210
30258
  var NativeObjectDetectionOptionsSchema = zod.z.object({
30211
30259
  /** Classes this firmware can detect — the same list the status reports. */
30212
30260
  supportedClasses: zod.z.array(NativeObjectClassEnum).readonly(),
@@ -30223,11 +30271,6 @@ var nativeObjectDetectionCapability = {
30223
30271
  deviceNative: true,
30224
30272
  mode: "singleton",
30225
30273
  deviceTypes: [DeviceType.Camera],
30226
- deviceConfig: { ui: {
30227
- kind: "derived-form",
30228
- builderId: "native-object-detection",
30229
- tab: "motion"
30230
- } },
30231
30274
  methods: {
30232
30275
  getOptions: method(zod.z.object({ deviceId: zod.z.number() }), NativeObjectDetectionOptionsSchema),
30233
30276
  setSettings: method(zod.z.object({
@@ -46712,12 +46755,6 @@ Object.defineProperty(exports, "deriveBatteryPresence", {
46712
46755
  return deriveBatteryPresence;
46713
46756
  }
46714
46757
  });
46715
- Object.defineProperty(exports, "describeCustomActions", {
46716
- enumerable: true,
46717
- get: function() {
46718
- return describeCustomActions;
46719
- }
46720
- });
46721
46758
  Object.defineProperty(exports, "deviceManagerCapability", {
46722
46759
  enumerable: true,
46723
46760
  get: function() {
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-D3lJV9M7.js");
3
+ const require_dist = require("./dist-Ctn_E3-0.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");
@@ -29,7 +29,7 @@ const require_event_loop_stall_monitor = require("./event-loop-stall-monitor-CAs
29
29
  const require_tls$1 = require("./tls-BFs4PzoW.js");
30
30
  const require_manifest_system_deps = require("./manifest-system-deps-CrSP0Kkp.js");
31
31
  const require_resource_monitor = require("./resource-monitor-LVE1BoLs.js");
32
- const require_custom_action_registry = require("./custom-action-registry-CWFK5UDj.js");
32
+ const require_custom_action_registry = require("./custom-action-registry-acBY3mHA.js");
33
33
  let zod = require("zod");
34
34
  let node_crypto = require("node:crypto");
35
35
  let _camstack_types_node = require("@camstack/types/node");
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 { A as addonSettingsCapability, Dt as procedureAuthKey, Ft as scopesAllowDeviceCap, Jt as errMsg$1, Mt as resolveMethodAuth, Pt as scopesAllowAddon, Qt as DEVICE_STATUS_METHOD, Xt as DATAPLANE_SECRET_HEADER$1, Zt as DEVICE_SETTINGS_CONTRIBUTION_METHODS, _ as RUNTIME_DEFAULTS, _n as readinessKey, _t as logLevelAtMost, an as asJsonObject$1, at as isArrayOutputSchema, cn as createEvent, ct as isObjectInput, dn as expandCapMethods, dt as isVoidInput, ft as kebabToCamel, gn as parseJsonUnknown, h as METHOD_ACCESS_MAP, hn as parseJsonObject, ln as emitDownForOwnedCaps, mt as lifecycleJobSchema, nn as ReadinessRegistry, on as asNumber, ot as isCollectionArrayMethod, p as LOG_LEVEL_RANK, rn as ReadinessTimeoutError, sn as asString$1, t as ALL_CAPABILITY_DEFINITIONS, tt as extractNestedAddonId, vn as resolveCapMount, vt as looseSchema, wt as objectInputDeclaresAddonId, xn as EventCategory$1, yn as scopeKey } from "./dist-BIvXRexm.mjs";
2
+ import { A as addonSettingsCapability, Ct as objectInputDeclaresAddonId, Et as procedureAuthKey, Nt as scopesAllowAddon, Pt as scopesAllowDeviceCap, Xt as DEVICE_SETTINGS_CONTRIBUTION_METHODS, Yt as DATAPLANE_SECRET_HEADER$1, Zt as DEVICE_STATUS_METHOD, _ as RUNTIME_DEFAULTS, _n as resolveCapMount, _t as looseSchema, an as asNumber, at as isCollectionArrayMethod, bn as EventCategory$1, cn as emitDownForOwnedCaps, dt as kebabToCamel, et as extractNestedAddonId, gn as readinessKey, gt as logLevelAtMost, h as METHOD_ACCESS_MAP, hn as parseJsonUnknown, in as asJsonObject$1, it as isArrayOutputSchema, jt as resolveMethodAuth, mn as parseJsonObject, nn as ReadinessTimeoutError, on as asString$1, p as LOG_LEVEL_RANK, pt as lifecycleJobSchema, qt as errMsg$1, sn as createEvent, st as isObjectInput, t as ALL_CAPABILITY_DEFINITIONS, tn as ReadinessRegistry, un as expandCapMethods, ut as isVoidInput, vn as scopeKey } from "./dist-CGG0rSEx.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";
@@ -28,7 +28,7 @@ import { _ as fetchJson, a as createFileDataPlaneHandler, c as parseRangeHeader,
28
28
  import { C as registerLanHttpHandler, S as readLanHttpState, _ as DEFAULT_LAN_HTTP_PORT, a as writeTlsMode, b as bindPendingLanHttp, c as loadTlsCert, d as collectCertIdentity, f as CA_VALIDITY_DAYS, g as evaluateExistingCert, h as SERVER_AUTH_OID, i as writeExtraSans, l as reissueTlsLeaf, m as MAX_LEAF_VALIDITY_DAYS, n as readTlsAccessStatus, o as validateUploadedTls, p as LEAF_RENEWAL_WINDOW_DAYS, r as readTlsMode, s as ensureTlsCert, t as readExtraSans, u as CA_COMMON_NAME, v as allFamiliesListenHost, x as closeLanHttp, y as applyLanHttp } from "./tls-2xbgg78V.mjs";
29
29
  import { $ as buildUdsNativeCapProxy, $t as ARRAY_BUFFER_CENSUS_THRESHOLD_MB, A as createUdsLoggerWithControl, An as recordSocketFrame, At as HUB_MAIN_HEAP_WATCH_LABEL, B as readMoleculerFanoutMode, Bn as diffCapActionCensus, Bt as createLoopDelayMeter, C as ipcParentLink, Cn as createSocketPlaneMeter, Ct as runNpm, D as createUdsEventBus, Dn as readSocketQueues, Dt as HEAP_RECLAIM_TRIGGER_MB, E as createUdsEventBridge, En as formatSocketPlane, Et as HEAP_RECLAIM_STEADY_STATE_INTERVAL_MS, F as CapRouteError, Fn as CAP_ACTION_UNLABELLED, Ft as RUNNER_HEAP_WATCH_INTERVAL_MS, G as createLocalTransport, Gn as formatEventPlane, Gt as parseRssBudgetMb, H as PARENT_ROUTED_PROVIDER_ADDON_ID, Hn as createEventPlaneMeter, Ht as describeRss, I as classifyCapRoute, In as EMPTY_CAP_ACTION_READING, It as RUNNER_RSS_BUDGET_ENV, J as SocketChannel, Jt as startHeapWatch, K as UdsLocalTransportClient, Kt as reclaimIntervalMs, L as LocalChildClient, Ln as MAX_CAP_ACTIONS_PER_PEER, Lt as ZERO_LOOP_DELAY, M as AGENT_CAP_FWD_SERVICE, Mn as socketDirectionBytes, Mt as HUB_RSS_BUDGET_ENV, N as CapRouteResolver, Nn as socketDirectionMessages, Nt as RSS_BUDGET_REANNOUNCE_MIN_MS, O as udsChildLogToWorkerEntry, On as EMPTY_SOCKET_DIRECTION, Ot as HEAP_WATCH_INTERVAL_MS, P as callWithServiceDiscovery, Pn as CAP_ACTION_OVERFLOW_LABEL, Pt as RSS_BUDGET_RELEASE_RATIO, Q as buildNativeCapProxy, Qt as ARRAY_BUFFER_CENSUS_SUSTAIN_MS, R as LocalChildRegistry, Rn as capActionLabel, Rt as buildHeapSample, S as buildLinkChain, Sn as SOCKET_QUEUE_TOP_N, St as resolveNpmInvocation, T as createParentUnownedCallHandler, Tn as diffSocketPlane, Tt as HEAP_RECLAIM_MIN_INTERVAL_MS, U as __resetCapUsageRegistryForTests, Un as createEventPlaneReader, Ut as hubMainRssBudget, V as CapUsageRegistry, Vn as EVENT_PLANE_TOP_N, Vt as createV8Reclaimer, W as getCapUsageRegistry, Wn as diffEventPlane, Wt as nextRssBudgetState, X as FrameDecoder, Xt as strandedMb, Y as localEndpointPath, Yt as startRunnerHeapWatch, Z as encodeFrame, Zt as ARRAY_BUFFER_CENSUS_COOLDOWN_MS, _ as AddonDepsManager, _n as MESH_QUEUE_TOP_N, _t as CapabilityUnavailableError, a as createUdsAddonContext, an as DECISIVE_HEAP_SPACES, at as createAddonService, b as brokerCallForCap, bn as EMPTY_SOCKET_PLANE_BASELINE, bt as resolveAddonClass, c as getOrInitReadinessRegistryForClient, cn as formatHeapSpaces, ct as capActionName, d as clusterEventTopic, dn as selectReportedSpaces, dt as capServiceName, en as ARRAY_BUFFER_RELEASE_MIN_DROP_RATIO, et as createBrokerDeviceManagerApi, f as getBrokerEventBus, fn as OUTBOUND_QUEUE_COOLDOWN_MS, ft as parseCapAction, g as subscribePassthrough, gn as formatOutboundQueueVerdict, gt as CapabilityHandle, h as setNodeEventInterest, hn as createOutboundQueueGate, ht as DeviceRegistry, i as createAddonContext, in as isArrayBufferCensusReport, j as AGENT_CAP_FWD_ACTION, jn as sampleSocketDirection, jt as HUB_MAIN_RSS_BUDGET_MB, k as createUdsLogger, kn as createSocketDirectionCounters, kt as HEAP_WATCH_WARN_RATIO, l as setHubConnected, ln as heapSpaceField, lt as capActionSuffix, m as registerEventBusService, mn as OUTBOUND_QUEUE_THRESHOLD_BYTES, mt as serializeTypedArrays, n as installManifestPythonDeps, nn as createInspectorArrayBufferCensus, o as getWorkerDeviceRegistry, on as HEAP_SPACE_REPORT_MIN_MB, ot as validateProviderRegistrations, p as getMoleculerEventStats, pn as OUTBOUND_QUEUE_SUSTAIN_MS, pt as deserializeTypedArrays, q as UdsLocalTransportServer, qt as shouldReclaim, r as adaptBrokerToCluster, rn as formatArrayBufferCensus, rt as mountNativeCapService, s as getOrInitReadinessRegistry, sn as emitHeapDiagnosticReport, st as NATIVE_PROVIDER_SERVICE_INFIX, t as installManifestSystemDeps, tn as createArrayBufferCensusGate, u as EVENT_TOPIC_PREFIX, un as readHeapSpaces, ut as capBareAction, v as createKernelHwAccel, vn as createMeshQueueReader, vt as copyBundledNativeModules, w as localProviderLink, wn as createSocketPlaneReader, wt as createAddonDataPlaneFacility, x as brokerTransportLink, xn as SOCKET_PLANE_TOP_N, xt as buildNpmChildEnv, y as resolveHwAccel, yn as formatMeshQueue, yt as installManifestNativeDeps, z as UDS_NO_ROUTE_PREFIX, zn as createCapActionCensus, zt as createDeferredHeapWatchSink } from "./manifest-system-deps-BEj9Dpu1.mjs";
30
30
  import { n as getSinglePidStats, t as getPidStats } from "./resource-monitor-Vp0bPV3U.mjs";
31
- import { t as CustomActionRegistry } from "./custom-action-registry-CFHYDHAu.mjs";
31
+ import { t as CustomActionRegistry } from "./custom-action-registry-B4Cf4O_X.mjs";
32
32
  import { z } from "zod";
33
33
  import { createHash, randomUUID, timingSafeEqual } from "node:crypto";
34
34
  import { PYTHON_VERSION, buildBinaryPath, downloadBinary, ensureBinary, ensureFfmpeg, ensurePython, findInPath, getFfmpegDownloadUrl, getPlatformInfo, getPythonDownloadUrl, installPythonPackages, installPythonRequirements } from "@camstack/types/node";
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-D3lJV9M7.js");
1
+ const require_dist = require("./dist-Ctn_E3-0.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?
@@ -1,4 +1,4 @@
1
- import { an as asJsonObject } from "./dist-BIvXRexm.mjs";
1
+ import { in as asJsonObject } from "./dist-CGG0rSEx.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?
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/system",
3
- "version": "1.2.233",
3
+ "version": "1.2.235",
4
4
  "description": "Core addon for CamStack — builtins, pipeline, process management, auth, logging, events",
5
5
  "keywords": [
6
6
  "camstack",
@@ -1,3 +0,0 @@
1
- import { ConfigUISchema, NativeObjectDetectionOptions, NativeObjectDetectionSettingsPatch, NativeObjectDetectionStatus } from '@camstack/types';
2
- export declare function buildNativeObjectDetectionConfigSchema(options: NativeObjectDetectionOptions, status: NativeObjectDetectionStatus | null): ConfigUISchema | null;
3
- export declare function parseNativeObjectDetectionFormPatch(patch: Record<string, unknown>): NativeObjectDetectionSettingsPatch;