@camstack/types 0.1.35 → 0.1.37
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/capabilities/addon-widgets-source.cap.d.ts +73 -5
- package/dist/capabilities/addon-widgets-source.cap.d.ts.map +1 -1
- package/dist/capabilities/addon-widgets.cap.d.ts +22 -4
- package/dist/capabilities/addon-widgets.cap.d.ts.map +1 -1
- package/dist/capabilities/audio-analysis.cap.d.ts +7 -4
- package/dist/capabilities/audio-analysis.cap.d.ts.map +1 -1
- package/dist/capabilities/camera-streams.cap.d.ts +7 -5
- package/dist/capabilities/camera-streams.cap.d.ts.map +1 -1
- package/dist/capabilities/capability-definition.d.ts +114 -0
- package/dist/capabilities/capability-definition.d.ts.map +1 -1
- package/dist/capabilities/decoder.cap.d.ts +90 -0
- package/dist/capabilities/decoder.cap.d.ts.map +1 -1
- package/dist/capabilities/detection-pipeline.cap.d.ts +6 -4
- package/dist/capabilities/detection-pipeline.cap.d.ts.map +1 -1
- package/dist/capabilities/device-manager.cap.d.ts +3 -3
- package/dist/capabilities/device-ops.cap.d.ts +1 -1
- package/dist/capabilities/index.d.ts +18 -11
- package/dist/capabilities/index.d.ts.map +1 -1
- package/dist/capabilities/motion-detection.cap.d.ts +2 -0
- package/dist/capabilities/motion-detection.cap.d.ts.map +1 -1
- package/dist/capabilities/motion-zones.cap.d.ts +83 -0
- package/dist/capabilities/motion-zones.cap.d.ts.map +1 -0
- package/dist/capabilities/nodes.cap.d.ts +9 -0
- package/dist/capabilities/nodes.cap.d.ts.map +1 -1
- package/dist/capabilities/oauth-integration.cap.d.ts +103 -0
- package/dist/capabilities/oauth-integration.cap.d.ts.map +1 -0
- package/dist/capabilities/pipeline-analytics.cap.d.ts +2 -0
- package/dist/capabilities/pipeline-analytics.cap.d.ts.map +1 -1
- package/dist/capabilities/ptz-autotrack.cap.d.ts +10 -0
- package/dist/capabilities/ptz-autotrack.cap.d.ts.map +1 -1
- package/dist/capabilities/ptz.cap.d.ts +57 -1
- package/dist/capabilities/ptz.cap.d.ts.map +1 -1
- package/dist/capabilities/schemas/streaming-shared.d.ts +110 -3
- package/dist/capabilities/schemas/streaming-shared.d.ts.map +1 -1
- package/dist/capabilities/snapshot.cap.d.ts +2 -0
- package/dist/capabilities/snapshot.cap.d.ts.map +1 -1
- package/dist/capabilities/sso-bridge.cap.d.ts +120 -0
- package/dist/capabilities/sso-bridge.cap.d.ts.map +1 -1
- package/dist/capabilities/stream-broker.cap.d.ts +97 -4
- package/dist/capabilities/stream-broker.cap.d.ts.map +1 -1
- package/dist/capabilities/stream-params-config-schema.d.ts +56 -0
- package/dist/capabilities/stream-params-config-schema.d.ts.map +1 -0
- package/dist/capabilities/stream-params.cap.d.ts +482 -0
- package/dist/capabilities/stream-params.cap.d.ts.map +1 -0
- package/dist/capabilities/user-management.cap.d.ts +198 -1
- package/dist/capabilities/user-management.cap.d.ts.map +1 -1
- package/dist/capabilities/webrtc-session.cap.d.ts +2 -0
- package/dist/capabilities/webrtc-session.cap.d.ts.map +1 -1
- package/dist/generated/addon-api.d.ts +1175 -51
- package/dist/generated/addon-api.d.ts.map +1 -1
- package/dist/generated/cap-status-types.d.ts +7 -3
- package/dist/generated/cap-status-types.d.ts.map +1 -1
- package/dist/generated/capability-router-map.d.ts +13 -4
- package/dist/generated/capability-router-map.d.ts.map +1 -1
- package/dist/generated/device-local-state.d.ts +6 -0
- package/dist/generated/device-local-state.d.ts.map +1 -1
- package/dist/generated/device-proxy.d.ts +6 -0
- package/dist/generated/device-proxy.d.ts.map +1 -1
- package/dist/generated/method-access-map.d.ts +1 -1
- package/dist/generated/method-access-map.d.ts.map +1 -1
- package/dist/generated/system-proxy.d.ts +4 -4
- package/dist/generated/system-proxy.d.ts.map +1 -1
- package/dist/{index-BkSgJYP7.js → index-BblD92Si.js} +600 -98
- package/dist/index-BblD92Si.js.map +1 -0
- package/dist/{index-CWhQOnm9.mjs → index-CgPd35k5.mjs} +949 -447
- package/dist/index-CgPd35k5.mjs.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +313 -7
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +587 -281
- package/dist/index.mjs.map +1 -1
- package/dist/interfaces/addon.d.ts +123 -29
- package/dist/interfaces/addon.d.ts.map +1 -1
- package/dist/interfaces/capability.d.ts +6 -23
- package/dist/interfaces/capability.d.ts.map +1 -1
- package/dist/interfaces/config-ui.d.ts +4 -101
- package/dist/interfaces/config-ui.d.ts.map +1 -1
- package/dist/interfaces/decoder.d.ts +12 -0
- package/dist/interfaces/decoder.d.ts.map +1 -1
- package/dist/interfaces/device-provider.d.ts +0 -4
- package/dist/interfaces/device-provider.d.ts.map +1 -1
- package/dist/interfaces/event-bus.d.ts +15 -0
- package/dist/interfaces/event-bus.d.ts.map +1 -1
- package/dist/interfaces/frame-handle.d.ts +40 -0
- package/dist/interfaces/frame-handle.d.ts.map +1 -0
- package/dist/interfaces/kernel-abstractions.d.ts +6 -0
- package/dist/interfaces/kernel-abstractions.d.ts.map +1 -1
- package/dist/interfaces/stream-broker.d.ts +40 -21
- package/dist/interfaces/stream-broker.d.ts.map +1 -1
- package/dist/node.js +1 -1
- package/dist/node.mjs +1 -1
- package/package.json +1 -1
- package/dist/index-BkSgJYP7.js.map +0 -1
- package/dist/index-CWhQOnm9.mjs.map +0 -1
|
@@ -12,6 +12,7 @@ const WELL_KNOWN_TABS = [
|
|
|
12
12
|
{ id: "osd", label: "OSD", icon: "type", order: 18 },
|
|
13
13
|
{ id: "stream-broker", label: "Stream Broker", icon: "radio", order: 20 },
|
|
14
14
|
{ id: "streaming", label: "Streaming", icon: "video", order: 35 },
|
|
15
|
+
{ id: "ptz", label: "PTZ", icon: "move", order: 40 },
|
|
15
16
|
{ id: "pipeline", label: "Detection Pipeline", icon: "cpu", order: 39 },
|
|
16
17
|
{ id: "zones", label: "Detection", icon: "shapes", order: 38 },
|
|
17
18
|
{ id: "live-stats", label: "Live Stats", icon: "activity", order: 39 },
|
|
@@ -79,6 +80,9 @@ function hydrateField(field, values) {
|
|
|
79
80
|
return { ...field, value: items };
|
|
80
81
|
}
|
|
81
82
|
const rawValue = storedValue !== void 0 ? storedValue : defaultValue !== void 0 ? defaultValue : null;
|
|
83
|
+
if (field.type === "password") {
|
|
84
|
+
return { ...field, value: "" };
|
|
85
|
+
}
|
|
82
86
|
const value = field.type === "textarea" && field.isJson && rawValue !== null && typeof rawValue === "object" ? JSON.stringify(rawValue, null, 2) : rawValue;
|
|
83
87
|
const hydrated = { ...field, value };
|
|
84
88
|
return hydrated;
|
|
@@ -181,7 +185,19 @@ const DecoderSessionConfigSchema = z.object({
|
|
|
181
185
|
* on every line so `grep tag=broker:5/high` filters one camera
|
|
182
186
|
* profile cleanly.
|
|
183
187
|
*/
|
|
184
|
-
tag: z.string().optional()
|
|
188
|
+
tag: z.string().optional(),
|
|
189
|
+
/**
|
|
190
|
+
* Where the session delivers decoded frames (Phase 5 / D9):
|
|
191
|
+
*
|
|
192
|
+
* - `'callback'` (default) — the legacy pixel path: decoded frames are
|
|
193
|
+
* buffered as `DecodedFrame`s and drained via `pullFrames`.
|
|
194
|
+
* - `'shm'` — the shared-memory frame plane: decoded frames are written
|
|
195
|
+
* into an OS shared-memory ring and drained as zero-pixel
|
|
196
|
+
* `FrameHandle`s via `pullHandles`. A session is one mode or the
|
|
197
|
+
* other — `pullFrames` returns nothing for an `'shm'` session and
|
|
198
|
+
* `pullHandles` returns nothing for a `'callback'` session.
|
|
199
|
+
*/
|
|
200
|
+
frameSink: z.enum(["callback", "shm"]).default("callback")
|
|
185
201
|
});
|
|
186
202
|
function errMsg(err) {
|
|
187
203
|
if (err instanceof Error) return err.message;
|
|
@@ -767,6 +783,9 @@ function method(input, output, options) {
|
|
|
767
783
|
function event(data) {
|
|
768
784
|
return { data };
|
|
769
785
|
}
|
|
786
|
+
function isDeviceConfigCap(def) {
|
|
787
|
+
return def?.deviceConfig !== void 0;
|
|
788
|
+
}
|
|
770
789
|
const AudioClassSummarySchema = z.object({
|
|
771
790
|
className: z.string(),
|
|
772
791
|
/** Number of windows (chunks) where this class was the top hit. */
|
|
@@ -1069,6 +1088,53 @@ const DecodedFrameSchema = z.object({
|
|
|
1069
1088
|
format: z.enum(["jpeg", "rgb", "bgr", "yuv420", "gray"]),
|
|
1070
1089
|
timestamp: z.number()
|
|
1071
1090
|
});
|
|
1091
|
+
const FrameHandleSchema = z.object({
|
|
1092
|
+
shmId: z.string(),
|
|
1093
|
+
slot: z.number().int().nonnegative(),
|
|
1094
|
+
seq: z.number().int().nonnegative(),
|
|
1095
|
+
width: z.number().int().positive(),
|
|
1096
|
+
height: z.number().int().positive(),
|
|
1097
|
+
format: z.enum(["jpeg", "rgb", "bgr", "yuv420", "gray"]),
|
|
1098
|
+
pts: z.number(),
|
|
1099
|
+
byteLength: z.number().int().nonnegative(),
|
|
1100
|
+
nodeId: z.string(),
|
|
1101
|
+
slotCount: z.number().int().positive()
|
|
1102
|
+
});
|
|
1103
|
+
const FrameHandleFormatSchema = z.enum(["rgb", "bgr", "yuv420", "gray"]);
|
|
1104
|
+
const SubscribeFramesInputSchema = z.object({
|
|
1105
|
+
brokerId: z.string(),
|
|
1106
|
+
format: FrameHandleFormatSchema,
|
|
1107
|
+
/**
|
|
1108
|
+
* Optional reader-side cadence hint in frames per second. The broker does
|
|
1109
|
+
* NOT throttle — latest-wins ring reads drop frames implicitly for a slow
|
|
1110
|
+
* consumer. The value is echoed back in `SubscribeFramesResult.maxFps` so
|
|
1111
|
+
* the consumer can pace its own `pullFrameHandles` polling.
|
|
1112
|
+
*/
|
|
1113
|
+
maxFps: z.number().positive().optional(),
|
|
1114
|
+
/** Short caller-identity tag (`motion`, `detection`, …) for diagnostics. */
|
|
1115
|
+
tag: z.string().optional()
|
|
1116
|
+
});
|
|
1117
|
+
const SubscribeFramesResultSchema = z.object({
|
|
1118
|
+
/** Opaque id the consumer passes to `pullFrameHandles` / `unsubscribeFrames`. */
|
|
1119
|
+
subscriptionId: z.string(),
|
|
1120
|
+
/** Reader-side cadence hint (frames/s) — echoes `SubscribeFramesInput.maxFps`. */
|
|
1121
|
+
maxFps: z.number().nonnegative()
|
|
1122
|
+
});
|
|
1123
|
+
const DecodedAudioChunkSchema = z.object({
|
|
1124
|
+
data: z.instanceof(Uint8Array),
|
|
1125
|
+
sampleRate: z.number().int().positive(),
|
|
1126
|
+
channels: z.number().int().positive(),
|
|
1127
|
+
timestamp: z.number()
|
|
1128
|
+
});
|
|
1129
|
+
const SubscribeAudioChunksInputSchema = z.object({
|
|
1130
|
+
brokerId: z.string(),
|
|
1131
|
+
/** Short caller-identity tag (`audio-analyzer`, …) for `listClients`. */
|
|
1132
|
+
tag: z.string().optional()
|
|
1133
|
+
});
|
|
1134
|
+
const SubscribeAudioChunksResultSchema = z.object({
|
|
1135
|
+
/** Opaque id passed to `pullAudioChunks` / `unsubscribeAudioChunks`. */
|
|
1136
|
+
subscriptionId: z.string()
|
|
1137
|
+
});
|
|
1072
1138
|
const BrokerStatusSchema$1 = z.enum(["idle", "connecting", "streaming", "error", "stopped"]);
|
|
1073
1139
|
const BrokerStatsSchema = z.object({
|
|
1074
1140
|
status: BrokerStatusSchema$1,
|
|
@@ -1298,9 +1364,76 @@ const streamBrokerCapability = {
|
|
|
1298
1364
|
z.object({ released: z.boolean(), refcount: z.number().int().nonnegative() }),
|
|
1299
1365
|
{ kind: "mutation", auth: "admin" }
|
|
1300
1366
|
),
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1367
|
+
/**
|
|
1368
|
+
* ── Decoded audio-chunk plane (Phase 5 / D9) ──────────────────────
|
|
1369
|
+
*
|
|
1370
|
+
* The serialisable replacement for the live-object `IStreamBroker.
|
|
1371
|
+
* onDecodedAudioChunk` callback path. Unlike the video frame plane,
|
|
1372
|
+
* audio chunks are tiny (a ~500ms PCM window is a few KB) so they ship
|
|
1373
|
+
* their bytes INLINE over tRPC — no shared-memory ring. A consumer:
|
|
1374
|
+
*
|
|
1375
|
+
* 1. `subscribeAudioChunks({ brokerId, tag })` — the broker registers
|
|
1376
|
+
* a per-subscription bounded FIFO queue and returns a
|
|
1377
|
+
* `subscriptionId`.
|
|
1378
|
+
* 2. polls `pullAudioChunks({ subscriptionId, maxCount })` — drains
|
|
1379
|
+
* `DecodedAudioChunk[]` in arrival order (FIFO, no latest-wins
|
|
1380
|
+
* drop: an audio gap is audible / breaks an analysis window). The
|
|
1381
|
+
* queue is generously sized; it only drops its oldest chunk if a
|
|
1382
|
+
* truly stalled consumer lets it overflow.
|
|
1383
|
+
* 3. `unsubscribeAudioChunks({ subscriptionId })` on teardown.
|
|
1384
|
+
*/
|
|
1385
|
+
subscribeAudioChunks: method(
|
|
1386
|
+
SubscribeAudioChunksInputSchema,
|
|
1387
|
+
SubscribeAudioChunksResultSchema,
|
|
1388
|
+
{ kind: "mutation" }
|
|
1389
|
+
),
|
|
1390
|
+
pullAudioChunks: method(
|
|
1391
|
+
z.object({
|
|
1392
|
+
subscriptionId: z.string(),
|
|
1393
|
+
maxCount: z.number().int().positive().default(8)
|
|
1394
|
+
}),
|
|
1395
|
+
z.array(DecodedAudioChunkSchema).readonly()
|
|
1396
|
+
),
|
|
1397
|
+
unsubscribeAudioChunks: method(
|
|
1398
|
+
z.object({ subscriptionId: z.string() }),
|
|
1399
|
+
z.object({ released: z.boolean() }),
|
|
1400
|
+
{ kind: "mutation" }
|
|
1401
|
+
),
|
|
1402
|
+
/**
|
|
1403
|
+
* ── Shared-memory frame plane (Phase 5 / D9) ──────────────────────
|
|
1404
|
+
*
|
|
1405
|
+
* The handle-based replacement for the live-object `IStreamBroker.
|
|
1406
|
+
* onDecodedFrame` callback path. A consumer:
|
|
1407
|
+
*
|
|
1408
|
+
* 1. `subscribeFrames({ brokerId, format })` — the broker spins up
|
|
1409
|
+
* (or reuses) a `frameSink: 'shm'` decoder session producing that
|
|
1410
|
+
* `format` and returns a `subscriptionId`.
|
|
1411
|
+
* 2. polls `pullFrameHandles({ subscriptionId, maxCount })` — drains
|
|
1412
|
+
* zero-pixel `FrameHandle[]`; each handle is fed to a
|
|
1413
|
+
* `FrameRingReader` that opens the named shm segment and reads the
|
|
1414
|
+
* pixels back zero-copy.
|
|
1415
|
+
* 3. `unsubscribeFrames({ subscriptionId })` on teardown.
|
|
1416
|
+
*
|
|
1417
|
+
* The broker keeps one shm ring per `(brokerId, format)` actually
|
|
1418
|
+
* requested — no broker-side `sharp` conversion. fps throttling is
|
|
1419
|
+
* implicit (latest-wins ring reads drop frames for a slow consumer).
|
|
1420
|
+
*/
|
|
1421
|
+
subscribeFrames: method(
|
|
1422
|
+
SubscribeFramesInputSchema,
|
|
1423
|
+
SubscribeFramesResultSchema,
|
|
1424
|
+
{ kind: "mutation" }
|
|
1425
|
+
),
|
|
1426
|
+
pullFrameHandles: method(
|
|
1427
|
+
z.object({
|
|
1428
|
+
subscriptionId: z.string(),
|
|
1429
|
+
maxCount: z.number().int().positive().default(4)
|
|
1430
|
+
}),
|
|
1431
|
+
z.array(FrameHandleSchema).readonly()
|
|
1432
|
+
),
|
|
1433
|
+
unsubscribeFrames: method(
|
|
1434
|
+
z.object({ subscriptionId: z.string() }),
|
|
1435
|
+
z.object({ released: z.boolean() }),
|
|
1436
|
+
{ kind: "mutation" }
|
|
1304
1437
|
),
|
|
1305
1438
|
setPreBufferDuration: method(
|
|
1306
1439
|
z.object({ brokerId: z.string(), seconds: z.number().min(0).max(30) }),
|
|
@@ -1356,6 +1489,8 @@ const cameraStreamsCapability = {
|
|
|
1356
1489
|
name: "camera-streams",
|
|
1357
1490
|
scope: "device",
|
|
1358
1491
|
mode: "singleton",
|
|
1492
|
+
kind: "wrapper",
|
|
1493
|
+
defaultActive: true,
|
|
1359
1494
|
deviceTypes: [DeviceType.Camera],
|
|
1360
1495
|
methods: {
|
|
1361
1496
|
getCameraStreams: method(
|
|
@@ -1651,6 +1786,8 @@ const motionDetectionCapability = {
|
|
|
1651
1786
|
name: "motion-detection",
|
|
1652
1787
|
scope: "device",
|
|
1653
1788
|
mode: "singleton",
|
|
1789
|
+
kind: "wrapper",
|
|
1790
|
+
defaultActive: true,
|
|
1654
1791
|
exposesDeviceSettings: true,
|
|
1655
1792
|
methods: {
|
|
1656
1793
|
analyze: method(
|
|
@@ -2522,6 +2659,42 @@ const motionTriggerCapability = {
|
|
|
2522
2659
|
},
|
|
2523
2660
|
runtimeState: MotionTriggerRuntimeStateSchema
|
|
2524
2661
|
};
|
|
2662
|
+
const MotionZoneStatusSchema = z.object({
|
|
2663
|
+
enabled: z.boolean(),
|
|
2664
|
+
sensitivity: z.number(),
|
|
2665
|
+
/** Row-major active-cell grid. Length = gridWidth*gridHeight (see getOptions). */
|
|
2666
|
+
cells: z.array(z.boolean()),
|
|
2667
|
+
lastFetchedAt: z.number()
|
|
2668
|
+
});
|
|
2669
|
+
const MotionZoneOptionsSchema = z.object({
|
|
2670
|
+
gridWidth: z.number(),
|
|
2671
|
+
gridHeight: z.number(),
|
|
2672
|
+
sensitivity: z.object({ min: z.number(), max: z.number(), step: z.number() })
|
|
2673
|
+
});
|
|
2674
|
+
const MotionZonePatchSchema = z.object({
|
|
2675
|
+
enabled: z.boolean().optional(),
|
|
2676
|
+
sensitivity: z.number().optional(),
|
|
2677
|
+
cells: z.array(z.boolean()).optional()
|
|
2678
|
+
});
|
|
2679
|
+
const motionZonesCapability = {
|
|
2680
|
+
name: "motion-zones",
|
|
2681
|
+
scope: "device",
|
|
2682
|
+
mode: "singleton",
|
|
2683
|
+
deviceTypes: [DeviceType.Camera],
|
|
2684
|
+
deviceConfig: {
|
|
2685
|
+
ui: { kind: "widget", widgetId: "host/motion-zones-grid", tab: "motion", label: "Motion Zones" }
|
|
2686
|
+
},
|
|
2687
|
+
methods: {
|
|
2688
|
+
getOptions: method(z.object({ deviceId: z.number() }), MotionZoneOptionsSchema),
|
|
2689
|
+
setZone: method(
|
|
2690
|
+
z.object({ deviceId: z.number(), patch: MotionZonePatchSchema }),
|
|
2691
|
+
z.void(),
|
|
2692
|
+
{ kind: "mutation", auth: "admin" }
|
|
2693
|
+
)
|
|
2694
|
+
},
|
|
2695
|
+
status: { schema: MotionZoneStatusSchema, kind: "poll" },
|
|
2696
|
+
runtimeState: MotionZoneStatusSchema
|
|
2697
|
+
};
|
|
2525
2698
|
const AutotrackTargetTypeSchema = z.string().describe("Vendor target string (people/vehicle/pet); empty = camera default");
|
|
2526
2699
|
const PtzAutotrackSettingsSchema = z.object({
|
|
2527
2700
|
targetType: AutotrackTargetTypeSchema,
|
|
@@ -2560,6 +2733,9 @@ const ptzAutotrackCapability = {
|
|
|
2560
2733
|
scope: "device",
|
|
2561
2734
|
mode: "singleton",
|
|
2562
2735
|
deviceTypes: [DeviceType.Camera],
|
|
2736
|
+
deviceConfig: {
|
|
2737
|
+
ui: { kind: "widget", widgetId: "host/ptz-autotrack", tab: "ptz", topTab: true, label: "Auto-Tracking", order: 5 }
|
|
2738
|
+
},
|
|
2563
2739
|
methods: {
|
|
2564
2740
|
/**
|
|
2565
2741
|
* Read the current on/off state + last-applied settings.
|
|
@@ -2626,6 +2802,111 @@ const ptzAutotrackCapability = {
|
|
|
2626
2802
|
*/
|
|
2627
2803
|
runtimeState: PtzAutotrackRuntimeStateSchema
|
|
2628
2804
|
};
|
|
2805
|
+
const StreamProfileSchema = z.enum(["main", "sub", "ext"]);
|
|
2806
|
+
const StreamProfileConfigSchema = z.object({
|
|
2807
|
+
width: z.number(),
|
|
2808
|
+
height: z.number(),
|
|
2809
|
+
codec: z.enum(["h264", "h265"]),
|
|
2810
|
+
framerate: z.number(),
|
|
2811
|
+
bitrate: z.number(),
|
|
2812
|
+
// kbps
|
|
2813
|
+
bitrateMode: z.enum(["vbr", "cbr"]).optional(),
|
|
2814
|
+
encoderProfile: z.enum(["high", "main", "baseline"]).optional(),
|
|
2815
|
+
gop: z.number().optional(),
|
|
2816
|
+
audio: z.boolean().optional()
|
|
2817
|
+
});
|
|
2818
|
+
const StreamParamsStatusSchema = z.object({
|
|
2819
|
+
/** Per-profile current config. A profile absent = the camera doesn't have it. */
|
|
2820
|
+
main: StreamProfileConfigSchema.optional(),
|
|
2821
|
+
sub: StreamProfileConfigSchema.optional(),
|
|
2822
|
+
ext: StreamProfileConfigSchema.optional(),
|
|
2823
|
+
lastFetchedAt: z.number()
|
|
2824
|
+
});
|
|
2825
|
+
const StreamProfileOptionsSchema = z.object({
|
|
2826
|
+
resolutions: z.array(z.object({ width: z.number(), height: z.number() })),
|
|
2827
|
+
codecs: z.array(z.enum(["h264", "h265"])),
|
|
2828
|
+
framerates: z.array(z.number()),
|
|
2829
|
+
/** Allowed bitrate values (kbps). Empty if the camera takes a free range. */
|
|
2830
|
+
bitrates: z.array(z.number()),
|
|
2831
|
+
/** Optional [min,max] kbps when the camera accepts a continuous range. */
|
|
2832
|
+
bitrateRange: z.tuple([z.number(), z.number()]).optional(),
|
|
2833
|
+
supportsBitrateMode: z.boolean(),
|
|
2834
|
+
supportsEncoderProfile: z.boolean(),
|
|
2835
|
+
supportsGop: z.boolean(),
|
|
2836
|
+
/** Allowed GOP / keyframe-interval range, in seconds — drives the
|
|
2837
|
+
* I-frame-interval selector. Absent when the camera advertises GOP
|
|
2838
|
+
* support but no concrete range (callers then fall back to a free
|
|
2839
|
+
* numeric input). `{ min, max, step }` per the getOptions convention. */
|
|
2840
|
+
gop: z.object({ min: z.number(), max: z.number(), step: z.number() }).optional()
|
|
2841
|
+
});
|
|
2842
|
+
const StreamParamsOptionsSchema = z.object({
|
|
2843
|
+
main: StreamProfileOptionsSchema.optional(),
|
|
2844
|
+
sub: StreamProfileOptionsSchema.optional(),
|
|
2845
|
+
ext: StreamProfileOptionsSchema.optional()
|
|
2846
|
+
});
|
|
2847
|
+
const StreamProfilePatchSchema = z.object({
|
|
2848
|
+
width: z.number().optional(),
|
|
2849
|
+
height: z.number().optional(),
|
|
2850
|
+
codec: z.enum(["h264", "h265"]).optional(),
|
|
2851
|
+
framerate: z.number().optional(),
|
|
2852
|
+
bitrate: z.number().optional(),
|
|
2853
|
+
bitrateMode: z.enum(["vbr", "cbr"]).optional(),
|
|
2854
|
+
encoderProfile: z.enum(["high", "main", "baseline"]).optional(),
|
|
2855
|
+
gop: z.number().optional(),
|
|
2856
|
+
audio: z.boolean().optional()
|
|
2857
|
+
});
|
|
2858
|
+
const streamParamsCapability = {
|
|
2859
|
+
name: "stream-params",
|
|
2860
|
+
scope: "device",
|
|
2861
|
+
mode: "singleton",
|
|
2862
|
+
deviceTypes: [DeviceType.Camera],
|
|
2863
|
+
deviceConfig: {
|
|
2864
|
+
ui: { kind: "derived-form", builderId: "stream-params", tab: "streaming" }
|
|
2865
|
+
},
|
|
2866
|
+
methods: {
|
|
2867
|
+
getOptions: method(
|
|
2868
|
+
z.object({ deviceId: z.number() }),
|
|
2869
|
+
StreamParamsOptionsSchema
|
|
2870
|
+
),
|
|
2871
|
+
setProfile: method(
|
|
2872
|
+
z.object({
|
|
2873
|
+
deviceId: z.number(),
|
|
2874
|
+
profile: StreamProfileSchema,
|
|
2875
|
+
patch: StreamProfilePatchSchema
|
|
2876
|
+
}),
|
|
2877
|
+
z.void(),
|
|
2878
|
+
{ kind: "mutation", auth: "admin" }
|
|
2879
|
+
),
|
|
2880
|
+
/**
|
|
2881
|
+
* Build the `ConfigUISchema` (admin-ui `ConfigFormBuilder` input
|
|
2882
|
+
* shape) for this camera's stream-encoder settings — one section per
|
|
2883
|
+
* profile (main / sub / ext) with the resolution / codec / framerate
|
|
2884
|
+
* / bitrate / bitrate-mode / encoder-profile / GOP controls the
|
|
2885
|
+
* firmware actually exposes.
|
|
2886
|
+
*
|
|
2887
|
+
* Driven by `getOptions` (camera-probed availability) + `getStatus`
|
|
2888
|
+
* (current per-profile config); each field's `default` is seeded
|
|
2889
|
+
* from the live config so the form renders the camera state in one
|
|
2890
|
+
* pass. Returns `null` when the camera exposes no configurable
|
|
2891
|
+
* stream property — the renderer then shows the unsupported message.
|
|
2892
|
+
*
|
|
2893
|
+
* Output is `z.unknown().nullable()` — the same convention every
|
|
2894
|
+
* other `ConfigUISchema`-returning cap method uses (`device-ops`,
|
|
2895
|
+
* `device-manager`); `ConfigUISchema` is a TS-only type with no
|
|
2896
|
+
* companion Zod schema, and a concrete object would collapse
|
|
2897
|
+
* unrelated AppRouter branches to `unknown` during codegen.
|
|
2898
|
+
*/
|
|
2899
|
+
getConfigSchema: method(
|
|
2900
|
+
z.object({ deviceId: z.number() }),
|
|
2901
|
+
z.unknown().nullable()
|
|
2902
|
+
)
|
|
2903
|
+
},
|
|
2904
|
+
status: {
|
|
2905
|
+
schema: StreamParamsStatusSchema,
|
|
2906
|
+
kind: "poll"
|
|
2907
|
+
},
|
|
2908
|
+
runtimeState: StreamParamsStatusSchema
|
|
2909
|
+
};
|
|
2629
2910
|
const SwitchStatusSchema = z.object({
|
|
2630
2911
|
on: z.boolean(),
|
|
2631
2912
|
/** Ms epoch of the last state change. Useful for UI "X minutes ago". */
|
|
@@ -3630,6 +3911,83 @@ const adminUiCapability = {
|
|
|
3630
3911
|
getVersion: method(z.void(), VersionOutputSchema)
|
|
3631
3912
|
}
|
|
3632
3913
|
};
|
|
3914
|
+
const MethodAccessSchema = z.enum(["view", "create", "delete"]);
|
|
3915
|
+
const AllowedProviderSchema = z.union([z.literal("*"), z.array(z.string())]);
|
|
3916
|
+
const AllowedDevicesSchema = z.record(z.string(), z.union([z.literal("*"), z.array(z.string())]));
|
|
3917
|
+
const CapScopeSchema = z.enum(["device", "system"]);
|
|
3918
|
+
const TokenScopeSchema = z.discriminatedUnion("type", [
|
|
3919
|
+
z.object({
|
|
3920
|
+
type: z.literal("category"),
|
|
3921
|
+
target: CapScopeSchema,
|
|
3922
|
+
access: z.array(MethodAccessSchema).min(1)
|
|
3923
|
+
}),
|
|
3924
|
+
z.object({
|
|
3925
|
+
type: z.literal("capability"),
|
|
3926
|
+
target: z.string(),
|
|
3927
|
+
access: z.array(MethodAccessSchema).min(1)
|
|
3928
|
+
}),
|
|
3929
|
+
z.object({
|
|
3930
|
+
type: z.literal("addon"),
|
|
3931
|
+
target: z.string(),
|
|
3932
|
+
access: z.array(MethodAccessSchema).min(1)
|
|
3933
|
+
}),
|
|
3934
|
+
z.object({
|
|
3935
|
+
type: z.literal("device"),
|
|
3936
|
+
/**
|
|
3937
|
+
* One or more deviceIds (serialised as strings for wire-format
|
|
3938
|
+
* consistency with the rest of the union). Matcher accepts if
|
|
3939
|
+
* `input.deviceId` ∈ `targets`. Array shape avoids the row-explosion
|
|
3940
|
+
* of one scope-per-device when granting access to a set of cameras.
|
|
3941
|
+
*/
|
|
3942
|
+
targets: z.array(z.string()).min(1),
|
|
3943
|
+
access: z.array(MethodAccessSchema).min(1)
|
|
3944
|
+
})
|
|
3945
|
+
]);
|
|
3946
|
+
const UserRecordSchema = z.object({
|
|
3947
|
+
id: z.string(),
|
|
3948
|
+
username: z.string(),
|
|
3949
|
+
passwordHash: z.string(),
|
|
3950
|
+
/**
|
|
3951
|
+
* Admin bypass. When true, the middleware skips the scope-access
|
|
3952
|
+
* check entirely. There is no other axis of privilege; the legacy
|
|
3953
|
+
* role enum collapsed onto this boolean in v2.
|
|
3954
|
+
*/
|
|
3955
|
+
isAdmin: z.boolean().default(false),
|
|
3956
|
+
allowedProviders: AllowedProviderSchema,
|
|
3957
|
+
allowedDevices: AllowedDevicesSchema,
|
|
3958
|
+
/**
|
|
3959
|
+
* Scopes granted to this user. Admins bypass; their `scopes` is
|
|
3960
|
+
* ignored. Non-admins without scopes are locked out of every
|
|
3961
|
+
* protected call.
|
|
3962
|
+
*/
|
|
3963
|
+
scopes: z.array(TokenScopeSchema).default([]),
|
|
3964
|
+
createdAt: z.number(),
|
|
3965
|
+
updatedAt: z.number()
|
|
3966
|
+
});
|
|
3967
|
+
const ApiKeyRecordSchema = z.object({
|
|
3968
|
+
id: z.string(),
|
|
3969
|
+
label: z.string(),
|
|
3970
|
+
isAdmin: z.boolean().default(false),
|
|
3971
|
+
allowedProviders: AllowedProviderSchema,
|
|
3972
|
+
allowedDevices: AllowedDevicesSchema,
|
|
3973
|
+
tokenHash: z.string(),
|
|
3974
|
+
tokenPrefix: z.string(),
|
|
3975
|
+
createdAt: z.number(),
|
|
3976
|
+
lastUsedAt: z.number().optional()
|
|
3977
|
+
});
|
|
3978
|
+
const ScopedTokenSchema = z.object({
|
|
3979
|
+
id: z.string(),
|
|
3980
|
+
userId: z.string(),
|
|
3981
|
+
name: z.string(),
|
|
3982
|
+
tokenHash: z.string(),
|
|
3983
|
+
tokenPrefix: z.string(),
|
|
3984
|
+
scopes: z.array(TokenScopeSchema),
|
|
3985
|
+
// SQLite/JSON storage round-trips undefined → null. Use `nullish` so the
|
|
3986
|
+
// schema accepts both `null` (read from disk) and `undefined` (in-memory).
|
|
3987
|
+
expiresAt: z.number().nullish(),
|
|
3988
|
+
lastUsedAt: z.number().nullish(),
|
|
3989
|
+
createdAt: z.number()
|
|
3990
|
+
});
|
|
3633
3991
|
const SsoBridgeClaimsSchema = z.object({
|
|
3634
3992
|
userId: z.string(),
|
|
3635
3993
|
username: z.string(),
|
|
@@ -3645,7 +4003,18 @@ const SsoBridgeClaimsSchema = z.object({
|
|
|
3645
4003
|
* JWT WITHOUT verifying the signature — the hub re-verifies on every
|
|
3646
4004
|
* inbound call so trust still rests with the signing hub.
|
|
3647
4005
|
*/
|
|
3648
|
-
hubUrl: z.string().optional()
|
|
4006
|
+
hubUrl: z.string().optional(),
|
|
4007
|
+
/** Permission scopes baked into the token. Set by the OAuth
|
|
4008
|
+
* account-linking grant; absent on ordinary SSO-login tokens. */
|
|
4009
|
+
scopes: z.array(TokenScopeSchema).optional(),
|
|
4010
|
+
/** OAuth authorization-code binding — set only on `oauth-code` tokens. */
|
|
4011
|
+
redirectUri: z.string().optional(),
|
|
4012
|
+
integrationId: z.string().optional(),
|
|
4013
|
+
/** JWT ID — unique per issued code; consumed-set enforces single-use. */
|
|
4014
|
+
jti: z.string().optional(),
|
|
4015
|
+
/** OAuth session registry id — set on `oauth-access`/`oauth-refresh`
|
|
4016
|
+
* tokens so the verify path can check the session is not revoked. */
|
|
4017
|
+
sessionId: z.string().optional()
|
|
3649
4018
|
});
|
|
3650
4019
|
const ssoBridgeCapability = {
|
|
3651
4020
|
name: "sso-bridge",
|
|
@@ -3666,6 +4035,27 @@ const ssoBridgeCapability = {
|
|
|
3666
4035
|
)
|
|
3667
4036
|
}
|
|
3668
4037
|
};
|
|
4038
|
+
const OauthIntegrationDescriptorSchema = z.object({
|
|
4039
|
+
/** Stable id used as the `integration=` query param, e.g. 'export-alexa'. */
|
|
4040
|
+
integrationId: z.string(),
|
|
4041
|
+
/** Human label rendered on the consent page. */
|
|
4042
|
+
displayName: z.string(),
|
|
4043
|
+
/** Scopes baked into every token issued for this integration. */
|
|
4044
|
+
requestedScopes: z.array(TokenScopeSchema),
|
|
4045
|
+
/** Allowed redirect_uri prefixes. /api/oauth2/authorize rejects any
|
|
4046
|
+
* redirect_uri that does not start with one of these. Required —
|
|
4047
|
+
* an empty list means the integration can never complete linking. */
|
|
4048
|
+
allowedRedirectPrefixes: z.array(z.string()).min(1)
|
|
4049
|
+
});
|
|
4050
|
+
const oauthIntegrationCapability = {
|
|
4051
|
+
name: "oauth-integration",
|
|
4052
|
+
scope: "system",
|
|
4053
|
+
mode: "collection",
|
|
4054
|
+
internal: true,
|
|
4055
|
+
methods: {
|
|
4056
|
+
getDescriptor: method(z.void(), OauthIntegrationDescriptorSchema)
|
|
4057
|
+
}
|
|
4058
|
+
};
|
|
3669
4059
|
const PasskeySummarySchema = z.object({
|
|
3670
4060
|
credentialId: z.string(),
|
|
3671
4061
|
label: z.string(),
|
|
@@ -3981,21 +4371,30 @@ const addonPagesSourceCapability = {
|
|
|
3981
4371
|
};
|
|
3982
4372
|
const WidgetHostEnum = z.enum(["device-tab", "dashboard", "integration-detail"]);
|
|
3983
4373
|
const WidgetSizeEnum = z.enum(["xs", "sm", "md", "lg", "xl"]);
|
|
4374
|
+
const WidgetRemoteSchema = z.object({
|
|
4375
|
+
remoteName: z.string(),
|
|
4376
|
+
exposedModule: z.string(),
|
|
4377
|
+
componentKey: z.string().optional()
|
|
4378
|
+
});
|
|
3984
4379
|
const WidgetMetadataSchema = z.object({
|
|
3985
|
-
|
|
3986
|
-
|
|
4380
|
+
// ── UiContribution core (kind:'remote') ──────────────────────────
|
|
4381
|
+
/** Primary host tab — `'dashboard'`, `'device-tab'`, or a device-detail tab id. */
|
|
4382
|
+
tab: z.string(),
|
|
4383
|
+
/** Optional sub-tab within `tab`. */
|
|
4384
|
+
subTab: z.string().optional(),
|
|
3987
4385
|
/** Operator-facing label. */
|
|
3988
4386
|
label: z.string(),
|
|
4387
|
+
/** Ordering within `(tab, subTab)`, ascending. */
|
|
4388
|
+
order: z.number().optional(),
|
|
4389
|
+
/** Always `'remote'` — a widget is a Module Federation remote. */
|
|
4390
|
+
kind: z.literal("remote"),
|
|
4391
|
+
/** MF remote descriptor. */
|
|
4392
|
+
remote: WidgetRemoteSchema,
|
|
4393
|
+
// ── Widget-only metadata ─────────────────────────────────────────
|
|
4394
|
+
/** Stable id within the addon — kebab-case. Equals `remote.componentKey`. */
|
|
4395
|
+
stableId: z.string(),
|
|
3989
4396
|
description: z.string().optional(),
|
|
3990
4397
|
icon: z.string().optional(),
|
|
3991
|
-
/**
|
|
3992
|
-
* Module Federation remote name — must match the `name` field on the
|
|
3993
|
-
* widget addon's `federation()` plugin config. Used by the host's
|
|
3994
|
-
* `<WidgetRegistryProvider>` to call `loadRemote('<remoteName>/widgets')`.
|
|
3995
|
-
* Conventionally `addon_<addonid>_widgets` (snake_case; MF names
|
|
3996
|
-
* cannot contain hyphens).
|
|
3997
|
-
*/
|
|
3998
|
-
remoteName: z.string(),
|
|
3999
4398
|
/**
|
|
4000
4399
|
* Bundle filename inside the addon's `dist/` dir served at
|
|
4001
4400
|
* `/api/addon-widgets/<addonId>/<bundle>`. With Module Federation
|
|
@@ -4004,9 +4403,9 @@ const WidgetMetadataSchema = z.object({
|
|
|
4004
4403
|
* cache-buster URL without a separate filesystem stat.
|
|
4005
4404
|
*/
|
|
4006
4405
|
bundle: z.string(),
|
|
4007
|
-
/**
|
|
4406
|
+
/** Every host the widget supports. The picker filters on this set. */
|
|
4008
4407
|
hosts: z.array(WidgetHostEnum).readonly(),
|
|
4009
|
-
/** Required props the host must supply. Validated at
|
|
4408
|
+
/** Required props the host must supply. Validated at `<WidgetSlot>` mount. */
|
|
4010
4409
|
requires: z.object({
|
|
4011
4410
|
deviceContext: z.boolean().default(false),
|
|
4012
4411
|
integrationContext: z.boolean().default(false)
|
|
@@ -4106,6 +4505,16 @@ const DEFAULT_DECODER_HWACCEL_CONFIG = {
|
|
|
4106
4505
|
hwaccel: "auto",
|
|
4107
4506
|
probedBestHwaccel: ""
|
|
4108
4507
|
};
|
|
4508
|
+
const ShmRingStatsSchema = z.object({
|
|
4509
|
+
sessionId: z.string(),
|
|
4510
|
+
slotCount: z.number().int(),
|
|
4511
|
+
slotByteLength: z.number().int(),
|
|
4512
|
+
segmentBytes: z.number().int(),
|
|
4513
|
+
budgetMb: z.number().int(),
|
|
4514
|
+
framesWritten: z.number().int(),
|
|
4515
|
+
getFrameHits: z.number().int(),
|
|
4516
|
+
getFrameMisses: z.number().int()
|
|
4517
|
+
});
|
|
4109
4518
|
const decoderCapability = {
|
|
4110
4519
|
name: "decoder",
|
|
4111
4520
|
scope: "system",
|
|
@@ -4142,10 +4551,27 @@ const decoderCapability = {
|
|
|
4142
4551
|
url: z.string()
|
|
4143
4552
|
}), z.void()),
|
|
4144
4553
|
// ── Output — polling-based frame retrieval ────────────────────
|
|
4554
|
+
// `pullFrames` drains the pixel `DecodedFrame[]` of a `frameSink:
|
|
4555
|
+
// 'callback'` session. `pullHandles` (Phase 5 / D9) drains the
|
|
4556
|
+
// zero-pixel `FrameHandle[]` of a `frameSink: 'shm'` session — the
|
|
4557
|
+
// broker hands each handle to a `FrameRingReader` that opens the
|
|
4558
|
+
// named segment and reads the pixels back zero-copy. A session is
|
|
4559
|
+
// one mode or the other; the unmatched method returns an empty
|
|
4560
|
+
// array.
|
|
4145
4561
|
pullFrames: method(z.object({
|
|
4146
4562
|
sessionId: z.string(),
|
|
4147
4563
|
maxCount: z.number().default(1)
|
|
4148
4564
|
}), z.array(DecodedFrameSchema)),
|
|
4565
|
+
pullHandles: method(z.object({
|
|
4566
|
+
sessionId: z.string(),
|
|
4567
|
+
maxCount: z.number().default(1)
|
|
4568
|
+
}), z.array(FrameHandleSchema)),
|
|
4569
|
+
// ── Frame fetch (Phase 5 / D9 downstream access) ──────────────
|
|
4570
|
+
// Read the pixels a FrameHandle refers to from this node's shm ring.
|
|
4571
|
+
// Returns null when the slot was already recycled (latest-wins).
|
|
4572
|
+
getFrame: method(z.object({ handle: FrameHandleSchema }), DecodedFrameSchema.nullable()),
|
|
4573
|
+
// shm ring usage stats for a session.
|
|
4574
|
+
getShmStats: method(z.object({ sessionId: z.string() }), ShmRingStatsSchema.nullable()),
|
|
4149
4575
|
// ── Control ───────────────────────────────────────────────────
|
|
4150
4576
|
updateConfig: method(z.object({
|
|
4151
4577
|
sessionId: z.string(),
|
|
@@ -4298,6 +4724,8 @@ const webrtcSessionCapability = {
|
|
|
4298
4724
|
name: "webrtc-session",
|
|
4299
4725
|
scope: "device",
|
|
4300
4726
|
mode: "singleton",
|
|
4727
|
+
kind: "wrapper",
|
|
4728
|
+
defaultActive: true,
|
|
4301
4729
|
deviceTypes: [DeviceType.Camera],
|
|
4302
4730
|
methods: {
|
|
4303
4731
|
/**
|
|
@@ -4816,6 +5244,8 @@ const audioAnalysisCapability = {
|
|
|
4816
5244
|
name: "audio-analysis",
|
|
4817
5245
|
scope: "device",
|
|
4818
5246
|
mode: "singleton",
|
|
5247
|
+
kind: "wrapper",
|
|
5248
|
+
defaultActive: true,
|
|
4819
5249
|
deviceTypes: [DeviceType.Camera],
|
|
4820
5250
|
exposesDeviceSettings: true,
|
|
4821
5251
|
methods: {
|
|
@@ -5355,8 +5785,8 @@ const deviceManagerCapability = {
|
|
|
5355
5785
|
/**
|
|
5356
5786
|
* Return the addon ids that declared a wrapper provider for `capName`.
|
|
5357
5787
|
* Backs the device-bindings UI's wrapper-picker dropdown. Entries are
|
|
5358
|
-
* sourced from `CapabilityRegistry.wrapperProviders`, populated
|
|
5359
|
-
* `
|
|
5788
|
+
* sourced from `CapabilityRegistry.wrapperProviders`, populated when
|
|
5789
|
+
* the cap definition declares `kind: 'wrapper'`.
|
|
5360
5790
|
*/
|
|
5361
5791
|
listWrappersForCap: method(
|
|
5362
5792
|
z.object({ capName: z.string() }),
|
|
@@ -5751,6 +6181,8 @@ const snapshotCapability = {
|
|
|
5751
6181
|
name: "snapshot",
|
|
5752
6182
|
scope: "device",
|
|
5753
6183
|
mode: "singleton",
|
|
6184
|
+
kind: "wrapper",
|
|
6185
|
+
defaultActive: true,
|
|
5754
6186
|
deviceTypes: [DeviceType.Camera],
|
|
5755
6187
|
// Owns per-device snapshot settings (preferred stream, debug logging).
|
|
5756
6188
|
// The three DeviceSettingsContribution methods are auto-added to the
|
|
@@ -6100,6 +6532,8 @@ const detectionPipelineCapability = {
|
|
|
6100
6532
|
name: "detection-pipeline",
|
|
6101
6533
|
scope: "device",
|
|
6102
6534
|
mode: "singleton",
|
|
6535
|
+
kind: "wrapper",
|
|
6536
|
+
defaultActive: true,
|
|
6103
6537
|
deviceTypes: [DeviceType.Camera],
|
|
6104
6538
|
exposesDeviceSettings: true,
|
|
6105
6539
|
methods: {}
|
|
@@ -6208,6 +6642,8 @@ const pipelineAnalyticsCapability = {
|
|
|
6208
6642
|
name: "pipeline-analytics",
|
|
6209
6643
|
scope: "device",
|
|
6210
6644
|
mode: "singleton",
|
|
6645
|
+
kind: "wrapper",
|
|
6646
|
+
defaultActive: true,
|
|
6211
6647
|
deviceTypes: [DeviceType.Camera],
|
|
6212
6648
|
exposesDeviceSettings: true,
|
|
6213
6649
|
methods: {
|
|
@@ -6497,11 +6933,26 @@ const PtzMoveCommandSchema = z.object({
|
|
|
6497
6933
|
zoom: z.number().optional(),
|
|
6498
6934
|
speed: z.number().optional()
|
|
6499
6935
|
});
|
|
6936
|
+
const PtzStatusSchema = PtzPositionSchema.extend({ autofocus: z.boolean() });
|
|
6937
|
+
const PtzOptionsSchema = z.object({
|
|
6938
|
+
hasPan: z.boolean(),
|
|
6939
|
+
hasTilt: z.boolean(),
|
|
6940
|
+
hasZoom: z.boolean(),
|
|
6941
|
+
supportsPresets: z.boolean(),
|
|
6942
|
+
/** Max number of named presets the camera supports, when known. */
|
|
6943
|
+
maxPresets: z.number().optional(),
|
|
6944
|
+
/** Whether the camera exposes a controllable autofocus toggle
|
|
6945
|
+
* (boolean `hasX` per the getOptions availability convention). */
|
|
6946
|
+
hasAutofocus: z.boolean()
|
|
6947
|
+
});
|
|
6500
6948
|
const ptzCapability = {
|
|
6501
6949
|
name: "ptz",
|
|
6502
6950
|
scope: "device",
|
|
6503
6951
|
mode: "singleton",
|
|
6504
6952
|
deviceTypes: [DeviceType.Camera],
|
|
6953
|
+
deviceConfig: {
|
|
6954
|
+
ui: { kind: "widget", widgetId: "host/ptz-panel", tab: "ptz", topTab: true, label: "PTZ", order: 0 }
|
|
6955
|
+
},
|
|
6505
6956
|
methods: {
|
|
6506
6957
|
move: method(
|
|
6507
6958
|
PtzMoveCommandSchema.extend({ deviceId: z.number() }),
|
|
@@ -6527,6 +6978,20 @@ const ptzCapability = {
|
|
|
6527
6978
|
z.void(),
|
|
6528
6979
|
{ kind: "mutation" }
|
|
6529
6980
|
),
|
|
6981
|
+
savePreset: method(
|
|
6982
|
+
z.object({ deviceId: z.number(), presetId: z.string(), name: z.string() }),
|
|
6983
|
+
z.void(),
|
|
6984
|
+
{ kind: "mutation", auth: "admin" }
|
|
6985
|
+
),
|
|
6986
|
+
deletePreset: method(
|
|
6987
|
+
z.object({ deviceId: z.number(), presetId: z.string() }),
|
|
6988
|
+
z.void(),
|
|
6989
|
+
{ kind: "mutation", auth: "admin" }
|
|
6990
|
+
),
|
|
6991
|
+
getOptions: method(
|
|
6992
|
+
z.object({ deviceId: z.number() }),
|
|
6993
|
+
PtzOptionsSchema
|
|
6994
|
+
),
|
|
6530
6995
|
goHome: method(
|
|
6531
6996
|
z.object({ deviceId: z.number() }),
|
|
6532
6997
|
z.void(),
|
|
@@ -6541,10 +7006,17 @@ const ptzCapability = {
|
|
|
6541
7006
|
getPosition: method(
|
|
6542
7007
|
z.object({ deviceId: z.number() }),
|
|
6543
7008
|
PtzPositionSchema
|
|
7009
|
+
),
|
|
7010
|
+
/** Toggle the camera's autofocus. Only meaningful when
|
|
7011
|
+
* `getOptions().hasAutofocus` is true. */
|
|
7012
|
+
setAutofocus: method(
|
|
7013
|
+
z.object({ deviceId: z.number(), enabled: z.boolean() }),
|
|
7014
|
+
z.void(),
|
|
7015
|
+
{ kind: "mutation" }
|
|
6544
7016
|
)
|
|
6545
7017
|
},
|
|
6546
7018
|
status: {
|
|
6547
|
-
schema:
|
|
7019
|
+
schema: PtzStatusSchema,
|
|
6548
7020
|
kind: "command-driven"
|
|
6549
7021
|
}
|
|
6550
7022
|
};
|
|
@@ -7568,83 +8040,6 @@ const meshNetworkCapability = {
|
|
|
7568
8040
|
// tabs driven by this cap.
|
|
7569
8041
|
}
|
|
7570
8042
|
};
|
|
7571
|
-
const MethodAccessSchema = z.enum(["view", "create", "delete"]);
|
|
7572
|
-
const AllowedProviderSchema = z.union([z.literal("*"), z.array(z.string())]);
|
|
7573
|
-
const AllowedDevicesSchema = z.record(z.string(), z.union([z.literal("*"), z.array(z.string())]));
|
|
7574
|
-
const CapScopeSchema = z.enum(["device", "system"]);
|
|
7575
|
-
const TokenScopeSchema = z.discriminatedUnion("type", [
|
|
7576
|
-
z.object({
|
|
7577
|
-
type: z.literal("category"),
|
|
7578
|
-
target: CapScopeSchema,
|
|
7579
|
-
access: z.array(MethodAccessSchema).min(1)
|
|
7580
|
-
}),
|
|
7581
|
-
z.object({
|
|
7582
|
-
type: z.literal("capability"),
|
|
7583
|
-
target: z.string(),
|
|
7584
|
-
access: z.array(MethodAccessSchema).min(1)
|
|
7585
|
-
}),
|
|
7586
|
-
z.object({
|
|
7587
|
-
type: z.literal("addon"),
|
|
7588
|
-
target: z.string(),
|
|
7589
|
-
access: z.array(MethodAccessSchema).min(1)
|
|
7590
|
-
}),
|
|
7591
|
-
z.object({
|
|
7592
|
-
type: z.literal("device"),
|
|
7593
|
-
/**
|
|
7594
|
-
* One or more deviceIds (serialised as strings for wire-format
|
|
7595
|
-
* consistency with the rest of the union). Matcher accepts if
|
|
7596
|
-
* `input.deviceId` ∈ `targets`. Array shape avoids the row-explosion
|
|
7597
|
-
* of one scope-per-device when granting access to a set of cameras.
|
|
7598
|
-
*/
|
|
7599
|
-
targets: z.array(z.string()).min(1),
|
|
7600
|
-
access: z.array(MethodAccessSchema).min(1)
|
|
7601
|
-
})
|
|
7602
|
-
]);
|
|
7603
|
-
const UserRecordSchema = z.object({
|
|
7604
|
-
id: z.string(),
|
|
7605
|
-
username: z.string(),
|
|
7606
|
-
passwordHash: z.string(),
|
|
7607
|
-
/**
|
|
7608
|
-
* Admin bypass. When true, the middleware skips the scope-access
|
|
7609
|
-
* check entirely. There is no other axis of privilege; the legacy
|
|
7610
|
-
* role enum collapsed onto this boolean in v2.
|
|
7611
|
-
*/
|
|
7612
|
-
isAdmin: z.boolean().default(false),
|
|
7613
|
-
allowedProviders: AllowedProviderSchema,
|
|
7614
|
-
allowedDevices: AllowedDevicesSchema,
|
|
7615
|
-
/**
|
|
7616
|
-
* Scopes granted to this user. Admins bypass; their `scopes` is
|
|
7617
|
-
* ignored. Non-admins without scopes are locked out of every
|
|
7618
|
-
* protected call.
|
|
7619
|
-
*/
|
|
7620
|
-
scopes: z.array(TokenScopeSchema).default([]),
|
|
7621
|
-
createdAt: z.number(),
|
|
7622
|
-
updatedAt: z.number()
|
|
7623
|
-
});
|
|
7624
|
-
const ApiKeyRecordSchema = z.object({
|
|
7625
|
-
id: z.string(),
|
|
7626
|
-
label: z.string(),
|
|
7627
|
-
isAdmin: z.boolean().default(false),
|
|
7628
|
-
allowedProviders: AllowedProviderSchema,
|
|
7629
|
-
allowedDevices: AllowedDevicesSchema,
|
|
7630
|
-
tokenHash: z.string(),
|
|
7631
|
-
tokenPrefix: z.string(),
|
|
7632
|
-
createdAt: z.number(),
|
|
7633
|
-
lastUsedAt: z.number().optional()
|
|
7634
|
-
});
|
|
7635
|
-
const ScopedTokenSchema = z.object({
|
|
7636
|
-
id: z.string(),
|
|
7637
|
-
userId: z.string(),
|
|
7638
|
-
name: z.string(),
|
|
7639
|
-
tokenHash: z.string(),
|
|
7640
|
-
tokenPrefix: z.string(),
|
|
7641
|
-
scopes: z.array(TokenScopeSchema),
|
|
7642
|
-
// SQLite/JSON storage round-trips undefined → null. Use `nullish` so the
|
|
7643
|
-
// schema accepts both `null` (read from disk) and `undefined` (in-memory).
|
|
7644
|
-
expiresAt: z.number().nullish(),
|
|
7645
|
-
lastUsedAt: z.number().nullish(),
|
|
7646
|
-
createdAt: z.number()
|
|
7647
|
-
});
|
|
7648
8043
|
const UserSummarySchema = z.object({
|
|
7649
8044
|
id: z.string(),
|
|
7650
8045
|
username: z.string(),
|
|
@@ -7717,6 +8112,16 @@ const CreateScopedTokenResultSchema = z.object({
|
|
|
7717
8112
|
token: z.string(),
|
|
7718
8113
|
record: ScopedTokenSummarySchema
|
|
7719
8114
|
});
|
|
8115
|
+
const OauthSessionSummarySchema = z.object({
|
|
8116
|
+
id: z.string(),
|
|
8117
|
+
userId: z.string(),
|
|
8118
|
+
username: z.string(),
|
|
8119
|
+
integrationId: z.string(),
|
|
8120
|
+
scopes: z.array(TokenScopeSchema),
|
|
8121
|
+
createdAt: z.number(),
|
|
8122
|
+
lastUsedAt: z.number(),
|
|
8123
|
+
revokedAt: z.number().nullable()
|
|
8124
|
+
});
|
|
7720
8125
|
const TotpSetupResultSchema = z.object({
|
|
7721
8126
|
secret: z.string(),
|
|
7722
8127
|
otpauthUrl: z.string()
|
|
@@ -7795,6 +8200,66 @@ const userManagementCapability = {
|
|
|
7795
8200
|
z.object({ userId: z.string(), code: z.string() }),
|
|
7796
8201
|
z.object({ valid: z.boolean() }),
|
|
7797
8202
|
{ kind: "mutation", access: "view" }
|
|
8203
|
+
),
|
|
8204
|
+
// ── OAuth account-linking grant ────────────────────────────────
|
|
8205
|
+
//
|
|
8206
|
+
// Core's /oauth2/* endpoints delegate here. Tokens are sso-bridge
|
|
8207
|
+
// JWTs (kinds oauth-code / oauth-access / oauth-refresh) and ALWAYS
|
|
8208
|
+
// carry isAdmin:false — the operator login proves hub control; the
|
|
8209
|
+
// issued token is minimal (device scope only).
|
|
8210
|
+
oauthIssueCode: method(
|
|
8211
|
+
z.object({
|
|
8212
|
+
integrationId: z.string(),
|
|
8213
|
+
userId: z.string(),
|
|
8214
|
+
username: z.string(),
|
|
8215
|
+
scopes: z.array(TokenScopeSchema),
|
|
8216
|
+
redirectUri: z.string(),
|
|
8217
|
+
hubUrl: z.string()
|
|
8218
|
+
}),
|
|
8219
|
+
z.object({ code: z.string() }),
|
|
8220
|
+
{ kind: "mutation", access: "create" }
|
|
8221
|
+
),
|
|
8222
|
+
oauthExchangeCode: method(
|
|
8223
|
+
z.object({ code: z.string(), redirectUri: z.string() }),
|
|
8224
|
+
z.object({
|
|
8225
|
+
accessToken: z.string(),
|
|
8226
|
+
refreshToken: z.string(),
|
|
8227
|
+
expiresIn: z.number()
|
|
8228
|
+
}).nullable(),
|
|
8229
|
+
{ kind: "mutation", access: "view" }
|
|
8230
|
+
),
|
|
8231
|
+
oauthRefresh: method(
|
|
8232
|
+
z.object({ refreshToken: z.string() }),
|
|
8233
|
+
z.object({
|
|
8234
|
+
accessToken: z.string(),
|
|
8235
|
+
refreshToken: z.string(),
|
|
8236
|
+
expiresIn: z.number()
|
|
8237
|
+
}).nullable(),
|
|
8238
|
+
{ kind: "mutation", access: "view" }
|
|
8239
|
+
),
|
|
8240
|
+
oauthVerifyAccessToken: method(
|
|
8241
|
+
z.object({ token: z.string() }),
|
|
8242
|
+
z.object({
|
|
8243
|
+
userId: z.string(),
|
|
8244
|
+
username: z.string(),
|
|
8245
|
+
scopes: z.array(TokenScopeSchema)
|
|
8246
|
+
}).nullable(),
|
|
8247
|
+
{ access: "view" }
|
|
8248
|
+
),
|
|
8249
|
+
// ── OAuth linked-session management (Phase D) ──────────────────
|
|
8250
|
+
//
|
|
8251
|
+
// The admin UI lists active account-linking sessions and revokes
|
|
8252
|
+
// them; revocation makes the linked integration's tokens fail
|
|
8253
|
+
// verification immediately.
|
|
8254
|
+
listOauthSessions: method(
|
|
8255
|
+
z.void(),
|
|
8256
|
+
z.array(OauthSessionSummarySchema),
|
|
8257
|
+
{ auth: "admin" }
|
|
8258
|
+
),
|
|
8259
|
+
revokeOauthSession: method(
|
|
8260
|
+
z.object({ id: z.string() }),
|
|
8261
|
+
z.object({ success: z.boolean() }),
|
|
8262
|
+
{ kind: "mutation", auth: "admin", access: "delete" }
|
|
7798
8263
|
)
|
|
7799
8264
|
}
|
|
7800
8265
|
};
|
|
@@ -8024,6 +8489,19 @@ const nodesCapability = {
|
|
|
8024
8489
|
z.record(z.string(), ClusterAddonStatusEntrySchema),
|
|
8025
8490
|
{ auth: "admin" }
|
|
8026
8491
|
),
|
|
8492
|
+
getCapUsageGraph: method(
|
|
8493
|
+
z.object({
|
|
8494
|
+
windowSeconds: z.number().int().positive().max(300).default(60)
|
|
8495
|
+
}),
|
|
8496
|
+
z.array(z.object({
|
|
8497
|
+
callerAddonId: z.string(),
|
|
8498
|
+
providerAddonId: z.string(),
|
|
8499
|
+
capName: z.string(),
|
|
8500
|
+
callsPerMin: z.number(),
|
|
8501
|
+
lastCallAtMs: z.number()
|
|
8502
|
+
})).readonly(),
|
|
8503
|
+
{ auth: "admin" }
|
|
8504
|
+
),
|
|
8027
8505
|
/**
|
|
8028
8506
|
* Direct per-node addon listing — calls `$agent.status` on the target
|
|
8029
8507
|
* node (or returns the hub registry for `nodeId === 'hub'`) and surfaces
|
|
@@ -8585,361 +9063,385 @@ const PIPELINE_OWNER_CAPABILITY_NAMES = [
|
|
|
8585
9063
|
"pipeline-runner"
|
|
8586
9064
|
];
|
|
8587
9065
|
export {
|
|
8588
|
-
|
|
8589
|
-
|
|
8590
|
-
|
|
8591
|
-
|
|
8592
|
-
|
|
8593
|
-
|
|
8594
|
-
|
|
8595
|
-
|
|
8596
|
-
|
|
8597
|
-
|
|
8598
|
-
|
|
8599
|
-
|
|
8600
|
-
|
|
8601
|
-
|
|
8602
|
-
|
|
8603
|
-
|
|
8604
|
-
|
|
8605
|
-
|
|
8606
|
-
|
|
8607
|
-
|
|
8608
|
-
|
|
8609
|
-
|
|
8610
|
-
|
|
8611
|
-
|
|
8612
|
-
|
|
8613
|
-
|
|
8614
|
-
|
|
8615
|
-
|
|
9066
|
+
nativeObjectDetectionCapability as $,
|
|
9067
|
+
addonWidgetsSourceCapability as A,
|
|
9068
|
+
addonsCapability as B,
|
|
9069
|
+
adminUiCapability as C,
|
|
9070
|
+
advancedNotifierCapability as D,
|
|
9071
|
+
alertsCapability as E,
|
|
9072
|
+
audioAnalysisCapability as F,
|
|
9073
|
+
audioAnalyzerCapability as G,
|
|
9074
|
+
audioCodecCapability as H,
|
|
9075
|
+
authProviderCapability as I,
|
|
9076
|
+
backupCapability as J,
|
|
9077
|
+
cameraCredentialsCapability as K,
|
|
9078
|
+
decoderCapability as L,
|
|
9079
|
+
detectionPipelineCapability as M,
|
|
9080
|
+
deviceExportCapability as N,
|
|
9081
|
+
deviceManagerCapability as O,
|
|
9082
|
+
deviceOpsCapability as P,
|
|
9083
|
+
deviceStateCapability as Q,
|
|
9084
|
+
embeddingEncoderCapability as R,
|
|
9085
|
+
eventsCapability as S,
|
|
9086
|
+
integrationsCapability as T,
|
|
9087
|
+
intercomCapability as U,
|
|
9088
|
+
localNetworkCapability as V,
|
|
9089
|
+
logDestinationCapability as W,
|
|
9090
|
+
meshNetworkCapability as X,
|
|
9091
|
+
metricsProviderCapability as Y,
|
|
9092
|
+
motionDetectionCapability as Z,
|
|
9093
|
+
mqttBrokerCapability as _,
|
|
8616
9094
|
zoneRulesCapability as a,
|
|
8617
|
-
|
|
8618
|
-
|
|
8619
|
-
|
|
8620
|
-
|
|
8621
|
-
|
|
8622
|
-
|
|
8623
|
-
|
|
8624
|
-
|
|
8625
|
-
|
|
8626
|
-
|
|
8627
|
-
|
|
8628
|
-
|
|
8629
|
-
|
|
8630
|
-
|
|
8631
|
-
|
|
8632
|
-
|
|
8633
|
-
|
|
8634
|
-
|
|
8635
|
-
|
|
8636
|
-
|
|
8637
|
-
|
|
8638
|
-
|
|
8639
|
-
|
|
8640
|
-
|
|
8641
|
-
|
|
8642
|
-
|
|
8643
|
-
|
|
8644
|
-
|
|
8645
|
-
|
|
8646
|
-
|
|
8647
|
-
|
|
8648
|
-
|
|
8649
|
-
|
|
8650
|
-
|
|
8651
|
-
|
|
8652
|
-
|
|
8653
|
-
|
|
8654
|
-
|
|
8655
|
-
|
|
8656
|
-
|
|
8657
|
-
|
|
8658
|
-
|
|
8659
|
-
|
|
8660
|
-
|
|
8661
|
-
|
|
8662
|
-
|
|
8663
|
-
|
|
8664
|
-
|
|
8665
|
-
|
|
8666
|
-
|
|
8667
|
-
|
|
8668
|
-
|
|
8669
|
-
|
|
8670
|
-
|
|
8671
|
-
|
|
8672
|
-
|
|
8673
|
-
|
|
8674
|
-
|
|
8675
|
-
|
|
8676
|
-
|
|
8677
|
-
|
|
8678
|
-
|
|
8679
|
-
|
|
8680
|
-
|
|
9095
|
+
AudioLevelSchema as a$,
|
|
9096
|
+
networkAccessCapability as a0,
|
|
9097
|
+
networkQualityCapability as a1,
|
|
9098
|
+
nodesCapability as a2,
|
|
9099
|
+
notificationOutputCapability as a3,
|
|
9100
|
+
oauthIntegrationCapability as a4,
|
|
9101
|
+
osdCapability as a5,
|
|
9102
|
+
pipelineAnalyticsCapability as a6,
|
|
9103
|
+
pipelineExecutorCapability as a7,
|
|
9104
|
+
pipelineOrchestratorCapability as a8,
|
|
9105
|
+
pipelineRunnerCapability as a9,
|
|
9106
|
+
AccessoriesStatusSchema as aA,
|
|
9107
|
+
AccessoryKind as aB,
|
|
9108
|
+
AddBrokerInputSchema as aC,
|
|
9109
|
+
AddonAutoUpdateSchema as aD,
|
|
9110
|
+
AddonListItemSchema as aE,
|
|
9111
|
+
AddonPageDeclarationSchema as aF,
|
|
9112
|
+
AddonPageInfoSchema as aG,
|
|
9113
|
+
AgentLoadSummarySchema as aH,
|
|
9114
|
+
AlertSchema as aI,
|
|
9115
|
+
AlertSeveritySchema as aJ,
|
|
9116
|
+
AlertSourceSchema as aK,
|
|
9117
|
+
AlertStatusSchema as aL,
|
|
9118
|
+
ApiKeyRecordSchema as aM,
|
|
9119
|
+
ApiKeySummarySchema as aN,
|
|
9120
|
+
ArchiveEntrySchema as aO,
|
|
9121
|
+
ArchiveManifestSchema as aP,
|
|
9122
|
+
AudioAnalysisResultSchema as aQ,
|
|
9123
|
+
AudioAnalysisSettingsSchema as aR,
|
|
9124
|
+
AudioChunkInputSchema as aS,
|
|
9125
|
+
AudioClassSummarySchema as aT,
|
|
9126
|
+
AudioClassificationLabelSchema as aU,
|
|
9127
|
+
AudioClassificationResultSchema as aV,
|
|
9128
|
+
AudioCodecInfoSchema as aW,
|
|
9129
|
+
AudioDecodeSessionConfigSchema as aX,
|
|
9130
|
+
AudioEncodeSessionConfigSchema as aY,
|
|
9131
|
+
AudioEncodedChunkSchema as aZ,
|
|
9132
|
+
AudioEventSchema as a_,
|
|
9133
|
+
platformProbeCapability as aa,
|
|
9134
|
+
ptzCapability as ab,
|
|
9135
|
+
rebootCapability as ac,
|
|
9136
|
+
recordingCapability as ad,
|
|
9137
|
+
recordingEngineCapability as ae,
|
|
9138
|
+
restreamerCapability as af,
|
|
9139
|
+
settingsStoreCapability as ag,
|
|
9140
|
+
smtpProviderCapability as ah,
|
|
9141
|
+
snapshotCapability as ai,
|
|
9142
|
+
snapshotProviderCapability as aj,
|
|
9143
|
+
ssoBridgeCapability as ak,
|
|
9144
|
+
storageCapability as al,
|
|
9145
|
+
storageProviderCapability as am,
|
|
9146
|
+
streamBrokerCapability as an,
|
|
9147
|
+
streamingEngineCapability as ao,
|
|
9148
|
+
systemCapability as ap,
|
|
9149
|
+
toastCapability as aq,
|
|
9150
|
+
turnProviderCapability as ar,
|
|
9151
|
+
userManagementCapability as as,
|
|
9152
|
+
userPasskeysCapability as at,
|
|
9153
|
+
webrtcCapability as au,
|
|
9154
|
+
webrtcSessionCapability as av,
|
|
9155
|
+
ACCESSORY_LABEL as aw,
|
|
9156
|
+
APPLE_SA_TO_MACRO as ax,
|
|
9157
|
+
AUDIO_BACKEND_CHOICES as ay,
|
|
9158
|
+
AUDIO_MACRO_LABELS as az,
|
|
8681
9159
|
zoneAnalyticsCapability as b,
|
|
8682
|
-
|
|
8683
|
-
|
|
8684
|
-
|
|
8685
|
-
|
|
8686
|
-
|
|
8687
|
-
|
|
8688
|
-
|
|
8689
|
-
|
|
8690
|
-
|
|
8691
|
-
|
|
8692
|
-
|
|
8693
|
-
|
|
8694
|
-
|
|
8695
|
-
|
|
8696
|
-
|
|
8697
|
-
|
|
8698
|
-
|
|
8699
|
-
|
|
8700
|
-
|
|
8701
|
-
|
|
8702
|
-
|
|
8703
|
-
|
|
8704
|
-
|
|
8705
|
-
|
|
8706
|
-
|
|
8707
|
-
|
|
8708
|
-
|
|
8709
|
-
|
|
8710
|
-
|
|
8711
|
-
|
|
8712
|
-
|
|
8713
|
-
|
|
8714
|
-
|
|
8715
|
-
|
|
8716
|
-
|
|
8717
|
-
|
|
8718
|
-
|
|
8719
|
-
|
|
8720
|
-
|
|
8721
|
-
|
|
8722
|
-
|
|
8723
|
-
|
|
8724
|
-
|
|
8725
|
-
|
|
8726
|
-
|
|
8727
|
-
|
|
8728
|
-
|
|
8729
|
-
|
|
8730
|
-
|
|
8731
|
-
|
|
8732
|
-
|
|
8733
|
-
|
|
8734
|
-
|
|
8735
|
-
|
|
8736
|
-
|
|
8737
|
-
|
|
8738
|
-
|
|
8739
|
-
|
|
8740
|
-
|
|
8741
|
-
|
|
8742
|
-
|
|
8743
|
-
|
|
8744
|
-
|
|
8745
|
-
|
|
8746
|
-
|
|
8747
|
-
|
|
8748
|
-
|
|
8749
|
-
|
|
8750
|
-
|
|
8751
|
-
|
|
8752
|
-
|
|
8753
|
-
|
|
8754
|
-
|
|
8755
|
-
|
|
8756
|
-
|
|
8757
|
-
|
|
8758
|
-
|
|
8759
|
-
|
|
8760
|
-
|
|
8761
|
-
|
|
8762
|
-
|
|
8763
|
-
|
|
8764
|
-
|
|
8765
|
-
|
|
8766
|
-
|
|
8767
|
-
|
|
8768
|
-
|
|
8769
|
-
|
|
8770
|
-
|
|
8771
|
-
|
|
8772
|
-
|
|
8773
|
-
|
|
8774
|
-
|
|
8775
|
-
|
|
8776
|
-
|
|
8777
|
-
|
|
8778
|
-
|
|
8779
|
-
|
|
8780
|
-
|
|
8781
|
-
|
|
8782
|
-
|
|
8783
|
-
|
|
8784
|
-
|
|
8785
|
-
|
|
8786
|
-
|
|
8787
|
-
|
|
8788
|
-
|
|
8789
|
-
|
|
8790
|
-
|
|
8791
|
-
|
|
8792
|
-
|
|
8793
|
-
|
|
8794
|
-
|
|
8795
|
-
|
|
8796
|
-
|
|
8797
|
-
|
|
8798
|
-
|
|
8799
|
-
|
|
8800
|
-
|
|
8801
|
-
|
|
8802
|
-
|
|
8803
|
-
|
|
8804
|
-
|
|
8805
|
-
|
|
8806
|
-
|
|
8807
|
-
|
|
8808
|
-
|
|
8809
|
-
|
|
8810
|
-
|
|
8811
|
-
|
|
8812
|
-
|
|
8813
|
-
|
|
8814
|
-
|
|
8815
|
-
|
|
8816
|
-
|
|
8817
|
-
|
|
8818
|
-
|
|
8819
|
-
|
|
8820
|
-
|
|
8821
|
-
|
|
8822
|
-
|
|
8823
|
-
|
|
8824
|
-
|
|
8825
|
-
|
|
8826
|
-
|
|
8827
|
-
|
|
8828
|
-
|
|
8829
|
-
|
|
8830
|
-
|
|
8831
|
-
|
|
8832
|
-
|
|
8833
|
-
|
|
8834
|
-
|
|
8835
|
-
|
|
8836
|
-
|
|
8837
|
-
|
|
8838
|
-
|
|
8839
|
-
|
|
8840
|
-
|
|
8841
|
-
|
|
8842
|
-
|
|
8843
|
-
|
|
8844
|
-
|
|
8845
|
-
|
|
8846
|
-
|
|
8847
|
-
|
|
8848
|
-
|
|
8849
|
-
|
|
8850
|
-
|
|
8851
|
-
|
|
8852
|
-
|
|
8853
|
-
|
|
8854
|
-
|
|
8855
|
-
|
|
8856
|
-
|
|
8857
|
-
|
|
8858
|
-
|
|
8859
|
-
|
|
8860
|
-
|
|
8861
|
-
|
|
8862
|
-
|
|
8863
|
-
|
|
8864
|
-
|
|
8865
|
-
|
|
8866
|
-
|
|
8867
|
-
|
|
8868
|
-
|
|
8869
|
-
|
|
8870
|
-
|
|
8871
|
-
|
|
8872
|
-
|
|
8873
|
-
|
|
8874
|
-
|
|
9160
|
+
UnexposeInputSchema as b$,
|
|
9161
|
+
AudioMetricsHistoryPointSchema as b0,
|
|
9162
|
+
AudioMetricsHistorySchema as b1,
|
|
9163
|
+
AudioMetricsSnapshotSchema as b2,
|
|
9164
|
+
AudioPcmChunkSchema as b3,
|
|
9165
|
+
AuthResultSchema as b4,
|
|
9166
|
+
AutoUpdateSettingsSchema as b5,
|
|
9167
|
+
AvailableIntegrationTypeSchema as b6,
|
|
9168
|
+
BATTERY_DEVICE_PROFILE as b7,
|
|
9169
|
+
BackupDestinationInfoSchema as b8,
|
|
9170
|
+
BackupEntrySchema as b9,
|
|
9171
|
+
CollectionColumnSchema as bA,
|
|
9172
|
+
CollectionIndexSchema as bB,
|
|
9173
|
+
ConfigEntrySchema$1 as bC,
|
|
9174
|
+
ConfigSectionWithValuesSchema as bD,
|
|
9175
|
+
ConfigTabDeclarationSchema as bE,
|
|
9176
|
+
CreateApiKeyInputSchema as bF,
|
|
9177
|
+
CreateApiKeyResultSchema as bG,
|
|
9178
|
+
CreateIntegrationInputSchema as bH,
|
|
9179
|
+
CreateScopedTokenInputSchema as bI,
|
|
9180
|
+
CreateScopedTokenResultSchema as bJ,
|
|
9181
|
+
CreateUserInputSchema as bK,
|
|
9182
|
+
CustomActionInputSchema as bL,
|
|
9183
|
+
DEFAULT_AUDIO_ANALYZER_CONFIG as bM,
|
|
9184
|
+
DEFAULT_DECODER_HWACCEL_CONFIG as bN,
|
|
9185
|
+
DEVICE_PROFILES as bO,
|
|
9186
|
+
DEVICE_SETTINGS_CONTRIBUTION_METHODS as bP,
|
|
9187
|
+
DEVICE_STATUS_METHOD as bQ,
|
|
9188
|
+
DecodedAudioChunkSchema as bR,
|
|
9189
|
+
DecodedFrameSchema as bS,
|
|
9190
|
+
DecoderAssignmentSchema as bT,
|
|
9191
|
+
DecoderSessionConfigSchema as bU,
|
|
9192
|
+
DecoderStatsSchema as bV,
|
|
9193
|
+
DeleteIntegrationResultSchema as bW,
|
|
9194
|
+
DetectorOutputSchema as bX,
|
|
9195
|
+
DeviceDiscoveryStatusSchema as bY,
|
|
9196
|
+
ExposeInputSchema as bZ,
|
|
9197
|
+
DeviceExportStatusSchema as b_,
|
|
9198
|
+
BatteryStatusSchema as ba,
|
|
9199
|
+
BoundingBoxSchema as bb,
|
|
9200
|
+
BrightnessStatusSchema as bc,
|
|
9201
|
+
BrokerAudioClientSchema as bd,
|
|
9202
|
+
BrokerClientsSchema as be,
|
|
9203
|
+
BrokerConnectionDetailsSchema as bf,
|
|
9204
|
+
BrokerDecodedClientSchema as bg,
|
|
9205
|
+
BrokerInfoSchema as bh,
|
|
9206
|
+
BrokerRtspClientSchema as bi,
|
|
9207
|
+
BrokerStatsSchema as bj,
|
|
9208
|
+
BrokerStatusSchema$1 as bk,
|
|
9209
|
+
CAM_PROFILE_ORDER as bl,
|
|
9210
|
+
CamProfileSchema as bm,
|
|
9211
|
+
CamStreamKindSchema as bn,
|
|
9212
|
+
CamStreamResolutionSchema as bo,
|
|
9213
|
+
CameraCredentialsSchema as bp,
|
|
9214
|
+
CameraCredentialsStatusSchema as bq,
|
|
9215
|
+
CameraMetricsSchema as br,
|
|
9216
|
+
CameraMetricsWithDeviceIdSchema as bs,
|
|
9217
|
+
CameraStreamSchema as bt,
|
|
9218
|
+
CapScopeSchema as bu,
|
|
9219
|
+
CapabilityBindingsSchema as bv,
|
|
9220
|
+
ChargingStatus as bw,
|
|
9221
|
+
ClientNetworkStatsSchema as bx,
|
|
9222
|
+
ClusterAddonNodeDeploymentSchema as by,
|
|
9223
|
+
ClusterAddonStatusEntrySchema as bz,
|
|
9224
|
+
streamParamsCapability as c,
|
|
9225
|
+
NetworkAddressSchema as c$,
|
|
9226
|
+
DeviceFeature as c0,
|
|
9227
|
+
DeviceInfoSchema as c1,
|
|
9228
|
+
DeviceNetworkStatsSchema as c2,
|
|
9229
|
+
DeviceRole as c3,
|
|
9230
|
+
DeviceStatusSchema as c4,
|
|
9231
|
+
DeviceType as c5,
|
|
9232
|
+
DiscoveredChildDeviceSchema as c6,
|
|
9233
|
+
DiscoveredChildStatusSchema as c7,
|
|
9234
|
+
DiscoveredDeviceSchema as c8,
|
|
9235
|
+
DoorbellPressEventSchema as c9,
|
|
9236
|
+
IntercomStatusSchema as cA,
|
|
9237
|
+
LocationStatSchema as cB,
|
|
9238
|
+
LogEntrySchema as cC,
|
|
9239
|
+
LogLevelSchema$1 as cD,
|
|
9240
|
+
LogStreamEntrySchema as cE,
|
|
9241
|
+
MODEL_FORMATS as cF,
|
|
9242
|
+
MediaFileSchema as cG,
|
|
9243
|
+
MeshPeerSchema as cH,
|
|
9244
|
+
MeshStatusSchema as cI,
|
|
9245
|
+
MethodAccessSchema as cJ,
|
|
9246
|
+
MotionAnalysisResultSchema as cK,
|
|
9247
|
+
MotionEventSchema as cL,
|
|
9248
|
+
MotionOnMotionChangedDataSchema as cM,
|
|
9249
|
+
MotionRegionSchema as cN,
|
|
9250
|
+
MotionSourceEnum as cO,
|
|
9251
|
+
MotionSourcesSchema as cP,
|
|
9252
|
+
MotionStatusSchema as cQ,
|
|
9253
|
+
MotionTriggerRuntimeStateSchema as cR,
|
|
9254
|
+
MotionTriggerStatusSchema as cS,
|
|
9255
|
+
MotionZoneOptionsSchema as cT,
|
|
9256
|
+
MotionZonePatchSchema as cU,
|
|
9257
|
+
MotionZoneStatusSchema as cV,
|
|
9258
|
+
StatusSchema as cW,
|
|
9259
|
+
NativeDetectionSchema as cX,
|
|
9260
|
+
NativeObjectClassEnum as cY,
|
|
9261
|
+
NativeObjectDetectionStatusSchema as cZ,
|
|
9262
|
+
NetworkAccessStatusSchema as c_,
|
|
9263
|
+
DoorbellStatusSchema as ca,
|
|
9264
|
+
EmbeddingInfoSchema as cb,
|
|
9265
|
+
EmbeddingResultSchema as cc,
|
|
9266
|
+
EncodedPacketSchema as cd,
|
|
9267
|
+
EnrichedWidgetMetadataSchema as ce,
|
|
9268
|
+
EventItemSchema as cf,
|
|
9269
|
+
EventKindSchema as cg,
|
|
9270
|
+
ExportSetupFieldSchema as ch,
|
|
9271
|
+
ExportSetupSchema as ci,
|
|
9272
|
+
ExposedDeviceSchema as cj,
|
|
9273
|
+
ExposedResourceSchema as ck,
|
|
9274
|
+
FeatureManifestSchema as cl,
|
|
9275
|
+
FeatureProbeStatusSchema as cm,
|
|
9276
|
+
FrameHandleFormatSchema as cn,
|
|
9277
|
+
FrameHandleSchema as co,
|
|
9278
|
+
FrameInputSchema as cp,
|
|
9279
|
+
GetStreamWithCodecInputSchema as cq,
|
|
9280
|
+
GlobalMetricsSchema as cr,
|
|
9281
|
+
HWACCEL_OPTIONS as cs,
|
|
9282
|
+
HealthStatusSchema as ct,
|
|
9283
|
+
HistoryPointSchema as cu,
|
|
9284
|
+
HistoryResolutionEnum as cv,
|
|
9285
|
+
InstalledPackageSchema as cw,
|
|
9286
|
+
IntegrationLiteSchema as cx,
|
|
9287
|
+
IntegrationWithStateSchema as cy,
|
|
9288
|
+
IntercomAbilitySchema as cz,
|
|
9289
|
+
motionTriggerCapability as d,
|
|
9290
|
+
StartEmbeddedInputSchema as d$,
|
|
9291
|
+
NetworkEndpointSchema as d0,
|
|
9292
|
+
NotificationHistoryEntrySchema as d1,
|
|
9293
|
+
NotificationRuleSchema as d2,
|
|
9294
|
+
NotificationSchema as d3,
|
|
9295
|
+
OauthIntegrationDescriptorSchema as d4,
|
|
9296
|
+
ObjectEventSchema as d5,
|
|
9297
|
+
OrchestratorMetricsSchema as d6,
|
|
9298
|
+
OsdOverlayKindEnum as d7,
|
|
9299
|
+
OsdOverlayPatchSchema as d8,
|
|
9300
|
+
OsdOverlaySchema as d9,
|
|
9301
|
+
PtzPresetSchema as dA,
|
|
9302
|
+
PtzStatusSchema as dB,
|
|
9303
|
+
QueryFilterSchema as dC,
|
|
9304
|
+
RegisteredStreamSchema as dD,
|
|
9305
|
+
ReportMotionInputSchema as dE,
|
|
9306
|
+
RtpSourceSchema as dF,
|
|
9307
|
+
RtspRestreamEntrySchema as dG,
|
|
9308
|
+
RunnerCameraConfigSchema as dH,
|
|
9309
|
+
RunnerCameraDeviceUIFields as dI,
|
|
9310
|
+
RunnerLocalLoadSchema as dJ,
|
|
9311
|
+
RunnerLocalMetricsSchema as dK,
|
|
9312
|
+
STORAGE_LOCATION_CARDINALITY as dL,
|
|
9313
|
+
ScopedTokenSchema as dM,
|
|
9314
|
+
ScopedTokenSummarySchema as dN,
|
|
9315
|
+
SearchResultSchema as dO,
|
|
9316
|
+
SegmentSchema as dP,
|
|
9317
|
+
SendEmailInputSchema as dQ,
|
|
9318
|
+
SendEmailResultSchema as dR,
|
|
9319
|
+
SettingsPatchSchema as dS,
|
|
9320
|
+
SettingsRecordSchema as dT,
|
|
9321
|
+
SettingsSchemaWithValuesSchema as dU,
|
|
9322
|
+
SettingsUpdateResultSchema as dV,
|
|
9323
|
+
ShmRingStatsSchema as dW,
|
|
9324
|
+
SmtpStatusSchema as dX,
|
|
9325
|
+
SnapshotImageSchema as dY,
|
|
9326
|
+
SpatialDetectionSchema as dZ,
|
|
9327
|
+
SsoBridgeClaimsSchema as d_,
|
|
9328
|
+
OsdPositionEnum as da,
|
|
9329
|
+
OsdStatusSchema as db,
|
|
9330
|
+
PIPELINE_FLOW_CAPABILITY_NAMES as dc,
|
|
9331
|
+
PIPELINE_OWNER_CAPABILITY_NAMES as dd,
|
|
9332
|
+
PackageUpdateSchema as de,
|
|
9333
|
+
PackageVersionInfoSchema as df,
|
|
9334
|
+
PasskeySummarySchema as dg,
|
|
9335
|
+
PcmSampleFormatSchema as dh,
|
|
9336
|
+
PerScopeBreakdownSchema as di,
|
|
9337
|
+
PipelineAssignmentSchema as dj,
|
|
9338
|
+
PipelineDefaultStepSchema as dk,
|
|
9339
|
+
PipelineEngineChoiceSchema as dl,
|
|
9340
|
+
PipelineRunResultBridge as dm,
|
|
9341
|
+
PipelineStepInputSchema as dn,
|
|
9342
|
+
PlaceholderReasonSchema as dp,
|
|
9343
|
+
PolygonPointSchema as dq,
|
|
9344
|
+
ProfileSlotSchema as dr,
|
|
9345
|
+
ProfileSlotStatusSchema as ds,
|
|
9346
|
+
ProviderStatusSchema as dt,
|
|
9347
|
+
PtzAutotrackRuntimeStateSchema as du,
|
|
9348
|
+
PtzAutotrackSettingsSchema as dv,
|
|
9349
|
+
PtzAutotrackStatusSchema as dw,
|
|
9350
|
+
PtzAutotrackTargetOptionSchema as dx,
|
|
9351
|
+
PtzMoveCommandSchema as dy,
|
|
9352
|
+
PtzPositionSchema as dz,
|
|
8875
9353
|
errMsg as e,
|
|
8876
|
-
|
|
8877
|
-
|
|
8878
|
-
|
|
8879
|
-
|
|
8880
|
-
|
|
8881
|
-
|
|
8882
|
-
|
|
8883
|
-
|
|
8884
|
-
|
|
8885
|
-
|
|
8886
|
-
|
|
8887
|
-
|
|
8888
|
-
|
|
8889
|
-
|
|
8890
|
-
|
|
8891
|
-
|
|
8892
|
-
|
|
8893
|
-
|
|
8894
|
-
|
|
8895
|
-
|
|
8896
|
-
|
|
8897
|
-
|
|
8898
|
-
|
|
8899
|
-
|
|
8900
|
-
|
|
8901
|
-
|
|
8902
|
-
|
|
8903
|
-
|
|
8904
|
-
|
|
8905
|
-
|
|
8906
|
-
|
|
8907
|
-
|
|
8908
|
-
|
|
8909
|
-
|
|
8910
|
-
|
|
8911
|
-
|
|
8912
|
-
|
|
8913
|
-
|
|
8914
|
-
|
|
8915
|
-
|
|
8916
|
-
|
|
8917
|
-
|
|
8918
|
-
|
|
8919
|
-
|
|
8920
|
-
|
|
8921
|
-
|
|
8922
|
-
|
|
8923
|
-
|
|
8924
|
-
|
|
9354
|
+
event as e$,
|
|
9355
|
+
AbortUploadInputSchema as e0,
|
|
9356
|
+
BeginDownloadInputSchema as e1,
|
|
9357
|
+
BeginDownloadResultSchema as e2,
|
|
9358
|
+
BeginUploadInputSchema as e3,
|
|
9359
|
+
BeginUploadResultSchema as e4,
|
|
9360
|
+
EndDownloadInputSchema as e5,
|
|
9361
|
+
FinalizeUploadInputSchema as e6,
|
|
9362
|
+
StorageLocationRefSchema as e7,
|
|
9363
|
+
StorageLocationSchema as e8,
|
|
9364
|
+
StorageLocationTypeSchema as e9,
|
|
9365
|
+
TopologyServiceSchema as eA,
|
|
9366
|
+
TrackSchema as eB,
|
|
9367
|
+
TrackStateSchema as eC,
|
|
9368
|
+
TrackedDetectionSchema as eD,
|
|
9369
|
+
TurnServerSchema as eE,
|
|
9370
|
+
UpdateIntegrationInputSchema as eF,
|
|
9371
|
+
UpdateUserInputSchema as eG,
|
|
9372
|
+
UserRecordSchema as eH,
|
|
9373
|
+
UserSummarySchema as eI,
|
|
9374
|
+
WELL_KNOWN_TABS as eJ,
|
|
9375
|
+
WELL_KNOWN_TAB_MAP as eK,
|
|
9376
|
+
WebrtcStreamChoiceSchema as eL,
|
|
9377
|
+
WebrtcStreamTargetSchema as eM,
|
|
9378
|
+
WidgetHostEnum as eN,
|
|
9379
|
+
WidgetMetadataSchema as eO,
|
|
9380
|
+
WidgetRemoteSchema as eP,
|
|
9381
|
+
WidgetSizeEnum as eQ,
|
|
9382
|
+
YAMNET_TO_MACRO as eR,
|
|
9383
|
+
ZoneKindEnum as eS,
|
|
9384
|
+
ZoneRuleModeEnum as eT,
|
|
9385
|
+
ZoneRuleSchema as eU,
|
|
9386
|
+
ZoneRuleStageEnum as eV,
|
|
9387
|
+
ZoneRulesArraySchema as eW,
|
|
9388
|
+
ZoneSchema as eX,
|
|
9389
|
+
ZoneScopeBreakdownSchema as eY,
|
|
9390
|
+
accessoryStableId as eZ,
|
|
9391
|
+
deviceMatchesProfile as e_,
|
|
9392
|
+
ProviderInfoSchema as ea,
|
|
9393
|
+
ReadChunkInputSchema as eb,
|
|
9394
|
+
TestLocationResultSchema as ec,
|
|
9395
|
+
WriteChunkInputSchema as ed,
|
|
9396
|
+
StreamFormatSchema as ee,
|
|
9397
|
+
StreamInfoSchema as ef,
|
|
9398
|
+
StreamNetworkStatsSchema as eg,
|
|
9399
|
+
StreamParamsOptionsSchema as eh,
|
|
9400
|
+
StreamParamsStatusSchema as ei,
|
|
9401
|
+
StreamProfileConfigSchema as ej,
|
|
9402
|
+
StreamProfileOptionsSchema as ek,
|
|
9403
|
+
StreamProfilePatchSchema as el,
|
|
9404
|
+
StreamProfileSchema as em,
|
|
9405
|
+
StreamSourceEntrySchema$1 as en,
|
|
9406
|
+
StreamSourceSchema as eo,
|
|
9407
|
+
SubscribeAudioChunksInputSchema as ep,
|
|
9408
|
+
SubscribeAudioChunksResultSchema as eq,
|
|
9409
|
+
SubscribeFramesInputSchema as er,
|
|
9410
|
+
SubscribeFramesResultSchema as es,
|
|
9411
|
+
SwitchStatusSchema as et,
|
|
9412
|
+
SystemMetricsSchema as eu,
|
|
9413
|
+
TestConnectionResultSchema as ev,
|
|
9414
|
+
ToastSchema as ew,
|
|
9415
|
+
TokenScopeSchema as ex,
|
|
9416
|
+
TopologyNodeSchema as ey,
|
|
9417
|
+
TopologyProcessSchema as ez,
|
|
9418
|
+
motionCapability as f,
|
|
9419
|
+
expandCapMethods as f0,
|
|
9420
|
+
getAudioMacroClassIds as f1,
|
|
9421
|
+
isDeviceConfigCap as f2,
|
|
9422
|
+
mapAudioLabelToMacro as f3,
|
|
9423
|
+
method as f4,
|
|
9424
|
+
resolveDeviceProfile as f5,
|
|
9425
|
+
webrtcClientHintsSchema as f6,
|
|
9426
|
+
featureProbeCapability as g,
|
|
8925
9427
|
hydrateSchema as h,
|
|
8926
|
-
|
|
8927
|
-
|
|
8928
|
-
|
|
8929
|
-
|
|
8930
|
-
|
|
8931
|
-
|
|
8932
|
-
|
|
9428
|
+
doorbellCapability as i,
|
|
9429
|
+
deviceStatusCapability as j,
|
|
9430
|
+
deviceDiscoveryCapability as k,
|
|
9431
|
+
cameraStreamsCapability as l,
|
|
9432
|
+
motionZonesCapability as m,
|
|
9433
|
+
brightnessCapability as n,
|
|
9434
|
+
batteryCapability as o,
|
|
8933
9435
|
ptzAutotrackCapability as p,
|
|
8934
|
-
|
|
8935
|
-
|
|
9436
|
+
audioMetricsCapability as q,
|
|
9437
|
+
deviceProviderCapability as r,
|
|
8936
9438
|
switchCapability as s,
|
|
8937
|
-
|
|
8938
|
-
|
|
8939
|
-
|
|
8940
|
-
|
|
8941
|
-
|
|
8942
|
-
|
|
9439
|
+
accessoriesCapability as t,
|
|
9440
|
+
addonPagesCapability as u,
|
|
9441
|
+
addonPagesSourceCapability as v,
|
|
9442
|
+
addonRoutesCapability as w,
|
|
9443
|
+
addonSettingsCapability as x,
|
|
9444
|
+
addonWidgetsCapability as y,
|
|
8943
9445
|
zonesCapability as z
|
|
8944
9446
|
};
|
|
8945
|
-
//# sourceMappingURL=index-
|
|
9447
|
+
//# sourceMappingURL=index-CgPd35k5.mjs.map
|