@camstack/system 1.2.241 → 1.2.243

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 (55) 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/backup-orchestrator/backup-orchestrator.addon.js +1 -1
  8. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +1 -1
  9. package/dist/builtins/console-logging/index.js +1 -1
  10. package/dist/builtins/console-logging/index.mjs +1 -1
  11. package/dist/builtins/core-blocks/core-blocks.addon.js +1 -1
  12. package/dist/builtins/core-blocks/core-blocks.addon.mjs +1 -1
  13. package/dist/builtins/device-manager/adoption-job-engine.d.ts +28 -7
  14. package/dist/builtins/device-manager/device-manager.addon.d.ts +11 -0
  15. package/dist/builtins/device-manager/device-manager.addon.js +147 -15
  16. package/dist/builtins/device-manager/device-manager.addon.mjs +147 -15
  17. package/dist/builtins/device-manager/device-meta-actions.d.ts +32 -0
  18. package/dist/builtins/device-manager/device-meta-types.d.ts +17 -1
  19. package/dist/builtins/doorbell/virtual-doorbell.addon.js +1 -1
  20. package/dist/builtins/doorbell/virtual-doorbell.addon.mjs +1 -1
  21. package/dist/builtins/hub-forwarder/index.js +1 -1
  22. package/dist/builtins/hub-forwarder/index.mjs +1 -1
  23. package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
  24. package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
  25. package/dist/builtins/local-auth/local-auth.addon.js +1 -1
  26. package/dist/builtins/local-auth/local-auth.addon.mjs +1 -1
  27. package/dist/builtins/local-network/local-network.addon.js +1 -1
  28. package/dist/builtins/local-network/local-network.addon.mjs +1 -1
  29. package/dist/builtins/loki-logging/index.js +1 -1
  30. package/dist/builtins/loki-logging/index.mjs +1 -1
  31. package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
  32. package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
  33. package/dist/builtins/platform-probe/index.js +1 -1
  34. package/dist/builtins/platform-probe/index.mjs +1 -1
  35. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  36. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  37. package/dist/builtins/snapshot/index.js +1 -1
  38. package/dist/builtins/snapshot/index.mjs +1 -1
  39. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  40. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  41. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +0 -0
  42. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +0 -0
  43. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +1 -1
  44. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +1 -1
  45. package/dist/builtins/system-config/system-config.addon.js +1 -1
  46. package/dist/builtins/system-config/system-config.addon.mjs +1 -1
  47. package/dist/builtins/winston-logging/index.js +1 -1
  48. package/dist/builtins/winston-logging/index.mjs +1 -1
  49. package/dist/{dist-BjSYm1hH.mjs → dist-B4htkDVv.mjs} +104 -3
  50. package/dist/{dist-C6JIhqS6.js → dist-D6kqBW1G.js} +115 -2
  51. package/dist/index.js +1 -1
  52. package/dist/index.mjs +1 -1
  53. package/dist/{retired-settings-keys-C53Y2Q1C.js → retired-settings-keys-BPIyHR4_.js} +1 -1
  54. package/dist/{retired-settings-keys-MpSfaPEY.mjs → retired-settings-keys-C9w4b4TV.mjs} +1 -1
  55. package/package.json +1 -1
@@ -11388,6 +11388,51 @@ var deviceExportCapability = {
11388
11388
  unexposeDevice: method(UnexposeInputSchema, z.void(), { kind: "mutation" })
11389
11389
  }
11390
11390
  };
