@fleetless/contracts 1.0.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 (287) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +17 -0
  4. package/README.md +88 -0
  5. package/artifacts/constants.json +24 -0
  6. package/artifacts/openapi.json +17219 -0
  7. package/artifacts/routes.json +4605 -0
  8. package/artifacts/schema/accept-team-invite-request.schema.json +22 -0
  9. package/artifacts/schema/action-config.schema.json +198 -0
  10. package/artifacts/schema/alert-list-response.schema.json +172 -0
  11. package/artifacts/schema/api-error.schema.json +20 -0
  12. package/artifacts/schema/app-auth-config.schema.json +106 -0
  13. package/artifacts/schema/app-invitation-list-response.schema.json +57 -0
  14. package/artifacts/schema/app-invitation.schema.json +69 -0
  15. package/artifacts/schema/app-list-response.schema.json +82 -0
  16. package/artifacts/schema/app-mail-template-list-response.schema.json +68 -0
  17. package/artifacts/schema/app-mail-template.schema.json +54 -0
  18. package/artifacts/schema/app-oidc-provider-list-response.schema.json +93 -0
  19. package/artifacts/schema/app-oidc-provider.schema.json +80 -0
  20. package/artifacts/schema/app-user-list-response.schema.json +111 -0
  21. package/artifacts/schema/app-user.schema.json +98 -0
  22. package/artifacts/schema/app.schema.json +69 -0
  23. package/artifacts/schema/apply-error.schema.json +41 -0
  24. package/artifacts/schema/asset-list-response.schema.json +288 -0
  25. package/artifacts/schema/asset-sync-request.schema.json +17 -0
  26. package/artifacts/schema/asset-sync-response.schema.json +16 -0
  27. package/artifacts/schema/asset-sync-status.schema.json +136 -0
  28. package/artifacts/schema/asset.schema.json +68 -0
  29. package/artifacts/schema/audit-actor.schema.json +32 -0
  30. package/artifacts/schema/audit-event.schema.json +119 -0
  31. package/artifacts/schema/audit-list-response.schema.json +144 -0
  32. package/artifacts/schema/audit-query.schema.json +79 -0
  33. package/artifacts/schema/auth-error.schema.json +23 -0
  34. package/artifacts/schema/auth-me-response.schema.json +99 -0
  35. package/artifacts/schema/auth-ok.schema.json +115 -0
  36. package/artifacts/schema/authorization-server-metadata.schema.json +80 -0
  37. package/artifacts/schema/bridge-asset-progress.schema.json +99 -0
  38. package/artifacts/schema/bridge-assets-available.schema.json +25 -0
  39. package/artifacts/schema/bridge-camera-state.schema.json +78 -0
  40. package/artifacts/schema/bridge-config-applied.schema.json +67 -0
  41. package/artifacts/schema/bridge-hello.schema.json +65 -0
  42. package/artifacts/schema/bridge-introspect.schema.json +114 -0
  43. package/artifacts/schema/bridge-job-lost.schema.json +22 -0
  44. package/artifacts/schema/bridge-job-update.schema.json +100 -0
  45. package/artifacts/schema/bridge-pong.schema.json +19 -0
  46. package/artifacts/schema/bridge-pressure.schema.json +292 -0
  47. package/artifacts/schema/bridge-state.schema.json +24 -0
  48. package/artifacts/schema/bridge-type-definitions.schema.json +169 -0
  49. package/artifacts/schema/busy-details.schema.json +115 -0
  50. package/artifacts/schema/camera-descriptor.schema.json +45 -0
  51. package/artifacts/schema/camera-list-response.schema.json +58 -0
  52. package/artifacts/schema/camera-source.schema.json +240 -0
  53. package/artifacts/schema/cancel-request.schema.json +20 -0
  54. package/artifacts/schema/client-accept-invitation-request.schema.json +35 -0
  55. package/artifacts/schema/client-auth.schema.json +18 -0
  56. package/artifacts/schema/client-cancel.schema.json +45 -0
  57. package/artifacts/schema/client-identity.schema.json +103 -0
  58. package/artifacts/schema/client-invoke.schema.json +45 -0
  59. package/artifacts/schema/client-login-request.schema.json +29 -0
  60. package/artifacts/schema/client-logout-request.schema.json +14 -0
  61. package/artifacts/schema/client-mcp-interaction-decision-response.schema.json +15 -0
  62. package/artifacts/schema/client-mcp-interaction.schema.json +59 -0
  63. package/artifacts/schema/client-oidc-callback-query.schema.json +28 -0
  64. package/artifacts/schema/client-oidc-exchange-request.schema.json +21 -0
  65. package/artifacts/schema/client-oidc-start-query.schema.json +36 -0
  66. package/artifacts/schema/client-password-reset-confirm-request.schema.json +22 -0
  67. package/artifacts/schema/client-password-reset-request.schema.json +24 -0
  68. package/artifacts/schema/client-provider-list-query.schema.json +17 -0
  69. package/artifacts/schema/client-provider-list-response.schema.json +34 -0
  70. package/artifacts/schema/client-publish.schema.json +40 -0
  71. package/artifacts/schema/client-refresh-request.schema.json +14 -0
  72. package/artifacts/schema/client-register-request.schema.json +44 -0
  73. package/artifacts/schema/client-resend-verification-request.schema.json +24 -0
  74. package/artifacts/schema/client-subscribe.schema.json +43 -0
  75. package/artifacts/schema/client-unsubscribe.schema.json +26 -0
  76. package/artifacts/schema/client-verify-email-request.schema.json +15 -0
  77. package/artifacts/schema/cloud-asset-request.schema.json +37 -0
  78. package/artifacts/schema/cloud-camera-start.schema.json +41 -0
  79. package/artifacts/schema/cloud-camera-stop.schema.json +26 -0
  80. package/artifacts/schema/cloud-cancel.schema.json +33 -0
  81. package/artifacts/schema/cloud-config.schema.json +1635 -0
  82. package/artifacts/schema/cloud-hello-error.schema.json +23 -0
  83. package/artifacts/schema/cloud-hello-ok.schema.json +19 -0
  84. package/artifacts/schema/cloud-introspect-request.schema.json +19 -0
  85. package/artifacts/schema/cloud-invoke.schema.json +40 -0
  86. package/artifacts/schema/cloud-ping.schema.json +19 -0
  87. package/artifacts/schema/cloud-publish.schema.json +28 -0
  88. package/artifacts/schema/cloud-type-request.schema.json +30 -0
  89. package/artifacts/schema/command-result.schema.json +175 -0
  90. package/artifacts/schema/config-draft-response.schema.json +1695 -0
  91. package/artifacts/schema/config-state.schema.json +124 -0
  92. package/artifacts/schema/config-version-response.schema.json +1641 -0
  93. package/artifacts/schema/config-versions-response.schema.json +33 -0
  94. package/artifacts/schema/create-app-invitation-request.schema.json +40 -0
  95. package/artifacts/schema/create-app-oidc-provider-request.schema.json +70 -0
  96. package/artifacts/schema/create-app-request.schema.json +30 -0
  97. package/artifacts/schema/create-app-user-request.schema.json +42 -0
  98. package/artifacts/schema/create-robot-request.schema.json +14 -0
  99. package/artifacts/schema/create-robot-response.schema.json +44 -0
  100. package/artifacts/schema/create-server-key-response.schema.json +65 -0
  101. package/artifacts/schema/create-team-invite-request.schema.json +43 -0
  102. package/artifacts/schema/datapoint-alert-row.schema.json +160 -0
  103. package/artifacts/schema/datapoint-config.schema.json +366 -0
  104. package/artifacts/schema/datapoint-display.schema.json +31 -0
  105. package/artifacts/schema/datapoint-event.schema.json +34 -0
  106. package/artifacts/schema/datapoint-frame.schema.json +28 -0
  107. package/artifacts/schema/datapoint-list-response.schema.json +61 -0
  108. package/artifacts/schema/datapoint-value.schema.json +28 -0
  109. package/artifacts/schema/developer-login-request.schema.json +19 -0
  110. package/artifacts/schema/dynamic-client-registration-request.schema.json +60 -0
  111. package/artifacts/schema/dynamic-client-registration-response.schema.json +68 -0
  112. package/artifacts/schema/error-frame.schema.json +23 -0
  113. package/artifacts/schema/exposure-counts.schema.json +39 -0
  114. package/artifacts/schema/exposure-list-response.schema.json +43 -0
  115. package/artifacts/schema/fetch-types-request.schema.json +19 -0
  116. package/artifacts/schema/fetch-types-response.schema.json +163 -0
  117. package/artifacts/schema/fleetless-user-list-response.schema.json +73 -0
  118. package/artifacts/schema/fleetless-user.schema.json +60 -0
  119. package/artifacts/schema/history-buckets-response.schema.json +79 -0
  120. package/artifacts/schema/history-query.schema.json +58 -0
  121. package/artifacts/schema/history-response.schema.json +150 -0
  122. package/artifacts/schema/history-samples-response.schema.json +68 -0
  123. package/artifacts/schema/introspection-response.schema.json +118 -0
  124. package/artifacts/schema/invoke-or-service-response.schema.json +141 -0
  125. package/artifacts/schema/invoke-request.schema.json +23 -0
  126. package/artifacts/schema/invoke-response.schema.json +125 -0
  127. package/artifacts/schema/job-actor.schema.json +34 -0
  128. package/artifacts/schema/job-event.schema.json +158 -0
  129. package/artifacts/schema/job-response.schema.json +123 -0
  130. package/artifacts/schema/job-run-list-response.schema.json +222 -0
  131. package/artifacts/schema/job-run-query.schema.json +95 -0
  132. package/artifacts/schema/job-run-summary-query.schema.json +23 -0
  133. package/artifacts/schema/job-run-summary.schema.json +33 -0
  134. package/artifacts/schema/job-run.schema.json +195 -0
  135. package/artifacts/schema/job-state.schema.json +11 -0
  136. package/artifacts/schema/job.schema.json +106 -0
  137. package/artifacts/schema/latency-bucket.schema.json +63 -0
  138. package/artifacts/schema/live-session-response.schema.json +41 -0
  139. package/artifacts/schema/mail-outcome.schema.json +20 -0
  140. package/artifacts/schema/mail-template-preview-request.schema.json +35 -0
  141. package/artifacts/schema/mail-template-preview-response.schema.json +31 -0
  142. package/artifacts/schema/mail-template-problem-details.schema.json +24 -0
  143. package/artifacts/schema/mcp-consent-grant-list-response.schema.json +52 -0
  144. package/artifacts/schema/mcp-consent-grant.schema.json +39 -0
  145. package/artifacts/schema/mcp-robot-datasheet.schema.json +115 -0
  146. package/artifacts/schema/mcp-role-preview-response.schema.json +134 -0
  147. package/artifacts/schema/missing-asset-query.schema.json +11 -0
  148. package/artifacts/schema/oauth-authorize-query.schema.json +47 -0
  149. package/artifacts/schema/oauth-redirect-response.schema.json +15 -0
  150. package/artifacts/schema/oauth-token-request.schema.json +47 -0
  151. package/artifacts/schema/oauth-token-response.schema.json +38 -0
  152. package/artifacts/schema/org-alerts-query.schema.json +15 -0
  153. package/artifacts/schema/org-event-dropped.schema.json +26 -0
  154. package/artifacts/schema/org-event-replay.schema.json +97 -0
  155. package/artifacts/schema/org-event-subscribe.schema.json +14 -0
  156. package/artifacts/schema/org-event-unsubscribe.schema.json +14 -0
  157. package/artifacts/schema/org-event.schema.json +75 -0
  158. package/artifacts/schema/org-firing-alerts-response.schema.json +178 -0
  159. package/artifacts/schema/org-health-query.schema.json +13 -0
  160. package/artifacts/schema/org-latency-query.schema.json +42 -0
  161. package/artifacts/schema/org-latency-response.schema.json +124 -0
  162. package/artifacts/schema/org-quota-usage-counts.schema.json +42 -0
  163. package/artifacts/schema/org-quota-usage.schema.json +102 -0
  164. package/artifacts/schema/org-quotas.schema.json +51 -0
  165. package/artifacts/schema/org-usage-query.schema.json +19 -0
  166. package/artifacts/schema/org-usage-response.schema.json +77 -0
  167. package/artifacts/schema/org.schema.json +30 -0
  168. package/artifacts/schema/parameter-invalid-details.schema.json +37 -0
  169. package/artifacts/schema/parameter-spec.schema.json +120 -0
  170. package/artifacts/schema/parameter-violation.schema.json +24 -0
  171. package/artifacts/schema/password-change-request.schema.json +21 -0
  172. package/artifacts/schema/password-reset-confirm.schema.json +19 -0
  173. package/artifacts/schema/password-reset-request.schema.json +14 -0
  174. package/artifacts/schema/patch-app-oidc-provider-request.schema.json +50 -0
  175. package/artifacts/schema/patch-app-user-request.schema.json +34 -0
  176. package/artifacts/schema/patch-auth-me-request.schema.json +22 -0
  177. package/artifacts/schema/patch-fleetless-user-request.schema.json +20 -0
  178. package/artifacts/schema/patch-org-request.schema.json +15 -0
  179. package/artifacts/schema/patch-org-response.schema.json +40 -0
  180. package/artifacts/schema/patch-robot-request.schema.json +15 -0
  181. package/artifacts/schema/patch-robot-response.schema.json +40 -0
  182. package/artifacts/schema/pending-team-invite-list-response.schema.json +52 -0
  183. package/artifacts/schema/pending-team-invite.schema.json +39 -0
  184. package/artifacts/schema/protected-resource-metadata.schema.json +41 -0
  185. package/artifacts/schema/publish-config-response.schema.json +21 -0
  186. package/artifacts/schema/publish-request.schema.json +17 -0
  187. package/artifacts/schema/publisher-config.schema.json +285 -0
  188. package/artifacts/schema/put-app-auth-config-request.schema.json +93 -0
  189. package/artifacts/schema/put-app-mail-template-request.schema.json +35 -0
  190. package/artifacts/schema/put-config-draft-request.schema.json +13 -0
  191. package/artifacts/schema/put-datapoint-display-request.schema.json +31 -0
  192. package/artifacts/schema/put-robot-details-request.schema.json +41 -0
  193. package/artifacts/schema/put-robot-details-response.schema.json +43 -0
  194. package/artifacts/schema/rate-limit-details.schema.json +15 -0
  195. package/artifacts/schema/refresh-request.schema.json +13 -0
  196. package/artifacts/schema/release-live-query.schema.json +13 -0
  197. package/artifacts/schema/rename-slug-request.schema.json +23 -0
  198. package/artifacts/schema/rename-slug-response.schema.json +24 -0
  199. package/artifacts/schema/resource-health-event.schema.json +72 -0
  200. package/artifacts/schema/resource-health-list-response.schema.json +80 -0
  201. package/artifacts/schema/resource-health-state.schema.json +68 -0
  202. package/artifacts/schema/robot-config-doc.schema.json +1616 -0
  203. package/artifacts/schema/robot-delete-query.schema.json +12 -0
  204. package/artifacts/schema/robot-deletion-summary.schema.json +63 -0
  205. package/artifacts/schema/robot-detail-response.schema.json +262 -0
  206. package/artifacts/schema/robot-details-doc.schema.json +33 -0
  207. package/artifacts/schema/robot-jobs-response.schema.json +119 -0
  208. package/artifacts/schema/robot-latency-series.schema.json +81 -0
  209. package/artifacts/schema/robot-list-item.schema.json +94 -0
  210. package/artifacts/schema/robot-list-response.schema.json +106 -0
  211. package/artifacts/schema/robot.schema.json +30 -0
  212. package/artifacts/schema/role-list-response.schema.json +48 -0
  213. package/artifacts/schema/role-permissions.schema.json +61 -0
  214. package/artifacts/schema/role.schema.json +35 -0
  215. package/artifacts/schema/ros-graph.schema.json +99 -0
  216. package/artifacts/schema/server-key-list-response.schema.json +64 -0
  217. package/artifacts/schema/server-key.schema.json +51 -0
  218. package/artifacts/schema/service-call-response.schema.json +13 -0
  219. package/artifacts/schema/service-config.schema.json +198 -0
  220. package/artifacts/schema/session-tokens.schema.json +28 -0
  221. package/artifacts/schema/sign-up-request.schema.json +26 -0
  222. package/artifacts/schema/sign-up-response.schema.json +127 -0
  223. package/artifacts/schema/slug-usage-response.schema.json +32 -0
  224. package/artifacts/schema/snapshot-header.schema.json +44 -0
  225. package/artifacts/schema/snapshot-meta-response.schema.json +85 -0
  226. package/artifacts/schema/subscribe-error.schema.json +31 -0
  227. package/artifacts/schema/team-invite.schema.json +57 -0
  228. package/artifacts/schema/tier-change-request.schema.json +17 -0
  229. package/artifacts/schema/type-definition.schema.json +144 -0
  230. package/artifacts/schema/types-response.schema.json +156 -0
  231. package/artifacts/schema/update-app-request.schema.json +32 -0
  232. package/artifacts/schema/urdf-completeness.schema.json +50 -0
  233. package/artifacts/schema/validation-issue.schema.json +43 -0
  234. package/artifacts/schema/waitlist-request.schema.json +15 -0
  235. package/artifacts/schema-outgoing/bridge-asset-progress.schema.json +102 -0
  236. package/artifacts/schema-outgoing/bridge-assets-available.schema.json +26 -0
  237. package/artifacts/schema-outgoing/bridge-camera-state.schema.json +80 -0
  238. package/artifacts/schema-outgoing/bridge-config-applied.schema.json +69 -0
  239. package/artifacts/schema-outgoing/bridge-hello.schema.json +68 -0
  240. package/artifacts/schema-outgoing/bridge-introspect.schema.json +119 -0
  241. package/artifacts/schema-outgoing/bridge-job-lost.schema.json +23 -0
  242. package/artifacts/schema-outgoing/bridge-job-update.schema.json +102 -0
  243. package/artifacts/schema-outgoing/bridge-pong.schema.json +20 -0
  244. package/artifacts/schema-outgoing/bridge-type-definitions.schema.json +174 -0
  245. package/artifacts/schema-outgoing/datapoint-frame.schema.json +29 -0
  246. package/artifacts/schema-outgoing/snapshot-header.schema.json +45 -0
  247. package/dist/alerts.d.ts +255 -0
  248. package/dist/alerts.js +193 -0
  249. package/dist/app-users.d.ts +606 -0
  250. package/dist/app-users.js +696 -0
  251. package/dist/apps.d.ts +175 -0
  252. package/dist/apps.js +267 -0
  253. package/dist/assets.d.ts +434 -0
  254. package/dist/assets.js +546 -0
  255. package/dist/audit.d.ts +129 -0
  256. package/dist/audit.js +238 -0
  257. package/dist/client-auth.d.ts +409 -0
  258. package/dist/client-auth.js +487 -0
  259. package/dist/common.d.ts +186 -0
  260. package/dist/common.js +199 -0
  261. package/dist/config-issues.d.ts +175 -0
  262. package/dist/config-issues.js +339 -0
  263. package/dist/config.d.ts +862 -0
  264. package/dist/config.js +1988 -0
  265. package/dist/errors.d.ts +52 -0
  266. package/dist/errors.js +786 -0
  267. package/dist/identity.d.ts +549 -0
  268. package/dist/identity.js +503 -0
  269. package/dist/index.d.ts +51 -0
  270. package/dist/index.js +51 -0
  271. package/dist/introspection.d.ts +99 -0
  272. package/dist/introspection.js +97 -0
  273. package/dist/jobs.d.ts +334 -0
  274. package/dist/jobs.js +345 -0
  275. package/dist/mcp.d.ts +239 -0
  276. package/dist/mcp.js +153 -0
  277. package/dist/oauth.d.ts +344 -0
  278. package/dist/oauth.js +488 -0
  279. package/dist/protocol.d.ts +781 -0
  280. package/dist/protocol.js +715 -0
  281. package/dist/realtime.d.ts +494 -0
  282. package/dist/realtime.js +512 -0
  283. package/dist/rest.d.ts +1989 -0
  284. package/dist/rest.js +1963 -0
  285. package/dist/routes.d.ts +94 -0
  286. package/dist/routes.js +2298 -0
  287. package/package.json +61 -0
