@fuzdev/fuz_app 0.67.1 → 0.69.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 (235) hide show
  1. package/dist/actions/perform_action.d.ts.map +1 -1
  2. package/dist/actions/perform_action.js +10 -3
  3. package/dist/auth/CLAUDE.md +99 -5
  4. package/dist/auth/account_queries.d.ts +87 -4
  5. package/dist/auth/account_queries.d.ts.map +1 -1
  6. package/dist/auth/account_queries.js +107 -17
  7. package/dist/auth/account_schema.d.ts +19 -0
  8. package/dist/auth/account_schema.d.ts.map +1 -1
  9. package/dist/auth/account_schema.js +8 -0
  10. package/dist/auth/admin_action_specs.d.ts +170 -3
  11. package/dist/auth/admin_action_specs.d.ts.map +1 -1
  12. package/dist/auth/admin_action_specs.js +148 -4
  13. package/dist/auth/admin_actions.d.ts +4 -14
  14. package/dist/auth/admin_actions.d.ts.map +1 -1
  15. package/dist/auth/admin_actions.js +246 -40
  16. package/dist/auth/audit_log_ddl.d.ts +10 -1
  17. package/dist/auth/audit_log_ddl.d.ts.map +1 -1
  18. package/dist/auth/audit_log_ddl.js +13 -4
  19. package/dist/auth/audit_log_schema.d.ts +34 -1
  20. package/dist/auth/audit_log_schema.d.ts.map +1 -1
  21. package/dist/auth/audit_log_schema.js +73 -0
  22. package/dist/auth/auth_ddl.d.ts +2 -2
  23. package/dist/auth/auth_ddl.d.ts.map +1 -1
  24. package/dist/auth/auth_ddl.js +10 -2
  25. package/dist/auth/cell_action_specs.d.ts +1295 -0
  26. package/dist/auth/cell_action_specs.d.ts.map +1 -0
  27. package/dist/auth/cell_action_specs.js +397 -0
  28. package/dist/auth/cell_actions.d.ts +63 -0
  29. package/dist/auth/cell_actions.d.ts.map +1 -0
  30. package/dist/auth/cell_actions.js +546 -0
  31. package/dist/auth/cell_audit_action_specs.d.ts +131 -0
  32. package/dist/auth/cell_audit_action_specs.d.ts.map +1 -0
  33. package/dist/auth/cell_audit_action_specs.js +70 -0
  34. package/dist/auth/cell_audit_actions.d.ts +18 -0
  35. package/dist/auth/cell_audit_actions.d.ts.map +1 -0
  36. package/dist/auth/cell_audit_actions.js +59 -0
  37. package/dist/auth/cell_audit_events.d.ts +28 -0
  38. package/dist/auth/cell_audit_events.d.ts.map +1 -0
  39. package/dist/auth/cell_audit_events.js +42 -0
  40. package/dist/auth/cell_audit_metadata.d.ts +48 -0
  41. package/dist/auth/cell_audit_metadata.d.ts.map +1 -0
  42. package/dist/auth/cell_audit_metadata.js +46 -0
  43. package/dist/auth/cell_authorize.d.ts +88 -0
  44. package/dist/auth/cell_authorize.d.ts.map +1 -0
  45. package/dist/auth/cell_authorize.js +172 -0
  46. package/dist/auth/cell_data_schema.d.ts +44 -0
  47. package/dist/auth/cell_data_schema.d.ts.map +1 -0
  48. package/dist/auth/cell_data_schema.js +42 -0
  49. package/dist/auth/cell_field_action_specs.d.ts +244 -0
  50. package/dist/auth/cell_field_action_specs.d.ts.map +1 -0
  51. package/dist/auth/cell_field_action_specs.js +136 -0
  52. package/dist/auth/cell_field_actions.d.ts +34 -0
  53. package/dist/auth/cell_field_actions.d.ts.map +1 -0
  54. package/dist/auth/cell_field_actions.js +153 -0
  55. package/dist/auth/cell_field_audit_metadata.d.ts +30 -0
  56. package/dist/auth/cell_field_audit_metadata.d.ts.map +1 -0
  57. package/dist/auth/cell_field_audit_metadata.js +28 -0
  58. package/dist/auth/cell_grant_action_specs.d.ts +333 -0
  59. package/dist/auth/cell_grant_action_specs.d.ts.map +1 -0
  60. package/dist/auth/cell_grant_action_specs.js +148 -0
  61. package/dist/auth/cell_grant_actions.d.ts +50 -0
  62. package/dist/auth/cell_grant_actions.d.ts.map +1 -0
  63. package/dist/auth/cell_grant_actions.js +208 -0
  64. package/dist/auth/cell_grant_audit_metadata.d.ts +75 -0
  65. package/dist/auth/cell_grant_audit_metadata.d.ts.map +1 -0
  66. package/dist/auth/cell_grant_audit_metadata.js +54 -0
  67. package/dist/auth/cell_item_action_specs.d.ts +331 -0
  68. package/dist/auth/cell_item_action_specs.d.ts.map +1 -0
  69. package/dist/auth/cell_item_action_specs.js +182 -0
  70. package/dist/auth/cell_item_actions.d.ts +37 -0
  71. package/dist/auth/cell_item_actions.d.ts.map +1 -0
  72. package/dist/auth/cell_item_actions.js +204 -0
  73. package/dist/auth/cell_item_audit_metadata.d.ts +35 -0
  74. package/dist/auth/cell_item_audit_metadata.d.ts.map +1 -0
  75. package/dist/auth/cell_item_audit_metadata.js +32 -0
  76. package/dist/auth/cell_relation_visibility.d.ts +32 -0
  77. package/dist/auth/cell_relation_visibility.d.ts.map +1 -0
  78. package/dist/auth/cell_relation_visibility.js +57 -0
  79. package/dist/auth/deps.d.ts +9 -0
  80. package/dist/auth/deps.d.ts.map +1 -1
  81. package/dist/auth/role_grant_queries.d.ts +30 -0
  82. package/dist/auth/role_grant_queries.d.ts.map +1 -1
  83. package/dist/auth/role_grant_queries.js +54 -0
  84. package/dist/auth/signup_routes.d.ts +0 -3
  85. package/dist/auth/signup_routes.d.ts.map +1 -1
  86. package/dist/auth/signup_routes.js +9 -3
  87. package/dist/auth/standard_rpc_actions.d.ts +5 -5
  88. package/dist/auth/standard_rpc_actions.js +4 -4
  89. package/dist/db/CLAUDE.md +118 -0
  90. package/dist/db/cell_audit_queries.d.ts +26 -0
  91. package/dist/db/cell_audit_queries.d.ts.map +1 -0
  92. package/dist/db/cell_audit_queries.js +53 -0
  93. package/dist/db/cell_ddl.d.ts +151 -0
  94. package/dist/db/cell_ddl.d.ts.map +1 -0
  95. package/dist/db/cell_ddl.js +247 -0
  96. package/dist/db/cell_field_queries.d.ts +105 -0
  97. package/dist/db/cell_field_queries.d.ts.map +1 -0
  98. package/dist/db/cell_field_queries.js +113 -0
  99. package/dist/db/cell_grant_queries.d.ts +132 -0
  100. package/dist/db/cell_grant_queries.d.ts.map +1 -0
  101. package/dist/db/cell_grant_queries.js +145 -0
  102. package/dist/db/cell_history_ddl.d.ts +38 -0
  103. package/dist/db/cell_history_ddl.d.ts.map +1 -0
  104. package/dist/db/cell_history_ddl.js +61 -0
  105. package/dist/db/cell_item_queries.d.ts +107 -0
  106. package/dist/db/cell_item_queries.d.ts.map +1 -0
  107. package/dist/db/cell_item_queries.js +119 -0
  108. package/dist/db/cell_queries.d.ts +327 -0
  109. package/dist/db/cell_queries.d.ts.map +1 -0
  110. package/dist/db/cell_queries.js +431 -0
  111. package/dist/db/fact_ddl.d.ts +38 -0
  112. package/dist/db/fact_ddl.d.ts.map +1 -0
  113. package/dist/db/fact_ddl.js +71 -0
  114. package/dist/db/fact_queries.d.ts +140 -0
  115. package/dist/db/fact_queries.d.ts.map +1 -0
  116. package/dist/db/fact_queries.js +161 -0
  117. package/dist/db/fact_store.d.ts +112 -0
  118. package/dist/db/fact_store.d.ts.map +1 -0
  119. package/dist/db/fact_store.js +225 -0
  120. package/dist/server/app_server.d.ts +1 -7
  121. package/dist/server/app_server.d.ts.map +1 -1
  122. package/dist/server/app_server.js +1 -5
  123. package/dist/server/env.d.ts +2 -0
  124. package/dist/server/env.d.ts.map +1 -1
  125. package/dist/server/env.js +6 -0
  126. package/dist/server/fact_write.d.ts +32 -0
  127. package/dist/server/fact_write.d.ts.map +1 -0
  128. package/dist/server/fact_write.js +56 -0
  129. package/dist/server/file_fact_fetcher.d.ts +42 -0
  130. package/dist/server/file_fact_fetcher.d.ts.map +1 -0
  131. package/dist/server/file_fact_fetcher.js +60 -0
  132. package/dist/server/file_fact_url.d.ts +53 -0
  133. package/dist/server/file_fact_url.d.ts.map +1 -0
  134. package/dist/server/file_fact_url.js +52 -0
  135. package/dist/server/serve_fact_route.d.ts +78 -0
  136. package/dist/server/serve_fact_route.d.ts.map +1 -0
  137. package/dist/server/serve_fact_route.js +205 -0
  138. package/dist/testing/CLAUDE.md +142 -6
  139. package/dist/testing/app_server.d.ts +46 -0
  140. package/dist/testing/app_server.d.ts.map +1 -1
  141. package/dist/testing/app_server.js +67 -8
  142. package/dist/testing/audit_completeness.d.ts.map +1 -1
  143. package/dist/testing/audit_completeness.js +67 -1
  144. package/dist/testing/cross_backend/account_lifecycle.d.ts +10 -0
  145. package/dist/testing/cross_backend/account_lifecycle.d.ts.map +1 -0
  146. package/dist/testing/cross_backend/account_lifecycle.js +144 -0
  147. package/dist/testing/cross_backend/actor_lookup.d.ts +10 -0
  148. package/dist/testing/cross_backend/actor_lookup.d.ts.map +1 -0
  149. package/dist/testing/cross_backend/actor_lookup.js +83 -0
  150. package/dist/testing/cross_backend/actor_search.d.ts +6 -0
  151. package/dist/testing/cross_backend/actor_search.d.ts.map +1 -0
  152. package/dist/testing/cross_backend/actor_search.js +92 -0
  153. package/dist/testing/cross_backend/app_settings.d.ts +6 -0
  154. package/dist/testing/cross_backend/app_settings.d.ts.map +1 -0
  155. package/dist/testing/cross_backend/app_settings.js +95 -0
  156. package/dist/testing/cross_backend/backend_config.d.ts +1 -1
  157. package/dist/testing/cross_backend/capabilities.d.ts +29 -7
  158. package/dist/testing/cross_backend/capabilities.d.ts.map +1 -1
  159. package/dist/testing/cross_backend/capabilities.js +3 -1
  160. package/dist/testing/cross_backend/cell_cross_helpers.d.ts +39 -0
  161. package/dist/testing/cross_backend/cell_cross_helpers.d.ts.map +1 -0
  162. package/dist/testing/cross_backend/cell_cross_helpers.js +45 -0
  163. package/dist/testing/cross_backend/cell_crud.d.ts +4 -0
  164. package/dist/testing/cross_backend/cell_crud.d.ts.map +1 -0
  165. package/dist/testing/cross_backend/cell_crud.js +168 -0
  166. package/dist/testing/cross_backend/cell_grant_role.d.ts +8 -0
  167. package/dist/testing/cross_backend/cell_grant_role.d.ts.map +1 -0
  168. package/dist/testing/cross_backend/cell_grant_role.js +102 -0
  169. package/dist/testing/cross_backend/cell_relations.d.ts +4 -0
  170. package/dist/testing/cross_backend/cell_relations.d.ts.map +1 -0
  171. package/dist/testing/cross_backend/cell_relations.js +229 -0
  172. package/dist/testing/cross_backend/conformance_case.d.ts +144 -0
  173. package/dist/testing/cross_backend/conformance_case.d.ts.map +1 -0
  174. package/dist/testing/cross_backend/conformance_case.js +132 -0
  175. package/dist/testing/cross_backend/conformance_table.d.ts +46 -0
  176. package/dist/testing/cross_backend/conformance_table.d.ts.map +1 -0
  177. package/dist/testing/cross_backend/conformance_table.js +199 -0
  178. package/dist/testing/cross_backend/default_backend_configs.d.ts.map +1 -1
  179. package/dist/testing/cross_backend/default_backend_configs.js +6 -2
  180. package/dist/testing/cross_backend/default_spine_surface.d.ts +17 -9
  181. package/dist/testing/cross_backend/default_spine_surface.d.ts.map +1 -1
  182. package/dist/testing/cross_backend/default_spine_surface.js +20 -12
  183. package/dist/testing/cross_backend/origin.d.ts +10 -0
  184. package/dist/testing/cross_backend/origin.d.ts.map +1 -0
  185. package/dist/testing/cross_backend/origin.js +73 -0
  186. package/dist/testing/cross_backend/setup.d.ts +22 -40
  187. package/dist/testing/cross_backend/setup.d.ts.map +1 -1
  188. package/dist/testing/cross_backend/setup.js +39 -5
  189. package/dist/testing/cross_backend/testing_reset_actions.d.ts +90 -2
  190. package/dist/testing/cross_backend/testing_reset_actions.d.ts.map +1 -1
  191. package/dist/testing/cross_backend/testing_reset_actions.js +91 -3
  192. package/dist/testing/cross_backend/xfail.d.ts +15 -0
  193. package/dist/testing/cross_backend/xfail.d.ts.map +1 -0
  194. package/dist/testing/cross_backend/xfail.js +37 -0
  195. package/dist/testing/entities.d.ts.map +1 -1
  196. package/dist/testing/entities.js +4 -0
  197. package/dist/testing/integration.d.ts +2 -3
  198. package/dist/testing/integration.d.ts.map +1 -1
  199. package/dist/testing/integration.js +20 -85
  200. package/dist/testing/rate_limiting.d.ts +1 -1
  201. package/dist/testing/rpc_helpers.d.ts +3 -3
  202. package/dist/testing/sse_round_trip.d.ts +1 -1
  203. package/dist/testing/stubs.d.ts.map +1 -1
  204. package/dist/testing/stubs.js +0 -1
  205. package/dist/testing/ws_round_trip.d.ts.map +1 -1
  206. package/dist/testing/ws_round_trip.js +4 -0
  207. package/dist/ui/AdminAccounts.svelte +84 -35
  208. package/dist/ui/AdminAccounts.svelte.d.ts.map +1 -1
  209. package/dist/ui/AdminSessions.svelte +21 -23
  210. package/dist/ui/AdminSessions.svelte.d.ts.map +1 -1
  211. package/dist/ui/CLAUDE.md +17 -26
  212. package/dist/ui/OpenSignupToggle.svelte +2 -5
  213. package/dist/ui/OpenSignupToggle.svelte.d.ts.map +1 -1
  214. package/dist/ui/account_sessions_state.svelte.d.ts +9 -10
  215. package/dist/ui/account_sessions_state.svelte.d.ts.map +1 -1
  216. package/dist/ui/account_sessions_state.svelte.js +7 -17
  217. package/dist/ui/admin_accounts_state.svelte.d.ts +41 -20
  218. package/dist/ui/admin_accounts_state.svelte.d.ts.map +1 -1
  219. package/dist/ui/admin_accounts_state.svelte.js +52 -22
  220. package/dist/ui/admin_invites_state.svelte.d.ts +8 -11
  221. package/dist/ui/admin_invites_state.svelte.d.ts.map +1 -1
  222. package/dist/ui/admin_invites_state.svelte.js +7 -16
  223. package/dist/ui/admin_rpc_adapters.d.ts +6 -2
  224. package/dist/ui/admin_rpc_adapters.d.ts.map +1 -1
  225. package/dist/ui/admin_rpc_adapters.js +5 -1
  226. package/dist/ui/admin_sessions_state.svelte.d.ts +6 -10
  227. package/dist/ui/admin_sessions_state.svelte.d.ts.map +1 -1
  228. package/dist/ui/admin_sessions_state.svelte.js +4 -14
  229. package/dist/ui/app_settings_state.svelte.d.ts +8 -12
  230. package/dist/ui/app_settings_state.svelte.d.ts.map +1 -1
  231. package/dist/ui/app_settings_state.svelte.js +6 -16
  232. package/dist/ui/audit_log_state.svelte.d.ts +9 -8
  233. package/dist/ui/audit_log_state.svelte.d.ts.map +1 -1
  234. package/dist/ui/audit_log_state.svelte.js +8 -20
  235. package/package.json +2 -2
