camstack 1.0.5 → 1.0.7

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.
@@ -14522,49 +14522,7 @@ function date4(params) {
14522
14522
  // ../../node_modules/zod/v4/classic/external.js
14523
14523
  config(en_default());
14524
14524
 
14525
- // ../types/dist/index.mjs
14526
- var wiringProbeKindSchema = external_exports.enum([
14527
- "singleton",
14528
- "device",
14529
- "widget"
14530
- ]);
14531
- var wiringProbeResultSchema = external_exports.object({
14532
- capName: external_exports.string(),
14533
- kind: wiringProbeKindSchema,
14534
- deviceId: external_exports.number().optional(),
14535
- reachable: external_exports.boolean(),
14536
- latencyMs: external_exports.number(),
14537
- error: external_exports.string().optional()
14538
- });
14539
- var wiringAddonHealthSchema = external_exports.object({
14540
- addonId: external_exports.string(),
14541
- caps: external_exports.array(wiringProbeResultSchema).readonly(),
14542
- widgets: external_exports.array(wiringProbeResultSchema).readonly()
14543
- });
14544
- var wiringNodeHealthSchema = external_exports.object({
14545
- nodeId: external_exports.string(),
14546
- addons: external_exports.array(wiringAddonHealthSchema).readonly()
14547
- });
14548
- var wiringHealthSnapshotSchema = external_exports.object({
14549
- /** True only when every probed target is reachable. */
14550
- ok: external_exports.boolean(),
14551
- /** True when at least one target is unreachable. */
14552
- degraded: external_exports.boolean(),
14553
- checkedAt: external_exports.string(),
14554
- nodes: external_exports.array(wiringNodeHealthSchema).readonly(),
14555
- summary: external_exports.object({
14556
- total: external_exports.number(),
14557
- reachable: external_exports.number(),
14558
- unreachable: external_exports.number()
14559
- })
14560
- });
14561
- var MODEL_FORMATS = [
14562
- "onnx",
14563
- "coreml",
14564
- "openvino",
14565
- "tflite",
14566
- "pt"
14567
- ];
14525
+ // ../types/dist/sleep-D7JeS58T.mjs
14568
14526
  var WELL_KNOWN_TABS = [
14569
14527
  {
14570
14528
  id: "overview",
@@ -14805,7 +14763,7 @@ var ProfileSlotSchema = external_exports.object({
14805
14763
  preBufferSec: external_exports.number().nonnegative().optional(),
14806
14764
  errorMessage: external_exports.string().optional()
14807
14765
  });
14808
- var StreamSourceEntrySchema = external_exports.object({
14766
+ var StreamSourceEntrySchema$1 = external_exports.object({
14809
14767
  id: external_exports.string(),
14810
14768
  label: external_exports.string(),
14811
14769
  protocol: external_exports.enum([
@@ -14908,67 +14866,419 @@ var SubscribeAudioChunksInputSchema = external_exports.object({
14908
14866
  /** Short caller-identity tag (`audio-analyzer`, …) for `listClients`. */
14909
14867
  tag: external_exports.string().optional()
14910
14868
  });
14911
- var SubscribeAudioChunksResultSchema = external_exports.object({
14912
- /** Opaque id passed to `pullAudioChunks` / `unsubscribeAudioChunks`. */
14913
- subscriptionId: external_exports.string()
14869
+ var SubscribeAudioChunksResultSchema = external_exports.object({
14870
+ /** Opaque id passed to `pullAudioChunks` / `unsubscribeAudioChunks`. */
14871
+ subscriptionId: external_exports.string()
14872
+ });
14873
+ var BrokerStatusSchema = external_exports.enum([
14874
+ "idle",
14875
+ "connecting",
14876
+ "streaming",
14877
+ "error",
14878
+ "stopped"
14879
+ ]);
14880
+ var BrokerStatsSchema = external_exports.object({
14881
+ status: BrokerStatusSchema,
14882
+ inputFps: external_exports.number(),
14883
+ decodeFps: external_exports.number(),
14884
+ encodedSubscribers: external_exports.number(),
14885
+ decodedSubscribers: external_exports.number(),
14886
+ uptimeMs: external_exports.number(),
14887
+ bitrateKbps: external_exports.number(),
14888
+ idrIntervalMs: external_exports.number(),
14889
+ codec: external_exports.string().optional(),
14890
+ totalBytes: external_exports.number(),
14891
+ packetCount: external_exports.number(),
14892
+ rtspClients: external_exports.number(),
14893
+ pipeClients: external_exports.number(),
14894
+ preBufferSec: external_exports.number(),
14895
+ preBufferMs: external_exports.number(),
14896
+ preBufferPackets: external_exports.number(),
14897
+ /**
14898
+ * Moleculer node id of the decoder provider currently servicing this
14899
+ * stream's decoded subscribers. `null` until the deferred decoder is
14900
+ * created (no decoded clients yet, or codec not detected). Surfaces the
14901
+ * runtime decoder placement so the UI can show "Decoder: <agent>" without
14902
+ * a separate cap call per broker.
14903
+ */
14904
+ decoderNodeId: external_exports.string().nullable(),
14905
+ /**
14906
+ * Detected audio track parameters from the RTSP DESCRIBE / SDP. `null`
14907
+ * when the stream has no audio track or the broker is in cold start.
14908
+ * `supported = false` means the codec was detected but the local
14909
+ * decoder pipeline cannot produce PCM chunks (e.g. AAC without the
14910
+ * AAC pipeline wired). Surfaced in the UI device-overview so operators
14911
+ * can pre-pick the audio-analysis model that matches the codec.
14912
+ */
14913
+ audio: external_exports.object({
14914
+ codec: external_exports.string(),
14915
+ sampleRate: external_exports.number(),
14916
+ channels: external_exports.number(),
14917
+ supported: external_exports.boolean()
14918
+ }).nullable().optional()
14919
+ });
14920
+ var ProfileRtspEntrySchema = external_exports.object({
14921
+ profile: CamProfileSchema,
14922
+ /** Profile-keyed broker id, format `${deviceId}/${profile}` (e.g. `"15/high"`). */
14923
+ brokerId: external_exports.string(),
14924
+ url: external_exports.string(),
14925
+ mutedUrl: external_exports.string(),
14926
+ enabled: external_exports.boolean(),
14927
+ codec: external_exports.string().optional(),
14928
+ resolution: CamStreamResolutionSchema.optional()
14929
+ });
14930
+ var DeviceType = /* @__PURE__ */ (function(DeviceType2) {
14931
+ DeviceType2["Camera"] = "camera";
14932
+ DeviceType2["Hub"] = "hub";
14933
+ DeviceType2["Light"] = "light";
14934
+ DeviceType2["Siren"] = "siren";
14935
+ DeviceType2["Switch"] = "switch";
14936
+ DeviceType2["Sensor"] = "sensor";
14937
+ DeviceType2["Thermostat"] = "thermostat";
14938
+ DeviceType2["Button"] = "button";
14939
+ DeviceType2["EventEmitter"] = "event-emitter";
14940
+ DeviceType2["Update"] = "update";
14941
+ DeviceType2["Generic"] = "generic";
14942
+ DeviceType2["Notifier"] = "notifier";
14943
+ DeviceType2["Script"] = "script";
14944
+ DeviceType2["Automation"] = "automation";
14945
+ DeviceType2["Lock"] = "lock";
14946
+ DeviceType2["Cover"] = "cover";
14947
+ DeviceType2["Valve"] = "valve";
14948
+ DeviceType2["Humidifier"] = "humidifier";
14949
+ DeviceType2["WaterHeater"] = "water-heater";
14950
+ DeviceType2["Fan"] = "fan";
14951
+ DeviceType2["MediaPlayer"] = "media-player";
14952
+ DeviceType2["AlarmPanel"] = "alarm-panel";
14953
+ DeviceType2["Control"] = "control";
14954
+ DeviceType2["Presence"] = "presence";
14955
+ DeviceType2["Weather"] = "weather";
14956
+ DeviceType2["Vacuum"] = "vacuum";
14957
+ DeviceType2["LawnMower"] = "lawn-mower";
14958
+ DeviceType2["Container"] = "container";
14959
+ DeviceType2["Image"] = "image";
14960
+ return DeviceType2;
14961
+ })({});
14962
+ var DeviceFeature = /* @__PURE__ */ (function(DeviceFeature2) {
14963
+ DeviceFeature2["BatteryOperated"] = "battery-operated";
14964
+ DeviceFeature2["Rebootable"] = "rebootable";
14965
+ DeviceFeature2["Resyncable"] = "resyncable";
14966
+ DeviceFeature2["NativeSnapshot"] = "native-snapshot";
14967
+ DeviceFeature2["DoorbellButton"] = "doorbell-button";
14968
+ DeviceFeature2["TwoWayAudio"] = "two-way-audio";
14969
+ DeviceFeature2["PanTiltZoom"] = "pan-tilt-zoom";
14970
+ DeviceFeature2["PtzAutotrack"] = "ptz-autotrack";
14971
+ DeviceFeature2["MotionTrigger"] = "motion-trigger";
14972
+ DeviceFeature2["LightColorRgb"] = "light-color-rgb";
14973
+ DeviceFeature2["LightColorHsv"] = "light-color-hsv";
14974
+ DeviceFeature2["LightColorMired"] = "light-color-mired";
14975
+ DeviceFeature2["ClimateDualSetpoint"] = "climate-dual-setpoint";
14976
+ DeviceFeature2["ClimateHumidity"] = "climate-humidity";
14977
+ DeviceFeature2["ClimateFanMode"] = "climate-fan-mode";
14978
+ DeviceFeature2["ClimatePreset"] = "climate-preset";
14979
+ DeviceFeature2["CoverPositionable"] = "cover-positionable";
14980
+ DeviceFeature2["CoverTilt"] = "cover-tilt";
14981
+ DeviceFeature2["ValvePositionable"] = "valve-positionable";
14982
+ DeviceFeature2["FanSpeed"] = "fan-speed";
14983
+ DeviceFeature2["FanPreset"] = "fan-preset";
14984
+ DeviceFeature2["FanDirection"] = "fan-direction";
14985
+ DeviceFeature2["FanOscillating"] = "fan-oscillating";
14986
+ DeviceFeature2["LockPinRequired"] = "lock-pin-required";
14987
+ DeviceFeature2["LockOpen"] = "lock-open";
14988
+ DeviceFeature2["MediaPlayerSeek"] = "media-player-seek";
14989
+ DeviceFeature2["MediaPlayerVolume"] = "media-player-volume";
14990
+ DeviceFeature2["MediaPlayerMute"] = "media-player-mute";
14991
+ DeviceFeature2["MediaPlayerShuffle"] = "media-player-shuffle";
14992
+ DeviceFeature2["MediaPlayerRepeat"] = "media-player-repeat";
14993
+ DeviceFeature2["MediaPlayerSelectSource"] = "media-player-select-source";
14994
+ DeviceFeature2["MediaPlayerPlayMedia"] = "media-player-play-media";
14995
+ DeviceFeature2["MediaPlayerNext"] = "media-player-next";
14996
+ DeviceFeature2["MediaPlayerPrevious"] = "media-player-previous";
14997
+ DeviceFeature2["MediaPlayerStop"] = "media-player-stop";
14998
+ DeviceFeature2["AlarmPinRequired"] = "alarm-pin-required";
14999
+ DeviceFeature2["PresenceGps"] = "presence-gps";
15000
+ DeviceFeature2["NotifierImage"] = "notifier-image";
15001
+ DeviceFeature2["NotifierPriority"] = "notifier-priority";
15002
+ DeviceFeature2["NotifierData"] = "notifier-data";
15003
+ DeviceFeature2["NotifierActions"] = "notifier-actions";
15004
+ DeviceFeature2["NotifierRecipients"] = "notifier-recipients";
15005
+ DeviceFeature2["ScriptVariables"] = "script-variables";
15006
+ DeviceFeature2["AutomationSkipCondition"] = "automation-skip-condition";
15007
+ return DeviceFeature2;
15008
+ })({});
15009
+ var DeviceRole = /* @__PURE__ */ (function(DeviceRole2) {
15010
+ DeviceRole2["Siren"] = "siren";
15011
+ DeviceRole2["Floodlight"] = "floodlight";
15012
+ DeviceRole2["Spotlight"] = "spotlight";
15013
+ DeviceRole2["PirSensor"] = "pir-sensor";
15014
+ DeviceRole2["Chime"] = "chime";
15015
+ DeviceRole2["Autotrack"] = "autotrack";
15016
+ DeviceRole2["Nightvision"] = "nightvision";
15017
+ DeviceRole2["PrivacyMask"] = "privacy-mask";
15018
+ DeviceRole2["Doorbell"] = "doorbell";
15019
+ DeviceRole2["BinaryHelper"] = "binary-helper";
15020
+ DeviceRole2["MotionSensor"] = "motion-sensor";
15021
+ DeviceRole2["ContactSensor"] = "contact-sensor";
15022
+ DeviceRole2["LeakSensor"] = "leak-sensor";
15023
+ DeviceRole2["SmokeSensor"] = "smoke-sensor";
15024
+ DeviceRole2["COSensor"] = "co-sensor";
15025
+ DeviceRole2["GasSensor"] = "gas-sensor";
15026
+ DeviceRole2["TamperSensor"] = "tamper-sensor";
15027
+ DeviceRole2["VibrationSensor"] = "vibration-sensor";
15028
+ DeviceRole2["ConnectivitySensor"] = "connectivity-sensor";
15029
+ DeviceRole2["SoundSensor"] = "sound-sensor";
15030
+ DeviceRole2["BinarySensor"] = "binary-sensor";
15031
+ DeviceRole2["TemperatureSensor"] = "temperature-sensor";
15032
+ DeviceRole2["HumiditySensor"] = "humidity-sensor";
15033
+ DeviceRole2["AmbientLightSensor"] = "ambient-light-sensor";
15034
+ DeviceRole2["PressureSensor"] = "pressure-sensor";
15035
+ DeviceRole2["PowerSensor"] = "power-sensor";
15036
+ DeviceRole2["EnergySensor"] = "energy-sensor";
15037
+ DeviceRole2["VoltageSensor"] = "voltage-sensor";
15038
+ DeviceRole2["CurrentSensor"] = "current-sensor";
15039
+ DeviceRole2["AirQualitySensor"] = "air-quality-sensor";
15040
+ DeviceRole2["BatterySensor"] = "battery-sensor";
15041
+ DeviceRole2["NumericSensor"] = "numeric-sensor";
15042
+ DeviceRole2["EnumSensor"] = "enum-sensor";
15043
+ DeviceRole2["DateTimeSensor"] = "datetime-sensor";
15044
+ DeviceRole2["GenericSensor"] = "generic-sensor";
15045
+ DeviceRole2["NumericControl"] = "numeric-control";
15046
+ DeviceRole2["SelectControl"] = "select-control";
15047
+ DeviceRole2["TextControl"] = "text-control";
15048
+ DeviceRole2["DateTimeControl"] = "datetime-control";
15049
+ DeviceRole2["MobilePushNotifier"] = "mobile-push-notifier";
15050
+ DeviceRole2["MessagingNotifier"] = "messaging-notifier";
15051
+ DeviceRole2["EmailNotifier"] = "email-notifier";
15052
+ DeviceRole2["GenericNotifier"] = "generic-notifier";
15053
+ return DeviceRole2;
15054
+ })({});
15055
+ var ContributionSectionSchema = external_exports.object({
15056
+ id: external_exports.string(),
15057
+ title: external_exports.string(),
15058
+ description: external_exports.string().optional(),
15059
+ style: external_exports.enum(["card", "accordion"]).optional(),
15060
+ defaultCollapsed: external_exports.boolean().optional(),
15061
+ columns: external_exports.union([
15062
+ external_exports.literal(1),
15063
+ external_exports.literal(2),
15064
+ external_exports.literal(3),
15065
+ external_exports.literal(4)
15066
+ ]).optional(),
15067
+ tab: external_exports.string().optional(),
15068
+ location: external_exports.enum(["settings", "top-tab"]).optional(),
15069
+ order: external_exports.number().optional(),
15070
+ fields: external_exports.array(external_exports.any())
15071
+ });
15072
+ var ContributionTabSchema = external_exports.object({
15073
+ id: external_exports.string(),
15074
+ label: external_exports.string(),
15075
+ icon: external_exports.string(),
15076
+ order: external_exports.number().optional()
15077
+ });
15078
+ var ContributionOutputSchema = external_exports.object({
15079
+ tabs: external_exports.array(ContributionTabSchema).optional(),
15080
+ sections: external_exports.array(ContributionSectionSchema)
15081
+ }).nullable();
15082
+ var DEVICE_SETTINGS_CONTRIBUTION_METHODS = {
15083
+ getDeviceSettingsContribution: {
15084
+ input: external_exports.object({ deviceId: external_exports.number() }),
15085
+ output: ContributionOutputSchema,
15086
+ kind: "query",
15087
+ auth: "protected"
15088
+ },
15089
+ getDeviceLiveContribution: {
15090
+ input: external_exports.object({ deviceId: external_exports.number() }),
15091
+ output: ContributionOutputSchema,
15092
+ kind: "query",
15093
+ auth: "protected"
15094
+ },
15095
+ applyDeviceSettingsPatch: {
15096
+ input: external_exports.object({
15097
+ deviceId: external_exports.number(),
15098
+ patch: external_exports.record(external_exports.string(), external_exports.unknown())
15099
+ }),
15100
+ output: external_exports.object({ success: external_exports.literal(true) }),
15101
+ kind: "mutation",
15102
+ auth: "admin"
15103
+ }
15104
+ };
15105
+ var DEVICE_STATUS_METHOD = { getStatus: {
15106
+ input: external_exports.object({ deviceId: external_exports.number() }),
15107
+ output: external_exports.unknown().nullable(),
15108
+ kind: "query",
15109
+ auth: "protected"
15110
+ } };
15111
+ function method(input, output, options) {
15112
+ return {
15113
+ input,
15114
+ output,
15115
+ kind: options?.kind ?? "query",
15116
+ auth: options?.auth ?? "protected",
15117
+ ...options?.access !== void 0 ? { access: options.access } : {},
15118
+ timeoutMs: options?.timeoutMs
15119
+ };
15120
+ }
15121
+ function event(data) {
15122
+ return { data };
15123
+ }
15124
+ var StaticDirOutputSchema = external_exports.object({ staticDir: external_exports.string() });
15125
+ var VersionOutputSchema = external_exports.object({ version: external_exports.string() });
15126
+ var adminUiCapability = {
15127
+ name: "admin-ui",
15128
+ scope: "system",
15129
+ mode: "singleton",
15130
+ internal: true,
15131
+ methods: {
15132
+ getStaticDir: method(external_exports.void(), StaticDirOutputSchema),
15133
+ getVersion: method(external_exports.void(), VersionOutputSchema)
15134
+ }
15135
+ };
15136
+ var StreamSourceEntrySchema = external_exports.object({
15137
+ id: external_exports.string(),
15138
+ label: external_exports.string(),
15139
+ protocol: external_exports.enum([
15140
+ "rtsp",
15141
+ "rtmp",
15142
+ "annexb",
15143
+ "http-mjpeg",
15144
+ "webrtc",
15145
+ "custom"
15146
+ ]),
15147
+ url: external_exports.string().optional(),
15148
+ resolution: external_exports.object({
15149
+ width: external_exports.number(),
15150
+ height: external_exports.number()
15151
+ }).optional(),
15152
+ fps: external_exports.number().optional(),
15153
+ bitrate: external_exports.number().optional(),
15154
+ codec: external_exports.string().optional(),
15155
+ profileHint: CamProfileSchema.optional(),
15156
+ sdp: external_exports.string().optional()
15157
+ });
15158
+ var ConfigEntrySchema = external_exports.object({
15159
+ key: external_exports.string(),
15160
+ value: external_exports.unknown()
15161
+ });
15162
+ var RawStateResultSchema = external_exports.object({
15163
+ /** Originating provider id, e.g. 'homeassistant' | 'reolink' | 'hikvision'. */
15164
+ source: external_exports.string(),
15165
+ /** Opaque, DISPLAY-SAFE upstream blob (no secrets/PII). */
15166
+ data: external_exports.record(external_exports.string(), external_exports.unknown())
15167
+ });
15168
+ var deviceOpsCapability = {
15169
+ name: "device-ops",
15170
+ scope: "device",
15171
+ deviceNative: true,
15172
+ mode: "singleton",
15173
+ methods: {
15174
+ /**
15175
+ * Return stream sources for camera-like devices. Non-camera devices
15176
+ * return an empty array (the bridge did the same; preserved for compat).
15177
+ */
15178
+ getStreamSources: method(external_exports.object({ deviceId: external_exports.number() }), external_exports.array(StreamSourceEntrySchema)),
15179
+ /**
15180
+ * Return the device's config entries (key + current value). Used by
15181
+ * the device-manager aggregator when reading the driver's schema+values.
15182
+ */
15183
+ getConfigEntries: method(external_exports.object({ deviceId: external_exports.number() }), external_exports.array(ConfigEntrySchema)),
15184
+ /**
15185
+ * Bulk-apply a config patch via `IDevice.config.setAll`. Covers the
15186
+ * updateConfig / setStreamProfileMap / enable-as-config paths from
15187
+ * the old bridge.
15188
+ */
15189
+ setConfig: method(external_exports.object({
15190
+ deviceId: external_exports.number(),
15191
+ values: external_exports.record(external_exports.string(), external_exports.unknown())
15192
+ }), external_exports.void(), { kind: "mutation" }),
15193
+ /**
15194
+ * Invoke a device custom action on a forked/remote device (the
15195
+ * cross-process transport for `IDevice.runDeviceAction`). Mirrors
15196
+ * `setConfig` — the device-manager calls this when the device is not
15197
+ * hub-local.
15198
+ */
15199
+ runAction: method(external_exports.object({
15200
+ deviceId: external_exports.number(),
15201
+ action: external_exports.string().min(1),
15202
+ input: external_exports.unknown()
15203
+ }), external_exports.unknown(), { kind: "mutation" }),
15204
+ /**
15205
+ * Invoke `IDevice.removeDevice()` so the driver can release resources
15206
+ * (close sockets, stop background tasks, …). The device-manager still
15207
+ * performs its own persistence cleanup before/after this call.
15208
+ */
15209
+ removeDevice: method(external_exports.object({ deviceId: external_exports.number() }), external_exports.void(), { kind: "mutation" }),
15210
+ /**
15211
+ * Build the ConfigUISchema (FormBuilder input shape) from the device's
15212
+ * Zod config schema. Runs on the worker that owns the IDevice so the
15213
+ * Zod types stay local (they're function references, not
15214
+ * serializable). Returns a fully JSON-serializable schema with
15215
+ * sections/fields the admin UI renders directly.
15216
+ *
15217
+ * Needed because the hub-side `device-manager.getSettingsSchema`
15218
+ * couldn't reach forked-worker devices — it had no registry entry
15219
+ * and no cross-process lookup, so the UI silently rendered an empty
15220
+ * settings panel for every worker-owned device.
15221
+ *
15222
+ * Returns `null` when the device isn't found on this worker.
15223
+ */
15224
+ getSettingsSchema: method(external_exports.object({ deviceId: external_exports.number() }), external_exports.unknown().nullable()),
15225
+ /**
15226
+ * Opt-in: return the device's RAW upstream state (the provider's
15227
+ * cached values) as a display-safe `{ source, data }` blob. Returns
15228
+ * `null` when the device exposes no raw state — the State panel hides
15229
+ * its Raw toggle in that case. One-shot (read the provider's existing
15230
+ * cache; no upstream round-trip).
15231
+ */
15232
+ getRawState: method(external_exports.object({ deviceId: external_exports.number() }), RawStateResultSchema.nullable(), { auth: "protected" })
15233
+ }
15234
+ };
15235
+ function sleep(ms) {
15236
+ return new Promise((resolve) => setTimeout(resolve, Math.max(0, ms)));
15237
+ }
15238
+
15239
+ // ../types/dist/index.mjs
15240
+ var wiringProbeKindSchema = external_exports.enum([
15241
+ "singleton",
15242
+ "device",
15243
+ "widget"
15244
+ ]);
15245
+ var wiringProbeResultSchema = external_exports.object({
15246
+ capName: external_exports.string(),
15247
+ kind: wiringProbeKindSchema,
15248
+ deviceId: external_exports.number().optional(),
15249
+ reachable: external_exports.boolean(),
15250
+ latencyMs: external_exports.number(),
15251
+ error: external_exports.string().optional()
15252
+ });
15253
+ var wiringAddonHealthSchema = external_exports.object({
15254
+ addonId: external_exports.string(),
15255
+ caps: external_exports.array(wiringProbeResultSchema).readonly(),
15256
+ widgets: external_exports.array(wiringProbeResultSchema).readonly()
14914
15257
  });
14915
- var BrokerStatusSchema = external_exports.enum([
14916
- "idle",
14917
- "connecting",
14918
- "streaming",
14919
- "error",
14920
- "stopped"
14921
- ]);
14922
- var BrokerStatsSchema = external_exports.object({
14923
- status: BrokerStatusSchema,
14924
- inputFps: external_exports.number(),
14925
- decodeFps: external_exports.number(),
14926
- encodedSubscribers: external_exports.number(),
14927
- decodedSubscribers: external_exports.number(),
14928
- uptimeMs: external_exports.number(),
14929
- bitrateKbps: external_exports.number(),
14930
- idrIntervalMs: external_exports.number(),
14931
- codec: external_exports.string().optional(),
14932
- totalBytes: external_exports.number(),
14933
- packetCount: external_exports.number(),
14934
- rtspClients: external_exports.number(),
14935
- pipeClients: external_exports.number(),
14936
- preBufferSec: external_exports.number(),
14937
- preBufferMs: external_exports.number(),
14938
- preBufferPackets: external_exports.number(),
14939
- /**
14940
- * Moleculer node id of the decoder provider currently servicing this
14941
- * stream's decoded subscribers. `null` until the deferred decoder is
14942
- * created (no decoded clients yet, or codec not detected). Surfaces the
14943
- * runtime decoder placement so the UI can show "Decoder: <agent>" without
14944
- * a separate cap call per broker.
14945
- */
14946
- decoderNodeId: external_exports.string().nullable(),
14947
- /**
14948
- * Detected audio track parameters from the RTSP DESCRIBE / SDP. `null`
14949
- * when the stream has no audio track or the broker is in cold start.
14950
- * `supported = false` means the codec was detected but the local
14951
- * decoder pipeline cannot produce PCM chunks (e.g. AAC without the
14952
- * AAC pipeline wired). Surfaced in the UI device-overview so operators
14953
- * can pre-pick the audio-analysis model that matches the codec.
14954
- */
14955
- audio: external_exports.object({
14956
- codec: external_exports.string(),
14957
- sampleRate: external_exports.number(),
14958
- channels: external_exports.number(),
14959
- supported: external_exports.boolean()
14960
- }).nullable().optional()
15258
+ var wiringNodeHealthSchema = external_exports.object({
15259
+ nodeId: external_exports.string(),
15260
+ addons: external_exports.array(wiringAddonHealthSchema).readonly()
14961
15261
  });
14962
- var ProfileRtspEntrySchema = external_exports.object({
14963
- profile: CamProfileSchema,
14964
- /** Profile-keyed broker id, format `${deviceId}/${profile}` (e.g. `"15/high"`). */
14965
- brokerId: external_exports.string(),
14966
- url: external_exports.string(),
14967
- mutedUrl: external_exports.string(),
14968
- enabled: external_exports.boolean(),
14969
- codec: external_exports.string().optional(),
14970
- resolution: CamStreamResolutionSchema.optional()
15262
+ var wiringHealthSnapshotSchema = external_exports.object({
15263
+ /** True only when every probed target is reachable. */
15264
+ ok: external_exports.boolean(),
15265
+ /** True when at least one target is unreachable. */
15266
+ degraded: external_exports.boolean(),
15267
+ checkedAt: external_exports.string(),
15268
+ nodes: external_exports.array(wiringNodeHealthSchema).readonly(),
15269
+ summary: external_exports.object({
15270
+ total: external_exports.number(),
15271
+ reachable: external_exports.number(),
15272
+ unreachable: external_exports.number()
15273
+ })
14971
15274
  });
15275
+ var MODEL_FORMATS = [
15276
+ "onnx",
15277
+ "coreml",
15278
+ "openvino",
15279
+ "tflite",
15280
+ "pt"
15281
+ ];
14972
15282
  var RecordingWeekdaySchema = external_exports.number().int().min(0).max(6);
14973
15283
  var HHMM = /^([01]\d|2[0-3]):[0-5]\d$/;
14974
15284
  var RecordingScheduleSchema = external_exports.discriminatedUnion("kind", [external_exports.object({ kind: external_exports.literal("always") }), external_exports.object({
@@ -15477,131 +15787,6 @@ var APPLE_SA_TO_MACRO = {
15477
15787
  var _macroLookup = /* @__PURE__ */ new Map();
15478
15788
  for (const [k, v] of Object.entries(YAMNET_TO_MACRO.mapping)) _macroLookup.set(k.toLowerCase(), v);
15479
15789
  for (const [k, v] of Object.entries(APPLE_SA_TO_MACRO.mapping)) _macroLookup.set(k.toLowerCase(), v);
15480
- var DeviceType = /* @__PURE__ */ (function(DeviceType2) {
15481
- DeviceType2["Camera"] = "camera";
15482
- DeviceType2["Hub"] = "hub";
15483
- DeviceType2["Light"] = "light";
15484
- DeviceType2["Siren"] = "siren";
15485
- DeviceType2["Switch"] = "switch";
15486
- DeviceType2["Sensor"] = "sensor";
15487
- DeviceType2["Thermostat"] = "thermostat";
15488
- DeviceType2["Button"] = "button";
15489
- DeviceType2["EventEmitter"] = "event-emitter";
15490
- DeviceType2["Update"] = "update";
15491
- DeviceType2["Generic"] = "generic";
15492
- DeviceType2["Notifier"] = "notifier";
15493
- DeviceType2["Script"] = "script";
15494
- DeviceType2["Automation"] = "automation";
15495
- DeviceType2["Lock"] = "lock";
15496
- DeviceType2["Cover"] = "cover";
15497
- DeviceType2["Valve"] = "valve";
15498
- DeviceType2["Humidifier"] = "humidifier";
15499
- DeviceType2["WaterHeater"] = "water-heater";
15500
- DeviceType2["Fan"] = "fan";
15501
- DeviceType2["MediaPlayer"] = "media-player";
15502
- DeviceType2["AlarmPanel"] = "alarm-panel";
15503
- DeviceType2["Control"] = "control";
15504
- DeviceType2["Presence"] = "presence";
15505
- DeviceType2["Weather"] = "weather";
15506
- DeviceType2["Vacuum"] = "vacuum";
15507
- DeviceType2["LawnMower"] = "lawn-mower";
15508
- DeviceType2["Container"] = "container";
15509
- DeviceType2["Image"] = "image";
15510
- return DeviceType2;
15511
- })({});
15512
- var DeviceFeature = /* @__PURE__ */ (function(DeviceFeature2) {
15513
- DeviceFeature2["BatteryOperated"] = "battery-operated";
15514
- DeviceFeature2["Rebootable"] = "rebootable";
15515
- DeviceFeature2["Resyncable"] = "resyncable";
15516
- DeviceFeature2["NativeSnapshot"] = "native-snapshot";
15517
- DeviceFeature2["DoorbellButton"] = "doorbell-button";
15518
- DeviceFeature2["TwoWayAudio"] = "two-way-audio";
15519
- DeviceFeature2["PanTiltZoom"] = "pan-tilt-zoom";
15520
- DeviceFeature2["PtzAutotrack"] = "ptz-autotrack";
15521
- DeviceFeature2["MotionTrigger"] = "motion-trigger";
15522
- DeviceFeature2["LightColorRgb"] = "light-color-rgb";
15523
- DeviceFeature2["LightColorHsv"] = "light-color-hsv";
15524
- DeviceFeature2["LightColorMired"] = "light-color-mired";
15525
- DeviceFeature2["ClimateDualSetpoint"] = "climate-dual-setpoint";
15526
- DeviceFeature2["ClimateHumidity"] = "climate-humidity";
15527
- DeviceFeature2["ClimateFanMode"] = "climate-fan-mode";
15528
- DeviceFeature2["ClimatePreset"] = "climate-preset";
15529
- DeviceFeature2["CoverPositionable"] = "cover-positionable";
15530
- DeviceFeature2["CoverTilt"] = "cover-tilt";
15531
- DeviceFeature2["ValvePositionable"] = "valve-positionable";
15532
- DeviceFeature2["FanSpeed"] = "fan-speed";
15533
- DeviceFeature2["FanPreset"] = "fan-preset";
15534
- DeviceFeature2["FanDirection"] = "fan-direction";
15535
- DeviceFeature2["FanOscillating"] = "fan-oscillating";
15536
- DeviceFeature2["LockPinRequired"] = "lock-pin-required";
15537
- DeviceFeature2["LockOpen"] = "lock-open";
15538
- DeviceFeature2["MediaPlayerSeek"] = "media-player-seek";
15539
- DeviceFeature2["MediaPlayerVolume"] = "media-player-volume";
15540
- DeviceFeature2["MediaPlayerMute"] = "media-player-mute";
15541
- DeviceFeature2["MediaPlayerShuffle"] = "media-player-shuffle";
15542
- DeviceFeature2["MediaPlayerRepeat"] = "media-player-repeat";
15543
- DeviceFeature2["MediaPlayerSelectSource"] = "media-player-select-source";
15544
- DeviceFeature2["MediaPlayerPlayMedia"] = "media-player-play-media";
15545
- DeviceFeature2["MediaPlayerNext"] = "media-player-next";
15546
- DeviceFeature2["MediaPlayerPrevious"] = "media-player-previous";
15547
- DeviceFeature2["MediaPlayerStop"] = "media-player-stop";
15548
- DeviceFeature2["AlarmPinRequired"] = "alarm-pin-required";
15549
- DeviceFeature2["PresenceGps"] = "presence-gps";
15550
- DeviceFeature2["NotifierImage"] = "notifier-image";
15551
- DeviceFeature2["NotifierPriority"] = "notifier-priority";
15552
- DeviceFeature2["NotifierData"] = "notifier-data";
15553
- DeviceFeature2["NotifierActions"] = "notifier-actions";
15554
- DeviceFeature2["NotifierRecipients"] = "notifier-recipients";
15555
- DeviceFeature2["ScriptVariables"] = "script-variables";
15556
- DeviceFeature2["AutomationSkipCondition"] = "automation-skip-condition";
15557
- return DeviceFeature2;
15558
- })({});
15559
- var DeviceRole = /* @__PURE__ */ (function(DeviceRole2) {
15560
- DeviceRole2["Siren"] = "siren";
15561
- DeviceRole2["Floodlight"] = "floodlight";
15562
- DeviceRole2["Spotlight"] = "spotlight";
15563
- DeviceRole2["PirSensor"] = "pir-sensor";
15564
- DeviceRole2["Chime"] = "chime";
15565
- DeviceRole2["Autotrack"] = "autotrack";
15566
- DeviceRole2["Nightvision"] = "nightvision";
15567
- DeviceRole2["PrivacyMask"] = "privacy-mask";
15568
- DeviceRole2["Doorbell"] = "doorbell";
15569
- DeviceRole2["BinaryHelper"] = "binary-helper";
15570
- DeviceRole2["MotionSensor"] = "motion-sensor";
15571
- DeviceRole2["ContactSensor"] = "contact-sensor";
15572
- DeviceRole2["LeakSensor"] = "leak-sensor";
15573
- DeviceRole2["SmokeSensor"] = "smoke-sensor";
15574
- DeviceRole2["COSensor"] = "co-sensor";
15575
- DeviceRole2["GasSensor"] = "gas-sensor";
15576
- DeviceRole2["TamperSensor"] = "tamper-sensor";
15577
- DeviceRole2["VibrationSensor"] = "vibration-sensor";
15578
- DeviceRole2["ConnectivitySensor"] = "connectivity-sensor";
15579
- DeviceRole2["SoundSensor"] = "sound-sensor";
15580
- DeviceRole2["BinarySensor"] = "binary-sensor";
15581
- DeviceRole2["TemperatureSensor"] = "temperature-sensor";
15582
- DeviceRole2["HumiditySensor"] = "humidity-sensor";
15583
- DeviceRole2["AmbientLightSensor"] = "ambient-light-sensor";
15584
- DeviceRole2["PressureSensor"] = "pressure-sensor";
15585
- DeviceRole2["PowerSensor"] = "power-sensor";
15586
- DeviceRole2["EnergySensor"] = "energy-sensor";
15587
- DeviceRole2["VoltageSensor"] = "voltage-sensor";
15588
- DeviceRole2["CurrentSensor"] = "current-sensor";
15589
- DeviceRole2["AirQualitySensor"] = "air-quality-sensor";
15590
- DeviceRole2["BatterySensor"] = "battery-sensor";
15591
- DeviceRole2["NumericSensor"] = "numeric-sensor";
15592
- DeviceRole2["EnumSensor"] = "enum-sensor";
15593
- DeviceRole2["DateTimeSensor"] = "datetime-sensor";
15594
- DeviceRole2["GenericSensor"] = "generic-sensor";
15595
- DeviceRole2["NumericControl"] = "numeric-control";
15596
- DeviceRole2["SelectControl"] = "select-control";
15597
- DeviceRole2["TextControl"] = "text-control";
15598
- DeviceRole2["DateTimeControl"] = "datetime-control";
15599
- DeviceRole2["MobilePushNotifier"] = "mobile-push-notifier";
15600
- DeviceRole2["MessagingNotifier"] = "messaging-notifier";
15601
- DeviceRole2["EmailNotifier"] = "email-notifier";
15602
- DeviceRole2["GenericNotifier"] = "generic-notifier";
15603
- return DeviceRole2;
15604
- })({});
15605
15790
  var AccessoryKind = {
15606
15791
  Siren: DeviceRole.Siren,
15607
15792
  Floodlight: DeviceRole.Floodlight,
@@ -15752,81 +15937,12 @@ var airQualitySensorCapability = {
15752
15937
  mode: "singleton",
15753
15938
  deviceTypes: [DeviceType.Sensor],
15754
15939
  methods: {},
15755
- status: {
15756
- schema: AirQualitySensorStatusSchema,
15757
- kind: "push"
15758
- },
15759
- runtimeState: AirQualitySensorStatusSchema
15760
- };
15761
- var ContributionSectionSchema = external_exports.object({
15762
- id: external_exports.string(),
15763
- title: external_exports.string(),
15764
- description: external_exports.string().optional(),
15765
- style: external_exports.enum(["card", "accordion"]).optional(),
15766
- defaultCollapsed: external_exports.boolean().optional(),
15767
- columns: external_exports.union([
15768
- external_exports.literal(1),
15769
- external_exports.literal(2),
15770
- external_exports.literal(3),
15771
- external_exports.literal(4)
15772
- ]).optional(),
15773
- tab: external_exports.string().optional(),
15774
- location: external_exports.enum(["settings", "top-tab"]).optional(),
15775
- order: external_exports.number().optional(),
15776
- fields: external_exports.array(external_exports.any())
15777
- });
15778
- var ContributionTabSchema = external_exports.object({
15779
- id: external_exports.string(),
15780
- label: external_exports.string(),
15781
- icon: external_exports.string(),
15782
- order: external_exports.number().optional()
15783
- });
15784
- var ContributionOutputSchema = external_exports.object({
15785
- tabs: external_exports.array(ContributionTabSchema).optional(),
15786
- sections: external_exports.array(ContributionSectionSchema)
15787
- }).nullable();
15788
- var DEVICE_SETTINGS_CONTRIBUTION_METHODS = {
15789
- getDeviceSettingsContribution: {
15790
- input: external_exports.object({ deviceId: external_exports.number() }),
15791
- output: ContributionOutputSchema,
15792
- kind: "query",
15793
- auth: "protected"
15794
- },
15795
- getDeviceLiveContribution: {
15796
- input: external_exports.object({ deviceId: external_exports.number() }),
15797
- output: ContributionOutputSchema,
15798
- kind: "query",
15799
- auth: "protected"
15940
+ status: {
15941
+ schema: AirQualitySensorStatusSchema,
15942
+ kind: "push"
15800
15943
  },
15801
- applyDeviceSettingsPatch: {
15802
- input: external_exports.object({
15803
- deviceId: external_exports.number(),
15804
- patch: external_exports.record(external_exports.string(), external_exports.unknown())
15805
- }),
15806
- output: external_exports.object({ success: external_exports.literal(true) }),
15807
- kind: "mutation",
15808
- auth: "admin"
15809
- }
15944
+ runtimeState: AirQualitySensorStatusSchema
15810
15945
  };
15811
- var DEVICE_STATUS_METHOD = { getStatus: {
15812
- input: external_exports.object({ deviceId: external_exports.number() }),
15813
- output: external_exports.unknown().nullable(),
15814
- kind: "query",
15815
- auth: "protected"
15816
- } };
15817
- function method(input, output, options) {
15818
- return {
15819
- input,
15820
- output,
15821
- kind: options?.kind ?? "query",
15822
- auth: options?.auth ?? "protected",
15823
- ...options?.access !== void 0 ? { access: options.access } : {},
15824
- timeoutMs: options?.timeoutMs
15825
- };
15826
- }
15827
- function event(data) {
15828
- return { data };
15829
- }
15830
15946
  var AlarmStateSchema = external_exports.enum([
15831
15947
  "disarmed",
15832
15948
  "armed_home",
@@ -18242,6 +18358,24 @@ var DetectorOutputSchema = external_exports.object({
18242
18358
  inferenceMs: external_exports.number(),
18243
18359
  modelId: external_exports.string()
18244
18360
  });
18361
+ var EngineProvisioningSchema = external_exports.object({
18362
+ runtimeId: external_exports.enum([
18363
+ "onnx",
18364
+ "openvino",
18365
+ "coreml"
18366
+ ]).nullable(),
18367
+ device: external_exports.string().nullable(),
18368
+ state: external_exports.enum([
18369
+ "idle",
18370
+ "installing",
18371
+ "verifying",
18372
+ "ready",
18373
+ "failed"
18374
+ ]),
18375
+ progress: external_exports.number().optional(),
18376
+ error: external_exports.string().optional(),
18377
+ nextRetryAt: external_exports.number().optional()
18378
+ });
18245
18379
  var PipelineStepInputSchema = external_exports.lazy(() => external_exports.object({
18246
18380
  addonId: external_exports.string(),
18247
18381
  modelId: external_exports.string(),
@@ -18319,6 +18453,15 @@ var pipelineExecutorCapability = {
18319
18453
  kind: "mutation",
18320
18454
  auth: "admin"
18321
18455
  }),
18456
+ /**
18457
+ * Per-node detection-engine provisioning snapshot. Returns the live
18458
+ * state of the lazy runtime-provisioning machine on `nodeId`
18459
+ * (idle / installing / verifying / ready / failed). The UI pairs this
18460
+ * one-shot query with the `pipeline.engine-provisioning` live event
18461
+ * (emitted on every transition) to drive a per-node "engine ready?"
18462
+ * indicator without polling. Phase 2.
18463
+ */
18464
+ getEngineProvisioning: method(external_exports.object({ nodeId: external_exports.string() }), EngineProvisioningSchema),
18322
18465
  getVideoPipelineSteps: method(external_exports.void(), external_exports.record(external_exports.string(), external_exports.object({
18323
18466
  modelId: external_exports.string(),
18324
18467
  settings: external_exports.record(external_exports.string(), external_exports.unknown()).readonly()
@@ -21070,18 +21213,6 @@ var logDestinationCapability = {
21070
21213
  }), external_exports.array(LogEntrySchema).readonly())
21071
21214
  }
21072
21215
  };
21073
- var StaticDirOutputSchema = external_exports.object({ staticDir: external_exports.string() });
21074
- var VersionOutputSchema = external_exports.object({ version: external_exports.string() });
21075
- var adminUiCapability = {
21076
- name: "admin-ui",
21077
- scope: "system",
21078
- mode: "singleton",
21079
- internal: true,
21080
- methods: {
21081
- getStaticDir: method(external_exports.void(), StaticDirOutputSchema),
21082
- getVersion: method(external_exports.void(), VersionOutputSchema)
21083
- }
21084
- };
21085
21216
  var MethodAccessSchema = external_exports.enum([
21086
21217
  "view",
21087
21218
  "create",
@@ -22474,7 +22605,10 @@ var AgentAddonConfigSchema = external_exports.object({
22474
22605
  modelId: external_exports.string(),
22475
22606
  settings: external_exports.record(external_exports.string(), external_exports.unknown()).readonly()
22476
22607
  });
22477
- var AgentPipelineSettingsSchema = external_exports.object({ addonDefaults: external_exports.record(external_exports.string(), AgentAddonConfigSchema).readonly() });
22608
+ var AgentPipelineSettingsSchema = external_exports.object({
22609
+ addonDefaults: external_exports.record(external_exports.string(), AgentAddonConfigSchema).readonly(),
22610
+ maxCameras: external_exports.number().int().nonnegative().nullable().default(null)
22611
+ });
22478
22612
  var CameraPipelineForAgentSchema = external_exports.object({
22479
22613
  steps: external_exports.array(PipelineStepInputSchema).readonly(),
22480
22614
  audio: external_exports.object({
@@ -22543,6 +22677,117 @@ var GlobalMetricsSchema = external_exports.object({
22543
22677
  queueDepth: external_exports.number()
22544
22678
  });
22545
22679
  var CapabilityBindingsSchema = external_exports.record(external_exports.string(), external_exports.string());
22680
+ var CameraSourceStreamSchema = external_exports.object({
22681
+ camStreamId: external_exports.string(),
22682
+ codec: external_exports.string(),
22683
+ width: external_exports.number(),
22684
+ height: external_exports.number(),
22685
+ fps: external_exports.number(),
22686
+ kind: external_exports.string()
22687
+ });
22688
+ var CameraSourceStatusSchema = external_exports.object({ streams: external_exports.array(CameraSourceStreamSchema).readonly() });
22689
+ var CameraAssignmentStatusSchema = external_exports.object({
22690
+ detectionNodeId: external_exports.string().nullable(),
22691
+ decoderNodeId: external_exports.string().nullable(),
22692
+ audioNodeId: external_exports.string().nullable(),
22693
+ pinned: external_exports.object({
22694
+ detection: external_exports.boolean(),
22695
+ decoder: external_exports.boolean(),
22696
+ audio: external_exports.boolean()
22697
+ }),
22698
+ reasons: external_exports.object({
22699
+ detection: external_exports.string().optional(),
22700
+ decoder: external_exports.string().optional(),
22701
+ audio: external_exports.string().optional()
22702
+ })
22703
+ });
22704
+ var CameraBrokerProfileSchema = external_exports.object({
22705
+ profile: external_exports.string(),
22706
+ status: external_exports.string(),
22707
+ codec: external_exports.string(),
22708
+ width: external_exports.number(),
22709
+ height: external_exports.number(),
22710
+ subscribers: external_exports.number(),
22711
+ inFps: external_exports.number(),
22712
+ outFps: external_exports.number()
22713
+ });
22714
+ var CameraBrokerStatusSchema = external_exports.object({
22715
+ profiles: external_exports.array(CameraBrokerProfileSchema).readonly(),
22716
+ webrtcSessions: external_exports.number(),
22717
+ rtspRestream: external_exports.boolean()
22718
+ });
22719
+ var CameraDecoderShmSchema = external_exports.object({
22720
+ framesWritten: external_exports.number(),
22721
+ getFrameHits: external_exports.number(),
22722
+ getFrameMisses: external_exports.number(),
22723
+ budgetMb: external_exports.number()
22724
+ });
22725
+ var CameraDecoderStatusSchema = external_exports.object({
22726
+ nodeId: external_exports.string(),
22727
+ formats: external_exports.array(external_exports.string()).readonly(),
22728
+ sessionCount: external_exports.number(),
22729
+ shm: CameraDecoderShmSchema
22730
+ });
22731
+ var CameraMotionStatusSchema = external_exports.object({
22732
+ enabled: external_exports.boolean(),
22733
+ fps: external_exports.number()
22734
+ });
22735
+ var CameraDetectionProvisioningStateSchema = external_exports.enum([
22736
+ "idle",
22737
+ "installing",
22738
+ "verifying",
22739
+ "ready",
22740
+ "failed"
22741
+ ]);
22742
+ var CameraDetectionProvisioningSchema = external_exports.object({
22743
+ state: CameraDetectionProvisioningStateSchema,
22744
+ error: external_exports.string().optional()
22745
+ });
22746
+ var CameraDetectionPhaseSchema = external_exports.enum([
22747
+ "idle",
22748
+ "watching",
22749
+ "active"
22750
+ ]);
22751
+ var CameraDetectionStatusSchema = external_exports.object({
22752
+ nodeId: external_exports.string(),
22753
+ engine: external_exports.object({
22754
+ backend: external_exports.string(),
22755
+ device: external_exports.string()
22756
+ }),
22757
+ phase: CameraDetectionPhaseSchema,
22758
+ configuredFps: external_exports.number(),
22759
+ actualFps: external_exports.number(),
22760
+ queueDepth: external_exports.number(),
22761
+ avgInferenceMs: external_exports.number(),
22762
+ provisioning: CameraDetectionProvisioningSchema
22763
+ });
22764
+ var CameraAudioStatusSchema = external_exports.object({
22765
+ nodeId: external_exports.string(),
22766
+ enabled: external_exports.boolean()
22767
+ });
22768
+ var CameraRecordingModeSchema = external_exports.enum([
22769
+ "off",
22770
+ "continuous",
22771
+ "events"
22772
+ ]);
22773
+ var CameraRecordingStatusSchema = external_exports.object({
22774
+ mode: CameraRecordingModeSchema,
22775
+ active: external_exports.boolean(),
22776
+ storageBytes: external_exports.number()
22777
+ });
22778
+ var CameraStatusSchema = external_exports.object({
22779
+ deviceId: external_exports.number(),
22780
+ assignment: CameraAssignmentStatusSchema,
22781
+ source: CameraSourceStatusSchema,
22782
+ broker: CameraBrokerStatusSchema.nullable(),
22783
+ decoder: CameraDecoderStatusSchema.nullable(),
22784
+ motion: CameraMotionStatusSchema.nullable(),
22785
+ detection: CameraDetectionStatusSchema.nullable(),
22786
+ audio: CameraAudioStatusSchema.nullable(),
22787
+ recording: CameraRecordingStatusSchema.nullable(),
22788
+ /** Unix timestamp (ms) when this snapshot was composed server-side. */
22789
+ fetchedAt: external_exports.number()
22790
+ });
22546
22791
  var pipelineOrchestratorCapability = {
22547
22792
  name: "pipeline-orchestrator",
22548
22793
  scope: "system",
@@ -22707,6 +22952,25 @@ var pipelineOrchestratorCapability = {
22707
22952
  kind: "mutation",
22708
22953
  auth: "admin"
22709
22954
  }),
22955
+ /**
22956
+ * Set the per-node camera cap for one agent.
22957
+ *
22958
+ * `maxCameras: 0` and `maxCameras: null` are both treated as unlimited
22959
+ * by the load balancer (0 is stored as-is; the balancer treats ≤0 as
22960
+ * unlimited alongside null). Pass `null` to clear an existing cap.
22961
+ * Note: the admin UI normalises 0→null before calling this method, so
22962
+ * `maxCameras: 0` only reaches the store via direct SDK or CLI calls.
22963
+ * Changes take effect immediately on the next dispatch cycle — cameras
22964
+ * currently assigned over-cap are left in place (no forced eviction),
22965
+ * but new assignments obey the updated cap.
22966
+ */
22967
+ setAgentMaxCameras: method(external_exports.object({
22968
+ agentNodeId: external_exports.string(),
22969
+ maxCameras: external_exports.number().int().nonnegative().nullable()
22970
+ }), external_exports.object({ success: external_exports.literal(true) }), {
22971
+ kind: "mutation",
22972
+ auth: "admin"
22973
+ }),
22710
22974
  /** Read one camera's settings. Null when never touched (inherits agent defaults fully). */
22711
22975
  getCameraSettings: method(external_exports.object({ deviceId: external_exports.number() }), CameraPipelineSettingsSchema.nullable()),
22712
22976
  /** Set or clear the 3-state toggle for one (camera, addonId). Pass `enabled: null` to clear and revert to agent default. */
@@ -22747,6 +23011,29 @@ var pipelineOrchestratorCapability = {
22747
23011
  deviceId: external_exports.number(),
22748
23012
  agentNodeId: external_exports.string().optional()
22749
23013
  }), CameraPipelineConfigSchema),
23014
+ /**
23015
+ * Server-composed aggregated status for a single camera.
23016
+ *
23017
+ * Fans out in parallel (bounded, per-stage graceful degradation) to
23018
+ * broker / decoder / motion / detection / audio / recording source caps
23019
+ * via `ctx.api`. A stage whose source errors or times out becomes `null`
23020
+ * in the returned payload — one slow agent never breaks the whole call.
23021
+ *
23022
+ * Intended for "on open / on camera select" snapshots. Live deltas
23023
+ * keep arriving from the existing ~1Hz events the UI already subscribes to.
23024
+ */
23025
+ getCameraStatus: method(external_exports.object({ deviceId: external_exports.number() }), CameraStatusSchema),
23026
+ /**
23027
+ * Server-composed aggregated status for multiple cameras in one call.
23028
+ *
23029
+ * `deviceIds` defaults to all cameras currently tracked by the
23030
+ * orchestrator's assignment map when omitted.
23031
+ *
23032
+ * Runs per-device composition in parallel (bounded). Use this to
23033
+ * populate the cluster assignments table and the pipeline flow overview
23034
+ * rail without issuing N parallel browser round-trips.
23035
+ */
23036
+ getCameraStatuses: method(external_exports.object({ deviceIds: external_exports.array(external_exports.number()).optional() }), external_exports.array(CameraStatusSchema).readonly()),
22750
23037
  /** List every template the operator has saved. */
22751
23038
  listTemplates: method(external_exports.void(), external_exports.array(PipelineTemplateSchema).readonly()),
22752
23039
  /** Create a new named preset from a given CameraPipelineConfig. */
@@ -23074,7 +23361,7 @@ var DeviceInfoSchema = external_exports.object({
23074
23361
  /** Operator-authored cross-device field wirings. See `DeviceMeta.deviceLinks`. */
23075
23362
  deviceLinks: external_exports.array(DeviceLinkSchema).readonly().optional()
23076
23363
  });
23077
- var ConfigEntrySchema = external_exports.object({
23364
+ var ConfigEntrySchema2 = external_exports.object({
23078
23365
  key: external_exports.string(),
23079
23366
  value: external_exports.unknown(),
23080
23367
  description: external_exports.string().optional()
@@ -23387,9 +23674,9 @@ var deviceManagerCapability = {
23387
23674
  /** List children of a parent device (by parent numeric id). */
23388
23675
  getChildren: method(external_exports.object({ parentDeviceId: external_exports.number() }), external_exports.array(DeviceInfoSchema)),
23389
23676
  /** Get stream sources for a camera device. */
23390
- getStreamSources: method(external_exports.object({ deviceId: external_exports.number() }), external_exports.array(StreamSourceEntrySchema)),
23677
+ getStreamSources: method(external_exports.object({ deviceId: external_exports.number() }), external_exports.array(StreamSourceEntrySchema$1)),
23391
23678
  /** Get config entries (key + value + description) for a device. */
23392
- getConfigSchema: method(external_exports.object({ deviceId: external_exports.number() }), external_exports.array(ConfigEntrySchema)),
23679
+ getConfigSchema: method(external_exports.object({ deviceId: external_exports.number() }), external_exports.array(ConfigEntrySchema2)),
23393
23680
  /** Get the ConfigUISchema for a device's settings (for admin UI rendering). */
23394
23681
  getSettingsSchema: method(external_exports.object({ deviceId: external_exports.number() }), ConfigUISchemaOutput),
23395
23682
  /** Update device config values (partial merge). */
@@ -24366,7 +24653,20 @@ var DiskSpaceInfoSchema = external_exports.object({
24366
24653
  var PidResourceStatsSchema = external_exports.object({
24367
24654
  pid: external_exports.number(),
24368
24655
  cpu: external_exports.number(),
24369
- memory: external_exports.number()
24656
+ memory: external_exports.number(),
24657
+ /**
24658
+ * Private (anonymous) resident bytes — the per-process V8 heap + native
24659
+ * allocations NOT shared with other processes (Linux RssAnon). This is the
24660
+ * "real" per-runner cost; summing it across runners is meaningful, unlike
24661
+ * `memory` (RSS), which double-counts the shared mmap'd framework code.
24662
+ * Undefined where /proc is unavailable (e.g. macOS).
24663
+ */
24664
+ privateBytes: external_exports.number().optional(),
24665
+ /**
24666
+ * Shared file-backed resident bytes (Linux RssFile) — mmap'd framework/lib
24667
+ * code shared copy-on-write across runners. Undefined on macOS.
24668
+ */
24669
+ sharedBytes: external_exports.number().optional()
24370
24670
  });
24371
24671
  var AddonInstanceSchema = external_exports.object({
24372
24672
  addonId: external_exports.string(),
@@ -24415,6 +24715,18 @@ var KillProcessResultSchema = external_exports.object({
24415
24715
  reason: external_exports.string().optional(),
24416
24716
  signal: external_exports.enum(["SIGTERM", "SIGKILL"]).optional()
24417
24717
  });
24718
+ var DumpHeapSnapshotInputSchema = external_exports.object({
24719
+ /** The addon whose runner should dump a heap snapshot. */
24720
+ addonId: external_exports.string()
24721
+ });
24722
+ var DumpHeapSnapshotResultSchema = external_exports.object({
24723
+ success: external_exports.boolean(),
24724
+ /** Path of the written .heapsnapshot inside the runner's container/host. */
24725
+ path: external_exports.string().optional(),
24726
+ /** Process pid that was signalled. */
24727
+ pid: external_exports.number().optional(),
24728
+ reason: external_exports.string().optional()
24729
+ });
24418
24730
  var SystemMetricsSchema = external_exports.object({
24419
24731
  cpuPercent: external_exports.number(),
24420
24732
  memoryPercent: external_exports.number(),
@@ -24475,6 +24787,17 @@ var metricsProviderCapability = {
24475
24787
  killProcess: method(KillProcessInputSchema, KillProcessResultSchema, {
24476
24788
  kind: "mutation",
24477
24789
  auth: "admin"
24790
+ }),
24791
+ /**
24792
+ * Tell the addon's forked runner to write a V8 heap snapshot to disk (via
24793
+ * SIGUSR2 — the runner's diagnostic handler). Also logs its
24794
+ * `process.memoryUsage()` + heap-space breakdown. Refuses pids not in the
24795
+ * live `listNodeProcesses()` snapshot. Use for deep per-addon memory
24796
+ * attribution; copy the returned path off the node to analyze.
24797
+ */
24798
+ dumpHeapSnapshot: method(DumpHeapSnapshotInputSchema, DumpHeapSnapshotResultSchema, {
24799
+ kind: "mutation",
24800
+ auth: "admin"
24478
24801
  })
24479
24802
  }
24480
24803
  };
@@ -24953,105 +25276,6 @@ var recordingCapability = {
24953
25276
  })
24954
25277
  }
24955
25278
  };
24956
- var StreamSourceEntrySchema$1 = external_exports.object({
24957
- id: external_exports.string(),
24958
- label: external_exports.string(),
24959
- protocol: external_exports.enum([
24960
- "rtsp",
24961
- "rtmp",
24962
- "annexb",
24963
- "http-mjpeg",
24964
- "webrtc",
24965
- "custom"
24966
- ]),
24967
- url: external_exports.string().optional(),
24968
- resolution: external_exports.object({
24969
- width: external_exports.number(),
24970
- height: external_exports.number()
24971
- }).optional(),
24972
- fps: external_exports.number().optional(),
24973
- bitrate: external_exports.number().optional(),
24974
- codec: external_exports.string().optional(),
24975
- profileHint: CamProfileSchema.optional(),
24976
- sdp: external_exports.string().optional()
24977
- });
24978
- var ConfigEntrySchema$1 = external_exports.object({
24979
- key: external_exports.string(),
24980
- value: external_exports.unknown()
24981
- });
24982
- var RawStateResultSchema = external_exports.object({
24983
- /** Originating provider id, e.g. 'homeassistant' | 'reolink' | 'hikvision'. */
24984
- source: external_exports.string(),
24985
- /** Opaque, DISPLAY-SAFE upstream blob (no secrets/PII). */
24986
- data: external_exports.record(external_exports.string(), external_exports.unknown())
24987
- });
24988
- var deviceOpsCapability = {
24989
- name: "device-ops",
24990
- scope: "device",
24991
- deviceNative: true,
24992
- mode: "singleton",
24993
- methods: {
24994
- /**
24995
- * Return stream sources for camera-like devices. Non-camera devices
24996
- * return an empty array (the bridge did the same; preserved for compat).
24997
- */
24998
- getStreamSources: method(external_exports.object({ deviceId: external_exports.number() }), external_exports.array(StreamSourceEntrySchema$1)),
24999
- /**
25000
- * Return the device's config entries (key + current value). Used by
25001
- * the device-manager aggregator when reading the driver's schema+values.
25002
- */
25003
- getConfigEntries: method(external_exports.object({ deviceId: external_exports.number() }), external_exports.array(ConfigEntrySchema$1)),
25004
- /**
25005
- * Bulk-apply a config patch via `IDevice.config.setAll`. Covers the
25006
- * updateConfig / setStreamProfileMap / enable-as-config paths from
25007
- * the old bridge.
25008
- */
25009
- setConfig: method(external_exports.object({
25010
- deviceId: external_exports.number(),
25011
- values: external_exports.record(external_exports.string(), external_exports.unknown())
25012
- }), external_exports.void(), { kind: "mutation" }),
25013
- /**
25014
- * Invoke a device custom action on a forked/remote device (the
25015
- * cross-process transport for `IDevice.runDeviceAction`). Mirrors
25016
- * `setConfig` — the device-manager calls this when the device is not
25017
- * hub-local.
25018
- */
25019
- runAction: method(external_exports.object({
25020
- deviceId: external_exports.number(),
25021
- action: external_exports.string().min(1),
25022
- input: external_exports.unknown()
25023
- }), external_exports.unknown(), { kind: "mutation" }),
25024
- /**
25025
- * Invoke `IDevice.removeDevice()` so the driver can release resources
25026
- * (close sockets, stop background tasks, …). The device-manager still
25027
- * performs its own persistence cleanup before/after this call.
25028
- */
25029
- removeDevice: method(external_exports.object({ deviceId: external_exports.number() }), external_exports.void(), { kind: "mutation" }),
25030
- /**
25031
- * Build the ConfigUISchema (FormBuilder input shape) from the device's
25032
- * Zod config schema. Runs on the worker that owns the IDevice so the
25033
- * Zod types stay local (they're function references, not
25034
- * serializable). Returns a fully JSON-serializable schema with
25035
- * sections/fields the admin UI renders directly.
25036
- *
25037
- * Needed because the hub-side `device-manager.getSettingsSchema`
25038
- * couldn't reach forked-worker devices — it had no registry entry
25039
- * and no cross-process lookup, so the UI silently rendered an empty
25040
- * settings panel for every worker-owned device.
25041
- *
25042
- * Returns `null` when the device isn't found on this worker.
25043
- */
25044
- getSettingsSchema: method(external_exports.object({ deviceId: external_exports.number() }), external_exports.unknown().nullable()),
25045
- /**
25046
- * Opt-in: return the device's RAW upstream state (the provider's
25047
- * cached values) as a display-safe `{ source, data }` blob. Returns
25048
- * `null` when the device exposes no raw state — the State panel hides
25049
- * its Raw toggle in that case. One-shot (read the provider's existing
25050
- * cache; no upstream round-trip).
25051
- */
25052
- getRawState: method(external_exports.object({ deviceId: external_exports.number() }), RawStateResultSchema.nullable(), { auth: "protected" })
25053
- }
25054
- };
25055
25279
  var CameraCredentialsSchema = external_exports.object({
25056
25280
  /** Camera IP or hostname (no scheme). */
25057
25281
  host: external_exports.string(),
@@ -29082,6 +29306,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
29082
29306
  addonId: null,
29083
29307
  access: "view"
29084
29308
  },
29309
+ "metricsProvider.dumpHeapSnapshot": {
29310
+ capName: "metrics-provider",
29311
+ capScope: "system",
29312
+ addonId: null,
29313
+ access: "create"
29314
+ },
29085
29315
  "metricsProvider.getAddonStats": {
29086
29316
  capName: "metrics-provider",
29087
29317
  capScope: "system",
@@ -29538,6 +29768,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
29538
29768
  addonId: null,
29539
29769
  access: "view"
29540
29770
  },
29771
+ "pipelineExecutor.getEngineProvisioning": {
29772
+ capName: "pipeline-executor",
29773
+ capScope: "system",
29774
+ addonId: null,
29775
+ access: "view"
29776
+ },
29541
29777
  "pipelineExecutor.getGlobalPipelineConfig": {
29542
29778
  capName: "pipeline-executor",
29543
29779
  capScope: "system",
@@ -29742,6 +29978,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
29742
29978
  addonId: null,
29743
29979
  access: "view"
29744
29980
  },
29981
+ "pipelineOrchestrator.getCameraStatus": {
29982
+ capName: "pipeline-orchestrator",
29983
+ capScope: "system",
29984
+ addonId: null,
29985
+ access: "view"
29986
+ },
29987
+ "pipelineOrchestrator.getCameraStatuses": {
29988
+ capName: "pipeline-orchestrator",
29989
+ capScope: "system",
29990
+ addonId: null,
29991
+ access: "view"
29992
+ },
29745
29993
  "pipelineOrchestrator.getCameraStepOverrides": {
29746
29994
  capName: "pipeline-orchestrator",
29747
29995
  capScope: "system",
@@ -29826,6 +30074,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
29826
30074
  addonId: null,
29827
30075
  access: "create"
29828
30076
  },
30077
+ "pipelineOrchestrator.setAgentMaxCameras": {
30078
+ capName: "pipeline-orchestrator",
30079
+ capScope: "system",
30080
+ addonId: null,
30081
+ access: "create"
30082
+ },
29829
30083
  "pipelineOrchestrator.setCameraPipelineForAgent": {
29830
30084
  capName: "pipeline-orchestrator",
29831
30085
  capScope: "system",
@@ -31325,9 +31579,6 @@ var frameworkSwapConfirmSchema = external_exports.object({
31325
31579
  bootAttempts: external_exports.number(),
31326
31580
  schemaVersion: external_exports.literal(1)
31327
31581
  });
31328
- function sleep(ms) {
31329
- return new Promise((resolve) => setTimeout(resolve, Math.max(0, ms)));
31330
- }
31331
31582
 
31332
31583
  // src/commands/discover.ts
31333
31584
  var DEFAULT_MULTICAST_GROUP = "239.0.0.0";
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runDiscover
4
- } from "./chunk-JJEKVTZK.js";
4
+ } from "./chunk-DIOLB5F6.js";
5
5
  import "./chunk-K3NQKI34.js";
6
6
 
7
7
  // src/cli.ts
@@ -608,7 +608,7 @@ function isUnknown(_value) {
608
608
  return true;
609
609
  }
610
610
  async function resolveServerInteractive(presetNamespace) {
611
- const { discoverNodes, resolveHubFromDiscovered } = await import("./discover-2Y5KB2PB.js");
611
+ const { discoverNodes, resolveHubFromDiscovered } = await import("./discover-LO4NFCP6.js");
612
612
  if (presetNamespace) {
613
613
  const spinner4 = clack.spinner();
614
614
  spinner4.start(`Discovering hub on LAN (namespace "${presetNamespace}")`);
@@ -3,7 +3,7 @@ import {
3
3
  discoverNodes,
4
4
  resolveHubFromDiscovered,
5
5
  runDiscover
6
- } from "./chunk-JJEKVTZK.js";
6
+ } from "./chunk-DIOLB5F6.js";
7
7
  import "./chunk-K3NQKI34.js";
8
8
  export {
9
9
  discoverNodes,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "camstack",
3
- "version": "1.0.5",
3
+ "version": "1.0.7",
4
4
  "description": "CLI tool for managing and running CamStack server",
5
5
  "keywords": [
6
6
  "camstack",