@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.
- package/CHANGELOG.md +26 -0
- package/LICENSE +202 -0
- package/NOTICE +17 -0
- package/README.md +88 -0
- package/artifacts/constants.json +24 -0
- package/artifacts/openapi.json +17219 -0
- package/artifacts/routes.json +4605 -0
- package/artifacts/schema/accept-team-invite-request.schema.json +22 -0
- package/artifacts/schema/action-config.schema.json +198 -0
- package/artifacts/schema/alert-list-response.schema.json +172 -0
- package/artifacts/schema/api-error.schema.json +20 -0
- package/artifacts/schema/app-auth-config.schema.json +106 -0
- package/artifacts/schema/app-invitation-list-response.schema.json +57 -0
- package/artifacts/schema/app-invitation.schema.json +69 -0
- package/artifacts/schema/app-list-response.schema.json +82 -0
- package/artifacts/schema/app-mail-template-list-response.schema.json +68 -0
- package/artifacts/schema/app-mail-template.schema.json +54 -0
- package/artifacts/schema/app-oidc-provider-list-response.schema.json +93 -0
- package/artifacts/schema/app-oidc-provider.schema.json +80 -0
- package/artifacts/schema/app-user-list-response.schema.json +111 -0
- package/artifacts/schema/app-user.schema.json +98 -0
- package/artifacts/schema/app.schema.json +69 -0
- package/artifacts/schema/apply-error.schema.json +41 -0
- package/artifacts/schema/asset-list-response.schema.json +288 -0
- package/artifacts/schema/asset-sync-request.schema.json +17 -0
- package/artifacts/schema/asset-sync-response.schema.json +16 -0
- package/artifacts/schema/asset-sync-status.schema.json +136 -0
- package/artifacts/schema/asset.schema.json +68 -0
- package/artifacts/schema/audit-actor.schema.json +32 -0
- package/artifacts/schema/audit-event.schema.json +119 -0
- package/artifacts/schema/audit-list-response.schema.json +144 -0
- package/artifacts/schema/audit-query.schema.json +79 -0
- package/artifacts/schema/auth-error.schema.json +23 -0
- package/artifacts/schema/auth-me-response.schema.json +99 -0
- package/artifacts/schema/auth-ok.schema.json +115 -0
- package/artifacts/schema/authorization-server-metadata.schema.json +80 -0
- package/artifacts/schema/bridge-asset-progress.schema.json +99 -0
- package/artifacts/schema/bridge-assets-available.schema.json +25 -0
- package/artifacts/schema/bridge-camera-state.schema.json +78 -0
- package/artifacts/schema/bridge-config-applied.schema.json +67 -0
- package/artifacts/schema/bridge-hello.schema.json +65 -0
- package/artifacts/schema/bridge-introspect.schema.json +114 -0
- package/artifacts/schema/bridge-job-lost.schema.json +22 -0
- package/artifacts/schema/bridge-job-update.schema.json +100 -0
- package/artifacts/schema/bridge-pong.schema.json +19 -0
- package/artifacts/schema/bridge-pressure.schema.json +292 -0
- package/artifacts/schema/bridge-state.schema.json +24 -0
- package/artifacts/schema/bridge-type-definitions.schema.json +169 -0
- package/artifacts/schema/busy-details.schema.json +115 -0
- package/artifacts/schema/camera-descriptor.schema.json +45 -0
- package/artifacts/schema/camera-list-response.schema.json +58 -0
- package/artifacts/schema/camera-source.schema.json +240 -0
- package/artifacts/schema/cancel-request.schema.json +20 -0
- package/artifacts/schema/client-accept-invitation-request.schema.json +35 -0
- package/artifacts/schema/client-auth.schema.json +18 -0
- package/artifacts/schema/client-cancel.schema.json +45 -0
- package/artifacts/schema/client-identity.schema.json +103 -0
- package/artifacts/schema/client-invoke.schema.json +45 -0
- package/artifacts/schema/client-login-request.schema.json +29 -0
- package/artifacts/schema/client-logout-request.schema.json +14 -0
- package/artifacts/schema/client-mcp-interaction-decision-response.schema.json +15 -0
- package/artifacts/schema/client-mcp-interaction.schema.json +59 -0
- package/artifacts/schema/client-oidc-callback-query.schema.json +28 -0
- package/artifacts/schema/client-oidc-exchange-request.schema.json +21 -0
- package/artifacts/schema/client-oidc-start-query.schema.json +36 -0
- package/artifacts/schema/client-password-reset-confirm-request.schema.json +22 -0
- package/artifacts/schema/client-password-reset-request.schema.json +24 -0
- package/artifacts/schema/client-provider-list-query.schema.json +17 -0
- package/artifacts/schema/client-provider-list-response.schema.json +34 -0
- package/artifacts/schema/client-publish.schema.json +40 -0
- package/artifacts/schema/client-refresh-request.schema.json +14 -0
- package/artifacts/schema/client-register-request.schema.json +44 -0
- package/artifacts/schema/client-resend-verification-request.schema.json +24 -0
- package/artifacts/schema/client-subscribe.schema.json +43 -0
- package/artifacts/schema/client-unsubscribe.schema.json +26 -0
- package/artifacts/schema/client-verify-email-request.schema.json +15 -0
- package/artifacts/schema/cloud-asset-request.schema.json +37 -0
- package/artifacts/schema/cloud-camera-start.schema.json +41 -0
- package/artifacts/schema/cloud-camera-stop.schema.json +26 -0
- package/artifacts/schema/cloud-cancel.schema.json +33 -0
- package/artifacts/schema/cloud-config.schema.json +1635 -0
- package/artifacts/schema/cloud-hello-error.schema.json +23 -0
- package/artifacts/schema/cloud-hello-ok.schema.json +19 -0
- package/artifacts/schema/cloud-introspect-request.schema.json +19 -0
- package/artifacts/schema/cloud-invoke.schema.json +40 -0
- package/artifacts/schema/cloud-ping.schema.json +19 -0
- package/artifacts/schema/cloud-publish.schema.json +28 -0
- package/artifacts/schema/cloud-type-request.schema.json +30 -0
- package/artifacts/schema/command-result.schema.json +175 -0
- package/artifacts/schema/config-draft-response.schema.json +1695 -0
- package/artifacts/schema/config-state.schema.json +124 -0
- package/artifacts/schema/config-version-response.schema.json +1641 -0
- package/artifacts/schema/config-versions-response.schema.json +33 -0
- package/artifacts/schema/create-app-invitation-request.schema.json +40 -0
- package/artifacts/schema/create-app-oidc-provider-request.schema.json +70 -0
- package/artifacts/schema/create-app-request.schema.json +30 -0
- package/artifacts/schema/create-app-user-request.schema.json +42 -0
- package/artifacts/schema/create-robot-request.schema.json +14 -0
- package/artifacts/schema/create-robot-response.schema.json +44 -0
- package/artifacts/schema/create-server-key-response.schema.json +65 -0
- package/artifacts/schema/create-team-invite-request.schema.json +43 -0
- package/artifacts/schema/datapoint-alert-row.schema.json +160 -0
- package/artifacts/schema/datapoint-config.schema.json +366 -0
- package/artifacts/schema/datapoint-display.schema.json +31 -0
- package/artifacts/schema/datapoint-event.schema.json +34 -0
- package/artifacts/schema/datapoint-frame.schema.json +28 -0
- package/artifacts/schema/datapoint-list-response.schema.json +61 -0
- package/artifacts/schema/datapoint-value.schema.json +28 -0
- package/artifacts/schema/developer-login-request.schema.json +19 -0
- package/artifacts/schema/dynamic-client-registration-request.schema.json +60 -0
- package/artifacts/schema/dynamic-client-registration-response.schema.json +68 -0
- package/artifacts/schema/error-frame.schema.json +23 -0
- package/artifacts/schema/exposure-counts.schema.json +39 -0
- package/artifacts/schema/exposure-list-response.schema.json +43 -0
- package/artifacts/schema/fetch-types-request.schema.json +19 -0
- package/artifacts/schema/fetch-types-response.schema.json +163 -0
- package/artifacts/schema/fleetless-user-list-response.schema.json +73 -0
- package/artifacts/schema/fleetless-user.schema.json +60 -0
- package/artifacts/schema/history-buckets-response.schema.json +79 -0
- package/artifacts/schema/history-query.schema.json +58 -0
- package/artifacts/schema/history-response.schema.json +150 -0
- package/artifacts/schema/history-samples-response.schema.json +68 -0
- package/artifacts/schema/introspection-response.schema.json +118 -0
- package/artifacts/schema/invoke-or-service-response.schema.json +141 -0
- package/artifacts/schema/invoke-request.schema.json +23 -0
- package/artifacts/schema/invoke-response.schema.json +125 -0
- package/artifacts/schema/job-actor.schema.json +34 -0
- package/artifacts/schema/job-event.schema.json +158 -0
- package/artifacts/schema/job-response.schema.json +123 -0
- package/artifacts/schema/job-run-list-response.schema.json +222 -0
- package/artifacts/schema/job-run-query.schema.json +95 -0
- package/artifacts/schema/job-run-summary-query.schema.json +23 -0
- package/artifacts/schema/job-run-summary.schema.json +33 -0
- package/artifacts/schema/job-run.schema.json +195 -0
- package/artifacts/schema/job-state.schema.json +11 -0
- package/artifacts/schema/job.schema.json +106 -0
- package/artifacts/schema/latency-bucket.schema.json +63 -0
- package/artifacts/schema/live-session-response.schema.json +41 -0
- package/artifacts/schema/mail-outcome.schema.json +20 -0
- package/artifacts/schema/mail-template-preview-request.schema.json +35 -0
- package/artifacts/schema/mail-template-preview-response.schema.json +31 -0
- package/artifacts/schema/mail-template-problem-details.schema.json +24 -0
- package/artifacts/schema/mcp-consent-grant-list-response.schema.json +52 -0
- package/artifacts/schema/mcp-consent-grant.schema.json +39 -0
- package/artifacts/schema/mcp-robot-datasheet.schema.json +115 -0
- package/artifacts/schema/mcp-role-preview-response.schema.json +134 -0
- package/artifacts/schema/missing-asset-query.schema.json +11 -0
- package/artifacts/schema/oauth-authorize-query.schema.json +47 -0
- package/artifacts/schema/oauth-redirect-response.schema.json +15 -0
- package/artifacts/schema/oauth-token-request.schema.json +47 -0
- package/artifacts/schema/oauth-token-response.schema.json +38 -0
- package/artifacts/schema/org-alerts-query.schema.json +15 -0
- package/artifacts/schema/org-event-dropped.schema.json +26 -0
- package/artifacts/schema/org-event-replay.schema.json +97 -0
- package/artifacts/schema/org-event-subscribe.schema.json +14 -0
- package/artifacts/schema/org-event-unsubscribe.schema.json +14 -0
- package/artifacts/schema/org-event.schema.json +75 -0
- package/artifacts/schema/org-firing-alerts-response.schema.json +178 -0
- package/artifacts/schema/org-health-query.schema.json +13 -0
- package/artifacts/schema/org-latency-query.schema.json +42 -0
- package/artifacts/schema/org-latency-response.schema.json +124 -0
- package/artifacts/schema/org-quota-usage-counts.schema.json +42 -0
- package/artifacts/schema/org-quota-usage.schema.json +102 -0
- package/artifacts/schema/org-quotas.schema.json +51 -0
- package/artifacts/schema/org-usage-query.schema.json +19 -0
- package/artifacts/schema/org-usage-response.schema.json +77 -0
- package/artifacts/schema/org.schema.json +30 -0
- package/artifacts/schema/parameter-invalid-details.schema.json +37 -0
- package/artifacts/schema/parameter-spec.schema.json +120 -0
- package/artifacts/schema/parameter-violation.schema.json +24 -0
- package/artifacts/schema/password-change-request.schema.json +21 -0
- package/artifacts/schema/password-reset-confirm.schema.json +19 -0
- package/artifacts/schema/password-reset-request.schema.json +14 -0
- package/artifacts/schema/patch-app-oidc-provider-request.schema.json +50 -0
- package/artifacts/schema/patch-app-user-request.schema.json +34 -0
- package/artifacts/schema/patch-auth-me-request.schema.json +22 -0
- package/artifacts/schema/patch-fleetless-user-request.schema.json +20 -0
- package/artifacts/schema/patch-org-request.schema.json +15 -0
- package/artifacts/schema/patch-org-response.schema.json +40 -0
- package/artifacts/schema/patch-robot-request.schema.json +15 -0
- package/artifacts/schema/patch-robot-response.schema.json +40 -0
- package/artifacts/schema/pending-team-invite-list-response.schema.json +52 -0
- package/artifacts/schema/pending-team-invite.schema.json +39 -0
- package/artifacts/schema/protected-resource-metadata.schema.json +41 -0
- package/artifacts/schema/publish-config-response.schema.json +21 -0
- package/artifacts/schema/publish-request.schema.json +17 -0
- package/artifacts/schema/publisher-config.schema.json +285 -0
- package/artifacts/schema/put-app-auth-config-request.schema.json +93 -0
- package/artifacts/schema/put-app-mail-template-request.schema.json +35 -0
- package/artifacts/schema/put-config-draft-request.schema.json +13 -0
- package/artifacts/schema/put-datapoint-display-request.schema.json +31 -0
- package/artifacts/schema/put-robot-details-request.schema.json +41 -0
- package/artifacts/schema/put-robot-details-response.schema.json +43 -0
- package/artifacts/schema/rate-limit-details.schema.json +15 -0
- package/artifacts/schema/refresh-request.schema.json +13 -0
- package/artifacts/schema/release-live-query.schema.json +13 -0
- package/artifacts/schema/rename-slug-request.schema.json +23 -0
- package/artifacts/schema/rename-slug-response.schema.json +24 -0
- package/artifacts/schema/resource-health-event.schema.json +72 -0
- package/artifacts/schema/resource-health-list-response.schema.json +80 -0
- package/artifacts/schema/resource-health-state.schema.json +68 -0
- package/artifacts/schema/robot-config-doc.schema.json +1616 -0
- package/artifacts/schema/robot-delete-query.schema.json +12 -0
- package/artifacts/schema/robot-deletion-summary.schema.json +63 -0
- package/artifacts/schema/robot-detail-response.schema.json +262 -0
- package/artifacts/schema/robot-details-doc.schema.json +33 -0
- package/artifacts/schema/robot-jobs-response.schema.json +119 -0
- package/artifacts/schema/robot-latency-series.schema.json +81 -0
- package/artifacts/schema/robot-list-item.schema.json +94 -0
- package/artifacts/schema/robot-list-response.schema.json +106 -0
- package/artifacts/schema/robot.schema.json +30 -0
- package/artifacts/schema/role-list-response.schema.json +48 -0
- package/artifacts/schema/role-permissions.schema.json +61 -0
- package/artifacts/schema/role.schema.json +35 -0
- package/artifacts/schema/ros-graph.schema.json +99 -0
- package/artifacts/schema/server-key-list-response.schema.json +64 -0
- package/artifacts/schema/server-key.schema.json +51 -0
- package/artifacts/schema/service-call-response.schema.json +13 -0
- package/artifacts/schema/service-config.schema.json +198 -0
- package/artifacts/schema/session-tokens.schema.json +28 -0
- package/artifacts/schema/sign-up-request.schema.json +26 -0
- package/artifacts/schema/sign-up-response.schema.json +127 -0
- package/artifacts/schema/slug-usage-response.schema.json +32 -0
- package/artifacts/schema/snapshot-header.schema.json +44 -0
- package/artifacts/schema/snapshot-meta-response.schema.json +85 -0
- package/artifacts/schema/subscribe-error.schema.json +31 -0
- package/artifacts/schema/team-invite.schema.json +57 -0
- package/artifacts/schema/tier-change-request.schema.json +17 -0
- package/artifacts/schema/type-definition.schema.json +144 -0
- package/artifacts/schema/types-response.schema.json +156 -0
- package/artifacts/schema/update-app-request.schema.json +32 -0
- package/artifacts/schema/urdf-completeness.schema.json +50 -0
- package/artifacts/schema/validation-issue.schema.json +43 -0
- package/artifacts/schema/waitlist-request.schema.json +15 -0
- package/artifacts/schema-outgoing/bridge-asset-progress.schema.json +102 -0
- package/artifacts/schema-outgoing/bridge-assets-available.schema.json +26 -0
- package/artifacts/schema-outgoing/bridge-camera-state.schema.json +80 -0
- package/artifacts/schema-outgoing/bridge-config-applied.schema.json +69 -0
- package/artifacts/schema-outgoing/bridge-hello.schema.json +68 -0
- package/artifacts/schema-outgoing/bridge-introspect.schema.json +119 -0
- package/artifacts/schema-outgoing/bridge-job-lost.schema.json +23 -0
- package/artifacts/schema-outgoing/bridge-job-update.schema.json +102 -0
- package/artifacts/schema-outgoing/bridge-pong.schema.json +20 -0
- package/artifacts/schema-outgoing/bridge-type-definitions.schema.json +174 -0
- package/artifacts/schema-outgoing/datapoint-frame.schema.json +29 -0
- package/artifacts/schema-outgoing/snapshot-header.schema.json +45 -0
- package/dist/alerts.d.ts +255 -0
- package/dist/alerts.js +193 -0
- package/dist/app-users.d.ts +606 -0
- package/dist/app-users.js +696 -0
- package/dist/apps.d.ts +175 -0
- package/dist/apps.js +267 -0
- package/dist/assets.d.ts +434 -0
- package/dist/assets.js +546 -0
- package/dist/audit.d.ts +129 -0
- package/dist/audit.js +238 -0
- package/dist/client-auth.d.ts +409 -0
- package/dist/client-auth.js +487 -0
- package/dist/common.d.ts +186 -0
- package/dist/common.js +199 -0
- package/dist/config-issues.d.ts +175 -0
- package/dist/config-issues.js +339 -0
- package/dist/config.d.ts +862 -0
- package/dist/config.js +1988 -0
- package/dist/errors.d.ts +52 -0
- package/dist/errors.js +786 -0
- package/dist/identity.d.ts +549 -0
- package/dist/identity.js +503 -0
- package/dist/index.d.ts +51 -0
- package/dist/index.js +51 -0
- package/dist/introspection.d.ts +99 -0
- package/dist/introspection.js +97 -0
- package/dist/jobs.d.ts +334 -0
- package/dist/jobs.js +345 -0
- package/dist/mcp.d.ts +239 -0
- package/dist/mcp.js +153 -0
- package/dist/oauth.d.ts +344 -0
- package/dist/oauth.js +488 -0
- package/dist/protocol.d.ts +781 -0
- package/dist/protocol.js +715 -0
- package/dist/realtime.d.ts +494 -0
- package/dist/realtime.js +512 -0
- package/dist/rest.d.ts +1989 -0
- package/dist/rest.js +1963 -0
- package/dist/routes.d.ts +94 -0
- package/dist/routes.js +2298 -0
- 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>;
|