@camstack/types 0.1.31 → 0.1.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/dist/capabilities/admin-ui.cap.d.ts +6 -2
  2. package/dist/capabilities/admin-ui.cap.d.ts.map +1 -1
  3. package/dist/capabilities/advanced-notifier.cap.d.ts +202 -29
  4. package/dist/capabilities/advanced-notifier.cap.d.ts.map +1 -1
  5. package/dist/capabilities/audio-codec.cap.d.ts +2 -2
  6. package/dist/capabilities/capability-definition.d.ts +22 -0
  7. package/dist/capabilities/capability-definition.d.ts.map +1 -1
  8. package/dist/capabilities/device-export.cap.d.ts +77 -0
  9. package/dist/capabilities/device-export.cap.d.ts.map +1 -0
  10. package/dist/capabilities/embedding-encoder.cap.d.ts +14 -7
  11. package/dist/capabilities/embedding-encoder.cap.d.ts.map +1 -1
  12. package/dist/capabilities/index.d.ts +15 -11
  13. package/dist/capabilities/index.d.ts.map +1 -1
  14. package/dist/capabilities/intercom.cap.d.ts +34 -0
  15. package/dist/capabilities/intercom.cap.d.ts.map +1 -1
  16. package/dist/capabilities/mesh-network.cap.d.ts +72 -22
  17. package/dist/capabilities/mesh-network.cap.d.ts.map +1 -1
  18. package/dist/capabilities/mesh-orchestrator.cap.d.ts +67 -0
  19. package/dist/capabilities/mesh-orchestrator.cap.d.ts.map +1 -1
  20. package/dist/capabilities/mqtt-broker.cap.d.ts +153 -0
  21. package/dist/capabilities/mqtt-broker.cap.d.ts.map +1 -0
  22. package/dist/capabilities/network-access.cap.d.ts +41 -1
  23. package/dist/capabilities/network-access.cap.d.ts.map +1 -1
  24. package/dist/capabilities/nodes.cap.d.ts +23 -1
  25. package/dist/capabilities/nodes.cap.d.ts.map +1 -1
  26. package/dist/capabilities/platform-probe.cap.d.ts +234 -15
  27. package/dist/capabilities/platform-probe.cap.d.ts.map +1 -1
  28. package/dist/capabilities/smtp-provider.cap.d.ts +11 -10
  29. package/dist/capabilities/smtp-provider.cap.d.ts.map +1 -1
  30. package/dist/capabilities/sso-bridge.cap.d.ts +3 -0
  31. package/dist/capabilities/sso-bridge.cap.d.ts.map +1 -1
  32. package/dist/capabilities/stream-broker.cap.d.ts +90 -85
  33. package/dist/capabilities/stream-broker.cap.d.ts.map +1 -1
  34. package/dist/capabilities/user-management.cap.d.ts +4 -0
  35. package/dist/capabilities/user-management.cap.d.ts.map +1 -1
  36. package/dist/capabilities/webrtc-session.cap.d.ts +34 -0
  37. package/dist/capabilities/webrtc-session.cap.d.ts.map +1 -1
  38. package/dist/enums/event-category.d.ts +1 -8
  39. package/dist/enums/event-category.d.ts.map +1 -1
  40. package/dist/generated/addon-api.d.ts +13377 -10829
  41. package/dist/generated/addon-api.d.ts.map +1 -1
  42. package/dist/generated/cap-status-types.d.ts +5 -1
  43. package/dist/generated/cap-status-types.d.ts.map +1 -1
  44. package/dist/generated/capability-router-map.d.ts +7 -7
  45. package/dist/generated/capability-router-map.d.ts.map +1 -1
  46. package/dist/generated/device-proxy.d.ts +2 -0
  47. package/dist/generated/device-proxy.d.ts.map +1 -1
  48. package/dist/generated/method-access-map.d.ts +1 -1
  49. package/dist/generated/method-access-map.d.ts.map +1 -1
  50. package/dist/generated/provider-kind-map.d.ts +22 -0
  51. package/dist/generated/provider-kind-map.d.ts.map +1 -0
  52. package/dist/generated/system-proxy.d.ts +9 -5
  53. package/dist/generated/system-proxy.d.ts.map +1 -1
  54. package/dist/{index-BKifir_y.js → index-DRWlYskM.js} +541 -355
  55. package/dist/index-DRWlYskM.js.map +1 -0
  56. package/dist/{index-BKnvgAep.mjs → index-YnRVILXN.mjs} +801 -615
  57. package/dist/index-YnRVILXN.mjs.map +1 -0
  58. package/dist/index.d.ts +2 -0
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +119 -40
  61. package/dist/index.js.map +1 -1
  62. package/dist/index.mjs +376 -297
  63. package/dist/index.mjs.map +1 -1
  64. package/dist/interfaces/addon.d.ts +14 -3
  65. package/dist/interfaces/addon.d.ts.map +1 -1
  66. package/dist/interfaces/advanced-notifier.d.ts +8 -7
  67. package/dist/interfaces/advanced-notifier.d.ts.map +1 -1
  68. package/dist/interfaces/api-responses.d.ts +6 -0
  69. package/dist/interfaces/api-responses.d.ts.map +1 -1
  70. package/dist/interfaces/capability.d.ts +6 -6
  71. package/dist/interfaces/capability.d.ts.map +1 -1
  72. package/dist/interfaces/embedding-encoder.d.ts +16 -7
  73. package/dist/interfaces/embedding-encoder.d.ts.map +1 -1
  74. package/dist/interfaces/rtp-egress.d.ts +45 -0
  75. package/dist/interfaces/rtp-egress.d.ts.map +1 -0
  76. package/dist/interfaces/storage.d.ts +1 -1
  77. package/dist/interfaces/storage.d.ts.map +1 -1
  78. package/dist/node.js +6 -6
  79. package/dist/node.js.map +1 -1
  80. package/dist/node.mjs +6 -6
  81. package/dist/node.mjs.map +1 -1
  82. package/dist/storage/filesystem-storage-provider.d.ts +1 -1
  83. package/dist/storage/filesystem-storage-provider.d.ts.map +1 -1
  84. package/package.json +1 -1
  85. package/dist/capabilities/home-assistant.cap.d.ts +0 -138
  86. package/dist/capabilities/home-assistant.cap.d.ts.map +0 -1
  87. package/dist/capabilities/mqtt-provider.cap.d.ts +0 -91
  88. package/dist/capabilities/mqtt-provider.cap.d.ts.map +0 -1
  89. package/dist/index-BKifir_y.js.map +0 -1
  90. package/dist/index-BKnvgAep.mjs.map +0 -1
@@ -1069,9 +1069,9 @@ const DecodedFrameSchema = z.object({
1069
1069
  format: z.enum(["jpeg", "rgb", "bgr", "yuv420", "gray"]),
1070
1070
  timestamp: z.number()
1071
1071
  });