11391
+ /** Wire/storage schema for one icon id. */
11392
+ var LocationIconIdSchema = z.enum([
11393
+ "map-pin",
11394
+ "house",
11395
+ "door-open",
11396
+ "sofa",
11397
+ "utensils",
11398
+ "bed-double",
11399
+ "bath",
11400
+ "briefcase",
11401
+ "car",
11402
+ "circle-parking",
11403
+ "route",
11404
+ "trees",
11405
+ "umbrella",
11406
+ "waves-ladder",
11407
+ "fence",
11408
+ "package",
11409
+ "warehouse",
11410
+ "store",
11411
+ "sun",
11412
+ "radar"
11413
+ ]);
11414
+ /**
11415
+ * One (location, icon) assignment as it travels.
11416
+ *
11417
+ * `locationKey` is ALWAYS {@link locationIconKey} of the label — never the
11418
+ * operator's casing. The registry matches labels trimmed + case-insensitively
11419
+ * everywhere (`addLocation`, `removeLocation`, `renameLocation`), and a
11420
+ * case-only rename (`cucina` → `Cucina`) is a real edit this repo supports; a
11421
+ * map keyed on the displayed casing would orphan its entry on exactly that
11422
+ * edit. Consumers join by keying their own label through `locationIconKey`.
11423
+ */
11424
+ var LocationIconAssignmentSchema = z.object({
11425
+ locationKey: z.string(),
11426
+ icon: LocationIconIdSchema
11427
+ });
11428
+ /**
11429
+ * The join key for a location label: trimmed, lower-cased. The ONE place this
11430
+ * derivation lives — a caller that re-spells it is a rename away from an
11431
+ * orphaned icon.
11432
+ */
11433
+ function locationIconKey(label) {
11434
+ return label.trim().toLowerCase();
11435
+ }
11391
11436
  var ProviderStatusSchema = z.object({
11392
11437
  connected: z.boolean(),
11393
11438
  deviceCount: z.number(),
@@ -12116,7 +12161,11 @@ var deviceManagerCapability = {
12116
12161
  * reference this label keep their `meta.location` value — the
12117
12162
  * registry is purely a suggestion list. To purge from devices,
12118
12163
  * iterate them and call `setLocation(deviceId, null)`
12119
- * separately (or pass `cascade: true` to do it in one shot). */
12164
+ * separately (or pass `cascade: true` to do it in one shot).
12165
+ *
12166
+ * The room's ICON goes with it, always — a key left behind survives in a
12167
+ * map nobody lists, and a room later re-created under the same name would
12168
+ * silently inherit an icon the operator never chose for it. */
12120
12169
  removeLocation: method(z.object({
12121
12170
  name: z.string(),
12122
12171
  cascade: z.boolean().optional()
@@ -12137,7 +12186,13 @@ var deviceManagerCapability = {
12137
12186
  * a suggestion list, and the devices that most need a rename are exactly
12138
12187
  * the ones carrying a label nobody registered. `to` renames onto an
12139
12188
  * existing room by MERGING into it, leaving no duplicate label. An empty
12140
- * `to` throws before anything is written. */
12189
+ * `to` throws before anything is written.
12190
+ *
12191
+ * The room's ICON travels with the rename, including when `from` was
12192
+ * never registered — otherwise it orphans on a key no location carries
12193
+ * any more. A merge keeps the TARGET's icon when it has one: renaming
12194
+ * "Sala" into "Salone" moves devices into Salone, it does not restyle
12195
+ * it. */
12141
12196
  renameLocation: method(z.object({
12142
12197
  from: z.string(),
12143
12198
  to: z.string()
@@ -12145,6 +12200,39 @@ var deviceManagerCapability = {
12145
12200
  kind: "mutation",
12146
12201
  auth: "admin"
12147
12202
  }),
12203
+ /** Every location that carries an ICON, as `(locationKey, icon)` pairs.
12204
+ *
12205
+ * ADDITIVE, deliberately: `listLocations` keeps returning `string[]` —
12206
+ * every consumer of it (the Device Info autocomplete, the HA adoption
12207
+ * import, the recorder) reads a list of labels and none of them wants a
12208
+ * shape change. A surface that wants icons asks for them and joins.
12209
+ *
12210
+ * Only assignments that EXIST are returned — a location with no icon is
12211
+ * absent, not `map-pin`. The fallback belongs to the renderer
12212
+ * (`resolveLocationIcon`), not to the store, so "the operator chose the
12213
+ * pin" and "the operator chose nothing" stay distinguishable.
12214
+ *
12215
+ * The join key is `locationIconKey(label)` (trimmed, lower-cased) — the
12216
+ * same equality the registry uses everywhere. Never the operator's
12217
+ * casing: a case-only rename is a real edit here, and a map keyed on the
12218
+ * displayed spelling would orphan its entry on exactly that edit. */
12219
+ listLocationIcons: method(z.void(), z.array(LocationIconAssignmentSchema)),
12220
+ /** Set (or clear) the icon of a location label. `icon: null` removes the
12221
+ * assignment. The label need NOT be registered — the registry is a
12222
+ * suggestion list and devices carry labels nobody registered — but an
12223
+ * empty / whitespace-only label throws. Idempotent.
12224
+ *
12225
+ * The icon vocabulary is CLOSED (`LOCATION_ICON_IDS`) because the admin UI
12226
+ * and the viewer draw from different icon modules; see
12227
+ * `device/location-icon.ts` for the list and for what a surface that
12228
+ * cannot draw a member must do (fall back to `map-pin`, never a hole). */
12229
+ setLocationIcon: method(z.object({
12230
+ location: z.string(),
12231
+ icon: LocationIconIdSchema.nullable()
12232
+ }), z.void(), {
12233
+ kind: "mutation",
12234
+ auth: "admin"
12235
+ }),
12148
12236
  /** Soft-disable / re-enable the device. Drivers consult
12149
12237
  * `BaseDevice.disabled` to gate lifecycle hooks. */
12150
12238
  setDisabled: method(z.object({
@@ -19194,6 +19282,7 @@ var MediaFileKindEnum = z.enum([
19194
19282
  "keyFrame",
19195
19283
  "keyFrameSmall",
19196
19284
  "thumbnailSmall",
19285
+ "confirmationCrop",
19197
19286
  "sceneFrame"
19198
19287
  ]);
19199
19288
  /**
@@ -38967,6 +39056,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
38967
39056
  addonId: null,
38968
39057
  access: "view"
38969
39058
  },
39059
+ "deviceManager.listLocationIcons": {
39060
+ capName: "device-manager",
39061
+ capScope: "system",
39062
+ addonId: null,
39063
+ access: "view"
39064
+ },
38970
39065
  "deviceManager.listLocations": {
38971
39066
  capName: "device-manager",
38972
39067
  capScope: "system",
@@ -39111,6 +39206,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
39111
39206
  addonId: null,
39112
39207
  access: "create"
39113
39208
  },
39209
+ "deviceManager.setLocationIcon": {
39210
+ capName: "device-manager",
39211
+ capScope: "system",
39212
+ addonId: null,
39213
+ access: "create"
39214
+ },
39114
39215
  "deviceManager.setMetadata": {
39115
39216
  capName: "device-manager",
39116
39217
  capScope: "system",
@@ -46672,4 +46773,4 @@ function enumerateInferenceDevices(hw) {
46672
46773
  return out;
46673
46774
  }
46674
46775
  //#endregion
46675
- 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 };
46776
+ export { evaluateSensorEdge as $, DEVICE_STATUS_METHOD as $t, addonPagesCapability as A, resolveBucketMs as At, coreBlockAddonId as B, storageCapability as Bt, STREAM_PROFILE_META as C, modeMayWrite as Ct, StorageLocationTypeSchema as D, platformProbeCapability as Dt, StorageLocationModeSchema as E, parseStreamParamsFormPatch as Et, backupCapability as F, scopesAllowAddon as Ft, deriveBatteryPresence as G, userManagementCapability as Gt, coreBlocksCapability as H, storageOccupancyCapability as Ht, bareAddonId as I, scopesAllowDeviceCap as It, deviceStatusCapability as J, withLocationMode as Jt, deviceManagerCapability as K, vectorDimFromBase64 as Kt, batteryCapability as L, scoreRuntimes as Lt, addonWidgetsCapability as M, resolveLocationMode as Mt, alertsCapability as N, resolveMethodAuth as Nt, StorageMigrationJobSchema as O, procedureAuthKey as Ot, authProviderCapability as P, runtimeStatePolicyFor as Pt, enumerateSchemaFields as Q, DEVICE_SETTINGS_CONTRIBUTION_METHODS as Qt, buildStreamParamsConfigSchema as R, settingsStoreCapability as Rt, STORAGE_ACCESS_FALLBACK as S, EventCategory as Sn, metricsProviderCapability as St, StorageCleanupJobSchema as T, objectInputDeclaresAddonId as Tt, dataStoreProviderCapability as U, storageProviderCapability as Ut, coreBlockIdFromAddonId as V, storageMigrationCapability as Vt, decodeVectorBase64 as W, streamQualityLabel as Wt, enumerateInferenceDevices as X, BaseAddon as Xt, doorbellCapability as Y, errMsg as Yt, enumerateItemArrayFields as Z, DATAPLANE_SECRET_HEADER as Zt, REDACTED_SECRET as _, parseJsonUnknown as _n, logDestinationCapability as _t, CAMERA_SWITCH_ORDER as a, WELL_KNOWN_TAB_MAP as an, isArrayOutputSchema as at, SOURCE_CAPS as b, scopeKey as bn, mayReadLocation as bt, CORE_BLOCK_ADDON_PREFIX as c, asString as cn, isObjectInput as ct, DeclaredDevices as d, emitReadiness as dn, isVoidInput as dt, DeviceFeature as en, evictionPolicyOfLocation as et, DeviceStatusSchema as f, expandCapMethods as fn, kebabToCamel as ft, METHOD_ACCESS_MAP as g, parseJsonObject as gn, locationIconKey as gt, LocationIconIdSchema as h, nodePin as hn, localNetworkCapability as ht, BatteryStatusSchema as i, ReadinessTimeoutError as in, gbToBytes as it, addonSettingsCapability as j, resolveContainerPrimaryChild as jt, UserRecordSchema as k, reducePoints as kt, CoreBlockSchema as l, createEvent as ln, isSameAddonId as lt, LegacyStorageLocationDefaultSchema as m, isDeviceConfigCap as mn, lifecycleJobSchema as mt, AlertSchema as n, DeviceType as nn, filesystemBrowseCapability as nt, CAP_NAMES_WITH_STATUS as o, asJsonObject as on, isCollectionArrayMethod as ot, LOG_LEVEL_RANK as p, hydrateSchema as pn, legacyModeOf as pt, deviceStateCapability as q, vectorStoreCapability as qt, ApiKeyRecordSchema as r, ReadinessRegistry as rn, foldSnapshotByFunction as rt, CORE_BLOCKS_ADDON_ID as s, asNumber as sn, isLocationEnabled as st, ALL_CAPABILITY_DEFINITIONS as t, DeviceRole as tn, extractNestedAddonId as tt, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as u, emitDownForOwnedCaps as un, isSourceCap as ut, RUNTIME_DEFAULTS as v, readinessKey as vn, logLevelAtMost as vt, ScopedTokenSchema as w, normalizeUnit as wt, SOURCE_DEVICE_TYPES as x, sleep as xn, mayWriteToLocation as xt, RecordingStatusSchema as y, resolveCapMount as yn, looseSchema as yt, collectSecretConfigKeys as z, snapshotCapability as zt };
@@ -11388,6 +11388,51 @@ var deviceExportCapability = {
11388
11388
  unexposeDevice: method(UnexposeInputSchema, zod.z.void(), { kind: "mutation" })
11389
11389
  }
11390
11390
  };
11391
+ /** Wire/storage schema for one icon id. */
11392
+ var LocationIconIdSchema = zod.z.enum([
11393
+ "map-pin",
11394
+ "house",
11395
+ "door-open",
11396
+ "sofa",
11397
+ "utensils",
11398
+ "bed-double",
11399
+ "bath",
11400
+ "briefcase",
11401
+ "car",
11402
+ "circle-parking",
11403
+ "route",
11404
+ "trees",
11405
+ "umbrella",
11406
+ "waves-ladder",
11407
+ "fence",
11408
+ "package",
11409
+ "warehouse",
11410
+ "store",
11411
+ "sun",
11412
+ "radar"
11413
+ ]);
11414
+ /**
11415
+ * One (location, icon) assignment as it travels.
11416
+ *
11417
+ * `locationKey` is ALWAYS {@link locationIconKey} of the label — never the
11418
+ * operator's casing. The registry matches labels trimmed + case-insensitively
11419
+ * everywhere (`addLocation`, `removeLocation`, `renameLocation`), and a
11420
+ * case-only rename (`cucina` → `Cucina`) is a real edit this repo supports; a
11421
+ * map keyed on the displayed casing would orphan its entry on exactly that
11422
+ * edit. Consumers join by keying their own label through `locationIconKey`.
11423
+ */
11424
+ var LocationIconAssignmentSchema = zod.z.object({
11425
+ locationKey: zod.z.string(),
11426
+ icon: LocationIconIdSchema
11427
+ });
11428
+ /**
11429
+ * The join key for a location label: trimmed, lower-cased. The ONE place this
11430
+ * derivation lives — a caller that re-spells it is a rename away from an
11431
+ * orphaned icon.
11432
+ */
11433
+ function locationIconKey(label) {
11434
+ return label.trim().toLowerCase();
11435
+ }
11391
11436
  var ProviderStatusSchema = zod.z.object({
11392
11437
  connected: zod.z.boolean(),
11393
11438
  deviceCount: zod.z.number(),
@@ -12116,7 +12161,11 @@ var deviceManagerCapability = {
12116
12161
  * reference this label keep their `meta.location` value — the
12117
12162
  * registry is purely a suggestion list. To purge from devices,
12118
12163
  * iterate them and call `setLocation(deviceId, null)`
12119
- * separately (or pass `cascade: true` to do it in one shot). */
12164
+ * separately (or pass `cascade: true` to do it in one shot).
12165
+ *
12166
+ * The room's ICON goes with it, always — a key left behind survives in a
12167
+ * map nobody lists, and a room later re-created under the same name would
12168
+ * silently inherit an icon the operator never chose for it. */
12120
12169
  removeLocation: method(zod.z.object({
12121
12170
  name: zod.z.string(),
12122
12171
  cascade: zod.z.boolean().optional()
@@ -12137,7 +12186,13 @@ var deviceManagerCapability = {
12137
12186
  * a suggestion list, and the devices that most need a rename are exactly
12138
12187
  * the ones carrying a label nobody registered. `to` renames onto an
12139
12188
  * existing room by MERGING into it, leaving no duplicate label. An empty
12140
- * `to` throws before anything is written. */
12189
+ * `to` throws before anything is written.
12190
+ *
12191
+ * The room's ICON travels with the rename, including when `from` was
12192
+ * never registered — otherwise it orphans on a key no location carries
12193
+ * any more. A merge keeps the TARGET's icon when it has one: renaming
12194
+ * "Sala" into "Salone" moves devices into Salone, it does not restyle
12195
+ * it. */
12141
12196
  renameLocation: method(zod.z.object({
12142
12197
  from: zod.z.string(),
12143
12198
  to: zod.z.string()
@@ -12145,6 +12200,39 @@ var deviceManagerCapability = {
12145
12200
  kind: "mutation",
12146
12201
  auth: "admin"
12147
12202
  }),
12203
+ /** Every location that carries an ICON, as `(locationKey, icon)` pairs.
12204
+ *
12205
+ * ADDITIVE, deliberately: `listLocations` keeps returning `string[]` —
12206
+ * every consumer of it (the Device Info autocomplete, the HA adoption
12207
+ * import, the recorder) reads a list of labels and none of them wants a
12208
+ * shape change. A surface that wants icons asks for them and joins.
12209
+ *
12210
+ * Only assignments that EXIST are returned — a location with no icon is
12211
+ * absent, not `map-pin`. The fallback belongs to the renderer
12212
+ * (`resolveLocationIcon`), not to the store, so "the operator chose the
12213
+ * pin" and "the operator chose nothing" stay distinguishable.
12214
+ *
12215
+ * The join key is `locationIconKey(label)` (trimmed, lower-cased) — the
12216
+ * same equality the registry uses everywhere. Never the operator's
12217
+ * casing: a case-only rename is a real edit here, and a map keyed on the
12218
+ * displayed spelling would orphan its entry on exactly that edit. */
12219
+ listLocationIcons: method(zod.z.void(), zod.z.array(LocationIconAssignmentSchema)),
12220
+ /** Set (or clear) the icon of a location label. `icon: null` removes the
12221
+ * assignment. The label need NOT be registered — the registry is a
12222
+ * suggestion list and devices carry labels nobody registered — but an
12223
+ * empty / whitespace-only label throws. Idempotent.
12224
+ *
12225
+ * The icon vocabulary is CLOSED (`LOCATION_ICON_IDS`) because the admin UI
12226
+ * and the viewer draw from different icon modules; see
12227
+ * `device/location-icon.ts` for the list and for what a surface that
12228
+ * cannot draw a member must do (fall back to `map-pin`, never a hole). */
12229
+ setLocationIcon: method(zod.z.object({
12230
+ location: zod.z.string(),
12231
+ icon: LocationIconIdSchema.nullable()
12232
+ }), zod.z.void(), {
12233
+ kind: "mutation",
12234
+ auth: "admin"
12235
+ }),
12148
12236
  /** Soft-disable / re-enable the device. Drivers consult
12149
12237
  * `BaseDevice.disabled` to gate lifecycle hooks. */
12150
12238
  setDisabled: method(zod.z.object({
@@ -19194,6 +19282,7 @@ var MediaFileKindEnum = zod.z.enum([
19194
19282
  "keyFrame",
19195
19283
  "keyFrameSmall",
19196
19284
  "thumbnailSmall",
19285
+ "confirmationCrop",
19197
19286
  "sceneFrame"
19198
19287
  ]);
19199
19288
  /**
@@ -38967,6 +39056,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
38967
39056
  addonId: null,
38968
39057
  access: "view"
38969
39058
  },
39059
+ "deviceManager.listLocationIcons": {
39060
+ capName: "device-manager",
39061
+ capScope: "system",
39062
+ addonId: null,
39063
+ access: "view"
39064
+ },
38970
39065
  "deviceManager.listLocations": {
38971
39066
  capName: "device-manager",
38972
39067
  capScope: "system",
@@ -39111,6 +39206,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
39111
39206
  addonId: null,
39112
39207
  access: "create"
39113
39208
  },
39209
+ "deviceManager.setLocationIcon": {
39210
+ capName: "device-manager",
39211
+ capScope: "system",
39212
+ addonId: null,
39213
+ access: "create"
39214
+ },
39114
39215
  "deviceManager.setMetadata": {
39115
39216
  capName: "device-manager",
39116
39217
  capScope: "system",
@@ -46804,6 +46905,12 @@ Object.defineProperty(exports, "LegacyStorageLocationDefaultSchema", {
46804
46905
  return LegacyStorageLocationDefaultSchema;
46805
46906
  }
46806
46907
  });
46908
+ Object.defineProperty(exports, "LocationIconIdSchema", {
46909
+ enumerable: true,
46910
+ get: function() {
46911
+ return LocationIconIdSchema;
46912
+ }
46913
+ });
46807
46914
  Object.defineProperty(exports, "METHOD_ACCESS_MAP", {
46808
46915
  enumerable: true,
46809
46916
  get: function() {
@@ -47206,6 +47313,12 @@ Object.defineProperty(exports, "localNetworkCapability", {
47206
47313
  return localNetworkCapability;
47207
47314
  }
47208
47315
  });
47316
+ Object.defineProperty(exports, "locationIconKey", {
47317
+ enumerable: true,
47318
+ get: function() {
47319
+ return locationIconKey;
47320
+ }
47321
+ });
47209
47322
  Object.defineProperty(exports, "logDestinationCapability", {
47210
47323
  enumerable: true,
47211
47324
  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-C6JIhqS6.js");
3
+ const require_dist = require("./dist-D6kqBW1G.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 { 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-BjSYm1hH.mjs";
2
+ import { $t as DEVICE_STATUS_METHOD, Ft as scopesAllowAddon, It as scopesAllowDeviceCap, Nt as resolveMethodAuth, Ot as procedureAuthKey, Qt as DEVICE_SETTINGS_CONTRIBUTION_METHODS, Sn as EventCategory$1, Tt as objectInputDeclaresAddonId, Yt as errMsg$1, Zt as DATAPLANE_SECRET_HEADER$1, _n as parseJsonUnknown, at as isArrayOutputSchema, bn as scopeKey, cn as asString$1, ct as isObjectInput, dt as isVoidInput, fn as expandCapMethods, ft as kebabToCamel, g as METHOD_ACCESS_MAP, gn as parseJsonObject, in as ReadinessTimeoutError, j as addonSettingsCapability, ln as createEvent, mt as lifecycleJobSchema, on as asJsonObject$1, ot as isCollectionArrayMethod, p as LOG_LEVEL_RANK, rn as ReadinessRegistry, sn as asNumber, t as ALL_CAPABILITY_DEFINITIONS, tt as extractNestedAddonId, un as emitDownForOwnedCaps, v as RUNTIME_DEFAULTS, vn as readinessKey, vt as logLevelAtMost, yn as resolveCapMount, yt as looseSchema } from "./dist-B4htkDVv.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
- const require_dist = require("./dist-C6JIhqS6.js");
1
+ const require_dist = require("./dist-D6kqBW1G.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 { in as asJsonObject } from "./dist-BjSYm1hH.mjs";
1
+ import { on as asJsonObject } from "./dist-B4htkDVv.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.241",
3
+ "version": "1.2.243",
4
4
  "description": "Core addon for CamStack — builtins, pipeline, process management, auth, logging, events",
5
5
  "keywords": [
6
6
  "camstack",