@camstack/types 0.1.30 → 0.1.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/dist/addon/build-addon-route-provider.d.ts +55 -0
  2. package/dist/addon/build-addon-route-provider.d.ts.map +1 -0
  3. package/dist/capabilities/addon-routes.cap.d.ts +64 -0
  4. package/dist/capabilities/addon-routes.cap.d.ts.map +1 -1
  5. package/dist/capabilities/auth-provider.cap.d.ts +4 -4
  6. package/dist/capabilities/auth-provider.cap.d.ts.map +1 -1
  7. package/dist/capabilities/authentication.cap.d.ts +4 -0
  8. package/dist/capabilities/authentication.cap.d.ts.map +1 -1
  9. package/dist/capabilities/home-assistant.cap.d.ts +138 -0
  10. package/dist/capabilities/home-assistant.cap.d.ts.map +1 -0
  11. package/dist/capabilities/index.d.ts +16 -1
  12. package/dist/capabilities/index.d.ts.map +1 -1
  13. package/dist/capabilities/mesh-network.cap.d.ts +18 -0
  14. package/dist/capabilities/mesh-network.cap.d.ts.map +1 -1
  15. package/dist/capabilities/mqtt-provider.cap.d.ts +91 -0
  16. package/dist/capabilities/mqtt-provider.cap.d.ts.map +1 -0
  17. package/dist/capabilities/settings-store.cap.d.ts +8 -2
  18. package/dist/capabilities/settings-store.cap.d.ts.map +1 -1
  19. package/dist/capabilities/smtp-provider.cap.d.ts +62 -0
  20. package/dist/capabilities/smtp-provider.cap.d.ts.map +1 -0
  21. package/dist/capabilities/sso-bridge.cap.d.ts +58 -0
  22. package/dist/capabilities/sso-bridge.cap.d.ts.map +1 -0
  23. package/dist/capabilities/user-management.cap.d.ts +513 -184
  24. package/dist/capabilities/user-management.cap.d.ts.map +1 -1
  25. package/dist/capabilities/user-passkeys.cap.d.ts +92 -0
  26. package/dist/capabilities/user-passkeys.cap.d.ts.map +1 -0
  27. package/dist/enums/event-category.d.ts +8 -1
  28. package/dist/enums/event-category.d.ts.map +1 -1
  29. package/dist/generated/addon-api.d.ts +472 -86
  30. package/dist/generated/addon-api.d.ts.map +1 -1
  31. package/dist/generated/capability-router-map.d.ts +19 -4
  32. package/dist/generated/capability-router-map.d.ts.map +1 -1
  33. package/dist/generated/method-access-map.d.ts +6 -1
  34. package/dist/generated/method-access-map.d.ts.map +1 -1
  35. package/dist/generated/scope-presets.d.ts +17 -0
  36. package/dist/generated/scope-presets.d.ts.map +1 -0
  37. package/dist/generated/system-proxy.d.ts +2 -2
  38. package/dist/generated/system-proxy.d.ts.map +1 -1
  39. package/dist/{index-s8uJNgNs.js → index-BKifir_y.js} +557 -48
  40. package/dist/index-BKifir_y.js.map +1 -0
  41. package/dist/{index-DVKPWMwv.mjs → index-BKnvgAep.mjs} +852 -343
  42. package/dist/index-BKnvgAep.mjs.map +1 -0
  43. package/dist/index.d.ts +7 -3
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +781 -498
  46. package/dist/index.js.map +1 -1
  47. package/dist/index.mjs +1038 -755
  48. package/dist/index.mjs.map +1 -1
  49. package/dist/interfaces/addon-routes.d.ts +8 -2
  50. package/dist/interfaces/addon-routes.d.ts.map +1 -1
  51. package/dist/interfaces/api-responses.d.ts +2 -3
  52. package/dist/interfaces/api-responses.d.ts.map +1 -1
  53. package/dist/interfaces/auth.d.ts +14 -11
  54. package/dist/interfaces/auth.d.ts.map +1 -1
  55. package/dist/interfaces/storage.d.ts +15 -2
  56. package/dist/interfaces/storage.d.ts.map +1 -1
  57. package/dist/node.js +1 -1
  58. package/dist/node.mjs +1 -1
  59. package/dist/schemas/auth-records.d.ts +105 -50
  60. package/dist/schemas/auth-records.d.ts.map +1 -1
  61. package/package.json +1 -1
  62. package/dist/index-DVKPWMwv.mjs.map +0 -1
  63. package/dist/index-s8uJNgNs.js.map +0 -1
  64. package/dist/interfaces/auth-provider.d.ts +0 -39
  65. package/dist/interfaces/auth-provider.d.ts.map +0 -1
@@ -3545,7 +3545,7 @@ const SettingsRecordSchema = zod.z.object({
3545
3545
  });
