@fuzdev/fuz_app 0.30.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 (207) 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/auth/CLAUDE.md +923 -0
  22. package/dist/auth/account_action_specs.d.ts +216 -0
  23. package/dist/auth/account_action_specs.d.ts.map +1 -0
  24. package/dist/auth/account_action_specs.js +159 -0
  25. package/dist/auth/account_actions.d.ts +51 -0
  26. package/dist/auth/account_actions.d.ts.map +1 -0
  27. package/dist/auth/account_actions.js +119 -0
  28. package/dist/auth/account_queries.d.ts +6 -2
  29. package/dist/auth/account_queries.d.ts.map +1 -1
  30. package/dist/auth/account_queries.js +40 -4
  31. package/dist/auth/account_routes.d.ts +94 -16
  32. package/dist/auth/account_routes.d.ts.map +1 -1
  33. package/dist/auth/account_routes.js +108 -180
  34. package/dist/auth/account_schema.d.ts +85 -30
  35. package/dist/auth/account_schema.d.ts.map +1 -1
  36. package/dist/auth/account_schema.js +40 -8
  37. package/dist/auth/admin_action_specs.d.ts +674 -0
  38. package/dist/auth/admin_action_specs.d.ts.map +1 -0
  39. package/dist/auth/admin_action_specs.js +287 -0
  40. package/dist/auth/admin_actions.d.ts +69 -0
  41. package/dist/auth/admin_actions.d.ts.map +1 -0
  42. package/dist/auth/admin_actions.js +256 -0
  43. package/dist/auth/api_token.d.ts +10 -0
  44. package/dist/auth/api_token.d.ts.map +1 -1
  45. package/dist/auth/api_token.js +9 -0
  46. package/dist/auth/api_token_queries.d.ts +3 -3
  47. package/dist/auth/api_token_queries.js +3 -3
  48. package/dist/auth/app_settings_schema.d.ts +4 -3
  49. package/dist/auth/app_settings_schema.d.ts.map +1 -1
  50. package/dist/auth/app_settings_schema.js +2 -1
  51. package/dist/auth/audit_log_routes.d.ts +14 -6
  52. package/dist/auth/audit_log_routes.d.ts.map +1 -1
  53. package/dist/auth/audit_log_routes.js +22 -79
  54. package/dist/auth/audit_log_schema.d.ts +100 -29
  55. package/dist/auth/audit_log_schema.d.ts.map +1 -1
  56. package/dist/auth/audit_log_schema.js +83 -11
  57. package/dist/auth/bootstrap_routes.d.ts +14 -0
  58. package/dist/auth/bootstrap_routes.d.ts.map +1 -1
  59. package/dist/auth/bootstrap_routes.js +10 -3
  60. package/dist/auth/cleanup.d.ts +63 -0
  61. package/dist/auth/cleanup.d.ts.map +1 -0
  62. package/dist/auth/cleanup.js +80 -0
  63. package/dist/auth/invite_schema.d.ts +11 -10
  64. package/dist/auth/invite_schema.d.ts.map +1 -1
  65. package/dist/auth/invite_schema.js +4 -3
  66. package/dist/auth/migrations.d.ts +6 -0
  67. package/dist/auth/migrations.d.ts.map +1 -1
  68. package/dist/auth/migrations.js +28 -0
  69. package/dist/auth/permit_offer_action_specs.d.ts +364 -0
  70. package/dist/auth/permit_offer_action_specs.d.ts.map +1 -0
  71. package/dist/auth/permit_offer_action_specs.js +216 -0
  72. package/dist/auth/permit_offer_actions.d.ts +96 -0
  73. package/dist/auth/permit_offer_actions.d.ts.map +1 -0
  74. package/dist/auth/permit_offer_actions.js +428 -0
  75. package/dist/auth/permit_offer_notifications.d.ts +361 -0
  76. package/dist/auth/permit_offer_notifications.d.ts.map +1 -0
  77. package/dist/auth/permit_offer_notifications.js +179 -0
  78. package/dist/auth/permit_offer_queries.d.ts +165 -0
  79. package/dist/auth/permit_offer_queries.d.ts.map +1 -0
  80. package/dist/auth/permit_offer_queries.js +390 -0
  81. package/dist/auth/permit_offer_schema.d.ts +103 -0
  82. package/dist/auth/permit_offer_schema.d.ts.map +1 -0
  83. package/dist/auth/permit_offer_schema.js +142 -0
  84. package/dist/auth/permit_queries.d.ts +77 -14
  85. package/dist/auth/permit_queries.d.ts.map +1 -1
  86. package/dist/auth/permit_queries.js +119 -24
  87. package/dist/auth/session_queries.d.ts +4 -2
  88. package/dist/auth/session_queries.d.ts.map +1 -1
  89. package/dist/auth/session_queries.js +4 -2
  90. package/dist/auth/signup_routes.d.ts +13 -0
  91. package/dist/auth/signup_routes.d.ts.map +1 -1
  92. package/dist/auth/signup_routes.js +14 -7
  93. package/dist/http/CLAUDE.md +584 -0
  94. package/dist/http/pending_effects.d.ts +29 -0
  95. package/dist/http/pending_effects.d.ts.map +1 -0
  96. package/dist/http/pending_effects.js +31 -0
  97. package/dist/http/route_spec.d.ts.map +1 -1
  98. package/dist/http/route_spec.js +4 -3
  99. package/dist/rate_limiter.d.ts +30 -0
  100. package/dist/rate_limiter.d.ts.map +1 -1
  101. package/dist/rate_limiter.js +25 -2
  102. package/dist/realtime/sse_auth_guard.d.ts +2 -0
  103. package/dist/realtime/sse_auth_guard.d.ts.map +1 -1
  104. package/dist/realtime/sse_auth_guard.js +5 -3
  105. package/dist/testing/CLAUDE.md +668 -1
  106. package/dist/testing/admin_integration.d.ts +10 -7
  107. package/dist/testing/admin_integration.d.ts.map +1 -1
  108. package/dist/testing/admin_integration.js +382 -482
  109. package/dist/testing/app_server.d.ts +7 -6
  110. package/dist/testing/app_server.d.ts.map +1 -1
  111. package/dist/testing/attack_surface.d.ts +9 -3
  112. package/dist/testing/attack_surface.d.ts.map +1 -1
  113. package/dist/testing/attack_surface.js +4 -4
  114. package/dist/testing/audit_completeness.d.ts +6 -0
  115. package/dist/testing/audit_completeness.d.ts.map +1 -1
  116. package/dist/testing/audit_completeness.js +158 -134
  117. package/dist/testing/auth_apps.d.ts.map +1 -1
  118. package/dist/testing/auth_apps.js +4 -33
  119. package/dist/testing/db.d.ts +1 -1
  120. package/dist/testing/db.d.ts.map +1 -1
  121. package/dist/testing/db.js +2 -0
  122. package/dist/testing/entities.d.ts +35 -13
  123. package/dist/testing/entities.d.ts.map +1 -1
  124. package/dist/testing/entities.js +17 -0
  125. package/dist/testing/integration.d.ts +10 -0
  126. package/dist/testing/integration.d.ts.map +1 -1
  127. package/dist/testing/integration.js +352 -340
  128. package/dist/testing/integration_helpers.d.ts +16 -5
  129. package/dist/testing/integration_helpers.d.ts.map +1 -1
  130. package/dist/testing/integration_helpers.js +24 -4
  131. package/dist/testing/rate_limiting.d.ts +7 -0
  132. package/dist/testing/rate_limiting.d.ts.map +1 -1
  133. package/dist/testing/rate_limiting.js +41 -10
  134. package/dist/testing/rpc_helpers.d.ts +153 -1
  135. package/dist/testing/rpc_helpers.d.ts.map +1 -1
  136. package/dist/testing/rpc_helpers.js +184 -8
  137. package/dist/testing/sse_round_trip.d.ts +8 -0
  138. package/dist/testing/sse_round_trip.d.ts.map +1 -1
  139. package/dist/testing/sse_round_trip.js +10 -3
  140. package/dist/testing/standard.d.ts +9 -1
  141. package/dist/testing/standard.d.ts.map +1 -1
  142. package/dist/testing/standard.js +6 -2
  143. package/dist/testing/surface_invariants.d.ts +7 -3
  144. package/dist/testing/surface_invariants.d.ts.map +1 -1
  145. package/dist/testing/surface_invariants.js +5 -4
  146. package/dist/testing/ws_round_trip.d.ts.map +1 -1
  147. package/dist/testing/ws_round_trip.js +9 -38
  148. package/dist/ui/AccountSessions.svelte +8 -4
  149. package/dist/ui/AccountSessions.svelte.d.ts.map +1 -1
  150. package/dist/ui/AdminAccounts.svelte +61 -33
  151. package/dist/ui/AdminAccounts.svelte.d.ts.map +1 -1
  152. package/dist/ui/AdminAuditLog.svelte +3 -2
  153. package/dist/ui/AdminAuditLog.svelte.d.ts.map +1 -1
  154. package/dist/ui/AdminInvites.svelte +3 -2
  155. package/dist/ui/AdminInvites.svelte.d.ts.map +1 -1
  156. package/dist/ui/AdminOverview.svelte +14 -9
  157. package/dist/ui/AdminOverview.svelte.d.ts.map +1 -1
  158. package/dist/ui/AdminPermitHistory.svelte +3 -2
  159. package/dist/ui/AdminPermitHistory.svelte.d.ts.map +1 -1
  160. package/dist/ui/AdminSessions.svelte +29 -25
  161. package/dist/ui/AdminSessions.svelte.d.ts.map +1 -1
  162. package/dist/ui/CLAUDE.md +351 -0
  163. package/dist/ui/OpenSignupToggle.svelte +6 -3
  164. package/dist/ui/OpenSignupToggle.svelte.d.ts.map +1 -1
  165. package/dist/ui/PermitOfferForm.svelte +141 -0
  166. package/dist/ui/PermitOfferForm.svelte.d.ts +14 -0
  167. package/dist/ui/PermitOfferForm.svelte.d.ts.map +1 -0
  168. package/dist/ui/PermitOfferHistory.svelte +109 -0
  169. package/dist/ui/PermitOfferHistory.svelte.d.ts +11 -0
  170. package/dist/ui/PermitOfferHistory.svelte.d.ts.map +1 -0
  171. package/dist/ui/PermitOfferInbox.svelte +121 -0
  172. package/dist/ui/PermitOfferInbox.svelte.d.ts +12 -0
  173. package/dist/ui/PermitOfferInbox.svelte.d.ts.map +1 -0
  174. package/dist/ui/account_sessions_state.svelte.d.ts +53 -3
  175. package/dist/ui/account_sessions_state.svelte.d.ts.map +1 -1
  176. package/dist/ui/account_sessions_state.svelte.js +39 -16
  177. package/dist/ui/admin_accounts_state.svelte.d.ts +118 -2
  178. package/dist/ui/admin_accounts_state.svelte.d.ts.map +1 -1
  179. package/dist/ui/admin_accounts_state.svelte.js +99 -23
  180. package/dist/ui/admin_invites_state.svelte.d.ts +47 -1
  181. package/dist/ui/admin_invites_state.svelte.d.ts.map +1 -1
  182. package/dist/ui/admin_invites_state.svelte.js +38 -26
  183. package/dist/ui/admin_sessions_state.svelte.d.ts +26 -0
  184. package/dist/ui/admin_sessions_state.svelte.d.ts.map +1 -1
  185. package/dist/ui/admin_sessions_state.svelte.js +35 -21
  186. package/dist/ui/app_settings_state.svelte.d.ts +39 -0
  187. package/dist/ui/app_settings_state.svelte.d.ts.map +1 -1
  188. package/dist/ui/app_settings_state.svelte.js +34 -18
  189. package/dist/ui/audit_log_state.svelte.d.ts +40 -3
  190. package/dist/ui/audit_log_state.svelte.d.ts.map +1 -1
  191. package/dist/ui/audit_log_state.svelte.js +36 -42
  192. package/dist/ui/auth_state.svelte.d.ts +4 -3
  193. package/dist/ui/auth_state.svelte.d.ts.map +1 -1
  194. package/dist/ui/auth_state.svelte.js +4 -1
  195. package/dist/ui/permit_offers_state.svelte.d.ts +125 -0
  196. package/dist/ui/permit_offers_state.svelte.d.ts.map +1 -0
  197. package/dist/ui/permit_offers_state.svelte.js +197 -0
  198. package/package.json +3 -3
  199. package/dist/auth/admin_routes.d.ts +0 -29
  200. package/dist/auth/admin_routes.d.ts.map +0 -1
  201. package/dist/auth/admin_routes.js +0 -226
  202. package/dist/auth/app_settings_routes.d.ts +0 -27
  203. package/dist/auth/app_settings_routes.d.ts.map +0 -1
  204. package/dist/auth/app_settings_routes.js +0 -66
  205. package/dist/auth/invite_routes.d.ts +0 -18
  206. package/dist/auth/invite_routes.d.ts.map +0 -1
  207. package/dist/auth/invite_routes.js +0 -129
