@camstack/types 0.1.30 → 0.1.32

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 (98) hide show
  1. package/dist/addon/build-addon-route-provider.d.ts +55 -0
  2. package/dist/addon/build-addon-route-provider.d.ts.map +1 -0
  3. package/dist/capabilities/addon-routes.cap.d.ts +64 -0
  4. package/dist/capabilities/addon-routes.cap.d.ts.map +1 -1
  5. package/dist/capabilities/admin-ui.cap.d.ts +6 -2
  6. package/dist/capabilities/admin-ui.cap.d.ts.map +1 -1
  7. package/dist/capabilities/advanced-notifier.cap.d.ts +202 -29
  8. package/dist/capabilities/advanced-notifier.cap.d.ts.map +1 -1
  9. package/dist/capabilities/audio-codec.cap.d.ts +2 -2
  10. package/dist/capabilities/auth-provider.cap.d.ts +4 -4
  11. package/dist/capabilities/auth-provider.cap.d.ts.map +1 -1
  12. package/dist/capabilities/authentication.cap.d.ts +4 -0
  13. package/dist/capabilities/authentication.cap.d.ts.map +1 -1
  14. package/dist/capabilities/capability-definition.d.ts +22 -0
  15. package/dist/capabilities/capability-definition.d.ts.map +1 -1
  16. package/dist/capabilities/device-export.cap.d.ts +77 -0
  17. package/dist/capabilities/device-export.cap.d.ts.map +1 -0
  18. package/dist/capabilities/embedding-encoder.cap.d.ts +14 -7
  19. package/dist/capabilities/embedding-encoder.cap.d.ts.map +1 -1
  20. package/dist/capabilities/index.d.ts +24 -5
  21. package/dist/capabilities/index.d.ts.map +1 -1
  22. package/dist/capabilities/intercom.cap.d.ts +34 -0
  23. package/dist/capabilities/intercom.cap.d.ts.map +1 -1
  24. package/dist/capabilities/mesh-network.cap.d.ts +32 -16
  25. package/dist/capabilities/mesh-network.cap.d.ts.map +1 -1
  26. package/dist/capabilities/mqtt-broker.cap.d.ts +153 -0
  27. package/dist/capabilities/mqtt-broker.cap.d.ts.map +1 -0
  28. package/dist/capabilities/network-access.cap.d.ts +41 -1
  29. package/dist/capabilities/network-access.cap.d.ts.map +1 -1
  30. package/dist/capabilities/platform-probe.cap.d.ts +234 -15
  31. package/dist/capabilities/platform-probe.cap.d.ts.map +1 -1
  32. package/dist/capabilities/settings-store.cap.d.ts +8 -2
  33. package/dist/capabilities/settings-store.cap.d.ts.map +1 -1
  34. package/dist/capabilities/smtp-provider.cap.d.ts +63 -0
  35. package/dist/capabilities/smtp-provider.cap.d.ts.map +1 -0
  36. package/dist/capabilities/sso-bridge.cap.d.ts +61 -0
  37. package/dist/capabilities/sso-bridge.cap.d.ts.map +1 -0
  38. package/dist/capabilities/stream-broker.cap.d.ts +90 -85
  39. package/dist/capabilities/stream-broker.cap.d.ts.map +1 -1
  40. package/dist/capabilities/user-management.cap.d.ts +513 -184
  41. package/dist/capabilities/user-management.cap.d.ts.map +1 -1
  42. package/dist/capabilities/user-passkeys.cap.d.ts +92 -0
  43. package/dist/capabilities/user-passkeys.cap.d.ts.map +1 -0
  44. package/dist/capabilities/webrtc-session.cap.d.ts +34 -0
  45. package/dist/capabilities/webrtc-session.cap.d.ts.map +1 -1
  46. package/dist/generated/addon-api.d.ts +11940 -9272
  47. package/dist/generated/addon-api.d.ts.map +1 -1
  48. package/dist/generated/cap-status-types.d.ts +5 -1
  49. package/dist/generated/cap-status-types.d.ts.map +1 -1
  50. package/dist/generated/capability-router-map.d.ts +19 -4
  51. package/dist/generated/capability-router-map.d.ts.map +1 -1
  52. package/dist/generated/device-proxy.d.ts +2 -0
  53. package/dist/generated/device-proxy.d.ts.map +1 -1
  54. package/dist/generated/method-access-map.d.ts +6 -1
  55. package/dist/generated/method-access-map.d.ts.map +1 -1
  56. package/dist/generated/provider-kind-map.d.ts +22 -0
  57. package/dist/generated/provider-kind-map.d.ts.map +1 -0
  58. package/dist/generated/scope-presets.d.ts +17 -0
  59. package/dist/generated/scope-presets.d.ts.map +1 -0
  60. package/dist/generated/system-proxy.d.ts +8 -4
  61. package/dist/generated/system-proxy.d.ts.map +1 -1
  62. package/dist/{index-DVKPWMwv.mjs → index-BBVUwOlZ.mjs} +1040 -500
  63. package/dist/index-BBVUwOlZ.mjs.map +1 -0
  64. package/dist/{index-s8uJNgNs.js → index-BUBhoPUu.js} +741 -201
  65. package/dist/index-BUBhoPUu.js.map +1 -0
  66. package/dist/index.d.ts +9 -3
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +852 -500
  69. package/dist/index.js.map +1 -1
  70. package/dist/index.mjs +1109 -757
  71. package/dist/index.mjs.map +1 -1
  72. package/dist/interfaces/addon-routes.d.ts +8 -2
  73. package/dist/interfaces/addon-routes.d.ts.map +1 -1
  74. package/dist/interfaces/addon.d.ts +14 -3
  75. package/dist/interfaces/addon.d.ts.map +1 -1
  76. package/dist/interfaces/advanced-notifier.d.ts +8 -7
  77. package/dist/interfaces/advanced-notifier.d.ts.map +1 -1
  78. package/dist/interfaces/api-responses.d.ts +2 -3
  79. package/dist/interfaces/api-responses.d.ts.map +1 -1
  80. package/dist/interfaces/auth.d.ts +14 -11
  81. package/dist/interfaces/auth.d.ts.map +1 -1
  82. package/dist/interfaces/capability.d.ts +6 -6
  83. package/dist/interfaces/capability.d.ts.map +1 -1
  84. package/dist/interfaces/embedding-encoder.d.ts +16 -7
  85. package/dist/interfaces/embedding-encoder.d.ts.map +1 -1
  86. package/dist/interfaces/rtp-egress.d.ts +45 -0
  87. package/dist/interfaces/rtp-egress.d.ts.map +1 -0
  88. package/dist/interfaces/storage.d.ts +15 -2
  89. package/dist/interfaces/storage.d.ts.map +1 -1
  90. package/dist/node.js +1 -1
  91. package/dist/node.mjs +1 -1
  92. package/dist/schemas/auth-records.d.ts +105 -50
  93. package/dist/schemas/auth-records.d.ts.map +1 -1
  94. package/package.json +1 -1
  95. package/dist/index-DVKPWMwv.mjs.map +0 -1
  96. package/dist/index-s8uJNgNs.js.map +0 -1
  97. package/dist/interfaces/auth-provider.d.ts +0 -39
  98. package/dist/interfaces/auth-provider.d.ts.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(),
@@ -3544,7 +3503,7 @@ const SettingsRecordSchema = z.object({
3544
3503
  });