1072
- const BrokerStatusSchema = z.enum(["idle", "connecting", "streaming", "error", "stopped"]);
1072
+ const BrokerStatusSchema$1 = z.enum(["idle", "connecting", "streaming", "error", "stopped"]);
1073
1073
  const BrokerStatsSchema = z.object({
1074
- status: BrokerStatusSchema,
1074
+ status: BrokerStatusSchema$1,
1075
1075
  inputFps: z.number(),
1076
1076
  decodeFps: z.number(),
1077
1077
  encodedSubscribers: z.number(),
@@ -1177,22 +1177,34 @@ const PlaceholderReasonSchema = z.enum([
1177
1177
  "disabled",
1178
1178
  "waking"
1179
1179
  ]);
1180
+ const VideoCodecTargetSchema = z.enum(["H264", "H265", "auto"]);
1181
+ const AudioCodecTargetSchema = z.enum(["AAC", "Opus", "PCMU", "none"]);
1182
+ const MaxResolutionSchema = z.object({
1183
+ width: z.number().int().positive(),
1184
+ height: z.number().int().positive()
1185
+ });
1186
+ const GetStreamWithCodecInputSchema = z.object({
1187
+ deviceId: z.number().int().nonnegative(),
1188
+ videoCodec: VideoCodecTargetSchema,
1189
+ audioCodec: AudioCodecTargetSchema.optional(),
1190
+ maxResolution: MaxResolutionSchema.optional(),
1191
+ tag: z.string().optional()
1192
+ });
1193
+ const RtpSourceSchema = z.object({
1194
+ url: z.string(),
1195
+ videoCodec: z.enum(["H264", "H265"]),
1196
+ audioCodec: z.string(),
1197
+ resolution: MaxResolutionSchema,
1198
+ transcoded: z.boolean(),
1199
+ encoder: z.string(),
1200
+ pipelineKey: z.string()
1201
+ });
1180
1202
  const streamBrokerCapability = {
1181
1203
  name: "stream-broker",
1182
1204
  scope: "system",
1183
1205
  mode: "singleton",
1184
1206
  exposesDeviceSettings: true,
1185
1207
  methods: {
1186
- // ── Cam stream lifecycle (publish / retract) ─────────────────────
1187
- /**
1188
- * Register a physical camera stream as an input option. Idempotent
1189
- * for (deviceId, camStreamId) — re-publishing updates metadata
1190
- * without disturbing profile assignments. The provider calls this
1191
- * in `onInitialize` for each stream it offers. Third-party addons
1192
- * may also publish (e.g. an RTMP discovery layer) — camstack has
1193
- * no notion of "owner" beyond the (deviceId, camStreamId) key.
1194
- */
1195
- /* — see STREAM_BROKER_CAP_EVENTS below for cap-event category strings — */
1196
1208
  publishCameraStream: method(
1197
1209
  z.object({
1198
1210
  deviceId: z.number().int().nonnegative(),
@@ -1203,28 +1215,8 @@ const streamBrokerCapability = {
1203
1215
  resolution: CamStreamResolutionSchema.optional(),
1204
1216
  fps: z.number().positive().optional(),
1205
1217
  label: z.string().optional(),
1206
- /**
1207
- * Device-level features that the broker / manager / snapshot
1208
- * orchestrator consult to derive per-stream policy (e.g.
1209
- * `BatteryOperated` → relax stall watchdog, default pre-buffer
1210
- * to off, raise snapshot rate-limit). Single source of truth —
1211
- * publishers no longer set per-stream flags like `allowStall`.
1212
- */
1213
1218
  deviceFeatures: z.array(z.string()).optional(),
1214
- /**
1215
- * Whether this stream participates in the broker's automatic
1216
- * profile assignment. Defaults `true`. Publishers set `false` for
1217
- * streams that should be SELECTABLE but not auto-picked — e.g.
1218
- * Reolink publishes native Baichuan as eligible and RTSP/RTMP
1219
- * mirrors as ineligible (still assignable manually via
1220
- * `assignProfile`).
1221
- */
1222
1219
  autoEligible: z.boolean().optional(),
1223
- /**
1224
- * Transport-specific opaque metadata stashed alongside the stream
1225
- * record. `pull-rfc4571` publishers put the SDP here so the broker
1226
- * reader can route packets without an in-band DESCRIBE phase.
1227
- */
1228
1220
  metadata: z.record(z.string(), z.unknown()).optional()
1229
1221
  }),
1230
1222
  z.object({ success: z.literal(true) }),
@@ -1238,12 +1230,6 @@ const streamBrokerCapability = {
1238
1230
  z.object({ success: z.literal(true) }),
1239
1231
  { kind: "mutation", auth: "admin" }
1240
1232
  ),
1241
- // ── Profile assignment ───────────────────────────────────────────
1242
- /**
1243
- * Assign a cam stream to a profile slot. Tears down any existing
1244
- * broker for that slot and rebuilds against the new source. Persists
1245
- * the choice — survives reboots.
1246
- */
1247
1233
  assignProfile: method(
1248
1234
  z.object({
1249
1235
  deviceId: z.number().int().nonnegative(),
@@ -1261,12 +1247,6 @@ const streamBrokerCapability = {
1261
1247
  z.object({ success: z.literal(true) }),
1262
1248
  { kind: "mutation", auth: "admin" }
1263
1249
  ),
1264
- // ── System-wide views ────────────────────────────────────────────
1265
- /**
1266
- * Full dump of every published cam stream across every device.
1267
- * For dashboards and cross-device tooling; per-device reads go
1268
- * through the `camera-streams` cap on the device proxy.
1269
- */
1270
1250
  listAllCameraStreams: method(
1271
1251
  z.void(),
1272
1252
  z.array(CameraStreamSchema).readonly()
@@ -1275,7 +1255,6 @@ const streamBrokerCapability = {
1275
1255
  z.void(),
1276
1256
  z.array(ProfileSlotSchema).readonly()
1277
1257
  ),
1278
- // ── Broker runtime (stats + client inventory) ────────────────────
1279
1258
  getBrokerStats: method(
1280
1259
  z.object({ brokerId: z.string() }),
1281
1260
  BrokerStatsSchema
@@ -1293,7 +1272,6 @@ const streamBrokerCapability = {
1293
1272
  z.object({ killed: z.boolean() }),
1294
1273
  { kind: "mutation", auth: "admin" }
1295
1274
  ),
1296
- /** Rebuild the broker for a profile slot in place (re-dial source). */
1297
1275
  restartProfile: method(
1298
1276
  z.object({
1299
1277
  deviceId: z.number().int().nonnegative(),
@@ -1302,24 +1280,28 @@ const streamBrokerCapability = {
1302
1280
  z.object({ success: z.boolean() }),
1303
1281
  { kind: "mutation", auth: "admin" }
1304
1282
  ),
1305
- // ── Stream URLs ──────────────────────────────────────────────────
1306
1283
  getStreamUrl: method(
1307
1284
  z.object({ streamId: z.string(), format: StreamFormatSchema }),
1308
1285
  z.object({ url: z.string() })
1309
1286
  ),
1310
- // ── In-process broker access ─────────────────────────────────────
1311
1287
  /**
1312
- * Return the live IStreamBroker instance for a given brokerId. Same
1313
- * LOCAL-ONLY contract as before: callers (pipeline-runner) must be
1314
- * co-located. BrokerId is `${deviceId}/${camStreamId}` — profile
1315
- * lookup goes through `assignments` if a caller starts from a
1316
- * profile.
1288
+ * Shared codec-targeted stream API see Task #184.
1289
+ * Resolution order: source-select HW transcode libx264/libx265.
1317
1290
  */
1291
+ getStreamWithCodec: method(
1292
+ GetStreamWithCodecInputSchema,
1293
+ RtpSourceSchema,
1294
+ { kind: "mutation", auth: "admin" }
1295
+ ),
1296
+ releaseStreamWithCodec: method(
1297
+ z.object({ pipelineKey: z.string() }),
1298
+ z.object({ released: z.boolean(), refcount: z.number().int().nonnegative() }),
1299
+ { kind: "mutation", auth: "admin" }
1300
+ ),
1318
1301
  getBroker: method(
1319
1302
  z.object({ brokerId: z.string() }),
1320
1303
  z.custom()
1321
1304
  ),
1322
- // ── Pre-buffer ───────────────────────────────────────────────────
1323
1305
  setPreBufferDuration: method(
1324
1306
  z.object({ brokerId: z.string(), seconds: z.number().min(0).max(30) }),
1325
1307
  z.void(),
@@ -1329,7 +1311,6 @@ const streamBrokerCapability = {
1329
1311
  z.object({ brokerId: z.string() }),
1330
1312
  z.object({ configuredSec: z.number(), bufferedMs: z.number(), packetCount: z.number() })
1331
1313
  ),
1332
- // ── RTSP restream ────────────────────────────────────────────────
1333
1314
  getRtspPort: method(z.void(), z.number()),
1334
1315
  getAllRtspEntries: method(
1335
1316
  z.object({ hostname: z.string().optional() }),
@@ -1355,37 +1336,15 @@ const streamBrokerCapability = {
1355
1336
  )
1356
1337
  },
1357
1338
  events: {
1358
- /**
1359
- * Emitted when a profile starts consuming a push-kind cam stream.
1360
- * Push-kind providers (e.g. Reolink Baichuan native streams)
1361
- * subscribe and begin emitting packets only on demand — battery
1362
- * cams stay asleep until someone actually watches.
1363
- */
1364
1339
  onCamStreamDemand: event(z.object({
1365
1340
  deviceId: z.number().int().nonnegative(),
1366
1341
  camStreamId: z.string(),
1367
1342
  profile: CamProfileSchema
1368
1343
  })),
1369
- /**
1370
- * Emitted when the last profile consuming a push-kind cam stream
1371
- * releases it. Providers tear down upstream connections on this
1372
- * signal.
1373
- */
1374
1344
  onCamStreamIdle: event(z.object({
1375
1345
  deviceId: z.number().int().nonnegative(),
1376
1346
  camStreamId: z.string()
1377
1347
  })),
1378
- /**
1379
- * Emitted by a broker that failed to dial a managed-loopback
1380
- * source (today: `pull-rfc4571`). The publisher's transport (e.g.
1381
- * the Reolink lib's RFC 4571 TCP server) idle-tears-down after
1382
- * ~15s with no clients and may rebind to a different port on
1383
- * recreate, leaving the URL the broker has cached stale. The owning
1384
- * camera provider re-runs its publish pipeline on receipt — that
1385
- * call self-heals the loopback server (`ensureRfc4571Server`) and
1386
- * `publishCameraStream` propagates the fresh URL back into the
1387
- * broker's source resolver.
1388
- */
1389
1348
  onRequestStreamSourceRefresh: event(z.object({
1390
1349
  deviceId: z.number().int().nonnegative(),
1391
1350
  camStreamId: z.string(),
@@ -3659,14 +3618,16 @@ const logDestinationCapability = {
3659
3618
  )
3660
3619
  }
3661
3620
  };
3621
+ const StaticDirOutputSchema = z.object({ staticDir: z.string() });
3622
+ const VersionOutputSchema = z.object({ version: z.string() });
3662
3623
  const adminUiCapability = {
3663
3624
  name: "admin-ui",
3664
3625
  scope: "system",
3665
3626
  mode: "singleton",
3666
3627
  internal: true,
3667
3628
  methods: {
3668
- getStaticDir: method(z.void(), z.string()),
3669
- getVersion: method(z.void(), z.string())
3629
+ getStaticDir: method(z.void(), StaticDirOutputSchema),
3630
+ getVersion: method(z.void(), VersionOutputSchema)
3670
3631
  }
3671
3632
  };
3672
3633
  const SsoBridgeClaimsSchema = z.object({
@@ -3675,7 +3636,16 @@ const SsoBridgeClaimsSchema = z.object({
3675
3636
  isAdmin: z.boolean(),
3676
3637
  provider: z.string(),
3677
3638
  email: z.string().optional(),
3678
- displayName: z.string().optional()
3639
+ displayName: z.string().optional(),
3640
+ /**
3641
+ * Public HTTPS URL of the hub that issued this token. Used by
3642
+ * cloud-mode OAuth proxies (Alexa Smart Home Lambda, future Google
3643
+ * Home Lambda) to route a request back to the originating hub
3644
+ * without holding routing state of their own. The Lambda decodes the
3645
+ * JWT WITHOUT verifying the signature — the hub re-verifies on every
3646
+ * inbound call so trust still rests with the signing hub.
3647
+ */
3648
+ hubUrl: z.string().optional()
3679
3649
  });
3680
3650
  const ssoBridgeCapability = {
3681
3651
  name: "sso-bridge",
@@ -3757,7 +3727,7 @@ const userPasskeysCapability = {
3757
3727
  )
3758
3728
  }
3759
3729
  };
3760
- const EmailAddressSchema = z.string().email();
3730
+ const EmailAddressSchema = z.email();
3761
3731
  const SendEmailInputSchema = z.object({
3762
3732
  to: z.union([EmailAddressSchema, z.array(EmailAddressSchema).min(1)]),
3763
3733
  cc: z.array(EmailAddressSchema).optional(),
@@ -3795,6 +3765,7 @@ const smtpProviderCapability = {
3795
3765
  scope: "system",
3796
3766
  mode: "collection",
3797
3767
  internal: true,
3768
+ providerKind: "email",
3798
3769
  methods: {
3799
3770
  sendEmail: method(
3800
3771
  SendEmailInputSchema,
@@ -3815,204 +3786,125 @@ const smtpProviderCapability = {
3815
3786
  )
3816
3787
  }
3817
3788
  };
3818
- const QosSchema = z.union([z.literal(0), z.literal(1), z.literal(2)]);
3819
- const PublishInputSchema = z.object({
3820
- topic: z.string(),
3821
- /** UTF-8 payload. Binary payloads must be base64-encoded by the caller. */
3822
- payload: z.string(),
3823
- qos: QosSchema.default(0),
3824
- retain: z.boolean().default(false)
3825
- });
3826
- const SubscribeInputSchema = z.object({
3827
- /** MQTT topic filter (supports `+` single-level and `#` multi-level wildcards). */
3828
- topic: z.string(),
3829
- qos: QosSchema.default(0),
3789
+ const BrokerKindSchema = z.enum(["external", "embedded"]);
3790
+ const BrokerStatusSchema = z.enum([
3791
+ "connected",
3792
+ "disconnected",
3793
+ "auth-failed",
3794
+ "unreachable",
3795
+ "tls-error"
3796
+ ]);
3797
+ const BrokerInfoSchema = z.object({
3798
+ id: z.string(),
3799
+ name: z.string(),
3800
+ url: z.string(),
3801
+ kind: BrokerKindSchema,
3802
+ status: BrokerStatusSchema,
3803
+ latencyMs: z.number().nullable(),
3804
+ error: z.string().optional(),
3805
+ /** Embedded brokers only: number of MQTT clients currently connected. */
3806
+ connectedClients: z.number().int().nonnegative().optional(),
3807
+ /** Epoch ms of the last live probe (external) or aedes snapshot (embedded). */
3808
+ lastCheckedAt: z.number().optional()
3809
+ });
3810
+ const BrokerConnectionDetailsSchema = z.object({
3811
+ url: z.string(),
3812
+ username: z.string().optional(),
3813
+ password: z.string().optional(),
3830
3814
  /**
3831
- * Caller-supplied owner tag. Useful for debugging + the
3832
- * `listSubscriptions` admin view ("which consumer owns this?").
3833
- * When omitted, the addon synthesizes one from the caller's addon id.
3815
+ * Suggested prefix for `clientId`. Each consumer should suffix this
3816
+ * with its own discriminator (addon id, instance id) so reconnects
3817
+ * don't kick each other off (MQTT spec: clientId must be unique per
3818
+ * broker).
3834
3819
  */
3835
- owner: z.string().optional()
3820
+ clientIdPrefix: z.string().optional()
3836
3821
  });
3837
- const SubscribeResultSchema = z.object({
3838
- success: z.literal(true),
3839
- /** Server-generated subscription id. Pass to `unsubscribe` to release. */
3840
- subscriptionId: z.string()
3822
+ const AddBrokerInputSchema = z.object({
3823
+ name: z.string().min(1),
3824
+ url: z.string().regex(/^(mqtt|mqtts|ws|wss):\/\//, "URL must start with mqtt(s):// or ws(s)://"),
3825
+ username: z.string().optional(),
3826
+ password: z.string().optional(),
3827
+ clientIdPrefix: z.string().optional()
3841
3828
  });
3842
- const UnsubscribeInputSchema = z.object({
3843
- /** Subscription id from `subscribe`. */
3844
- subscriptionId: z.string()
3829
+ const AddBrokerResultSchema = z.object({
3830
+ id: z.string()
3845
3831
  });
3846
- const MqttStatusSchema = z.object({
3847
- /** True iff the addon has an active connection to the broker. */
3848
- connected: z.boolean(),
3849
- /** Operator-visible host string (e.g. `mqtt://broker.example:1883`). */
3850
- brokerUrl: z.string(),
3851
- /** Active subscription count (per-owner, NOT broker-side topic count). */
3852
- subscriptionCount: z.number().int(),
3853
- /** Last error reported by the broker. */
3854
- error: z.string().optional(),
3855
- /** Last successful connection timestamp (unix ms). */
3856
- connectedAt: z.number().optional()
3857
- });
3858
- const SubscriptionInfoSchema = z.object({
3859
- subscriptionId: z.string(),
3860
- topic: z.string(),
3861
- qos: QosSchema,
3862
- owner: z.string(),
3863
- /** When this individual subscription was created. */
3864
- createdAt: z.number()
3832
+ const IdInputSchema = z.object({ id: z.string() });
3833
+ const TestResultSchema = z.discriminatedUnion("ok", [
3834
+ z.object({ ok: z.literal(true), latencyMs: z.number() }),
3835
+ z.object({ ok: z.literal(false), error: z.string() })
3836
+ ]);
3837
+ const StartEmbeddedInputSchema = z.object({
3838
+ port: z.number().int().min(1).max(65535).default(1883),
3839
+ /** Allow anonymous connect (no username/password). Default: false. */
3840
+ allowAnonymous: z.boolean().default(false),
3841
+ /** Optional shared username/password for clients. */
3842
+ username: z.string().optional(),
3843
+ password: z.string().optional()
3844
+ });
3845
+ const StartEmbeddedResultSchema = z.object({
3846
+ id: z.string(),
3847
+ url: z.string()
3865
3848
  });
3866
- const mqttProviderCapability = {
3867
- name: "mqtt-provider",
3849
+ const StatusSchema = z.object({
3850
+ brokerCount: z.number(),
3851
+ embeddedRunning: z.boolean()
3852
+ });
3853
+ const mqttBrokerCapability = {
3854
+ name: "mqtt-broker",
3868
3855
  scope: "system",
3869
3856
  mode: "collection",
3870
- internal: true,
3857
+ providerKind: "broker",
3858
+ status: { schema: StatusSchema, kind: "poll" },
3871
3859
  methods: {
3872
- /** Publish a message. Lazy-opens the connection if not yet active. */
3873
- publish: method(
3874
- PublishInputSchema,
3875
- z.object({ success: z.literal(true) }),
3876
- { kind: "mutation", auth: "admin", access: "create" }
3877
- ),
3878
- /**
3879
- * Subscribe to a topic. Returns a `subscriptionId` to pass to
3880
- * `unsubscribe`. The addon refcounts broker subscriptions —
3881
- * multiple consumers on the same topic share one upstream sub.
3882
- * Messages arrive on `mqtt.message` events with `subscriptionIds[]`
3883
- * listing which subscriptions matched.
3884
- */
3885
- subscribe: method(
3886
- SubscribeInputSchema,
3887
- SubscribeResultSchema,
3888
- { kind: "mutation", auth: "admin", access: "create" }
3889
- ),
3890
- /** Release a specific subscription. Tears down the broker sub
3891
- * only when the last owner releases. Idempotent. */
3892
- unsubscribe: method(
3893
- UnsubscribeInputSchema,
3894
- z.object({ success: z.literal(true) }),
3895
- { kind: "mutation", auth: "admin", access: "delete" }
3896
- ),
3897
- /** List active per-owner subscriptions on this provider. */
3898
- listSubscriptions: method(
3899
- z.void(),
3900
- z.array(SubscriptionInfoSchema),
3901
- { auth: "admin" }
3902
- ),
3903
- getStatus: method(
3904
- z.void(),
3905
- MqttStatusSchema,
3906
- { auth: "admin" }
3907
- )
3860
+ listBrokers: method(z.void(), z.array(BrokerInfoSchema)),
3861
+ getBrokerConfig: method(IdInputSchema, BrokerConnectionDetailsSchema),
3862
+ addBroker: method(AddBrokerInputSchema, AddBrokerResultSchema, { kind: "mutation" }),
3863
+ removeBroker: method(IdInputSchema, z.void(), { kind: "mutation" }),
3864
+ testConnection: method(IdInputSchema, TestResultSchema, { kind: "mutation" }),
3865
+ startEmbeddedBroker: method(StartEmbeddedInputSchema, StartEmbeddedResultSchema, { kind: "mutation" }),
3866
+ stopEmbeddedBroker: method(IdInputSchema, z.void(), { kind: "mutation" }),
3867
+ getStatus: method(z.void(), StatusSchema)
3908
3868
  }
3909
3869
  };
3910
- const HaServiceCallSchema = z.object({
3911
- /** HA domain (e.g. `light`, `switch`, `notify`). */
3912
- domain: z.string(),
3913
- /** HA service (e.g. `turn_on`, `toggle`). */
3914
- service: z.string(),
3915
- /** Service-specific data payload (e.g. `{entity_id: 'light.kitchen', brightness: 200}`). */
3916
- serviceData: z.record(z.string(), z.unknown()).optional(),
3917
- /** Optional target spec (entity_id / device_id / area_id). */
3918
- target: z.record(z.string(), z.unknown()).optional()
3919
- });
3920
- const HaStateSchema = z.object({
3921
- entity_id: z.string(),
3922
- state: z.string(),
3923
- attributes: z.record(z.string(), z.unknown()).default({}),
3924
- last_changed: z.string().optional(),
3925
- last_updated: z.string().optional()
3870
+ const LinkStateSchema = z.enum(["unlinked", "linked", "error"]);
3871
+ const DeviceExportStatusSchema = z.object({
3872
+ linkState: LinkStateSchema,
3873
+ exposedDeviceCount: z.number(),
3874
+ error: z.string().optional()
3926
3875
  });
3927
- const HaStatusSchema = z.object({
3928
- connected: z.boolean(),
3929
- host: z.string(),
3930
- /** Active per-owner subscription count. */
3931
- subscriptionCount: z.number().int(),
3932
- /** Last error reported by the WebSocket. */
3933
- error: z.string().optional(),
3934
- /** HA version reported during the auth handshake, when reachable. */
3935
- haVersion: z.string().optional(),
3936
- connectedAt: z.number().optional()
3876
+ const DeviceKindSchema = z.string();
3877
+ const ExposedDeviceSchema = z.object({
3878
+ deviceId: z.string(),
3879
+ exposedAs: z.string().optional(),
3880
+ capabilities: z.array(z.string()).optional()
3937
3881
  });
3938
- const HaSubscribeInputSchema = z.object({
3939
- /**
3940
- * Specific HA event type to subscribe to (`state_changed`,
3941
- * `service_called`, etc.). Empty string = all events (firehose —
3942
- * only for debugging).
3943
- */
3944
- eventType: z.string().optional(),
3945
- /** Caller-supplied tag for listSubscriptions debugging. */
3946
- owner: z.string().optional()
3947
- });
3948
- const HaSubscribeResultSchema = z.object({
3949
- success: z.literal(true),
3950
- subscriptionId: z.string()
3951
- });
3952
- const HaUnsubscribeInputSchema = z.object({
3953
- subscriptionId: z.string()
3954
- });
3955
- const HaSubscriptionInfoSchema = z.object({
3956
- subscriptionId: z.string(),
3957
- /** Empty string when subscribed to ALL events. */
3958
- eventType: z.string(),
3959
- owner: z.string(),
3960
- createdAt: z.number()
3882
+ const ExposeInputSchema = z.object({
3883
+ deviceId: z.string(),
3884
+ capabilities: z.array(z.string()).optional()
3961
3885
  });
3962
- const homeAssistantCapability = {
3963
- name: "home-assistant",
3886
+ const UnexposeInputSchema = z.object({ deviceId: z.string() });
3887
+ const deviceExportCapability = {
3888
+ name: "device-export",
3964
3889
  scope: "system",
3965
3890
  mode: "collection",
3966
- internal: true,
3891
+ providerKind: "device-export",
3892
+ status: { schema: DeviceExportStatusSchema, kind: "poll" },
3893
+ /**
3894
+ * Each export provider contributes its own per-device "Export" panel
3895
+ * (enabled toggle, preferred stream, addon-specific knobs like the
3896
+ * HA-MQTT discovery prefix). The three framework methods
3897
+ * `getDeviceSettingsContribution` / `getDeviceLiveContribution` /
3898
+ * `applyDeviceSettingsPatch` are auto-injected on the provider
3899
+ * interface and routed to the device-details aggregator.
3900
+ */
3901
+ exposesDeviceSettings: true,
3967
3902
  methods: {
3968
- /**
3969
- * Subscribe to HA events. Returns a `subscriptionId` to pass to
3970
- * `unsubscribeEvents`. The addon refcounts upstream subscriptions
3971
- * so multiple consumers share one HA-side event stream.
3972
- * Events arrive on the kernel bus under `home-assistant.event`
3973
- * with `subscriptionIds[]` listing which subs matched.
3974
- */
3975
- subscribeEvents: method(
3976
- HaSubscribeInputSchema,
3977
- HaSubscribeResultSchema,
3978
- { kind: "mutation", auth: "admin", access: "create" }
3979
- ),
3980
- /** Release a specific subscription. Tears down the upstream sub
3981
- * only when the last owner releases. Idempotent. */
3982
- unsubscribeEvents: method(
3983
- HaUnsubscribeInputSchema,
3984
- z.object({ success: z.literal(true) }),
3985
- { kind: "mutation", auth: "admin", access: "delete" }
3986
- ),
3987
- /**
3988
- * Call an HA service (turn light on, run a script, etc.). Returns
3989
- * the HA response object — usually `{context, response: ...}`.
3990
- */
3991
- callService: method(
3992
- HaServiceCallSchema,
3993
- z.object({ result: z.unknown() }),
3994
- { kind: "mutation", auth: "admin", access: "create" }
3995
- ),
3996
- /** Fetch all entity states. Cheap snapshot — HA returns the full
3997
- * state registry on every call. */
3998
- getStates: method(
3999
- z.void(),
4000
- z.array(HaStateSchema).readonly(),
4001
- { auth: "admin" }
4002
- ),
4003
- /** Fetch a single entity's current state. `null` when not found. */
4004
- getState: method(
4005
- z.object({ entityId: z.string() }),
4006
- HaStateSchema.nullable(),
4007
- { auth: "admin" }
4008
- ),
4009
- /** List active per-owner subscriptions. */
4010
- listSubscriptions: method(
4011
- z.void(),
4012
- z.array(HaSubscriptionInfoSchema).readonly(),
4013
- { auth: "admin" }
4014
- ),
4015
- getStatus: method(z.void(), HaStatusSchema, { auth: "admin" })
3903
+ getStatus: method(z.void(), DeviceExportStatusSchema),
3904
+ listSupportedDeviceKinds: method(z.void(), z.array(DeviceKindSchema)),
3905
+ listExposedDevices: method(z.void(), z.array(ExposedDeviceSchema)),
3906
+ exposeDevice: method(ExposeInputSchema, z.void(), { kind: "mutation" }),
3907
+ unexposeDevice: method(UnexposeInputSchema, z.void(), { kind: "mutation" })
4016
3908
  }
4017
3909
  };
4018
3910
  const AddonPageDeclarationSchema$1 = z.object({
@@ -4414,6 +4306,29 @@ const webrtcSessionCapability = {
4414
4306
  z.object({ sessionId: z.string(), sdpOffer: z.string() }),
4415
4307
  { kind: "mutation" }
4416
4308
  ),
4309
+ /**
4310
+ * Accept a CLIENT-generated SDP offer and return the server's
4311
+ * SDP answer. Mirrors the WHEP / Alexa
4312
+ * `Alexa.RTCSessionController.InitiateSessionWithOffer` direction
4313
+ * (client offers, server answers) — the dual of `createSession`,
4314
+ * which has the server offer first.
4315
+ *
4316
+ * `target` defaults to the device's adaptive selection when
4317
+ * omitted; an optional `sessionId` lets the client provide its
4318
+ * own correlation id (Alexa supplies one in the directive
4319
+ * payload). The returned `sessionId` is whatever the server uses
4320
+ * to track the session and accepts via `closeSession`.
4321
+ */
4322
+ handleOffer: method(
4323
+ z.object({
4324
+ deviceId: z.number().int().nonnegative(),
4325
+ target: WebrtcStreamTargetSchema.optional(),
4326
+ sdpOffer: z.string(),
4327
+ sessionId: z.string().optional()
4328
+ }),
4329
+ z.object({ sessionId: z.string(), sdpAnswer: z.string() }),
4330
+ { kind: "mutation" }
4331
+ ),
4417
4332
  handleAnswer: method(
4418
4333
  z.object({
4419
4334
  deviceId: z.number().int().nonnegative(),
@@ -5053,12 +4968,12 @@ const audioCodecCapability = {
5053
4968
  };
5054
4969
  const EmbeddingResultSchema = z.object({
5055
4970
  embedding: z.array(z.number()),
5056
- dimensions: z.number()
4971
+ inferenceMs: z.number()
5057
4972
  });
5058
4973
  const EmbeddingInfoSchema = z.object({
5059
4974
  modelId: z.string(),
5060
- dimensions: z.number(),
5061
- inputSize: z.number()
4975
+ embeddingDim: z.number(),
4976
+ ready: z.boolean()
5062
4977
  });
5063
4978
  const embeddingEncoderCapability = {
5064
4979
  name: "embedding-encoder",
@@ -5793,16 +5708,36 @@ const NetworkAccessStatusSchema = z.object({
5793
5708
  endpoint: NetworkEndpointSchema.nullable(),
5794
5709
  error: z.string().optional()
5795
5710
  });
5711
+ const NetworkEndpointEntrySchema = NetworkEndpointSchema.extend({
5712
+ /**
5713
+ * Stable id within the provider — typically `<mode>-<sourcePort>` so
5714
+ * the orchestrator can dedupe across `listEndpoints` polls.
5715
+ */
5716
+ id: z.string(),
5717
+ /** Operator-facing label (mirrors `MeshEndpoint.label`). */
5718
+ label: z.string(),
5719
+ /** Optional provider-specific mode tag, used for icon/colour in admin UI. */
5720
+ mode: z.string().optional(),
5721
+ /** Originating local port the ingress fronts (informational). */
5722
+ sourcePort: z.number().optional()
5723
+ });
5796
5724
  const networkAccessCapability = {
5797
5725
  name: "network-access",
5798
5726
  scope: "system",
5799
5727
  mode: "collection",
5800
5728
  internal: true,
5729
+ providerKind: "ingress",
5801
5730
  methods: {
5802
5731
  start: method(z.void(), NetworkEndpointSchema, { kind: "mutation" }),
5803
5732
  stop: method(z.void(), z.void(), { kind: "mutation" }),
5804
5733
  getEndpoint: method(z.void(), NetworkEndpointSchema.nullable()),
5805
- getStatus: method(z.void(), NetworkAccessStatusSchema)
5734
+ getStatus: method(z.void(), NetworkAccessStatusSchema),
5735
+ /**
5736
+ * Enumerate every active ingress entry. Default implementation (when
5737
+ * the provider omits this method) is derived from `getEndpoint()` —
5738
+ * see the remote-access orchestrator for the fallback path.
5739
+ */
5740
+ listEndpoints: method(z.void(), z.array(NetworkEndpointEntrySchema).readonly())
5806
5741
  }
5807
5742
  };
5808
5743
  const RemoteAccessEndpointSchema = z.object({
@@ -6006,20 +5941,59 @@ const notificationOutputCapability = {
6006
5941
  )
6007
5942
  }
6008
5943
  };
5944
+ const NotificationRuleConditionsSchema = z.object({
5945
+ deviceIds: z.array(z.number()).readonly().optional(),
5946
+ classNames: z.array(z.string()).readonly().optional(),
5947
+ zoneIds: z.array(z.string()).readonly().optional(),
5948
+ minConfidence: z.number().optional(),
5949
+ source: z.enum(["pipeline", "onboard", "any"]).optional(),
5950
+ schedule: z.object({
5951
+ days: z.array(z.number()).readonly(),
5952
+ startHour: z.number(),
5953
+ endHour: z.number()
5954
+ }).optional(),
5955
+ cooldownSeconds: z.number().optional(),
5956
+ minDwellSeconds: z.number().optional()
5957
+ });
5958
+ const NotificationRuleTemplateSchema = z.object({
5959
+ title: z.string(),
5960
+ body: z.string(),
5961
+ imageMode: z.enum(["crop", "annotated", "full", "none"])
5962
+ });
6009
5963
  const NotificationRuleSchema = z.object({
6010
5964
  id: z.string(),
6011
5965
  name: z.string(),
6012
5966
  enabled: z.boolean(),
6013
- conditions: z.record(z.string(), z.unknown()),
6014
- actions: z.array(z.record(z.string(), z.unknown()))
5967
+ eventTypes: z.array(z.string()).readonly(),
5968
+ conditions: NotificationRuleConditionsSchema,
5969
+ outputs: z.array(z.string()).readonly(),
5970
+ template: NotificationRuleTemplateSchema.optional(),
5971
+ priority: z.enum(["low", "normal", "high", "critical"])
5972
+ });
5973
+ const NotificationTestResultSchema = z.object({
5974
+ ruleId: z.string(),
5975
+ eventId: z.string(),
5976
+ timestamp: z.number(),
5977
+ wouldFire: z.boolean(),
5978
+ reason: z.string().optional()
6015
5979
  });
6016
5980
  const NotificationHistoryEntrySchema = z.object({
6017
5981
  id: z.string(),
6018
5982
  ruleId: z.string(),
5983
+ ruleName: z.string(),
5984
+ eventId: z.string(),
6019
5985
  timestamp: z.number(),
6020
- deviceId: z.number().optional(),
5986
+ outputs: z.array(z.string()).readonly(),
6021
5987
  success: z.boolean(),
6022
- error: z.string().optional()
5988
+ error: z.string().optional(),
5989
+ deviceId: z.number().optional()
5990
+ });
5991
+ const NotificationHistoryFilterSchema = z.object({
5992
+ ruleId: z.string().optional(),
5993
+ deviceId: z.number().optional(),
5994
+ from: z.number().optional(),
5995
+ to: z.number().optional(),
5996
+ limit: z.number().optional()
6023
5997
  });
6024
5998
  const advancedNotifierCapability = {
6025
5999
  name: "advanced-notifier",
@@ -6027,17 +6001,28 @@ const advancedNotifierCapability = {
6027
6001
  mode: "singleton",
6028
6002
  internal: true,
6029
6003
  methods: {
6030
- getRules: method(z.void(), z.array(NotificationRuleSchema).readonly()),
6031
- upsertRule: method(NotificationRuleSchema, z.void(), { kind: "mutation" }),
6032
- deleteRule: method(z.object({ ruleId: z.string() }), z.void(), { kind: "mutation" }),
6004
+ getRules: method(
6005
+ z.void(),
6006
+ z.object({ rules: z.array(NotificationRuleSchema).readonly() })
6007
+ ),
6008
+ upsertRule: method(
6009
+ z.object({ rule: NotificationRuleSchema }),
6010
+ z.object({ success: z.literal(true) }),
6011
+ { kind: "mutation" }
6012
+ ),
6013
+ deleteRule: method(
6014
+ z.object({ ruleId: z.string() }),
6015
+ z.object({ success: z.literal(true) }),
6016
+ { kind: "mutation" }
6017
+ ),
6033
6018
  testRule: method(
6034
6019
  z.object({ ruleId: z.string(), lookbackMinutes: z.number() }),
6035
- z.array(z.record(z.string(), z.unknown())),
6020
+ z.object({ results: z.array(NotificationTestResultSchema).readonly() }),
6036
6021
  { kind: "mutation" }
6037
6022
  ),
6038
6023
  getHistory: method(
6039
- z.object({ ruleId: z.string().optional(), limit: z.number().optional() }),
6040
- z.array(NotificationHistoryEntrySchema)
6024
+ z.object({ filter: NotificationHistoryFilterSchema.optional() }),
6025
+ z.object({ entries: z.array(NotificationHistoryEntrySchema).readonly() })
6041
6026
  )
6042
6027
  }
6043
6028
  };
@@ -7059,6 +7044,47 @@ const intercomCapability = {
7059
7044
  z.object({ deviceId: z.number(), sessionId: z.string() }),
7060
7045
  z.void(),
7061
7046
  { kind: "mutation", auth: "admin" }
7047
+ ),
7048
+ /**
7049
+ * Open a raw-PCM talk session (no WebRTC SDP plumbing). Used by
7050
+ * non-WebRTC consumers (HomeKit export, Alexa raw audio, test
7051
+ * harnesses) that already have decoded PCM frames and just need a
7052
+ * direct path onto the camera's talk channel. Mutually exclusive
7053
+ * with `startSession` (an active WebRTC session must be stopped
7054
+ * before a raw-PCM session can be opened on the same device, and
7055
+ * vice versa).
7056
+ */
7057
+ startTalkSession: method(
7058
+ z.object({ deviceId: z.number() }),
7059
+ z.object({ sessionId: z.string() }),
7060
+ { kind: "mutation", auth: "admin" }
7061
+ ),
7062
+ /**
7063
+ * Push a chunk of PCM s16le mono onto the active raw-PCM talk
7064
+ * session. Frames are encoded to the firmware's expected codec
7065
+ * (Reolink: IMA ADPCM @ camera sample rate; Hikvision: G.711 @
7066
+ * 8 kHz) inside the provider — callers must resample upstream to
7067
+ * the rate the camera negotiated (typical: 16 kHz Reolink,
7068
+ * 8 kHz Hikvision). PCM is shipped base64-encoded so the payload
7069
+ * survives JSON serialization across tRPC.
7070
+ */
7071
+ pushTalkPcm: method(
7072
+ z.object({
7073
+ deviceId: z.number(),
7074
+ /** PCM frames as little-endian s16, mono. Base64-encoded so
7075
+ * the payload survives tRPC JSON serialization. */
7076
+ pcmBase64: z.string(),
7077
+ /** Sequence number for ordering / dropping out-of-order frames. */
7078
+ sequenceNumber: z.number().int()
7079
+ }),
7080
+ z.object({ accepted: z.boolean() }),
7081
+ { kind: "mutation", auth: "admin" }
7082
+ ),
7083
+ /** Close the raw-PCM talk session. Idempotent. */
7084
+ endTalkSession: method(
7085
+ z.object({ deviceId: z.number() }),
7086
+ z.void(),
7087
+ { kind: "mutation", auth: "admin" }
7062
7088
  )
7063
7089
  },
7064
7090
  events: {
@@ -7134,6 +7160,33 @@ const HwAccelBackendInputSchema = z.enum([
7134
7160
  const HwAccelResolutionSchema = z.object({
7135
7161
  preferred: z.array(z.string()).readonly()
7136
7162
  });
7163
+ const HardwareEncoderIdSchema = z.enum([
7164
+ "h264_videotoolbox",
7165
+ "hevc_videotoolbox",
7166
+ "h264_vaapi",
7167
+ "hevc_vaapi",
7168
+ "h264_nvenc",
7169
+ "hevc_nvenc",
7170
+ "h264_qsv",
7171
+ "hevc_qsv",
7172
+ "h264_amf",
7173
+ "hevc_amf",
7174
+ "libx264",
7175
+ "libx265"
7176
+ ]);
7177
+ const HardwareEncoderProbeSchema = z.object({
7178
+ encoder: HardwareEncoderIdSchema,
7179
+ codec: z.enum(["H264", "H265"]),
7180
+ family: z.enum(["videotoolbox", "vaapi", "nvenc", "qsv", "amf", "software"]),
7181
+ available: z.boolean(),
7182
+ reason: z.string().optional()
7183
+ });
7184
+ const HardwareEncodersSchema = z.object({
7185
+ encoders: z.array(HardwareEncoderProbeSchema).readonly(),
7186
+ defaultH264: HardwareEncoderIdSchema,
7187
+ defaultH265: HardwareEncoderIdSchema,
7188
+ probedAt: z.number()
7189
+ });
7137
7190
  const HardwarePlatformSchema = z.enum(["darwin", "linux", "win32"]);
7138
7191
  const HardwareArchSchema = z.enum(["arm64", "x64"]);
7139
7192
  const GpuInfoSchema = z.object({
@@ -7187,41 +7240,24 @@ const platformProbeCapability = {
7187
7240
  scope: "system",
7188
7241
  mode: "singleton",
7189
7242
  methods: {
7190
- /** Return cached hardware + scored backends for this node. */
7191
- getCapabilities: method(
7192
- z.void(),
7193
- PlatformCapabilitiesSchema
7194
- ),
7195
- /** Convenience getter — hardware only. */
7196
- getHardware: method(
7197
- z.void(),
7198
- HardwareInfoSchema
7199
- ),
7200
- /**
7201
- * Resolve the best (model, runtime, backend, format) for a given list
7202
- * of requirements, using this node's scored backends as the candidate
7203
- * pool. Always returns a config — falls back to CPU when no preferred
7204
- * backend matches.
7205
- */
7243
+ getCapabilities: method(z.void(), PlatformCapabilitiesSchema),
7244
+ getHardware: method(z.void(), HardwareInfoSchema),
7206
7245
  resolveInferenceConfig: method(
7207
- z.object({
7208
- requirements: z.array(ModelRequirementSchema).readonly()
7209
- }),
7246
+ z.object({ requirements: z.array(ModelRequirementSchema).readonly() }),
7210
7247
  ResolvedInferenceConfigSchema
7211
7248
  ),
7212
- /**
7213
- * Resolve the ordered HW acceleration backend list for this node.
7214
- * Pass `prefer` to hint a specific backend; pass `null` or omit
7215
- * for auto-detection. Replaces the legacy `$hwaccel.resolve`
7216
- * Moleculer action — cap routing handles per-node dispatch via
7217
- * `nodeId`.
7218
- */
7219
7249
  resolveHwAccel: method(
7220
- z.object({
7221
- prefer: HwAccelBackendInputSchema,
7222
- nodeId: z.string().optional()
7223
- }),
7250
+ z.object({ prefer: HwAccelBackendInputSchema, nodeId: z.string().optional() }),
7224
7251
  HwAccelResolutionSchema
7252
+ ),
7253
+ /**
7254
+ * Hardware-encoder probe — see Task #185. Cached after first call.
7255
+ */
7256
+ getHardwareEncoders: method(z.void(), HardwareEncodersSchema),
7257
+ refreshHardwareEncoders: method(
7258
+ z.void(),
7259
+ HardwareEncodersSchema,
7260
+ { kind: "mutation", auth: "admin" }
7225
7261
  )
7226
7262
  }
7227
7263
  };
@@ -7433,7 +7469,9 @@ const MeshPeerSchema = z.object({
7433
7469
  id: z.string(),
7434
7470
  /** Hostname / device name as shown in the mesh dashboard. */
7435
7471
  hostname: z.string(),
7436
- /** Mesh IP(s). Multiple when the peer is dual-stacked. */
7472
+ /** MagicDNS / mesh DNS name (e.g. `peer-foo.tail-abc.ts.net`). Empty when the provider doesn't support DNS or peer-side resolution is disabled. */
7473
+ magicDns: z.string(),
7474
+ /** Mesh IPv4 / IPv6 addresses combined. Multiple when dual-stacked. */
7437
7475
  addresses: z.array(z.string()).readonly(),
7438
7476
  /** Operating system reported by the peer (informational). */
7439
7477
  os: z.string().optional(),
@@ -7442,7 +7480,32 @@ const MeshPeerSchema = z.object({
7442
7480
  /** Last-seen timestamp (epoch ms). 0 when never seen. */
7443
7481
  lastSeenMs: z.number(),
7444
7482
  /** True for the row representing the current host. */
7445
- isSelf: z.boolean()
7483
+ isSelf: z.boolean(),
7484
+ /**
7485
+ * Connection mode to this peer:
7486
+ * - `direct`: NAT-traversed P2P (UDP punched)
7487
+ * - `relay`: traffic relayed through provider edge (Tailscale DERP)
7488
+ * - `idle`: peer reachable but no recent traffic / handshake
7489
+ */
7490
+ connection: z.enum(["direct", "relay", "idle"]),
7491
+ /** DERP region / relay node identifier when `connection: relay`. Null otherwise. */
7492
+ relay: z.string().nullable(),
7493
+ /** Last successful handshake timestamp (epoch ms). 0 when never. */
7494
+ lastHandshakeMs: z.number(),
7495
+ /** Bytes received from this peer since the daemon started. */
7496
+ rxBytes: z.number(),
7497
+ /** Bytes transmitted to this peer since the daemon started. */
7498
+ txBytes: z.number(),
7499
+ /** ACL tags this peer carries (e.g. `["tag:server"]`). Empty when human-owned. */
7500
+ tags: z.array(z.string()).readonly(),
7501
+ /** True when the peer advertises itself as an exit-node candidate. */
7502
+ exitNodeOption: z.boolean(),
7503
+ /** Subnet routes the peer advertises (e.g. `["192.168.1.0/24"]`). */
7504
+ advertisedRoutes: z.array(z.string()).readonly(),
7505
+ /** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
7506
+ userLogin: z.string().nullable(),
7507
+ /** Pre-auth key / machine-key expiry (epoch ms). Null when keys don't expire. */
7508
+ keyExpiry: z.number().nullable()
7446
7509
  });
7447
7510
  const MeshStatusSchema = z.object({
7448
7511
  /** True when the host is joined and the daemon reports healthy. */
@@ -7456,27 +7519,44 @@ const MeshStatusSchema = z.object({
7456
7519
  /** Every endpoint this provider exposes for the current host. */
7457
7520
  endpoints: z.array(MeshEndpointSchema$1).readonly(),
7458
7521
  /** Last error from the daemon, when not joined. */
7459
- error: z.string().optional()
7460
- });
7461
- const PublicIngressConfigSchema = z.object({
7462
- /** Whether the provider should expose CamStack via its public
7463
- * ingress (Tailscale Funnel, etc.). */
7464
- enabled: z.boolean(),
7465
- /** Local port to forward. Auto-detected from the hub HTTP port
7466
- * when omitted. */
7467
- port: z.number().int().min(1).max(65535).optional()
7468
- });
7469
- const MeshIngressConfigSchema = z.object({
7470
- /** Whether the provider should expose CamStack inside the mesh
7471
- * via HTTPS (Tailscale Serve, etc.) instead of just raw IP. */
7472
- enabled: z.boolean(),
7473
- /** Local port to forward. Auto-detected when omitted. */
7474
- port: z.number().int().min(1).max(65535).optional()
7522
+ error: z.string().optional(),
7523
+ // ── Account / tenant identity (generic across providers) ────────
7524
+ /**
7525
+ * Tenant / tailnet / network display name (Tailscale = tailnet
7526
+ * domain, Headscale = namespace, ZeroTier = network name). Empty
7527
+ * pre-join. Per-provider semantics, common slot.
7528
+ */
7529
+ tenantName: z.string(),
7530
+ /**
7531
+ * Mesh DNS suffix when the provider exposes peer-resolvable DNS
7532
+ * (Tailscale MagicDNS, Headscale MagicDNS, …). Empty when the
7533
+ * provider doesn't ship DNS (e.g. ZeroTier).
7534
+ */
7535
+ magicDnsSuffix: z.string(),
7536
+ /**
7537
+ * Authenticated user / account login bound to this host. Null when
7538
+ * the provider authenticates with a long-lived network token rather
7539
+ * than a user account (e.g. ZeroTier API token).
7540
+ */
7541
+ userLogin: z.string().nullable(),
7542
+ /**
7543
+ * Provider control-plane URL (Tailscale SaaS `https://login.tailscale.com`,
7544
+ * self-hosted Headscale, ZeroTier Central, …). Empty when not
7545
+ * applicable (rare).
7546
+ */
7547
+ controlPlaneUrl: z.string(),
7548
+ /**
7549
+ * Machine-key / node-key expiry (epoch ms). Null when the provider
7550
+ * doesn't rotate keys for the bound host. Operator-facing surface
7551
+ * for "your access expires on …" banners.
7552
+ */
7553
+ keyExpiry: z.number().nullable()
7475
7554
  });
7476
7555
  const meshNetworkCapability = {
7477
7556
  name: "mesh-network",
7478
7557
  scope: "system",
7479
7558
  mode: "collection",
7559
+ providerKind: "mesh",
7480
7560
  methods: {
7481
7561
  /** Return the current join state + endpoints + peer count. Cheap
7482
7562
  * poll-target — admin UI hits this every few seconds. */
@@ -7498,35 +7578,54 @@ const meshNetworkCapability = {
7498
7578
  z.object({ joined: z.literal(true) }),
7499
7579
  { kind: "mutation" }
7500
7580
  ),
7581
+ /**
7582
+ * Start an interactive browser-redirect login flow.
7583
+ *
7584
+ * The provider spawns its daemon's join command without a pre-auth
7585
+ * key, captures the verification URL the daemon prints, and returns
7586
+ * it. The admin UI opens the URL in a new tab; the user completes
7587
+ * authentication in the provider's web console and the background
7588
+ * process self-terminates. The caller then polls `getStatus()` until
7589
+ * `joined: true`.
7590
+ *
7591
+ * Mirrors the `tailscale up` (no `--auth-key`) flow.
7592
+ */
7593
+ startLogin: method(
7594
+ z.object({
7595
+ /** Optional hostname override the host should advertise once joined. */
7596
+ hostname: z.string().optional()
7597
+ }),
7598
+ z.object({
7599
+ /** Authentication URL the operator should open in a browser. */
7600
+ loginUrl: z.string()
7601
+ }),
7602
+ { kind: "mutation" }
7603
+ ),
7501
7604
  /** Leave the mesh. After this the meshIp/magicDnsHostname/etc.
7502
- * vanish until the next `join`. */
7605
+ * vanish until the next `join`. The bound account stays — a
7606
+ * subsequent `join` reuses it without prompting for a new login. */
7503
7607
  leave: method(
7504
7608
  z.void(),
7505
7609
  z.object({ left: z.literal(true) }),
7506
7610
  { kind: "mutation" }
7507
7611
  ),
7508
- /** Enumerate every peer the daemon currently knows about. */
7509
- listPeers: method(z.void(), z.object({
7510
- peers: z.array(MeshPeerSchema).readonly()
7511
- })),
7512
- /**
7513
- * Toggle the public ingress (e.g. Tailscale Funnel) that maps a
7514
- * local port to the open internet via the provider's edge. Idempotent.
7515
- */
7516
- setPublicIngress: method(
7517
- PublicIngressConfigSchema,
7518
- z.object({ success: z.literal(true) }),
7519
- { kind: "mutation" }
7520
- ),
7521
7612
  /**
7522
- * Toggle the in-mesh HTTPS ingress (e.g. Tailscale Serve) so peers
7523
- * inside the mesh hit a valid TLS endpoint instead of the raw IP.
7613
+ * Sign out of the mesh account entirely. Distinct from `leave`:
7614
+ * `leave` only takes the host off-mesh (`tailscale down`) while the
7615
+ * account binding survives, so the next `join` reconnects silently.
7616
+ * `logout` (`tailscale logout`) wipes the daemon's stored
7617
+ * credentials — the next `startLogin` MUST go through a fresh
7618
+ * browser-redirect flow to bind a new account.
7524
7619
  */
7525
- setMeshIngress: method(
7526
- MeshIngressConfigSchema,
7527
- z.object({ success: z.literal(true) }),
7620
+ logout: method(
7621
+ z.void(),
7622
+ z.object({ loggedOut: z.literal(true) }),
7528
7623
  { kind: "mutation" }
7529
7624
  ),
7625
+ /** Enumerate every peer the daemon currently knows about. */
7626
+ listPeers: method(z.void(), z.object({
7627
+ peers: z.array(MeshPeerSchema).readonly()
7628
+ })),
7530
7629
  /**
7531
7630
  * Probe the mesh daemon / API for a sanity check WITHOUT joining.
7532
7631
  * Operator-facing "test connection" button: validates the auth key
@@ -7556,6 +7655,15 @@ const meshNetworkCapability = {
7556
7655
  }),
7557
7656
  { kind: "mutation" }
7558
7657
  )
7658
+ // Provider-specific runtime knobs (accept-routes / advertise-routes /
7659
+ // shields-up / ssh / exit-node, …) live on the addon's own
7660
+ // `getSettingsUISchema` (form-builder), NOT here. Different mesh
7661
+ // providers (Tailscale, Headscale, ZeroTier, Nebula) have very
7662
+ // different config surfaces — picking one shape and forcing all
7663
+ // implementations to honour it would either lose options or
7664
+ // misrepresent them. The Mesh page renders the addon's settings
7665
+ // schema as a "Settings" tab next to the generic Status / Peers
7666
+ // tabs driven by this cap.
7559
7667
  }
7560
7668
  };
7561
7669
  const MeshEndpointSchema = z.object({
@@ -7583,7 +7691,18 @@ const MeshProviderInfoSchema = z.object({
7583
7691
  /** Active endpoints (mesh IP + MagicDNS + optional public Funnel). */
7584
7692
  endpoints: z.array(MeshEndpointSchema).readonly(),
7585
7693
  /** Last error reported by the provider. */
7586
- error: z.string().optional()
7694
+ error: z.string().optional(),
7695
+ // ── Generic identity fields mirrored from MeshStatus ─────────────
7696
+ /** Tenant / tailnet / network display name. Empty pre-join. */
7697
+ tenantName: z.string(),
7698
+ /** Mesh DNS suffix (e.g. tailXXXX.ts.net). Empty when not configured. */
7699
+ magicDnsSuffix: z.string(),
7700
+ /** Authenticated user / account login. Null for token-only providers. */
7701
+ userLogin: z.string().nullable(),
7702
+ /** Provider control-plane URL. */
7703
+ controlPlaneUrl: z.string(),
7704
+ /** Machine-key expiry (epoch ms). Null when keys don't rotate. */
7705
+ keyExpiry: z.number().nullable()
7587
7706
  });
7588
7707
  const meshOrchestratorCapability = {
7589
7708
  name: "mesh-orchestrator",
@@ -7609,6 +7728,43 @@ const meshOrchestratorCapability = {
7609
7728
  z.object({ addonId: z.string() }),
7610
7729
  z.object({ success: z.literal(true) }),
7611
7730
  { kind: "mutation" }
7731
+ ),
7732
+ /**
7733
+ * Browser-redirect login flow. Forwards to the named provider's
7734
+ * `mesh-network.startLogin` and returns the URL the daemon
7735
+ * prints. UI opens it in a new tab, then polls `listProviders`
7736
+ * for `joined: true`.
7737
+ */
7738
+ startLoginProvider: method(
7739
+ z.object({
7740
+ addonId: z.string(),
7741
+ hostname: z.string().optional()
7742
+ }),
7743
+ z.object({ loginUrl: z.string() }),
7744
+ { kind: "mutation" }
7745
+ ),
7746
+ /**
7747
+ * Sign out of the provider's account entirely (`mesh-network.logout`).
7748
+ * Distinct from `leaveProvider` which only takes the host off-mesh;
7749
+ * `logoutProvider` wipes credentials so the next start requires a
7750
+ * fresh login.
7751
+ */
7752
+ logoutProvider: method(
7753
+ z.object({ addonId: z.string() }),
7754
+ z.object({ loggedOut: z.literal(true) }),
7755
+ { kind: "mutation" }
7756
+ ),
7757
+ /**
7758
+ * Per-provider peer list. Forwards to `mesh-network.listPeers` on
7759
+ * the addressed provider. Separate from `listProviders` because
7760
+ * peer payloads can be large on a heavily-populated tailnet —
7761
+ * fetch only when the operator opens the Peers tab.
7762
+ */
7763
+ listProviderPeers: method(
7764
+ z.object({ addonId: z.string() }),
7765
+ z.object({
7766
+ peers: z.array(MeshPeerSchema).readonly()
7767
+ })
7612
7768
  )
7613
7769
  }
7614
7770
  };
@@ -7696,6 +7852,13 @@ const UserSummarySchema = z.object({
7696
7852
  allowedProviders: z.union([z.array(z.string()), z.literal("*")]),
7697
7853
  allowedDevices: z.record(z.string(), z.union([z.array(z.string()), z.literal("*")])),
7698
7854
  scopes: z.array(TokenScopeSchema).default([]),
7855
+ /**
7856
+ * True iff this user has a CONFIRMED TOTP enrollment. Surfaced on
7857
+ * `listUsers` so the admin Users page can render the "Remove 2FA"
7858
+ * action conditionally without firing one `getTotpStatus` query per
7859
+ * row. Self-service enrollment lives on the user's profile page.
7860
+ */
7861
+ totpEnabled: z.boolean().default(false),
7699
7862
  createdAt: z.number(),
7700
7863
  updatedAt: z.number()
7701
7864
  });
@@ -7994,6 +8157,12 @@ const NodeAddonInputSchema = z.object({
7994
8157
  nodeId: z.string(),
7995
8158
  addonId: z.string()
7996
8159
  });
8160
+ const NodeAddonEntrySchema = z.object({
8161
+ id: z.string(),
8162
+ status: z.string(),
8163
+ version: z.string().optional(),
8164
+ packageName: z.string().optional()
8165
+ });
7997
8166
  const SuccessSchema = z.object({ success: z.boolean() });
7998
8167
  const RestartProcessResultSchema = z.object({
7999
8168
  success: z.boolean(),
@@ -8054,6 +8223,19 @@ const nodesCapability = {
8054
8223
  z.record(z.string(), ClusterAddonStatusEntrySchema),
8055
8224
  { auth: "admin" }
8056
8225
  ),
8226
+ /**
8227
+ * Direct per-node addon listing — calls `$agent.status` on the target
8228
+ * node (or returns the hub registry for `nodeId === 'hub'`) and surfaces
8229
+ * the full addon roster including `version` + `packageName`. The
8230
+ * `topology` cap also includes addons but strips them down to
8231
+ * `{id, capabilities, status}` for the cluster diagram; this method
8232
+ * is the one the per-node "Addons" tab should call.
8233
+ */
8234
+ getNodeAddons: method(
8235
+ z.object({ nodeId: z.string() }),
8236
+ z.array(NodeAddonEntrySchema).readonly(),
8237
+ { auth: "admin" }
8238
+ ),
8057
8239
  setProcessLogLevel: method(
8058
8240
  z.object({ nodeId: z.string(), level: z.string() }),
8059
8241
  SuccessSchema,
@@ -8467,12 +8649,12 @@ export {
8467
8649
  cameraCredentialsCapability as J,
8468
8650
  decoderCapability as K,
8469
8651
  detectionPipelineCapability as L,
8470
- deviceManagerCapability as M,
8471
- deviceOpsCapability as N,
8472
- deviceStateCapability as O,
8473
- embeddingEncoderCapability as P,
8474
- eventsCapability as Q,
8475
- homeAssistantCapability as R,
8652
+ deviceExportCapability as M,
8653
+ deviceManagerCapability as N,
8654
+ deviceOpsCapability as O,
8655
+ deviceStateCapability as P,
8656
+ embeddingEncoderCapability as Q,
8657
+ eventsCapability as R,
8476
8658
  integrationsCapability as S,
8477
8659
  intercomCapability as T,
8478
8660
  localNetworkCapability as U,
@@ -8481,9 +8663,9 @@ export {
8481
8663
  meshOrchestratorCapability as X,
8482
8664
  metricsProviderCapability as Y,
8483
8665
  motionDetectionCapability as Z,
8484
- mqttProviderCapability as _,
8666
+ mqttBrokerCapability as _,
8485
8667
  zoneRulesCapability as a,
8486
- AudioLevelSchema as a$,
8668
+ AudioEventSchema as a$,
8487
8669
  networkAccessCapability as a0,
8488
8670
  networkQualityCapability as a1,
8489
8671
  nodesCapability as a2,
@@ -8497,30 +8679,30 @@ export {
8497
8679
  AUDIO_MACRO_LABELS as aA,
8498
8680
  AccessoriesStatusSchema as aB,
8499
8681
  AccessoryKind as aC,
8500
- AddonAutoUpdateSchema as aD,
8501
- AddonListItemSchema as aE,
8502
- AddonPageDeclarationSchema as aF,
8503
- AddonPageInfoSchema as aG,
8504
- AgentLoadSummarySchema as aH,
8505
- AlertSchema as aI,
8506
- AlertSeveritySchema as aJ,
8507
- AlertSourceSchema as aK,
8508
- AlertStatusSchema as aL,
8509
- ApiKeyRecordSchema as aM,
8510
- ApiKeySummarySchema as aN,
8511
- ArchiveEntrySchema as aO,
8512
- ArchiveManifestSchema as aP,
8513
- AudioAnalysisResultSchema as aQ,
8514
- AudioAnalysisSettingsSchema as aR,
8515
- AudioChunkInputSchema as aS,
8516
- AudioClassSummarySchema as aT,
8517
- AudioClassificationLabelSchema as aU,
8518
- AudioClassificationResultSchema as aV,
8519
- AudioCodecInfoSchema as aW,
8520
- AudioDecodeSessionConfigSchema as aX,
8521
- AudioEncodeSessionConfigSchema as aY,
8522
- AudioEncodedChunkSchema as aZ,
8523
- AudioEventSchema as a_,
8682
+ AddBrokerInputSchema as aD,
8683
+ AddonAutoUpdateSchema as aE,
8684
+ AddonListItemSchema as aF,
8685
+ AddonPageDeclarationSchema as aG,
8686
+ AddonPageInfoSchema as aH,
8687
+ AgentLoadSummarySchema as aI,
8688
+ AlertSchema as aJ,
8689
+ AlertSeveritySchema as aK,
8690
+ AlertSourceSchema as aL,
8691
+ AlertStatusSchema as aM,
8692
+ ApiKeyRecordSchema as aN,
8693
+ ApiKeySummarySchema as aO,
8694
+ ArchiveEntrySchema as aP,
8695
+ ArchiveManifestSchema as aQ,
8696
+ AudioAnalysisResultSchema as aR,
8697
+ AudioAnalysisSettingsSchema as aS,
8698
+ AudioChunkInputSchema as aT,
8699
+ AudioClassSummarySchema as aU,
8700
+ AudioClassificationLabelSchema as aV,
8701
+ AudioClassificationResultSchema as aW,
8702
+ AudioCodecInfoSchema as aX,
8703
+ AudioDecodeSessionConfigSchema as aY,
8704
+ AudioEncodeSessionConfigSchema as aZ,
8705
+ AudioEncodedChunkSchema as a_,
8524
8706
  ptzCapability as aa,
8525
8707
  rebootCapability as ab,
8526
8708
  recordingCapability as ac,
@@ -8548,247 +8730,251 @@ export {
8548
8730
  APPLE_SA_TO_MACRO as ay,
8549
8731
  AUDIO_BACKEND_CHOICES as az,
8550
8732
  zoneAnalyticsCapability as b,
8551
- DeviceStatusSchema as b$,
8552
- AudioMetricsHistoryPointSchema as b0,
8553
- AudioMetricsHistorySchema as b1,
8554
- AudioMetricsSnapshotSchema as b2,
8555
- AudioPcmChunkSchema as b3,
8556
- AuthProviderInfoSchema as b4,
8557
- AuthResultSchema as b5,
8558
- AutoUpdateSettingsSchema as b6,
8559
- AvailableIntegrationTypeSchema as b7,
8560
- BATTERY_DEVICE_PROFILE as b8,
8561
- BackupDestinationInfoSchema as b9,
8562
- CollectionIndexSchema as bA,
8563
- ConfigEntrySchema$1 as bB,
8564
- ConfigSectionWithValuesSchema as bC,
8565
- ConfigTabDeclarationSchema as bD,
8566
- CreateApiKeyInputSchema as bE,
8567
- CreateApiKeyResultSchema as bF,
8568
- CreateIntegrationInputSchema as bG,
8569
- CreateScopedTokenInputSchema as bH,
8570
- CreateScopedTokenResultSchema as bI,
8571
- CreateUserInputSchema as bJ,
8572
- CustomActionInputSchema as bK,
8573
- DEFAULT_AUDIO_ANALYZER_CONFIG as bL,
8574
- DEFAULT_DECODER_HWACCEL_CONFIG as bM,
8575
- DEVICE_PROFILES as bN,
8576
- DEVICE_SETTINGS_CONTRIBUTION_METHODS as bO,
8577
- DEVICE_STATUS_METHOD as bP,
8578
- DecodedFrameSchema as bQ,
8579
- DecoderAssignmentSchema as bR,
8580
- DecoderSessionConfigSchema as bS,
8581
- DecoderStatsSchema as bT,
8582
- DeleteIntegrationResultSchema as bU,
8583
- DetectorOutputSchema as bV,
8584
- DeviceDiscoveryStatusSchema as bW,
8585
- DeviceFeature as bX,
8586
- DeviceInfoSchema as bY,
8587
- DeviceNetworkStatsSchema as bZ,
8588
- DeviceRole as b_,
8589
- BackupEntrySchema as ba,
8590
- BatteryStatusSchema as bb,
8591
- BoundingBoxSchema as bc,
8592
- BrightnessStatusSchema as bd,
8593
- BrokerAudioClientSchema as be,
8594
- BrokerClientsSchema as bf,
8595
- BrokerDecodedClientSchema as bg,
8596
- BrokerRtspClientSchema as bh,
8597
- BrokerStatsSchema as bi,
8598
- BrokerStatusSchema as bj,
8599
- CAM_PROFILE_ORDER as bk,
8600
- CamProfileSchema as bl,
8601
- CamStreamKindSchema as bm,
8602
- CamStreamResolutionSchema as bn,
8603
- CameraCredentialsSchema as bo,
8604
- CameraCredentialsStatusSchema as bp,
8605
- CameraMetricsSchema as bq,
8606
- CameraMetricsWithDeviceIdSchema as br,
8607
- CameraStreamSchema as bs,
8608
- CapScopeSchema as bt,
8609
- CapabilityBindingsSchema as bu,
8610
- ChargingStatus as bv,
8611
- ClientNetworkStatsSchema as bw,
8612
- ClusterAddonNodeDeploymentSchema as bx,
8613
- ClusterAddonStatusEntrySchema as by,
8614
- CollectionColumnSchema as bz,
8733
+ DeviceExportStatusSchema as b$,
8734
+ AudioLevelSchema as b0,
8735
+ AudioMetricsHistoryPointSchema as b1,
8736
+ AudioMetricsHistorySchema as b2,
8737
+ AudioMetricsSnapshotSchema as b3,
8738
+ AudioPcmChunkSchema as b4,
8739
+ AuthProviderInfoSchema as b5,
8740
+ AuthResultSchema as b6,
8741
+ AutoUpdateSettingsSchema as b7,
8742
+ AvailableIntegrationTypeSchema as b8,
8743
+ BATTERY_DEVICE_PROFILE as b9,
8744
+ ClusterAddonNodeDeploymentSchema as bA,
8745
+ ClusterAddonStatusEntrySchema as bB,
8746
+ CollectionColumnSchema as bC,
8747
+ CollectionIndexSchema as bD,
8748
+ ConfigEntrySchema$1 as bE,
8749
+ ConfigSectionWithValuesSchema as bF,
8750
+ ConfigTabDeclarationSchema as bG,
8751
+ CreateApiKeyInputSchema as bH,
8752
+ CreateApiKeyResultSchema as bI,
8753
+ CreateIntegrationInputSchema as bJ,
8754
+ CreateScopedTokenInputSchema as bK,
8755
+ CreateScopedTokenResultSchema as bL,
8756
+ CreateUserInputSchema as bM,
8757
+ CustomActionInputSchema as bN,
8758
+ DEFAULT_AUDIO_ANALYZER_CONFIG as bO,
8759
+ DEFAULT_DECODER_HWACCEL_CONFIG as bP,
8760
+ DEVICE_PROFILES as bQ,
8761
+ DEVICE_SETTINGS_CONTRIBUTION_METHODS as bR,
8762
+ DEVICE_STATUS_METHOD as bS,
8763
+ DecodedFrameSchema as bT,
8764
+ DecoderAssignmentSchema as bU,
8765
+ DecoderSessionConfigSchema as bV,
8766
+ DecoderStatsSchema as bW,
8767
+ DeleteIntegrationResultSchema as bX,
8768
+ DetectorOutputSchema as bY,
8769
+ DeviceDiscoveryStatusSchema as bZ,
8770
+ ExposeInputSchema as b_,
8771
+ BackupDestinationInfoSchema as ba,
8772
+ BackupEntrySchema as bb,
8773
+ BatteryStatusSchema as bc,
8774
+ BoundingBoxSchema as bd,
8775
+ BrightnessStatusSchema as be,
8776
+ BrokerAudioClientSchema as bf,
8777
+ BrokerClientsSchema as bg,
8778
+ BrokerConnectionDetailsSchema as bh,
8779
+ BrokerDecodedClientSchema as bi,
8780
+ BrokerInfoSchema as bj,
8781
+ BrokerRtspClientSchema as bk,
8782
+ BrokerStatsSchema as bl,
8783
+ BrokerStatusSchema$1 as bm,
8784
+ CAM_PROFILE_ORDER as bn,
8785
+ CamProfileSchema as bo,
8786
+ CamStreamKindSchema as bp,
8787
+ CamStreamResolutionSchema as bq,
8788
+ CameraCredentialsSchema as br,
8789
+ CameraCredentialsStatusSchema as bs,
8790
+ CameraMetricsSchema as bt,
8791
+ CameraMetricsWithDeviceIdSchema as bu,
8792
+ CameraStreamSchema as bv,
8793
+ CapScopeSchema as bw,
8794
+ CapabilityBindingsSchema as bx,
8795
+ ChargingStatus as by,
8796
+ ClientNetworkStatsSchema as bz,
8615
8797
  motionCapability as c,
8616
- PIPELINE_OWNER_CAPABILITY_NAMES as c$,
8617
- DeviceType as c0,
8618
- DiscoveredChildDeviceSchema as c1,
8619
- DiscoveredChildStatusSchema as c2,
8620
- DiscoveredDeviceSchema as c3,
8621
- DoorbellPressEventSchema as c4,
8622
- DoorbellStatusSchema as c5,
8623
- EmbeddingInfoSchema as c6,
8624
- EmbeddingResultSchema as c7,
8625
- EncodedPacketSchema as c8,
8626
- EnrichedWidgetMetadataSchema as c9,
8627
- MotionAnalysisResultSchema as cA,
8628
- MotionEventSchema as cB,
8629
- MotionOnMotionChangedDataSchema as cC,
8630
- MotionRegionSchema as cD,
8631
- MotionSourceEnum as cE,
8632
- MotionSourcesSchema as cF,
8633
- MotionStatusSchema as cG,
8634
- MotionTriggerRuntimeStateSchema as cH,
8635
- MotionTriggerStatusSchema as cI,
8636
- MqttStatusSchema as cJ,
8637
- NativeDetectionSchema as cK,
8638
- NativeObjectClassEnum as cL,
8639
- NativeObjectDetectionStatusSchema as cM,
8640
- NetworkAccessStatusSchema as cN,
8641
- NetworkAddressSchema as cO,
8642
- NetworkEndpointSchema as cP,
8643
- NotificationHistoryEntrySchema as cQ,
8644
- NotificationRuleSchema as cR,
8645
- NotificationSchema as cS,
8646
- ObjectEventSchema as cT,
8647
- OrchestratorMetricsSchema as cU,
8648
- OsdOverlayKindEnum as cV,
8649
- OsdOverlayPatchSchema as cW,
8650
- OsdOverlaySchema as cX,
8651
- OsdPositionEnum as cY,
8652
- OsdStatusSchema as cZ,
8653
- PIPELINE_FLOW_CAPABILITY_NAMES as c_,
8654
- EventItemSchema as ca,
8655
- EventKindSchema as cb,
8656
- ExposedResourceSchema as cc,
8657
- FeatureManifestSchema as cd,
8658
- FeatureProbeStatusSchema as ce,
8659
- FrameInputSchema as cf,
8660
- GlobalMetricsSchema as cg,
8661
- HWACCEL_OPTIONS as ch,
8662
- HaServiceCallSchema as ci,
8663
- HaStateSchema as cj,
8664
- HaStatusSchema as ck,
8665
- HealthStatusSchema as cl,
8666
- HistoryPointSchema as cm,
8667
- HistoryResolutionEnum as cn,
8668
- InstalledPackageSchema as co,
8669
- IntegrationLiteSchema as cp,
8670
- IntegrationWithStateSchema as cq,
8671
- IntercomAbilitySchema as cr,
8672
- IntercomStatusSchema as cs,
8673
- LocationStatSchema as ct,
8674
- LogEntrySchema as cu,
8675
- LogLevelSchema$1 as cv,
8676
- LogStreamEntrySchema as cw,
8677
- MODEL_FORMATS as cx,
8678
- MediaFileSchema as cy,
8679
- MethodAccessSchema as cz,
8798
+ OsdOverlayPatchSchema as c$,
8799
+ UnexposeInputSchema as c0,
8800
+ DeviceFeature as c1,
8801
+ DeviceInfoSchema as c2,
8802
+ DeviceNetworkStatsSchema as c3,
8803
+ DeviceRole as c4,
8804
+ DeviceStatusSchema as c5,
8805
+ DeviceType as c6,
8806
+ DiscoveredChildDeviceSchema as c7,
8807
+ DiscoveredChildStatusSchema as c8,
8808
+ DiscoveredDeviceSchema as c9,
8809
+ LogLevelSchema$1 as cA,
8810
+ LogStreamEntrySchema as cB,
8811
+ MODEL_FORMATS as cC,
8812
+ MediaFileSchema as cD,
8813
+ MethodAccessSchema as cE,
8814
+ MotionAnalysisResultSchema as cF,
8815
+ MotionEventSchema as cG,
8816
+ MotionOnMotionChangedDataSchema as cH,
8817
+ MotionRegionSchema as cI,
8818
+ MotionSourceEnum as cJ,
8819
+ MotionSourcesSchema as cK,
8820
+ MotionStatusSchema as cL,
8821
+ MotionTriggerRuntimeStateSchema as cM,
8822
+ MotionTriggerStatusSchema as cN,
8823
+ StatusSchema as cO,
8824
+ NativeDetectionSchema as cP,
8825
+ NativeObjectClassEnum as cQ,
8826
+ NativeObjectDetectionStatusSchema as cR,
8827
+ NetworkAccessStatusSchema as cS,
8828
+ NetworkAddressSchema as cT,
8829
+ NetworkEndpointSchema as cU,
8830
+ NotificationHistoryEntrySchema as cV,
8831
+ NotificationRuleSchema as cW,
8832
+ NotificationSchema as cX,
8833
+ ObjectEventSchema as cY,
8834
+ OrchestratorMetricsSchema as cZ,
8835
+ OsdOverlayKindEnum as c_,
8836
+ DoorbellPressEventSchema as ca,
8837
+ DoorbellStatusSchema as cb,
8838
+ EmbeddingInfoSchema as cc,
8839
+ EmbeddingResultSchema as cd,
8840
+ EncodedPacketSchema as ce,
8841
+ EnrichedWidgetMetadataSchema as cf,
8842
+ EventItemSchema as cg,
8843
+ EventKindSchema as ch,
8844
+ ExposedDeviceSchema as ci,
8845
+ ExposedResourceSchema as cj,
8846
+ FeatureManifestSchema as ck,
8847
+ FeatureProbeStatusSchema as cl,
8848
+ FrameInputSchema as cm,
8849
+ GetStreamWithCodecInputSchema as cn,
8850
+ GlobalMetricsSchema as co,
8851
+ HWACCEL_OPTIONS as cp,
8852
+ HealthStatusSchema as cq,
8853
+ HistoryPointSchema as cr,
8854
+ HistoryResolutionEnum as cs,
8855
+ InstalledPackageSchema as ct,
8856
+ IntegrationLiteSchema as cu,
8857
+ IntegrationWithStateSchema as cv,
8858
+ IntercomAbilitySchema as cw,
8859
+ IntercomStatusSchema as cx,
8860
+ LocationStatSchema as cy,
8861
+ LogEntrySchema as cz,
8680
8862
  doorbellCapability as d,
8681
- StreamFormatSchema as d$,
8682
- PackageUpdateSchema as d0,
8683
- PackageVersionInfoSchema as d1,
8684
- PasskeySummarySchema as d2,
8685
- PcmSampleFormatSchema as d3,
8686
- PerScopeBreakdownSchema as d4,
8687
- PipelineAssignmentSchema as d5,
8688
- PipelineDefaultStepSchema as d6,
8689
- PipelineEngineChoiceSchema as d7,
8690
- PipelineRunResultBridge as d8,
8691
- PipelineStepInputSchema as d9,
8692
- ScopedTokenSummarySchema as dA,
8693
- SearchResultSchema as dB,
8694
- SegmentSchema as dC,
8695
- SendEmailInputSchema as dD,
8696
- SendEmailResultSchema as dE,
8697
- SettingsPatchSchema as dF,
8698
- SettingsRecordSchema as dG,
8699
- SettingsSchemaWithValuesSchema as dH,
8700
- SettingsUpdateResultSchema as dI,
8701
- SmtpStatusSchema as dJ,
8702
- SnapshotImageSchema as dK,
8703
- SpatialDetectionSchema as dL,
8704
- SsoBridgeClaimsSchema as dM,
8705
- AbortUploadInputSchema as dN,
8706
- BeginDownloadInputSchema as dO,
8707
- BeginDownloadResultSchema as dP,
8708
- BeginUploadInputSchema as dQ,
8709
- BeginUploadResultSchema as dR,
8710
- EndDownloadInputSchema as dS,
8711
- FinalizeUploadInputSchema as dT,
8712
- StorageLocationRefSchema as dU,
8713
- StorageLocationSchema as dV,
8714
- StorageLocationTypeSchema as dW,
8715
- ProviderInfoSchema as dX,
8716
- ReadChunkInputSchema as dY,
8717
- TestLocationResultSchema as dZ,
8718
- WriteChunkInputSchema as d_,
8719
- PlaceholderReasonSchema as da,
8720
- PolygonPointSchema as db,
8721
- ProfileSlotSchema as dc,
8722
- ProfileSlotStatusSchema as dd,
8723
- ProviderStatusSchema as de,
8724
- PtzAutotrackRuntimeStateSchema as df,
8725
- PtzAutotrackSettingsSchema as dg,
8726
- PtzAutotrackStatusSchema as dh,
8727
- PtzAutotrackTargetOptionSchema as di,
8728
- PtzMoveCommandSchema as dj,
8729
- PtzPositionSchema as dk,
8730
- PtzPresetSchema as dl,
8731
- PublishInputSchema as dm,
8732
- QueryFilterSchema as dn,
8733
- RegisteredStreamSchema as dp,
8734
- RemoteAccessEndpointSchema as dq,
8735
- RemoteAccessProviderInfoSchema as dr,
8736
- ReportMotionInputSchema as ds,
8737
- RtspRestreamEntrySchema as dt,
8738
- RunnerCameraConfigSchema as du,
8739
- RunnerCameraDeviceUIFields as dv,
8740
- RunnerLocalLoadSchema as dw,
8741
- RunnerLocalMetricsSchema as dx,
8742
- STORAGE_LOCATION_CARDINALITY as dy,
8743
- ScopedTokenSchema as dz,
8863
+ StorageLocationSchema as d$,
8864
+ OsdOverlaySchema as d0,
8865
+ OsdPositionEnum as d1,
8866
+ OsdStatusSchema as d2,
8867
+ PIPELINE_FLOW_CAPABILITY_NAMES as d3,
8868
+ PIPELINE_OWNER_CAPABILITY_NAMES as d4,
8869
+ PackageUpdateSchema as d5,
8870
+ PackageVersionInfoSchema as d6,
8871
+ PasskeySummarySchema as d7,
8872
+ PcmSampleFormatSchema as d8,
8873
+ PerScopeBreakdownSchema as d9,
8874
+ RunnerCameraDeviceUIFields as dA,
8875
+ RunnerLocalLoadSchema as dB,
8876
+ RunnerLocalMetricsSchema as dC,
8877
+ STORAGE_LOCATION_CARDINALITY as dD,
8878
+ ScopedTokenSchema as dE,
8879
+ ScopedTokenSummarySchema as dF,
8880
+ SearchResultSchema as dG,
8881
+ SegmentSchema as dH,
8882
+ SendEmailInputSchema as dI,
8883
+ SendEmailResultSchema as dJ,
8884
+ SettingsPatchSchema as dK,
8885
+ SettingsRecordSchema as dL,
8886
+ SettingsSchemaWithValuesSchema as dM,
8887
+ SettingsUpdateResultSchema as dN,
8888
+ SmtpStatusSchema as dO,
8889
+ SnapshotImageSchema as dP,
8890
+ SpatialDetectionSchema as dQ,
8891
+ SsoBridgeClaimsSchema as dR,
8892
+ StartEmbeddedInputSchema as dS,
8893
+ AbortUploadInputSchema as dT,
8894
+ BeginDownloadInputSchema as dU,
8895
+ BeginDownloadResultSchema as dV,
8896
+ BeginUploadInputSchema as dW,
8897
+ BeginUploadResultSchema as dX,
8898
+ EndDownloadInputSchema as dY,
8899
+ FinalizeUploadInputSchema as dZ,
8900
+ StorageLocationRefSchema as d_,
8901
+ PipelineAssignmentSchema as da,
8902
+ PipelineDefaultStepSchema as db,
8903
+ PipelineEngineChoiceSchema as dc,
8904
+ PipelineRunResultBridge as dd,
8905
+ PipelineStepInputSchema as de,
8906
+ PlaceholderReasonSchema as df,
8907
+ PolygonPointSchema as dg,
8908
+ ProfileSlotSchema as dh,
8909
+ ProfileSlotStatusSchema as di,
8910
+ ProviderStatusSchema as dj,
8911
+ PtzAutotrackRuntimeStateSchema as dk,
8912
+ PtzAutotrackSettingsSchema as dl,
8913
+ PtzAutotrackStatusSchema as dm,
8914
+ PtzAutotrackTargetOptionSchema as dn,
8915
+ PtzMoveCommandSchema as dp,
8916
+ PtzPositionSchema as dq,
8917
+ PtzPresetSchema as dr,
8918
+ QueryFilterSchema as ds,
8919
+ RegisteredStreamSchema as dt,
8920
+ RemoteAccessEndpointSchema as du,
8921
+ RemoteAccessProviderInfoSchema as dv,
8922
+ ReportMotionInputSchema as dw,
8923
+ RtpSourceSchema as dx,
8924
+ RtspRestreamEntrySchema as dy,
8925
+ RunnerCameraConfigSchema as dz,
8744
8926
  errMsg as e,
8745
- StreamInfoSchema as e0,
8746
- StreamNetworkStatsSchema as e1,
8747
- StreamSourceEntrySchema$1 as e2,
8748
- StreamSourceSchema as e3,
8749
- SubscribeInputSchema as e4,
8750
- SubscriptionInfoSchema as e5,
8751
- SwitchStatusSchema as e6,
8752
- SystemMetricsSchema as e7,
8753
- TestConnectionResultSchema as e8,
8754
- ToastSchema as e9,
8755
- ZoneSchema as eA,
8756
- ZoneScopeBreakdownSchema as eB,
8757
- accessoryStableId as eC,
8758
- deviceMatchesProfile as eD,
8759
- event as eE,
8760
- expandCapMethods as eF,
8761
- getAudioMacroClassIds as eG,
8762
- mapAudioLabelToMacro as eH,
8763
- method as eI,
8764
- resolveDeviceProfile as eJ,
8765
- webrtcClientHintsSchema as eK,
8766
- TokenScopeSchema as ea,
8767
- TopologyNodeSchema as eb,
8768
- TopologyProcessSchema as ec,
8769
- TopologyServiceSchema as ed,
8770
- TrackSchema as ee,
8771
- TrackStateSchema as ef,
8772
- TrackedDetectionSchema as eg,
8773
- TurnProviderInfoSchema as eh,
8774
- TurnServerSchema as ei,
8775
- UpdateIntegrationInputSchema as ej,
8776
- UpdateUserInputSchema as ek,
8777
- UserRecordSchema as el,
8778
- UserSummarySchema as em,
8779
- WELL_KNOWN_TABS as en,
8780
- WELL_KNOWN_TAB_MAP as eo,
8781
- WebrtcStreamChoiceSchema as ep,
8782
- WebrtcStreamTargetSchema as eq,
8783
- WidgetHostEnum as er,
8784
- WidgetMetadataSchema as es,
8785
- WidgetSizeEnum as et,
8786
- YAMNET_TO_MACRO as eu,
8787
- ZoneKindEnum as ev,
8788
- ZoneRuleModeEnum as ew,
8789
- ZoneRuleSchema as ex,
8790
- ZoneRuleStageEnum as ey,
8791
- ZoneRulesArraySchema as ez,
8927
+ StorageLocationTypeSchema as e0,
8928
+ ProviderInfoSchema as e1,
8929
+ ReadChunkInputSchema as e2,
8930
+ TestLocationResultSchema as e3,
8931
+ WriteChunkInputSchema as e4,
8932
+ StreamFormatSchema as e5,
8933
+ StreamInfoSchema as e6,
8934
+ StreamNetworkStatsSchema as e7,
8935
+ StreamSourceEntrySchema$1 as e8,
8936
+ StreamSourceSchema as e9,
8937
+ ZoneRuleModeEnum as eA,
8938
+ ZoneRuleSchema as eB,
8939
+ ZoneRuleStageEnum as eC,
8940
+ ZoneRulesArraySchema as eD,
8941
+ ZoneSchema as eE,
8942
+ ZoneScopeBreakdownSchema as eF,
8943
+ accessoryStableId as eG,
8944
+ deviceMatchesProfile as eH,
8945
+ event as eI,
8946
+ expandCapMethods as eJ,
8947
+ getAudioMacroClassIds as eK,
8948
+ mapAudioLabelToMacro as eL,
8949
+ method as eM,
8950
+ resolveDeviceProfile as eN,
8951
+ webrtcClientHintsSchema as eO,
8952
+ SwitchStatusSchema as ea,
8953
+ SystemMetricsSchema as eb,
8954
+ TestConnectionResultSchema as ec,
8955
+ ToastSchema as ed,
8956
+ TokenScopeSchema as ee,
8957
+ TopologyNodeSchema as ef,
8958
+ TopologyProcessSchema as eg,
8959
+ TopologyServiceSchema as eh,
8960
+ TrackSchema as ei,
8961
+ TrackStateSchema as ej,
8962
+ TrackedDetectionSchema as ek,
8963
+ TurnProviderInfoSchema as el,
8964
+ TurnServerSchema as em,
8965
+ UpdateIntegrationInputSchema as en,
8966
+ UpdateUserInputSchema as eo,
8967
+ UserRecordSchema as ep,
8968
+ UserSummarySchema as eq,
8969
+ WELL_KNOWN_TABS as er,
8970
+ WELL_KNOWN_TAB_MAP as es,
8971
+ WebrtcStreamChoiceSchema as et,
8972
+ WebrtcStreamTargetSchema as eu,
8973
+ WidgetHostEnum as ev,
8974
+ WidgetMetadataSchema as ew,
8975
+ WidgetSizeEnum as ex,
8976
+ YAMNET_TO_MACRO as ey,
8977
+ ZoneKindEnum as ez,
8792
8978
  featureProbeCapability as f,
8793
8979
  deviceStatusCapability as g,
8794
8980
  hydrateSchema as h,
@@ -8811,4 +8997,4 @@ export {
8811
8997
  addonsCapability as y,
8812
8998
  zonesCapability as z
8813
8999
  };
8814
- //# sourceMappingURL=index-BKnvgAep.mjs.map
9000
+ //# sourceMappingURL=index-YnRVILXN.mjs.map