@camstack/addon-agent-ui 1.2.341 → 1.2.342

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.
package/dist/addon.js CHANGED
@@ -803,7 +803,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
803
803
  return EventCategory;
804
804
  }({});
805
805
  //#endregion
806
- //#region ../types/dist/device-type-D1fH5kaC.mjs
806
+ //#region ../types/dist/device-type-DxCT0krO.mjs
807
807
  /**
808
808
  import { errMsg } from '@camstack/types'
809
809
  * Extract a human-readable message from an unknown error value.
@@ -965,6 +965,13 @@ var DeviceFeature = /* @__PURE__ */ function(DeviceFeature) {
965
965
  * filters that want "all devices with on-motion behaviour".
966
966
  */
967
967
  DeviceFeature["MotionTrigger"] = "motion-trigger";
968
+ /**
969
+ * Device can be run for a chosen time and then stopped. Mirrors the
970
+ * `timed-run` wrapper cap — the cap is bound by the core-blocks addon, not by
971
+ * a driver, so the flag is derived from the device's bindings
972
+ * (`featuresOfBoundCaps`). Gates the quick-run control in the viewer.
973
+ */
974
+ DeviceFeature["TimedRun"] = "timed-run";
968
975
  /** Light supports rgb-triplet color via `color` cap. */
969
976
  DeviceFeature["LightColorRgb"] = "light-color-rgb";
970
977
  /** Light supports HSV color via `color` cap. */
@@ -5866,7 +5873,7 @@ var ZodIssueCode = {
5866
5873
  var ZodFirstPartyTypeKind;
5867
5874
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5868
5875
  //#endregion
5869
- //#region ../types/dist/sleep-D4UJY10i.mjs
5876
+ //#region ../types/dist/sleep-7El4r5Bl.mjs
5870
5877
  /**
5871
5878
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5872
5879
  * window to float samples (D455).
@@ -7700,7 +7707,7 @@ function boundOf(list) {
7700
7707
  * Base class for CamStack addons. Eliminates settings boilerplate:
7701
7708
  *
7702
7709
  * - Typed `config` property with automatic resolution from store + defaults
7703
- * - `getGlobalSettings()` / `updateGlobalSettings()` auto-implemented
7710
+ * - the scoped settings API (`clusterSettings` / `nodeSettings` / `deviceDefaults`) auto-implemented
7704
7711
  * - `getAddonSettings()` / `updateAddonSettings()` auto-implemented
7705
7712
  * - `getDeviceSettings()` / `updateDeviceSettings()` auto-implemented
7706
7713
  * - `ctx` accessor for the AddonContext (no manual `this.ctxRef` storage)
@@ -7710,7 +7717,7 @@ function boundOf(list) {
7710
7717
  * Subclasses override:
7711
7718
  * - `onInitialize()` — addon-specific init logic, return ProviderRegistration[]
7712
7719
  * - `onShutdown()` — cleanup
7713
- * - `globalSettingsSchema()` / `deviceSettingsSchema()` — UI schemas
7720
+ * - `clusterSettingsSchema()` / `nodeSettingsSchema()` / `deviceSettingsSchema()` — UI schemas
7714
7721
  *
7715
7722
  * @example
7716
7723
  * ```ts
@@ -7724,7 +7731,7 @@ function boundOf(list) {
7724
7731
  * super({ maxRetries: 3, endpoint: 'http://localhost' })
7725
7732
  * }
7726
7733
  *
7727
- * protected globalSettingsSchema() {
7734
+ * protected clusterSettingsSchema() {
7728
7735
  * return this.schema({
7729
7736
  * sections: [{
7730
7737
  * id: 'main', title: 'Settings',
@@ -7767,7 +7774,7 @@ var BaseAddon = class {
7767
7774
  defaults;
7768
7775
  /**
7769
7776
  * Hidden-state paths that hold secrets (D787) — values the addon writes
7770
- * itself (`updateGlobalSettings`, `state()`) that no form field declares.
7777
+ * itself (`state()`, the scoped writers) that no form field declares.
7771
7778
  * Stored in the keychain exactly like a `password` field. Syntax:
7772
7779
  * `'snapshotSigningKey'`, `'identity.pincode'`, `'tokens[userId].accessToken'`
7773
7780
  * (`key[<id field>]` addresses array items by id, never by index).
@@ -7777,7 +7784,7 @@ var BaseAddon = class {
7777
7784
  /**
7778
7785
  * D986 M4: the scoped schemas this addon declared, resolved once per capability
7779
7786
  * (`loadScopedSchemas`) so the sync readers (`perNodeKeys`, the secret tree, the restart check)
7780
- * see them. Empty until loaded: the readers then fall back to {@link globalSettingsSchema}.
7787
+ * see them. Empty until loaded.
7781
7788
  */
7782
7789
  _scopedByCap = /* @__PURE__ */ new Map();
7783
7790
  _nodeKeysByCap = /* @__PURE__ */ new Map();
@@ -7963,7 +7970,7 @@ var BaseAddon = class {
7963
7970
  /** Addon-specific cleanup. Override if needed. */
7964
7971
  async onShutdown() {}
7965
7972
  /**
7966
- * Called after config is resolved during updateGlobalSettings/updateAddonSettings.
7973
+ * Called after config is resolved during a settings write.
7967
7974
  * Override to react to config changes (e.g. restart a sampler, reconnect a service).
7968
7975
  * Not called during initialize() — use onInitialize() for initial setup.
7969
7976
  */
@@ -7992,82 +7999,12 @@ var BaseAddon = class {
7992
7999
  scopedSettingsCapabilities() {
7993
8000
  return [];
7994
8001
  }
7995
- /** Override to provide global-level settings UI schema. */
7996
- globalSettingsSchema(_cap) {
7997
- return null;
7998
- }
7999
8002
  /** Override to provide device-level settings UI schema. */
8000
8003
  deviceSettingsSchema() {
8001
8004
  return null;
8002
8005
  }
8003
8006
  /**
8004
- * INTEGRATION-LEVEL SETTINGS — declare which of this addon's global sections
8005
- * ARE the configuration of its integration.
8006
- *
8007
- * Return the `ConfigSection.id`s, from {@link globalSettingsSchema}, that an
8008
- * operator should find on the addon's integration page (System →
8009
- * Integrations → <name>) rather than only in the cluster-wide list of every
8010
- * addon. Empty (the default) means the addon has no integration-level
8011
- * settings and no such surface is offered — this is opt-in, because whether
8012
- * an addon's configuration IS its integration's configuration depends on the
8013
- * nature of the integration.
8014
- *
8015
- * WHAT THIS IS NOT. It is not a scope. The selected sections keep living in
8016
- * the ONE global schema, in the ONE addon store, written by the ONE
8017
- * `updateGlobalSettings` path. There is deliberately no
8018
- * `updateIntegrationSettings`: a second write path is how a surface acquires
8019
- * a second store key, and this repo has shipped that twice (`btmPath@hub`,
8020
- * D266). Selecting sections cannot introduce a key that selecting cannot.
8021
- *
8022
- * WHY IT IS A LIST OF SECTION IDS AND NOT A MARKER ON THE SECTION.
8023
- * `ConfigFieldBase` used to carry `scope?: 'device' | 'global'` and it was
8024
- * removed with the reason recorded at
8025
- * `packages/types/src/interfaces/config-ui.ts:249` — *"a field's scope is
8026
- * determined by WHICH schema it lives in, not by a field-level marker."* A
8027
- * marker sprinkled across sections also has to borrow a field that already
8028
- * means something else; borrowing `section.tab` put the literal word
8029
- * "integration" into an operator-facing tab bar, because `tab` means "how to
8030
- * GROUP this visually" and cannot also mean "where this lives" (D269
8031
- * supersedes D268). One declaration, in one place, next to the schema whose
8032
- * ids it names.
8033
- */
8034
- integrationSettingSections() {
8035
- return [];
8036
- }
8037
- async getGlobalSettings(overlay, cap, nodeId) {
8038
- await this.loadScopedSchemas(cap);
8039
- const schema = this.globalSettingsSchema(cap) ?? this.scopedFormSchema(cap);
8040
- if (!schema) return { sections: [] };
8041
- const projected = await this.readRawProjectedStore(nodeId, cap);
8042
- return hydrateSchema(schema, overlay ? await this.overlayKeepingMarkers(projected, overlay) : projected, { inlineSecretsAsViews: true });
8043
- }
8044
- /**
8045
- * The integration-level view of this addon's settings: exactly the sections
8046
- * named by {@link integrationSettingSections}, hydrated from the SAME store
8047
- * `getGlobalSettings` reads, and narrowed to cluster-scoped fields.
8048
- *
8049
- * Returns `null` when the addon declared nothing — an addon that opts out has
8050
- * no integration settings surface at all, rather than an empty one that reads
8051
- * as a failed load.
8052
- *
8053
- * Three properties hold BY CONSTRUCTION, which is why they are here in core
8054
- * and not in whichever UI happens to render this:
8055
- *
8056
- * 1. **One key.** The payload is a SUBSET of the global schema, so a field
8057
- * shown here is the same field, with the same bare key, that the addon's
8058
- * own page shows. There is no integration-specific writer — callers save
8059
- * through `updateGlobalSettings` — so a second store key is unreachable,
8060
- * not merely discouraged.
8061
- * 2. **No node scope.** `perNode: true` fields are DROPPED. Their store key
8062
- * is `<key>@<nodeId>` and an integration is not a node; whichever node
8063
- * such a field silently picked would be a wrong answer for the operator
8064
- * who opened the page (D266).
8065
- * 3. **No silent typo.** A declared id that names no section throws. The
8066
- * alternative — skip it — turns a rename into a surface that quietly
8067
- * empties, which looks exactly like an addon with nothing to configure.
8068
- */
8069
- /**
8070
- * The form schema of ONE integration instance, or `null` to use {@link globalSettingsSchema}.
8007
+ * The form schema of ONE integration instance, or `null` to use the scoped form.
8071
8008
  *
8072
8009
  * Override it only when an `instanceMode: multiple` addon's instances differ: an NVR integration
8073
8010
  * needs its connection fields, the default integration the addon's own sections. It is the
@@ -8278,32 +8215,15 @@ var BaseAddon = class {
8278
8215
  */
8279
8216
  async getIntegrationFormSchema(instance, nodeId) {
8280
8217
  const scoped = await this.integrationFormSchema(instance);
8281
- if (scoped === null) return this.getGlobalSettings(void 0, void 0, nodeId);
8218
+ if (scoped === null) return this.scopedForm(nodeId);
8282
8219
  return hydrateSchema(scoped, {}, { inlineSecretsAsViews: true });
8283
8220
  }
8284
- async getIntegrationSettings(nodeId) {
8285
- const declared = this.integrationSettingSections();
8286
- if (declared.length === 0) return null;
8287
- const schema = this.globalSettingsSchema();
8288
- if (!schema) throw new Error(`${this.constructor.name}: integrationSettingSections() names [${declared.join(", ")}] but globalSettingsSchema() returns null.`);
8289
- const byId = new Map(schema.sections.map((section) => [section.id, section]));
8290
- const sections = [];
8291
- for (const id of declared) {
8292
- const section = byId.get(id);
8293
- if (!section) throw new Error(`${this.constructor.name}: integrationSettingSections() names unknown section "${id}". Known sections: [${[...byId.keys()].join(", ")}].`);
8294
- const fields = dropPerNodeFields(section.fields);
8295
- if (fields.length === 0) continue;
8296
- sections.push({
8297
- ...section,
8298
- fields
8299
- });
8300
- }
8301
- if (sections.length === 0) return null;
8302
- const projected = await this.readRawProjectedStore(nodeId);
8303
- return hydrateSchema({
8304
- ...schema,
8305
- sections
8306
- }, projected, { inlineSecretsAsViews: true });
8221
+ /** The form of the scoped schemas this addon declared, hydrated from its store. */
8222
+ async scopedForm(nodeId) {
8223
+ await this.loadScopedSchemas();
8224
+ const schema = this.scopedFormSchema();
8225
+ if (!schema) return { sections: [] };
8226
+ return hydrateSchema(schema, await this.readRawProjectedStore(nodeId), { inlineSecretsAsViews: true });
8307
8227
  }
8308
8228
  /**
8309
8229
  * The raw addon store PROJECTED onto the target node's bare per-node keys:
@@ -8312,8 +8232,8 @@ var BaseAddon = class {
8312
8232
  * bare fallback), all `@`-scoped and stray bare per-node keys are dropped.
8313
8233
  * A no-op passthrough when the schema declares no `perNode` field.
8314
8234
  *
8315
- * This is the sanctioned way for a `getGlobalSettings` OVERRIDE that needs
8316
- * the store for custom option logic (option narrowing, value snapping) to
8235
+ * This is the sanctioned way for an addon that needs
8236
+ * the store for custom logic (option narrowing, value snapping) to
8317
8237
  * read it per-node — never `ctx.settings.readAddonStore()` directly.
8318
8238
  * `nodeId` omitted ⇒ the local node (node-blind injection from ctx).
8319
8239
  *
@@ -8365,7 +8285,7 @@ var BaseAddon = class {
8365
8285
  }
8366
8286
  /**
8367
8287
  * Whether ONE global key of this addon's store was written, read three-way
8368
- * (D651). For a question a hydrated view cannot answer: `getGlobalSettings`
8288
+ * (D651). For a question a hydrated view cannot answer: a hydrated form
8369
8289
  * reports `value ?? default`, so "the operator chose the default" and "nobody
8370
8290
  * chose" look the same, and a failed read looks like both. A `perNode` key is
8371
8291
  * not supported here: its stored name is scoped.
@@ -8399,7 +8319,7 @@ var BaseAddon = class {
8399
8319
  }
8400
8320
  /**
8401
8321
  * The OPERATOR's write — a settings form or an admin API call, dispatched by
8402
- * the kernel. Identical to {@link updateGlobalSettings}, except that a secret
8322
+ * the kernel. The one in-process write of the addon blob that is not a scoped write; a secret
8403
8323
  * the operator sends is stored as sent even when it equals a pre-keychain
8404
8324
  * inline value: the operator re-entering a password is a change, an addon
8405
8325
  * writing back what it read is not (D787).
@@ -8412,9 +8332,6 @@ var BaseAddon = class {
8412
8332
  this._operatorWriteDepth--;
8413
8333
  }
8414
8334
  }
8415
- async updateGlobalSettings(patch, nodeId) {
8416
- await this.applyGlobalPatch(patch, nodeId);
8417
- }
8418
8335
  /**
8419
8336
  * REMOVE stored secrets — their keychain values and their markers (D787).
8420
8337
  *
@@ -8457,8 +8374,7 @@ var BaseAddon = class {
8457
8374
  await this.resolveConfig();
8458
8375
  await this.onConfigChanged();
8459
8376
  this.emitLifecycle(EventCategory.AddonUpdated, { level: "global" });
8460
- const legacy = this.globalSettingsSchema();
8461
- this.maybeAutoRestart(Object.keys(barePatch), [...legacy === null ? [] : [legacy], ...this.loadedScopedSchemas().map((entry) => entry.schema)]);
8377
+ this.maybeAutoRestart(Object.keys(barePatch), this.loadedScopedSchemas().map((entry) => entry.schema));
8462
8378
  return true;
8463
8379
  }
8464
8380
  /**
@@ -8496,10 +8412,7 @@ var BaseAddon = class {
8496
8412
  this._nodeKeysByCap = /* @__PURE__ */ new Map();
8497
8413
  this._addonSecretTree = null;
8498
8414
  }
8499
- /**
8500
- * The form the settings API serves while an addon declares no {@link globalSettingsSchema}: the
8501
- * sections of its scoped schemas, so dropping the old hook does not blank the form.
8502
- */
8415
+ /** The form of an addon's scoped schemas: their sections, each shown once. */
8503
8416
  scopedFormSchema(cap) {
8504
8417
  const byId = /* @__PURE__ */ new Map();
8505
8418
  for (const entry of this.loadedScopedSchemas(cap)) for (const section of entry.schema.sections) if (!byId.has(section.id)) byId.set(section.id, section);
@@ -8511,8 +8424,7 @@ var BaseAddon = class {
8511
8424
  return [...this._scopedByCap.values()].flat();
8512
8425
  }
8513
8426
  /**
8514
- * The field keys that are stored per node: every field of a {@link nodeSettingsSchema}, plus
8515
- * the fields the legacy {@link globalSettingsSchema} still marks `perNode: true`. Derived once
8427
+ * The field keys that are stored per node: every field of a {@link nodeSettingsSchema}. Derived once
8516
8428
  * per `cap` argument and memoized (schemas are static declarations). Empty set ⇒ every
8517
8429
  * per-node code path is bypassed and the settings API behaves like the node-agnostic one.
8518
8430
  * Call {@link loadScopedSchemas} first (the async seams do).
@@ -8521,8 +8433,7 @@ var BaseAddon = class {
8521
8433
  const cacheKey = cap ?? "";
8522
8434
  const cached = this._nodeKeysByCap.get(cacheKey);
8523
8435
  if (cached) return cached;
8524
- const legacy = this.globalSettingsSchema(cap);
8525
- const keys = new Set(legacy ? legacy.sections.flatMap((section) => collectPerNodeFieldKeys(section.fields)) : []);
8436
+ const keys = /* @__PURE__ */ new Set();
8526
8437
  for (const { scope, schema } of this.loadedScopedSchemas(cap)) {
8527
8438
  if (scope !== "node") continue;
8528
8439
  for (const section of schema.sections) for (const key of collectValueFieldKeys(section.fields)) keys.add(key);
@@ -8740,8 +8651,6 @@ var BaseAddon = class {
8740
8651
  }
8741
8652
  declaredKeySet() {
8742
8653
  const keys = new Set(Object.keys(this.defaults));
8743
- const schema = this.globalSettingsSchema();
8744
- if (schema) for (const section of schema.sections) for (const key of collectFieldKeys(section.fields)) keys.add(key);
8745
8654
  for (const { schema: scoped } of this.loadedScopedSchemas()) for (const section of scoped.sections) for (const key of collectFieldKeys(section.fields)) keys.add(key);
8746
8655
  for (const key of this._declaredStateKeys) keys.add(key);
8747
8656
  for (const path of this.secretStatePaths) {
@@ -8839,7 +8748,7 @@ var BaseAddon = class {
8839
8748
  /** The addon store's secret tree: schema fields by TYPE, plus `secretStatePaths`. */
8840
8749
  addonSecretTree() {
8841
8750
  if (this._addonSecretTree === null) {
8842
- const tree = new Map(secretTreeFromSchema(this.globalSettingsSchema()));
8751
+ const tree = /* @__PURE__ */ new Map();
8843
8752
  for (const { schema } of this.loadedScopedSchemas()) for (const [key, node] of secretTreeFromSchema(schema)) tree.set(key, node);
8844
8753
  this._addonSecretTree = mergeSecretStatePaths(tree, this.secretStatePaths);
8845
8754
  }
@@ -9051,47 +8960,6 @@ function classifyStoreError(err) {
9051
8960
  if (TRANSPORT_PHRASES.some((f) => message.includes(f))) return "transport";
9052
8961
  return "permanent";
9053
8962
  }
9054
- /**
9055
- * Collect the keys of every field marked `perNode: true`, recursing into
9056
- * layout containers (`group` fields and `sub-tabs` tabs) the same way
9057
- * `hydrateSchema` does. Valueless structural fields (separator/info/…)
9058
- * don't declare `perNode` and are excluded by the `in` narrowing.
9059
- */
9060
- /**
9061
- * The same fields with every `perNode: true` one removed, recursing into layout
9062
- * containers exactly as {@link collectPerNodeFieldKeys} does. A container left
9063
- * with no child is dropped rather than rendered empty.
9064
- *
9065
- * Used by `getIntegrationSettings`: an integration is not a node, so a field
9066
- * whose store key is `<key>@<nodeId>` has no node to belong to there.
9067
- */
9068
- function dropPerNodeFields(fields) {
9069
- const kept = [];
9070
- for (const field of fields) {
9071
- if (field.type === "group") {
9072
- const inner = dropPerNodeFields(field.fields);
9073
- if (inner.length > 0) kept.push({
9074
- ...field,
9075
- fields: inner
9076
- });
9077
- continue;
9078
- }
9079
- if (field.type === "sub-tabs") {
9080
- const tabs = field.tabs.map((tab) => ({
9081
- ...tab,
9082
- fields: dropPerNodeFields(tab.fields)
9083
- })).filter((tab) => tab.fields.length > 0);
9084
- if (tabs.length > 0) kept.push({
9085
- ...field,
9086
- tabs
9087
- });
9088
- continue;
9089
- }
9090
- if ("perNode" in field && field.perNode === true) continue;
9091
- kept.push(field);
9092
- }
9093
- return kept;
9094
- }
9095
8963
  /** The keys of the value-holding fields, recursing into layout containers. */
9096
8964
  function collectValueFieldKeys(fields) {
9097
8965
  const collected = [];
@@ -9124,21 +8992,6 @@ function collectFieldKeys(fields) {
9124
8992
  }
9125
8993
  return collected;
9126
8994
  }
9127
- function collectPerNodeFieldKeys(fields) {
9128
- const collected = [];
9129
- for (const field of fields) {
9130
- if (field.type === "group") {
9131
- collected.push(...collectPerNodeFieldKeys(field.fields));
9132
- continue;
9133
- }
9134
- if (field.type === "sub-tabs") {
9135
- for (const tab of field.tabs) collected.push(...collectPerNodeFieldKeys(tab.fields));
9136
- continue;
9137
- }
9138
- if ("perNode" in field && field.perNode === true) collected.push(field.key);
9139
- }
9140
- return collected;
9141
- }
9142
8995
  /**
9143
8996
  * Normalize an `ICamstackAddon.initialize()` return value into the
9144
8997
  * `AddonInitResult` envelope. Arrays are wrapped into `{ providers }`;
@@ -11965,7 +11818,7 @@ object({
11965
11818
  params: record(string(), union([string(), number()])).optional()
11966
11819
  });
11967
11820
  //#endregion
11968
- //#region ../types/dist/composition-BmBHuDTQ.mjs
11821
+ //#region ../types/dist/composition-Bx0JvKUU.mjs
11969
11822
  /**
11970
11823
  * The ffmpeg build every CamStack node downloads, per platform and arch.
11971
11824
  *
@@ -13127,6 +12980,387 @@ var NodeColorIdSchema = _enum([
13127
12980
  "node-h"
13128
12981
  ]);
13129
12982
  //#endregion
12983
+ //#region ../types/dist/convert-BAzH15HU.mjs
12984
+ /**
12985
+ * Frozen unit → spec table. `•` in the doc marks each dimension's canonical
12986
+ * unit (`factor: 1, offset: 0`). °F derives from `°C = (°F − 32) × 5/9` ⇒
12987
+ * `factor = 5/9`, `offset = -160/9` (kept as exact expressions, not rounded
12988
+ * decimals). K derives from `°C = K − 273.15`.
12989
+ */
12990
+ var UNIT_TABLE = {
12991
+ "°C": {
12992
+ dimension: "temperature",
12993
+ factor: 1,
12994
+ offset: 0
12995
+ },
12996
+ "°F": {
12997
+ dimension: "temperature",
12998
+ factor: 5 / 9,
12999
+ offset: -160 / 9
13000
+ },
13001
+ K: {
13002
+ dimension: "temperature",
13003
+ factor: 1,
13004
+ offset: -273.15
13005
+ },
13006
+ hPa: {
13007
+ dimension: "pressure",
13008
+ factor: 1,
13009
+ offset: 0
13010
+ },
13011
+ kPa: {
13012
+ dimension: "pressure",
13013
+ factor: 10,
13014
+ offset: 0
13015
+ },
13016
+ Pa: {
13017
+ dimension: "pressure",
13018
+ factor: .01,
13019
+ offset: 0
13020
+ },
13021
+ mbar: {
13022
+ dimension: "pressure",
13023
+ factor: 1,
13024
+ offset: 0
13025
+ },
13026
+ bar: {
13027
+ dimension: "pressure",
13028
+ factor: 1e3,
13029
+ offset: 0
13030
+ },
13031
+ inHg: {
13032
+ dimension: "pressure",
13033
+ factor: 33.8639,
13034
+ offset: 0
13035
+ },
13036
+ mmHg: {
13037
+ dimension: "pressure",
13038
+ factor: 1.33322,
13039
+ offset: 0
13040
+ },
13041
+ psi: {
13042
+ dimension: "pressure",
13043
+ factor: 68.9476,
13044
+ offset: 0
13045
+ },
13046
+ "m/s": {
13047
+ dimension: "speed",
13048
+ factor: 1,
13049
+ offset: 0
13050
+ },
13051
+ "km/h": {
13052
+ dimension: "speed",
13053
+ factor: 1 / 3.6,
13054
+ offset: 0
13055
+ },
13056
+ mph: {
13057
+ dimension: "speed",
13058
+ factor: .44704,
13059
+ offset: 0
13060
+ },
13061
+ kn: {
13062
+ dimension: "speed",
13063
+ factor: .514444,
13064
+ offset: 0
13065
+ },
13066
+ "mm/h": {
13067
+ dimension: "precipitation-rate",
13068
+ factor: 1,
13069
+ offset: 0
13070
+ },
13071
+ "in/h": {
13072
+ dimension: "precipitation-rate",
13073
+ factor: 25.4,
13074
+ offset: 0
13075
+ },
13076
+ m: {
13077
+ dimension: "length",
13078
+ factor: 1,
13079
+ offset: 0
13080
+ },
13081
+ mm: {
13082
+ dimension: "length",
13083
+ factor: .001,
13084
+ offset: 0
13085
+ },
13086
+ cm: {
13087
+ dimension: "length",
13088
+ factor: .01,
13089
+ offset: 0
13090
+ },
13091
+ km: {
13092
+ dimension: "length",
13093
+ factor: 1e3,
13094
+ offset: 0
13095
+ },
13096
+ in: {
13097
+ dimension: "length",
13098
+ factor: .0254,
13099
+ offset: 0
13100
+ },
13101
+ ft: {
13102
+ dimension: "length",
13103
+ factor: .3048,
13104
+ offset: 0
13105
+ },
13106
+ mi: {
13107
+ dimension: "length",
13108
+ factor: 1609.344,
13109
+ offset: 0
13110
+ },
13111
+ "m²": {
13112
+ dimension: "area",
13113
+ factor: 1,
13114
+ offset: 0
13115
+ },
13116
+ lx: {
13117
+ dimension: "illuminance",
13118
+ factor: 1,
13119
+ offset: 0
13120
+ },
13121
+ "W/m²": {
13122
+ dimension: "irradiance",
13123
+ factor: 1,
13124
+ offset: 0
13125
+ },
13126
+ W: {
13127
+ dimension: "power",
13128
+ factor: 1,
13129
+ offset: 0
13130
+ },
13131
+ kW: {
13132
+ dimension: "power",
13133
+ factor: 1e3,
13134
+ offset: 0
13135
+ },
13136
+ VA: {
13137
+ dimension: "apparent-power",
13138
+ factor: 1,
13139
+ offset: 0
13140
+ },
13141
+ Wh: {
13142
+ dimension: "energy",
13143
+ factor: 1,
13144
+ offset: 0
13145
+ },
13146
+ kWh: {
13147
+ dimension: "energy",
13148
+ factor: 1e3,
13149
+ offset: 0
13150
+ },
13151
+ MWh: {
13152
+ dimension: "energy",
13153
+ factor: 1e6,
13154
+ offset: 0
13155
+ },
13156
+ V: {
13157
+ dimension: "voltage",
13158
+ factor: 1,
13159
+ offset: 0
13160
+ },
13161
+ mV: {
13162
+ dimension: "voltage",
13163
+ factor: .001,
13164
+ offset: 0
13165
+ },
13166
+ A: {
13167
+ dimension: "current",
13168
+ factor: 1,
13169
+ offset: 0
13170
+ },
13171
+ mA: {
13172
+ dimension: "current",
13173
+ factor: .001,
13174
+ offset: 0
13175
+ },
13176
+ ppm: {
13177
+ dimension: "concentration-volume",
13178
+ factor: 1,
13179
+ offset: 0
13180
+ },
13181
+ ppb: {
13182
+ dimension: "concentration-volume",
13183
+ factor: .001,
13184
+ offset: 0
13185
+ },
13186
+ "µg/m³": {
13187
+ dimension: "concentration-mass",
13188
+ factor: 1,
13189
+ offset: 0
13190
+ },
13191
+ "mg/m³": {
13192
+ dimension: "concentration-mass",
13193
+ factor: 1e3,
13194
+ offset: 0
13195
+ },
13196
+ kg: {
13197
+ dimension: "mass",
13198
+ factor: 1,
13199
+ offset: 0
13200
+ },
13201
+ g: {
13202
+ dimension: "mass",
13203
+ factor: .001,
13204
+ offset: 0
13205
+ },
13206
+ lb: {
13207
+ dimension: "mass",
13208
+ factor: .453592,
13209
+ offset: 0
13210
+ },
13211
+ oz: {
13212
+ dimension: "mass",
13213
+ factor: .0283495,
13214
+ offset: 0
13215
+ },
13216
+ "%": {
13217
+ dimension: "percentage",
13218
+ factor: 1,
13219
+ offset: 0
13220
+ },
13221
+ L: {
13222
+ dimension: "volume",
13223
+ factor: 1,
13224
+ offset: 0
13225
+ },
13226
+ mL: {
13227
+ dimension: "volume",
13228
+ factor: .001,
13229
+ offset: 0
13230
+ },
13231
+ gal: {
13232
+ dimension: "volume",
13233
+ factor: 3.785411784,
13234
+ offset: 0
13235
+ },
13236
+ s: {
13237
+ dimension: "duration",
13238
+ factor: 1,
13239
+ offset: 0
13240
+ },
13241
+ ms: {
13242
+ dimension: "duration",
13243
+ factor: .001,
13244
+ offset: 0
13245
+ },
13246
+ min: {
13247
+ dimension: "duration",
13248
+ factor: 60,
13249
+ offset: 0
13250
+ },
13251
+ h: {
13252
+ dimension: "duration",
13253
+ factor: 3600,
13254
+ offset: 0
13255
+ },
13256
+ d: {
13257
+ dimension: "duration",
13258
+ factor: 86400,
13259
+ offset: 0
13260
+ },
13261
+ B: {
13262
+ dimension: "information",
13263
+ factor: 1,
13264
+ offset: 0
13265
+ },
13266
+ KiB: {
13267
+ dimension: "information",
13268
+ factor: 1024,
13269
+ offset: 0
13270
+ },
13271
+ MiB: {
13272
+ dimension: "information",
13273
+ factor: 1024 ** 2,
13274
+ offset: 0
13275
+ },
13276
+ GiB: {
13277
+ dimension: "information",
13278
+ factor: 1024 ** 3,
13279
+ offset: 0
13280
+ },
13281
+ TiB: {
13282
+ dimension: "information",
13283
+ factor: 1024 ** 4,
13284
+ offset: 0
13285
+ },
13286
+ kB: {
13287
+ dimension: "information",
13288
+ factor: 1e3,
13289
+ offset: 0
13290
+ },
13291
+ MB: {
13292
+ dimension: "information",
13293
+ factor: 1e6,
13294
+ offset: 0
13295
+ },
13296
+ GB: {
13297
+ dimension: "information",
13298
+ factor: 1e9,
13299
+ offset: 0
13300
+ },
13301
+ "°": {
13302
+ dimension: "angle",
13303
+ factor: 1,
13304
+ offset: 0
13305
+ },
13306
+ dBFS: {
13307
+ dimension: "sound-level",
13308
+ factor: 1,
13309
+ offset: 0
13310
+ },
13311
+ dBm: {
13312
+ dimension: "signal-level",
13313
+ factor: 1,
13314
+ offset: 0
13315
+ },
13316
+ mired: {
13317
+ dimension: "colour-temperature",
13318
+ factor: 1,
13319
+ offset: 0
13320
+ },
13321
+ kbps: {
13322
+ dimension: "bitrate",
13323
+ factor: 1,
13324
+ offset: 0
13325
+ },
13326
+ Mbps: {
13327
+ dimension: "bitrate",
13328
+ factor: 1e3,
13329
+ offset: 0
13330
+ },
13331
+ fps: {
13332
+ dimension: "rate",
13333
+ factor: 1,
13334
+ offset: 0
13335
+ }
13336
+ };
13337
+ /** Resolve a unit's `UnitSpec`, or `undefined` when the spelling is unknown. */
13338
+ function specFor(unit) {
13339
+ return Object.hasOwn(UNIT_TABLE, unit) ? UNIT_TABLE[unit] : void 0;
13340
+ }
13341
+ /** Value in `spec`'s unit → its dimension's canonical unit. */
13342
+ function toCanonical(value, spec) {
13343
+ return value * spec.factor + spec.offset;
13344
+ }
13345
+ /** Canonical-unit value → the unit described by `spec`. */
13346
+ function fromCanonical(canonical, spec) {
13347
+ return (canonical - spec.offset) / spec.factor;
13348
+ }
13349
+ /**
13350
+ * Graceful variant for the render path: returns the converted value, or
13351
+ * `undefined` when the conversion is refused (unknown unit / cross-dimension).
13352
+ * Never throws — a render caller falls back to the raw value + source unit.
13353
+ */
13354
+ function tryConvertUnit(value, from, to) {
13355
+ if (from === to) return value;
13356
+ const fromSpec = specFor(from);
13357
+ if (!fromSpec) return void 0;
13358
+ const toSpec = specFor(to);
13359
+ if (!toSpec) return void 0;
13360
+ if (fromSpec.dimension !== toSpec.dimension) return void 0;
13361
+ return fromCanonical(toCanonical(value, fromSpec), toSpec);
13362
+ }
13363
+ //#endregion
13130
13364
  //#region ../types/dist/index.mjs
13131
13365
  var SMTP_INBOUND_DEFAULT_PORT = 2525;
13132
13366
  var SMTP_INBOUND_DEFAULT_DOMAIN = "camstack.local";
@@ -41991,6 +42225,7 @@ var ExpressionBindingSourceSchema = union([
41991
42225
  object({
41992
42226
  kind: literal("global"),
41993
42227
  sourceStableId: string(),
42228
+ addonId: string().optional(),
41994
42229
  cap: string(),
41995
42230
  fieldPath: string()
41996
42231
  })
@@ -42057,385 +42292,6 @@ var SourceInfoSchema = object({
42057
42292
  raw: record(string(), unknown()).optional()
42058
42293
  });
42059
42294
  /**
42060
- * Frozen unit → spec table. `•` in the doc marks each dimension's canonical
42061
- * unit (`factor: 1, offset: 0`). °F derives from `°C = (°F − 32) × 5/9` ⇒
42062
- * `factor = 5/9`, `offset = -160/9` (kept as exact expressions, not rounded
42063
- * decimals). K derives from `°C = K − 273.15`.
42064
- */
42065
- var UNIT_TABLE = {
42066
- "°C": {
42067
- dimension: "temperature",
42068
- factor: 1,
42069
- offset: 0
42070
- },
42071
- "°F": {
42072
- dimension: "temperature",
42073
- factor: 5 / 9,
42074
- offset: -160 / 9
42075
- },
42076
- K: {
42077
- dimension: "temperature",
42078
- factor: 1,
42079
- offset: -273.15
42080
- },
42081
- hPa: {
42082
- dimension: "pressure",
42083
- factor: 1,
42084
- offset: 0
42085
- },
42086
- kPa: {
42087
- dimension: "pressure",
42088
- factor: 10,
42089
- offset: 0
42090
- },
42091
- Pa: {
42092
- dimension: "pressure",
42093
- factor: .01,
42094
- offset: 0
42095
- },
42096
- mbar: {
42097
- dimension: "pressure",
42098
- factor: 1,
42099
- offset: 0
42100
- },
42101
- bar: {
42102
- dimension: "pressure",
42103
- factor: 1e3,
42104
- offset: 0
42105
- },
42106
- inHg: {
42107
- dimension: "pressure",
42108
- factor: 33.8639,
42109
- offset: 0
42110
- },
42111
- mmHg: {
42112
- dimension: "pressure",
42113
- factor: 1.33322,
42114
- offset: 0
42115
- },
42116
- psi: {
42117
- dimension: "pressure",
42118
- factor: 68.9476,
42119
- offset: 0
42120
- },
42121
- "m/s": {
42122
- dimension: "speed",
42123
- factor: 1,
42124
- offset: 0
42125
- },
42126
- "km/h": {
42127
- dimension: "speed",
42128
- factor: 1 / 3.6,
42129
- offset: 0
42130
- },
42131
- mph: {
42132
- dimension: "speed",
42133
- factor: .44704,
42134
- offset: 0
42135
- },
42136
- kn: {
42137
- dimension: "speed",
42138
- factor: .514444,
42139
- offset: 0
42140
- },
42141
- "mm/h": {
42142
- dimension: "precipitation-rate",
42143
- factor: 1,
42144
- offset: 0
42145
- },
42146
- "in/h": {
42147
- dimension: "precipitation-rate",
42148
- factor: 25.4,
42149
- offset: 0
42150
- },
42151
- m: {
42152
- dimension: "length",
42153
- factor: 1,
42154
- offset: 0
42155
- },
42156
- mm: {
42157
- dimension: "length",
42158
- factor: .001,
42159
- offset: 0
42160
- },
42161
- cm: {
42162
- dimension: "length",
42163
- factor: .01,
42164
- offset: 0
42165
- },
42166
- km: {
42167
- dimension: "length",
42168
- factor: 1e3,
42169
- offset: 0
42170
- },
42171
- in: {
42172
- dimension: "length",
42173
- factor: .0254,
42174
- offset: 0
42175
- },
42176
- ft: {
42177
- dimension: "length",
42178
- factor: .3048,
42179
- offset: 0
42180
- },
42181
- mi: {
42182
- dimension: "length",
42183
- factor: 1609.344,
42184
- offset: 0
42185
- },
42186
- "m²": {
42187
- dimension: "area",
42188
- factor: 1,
42189
- offset: 0
42190
- },
42191
- lx: {
42192
- dimension: "illuminance",
42193
- factor: 1,
42194
- offset: 0
42195
- },
42196
- "W/m²": {
42197
- dimension: "irradiance",
42198
- factor: 1,
42199
- offset: 0
42200
- },
42201
- W: {
42202
- dimension: "power",
42203
- factor: 1,
42204
- offset: 0
42205
- },
42206
- kW: {
42207
- dimension: "power",
42208
- factor: 1e3,
42209
- offset: 0
42210
- },
42211
- VA: {
42212
- dimension: "apparent-power",
42213
- factor: 1,
42214
- offset: 0
42215
- },
42216
- Wh: {
42217
- dimension: "energy",
42218
- factor: 1,
42219
- offset: 0
42220
- },
42221
- kWh: {
42222
- dimension: "energy",
42223
- factor: 1e3,
42224
- offset: 0
42225
- },
42226
- MWh: {
42227
- dimension: "energy",
42228
- factor: 1e6,
42229
- offset: 0
42230
- },
42231
- V: {
42232
- dimension: "voltage",
42233
- factor: 1,
42234
- offset: 0
42235
- },
42236
- mV: {
42237
- dimension: "voltage",
42238
- factor: .001,
42239
- offset: 0
42240
- },
42241
- A: {
42242
- dimension: "current",
42243
- factor: 1,
42244
- offset: 0
42245
- },
42246
- mA: {
42247
- dimension: "current",
42248
- factor: .001,
42249
- offset: 0
42250
- },
42251
- ppm: {
42252
- dimension: "concentration-volume",
42253
- factor: 1,
42254
- offset: 0
42255
- },
42256
- ppb: {
42257
- dimension: "concentration-volume",
42258
- factor: .001,
42259
- offset: 0
42260
- },
42261
- "µg/m³": {
42262
- dimension: "concentration-mass",
42263
- factor: 1,
42264
- offset: 0
42265
- },
42266
- "mg/m³": {
42267
- dimension: "concentration-mass",
42268
- factor: 1e3,
42269
- offset: 0
42270
- },
42271
- kg: {
42272
- dimension: "mass",
42273
- factor: 1,
42274
- offset: 0
42275
- },
42276
- g: {
42277
- dimension: "mass",
42278
- factor: .001,
42279
- offset: 0
42280
- },
42281
- lb: {
42282
- dimension: "mass",
42283
- factor: .453592,
42284
- offset: 0
42285
- },
42286
- oz: {
42287
- dimension: "mass",
42288
- factor: .0283495,
42289
- offset: 0
42290
- },
42291
- "%": {
42292
- dimension: "percentage",
42293
- factor: 1,
42294
- offset: 0
42295
- },
42296
- L: {
42297
- dimension: "volume",
42298
- factor: 1,
42299
- offset: 0
42300
- },
42301
- mL: {
42302
- dimension: "volume",
42303
- factor: .001,
42304
- offset: 0
42305
- },
42306
- gal: {
42307
- dimension: "volume",
42308
- factor: 3.785411784,
42309
- offset: 0
42310
- },
42311
- s: {
42312
- dimension: "duration",
42313
- factor: 1,
42314
- offset: 0
42315
- },
42316
- ms: {
42317
- dimension: "duration",
42318
- factor: .001,
42319
- offset: 0
42320
- },
42321
- min: {
42322
- dimension: "duration",
42323
- factor: 60,
42324
- offset: 0
42325
- },
42326
- h: {
42327
- dimension: "duration",
42328
- factor: 3600,
42329
- offset: 0
42330
- },
42331
- d: {
42332
- dimension: "duration",
42333
- factor: 86400,
42334
- offset: 0
42335
- },
42336
- B: {
42337
- dimension: "information",
42338
- factor: 1,
42339
- offset: 0
42340
- },
42341
- KiB: {
42342
- dimension: "information",
42343
- factor: 1024,
42344
- offset: 0
42345
- },
42346
- MiB: {
42347
- dimension: "information",
42348
- factor: 1024 ** 2,
42349
- offset: 0
42350
- },
42351
- GiB: {
42352
- dimension: "information",
42353
- factor: 1024 ** 3,
42354
- offset: 0
42355
- },
42356
- TiB: {
42357
- dimension: "information",
42358
- factor: 1024 ** 4,
42359
- offset: 0
42360
- },
42361
- kB: {
42362
- dimension: "information",
42363
- factor: 1e3,
42364
- offset: 0
42365
- },
42366
- MB: {
42367
- dimension: "information",
42368
- factor: 1e6,
42369
- offset: 0
42370
- },
42371
- GB: {
42372
- dimension: "information",
42373
- factor: 1e9,
42374
- offset: 0
42375
- },
42376
- "°": {
42377
- dimension: "angle",
42378
- factor: 1,
42379
- offset: 0
42380
- },
42381
- dBFS: {
42382
- dimension: "sound-level",
42383
- factor: 1,
42384
- offset: 0
42385
- },
42386
- dBm: {
42387
- dimension: "signal-level",
42388
- factor: 1,
42389
- offset: 0
42390
- },
42391
- mired: {
42392
- dimension: "colour-temperature",
42393
- factor: 1,
42394
- offset: 0
42395
- },
42396
- kbps: {
42397
- dimension: "bitrate",
42398
- factor: 1,
42399
- offset: 0
42400
- },
42401
- Mbps: {
42402
- dimension: "bitrate",
42403
- factor: 1e3,
42404
- offset: 0
42405
- },
42406
- fps: {
42407
- dimension: "rate",
42408
- factor: 1,
42409
- offset: 0
42410
- }
42411
- };
42412
- /** Resolve a unit's `UnitSpec`, or `undefined` when the spelling is unknown. */
42413
- function specFor(unit) {
42414
- return Object.hasOwn(UNIT_TABLE, unit) ? UNIT_TABLE[unit] : void 0;
42415
- }
42416
- /** Value in `spec`'s unit → its dimension's canonical unit. */
42417
- function toCanonical(value, spec) {
42418
- return value * spec.factor + spec.offset;
42419
- }
42420
- /** Canonical-unit value → the unit described by `spec`. */
42421
- function fromCanonical(canonical, spec) {
42422
- return (canonical - spec.offset) / spec.factor;
42423
- }
42424
- /**
42425
- * Graceful variant for the render path: returns the converted value, or
42426
- * `undefined` when the conversion is refused (unknown unit / cross-dimension).
42427
- * Never throws — a render caller falls back to the raw value + source unit.
42428
- */
42429
- function tryConvertUnit(value, from, to) {
42430
- if (from === to) return value;
42431
- const fromSpec = specFor(from);
42432
- if (!fromSpec) return void 0;
42433
- const toSpec = specFor(to);
42434
- if (!toSpec) return void 0;
42435
- if (fromSpec.dimension !== toSpec.dimension) return void 0;
42436
- return fromCanonical(toCanonical(value, fromSpec), toSpec);
42437
- }
42438
- /**
42439
42295
  * A number a person types for a physical quantity — the input side of the
42440
42296
  * value + unit contract (D972).
42441
42297
  *
@@ -44123,18 +43979,6 @@ var ScopedSettingsDeclarationSchema = object({
44123
43979
  /** Standard success response for update operations. */
44124
43980
  var SettingsUpdateResultSchema = object({ success: literal(true) });
44125
43981
  method(object({
44126
- addonId: string(),
44127
- nodeId: string().optional(),
44128
- overlay: record(string(), unknown()).optional(),
44129
- cap: string().optional()
44130
- }), SettingsSchemaWithValuesSchema.nullable()), method(object({
44131
- addonId: string(),
44132
- nodeId: string().optional(),
44133
- patch: SettingsPatchSchema
44134
- }), SettingsUpdateResultSchema, {
44135
- kind: "mutation",
44136
- auth: "admin"
44137
- }), method(object({
44138
43982
  addonId: string(),
44139
43983
  cap: string(),
44140
43984
  scope: ScopedSettingsScopeSchema,
@@ -44157,9 +44001,6 @@ method(object({
44157
44001
  scope: ScopedSettingsScopeSchema,
44158
44002
  nodeId: string().optional()
44159
44003
  }), record(string(), unknown()).nullable()), method(object({
44160
- addonId: string(),
44161
- nodeId: string().optional()
44162
- }), SettingsSchemaWithValuesSchema.nullable()), method(object({
44163
44004
  addonId: string(),
44164
44005
  nodeId: string().optional(),
44165
44006
  instance: IntegrationInstanceRefSchema
@@ -45499,7 +45340,7 @@ var BackupDestinationInfoSchema = object({
45499
45340
  id: string(),
45500
45341
  /**
45501
45342
  * Manifest id of the owning addon. The Settings button on the
45502
- * destination card opens that addon's `globalSettingsSchema` panel.
45343
+ * destination card opens that addon's scoped settings panel.
45503
45344
  */
45504
45345
  addonId: string(),
45505
45346
  /** Operator-toggled enable flag from the destination-policy table. */
@@ -49941,6 +49782,7 @@ method(InstancePinSchema, DeviceExportStatusSchema), method(_void(), array(Expor
49941
49782
  kind: "mutation",
49942
49783
  auth: "admin"
49943
49784
  });
49785
+ var DeviceAliasSchema = string().max(64).regex(/^[a-z][a-z0-9_]*$/);
49944
49786
  /**
49945
49787
  * A SITE ZONE — a named part of the property that several locations belong to.
49946
49788
  *
@@ -50334,6 +50176,12 @@ var DeviceInfoSchema = object({
50334
50176
  addonId: string(),
50335
50177
  type: _enum(DeviceType),
50336
50178
  name: string(),
50179
+ /** The name a value template uses for this device (`{{ stufa_veranda.temperature }}`),
50180
+ * entity_id style. Generated once from the name at first registration, unique
50181
+ * cluster-wide, editable through `setAlias`, NOT changed by a rename (D1021).
50182
+ * Optional: a record produced by an older build omits it until the boot
50183
+ * backfill has run. */
50184
+ alias: DeviceAliasSchema.optional(),
50337
50185
  /** Operator-organisational location label. `null` when unset. */
50338
50186
  location: string().nullable(),
50339
50187
  /** Soft-disabled flag. */
@@ -50653,6 +50501,25 @@ method(object({
50653
50501
  }), _void(), {
50654
50502
  kind: "mutation",
50655
50503
  auth: "admin"
50504
+ }), method(object({
50505
+ deviceId: number(),
50506
+ alias: string()
50507
+ }), discriminatedUnion("ok", [object({
50508
+ ok: literal(true),
50509
+ alias: DeviceAliasSchema
50510
+ }), object({
50511
+ ok: literal(false),
50512
+ reason: _enum([
50513
+ "empty",
50514
+ "too-long",
50515
+ "grammar",
50516
+ "reserved",
50517
+ "taken"
50518
+ ]),
50519
+ takenBy: number().optional()
50520
+ })]), {
50521
+ kind: "mutation",
50522
+ auth: "admin"
50656
50523
  }), method(object({
50657
50524
  deviceId: number(),
50658
50525
  location: string().nullable()
@@ -76000,13 +75867,6 @@ Object.freeze({
76000
75867
  access: "view",
76001
75868
  role: "admin"
76002
75869
  },
76003
- "addonSettings.getGlobalSettings": {
76004
- capName: "addon-settings",
76005
- capScope: "system",
76006
- addonId: null,
76007
- access: "view",
76008
- role: "admin"
76009
- },
76010
75870
  "addonSettings.getIntegrationFormSchema": {
76011
75871
  capName: "addon-settings",
76012
75872
  capScope: "system",
@@ -76014,13 +75874,6 @@ Object.freeze({
76014
75874
  access: "view",
76015
75875
  role: "admin"
76016
75876
  },
76017
- "addonSettings.getIntegrationSettings": {
76018
- capName: "addon-settings",
76019
- capScope: "system",
76020
- addonId: null,
76021
- access: "view",
76022
- role: "admin"
76023
- },
76024
75877
  "addonSettings.getScopedSettings": {
76025
75878
  capName: "addon-settings",
76026
75879
  capScope: "system",
@@ -76056,13 +75909,6 @@ Object.freeze({
76056
75909
  access: "create",
76057
75910
  role: "admin"
76058
75911
  },
76059
- "addonSettings.updateGlobalSettings": {
76060
- capName: "addon-settings",
76061
- capScope: "system",
76062
- addonId: null,
76063
- access: "create",
76064
- role: "admin"
76065
- },
76066
75912
  "addonSettings.updateScopedSettings": {
76067
75913
  capName: "addon-settings",
76068
75914
  capScope: "system",
@@ -78233,6 +78079,13 @@ Object.freeze({
78233
78079
  access: "create",
78234
78080
  role: "admin"
78235
78081
  },
78082
+ "deviceManager.setAlias": {
78083
+ capName: "device-manager",
78084
+ capScope: "system",
78085
+ addonId: null,
78086
+ access: "create",
78087
+ role: "admin"
78088
+ },
78236
78089
  "deviceManager.setChildLayout": {
78237
78090
  capName: "device-manager",
78238
78091
  capScope: "system",
@@ -85974,6 +85827,7 @@ function offered(received) {
85974
85827
  };
85975
85828
  }
85976
85829
  offered(HA_AS), withheld(HOMEKIT_REASON), withheld(ALEXA_REASON), withheld(GOOGLE_REASON), withheld(MATTER_REASON);
85830
+ string().min(1).max(4096);
85977
85831
  Object.freeze({
85978
85832
  "accessories.getStatus": [{
85979
85833
  name: "deviceId",
@@ -86657,6 +86511,11 @@ Object.freeze({
86657
86511
  form: "single",
86658
86512
  optional: false
86659
86513
  }],
86514
+ "deviceManager.setAlias": [{
86515
+ name: "deviceId",
86516
+ form: "single",
86517
+ optional: false
86518
+ }],
86660
86519
  "deviceManager.setChildLayout": [{
86661
86520
  name: "deviceId",
86662
86521
  form: "single",
@@ -90344,7 +90203,7 @@ var AgentUIAddon = class extends BaseAddon {
90344
90203
  capability: adminUiCapability,
90345
90204
  provider: {
90346
90205
  getStaticDir: async () => ({ staticDir: path.resolve(__dirname) }),
90347
- getVersion: async () => ({ version: "1.2.341" })
90206
+ getVersion: async () => ({ version: "1.2.342" })
90348
90207
  }
90349
90208
  }];
90350
90209
  }