@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.
Files changed (210) hide show
  1. package/dist/actions/CLAUDE.md +630 -0
  2. package/dist/actions/action_rpc.d.ts +29 -0
  3. package/dist/actions/action_rpc.d.ts.map +1 -1
  4. package/dist/actions/action_rpc.js +42 -6
  5. package/dist/actions/action_types.d.ts +2 -2
  6. package/dist/actions/cancel.d.ts +12 -13
  7. package/dist/actions/cancel.d.ts.map +1 -1
  8. package/dist/actions/cancel.js +10 -13
  9. package/dist/actions/heartbeat.d.ts +8 -13
  10. package/dist/actions/heartbeat.d.ts.map +1 -1
  11. package/dist/actions/heartbeat.js +5 -8
  12. package/dist/actions/register_action_ws.d.ts +3 -3
  13. package/dist/actions/register_action_ws.js +2 -2
  14. package/dist/actions/register_ws_endpoint.d.ts +4 -4
  15. package/dist/actions/register_ws_endpoint.d.ts.map +1 -1
  16. package/dist/actions/register_ws_endpoint.js +3 -3
  17. package/dist/actions/socket.svelte.d.ts +16 -16
  18. package/dist/actions/socket.svelte.d.ts.map +1 -1
  19. package/dist/actions/socket.svelte.js +15 -15
  20. package/dist/actions/transports_ws_auth_guard.d.ts.map +1 -1
  21. package/dist/actions/transports_ws_backend.d.ts +15 -0
  22. package/dist/actions/transports_ws_backend.d.ts.map +1 -1
  23. package/dist/actions/transports_ws_backend.js +17 -0
  24. package/dist/auth/CLAUDE.md +923 -0
  25. package/dist/auth/account_action_specs.d.ts +216 -0
  26. package/dist/auth/account_action_specs.d.ts.map +1 -0
  27. package/dist/auth/account_action_specs.js +159 -0
  28. package/dist/auth/account_actions.d.ts +51 -0
  29. package/dist/auth/account_actions.d.ts.map +1 -0
  30. package/dist/auth/account_actions.js +119 -0
  31. package/dist/auth/account_queries.d.ts +6 -2
  32. package/dist/auth/account_queries.d.ts.map +1 -1
  33. package/dist/auth/account_queries.js +40 -4
  34. package/dist/auth/account_routes.d.ts +94 -16
  35. package/dist/auth/account_routes.d.ts.map +1 -1
  36. package/dist/auth/account_routes.js +108 -180
  37. package/dist/auth/account_schema.d.ts +85 -30
  38. package/dist/auth/account_schema.d.ts.map +1 -1
  39. package/dist/auth/account_schema.js +40 -8
  40. package/dist/auth/admin_action_specs.d.ts +674 -0
  41. package/dist/auth/admin_action_specs.d.ts.map +1 -0
  42. package/dist/auth/admin_action_specs.js +287 -0
  43. package/dist/auth/admin_actions.d.ts +69 -0
  44. package/dist/auth/admin_actions.d.ts.map +1 -0
  45. package/dist/auth/admin_actions.js +256 -0
  46. package/dist/auth/api_token.d.ts +10 -0
  47. package/dist/auth/api_token.d.ts.map +1 -1
  48. package/dist/auth/api_token.js +9 -0
  49. package/dist/auth/api_token_queries.d.ts +3 -3
  50. package/dist/auth/api_token_queries.js +3 -3
  51. package/dist/auth/app_settings_schema.d.ts +4 -3
  52. package/dist/auth/app_settings_schema.d.ts.map +1 -1
  53. package/dist/auth/app_settings_schema.js +2 -1
  54. package/dist/auth/audit_log_routes.d.ts +14 -6
  55. package/dist/auth/audit_log_routes.d.ts.map +1 -1
  56. package/dist/auth/audit_log_routes.js +22 -79
  57. package/dist/auth/audit_log_schema.d.ts +100 -29
  58. package/dist/auth/audit_log_schema.d.ts.map +1 -1
  59. package/dist/auth/audit_log_schema.js +83 -11
  60. package/dist/auth/bootstrap_routes.d.ts +14 -0
  61. package/dist/auth/bootstrap_routes.d.ts.map +1 -1
  62. package/dist/auth/bootstrap_routes.js +10 -3
  63. package/dist/auth/cleanup.d.ts +63 -0
  64. package/dist/auth/cleanup.d.ts.map +1 -0
  65. package/dist/auth/cleanup.js +80 -0
  66. package/dist/auth/invite_schema.d.ts +11 -10
  67. package/dist/auth/invite_schema.d.ts.map +1 -1
  68. package/dist/auth/invite_schema.js +4 -3
  69. package/dist/auth/migrations.d.ts +6 -0
  70. package/dist/auth/migrations.d.ts.map +1 -1
  71. package/dist/auth/migrations.js +28 -0
  72. package/dist/auth/permit_offer_action_specs.d.ts +364 -0
  73. package/dist/auth/permit_offer_action_specs.d.ts.map +1 -0
  74. package/dist/auth/permit_offer_action_specs.js +216 -0
  75. package/dist/auth/permit_offer_actions.d.ts +96 -0
  76. package/dist/auth/permit_offer_actions.d.ts.map +1 -0
  77. package/dist/auth/permit_offer_actions.js +428 -0
  78. package/dist/auth/permit_offer_notifications.d.ts +361 -0
  79. package/dist/auth/permit_offer_notifications.d.ts.map +1 -0
  80. package/dist/auth/permit_offer_notifications.js +179 -0
  81. package/dist/auth/permit_offer_queries.d.ts +165 -0
  82. package/dist/auth/permit_offer_queries.d.ts.map +1 -0
  83. package/dist/auth/permit_offer_queries.js +390 -0
  84. package/dist/auth/permit_offer_schema.d.ts +103 -0
  85. package/dist/auth/permit_offer_schema.d.ts.map +1 -0
  86. package/dist/auth/permit_offer_schema.js +142 -0
  87. package/dist/auth/permit_queries.d.ts +77 -14
  88. package/dist/auth/permit_queries.d.ts.map +1 -1
  89. package/dist/auth/permit_queries.js +119 -24
  90. package/dist/auth/session_queries.d.ts +4 -2
  91. package/dist/auth/session_queries.d.ts.map +1 -1
  92. package/dist/auth/session_queries.js +4 -2
  93. package/dist/auth/signup_routes.d.ts +13 -0
  94. package/dist/auth/signup_routes.d.ts.map +1 -1
  95. package/dist/auth/signup_routes.js +14 -7
  96. package/dist/http/CLAUDE.md +584 -0
  97. package/dist/http/pending_effects.d.ts +29 -0
  98. package/dist/http/pending_effects.d.ts.map +1 -0
  99. package/dist/http/pending_effects.js +31 -0
  100. package/dist/http/route_spec.d.ts.map +1 -1
  101. package/dist/http/route_spec.js +4 -3
  102. package/dist/rate_limiter.d.ts +30 -0
  103. package/dist/rate_limiter.d.ts.map +1 -1
  104. package/dist/rate_limiter.js +25 -2
  105. package/dist/realtime/sse_auth_guard.d.ts +2 -0
  106. package/dist/realtime/sse_auth_guard.d.ts.map +1 -1
  107. package/dist/realtime/sse_auth_guard.js +5 -3
  108. package/dist/testing/CLAUDE.md +668 -1
  109. package/dist/testing/admin_integration.d.ts +10 -7
  110. package/dist/testing/admin_integration.d.ts.map +1 -1
  111. package/dist/testing/admin_integration.js +382 -482
  112. package/dist/testing/app_server.d.ts +7 -6
  113. package/dist/testing/app_server.d.ts.map +1 -1
  114. package/dist/testing/attack_surface.d.ts +9 -3
  115. package/dist/testing/attack_surface.d.ts.map +1 -1
  116. package/dist/testing/attack_surface.js +4 -4
  117. package/dist/testing/audit_completeness.d.ts +6 -0
  118. package/dist/testing/audit_completeness.d.ts.map +1 -1
  119. package/dist/testing/audit_completeness.js +158 -134
  120. package/dist/testing/auth_apps.d.ts.map +1 -1
  121. package/dist/testing/auth_apps.js +4 -33
  122. package/dist/testing/db.d.ts +1 -1
  123. package/dist/testing/db.d.ts.map +1 -1
  124. package/dist/testing/db.js +2 -0
  125. package/dist/testing/entities.d.ts +35 -13
  126. package/dist/testing/entities.d.ts.map +1 -1
  127. package/dist/testing/entities.js +17 -0
  128. package/dist/testing/integration.d.ts +10 -0
  129. package/dist/testing/integration.d.ts.map +1 -1
  130. package/dist/testing/integration.js +352 -340
  131. package/dist/testing/integration_helpers.d.ts +16 -5
  132. package/dist/testing/integration_helpers.d.ts.map +1 -1
  133. package/dist/testing/integration_helpers.js +24 -4
  134. package/dist/testing/rate_limiting.d.ts +7 -0
  135. package/dist/testing/rate_limiting.d.ts.map +1 -1
  136. package/dist/testing/rate_limiting.js +41 -10
  137. package/dist/testing/rpc_helpers.d.ts +153 -1
  138. package/dist/testing/rpc_helpers.d.ts.map +1 -1
  139. package/dist/testing/rpc_helpers.js +184 -8
  140. package/dist/testing/sse_round_trip.d.ts +8 -0
  141. package/dist/testing/sse_round_trip.d.ts.map +1 -1
  142. package/dist/testing/sse_round_trip.js +10 -3
  143. package/dist/testing/standard.d.ts +9 -1
  144. package/dist/testing/standard.d.ts.map +1 -1
  145. package/dist/testing/standard.js +6 -2
  146. package/dist/testing/surface_invariants.d.ts +7 -3
  147. package/dist/testing/surface_invariants.d.ts.map +1 -1
  148. package/dist/testing/surface_invariants.js +5 -4
  149. package/dist/testing/ws_round_trip.d.ts.map +1 -1
  150. package/dist/testing/ws_round_trip.js +9 -38
  151. package/dist/ui/AccountSessions.svelte +8 -4
  152. package/dist/ui/AccountSessions.svelte.d.ts.map +1 -1
  153. package/dist/ui/AdminAccounts.svelte +61 -33
  154. package/dist/ui/AdminAccounts.svelte.d.ts.map +1 -1
  155. package/dist/ui/AdminAuditLog.svelte +3 -2
  156. package/dist/ui/AdminAuditLog.svelte.d.ts.map +1 -1
  157. package/dist/ui/AdminInvites.svelte +3 -2
  158. package/dist/ui/AdminInvites.svelte.d.ts.map +1 -1
  159. package/dist/ui/AdminOverview.svelte +14 -9
  160. package/dist/ui/AdminOverview.svelte.d.ts.map +1 -1
  161. package/dist/ui/AdminPermitHistory.svelte +3 -2
  162. package/dist/ui/AdminPermitHistory.svelte.d.ts.map +1 -1
  163. package/dist/ui/AdminSessions.svelte +29 -25
  164. package/dist/ui/AdminSessions.svelte.d.ts.map +1 -1
  165. package/dist/ui/CLAUDE.md +351 -0
  166. package/dist/ui/OpenSignupToggle.svelte +6 -3
  167. package/dist/ui/OpenSignupToggle.svelte.d.ts.map +1 -1
  168. package/dist/ui/PermitOfferForm.svelte +141 -0
  169. package/dist/ui/PermitOfferForm.svelte.d.ts +14 -0
  170. package/dist/ui/PermitOfferForm.svelte.d.ts.map +1 -0
  171. package/dist/ui/PermitOfferHistory.svelte +109 -0
  172. package/dist/ui/PermitOfferHistory.svelte.d.ts +11 -0
  173. package/dist/ui/PermitOfferHistory.svelte.d.ts.map +1 -0
  174. package/dist/ui/PermitOfferInbox.svelte +121 -0
  175. package/dist/ui/PermitOfferInbox.svelte.d.ts +12 -0
  176. package/dist/ui/PermitOfferInbox.svelte.d.ts.map +1 -0
  177. package/dist/ui/account_sessions_state.svelte.d.ts +53 -3
  178. package/dist/ui/account_sessions_state.svelte.d.ts.map +1 -1
  179. package/dist/ui/account_sessions_state.svelte.js +39 -16
  180. package/dist/ui/admin_accounts_state.svelte.d.ts +118 -2
  181. package/dist/ui/admin_accounts_state.svelte.d.ts.map +1 -1
  182. package/dist/ui/admin_accounts_state.svelte.js +99 -23
  183. package/dist/ui/admin_invites_state.svelte.d.ts +47 -1
  184. package/dist/ui/admin_invites_state.svelte.d.ts.map +1 -1
  185. package/dist/ui/admin_invites_state.svelte.js +38 -26
  186. package/dist/ui/admin_sessions_state.svelte.d.ts +26 -0
  187. package/dist/ui/admin_sessions_state.svelte.d.ts.map +1 -1
  188. package/dist/ui/admin_sessions_state.svelte.js +35 -21
  189. package/dist/ui/app_settings_state.svelte.d.ts +39 -0
  190. package/dist/ui/app_settings_state.svelte.d.ts.map +1 -1
  191. package/dist/ui/app_settings_state.svelte.js +34 -18
  192. package/dist/ui/audit_log_state.svelte.d.ts +40 -3
  193. package/dist/ui/audit_log_state.svelte.d.ts.map +1 -1
  194. package/dist/ui/audit_log_state.svelte.js +36 -42
  195. package/dist/ui/auth_state.svelte.d.ts +4 -3
  196. package/dist/ui/auth_state.svelte.d.ts.map +1 -1
  197. package/dist/ui/auth_state.svelte.js +4 -1
  198. package/dist/ui/permit_offers_state.svelte.d.ts +125 -0
  199. package/dist/ui/permit_offers_state.svelte.d.ts.map +1 -0
  200. package/dist/ui/permit_offers_state.svelte.js +197 -0
  201. package/package.json +3 -3
  202. package/dist/auth/admin_routes.d.ts +0 -29
  203. package/dist/auth/admin_routes.d.ts.map +0 -1
  204. package/dist/auth/admin_routes.js +0 -226
  205. package/dist/auth/app_settings_routes.d.ts +0 -27
  206. package/dist/auth/app_settings_routes.d.ts.map +0 -1
  207. package/dist/auth/app_settings_routes.js +0 -66
  208. package/dist/auth/invite_routes.d.ts +0 -18
  209. package/dist/auth/invite_routes.d.ts.map +0 -1
  210. 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: string;
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: string | null;
37
+ created_by: Uuid | null;
37
38
  updated_at: string;
38
- updated_by: string | null;
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: string;
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: string;
51
- account_id: string;
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: string | null;
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: string;
60
- actor_id: string;
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: string | null;
66
- granted_by: string | null;
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: Permit, now?: Date) => boolean;
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: string;
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: string;
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.ZodString;
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.ZodString;
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.ZodString;
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.ZodString;
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.ZodString>;
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.ZodString;
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.ZodString;
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.ZodString>;
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
- /** Zod schema for an admin account listing entry (account + actor + permits). */
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.ZodString;
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.ZodString>;
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.ZodString;
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.ZodString;
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.ZodString>;
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: string;
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: string | null;
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":"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"}
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: z.string(),
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: z.string(),
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: z.string(),
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: z.string(),
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: z.string().nullable(),
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: z.string(),
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: z.string().nullable(),
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.