@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
@@ -1,66 +0,0 @@
1
- /**
2
- * Admin app settings route specs.
3
- *
4
- * GET and PATCH routes for managing global app settings (e.g. open signup toggle).
5
- * All routes require the `admin` role.
6
- *
7
- * @module
8
- */
9
- import { z } from 'zod';
10
- import { get_route_input } from '../http/route_spec.js';
11
- import { require_request_context } from './request_context.js';
12
- import { get_client_ip } from '../http/proxy.js';
13
- import { audit_log_fire_and_forget } from './audit_log_queries.js';
14
- import { query_app_settings_load_with_username, query_app_settings_update, } from './app_settings_queries.js';
15
- import { AppSettingsWithUsernameJson, UpdateAppSettingsInput, } from './app_settings_schema.js';
16
- /**
17
- * Create admin app settings route specs.
18
- *
19
- * @param deps - stateless capabilities (log, on_audit_event)
20
- * @param options - per-factory configuration
21
- * @returns route specs for app settings management
22
- */
23
- export const create_app_settings_route_specs = (deps, options) => {
24
- const { app_settings } = options;
25
- return [
26
- {
27
- method: 'GET',
28
- path: '/settings',
29
- auth: { type: 'role', role: 'admin' },
30
- description: 'Get app settings',
31
- input: z.null(),
32
- output: z.strictObject({ settings: AppSettingsWithUsernameJson }),
33
- handler: async (c, route) => {
34
- const settings = await query_app_settings_load_with_username(route);
35
- return c.json({ settings });
36
- },
37
- },
38
- {
39
- method: 'PATCH',
40
- path: '/settings',
41
- auth: { type: 'role', role: 'admin' },
42
- description: 'Update app settings',
43
- input: UpdateAppSettingsInput,
44
- output: z.strictObject({ ok: z.literal(true), settings: AppSettingsWithUsernameJson }),
45
- handler: async (c, route) => {
46
- const ctx = require_request_context(c);
47
- const { open_signup } = get_route_input(c);
48
- const old_value = app_settings.open_signup;
49
- const updated = await query_app_settings_update(route, open_signup, ctx.actor.id);
50
- // Mutate the in-memory ref so GET reads are consistent
51
- app_settings.open_signup = updated.open_signup;
52
- app_settings.updated_at = updated.updated_at;
53
- app_settings.updated_by = updated.updated_by;
54
- void audit_log_fire_and_forget(route, {
55
- event_type: 'app_settings_update',
56
- actor_id: ctx.actor.id,
57
- account_id: ctx.account.id,
58
- ip: get_client_ip(c),
59
- metadata: { setting: 'open_signup', old_value, new_value: open_signup },
60
- }, deps.log, deps.on_audit_event);
61
- const settings_with_username = await query_app_settings_load_with_username(route);
62
- return c.json({ ok: true, settings: settings_with_username });
63
- },
64
- },
65
- ];
66
- };
@@ -1,18 +0,0 @@
1
- /**
2
- * Admin invite route specs for invite-based signup.
3
- *
4
- * All routes require the `admin` role. Provides CRUD for invites
5
- * that gate who can sign up.
6
- *
7
- * @module
8
- */
9
- import { type RouteSpec } from '../http/route_spec.js';
10
- import type { RouteFactoryDeps } from './deps.js';
11
- /**
12
- * Create admin invite route specs.
13
- *
14
- * @param deps - stateless capabilities (log)
15
- * @returns route specs for invite management
16
- */
17
- export declare const create_invite_route_specs: (deps: Pick<RouteFactoryDeps, "log" | "on_audit_event">) => Array<RouteSpec>;
18
- //# sourceMappingURL=invite_routes.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"invite_routes.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/invite_routes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAoC,KAAK,SAAS,EAAC,MAAM,uBAAuB,CAAC;AAYxF,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,WAAW,CAAC;AAUhD;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,GACrC,MAAM,IAAI,CAAC,gBAAgB,EAAE,KAAK,GAAG,gBAAgB,CAAC,KACpD,KAAK,CAAC,SAAS,CAwHjB,CAAC"}
@@ -1,129 +0,0 @@
1
- /**
2
- * Admin invite route specs for invite-based signup.
3
- *
4
- * All routes require the `admin` role. Provides CRUD for invites
5
- * that gate who can sign up.
6
- *
7
- * @module
8
- */
9
- import { z } from 'zod';
10
- import { get_route_input, get_route_params } from '../http/route_spec.js';
11
- import { require_request_context } from './request_context.js';
12
- import { get_client_ip } from '../http/proxy.js';
13
- import { audit_log_fire_and_forget } from './audit_log_queries.js';
14
- import { query_account_by_username, query_account_by_email } from './account_queries.js';
15
- import { query_create_invite, query_invite_list_all_with_usernames, query_invite_delete_unclaimed, } from './invite_queries.js';
16
- import { InviteJson, InviteWithUsernamesJson } from './invite_schema.js';
17
- import { Username, Email } from './account_schema.js';
18
- import { is_pg_unique_violation } from '../db/pg_error.js';
19
- import { ERROR_INVITE_NOT_FOUND, ERROR_INVITE_MISSING_IDENTIFIER, ERROR_INVITE_DUPLICATE, ERROR_INVITE_ACCOUNT_EXISTS_USERNAME, ERROR_INVITE_ACCOUNT_EXISTS_EMAIL, } from '../http/error_schemas.js';
20
- /**
21
- * Create admin invite route specs.
22
- *
23
- * @param deps - stateless capabilities (log)
24
- * @returns route specs for invite management
25
- */
26
- export const create_invite_route_specs = (deps) => {
27
- return [
28
- {
29
- method: 'POST',
30
- path: '/invites',
31
- auth: { type: 'role', role: 'admin' },
32
- description: 'Create an invite',
33
- input: z.strictObject({
34
- email: Email.nullish(),
35
- username: Username.nullish(),
36
- }),
37
- output: z.strictObject({ ok: z.literal(true), invite: InviteJson }),
38
- errors: {
39
- 400: z.looseObject({ error: z.literal(ERROR_INVITE_MISSING_IDENTIFIER) }),
40
- 409: z.looseObject({
41
- error: z.enum([
42
- ERROR_INVITE_DUPLICATE,
43
- ERROR_INVITE_ACCOUNT_EXISTS_USERNAME,
44
- ERROR_INVITE_ACCOUNT_EXISTS_EMAIL,
45
- ]),
46
- }),
47
- },
48
- handler: async (c, route) => {
49
- const ctx = require_request_context(c);
50
- const { email, username } = get_route_input(c);
51
- if (!email && !username) {
52
- return c.json({ error: ERROR_INVITE_MISSING_IDENTIFIER }, 400);
53
- }
54
- if (username) {
55
- const existing = await query_account_by_username(route, username);
56
- if (existing) {
57
- return c.json({ error: ERROR_INVITE_ACCOUNT_EXISTS_USERNAME }, 409);
58
- }
59
- }
60
- if (email) {
61
- const existing = await query_account_by_email(route, email);
62
- if (existing) {
63
- return c.json({ error: ERROR_INVITE_ACCOUNT_EXISTS_EMAIL }, 409);
64
- }
65
- }
66
- let invite;
67
- try {
68
- invite = await query_create_invite(route, {
69
- email: email ?? null,
70
- username: username ?? null,
71
- created_by: ctx.actor.id,
72
- });
73
- }
74
- catch (e) {
75
- if (is_pg_unique_violation(e)) {
76
- return c.json({ error: ERROR_INVITE_DUPLICATE }, 409);
77
- }
78
- throw e;
79
- }
80
- void audit_log_fire_and_forget(route, {
81
- event_type: 'invite_create',
82
- actor_id: ctx.actor.id,
83
- account_id: ctx.account.id,
84
- ip: get_client_ip(c),
85
- metadata: { invite_id: invite.id, email: email ?? null, username: username ?? null },
86
- }, deps.log, deps.on_audit_event);
87
- return c.json({ ok: true, invite });
88
- },
89
- },
90
- {
91
- method: 'GET',
92
- path: '/invites',
93
- auth: { type: 'role', role: 'admin' },
94
- description: 'List all invites',
95
- input: z.null(),
96
- output: z.strictObject({ invites: z.array(InviteWithUsernamesJson) }),
97
- handler: async (c, route) => {
98
- const invites = await query_invite_list_all_with_usernames(route);
99
- return c.json({ invites });
100
- },
101
- },
102
- {
103
- method: 'DELETE',
104
- path: '/invites/:id',
105
- auth: { type: 'role', role: 'admin' },
106
- description: 'Delete an unclaimed invite',
107
- params: z.strictObject({ id: z.uuid() }),
108
- input: z.null(),
109
- output: z.strictObject({ ok: z.literal(true) }),
110
- errors: { 404: z.looseObject({ error: z.literal(ERROR_INVITE_NOT_FOUND) }) },
111
- handler: async (c, route) => {
112
- const { id } = get_route_params(c);
113
- const deleted = await query_invite_delete_unclaimed(route, id);
114
- if (!deleted) {
115
- return c.json({ error: ERROR_INVITE_NOT_FOUND }, 404);
116
- }
117
- const ctx = require_request_context(c);
118
- void audit_log_fire_and_forget(route, {
119
- event_type: 'invite_delete',
120
- actor_id: ctx.actor.id,
121
- account_id: ctx.account.id,
122
- ip: get_client_ip(c),
123
- metadata: { invite_id: id },
124
- }, deps.log, deps.on_audit_event);
125
- return c.json({ ok: true });
126
- },
127
- },
128
- ];
129
- };