@camstack/addon-tailscale-ingress 0.1.5 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4617,7 +4617,7 @@ function _instanceof(cls, params = {}) {
4617
4617
  return inst;
4618
4618
  }
4619
4619
  //#endregion
4620
- //#region ../types/dist/index-CWhQOnm9.mjs
4620
+ //#region ../types/dist/index-CgPd35k5.mjs
4621
4621
  var MODEL_FORMATS = [
4622
4622
  "onnx",
4623
4623
  "coreml",
@@ -4692,6 +4692,12 @@ Object.fromEntries([
4692
4692
  icon: "video",
4693
4693
  order: 35
4694
4694
  },
4695
+ {
4696
+ id: "ptz",
4697
+ label: "PTZ",
4698
+ icon: "move",
4699
+ order: 40
4700
+ },
4695
4701
  {
4696
4702
  id: "pipeline",
4697
4703
  label: "Detection Pipeline",
@@ -4805,6 +4811,10 @@ function hydrateField(field, values) {
4805
4811
  };
4806
4812
  }
4807
4813
  const rawValue = storedValue !== void 0 ? storedValue : defaultValue !== void 0 ? defaultValue : null;
4814
+ if (field.type === "password") return {
4815
+ ...field,
4816
+ value: ""
4817
+ };
4808
4818
  const value = field.type === "textarea" && field.isJson && rawValue !== null && typeof rawValue === "object" ? JSON.stringify(rawValue, null, 2) : rawValue;
4809
4819
  return {
4810
4820
  ...field,
@@ -4883,7 +4893,19 @@ var DecoderSessionConfigSchema = object({
4883
4893
  * on every line so `grep tag=broker:5/high` filters one camera
4884
4894
  * profile cleanly.
4885
4895
  */
4886
- tag: string().optional()
4896
+ tag: string().optional(),
4897
+ /**
4898
+ * Where the session delivers decoded frames (Phase 5 / D9):
4899
+ *
4900
+ * - `'callback'` (default) — the legacy pixel path: decoded frames are
4901
+ * buffered as `DecodedFrame`s and drained via `pullFrames`.
4902
+ * - `'shm'` — the shared-memory frame plane: decoded frames are written
4903
+ * into an OS shared-memory ring and drained as zero-pixel
4904
+ * `FrameHandle`s via `pullHandles`. A session is one mode or the
4905
+ * other — `pullFrames` returns nothing for an `'shm'` session and
4906
+ * `pullHandles` returns nothing for a `'callback'` session.
4907
+ */
4908
+ frameSink: _enum(["callback", "shm"]).default("callback")
4887
4909
  });
4888
4910
  var YAMNET_TO_MACRO = {
4889
4911
  mapping: {
@@ -5536,6 +5558,63 @@ var DecodedFrameSchema = object({
5536
5558
  ]),
5537
5559
  timestamp: number()
5538
5560
  });
5561
+ var FrameHandleSchema = object({
5562
+ shmId: string(),
5563
+ slot: number().int().nonnegative(),
5564
+ seq: number().int().nonnegative(),
5565
+ width: number().int().positive(),
5566
+ height: number().int().positive(),
5567
+ format: _enum([
5568
+ "jpeg",
5569
+ "rgb",
5570
+ "bgr",
5571
+ "yuv420",
5572
+ "gray"
5573
+ ]),
5574
+ pts: number(),
5575
+ byteLength: number().int().nonnegative(),
5576
+ nodeId: string(),
5577
+ slotCount: number().int().positive()
5578
+ });
5579
+ var FrameHandleFormatSchema = _enum([
5580
+ "rgb",
5581
+ "bgr",
5582
+ "yuv420",
5583
+ "gray"
5584
+ ]);
5585
+ var SubscribeFramesInputSchema = object({
5586
+ brokerId: string(),
5587
+ format: FrameHandleFormatSchema,
5588
+ /**
5589
+ * Optional reader-side cadence hint in frames per second. The broker does
5590
+ * NOT throttle — latest-wins ring reads drop frames implicitly for a slow
5591
+ * consumer. The value is echoed back in `SubscribeFramesResult.maxFps` so
5592
+ * the consumer can pace its own `pullFrameHandles` polling.
5593
+ */
5594
+ maxFps: number().positive().optional(),
5595
+ /** Short caller-identity tag (`motion`, `detection`, …) for diagnostics. */
5596
+ tag: string().optional()
5597
+ });
5598
+ var SubscribeFramesResultSchema = object({
5599
+ /** Opaque id the consumer passes to `pullFrameHandles` / `unsubscribeFrames`. */
5600
+ subscriptionId: string(),
5601
+ /** Reader-side cadence hint (frames/s) — echoes `SubscribeFramesInput.maxFps`. */
5602
+ maxFps: number().nonnegative()
5603
+ });
5604
+ var DecodedAudioChunkSchema = object({
5605
+ data: _instanceof(Uint8Array),
5606
+ sampleRate: number().int().positive(),
5607
+ channels: number().int().positive(),
5608
+ timestamp: number()
5609
+ });
5610
+ var SubscribeAudioChunksInputSchema = object({
5611
+ brokerId: string(),
5612
+ /** Short caller-identity tag (`audio-analyzer`, …) for `listClients`. */
5613
+ tag: string().optional()
5614
+ });
5615
+ var SubscribeAudioChunksResultSchema = object({
5616
+ /** Opaque id passed to `pullAudioChunks` / `unsubscribeAudioChunks`. */
5617
+ subscriptionId: string() });
5539
5618
  var BrokerStatsSchema = object({
5540
5619
  status: _enum([
5541
5620
  "idle",
@@ -5737,7 +5816,13 @@ method(object({
5737
5816
  }), {
5738
5817
  kind: "mutation",
5739
5818
  auth: "admin"
5740
- }), method(object({ brokerId: string() }), custom()), method(object({
5819
+ }), method(SubscribeAudioChunksInputSchema, SubscribeAudioChunksResultSchema, { kind: "mutation" }), method(object({
5820
+ subscriptionId: string(),
5821
+ maxCount: number().int().positive().default(8)
5822
+ }), array(DecodedAudioChunkSchema).readonly()), method(object({ subscriptionId: string() }), object({ released: boolean() }), { kind: "mutation" }), method(SubscribeFramesInputSchema, SubscribeFramesResultSchema, { kind: "mutation" }), method(object({
5823
+ subscriptionId: string(),
5824
+ maxCount: number().int().positive().default(4)
5825
+ }), array(FrameHandleSchema).readonly()), method(object({ subscriptionId: string() }), object({ released: boolean() }), { kind: "mutation" }), method(object({
5741
5826
  brokerId: string(),
5742
5827
  seconds: number().min(0).max(30)
5743
5828
  }), _void(), {
@@ -6429,6 +6514,34 @@ DeviceType.Light, DeviceType.Siren, DeviceType.Switch, method(object({
6429
6514
  enabled: boolean(),
6430
6515
  lastChangedAt: number()
6431
6516
  });
6517
+ object({
6518
+ enabled: boolean(),
6519
+ sensitivity: number(),
6520
+ /** Row-major active-cell grid. Length = gridWidth*gridHeight (see getOptions). */
6521
+ cells: array(boolean()),
6522
+ lastFetchedAt: number()
6523
+ });
6524
+ var MotionZoneOptionsSchema = object({
6525
+ gridWidth: number(),
6526
+ gridHeight: number(),
6527
+ sensitivity: object({
6528
+ min: number(),
6529
+ max: number(),
6530
+ step: number()
6531
+ })
6532
+ });
6533
+ var MotionZonePatchSchema = object({
6534
+ enabled: boolean().optional(),
6535
+ sensitivity: number().optional(),
6536
+ cells: array(boolean()).optional()
6537
+ });
6538
+ DeviceType.Camera, method(object({ deviceId: number() }), MotionZoneOptionsSchema), method(object({
6539
+ deviceId: number(),
6540
+ patch: MotionZonePatchSchema
6541
+ }), _void(), {
6542
+ kind: "mutation",
6543
+ auth: "admin"
6544
+ });
6432
6545
  var PtzAutotrackSettingsSchema = object({
6433
6546
  targetType: string().describe("Vendor target string (people/vehicle/pet); empty = camera default"),
6434
6547
  stopDelaySeconds: number().int().min(0).max(300),
@@ -6470,6 +6583,85 @@ DeviceType.Camera, method(object({ deviceId: number() }), PtzAutotrackStatusSche
6470
6583
  deviceId: number(),
6471
6584
  status: PtzAutotrackStatusSchema
6472
6585
  });
6586
+ var StreamProfileSchema = _enum([
6587
+ "main",
6588
+ "sub",
6589
+ "ext"
6590
+ ]);
6591
+ var StreamProfileConfigSchema = object({
6592
+ width: number(),
6593
+ height: number(),
6594
+ codec: _enum(["h264", "h265"]),
6595
+ framerate: number(),
6596
+ bitrate: number(),
6597
+ bitrateMode: _enum(["vbr", "cbr"]).optional(),
6598
+ encoderProfile: _enum([
6599
+ "high",
6600
+ "main",
6601
+ "baseline"
6602
+ ]).optional(),
6603
+ gop: number().optional(),
6604
+ audio: boolean().optional()
6605
+ });
6606
+ object({
6607
+ /** Per-profile current config. A profile absent = the camera doesn't have it. */
6608
+ main: StreamProfileConfigSchema.optional(),
6609
+ sub: StreamProfileConfigSchema.optional(),
6610
+ ext: StreamProfileConfigSchema.optional(),
6611
+ lastFetchedAt: number()
6612
+ });
6613
+ var StreamProfileOptionsSchema = object({
6614
+ resolutions: array(object({
6615
+ width: number(),
6616
+ height: number()
6617
+ })),
6618
+ codecs: array(_enum(["h264", "h265"])),
6619
+ framerates: array(number()),
6620
+ /** Allowed bitrate values (kbps). Empty if the camera takes a free range. */
6621
+ bitrates: array(number()),
6622
+ /** Optional [min,max] kbps when the camera accepts a continuous range. */
6623
+ bitrateRange: tuple([number(), number()]).optional(),
6624
+ supportsBitrateMode: boolean(),
6625
+ supportsEncoderProfile: boolean(),
6626
+ supportsGop: boolean(),
6627
+ /** Allowed GOP / keyframe-interval range, in seconds — drives the
6628
+ * I-frame-interval selector. Absent when the camera advertises GOP
6629
+ * support but no concrete range (callers then fall back to a free
6630
+ * numeric input). `{ min, max, step }` per the getOptions convention. */
6631
+ gop: object({
6632
+ min: number(),
6633
+ max: number(),
6634
+ step: number()
6635
+ }).optional()
6636
+ });
6637
+ var StreamParamsOptionsSchema = object({
6638
+ main: StreamProfileOptionsSchema.optional(),
6639
+ sub: StreamProfileOptionsSchema.optional(),
6640
+ ext: StreamProfileOptionsSchema.optional()
6641
+ });
6642
+ var StreamProfilePatchSchema = object({
6643
+ width: number().optional(),
6644
+ height: number().optional(),
6645
+ codec: _enum(["h264", "h265"]).optional(),
6646
+ framerate: number().optional(),
6647
+ bitrate: number().optional(),
6648
+ bitrateMode: _enum(["vbr", "cbr"]).optional(),
6649
+ encoderProfile: _enum([
6650
+ "high",
6651
+ "main",
6652
+ "baseline"
6653
+ ]).optional(),
6654
+ gop: number().optional(),
6655
+ audio: boolean().optional()
6656
+ });
6657
+ DeviceType.Camera, method(object({ deviceId: number() }), StreamParamsOptionsSchema), method(object({
6658
+ deviceId: number(),
6659
+ profile: StreamProfileSchema,
6660
+ patch: StreamProfilePatchSchema
6661
+ }), _void(), {
6662
+ kind: "mutation",
6663
+ auth: "admin"
6664
+ }), method(object({ deviceId: number() }), unknown().nullable());
6473
6665
  object({
6474
6666
  on: boolean(),
6475
6667
  /** Ms epoch of the last state change. Useful for UI "X minutes ago". */
@@ -7109,6 +7301,85 @@ method(LogEntrySchema, _void(), { kind: "mutation" }), method(object({
7109
7301
  var StaticDirOutputSchema = object({ staticDir: string() });
7110
7302
  var VersionOutputSchema = object({ version: string() });
7111
7303
  method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
7304
+ var MethodAccessSchema = _enum([
7305
+ "view",
7306
+ "create",
7307
+ "delete"
7308
+ ]);
7309
+ var AllowedProviderSchema = union([literal("*"), array(string())]);
7310
+ var AllowedDevicesSchema = record(string(), union([literal("*"), array(string())]));
7311
+ var CapScopeSchema = _enum(["device", "system"]);
7312
+ var TokenScopeSchema = discriminatedUnion("type", [
7313
+ object({
7314
+ type: literal("category"),
7315
+ target: CapScopeSchema,
7316
+ access: array(MethodAccessSchema).min(1)
7317
+ }),
7318
+ object({
7319
+ type: literal("capability"),
7320
+ target: string(),
7321
+ access: array(MethodAccessSchema).min(1)
7322
+ }),
7323
+ object({
7324
+ type: literal("addon"),
7325
+ target: string(),
7326
+ access: array(MethodAccessSchema).min(1)
7327
+ }),
7328
+ object({
7329
+ type: literal("device"),
7330
+ /**
7331
+ * One or more deviceIds (serialised as strings for wire-format
7332
+ * consistency with the rest of the union). Matcher accepts if
7333
+ * `input.deviceId` ∈ `targets`. Array shape avoids the row-explosion
7334
+ * of one scope-per-device when granting access to a set of cameras.
7335
+ */
7336
+ targets: array(string()).min(1),
7337
+ access: array(MethodAccessSchema).min(1)
7338
+ })
7339
+ ]);
7340
+ object({
7341
+ id: string(),
7342
+ username: string(),
7343
+ passwordHash: string(),
7344
+ /**
7345
+ * Admin bypass. When true, the middleware skips the scope-access
7346
+ * check entirely. There is no other axis of privilege; the legacy
7347
+ * role enum collapsed onto this boolean in v2.
7348
+ */
7349
+ isAdmin: boolean().default(false),
7350
+ allowedProviders: AllowedProviderSchema,
7351
+ allowedDevices: AllowedDevicesSchema,
7352
+ /**
7353
+ * Scopes granted to this user. Admins bypass; their `scopes` is
7354
+ * ignored. Non-admins without scopes are locked out of every
7355
+ * protected call.
7356
+ */
7357
+ scopes: array(TokenScopeSchema).default([]),
7358
+ createdAt: number(),
7359
+ updatedAt: number()
7360
+ });
7361
+ object({
7362
+ id: string(),
7363
+ label: string(),
7364
+ isAdmin: boolean().default(false),
7365
+ allowedProviders: AllowedProviderSchema,
7366
+ allowedDevices: AllowedDevicesSchema,
7367
+ tokenHash: string(),
7368
+ tokenPrefix: string(),
7369
+ createdAt: number(),
7370
+ lastUsedAt: number().optional()
7371
+ });
7372
+ object({
7373
+ id: string(),
7374
+ userId: string(),
7375
+ name: string(),
7376
+ tokenHash: string(),
7377
+ tokenPrefix: string(),
7378
+ scopes: array(TokenScopeSchema),
7379
+ expiresAt: number().nullish(),
7380
+ lastUsedAt: number().nullish(),
7381
+ createdAt: number()
7382
+ });
7112
7383
  var SsoBridgeClaimsSchema = object({
7113
7384
  userId: string(),
7114
7385
  username: string(),
@@ -7124,12 +7395,36 @@ var SsoBridgeClaimsSchema = object({
7124
7395
  * JWT WITHOUT verifying the signature — the hub re-verifies on every
7125
7396
  * inbound call so trust still rests with the signing hub.
7126
7397
  */
7127
- hubUrl: string().optional()
7398
+ hubUrl: string().optional(),
7399
+ /** Permission scopes baked into the token. Set by the OAuth
7400
+ * account-linking grant; absent on ordinary SSO-login tokens. */
7401
+ scopes: array(TokenScopeSchema).optional(),
7402
+ /** OAuth authorization-code binding — set only on `oauth-code` tokens. */
7403
+ redirectUri: string().optional(),
7404
+ integrationId: string().optional(),
7405
+ /** JWT ID — unique per issued code; consumed-set enforces single-use. */
7406
+ jti: string().optional(),
7407
+ /** OAuth session registry id — set on `oauth-access`/`oauth-refresh`
7408
+ * tokens so the verify path can check the session is not revoked. */
7409
+ sessionId: string().optional()
7128
7410
  });
7129
7411
  method(object({
7130
7412
  claims: SsoBridgeClaimsSchema,
7131
7413
  ttlSec: number().int().positive().optional()
7132
7414
  }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
7415
+ var OauthIntegrationDescriptorSchema = object({
7416
+ /** Stable id used as the `integration=` query param, e.g. 'export-alexa'. */
7417
+ integrationId: string(),
7418
+ /** Human label rendered on the consent page. */
7419
+ displayName: string(),
7420
+ /** Scopes baked into every token issued for this integration. */
7421
+ requestedScopes: array(TokenScopeSchema),
7422
+ /** Allowed redirect_uri prefixes. /api/oauth2/authorize rejects any
7423
+ * redirect_uri that does not start with one of these. Required —
7424
+ * an empty list means the integration can never complete linking. */
7425
+ allowedRedirectPrefixes: array(string()).min(1)
7426
+ });
7427
+ method(_void(), OauthIntegrationDescriptorSchema);
7133
7428
  var PasskeySummarySchema = object({
7134
7429
  credentialId: string(),
7135
7430
  label: string(),
@@ -7375,22 +7670,29 @@ var WidgetSizeEnum = _enum([
7375
7670
  "lg",
7376
7671
  "xl"
7377
7672
  ]);
7673
+ var WidgetRemoteSchema = object({
7674
+ remoteName: string(),
7675
+ exposedModule: string(),
7676
+ componentKey: string().optional()
7677
+ });
7378
7678
  var WidgetMetadataSchema = object({
7379
- /** Stable id within the addon kebab-case. */
7380
- stableId: string(),
7679
+ /** Primary host tab `'dashboard'`, `'device-tab'`, or a device-detail tab id. */
7680
+ tab: string(),
7681
+ /** Optional sub-tab within `tab`. */
7682
+ subTab: string().optional(),
7381
7683
  /** Operator-facing label. */
7382
7684
  label: string(),
7685
+ /** Ordering within `(tab, subTab)`, ascending. */
7686
+ order: number().optional(),
7687
+ /** Always `'remote'` — a widget is a Module Federation remote. */
7688
+ kind: literal("remote"),
7689
+ /** MF remote descriptor. */
7690
+ remote: WidgetRemoteSchema,
7691
+ /** Stable id within the addon — kebab-case. Equals `remote.componentKey`. */
7692
+ stableId: string(),
7383
7693
  description: string().optional(),
7384
7694
  icon: string().optional(),
7385
7695
  /**
7386
- * Module Federation remote name — must match the `name` field on the
7387
- * widget addon's `federation()` plugin config. Used by the host's
7388
- * `<WidgetRegistryProvider>` to call `loadRemote('<remoteName>/widgets')`.
7389
- * Conventionally `addon_<addonid>_widgets` (snake_case; MF names
7390
- * cannot contain hyphens).
7391
- */
7392
- remoteName: string(),
7393
- /**
7394
7696
  * Bundle filename inside the addon's `dist/` dir served at
7395
7697
  * `/api/addon-widgets/<addonId>/<bundle>`. With Module Federation
7396
7698
  * this is always `'remoteEntry.js'` — the value is kept on the
@@ -7398,9 +7700,9 @@ var WidgetMetadataSchema = object({
7398
7700
  * cache-buster URL without a separate filesystem stat.
7399
7701
  */
7400
7702
  bundle: string(),
7401
- /** Where the widget makes sense to render. */
7703
+ /** Every host the widget supports. The picker filters on this set. */
7402
7704
  hosts: array(WidgetHostEnum).readonly(),
7403
- /** Required props the host must supply. Validated at <WidgetSlot> mount. */
7705
+ /** Required props the host must supply. Validated at `<WidgetSlot>` mount. */
7404
7706
  requires: object({
7405
7707
  deviceContext: boolean().default(false),
7406
7708
  integrationContext: boolean().default(false)
@@ -7464,6 +7766,16 @@ var InvokeReplyEnvelopeSchema = object({
7464
7766
  contentType: string().optional()
7465
7767
  });
7466
7768
  method(_void(), array(AddonHttpRouteSchema)), method(InvokeRequestSchema, InvokeReplyEnvelopeSchema, { kind: "mutation" });
7769
+ var ShmRingStatsSchema = object({
7770
+ sessionId: string(),
7771
+ slotCount: number().int(),
7772
+ slotByteLength: number().int(),
7773
+ segmentBytes: number().int(),
7774
+ budgetMb: number().int(),
7775
+ framesWritten: number().int(),
7776
+ getFrameHits: number().int(),
7777
+ getFrameMisses: number().int()
7778
+ });
7467
7779
  method(object({ codec: string() }), boolean()), method(_void(), object({
7468
7780
  id: string(),
7469
7781
  name: string(),
@@ -7482,6 +7794,9 @@ method(object({ codec: string() }), boolean()), method(_void(), object({
7482
7794
  sessionId: string(),
7483
7795
  maxCount: number().default(1)
7484
7796
  }), array(DecodedFrameSchema)), method(object({
7797
+ sessionId: string(),
7798
+ maxCount: number().default(1)
7799
+ }), array(FrameHandleSchema)), method(object({ handle: FrameHandleSchema }), DecodedFrameSchema.nullable()), method(object({ sessionId: string() }), ShmRingStatsSchema.nullable()), method(object({
7485
7800
  sessionId: string(),
7486
7801
  config: DecoderSessionConfigSchema.partial()
7487
7802
  }), _void()), method(object({ sessionId: string() }), DecoderStatsSchema), method(_void(), array(object({
@@ -8877,10 +9192,38 @@ var PtzMoveCommandSchema = object({
8877
9192
  zoom: number().optional(),
8878
9193
  speed: number().optional()
8879
9194
  });
9195
+ PtzPositionSchema.extend({ autofocus: boolean() });
9196
+ var PtzOptionsSchema = object({
9197
+ hasPan: boolean(),
9198
+ hasTilt: boolean(),
9199
+ hasZoom: boolean(),
9200
+ supportsPresets: boolean(),
9201
+ /** Max number of named presets the camera supports, when known. */
9202
+ maxPresets: number().optional(),
9203
+ /** Whether the camera exposes a controllable autofocus toggle
9204
+ * (boolean `hasX` per the getOptions availability convention). */
9205
+ hasAutofocus: boolean()
9206
+ });
8880
9207
  DeviceType.Camera, method(PtzMoveCommandSchema.extend({ deviceId: number() }), _void(), { kind: "mutation" }), method(PtzMoveCommandSchema.extend({ deviceId: number() }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), array(PtzPresetSchema)), method(object({
8881
9208
  deviceId: number(),
8882
9209
  presetId: string()
8883
- }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), PtzPositionSchema);
9210
+ }), _void(), { kind: "mutation" }), method(object({
9211
+ deviceId: number(),
9212
+ presetId: string(),
9213
+ name: string()
9214
+ }), _void(), {
9215
+ kind: "mutation",
9216
+ auth: "admin"
9217
+ }), method(object({
9218
+ deviceId: number(),
9219
+ presetId: string()
9220
+ }), _void(), {
9221
+ kind: "mutation",
9222
+ auth: "admin"
9223
+ }), method(object({ deviceId: number() }), PtzOptionsSchema), method(object({ deviceId: number() }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), PtzPositionSchema), method(object({
9224
+ deviceId: number(),
9225
+ enabled: boolean()
9226
+ }), _void(), { kind: "mutation" });
8884
9227
  var EventItemSchema = object({
8885
9228
  id: string(),
8886
9229
  type: string(),
@@ -9520,85 +9863,6 @@ authKey: string().optional() }), object({
9520
9863
  /** Human-readable error when `ok: false`. */
9521
9864
  error: string().optional()
9522
9865
  }), { kind: "mutation" });
9523
- var MethodAccessSchema = _enum([
9524
- "view",
9525
- "create",
9526
- "delete"
9527
- ]);
9528
- var AllowedProviderSchema = union([literal("*"), array(string())]);
9529
- var AllowedDevicesSchema = record(string(), union([literal("*"), array(string())]));
9530
- var CapScopeSchema = _enum(["device", "system"]);
9531
- var TokenScopeSchema = discriminatedUnion("type", [
9532
- object({
9533
- type: literal("category"),
9534
- target: CapScopeSchema,
9535
- access: array(MethodAccessSchema).min(1)
9536
- }),
9537
- object({
9538
- type: literal("capability"),
9539
- target: string(),
9540
- access: array(MethodAccessSchema).min(1)
9541
- }),
9542
- object({
9543
- type: literal("addon"),
9544
- target: string(),
9545
- access: array(MethodAccessSchema).min(1)
9546
- }),
9547
- object({
9548
- type: literal("device"),
9549
- /**
9550
- * One or more deviceIds (serialised as strings for wire-format
9551
- * consistency with the rest of the union). Matcher accepts if
9552
- * `input.deviceId` ∈ `targets`. Array shape avoids the row-explosion
9553
- * of one scope-per-device when granting access to a set of cameras.
9554
- */
9555
- targets: array(string()).min(1),
9556
- access: array(MethodAccessSchema).min(1)
9557
- })
9558
- ]);
9559
- object({
9560
- id: string(),
9561
- username: string(),
9562
- passwordHash: string(),
9563
- /**
9564
- * Admin bypass. When true, the middleware skips the scope-access
9565
- * check entirely. There is no other axis of privilege; the legacy
9566
- * role enum collapsed onto this boolean in v2.
9567
- */
9568
- isAdmin: boolean().default(false),
9569
- allowedProviders: AllowedProviderSchema,
9570
- allowedDevices: AllowedDevicesSchema,
9571
- /**
9572
- * Scopes granted to this user. Admins bypass; their `scopes` is
9573
- * ignored. Non-admins without scopes are locked out of every
9574
- * protected call.
9575
- */
9576
- scopes: array(TokenScopeSchema).default([]),
9577
- createdAt: number(),
9578
- updatedAt: number()
9579
- });
9580
- object({
9581
- id: string(),
9582
- label: string(),
9583
- isAdmin: boolean().default(false),
9584
- allowedProviders: AllowedProviderSchema,
9585
- allowedDevices: AllowedDevicesSchema,
9586
- tokenHash: string(),
9587
- tokenPrefix: string(),
9588
- createdAt: number(),
9589
- lastUsedAt: number().optional()
9590
- });
9591
- object({
9592
- id: string(),
9593
- userId: string(),
9594
- name: string(),
9595
- tokenHash: string(),
9596
- tokenPrefix: string(),
9597
- scopes: array(TokenScopeSchema),
9598
- expiresAt: number().nullish(),
9599
- lastUsedAt: number().nullish(),
9600
- createdAt: number()
9601
- });
9602
9866
  var UserSummarySchema = object({
9603
9867
  id: string(),
9604
9868
  username: string(),
@@ -9671,6 +9935,16 @@ var CreateScopedTokenResultSchema = object({
9671
9935
  token: string(),
9672
9936
  record: ScopedTokenSummarySchema
9673
9937
  });
9938
+ var OauthSessionSummarySchema = object({
9939
+ id: string(),
9940
+ userId: string(),
9941
+ username: string(),
9942
+ integrationId: string(),
9943
+ scopes: array(TokenScopeSchema),
9944
+ createdAt: number(),
9945
+ lastUsedAt: number(),
9946
+ revokedAt: number().nullable()
9947
+ });
9674
9948
  var TotpSetupResultSchema = object({
9675
9949
  secret: string(),
9676
9950
  otpauthUrl: string()
@@ -9753,6 +10027,41 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
9753
10027
  }), object({ valid: boolean() }), {
9754
10028
  kind: "mutation",
9755
10029
  access: "view"
10030
+ }), method(object({
10031
+ integrationId: string(),
10032
+ userId: string(),
10033
+ username: string(),
10034
+ scopes: array(TokenScopeSchema),
10035
+ redirectUri: string(),
10036
+ hubUrl: string()
10037
+ }), object({ code: string() }), {
10038
+ kind: "mutation",
10039
+ access: "create"
10040
+ }), method(object({
10041
+ code: string(),
10042
+ redirectUri: string()
10043
+ }), object({
10044
+ accessToken: string(),
10045
+ refreshToken: string(),
10046
+ expiresIn: number()
10047
+ }).nullable(), {
10048
+ kind: "mutation",
10049
+ access: "view"
10050
+ }), method(object({ refreshToken: string() }), object({
10051
+ accessToken: string(),
10052
+ refreshToken: string(),
10053
+ expiresIn: number()
10054
+ }).nullable(), {
10055
+ kind: "mutation",
10056
+ access: "view"
10057
+ }), method(object({ token: string() }), object({
10058
+ userId: string(),
10059
+ username: string(),
10060
+ scopes: array(TokenScopeSchema)
10061
+ }).nullable(), { access: "view" }), method(_void(), array(OauthSessionSummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: boolean() }), {
10062
+ kind: "mutation",
10063
+ auth: "admin",
10064
+ access: "delete"
9756
10065
  });
9757
10066
  var FeatureManifestSchema = object({
9758
10067
  streaming: boolean(),
@@ -9921,7 +10230,13 @@ method(_void(), array(TopologyNodeSchema).readonly(), { auth: "admin" }), method
9921
10230
  }), RenameNodeResultSchema, {
9922
10231
  kind: "mutation",
9923
10232
  auth: "admin"
9924
- }), method(_void(), record(string(), ClusterAddonStatusEntrySchema), { auth: "admin" }), method(object({ nodeId: string() }), array(NodeAddonEntrySchema).readonly(), { auth: "admin" }), method(object({
10233
+ }), method(_void(), record(string(), ClusterAddonStatusEntrySchema), { auth: "admin" }), method(object({ windowSeconds: number().int().positive().max(300).default(60) }), array(object({
10234
+ callerAddonId: string(),
10235
+ providerAddonId: string(),
10236
+ capName: string(),
10237
+ callsPerMin: number(),
10238
+ lastCallAtMs: number()
10239
+ })).readonly(), { auth: "admin" }), method(object({ nodeId: string() }), array(NodeAddonEntrySchema).readonly(), { auth: "admin" }), method(object({
9925
10240
  nodeId: string(),
9926
10241
  level: string()
9927
10242
  }), SuccessSchema, {
@@ -11285,12 +11600,24 @@ Object.freeze({
11285
11600
  addonId: null,
11286
11601
  access: "delete"
11287
11602
  },
11603
+ "decoder.getFrame": {
11604
+ capName: "decoder",
11605
+ capScope: "system",
11606
+ addonId: null,
11607
+ access: "view"
11608
+ },
11288
11609
  "decoder.getInfo": {
11289
11610
  capName: "decoder",
11290
11611
  capScope: "system",
11291
11612
  addonId: null,
11292
11613
  access: "view"
11293
11614
  },
11615
+ "decoder.getShmStats": {
11616
+ capName: "decoder",
11617
+ capScope: "system",
11618
+ addonId: null,
11619
+ access: "view"
11620
+ },
11294
11621
  "decoder.getStats": {
11295
11622
  capName: "decoder",
11296
11623
  capScope: "system",
@@ -11315,6 +11642,12 @@ Object.freeze({
11315
11642
  addonId: null,
11316
11643
  access: "view"
11317
11644
  },
11645
+ "decoder.pullHandles": {
11646
+ capName: "decoder",
11647
+ capScope: "system",
11648
+ addonId: null,
11649
+ access: "view"
11650
+ },
11318
11651
  "decoder.pushPacket": {
11319
11652
  capName: "decoder",
11320
11653
  capScope: "system",
@@ -12101,6 +12434,18 @@ Object.freeze({
12101
12434
  addonId: null,
12102
12435
  access: "create"
12103
12436
  },
12437
+ "motionZones.getOptions": {
12438
+ capName: "motion-zones",
12439
+ capScope: "device",
12440
+ addonId: null,
12441
+ access: "view"
12442
+ },
12443
+ "motionZones.setZone": {
12444
+ capName: "motion-zones",
12445
+ capScope: "device",
12446
+ addonId: null,
12447
+ access: "create"
12448
+ },
12104
12449
  "mqttBroker.addBroker": {
12105
12450
  capName: "mqtt-broker",
12106
12451
  capScope: "system",
@@ -12215,6 +12560,12 @@ Object.freeze({
12215
12560
  addonId: null,
12216
12561
  access: "create"
12217
12562
  },
12563
+ "nodes.getCapUsageGraph": {
12564
+ capName: "nodes",
12565
+ capScope: "system",
12566
+ addonId: null,
12567
+ access: "view"
12568
+ },
12218
12569
  "nodes.getNodeAddons": {
12219
12570
  capName: "nodes",
12220
12571
  capScope: "system",
@@ -12281,6 +12632,12 @@ Object.freeze({
12281
12632
  addonId: null,
12282
12633
  access: "create"
12283
12634
  },
12635
+ "oauthIntegration.getDescriptor": {
12636
+ capName: "oauth-integration",
12637
+ capScope: "system",
12638
+ addonId: null,
12639
+ access: "view"
12640
+ },
12284
12641
  "osd.setOverlay": {
12285
12642
  capName: "osd",
12286
12643
  capScope: "device",
@@ -12839,6 +13196,18 @@ Object.freeze({
12839
13196
  addonId: null,
12840
13197
  access: "create"
12841
13198
  },
13199
+ "ptz.deletePreset": {
13200
+ capName: "ptz",
13201
+ capScope: "device",
13202
+ addonId: null,
13203
+ access: "delete"
13204
+ },
13205
+ "ptz.getOptions": {
13206
+ capName: "ptz",
13207
+ capScope: "device",
13208
+ addonId: null,
13209
+ access: "view"
13210
+ },
12842
13211
  "ptz.getPosition": {
12843
13212
  capName: "ptz",
12844
13213
  capScope: "device",
@@ -12869,6 +13238,18 @@ Object.freeze({
12869
13238
  addonId: null,
12870
13239
  access: "create"
12871
13240
  },
13241
+ "ptz.savePreset": {
13242
+ capName: "ptz",
13243
+ capScope: "device",
13244
+ addonId: null,
13245
+ access: "create"
13246
+ },
13247
+ "ptz.setAutofocus": {
13248
+ capName: "ptz",
13249
+ capScope: "device",
13250
+ addonId: null,
13251
+ access: "create"
13252
+ },
12872
13253
  "ptz.stop": {
12873
13254
  capName: "ptz",
12874
13255
  capScope: "device",
@@ -13391,12 +13772,6 @@ Object.freeze({
13391
13772
  addonId: null,
13392
13773
  access: "view"
13393
13774
  },
13394
- "streamBroker.getBroker": {
13395
- capName: "stream-broker",
13396
- capScope: "system",
13397
- addonId: null,
13398
- access: "view"
13399
- },
13400
13775
  "streamBroker.getBrokerStats": {
13401
13776
  capName: "stream-broker",
13402
13777
  capScope: "system",
@@ -13469,6 +13844,18 @@ Object.freeze({
13469
13844
  addonId: null,
13470
13845
  access: "create"
13471
13846
  },
13847
+ "streamBroker.pullAudioChunks": {
13848
+ capName: "stream-broker",
13849
+ capScope: "system",
13850
+ addonId: null,
13851
+ access: "view"
13852
+ },
13853
+ "streamBroker.pullFrameHandles": {
13854
+ capName: "stream-broker",
13855
+ capScope: "system",
13856
+ addonId: null,
13857
+ access: "view"
13858
+ },
13472
13859
  "streamBroker.regenerateRtspToken": {
13473
13860
  capName: "stream-broker",
13474
13861
  capScope: "system",
@@ -13505,12 +13892,36 @@ Object.freeze({
13505
13892
  addonId: null,
13506
13893
  access: "create"
13507
13894
  },
13895
+ "streamBroker.subscribeAudioChunks": {
13896
+ capName: "stream-broker",
13897
+ capScope: "system",
13898
+ addonId: null,
13899
+ access: "create"
13900
+ },
13901
+ "streamBroker.subscribeFrames": {
13902
+ capName: "stream-broker",
13903
+ capScope: "system",
13904
+ addonId: null,
13905
+ access: "create"
13906
+ },
13508
13907
  "streamBroker.unassignProfile": {
13509
13908
  capName: "stream-broker",
13510
13909
  capScope: "system",
13511
13910
  addonId: null,
13512
13911
  access: "create"
13513
13912
  },
13913
+ "streamBroker.unsubscribeAudioChunks": {
13914
+ capName: "stream-broker",
13915
+ capScope: "system",
13916
+ addonId: null,
13917
+ access: "create"
13918
+ },
13919
+ "streamBroker.unsubscribeFrames": {
13920
+ capName: "stream-broker",
13921
+ capScope: "system",
13922
+ addonId: null,
13923
+ access: "create"
13924
+ },
13514
13925
  "streamingEngine.getStreamUrl": {
13515
13926
  capName: "streaming-engine",
13516
13927
  capScope: "system",
@@ -13535,6 +13946,24 @@ Object.freeze({
13535
13946
  addonId: null,
13536
13947
  access: "delete"
13537
13948
  },
13949
+ "streamParams.getConfigSchema": {
13950
+ capName: "stream-params",
13951
+ capScope: "device",
13952
+ addonId: null,
13953
+ access: "view"
13954
+ },
13955
+ "streamParams.getOptions": {
13956
+ capName: "stream-params",
13957
+ capScope: "device",
13958
+ addonId: null,
13959
+ access: "view"
13960
+ },
13961
+ "streamParams.setProfile": {
13962
+ capName: "stream-params",
13963
+ capScope: "device",
13964
+ addonId: null,
13965
+ access: "create"
13966
+ },
13538
13967
  "switch.setState": {
13539
13968
  capName: "switch",
13540
13969
  capScope: "device",
@@ -13643,6 +14072,12 @@ Object.freeze({
13643
14072
  addonId: null,
13644
14073
  access: "view"
13645
14074
  },
14075
+ "userManagement.listOauthSessions": {
14076
+ capName: "user-management",
14077
+ capScope: "system",
14078
+ addonId: null,
14079
+ access: "view"
14080
+ },
13646
14081
  "userManagement.listScopedTokens": {
13647
14082
  capName: "user-management",
13648
14083
  capScope: "system",
@@ -13655,6 +14090,30 @@ Object.freeze({
13655
14090
  addonId: null,
13656
14091
  access: "view"
13657
14092
  },
14093
+ "userManagement.oauthExchangeCode": {
14094
+ capName: "user-management",
14095
+ capScope: "system",
14096
+ addonId: null,
14097
+ access: "view"
14098
+ },
14099
+ "userManagement.oauthIssueCode": {
14100
+ capName: "user-management",
14101
+ capScope: "system",
14102
+ addonId: null,
14103
+ access: "create"
14104
+ },
14105
+ "userManagement.oauthRefresh": {
14106
+ capName: "user-management",
14107
+ capScope: "system",
14108
+ addonId: null,
14109
+ access: "view"
14110
+ },
14111
+ "userManagement.oauthVerifyAccessToken": {
14112
+ capName: "user-management",
14113
+ capScope: "system",
14114
+ addonId: null,
14115
+ access: "view"
14116
+ },
13658
14117
  "userManagement.resetPassword": {
13659
14118
  capName: "user-management",
13660
14119
  capScope: "system",
@@ -13667,6 +14126,12 @@ Object.freeze({
13667
14126
  addonId: null,
13668
14127
  access: "delete"
13669
14128
  },
14129
+ "userManagement.revokeOauthSession": {
14130
+ capName: "user-management",
14131
+ capScope: "system",
14132
+ addonId: null,
14133
+ access: "delete"
14134
+ },
13670
14135
  "userManagement.revokeScopedToken": {
13671
14136
  capName: "user-management",
13672
14137
  capScope: "system",