@@ -0,0 +1,364 @@
1
+ /**
2
+ * Permit offer RPC action specs — declarative contract for the
3
+ * consentful-permits surface (offer lifecycle + admin revoke).
4
+ *
5
+ * Import this module for the specs, Input/Output schemas, `ERROR_OFFER_*`
6
+ * reason constants, and the `all_permit_offer_action_specs` registry.
7
+ * Handlers live in `./permit_offer_actions.js`.
8
+ *
9
+ * Authorization enforcement: offer-lifecycle specs declare
10
+ * `auth: 'authenticated'` and rely on `query_*` IDOR guards or in-handler
11
+ * policy checks (e.g. `permit_offer_list`/`_history` elevate to admin only
12
+ * when inspecting another account — an input-dependent check that can't be
13
+ * expressed at the spec level). `permit_revoke` declares
14
+ * `auth: {role: 'admin'}` — the RPC dispatcher's per-spec `check_action_auth`
15
+ * gates it before the handler runs even though the endpoint hosts non-admin
16
+ * methods alongside.
17
+ *
18
+ * @module
19
+ */
20
+ import { z } from 'zod';
21
+ import type { RequestResponseActionSpec } from '../actions/action_spec.js';
22
+ /** Error reason — caller tried to offer themselves a permit. */
23
+ export declare const ERROR_OFFER_SELF_TARGET: "offer_self_target";
24
+ /** Error reason — offer is declined, retracted, or superseded. */
25
+ export declare const ERROR_OFFER_TERMINAL: "offer_terminal";
26
+ /** Error reason — offer's `expires_at` has passed. */
27
+ export declare const ERROR_OFFER_EXPIRED: "offer_expired";
28
+ /** Error reason — offer does not exist or belongs to a different recipient (404-over-403 IDOR mask). */
29
+ export declare const ERROR_OFFER_NOT_FOUND: "offer_not_found";
30
+ /** Error reason — the offered role is not `web_grantable` (nobody may offer it via this surface). */
31
+ export declare const ERROR_OFFER_ROLE_NOT_GRANTABLE: "offer_role_not_grantable";
32
+ /** Error reason — caller is not authorized to offer this role (default policy: caller lacks the role; consumer `authorize` callback may add further policy). */
33
+ export declare const ERROR_OFFER_NOT_AUTHORIZED: "offer_not_authorized";
34
+ /** Input for `permit_offer_create`. */
35
+ export declare const PermitOfferCreateInput: z.ZodObject<{
36
+ to_account_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
37
+ role: z.ZodString;
38
+ scope_id: z.ZodOptional<z.ZodNullable<z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">>>;
39
+ message: z.ZodOptional<z.ZodNullable<z.ZodString>>;
40
+ }, z.core.$strict>;
41
+ export type PermitOfferCreateInput = z.infer<typeof PermitOfferCreateInput>;
42
+ /** Input for `permit_offer_accept`. */
43
+ export declare const PermitOfferAcceptInput: z.ZodObject<{
44
+ offer_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
45
+ }, z.core.$strict>;
46
+ export type PermitOfferAcceptInput = z.infer<typeof PermitOfferAcceptInput>;
47
+ /** Input for `permit_offer_decline`. */
48
+ export declare const PermitOfferDeclineInput: z.ZodObject<{
49
+ offer_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
50
+ reason: z.ZodOptional<z.ZodNullable<z.ZodString>>;
51
+ }, z.core.$strict>;
52
+ export type PermitOfferDeclineInput = z.infer<typeof PermitOfferDeclineInput>;
53
+ /** Input for `permit_offer_retract`. */
54
+ export declare const PermitOfferRetractInput: z.ZodObject<{
55
+ offer_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
56
+ }, z.core.$strict>;
57
+ export type PermitOfferRetractInput = z.infer<typeof PermitOfferRetractInput>;
58
+ /** Input for `permit_offer_list`. `account_id` is admin-only (inspect another account's inbox). */
59
+ export declare const PermitOfferListInput: z.ZodObject<{
60
+ account_id: z.ZodOptional<z.ZodNullable<z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">>>;
61
+ }, z.core.$strict>;
62
+ export type PermitOfferListInput = z.infer<typeof PermitOfferListInput>;
63
+ /**
64
+ * Input for `permit_revoke`. Admin-only mutation that revokes an active
65
+ * permit on a target actor. `actor_id` is the natural key — permits are
66
+ * actor-scoped, and the admin UI reads `row.actor.id` straight from the
67
+ * listing. Deriving `actor_id` from `account_id` would collapse under
68
+ * multi-actor accounts.
69
+ */
70
+ export declare const PermitRevokeInput: z.ZodObject<{
71
+ actor_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
72
+ permit_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
73
+ reason: z.ZodOptional<z.ZodNullable<z.ZodString>>;
74
+ }, z.core.$strict>;
75
+ export type PermitRevokeInput = z.infer<typeof PermitRevokeInput>;
76
+ /**
77
+ * Input for `permit_offer_history`. Returns every offer involving the account
78
+ * in either direction (recipient or grantor), including terminal rows, newest
79
+ * first. `account_id` is admin-only.
80
+ */
81
+ export declare const PermitOfferHistoryInput: z.ZodObject<{
82
+ account_id: z.ZodOptional<z.ZodNullable<z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">>>;
83
+ limit: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
84
+ offset: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
85
+ }, z.core.$strict>;
86
+ export type PermitOfferHistoryInput = z.infer<typeof PermitOfferHistoryInput>;
87
+ /** Output for `permit_offer_create`. */
88
+ export declare const PermitOfferCreateOutput: z.ZodObject<{
89
+ offer: z.ZodObject<{
90
+ id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
91
+ from_actor_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
92
+ to_account_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
93
+ role: z.ZodString;
94
+ scope_id: z.ZodNullable<z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">>;
95
+ message: z.ZodNullable<z.ZodString>;
96
+ created_at: z.ZodString;
97
+ expires_at: z.ZodString;
98
+ accepted_at: z.ZodNullable<z.ZodString>;
99
+ declined_at: z.ZodNullable<z.ZodString>;
100
+ decline_reason: z.ZodNullable<z.ZodString>;
101
+ retracted_at: z.ZodNullable<z.ZodString>;
102
+ superseded_at: z.ZodNullable<z.ZodString>;
103
+ resulting_permit_id: z.ZodNullable<z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">>;
104
+ }, z.core.$strict>;
105
+ }, z.core.$strict>;
106
+ export type PermitOfferCreateOutput = z.infer<typeof PermitOfferCreateOutput>;
107
+ /** Output for `permit_offer_accept`. */
108
+ export declare const PermitOfferAcceptOutput: z.ZodObject<{
109
+ permit_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
110
+ offer: z.ZodObject<{
111
+ id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
112
+ from_actor_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
113
+ to_account_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
114
+ role: z.ZodString;
115
+ scope_id: z.ZodNullable<z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">>;
116
+ message: z.ZodNullable<z.ZodString>;
117
+ created_at: z.ZodString;
118
+ expires_at: z.ZodString;
119
+ accepted_at: z.ZodNullable<z.ZodString>;
120
+ declined_at: z.ZodNullable<z.ZodString>;
121
+ decline_reason: z.ZodNullable<z.ZodString>;
122
+ retracted_at: z.ZodNullable<z.ZodString>;
123
+ superseded_at: z.ZodNullable<z.ZodString>;
124
+ resulting_permit_id: z.ZodNullable<z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">>;
125
+ }, z.core.$strict>;
126
+ superseded_offer_ids: z.ZodArray<z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">>;
127
+ }, z.core.$strict>;
128
+ export type PermitOfferAcceptOutput = z.infer<typeof PermitOfferAcceptOutput>;
129
+ /** Output for `permit_offer_decline` / `permit_offer_retract`. */
130
+ export declare const PermitOfferOkOutput: z.ZodObject<{
131
+ ok: z.ZodLiteral<true>;
132
+ }, z.core.$strict>;
133
+ export type PermitOfferOkOutput = z.infer<typeof PermitOfferOkOutput>;
134
+ /** Output for `permit_offer_list`. */
135
+ export declare const PermitOfferListOutput: z.ZodObject<{
136
+ offers: z.ZodArray<z.ZodObject<{
137
+ id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
138
+ from_actor_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
139
+ to_account_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
140
+ role: z.ZodString;
141
+ scope_id: z.ZodNullable<z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">>;
142
+ message: z.ZodNullable<z.ZodString>;
143
+ created_at: z.ZodString;
144
+ expires_at: z.ZodString;
145
+ accepted_at: z.ZodNullable<z.ZodString>;
146
+ declined_at: z.ZodNullable<z.ZodString>;
147
+ decline_reason: z.ZodNullable<z.ZodString>;
148
+ retracted_at: z.ZodNullable<z.ZodString>;
149
+ superseded_at: z.ZodNullable<z.ZodString>;
150
+ resulting_permit_id: z.ZodNullable<z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">>;
151
+ }, z.core.$strict>>;
152
+ }, z.core.$strict>;
153
+ export type PermitOfferListOutput = z.infer<typeof PermitOfferListOutput>;
154
+ /** Output for `permit_offer_history`. */
155
+ export declare const PermitOfferHistoryOutput: z.ZodObject<{
156
+ offers: z.ZodArray<z.ZodObject<{
157
+ id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
158
+ from_actor_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
159
+ to_account_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
160
+ role: z.ZodString;
161
+ scope_id: z.ZodNullable<z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">>;
162
+ message: z.ZodNullable<z.ZodString>;
163
+ created_at: z.ZodString;
164
+ expires_at: z.ZodString;
165
+ accepted_at: z.ZodNullable<z.ZodString>;
166
+ declined_at: z.ZodNullable<z.ZodString>;
167
+ decline_reason: z.ZodNullable<z.ZodString>;
168
+ retracted_at: z.ZodNullable<z.ZodString>;
169
+ superseded_at: z.ZodNullable<z.ZodString>;
170
+ resulting_permit_id: z.ZodNullable<z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">>;
171
+ }, z.core.$strict>>;
172
+ }, z.core.$strict>;
173
+ export type PermitOfferHistoryOutput = z.infer<typeof PermitOfferHistoryOutput>;
174
+ /** Output for `permit_revoke`. */
175
+ export declare const PermitRevokeOutput: z.ZodObject<{
176
+ ok: z.ZodLiteral<true>;
177
+ revoked: z.ZodLiteral<true>;
178
+ }, z.core.$strict>;
179
+ export type PermitRevokeOutput = z.infer<typeof PermitRevokeOutput>;
180
+ export declare const permit_offer_create_action_spec: {
181
+ method: string;
182
+ kind: "request_response";
183
+ initiator: "frontend";
184
+ auth: "authenticated";
185
+ side_effects: true;
186
+ input: z.ZodObject<{
187
+ to_account_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
188
+ role: z.ZodString;
189
+ scope_id: z.ZodOptional<z.ZodNullable<z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">>>;
190
+ message: z.ZodOptional<z.ZodNullable<z.ZodString>>;
191
+ }, z.core.$strict>;
192
+ output: z.ZodObject<{
193
+ offer: z.ZodObject<{
194
+ id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
195
+ from_actor_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
196
+ to_account_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
197
+ role: z.ZodString;
198
+ scope_id: z.ZodNullable<z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">>;
199
+ message: z.ZodNullable<z.ZodString>;
200
+ created_at: z.ZodString;
201
+ expires_at: z.ZodString;
202
+ accepted_at: z.ZodNullable<z.ZodString>;
203
+ declined_at: z.ZodNullable<z.ZodString>;
204
+ decline_reason: z.ZodNullable<z.ZodString>;
205
+ retracted_at: z.ZodNullable<z.ZodString>;
206
+ superseded_at: z.ZodNullable<z.ZodString>;
207
+ resulting_permit_id: z.ZodNullable<z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">>;
208
+ }, z.core.$strict>;
209
+ }, z.core.$strict>;
210
+ async: true;
211
+ description: string;
212
+ };
213
+ export declare const permit_offer_accept_action_spec: {
214
+ method: string;
215
+ kind: "request_response";
216
+ initiator: "frontend";
217
+ auth: "authenticated";
218
+ side_effects: true;
219
+ input: z.ZodObject<{
220
+ offer_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
221
+ }, z.core.$strict>;
222
+ output: z.ZodObject<{
223
+ permit_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
224
+ offer: z.ZodObject<{
225
+ id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
226
+ from_actor_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
227
+ to_account_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
228
+ role: z.ZodString;
229
+ scope_id: z.ZodNullable<z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">>;
230
+ message: z.ZodNullable<z.ZodString>;
231
+ created_at: z.ZodString;
232
+ expires_at: z.ZodString;
233
+ accepted_at: z.ZodNullable<z.ZodString>;
234
+ declined_at: z.ZodNullable<z.ZodString>;
235
+ decline_reason: z.ZodNullable<z.ZodString>;
236
+ retracted_at: z.ZodNullable<z.ZodString>;
237
+ superseded_at: z.ZodNullable<z.ZodString>;
238
+ resulting_permit_id: z.ZodNullable<z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">>;
239
+ }, z.core.$strict>;
240
+ superseded_offer_ids: z.ZodArray<z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">>;
241
+ }, z.core.$strict>;
242
+ async: true;
243
+ description: string;
244
+ };
245
+ export declare const permit_offer_decline_action_spec: {
246
+ method: string;
247
+ kind: "request_response";
248
+ initiator: "frontend";
249
+ auth: "authenticated";
250
+ side_effects: true;
251
+ input: z.ZodObject<{
252
+ offer_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
253
+ reason: z.ZodOptional<z.ZodNullable<z.ZodString>>;
254
+ }, z.core.$strict>;
255
+ output: z.ZodObject<{
256
+ ok: z.ZodLiteral<true>;
257
+ }, z.core.$strict>;
258
+ async: true;
259
+ description: string;
260
+ };
261
+ export declare const permit_offer_retract_action_spec: {
262
+ method: string;
263
+ kind: "request_response";
264
+ initiator: "frontend";
265
+ auth: "authenticated";
266
+ side_effects: true;
267
+ input: z.ZodObject<{
268
+ offer_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
269
+ }, z.core.$strict>;
270
+ output: z.ZodObject<{
271
+ ok: z.ZodLiteral<true>;
272
+ }, z.core.$strict>;
273
+ async: true;
274
+ description: string;
275
+ };
276
+ export declare const permit_offer_list_action_spec: {
277
+ method: string;
278
+ kind: "request_response";
279
+ initiator: "frontend";
280
+ auth: "authenticated";
281
+ side_effects: false;
282
+ input: z.ZodObject<{
283
+ account_id: z.ZodOptional<z.ZodNullable<z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">>>;
284
+ }, z.core.$strict>;
285
+ output: z.ZodObject<{
286
+ offers: z.ZodArray<z.ZodObject<{
287
+ id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
288
+ from_actor_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
289
+ to_account_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
290
+ role: z.ZodString;
291
+ scope_id: z.ZodNullable<z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">>;
292
+ message: z.ZodNullable<z.ZodString>;
293
+ created_at: z.ZodString;
294
+ expires_at: z.ZodString;
295
+ accepted_at: z.ZodNullable<z.ZodString>;
296
+ declined_at: z.ZodNullable<z.ZodString>;
297
+ decline_reason: z.ZodNullable<z.ZodString>;
298
+ retracted_at: z.ZodNullable<z.ZodString>;
299
+ superseded_at: z.ZodNullable<z.ZodString>;
300
+ resulting_permit_id: z.ZodNullable<z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">>;
301
+ }, z.core.$strict>>;
302
+ }, z.core.$strict>;
303
+ async: true;
304
+ description: string;
305
+ };
306
+ export declare const permit_offer_history_action_spec: {
307
+ method: string;
308
+ kind: "request_response";
309
+ initiator: "frontend";
310
+ auth: "authenticated";
311
+ side_effects: false;
312
+ input: z.ZodObject<{
313
+ account_id: z.ZodOptional<z.ZodNullable<z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">>>;
314
+ limit: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
315
+ offset: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
316
+ }, z.core.$strict>;
317
+ output: z.ZodObject<{
318
+ offers: z.ZodArray<z.ZodObject<{
319
+ id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
320
+ from_actor_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
321
+ to_account_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
322
+ role: z.ZodString;
323
+ scope_id: z.ZodNullable<z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">>;
324
+ message: z.ZodNullable<z.ZodString>;
325
+ created_at: z.ZodString;
326
+ expires_at: z.ZodString;
327
+ accepted_at: z.ZodNullable<z.ZodString>;
328
+ declined_at: z.ZodNullable<z.ZodString>;
329
+ decline_reason: z.ZodNullable<z.ZodString>;
330
+ retracted_at: z.ZodNullable<z.ZodString>;
331
+ superseded_at: z.ZodNullable<z.ZodString>;
332
+ resulting_permit_id: z.ZodNullable<z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">>;
333
+ }, z.core.$strict>>;
334
+ }, z.core.$strict>;
335
+ async: true;
336
+ description: string;
337
+ };
338
+ export declare const permit_revoke_action_spec: {
339
+ method: string;
340
+ kind: "request_response";
341
+ initiator: "frontend";
342
+ auth: {
343
+ role: string;
344
+ };
345
+ side_effects: true;
346
+ input: z.ZodObject<{
347
+ actor_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
348
+ permit_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
349
+ reason: z.ZodOptional<z.ZodNullable<z.ZodString>>;
350
+ }, z.core.$strict>;
351
+ output: z.ZodObject<{
352
+ ok: z.ZodLiteral<true>;
353
+ revoked: z.ZodLiteral<true>;
354
+ }, z.core.$strict>;
355
+ async: true;
356
+ description: string;
357
+ };
358
+ /**
359
+ * All permit-offer action specs — a codegen-ready registry. Consumers spread
360
+ * this into their own action-spec array to include offer lifecycle + revoke
361
+ * methods in a typed client surface.
362
+ */
363
+ export declare const all_permit_offer_action_specs: Array<RequestResponseActionSpec>;
364
+ //# sourceMappingURL=permit_offer_action_specs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permit_offer_action_specs.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/permit_offer_action_specs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,OAAO,KAAK,EAAC,yBAAyB,EAAC,MAAM,2BAA2B,CAAC;AAMzE,gEAAgE;AAChE,eAAO,MAAM,uBAAuB,EAAG,mBAA4B,CAAC;AACpE,kEAAkE;AAClE,eAAO,MAAM,oBAAoB,EAAG,gBAAyB,CAAC;AAC9D,sDAAsD;AACtD,eAAO,MAAM,mBAAmB,EAAG,eAAwB,CAAC;AAC5D,wGAAwG;AACxG,eAAO,MAAM,qBAAqB,EAAG,iBAA0B,CAAC;AAChE,qGAAqG;AACrG,eAAO,MAAM,8BAA8B,EAAG,0BAAmC,CAAC;AAClF,gKAAgK;AAChK,eAAO,MAAM,0BAA0B,EAAG,sBAA+B,CAAC;AAI1E,uCAAuC;AACvC,eAAO,MAAM,sBAAsB;;;;;kBAWjC,CAAC;AACH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAE5E,uCAAuC;AACvC,eAAO,MAAM,sBAAsB;;kBAEjC,CAAC;AACH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAE5E,wCAAwC;AACxC,eAAO,MAAM,uBAAuB;;;kBAOlC,CAAC;AACH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAE9E,wCAAwC;AACxC,eAAO,MAAM,uBAAuB;;kBAElC,CAAC;AACH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAE9E,mGAAmG;AACnG,eAAO,MAAM,oBAAoB;;kBAI/B,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAExE;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB;;;;kBAO5B,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAElE;;;;GAIG;AACH,eAAO,MAAM,uBAAuB;;;;kBAUlC,CAAC;AACH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAE9E,wCAAwC;AACxC,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;kBAElC,CAAC;AACH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAE9E,wCAAwC;AACxC,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;kBAIlC,CAAC;AACH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAE9E,kEAAkE;AAClE,eAAO,MAAM,mBAAmB;;kBAAwC,CAAC;AACzE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEtE,sCAAsC;AACtC,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;kBAAqD,CAAC;AACxF,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAE1E,yCAAyC;AACzC,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;kBAAqD,CAAC;AAC3F,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAEhF,kCAAkC;AAClC,eAAO,MAAM,kBAAkB;;;kBAG7B,CAAC;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAIpE,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAWP,CAAC;AAEtC,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAWP,CAAC;AAEtC,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;CAUR,CAAC;AAEtC,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;CAUR,CAAC;AAEtC,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAWL,CAAC;AAEtC,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAWR,CAAC;AAEtC,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;CAWD,CAAC;AAEtC;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,EAAE,KAAK,CAAC,yBAAyB,CAQ1E,CAAC"}
@@ -0,0 +1,216 @@
1
+ /**
2
+ * Permit offer RPC action specs — declarative contract for the
3
+ * consentful-permits surface (offer lifecycle + admin revoke).
4
+ *
5
+ * Import this module for the specs, Input/Output schemas, `ERROR_OFFER_*`
6
+ * reason constants, and the `all_permit_offer_action_specs` registry.
7
+ * Handlers live in `./permit_offer_actions.js`.
8
+ *
9
+ * Authorization enforcement: offer-lifecycle specs declare
10
+ * `auth: 'authenticated'` and rely on `query_*` IDOR guards or in-handler
11
+ * policy checks (e.g. `permit_offer_list`/`_history` elevate to admin only
12
+ * when inspecting another account — an input-dependent check that can't be
13
+ * expressed at the spec level). `permit_revoke` declares
14
+ * `auth: {role: 'admin'}` — the RPC dispatcher's per-spec `check_action_auth`
15
+ * gates it before the handler runs even though the endpoint hosts non-admin
16
+ * methods alongside.
17
+ *
18
+ * @module
19
+ */
20
+ import { z } from 'zod';
21
+ import { Uuid } from '../uuid.js';
22
+ import { RoleName } from './role_schema.js';
23
+ import { PERMIT_OFFER_MESSAGE_LENGTH_MAX, PermitOfferJson } from './permit_offer_schema.js';
24
+ import { PERMIT_REVOKED_REASON_LENGTH_MAX } from './account_schema.js';
25
+ /** Error reason — caller tried to offer themselves a permit. */
26
+ export const ERROR_OFFER_SELF_TARGET = 'offer_self_target';
27
+ /** Error reason — offer is declined, retracted, or superseded. */
28
+ export const ERROR_OFFER_TERMINAL = 'offer_terminal';
29
+ /** Error reason — offer's `expires_at` has passed. */
30
+ export const ERROR_OFFER_EXPIRED = 'offer_expired';
31
+ /** Error reason — offer does not exist or belongs to a different recipient (404-over-403 IDOR mask). */
32
+ export const ERROR_OFFER_NOT_FOUND = 'offer_not_found';
33
+ /** Error reason — the offered role is not `web_grantable` (nobody may offer it via this surface). */
34
+ export const ERROR_OFFER_ROLE_NOT_GRANTABLE = 'offer_role_not_grantable';
35
+ /** Error reason — caller is not authorized to offer this role (default policy: caller lacks the role; consumer `authorize` callback may add further policy). */
36
+ export const ERROR_OFFER_NOT_AUTHORIZED = 'offer_not_authorized';
37
+ // -- Input/output schemas ---------------------------------------------------
38
+ /** Input for `permit_offer_create`. */
39
+ export const PermitOfferCreateInput = z.strictObject({
40
+ to_account_id: Uuid.meta({ description: 'Account id of the recipient.' }),
41
+ role: RoleName.meta({ description: 'Role being offered.' }),
42
+ scope_id: Uuid.nullish().meta({
43
+ description: 'Scope id for resource-scoped grants (e.g. classroom id). `null` for global.',
44
+ }),
45
+ message: z
46
+ .string()
47
+ .max(PERMIT_OFFER_MESSAGE_LENGTH_MAX)
48
+ .nullish()
49
+ .meta({ description: 'Optional free-form note from the grantor.' }),
50
+ });
51
+ /** Input for `permit_offer_accept`. */
52
+ export const PermitOfferAcceptInput = z.strictObject({
53
+ offer_id: Uuid.meta({ description: 'The offer to accept.' }),
54
+ });
55
+ /** Input for `permit_offer_decline`. */
56
+ export const PermitOfferDeclineInput = z.strictObject({
57
+ offer_id: Uuid.meta({ description: 'The offer to decline.' }),
58
+ reason: z
59
+ .string()
60
+ .max(PERMIT_OFFER_MESSAGE_LENGTH_MAX)
61
+ .nullish()
62
+ .meta({ description: 'Optional free-form reason given on decline.' }),
63
+ });
64
+ /** Input for `permit_offer_retract`. */
65
+ export const PermitOfferRetractInput = z.strictObject({
66
+ offer_id: Uuid.meta({ description: 'The offer to retract.' }),
67
+ });
68
+ /** Input for `permit_offer_list`. `account_id` is admin-only (inspect another account's inbox). */
69
+ export const PermitOfferListInput = z.strictObject({
70
+ account_id: Uuid.nullish().meta({
71
+ description: 'Admin-only — list offers for another account. Defaults to the caller.',
72
+ }),
73
+ });
74
+ /**
75
+ * Input for `permit_revoke`. Admin-only mutation that revokes an active
76
+ * permit on a target actor. `actor_id` is the natural key — permits are
77
+ * actor-scoped, and the admin UI reads `row.actor.id` straight from the
78
+ * listing. Deriving `actor_id` from `account_id` would collapse under
79
+ * multi-actor accounts.
80
+ */
81
+ export const PermitRevokeInput = z.strictObject({
82
+ actor_id: Uuid.meta({ description: 'Actor whose permit to revoke.' }),
83
+ permit_id: Uuid.meta({ description: 'The permit to revoke.' }),
84
+ reason: z.string().max(PERMIT_REVOKED_REASON_LENGTH_MAX).nullish().meta({
85
+ description: 'Optional free-form reason; stamped on `permit.revoked_reason` and surfaced on the revokee WS notification.',
86
+ }),
87
+ });
88
+ /**
89
+ * Input for `permit_offer_history`. Returns every offer involving the account
90
+ * in either direction (recipient or grantor), including terminal rows, newest
91
+ * first. `account_id` is admin-only.
92
+ */
93
+ export const PermitOfferHistoryInput = z.strictObject({
94
+ account_id: Uuid.nullish().meta({
95
+ description: 'Admin-only — history for another account. Defaults to the caller.',
96
+ }),
97
+ limit: z.number().int().min(1).max(500).nullish().meta({
98
+ description: 'Max rows to return (default 100).',
99
+ }),
100
+ offset: z.number().int().min(0).nullish().meta({
101
+ description: 'Pagination offset (default 0).',
102
+ }),
103
+ });
104
+ /** Output for `permit_offer_create`. */
105
+ export const PermitOfferCreateOutput = z.strictObject({
106
+ offer: PermitOfferJson,
107
+ });
108
+ /** Output for `permit_offer_accept`. */
109
+ export const PermitOfferAcceptOutput = z.strictObject({
110
+ permit_id: Uuid,
111
+ offer: PermitOfferJson,
112
+ superseded_offer_ids: z.array(Uuid),
113
+ });
114
+ /** Output for `permit_offer_decline` / `permit_offer_retract`. */
115
+ export const PermitOfferOkOutput = z.strictObject({ ok: z.literal(true) });
116
+ /** Output for `permit_offer_list`. */
117
+ export const PermitOfferListOutput = z.strictObject({ offers: z.array(PermitOfferJson) });
118
+ /** Output for `permit_offer_history`. */
119
+ export const PermitOfferHistoryOutput = z.strictObject({ offers: z.array(PermitOfferJson) });
120
+ /** Output for `permit_revoke`. */
121
+ export const PermitRevokeOutput = z.strictObject({
122
+ ok: z.literal(true),
123
+ revoked: z.literal(true),
124
+ });
125
+ // -- Action specs -----------------------------------------------------------
126
+ export const permit_offer_create_action_spec = {
127
+ method: 'permit_offer_create',
128
+ kind: 'request_response',
129
+ initiator: 'frontend',
130
+ auth: 'authenticated',
131
+ side_effects: true,
132
+ input: PermitOfferCreateInput,
133
+ output: PermitOfferCreateOutput,
134
+ async: true,
135
+ description: 'Offer a permit to another account. Grantor must hold the offered role (or pass a consumer authorize callback); role must be web_grantable.',
136
+ };
137
+ export const permit_offer_accept_action_spec = {
138
+ method: 'permit_offer_accept',
139
+ kind: 'request_response',
140
+ initiator: 'frontend',
141
+ auth: 'authenticated',
142
+ side_effects: true,
143
+ input: PermitOfferAcceptInput,
144
+ output: PermitOfferAcceptOutput,
145
+ async: true,
146
+ description: 'Accept an offer. Atomically marks the offer accepted, inserts the permit, and supersedes sibling pending offers for the same (account, role, scope).',
147
+ };
148
+ export const permit_offer_decline_action_spec = {
149
+ method: 'permit_offer_decline',
150
+ kind: 'request_response',
151
+ initiator: 'frontend',
152
+ auth: 'authenticated',
153
+ side_effects: true,
154
+ input: PermitOfferDeclineInput,
155
+ output: PermitOfferOkOutput,
156
+ async: true,
157
+ description: 'Decline an offer. Recipient-only.',
158
+ };
159
+ export const permit_offer_retract_action_spec = {
160
+ method: 'permit_offer_retract',
161
+ kind: 'request_response',
162
+ initiator: 'frontend',
163
+ auth: 'authenticated',
164
+ side_effects: true,
165
+ input: PermitOfferRetractInput,
166
+ output: PermitOfferOkOutput,
167
+ async: true,
168
+ description: 'Retract an offer. Grantor-only, pre-decision.',
169
+ };
170
+ export const permit_offer_list_action_spec = {
171
+ method: 'permit_offer_list',
172
+ kind: 'request_response',
173
+ initiator: 'frontend',
174
+ auth: 'authenticated',
175
+ side_effects: false,
176
+ input: PermitOfferListInput,
177
+ output: PermitOfferListOutput,
178
+ async: true,
179
+ description: 'List pending, non-expired offers for the caller. Admins may pass `account_id` to inspect another account.',
180
+ };
181
+ export const permit_offer_history_action_spec = {
182
+ method: 'permit_offer_history',
183
+ kind: 'request_response',
184
+ initiator: 'frontend',
185
+ auth: 'authenticated',
186
+ side_effects: false,
187
+ input: PermitOfferHistoryInput,
188
+ output: PermitOfferHistoryOutput,
189
+ async: true,
190
+ description: 'List every offer involving the caller (either direction), including terminal rows, newest first. Admins may pass `account_id` to inspect another account.',
191
+ };
192
+ export const permit_revoke_action_spec = {
193
+ method: 'permit_revoke',
194
+ kind: 'request_response',
195
+ initiator: 'frontend',
196
+ auth: { role: 'admin' },
197
+ side_effects: true,
198
+ input: PermitRevokeInput,
199
+ output: PermitRevokeOutput,
200
+ async: true,
201
+ description: 'Revoke an active permit on a target actor. Admin-only. Supersedes any pending offers for the same (account, role, scope). Fires permit_revoke + permit_offer_supersede notifications.',
202
+ };
203
+ /**
204
+ * All permit-offer action specs — a codegen-ready registry. Consumers spread
205
+ * this into their own action-spec array to include offer lifecycle + revoke
206
+ * methods in a typed client surface.
207
+ */
208
+ export const all_permit_offer_action_specs = [
209
+ permit_offer_create_action_spec,
210
+ permit_offer_accept_action_spec,
211
+ permit_offer_decline_action_spec,
212
+ permit_offer_retract_action_spec,
213
+ permit_offer_list_action_spec,
214
+ permit_offer_history_action_spec,
215
+ permit_revoke_action_spec,
216
+ ];