@@ -2,8 +2,7 @@
2
2
  /**
3
3
  * Single checkbox bound to `AppSettings.open_signup`. Consumes
4
4
  * `app_settings_rpc_context`; the toggle calls `app_settings_update` RPC
5
- * via `AppSettingsState.update_open_signup`. Hides gracefully when
6
- * `has_rpc` is `false` (renders an "rpc adapter not wired" notice).
5
+ * via `AppSettingsState.update_open_signup`.
7
6
  *
8
7
  * @module
9
8
  */
@@ -17,9 +16,7 @@
17
16
  </script>
18
17
 
19
18
  <div class="open-signup-toggle">
20
- {#if !app_settings.has_rpc}
21
- <p class="text_50">rpc adapter not wired</p>
22
- {:else if app_settings.list.loading}
19
+ {#if app_settings.list.loading}
23
20
  <p class="text_50">loading settings...</p>
24
21
  {:else if app_settings.settings}
25
22
  <label class="row">
@@ -1 +1 @@
1
- {"version":3,"file":"OpenSignupToggle.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/OpenSignupToggle.svelte"],"names":[],"mappings":"AAiDA,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,gBAAgB;;kBAA+E,CAAC;AACpF,KAAK,gBAAgB,GAAG,YAAY,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAChE,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"OpenSignupToggle.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/OpenSignupToggle.svelte"],"names":[],"mappings":"AA8CA,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,gBAAgB;;kBAA+E,CAAC;AACpF,KAAK,gBAAgB,GAAG,YAAY,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAChE,eAAe,gBAAgB,CAAC"}
@@ -43,19 +43,20 @@ export interface AccountSessionsRpc {
43
43
  }
44
44
  /**
45
45
  * Svelte context carrying the reactive `AccountSessionsRpc` accessor. Mirrors
46
- * the admin-side RPC contexts. Unset context falls back to `() => null` so
47
- * components render the usual "rpc adapter not wired" state.
46
+ * the admin-side RPC contexts. `get()` throws when no provisioner ran above
47
+ * the component the adapter is required.
48
48
  */
49
49
  export declare const account_sessions_rpc_context: {
50
- get: () => () => AccountSessionsRpc | null;
51
- set: (value?: (() => AccountSessionsRpc | null) | undefined) => () => AccountSessionsRpc | null;
50
+ get: (error_message?: string) => () => AccountSessionsRpc;
51
+ get_maybe: () => (() => AccountSessionsRpc) | undefined;
52
+ set: (value: () => AccountSessionsRpc) => () => AccountSessionsRpc;
52
53
  };
53
54
  export interface AccountSessionsStateOptions {
54
55
  /**
55
- * Reactive accessor for the RPC adapter; returns `null` when unwired.
56
- * Matches the `get_rpc` pattern on the admin state classes.
56
+ * Reactive accessor for the RPC adapter. Matches the `get_rpc` pattern on
57
+ * the admin state classes.
57
58
  */
58
- get_rpc?: () => AccountSessionsRpc | null;
59
+ get_rpc: () => AccountSessionsRpc;
59
60
  }
60
61
  export declare class AccountSessionsState {
61
62
  #private;
@@ -64,9 +65,7 @@ export declare class AccountSessionsState {
64
65
  readonly revoke_all: AsyncSlot<void, string>;
65
66
  sessions: Array<AuthSessionJson>;
66
67
  readonly active_count: number;
67
- constructor(options?: AccountSessionsStateOptions);
68
- /** True when an RPC adapter is wired. `fetch` / `submit_revoke` / `submit_revoke_all` no-op without it. */
69
- get has_rpc(): boolean;
68
+ constructor(options: AccountSessionsStateOptions);
70
69
  fetch(): Promise<void>;
71
70
  submit_revoke(id: string): Promise<void>;
72
71
  submit_revoke_all(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"account_sessions_state.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/account_sessions_state.svelte.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAAC,SAAS,EAAC,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAC,cAAc,EAAC,MAAM,8BAA8B,CAAC;AAC5D,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,2BAA2B,CAAC;AAE/D;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,OAAO,CAAC;QAAC,QAAQ,EAAE,KAAK,CAAC,eAAe,CAAC,CAAA;KAAC,CAAC,CAAC;IACxD,MAAM,EAAE,CAAC,MAAM,EAAE;QAAC,UAAU,EAAE,MAAM,CAAA;KAAC,KAAK,OAAO,CAAC;QAAC,EAAE,EAAE,IAAI,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAC,CAAC,CAAC;IAChF,UAAU,EAAE,MAAM,OAAO,CAAC;QAAC,EAAE,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC,CAAC;CACrD;AAED;;;;GAIG;AACH,eAAO,MAAM,4BAA4B;qBAAwB,kBAAkB,GAAG,IAAI;yBAAzB,kBAAkB,GAAG,IAAI,wBAAzB,kBAAkB,GAAG,IAAI;CAEzF,CAAC;AAEF,MAAM,WAAW,2BAA2B;IAC3C;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,kBAAkB,GAAG,IAAI,CAAC;CAC1C;AAED,qBAAa,oBAAoB;;IAGhC,QAAQ,CAAC,IAAI,0BAAyB;IACtC,QAAQ,CAAC,MAAM,uCAAsC;IACrD,QAAQ,CAAC,UAAU,0BAAyB;IAE5C,QAAQ,EAAE,KAAK,CAAC,eAAe,CAAC,CAAkB;IAElD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAkC;gBAEnD,OAAO,CAAC,EAAE,2BAA2B;IAIjD,2GAA2G;IAC3G,IAAI,OAAO,IAAI,OAAO,CAErB;IAQK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAOtB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxC,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;CAUxC"}
1
+ {"version":3,"file":"account_sessions_state.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/account_sessions_state.svelte.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAAC,SAAS,EAAC,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAC,cAAc,EAAC,MAAM,8BAA8B,CAAC;AAC5D,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,2BAA2B,CAAC;AAE/D;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,OAAO,CAAC;QAAC,QAAQ,EAAE,KAAK,CAAC,eAAe,CAAC,CAAA;KAAC,CAAC,CAAC;IACxD,MAAM,EAAE,CAAC,MAAM,EAAE;QAAC,UAAU,EAAE,MAAM,CAAA;KAAC,KAAK,OAAO,CAAC;QAAC,EAAE,EAAE,IAAI,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAC,CAAC,CAAC;IAChF,UAAU,EAAE,MAAM,OAAO,CAAC;QAAC,EAAE,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC,CAAC;CACrD;AAED;;;;GAIG;AACH,eAAO,MAAM,4BAA4B;2CAAwB,kBAAkB;4BAAlB,kBAAkB;uBAAlB,kBAAkB,WAAlB,kBAAkB;CAAG,CAAC;AAEvF,MAAM,WAAW,2BAA2B;IAC3C;;;OAGG;IACH,OAAO,EAAE,MAAM,kBAAkB,CAAC;CAClC;AAED,qBAAa,oBAAoB;;IAGhC,QAAQ,CAAC,IAAI,0BAAyB;IACtC,QAAQ,CAAC,MAAM,uCAAsC;IACrD,QAAQ,CAAC,UAAU,0BAAyB;IAE5C,QAAQ,EAAE,KAAK,CAAC,eAAe,CAAC,CAAkB;IAElD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAkC;gBAEnD,OAAO,EAAE,2BAA2B;IAI1C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAOtB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxC,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;CAUxC"}
@@ -16,10 +16,10 @@ import { AsyncSlot } from './async_slot.svelte.js';
16
16
  import { KeyedAsyncSlot } from './keyed_async_slot.svelte.js';
17
17
  /**
18
18
  * Svelte context carrying the reactive `AccountSessionsRpc` accessor. Mirrors
19
- * the admin-side RPC contexts. Unset context falls back to `() => null` so
20
- * components render the usual "rpc adapter not wired" state.
19
+ * the admin-side RPC contexts. `get()` throws when no provisioner ran above
20
+ * the component the adapter is required.
21
21
  */
22
- export const account_sessions_rpc_context = create_context(() => () => null);
22
+ export const account_sessions_rpc_context = create_context();
23
23
  export class AccountSessionsState {
24
24
  #get_rpc;
25
25
  list = new AsyncSlot();
@@ -28,34 +28,24 @@ export class AccountSessionsState {
28
28
  sessions = $state.raw([]);
29
29
  active_count = $derived(this.sessions.length);
30
30
  constructor(options) {
31
- this.#get_rpc = options?.get_rpc ?? (() => null);
32
- }
33
- /** True when an RPC adapter is wired. `fetch` / `submit_revoke` / `submit_revoke_all` no-op without it. */
34
- get has_rpc() {
35
- return this.#get_rpc() !== null;
36
- }
37
- #require_rpc() {
38
- const rpc = this.#get_rpc();
39
- if (!rpc)
40
- throw new Error('rpc adapter not wired');
41
- return rpc;
31
+ this.#get_rpc = options.get_rpc;
42
32
  }
43
33
  async fetch() {
44
34
  await this.list.run(async () => {
45
- const { sessions } = await this.#require_rpc().list();
35
+ const { sessions } = await this.#get_rpc().list();
46
36
  this.sessions = sessions;
47
37
  });
48
38
  }
49
39
  async submit_revoke(id) {
50
40
  await this.revoke.run(id, async () => {
51
- await this.#require_rpc().revoke({ session_id: id });
41
+ await this.#get_rpc().revoke({ session_id: id });
52
42
  });
53
43
  if (this.revoke.succeeded(id))
54
44
  await this.fetch();
55
45
  }
56
46
  async submit_revoke_all() {
57
47
  await this.revoke_all.run(async () => {
58
- await this.#require_rpc().revoke_all();
48
+ await this.#get_rpc().revoke_all();
59
49
  });
60
50
  if (this.revoke_all.succeeded) {
61
51
  // Current session is now revoked — next API call will 401.
@@ -18,7 +18,7 @@ import { KeyedAsyncSlot } from './keyed_async_slot.svelte.js';
18
18
  import type { AdminAccountEntryJson } from '../auth/account_schema.js';
19
19
  import type { RoleName } from '../auth/role_schema.js';
20
20
  import type { RoleGrantOfferJson } from '../auth/role_grant_offer_schema.js';
21
- import type { AdminAccountListOutput, AdminSessionListOutput, AdminSessionRevokeAllInput, AdminSessionRevokeAllOutput, AdminTokenRevokeAllInput, AdminTokenRevokeAllOutput } from '../auth/admin_action_specs.js';
21
+ import type { AdminAccountListOutput, AccountDeleteOutput, AccountUndeleteOutput, AdminSessionListOutput, AdminSessionRevokeAllInput, AdminSessionRevokeAllOutput, AdminTokenRevokeAllInput, AdminTokenRevokeAllOutput } from '../auth/admin_action_specs.js';
22
22
  import type { RoleGrantOfferCreateInput, RoleGrantOfferCreateOutput, RoleGrantOfferOkOutput, RoleGrantRevokeInput, RoleGrantRevokeOutput } from '../auth/role_grant_offer_action_specs.js';
23
23
  /**
24
24
  * Narrow RPC surface consumed by `AdminAccountsState`. Consumers adapt their
@@ -30,9 +30,7 @@ import type { RoleGrantOfferCreateInput, RoleGrantOfferCreateOutput, RoleGrantOf
30
30
  * Every operation flows through RPC: the listing reuses `admin_account_list`,
31
31
  * grant reuses `role_grant_offer_create`, revoke and retract have dedicated
32
32
  * actions, and the session / token revoke-all mutations reuse
33
- * `admin_session_revoke_all` and `admin_token_revoke_all`. Without the
34
- * adapter the state class cannot fetch, grant, revoke, retract, or
35
- * revoke-all sessions/tokens.
33
+ * `admin_session_revoke_all` and `admin_token_revoke_all`.
36
34
  *
37
35
  * Method signatures track the underlying action specs — `Uuid`-branded ids
38
36
  * propagate from the wire through the state class to the components. The
@@ -40,7 +38,9 @@ import type { RoleGrantOfferCreateInput, RoleGrantOfferCreateOutput, RoleGrantOf
40
38
  * to bridge to the typed throwing Proxy.
41
39
  */
42
40
  export interface AdminAccountsRpc {
43
- list_accounts: () => Promise<AdminAccountListOutput>;
41
+ list_accounts: (include_deleted?: boolean) => Promise<AdminAccountListOutput>;
42
+ delete_account: (account_id: Uuid) => Promise<AccountDeleteOutput>;
43
+ undelete_account: (account_id: Uuid) => Promise<AccountUndeleteOutput>;
44
44
  list_sessions: () => Promise<AdminSessionListOutput>;
45
45
  create_role_grant: (params: RoleGrantOfferCreateInput) => Promise<RoleGrantOfferCreateOutput>;
46
46
  revoke_role_grant: (params: RoleGrantRevokeInput) => Promise<RoleGrantRevokeOutput>;
@@ -54,22 +54,22 @@ export interface AdminAccountsRpc {
54
54
  * consumers read with `const get_rpc = admin_accounts_rpc_context.get();`
55
55
  * and either pass the accessor straight to `AdminAccountsState`/
56
56
  * `AdminSessionsState` or wrap it with `const rpc = $derived(get_rpc());`
57
- * for direct RPC calls. Unset context falls back to `() => null` so
58
- * components mounted without a provisioner surface the usual "rpc adapter
59
- * not wired" path.
57
+ * for direct RPC calls. `get()` throws when no provisioner ran above the
58
+ * component the adapter is required, not optional.
60
59
  */
61
60
  export declare const admin_accounts_rpc_context: {
62
- get: () => () => AdminAccountsRpc | null;
63
- set: (value?: (() => AdminAccountsRpc | null) | undefined) => () => AdminAccountsRpc | null;
61
+ get: (error_message?: string) => () => AdminAccountsRpc;
62
+ get_maybe: () => (() => AdminAccountsRpc) | undefined;
63
+ set: (value: () => AdminAccountsRpc) => () => AdminAccountsRpc;
64
64
  };
65
65
  export interface AdminAccountsStateOptions {
66
66
  /**
67
- * Reactive accessor for the RPC adapter; returns `null` when unwired.
68
- * Matches `RoleGrantOffersStateOptions.account_id` / `actor_id` pattern —
69
- * lets the component pass a `$props()`-sourced rpc without tripping
70
- * Svelte's `state_referenced_locally` warning.
67
+ * Reactive accessor for the RPC adapter. Matches
68
+ * `RoleGrantOffersStateOptions.account_id` / `actor_id` pattern — lets the
69
+ * component pass a `$props()`-sourced rpc without tripping Svelte's
70
+ * `state_referenced_locally` warning.
71
71
  */
72
- get_rpc?: () => AdminAccountsRpc | null;
72
+ get_rpc: () => AdminAccountsRpc;
73
73
  }
74
74
  /**
75
75
  * Compose the `grant` keyed-slot key for an offer. Account-grain offers
@@ -101,16 +101,37 @@ export declare class AdminAccountsState {
101
101
  }, string>;
102
102
  readonly revoke: KeyedAsyncSlot<string & import("zod").$brand<"Uuid">, void, string>;
103
103
  readonly retract: KeyedAsyncSlot<string & import("zod").$brand<"Uuid">, void, string>;
104
+ readonly soft_delete: KeyedAsyncSlot<string & import("zod").$brand<"Uuid">, void, string>;
105
+ readonly undelete: KeyedAsyncSlot<string & import("zod").$brand<"Uuid">, void, string>;
104
106
  accounts: Array<AdminAccountEntryJson>;
105
107
  grantable_roles: Array<RoleName>;
106
- readonly account_count: number;
107
- constructor(options?: AdminAccountsStateOptions);
108
108
  /**
109
- * True when an RPC adapter is wired. UI uses this to gate all controls
110
- * fetch, grant, revoke, retract all flow through the same adapter.
109
+ * When `true`, `fetch()` includes soft-deleted (tombstoned) accounts so
110
+ * the admin can reactivate them. Toggled via `set_show_deleted`.
111
111
  */
112
- get has_rpc(): boolean;
112
+ show_deleted: boolean;
113
+ readonly account_count: number;
114
+ constructor(options: AdminAccountsStateOptions);
113
115
  fetch(): Promise<void>;
116
+ /**
117
+ * Toggle whether soft-deleted accounts appear in the listing, then
118
+ * re-fetch. Tombstoned rows are surfaced so an admin can reactivate them
119
+ * via `submit_undelete`.
120
+ */
121
+ set_show_deleted(value: boolean): Promise<void>;
122
+ /**
123
+ * Soft-delete an account (reversible tombstone) via `account_delete`.
124
+ * Keyed by `account_id` so per-row spinners/errors stay independent.
125
+ * Refreshes the listing on success so the row drops out (active view) or
126
+ * flips to its tombstoned state (`show_deleted` view).
127
+ */
128
+ submit_delete(account_id: Uuid): Promise<void>;
129
+ /**
130
+ * Reactivate a soft-deleted account via `account_undelete` (admin-only).
131
+ * Keyed by `account_id`; refreshes the listing on success so the row
132
+ * returns to active state.
133
+ */
134
+ submit_undelete(account_id: Uuid): Promise<void>;
114
135
  /**
115
136
  * Offer the role to the recipient via the `role_grant_offer_create` RPC.
116
137
  * Server returns the pending offer; the recipient must accept before
@@ -1 +1 @@
1
- {"version":3,"file":"admin_accounts_state.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/admin_accounts_state.svelte.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"admin_accounts_state.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/admin_accounts_state.svelte.ts"],"names":[],"mappings":"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"}
@@ -21,11 +21,10 @@ import { KeyedAsyncSlot } from './keyed_async_slot.svelte.js';
21
21
  * consumers read with `const get_rpc = admin_accounts_rpc_context.get();`
22
22
  * and either pass the accessor straight to `AdminAccountsState`/
23
23
  * `AdminSessionsState` or wrap it with `const rpc = $derived(get_rpc());`
24
- * for direct RPC calls. Unset context falls back to `() => null` so
25
- * components mounted without a provisioner surface the usual "rpc adapter
26
- * not wired" path.
24
+ * for direct RPC calls. `get()` throws when no provisioner ran above the
25
+ * component the adapter is required, not optional.
27
26
  */
28
- export const admin_accounts_rpc_context = create_context(() => () => null);
27
+ export const admin_accounts_rpc_context = create_context();
29
28
  /**
30
29
  * Compose the `grant` keyed-slot key for an offer. Account-grain offers
31
30
  * key on `${account_id}:${role}`; actor-targeted offers add the actor
@@ -39,32 +38,63 @@ export class AdminAccountsState {
39
38
  grant = new KeyedAsyncSlot();
40
39
  revoke = new KeyedAsyncSlot();
41
40
  retract = new KeyedAsyncSlot();
41
+ // Per-row account lifecycle slots, keyed by `account_id`.
42
+ soft_delete = new KeyedAsyncSlot();
43
+ undelete = new KeyedAsyncSlot();
42
44
  accounts = $state.raw([]);
43
45
  grantable_roles = $state.raw([]);
44
- account_count = $derived(this.accounts.length);
45
- constructor(options) {
46
- this.#get_rpc = options?.get_rpc ?? (() => null);
47
- }
48
46
  /**
49
- * True when an RPC adapter is wired. UI uses this to gate all controls
50
- * fetch, grant, revoke, retract all flow through the same adapter.
47
+ * When `true`, `fetch()` includes soft-deleted (tombstoned) accounts so
48
+ * the admin can reactivate them. Toggled via `set_show_deleted`.
51
49
  */
52
- get has_rpc() {
53
- return this.#get_rpc() !== null;
54
- }
55
- #require_rpc() {
56
- const rpc = this.#get_rpc();
57
- if (!rpc)
58
- throw new Error('rpc adapter not wired');
59
- return rpc;
50
+ show_deleted = $state(false);
51
+ account_count = $derived(this.accounts.length);
52
+ constructor(options) {
53
+ this.#get_rpc = options.get_rpc;
60
54
  }
61
55
  async fetch() {
62
56
  await this.list.run(async () => {
63
- const { accounts, grantable_roles } = await this.#require_rpc().list_accounts();
57
+ const { accounts, grantable_roles } = await this.#get_rpc().list_accounts(this.show_deleted);
64
58
  this.accounts = accounts;
65
59
  this.grantable_roles = grantable_roles;
66
60
  });
67
61
  }
62
+ /**
63
+ * Toggle whether soft-deleted accounts appear in the listing, then
64
+ * re-fetch. Tombstoned rows are surfaced so an admin can reactivate them
65
+ * via `submit_undelete`.
66
+ */
67
+ async set_show_deleted(value) {
68
+ if (this.show_deleted === value)
69
+ return;
70
+ this.show_deleted = value;
71
+ await this.fetch();
72
+ }
73
+ /**
74
+ * Soft-delete an account (reversible tombstone) via `account_delete`.
75
+ * Keyed by `account_id` so per-row spinners/errors stay independent.
76
+ * Refreshes the listing on success so the row drops out (active view) or
77
+ * flips to its tombstoned state (`show_deleted` view).
78
+ */
79
+ async submit_delete(account_id) {
80
+ await this.soft_delete.run(account_id, async () => {
81
+ await this.#get_rpc().delete_account(account_id);
82
+ });
83
+ if (this.soft_delete.succeeded(account_id))
84
+ await this.fetch();
85
+ }
86
+ /**
87
+ * Reactivate a soft-deleted account via `account_undelete` (admin-only).
88
+ * Keyed by `account_id`; refreshes the listing on success so the row
89
+ * returns to active state.
90
+ */
91
+ async submit_undelete(account_id) {
92
+ await this.undelete.run(account_id, async () => {
93
+ await this.#get_rpc().undelete_account(account_id);
94
+ });
95
+ if (this.undelete.succeeded(account_id))
96
+ await this.fetch();
97
+ }
68
98
  /**
69
99
  * Offer the role to the recipient via the `role_grant_offer_create` RPC.
70
100
  * Server returns the pending offer; the recipient must accept before
@@ -85,7 +115,7 @@ export class AdminAccountsState {
85
115
  async submit_grant(account_id, role, to_actor_id) {
86
116
  const key = grant_key(account_id, role, to_actor_id);
87
117
  const offer = await this.grant.run(key, async () => {
88
- const result = await this.#require_rpc().create_role_grant({
118
+ const result = await this.#get_rpc().create_role_grant({
89
119
  to_account_id: account_id,
90
120
  role,
91
121
  ...(to_actor_id ? { to_actor_id } : {}),
@@ -107,7 +137,7 @@ export class AdminAccountsState {
107
137
  */
108
138
  async submit_revoke(actor_id, role_grant_id, reason) {
109
139
  await this.revoke.run(role_grant_id, async () => {
110
- await this.#require_rpc().revoke_role_grant({
140
+ await this.#get_rpc().revoke_role_grant({
111
141
  actor_id,
112
142
  role_grant_id,
113
143
  reason: reason ?? null,
@@ -126,7 +156,7 @@ export class AdminAccountsState {
126
156
  */
127
157
  async submit_retract(offer_id) {
128
158
  await this.retract.run(offer_id, async () => {
129
- await this.#require_rpc().retract_offer(offer_id);
159
+ await this.#get_rpc().retract_offer(offer_id);
130
160
  });
131
161
  if (this.retract.succeeded(offer_id))
132
162
  await this.fetch();
@@ -32,18 +32,17 @@ export interface AdminInvitesRpc {
32
32
  }
33
33
  /**
34
34
  * Svelte context carrying the reactive `AdminInvitesRpc` accessor. Mirrors
35
- * `admin_accounts_rpc_context`. Unset context falls back to `() => null`.
35
+ * `admin_accounts_rpc_context`. `get()` throws when no provisioner ran above
36
+ * the component — the adapter is required.
36
37
  */
37
38
  export declare const admin_invites_rpc_context: {
38
- get: () => () => AdminInvitesRpc | null;
39
- set: (value?: (() => AdminInvitesRpc | null) | undefined) => () => AdminInvitesRpc | null;
39
+ get: (error_message?: string) => () => AdminInvitesRpc;
40
+ get_maybe: () => (() => AdminInvitesRpc) | undefined;
41
+ set: (value: () => AdminInvitesRpc) => () => AdminInvitesRpc;
40
42
  };
41
43
  export interface AdminInvitesStateOptions {
42
- /**
43
- * Reactive accessor for the RPC adapter. `null` disables all operations
44
- * (the state reports a descriptive error when mutations/fetches fire).
45
- */
46
- get_rpc?: () => AdminInvitesRpc | null;
44
+ /** Reactive accessor for the RPC adapter. */
45
+ get_rpc: () => AdminInvitesRpc;
47
46
  }
48
47
  export declare class AdminInvitesState {
49
48
  #private;
@@ -53,9 +52,7 @@ export declare class AdminInvitesState {
53
52
  invites: Array<InviteWithUsernamesJson>;
54
53
  readonly invite_count: number;
55
54
  readonly unclaimed_count: number;
56
- constructor(options?: AdminInvitesStateOptions);
57
- /** True when an RPC adapter is wired. All ops require it. */
58
- get has_rpc(): boolean;
55
+ constructor(options: AdminInvitesStateOptions);
59
56
  fetch(): Promise<void>;
60
57
  submit_create(email?: string, username?: string): Promise<boolean>;
61
58
  submit_delete(id: Uuid): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"admin_invites_state.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/admin_invites_state.svelte.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,wBAAwB,CAAC;AAEjD,OAAO,EAAC,SAAS,EAAC,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAC,cAAc,EAAC,MAAM,8BAA8B,CAAC;AAC5D,OAAO,KAAK,EAAC,uBAAuB,EAAC,MAAM,0BAA0B,CAAC;AACtE,OAAO,KAAK,EACX,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,MAAM,+BAA+B,CAAC;AAEvC;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACtC,MAAM,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACnE,MAAM,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACnE;AAED;;;GAGG;AACH,eAAO,MAAM,yBAAyB;qBAAwB,eAAe,GAAG,IAAI;yBAAtB,eAAe,GAAG,IAAI,wBAAtB,eAAe,GAAG,IAAI;CAEnF,CAAC;AAEF,MAAM,WAAW,wBAAwB;IACxC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,eAAe,GAAG,IAAI,CAAC;CACvC;AAED,qBAAa,iBAAiB;;IAG7B,QAAQ,CAAC,IAAI,0BAAyB;IACtC,QAAQ,CAAC,MAAM,0BAAyB;IACxC,QAAQ,CAAC,MAAM,sEAAoC;IAEnD,OAAO,EAAE,KAAK,CAAC,uBAAuB,CAAC,CAAkB;IAEzD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAiC;IAC9D,QAAQ,CAAC,eAAe,EAAE,MAAM,CAA8D;gBAElF,OAAO,CAAC,EAAE,wBAAwB;IAI9C,6DAA6D;IAC7D,IAAI,OAAO,IAAI,OAAO,CAErB;IAQK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAOtB,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASlE,aAAa,CAAC,EAAE,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;CAM5C"}
1
+ {"version":3,"file":"admin_invites_state.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/admin_invites_state.svelte.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,wBAAwB,CAAC;AAEjD,OAAO,EAAC,SAAS,EAAC,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAC,cAAc,EAAC,MAAM,8BAA8B,CAAC;AAC5D,OAAO,KAAK,EAAC,uBAAuB,EAAC,MAAM,0BAA0B,CAAC;AACtE,OAAO,KAAK,EACX,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,MAAM,+BAA+B,CAAC;AAEvC;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACtC,MAAM,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACnE,MAAM,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACnE;AAED;;;;GAIG;AACH,eAAO,MAAM,yBAAyB;2CAAwB,eAAe;4BAAf,eAAe;uBAAf,eAAe,WAAf,eAAe;CAAG,CAAC;AAEjF,MAAM,WAAW,wBAAwB;IACxC,6CAA6C;IAC7C,OAAO,EAAE,MAAM,eAAe,CAAC;CAC/B;AAED,qBAAa,iBAAiB;;IAG7B,QAAQ,CAAC,IAAI,0BAAyB;IACtC,QAAQ,CAAC,MAAM,0BAAyB;IACxC,QAAQ,CAAC,MAAM,sEAAoC;IAEnD,OAAO,EAAE,KAAK,CAAC,uBAAuB,CAAC,CAAkB;IAEzD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAiC;IAC9D,QAAQ,CAAC,eAAe,EAAE,MAAM,CAA8D;gBAElF,OAAO,EAAE,wBAAwB;IAIvC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAOtB,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASlE,aAAa,CAAC,EAAE,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;CAM5C"}
@@ -18,9 +18,10 @@ import { AsyncSlot } from './async_slot.svelte.js';
18
18
  import { KeyedAsyncSlot } from './keyed_async_slot.svelte.js';
19
19
  /**
20
20
  * Svelte context carrying the reactive `AdminInvitesRpc` accessor. Mirrors
21
- * `admin_accounts_rpc_context`. Unset context falls back to `() => null`.
21
+ * `admin_accounts_rpc_context`. `get()` throws when no provisioner ran above
22
+ * the component — the adapter is required.
22
23
  */
23
- export const admin_invites_rpc_context = create_context(() => () => null);
24
+ export const admin_invites_rpc_context = create_context();
24
25
  export class AdminInvitesState {
25
26
  #get_rpc;
26
27
  list = new AsyncSlot();
@@ -30,27 +31,17 @@ export class AdminInvitesState {
30
31
  invite_count = $derived(this.invites.length);
31
32
  unclaimed_count = $derived(this.invites.filter((i) => !i.claimed_at).length);
32
33
  constructor(options) {
33
- this.#get_rpc = options?.get_rpc ?? (() => null);
34
- }
35
- /** True when an RPC adapter is wired. All ops require it. */
36
- get has_rpc() {
37
- return this.#get_rpc() !== null;
38
- }
39
- #require_rpc() {
40
- const rpc = this.#get_rpc();
41
- if (!rpc)
42
- throw new Error('rpc adapter not wired');
43
- return rpc;
34
+ this.#get_rpc = options.get_rpc;
44
35
  }
45
36
  async fetch() {
46
37
  await this.list.run(async () => {
47
- const { invites } = await this.#require_rpc().list();
38
+ const { invites } = await this.#get_rpc().list();
48
39
  this.invites = invites;
49
40
  });
50
41
  }
51
42
  async submit_create(email, username) {
52
43
  await this.create.run(async () => {
53
- await this.#require_rpc().create({ email: email ?? null, username: username ?? null });
44
+ await this.#get_rpc().create({ email: email ?? null, username: username ?? null });
54
45
  });
55
46
  if (!this.create.succeeded)
56
47
  return false;
@@ -59,7 +50,7 @@ export class AdminInvitesState {
59
50
  }
60
51
  async submit_delete(id) {
61
52
  await this.remove.run(id, async () => {
62
- await this.#require_rpc().delete({ invite_id: id });
53
+ await this.#get_rpc().delete({ invite_id: id });
63
54
  });
64
55
  if (this.remove.succeeded(id))
65
56
  await this.fetch();
@@ -32,7 +32,7 @@
32
32
  *
33
33
  * @module
34
34
  */
35
- import type { AdminAccountListOutput, AdminSessionListOutput, AdminSessionRevokeAllInput, AdminSessionRevokeAllOutput, AdminTokenRevokeAllInput, AdminTokenRevokeAllOutput, AuditLogListInput, AuditLogListOutput, AuditLogRoleGrantHistoryInput, AuditLogRoleGrantHistoryOutput, InviteCreateInput, InviteCreateOutput, InviteDeleteInput, InviteDeleteOutput, InviteListOutput, AppSettingsGetOutput, AppSettingsUpdateInput, AppSettingsUpdateOutput } from '../auth/admin_action_specs.js';
35
+ import type { AdminAccountListInput, AdminAccountListOutput, AccountDeleteInput, AccountDeleteOutput, AccountUndeleteInput, AccountUndeleteOutput, AdminSessionListOutput, AdminSessionRevokeAllInput, AdminSessionRevokeAllOutput, AdminTokenRevokeAllInput, AdminTokenRevokeAllOutput, AuditLogListInput, AuditLogListOutput, AuditLogRoleGrantHistoryInput, AuditLogRoleGrantHistoryOutput, InviteCreateInput, InviteCreateOutput, InviteDeleteInput, InviteDeleteOutput, InviteListOutput, AppSettingsGetOutput, AppSettingsUpdateInput, AppSettingsUpdateOutput } from '../auth/admin_action_specs.js';
36
36
  import type { RoleGrantOfferCreateInput, RoleGrantOfferCreateOutput, RoleGrantOfferRetractInput, RoleGrantOfferOkOutput, RoleGrantRevokeInput, RoleGrantRevokeOutput } from '../auth/role_grant_offer_action_specs.js';
37
37
  import { type AdminAccountsRpc } from './admin_accounts_state.svelte.js';
38
38
  import { type AdminInvitesRpc } from './admin_invites_state.svelte.js';
@@ -51,7 +51,9 @@ import { type FormatScope } from './format_scope.js';
51
51
  * assignable as long as these methods are present at these signatures.
52
52
  */
53
53
  export interface AdminRpcApi {
54
- admin_account_list: () => Promise<AdminAccountListOutput>;
54
+ admin_account_list: (input?: AdminAccountListInput) => Promise<AdminAccountListOutput>;
55
+ account_delete: (input: AccountDeleteInput) => Promise<AccountDeleteOutput>;
56
+ account_undelete: (input: AccountUndeleteInput) => Promise<AccountUndeleteOutput>;
55
57
  admin_session_list: () => Promise<AdminSessionListOutput>;
56
58
  admin_session_revoke_all: (input: AdminSessionRevokeAllInput) => Promise<AdminSessionRevokeAllOutput>;
57
59
  admin_token_revoke_all: (input: AdminTokenRevokeAllInput) => Promise<AdminTokenRevokeAllOutput>;
@@ -81,6 +83,8 @@ export interface AdminRpcAdapters {
81
83
  * | Narrow RPC method | Action spec method |
82
84
  * | ----------------------------------- | ---------------------------- |
83
85
  * | `admin_accounts.list_accounts` | `admin_account_list` |
86
+ * | `admin_accounts.delete_account` | `account_delete` (soft) |
87
+ * | `admin_accounts.undelete_account` | `account_undelete` |
84
88
  * | `admin_accounts.list_sessions` | `admin_session_list` |
85
89
  * | `admin_accounts.create_role_grant` | `role_grant_offer_create` |
86
90
  * | `admin_accounts.revoke_role_grant` | `role_grant_revoke` |
@@ -1 +1 @@
1
- {"version":3,"file":"admin_rpc_adapters.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/admin_rpc_adapters.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"admin_rpc_adapters.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/admin_rpc_adapters.ts"],"names":[],"mappings":"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"}
@@ -45,6 +45,8 @@ import { format_scope_context } from './format_scope.js';
45
45
  * | Narrow RPC method | Action spec method |
46
46
  * | ----------------------------------- | ---------------------------- |
47
47
  * | `admin_accounts.list_accounts` | `admin_account_list` |
48
+ * | `admin_accounts.delete_account` | `account_delete` (soft) |
49
+ * | `admin_accounts.undelete_account` | `account_undelete` |
48
50
  * | `admin_accounts.list_sessions` | `admin_session_list` |
49
51
  * | `admin_accounts.create_role_grant` | `role_grant_offer_create` |
50
52
  * | `admin_accounts.revoke_role_grant` | `role_grant_revoke` |
@@ -65,7 +67,9 @@ import { format_scope_context } from './format_scope.js';
65
67
  */
66
68
  export const create_admin_rpc_adapters = (api) => ({
67
69
  admin_accounts: {
68
- list_accounts: () => api.admin_account_list(),
70
+ list_accounts: (include_deleted) => api.admin_account_list({ include_deleted }),
71
+ delete_account: (account_id) => api.account_delete({ account_id }),
72
+ undelete_account: (account_id) => api.account_undelete({ account_id }),
69
73
  list_sessions: () => api.admin_session_list(),
70
74
  create_role_grant: (params) => api.role_grant_offer_create(params),
71
75
  revoke_role_grant: (params) => api.role_grant_revoke(params),
@@ -23,17 +23,15 @@ import type { AdminSessionJson } from '../auth/audit_log_schema.js';
23
23
  * Options for `AdminSessionsState`.
24
24
  *
25
25
  * The RPC adapter drives every operation (listing + the two revoke-all
26
- * mutations). Without it, the slots' `run()` calls fail with
27
- * `'rpc adapter not wired'` on `error`.
26
+ * mutations).
28
27
  */
29
28
  export interface AdminSessionsStateOptions {
30
29
  /**
31
- * Reactive accessor for the RPC adapter; returns `null` when unwired.
32
- * Mirrors `AdminAccountsStateOptions.get_rpc` so a single adapter
33
- * instance backs both states without tripping Svelte's
34
- * `state_referenced_locally` warning.
30
+ * Reactive accessor for the RPC adapter. Mirrors
31
+ * `AdminAccountsStateOptions.get_rpc` so a single adapter instance backs
32
+ * both states without tripping Svelte's `state_referenced_locally` warning.
35
33
  */
36
- get_rpc?: () => AdminAccountsRpc | null;
34
+ get_rpc: () => AdminAccountsRpc;
37
35
  }
38
36
  export declare class AdminSessionsState {
39
37
  #private;
@@ -42,9 +40,7 @@ export declare class AdminSessionsState {
42
40
  readonly revoke_tokens: KeyedAsyncSlot<string & import("zod").$brand<"Uuid">, void, string>;
43
41
  sessions: Array<AdminSessionJson>;
44
42
  readonly active_count: number;
45
- constructor(options?: AdminSessionsStateOptions);
46
- /** True when an RPC adapter is wired. `fetch` and the revoke controls no-op without it. */
47
- get has_rpc(): boolean;
43
+ constructor(options: AdminSessionsStateOptions);
48
44
  fetch(): Promise<void>;
49
45
  submit_revoke_sessions(account_id: Uuid): Promise<void>;
50
46
  submit_revoke_tokens(account_id: Uuid): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"admin_sessions_state.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/admin_sessions_state.svelte.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,wBAAwB,CAAC;AAEjD,OAAO,EAAC,SAAS,EAAC,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAC,cAAc,EAAC,MAAM,8BAA8B,CAAC;AAC5D,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,kCAAkC,CAAC;AACvE,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,6BAA6B,CAAC;AAElE;;;;;;GAMG;AACH,MAAM,WAAW,yBAAyB;IACzC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,gBAAgB,GAAG,IAAI,CAAC;CACxC;AAED,qBAAa,kBAAkB;;IAG9B,QAAQ,CAAC,IAAI,0BAAyB;IACtC,QAAQ,CAAC,eAAe,sEAAoC;IAC5D,QAAQ,CAAC,aAAa,sEAAoC;IAE1D,QAAQ,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAkB;IAEnD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAkC;gBAEnD,OAAO,CAAC,EAAE,yBAAyB;IAI/C,2FAA2F;IAC3F,IAAI,OAAO,IAAI,OAAO,CAErB;IAQK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAOtB,sBAAsB,CAAC,UAAU,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAOvD,oBAAoB,CAAC,UAAU,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;CAM3D"}
1
+ {"version":3,"file":"admin_sessions_state.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/admin_sessions_state.svelte.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,wBAAwB,CAAC;AAEjD,OAAO,EAAC,SAAS,EAAC,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAC,cAAc,EAAC,MAAM,8BAA8B,CAAC;AAC5D,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,kCAAkC,CAAC;AACvE,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,6BAA6B,CAAC;AAElE;;;;;GAKG;AACH,MAAM,WAAW,yBAAyB;IACzC;;;;OAIG;IACH,OAAO,EAAE,MAAM,gBAAgB,CAAC;CAChC;AAED,qBAAa,kBAAkB;;IAG9B,QAAQ,CAAC,IAAI,0BAAyB;IACtC,QAAQ,CAAC,eAAe,sEAAoC;IAC5D,QAAQ,CAAC,aAAa,sEAAoC;IAE1D,QAAQ,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAkB;IAEnD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAkC;gBAEnD,OAAO,EAAE,yBAAyB;IAIxC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAOtB,sBAAsB,CAAC,UAAU,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAOvD,oBAAoB,CAAC,UAAU,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;CAM3D"}
@@ -24,34 +24,24 @@ export class AdminSessionsState {
24
24
  sessions = $state.raw([]);
25
25
  active_count = $derived(this.sessions.length);
26
26
  constructor(options) {
27
- this.#get_rpc = options?.get_rpc ?? (() => null);
28
- }
29
- /** True when an RPC adapter is wired. `fetch` and the revoke controls no-op without it. */
30
- get has_rpc() {
31
- return this.#get_rpc() !== null;
32
- }
33
- #require_rpc() {
34
- const rpc = this.#get_rpc();
35
- if (!rpc)
36
- throw new Error('rpc adapter not wired');
37
- return rpc;
27
+ this.#get_rpc = options.get_rpc;
38
28
  }
39
29
  async fetch() {
40
30
  await this.list.run(async () => {
41
- const { sessions } = await this.#require_rpc().list_sessions();
31
+ const { sessions } = await this.#get_rpc().list_sessions();
42
32
  this.sessions = sessions;
43
33
  });
44
34
  }
45
35
  async submit_revoke_sessions(account_id) {
46
36
  await this.revoke_sessions.run(account_id, async () => {
47
- await this.#require_rpc().session_revoke_all({ account_id });
37
+ await this.#get_rpc().session_revoke_all({ account_id });
48
38
  });
49
39
  if (this.revoke_sessions.succeeded(account_id))
50
40
  await this.fetch();
51
41
  }
52
42
  async submit_revoke_tokens(account_id) {
53
43
  await this.revoke_tokens.run(account_id, async () => {
54
- await this.#require_rpc().token_revoke_all({ account_id });
44
+ await this.#get_rpc().token_revoke_all({ account_id });
55
45
  });
56
46
  if (this.revoke_tokens.succeeded(account_id))
57
47
  await this.fetch();