@fuzdev/fuz_app 0.29.0 → 0.31.0
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/actions/CLAUDE.md +630 -0
- package/dist/actions/action_rpc.d.ts +29 -0
- package/dist/actions/action_rpc.d.ts.map +1 -1
- package/dist/actions/action_rpc.js +42 -6
- package/dist/actions/action_types.d.ts +2 -2
- package/dist/actions/cancel.d.ts +12 -13
- package/dist/actions/cancel.d.ts.map +1 -1
- package/dist/actions/cancel.js +10 -13
- package/dist/actions/heartbeat.d.ts +8 -13
- package/dist/actions/heartbeat.d.ts.map +1 -1
- package/dist/actions/heartbeat.js +5 -8
- package/dist/actions/register_action_ws.d.ts +3 -3
- package/dist/actions/register_action_ws.js +2 -2
- package/dist/actions/register_ws_endpoint.d.ts +4 -4
- package/dist/actions/register_ws_endpoint.d.ts.map +1 -1
- package/dist/actions/register_ws_endpoint.js +3 -3
- package/dist/actions/socket.svelte.d.ts +16 -16
- package/dist/actions/socket.svelte.d.ts.map +1 -1
- package/dist/actions/socket.svelte.js +15 -15
- package/dist/actions/transports_ws_auth_guard.d.ts.map +1 -1
- package/dist/actions/transports_ws_backend.d.ts +15 -0
- package/dist/actions/transports_ws_backend.d.ts.map +1 -1
- package/dist/actions/transports_ws_backend.js +17 -0
- package/dist/auth/CLAUDE.md +923 -0
- package/dist/auth/account_action_specs.d.ts +216 -0
- package/dist/auth/account_action_specs.d.ts.map +1 -0
- package/dist/auth/account_action_specs.js +159 -0
- package/dist/auth/account_actions.d.ts +51 -0
- package/dist/auth/account_actions.d.ts.map +1 -0
- package/dist/auth/account_actions.js +119 -0
- package/dist/auth/account_queries.d.ts +6 -2
- package/dist/auth/account_queries.d.ts.map +1 -1
- package/dist/auth/account_queries.js +40 -4
- package/dist/auth/account_routes.d.ts +94 -16
- package/dist/auth/account_routes.d.ts.map +1 -1
- package/dist/auth/account_routes.js +108 -180
- package/dist/auth/account_schema.d.ts +85 -30
- package/dist/auth/account_schema.d.ts.map +1 -1
- package/dist/auth/account_schema.js +40 -8
- package/dist/auth/admin_action_specs.d.ts +674 -0
- package/dist/auth/admin_action_specs.d.ts.map +1 -0
- package/dist/auth/admin_action_specs.js +287 -0
- package/dist/auth/admin_actions.d.ts +69 -0
- package/dist/auth/admin_actions.d.ts.map +1 -0
- package/dist/auth/admin_actions.js +256 -0
- package/dist/auth/api_token.d.ts +10 -0
- package/dist/auth/api_token.d.ts.map +1 -1
- package/dist/auth/api_token.js +9 -0
- package/dist/auth/api_token_queries.d.ts +3 -3
- package/dist/auth/api_token_queries.js +3 -3
- package/dist/auth/app_settings_schema.d.ts +4 -3
- package/dist/auth/app_settings_schema.d.ts.map +1 -1
- package/dist/auth/app_settings_schema.js +2 -1
- package/dist/auth/audit_log_routes.d.ts +14 -6
- package/dist/auth/audit_log_routes.d.ts.map +1 -1
- package/dist/auth/audit_log_routes.js +22 -79
- package/dist/auth/audit_log_schema.d.ts +100 -29
- package/dist/auth/audit_log_schema.d.ts.map +1 -1
- package/dist/auth/audit_log_schema.js +83 -11
- package/dist/auth/bootstrap_routes.d.ts +14 -0
- package/dist/auth/bootstrap_routes.d.ts.map +1 -1
- package/dist/auth/bootstrap_routes.js +10 -3
- package/dist/auth/cleanup.d.ts +63 -0
- package/dist/auth/cleanup.d.ts.map +1 -0
- package/dist/auth/cleanup.js +80 -0
- package/dist/auth/invite_schema.d.ts +11 -10
- package/dist/auth/invite_schema.d.ts.map +1 -1
- package/dist/auth/invite_schema.js +4 -3
- package/dist/auth/migrations.d.ts +6 -0
- package/dist/auth/migrations.d.ts.map +1 -1
- package/dist/auth/migrations.js +28 -0
- package/dist/auth/permit_offer_action_specs.d.ts +364 -0
- package/dist/auth/permit_offer_action_specs.d.ts.map +1 -0
- package/dist/auth/permit_offer_action_specs.js +216 -0
- package/dist/auth/permit_offer_actions.d.ts +96 -0
- package/dist/auth/permit_offer_actions.d.ts.map +1 -0
- package/dist/auth/permit_offer_actions.js +428 -0
- package/dist/auth/permit_offer_notifications.d.ts +361 -0
- package/dist/auth/permit_offer_notifications.d.ts.map +1 -0
- package/dist/auth/permit_offer_notifications.js +179 -0
- package/dist/auth/permit_offer_queries.d.ts +165 -0
- package/dist/auth/permit_offer_queries.d.ts.map +1 -0
- package/dist/auth/permit_offer_queries.js +390 -0
- package/dist/auth/permit_offer_schema.d.ts +103 -0
- package/dist/auth/permit_offer_schema.d.ts.map +1 -0
- package/dist/auth/permit_offer_schema.js +142 -0
- package/dist/auth/permit_queries.d.ts +77 -14
- package/dist/auth/permit_queries.d.ts.map +1 -1
- package/dist/auth/permit_queries.js +119 -24
- package/dist/auth/session_queries.d.ts +4 -2
- package/dist/auth/session_queries.d.ts.map +1 -1
- package/dist/auth/session_queries.js +4 -2
- package/dist/auth/signup_routes.d.ts +13 -0
- package/dist/auth/signup_routes.d.ts.map +1 -1
- package/dist/auth/signup_routes.js +14 -7
- package/dist/http/CLAUDE.md +584 -0
- package/dist/http/pending_effects.d.ts +29 -0
- package/dist/http/pending_effects.d.ts.map +1 -0
- package/dist/http/pending_effects.js +31 -0
- package/dist/http/route_spec.d.ts.map +1 -1
- package/dist/http/route_spec.js +4 -3
- package/dist/rate_limiter.d.ts +30 -0
- package/dist/rate_limiter.d.ts.map +1 -1
- package/dist/rate_limiter.js +25 -2
- package/dist/realtime/sse_auth_guard.d.ts +2 -0
- package/dist/realtime/sse_auth_guard.d.ts.map +1 -1
- package/dist/realtime/sse_auth_guard.js +5 -3
- package/dist/testing/CLAUDE.md +668 -1
- package/dist/testing/admin_integration.d.ts +10 -7
- package/dist/testing/admin_integration.d.ts.map +1 -1
- package/dist/testing/admin_integration.js +382 -482
- package/dist/testing/app_server.d.ts +7 -6
- package/dist/testing/app_server.d.ts.map +1 -1
- package/dist/testing/attack_surface.d.ts +9 -3
- package/dist/testing/attack_surface.d.ts.map +1 -1
- package/dist/testing/attack_surface.js +4 -4
- package/dist/testing/audit_completeness.d.ts +6 -0
- package/dist/testing/audit_completeness.d.ts.map +1 -1
- package/dist/testing/audit_completeness.js +158 -134
- package/dist/testing/auth_apps.d.ts.map +1 -1
- package/dist/testing/auth_apps.js +4 -33
- package/dist/testing/db.d.ts +1 -1
- package/dist/testing/db.d.ts.map +1 -1
- package/dist/testing/db.js +2 -0
- package/dist/testing/entities.d.ts +35 -13
- package/dist/testing/entities.d.ts.map +1 -1
- package/dist/testing/entities.js +17 -0
- package/dist/testing/integration.d.ts +10 -0
- package/dist/testing/integration.d.ts.map +1 -1
- package/dist/testing/integration.js +352 -340
- package/dist/testing/integration_helpers.d.ts +16 -5
- package/dist/testing/integration_helpers.d.ts.map +1 -1
- package/dist/testing/integration_helpers.js +24 -4
- package/dist/testing/rate_limiting.d.ts +7 -0
- package/dist/testing/rate_limiting.d.ts.map +1 -1
- package/dist/testing/rate_limiting.js +41 -10
- package/dist/testing/rpc_helpers.d.ts +153 -1
- package/dist/testing/rpc_helpers.d.ts.map +1 -1
- package/dist/testing/rpc_helpers.js +184 -8
- package/dist/testing/sse_round_trip.d.ts +8 -0
- package/dist/testing/sse_round_trip.d.ts.map +1 -1
- package/dist/testing/sse_round_trip.js +10 -3
- package/dist/testing/standard.d.ts +9 -1
- package/dist/testing/standard.d.ts.map +1 -1
- package/dist/testing/standard.js +6 -2
- package/dist/testing/surface_invariants.d.ts +7 -3
- package/dist/testing/surface_invariants.d.ts.map +1 -1
- package/dist/testing/surface_invariants.js +5 -4
- package/dist/testing/ws_round_trip.d.ts.map +1 -1
- package/dist/testing/ws_round_trip.js +9 -38
- package/dist/ui/AccountSessions.svelte +8 -4
- package/dist/ui/AccountSessions.svelte.d.ts.map +1 -1
- package/dist/ui/AdminAccounts.svelte +61 -33
- package/dist/ui/AdminAccounts.svelte.d.ts.map +1 -1
- package/dist/ui/AdminAuditLog.svelte +3 -2
- package/dist/ui/AdminAuditLog.svelte.d.ts.map +1 -1
- package/dist/ui/AdminInvites.svelte +3 -2
- package/dist/ui/AdminInvites.svelte.d.ts.map +1 -1
- package/dist/ui/AdminOverview.svelte +14 -9
- package/dist/ui/AdminOverview.svelte.d.ts.map +1 -1
- package/dist/ui/AdminPermitHistory.svelte +3 -2
- package/dist/ui/AdminPermitHistory.svelte.d.ts.map +1 -1
- package/dist/ui/AdminSessions.svelte +29 -25
- package/dist/ui/AdminSessions.svelte.d.ts.map +1 -1
- package/dist/ui/CLAUDE.md +351 -0
- package/dist/ui/OpenSignupToggle.svelte +6 -3
- package/dist/ui/OpenSignupToggle.svelte.d.ts.map +1 -1
- package/dist/ui/PermitOfferForm.svelte +141 -0
- package/dist/ui/PermitOfferForm.svelte.d.ts +14 -0
- package/dist/ui/PermitOfferForm.svelte.d.ts.map +1 -0
- package/dist/ui/PermitOfferHistory.svelte +109 -0
- package/dist/ui/PermitOfferHistory.svelte.d.ts +11 -0
- package/dist/ui/PermitOfferHistory.svelte.d.ts.map +1 -0
- package/dist/ui/PermitOfferInbox.svelte +121 -0
- package/dist/ui/PermitOfferInbox.svelte.d.ts +12 -0
- package/dist/ui/PermitOfferInbox.svelte.d.ts.map +1 -0
- package/dist/ui/account_sessions_state.svelte.d.ts +53 -3
- package/dist/ui/account_sessions_state.svelte.d.ts.map +1 -1
- package/dist/ui/account_sessions_state.svelte.js +39 -16
- package/dist/ui/admin_accounts_state.svelte.d.ts +118 -2
- package/dist/ui/admin_accounts_state.svelte.d.ts.map +1 -1
- package/dist/ui/admin_accounts_state.svelte.js +99 -23
- package/dist/ui/admin_invites_state.svelte.d.ts +47 -1
- package/dist/ui/admin_invites_state.svelte.d.ts.map +1 -1
- package/dist/ui/admin_invites_state.svelte.js +38 -26
- package/dist/ui/admin_sessions_state.svelte.d.ts +26 -0
- package/dist/ui/admin_sessions_state.svelte.d.ts.map +1 -1
- package/dist/ui/admin_sessions_state.svelte.js +35 -21
- package/dist/ui/app_settings_state.svelte.d.ts +39 -0
- package/dist/ui/app_settings_state.svelte.d.ts.map +1 -1
- package/dist/ui/app_settings_state.svelte.js +34 -18
- package/dist/ui/audit_log_state.svelte.d.ts +40 -3
- package/dist/ui/audit_log_state.svelte.d.ts.map +1 -1
- package/dist/ui/audit_log_state.svelte.js +36 -42
- package/dist/ui/auth_state.svelte.d.ts +4 -3
- package/dist/ui/auth_state.svelte.d.ts.map +1 -1
- package/dist/ui/auth_state.svelte.js +4 -1
- package/dist/ui/permit_offers_state.svelte.d.ts +125 -0
- package/dist/ui/permit_offers_state.svelte.d.ts.map +1 -0
- package/dist/ui/permit_offers_state.svelte.js +197 -0
- package/package.json +3 -3
- package/dist/auth/admin_routes.d.ts +0 -29
- package/dist/auth/admin_routes.d.ts.map +0 -1
- package/dist/auth/admin_routes.js +0 -226
- package/dist/auth/app_settings_routes.d.ts +0 -27
- package/dist/auth/app_settings_routes.d.ts.map +0 -1
- package/dist/auth/app_settings_routes.js +0 -66
- package/dist/auth/invite_routes.d.ts +0 -18
- package/dist/auth/invite_routes.d.ts.map +0 -1
- package/dist/auth/invite_routes.js +0 -129
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* @module
|
|
11
11
|
*/
|
|
12
12
|
import { z } from 'zod';
|
|
13
|
+
import { Uuid } from '../uuid.js';
|
|
13
14
|
/** Minimum username length (must have start + middle + end characters). */
|
|
14
15
|
export declare const USERNAME_LENGTH_MIN = 3;
|
|
15
16
|
/** Maximum username length (matches GitHub's limit). */
|
|
@@ -27,19 +28,19 @@ export declare const Email: z.ZodEmail;
|
|
|
27
28
|
export type Email = z.infer<typeof Email>;
|
|
28
29
|
/** Account — authentication identity. You log in as an account. */
|
|
29
30
|
export interface Account {
|
|
30
|
-
id:
|
|
31
|
+
id: Uuid;
|
|
31
32
|
username: Username;
|
|
32
33
|
email: Email | null;
|
|
33
34
|
email_verified: boolean;
|
|
34
35
|
password_hash: string;
|
|
35
36
|
created_at: string;
|
|
36
|
-
created_by:
|
|
37
|
+
created_by: Uuid | null;
|
|
37
38
|
updated_at: string;
|
|
38
|
-
updated_by:
|
|
39
|
+
updated_by: Uuid | null;
|
|
39
40
|
}
|
|
40
41
|
/** Account without sensitive fields, scoped to the authenticated user's own session. */
|
|
41
42
|
export interface SessionAccount {
|
|
42
|
-
id:
|
|
43
|
+
id: Uuid;
|
|
43
44
|
username: Username;
|
|
44
45
|
email: Email | null;
|
|
45
46
|
email_verified: boolean;
|
|
@@ -47,29 +48,45 @@ export interface SessionAccount {
|
|
|
47
48
|
}
|
|
48
49
|
/** Actor — the entity that acts. Owns cells, holds permits, appears in audit trails. */
|
|
49
50
|
export interface Actor {
|
|
50
|
-
id:
|
|
51
|
-
account_id:
|
|
51
|
+
id: Uuid;
|
|
52
|
+
account_id: Uuid;
|
|
52
53
|
name: string;
|
|
53
54
|
created_at: string;
|
|
54
55
|
updated_at: string | null;
|
|
55
|
-
updated_by:
|
|
56
|
+
updated_by: Uuid | null;
|
|
56
57
|
}
|
|
58
|
+
/**
|
|
59
|
+
* Maximum length of the optional free-form `revoked_reason` attached to a
|
|
60
|
+
* revoked permit. Bounds the value at the schema layer so both the admin
|
|
61
|
+
* input (when the route surfaces a reason field) and the revokee-facing
|
|
62
|
+
* `permit_revoke` WS notification validate against the same ceiling.
|
|
63
|
+
*/
|
|
64
|
+
export declare const PERMIT_REVOKED_REASON_LENGTH_MAX = 500;
|
|
57
65
|
/** Permit — time-bounded, revocable grant of a role to an actor. */
|
|
58
66
|
export interface Permit {
|
|
59
|
-
id:
|
|
60
|
-
actor_id:
|
|
67
|
+
id: Uuid;
|
|
68
|
+
actor_id: Uuid;
|
|
61
69
|
role: string;
|
|
70
|
+
/** Resource scope this grant applies to (e.g. a classroom id). `null` for global permits. */
|
|
71
|
+
scope_id: Uuid | null;
|
|
62
72
|
created_at: string;
|
|
63
73
|
expires_at: string | null;
|
|
64
74
|
revoked_at: string | null;
|
|
65
|
-
revoked_by:
|
|
66
|
-
|
|
75
|
+
revoked_by: Uuid | null;
|
|
76
|
+
/** Optional free-form reason attached on revoke (surfaced in the revokee WS notification once it lands). */
|
|
77
|
+
revoked_reason: string | null;
|
|
78
|
+
granted_by: Uuid | null;
|
|
79
|
+
/** Offer that produced this permit (set by `query_accept_offer`). `null` for direct grants. */
|
|
80
|
+
source_offer_id: Uuid | null;
|
|
67
81
|
}
|
|
68
|
-
export declare const is_permit_active: (p:
|
|
82
|
+
export declare const is_permit_active: (p: {
|
|
83
|
+
revoked_at?: string | null;
|
|
84
|
+
expires_at: string | null;
|
|
85
|
+
}, now?: Date) => boolean;
|
|
69
86
|
/** Server-side auth session, keyed by blake3 hash of session token. */
|
|
70
87
|
export interface AuthSession {
|
|
71
88
|
id: string;
|
|
72
|
-
account_id:
|
|
89
|
+
account_id: Uuid;
|
|
73
90
|
created_at: string;
|
|
74
91
|
expires_at: string;
|
|
75
92
|
last_seen_at: string;
|
|
@@ -77,7 +94,7 @@ export interface AuthSession {
|
|
|
77
94
|
/** API token for CLI/programmatic access. */
|
|
78
95
|
export interface ApiToken {
|
|
79
96
|
id: string;
|
|
80
|
-
account_id:
|
|
97
|
+
account_id: Uuid;
|
|
81
98
|
name: string;
|
|
82
99
|
token_hash: string;
|
|
83
100
|
expires_at: string | null;
|
|
@@ -87,7 +104,7 @@ export interface ApiToken {
|
|
|
87
104
|
}
|
|
88
105
|
/** Zod schema for `SessionAccount` — account without sensitive fields. */
|
|
89
106
|
export declare const SessionAccountJson: z.ZodObject<{
|
|
90
|
-
id: z.
|
|
107
|
+
id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
|
|
91
108
|
username: z.ZodString;
|
|
92
109
|
email: z.ZodNullable<z.ZodEmail>;
|
|
93
110
|
email_verified: z.ZodBoolean;
|
|
@@ -97,7 +114,7 @@ export type SessionAccountJson = z.infer<typeof SessionAccountJson>;
|
|
|
97
114
|
/** Zod schema for `AuthSession` — id is the blake3 hash, safe for client. */
|
|
98
115
|
export declare const AuthSessionJson: z.ZodObject<{
|
|
99
116
|
id: z.ZodString;
|
|
100
|
-
account_id: z.
|
|
117
|
+
account_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
|
|
101
118
|
created_at: z.ZodString;
|
|
102
119
|
expires_at: z.ZodString;
|
|
103
120
|
last_seen_at: z.ZodString;
|
|
@@ -106,7 +123,7 @@ export type AuthSessionJson = z.infer<typeof AuthSessionJson>;
|
|
|
106
123
|
/** Zod schema for client-safe API token listing (excludes `token_hash`). */
|
|
107
124
|
export declare const ClientApiTokenJson: z.ZodObject<{
|
|
108
125
|
id: z.ZodString;
|
|
109
|
-
account_id: z.
|
|
126
|
+
account_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
|
|
110
127
|
name: z.ZodString;
|
|
111
128
|
expires_at: z.ZodNullable<z.ZodString>;
|
|
112
129
|
last_used_at: z.ZodNullable<z.ZodString>;
|
|
@@ -116,51 +133,85 @@ export declare const ClientApiTokenJson: z.ZodObject<{
|
|
|
116
133
|
export type ClientApiTokenJson = z.infer<typeof ClientApiTokenJson>;
|
|
117
134
|
/** Zod schema for the permit summary returned in admin account listings. */
|
|
118
135
|
export declare const PermitSummaryJson: z.ZodObject<{
|
|
119
|
-
id: z.
|
|
136
|
+
id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
|
|
120
137
|
role: z.ZodString;
|
|
138
|
+
scope_id: z.ZodNullable<z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">>;
|
|
121
139
|
created_at: z.ZodString;
|
|
122
140
|
expires_at: z.ZodNullable<z.ZodString>;
|
|
123
|
-
granted_by: z.ZodNullable<z.
|
|
141
|
+
granted_by: z.ZodNullable<z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">>;
|
|
124
142
|
}, z.core.$strict>;
|
|
125
143
|
export type PermitSummaryJson = z.infer<typeof PermitSummaryJson>;
|
|
126
144
|
/** Zod schema for the actor summary returned in admin account listings. */
|
|
127
145
|
export declare const ActorSummaryJson: z.ZodObject<{
|
|
128
|
-
id: z.
|
|
146
|
+
id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
|
|
129
147
|
name: z.ZodString;
|
|
130
148
|
}, z.core.$strict>;
|
|
131
149
|
export type ActorSummaryJson = z.infer<typeof ActorSummaryJson>;
|
|
132
150
|
/** Zod schema for admin-facing account data — extends `SessionAccountJson` with audit fields. */
|
|
133
151
|
export declare const AdminAccountJson: z.ZodObject<{
|
|
134
|
-
id: z.
|
|
152
|
+
id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
|
|
135
153
|
username: z.ZodString;
|
|
136
154
|
email: z.ZodNullable<z.ZodEmail>;
|
|
137
155
|
email_verified: z.ZodBoolean;
|
|
138
156
|
created_at: z.ZodString;
|
|
139
157
|
updated_at: z.ZodString;
|
|
140
|
-
updated_by: z.ZodNullable<z.
|
|
158
|
+
updated_by: z.ZodNullable<z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">>;
|
|
141
159
|
}, z.core.$strict>;
|
|
142
160
|
export type AdminAccountJson = z.infer<typeof AdminAccountJson>;
|
|
143
|
-
/**
|
|
161
|
+
/**
|
|
162
|
+
* Zod schema for a pending permit offer surfaced in admin account listings.
|
|
163
|
+
*
|
|
164
|
+
* Deliberately narrower than `PermitOfferJson`: omits `message` and
|
|
165
|
+
* `decline_reason` so cross-admin visibility of the listing does not expose
|
|
166
|
+
* grantor-authored text that the audit log also withholds. Full offer
|
|
167
|
+
* payloads remain available through the offer-specific RPC surface and the
|
|
168
|
+
* audit log when admins need them.
|
|
169
|
+
*
|
|
170
|
+
* `from_username` is resolved server-side so multi-admin deployments can see
|
|
171
|
+
* at a glance whose pending offer is blocking a "+ {role}" button; the
|
|
172
|
+
* resolution runs inside the listing query's parallel batch.
|
|
173
|
+
*/
|
|
174
|
+
export declare const PendingOfferSummaryJson: z.ZodObject<{
|
|
175
|
+
id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
|
|
176
|
+
role: z.ZodString;
|
|
177
|
+
scope_id: z.ZodNullable<z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">>;
|
|
178
|
+
from_actor_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
|
|
179
|
+
from_username: z.ZodString;
|
|
180
|
+
created_at: z.ZodString;
|
|
181
|
+
expires_at: z.ZodString;
|
|
182
|
+
}, z.core.$strict>;
|
|
183
|
+
export type PendingOfferSummaryJson = z.infer<typeof PendingOfferSummaryJson>;
|
|
184
|
+
/** Zod schema for an admin account listing entry (account + actor + permits + pending offers). */
|
|
144
185
|
export declare const AdminAccountEntryJson: z.ZodObject<{
|
|
145
186
|
account: z.ZodObject<{
|
|
146
|
-
id: z.
|
|
187
|
+
id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
|
|
147
188
|
username: z.ZodString;
|
|
148
189
|
email: z.ZodNullable<z.ZodEmail>;
|
|
149
190
|
email_verified: z.ZodBoolean;
|
|
150
191
|
created_at: z.ZodString;
|
|
151
192
|
updated_at: z.ZodString;
|
|
152
|
-
updated_by: z.ZodNullable<z.
|
|
193
|
+
updated_by: z.ZodNullable<z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">>;
|
|
153
194
|
}, z.core.$strict>;
|
|
154
195
|
actor: z.ZodNullable<z.ZodObject<{
|
|
155
|
-
id: z.
|
|
196
|
+
id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
|
|
156
197
|
name: z.ZodString;
|
|
157
198
|
}, z.core.$strict>>;
|
|
158
199
|
permits: z.ZodArray<z.ZodObject<{
|
|
159
|
-
id: z.
|
|
200
|
+
id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
|
|
160
201
|
role: z.ZodString;
|
|
202
|
+
scope_id: z.ZodNullable<z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">>;
|
|
161
203
|
created_at: z.ZodString;
|
|
162
204
|
expires_at: z.ZodNullable<z.ZodString>;
|
|
163
|
-
granted_by: z.ZodNullable<z.
|
|
205
|
+
granted_by: z.ZodNullable<z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">>;
|
|
206
|
+
}, z.core.$strict>>;
|
|
207
|
+
pending_offers: z.ZodArray<z.ZodObject<{
|
|
208
|
+
id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
|
|
209
|
+
role: z.ZodString;
|
|
210
|
+
scope_id: z.ZodNullable<z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">>;
|
|
211
|
+
from_actor_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
|
|
212
|
+
from_username: z.ZodString;
|
|
213
|
+
created_at: z.ZodString;
|
|
214
|
+
expires_at: z.ZodString;
|
|
164
215
|
}, z.core.$strict>>;
|
|
165
216
|
}, z.core.$strict>;
|
|
166
217
|
export type AdminAccountEntryJson = z.infer<typeof AdminAccountEntryJson>;
|
|
@@ -170,10 +221,14 @@ export interface CreateAccountInput {
|
|
|
170
221
|
email?: Email | null;
|
|
171
222
|
}
|
|
172
223
|
export interface GrantPermitInput {
|
|
173
|
-
actor_id:
|
|
224
|
+
actor_id: Uuid;
|
|
174
225
|
role: string;
|
|
226
|
+
/** Scope the grant applies to. `null` / omitted grants a global permit. */
|
|
227
|
+
scope_id?: Uuid | null;
|
|
175
228
|
expires_at?: Date | null;
|
|
176
|
-
granted_by:
|
|
229
|
+
granted_by: Uuid | null;
|
|
230
|
+
/** Offer id that produced this permit. Set by `query_accept_offer`; leave unset for direct grants. */
|
|
231
|
+
source_offer_id?: Uuid | null;
|
|
177
232
|
}
|
|
178
233
|
/**
|
|
179
234
|
* Convert an `Account` to a `SessionAccount` by stripping sensitive fields.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account_schema.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/account_schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"account_schema.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/account_schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* @module
|
|
11
11
|
*/
|
|
12
12
|
import { z } from 'zod';
|
|
13
|
+
import { Uuid } from '../uuid.js';
|
|
13
14
|
// TODO consider `.brand()` on Username and Email for compile-time safety
|
|
14
15
|
/** Minimum username length (must have start + middle + end characters). */
|
|
15
16
|
export const USERNAME_LENGTH_MIN = 3;
|
|
@@ -27,11 +28,18 @@ export const Username = z
|
|
|
27
28
|
export const UsernameProvided = z.string().min(1).max(USERNAME_PROVIDED_LENGTH_MAX);
|
|
28
29
|
/** Email validation. */
|
|
29
30
|
export const Email = z.email();
|
|
31
|
+
/**
|
|
32
|
+
* Maximum length of the optional free-form `revoked_reason` attached to a
|
|
33
|
+
* revoked permit. Bounds the value at the schema layer so both the admin
|
|
34
|
+
* input (when the route surfaces a reason field) and the revokee-facing
|
|
35
|
+
* `permit_revoke` WS notification validate against the same ceiling.
|
|
36
|
+
*/
|
|
37
|
+
export const PERMIT_REVOKED_REASON_LENGTH_MAX = 500;
|
|
30
38
|
export const is_permit_active = (p, now = new Date()) => !p.revoked_at && (!p.expires_at || new Date(p.expires_at) > now);
|
|
31
39
|
// Client-safe Zod schemas — for route output validation and ActionSpec outputs.
|
|
32
40
|
/** Zod schema for `SessionAccount` — account without sensitive fields. */
|
|
33
41
|
export const SessionAccountJson = z.strictObject({
|
|
34
|
-
id:
|
|
42
|
+
id: Uuid,
|
|
35
43
|
username: Username,
|
|
36
44
|
email: Email.nullable(),
|
|
37
45
|
email_verified: z.boolean(),
|
|
@@ -40,7 +48,7 @@ export const SessionAccountJson = z.strictObject({
|
|
|
40
48
|
/** Zod schema for `AuthSession` — id is the blake3 hash, safe for client. */
|
|
41
49
|
export const AuthSessionJson = z.strictObject({
|
|
42
50
|
id: z.string(),
|
|
43
|
-
account_id:
|
|
51
|
+
account_id: Uuid,
|
|
44
52
|
created_at: z.string(),
|
|
45
53
|
expires_at: z.string(),
|
|
46
54
|
last_seen_at: z.string(),
|
|
@@ -48,7 +56,7 @@ export const AuthSessionJson = z.strictObject({
|
|
|
48
56
|
/** Zod schema for client-safe API token listing (excludes `token_hash`). */
|
|
49
57
|
export const ClientApiTokenJson = z.strictObject({
|
|
50
58
|
id: z.string(),
|
|
51
|
-
account_id:
|
|
59
|
+
account_id: Uuid,
|
|
52
60
|
name: z.string(),
|
|
53
61
|
expires_at: z.string().nullable(),
|
|
54
62
|
last_used_at: z.string().nullable(),
|
|
@@ -57,27 +65,51 @@ export const ClientApiTokenJson = z.strictObject({
|
|
|
57
65
|
});
|
|
58
66
|
/** Zod schema for the permit summary returned in admin account listings. */
|
|
59
67
|
export const PermitSummaryJson = z.strictObject({
|
|
60
|
-
id:
|
|
68
|
+
id: Uuid,
|
|
61
69
|
role: z.string(),
|
|
70
|
+
scope_id: Uuid.nullable(),
|
|
62
71
|
created_at: z.string(),
|
|
63
72
|
expires_at: z.string().nullable(),
|
|
64
|
-
granted_by:
|
|
73
|
+
granted_by: Uuid.nullable(),
|
|
65
74
|
});
|
|
66
75
|
/** Zod schema for the actor summary returned in admin account listings. */
|
|
67
76
|
export const ActorSummaryJson = z.strictObject({
|
|
68
|
-
id:
|
|
77
|
+
id: Uuid,
|
|
69
78
|
name: z.string(),
|
|
70
79
|
});
|
|
71
80
|
/** Zod schema for admin-facing account data — extends `SessionAccountJson` with audit fields. */
|
|
72
81
|
export const AdminAccountJson = SessionAccountJson.extend({
|
|
73
82
|
updated_at: z.string(),
|
|
74
|
-
updated_by:
|
|
83
|
+
updated_by: Uuid.nullable(),
|
|
84
|
+
});
|
|
85
|
+
/**
|
|
86
|
+
* Zod schema for a pending permit offer surfaced in admin account listings.
|
|
87
|
+
*
|
|
88
|
+
* Deliberately narrower than `PermitOfferJson`: omits `message` and
|
|
89
|
+
* `decline_reason` so cross-admin visibility of the listing does not expose
|
|
90
|
+
* grantor-authored text that the audit log also withholds. Full offer
|
|
91
|
+
* payloads remain available through the offer-specific RPC surface and the
|
|
92
|
+
* audit log when admins need them.
|
|
93
|
+
*
|
|
94
|
+
* `from_username` is resolved server-side so multi-admin deployments can see
|
|
95
|
+
* at a glance whose pending offer is blocking a "+ {role}" button; the
|
|
96
|
+
* resolution runs inside the listing query's parallel batch.
|
|
97
|
+
*/
|
|
98
|
+
export const PendingOfferSummaryJson = z.strictObject({
|
|
99
|
+
id: Uuid,
|
|
100
|
+
role: z.string(),
|
|
101
|
+
scope_id: Uuid.nullable(),
|
|
102
|
+
from_actor_id: Uuid,
|
|
103
|
+
from_username: z.string(),
|
|
104
|
+
created_at: z.string(),
|
|
105
|
+
expires_at: z.string(),
|
|
75
106
|
});
|
|
76
|
-
/** Zod schema for an admin account listing entry (account + actor + permits). */
|
|
107
|
+
/** Zod schema for an admin account listing entry (account + actor + permits + pending offers). */
|
|
77
108
|
export const AdminAccountEntryJson = z.strictObject({
|
|
78
109
|
account: AdminAccountJson,
|
|
79
110
|
actor: ActorSummaryJson.nullable(),
|
|
80
111
|
permits: z.array(PermitSummaryJson),
|
|
112
|
+
pending_offers: z.array(PendingOfferSummaryJson),
|
|
81
113
|
});
|
|
82
114
|
/**
|
|
83
115
|
* Convert an `Account` to a `SessionAccount` by stripping sensitive fields.
|