@camstack/addon-agent-ui 1.2.340 → 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/CHANGELOG.md +12 -0
- package/dist/.bundle-modules.json +9 -8
- package/dist/addon.js +526 -605
- package/dist/assets/{MotionZonesSettings-Cq5EpNVn.js → MotionZonesSettings-CknbfIMe.js} +1 -1
- package/dist/assets/{PrivacyMaskSettings-CGERvD06.js → PrivacyMaskSettings-BhRJmcLE.js} +1 -1
- package/dist/assets/{SceneMonitorEditor-BBqJaXqm.js → SceneMonitorEditor-C7NTcwRd.js} +1 -1
- package/dist/assets/index-CKwYFwTh.js +145 -0
- package/dist/index.html +1 -1
- package/package.json +2 -2
- package/dist/assets/index-CDTIoOda.js +0 -145
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-
|
|
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-
|
|
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
|
-
* -
|
|
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
|
-
* - `
|
|
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
|
|
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 (`
|
|
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
|
|
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
|
|
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
|
-
*
|
|
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.
|
|
8218
|
+
if (scoped === null) return this.scopedForm(nodeId);
|
|
8282
8219
|
return hydrateSchema(scoped, {}, { inlineSecretsAsViews: true });
|
|
8283
8220
|
}
|
|
8284
|
-
|
|
8285
|
-
|
|
8286
|
-
|
|
8287
|
-
const schema = this.
|
|
8288
|
-
if (!schema)
|
|
8289
|
-
|
|
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
|
|
8316
|
-
* the store for custom
|
|
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:
|
|
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.
|
|
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
|
-
|
|
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}
|
|
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
|
|
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(
|
|
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 }`;
|
|
@@ -11723,13 +11576,25 @@ Object.freeze({
|
|
|
11723
11576
|
"path": "temperature",
|
|
11724
11577
|
"valueType": "number"
|
|
11725
11578
|
}],
|
|
11726
|
-
"timed-run": [
|
|
11727
|
-
|
|
11728
|
-
|
|
11729
|
-
|
|
11730
|
-
|
|
11731
|
-
|
|
11732
|
-
|
|
11579
|
+
"timed-run": [
|
|
11580
|
+
{
|
|
11581
|
+
"path": "activeUntil",
|
|
11582
|
+
"valueType": "number"
|
|
11583
|
+
},
|
|
11584
|
+
{
|
|
11585
|
+
"path": "requestedBy",
|
|
11586
|
+
"valueType": "string"
|
|
11587
|
+
},
|
|
11588
|
+
{
|
|
11589
|
+
"path": "quickRun.duration",
|
|
11590
|
+
"valueType": "number"
|
|
11591
|
+
},
|
|
11592
|
+
{
|
|
11593
|
+
"path": "quickRun.unit",
|
|
11594
|
+
"valueType": "enum",
|
|
11595
|
+
"enumValues": ["s", "min"]
|
|
11596
|
+
}
|
|
11597
|
+
],
|
|
11733
11598
|
"update": [
|
|
11734
11599
|
{
|
|
11735
11600
|
"path": "currentVersion",
|
|
@@ -11953,7 +11818,7 @@ object({
|
|
|
11953
11818
|
params: record(string(), union([string(), number()])).optional()
|
|
11954
11819
|
});
|
|
11955
11820
|
//#endregion
|
|
11956
|
-
//#region ../types/dist/composition-
|
|
11821
|
+
//#region ../types/dist/composition-Bx0JvKUU.mjs
|
|
11957
11822
|
/**
|
|
11958
11823
|
* The ffmpeg build every CamStack node downloads, per platform and arch.
|
|
11959
11824
|
*
|
|
@@ -13115,6 +12980,387 @@ var NodeColorIdSchema = _enum([
|
|
|
13115
12980
|
"node-h"
|
|
13116
12981
|
]);
|
|
13117
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
|
|
13118
13364
|
//#region ../types/dist/index.mjs
|
|
13119
13365
|
var SMTP_INBOUND_DEFAULT_PORT = 2525;
|
|
13120
13366
|
var SMTP_INBOUND_DEFAULT_DOMAIN = "camstack.local";
|
|
@@ -41979,6 +42225,7 @@ var ExpressionBindingSourceSchema = union([
|
|
|
41979
42225
|
object({
|
|
41980
42226
|
kind: literal("global"),
|
|
41981
42227
|
sourceStableId: string(),
|
|
42228
|
+
addonId: string().optional(),
|
|
41982
42229
|
cap: string(),
|
|
41983
42230
|
fieldPath: string()
|
|
41984
42231
|
})
|
|
@@ -42045,385 +42292,6 @@ var SourceInfoSchema = object({
|
|
|
42045
42292
|
raw: record(string(), unknown()).optional()
|
|
42046
42293
|
});
|
|
42047
42294
|
/**
|
|
42048
|
-
* Frozen unit → spec table. `•` in the doc marks each dimension's canonical
|
|
42049
|
-
* unit (`factor: 1, offset: 0`). °F derives from `°C = (°F − 32) × 5/9` ⇒
|
|
42050
|
-
* `factor = 5/9`, `offset = -160/9` (kept as exact expressions, not rounded
|
|
42051
|
-
* decimals). K derives from `°C = K − 273.15`.
|
|
42052
|
-
*/
|
|
42053
|
-
var UNIT_TABLE = {
|
|
42054
|
-
"°C": {
|
|
42055
|
-
dimension: "temperature",
|
|
42056
|
-
factor: 1,
|
|
42057
|
-
offset: 0
|
|
42058
|
-
},
|
|
42059
|
-
"°F": {
|
|
42060
|
-
dimension: "temperature",
|
|
42061
|
-
factor: 5 / 9,
|
|
42062
|
-
offset: -160 / 9
|
|
42063
|
-
},
|
|
42064
|
-
K: {
|
|
42065
|
-
dimension: "temperature",
|
|
42066
|
-
factor: 1,
|
|
42067
|
-
offset: -273.15
|
|
42068
|
-
},
|
|
42069
|
-
hPa: {
|
|
42070
|
-
dimension: "pressure",
|
|
42071
|
-
factor: 1,
|
|
42072
|
-
offset: 0
|
|
42073
|
-
},
|
|
42074
|
-
kPa: {
|
|
42075
|
-
dimension: "pressure",
|
|
42076
|
-
factor: 10,
|
|
42077
|
-
offset: 0
|
|
42078
|
-
},
|
|
42079
|
-
Pa: {
|
|
42080
|
-
dimension: "pressure",
|
|
42081
|
-
factor: .01,
|
|
42082
|
-
offset: 0
|
|
42083
|
-
},
|
|
42084
|
-
mbar: {
|
|
42085
|
-
dimension: "pressure",
|
|
42086
|
-
factor: 1,
|
|
42087
|
-
offset: 0
|
|
42088
|
-
},
|
|
42089
|
-
bar: {
|
|
42090
|
-
dimension: "pressure",
|
|
42091
|
-
factor: 1e3,
|
|
42092
|
-
offset: 0
|
|
42093
|
-
},
|
|
42094
|
-
inHg: {
|
|
42095
|
-
dimension: "pressure",
|
|
42096
|
-
factor: 33.8639,
|
|
42097
|
-
offset: 0
|
|
42098
|
-
},
|
|
42099
|
-
mmHg: {
|
|
42100
|
-
dimension: "pressure",
|
|
42101
|
-
factor: 1.33322,
|
|
42102
|
-
offset: 0
|
|
42103
|
-
},
|
|
42104
|
-
psi: {
|
|
42105
|
-
dimension: "pressure",
|
|
42106
|
-
factor: 68.9476,
|
|
42107
|
-
offset: 0
|
|
42108
|
-
},
|
|
42109
|
-
"m/s": {
|
|
42110
|
-
dimension: "speed",
|
|
42111
|
-
factor: 1,
|
|
42112
|
-
offset: 0
|
|
42113
|
-
},
|
|
42114
|
-
"km/h": {
|
|
42115
|
-
dimension: "speed",
|
|
42116
|
-
factor: 1 / 3.6,
|
|
42117
|
-
offset: 0
|
|
42118
|
-
},
|
|
42119
|
-
mph: {
|
|
42120
|
-
dimension: "speed",
|
|
42121
|
-
factor: .44704,
|
|
42122
|
-
offset: 0
|
|
42123
|
-
},
|
|
42124
|
-
kn: {
|
|
42125
|
-
dimension: "speed",
|
|
42126
|
-
factor: .514444,
|
|
42127
|
-
offset: 0
|
|
42128
|
-
},
|
|
42129
|
-
"mm/h": {
|
|
42130
|
-
dimension: "precipitation-rate",
|
|
42131
|
-
factor: 1,
|
|
42132
|
-
offset: 0
|
|
42133
|
-
},
|
|
42134
|
-
"in/h": {
|
|
42135
|
-
dimension: "precipitation-rate",
|
|
42136
|
-
factor: 25.4,
|
|
42137
|
-
offset: 0
|
|
42138
|
-
},
|
|
42139
|
-
m: {
|
|
42140
|
-
dimension: "length",
|
|
42141
|
-
factor: 1,
|
|
42142
|
-
offset: 0
|
|
42143
|
-
},
|
|
42144
|
-
mm: {
|
|
42145
|
-
dimension: "length",
|
|
42146
|
-
factor: .001,
|
|
42147
|
-
offset: 0
|
|
42148
|
-
},
|
|
42149
|
-
cm: {
|
|
42150
|
-
dimension: "length",
|
|
42151
|
-
factor: .01,
|
|
42152
|
-
offset: 0
|
|
42153
|
-
},
|
|
42154
|
-
km: {
|
|
42155
|
-
dimension: "length",
|
|
42156
|
-
factor: 1e3,
|
|
42157
|
-
offset: 0
|
|
42158
|
-
},
|
|
42159
|
-
in: {
|
|
42160
|
-
dimension: "length",
|
|
42161
|
-
factor: .0254,
|
|
42162
|
-
offset: 0
|
|
42163
|
-
},
|
|
42164
|
-
ft: {
|
|
42165
|
-
dimension: "length",
|
|
42166
|
-
factor: .3048,
|
|
42167
|
-
offset: 0
|
|
42168
|
-
},
|
|
42169
|
-
mi: {
|
|
42170
|
-
dimension: "length",
|
|
42171
|
-
factor: 1609.344,
|
|
42172
|
-
offset: 0
|
|
42173
|
-
},
|
|
42174
|
-
"m²": {
|
|
42175
|
-
dimension: "area",
|
|
42176
|
-
factor: 1,
|
|
42177
|
-
offset: 0
|
|
42178
|
-
},
|
|
42179
|
-
lx: {
|
|
42180
|
-
dimension: "illuminance",
|
|
42181
|
-
factor: 1,
|
|
42182
|
-
offset: 0
|
|
42183
|
-
},
|
|
42184
|
-
"W/m²": {
|
|
42185
|
-
dimension: "irradiance",
|
|
42186
|
-
factor: 1,
|
|
42187
|
-
offset: 0
|
|
42188
|
-
},
|
|
42189
|
-
W: {
|
|
42190
|
-
dimension: "power",
|
|
42191
|
-
factor: 1,
|
|
42192
|
-
offset: 0
|
|
42193
|
-
},
|
|
42194
|
-
kW: {
|
|
42195
|
-
dimension: "power",
|
|
42196
|
-
factor: 1e3,
|
|
42197
|
-
offset: 0
|
|
42198
|
-
},
|
|
42199
|
-
VA: {
|
|
42200
|
-
dimension: "apparent-power",
|
|
42201
|
-
factor: 1,
|
|
42202
|
-
offset: 0
|
|
42203
|
-
},
|
|
42204
|
-
Wh: {
|
|
42205
|
-
dimension: "energy",
|
|
42206
|
-
factor: 1,
|
|
42207
|
-
offset: 0
|
|
42208
|
-
},
|
|
42209
|
-
kWh: {
|
|
42210
|
-
dimension: "energy",
|
|
42211
|
-
factor: 1e3,
|
|
42212
|
-
offset: 0
|
|
42213
|
-
},
|
|
42214
|
-
MWh: {
|
|
42215
|
-
dimension: "energy",
|
|
42216
|
-
factor: 1e6,
|
|
42217
|
-
offset: 0
|
|
42218
|
-
},
|
|
42219
|
-
V: {
|
|
42220
|
-
dimension: "voltage",
|
|
42221
|
-
factor: 1,
|
|
42222
|
-
offset: 0
|
|
42223
|
-
},
|
|
42224
|
-
mV: {
|
|
42225
|
-
dimension: "voltage",
|
|
42226
|
-
factor: .001,
|
|
42227
|
-
offset: 0
|
|
42228
|
-
},
|
|
42229
|
-
A: {
|
|
42230
|
-
dimension: "current",
|
|
42231
|
-
factor: 1,
|
|
42232
|
-
offset: 0
|
|
42233
|
-
},
|
|
42234
|
-
mA: {
|
|
42235
|
-
dimension: "current",
|
|
42236
|
-
factor: .001,
|
|
42237
|
-
offset: 0
|
|
42238
|
-
},
|
|
42239
|
-
ppm: {
|
|
42240
|
-
dimension: "concentration-volume",
|
|
42241
|
-
factor: 1,
|
|
42242
|
-
offset: 0
|
|
42243
|
-
},
|
|
42244
|
-
ppb: {
|
|
42245
|
-
dimension: "concentration-volume",
|
|
42246
|
-
factor: .001,
|
|
42247
|
-
offset: 0
|
|
42248
|
-
},
|
|
42249
|
-
"µg/m³": {
|
|
42250
|
-
dimension: "concentration-mass",
|
|
42251
|
-
factor: 1,
|
|
42252
|
-
offset: 0
|
|
42253
|
-
},
|
|
42254
|
-
"mg/m³": {
|
|
42255
|
-
dimension: "concentration-mass",
|
|
42256
|
-
factor: 1e3,
|
|
42257
|
-
offset: 0
|
|
42258
|
-
},
|
|
42259
|
-
kg: {
|
|
42260
|
-
dimension: "mass",
|
|
42261
|
-
factor: 1,
|
|
42262
|
-
offset: 0
|
|
42263
|
-
},
|
|
42264
|
-
g: {
|
|
42265
|
-
dimension: "mass",
|
|
42266
|
-
factor: .001,
|
|
42267
|
-
offset: 0
|
|
42268
|
-
},
|
|
42269
|
-
lb: {
|
|
42270
|
-
dimension: "mass",
|
|
42271
|
-
factor: .453592,
|
|
42272
|
-
offset: 0
|
|
42273
|
-
},
|
|
42274
|
-
oz: {
|
|
42275
|
-
dimension: "mass",
|
|
42276
|
-
factor: .0283495,
|
|
42277
|
-
offset: 0
|
|
42278
|
-
},
|
|
42279
|
-
"%": {
|
|
42280
|
-
dimension: "percentage",
|
|
42281
|
-
factor: 1,
|
|
42282
|
-
offset: 0
|
|
42283
|
-
},
|
|
42284
|
-
L: {
|
|
42285
|
-
dimension: "volume",
|
|
42286
|
-
factor: 1,
|
|
42287
|
-
offset: 0
|
|
42288
|
-
},
|
|
42289
|
-
mL: {
|
|
42290
|
-
dimension: "volume",
|
|
42291
|
-
factor: .001,
|
|
42292
|
-
offset: 0
|
|
42293
|
-
},
|
|
42294
|
-
gal: {
|
|
42295
|
-
dimension: "volume",
|
|
42296
|
-
factor: 3.785411784,
|
|
42297
|
-
offset: 0
|
|
42298
|
-
},
|
|
42299
|
-
s: {
|
|
42300
|
-
dimension: "duration",
|
|
42301
|
-
factor: 1,
|
|
42302
|
-
offset: 0
|
|
42303
|
-
},
|
|
42304
|
-
ms: {
|
|
42305
|
-
dimension: "duration",
|
|
42306
|
-
factor: .001,
|
|
42307
|
-
offset: 0
|
|
42308
|
-
},
|
|
42309
|
-
min: {
|
|
42310
|
-
dimension: "duration",
|
|
42311
|
-
factor: 60,
|
|
42312
|
-
offset: 0
|
|
42313
|
-
},
|
|
42314
|
-
h: {
|
|
42315
|
-
dimension: "duration",
|
|
42316
|
-
factor: 3600,
|
|
42317
|
-
offset: 0
|
|
42318
|
-
},
|
|
42319
|
-
d: {
|
|
42320
|
-
dimension: "duration",
|
|
42321
|
-
factor: 86400,
|
|
42322
|
-
offset: 0
|
|
42323
|
-
},
|
|
42324
|
-
B: {
|
|
42325
|
-
dimension: "information",
|
|
42326
|
-
factor: 1,
|
|
42327
|
-
offset: 0
|
|
42328
|
-
},
|
|
42329
|
-
KiB: {
|
|
42330
|
-
dimension: "information",
|
|
42331
|
-
factor: 1024,
|
|
42332
|
-
offset: 0
|
|
42333
|
-
},
|
|
42334
|
-
MiB: {
|
|
42335
|
-
dimension: "information",
|
|
42336
|
-
factor: 1024 ** 2,
|
|
42337
|
-
offset: 0
|
|
42338
|
-
},
|
|
42339
|
-
GiB: {
|
|
42340
|
-
dimension: "information",
|
|
42341
|
-
factor: 1024 ** 3,
|
|
42342
|
-
offset: 0
|
|
42343
|
-
},
|
|
42344
|
-
TiB: {
|
|
42345
|
-
dimension: "information",
|
|
42346
|
-
factor: 1024 ** 4,
|
|
42347
|
-
offset: 0
|
|
42348
|
-
},
|
|
42349
|
-
kB: {
|
|
42350
|
-
dimension: "information",
|
|
42351
|
-
factor: 1e3,
|
|
42352
|
-
offset: 0
|
|
42353
|
-
},
|
|
42354
|
-
MB: {
|
|
42355
|
-
dimension: "information",
|
|
42356
|
-
factor: 1e6,
|
|
42357
|
-
offset: 0
|
|
42358
|
-
},
|
|
42359
|
-
GB: {
|
|
42360
|
-
dimension: "information",
|
|
42361
|
-
factor: 1e9,
|
|
42362
|
-
offset: 0
|
|
42363
|
-
},
|
|
42364
|
-
"°": {
|
|
42365
|
-
dimension: "angle",
|
|
42366
|
-
factor: 1,
|
|
42367
|
-
offset: 0
|
|
42368
|
-
},
|
|
42369
|
-
dBFS: {
|
|
42370
|
-
dimension: "sound-level",
|
|
42371
|
-
factor: 1,
|
|
42372
|
-
offset: 0
|
|
42373
|
-
},
|
|
42374
|
-
dBm: {
|
|
42375
|
-
dimension: "signal-level",
|
|
42376
|
-
factor: 1,
|
|
42377
|
-
offset: 0
|
|
42378
|
-
},
|
|
42379
|
-
mired: {
|
|
42380
|
-
dimension: "colour-temperature",
|
|
42381
|
-
factor: 1,
|
|
42382
|
-
offset: 0
|
|
42383
|
-
},
|
|
42384
|
-
kbps: {
|
|
42385
|
-
dimension: "bitrate",
|
|
42386
|
-
factor: 1,
|
|
42387
|
-
offset: 0
|
|
42388
|
-
},
|
|
42389
|
-
Mbps: {
|
|
42390
|
-
dimension: "bitrate",
|
|
42391
|
-
factor: 1e3,
|
|
42392
|
-
offset: 0
|
|
42393
|
-
},
|
|
42394
|
-
fps: {
|
|
42395
|
-
dimension: "rate",
|
|
42396
|
-
factor: 1,
|
|
42397
|
-
offset: 0
|
|
42398
|
-
}
|
|
42399
|
-
};
|
|
42400
|
-
/** Resolve a unit's `UnitSpec`, or `undefined` when the spelling is unknown. */
|
|
42401
|
-
function specFor(unit) {
|
|
42402
|
-
return Object.hasOwn(UNIT_TABLE, unit) ? UNIT_TABLE[unit] : void 0;
|
|
42403
|
-
}
|
|
42404
|
-
/** Value in `spec`'s unit → its dimension's canonical unit. */
|
|
42405
|
-
function toCanonical(value, spec) {
|
|
42406
|
-
return value * spec.factor + spec.offset;
|
|
42407
|
-
}
|
|
42408
|
-
/** Canonical-unit value → the unit described by `spec`. */
|
|
42409
|
-
function fromCanonical(canonical, spec) {
|
|
42410
|
-
return (canonical - spec.offset) / spec.factor;
|
|
42411
|
-
}
|
|
42412
|
-
/**
|
|
42413
|
-
* Graceful variant for the render path: returns the converted value, or
|
|
42414
|
-
* `undefined` when the conversion is refused (unknown unit / cross-dimension).
|
|
42415
|
-
* Never throws — a render caller falls back to the raw value + source unit.
|
|
42416
|
-
*/
|
|
42417
|
-
function tryConvertUnit(value, from, to) {
|
|
42418
|
-
if (from === to) return value;
|
|
42419
|
-
const fromSpec = specFor(from);
|
|
42420
|
-
if (!fromSpec) return void 0;
|
|
42421
|
-
const toSpec = specFor(to);
|
|
42422
|
-
if (!toSpec) return void 0;
|
|
42423
|
-
if (fromSpec.dimension !== toSpec.dimension) return void 0;
|
|
42424
|
-
return fromCanonical(toCanonical(value, fromSpec), toSpec);
|
|
42425
|
-
}
|
|
42426
|
-
/**
|
|
42427
42295
|
* A number a person types for a physical quantity — the input side of the
|
|
42428
42296
|
* value + unit contract (D972).
|
|
42429
42297
|
*
|
|
@@ -44111,18 +43979,6 @@ var ScopedSettingsDeclarationSchema = object({
|
|
|
44111
43979
|
/** Standard success response for update operations. */
|
|
44112
43980
|
var SettingsUpdateResultSchema = object({ success: literal(true) });
|
|
44113
43981
|
method(object({
|
|
44114
|
-
addonId: string(),
|
|
44115
|
-
nodeId: string().optional(),
|
|
44116
|
-
overlay: record(string(), unknown()).optional(),
|
|
44117
|
-
cap: string().optional()
|
|
44118
|
-
}), SettingsSchemaWithValuesSchema.nullable()), method(object({
|
|
44119
|
-
addonId: string(),
|
|
44120
|
-
nodeId: string().optional(),
|
|
44121
|
-
patch: SettingsPatchSchema
|
|
44122
|
-
}), SettingsUpdateResultSchema, {
|
|
44123
|
-
kind: "mutation",
|
|
44124
|
-
auth: "admin"
|
|
44125
|
-
}), method(object({
|
|
44126
43982
|
addonId: string(),
|
|
44127
43983
|
cap: string(),
|
|
44128
43984
|
scope: ScopedSettingsScopeSchema,
|
|
@@ -44145,9 +44001,6 @@ method(object({
|
|
|
44145
44001
|
scope: ScopedSettingsScopeSchema,
|
|
44146
44002
|
nodeId: string().optional()
|
|
44147
44003
|
}), record(string(), unknown()).nullable()), method(object({
|
|
44148
|
-
addonId: string(),
|
|
44149
|
-
nodeId: string().optional()
|
|
44150
|
-
}), SettingsSchemaWithValuesSchema.nullable()), method(object({
|
|
44151
44004
|
addonId: string(),
|
|
44152
44005
|
nodeId: string().optional(),
|
|
44153
44006
|
instance: IntegrationInstanceRefSchema
|
|
@@ -45487,7 +45340,7 @@ var BackupDestinationInfoSchema = object({
|
|
|
45487
45340
|
id: string(),
|
|
45488
45341
|
/**
|
|
45489
45342
|
* Manifest id of the owning addon. The Settings button on the
|
|
45490
|
-
* destination card opens that addon's
|
|
45343
|
+
* destination card opens that addon's scoped settings panel.
|
|
45491
45344
|
*/
|
|
45492
45345
|
addonId: string(),
|
|
45493
45346
|
/** Operator-toggled enable flag from the destination-policy table. */
|
|
@@ -49929,6 +49782,7 @@ method(InstancePinSchema, DeviceExportStatusSchema), method(_void(), array(Expor
|
|
|
49929
49782
|
kind: "mutation",
|
|
49930
49783
|
auth: "admin"
|
|
49931
49784
|
});
|
|
49785
|
+
var DeviceAliasSchema = string().max(64).regex(/^[a-z][a-z0-9_]*$/);
|
|
49932
49786
|
/**
|
|
49933
49787
|
* A SITE ZONE — a named part of the property that several locations belong to.
|
|
49934
49788
|
*
|
|
@@ -50322,6 +50176,12 @@ var DeviceInfoSchema = object({
|
|
|
50322
50176
|
addonId: string(),
|
|
50323
50177
|
type: _enum(DeviceType),
|
|
50324
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(),
|
|
50325
50185
|
/** Operator-organisational location label. `null` when unset. */
|
|
50326
50186
|
location: string().nullable(),
|
|
50327
50187
|
/** Soft-disabled flag. */
|
|
@@ -50641,6 +50501,25 @@ method(object({
|
|
|
50641
50501
|
}), _void(), {
|
|
50642
50502
|
kind: "mutation",
|
|
50643
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"
|
|
50644
50523
|
}), method(object({
|
|
50645
50524
|
deviceId: number(),
|
|
50646
50525
|
location: string().nullable()
|
|
@@ -73234,6 +73113,11 @@ var TimedRunUnitSchema = _enum(["s", "min"]);
|
|
|
73234
73113
|
_enum(["switch", "pet-fountain"]);
|
|
73235
73114
|
DeviceType.Heater, DeviceType.PetFountain;
|
|
73236
73115
|
DeviceType.Heater, DeviceType.PetFountain;
|
|
73116
|
+
/** One duration, as the one-tap run asks for it. */
|
|
73117
|
+
var TimedRunQuickRunSchema = object({
|
|
73118
|
+
duration: number().positive().finite(),
|
|
73119
|
+
unit: TimedRunUnitSchema
|
|
73120
|
+
});
|
|
73237
73121
|
/** Why a request was not carried out. Typed, so a caller can say it in words. */
|
|
73238
73122
|
var TimedRunRefusalSchema = _enum([
|
|
73239
73123
|
"unsupported-device",
|
|
@@ -73254,9 +73138,30 @@ object({
|
|
|
73254
73138
|
activeUntil: number().nullable(),
|
|
73255
73139
|
/** Who asked for the run (a user id or an addon id); `null` when nothing is armed or it did not say. */
|
|
73256
73140
|
requestedBy: string().nullable(),
|
|
73141
|
+
/**
|
|
73142
|
+
* The one-tap run of THIS device: what a "Run" button on any surface starts. `null` when
|
|
73143
|
+
* the device is gone or its type has no timed run; a status from before this field
|
|
73144
|
+
* existed has none, and a surface falls back to the type's default.
|
|
73145
|
+
*/
|
|
73146
|
+
quickRun: TimedRunQuickRunSchema.nullable(),
|
|
73257
73147
|
lastFetchedAt: number()
|
|
73258
73148
|
});
|
|
73259
|
-
|
|
73149
|
+
/** What the settings form needs: the unit, the bounds and the type's default. */
|
|
73150
|
+
var TimedRunOptionsSchema = object({
|
|
73151
|
+
unit: TimedRunUnitSchema,
|
|
73152
|
+
/** The longest run, in `unit`. */
|
|
73153
|
+
maxDuration: number(),
|
|
73154
|
+
defaultDuration: number()
|
|
73155
|
+
});
|
|
73156
|
+
/** The one-tap run duration, in the type's unit; `null` returns to the type's default. */
|
|
73157
|
+
var TimedRunSettingsPatchSchema = object({ quickRunDuration: number().positive().finite().nullable().optional() });
|
|
73158
|
+
method(object({ deviceId: number().int() }), TimedRunOptionsSchema), method(object({
|
|
73159
|
+
deviceId: number().int(),
|
|
73160
|
+
settings: TimedRunSettingsPatchSchema
|
|
73161
|
+
}), _void(), {
|
|
73162
|
+
kind: "mutation",
|
|
73163
|
+
auth: "admin"
|
|
73164
|
+
}), method(object({
|
|
73260
73165
|
deviceId: number().int(),
|
|
73261
73166
|
duration: number().positive().finite(),
|
|
73262
73167
|
unit: TimedRunUnitSchema
|
|
@@ -75962,13 +75867,6 @@ Object.freeze({
|
|
|
75962
75867
|
access: "view",
|
|
75963
75868
|
role: "admin"
|
|
75964
75869
|
},
|
|
75965
|
-
"addonSettings.getGlobalSettings": {
|
|
75966
|
-
capName: "addon-settings",
|
|
75967
|
-
capScope: "system",
|
|
75968
|
-
addonId: null,
|
|
75969
|
-
access: "view",
|
|
75970
|
-
role: "admin"
|
|
75971
|
-
},
|
|
75972
75870
|
"addonSettings.getIntegrationFormSchema": {
|
|
75973
75871
|
capName: "addon-settings",
|
|
75974
75872
|
capScope: "system",
|
|
@@ -75976,13 +75874,6 @@ Object.freeze({
|
|
|
75976
75874
|
access: "view",
|
|
75977
75875
|
role: "admin"
|
|
75978
75876
|
},
|
|
75979
|
-
"addonSettings.getIntegrationSettings": {
|
|
75980
|
-
capName: "addon-settings",
|
|
75981
|
-
capScope: "system",
|
|
75982
|
-
addonId: null,
|
|
75983
|
-
access: "view",
|
|
75984
|
-
role: "admin"
|
|
75985
|
-
},
|
|
75986
75877
|
"addonSettings.getScopedSettings": {
|
|
75987
75878
|
capName: "addon-settings",
|
|
75988
75879
|
capScope: "system",
|
|
@@ -76018,13 +75909,6 @@ Object.freeze({
|
|
|
76018
75909
|
access: "create",
|
|
76019
75910
|
role: "admin"
|
|
76020
75911
|
},
|
|
76021
|
-
"addonSettings.updateGlobalSettings": {
|
|
76022
|
-
capName: "addon-settings",
|
|
76023
|
-
capScope: "system",
|
|
76024
|
-
addonId: null,
|
|
76025
|
-
access: "create",
|
|
76026
|
-
role: "admin"
|
|
76027
|
-
},
|
|
76028
75912
|
"addonSettings.updateScopedSettings": {
|
|
76029
75913
|
capName: "addon-settings",
|
|
76030
75914
|
capScope: "system",
|
|
@@ -78195,6 +78079,13 @@ Object.freeze({
|
|
|
78195
78079
|
access: "create",
|
|
78196
78080
|
role: "admin"
|
|
78197
78081
|
},
|
|
78082
|
+
"deviceManager.setAlias": {
|
|
78083
|
+
capName: "device-manager",
|
|
78084
|
+
capScope: "system",
|
|
78085
|
+
addonId: null,
|
|
78086
|
+
access: "create",
|
|
78087
|
+
role: "admin"
|
|
78088
|
+
},
|
|
78198
78089
|
"deviceManager.setChildLayout": {
|
|
78199
78090
|
capName: "device-manager",
|
|
78200
78091
|
capScope: "system",
|
|
@@ -84978,6 +84869,13 @@ Object.freeze({
|
|
|
84978
84869
|
access: "create",
|
|
84979
84870
|
role: "viewer"
|
|
84980
84871
|
},
|
|
84872
|
+
"timedRun.getOptions": {
|
|
84873
|
+
capName: "timed-run",
|
|
84874
|
+
capScope: "device",
|
|
84875
|
+
addonId: null,
|
|
84876
|
+
access: "view",
|
|
84877
|
+
role: "viewer"
|
|
84878
|
+
},
|
|
84981
84879
|
"timedRun.getStatus": {
|
|
84982
84880
|
capName: "timed-run",
|
|
84983
84881
|
capScope: "device",
|
|
@@ -84992,6 +84890,13 @@ Object.freeze({
|
|
|
84992
84890
|
access: "create",
|
|
84993
84891
|
role: "viewer"
|
|
84994
84892
|
},
|
|
84893
|
+
"timedRun.setSettings": {
|
|
84894
|
+
capName: "timed-run",
|
|
84895
|
+
capScope: "device",
|
|
84896
|
+
addonId: null,
|
|
84897
|
+
access: "create",
|
|
84898
|
+
role: "admin"
|
|
84899
|
+
},
|
|
84995
84900
|
"toast.onToast": {
|
|
84996
84901
|
capName: "toast",
|
|
84997
84902
|
capScope: "system",
|
|
@@ -85922,6 +85827,7 @@ function offered(received) {
|
|
|
85922
85827
|
};
|
|
85923
85828
|
}
|
|
85924
85829
|
offered(HA_AS), withheld(HOMEKIT_REASON), withheld(ALEXA_REASON), withheld(GOOGLE_REASON), withheld(MATTER_REASON);
|
|
85830
|
+
string().min(1).max(4096);
|
|
85925
85831
|
Object.freeze({
|
|
85926
85832
|
"accessories.getStatus": [{
|
|
85927
85833
|
name: "deviceId",
|
|
@@ -86605,6 +86511,11 @@ Object.freeze({
|
|
|
86605
86511
|
form: "single",
|
|
86606
86512
|
optional: false
|
|
86607
86513
|
}],
|
|
86514
|
+
"deviceManager.setAlias": [{
|
|
86515
|
+
name: "deviceId",
|
|
86516
|
+
form: "single",
|
|
86517
|
+
optional: false
|
|
86518
|
+
}],
|
|
86608
86519
|
"deviceManager.setChildLayout": [{
|
|
86609
86520
|
name: "deviceId",
|
|
86610
86521
|
form: "single",
|
|
@@ -88669,6 +88580,11 @@ Object.freeze({
|
|
|
88669
88580
|
form: "single",
|
|
88670
88581
|
optional: false
|
|
88671
88582
|
}],
|
|
88583
|
+
"timedRun.getOptions": [{
|
|
88584
|
+
name: "deviceId",
|
|
88585
|
+
form: "single",
|
|
88586
|
+
optional: false
|
|
88587
|
+
}],
|
|
88672
88588
|
"timedRun.getStatus": [{
|
|
88673
88589
|
name: "deviceId",
|
|
88674
88590
|
form: "single",
|
|
@@ -88679,6 +88595,11 @@ Object.freeze({
|
|
|
88679
88595
|
form: "single",
|
|
88680
88596
|
optional: false
|
|
88681
88597
|
}],
|
|
88598
|
+
"timedRun.setSettings": [{
|
|
88599
|
+
name: "deviceId",
|
|
88600
|
+
form: "single",
|
|
88601
|
+
optional: false
|
|
88602
|
+
}],
|
|
88682
88603
|
"update.getStatus": [{
|
|
88683
88604
|
name: "deviceId",
|
|
88684
88605
|
form: "single",
|
|
@@ -90282,7 +90203,7 @@ var AgentUIAddon = class extends BaseAddon {
|
|
|
90282
90203
|
capability: adminUiCapability,
|
|
90283
90204
|
provider: {
|
|
90284
90205
|
getStaticDir: async () => ({ staticDir: path.resolve(__dirname) }),
|
|
90285
|
-
getVersion: async () => ({ version: "1.2.
|
|
90206
|
+
getVersion: async () => ({ version: "1.2.342" })
|
|
90286
90207
|
}
|
|
90287
90208
|
}];
|
|
90288
90209
|
}
|