@@ -0,0 +1,409 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * **The client auth API: the whole of what an app user's browser talks to**
4
+ * (spec `2026-09-05-app-user-auth`, §4).
5
+ *
6
+ * Fleetless shows an app user **no page** (D2). The developer's own UI owns
7
+ * every screen — login, registration, verification, invitation acceptance,
8
+ * password reset, the provider buttons, the MCP consent — and calls these
9
+ * routes as JSON. The hosted, app-branded login and consent pages this file
10
+ * used to describe are deleted.
11
+ *
12
+ * Everything here is public: `app_identifier` travels in the body (in the
13
+ * query for a GET), CORS is answered only for the app's `allowed_origins`, and
14
+ * the whole family is rate-limited per app, address and IP.
15
+ *
16
+ * **Two kinds of caller reach the authenticated half**, and both use
17
+ * `Authorization: Bearer`:
18
+ *
19
+ * - an **app user**, with the JWT access token issued here;
20
+ * - a **server key** (`flk_…`), for server-side code, carrying full app rights.
21
+ *
22
+ * The cloud tells them apart by shape — a `flk_` prefix is a server key,
23
+ * anything else is parsed as a JWT. That rule is written down once, here, so
24
+ * the SDK and the cloud cannot drift into disagreeing about it.
25
+ *
26
+ * **The enumeration discipline is the design's, not a preference** (§4):
27
+ * `register`, `resend-verification` and `password/reset` answer `202` for every
28
+ * policy-allowed request whether or not the address exists, and `login` answers
29
+ * the identical `invalid_credentials` for a wrong password, a `blocked` account
30
+ * and a `pending_verification` one. Policy refusals are honest —
31
+ * `registration_closed` and `domain_not_allowed` say what they are, because
32
+ * neither reveals whether a *person* exists.
33
+ */
34
+ export declare const clientLoginRequest: z.ZodObject<{
35
+ app_identifier: z.ZodString;
36
+ email: z.ZodEmail;
37
+ password: z.ZodString;
38
+ }, z.core.$strip>;
39
+ export type ClientLoginRequest = z.infer<typeof clientLoginRequest>;
40
+ export declare const clientRefreshRequest: z.ZodObject<{
41
+ refresh_token: z.ZodString;
42
+ }, z.core.$strip>;
43
+ export type ClientRefreshRequest = z.infer<typeof clientRefreshRequest>;
44
+ /**
45
+ * Logging out revokes the whole token family server-side. Without this, a
46
+ * refresh token stolen before the user pressed "log out" keeps working —
47
+ * clearing a client-side store is a UI gesture, not a revocation.
48
+ *
49
+ * **The route answers `204` and has no response shape.** It used to answer a
50
+ * `clientLogoutResponse` reporting what was left of the session at the identity
51
+ * provider — RP-initiated logout, an `end_session_endpoint` to redirect to,
52
+ * four ways of saying "we cannot end that session". That whole apparatus
53
+ * belonged to the hosted login flow, where Fleetless owned the browser. It does
54
+ * not own it any more: the developer's app does, and an app that wants to end
55
+ * a provider session redirects there itself, knowing its own provider, which
56
+ * Fleetless never did better than it. Listed as a breaking change rather than
57
+ * quietly kept as a field nobody fills.
58
+ */
59
+ export declare const clientLogoutRequest: z.ZodObject<{
60
+ refresh_token: z.ZodString;
61
+ }, z.core.$strip>;
62
+ export type ClientLogoutRequest = z.infer<typeof clientLogoutRequest>;
63
+ /**
64
+ * **Self-registration** (D6) — and the account it creates cannot log in yet.
65
+ *
66
+ * `register` writes the user as `pending_verification` and mails the app's
67
+ * `verify_url`. Without that step the domain whitelist would prove nothing:
68
+ * anybody could claim any address at an allowed domain and be `active`
69
+ * immediately.
70
+ *
71
+ * **The answer is `202` for every policy-allowed request**, whether the address
72
+ * was new or already known — a mail goes out only in the first case, and a
73
+ * `register` that finds the address on an account still waiting to verify
74
+ * replaces that account's password and mails a fresh link, so the mailbox's own
75
+ * owner always wins over whoever typed their address first. A `202` that
76
+ * depended on existence would be the enumeration oracle the whole family is
77
+ * built to avoid. The refusals it *does* make are honest, because none is about
78
+ * a person: `403 registration_closed` when the app has self-registration off,
79
+ * `403 domain_not_allowed` when the address is outside `allowed_domains`, and
80
+ * `404 not_found` for an app identifier no app carries.
81
+ */
82
+ export declare const clientRegisterRequest: z.ZodObject<{
83
+ app_identifier: z.ZodString;
84
+ email: z.ZodEmail;
85
+ password: z.ZodString;
86
+ display_name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
87
+ }, z.core.$strict>;
88
+ export type ClientRegisterRequest = z.infer<typeof clientRegisterRequest>;
89
+ /** Spending the verification token: the account becomes `active` and the answer is a session, so the person is not asked to log in immediately after proving they can read the mail. */
90
+ export declare const clientVerifyEmailRequest: z.ZodObject<{
91
+ token: z.ZodString;
92
+ }, z.core.$strict>;
93
+ export type ClientVerifyEmailRequest = z.infer<typeof clientVerifyEmailRequest>;
94
+ /** Asking for the verification mail again. **Always `202`**, for the reason `register` is: an answer that depended on the address existing would be the oracle by another door. */
95
+ export declare const clientResendVerificationRequest: z.ZodObject<{
96
+ app_identifier: z.ZodString;
97
+ email: z.ZodEmail;
98
+ }, z.core.$strict>;
99
+ export type ClientResendVerificationRequest = z.infer<typeof clientResendVerificationRequest>;
100
+ /**
101
+ * Asking for a reset link **as an app user**.
102
+ *
103
+ * Same act as `passwordResetRequest`, different shape, because the two surfaces
104
+ * identify a person differently. A Fleetless user's address is globally unique
105
+ * and resolves alone; an app user's is unique only within their app, so the
106
+ * pair is what names them.
107
+ *
108
+ * The response is identical for a known and an unknown pair — otherwise this
109
+ * becomes the enumeration oracle the rest of the family is carefully built not
110
+ * to be. An **app identifier** no app carries is the one refusal, `404
111
+ * not_found`, because an identifier is public and an address is not.
112
+ *
113
+ * Moved here from `identity.ts`, where it sat because the client surface had no
114
+ * file of its own for it. It is an app-user shape and belongs with them.
115
+ */
116
+ export declare const clientPasswordResetRequest: z.ZodObject<{
117
+ app_identifier: z.ZodString;
118
+ email: z.ZodEmail;
119
+ }, z.core.$strict>;
120
+ export type ClientPasswordResetRequest = z.infer<typeof clientPasswordResetRequest>;
121
+ /** Spending the reset token. **Every refresh family of that user is revoked**, because a forgotten password is one of the two states where somebody else may be holding a session. */
122
+ export declare const clientPasswordResetConfirmRequest: z.ZodObject<{
123
+ token: z.ZodString;
124
+ new_password: z.ZodString;
125
+ }, z.core.$strict>;
126
+ export type ClientPasswordResetConfirmRequest = z.infer<typeof clientPasswordResetConfirmRequest>;
127
+ /**
128
+ * Accepting an app invitation. Creates the account, or activates one that was
129
+ * invited before it existed, with the role the invitation fixed at creation.
130
+ *
131
+ * An invitation **always bypasses the domain whitelist**: a developer inviting
132
+ * somebody by hand has already made the decision the whitelist automates.
133
+ */
134
+ export declare const clientAcceptInvitationRequest: z.ZodObject<{
135
+ token: z.ZodString;
136
+ password: z.ZodString;
137
+ display_name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
138
+ }, z.core.$strict>;
139
+ export type ClientAcceptInvitationRequest = z.infer<typeof clientAcceptInvitationRequest>;
140
+ /**
141
+ * **The one OIDC callback path, for every app and every provider**, declared
142
+ * once so the cloud, the console and the documentation cannot spell it
143
+ * differently.
144
+ *
145
+ * `appAuthConfig.oidc_callback_url` is this path appended to the cloud's own
146
+ * `PUBLIC_API_BASE_URL`, and that URL is what a developer registers at their
147
+ * identity provider. So the string is not an implementation detail of one
148
+ * route: it is copied out of the console into somebody else's IdP
149
+ * configuration, where a later rename would break every sign-in with no error
150
+ * anybody here can see.
151
+ *
152
+ * **This is the path, not the URL.** The cloud mints the URL from its
153
+ * canonical public base — the same rule `MCP_ENDPOINT_PATH` states — and a
154
+ * friendly alias in front of the API is not a substitute, because the
155
+ * redirect target must match the one string registered at the provider
156
+ * exactly.
157
+ *
158
+ * `OAUTH_PATHS` is the precedent, and the warning: nine paths declared once so
159
+ * two repositories could not disagree, one of which then named a route the
160
+ * cloud had deleted. What keeps this one honest is `routes.ts` — the manifest
161
+ * carries the same path, the cloud's `route-manifest.test.ts` asserts set
162
+ * equality with it, and the test beside this file asserts the two spellings
163
+ * are the one string rather than two that currently agree.
164
+ */
165
+ export declare const CLIENT_OIDC_CALLBACK_PATH: "/api/client/oidc/callback";
166
+ /** The query of `GET /api/client/providers` — which app's sign-in buttons to draw. */
167
+ export declare const clientProviderListQuery: z.ZodObject<{
168
+ app_identifier: z.ZodString;
169
+ }, z.core.$strip>;
170
+ export type ClientProviderListQuery = z.infer<typeof clientProviderListQuery>;
171
+ /**
172
+ * What the developer's login page needs to draw its provider buttons, and
173
+ * **nothing more**. This route is public and unauthenticated: the issuer, the
174
+ * client id, the scopes and the linking policy are all management-side facts
175
+ * that would tell a stranger how the app's federation is configured.
176
+ *
177
+ * Only **enabled** providers appear. A disabled one is not a button that
178
+ * refuses; it is a button that is not there.
179
+ */
180
+ export declare const clientProviderListResponse: z.ZodObject<{
181
+ providers: z.ZodArray<z.ZodObject<{
182
+ slug: z.ZodString;
183
+ name: z.ZodString;
184
+ }, z.core.$strip>>;
185
+ }, z.core.$strip>;
186
+ export type ClientProviderListResponse = z.infer<typeof clientProviderListResponse>;
187
+ /**
188
+ * The query of `GET /api/client/oidc/:slug/start`.
189
+ *
190
+ * **The app runs its own PKCE** here, against Fleetless — a second, independent
191
+ * exchange from the one Fleetless runs against the identity provider. So the
192
+ * one-time code the callback hands back is bound to a verifier only the app's
193
+ * page holds, and a code intercepted in the redirect is worth nothing on its
194
+ * own.
195
+ *
196
+ * `redirect_uri` is validated against the app's `allowed_origins` **before
197
+ * anything else**, and a failure there never redirects: until the target is
198
+ * known-good, sending a browser to it is the attack.
199
+ */
200
+ export declare const clientOidcStartQuery: z.ZodObject<{
201
+ app_identifier: z.ZodString;
202
+ redirect_uri: z.ZodURL;
203
+ state: z.ZodString;
204
+ code_challenge: z.ZodString;
205
+ }, z.core.$strip>;
206
+ export type ClientOidcStartQuery = z.infer<typeof clientOidcStartQuery>;
207
+ /**
208
+ * **The query of `GET /api/client/oidc/callback` — the identity provider's
209
+ * wire, not Fleetless's.**
210
+ *
211
+ * Every field but `state` is optional and **the object is not `.strict()`**,
212
+ * which is the whole point of writing it down. A conforming provider sends
213
+ * `code` and `state` on success and `error` (with an optional
214
+ * `error_description`) on refusal, and many send more besides — `iss` per RFC
215
+ * 9207, `session_state`, a vendor field. A strict schema over somebody else's
216
+ * specification refuses conforming callers, which is the mistake
217
+ * `POST /mcp/oauth/register` documents having avoided by not parsing its body
218
+ * at all. Declaring the shape loosely says what arrives without promising it is
219
+ * the only thing that will.
220
+ *
221
+ * `state` is the one required field because it is the one Fleetless minted: it
222
+ * resolves the `oidc_interactions` row that holds the app's `redirect_uri`,
223
+ * and without it there is nowhere to send any answer, success or failure. That
224
+ * is the single case where the cloud renders a page of its own (D2).
225
+ *
226
+ * It exists as a schema rather than as four parameters read by hand because
227
+ * the manifest forbids the second: a documented route whose prose names a
228
+ * `?parameter=` must declare what it reads, and every phrase that used to
229
+ * excuse one was removed by writing the schema rather than by rewording.
230
+ */
231
+ export declare const clientOidcCallbackQuery: z.ZodObject<{
232
+ state: z.ZodString;
233
+ code: z.ZodOptional<z.ZodString>;
234
+ error: z.ZodOptional<z.ZodString>;
235
+ error_description: z.ZodOptional<z.ZodString>;
236
+ }, z.core.$strip>;
237
+ export type ClientOidcCallbackQuery = z.infer<typeof clientOidcCallbackQuery>;
238
+ /** Trading the one-time code for a session. The code lives 60 seconds and is bound to the challenge from `start`. */
239
+ export declare const clientOidcExchangeRequest: z.ZodObject<{
240
+ code: z.ZodString;
241
+ code_verifier: z.ZodString;
242
+ }, z.core.$strict>;
243
+ export type ClientOidcExchangeRequest = z.infer<typeof clientOidcExchangeRequest>;
244
+ /**
245
+ * **Why a federated sign-in ended without a session, in a code the app can
246
+ * branch on** — carried back to the app's own `redirect_uri` as `error`, not
247
+ * rendered by Fleetless (D2). The only Fleetless-rendered page in this flow is
248
+ * the one for a state that can no longer be resolved to a redirect URI, because
249
+ * then there is nowhere to send the answer.
250
+ *
251
+ * The five rows of D4's table are the first five values plus `no_access`:
252
+ *
253
+ * - `no_access` — the identity is unknown and nothing admits it, or the account
254
+ * it names is not `active`. **One code for both**, because to the person the
255
+ * remedy is the same — ask somebody to let you in — and a code that split an
256
+ * outcome nobody acts on differently would tell a stranger which half applied.
257
+ * - `email_taken` — the address already belongs to another app user, and the
258
+ * provider is not permitted to link (`link_verified_emails`, or the provider
259
+ * did not assert `email_verified`). Deliberately not `no_access`: the remedy
260
+ * is different — *sign in the way you signed up*.
261
+ * - `email_unverified` — the provider asserted an address without
262
+ * `email_verified`. **An unverified address never produces or links an
263
+ * account**, whatever the rest of the policy says.
264
+ * - `domain_not_allowed`, `registration_closed` — the self-registration policy
265
+ * refused. Honest, because neither is about whether a person exists.
266
+ * - `idp_unavailable`, `exchange_failed`, `claims_incomplete`,
267
+ * `provider_misconfigured`, `provider_disabled` — the provider's or the
268
+ * developer's to fix, and the app can say so.
269
+ * - `invalid_request` — the start parameters did not hold up.
270
+ * - `quota_exceeded` — the org has as many app users as its `max_end_users`
271
+ * quota allows, so no account can be created for this identity. Named rather
272
+ * than folded into `no_access`, for `domain_not_allowed`'s reason: it is not
273
+ * about the person, the app can say what happened, and the remedy belongs to
274
+ * the developer rather than to whoever is trying to sign in. It is raised
275
+ * **only where an account would be created** — an identity that already has
276
+ * one signs in at the quota exactly as it does under it, because refusing a
277
+ * sign-in would turn a protection limit into an outage.
278
+ */
279
+ export declare const clientOidcErrorCode: z.ZodEnum<{
280
+ no_access: "no_access";
281
+ email_taken: "email_taken";
282
+ email_unverified: "email_unverified";
283
+ domain_not_allowed: "domain_not_allowed";
284
+ registration_closed: "registration_closed";
285
+ idp_unavailable: "idp_unavailable";
286
+ exchange_failed: "exchange_failed";
287
+ claims_incomplete: "claims_incomplete";
288
+ provider_misconfigured: "provider_misconfigured";
289
+ provider_disabled: "provider_disabled";
290
+ invalid_request: "invalid_request";
291
+ quota_exceeded: "quota_exceeded";
292
+ }>;
293
+ export type ClientOidcErrorCode = z.infer<typeof clientOidcErrorCode>;
294
+ /**
295
+ * **A pending MCP authorization, as the app's own consent screen reads it**
296
+ * (D7). Fleetless renders no page here either: `authorize` redirects to the
297
+ * app's `mcp_login_url` with an interaction id, the app authenticates the user
298
+ * with its normal UI, shows this, and approves or denies through the API.
299
+ *
300
+ * `client_name_verified` is `z.literal(false)`, and that is the whole point of
301
+ * the field. The name comes from an **unauthenticated** dynamic registration —
302
+ * the client typed it about itself, nobody checked it — so a consent screen
303
+ * that rendered it as though it were an identity would be teaching people to
304
+ * trust a string an attacker chooses. A literal rather than a boolean because
305
+ * there is no verified case to distinguish: an app that reads this field at all
306
+ * has to handle the untrusted one, and a `true` branch would be dead code
307
+ * pretending to be a safeguard.
308
+ */
309
+ export declare const clientMcpInteraction: z.ZodObject<{
310
+ id: z.ZodString;
311
+ app_id: z.ZodUUID;
312
+ client_name: z.ZodNullable<z.ZodString>;
313
+ client_name_verified: z.ZodLiteral<false>;
314
+ scopes: z.ZodArray<z.ZodString>;
315
+ already_granted: z.ZodBoolean;
316
+ expires_at: z.ZodISODateTime;
317
+ }, z.core.$strip>;
318
+ export type ClientMcpInteraction = z.infer<typeof clientMcpInteraction>;
319
+ /**
320
+ * What approve and deny both answer: **where to send the browser**. A denial
321
+ * carries a redirect too, with `error=access_denied` on it — a client that is
322
+ * refused must learn so from its own callback rather than from a page nobody
323
+ * sent it.
324
+ */
325
+ export declare const clientMcpInteractionDecisionResponse: z.ZodObject<{
326
+ redirect_to: z.ZodURL;
327
+ }, z.core.$strip>;
328
+ export type ClientMcpInteractionDecisionResponse = z.infer<typeof clientMcpInteractionDecisionResponse>;
329
+ /**
330
+ * **One standing MCP consent, as both withdrawal doors list it.**
331
+ *
332
+ * A grant is what lets a later authorization skip the app's consent screen:
333
+ * `clientMcpInteraction.already_granted` is a read of exactly this row. It is
334
+ * written when a person approves and it is removed by neither the client's
335
+ * registration lapsing nor its access token expiring — so without a door it
336
+ * was a decision a person could make once and never unmake.
337
+ *
338
+ * **Standing only.** A withdrawn grant is stamped rather than deleted, so the
339
+ * store still holds it; neither listing returns one. The question both doors
340
+ * ask is *what is connected right now*, and a row that answered "connected,
341
+ * but no" would be a state every caller has to filter for itself.
342
+ *
343
+ * `client_name_verified` is `z.literal(false)` for the reason
344
+ * `clientMcpInteraction` gives at length: the name comes from an
345
+ * unauthenticated dynamic registration, the client chose it about itself, and
346
+ * a list that rendered it as an identity would be teaching people to trust a
347
+ * string an attacker picked. Here it matters more than on the consent screen,
348
+ * not less — a "connected apps" list is read long after the moment of
349
+ * approval, when nobody remembers what they clicked.
350
+ */
351
+ export declare const mcpConsentGrant: z.ZodObject<{
352
+ client_id: z.ZodString;
353
+ client_name: z.ZodNullable<z.ZodString>;
354
+ client_name_verified: z.ZodLiteral<false>;
355
+ granted_at: z.ZodISODateTime;
356
+ }, z.core.$strip>;
357
+ export type McpConsentGrant = z.infer<typeof mcpConsentGrant>;
358
+ /** What both grant listings answer. Never null: a person who has connected nothing gets an empty array, and an absent key would make "nothing" and "not answered" the same reading. */
359
+ export declare const mcpConsentGrantListResponse: z.ZodObject<{
360
+ grants: z.ZodArray<z.ZodObject<{
361
+ client_id: z.ZodString;
362
+ client_name: z.ZodNullable<z.ZodString>;
363
+ client_name_verified: z.ZodLiteral<false>;
364
+ granted_at: z.ZodISODateTime;
365
+ }, z.core.$strip>>;
366
+ }, z.core.$strip>;
367
+ export type McpConsentGrantListResponse = z.infer<typeof mcpConsentGrantListResponse>;
368
+ /**
369
+ * Who the caller turned out to be. Returned by the "who am I" endpoint and by
370
+ * the realtime `auth_ok` frame, so a client can render a session without
371
+ * decoding a token itself — decoding a JWT in the client is how apps end up
372
+ * trusting claims nobody verified.
373
+ *
374
+ * **Three kinds of caller reach the client API.** Besides app users and server
375
+ * keys, a **developer** does: the console's playground runs over the real
376
+ * client API and appears in the audit as the developer, and the console's own
377
+ * live views subscribe on `/realtime` as one. A developer is **org-scoped, not
378
+ * app-scoped** — they own the configuration of every robot in their org — so
379
+ * `app_id` and `role_id` are null for them, and roles do not filter what they
380
+ * see. `kind` states this explicitly rather than leaving it to be inferred from
381
+ * which id happens to be set.
382
+ *
383
+ * **`end_user_id` became `app_user_id`, and that is a rename with a meaning.**
384
+ * The old subject was a member of the org's one pool, reachable through an
385
+ * assignment; the new one is a row that belongs to exactly one app. Renaming
386
+ * rather than keeping the key is deliberate: a consumer reading `.end_user_id`
387
+ * would have typechecked and meant something subtly different, which is the
388
+ * quietest way for a cut like this to go wrong.
389
+ *
390
+ * **`act` is gone.** It named the org admin behind an impersonation (the RFC
391
+ * 8693 pattern). Impersonation is deleted with no successor (D1), so a field
392
+ * that could still arrive would describe a delegation nothing can mint — and a
393
+ * client rendering "you are acting as …" from it would be showing a state the
394
+ * platform cannot enter.
395
+ */
396
+ export declare const clientIdentity: z.ZodObject<{
397
+ kind: z.ZodEnum<{
398
+ developer: "developer";
399
+ server_key: "server_key";
400
+ app_user: "app_user";
401
+ }>;
402
+ developer_id: z.ZodNullable<z.ZodUUID>;
403
+ app_user_id: z.ZodNullable<z.ZodUUID>;
404
+ server_key_id: z.ZodNullable<z.ZodUUID>;
405
+ app_id: z.ZodNullable<z.ZodUUID>;
406
+ role_id: z.ZodNullable<z.ZodUUID>;
407
+ email: z.ZodNullable<z.ZodEmail>;
408
+ }, z.core.$strip>;
409
+ export type ClientIdentity = z.infer<typeof clientIdentity>;