3546
3546
  const CollectionColumnSchema = zod.z.object({
3547
3547
  name: zod.z.string(),
3548
- type: zod.z.enum(["TEXT", "INTEGER", "REAL", "JSON"]),
3548
+ type: zod.z.enum(["TEXT", "INTEGER", "REAL", "JSON", "BOOLEAN"]),
3549
3549
  primaryKey: zod.z.boolean().optional(),
3550
3550
  notNull: zod.z.boolean().optional(),
3551
3551
  unique: zod.z.boolean().optional()
@@ -3670,6 +3670,352 @@ const adminUiCapability = {
3670
3670
  getVersion: method(zod.z.void(), zod.z.string())
3671
3671
  }
3672
3672
  };
3673
+ const SsoBridgeClaimsSchema = zod.z.object({
3674
+ userId: zod.z.string(),
3675
+ username: zod.z.string(),
3676
+ isAdmin: zod.z.boolean(),
3677
+ provider: zod.z.string(),
3678
+ email: zod.z.string().optional(),
3679
+ displayName: zod.z.string().optional()
3680
+ });
3681
+ const ssoBridgeCapability = {
3682
+ name: "sso-bridge",
3683
+ scope: "system",
3684
+ mode: "singleton",
3685
+ internal: true,
3686
+ methods: {
3687
+ signBridgeToken: method(
3688
+ zod.z.object({
3689
+ claims: SsoBridgeClaimsSchema,
3690
+ ttlSec: zod.z.number().int().positive().optional()
3691
+ }),
3692
+ zod.z.object({ token: zod.z.string() })
3693
+ ),
3694
+ verifyBridgeToken: method(
3695
+ zod.z.object({ token: zod.z.string() }),
3696
+ SsoBridgeClaimsSchema.nullable()
3697
+ )
3698
+ }
3699
+ };
3700
+ const PasskeySummarySchema = zod.z.object({
3701
+ credentialId: zod.z.string(),
3702
+ label: zod.z.string(),
3703
+ createdAt: zod.z.number(),
3704
+ lastUsedAt: zod.z.number().nullable(),
3705
+ transports: zod.z.array(zod.z.string()).default([])
3706
+ });
3707
+ const userPasskeysCapability = {
3708
+ name: "user-passkeys",
3709
+ scope: "system",
3710
+ mode: "collection",
3711
+ internal: true,
3712
+ methods: {
3713
+ beginRegistration: method(
3714
+ zod.z.object({ userId: zod.z.string(), username: zod.z.string() }),
3715
+ // PublicKeyCredentialCreationOptionsJSON — opaque JSON shape from
3716
+ // @simplewebauthn. The browser passes it straight to credentials.create().
3717
+ zod.z.object({ optionsJSON: zod.z.record(zod.z.string(), zod.z.unknown()) }),
3718
+ { kind: "mutation", auth: "admin", access: "create" }
3719
+ ),
3720
+ finishRegistration: method(
3721
+ zod.z.object({
3722
+ userId: zod.z.string(),
3723
+ /** RegistrationResponseJSON from the browser. */
3724
+ response: zod.z.record(zod.z.string(), zod.z.unknown()),
3725
+ /** Operator-visible label (e.g. "MacBook Touch ID"). */
3726
+ label: zod.z.string()
3727
+ }),
3728
+ zod.z.object({ success: zod.z.literal(true), credentialId: zod.z.string() }),
3729
+ { kind: "mutation", auth: "admin", access: "create" }
3730
+ ),
3731
+ beginAuthentication: method(
3732
+ // userId optional — when absent, the addon emits a "passkey discovery"
3733
+ // (`allowCredentials: []`) so the browser shows every available
3734
+ // credential. When present, only the user's credentials are allowed.
3735
+ zod.z.object({ userId: zod.z.string().optional() }),
3736
+ zod.z.object({ optionsJSON: zod.z.record(zod.z.string(), zod.z.unknown()) }),
3737
+ { kind: "mutation", access: "view" }
3738
+ ),
3739
+ finishAuthentication: method(
3740
+ zod.z.object({
3741
+ /** Required — the user the assertion belongs to (verified). */
3742
+ userId: zod.z.string(),
3743
+ /** AuthenticationResponseJSON from the browser. */
3744
+ response: zod.z.record(zod.z.string(), zod.z.unknown())
3745
+ }),
3746
+ zod.z.object({ verified: zod.z.boolean() }),
3747
+ { kind: "mutation", access: "view" }
3748
+ ),
3749
+ listPasskeys: method(
3750
+ zod.z.object({ userId: zod.z.string() }),
3751
+ zod.z.array(PasskeySummarySchema),
3752
+ { auth: "admin" }
3753
+ ),
3754
+ removePasskey: method(
3755
+ zod.z.object({ userId: zod.z.string(), credentialId: zod.z.string() }),
3756
+ zod.z.object({ success: zod.z.literal(true) }),
3757
+ { kind: "mutation", auth: "admin", access: "delete" }
3758
+ )
3759
+ }
3760
+ };
3761
+ const EmailAddressSchema = zod.z.string().email();
3762
+ const SendEmailInputSchema = zod.z.object({
3763
+ to: zod.z.union([EmailAddressSchema, zod.z.array(EmailAddressSchema).min(1)]),
3764
+ cc: zod.z.array(EmailAddressSchema).optional(),
3765
+ bcc: zod.z.array(EmailAddressSchema).optional(),
3766
+ /** RFC 5322 `From` field. Most relays will reject if the domain
3767
+ * isn't authorised — the addon is responsible for substituting a
3768
+ * sane default when omitted. */
3769
+ from: zod.z.string().optional(),
3770
+ /** Optional `Reply-To` override. */
3771
+ replyTo: zod.z.string().optional(),
3772
+ subject: zod.z.string(),
3773
+ /** Plain-text body. Required even when `html` is present (fallback
3774
+ * for clients that strip HTML — including most spam filters). */
3775
+ text: zod.z.string(),
3776
+ /** Optional HTML body. Renders alongside `text` as multi-part. */
3777
+ html: zod.z.string().optional()
3778
+ });
3779
+ const SendEmailResultSchema = zod.z.object({
3780
+ messageId: zod.z.string(),
3781
+ accepted: zod.z.array(EmailAddressSchema).default([]),
3782
+ rejected: zod.z.array(EmailAddressSchema).default([])
3783
+ });
3784
+ const SmtpStatusSchema = zod.z.object({
3785
+ /** True iff the addon has successfully verified the relay. */
3786
+ ready: zod.z.boolean(),
3787
+ /** Operator-visible host string (no credentials). */
3788
+ host: zod.z.string(),
3789
+ /** Last error message reported by the relay, when not ready. */
3790
+ error: zod.z.string().optional(),
3791
+ /** Last successful verify timestamp (unix ms). */
3792
+ lastVerifiedAt: zod.z.number().optional()
3793
+ });
3794
+ const smtpProviderCapability = {
3795
+ name: "smtp-provider",
3796
+ scope: "system",
3797
+ mode: "collection",
3798
+ internal: true,
3799
+ methods: {
3800
+ sendEmail: method(
3801
+ SendEmailInputSchema,
3802
+ SendEmailResultSchema,
3803
+ { kind: "mutation", auth: "admin", access: "create" }
3804
+ ),
3805
+ /** Round-trip ping against the SMTP relay (EHLO + AUTH if configured).
3806
+ * Used by the operator's "Test connection" button. */
3807
+ verify: method(
3808
+ zod.z.void(),
3809
+ SmtpStatusSchema,
3810
+ { kind: "mutation", auth: "admin", access: "view" }
3811
+ ),
3812
+ getStatus: method(
3813
+ zod.z.void(),
3814
+ SmtpStatusSchema,
3815
+ { auth: "admin" }
3816
+ )
3817
+ }
3818
+ };
3819
+ const QosSchema = zod.z.union([zod.z.literal(0), zod.z.literal(1), zod.z.literal(2)]);
3820
+ const PublishInputSchema = zod.z.object({
3821
+ topic: zod.z.string(),
3822
+ /** UTF-8 payload. Binary payloads must be base64-encoded by the caller. */
3823
+ payload: zod.z.string(),
3824
+ qos: QosSchema.default(0),
3825
+ retain: zod.z.boolean().default(false)
3826
+ });
3827
+ const SubscribeInputSchema = zod.z.object({
3828
+ /** MQTT topic filter (supports `+` single-level and `#` multi-level wildcards). */
3829
+ topic: zod.z.string(),
3830
+ qos: QosSchema.default(0),
3831
+ /**
3832
+ * Caller-supplied owner tag. Useful for debugging + the
3833
+ * `listSubscriptions` admin view ("which consumer owns this?").
3834
+ * When omitted, the addon synthesizes one from the caller's addon id.
3835
+ */
3836
+ owner: zod.z.string().optional()
3837
+ });
3838
+ const SubscribeResultSchema = zod.z.object({
3839
+ success: zod.z.literal(true),
3840
+ /** Server-generated subscription id. Pass to `unsubscribe` to release. */
3841
+ subscriptionId: zod.z.string()
3842
+ });
3843
+ const UnsubscribeInputSchema = zod.z.object({
3844
+ /** Subscription id from `subscribe`. */
3845
+ subscriptionId: zod.z.string()
3846
+ });
3847
+ const MqttStatusSchema = zod.z.object({
3848
+ /** True iff the addon has an active connection to the broker. */
3849
+ connected: zod.z.boolean(),
3850
+ /** Operator-visible host string (e.g. `mqtt://broker.example:1883`). */
3851
+ brokerUrl: zod.z.string(),
3852
+ /** Active subscription count (per-owner, NOT broker-side topic count). */
3853
+ subscriptionCount: zod.z.number().int(),
3854
+ /** Last error reported by the broker. */
3855
+ error: zod.z.string().optional(),
3856
+ /** Last successful connection timestamp (unix ms). */
3857
+ connectedAt: zod.z.number().optional()
3858
+ });
3859
+ const SubscriptionInfoSchema = zod.z.object({
3860
+ subscriptionId: zod.z.string(),
3861
+ topic: zod.z.string(),
3862
+ qos: QosSchema,
3863
+ owner: zod.z.string(),
3864
+ /** When this individual subscription was created. */
3865
+ createdAt: zod.z.number()
3866
+ });
3867
+ const mqttProviderCapability = {
3868
+ name: "mqtt-provider",
3869
+ scope: "system",
3870
+ mode: "collection",
3871
+ internal: true,
3872
+ methods: {
3873
+ /** Publish a message. Lazy-opens the connection if not yet active. */
3874
+ publish: method(
3875
+ PublishInputSchema,
3876
+ zod.z.object({ success: zod.z.literal(true) }),
3877
+ { kind: "mutation", auth: "admin", access: "create" }
3878
+ ),
3879
+ /**
3880
+ * Subscribe to a topic. Returns a `subscriptionId` to pass to
3881
+ * `unsubscribe`. The addon refcounts broker subscriptions —
3882
+ * multiple consumers on the same topic share one upstream sub.
3883
+ * Messages arrive on `mqtt.message` events with `subscriptionIds[]`
3884
+ * listing which subscriptions matched.
3885
+ */
3886
+ subscribe: method(
3887
+ SubscribeInputSchema,
3888
+ SubscribeResultSchema,
3889
+ { kind: "mutation", auth: "admin", access: "create" }
3890
+ ),
3891
+ /** Release a specific subscription. Tears down the broker sub
3892
+ * only when the last owner releases. Idempotent. */
3893
+ unsubscribe: method(
3894
+ UnsubscribeInputSchema,
3895
+ zod.z.object({ success: zod.z.literal(true) }),
3896
+ { kind: "mutation", auth: "admin", access: "delete" }
3897
+ ),
3898
+ /** List active per-owner subscriptions on this provider. */
3899
+ listSubscriptions: method(
3900
+ zod.z.void(),
3901
+ zod.z.array(SubscriptionInfoSchema),
3902
+ { auth: "admin" }
3903
+ ),
3904
+ getStatus: method(
3905
+ zod.z.void(),
3906
+ MqttStatusSchema,
3907
+ { auth: "admin" }
3908
+ )
3909
+ }
3910
+ };
3911
+ const HaServiceCallSchema = zod.z.object({
3912
+ /** HA domain (e.g. `light`, `switch`, `notify`). */
3913
+ domain: zod.z.string(),
3914
+ /** HA service (e.g. `turn_on`, `toggle`). */
3915
+ service: zod.z.string(),
3916
+ /** Service-specific data payload (e.g. `{entity_id: 'light.kitchen', brightness: 200}`). */
3917
+ serviceData: zod.z.record(zod.z.string(), zod.z.unknown()).optional(),
3918
+ /** Optional target spec (entity_id / device_id / area_id). */
3919
+ target: zod.z.record(zod.z.string(), zod.z.unknown()).optional()
3920
+ });
3921
+ const HaStateSchema = zod.z.object({
3922
+ entity_id: zod.z.string(),
3923
+ state: zod.z.string(),
3924
+ attributes: zod.z.record(zod.z.string(), zod.z.unknown()).default({}),
3925
+ last_changed: zod.z.string().optional(),
3926
+ last_updated: zod.z.string().optional()
3927
+ });
3928
+ const HaStatusSchema = zod.z.object({
3929
+ connected: zod.z.boolean(),
3930
+ host: zod.z.string(),
3931
+ /** Active per-owner subscription count. */
3932
+ subscriptionCount: zod.z.number().int(),
3933
+ /** Last error reported by the WebSocket. */
3934
+ error: zod.z.string().optional(),
3935
+ /** HA version reported during the auth handshake, when reachable. */
3936
+ haVersion: zod.z.string().optional(),
3937
+ connectedAt: zod.z.number().optional()
3938
+ });
3939
+ const HaSubscribeInputSchema = zod.z.object({
3940
+ /**
3941
+ * Specific HA event type to subscribe to (`state_changed`,
3942
+ * `service_called`, etc.). Empty string = all events (firehose —
3943
+ * only for debugging).
3944
+ */
3945
+ eventType: zod.z.string().optional(),
3946
+ /** Caller-supplied tag for listSubscriptions debugging. */
3947
+ owner: zod.z.string().optional()
3948
+ });
3949
+ const HaSubscribeResultSchema = zod.z.object({
3950
+ success: zod.z.literal(true),
3951
+ subscriptionId: zod.z.string()
3952
+ });
3953
+ const HaUnsubscribeInputSchema = zod.z.object({
3954
+ subscriptionId: zod.z.string()
3955
+ });
3956
+ const HaSubscriptionInfoSchema = zod.z.object({
3957
+ subscriptionId: zod.z.string(),
3958
+ /** Empty string when subscribed to ALL events. */
3959
+ eventType: zod.z.string(),
3960
+ owner: zod.z.string(),
3961
+ createdAt: zod.z.number()
3962
+ });
3963
+ const homeAssistantCapability = {
3964
+ name: "home-assistant",
3965
+ scope: "system",
3966
+ mode: "collection",
3967
+ internal: true,
3968
+ methods: {
3969
+ /**
3970
+ * Subscribe to HA events. Returns a `subscriptionId` to pass to
3971
+ * `unsubscribeEvents`. The addon refcounts upstream subscriptions
3972
+ * so multiple consumers share one HA-side event stream.
3973
+ * Events arrive on the kernel bus under `home-assistant.event`
3974
+ * with `subscriptionIds[]` listing which subs matched.
3975
+ */
3976
+ subscribeEvents: method(
3977
+ HaSubscribeInputSchema,
3978
+ HaSubscribeResultSchema,
3979
+ { kind: "mutation", auth: "admin", access: "create" }
3980
+ ),
3981
+ /** Release a specific subscription. Tears down the upstream sub
3982
+ * only when the last owner releases. Idempotent. */
3983
+ unsubscribeEvents: method(
3984
+ HaUnsubscribeInputSchema,
3985
+ zod.z.object({ success: zod.z.literal(true) }),
3986
+ { kind: "mutation", auth: "admin", access: "delete" }
3987
+ ),
3988
+ /**
3989
+ * Call an HA service (turn light on, run a script, etc.). Returns
3990
+ * the HA response object — usually `{context, response: ...}`.
3991
+ */
3992
+ callService: method(
3993
+ HaServiceCallSchema,
3994
+ zod.z.object({ result: zod.z.unknown() }),
3995
+ { kind: "mutation", auth: "admin", access: "create" }
3996
+ ),
3997
+ /** Fetch all entity states. Cheap snapshot — HA returns the full
3998
+ * state registry on every call. */
3999
+ getStates: method(
4000
+ zod.z.void(),
4001
+ zod.z.array(HaStateSchema).readonly(),
4002
+ { auth: "admin" }
4003
+ ),
4004
+ /** Fetch a single entity's current state. `null` when not found. */
4005
+ getState: method(
4006
+ zod.z.object({ entityId: zod.z.string() }),
4007
+ HaStateSchema.nullable(),
4008
+ { auth: "admin" }
4009
+ ),
4010
+ /** List active per-owner subscriptions. */
4011
+ listSubscriptions: method(
4012
+ zod.z.void(),
4013
+ zod.z.array(HaSubscriptionInfoSchema).readonly(),
4014
+ { auth: "admin" }
4015
+ ),
4016
+ getStatus: method(zod.z.void(), HaStatusSchema, { auth: "admin" })
4017
+ }
4018
+ };
3673
4019
  const AddonPageDeclarationSchema$1 = zod.z.object({
3674
4020
  id: zod.z.string(),
3675
4021
  label: zod.z.string(),
@@ -3783,7 +4129,35 @@ const addonWidgetsCapability = {
3783
4129
  };
3784
4130
  const AddonHttpRouteSchema = zod.z.object({
3785
4131
  method: zod.z.enum(["GET", "POST", "PUT", "DELETE", "PATCH"]),
3786
- path: zod.z.string()
4132
+ path: zod.z.string(),
4133
+ access: zod.z.enum(["public", "authenticated", "admin"]).optional(),
4134
+ description: zod.z.string().optional()
4135
+ });
4136
+ const InvokeRequestSchema = zod.z.object({
4137
+ method: zod.z.string(),
4138
+ path: zod.z.string(),
4139
+ params: zod.z.record(zod.z.string(), zod.z.string()),
4140
+ query: zod.z.record(zod.z.string(), zod.z.string()),
4141
+ body: zod.z.unknown(),
4142
+ headers: zod.z.record(zod.z.string(), zod.z.string()),
4143
+ user: zod.z.object({
4144
+ id: zod.z.string(),
4145
+ username: zod.z.string(),
4146
+ isAdmin: zod.z.boolean()
4147
+ }).optional(),
4148
+ scopedToken: zod.z.unknown().optional()
4149
+ });
4150
+ const InvokeReplyEnvelopeSchema = zod.z.object({
4151
+ status: zod.z.number().int(),
4152
+ headers: zod.z.record(zod.z.string(), zod.z.string()),
4153
+ /** When set, the hub MUST `reply.redirect(redirectUrl)` instead of
4154
+ * sending `body`. Status defaults to 302 when this is set unless
4155
+ * the handler called `reply.code(...)` explicitly. */
4156
+ redirectUrl: zod.z.string().nullable(),
4157
+ /** JSON-serializable body. `undefined` is treated as "no body". */
4158
+ body: zod.z.unknown().optional(),
4159
+ /** Set when the handler called `reply.type(mime)`. */
4160
+ contentType: zod.z.string().optional()
3787
4161
  });
3788
4162
  const addonRoutesCapability = {
3789
4163
  name: "addon-routes",
@@ -3791,7 +4165,16 @@ const addonRoutesCapability = {
3791
4165
  mode: "collection",
3792
4166
  internal: true,
3793
4167
  methods: {
3794
- getRoutes: method(zod.z.void(), zod.z.array(AddonHttpRouteSchema))
4168
+ getRoutes: method(zod.z.void(), zod.z.array(AddonHttpRouteSchema)),
4169
+ /**
4170
+ * Cross-process dispatch entry point. Forked addons implement this
4171
+ * (via `buildAddonRouteProvider`) so the hub's Fastify catch-all
4172
+ * can route through Moleculer when the handler lives in a worker.
4173
+ *
4174
+ * Local addons can implement it for free with the same helper;
4175
+ * the hub bypasses the wire on co-located addons.
4176
+ */
4177
+ invoke: method(InvokeRequestSchema, InvokeReplyEnvelopeSchema, { kind: "mutation" })
3795
4178
  }
3796
4179
  };
3797
4180
  const HWACCEL_OPTIONS = [
@@ -5327,7 +5710,14 @@ const AuthResultSchema = zod.z.object({
5327
5710
  username: zod.z.string(),
5328
5711
  email: zod.z.string().optional(),
5329
5712
  displayName: zod.z.string().optional(),
5330
- roles: zod.z.array(zod.z.string()).optional()
5713
+ /**
5714
+ * Whether the authenticating user is an admin. The auth-provider
5715
+ * surface returns this so the server's login flow can mint a JWT
5716
+ * with the correct bypass flag. Non-admin users authenticated via
5717
+ * an external IdP still need their scopes assigned by an admin via
5718
+ * `setUserScopes` — the SSO flow doesn't carry permissions.
5719
+ */
5720
+ isAdmin: zod.z.boolean().default(false)
5331
5721
  });
5332
5722
  const authProviderCapability = {
5333
5723
  name: "auth-provider",
@@ -5348,6 +5738,14 @@ const authProviderCapability = {
5348
5738
  const AuthProviderInfoSchema = zod.z.object({
5349
5739
  /** Stable id matching the addon id (used for `getLoginUrl({addonId,…})`). */
5350
5740
  addonId: zod.z.string(),
5741
+ /**
5742
+ * Per-instance id when one addon registers multiple "logical"
5743
+ * providers (e.g. OIDC with Google + Microsoft + custom). The login
5744
+ * URL becomes `/addon/${addonId}/${instanceId}/start` — handler reads
5745
+ * `:instanceId` from the route. Empty/unset means the addon is a
5746
+ * single-instance provider; the URL is `/addon/${addonId}/start`.
5747
+ */
5748
+ instanceId: zod.z.string().optional(),
5351
5749
  /** Display label shown on the login button + admin row. */
5352
5750
  displayName: zod.z.string(),
5353
5751
  /** Optional iconography hint (lucide-react icon name OR emoji). */
@@ -5358,6 +5756,8 @@ const AuthProviderInfoSchema = zod.z.object({
5358
5756
  /** When true, the provider exposes a credential-form login flow
5359
5757
  * (`validateCredentials` accepts username + password). */
5360
5758
  hasCredentialFlow: zod.z.boolean(),
5759
+ /** Provider kind, drives admin-UI hint dispatch (oidc / saml / totp / …). */
5760
+ kind: zod.z.string().optional(),
5361
5761
  /** Operator-facing status string (e.g. "Connected to https://login.acme.com"). */
5362
5762
  status: zod.z.string().optional(),
5363
5763
  /** When false, the provider is registered but disabled by config; the
@@ -7127,6 +7527,35 @@ const meshNetworkCapability = {
7127
7527
  MeshIngressConfigSchema,
7128
7528
  zod.z.object({ success: zod.z.literal(true) }),
7129
7529
  { kind: "mutation" }
7530
+ ),
7531
+ /**
7532
+ * Probe the mesh daemon / API for a sanity check WITHOUT joining.
7533
+ * Operator-facing "test connection" button: validates the auth key
7534
+ * + reaches the control plane and reports back what would happen
7535
+ * on join.
7536
+ *
7537
+ * Tailscale: dry-runs `tailscale up --auth-key=… --reset` against
7538
+ * an idempotency probe; for an already-joined node it just returns
7539
+ * the current status.
7540
+ */
7541
+ testConnection: method(
7542
+ zod.z.object({
7543
+ /** Optional auth key — when provided, probes the key validity
7544
+ * against the provider's API. Omit when already joined to
7545
+ * just ping the daemon. */
7546
+ authKey: zod.z.string().optional()
7547
+ }),
7548
+ zod.z.object({
7549
+ ok: zod.z.boolean(),
7550
+ /** Provider-side identifier resolved by the probe (tailnet
7551
+ * name for Tailscale, network id for ZeroTier, etc.). */
7552
+ tenant: zod.z.string().optional(),
7553
+ /** Daemon binary version, when reachable. */
7554
+ daemonVersion: zod.z.string().optional(),
7555
+ /** Human-readable error when `ok: false`. */
7556
+ error: zod.z.string().optional()
7557
+ }),
7558
+ { kind: "mutation" }
7130
7559
  )
7131
7560
  }
7132
7561
  };
@@ -7184,26 +7613,54 @@ const meshOrchestratorCapability = {
7184
7613
  )
7185
7614
  }
7186
7615
  };
7187
- const UserRoleSchema = zod.z.enum(["admin", "viewer", "agent", "scoped"]);
7616
+ const MethodAccessSchema = zod.z.enum(["view", "create", "delete"]);
7188
7617
  const AllowedProviderSchema = zod.z.union([zod.z.literal("*"), zod.z.array(zod.z.string())]);
7189
7618
  const AllowedDevicesSchema = zod.z.record(zod.z.string(), zod.z.union([zod.z.literal("*"), zod.z.array(zod.z.string())]));
7190
- const MethodAccessSchema = zod.z.enum(["view", "create", "delete"]);
7191
- const TokenScopeSchema = zod.z.object({
7192
- type: zod.z.enum(["addon", "capability"]),
7193
- target: zod.z.string(),
7194
- access: zod.z.array(MethodAccessSchema).min(1)
7195
- });
7619
+ const CapScopeSchema = zod.z.enum(["device", "system"]);
7620
+ const TokenScopeSchema = zod.z.discriminatedUnion("type", [
7621
+ zod.z.object({
7622
+ type: zod.z.literal("category"),
7623
+ target: CapScopeSchema,
7624
+ access: zod.z.array(MethodAccessSchema).min(1)
7625
+ }),
7626
+ zod.z.object({
7627
+ type: zod.z.literal("capability"),
7628
+ target: zod.z.string(),
7629
+ access: zod.z.array(MethodAccessSchema).min(1)
7630
+ }),
7631
+ zod.z.object({
7632
+ type: zod.z.literal("addon"),
7633
+ target: zod.z.string(),
7634
+ access: zod.z.array(MethodAccessSchema).min(1)
7635
+ }),
7636
+ zod.z.object({
7637
+ type: zod.z.literal("device"),
7638
+ /**
7639
+ * One or more deviceIds (serialised as strings for wire-format
7640
+ * consistency with the rest of the union). Matcher accepts if
7641
+ * `input.deviceId` ∈ `targets`. Array shape avoids the row-explosion
7642
+ * of one scope-per-device when granting access to a set of cameras.
7643
+ */
7644
+ targets: zod.z.array(zod.z.string()).min(1),
7645
+ access: zod.z.array(MethodAccessSchema).min(1)
7646
+ })
7647
+ ]);
7196
7648
  const UserRecordSchema = zod.z.object({
7197
7649
  id: zod.z.string(),
7198
7650
  username: zod.z.string(),
7199
7651
  passwordHash: zod.z.string(),
7200
- role: UserRoleSchema,
7652
+ /**
7653
+ * Admin bypass. When true, the middleware skips the scope-access
7654
+ * check entirely. There is no other axis of privilege; the legacy
7655
+ * role enum collapsed onto this boolean in v2.
7656
+ */
7657
+ isAdmin: zod.z.boolean().default(false),
7201
7658
  allowedProviders: AllowedProviderSchema,
7202
7659
  allowedDevices: AllowedDevicesSchema,
7203
7660
  /**
7204
- * Scopes granted to this user. Admins bypass; their `scopes` is ignored.
7205
- * Non-admins (`viewer`, `agent`, `scoped`) without scopes are locked out
7206
- * of every protected call.
7661
+ * Scopes granted to this user. Admins bypass; their `scopes` is
7662
+ * ignored. Non-admins without scopes are locked out of every
7663
+ * protected call.
7207
7664
  */
7208
7665
  scopes: zod.z.array(TokenScopeSchema).default([]),
7209
7666
  createdAt: zod.z.number(),
@@ -7212,7 +7669,7 @@ const UserRecordSchema = zod.z.object({
7212
7669
  const ApiKeyRecordSchema = zod.z.object({
7213
7670
  id: zod.z.string(),
7214
7671
  label: zod.z.string(),
7215
- role: UserRoleSchema,
7672
+ isAdmin: zod.z.boolean().default(false),
7216
7673
  allowedProviders: AllowedProviderSchema,
7217
7674
  allowedDevices: AllowedDevicesSchema,
7218
7675
  tokenHash: zod.z.string(),
@@ -7236,7 +7693,7 @@ const ScopedTokenSchema = zod.z.object({
7236
7693
  const UserSummarySchema = zod.z.object({
7237
7694
  id: zod.z.string(),
7238
7695
  username: zod.z.string(),
7239
- role: UserRoleSchema,
7696
+ isAdmin: zod.z.boolean().default(false),
7240
7697
  allowedProviders: zod.z.union([zod.z.array(zod.z.string()), zod.z.literal("*")]),
7241
7698
  allowedDevices: zod.z.record(zod.z.string(), zod.z.union([zod.z.array(zod.z.string()), zod.z.literal("*")])),
7242
7699
  scopes: zod.z.array(TokenScopeSchema).default([]),
@@ -7246,14 +7703,14 @@ const UserSummarySchema = zod.z.object({
7246
7703
  const CreateUserInputSchema = zod.z.object({
7247
7704
  username: zod.z.string(),
7248
7705
  password: zod.z.string().min(6),
7249
- role: UserRoleSchema,
7706
+ isAdmin: zod.z.boolean().default(false),
7250
7707
  allowedProviders: zod.z.union([zod.z.array(zod.z.string()), zod.z.literal("*")]).optional(),
7251
7708
  allowedDevices: zod.z.record(zod.z.string(), zod.z.union([zod.z.array(zod.z.string()), zod.z.literal("*")])).optional(),
7252
7709
  scopes: zod.z.array(TokenScopeSchema).optional()
7253
7710
  });
7254
7711
  const UpdateUserInputSchema = zod.z.object({
7255
7712
  id: zod.z.string(),
7256
- role: UserRoleSchema.optional(),
7713
+ isAdmin: zod.z.boolean().optional(),
7257
7714
  allowedProviders: zod.z.union([zod.z.array(zod.z.string()), zod.z.literal("*")]).optional(),
7258
7715
  allowedDevices: zod.z.record(zod.z.string(), zod.z.union([zod.z.array(zod.z.string()), zod.z.literal("*")])).optional(),
7259
7716
  scopes: zod.z.array(TokenScopeSchema).optional()
@@ -7261,7 +7718,7 @@ const UpdateUserInputSchema = zod.z.object({
7261
7718
  const ApiKeySummarySchema = zod.z.object({
7262
7719
  id: zod.z.string(),
7263
7720
  label: zod.z.string(),
7264
- role: UserRoleSchema,
7721
+ isAdmin: zod.z.boolean().default(false),
7265
7722
  allowedProviders: zod.z.union([zod.z.array(zod.z.string()), zod.z.literal("*")]).optional(),
7266
7723
  allowedDevices: zod.z.record(zod.z.string(), zod.z.union([zod.z.array(zod.z.string()), zod.z.literal("*")])).optional(),
7267
7724
  tokenPrefix: zod.z.string(),
@@ -7270,7 +7727,7 @@ const ApiKeySummarySchema = zod.z.object({
7270
7727
  });
7271
7728
  const CreateApiKeyInputSchema = zod.z.object({
7272
7729
  label: zod.z.string(),
7273
- role: UserRoleSchema,
7730
+ isAdmin: zod.z.boolean().default(false),
7274
7731
  allowedProviders: zod.z.union([zod.z.array(zod.z.string()), zod.z.literal("*")]).optional(),
7275
7732
  allowedDevices: zod.z.record(zod.z.string(), zod.z.union([zod.z.array(zod.z.string()), zod.z.literal("*")])).optional()
7276
7733
  });
@@ -7284,16 +7741,11 @@ const ScopedTokenSummarySchema = zod.z.object({
7284
7741
  name: zod.z.string(),
7285
7742
  tokenPrefix: zod.z.string(),
7286
7743
  scopes: zod.z.array(TokenScopeSchema),
7287
- // Mirror the storage schema: `.nullish()` accepts the SQLite-native
7288
- // `null` for absent timestamps as well as in-memory `undefined`.
7289
7744
  expiresAt: zod.z.number().nullish(),
7290
7745
  lastUsedAt: zod.z.number().nullish(),
7291
7746
  createdAt: zod.z.number()
7292
7747
  });
7293
7748
  const CreateScopedTokenInputSchema = zod.z.object({
7294
- // The owner the token is issued on behalf of. `adminProcedure` gates
7295
- // this call so an admin can mint tokens for any user; the CLI passes
7296
- // its own logged-in `user.id` here.
7297
7749
  userId: zod.z.string(),
7298
7750
  name: zod.z.string(),
7299
7751
  scopes: zod.z.array(TokenScopeSchema),
@@ -7303,45 +7755,85 @@ const CreateScopedTokenResultSchema = zod.z.object({
7303
7755
  token: zod.z.string(),
7304
7756
  record: ScopedTokenSummarySchema
7305
7757
  });
7758
+ const TotpSetupResultSchema = zod.z.object({
7759
+ secret: zod.z.string(),
7760
+ otpauthUrl: zod.z.string()
7761
+ });
7762
+ const TotpStatusSchema = zod.z.object({
7763
+ /** True iff `confirmedAt != null` — a pending half-enrollment is reported as `enabled: false`. */
7764
+ enabled: zod.z.boolean(),
7765
+ /** Null when no row exists OR the row is still pending confirmation. */
7766
+ confirmedAt: zod.z.number().nullable()
7767
+ });
7306
7768
  const userManagementCapability = {
7307
7769
  name: "user-management",
7308
7770
  scope: "system",
7309
7771
  mode: "singleton",
7310
7772
  methods: {
7311
- // ── Users ──────────────────────────────────────────────────────
7312
7773
  listUsers: method(zod.z.void(), zod.z.array(UserSummarySchema), { auth: "admin" }),
7313
- createUser: method(CreateUserInputSchema, UserSummarySchema, { kind: "mutation", auth: "admin" }),
7314
- updateUser: method(UpdateUserInputSchema, zod.z.object({ success: zod.z.literal(true) }), { kind: "mutation", auth: "admin" }),
7315
- deleteUser: method(zod.z.object({ id: zod.z.string() }), zod.z.object({ success: zod.z.literal(true) }), { kind: "mutation", auth: "admin" }),
7774
+ createUser: method(CreateUserInputSchema, UserSummarySchema, { kind: "mutation", auth: "admin", access: "create" }),
7775
+ updateUser: method(UpdateUserInputSchema, zod.z.object({ success: zod.z.literal(true) }), { kind: "mutation", auth: "admin", access: "create" }),
7776
+ deleteUser: method(zod.z.object({ id: zod.z.string() }), zod.z.object({ success: zod.z.literal(true) }), { kind: "mutation", auth: "admin", access: "delete" }),
7316
7777
  resetPassword: method(
7317
7778
  zod.z.object({ id: zod.z.string(), newPassword: zod.z.string().min(6) }),
7318
7779
  zod.z.object({ success: zod.z.literal(true) }),
7319
- { kind: "mutation", auth: "admin" }
7780
+ { kind: "mutation", auth: "admin", access: "create" }
7320
7781
  ),
7321
- /**
7322
- * Replace the scope set on a user. Subset check: the caller's scopes
7323
- * must include every requested scope+access (admin bypasses).
7324
- */
7325
7782
  setUserScopes: method(
7326
7783
  zod.z.object({ userId: zod.z.string(), scopes: zod.z.array(TokenScopeSchema) }),
7327
7784
  zod.z.object({ success: zod.z.literal(true) }),
7328
- { kind: "mutation", auth: "admin" }
7785
+ { kind: "mutation", auth: "admin", access: "create" }
7329
7786
  ),
7330
7787
  validateCredentials: method(
7331
7788
  zod.z.object({ username: zod.z.string(), password: zod.z.string() }),
7332
7789
  UserSummarySchema.extend({ passwordHash: zod.z.string() }).nullable(),
7333
- { kind: "mutation" }
7790
+ { kind: "mutation", access: "view" }
7334
7791
  ),
7335
- // ── API Keys ──────────────────────────────────────────────────
7336
7792
  listApiKeys: method(zod.z.void(), zod.z.array(ApiKeySummarySchema), { auth: "admin" }),
7337
- createApiKey: method(CreateApiKeyInputSchema, CreateApiKeyResultSchema, { kind: "mutation", auth: "admin" }),
7338
- revokeApiKey: method(zod.z.object({ id: zod.z.string() }), zod.z.object({ success: zod.z.literal(true) }), { kind: "mutation", auth: "admin" }),
7339
- validateApiKey: method(zod.z.object({ token: zod.z.string() }), ApiKeySummarySchema.nullable(), { kind: "mutation" }),
7340
- // ── Scoped Tokens ─────────────────────────────────────────────
7341
- createScopedToken: method(CreateScopedTokenInputSchema, CreateScopedTokenResultSchema, { kind: "mutation", auth: "admin" }),
7342
- revokeScopedToken: method(zod.z.object({ id: zod.z.string() }), zod.z.object({ success: zod.z.literal(true) }), { kind: "mutation", auth: "admin" }),
7343
- validateScopedToken: method(zod.z.object({ token: zod.z.string() }), ScopedTokenSummarySchema.nullable()),
7344
- listScopedTokens: method(zod.z.object({ userId: zod.z.string() }), zod.z.array(ScopedTokenSummarySchema), { auth: "admin" })
7793
+ createApiKey: method(CreateApiKeyInputSchema, CreateApiKeyResultSchema, { kind: "mutation", auth: "admin", access: "create" }),
7794
+ revokeApiKey: method(zod.z.object({ id: zod.z.string() }), zod.z.object({ success: zod.z.literal(true) }), { kind: "mutation", auth: "admin", access: "delete" }),
7795
+ validateApiKey: method(zod.z.object({ token: zod.z.string() }), ApiKeySummarySchema.nullable(), { kind: "mutation", access: "view" }),
7796
+ createScopedToken: method(CreateScopedTokenInputSchema, CreateScopedTokenResultSchema, { kind: "mutation", auth: "admin", access: "create" }),
7797
+ revokeScopedToken: method(zod.z.object({ id: zod.z.string() }), zod.z.object({ success: zod.z.literal(true) }), { kind: "mutation", auth: "admin", access: "delete" }),
7798
+ validateScopedToken: method(zod.z.object({ token: zod.z.string() }), ScopedTokenSummarySchema.nullable(), { access: "view" }),
7799
+ listScopedTokens: method(zod.z.object({ userId: zod.z.string() }), zod.z.array(ScopedTokenSummarySchema), { auth: "admin" }),
7800
+ // ── TOTP / 2FA ─────────────────────────────────────────────────
7801
+ //
7802
+ // Setup → Confirm → (Verify on login) → Disable.
7803
+ //
7804
+ // Admin-only for now: operator enrolls TOTP on a user's behalf by
7805
+ // pairing their authenticator with the returned QR. Self-service
7806
+ // enrollment is a follow-up (needs the cap framework to expose the
7807
+ // caller's identity to the provider so the provider can enforce
7808
+ // self-or-admin).
7809
+ setupTotp: method(
7810
+ zod.z.object({ userId: zod.z.string() }),
7811
+ TotpSetupResultSchema,
7812
+ { kind: "mutation", auth: "admin", access: "create" }
7813
+ ),
7814
+ confirmTotp: method(
7815
+ zod.z.object({ userId: zod.z.string(), code: zod.z.string() }),
7816
+ zod.z.object({ success: zod.z.literal(true) }),
7817
+ { kind: "mutation", auth: "admin", access: "create" }
7818
+ ),
7819
+ disableTotp: method(
7820
+ zod.z.object({ userId: zod.z.string() }),
7821
+ zod.z.object({ success: zod.z.literal(true) }),
7822
+ { kind: "mutation", auth: "admin", access: "delete" }
7823
+ ),
7824
+ getTotpStatus: method(
7825
+ zod.z.object({ userId: zod.z.string() }),
7826
+ TotpStatusSchema,
7827
+ { auth: "admin" }
7828
+ ),
7829
+ // Public (no `auth`) — used by the login flow's second-step
7830
+ // challenge endpoint. The userId comes from the password-validation
7831
+ // step (signed bridge token), so this method is not a free oracle.
7832
+ verifyTotp: method(
7833
+ zod.z.object({ userId: zod.z.string(), code: zod.z.string() }),
7834
+ zod.z.object({ valid: zod.z.boolean() }),
7835
+ { kind: "mutation", access: "view" }
7836
+ )
7345
7837
  }
7346
7838
  };
7347
7839
  const FeatureManifestSchema = zod.z.object({
@@ -8027,6 +8519,7 @@ exports.CameraCredentialsStatusSchema = CameraCredentialsStatusSchema;
8027
8519
  exports.CameraMetricsSchema = CameraMetricsSchema;
8028
8520
  exports.CameraMetricsWithDeviceIdSchema = CameraMetricsWithDeviceIdSchema;
8029
8521
  exports.CameraStreamSchema = CameraStreamSchema;
8522
+ exports.CapScopeSchema = CapScopeSchema;
8030
8523
  exports.CapabilityBindingsSchema = CapabilityBindingsSchema;
8031
8524
  exports.ChargingStatus = ChargingStatus;
8032
8525
  exports.ClientNetworkStatsSchema = ClientNetworkStatsSchema;
@@ -8081,6 +8574,9 @@ exports.FinalizeUploadInputSchema = FinalizeUploadInputSchema;
8081
8574
  exports.FrameInputSchema = FrameInputSchema;
8082
8575
  exports.GlobalMetricsSchema = GlobalMetricsSchema;
8083
8576
  exports.HWACCEL_OPTIONS = HWACCEL_OPTIONS;
8577
+ exports.HaServiceCallSchema = HaServiceCallSchema;
8578
+ exports.HaStateSchema = HaStateSchema;
8579
+ exports.HaStatusSchema = HaStatusSchema;
8084
8580
  exports.HealthStatusSchema = HealthStatusSchema;
8085
8581
  exports.HistoryPointSchema = HistoryPointSchema;
8086
8582
  exports.HistoryResolutionEnum = HistoryResolutionEnum;
@@ -8105,6 +8601,7 @@ exports.MotionSourcesSchema = MotionSourcesSchema;
8105
8601
  exports.MotionStatusSchema = MotionStatusSchema;
8106
8602
  exports.MotionTriggerRuntimeStateSchema = MotionTriggerRuntimeStateSchema;
8107
8603
  exports.MotionTriggerStatusSchema = MotionTriggerStatusSchema;
8604
+ exports.MqttStatusSchema = MqttStatusSchema;
8108
8605
  exports.NativeDetectionSchema = NativeDetectionSchema;
8109
8606
  exports.NativeObjectClassEnum = NativeObjectClassEnum;
8110
8607
  exports.NativeObjectDetectionStatusSchema = NativeObjectDetectionStatusSchema;
@@ -8125,6 +8622,7 @@ exports.PIPELINE_FLOW_CAPABILITY_NAMES = PIPELINE_FLOW_CAPABILITY_NAMES;
8125
8622
  exports.PIPELINE_OWNER_CAPABILITY_NAMES = PIPELINE_OWNER_CAPABILITY_NAMES;
8126
8623
  exports.PackageUpdateSchema = PackageUpdateSchema;
8127
8624
  exports.PackageVersionInfoSchema = PackageVersionInfoSchema;
8625
+ exports.PasskeySummarySchema = PasskeySummarySchema;
8128
8626
  exports.PcmSampleFormatSchema = PcmSampleFormatSchema;
8129
8627
  exports.PerScopeBreakdownSchema = PerScopeBreakdownSchema;
8130
8628
  exports.PipelineAssignmentSchema = PipelineAssignmentSchema;
@@ -8145,6 +8643,7 @@ exports.PtzAutotrackTargetOptionSchema = PtzAutotrackTargetOptionSchema;
8145
8643
  exports.PtzMoveCommandSchema = PtzMoveCommandSchema;
8146
8644
  exports.PtzPositionSchema = PtzPositionSchema;
8147
8645
  exports.PtzPresetSchema = PtzPresetSchema;
8646
+ exports.PublishInputSchema = PublishInputSchema;
8148
8647
  exports.QueryFilterSchema = QueryFilterSchema;
8149
8648
  exports.ReadChunkInputSchema = ReadChunkInputSchema;
8150
8649
  exports.RegisteredStreamSchema = RegisteredStreamSchema;
@@ -8161,12 +8660,16 @@ exports.ScopedTokenSchema = ScopedTokenSchema;
8161
8660
  exports.ScopedTokenSummarySchema = ScopedTokenSummarySchema;
8162
8661
  exports.SearchResultSchema = SearchResultSchema;
8163
8662
  exports.SegmentSchema = SegmentSchema;
8663
+ exports.SendEmailInputSchema = SendEmailInputSchema;
8664
+ exports.SendEmailResultSchema = SendEmailResultSchema;
8164
8665
  exports.SettingsPatchSchema = SettingsPatchSchema;
8165
8666
  exports.SettingsRecordSchema = SettingsRecordSchema;
8166
8667
  exports.SettingsSchemaWithValuesSchema = SettingsSchemaWithValuesSchema;
8167
8668
  exports.SettingsUpdateResultSchema = SettingsUpdateResultSchema;
8669
+ exports.SmtpStatusSchema = SmtpStatusSchema;
8168
8670
  exports.SnapshotImageSchema = SnapshotImageSchema;
8169
8671
  exports.SpatialDetectionSchema = SpatialDetectionSchema;
8672
+ exports.SsoBridgeClaimsSchema = SsoBridgeClaimsSchema;
8170
8673
  exports.StorageLocationRefSchema = StorageLocationRefSchema;
8171
8674
  exports.StorageLocationSchema = StorageLocationSchema;
8172
8675
  exports.StorageLocationTypeSchema = StorageLocationTypeSchema;
@@ -8175,6 +8678,8 @@ exports.StreamInfoSchema = StreamInfoSchema;
8175
8678
  exports.StreamNetworkStatsSchema = StreamNetworkStatsSchema;
8176
8679
  exports.StreamSourceEntrySchema = StreamSourceEntrySchema$1;
8177
8680
  exports.StreamSourceSchema = StreamSourceSchema;
8681
+ exports.SubscribeInputSchema = SubscribeInputSchema;
8682
+ exports.SubscriptionInfoSchema = SubscriptionInfoSchema;
8178
8683
  exports.SwitchStatusSchema = SwitchStatusSchema;
8179
8684
  exports.SystemMetricsSchema = SystemMetricsSchema;
8180
8685
  exports.TestConnectionResultSchema = TestConnectionResultSchema;
@@ -8192,7 +8697,6 @@ exports.TurnServerSchema = TurnServerSchema;
8192
8697
  exports.UpdateIntegrationInputSchema = UpdateIntegrationInputSchema;
8193
8698
  exports.UpdateUserInputSchema = UpdateUserInputSchema;
8194
8699
  exports.UserRecordSchema = UserRecordSchema;
8195
- exports.UserRoleSchema = UserRoleSchema;
8196
8700
  exports.UserSummarySchema = UserSummarySchema;
8197
8701
  exports.WELL_KNOWN_TABS = WELL_KNOWN_TABS;
8198
8702
  exports.WELL_KNOWN_TAB_MAP = WELL_KNOWN_TAB_MAP;
@@ -8250,6 +8754,7 @@ exports.eventsCapability = eventsCapability;
8250
8754
  exports.expandCapMethods = expandCapMethods;
8251
8755
  exports.featureProbeCapability = featureProbeCapability;
8252
8756
  exports.getAudioMacroClassIds = getAudioMacroClassIds;
8757
+ exports.homeAssistantCapability = homeAssistantCapability;
8253
8758
  exports.hydrateSchema = hydrateSchema;
8254
8759
  exports.integrationsCapability = integrationsCapability;
8255
8760
  exports.intercomCapability = intercomCapability;
@@ -8263,6 +8768,7 @@ exports.metricsProviderCapability = metricsProviderCapability;
8263
8768
  exports.motionCapability = motionCapability;
8264
8769
  exports.motionDetectionCapability = motionDetectionCapability;
8265
8770
  exports.motionTriggerCapability = motionTriggerCapability;
8771
+ exports.mqttProviderCapability = mqttProviderCapability;
8266
8772
  exports.nativeObjectDetectionCapability = nativeObjectDetectionCapability;
8267
8773
  exports.networkAccessCapability = networkAccessCapability;
8268
8774
  exports.networkQualityCapability = networkQualityCapability;
@@ -8283,8 +8789,10 @@ exports.remoteAccessCapability = remoteAccessCapability;
8283
8789
  exports.resolveDeviceProfile = resolveDeviceProfile;
8284
8790
  exports.restreamerCapability = restreamerCapability;
8285
8791
  exports.settingsStoreCapability = settingsStoreCapability;
8792
+ exports.smtpProviderCapability = smtpProviderCapability;
8286
8793
  exports.snapshotCapability = snapshotCapability;
8287
8794
  exports.snapshotProviderCapability = snapshotProviderCapability;
8795
+ exports.ssoBridgeCapability = ssoBridgeCapability;
8288
8796
  exports.storageCapability = storageCapability;
8289
8797
  exports.storageProviderCapability = storageProviderCapability;
8290
8798
  exports.streamBrokerCapability = streamBrokerCapability;
@@ -8295,10 +8803,11 @@ exports.toastCapability = toastCapability;
8295
8803
  exports.turnOrchestratorCapability = turnOrchestratorCapability;
8296
8804
  exports.turnProviderCapability = turnProviderCapability;
8297
8805
  exports.userManagementCapability = userManagementCapability;
8806
+ exports.userPasskeysCapability = userPasskeysCapability;
8298
8807
  exports.webrtcCapability = webrtcCapability;
8299
8808
  exports.webrtcClientHintsSchema = webrtcClientHintsSchema;
8300
8809
  exports.webrtcSessionCapability = webrtcSessionCapability;
8301
8810
  exports.zoneAnalyticsCapability = zoneAnalyticsCapability;
8302
8811
  exports.zoneRulesCapability = zoneRulesCapability;
8303
8812
  exports.zonesCapability = zonesCapability;
8304
- //# sourceMappingURL=index-s8uJNgNs.js.map
8813
+ //# sourceMappingURL=index-BKifir_y.js.map