3545
3504
  const CollectionColumnSchema = z.object({
3546
3505
  name: z.string(),
3547
- type: z.enum(["TEXT", "INTEGER", "REAL", "JSON"]),
3506
+ type: z.enum(["TEXT", "INTEGER", "REAL", "JSON", "BOOLEAN"]),
3548
3507
  primaryKey: z.boolean().optional(),
3549
3508
  notNull: z.boolean().optional(),
3550
3509
  unique: z.boolean().optional()
@@ -3659,14 +3618,293 @@ 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)
3631
+ }
3632
+ };
3633
+ const SsoBridgeClaimsSchema = z.object({
3634
+ userId: z.string(),
3635
+ username: z.string(),
3636
+ isAdmin: z.boolean(),
3637
+ provider: z.string(),
3638
+ email: 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()
3649
+ });
3650
+ const ssoBridgeCapability = {
3651
+ name: "sso-bridge",
3652
+ scope: "system",
3653
+ mode: "singleton",
3654
+ internal: true,
3655
+ methods: {
3656
+ signBridgeToken: method(
3657
+ z.object({
3658
+ claims: SsoBridgeClaimsSchema,
3659
+ ttlSec: z.number().int().positive().optional()
3660
+ }),
3661
+ z.object({ token: z.string() })
3662
+ ),
3663
+ verifyBridgeToken: method(
3664
+ z.object({ token: z.string() }),
3665
+ SsoBridgeClaimsSchema.nullable()
3666
+ )
3667
+ }
3668
+ };
3669
+ const PasskeySummarySchema = z.object({
3670
+ credentialId: z.string(),
3671
+ label: z.string(),
3672
+ createdAt: z.number(),
3673
+ lastUsedAt: z.number().nullable(),
3674
+ transports: z.array(z.string()).default([])
3675
+ });
3676
+ const userPasskeysCapability = {
3677
+ name: "user-passkeys",
3678
+ scope: "system",
3679
+ mode: "collection",
3680
+ internal: true,
3681
+ methods: {
3682
+ beginRegistration: method(
3683
+ z.object({ userId: z.string(), username: z.string() }),
3684
+ // PublicKeyCredentialCreationOptionsJSON — opaque JSON shape from
3685
+ // @simplewebauthn. The browser passes it straight to credentials.create().
3686
+ z.object({ optionsJSON: z.record(z.string(), z.unknown()) }),
3687
+ { kind: "mutation", auth: "admin", access: "create" }
3688
+ ),
3689
+ finishRegistration: method(
3690
+ z.object({
3691
+ userId: z.string(),
3692
+ /** RegistrationResponseJSON from the browser. */
3693
+ response: z.record(z.string(), z.unknown()),
3694
+ /** Operator-visible label (e.g. "MacBook Touch ID"). */
3695
+ label: z.string()
3696
+ }),
3697
+ z.object({ success: z.literal(true), credentialId: z.string() }),
3698
+ { kind: "mutation", auth: "admin", access: "create" }
3699
+ ),
3700
+ beginAuthentication: method(
3701
+ // userId optional — when absent, the addon emits a "passkey discovery"
3702
+ // (`allowCredentials: []`) so the browser shows every available
3703
+ // credential. When present, only the user's credentials are allowed.
3704
+ z.object({ userId: z.string().optional() }),
3705
+ z.object({ optionsJSON: z.record(z.string(), z.unknown()) }),
3706
+ { kind: "mutation", access: "view" }
3707
+ ),
3708
+ finishAuthentication: method(
3709
+ z.object({
3710
+ /** Required — the user the assertion belongs to (verified). */
3711
+ userId: z.string(),
3712
+ /** AuthenticationResponseJSON from the browser. */
3713
+ response: z.record(z.string(), z.unknown())
3714
+ }),
3715
+ z.object({ verified: z.boolean() }),
3716
+ { kind: "mutation", access: "view" }
3717
+ ),
3718
+ listPasskeys: method(
3719
+ z.object({ userId: z.string() }),
3720
+ z.array(PasskeySummarySchema),
3721
+ { auth: "admin" }
3722
+ ),
3723
+ removePasskey: method(
3724
+ z.object({ userId: z.string(), credentialId: z.string() }),
3725
+ z.object({ success: z.literal(true) }),
3726
+ { kind: "mutation", auth: "admin", access: "delete" }
3727
+ )
3728
+ }
3729
+ };
3730
+ const EmailAddressSchema = z.email();
3731
+ const SendEmailInputSchema = z.object({
3732
+ to: z.union([EmailAddressSchema, z.array(EmailAddressSchema).min(1)]),
3733
+ cc: z.array(EmailAddressSchema).optional(),
3734
+ bcc: z.array(EmailAddressSchema).optional(),
3735
+ /** RFC 5322 `From` field. Most relays will reject if the domain
3736
+ * isn't authorised — the addon is responsible for substituting a
3737
+ * sane default when omitted. */
3738
+ from: z.string().optional(),
3739
+ /** Optional `Reply-To` override. */
3740
+ replyTo: z.string().optional(),
3741
+ subject: z.string(),
3742
+ /** Plain-text body. Required even when `html` is present (fallback
3743
+ * for clients that strip HTML — including most spam filters). */
3744
+ text: z.string(),
3745
+ /** Optional HTML body. Renders alongside `text` as multi-part. */
3746
+ html: z.string().optional()
3747
+ });
3748
+ const SendEmailResultSchema = z.object({
3749
+ messageId: z.string(),
3750
+ accepted: z.array(EmailAddressSchema).default([]),
3751
+ rejected: z.array(EmailAddressSchema).default([])
3752
+ });
3753
+ const SmtpStatusSchema = z.object({
3754
+ /** True iff the addon has successfully verified the relay. */
3755
+ ready: z.boolean(),
3756
+ /** Operator-visible host string (no credentials). */
3757
+ host: z.string(),
3758
+ /** Last error message reported by the relay, when not ready. */
3759
+ error: z.string().optional(),
3760
+ /** Last successful verify timestamp (unix ms). */
3761
+ lastVerifiedAt: z.number().optional()
3762
+ });
3763
+ const smtpProviderCapability = {
3764
+ name: "smtp-provider",
3765
+ scope: "system",
3766
+ mode: "collection",
3767
+ internal: true,
3768
+ providerKind: "email",
3769
+ methods: {
3770
+ sendEmail: method(
3771
+ SendEmailInputSchema,
3772
+ SendEmailResultSchema,
3773
+ { kind: "mutation", auth: "admin", access: "create" }
3774
+ ),
3775
+ /** Round-trip ping against the SMTP relay (EHLO + AUTH if configured).
3776
+ * Used by the operator's "Test connection" button. */
3777
+ verify: method(
3778
+ z.void(),
3779
+ SmtpStatusSchema,
3780
+ { kind: "mutation", auth: "admin", access: "view" }
3781
+ ),
3782
+ getStatus: method(
3783
+ z.void(),
3784
+ SmtpStatusSchema,
3785
+ { auth: "admin" }
3786
+ )
3787
+ }
3788
+ };
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(),
3814
+ /**
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).
3819
+ */
3820
+ clientIdPrefix: z.string().optional()
3821
+ });
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()
3828
+ });
3829
+ const AddBrokerResultSchema = z.object({
3830
+ id: z.string()
3831
+ });
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()
3848
+ });
3849
+ const StatusSchema = z.object({
3850
+ brokerCount: z.number(),
3851
+ embeddedRunning: z.boolean()
3852
+ });
3853
+ const mqttBrokerCapability = {
3854
+ name: "mqtt-broker",
3855
+ scope: "system",
3856
+ mode: "collection",
3857
+ providerKind: "broker",
3858
+ status: { schema: StatusSchema, kind: "poll" },
3859
+ methods: {
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)
3868
+ }
3869
+ };
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()
3875
+ });
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()
3881
+ });
3882
+ const ExposeInputSchema = z.object({
3883
+ deviceId: z.string(),
3884
+ capabilities: z.array(z.string()).optional()
3885
+ });
3886
+ const UnexposeInputSchema = z.object({ deviceId: z.string() });
3887
+ const deviceExportCapability = {
3888
+ name: "device-export",
3889
+ scope: "system",
3890
+ mode: "collection",
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,
3902
+ methods: {
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" })
3670
3908
  }
3671
3909
  };
