@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.
- package/dist/addon/build-addon-route-provider.d.ts +55 -0
- package/dist/addon/build-addon-route-provider.d.ts.map +1 -0
- package/dist/capabilities/addon-routes.cap.d.ts +64 -0
- package/dist/capabilities/addon-routes.cap.d.ts.map +1 -1
- package/dist/capabilities/auth-provider.cap.d.ts +4 -4
- package/dist/capabilities/auth-provider.cap.d.ts.map +1 -1
- package/dist/capabilities/authentication.cap.d.ts +4 -0
- package/dist/capabilities/authentication.cap.d.ts.map +1 -1
- package/dist/capabilities/home-assistant.cap.d.ts +138 -0
- package/dist/capabilities/home-assistant.cap.d.ts.map +1 -0
- package/dist/capabilities/index.d.ts +16 -1
- package/dist/capabilities/index.d.ts.map +1 -1
- package/dist/capabilities/mesh-network.cap.d.ts +18 -0
- package/dist/capabilities/mesh-network.cap.d.ts.map +1 -1
- package/dist/capabilities/mqtt-provider.cap.d.ts +91 -0
- package/dist/capabilities/mqtt-provider.cap.d.ts.map +1 -0
- package/dist/capabilities/settings-store.cap.d.ts +8 -2
- package/dist/capabilities/settings-store.cap.d.ts.map +1 -1
- package/dist/capabilities/smtp-provider.cap.d.ts +62 -0
- package/dist/capabilities/smtp-provider.cap.d.ts.map +1 -0
- package/dist/capabilities/sso-bridge.cap.d.ts +58 -0
- package/dist/capabilities/sso-bridge.cap.d.ts.map +1 -0
- package/dist/capabilities/user-management.cap.d.ts +513 -184
- package/dist/capabilities/user-management.cap.d.ts.map +1 -1
- package/dist/capabilities/user-passkeys.cap.d.ts +92 -0
- package/dist/capabilities/user-passkeys.cap.d.ts.map +1 -0
- package/dist/enums/event-category.d.ts +8 -1
- package/dist/enums/event-category.d.ts.map +1 -1
- package/dist/generated/addon-api.d.ts +472 -86
- package/dist/generated/addon-api.d.ts.map +1 -1
- package/dist/generated/capability-router-map.d.ts +19 -4
- package/dist/generated/capability-router-map.d.ts.map +1 -1
- package/dist/generated/method-access-map.d.ts +6 -1
- package/dist/generated/method-access-map.d.ts.map +1 -1
- package/dist/generated/scope-presets.d.ts +17 -0
- package/dist/generated/scope-presets.d.ts.map +1 -0
- package/dist/generated/system-proxy.d.ts +2 -2
- package/dist/generated/system-proxy.d.ts.map +1 -1
- package/dist/{index-s8uJNgNs.js → index-BKifir_y.js} +557 -48
- package/dist/index-BKifir_y.js.map +1 -0
- package/dist/{index-DVKPWMwv.mjs → index-BKnvgAep.mjs} +852 -343
- package/dist/index-BKnvgAep.mjs.map +1 -0
- package/dist/index.d.ts +7 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +781 -498
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1038 -755
- package/dist/index.mjs.map +1 -1
- package/dist/interfaces/addon-routes.d.ts +8 -2
- package/dist/interfaces/addon-routes.d.ts.map +1 -1
- package/dist/interfaces/api-responses.d.ts +2 -3
- package/dist/interfaces/api-responses.d.ts.map +1 -1
- package/dist/interfaces/auth.d.ts +14 -11
- package/dist/interfaces/auth.d.ts.map +1 -1
- package/dist/interfaces/storage.d.ts +15 -2
- package/dist/interfaces/storage.d.ts.map +1 -1
- package/dist/node.js +1 -1
- package/dist/node.mjs +1 -1
- package/dist/schemas/auth-records.d.ts +105 -50
- package/dist/schemas/auth-records.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/index-DVKPWMwv.mjs.map +0 -1
- package/dist/index-s8uJNgNs.js.map +0 -1
- package/dist/interfaces/auth-provider.d.ts +0 -39
- package/dist/interfaces/auth-provider.d.ts.map +0 -1
|
@@ -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
|
-
|
|
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
|
|
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
|
|
7191
|
-
const TokenScopeSchema = zod.z.
|
|
7192
|
-
|
|
7193
|
-
|
|
7194
|
-
|
|
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
|
-
|
|
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
|
|
7205
|
-
* Non-admins
|
|
7206
|
-
*
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
7341
|
-
|
|
7342
|
-
|
|
7343
|
-
|
|
7344
|
-
|
|
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-
|
|
8813
|
+
//# sourceMappingURL=index-BKifir_y.js.map
|