@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.
- package/dist/addon/build-addon-route-provider.d.ts +55 -0
- package/dist/addon/build-addon-route-provider.d.ts.map +1 -0
- package/dist/capabilities/addon-routes.cap.d.ts +64 -0
- package/dist/capabilities/addon-routes.cap.d.ts.map +1 -1
- package/dist/capabilities/admin-ui.cap.d.ts +6 -2
- package/dist/capabilities/admin-ui.cap.d.ts.map +1 -1
- package/dist/capabilities/advanced-notifier.cap.d.ts +202 -29
- package/dist/capabilities/advanced-notifier.cap.d.ts.map +1 -1
- package/dist/capabilities/audio-codec.cap.d.ts +2 -2
- package/dist/capabilities/auth-provider.cap.d.ts +4 -4
- package/dist/capabilities/auth-provider.cap.d.ts.map +1 -1
- package/dist/capabilities/authentication.cap.d.ts +4 -0
- package/dist/capabilities/authentication.cap.d.ts.map +1 -1
- package/dist/capabilities/capability-definition.d.ts +22 -0
- package/dist/capabilities/capability-definition.d.ts.map +1 -1
- package/dist/capabilities/device-export.cap.d.ts +77 -0
- package/dist/capabilities/device-export.cap.d.ts.map +1 -0
- package/dist/capabilities/embedding-encoder.cap.d.ts +14 -7
- package/dist/capabilities/embedding-encoder.cap.d.ts.map +1 -1
- package/dist/capabilities/index.d.ts +24 -5
- package/dist/capabilities/index.d.ts.map +1 -1
- package/dist/capabilities/intercom.cap.d.ts +34 -0
- package/dist/capabilities/intercom.cap.d.ts.map +1 -1
- package/dist/capabilities/mesh-network.cap.d.ts +32 -16
- package/dist/capabilities/mesh-network.cap.d.ts.map +1 -1
- package/dist/capabilities/mqtt-broker.cap.d.ts +153 -0
- package/dist/capabilities/mqtt-broker.cap.d.ts.map +1 -0
- package/dist/capabilities/network-access.cap.d.ts +41 -1
- package/dist/capabilities/network-access.cap.d.ts.map +1 -1
- package/dist/capabilities/platform-probe.cap.d.ts +234 -15
- package/dist/capabilities/platform-probe.cap.d.ts.map +1 -1
- package/dist/capabilities/settings-store.cap.d.ts +8 -2
- package/dist/capabilities/settings-store.cap.d.ts.map +1 -1
- package/dist/capabilities/smtp-provider.cap.d.ts +63 -0
- package/dist/capabilities/smtp-provider.cap.d.ts.map +1 -0
- package/dist/capabilities/sso-bridge.cap.d.ts +61 -0
- package/dist/capabilities/sso-bridge.cap.d.ts.map +1 -0
- package/dist/capabilities/stream-broker.cap.d.ts +90 -85
- package/dist/capabilities/stream-broker.cap.d.ts.map +1 -1
- package/dist/capabilities/user-management.cap.d.ts +513 -184
- package/dist/capabilities/user-management.cap.d.ts.map +1 -1
- package/dist/capabilities/user-passkeys.cap.d.ts +92 -0
- package/dist/capabilities/user-passkeys.cap.d.ts.map +1 -0
- package/dist/capabilities/webrtc-session.cap.d.ts +34 -0
- package/dist/capabilities/webrtc-session.cap.d.ts.map +1 -1
- package/dist/generated/addon-api.d.ts +11940 -9272
- package/dist/generated/addon-api.d.ts.map +1 -1
- package/dist/generated/cap-status-types.d.ts +5 -1
- package/dist/generated/cap-status-types.d.ts.map +1 -1
- package/dist/generated/capability-router-map.d.ts +19 -4
- package/dist/generated/capability-router-map.d.ts.map +1 -1
- package/dist/generated/device-proxy.d.ts +2 -0
- package/dist/generated/device-proxy.d.ts.map +1 -1
- package/dist/generated/method-access-map.d.ts +6 -1
- package/dist/generated/method-access-map.d.ts.map +1 -1
- package/dist/generated/provider-kind-map.d.ts +22 -0
- package/dist/generated/provider-kind-map.d.ts.map +1 -0
- package/dist/generated/scope-presets.d.ts +17 -0
- package/dist/generated/scope-presets.d.ts.map +1 -0
- package/dist/generated/system-proxy.d.ts +8 -4
- package/dist/generated/system-proxy.d.ts.map +1 -1
- package/dist/{index-DVKPWMwv.mjs → index-BBVUwOlZ.mjs} +1040 -500
- package/dist/index-BBVUwOlZ.mjs.map +1 -0
- package/dist/{index-s8uJNgNs.js → index-BUBhoPUu.js} +741 -201
- package/dist/index-BUBhoPUu.js.map +1 -0
- package/dist/index.d.ts +9 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +852 -500
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1109 -757
- package/dist/index.mjs.map +1 -1
- package/dist/interfaces/addon-routes.d.ts +8 -2
- package/dist/interfaces/addon-routes.d.ts.map +1 -1
- package/dist/interfaces/addon.d.ts +14 -3
- package/dist/interfaces/addon.d.ts.map +1 -1
- package/dist/interfaces/advanced-notifier.d.ts +8 -7
- package/dist/interfaces/advanced-notifier.d.ts.map +1 -1
- package/dist/interfaces/api-responses.d.ts +2 -3
- package/dist/interfaces/api-responses.d.ts.map +1 -1
- package/dist/interfaces/auth.d.ts +14 -11
- package/dist/interfaces/auth.d.ts.map +1 -1
- package/dist/interfaces/capability.d.ts +6 -6
- package/dist/interfaces/capability.d.ts.map +1 -1
- package/dist/interfaces/embedding-encoder.d.ts +16 -7
- package/dist/interfaces/embedding-encoder.d.ts.map +1 -1
- package/dist/interfaces/rtp-egress.d.ts +45 -0
- package/dist/interfaces/rtp-egress.d.ts.map +1 -0
- package/dist/interfaces/storage.d.ts +15 -2
- package/dist/interfaces/storage.d.ts.map +1 -1
- package/dist/node.js +1 -1
- package/dist/node.mjs +1 -1
- package/dist/schemas/auth-records.d.ts +105 -50
- package/dist/schemas/auth-records.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/index-DVKPWMwv.mjs.map +0 -1
- package/dist/index-s8uJNgNs.js.map +0 -1
- package/dist/interfaces/auth-provider.d.ts +0 -39
- 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
|
-
*
|
|
1313
|
-
*
|
|
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(),
|
|
3669
|
-
getVersion: method(z.void(),
|
|
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
|
-
|
|
4971
|
+
inferenceMs: z.number()
|
|
4674
4972
|
});
|
|
4675
4973
|
const EmbeddingInfoSchema = z.object({
|
|
4676
4974
|
modelId: z.string(),
|
|
4677
|
-
|
|
4678
|
-
|
|
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
|
-
|
|
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
|
-
|
|
5614
|
-
|
|
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
|
-
|
|
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(
|
|
5631
|
-
|
|
5632
|
-
|
|
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.
|
|
6020
|
+
z.object({ results: z.array(NotificationTestResultSchema).readonly() }),
|
|
5636
6021
|
{ kind: "mutation" }
|
|
5637
6022
|
),
|
|
5638
6023
|
getHistory: method(
|
|
5639
|
-
z.object({
|
|
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
|
-
|
|
6791
|
-
|
|
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
|
-
*
|
|
7114
|
-
*
|
|
7115
|
-
|
|
7116
|
-
|
|
7117
|
-
|
|
7118
|
-
|
|
7119
|
-
|
|
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
|
-
|
|
7126
|
-
|
|
7127
|
-
|
|
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
|
|
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
|
|
7190
|
-
const TokenScopeSchema = z.
|
|
7191
|
-
|
|
7192
|
-
|
|
7193
|
-
|
|
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
|
-
|
|
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
|
|
7204
|
-
* Non-admins
|
|
7205
|
-
*
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
7340
|
-
|
|
7341
|
-
|
|
7342
|
-
|
|
7343
|
-
|
|
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
|
-
|
|
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
|
-
|
|
7979
|
-
|
|
7980
|
-
|
|
7981
|
-
|
|
7982
|
-
|
|
7983
|
-
|
|
7984
|
-
|
|
7985
|
-
|
|
7986
|
-
|
|
7987
|
-
|
|
7988
|
-
|
|
7989
|
-
|
|
7990
|
-
|
|
7991
|
-
|
|
7992
|
-
|
|
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
|
-
|
|
7995
|
-
|
|
7996
|
-
|
|
7997
|
-
|
|
7998
|
-
|
|
7999
|
-
|
|
8000
|
-
|
|
8001
|
-
|
|
8002
|
-
|
|
8003
|
-
|
|
8004
|
-
|
|
8005
|
-
|
|
8006
|
-
|
|
8007
|
-
|
|
8008
|
-
|
|
8009
|
-
|
|
8010
|
-
|
|
8011
|
-
|
|
8012
|
-
|
|
8013
|
-
|
|
8014
|
-
|
|
8015
|
-
|
|
8016
|
-
|
|
8017
|
-
|
|
8018
|
-
|
|
8019
|
-
|
|
8020
|
-
|
|
8021
|
-
|
|
8022
|
-
|
|
8023
|
-
|
|
8024
|
-
|
|
8025
|
-
|
|
8026
|
-
|
|
8027
|
-
|
|
8028
|
-
|
|
8029
|
-
|
|
8030
|
-
|
|
8031
|
-
|
|
8032
|
-
|
|
8033
|
-
|
|
8034
|
-
|
|
8035
|
-
|
|
8036
|
-
|
|
8037
|
-
|
|
8038
|
-
|
|
8039
|
-
|
|
8040
|
-
|
|
8041
|
-
|
|
8042
|
-
|
|
8043
|
-
|
|
8044
|
-
|
|
8045
|
-
|
|
8046
|
-
|
|
8047
|
-
|
|
8048
|
-
|
|
8049
|
-
|
|
8050
|
-
|
|
8051
|
-
|
|
8052
|
-
|
|
8053
|
-
|
|
8054
|
-
|
|
8055
|
-
|
|
8056
|
-
|
|
8057
|
-
|
|
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
|
-
|
|
8060
|
-
|
|
8061
|
-
|
|
8062
|
-
|
|
8063
|
-
|
|
8064
|
-
|
|
8065
|
-
|
|
8066
|
-
|
|
8067
|
-
|
|
8068
|
-
|
|
8069
|
-
|
|
8070
|
-
|
|
8071
|
-
|
|
8072
|
-
|
|
8073
|
-
|
|
8074
|
-
|
|
8075
|
-
|
|
8076
|
-
|
|
8077
|
-
|
|
8078
|
-
|
|
8079
|
-
|
|
8080
|
-
|
|
8081
|
-
|
|
8082
|
-
|
|
8083
|
-
|
|
8084
|
-
|
|
8085
|
-
|
|
8086
|
-
|
|
8087
|
-
|
|
8088
|
-
|
|
8089
|
-
|
|
8090
|
-
|
|
8091
|
-
|
|
8092
|
-
|
|
8093
|
-
|
|
8094
|
-
|
|
8095
|
-
|
|
8096
|
-
|
|
8097
|
-
|
|
8098
|
-
|
|
8099
|
-
|
|
8100
|
-
|
|
8101
|
-
|
|
8102
|
-
|
|
8103
|
-
|
|
8104
|
-
|
|
8105
|
-
|
|
8106
|
-
|
|
8107
|
-
|
|
8108
|
-
|
|
8109
|
-
|
|
8110
|
-
|
|
8111
|
-
|
|
8112
|
-
|
|
8113
|
-
|
|
8114
|
-
|
|
8115
|
-
|
|
8116
|
-
|
|
8117
|
-
|
|
8118
|
-
|
|
8119
|
-
|
|
8120
|
-
|
|
8121
|
-
|
|
8122
|
-
|
|
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
|
-
|
|
8125
|
-
|
|
8126
|
-
|
|
8127
|
-
|
|
8128
|
-
|
|
8129
|
-
|
|
8130
|
-
|
|
8131
|
-
|
|
8132
|
-
|
|
8133
|
-
|
|
8134
|
-
|
|
8135
|
-
|
|
8136
|
-
|
|
8137
|
-
|
|
8138
|
-
|
|
8139
|
-
|
|
8140
|
-
|
|
8141
|
-
|
|
8142
|
-
|
|
8143
|
-
|
|
8144
|
-
|
|
8145
|
-
|
|
8146
|
-
|
|
8147
|
-
|
|
8148
|
-
|
|
8149
|
-
|
|
8150
|
-
|
|
8151
|
-
|
|
8152
|
-
|
|
8153
|
-
|
|
8154
|
-
|
|
8155
|
-
|
|
8156
|
-
|
|
8157
|
-
|
|
8158
|
-
|
|
8159
|
-
|
|
8160
|
-
|
|
8161
|
-
|
|
8162
|
-
|
|
8163
|
-
|
|
8164
|
-
|
|
8165
|
-
|
|
8166
|
-
|
|
8167
|
-
|
|
8168
|
-
|
|
8169
|
-
|
|
8170
|
-
|
|
8171
|
-
|
|
8172
|
-
|
|
8173
|
-
|
|
8174
|
-
|
|
8175
|
-
|
|
8176
|
-
|
|
8177
|
-
|
|
8178
|
-
|
|
8179
|
-
|
|
8180
|
-
|
|
8181
|
-
|
|
8182
|
-
|
|
8183
|
-
|
|
8184
|
-
|
|
8185
|
-
|
|
8186
|
-
|
|
8187
|
-
|
|
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
|
-
|
|
8190
|
-
|
|
8191
|
-
|
|
8192
|
-
|
|
8193
|
-
|
|
8194
|
-
|
|
8195
|
-
|
|
8196
|
-
|
|
8197
|
-
|
|
8198
|
-
|
|
8199
|
-
|
|
8200
|
-
|
|
8201
|
-
|
|
8202
|
-
|
|
8203
|
-
|
|
8204
|
-
|
|
8205
|
-
|
|
8206
|
-
|
|
8207
|
-
|
|
8208
|
-
|
|
8209
|
-
|
|
8210
|
-
|
|
8211
|
-
|
|
8212
|
-
|
|
8213
|
-
|
|
8214
|
-
|
|
8215
|
-
|
|
8216
|
-
|
|
8217
|
-
|
|
8218
|
-
|
|
8219
|
-
|
|
8220
|
-
|
|
8221
|
-
|
|
8222
|
-
|
|
8223
|
-
|
|
8224
|
-
|
|
8225
|
-
|
|
8226
|
-
|
|
8227
|
-
|
|
8228
|
-
|
|
8229
|
-
|
|
8230
|
-
|
|
8231
|
-
|
|
8232
|
-
|
|
8233
|
-
|
|
8234
|
-
|
|
8235
|
-
|
|
8236
|
-
|
|
8237
|
-
|
|
8238
|
-
|
|
8239
|
-
|
|
8240
|
-
|
|
8241
|
-
|
|
8242
|
-
|
|
8243
|
-
|
|
8244
|
-
|
|
8245
|
-
|
|
8246
|
-
|
|
8247
|
-
|
|
8248
|
-
|
|
8249
|
-
|
|
8250
|
-
|
|
8251
|
-
|
|
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
|
-
|
|
8254
|
-
|
|
8255
|
-
|
|
8256
|
-
|
|
8257
|
-
|
|
8258
|
-
|
|
8259
|
-
|
|
8260
|
-
|
|
8261
|
-
|
|
8262
|
-
|
|
8263
|
-
|
|
8264
|
-
|
|
8265
|
-
|
|
8266
|
-
|
|
8267
|
-
|
|
8268
|
-
|
|
8269
|
-
|
|
8270
|
-
|
|
8271
|
-
|
|
8272
|
-
|
|
8273
|
-
|
|
8274
|
-
|
|
8275
|
-
|
|
8276
|
-
|
|
8277
|
-
|
|
8278
|
-
|
|
8279
|
-
|
|
8280
|
-
|
|
8281
|
-
|
|
8282
|
-
|
|
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-
|
|
8845
|
+
//# sourceMappingURL=index-BBVUwOlZ.mjs.map
|