3672
3910
  const AddonPageDeclarationSchema$1 = z.object({
@@ -3782,7 +4020,35 @@ const addonWidgetsCapability = {
3782
4020
  };
3783
4021
  const AddonHttpRouteSchema = z.object({
3784
4022
  method: z.enum(["GET", "POST", "PUT", "DELETE", "PATCH"]),
3785
- path: z.string()
4023
+ path: z.string(),
4024
+ access: z.enum(["public", "authenticated", "admin"]).optional(),
4025
+ description: z.string().optional()
4026
+ });
4027
+ const InvokeRequestSchema = z.object({
4028
+ method: z.string(),
4029
+ path: z.string(),
4030
+ params: z.record(z.string(), z.string()),
4031
+ query: z.record(z.string(), z.string()),
4032
+ body: z.unknown(),
4033
+ headers: z.record(z.string(), z.string()),
4034
+ user: z.object({
4035
+ id: z.string(),
4036
+ username: z.string(),
4037
+ isAdmin: z.boolean()
4038
+ }).optional(),
4039
+ scopedToken: z.unknown().optional()
4040
+ });
4041
+ const InvokeReplyEnvelopeSchema = z.object({
4042
+ status: z.number().int(),
4043
+ headers: z.record(z.string(), z.string()),
4044
+ /** When set, the hub MUST `reply.redirect(redirectUrl)` instead of
4045
+ * sending `body`. Status defaults to 302 when this is set unless
4046
+ * the handler called `reply.code(...)` explicitly. */
4047
+ redirectUrl: z.string().nullable(),
4048
+ /** JSON-serializable body. `undefined` is treated as "no body". */
4049
+ body: z.unknown().optional(),
4050
+ /** Set when the handler called `reply.type(mime)`. */
4051
+ contentType: z.string().optional()
3786
4052
  });
3787
4053
  const addonRoutesCapability = {
3788
4054
  name: "addon-routes",
@@ -3790,7 +4056,16 @@ const addonRoutesCapability = {
3790
4056
  mode: "collection",
3791
4057
  internal: true,
3792
4058
  methods: {
3793
- getRoutes: method(z.void(), z.array(AddonHttpRouteSchema))
4059
+ getRoutes: method(z.void(), z.array(AddonHttpRouteSchema)),
4060
+ /**
4061
+ * Cross-process dispatch entry point. Forked addons implement this
4062
+ * (via `buildAddonRouteProvider`) so the hub's Fastify catch-all
4063
+ * can route through Moleculer when the handler lives in a worker.
4064
+ *
4065
+ * Local addons can implement it for free with the same helper;
4066
+ * the hub bypasses the wire on co-located addons.
4067
+ */
4068
+ invoke: method(InvokeRequestSchema, InvokeReplyEnvelopeSchema, { kind: "mutation" })
3794
4069
  }
3795
4070
  };
3796
4071
  const HWACCEL_OPTIONS = [
@@ -4031,6 +4306,29 @@ const webrtcSessionCapability = {
4031
4306
  z.object({ sessionId: z.string(), sdpOffer: z.string() }),
4032
4307
  { kind: "mutation" }
4033
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
+ ),
4034
4332
  handleAnswer: method(
4035
4333
  z.object({
4036
4334
  deviceId: z.number().int().nonnegative(),
@@ -4670,12 +4968,12 @@ const audioCodecCapability = {
4670
4968
  };
4671
4969
  const EmbeddingResultSchema = z.object({
4672
4970
  embedding: z.array(z.number()),
4673
- dimensions: z.number()
4971
+ inferenceMs: z.number()
4674
4972
  });
4675
4973
  const EmbeddingInfoSchema = z.object({
4676
4974
  modelId: z.string(),
4677
- dimensions: z.number(),
4678
- inputSize: z.number()
4975
+ embeddingDim: z.number(),
4976
+ ready: z.boolean()
4679
4977
  });
4680
4978
  const embeddingEncoderCapability = {
4681
4979
  name: "embedding-encoder",
@@ -5326,7 +5624,14 @@ const AuthResultSchema = z.object({
5326
5624
  username: z.string(),
5327
5625
  email: z.string().optional(),
5328
5626
  displayName: z.string().optional(),
5329
- roles: z.array(z.string()).optional()
5627
+ /**
5628
+ * Whether the authenticating user is an admin. The auth-provider
5629
+ * surface returns this so the server's login flow can mint a JWT
5630
+ * with the correct bypass flag. Non-admin users authenticated via
5631
+ * an external IdP still need their scopes assigned by an admin via
5632
+ * `setUserScopes` — the SSO flow doesn't carry permissions.
5633
+ */
5634
+ isAdmin: z.boolean().default(false)
5330
5635
  });
5331
5636
  const authProviderCapability = {
5332
5637
  name: "auth-provider",
@@ -5347,6 +5652,14 @@ const authProviderCapability = {
5347
5652
  const AuthProviderInfoSchema = z.object({
5348
5653
  /** Stable id matching the addon id (used for `getLoginUrl({addonId,…})`). */
5349
5654
  addonId: z.string(),
5655
+ /**
5656
+ * Per-instance id when one addon registers multiple "logical"
5657
+ * providers (e.g. OIDC with Google + Microsoft + custom). The login
5658
+ * URL becomes `/addon/${addonId}/${instanceId}/start` — handler reads
5659
+ * `:instanceId` from the route. Empty/unset means the addon is a
5660
+ * single-instance provider; the URL is `/addon/${addonId}/start`.
5661
+ */
5662
+ instanceId: z.string().optional(),
5350
5663
  /** Display label shown on the login button + admin row. */
5351
5664
  displayName: z.string(),
5352
5665
  /** Optional iconography hint (lucide-react icon name OR emoji). */
@@ -5357,6 +5670,8 @@ const AuthProviderInfoSchema = z.object({
5357
5670
  /** When true, the provider exposes a credential-form login flow
5358
5671
  * (`validateCredentials` accepts username + password). */
5359
5672
  hasCredentialFlow: z.boolean(),
5673
+ /** Provider kind, drives admin-UI hint dispatch (oidc / saml / totp / …). */
5674
+ kind: z.string().optional(),
5360
5675
  /** Operator-facing status string (e.g. "Connected to https://login.acme.com"). */
5361
5676
  status: z.string().optional(),
5362
5677
  /** When false, the provider is registered but disabled by config; the
@@ -5393,16 +5708,36 @@ const NetworkAccessStatusSchema = z.object({
5393
5708
  endpoint: NetworkEndpointSchema.nullable(),
5394
5709
  error: z.string().optional()
5395
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
+ });
5396
5724
  const networkAccessCapability = {
5397
5725
  name: "network-access",
5398
5726
  scope: "system",
5399
5727
  mode: "collection",
5400
5728
  internal: true,
5729
+ providerKind: "ingress",
5401
5730
  methods: {
5402
5731
  start: method(z.void(), NetworkEndpointSchema, { kind: "mutation" }),
5403
5732
  stop: method(z.void(), z.void(), { kind: "mutation" }),
5404
5733
  getEndpoint: method(z.void(), NetworkEndpointSchema.nullable()),
5405
- 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())
5406
5741
  }
5407
5742
  };
5408
5743
  const RemoteAccessEndpointSchema = z.object({
@@ -5606,20 +5941,59 @@ const notificationOutputCapability = {
5606
5941
  )
5607
5942
  }
5608
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
+ });
5609
5963
  const NotificationRuleSchema = z.object({
5610
5964
  id: z.string(),
5611
5965
  name: z.string(),
5612
5966
  enabled: z.boolean(),
5613
- conditions: z.record(z.string(), z.unknown()),
5614
- 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()
5615
5979
  });
5616
5980
  const NotificationHistoryEntrySchema = z.object({
5617
5981
  id: z.string(),
5618
5982
  ruleId: z.string(),
5983
+ ruleName: z.string(),
5984
+ eventId: z.string(),
5619
5985
  timestamp: z.number(),
5620
- deviceId: z.number().optional(),
5986
+ outputs: z.array(z.string()).readonly(),
5621
5987
  success: z.boolean(),
5622
- 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()
5623
5997
  });
5624
5998
  const advancedNotifierCapability = {
5625
5999
  name: "advanced-notifier",
@@ -5627,17 +6001,28 @@ const advancedNotifierCapability = {
5627
6001
  mode: "singleton",
5628
6002
  internal: true,
5629
6003
  methods: {
5630
- getRules: method(z.void(), z.array(NotificationRuleSchema).readonly()),
5631
- upsertRule: method(NotificationRuleSchema, z.void(), { kind: "mutation" }),
5632
- 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
+ ),
5633
6018
  testRule: method(
5634
6019
  z.object({ ruleId: z.string(), lookbackMinutes: z.number() }),
5635
- z.array(z.record(z.string(), z.unknown())),
6020
+ z.object({ results: z.array(NotificationTestResultSchema).readonly() }),
5636
6021
  { kind: "mutation" }
5637
6022
  ),
5638
6023
  getHistory: method(
5639
- z.object({ ruleId: z.string().optional(), limit: z.number().optional() }),
5640
- z.array(NotificationHistoryEntrySchema)
6024
+ z.object({ filter: NotificationHistoryFilterSchema.optional() }),
6025
+ z.object({ entries: z.array(NotificationHistoryEntrySchema).readonly() })
5641
6026
  )
5642
6027
  }
5643
6028
  };
@@ -6659,6 +7044,47 @@ const intercomCapability = {
6659
7044
  z.object({ deviceId: z.number(), sessionId: z.string() }),
6660
7045
  z.void(),
6661
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" }
6662
7088
  )
6663
7089
  },
6664
7090
  events: {
@@ -6734,6 +7160,33 @@ const HwAccelBackendInputSchema = z.enum([
6734
7160
  const HwAccelResolutionSchema = z.object({
6735
7161
  preferred: z.array(z.string()).readonly()
6736
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
+ });
6737
7190
  const HardwarePlatformSchema = z.enum(["darwin", "linux", "win32"]);
6738
7191
  const HardwareArchSchema = z.enum(["arm64", "x64"]);
6739
7192
  const GpuInfoSchema = z.object({
@@ -6787,41 +7240,24 @@ const platformProbeCapability = {
6787
7240
  scope: "system",
6788
7241
  mode: "singleton",
6789
7242
  methods: {
6790
- /** Return cached hardware + scored backends for this node. */
6791
- getCapabilities: method(
6792
- z.void(),
6793
- PlatformCapabilitiesSchema
6794
- ),
6795
- /** Convenience getter — hardware only. */
6796
- getHardware: method(
6797
- z.void(),
6798
- HardwareInfoSchema
6799
- ),
6800
- /**
6801
- * Resolve the best (model, runtime, backend, format) for a given list
6802
- * of requirements, using this node's scored backends as the candidate
6803
- * pool. Always returns a config — falls back to CPU when no preferred
6804
- * backend matches.
6805
- */
7243
+ getCapabilities: method(z.void(), PlatformCapabilitiesSchema),
7244
+ getHardware: method(z.void(), HardwareInfoSchema),
6806
7245
  resolveInferenceConfig: method(
6807
- z.object({
6808
- requirements: z.array(ModelRequirementSchema).readonly()
6809
- }),
7246
+ z.object({ requirements: z.array(ModelRequirementSchema).readonly() }),
6810
7247
  ResolvedInferenceConfigSchema
6811
7248
  ),
6812
- /**
6813
- * Resolve the ordered HW acceleration backend list for this node.
6814
- * Pass `prefer` to hint a specific backend; pass `null` or omit
6815
- * for auto-detection. Replaces the legacy `$hwaccel.resolve`
6816
- * Moleculer action — cap routing handles per-node dispatch via
6817
- * `nodeId`.
6818
- */
6819
7249
  resolveHwAccel: method(
6820
- z.object({
6821
- prefer: HwAccelBackendInputSchema,
6822
- nodeId: z.string().optional()
6823
- }),
7250
+ z.object({ prefer: HwAccelBackendInputSchema, nodeId: z.string().optional() }),
6824
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" }
6825
7261
  )
6826
7262
  }
6827
7263
  };
@@ -7058,25 +7494,11 @@ const MeshStatusSchema = z.object({
7058
7494
  /** Last error from the daemon, when not joined. */
7059
7495
  error: z.string().optional()
7060
7496
  });
7061
- const PublicIngressConfigSchema = z.object({
7062
- /** Whether the provider should expose CamStack via its public
7063
- * ingress (Tailscale Funnel, etc.). */
7064
- enabled: z.boolean(),
7065
- /** Local port to forward. Auto-detected from the hub HTTP port
7066
- * when omitted. */
7067
- port: z.number().int().min(1).max(65535).optional()
7068
- });
7069
- const MeshIngressConfigSchema = z.object({
7070
- /** Whether the provider should expose CamStack inside the mesh
7071
- * via HTTPS (Tailscale Serve, etc.) instead of just raw IP. */
7072
- enabled: z.boolean(),
7073
- /** Local port to forward. Auto-detected when omitted. */
7074
- port: z.number().int().min(1).max(65535).optional()
7075
- });
7076
7497
  const meshNetworkCapability = {
7077
7498
  name: "mesh-network",
7078
7499
  scope: "system",
7079
7500
  mode: "collection",
7501
+ providerKind: "mesh",
7080
7502
  methods: {
7081
7503
  /** Return the current join state + endpoints + peer count. Cheap
7082
7504
  * poll-target — admin UI hits this every few seconds. */
@@ -7098,6 +7520,29 @@ const meshNetworkCapability = {
7098
7520
  z.object({ joined: z.literal(true) }),
7099
7521
  { kind: "mutation" }
7100
7522
  ),
7523
+ /**
7524
+ * Start an interactive browser-redirect login flow.
7525
+ *
7526
+ * The provider spawns its daemon's join command without a pre-auth
7527
+ * key, captures the verification URL the daemon prints, and returns
7528
+ * it. The admin UI opens the URL in a new tab; the user completes
7529
+ * authentication in the provider's web console and the background
7530
+ * process self-terminates. The caller then polls `getStatus()` until
7531
+ * `joined: true`.
7532
+ *
7533
+ * Mirrors the `tailscale up` (no `--auth-key`) flow.
7534
+ */
7535
+ startLogin: method(
7536
+ z.object({
7537
+ /** Optional hostname override the host should advertise once joined. */
7538
+ hostname: z.string().optional()
7539
+ }),
7540
+ z.object({
7541
+ /** Authentication URL the operator should open in a browser. */
7542
+ loginUrl: z.string()
7543
+ }),
7544
+ { kind: "mutation" }
7545
+ ),
7101
7546
  /** Leave the mesh. After this the meshIp/magicDnsHostname/etc.
7102
7547
  * vanish until the next `join`. */
7103
7548
  leave: method(
@@ -7110,21 +7555,32 @@ const meshNetworkCapability = {
7110
7555
  peers: z.array(MeshPeerSchema).readonly()
7111
7556
  })),
7112
7557
  /**
7113
- * Toggle the public ingress (e.g. Tailscale Funnel) that maps a
7114
- * local port to the open internet via the provider's edge. Idempotent.
7115
- */
7116
- setPublicIngress: method(
7117
- PublicIngressConfigSchema,
7118
- z.object({ success: z.literal(true) }),
7119
- { kind: "mutation" }
7120
- ),
7121
- /**
7122
- * Toggle the in-mesh HTTPS ingress (e.g. Tailscale Serve) so peers
7123
- * inside the mesh hit a valid TLS endpoint instead of the raw IP.
7558
+ * Probe the mesh daemon / API for a sanity check WITHOUT joining.
7559
+ * Operator-facing "test connection" button: validates the auth key
7560
+ * + reaches the control plane and reports back what would happen
7561
+ * on join.
7562
+ *
7563
+ * Tailscale: dry-runs `tailscale up --auth-key=… --reset` against
7564
+ * an idempotency probe; for an already-joined node it just returns
7565
+ * the current status.
7124
7566
  */
7125
- setMeshIngress: method(
7126
- MeshIngressConfigSchema,
7127
- z.object({ success: z.literal(true) }),
7567
+ testConnection: method(
7568
+ z.object({
7569
+ /** Optional auth key — when provided, probes the key validity
7570
+ * against the provider's API. Omit when already joined to
7571
+ * just ping the daemon. */
7572
+ authKey: z.string().optional()
7573
+ }),
7574
+ z.object({
7575
+ ok: z.boolean(),
7576
+ /** Provider-side identifier resolved by the probe (tailnet
7577
+ * name for Tailscale, network id for ZeroTier, etc.). */
7578
+ tenant: z.string().optional(),
7579
+ /** Daemon binary version, when reachable. */
7580
+ daemonVersion: z.string().optional(),
7581
+ /** Human-readable error when `ok: false`. */
7582
+ error: z.string().optional()
7583
+ }),
7128
7584
  { kind: "mutation" }
7129
7585
  )
7130
7586
  }
@@ -7183,26 +7639,54 @@ const meshOrchestratorCapability = {
7183
7639
  )
7184
7640
  }
7185
7641
  };
7186
- const UserRoleSchema = z.enum(["admin", "viewer", "agent", "scoped"]);
7642
+ const MethodAccessSchema = z.enum(["view", "create", "delete"]);
7187
7643
  const AllowedProviderSchema = z.union([z.literal("*"), z.array(z.string())]);
7188
7644
  const AllowedDevicesSchema = z.record(z.string(), z.union([z.literal("*"), z.array(z.string())]));
7189
- const MethodAccessSchema = z.enum(["view", "create", "delete"]);
7190
- const TokenScopeSchema = z.object({
7191
- type: z.enum(["addon", "capability"]),
7192
- target: z.string(),
7193
- access: z.array(MethodAccessSchema).min(1)
7194
- });
7645
+ const CapScopeSchema = z.enum(["device", "system"]);
7646
+ const TokenScopeSchema = z.discriminatedUnion("type", [
7647
+ z.object({
7648
+ type: z.literal("category"),
7649
+ target: CapScopeSchema,
7650
+ access: z.array(MethodAccessSchema).min(1)
7651
+ }),
7652
+ z.object({
7653
+ type: z.literal("capability"),
7654
+ target: z.string(),
7655
+ access: z.array(MethodAccessSchema).min(1)
7656
+ }),
7657
+ z.object({
7658
+ type: z.literal("addon"),
7659
+ target: z.string(),
7660
+ access: z.array(MethodAccessSchema).min(1)
7661
+ }),
7662
+ z.object({
7663
+ type: z.literal("device"),
7664
+ /**
7665
+ * One or more deviceIds (serialised as strings for wire-format
7666
+ * consistency with the rest of the union). Matcher accepts if
7667
+ * `input.deviceId` ∈ `targets`. Array shape avoids the row-explosion
7668
+ * of one scope-per-device when granting access to a set of cameras.
7669
+ */
7670
+ targets: z.array(z.string()).min(1),
7671
+ access: z.array(MethodAccessSchema).min(1)
7672
+ })
7673
+ ]);
7195
7674
  const UserRecordSchema = z.object({
7196
7675
  id: z.string(),
7197
7676
  username: z.string(),
7198
7677
  passwordHash: z.string(),
7199
- role: UserRoleSchema,
7678
+ /**
7679
+ * Admin bypass. When true, the middleware skips the scope-access
7680
+ * check entirely. There is no other axis of privilege; the legacy
7681
+ * role enum collapsed onto this boolean in v2.
7682
+ */
7683
+ isAdmin: z.boolean().default(false),
7200
7684
  allowedProviders: AllowedProviderSchema,
7201
7685
  allowedDevices: AllowedDevicesSchema,
7202
7686
  /**
7203
- * Scopes granted to this user. Admins bypass; their `scopes` is ignored.
7204
- * Non-admins (`viewer`, `agent`, `scoped`) without scopes are locked out
7205
- * of every protected call.
7687
+ * Scopes granted to this user. Admins bypass; their `scopes` is
7688
+ * ignored. Non-admins without scopes are locked out of every
7689
+ * protected call.
7206
7690
  */
7207
7691
  scopes: z.array(TokenScopeSchema).default([]),
7208
7692
  createdAt: z.number(),
@@ -7211,7 +7695,7 @@ const UserRecordSchema = z.object({
7211
7695
  const ApiKeyRecordSchema = z.object({
7212
7696
  id: z.string(),
7213
7697
  label: z.string(),
7214
- role: UserRoleSchema,
7698
+ isAdmin: z.boolean().default(false),
7215
7699
  allowedProviders: AllowedProviderSchema,
7216
7700
  allowedDevices: AllowedDevicesSchema,
7217
7701
  tokenHash: z.string(),
@@ -7235,7 +7719,7 @@ const ScopedTokenSchema = z.object({
7235
7719
  const UserSummarySchema = z.object({
7236
7720
  id: z.string(),
7237
7721
  username: z.string(),
7238
- role: UserRoleSchema,
7722
+ isAdmin: z.boolean().default(false),
7239
7723
  allowedProviders: z.union([z.array(z.string()), z.literal("*")]),
7240
7724
  allowedDevices: z.record(z.string(), z.union([z.array(z.string()), z.literal("*")])),
7241
7725
  scopes: z.array(TokenScopeSchema).default([]),
@@ -7245,14 +7729,14 @@ const UserSummarySchema = z.object({
7245
7729
  const CreateUserInputSchema = z.object({
7246
7730
  username: z.string(),
7247
7731
  password: z.string().min(6),
7248
- role: UserRoleSchema,
7732
+ isAdmin: z.boolean().default(false),
7249
7733
  allowedProviders: z.union([z.array(z.string()), z.literal("*")]).optional(),
7250
7734
  allowedDevices: z.record(z.string(), z.union([z.array(z.string()), z.literal("*")])).optional(),
7251
7735
  scopes: z.array(TokenScopeSchema).optional()
7252
7736
  });
7253
7737
  const UpdateUserInputSchema = z.object({
7254
7738
  id: z.string(),
7255
- role: UserRoleSchema.optional(),
7739
+ isAdmin: z.boolean().optional(),
7256
7740
  allowedProviders: z.union([z.array(z.string()), z.literal("*")]).optional(),
7257
7741
  allowedDevices: z.record(z.string(), z.union([z.array(z.string()), z.literal("*")])).optional(),
7258
7742
  scopes: z.array(TokenScopeSchema).optional()
@@ -7260,7 +7744,7 @@ const UpdateUserInputSchema = z.object({
7260
7744
  const ApiKeySummarySchema = z.object({
7261
7745
  id: z.string(),
7262
7746
  label: z.string(),
7263
- role: UserRoleSchema,
7747
+ isAdmin: z.boolean().default(false),
7264
7748
  allowedProviders: z.union([z.array(z.string()), z.literal("*")]).optional(),
7265
7749
  allowedDevices: z.record(z.string(), z.union([z.array(z.string()), z.literal("*")])).optional(),
7266
7750
  tokenPrefix: z.string(),
@@ -7269,7 +7753,7 @@ const ApiKeySummarySchema = z.object({
7269
7753
  });
7270
7754
  const CreateApiKeyInputSchema = z.object({
7271
7755
  label: z.string(),
7272
- role: UserRoleSchema,
7756
+ isAdmin: z.boolean().default(false),
7273
7757
  allowedProviders: z.union([z.array(z.string()), z.literal("*")]).optional(),
7274
7758
  allowedDevices: z.record(z.string(), z.union([z.array(z.string()), z.literal("*")])).optional()
7275
7759
  });
@@ -7283,16 +7767,11 @@ const ScopedTokenSummarySchema = z.object({
7283
7767
  name: z.string(),
7284
7768
  tokenPrefix: z.string(),
7285
7769
  scopes: z.array(TokenScopeSchema),
7286
- // Mirror the storage schema: `.nullish()` accepts the SQLite-native
7287
- // `null` for absent timestamps as well as in-memory `undefined`.
7288
7770
  expiresAt: z.number().nullish(),
7289
7771
  lastUsedAt: z.number().nullish(),
7290
7772
  createdAt: z.number()
7291
7773
  });
7292
7774
  const CreateScopedTokenInputSchema = z.object({
7293
- // The owner the token is issued on behalf of. `adminProcedure` gates
7294
- // this call so an admin can mint tokens for any user; the CLI passes
7295
- // its own logged-in `user.id` here.
7296
7775
  userId: z.string(),
7297
7776
  name: z.string(),
7298
7777
  scopes: z.array(TokenScopeSchema),
@@ -7302,45 +7781,85 @@ const CreateScopedTokenResultSchema = z.object({
7302
7781
  token: z.string(),
7303
7782
  record: ScopedTokenSummarySchema
7304
7783
  });
7784
+ const TotpSetupResultSchema = z.object({
7785
+ secret: z.string(),
7786
+ otpauthUrl: z.string()
7787
+ });
7788
+ const TotpStatusSchema = z.object({
7789
+ /** True iff `confirmedAt != null` — a pending half-enrollment is reported as `enabled: false`. */
7790
+ enabled: z.boolean(),
7791
+ /** Null when no row exists OR the row is still pending confirmation. */
7792
+ confirmedAt: z.number().nullable()
7793
+ });
7305
7794
  const userManagementCapability = {
7306
7795
  name: "user-management",
7307
7796
  scope: "system",
7308
7797
  mode: "singleton",
7309
7798
  methods: {
7310
- // ── Users ──────────────────────────────────────────────────────
7311
7799
  listUsers: method(z.void(), z.array(UserSummarySchema), { auth: "admin" }),
7312
- createUser: method(CreateUserInputSchema, UserSummarySchema, { kind: "mutation", auth: "admin" }),
7313
- updateUser: method(UpdateUserInputSchema, z.object({ success: z.literal(true) }), { kind: "mutation", auth: "admin" }),
7314
- deleteUser: method(z.object({ id: z.string() }), z.object({ success: z.literal(true) }), { kind: "mutation", auth: "admin" }),
7800
+ createUser: method(CreateUserInputSchema, UserSummarySchema, { kind: "mutation", auth: "admin", access: "create" }),
7801
+ updateUser: method(UpdateUserInputSchema, z.object({ success: z.literal(true) }), { kind: "mutation", auth: "admin", access: "create" }),
7802
+ deleteUser: method(z.object({ id: z.string() }), z.object({ success: z.literal(true) }), { kind: "mutation", auth: "admin", access: "delete" }),
7315
7803
  resetPassword: method(
7316
7804
  z.object({ id: z.string(), newPassword: z.string().min(6) }),
7317
7805
  z.object({ success: z.literal(true) }),
7318
- { kind: "mutation", auth: "admin" }
7806
+ { kind: "mutation", auth: "admin", access: "create" }
7319
7807
  ),
7320
- /**
7321
- * Replace the scope set on a user. Subset check: the caller's scopes
7322
- * must include every requested scope+access (admin bypasses).
7323
- */
7324
7808
  setUserScopes: method(
7325
7809
  z.object({ userId: z.string(), scopes: z.array(TokenScopeSchema) }),
7326
7810
  z.object({ success: z.literal(true) }),
7327
- { kind: "mutation", auth: "admin" }
7811
+ { kind: "mutation", auth: "admin", access: "create" }
7328
7812
  ),
7329
7813
  validateCredentials: method(
7330
7814
  z.object({ username: z.string(), password: z.string() }),
7331
7815
  UserSummarySchema.extend({ passwordHash: z.string() }).nullable(),
7332
- { kind: "mutation" }
7816
+ { kind: "mutation", access: "view" }
7333
7817
  ),
7334
- // ── API Keys ──────────────────────────────────────────────────
7335
7818
  listApiKeys: method(z.void(), z.array(ApiKeySummarySchema), { auth: "admin" }),
7336
- createApiKey: method(CreateApiKeyInputSchema, CreateApiKeyResultSchema, { kind: "mutation", auth: "admin" }),
7337
- revokeApiKey: method(z.object({ id: z.string() }), z.object({ success: z.literal(true) }), { kind: "mutation", auth: "admin" }),
7338
- validateApiKey: method(z.object({ token: z.string() }), ApiKeySummarySchema.nullable(), { kind: "mutation" }),
7339
- // ── Scoped Tokens ─────────────────────────────────────────────
7340
- createScopedToken: method(CreateScopedTokenInputSchema, CreateScopedTokenResultSchema, { kind: "mutation", auth: "admin" }),
7341
- revokeScopedToken: method(z.object({ id: z.string() }), z.object({ success: z.literal(true) }), { kind: "mutation", auth: "admin" }),
7342
- validateScopedToken: method(z.object({ token: z.string() }), ScopedTokenSummarySchema.nullable()),
7343
- listScopedTokens: method(z.object({ userId: z.string() }), z.array(ScopedTokenSummarySchema), { auth: "admin" })
7819
+ createApiKey: method(CreateApiKeyInputSchema, CreateApiKeyResultSchema, { kind: "mutation", auth: "admin", access: "create" }),
7820
+ revokeApiKey: method(z.object({ id: z.string() }), z.object({ success: z.literal(true) }), { kind: "mutation", auth: "admin", access: "delete" }),
7821
+ validateApiKey: method(z.object({ token: z.string() }), ApiKeySummarySchema.nullable(), { kind: "mutation", access: "view" }),
7822
+ createScopedToken: method(CreateScopedTokenInputSchema, CreateScopedTokenResultSchema, { kind: "mutation", auth: "admin", access: "create" }),
7823
+ revokeScopedToken: method(z.object({ id: z.string() }), z.object({ success: z.literal(true) }), { kind: "mutation", auth: "admin", access: "delete" }),
7824
+ validateScopedToken: method(z.object({ token: z.string() }), ScopedTokenSummarySchema.nullable(), { access: "view" }),
7825
+ listScopedTokens: method(z.object({ userId: z.string() }), z.array(ScopedTokenSummarySchema), { auth: "admin" }),
7826
+ // ── TOTP / 2FA ─────────────────────────────────────────────────
7827
+ //
7828
+ // Setup → Confirm → (Verify on login) → Disable.
7829
+ //
7830
+ // Admin-only for now: operator enrolls TOTP on a user's behalf by
7831
+ // pairing their authenticator with the returned QR. Self-service
7832
+ // enrollment is a follow-up (needs the cap framework to expose the
7833
+ // caller's identity to the provider so the provider can enforce
7834
+ // self-or-admin).
7835
+ setupTotp: method(
7836
+ z.object({ userId: z.string() }),
7837
+ TotpSetupResultSchema,
7838
+ { kind: "mutation", auth: "admin", access: "create" }
7839
+ ),
7840
+ confirmTotp: method(
7841
+ z.object({ userId: z.string(), code: z.string() }),
7842
+ z.object({ success: z.literal(true) }),
7843
+ { kind: "mutation", auth: "admin", access: "create" }
7844
+ ),
7845
+ disableTotp: method(
7846
+ z.object({ userId: z.string() }),
7847
+ z.object({ success: z.literal(true) }),
7848
+ { kind: "mutation", auth: "admin", access: "delete" }
7849
+ ),
7850
+ getTotpStatus: method(
7851
+ z.object({ userId: z.string() }),
7852
+ TotpStatusSchema,
7853
+ { auth: "admin" }
7854
+ ),
7855
+ // Public (no `auth`) — used by the login flow's second-step
7856
+ // challenge endpoint. The userId comes from the password-validation
7857
+ // step (signed bridge token), so this method is not a free oracle.
7858
+ verifyTotp: method(
7859
+ z.object({ userId: z.string(), code: z.string() }),
7860
+ z.object({ valid: z.boolean() }),
7861
+ { kind: "mutation", access: "view" }
7862
+ )
7344
7863
  }
7345
7864
  };
7346
7865
  const FeatureManifestSchema = z.object({
@@ -7962,7 +8481,7 @@ const PIPELINE_OWNER_CAPABILITY_NAMES = [
7962
8481
  "pipeline-runner"
7963
8482
  ];
7964
8483
  export {
7965
- networkQualityCapability as $,
8484
+ nativeObjectDetectionCapability as $,
7966
8485
  adminUiCapability as A,
7967
8486
  advancedNotifierCapability as B,
7968
8487
  alertsCapability as C,
@@ -7975,311 +8494,332 @@ export {
7975
8494
  cameraCredentialsCapability as J,
7976
8495
  decoderCapability as K,
7977
8496
  detectionPipelineCapability as L,
7978
- deviceManagerCapability as M,
7979
- deviceOpsCapability as N,
7980
- deviceStateCapability as O,
7981
- embeddingEncoderCapability as P,
7982
- eventsCapability as Q,
7983
- integrationsCapability as R,
7984
- intercomCapability as S,
7985
- localNetworkCapability as T,
7986
- logDestinationCapability as U,
7987
- meshNetworkCapability as V,
7988
- meshOrchestratorCapability as W,
7989
- metricsProviderCapability as X,
7990
- motionDetectionCapability as Y,
7991
- nativeObjectDetectionCapability as Z,
7992
- networkAccessCapability as _,
8497
+ deviceExportCapability as M,
8498
+ deviceManagerCapability as N,
8499
+ deviceOpsCapability as O,
8500
+ deviceStateCapability as P,
8501
+ embeddingEncoderCapability as Q,
8502
+ eventsCapability as R,
8503
+ integrationsCapability as S,
8504
+ intercomCapability as T,
8505
+ localNetworkCapability as U,
8506
+ logDestinationCapability as V,
8507
+ meshNetworkCapability as W,
8508
+ meshOrchestratorCapability as X,
8509
+ metricsProviderCapability as Y,
8510
+ motionDetectionCapability as Z,
8511
+ mqttBrokerCapability as _,
7993
8512
  zoneRulesCapability as a,
7994
- AuthProviderInfoSchema as a$,
7995
- nodesCapability as a0,
7996
- notificationOutputCapability as a1,
7997
- osdCapability as a2,
7998
- pipelineAnalyticsCapability as a3,
7999
- pipelineExecutorCapability as a4,
8000
- pipelineOrchestratorCapability as a5,
8001
- pipelineRunnerCapability as a6,
8002
- platformProbeCapability as a7,
8003
- ptzCapability as a8,
8004
- rebootCapability as a9,
8005
- AddonPageDeclarationSchema as aA,
8006
- AddonPageInfoSchema as aB,
8007
- AgentLoadSummarySchema as aC,
8008
- AlertSchema as aD,
8009
- AlertSeveritySchema as aE,
8010
- AlertSourceSchema as aF,
8011
- AlertStatusSchema as aG,
8012
- ApiKeyRecordSchema as aH,
8013
- ApiKeySummarySchema as aI,
8014
- ArchiveEntrySchema as aJ,
8015
- ArchiveManifestSchema as aK,
8016
- AudioAnalysisResultSchema as aL,
8017
- AudioAnalysisSettingsSchema as aM,
8018
- AudioChunkInputSchema as aN,
8019
- AudioClassSummarySchema as aO,
8020
- AudioClassificationLabelSchema as aP,
8021
- AudioClassificationResultSchema as aQ,
8022
- AudioCodecInfoSchema as aR,
8023
- AudioDecodeSessionConfigSchema as aS,
8024
- AudioEncodeSessionConfigSchema as aT,
8025
- AudioEncodedChunkSchema as aU,
8026
- AudioEventSchema as aV,
8027
- AudioLevelSchema as aW,
8028
- AudioMetricsHistoryPointSchema as aX,
8029
- AudioMetricsHistorySchema as aY,
8030
- AudioMetricsSnapshotSchema as aZ,
8031
- AudioPcmChunkSchema as a_,
8032
- recordingCapability as aa,
8033
- recordingEngineCapability as ab,
8034
- remoteAccessCapability as ac,
8035
- restreamerCapability as ad,
8036
- settingsStoreCapability as ae,
8037
- snapshotCapability as af,
8038
- snapshotProviderCapability as ag,
8039
- storageCapability as ah,
8040
- storageProviderCapability as ai,
8041
- streamBrokerCapability as aj,
8042
- streamingEngineCapability as ak,
8043
- systemCapability as al,
8044
- toastCapability as am,
8045
- turnOrchestratorCapability as an,
8046
- turnProviderCapability as ao,
8047
- userManagementCapability as ap,
8048
- webrtcCapability as aq,
8049
- webrtcSessionCapability as ar,
8050
- ACCESSORY_LABEL as as,
8051
- APPLE_SA_TO_MACRO as at,
8052
- AUDIO_BACKEND_CHOICES as au,
8053
- AUDIO_MACRO_LABELS as av,
8054
- AccessoriesStatusSchema as aw,
8055
- AccessoryKind as ax,
8056
- AddonAutoUpdateSchema as ay,
8057
- AddonListItemSchema as az,
8513
+ AudioEventSchema as a$,
8514
+ networkAccessCapability as a0,
8515
+ networkQualityCapability as a1,
8516
+ nodesCapability as a2,
8517
+ notificationOutputCapability as a3,
8518
+ osdCapability as a4,
8519
+ pipelineAnalyticsCapability as a5,
8520
+ pipelineExecutorCapability as a6,
8521
+ pipelineOrchestratorCapability as a7,
8522
+ pipelineRunnerCapability as a8,
8523
+ platformProbeCapability as a9,
8524
+ AUDIO_MACRO_LABELS as aA,
8525
+ AccessoriesStatusSchema as aB,
8526
+ AccessoryKind as aC,
8527
+ AddBrokerInputSchema as aD,
8528
+ AddonAutoUpdateSchema as aE,
8529
+ AddonListItemSchema as aF,
8530
+ AddonPageDeclarationSchema as aG,
8531
+ AddonPageInfoSchema as aH,
8532
+ AgentLoadSummarySchema as aI,
8533
+ AlertSchema as aJ,
8534
+ AlertSeveritySchema as aK,
8535
+ AlertSourceSchema as aL,
8536
+ AlertStatusSchema as aM,
8537
+ ApiKeyRecordSchema as aN,
8538
+ ApiKeySummarySchema as aO,
8539
+ ArchiveEntrySchema as aP,
8540
+ ArchiveManifestSchema as aQ,
8541
+ AudioAnalysisResultSchema as aR,
8542
+ AudioAnalysisSettingsSchema as aS,
8543
+ AudioChunkInputSchema as aT,
8544
+ AudioClassSummarySchema as aU,
8545
+ AudioClassificationLabelSchema as aV,
8546
+ AudioClassificationResultSchema as aW,
8547
+ AudioCodecInfoSchema as aX,
8548
+ AudioDecodeSessionConfigSchema as aY,
8549
+ AudioEncodeSessionConfigSchema as aZ,
8550
+ AudioEncodedChunkSchema as a_,
8551
+ ptzCapability as aa,
8552
+ rebootCapability as ab,
8553
+ recordingCapability as ac,
8554
+ recordingEngineCapability as ad,
8555
+ remoteAccessCapability as ae,
8556
+ restreamerCapability as af,
8557
+ settingsStoreCapability as ag,
8558
+ smtpProviderCapability as ah,
8559
+ snapshotCapability as ai,
8560
+ snapshotProviderCapability as aj,
8561
+ ssoBridgeCapability as ak,
8562
+ storageCapability as al,
8563
+ storageProviderCapability as am,
8564
+ streamBrokerCapability as an,
8565
+ streamingEngineCapability as ao,
8566
+ systemCapability as ap,
8567
+ toastCapability as aq,
8568
+ turnOrchestratorCapability as ar,
8569
+ turnProviderCapability as as,
8570
+ userManagementCapability as at,
8571
+ userPasskeysCapability as au,
8572
+ webrtcCapability as av,
8573
+ webrtcSessionCapability as aw,
8574
+ ACCESSORY_LABEL as ax,
8575
+ APPLE_SA_TO_MACRO as ay,
8576
+ AUDIO_BACKEND_CHOICES as az,
8058
8577
  zoneAnalyticsCapability as b,
8059
- DoorbellStatusSchema as b$,
8060
- AuthResultSchema as b0,
8061
- AutoUpdateSettingsSchema as b1,
8062
- AvailableIntegrationTypeSchema as b2,
8063
- BATTERY_DEVICE_PROFILE as b3,
8064
- BackupDestinationInfoSchema as b4,
8065
- BackupEntrySchema as b5,
8066
- BatteryStatusSchema as b6,
8067
- BoundingBoxSchema as b7,
8068
- BrightnessStatusSchema as b8,
8069
- BrokerAudioClientSchema as b9,
8070
- CreateIntegrationInputSchema as bA,
8071
- CreateScopedTokenInputSchema as bB,
8072
- CreateScopedTokenResultSchema as bC,
8073
- CreateUserInputSchema as bD,
8074
- CustomActionInputSchema as bE,
8075
- DEFAULT_AUDIO_ANALYZER_CONFIG as bF,
8076
- DEFAULT_DECODER_HWACCEL_CONFIG as bG,
8077
- DEVICE_PROFILES as bH,
8078
- DEVICE_SETTINGS_CONTRIBUTION_METHODS as bI,
8079
- DEVICE_STATUS_METHOD as bJ,
8080
- DecodedFrameSchema as bK,
8081
- DecoderAssignmentSchema as bL,
8082
- DecoderSessionConfigSchema as bM,
8083
- DecoderStatsSchema as bN,
8084
- DeleteIntegrationResultSchema as bO,
8085
- DetectorOutputSchema as bP,
8086
- DeviceDiscoveryStatusSchema as bQ,
8087
- DeviceFeature as bR,
8088
- DeviceInfoSchema as bS,
8089
- DeviceNetworkStatsSchema as bT,
8090
- DeviceRole as bU,
8091
- DeviceStatusSchema as bV,
8092
- DeviceType as bW,
8093
- DiscoveredChildDeviceSchema as bX,
8094
- DiscoveredChildStatusSchema as bY,
8095
- DiscoveredDeviceSchema as bZ,
8096
- DoorbellPressEventSchema as b_,
8097
- BrokerClientsSchema as ba,
8098
- BrokerDecodedClientSchema as bb,
8099
- BrokerRtspClientSchema as bc,
8100
- BrokerStatsSchema as bd,
8101
- BrokerStatusSchema as be,
8102
- CAM_PROFILE_ORDER as bf,
8103
- CamProfileSchema as bg,
8104
- CamStreamKindSchema as bh,
8105
- CamStreamResolutionSchema as bi,
8106
- CameraCredentialsSchema as bj,
8107
- CameraCredentialsStatusSchema as bk,
8108
- CameraMetricsSchema as bl,
8109
- CameraMetricsWithDeviceIdSchema as bm,
8110
- CameraStreamSchema as bn,
8111
- CapabilityBindingsSchema as bo,
8112
- ChargingStatus as bp,
8113
- ClientNetworkStatsSchema as bq,
8114
- ClusterAddonNodeDeploymentSchema as br,
8115
- ClusterAddonStatusEntrySchema as bs,
8116
- CollectionColumnSchema as bt,
8117
- CollectionIndexSchema as bu,
8118
- ConfigEntrySchema$1 as bv,
8119
- ConfigSectionWithValuesSchema as bw,
8120
- ConfigTabDeclarationSchema as bx,
8121
- CreateApiKeyInputSchema as by,
8122
- CreateApiKeyResultSchema as bz,
8578
+ DeviceExportStatusSchema as b$,
8579
+ AudioLevelSchema as b0,
8580
+ AudioMetricsHistoryPointSchema as b1,
8581
+ AudioMetricsHistorySchema as b2,
8582
+ AudioMetricsSnapshotSchema as b3,
8583
+ AudioPcmChunkSchema as b4,
8584
+ AuthProviderInfoSchema as b5,
8585
+ AuthResultSchema as b6,
8586
+ AutoUpdateSettingsSchema as b7,
8587
+ AvailableIntegrationTypeSchema as b8,
8588
+ BATTERY_DEVICE_PROFILE as b9,
8589
+ ClusterAddonNodeDeploymentSchema as bA,
8590
+ ClusterAddonStatusEntrySchema as bB,
8591
+ CollectionColumnSchema as bC,
8592
+ CollectionIndexSchema as bD,
8593
+ ConfigEntrySchema$1 as bE,
8594
+ ConfigSectionWithValuesSchema as bF,
8595
+ ConfigTabDeclarationSchema as bG,
8596
+ CreateApiKeyInputSchema as bH,
8597
+ CreateApiKeyResultSchema as bI,
8598
+ CreateIntegrationInputSchema as bJ,
8599
+ CreateScopedTokenInputSchema as bK,
8600
+ CreateScopedTokenResultSchema as bL,
8601
+ CreateUserInputSchema as bM,
8602
+ CustomActionInputSchema as bN,
8603
+ DEFAULT_AUDIO_ANALYZER_CONFIG as bO,
8604
+ DEFAULT_DECODER_HWACCEL_CONFIG as bP,
8605
+ DEVICE_PROFILES as bQ,
8606
+ DEVICE_SETTINGS_CONTRIBUTION_METHODS as bR,
8607
+ DEVICE_STATUS_METHOD as bS,
8608
+ DecodedFrameSchema as bT,
8609
+ DecoderAssignmentSchema as bU,
8610
+ DecoderSessionConfigSchema as bV,
8611
+ DecoderStatsSchema as bW,
8612
+ DeleteIntegrationResultSchema as bX,
8613
+ DetectorOutputSchema as bY,
8614
+ DeviceDiscoveryStatusSchema as bZ,
8615
+ ExposeInputSchema as b_,
8616
+ BackupDestinationInfoSchema as ba,
8617
+ BackupEntrySchema as bb,
8618
+ BatteryStatusSchema as bc,
8619
+ BoundingBoxSchema as bd,
8620
+ BrightnessStatusSchema as be,
8621
+ BrokerAudioClientSchema as bf,
8622
+ BrokerClientsSchema as bg,
8623
+ BrokerConnectionDetailsSchema as bh,
8624
+ BrokerDecodedClientSchema as bi,
8625
+ BrokerInfoSchema as bj,
8626
+ BrokerRtspClientSchema as bk,
8627
+ BrokerStatsSchema as bl,
8628
+ BrokerStatusSchema$1 as bm,
8629
+ CAM_PROFILE_ORDER as bn,
8630
+ CamProfileSchema as bo,
8631
+ CamStreamKindSchema as bp,
8632
+ CamStreamResolutionSchema as bq,
8633
+ CameraCredentialsSchema as br,
8634
+ CameraCredentialsStatusSchema as bs,
8635
+ CameraMetricsSchema as bt,
8636
+ CameraMetricsWithDeviceIdSchema as bu,
8637
+ CameraStreamSchema as bv,
8638
+ CapScopeSchema as bw,
8639
+ CapabilityBindingsSchema as bx,
8640
+ ChargingStatus as by,
8641
+ ClientNetworkStatsSchema as bz,
8123
8642
  motionCapability as c,
8124
- PlaceholderReasonSchema as c$,
8125
- EmbeddingInfoSchema as c0,
8126
- EmbeddingResultSchema as c1,
8127
- EncodedPacketSchema as c2,
8128
- EnrichedWidgetMetadataSchema as c3,
8129
- EventItemSchema as c4,
8130
- EventKindSchema as c5,
8131
- ExposedResourceSchema as c6,
8132
- FeatureManifestSchema as c7,
8133
- FeatureProbeStatusSchema as c8,
8134
- FrameInputSchema as c9,
8135
- NativeDetectionSchema as cA,
8136
- NativeObjectClassEnum as cB,
8137
- NativeObjectDetectionStatusSchema as cC,
8138
- NetworkAccessStatusSchema as cD,
8139
- NetworkAddressSchema as cE,
8140
- NetworkEndpointSchema as cF,
8141
- NotificationHistoryEntrySchema as cG,
8142
- NotificationRuleSchema as cH,
8143
- NotificationSchema as cI,
8144
- ObjectEventSchema as cJ,
8145
- OrchestratorMetricsSchema as cK,
8146
- OsdOverlayKindEnum as cL,
8147
- OsdOverlayPatchSchema as cM,
8148
- OsdOverlaySchema as cN,
8149
- OsdPositionEnum as cO,
8150
- OsdStatusSchema as cP,
8151
- PIPELINE_FLOW_CAPABILITY_NAMES as cQ,
8152
- PIPELINE_OWNER_CAPABILITY_NAMES as cR,
8153
- PackageUpdateSchema as cS,
8154
- PackageVersionInfoSchema as cT,
8155
- PcmSampleFormatSchema as cU,
8156
- PerScopeBreakdownSchema as cV,
8157
- PipelineAssignmentSchema as cW,
8158
- PipelineDefaultStepSchema as cX,
8159
- PipelineEngineChoiceSchema as cY,
8160
- PipelineRunResultBridge as cZ,
8161
- PipelineStepInputSchema as c_,
8162
- GlobalMetricsSchema as ca,
8163
- HWACCEL_OPTIONS as cb,
8164
- HealthStatusSchema as cc,
8165
- HistoryPointSchema as cd,
8166
- HistoryResolutionEnum as ce,
8167
- InstalledPackageSchema as cf,
8168
- IntegrationLiteSchema as cg,
8169
- IntegrationWithStateSchema as ch,
8170
- IntercomAbilitySchema as ci,
8171
- IntercomStatusSchema as cj,
8172
- LocationStatSchema as ck,
8173
- LogEntrySchema as cl,
8174
- LogLevelSchema$1 as cm,
8175
- LogStreamEntrySchema as cn,
8176
- MODEL_FORMATS as co,
8177
- MediaFileSchema as cp,
8178
- MethodAccessSchema as cq,
8179
- MotionAnalysisResultSchema as cr,
8180
- MotionEventSchema as cs,
8181
- MotionOnMotionChangedDataSchema as ct,
8182
- MotionRegionSchema as cu,
8183
- MotionSourceEnum as cv,
8184
- MotionSourcesSchema as cw,
8185
- MotionStatusSchema as cx,
8186
- MotionTriggerRuntimeStateSchema as cy,
8187
- MotionTriggerStatusSchema as cz,
8643
+ OsdOverlayPatchSchema as c$,
8644
+ UnexposeInputSchema as c0,
8645
+ DeviceFeature as c1,
8646
+ DeviceInfoSchema as c2,
8647
+ DeviceNetworkStatsSchema as c3,
8648
+ DeviceRole as c4,
8649
+ DeviceStatusSchema as c5,
8650
+ DeviceType as c6,
8651
+ DiscoveredChildDeviceSchema as c7,
8652
+ DiscoveredChildStatusSchema as c8,
8653
+ DiscoveredDeviceSchema as c9,
8654
+ LogLevelSchema$1 as cA,
8655
+ LogStreamEntrySchema as cB,
8656
+ MODEL_FORMATS as cC,
8657
+ MediaFileSchema as cD,
8658
+ MethodAccessSchema as cE,
8659
+ MotionAnalysisResultSchema as cF,
8660
+ MotionEventSchema as cG,
8661
+ MotionOnMotionChangedDataSchema as cH,
8662
+ MotionRegionSchema as cI,
8663
+ MotionSourceEnum as cJ,
8664
+ MotionSourcesSchema as cK,
8665
+ MotionStatusSchema as cL,
8666
+ MotionTriggerRuntimeStateSchema as cM,
8667
+ MotionTriggerStatusSchema as cN,
8668
+ StatusSchema as cO,
8669
+ NativeDetectionSchema as cP,
8670
+ NativeObjectClassEnum as cQ,
8671
+ NativeObjectDetectionStatusSchema as cR,
8672
+ NetworkAccessStatusSchema as cS,
8673
+ NetworkAddressSchema as cT,
8674
+ NetworkEndpointSchema as cU,
8675
+ NotificationHistoryEntrySchema as cV,
8676
+ NotificationRuleSchema as cW,
8677
+ NotificationSchema as cX,
8678
+ ObjectEventSchema as cY,
8679
+ OrchestratorMetricsSchema as cZ,
8680
+ OsdOverlayKindEnum as c_,
8681
+ DoorbellPressEventSchema as ca,
8682
+ DoorbellStatusSchema as cb,
8683
+ EmbeddingInfoSchema as cc,
8684
+ EmbeddingResultSchema as cd,
8685
+ EncodedPacketSchema as ce,
8686
+ EnrichedWidgetMetadataSchema as cf,
8687
+ EventItemSchema as cg,
8688
+ EventKindSchema as ch,
8689
+ ExposedDeviceSchema as ci,
8690
+ ExposedResourceSchema as cj,
8691
+ FeatureManifestSchema as ck,
8692
+ FeatureProbeStatusSchema as cl,
8693
+ FrameInputSchema as cm,
8694
+ GetStreamWithCodecInputSchema as cn,
8695
+ GlobalMetricsSchema as co,
8696
+ HWACCEL_OPTIONS as cp,
8697
+ HealthStatusSchema as cq,
8698
+ HistoryPointSchema as cr,
8699
+ HistoryResolutionEnum as cs,
8700
+ InstalledPackageSchema as ct,
8701
+ IntegrationLiteSchema as cu,
8702
+ IntegrationWithStateSchema as cv,
8703
+ IntercomAbilitySchema as cw,
8704
+ IntercomStatusSchema as cx,
8705
+ LocationStatSchema as cy,
8706
+ LogEntrySchema as cz,
8188
8707
  doorbellCapability as d,
8189
- TurnProviderInfoSchema as d$,
8190
- PolygonPointSchema as d0,
8191
- ProfileSlotSchema as d1,
8192
- ProfileSlotStatusSchema as d2,
8193
- ProviderStatusSchema as d3,
8194
- PtzAutotrackRuntimeStateSchema as d4,
8195
- PtzAutotrackSettingsSchema as d5,
8196
- PtzAutotrackStatusSchema as d6,
8197
- PtzAutotrackTargetOptionSchema as d7,
8198
- PtzMoveCommandSchema as d8,
8199
- PtzPositionSchema as d9,
8200
- BeginUploadInputSchema as dA,
8201
- BeginUploadResultSchema as dB,
8202
- EndDownloadInputSchema as dC,
8203
- FinalizeUploadInputSchema as dD,
8204
- StorageLocationRefSchema as dE,
8205
- StorageLocationSchema as dF,
8206
- StorageLocationTypeSchema as dG,
8207
- ProviderInfoSchema as dH,
8208
- ReadChunkInputSchema as dI,
8209
- TestLocationResultSchema as dJ,
8210
- WriteChunkInputSchema as dK,
8211
- StreamFormatSchema as dL,
8212
- StreamInfoSchema as dM,
8213
- StreamNetworkStatsSchema as dN,
8214
- StreamSourceEntrySchema$1 as dO,
8215
- StreamSourceSchema as dP,
8216
- SwitchStatusSchema as dQ,
8217
- SystemMetricsSchema as dR,
8218
- TestConnectionResultSchema as dS,
8219
- ToastSchema as dT,
8220
- TokenScopeSchema as dU,
8221
- TopologyNodeSchema as dV,
8222
- TopologyProcessSchema as dW,
8223
- TopologyServiceSchema as dX,
8224
- TrackSchema as dY,
8225
- TrackStateSchema as dZ,
8226
- TrackedDetectionSchema as d_,
8227
- PtzPresetSchema as da,
8228
- QueryFilterSchema as db,
8229
- RegisteredStreamSchema as dc,
8230
- RemoteAccessEndpointSchema as dd,
8231
- RemoteAccessProviderInfoSchema as de,
8232
- ReportMotionInputSchema as df,
8233
- RtspRestreamEntrySchema as dg,
8234
- RunnerCameraConfigSchema as dh,
8235
- RunnerCameraDeviceUIFields as di,
8236
- RunnerLocalLoadSchema as dj,
8237
- RunnerLocalMetricsSchema as dk,
8238
- STORAGE_LOCATION_CARDINALITY as dl,
8239
- ScopedTokenSchema as dm,
8240
- ScopedTokenSummarySchema as dn,
8241
- SearchResultSchema as dp,
8242
- SegmentSchema as dq,
8243
- SettingsPatchSchema as dr,
8244
- SettingsRecordSchema as ds,
8245
- SettingsSchemaWithValuesSchema as dt,
8246
- SettingsUpdateResultSchema as du,
8247
- SnapshotImageSchema as dv,
8248
- SpatialDetectionSchema as dw,
8249
- AbortUploadInputSchema as dx,
8250
- BeginDownloadInputSchema as dy,
8251
- BeginDownloadResultSchema as dz,
8708
+ StorageLocationSchema as d$,
8709
+ OsdOverlaySchema as d0,
8710
+ OsdPositionEnum as d1,
8711
+ OsdStatusSchema as d2,
8712
+ PIPELINE_FLOW_CAPABILITY_NAMES as d3,
8713
+ PIPELINE_OWNER_CAPABILITY_NAMES as d4,
8714
+ PackageUpdateSchema as d5,
8715
+ PackageVersionInfoSchema as d6,
8716
+ PasskeySummarySchema as d7,
8717
+ PcmSampleFormatSchema as d8,
8718
+ PerScopeBreakdownSchema as d9,
8719
+ RunnerCameraDeviceUIFields as dA,
8720
+ RunnerLocalLoadSchema as dB,
8721
+ RunnerLocalMetricsSchema as dC,
8722
+ STORAGE_LOCATION_CARDINALITY as dD,
8723
+ ScopedTokenSchema as dE,
8724
+ ScopedTokenSummarySchema as dF,
8725
+ SearchResultSchema as dG,
8726
+ SegmentSchema as dH,
8727
+ SendEmailInputSchema as dI,
8728
+ SendEmailResultSchema as dJ,
8729
+ SettingsPatchSchema as dK,
8730
+ SettingsRecordSchema as dL,
8731
+ SettingsSchemaWithValuesSchema as dM,
8732
+ SettingsUpdateResultSchema as dN,
8733
+ SmtpStatusSchema as dO,
8734
+ SnapshotImageSchema as dP,
8735
+ SpatialDetectionSchema as dQ,
8736
+ SsoBridgeClaimsSchema as dR,
8737
+ StartEmbeddedInputSchema as dS,
8738
+ AbortUploadInputSchema as dT,
8739
+ BeginDownloadInputSchema as dU,
8740
+ BeginDownloadResultSchema as dV,
8741
+ BeginUploadInputSchema as dW,
8742
+ BeginUploadResultSchema as dX,
8743
+ EndDownloadInputSchema as dY,
8744
+ FinalizeUploadInputSchema as dZ,
8745
+ StorageLocationRefSchema as d_,
8746
+ PipelineAssignmentSchema as da,
8747
+ PipelineDefaultStepSchema as db,
8748
+ PipelineEngineChoiceSchema as dc,
8749
+ PipelineRunResultBridge as dd,
8750
+ PipelineStepInputSchema as de,
8751
+ PlaceholderReasonSchema as df,
8752
+ PolygonPointSchema as dg,
8753
+ ProfileSlotSchema as dh,
8754
+ ProfileSlotStatusSchema as di,
8755
+ ProviderStatusSchema as dj,
8756
+ PtzAutotrackRuntimeStateSchema as dk,
8757
+ PtzAutotrackSettingsSchema as dl,
8758
+ PtzAutotrackStatusSchema as dm,
8759
+ PtzAutotrackTargetOptionSchema as dn,
8760
+ PtzMoveCommandSchema as dp,
8761
+ PtzPositionSchema as dq,
8762
+ PtzPresetSchema as dr,
8763
+ QueryFilterSchema as ds,
8764
+ RegisteredStreamSchema as dt,
8765
+ RemoteAccessEndpointSchema as du,
8766
+ RemoteAccessProviderInfoSchema as dv,
8767
+ ReportMotionInputSchema as dw,
8768
+ RtpSourceSchema as dx,
8769
+ RtspRestreamEntrySchema as dy,
8770
+ RunnerCameraConfigSchema as dz,
8252
8771
  errMsg as e,
8253
- TurnServerSchema as e0,
8254
- UpdateIntegrationInputSchema as e1,
8255
- UpdateUserInputSchema as e2,
8256
- UserRecordSchema as e3,
8257
- UserRoleSchema as e4,
8258
- UserSummarySchema as e5,
8259
- WELL_KNOWN_TABS as e6,
8260
- WELL_KNOWN_TAB_MAP as e7,
8261
- WebrtcStreamChoiceSchema as e8,
8262
- WebrtcStreamTargetSchema as e9,
8263
- WidgetHostEnum as ea,
8264
- WidgetMetadataSchema as eb,
8265
- WidgetSizeEnum as ec,
8266
- YAMNET_TO_MACRO as ed,
8267
- ZoneKindEnum as ee,
8268
- ZoneRuleModeEnum as ef,
8269
- ZoneRuleSchema as eg,
8270
- ZoneRuleStageEnum as eh,
8271
- ZoneRulesArraySchema as ei,
8272
- ZoneSchema as ej,
8273
- ZoneScopeBreakdownSchema as ek,
8274
- accessoryStableId as el,
8275
- deviceMatchesProfile as em,
8276
- event as en,
8277
- expandCapMethods as eo,
8278
- getAudioMacroClassIds as ep,
8279
- mapAudioLabelToMacro as eq,
8280
- method as er,
8281
- resolveDeviceProfile as es,
8282
- webrtcClientHintsSchema as et,
8772
+ StorageLocationTypeSchema as e0,
8773
+ ProviderInfoSchema as e1,
8774
+ ReadChunkInputSchema as e2,
8775
+ TestLocationResultSchema as e3,
8776
+ WriteChunkInputSchema as e4,
8777
+ StreamFormatSchema as e5,
8778
+ StreamInfoSchema as e6,
8779
+ StreamNetworkStatsSchema as e7,
8780
+ StreamSourceEntrySchema$1 as e8,
8781
+ StreamSourceSchema as e9,
8782
+ ZoneRuleModeEnum as eA,
8783
+ ZoneRuleSchema as eB,
8784
+ ZoneRuleStageEnum as eC,
8785
+ ZoneRulesArraySchema as eD,
8786
+ ZoneSchema as eE,
8787
+ ZoneScopeBreakdownSchema as eF,
8788
+ accessoryStableId as eG,
8789
+ deviceMatchesProfile as eH,
8790
+ event as eI,
8791
+ expandCapMethods as eJ,
8792
+ getAudioMacroClassIds as eK,
8793
+ mapAudioLabelToMacro as eL,
8794
+ method as eM,
8795
+ resolveDeviceProfile as eN,
8796
+ webrtcClientHintsSchema as eO,
8797
+ SwitchStatusSchema as ea,
8798
+ SystemMetricsSchema as eb,
8799
+ TestConnectionResultSchema as ec,
8800
+ ToastSchema as ed,
8801
+ TokenScopeSchema as ee,
8802
+ TopologyNodeSchema as ef,
8803
+ TopologyProcessSchema as eg,
8804
+ TopologyServiceSchema as eh,
8805
+ TrackSchema as ei,
8806
+ TrackStateSchema as ej,
8807
+ TrackedDetectionSchema as ek,
8808
+ TurnProviderInfoSchema as el,
8809
+ TurnServerSchema as em,
8810
+ UpdateIntegrationInputSchema as en,
8811
+ UpdateUserInputSchema as eo,
8812
+ UserRecordSchema as ep,
8813
+ UserSummarySchema as eq,
8814
+ WELL_KNOWN_TABS as er,
8815
+ WELL_KNOWN_TAB_MAP as es,
8816
+ WebrtcStreamChoiceSchema as et,
8817
+ WebrtcStreamTargetSchema as eu,
8818
+ WidgetHostEnum as ev,
8819
+ WidgetMetadataSchema as ew,
8820
+ WidgetSizeEnum as ex,
8821
+ YAMNET_TO_MACRO as ey,
8822
+ ZoneKindEnum as ez,
8283
8823
  featureProbeCapability as f,
8284
8824
  deviceStatusCapability as g,
8285
8825
  hydrateSchema as h,
@@ -8302,4 +8842,4 @@ export {
8302
8842
  addonsCapability as y,
8303
8843
  zonesCapability as z
8304
8844
  };
8305
- //# sourceMappingURL=index-DVKPWMwv.mjs.map
8845
+ //# sourceMappingURL=index-BBVUwOlZ.mjs.map