@camstack/addon-provider-homeassistant 1.2.157 → 1.2.159
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 +10 -2
- package/dist/addon.mjs +10 -2
- package/dist/{dist-M6hP_tw3.js → dist-BE_WMCdp.js} +122 -76
- package/dist/{dist-BgTykMb6.mjs → dist-Ck6d87Ov.mjs} +122 -76
- package/dist/ha-export/ha-export.addon.js +1 -1
- package/dist/ha-export/ha-export.addon.mjs +1 -1
- package/package.json +1 -1
package/dist/addon.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_dist = require("./dist-
|
|
2
|
+
const require_dist = require("./dist-BE_WMCdp.js");
|
|
3
3
|
let node_crypto = require("node:crypto");
|
|
4
4
|
let node_zlib = require("node:zlib");
|
|
5
5
|
//#region src/ha-admin-link.ts
|
|
@@ -5142,7 +5142,7 @@ var HaIntegrationManager = class HaIntegrationManager {
|
|
|
5142
5142
|
service: target.service
|
|
5143
5143
|
};
|
|
5144
5144
|
const targetEnvelope = {};
|
|
5145
|
-
if (target.entityId !== void 0) targetEnvelope["entity_id"] =
|
|
5145
|
+
if (target.entityId !== void 0) targetEnvelope["entity_id"] = typeof target.entityId === "string" ? target.entityId : [...target.entityId];
|
|
5146
5146
|
if (target.areaId) targetEnvelope["area_id"] = target.areaId;
|
|
5147
5147
|
if (target.deviceId) targetEnvelope["device_id"] = target.deviceId;
|
|
5148
5148
|
if (Object.keys(targetEnvelope).length > 0) message["target"] = targetEnvelope;
|
|
@@ -7163,6 +7163,14 @@ function createHaNotificationOutputProvider(deps) {
|
|
|
7163
7163
|
addonId
|
|
7164
7164
|
}));
|
|
7165
7165
|
},
|
|
7166
|
+
getTarget: async ({ targetId }) => {
|
|
7167
|
+
const target = await store.getById(targetId);
|
|
7168
|
+
if (!target) throw new Error(`Unknown target '${targetId}'`);
|
|
7169
|
+
return {
|
|
7170
|
+
...target,
|
|
7171
|
+
addonId
|
|
7172
|
+
};
|
|
7173
|
+
},
|
|
7166
7174
|
discoverTargets: async ({ kind, config }) => {
|
|
7167
7175
|
if (kind !== "homeassistant") return [];
|
|
7168
7176
|
const explicit = config ? readBrokerId(config) : void 0;
|
package/dist/addon.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { A as connectivityCapability, At as record, B as floodCapability, C as buildAddonRouteProvider, Ct as _enum, D as carbonMonoxideCapability, Dt as literal, E as calendarSourceCapability, Et as discriminatedUnion, F as deviceAdoptionCapability, Ft as EventCategory, G as lawnMowerControlCapability, H as humidifierCapability, J as motionCapability, K as lockControlCapability, L as enumSensorCapability, M as controlCapability, Mt as union, N as coverCapability, Nt as unknown, O as climateControlCapability, Ot as number, P as deviceAdminLinkCapability, Pt as url, Q as numericSensorCapability, R as eventEmitterCapability, S as brokerCapability, T as buttonCapability, Tt as boolean, U as humiditySensorCapability, V as gasCapability, W as imageCapability, X as notificationOutputCapability, Y as normalizeUnit, Z as notifierCapability, _ as automationControlCapability, _t as DeviceRole, at as scriptRunnerCapability, b as binaryCapability, ct as tamperCapability, d as TargetSchema, dt as vacuumControlCapability, et as parseAdminBase, f as accessoriesCapability, ft as valveCapability, g as ambientLightSensorCapability, gt as DeviceFeature, h as alarmPanelCapability, ht as weatherCapability, it as pressureSensorCapability, j as contactCapability, jt as string, k as colorCapability, kt as object, lt as temperatureSensorCapability, m as airQualitySensorCapability, mt as waterHeaterCapability, n as BaseDevice, nt as prepareNotification, ot as smokeCapability, p as addonRoutesCapability, pt as vibrationCapability, q as mediaPlayerCapability, r as BaseDeviceProvider, rt as presenceCapability, s as EnumSensorDateTimeFormatSchema, st as switchCapability, tt as powerMeterCapability, ut as updateCapability, v as batteryCapability, vt as DeviceType, w as buildDeviceAdminUrl, wt as array, x as brightnessCapability, xt as createEvent, y as bestLocationMatch, yt as errMsg, z as fanControlCapability } from "./dist-
|
|
1
|
+
import { A as connectivityCapability, At as record, B as floodCapability, C as buildAddonRouteProvider, Ct as _enum, D as carbonMonoxideCapability, Dt as literal, E as calendarSourceCapability, Et as discriminatedUnion, F as deviceAdoptionCapability, Ft as EventCategory, G as lawnMowerControlCapability, H as humidifierCapability, J as motionCapability, K as lockControlCapability, L as enumSensorCapability, M as controlCapability, Mt as union, N as coverCapability, Nt as unknown, O as climateControlCapability, Ot as number, P as deviceAdminLinkCapability, Pt as url, Q as numericSensorCapability, R as eventEmitterCapability, S as brokerCapability, T as buttonCapability, Tt as boolean, U as humiditySensorCapability, V as gasCapability, W as imageCapability, X as notificationOutputCapability, Y as normalizeUnit, Z as notifierCapability, _ as automationControlCapability, _t as DeviceRole, at as scriptRunnerCapability, b as binaryCapability, ct as tamperCapability, d as TargetSchema, dt as vacuumControlCapability, et as parseAdminBase, f as accessoriesCapability, ft as valveCapability, g as ambientLightSensorCapability, gt as DeviceFeature, h as alarmPanelCapability, ht as weatherCapability, it as pressureSensorCapability, j as contactCapability, jt as string, k as colorCapability, kt as object, lt as temperatureSensorCapability, m as airQualitySensorCapability, mt as waterHeaterCapability, n as BaseDevice, nt as prepareNotification, ot as smokeCapability, p as addonRoutesCapability, pt as vibrationCapability, q as mediaPlayerCapability, r as BaseDeviceProvider, rt as presenceCapability, s as EnumSensorDateTimeFormatSchema, st as switchCapability, tt as powerMeterCapability, ut as updateCapability, v as batteryCapability, vt as DeviceType, w as buildDeviceAdminUrl, wt as array, x as brightnessCapability, xt as createEvent, y as bestLocationMatch, yt as errMsg, z as fanControlCapability } from "./dist-Ck6d87Ov.mjs";
|
|
2
2
|
import { randomUUID } from "node:crypto";
|
|
3
3
|
import { brotliCompressSync, deflateSync, gzipSync } from "node:zlib";
|
|
4
4
|
//#region src/ha-admin-link.ts
|
|
@@ -5141,7 +5141,7 @@ var HaIntegrationManager = class HaIntegrationManager {
|
|
|
5141
5141
|
service: target.service
|
|
5142
5142
|
};
|
|
5143
5143
|
const targetEnvelope = {};
|
|
5144
|
-
if (target.entityId !== void 0) targetEnvelope["entity_id"] =
|
|
5144
|
+
if (target.entityId !== void 0) targetEnvelope["entity_id"] = typeof target.entityId === "string" ? target.entityId : [...target.entityId];
|
|
5145
5145
|
if (target.areaId) targetEnvelope["area_id"] = target.areaId;
|
|
5146
5146
|
if (target.deviceId) targetEnvelope["device_id"] = target.deviceId;
|
|
5147
5147
|
if (Object.keys(targetEnvelope).length > 0) message["target"] = targetEnvelope;
|
|
@@ -7162,6 +7162,14 @@ function createHaNotificationOutputProvider(deps) {
|
|
|
7162
7162
|
addonId
|
|
7163
7163
|
}));
|
|
7164
7164
|
},
|
|
7165
|
+
getTarget: async ({ targetId }) => {
|
|
7166
|
+
const target = await store.getById(targetId);
|
|
7167
|
+
if (!target) throw new Error(`Unknown target '${targetId}'`);
|
|
7168
|
+
return {
|
|
7169
|
+
...target,
|
|
7170
|
+
addonId
|
|
7171
|
+
};
|
|
7172
|
+
},
|
|
7165
7173
|
discoverTargets: async ({ kind, config }) => {
|
|
7166
7174
|
if (kind !== "homeassistant") return [];
|
|
7167
7175
|
const explicit = config ? readBrokerId(config) : void 0;
|
|
@@ -10737,11 +10737,11 @@ var ModelVariantGroupSchema = object({
|
|
|
10737
10737
|
/** Quantization axis. Omit ⇒ the fp32 base build. */
|
|
10738
10738
|
precision: _enum(["fp32", "int8"]).optional(),
|
|
10739
10739
|
/**
|
|
10740
|
-
*
|
|
10741
|
-
*
|
|
10742
|
-
*
|
|
10740
|
+
* Training / latency-variant axis. Omit ⇒ the standard build. `test` marks
|
|
10741
|
+
* an alternate training of the same family (Scrypted `relu_test`); chip
|
|
10742
|
+
* label is "Test".
|
|
10743
10743
|
*/
|
|
10744
|
-
optimization: _enum(["standard", "
|
|
10744
|
+
optimization: _enum(["standard", "test"]).optional(),
|
|
10745
10745
|
/**
|
|
10746
10746
|
* Input-resolution axis (square input side, px). Omit ⇒ the family's native
|
|
10747
10747
|
* resolution (640 for yolo26). Reduced-input builds (320 / 256) are a big,
|
|
@@ -10764,9 +10764,10 @@ var ModelProviderIdSchema = _enum([
|
|
|
10764
10764
|
* are per upstream. A persisted custom-model row written when this field was a
|
|
10765
10765
|
* string still parses — the string is lifted into `{ weights }`.
|
|
10766
10766
|
*
|
|
10767
|
-
* Every licence surface (the
|
|
10768
|
-
*
|
|
10769
|
-
*
|
|
10767
|
+
* Every machine licence surface (`THIRD_PARTY_MODELS.md`, the Hugging Face
|
|
10768
|
+
* model table) is GENERATED from these records by
|
|
10769
|
+
* `scripts/gen-model-licenses.ts` (D661). Operator-facing docs live in
|
|
10770
|
+
* `camstack/docs` → `/docs/detection/models`.
|
|
10770
10771
|
*/
|
|
10771
10772
|
var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { weights: value } : value, object({
|
|
10772
10773
|
/** SPDX id of the WEIGHTS' terms, a `LicenseRef-*` for non-SPDX terms, or `UNKNOWN`. */
|
|
@@ -14465,7 +14466,7 @@ DeviceType.Camera;
|
|
|
14465
14466
|
* This matters here more than anywhere else in the repo, because every provider
|
|
14466
14467
|
* that knows a device's host knows its PASSWORD too: `{ host, port, username,
|
|
14467
14468
|
* password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
|
|
14468
|
-
* and `http://admin:hunter2@192.168.
|
|
14469
|
+
* and `http://admin:hunter2@192.168.60.139/` is a URL a browser accepts. The
|
|
14469
14470
|
* camera's own page will ask for its own login. That is correct, and pre-
|
|
14470
14471
|
* filling it is the operator's business, not ours.
|
|
14471
14472
|
*
|
|
@@ -17871,7 +17872,7 @@ method(object({
|
|
|
17871
17872
|
timeoutMs: 6e5
|
|
17872
17873
|
});
|
|
17873
17874
|
method(object({
|
|
17874
|
-
|
|
17875
|
+
targetNodeId: string(),
|
|
17875
17876
|
modelId: string(),
|
|
17876
17877
|
format: _enum(MODEL_FORMATS),
|
|
17877
17878
|
entry: ModelCatalogEntrySchema
|
|
@@ -20397,8 +20398,9 @@ var NcRuleSchema = NcRuleInputSchema.extend({
|
|
|
20397
20398
|
disabledTargetIds: array(string()).default([])
|
|
20398
20399
|
});
|
|
20399
20400
|
/**
|
|
20400
|
-
* The state-summary SECTIONS (D647 / D698): the D637 kind groups that
|
|
20401
|
-
* still-true state. `
|
|
20401
|
+
* The state-summary SECTIONS (D647 / D698 / D708): the D637 kind groups that
|
|
20402
|
+
* report a still-true state. `addons` is the crash-looped addons only and
|
|
20403
|
+
* `addon-updates` the addons that are behind (D708 split them). `backups-exports` and `alarm` are not sections — a completed
|
|
20402
20404
|
* job is not an open state, and the alarm stays instant.
|
|
20403
20405
|
*/
|
|
20404
20406
|
var NcStateSummarySectionIdSchema = _enum([
|
|
@@ -20410,6 +20412,7 @@ var NcStateSummarySectionIdSchema = _enum([
|
|
|
20410
20412
|
"detection-blind",
|
|
20411
20413
|
"nodes",
|
|
20412
20414
|
"addons",
|
|
20415
|
+
"addon-updates",
|
|
20413
20416
|
"updates"
|
|
20414
20417
|
]);
|
|
20415
20418
|
/** One section of a previewed state summary. `unavailable` = its state could not be read. */
|
|
@@ -20890,7 +20893,19 @@ var NcAlarmModeDelaysListSchema = array(object({
|
|
|
20890
20893
|
* When this mode may be armed. Absent / null = always allowed (same as a
|
|
20891
20894
|
* rule with no `schedule`). Evaluated with {@link isScheduleActive}.
|
|
20892
20895
|
*/
|
|
20893
|
-
schedule: NcScheduleSchema.optional()
|
|
20896
|
+
schedule: NcScheduleSchema.optional(),
|
|
20897
|
+
/**
|
|
20898
|
+
* D706: while this mode's ENTRY DELAY runs, do the alarm rules' own pushes go out (as an
|
|
20899
|
+
* intrusion naming the locations)? Absent = false — the entry-delay notification is the
|
|
20900
|
+
* only one, and the matches ride the triggered notification's mosaic (D705).
|
|
20901
|
+
*/
|
|
20902
|
+
notifyDuringEntryDelay: boolean().optional(),
|
|
20903
|
+
/**
|
|
20904
|
+
* D706: notify "watched again" when a sensor this arm bypassed closes and opens again.
|
|
20905
|
+
* Absent = false (logged, not sent). Even when true it is not sent when that same sensor
|
|
20906
|
+
* is the one that starts the entry delay — the entry-delay notification already names it.
|
|
20907
|
+
*/
|
|
20908
|
+
notifySensorRewatched: boolean().optional()
|
|
20894
20909
|
})).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
|
|
20895
20910
|
var NcAlarmModeDelaysEditListSchema = array(object({
|
|
20896
20911
|
mode: AlarmArmModeSchema,
|
|
@@ -20899,7 +20914,11 @@ var NcAlarmModeDelaysEditListSchema = array(object({
|
|
|
20899
20914
|
triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional(),
|
|
20900
20915
|
postTriggeredAction: NcAlarmPostTriggeredActionSchema.nullable().optional(),
|
|
20901
20916
|
/** Set a schedule, or `null` to clear (mode always allowed again). */
|
|
20902
|
-
schedule: NcScheduleSchema.nullable().optional()
|
|
20917
|
+
schedule: NcScheduleSchema.nullable().optional(),
|
|
20918
|
+
/** D706: set the switch, or `null` to clear it (back to the default, false). */
|
|
20919
|
+
notifyDuringEntryDelay: boolean().nullable().optional(),
|
|
20920
|
+
/** D706: set the switch, or `null` to clear it (back to the default, false). */
|
|
20921
|
+
notifySensorRewatched: boolean().nullable().optional()
|
|
20903
20922
|
})).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
|
|
20904
20923
|
/** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
|
|
20905
20924
|
var NcAlarmNonBlockingEditSchema = object({
|
|
@@ -21876,39 +21895,19 @@ Object.freeze(Object.fromEntries([{
|
|
|
21876
21895
|
label: "Face recognition model",
|
|
21877
21896
|
defaultModelId: "auraface-r100",
|
|
21878
21897
|
indexName: "the enrolled face gallery",
|
|
21879
|
-
options: [
|
|
21880
|
-
|
|
21881
|
-
|
|
21882
|
-
|
|
21883
|
-
},
|
|
21884
|
-
{
|
|
21885
|
-
id: "arcface-r100",
|
|
21886
|
-
label: "ArcFace (ResNet34)"
|
|
21887
|
-
},
|
|
21888
|
-
{
|
|
21889
|
-
id: "inception-resnet-v1",
|
|
21890
|
-
label: "Inception ResNet V1"
|
|
21891
|
-
}
|
|
21892
|
-
]
|
|
21898
|
+
options: [{
|
|
21899
|
+
id: "auraface-r100",
|
|
21900
|
+
label: "AuraFace R100"
|
|
21901
|
+
}]
|
|
21893
21902
|
}, {
|
|
21894
21903
|
stepId: "clip-embedding",
|
|
21895
21904
|
label: "Semantic search model",
|
|
21896
|
-
defaultModelId: "
|
|
21905
|
+
defaultModelId: "siglip2-b16-224",
|
|
21897
21906
|
indexName: "the object semantic-search index",
|
|
21898
|
-
options: [
|
|
21899
|
-
|
|
21900
|
-
|
|
21901
|
-
|
|
21902
|
-
},
|
|
21903
|
-
{
|
|
21904
|
-
id: "mobileclip-s2",
|
|
21905
|
-
label: "MobileCLIP S2"
|
|
21906
|
-
},
|
|
21907
|
-
{
|
|
21908
|
-
id: "siglip2-b16-224",
|
|
21909
|
-
label: "SigLIP2 B/16 (Apache-2.0)"
|
|
21910
|
-
}
|
|
21911
|
-
]
|
|
21907
|
+
options: [{
|
|
21908
|
+
id: "siglip2-b16-224",
|
|
21909
|
+
label: "SigLIP2 B/16 (Apache-2.0)"
|
|
21910
|
+
}]
|
|
21912
21911
|
}].map((s) => [s.stepId, s.defaultModelId])));
|
|
21913
21912
|
var CLUSTER_STEP_SETTING_FIELDS = [{
|
|
21914
21913
|
stepId: "face-embedding",
|
|
@@ -24796,6 +24795,22 @@ var MotionSourceEnum = _enum([
|
|
|
24796
24795
|
"device-activity"
|
|
24797
24796
|
]);
|
|
24798
24797
|
/**
|
|
24798
|
+
* What opened an on-motion detection SESSION: the motion source that passed the
|
|
24799
|
+
* camera's `motionSources` gate, and what raised it (the camera itself, or a
|
|
24800
|
+
* sensor the operator attached — D672). `sensorName` is the attached sensor's
|
|
24801
|
+
* device name as the orchestrator's camera-sensors resolution last read it;
|
|
24802
|
+
* absent when unknown or when the camera itself triggered.
|
|
24803
|
+
*
|
|
24804
|
+
* Carried on the session attach ONLY so the runner's `DetectionPhaseTransition`
|
|
24805
|
+
* can say what started the session (D672 rule 11, amended 2026-10-06). The
|
|
24806
|
+
* runner never decides anything on it.
|
|
24807
|
+
*/
|
|
24808
|
+
var SessionTriggerSchema = object({
|
|
24809
|
+
source: MotionSourceEnum,
|
|
24810
|
+
triggeredBy: MotionTriggeredBySchema,
|
|
24811
|
+
sensorName: string().optional()
|
|
24812
|
+
});
|
|
24813
|
+
/**
|
|
24799
24814
|
* List of motion sources active on a camera. Empty array is valid:
|
|
24800
24815
|
* "no source" — happens for battery cams without firmware motion when
|
|
24801
24816
|
* the operator hasn't opted into the SW analyzer (would hold the
|
|
@@ -25047,6 +25062,14 @@ var RunnerCameraConfigSchema = object({
|
|
|
25047
25062
|
*/
|
|
25048
25063
|
motionSources: MotionSourcesSchema.default(["analyzer"]),
|
|
25049
25064
|
/**
|
|
25065
|
+
* What opened this attach, on a SESSION attach only (see
|
|
25066
|
+
* {@link SessionTriggerSchema}). OPTIONAL with no default: absent on a
|
|
25067
|
+
* standing attach, an occupancy burst, a re-dispatch with no motion event
|
|
25068
|
+
* behind it, and every attach from an orchestrator older than the field — the
|
|
25069
|
+
* runner then names no source on the phase event.
|
|
25070
|
+
*/
|
|
25071
|
+
sessionTrigger: SessionTriggerSchema.optional(),
|
|
25072
|
+
/**
|
|
25050
25073
|
* WHICH root detector runs for this camera. The detection counterpart of
|
|
25051
25074
|
* {@link motionSources}, same shape and same discipline: a per-camera list
|
|
25052
25075
|
* of sources the system understands, vendor-agnostic, owned here.
|
|
@@ -32533,7 +32556,7 @@ var LocalInterfaceSchema = object({
|
|
|
32533
32556
|
name: string(),
|
|
32534
32557
|
family: _enum(["IPv4", "IPv6"]),
|
|
32535
32558
|
address: string(),
|
|
32536
|
-
/** CIDR shorthand (e.g. `192.168.
|
|
32559
|
+
/** CIDR shorthand (e.g. `192.168.10.10/24`). Empty when OS doesn't expose. */
|
|
32537
32560
|
cidr: string(),
|
|
32538
32561
|
/** OS netmask. Stable across calls so the SDK can hash on it. */
|
|
32539
32562
|
netmask: string(),
|
|
@@ -32587,7 +32610,8 @@ var ConnectionEndpointSchema = object({
|
|
|
32587
32610
|
"lan-ipv4",
|
|
32588
32611
|
"lan-ipv6",
|
|
32589
32612
|
"public",
|
|
32590
|
-
"loopback"
|
|
32613
|
+
"loopback",
|
|
32614
|
+
"app-link"
|
|
32591
32615
|
]),
|
|
32592
32616
|
/**
|
|
32593
32617
|
* Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
|
|
@@ -32656,15 +32680,27 @@ var GetConnectionEndpointsResultSchema = object({
|
|
|
32656
32680
|
localPort: AdvertisedLocalPortSchema
|
|
32657
32681
|
});
|
|
32658
32682
|
/**
|
|
32659
|
-
* The
|
|
32660
|
-
*
|
|
32661
|
-
*
|
|
32683
|
+
* The address flagged for notification links. `baseUrl: null` = AUTO, which
|
|
32684
|
+
* since D709 is the CamStack app link; `resolved` reports the effective value,
|
|
32685
|
+
* so the UI can show it either way.
|
|
32662
32686
|
*/
|
|
32663
32687
|
var NotificationEndpointSchema = object({
|
|
32664
32688
|
/** The operator's explicit choice, or null for AUTO. */
|
|
32665
32689
|
baseUrl: string().nullable(),
|
|
32666
|
-
/**
|
|
32667
|
-
|
|
32690
|
+
/**
|
|
32691
|
+
* The effective flagged address: the explicit choice, else (AUTO) the
|
|
32692
|
+
* CamStack app link `https://camstack.zentik.app` (D709). A pre-D709 hub
|
|
32693
|
+
* answered the public tunnel / mesh here, or null.
|
|
32694
|
+
*/
|
|
32695
|
+
resolved: string().nullable(),
|
|
32696
|
+
/**
|
|
32697
|
+
* The hub origin an app link carries as `hub=` (D709): the hub's best
|
|
32698
|
+
* public HTTPS address — the tunnel, then the mesh (Tailscale MagicDNS) —
|
|
32699
|
+
* picked from this cap's own palette by `pickAppLinkHub`. `null` when the
|
|
32700
|
+
* hub advertises neither; the app link is then minted without `hub=`.
|
|
32701
|
+
* Absent on a pre-D709 hub.
|
|
32702
|
+
*/
|
|
32703
|
+
appLinkHub: string().nullable()
|
|
32668
32704
|
});
|
|
32669
32705
|
/**
|
|
32670
32706
|
* The URLs the SDK / viewer should race for API access. `baseUrls` empty =
|
|
@@ -32718,7 +32754,11 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
|
|
|
32718
32754
|
* Pass `'https'` when the caller is itself loaded over HTTPS
|
|
32719
32755
|
* to avoid mixed-content blocks in the browser. The public
|
|
32720
32756
|
* tunnel always emits `https://` regardless. */
|
|
32721
|
-
scheme: _enum(["http", "https"]).optional()
|
|
32757
|
+
scheme: _enum(["http", "https"]).optional(),
|
|
32758
|
+
/** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
|
|
32759
|
+
* an address notification links can be flagged with, not a hub
|
|
32760
|
+
* route. Default `false`: racers and rankers never see it. */
|
|
32761
|
+
includeAppLink: boolean().optional()
|
|
32722
32762
|
}), GetConnectionEndpointsResultSchema), method(_void(), NotificationEndpointSchema), method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }), method(_void(), ViewerEndpointsSchema), method(object({ baseUrls: array(string()).readonly() }), ViewerEndpointsSchema, { kind: "mutation" }), method(_void(), AllowedAddressesSchema), method(AllowedAddressesSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), AllowedAddressesSchema, { kind: "mutation" }), method(_void(), TlsStatusSchema), method(object({ reason: string().optional() }), TlsStatusSchema, {
|
|
32723
32763
|
kind: "mutation",
|
|
32724
32764
|
auth: "admin"
|
|
@@ -33047,7 +33087,7 @@ var MeshPeerSchema = object({
|
|
|
33047
33087
|
tags: array(string()).readonly(),
|
|
33048
33088
|
/** True when the peer advertises itself as an exit-node candidate. */
|
|
33049
33089
|
exitNodeOption: boolean(),
|
|
33050
|
-
/** Subnet routes the peer advertises (e.g. `["192.168.
|
|
33090
|
+
/** Subnet routes the peer advertises (e.g. `["192.168.10.0/24"]`). */
|
|
33051
33091
|
advertisedRoutes: array(string()).readonly(),
|
|
33052
33092
|
/** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
|
|
33053
33093
|
userLogin: string().nullable(),
|
|
@@ -34375,7 +34415,13 @@ var OsdStatusSchema = object({ overlays: array(object({
|
|
|
34375
34415
|
*/
|
|
34376
34416
|
availablePositions: array(OsdPositionEnum).readonly(),
|
|
34377
34417
|
/** Firmware does not allow editing the `text` field (e.g. timestamp). */
|
|
34378
|
-
readOnly: boolean().optional()
|
|
34418
|
+
readOnly: boolean().optional(),
|
|
34419
|
+
/**
|
|
34420
|
+
* Firmware text ceiling for this overlay. Absent = no known limit.
|
|
34421
|
+
* The OSD manager truncates here on every write — never stores its own
|
|
34422
|
+
* copy on the binding.
|
|
34423
|
+
*/
|
|
34424
|
+
maxCharacters: number().int().positive().optional()
|
|
34379
34425
|
})).readonly() });
|
|
34380
34426
|
var OsdOverlayPatchSchema = object({
|
|
34381
34427
|
enabled: boolean().optional(),
|
|
@@ -34426,7 +34472,9 @@ var OsdTemplateBindingSchema = object({
|
|
|
34426
34472
|
valuePath: string().min(1).max(64),
|
|
34427
34473
|
/** Convert TO this unit at render (`tryConvertUnit`). Absent = source unit. */
|
|
34428
34474
|
displayUnit: string().max(16).optional(),
|
|
34429
|
-
maxDecimals: number().int().min(0).max(4).default(1)
|
|
34475
|
+
maxDecimals: number().int().min(0).max(4).default(1),
|
|
34476
|
+
/** Raw value → display text (same shape as slot binding). Empty string hides. */
|
|
34477
|
+
valueMap: record(string(), string()).optional()
|
|
34430
34478
|
});
|
|
34431
34479
|
/**
|
|
34432
34480
|
* A named template: bindings (alias → leaf field) + a parser that
|
|
@@ -34476,18 +34524,11 @@ var OsdSlotBindingSchema = object({
|
|
|
34476
34524
|
source: OsdSourceSchema,
|
|
34477
34525
|
/** `${value}` and `${unit}` are substituted; every occurrence. */
|
|
34478
34526
|
template: string().max(96).default("${value}"),
|
|
34479
|
-
/** Truncate with an ellipsis past this length. Absent = no limit. */
|
|
34480
|
-
maxCharacters: number().int().min(4).max(64).optional(),
|
|
34481
34527
|
/**
|
|
34482
34528
|
* Decimal places for a numeric value. `0` yields an integer — the
|
|
34483
34529
|
* documented workaround for firmwares that reject `.` in overlay text.
|
|
34484
34530
|
*/
|
|
34485
34531
|
maxDecimals: number().int().min(0).max(4).default(1),
|
|
34486
|
-
/**
|
|
34487
|
-
* Appended via `${unit}` when no unit conversion produces a label.
|
|
34488
|
-
* Prefer `source.displayUnit` for converted device-state values.
|
|
34489
|
-
*/
|
|
34490
|
-
unitLabel: string().max(8).optional(),
|
|
34491
34532
|
/** Raw value → display text, e.g. `{"true":"MOTION","false":""}`. */
|
|
34492
34533
|
valueMap: record(string(), string()).optional(),
|
|
34493
34534
|
/** Time windows in which the slot is shown. Absent = always. */
|
|
@@ -34496,9 +34537,7 @@ var OsdSlotBindingSchema = object({
|
|
|
34496
34537
|
* Display gate, in the notification centre's condition vocabulary.
|
|
34497
34538
|
* Only the keys reported by `getConditionSupport` are accepted.
|
|
34498
34539
|
*/
|
|
34499
|
-
conditions: NcConditionsSchema.optional()
|
|
34500
|
-
/** Rendered when the gate is closed or the value unreadable. Empty = hide. */
|
|
34501
|
-
fallbackText: string().max(64).default("")
|
|
34540
|
+
conditions: NcConditionsSchema.optional()
|
|
34502
34541
|
});
|
|
34503
34542
|
/** One camera slot, as the operator sees it: firmware truth + our binding. */
|
|
34504
34543
|
var OsdSlotViewSchema = object({
|
|
@@ -52938,12 +52977,14 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
|
|
|
52938
52977
|
{
|
|
52939
52978
|
id: "addons",
|
|
52940
52979
|
family: "system",
|
|
52941
|
-
label: "Addons",
|
|
52942
|
-
kinds: [
|
|
52943
|
-
|
|
52944
|
-
|
|
52945
|
-
|
|
52946
|
-
|
|
52980
|
+
label: "Addons stopped",
|
|
52981
|
+
kinds: ["addon-crash-loop"]
|
|
52982
|
+
},
|
|
52983
|
+
{
|
|
52984
|
+
id: "addon-updates",
|
|
52985
|
+
family: "system",
|
|
52986
|
+
label: "Addon updates",
|
|
52987
|
+
kinds: ["addon-update-available", "addon-updated"]
|
|
52947
52988
|
},
|
|
52948
52989
|
{
|
|
52949
52990
|
id: "updates",
|
|
@@ -53103,13 +53144,15 @@ var STATE_SUMMARY_SECTION_VARS = [
|
|
|
53103
53144
|
},
|
|
53104
53145
|
{
|
|
53105
53146
|
name: "summaryAddons",
|
|
53106
|
-
label: "Summary: addons",
|
|
53107
|
-
example: "
|
|
53108
|
-
kinds: [
|
|
53109
|
-
|
|
53110
|
-
|
|
53111
|
-
|
|
53112
|
-
|
|
53147
|
+
label: "Summary: addons stopped",
|
|
53148
|
+
example: "hub — recorder stopped after repeated crashes",
|
|
53149
|
+
kinds: ["addon-crash-loop"]
|
|
53150
|
+
},
|
|
53151
|
+
{
|
|
53152
|
+
name: "summaryAddonUpdates",
|
|
53153
|
+
label: "Summary: addon updates",
|
|
53154
|
+
example: "hub:\n• @camstack/addon-recorder 1.2.3 → 1.2.4",
|
|
53155
|
+
kinds: ["addon-update-available", "addon-updated"]
|
|
53113
53156
|
},
|
|
53114
53157
|
{
|
|
53115
53158
|
name: "summaryUpdates",
|
|
@@ -53193,6 +53236,7 @@ var STATE_SUMMARY_VARS = [
|
|
|
53193
53236
|
[...RULE_BODY_ONLY],
|
|
53194
53237
|
[...RULE_TEXT],
|
|
53195
53238
|
([...RULE_TEXT], [...DEVICE_EVENTS]),
|
|
53239
|
+
([...RULE_TEXT], [...COMBINED_ALARM]),
|
|
53196
53240
|
([...RULE_TEXT], [...DEVICE_EVENTS]),
|
|
53197
53241
|
([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
|
|
53198
53242
|
([...RULE_TEXT], [...CONSUMABLE]),
|
|
@@ -53233,6 +53277,8 @@ var STATE_SUMMARY_VARS = [
|
|
|
53233
53277
|
[...RULE_TEXT],
|
|
53234
53278
|
[...RULE_TEXT],
|
|
53235
53279
|
[...RULE_TEXT],
|
|
53280
|
+
[...RULE_TEXT],
|
|
53281
|
+
[...RULE_TEXT],
|
|
53236
53282
|
...STATE_SUMMARY_VARS
|
|
53237
53283
|
];
|
|
53238
53284
|
new Set([
|
|
@@ -10736,11 +10736,11 @@ var ModelVariantGroupSchema = object({
|
|
|
10736
10736
|
/** Quantization axis. Omit ⇒ the fp32 base build. */
|
|
10737
10737
|
precision: _enum(["fp32", "int8"]).optional(),
|
|
10738
10738
|
/**
|
|
10739
|
-
*
|
|
10740
|
-
*
|
|
10741
|
-
*
|
|
10739
|
+
* Training / latency-variant axis. Omit ⇒ the standard build. `test` marks
|
|
10740
|
+
* an alternate training of the same family (Scrypted `relu_test`); chip
|
|
10741
|
+
* label is "Test".
|
|
10742
10742
|
*/
|
|
10743
|
-
optimization: _enum(["standard", "
|
|
10743
|
+
optimization: _enum(["standard", "test"]).optional(),
|
|
10744
10744
|
/**
|
|
10745
10745
|
* Input-resolution axis (square input side, px). Omit ⇒ the family's native
|
|
10746
10746
|
* resolution (640 for yolo26). Reduced-input builds (320 / 256) are a big,
|
|
@@ -10763,9 +10763,10 @@ var ModelProviderIdSchema = _enum([
|
|
|
10763
10763
|
* are per upstream. A persisted custom-model row written when this field was a
|
|
10764
10764
|
* string still parses — the string is lifted into `{ weights }`.
|
|
10765
10765
|
*
|
|
10766
|
-
* Every licence surface (the
|
|
10767
|
-
*
|
|
10768
|
-
*
|
|
10766
|
+
* Every machine licence surface (`THIRD_PARTY_MODELS.md`, the Hugging Face
|
|
10767
|
+
* model table) is GENERATED from these records by
|
|
10768
|
+
* `scripts/gen-model-licenses.ts` (D661). Operator-facing docs live in
|
|
10769
|
+
* `camstack/docs` → `/docs/detection/models`.
|
|
10769
10770
|
*/
|
|
10770
10771
|
var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { weights: value } : value, object({
|
|
10771
10772
|
/** SPDX id of the WEIGHTS' terms, a `LicenseRef-*` for non-SPDX terms, or `UNKNOWN`. */
|
|
@@ -14464,7 +14465,7 @@ DeviceType.Camera;
|
|
|
14464
14465
|
* This matters here more than anywhere else in the repo, because every provider
|
|
14465
14466
|
* that knows a device's host knows its PASSWORD too: `{ host, port, username,
|
|
14466
14467
|
* password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
|
|
14467
|
-
* and `http://admin:hunter2@192.168.
|
|
14468
|
+
* and `http://admin:hunter2@192.168.60.139/` is a URL a browser accepts. The
|
|
14468
14469
|
* camera's own page will ask for its own login. That is correct, and pre-
|
|
14469
14470
|
* filling it is the operator's business, not ours.
|
|
14470
14471
|
*
|
|
@@ -17870,7 +17871,7 @@ method(object({
|
|
|
17870
17871
|
timeoutMs: 6e5
|
|
17871
17872
|
});
|
|
17872
17873
|
method(object({
|
|
17873
|
-
|
|
17874
|
+
targetNodeId: string(),
|
|
17874
17875
|
modelId: string(),
|
|
17875
17876
|
format: _enum(MODEL_FORMATS),
|
|
17876
17877
|
entry: ModelCatalogEntrySchema
|
|
@@ -20396,8 +20397,9 @@ var NcRuleSchema = NcRuleInputSchema.extend({
|
|
|
20396
20397
|
disabledTargetIds: array(string()).default([])
|
|
20397
20398
|
});
|
|
20398
20399
|
/**
|
|
20399
|
-
* The state-summary SECTIONS (D647 / D698): the D637 kind groups that
|
|
20400
|
-
* still-true state. `
|
|
20400
|
+
* The state-summary SECTIONS (D647 / D698 / D708): the D637 kind groups that
|
|
20401
|
+
* report a still-true state. `addons` is the crash-looped addons only and
|
|
20402
|
+
* `addon-updates` the addons that are behind (D708 split them). `backups-exports` and `alarm` are not sections — a completed
|
|
20401
20403
|
* job is not an open state, and the alarm stays instant.
|
|
20402
20404
|
*/
|
|
20403
20405
|
var NcStateSummarySectionIdSchema = _enum([
|
|
@@ -20409,6 +20411,7 @@ var NcStateSummarySectionIdSchema = _enum([
|
|
|
20409
20411
|
"detection-blind",
|
|
20410
20412
|
"nodes",
|
|
20411
20413
|
"addons",
|
|
20414
|
+
"addon-updates",
|
|
20412
20415
|
"updates"
|
|
20413
20416
|
]);
|
|
20414
20417
|
/** One section of a previewed state summary. `unavailable` = its state could not be read. */
|
|
@@ -20889,7 +20892,19 @@ var NcAlarmModeDelaysListSchema = array(object({
|
|
|
20889
20892
|
* When this mode may be armed. Absent / null = always allowed (same as a
|
|
20890
20893
|
* rule with no `schedule`). Evaluated with {@link isScheduleActive}.
|
|
20891
20894
|
*/
|
|
20892
|
-
schedule: NcScheduleSchema.optional()
|
|
20895
|
+
schedule: NcScheduleSchema.optional(),
|
|
20896
|
+
/**
|
|
20897
|
+
* D706: while this mode's ENTRY DELAY runs, do the alarm rules' own pushes go out (as an
|
|
20898
|
+
* intrusion naming the locations)? Absent = false — the entry-delay notification is the
|
|
20899
|
+
* only one, and the matches ride the triggered notification's mosaic (D705).
|
|
20900
|
+
*/
|
|
20901
|
+
notifyDuringEntryDelay: boolean().optional(),
|
|
20902
|
+
/**
|
|
20903
|
+
* D706: notify "watched again" when a sensor this arm bypassed closes and opens again.
|
|
20904
|
+
* Absent = false (logged, not sent). Even when true it is not sent when that same sensor
|
|
20905
|
+
* is the one that starts the entry delay — the entry-delay notification already names it.
|
|
20906
|
+
*/
|
|
20907
|
+
notifySensorRewatched: boolean().optional()
|
|
20893
20908
|
})).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
|
|
20894
20909
|
var NcAlarmModeDelaysEditListSchema = array(object({
|
|
20895
20910
|
mode: AlarmArmModeSchema,
|
|
@@ -20898,7 +20913,11 @@ var NcAlarmModeDelaysEditListSchema = array(object({
|
|
|
20898
20913
|
triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional(),
|
|
20899
20914
|
postTriggeredAction: NcAlarmPostTriggeredActionSchema.nullable().optional(),
|
|
20900
20915
|
/** Set a schedule, or `null` to clear (mode always allowed again). */
|
|
20901
|
-
schedule: NcScheduleSchema.nullable().optional()
|
|
20916
|
+
schedule: NcScheduleSchema.nullable().optional(),
|
|
20917
|
+
/** D706: set the switch, or `null` to clear it (back to the default, false). */
|
|
20918
|
+
notifyDuringEntryDelay: boolean().nullable().optional(),
|
|
20919
|
+
/** D706: set the switch, or `null` to clear it (back to the default, false). */
|
|
20920
|
+
notifySensorRewatched: boolean().nullable().optional()
|
|
20902
20921
|
})).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
|
|
20903
20922
|
/** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
|
|
20904
20923
|
var NcAlarmNonBlockingEditSchema = object({
|
|
@@ -21875,39 +21894,19 @@ Object.freeze(Object.fromEntries([{
|
|
|
21875
21894
|
label: "Face recognition model",
|
|
21876
21895
|
defaultModelId: "auraface-r100",
|
|
21877
21896
|
indexName: "the enrolled face gallery",
|
|
21878
|
-
options: [
|
|
21879
|
-
|
|
21880
|
-
|
|
21881
|
-
|
|
21882
|
-
},
|
|
21883
|
-
{
|
|
21884
|
-
id: "arcface-r100",
|
|
21885
|
-
label: "ArcFace (ResNet34)"
|
|
21886
|
-
},
|
|
21887
|
-
{
|
|
21888
|
-
id: "inception-resnet-v1",
|
|
21889
|
-
label: "Inception ResNet V1"
|
|
21890
|
-
}
|
|
21891
|
-
]
|
|
21897
|
+
options: [{
|
|
21898
|
+
id: "auraface-r100",
|
|
21899
|
+
label: "AuraFace R100"
|
|
21900
|
+
}]
|
|
21892
21901
|
}, {
|
|
21893
21902
|
stepId: "clip-embedding",
|
|
21894
21903
|
label: "Semantic search model",
|
|
21895
|
-
defaultModelId: "
|
|
21904
|
+
defaultModelId: "siglip2-b16-224",
|
|
21896
21905
|
indexName: "the object semantic-search index",
|
|
21897
|
-
options: [
|
|
21898
|
-
|
|
21899
|
-
|
|
21900
|
-
|
|
21901
|
-
},
|
|
21902
|
-
{
|
|
21903
|
-
id: "mobileclip-s2",
|
|
21904
|
-
label: "MobileCLIP S2"
|
|
21905
|
-
},
|
|
21906
|
-
{
|
|
21907
|
-
id: "siglip2-b16-224",
|
|
21908
|
-
label: "SigLIP2 B/16 (Apache-2.0)"
|
|
21909
|
-
}
|
|
21910
|
-
]
|
|
21906
|
+
options: [{
|
|
21907
|
+
id: "siglip2-b16-224",
|
|
21908
|
+
label: "SigLIP2 B/16 (Apache-2.0)"
|
|
21909
|
+
}]
|
|
21911
21910
|
}].map((s) => [s.stepId, s.defaultModelId])));
|
|
21912
21911
|
var CLUSTER_STEP_SETTING_FIELDS = [{
|
|
21913
21912
|
stepId: "face-embedding",
|
|
@@ -24795,6 +24794,22 @@ var MotionSourceEnum = _enum([
|
|
|
24795
24794
|
"device-activity"
|
|
24796
24795
|
]);
|
|
24797
24796
|
/**
|
|
24797
|
+
* What opened an on-motion detection SESSION: the motion source that passed the
|
|
24798
|
+
* camera's `motionSources` gate, and what raised it (the camera itself, or a
|
|
24799
|
+
* sensor the operator attached — D672). `sensorName` is the attached sensor's
|
|
24800
|
+
* device name as the orchestrator's camera-sensors resolution last read it;
|
|
24801
|
+
* absent when unknown or when the camera itself triggered.
|
|
24802
|
+
*
|
|
24803
|
+
* Carried on the session attach ONLY so the runner's `DetectionPhaseTransition`
|
|
24804
|
+
* can say what started the session (D672 rule 11, amended 2026-10-06). The
|
|
24805
|
+
* runner never decides anything on it.
|
|
24806
|
+
*/
|
|
24807
|
+
var SessionTriggerSchema = object({
|
|
24808
|
+
source: MotionSourceEnum,
|
|
24809
|
+
triggeredBy: MotionTriggeredBySchema,
|
|
24810
|
+
sensorName: string().optional()
|
|
24811
|
+
});
|
|
24812
|
+
/**
|
|
24798
24813
|
* List of motion sources active on a camera. Empty array is valid:
|
|
24799
24814
|
* "no source" — happens for battery cams without firmware motion when
|
|
24800
24815
|
* the operator hasn't opted into the SW analyzer (would hold the
|
|
@@ -25046,6 +25061,14 @@ var RunnerCameraConfigSchema = object({
|
|
|
25046
25061
|
*/
|
|
25047
25062
|
motionSources: MotionSourcesSchema.default(["analyzer"]),
|
|
25048
25063
|
/**
|
|
25064
|
+
* What opened this attach, on a SESSION attach only (see
|
|
25065
|
+
* {@link SessionTriggerSchema}). OPTIONAL with no default: absent on a
|
|
25066
|
+
* standing attach, an occupancy burst, a re-dispatch with no motion event
|
|
25067
|
+
* behind it, and every attach from an orchestrator older than the field — the
|
|
25068
|
+
* runner then names no source on the phase event.
|
|
25069
|
+
*/
|
|
25070
|
+
sessionTrigger: SessionTriggerSchema.optional(),
|
|
25071
|
+
/**
|
|
25049
25072
|
* WHICH root detector runs for this camera. The detection counterpart of
|
|
25050
25073
|
* {@link motionSources}, same shape and same discipline: a per-camera list
|
|
25051
25074
|
* of sources the system understands, vendor-agnostic, owned here.
|
|
@@ -32532,7 +32555,7 @@ var LocalInterfaceSchema = object({
|
|
|
32532
32555
|
name: string(),
|
|
32533
32556
|
family: _enum(["IPv4", "IPv6"]),
|
|
32534
32557
|
address: string(),
|
|
32535
|
-
/** CIDR shorthand (e.g. `192.168.
|
|
32558
|
+
/** CIDR shorthand (e.g. `192.168.10.10/24`). Empty when OS doesn't expose. */
|
|
32536
32559
|
cidr: string(),
|
|
32537
32560
|
/** OS netmask. Stable across calls so the SDK can hash on it. */
|
|
32538
32561
|
netmask: string(),
|
|
@@ -32586,7 +32609,8 @@ var ConnectionEndpointSchema = object({
|
|
|
32586
32609
|
"lan-ipv4",
|
|
32587
32610
|
"lan-ipv6",
|
|
32588
32611
|
"public",
|
|
32589
|
-
"loopback"
|
|
32612
|
+
"loopback",
|
|
32613
|
+
"app-link"
|
|
32590
32614
|
]),
|
|
32591
32615
|
/**
|
|
32592
32616
|
* Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
|
|
@@ -32655,15 +32679,27 @@ var GetConnectionEndpointsResultSchema = object({
|
|
|
32655
32679
|
localPort: AdvertisedLocalPortSchema
|
|
32656
32680
|
});
|
|
32657
32681
|
/**
|
|
32658
|
-
* The
|
|
32659
|
-
*
|
|
32660
|
-
*
|
|
32682
|
+
* The address flagged for notification links. `baseUrl: null` = AUTO, which
|
|
32683
|
+
* since D709 is the CamStack app link; `resolved` reports the effective value,
|
|
32684
|
+
* so the UI can show it either way.
|
|
32661
32685
|
*/
|
|
32662
32686
|
var NotificationEndpointSchema = object({
|
|
32663
32687
|
/** The operator's explicit choice, or null for AUTO. */
|
|
32664
32688
|
baseUrl: string().nullable(),
|
|
32665
|
-
/**
|
|
32666
|
-
|
|
32689
|
+
/**
|
|
32690
|
+
* The effective flagged address: the explicit choice, else (AUTO) the
|
|
32691
|
+
* CamStack app link `https://camstack.zentik.app` (D709). A pre-D709 hub
|
|
32692
|
+
* answered the public tunnel / mesh here, or null.
|
|
32693
|
+
*/
|
|
32694
|
+
resolved: string().nullable(),
|
|
32695
|
+
/**
|
|
32696
|
+
* The hub origin an app link carries as `hub=` (D709): the hub's best
|
|
32697
|
+
* public HTTPS address — the tunnel, then the mesh (Tailscale MagicDNS) —
|
|
32698
|
+
* picked from this cap's own palette by `pickAppLinkHub`. `null` when the
|
|
32699
|
+
* hub advertises neither; the app link is then minted without `hub=`.
|
|
32700
|
+
* Absent on a pre-D709 hub.
|
|
32701
|
+
*/
|
|
32702
|
+
appLinkHub: string().nullable()
|
|
32667
32703
|
});
|
|
32668
32704
|
/**
|
|
32669
32705
|
* The URLs the SDK / viewer should race for API access. `baseUrls` empty =
|
|
@@ -32717,7 +32753,11 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
|
|
|
32717
32753
|
* Pass `'https'` when the caller is itself loaded over HTTPS
|
|
32718
32754
|
* to avoid mixed-content blocks in the browser. The public
|
|
32719
32755
|
* tunnel always emits `https://` regardless. */
|
|
32720
|
-
scheme: _enum(["http", "https"]).optional()
|
|
32756
|
+
scheme: _enum(["http", "https"]).optional(),
|
|
32757
|
+
/** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
|
|
32758
|
+
* an address notification links can be flagged with, not a hub
|
|
32759
|
+
* route. Default `false`: racers and rankers never see it. */
|
|
32760
|
+
includeAppLink: boolean().optional()
|
|
32721
32761
|
}), GetConnectionEndpointsResultSchema), method(_void(), NotificationEndpointSchema), method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }), method(_void(), ViewerEndpointsSchema), method(object({ baseUrls: array(string()).readonly() }), ViewerEndpointsSchema, { kind: "mutation" }), method(_void(), AllowedAddressesSchema), method(AllowedAddressesSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), AllowedAddressesSchema, { kind: "mutation" }), method(_void(), TlsStatusSchema), method(object({ reason: string().optional() }), TlsStatusSchema, {
|
|
32722
32762
|
kind: "mutation",
|
|
32723
32763
|
auth: "admin"
|
|
@@ -33046,7 +33086,7 @@ var MeshPeerSchema = object({
|
|
|
33046
33086
|
tags: array(string()).readonly(),
|
|
33047
33087
|
/** True when the peer advertises itself as an exit-node candidate. */
|
|
33048
33088
|
exitNodeOption: boolean(),
|
|
33049
|
-
/** Subnet routes the peer advertises (e.g. `["192.168.
|
|
33089
|
+
/** Subnet routes the peer advertises (e.g. `["192.168.10.0/24"]`). */
|
|
33050
33090
|
advertisedRoutes: array(string()).readonly(),
|
|
33051
33091
|
/** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
|
|
33052
33092
|
userLogin: string().nullable(),
|
|
@@ -34374,7 +34414,13 @@ var OsdStatusSchema = object({ overlays: array(object({
|
|
|
34374
34414
|
*/
|
|
34375
34415
|
availablePositions: array(OsdPositionEnum).readonly(),
|
|
34376
34416
|
/** Firmware does not allow editing the `text` field (e.g. timestamp). */
|
|
34377
|
-
readOnly: boolean().optional()
|
|
34417
|
+
readOnly: boolean().optional(),
|
|
34418
|
+
/**
|
|
34419
|
+
* Firmware text ceiling for this overlay. Absent = no known limit.
|
|
34420
|
+
* The OSD manager truncates here on every write — never stores its own
|
|
34421
|
+
* copy on the binding.
|
|
34422
|
+
*/
|
|
34423
|
+
maxCharacters: number().int().positive().optional()
|
|
34378
34424
|
})).readonly() });
|
|
34379
34425
|
var OsdOverlayPatchSchema = object({
|
|
34380
34426
|
enabled: boolean().optional(),
|
|
@@ -34425,7 +34471,9 @@ var OsdTemplateBindingSchema = object({
|
|
|
34425
34471
|
valuePath: string().min(1).max(64),
|
|
34426
34472
|
/** Convert TO this unit at render (`tryConvertUnit`). Absent = source unit. */
|
|
34427
34473
|
displayUnit: string().max(16).optional(),
|
|
34428
|
-
maxDecimals: number().int().min(0).max(4).default(1)
|
|
34474
|
+
maxDecimals: number().int().min(0).max(4).default(1),
|
|
34475
|
+
/** Raw value → display text (same shape as slot binding). Empty string hides. */
|
|
34476
|
+
valueMap: record(string(), string()).optional()
|
|
34429
34477
|
});
|
|
34430
34478
|
/**
|
|
34431
34479
|
* A named template: bindings (alias → leaf field) + a parser that
|
|
@@ -34475,18 +34523,11 @@ var OsdSlotBindingSchema = object({
|
|
|
34475
34523
|
source: OsdSourceSchema,
|
|
34476
34524
|
/** `${value}` and `${unit}` are substituted; every occurrence. */
|
|
34477
34525
|
template: string().max(96).default("${value}"),
|
|
34478
|
-
/** Truncate with an ellipsis past this length. Absent = no limit. */
|
|
34479
|
-
maxCharacters: number().int().min(4).max(64).optional(),
|
|
34480
34526
|
/**
|
|
34481
34527
|
* Decimal places for a numeric value. `0` yields an integer — the
|
|
34482
34528
|
* documented workaround for firmwares that reject `.` in overlay text.
|
|
34483
34529
|
*/
|
|
34484
34530
|
maxDecimals: number().int().min(0).max(4).default(1),
|
|
34485
|
-
/**
|
|
34486
|
-
* Appended via `${unit}` when no unit conversion produces a label.
|
|
34487
|
-
* Prefer `source.displayUnit` for converted device-state values.
|
|
34488
|
-
*/
|
|
34489
|
-
unitLabel: string().max(8).optional(),
|
|
34490
34531
|
/** Raw value → display text, e.g. `{"true":"MOTION","false":""}`. */
|
|
34491
34532
|
valueMap: record(string(), string()).optional(),
|
|
34492
34533
|
/** Time windows in which the slot is shown. Absent = always. */
|
|
@@ -34495,9 +34536,7 @@ var OsdSlotBindingSchema = object({
|
|
|
34495
34536
|
* Display gate, in the notification centre's condition vocabulary.
|
|
34496
34537
|
* Only the keys reported by `getConditionSupport` are accepted.
|
|
34497
34538
|
*/
|
|
34498
|
-
conditions: NcConditionsSchema.optional()
|
|
34499
|
-
/** Rendered when the gate is closed or the value unreadable. Empty = hide. */
|
|
34500
|
-
fallbackText: string().max(64).default("")
|
|
34539
|
+
conditions: NcConditionsSchema.optional()
|
|
34501
34540
|
});
|
|
34502
34541
|
/** One camera slot, as the operator sees it: firmware truth + our binding. */
|
|
34503
34542
|
var OsdSlotViewSchema = object({
|
|
@@ -52937,12 +52976,14 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
|
|
|
52937
52976
|
{
|
|
52938
52977
|
id: "addons",
|
|
52939
52978
|
family: "system",
|
|
52940
|
-
label: "Addons",
|
|
52941
|
-
kinds: [
|
|
52942
|
-
|
|
52943
|
-
|
|
52944
|
-
|
|
52945
|
-
|
|
52979
|
+
label: "Addons stopped",
|
|
52980
|
+
kinds: ["addon-crash-loop"]
|
|
52981
|
+
},
|
|
52982
|
+
{
|
|
52983
|
+
id: "addon-updates",
|
|
52984
|
+
family: "system",
|
|
52985
|
+
label: "Addon updates",
|
|
52986
|
+
kinds: ["addon-update-available", "addon-updated"]
|
|
52946
52987
|
},
|
|
52947
52988
|
{
|
|
52948
52989
|
id: "updates",
|
|
@@ -53102,13 +53143,15 @@ var STATE_SUMMARY_SECTION_VARS = [
|
|
|
53102
53143
|
},
|
|
53103
53144
|
{
|
|
53104
53145
|
name: "summaryAddons",
|
|
53105
|
-
label: "Summary: addons",
|
|
53106
|
-
example: "
|
|
53107
|
-
kinds: [
|
|
53108
|
-
|
|
53109
|
-
|
|
53110
|
-
|
|
53111
|
-
|
|
53146
|
+
label: "Summary: addons stopped",
|
|
53147
|
+
example: "hub — recorder stopped after repeated crashes",
|
|
53148
|
+
kinds: ["addon-crash-loop"]
|
|
53149
|
+
},
|
|
53150
|
+
{
|
|
53151
|
+
name: "summaryAddonUpdates",
|
|
53152
|
+
label: "Summary: addon updates",
|
|
53153
|
+
example: "hub:\n• @camstack/addon-recorder 1.2.3 → 1.2.4",
|
|
53154
|
+
kinds: ["addon-update-available", "addon-updated"]
|
|
53112
53155
|
},
|
|
53113
53156
|
{
|
|
53114
53157
|
name: "summaryUpdates",
|
|
@@ -53192,6 +53235,7 @@ var STATE_SUMMARY_VARS = [
|
|
|
53192
53235
|
[...RULE_BODY_ONLY],
|
|
53193
53236
|
[...RULE_TEXT],
|
|
53194
53237
|
([...RULE_TEXT], [...DEVICE_EVENTS]),
|
|
53238
|
+
([...RULE_TEXT], [...COMBINED_ALARM]),
|
|
53195
53239
|
([...RULE_TEXT], [...DEVICE_EVENTS]),
|
|
53196
53240
|
([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
|
|
53197
53241
|
([...RULE_TEXT], [...CONSUMABLE]),
|
|
@@ -53232,6 +53276,8 @@ var STATE_SUMMARY_VARS = [
|
|
|
53232
53276
|
[...RULE_TEXT],
|
|
53233
53277
|
[...RULE_TEXT],
|
|
53234
53278
|
[...RULE_TEXT],
|
|
53279
|
+
[...RULE_TEXT],
|
|
53280
|
+
[...RULE_TEXT],
|
|
53235
53281
|
...STATE_SUMMARY_VARS
|
|
53236
53282
|
];
|
|
53237
53283
|
new Set([
|
|
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
|
|
|
3
3
|
[Symbol.toStringTag]: { value: "Module" }
|
|
4
4
|
});
|
|
5
5
|
//#endregion
|
|
6
|
-
const require_dist = require("../dist-
|
|
6
|
+
const require_dist = require("../dist-BE_WMCdp.js");
|
|
7
7
|
let node_crypto = require("node:crypto");
|
|
8
8
|
//#region src/ha-export/topics.ts
|
|
9
9
|
/**
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $ as oauthIntegrationCapability, C as buildAddonRouteProvider, Ft as EventCategory, I as deviceExportCapability, St as nodePin, a as COCO_TO_MACRO, bt as BaseAddon, c as FanDirectionSchema, i as CAMERA_SWITCH_ORDER, jt as string, l as HvacModeSchema, o as CameraSwitchIdSchema, p as addonRoutesCapability, t as AlarmArmModeSchema, u as MediaPlayerRepeatSchema } from "../dist-
|
|
1
|
+
import { $ as oauthIntegrationCapability, C as buildAddonRouteProvider, Ft as EventCategory, I as deviceExportCapability, St as nodePin, a as COCO_TO_MACRO, bt as BaseAddon, c as FanDirectionSchema, i as CAMERA_SWITCH_ORDER, jt as string, l as HvacModeSchema, o as CameraSwitchIdSchema, p as addonRoutesCapability, t as AlarmArmModeSchema, u as MediaPlayerRepeatSchema } from "../dist-Ck6d87Ov.mjs";
|
|
2
2
|
import { createHmac, timingSafeEqual } from "node:crypto";
|
|
3
3
|
//#region src/ha-export/topics.ts
|
|
4
4
|
/**
|