@fleetless/sdk 3.0.0 → 3.0.2

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/dist/index.d.cts CHANGED
@@ -1,16 +1,18 @@
1
+ // SPDX-License-Identifier: MIT
1
2
  import { z } from 'zod';
2
3
 
4
+
3
5
  /**
4
- * Jobs (spec §6.1, §11.3): one running unit of work on a robot — an action
6
+ * Jobs: one running unit of work on a robot — an action
5
7
  * goal or a service call — with an id both sides know, so bridge and cloud
6
8
  * stay in sync across a disconnect.
7
9
  *
8
10
  * Two rules shape everything here:
9
11
  *
10
- * 1. **State is observed by slug, not by id.** The id is informative (§11.3);
11
- * a client watches `robot × slug` and sees whatever job is running there,
12
- * which is also why every observer of a slug sees the same job.
13
- * 2. **`lost` is a real outcome and must be said out loud** (§6.1). Job state
12
+ * 1. **State is observed by slug, not by id.** The id is informative; a client
13
+ * watches `robot × slug` and sees whatever job is running there, which is
14
+ * also why every observer of a slug sees the same job.
15
+ * 2. **`lost` is a real outcome and must be said out loud.** Job state
14
16
  * lives only in the bridge's memory; if it restarts mid-job, the results
15
17
  * are gone. The cloud then marks the job `lost` — never leaves it reading
16
18
  * "running" because nobody contradicted it. A system that reports a
@@ -50,8 +52,8 @@ type Job = z.infer<typeof job>;
50
52
  /**
51
53
  * One update about a job, pushed to subscribers of its slug.
52
54
  *
53
- * `timestamp_ms` is the bridge's capture time, exactly as for a datapoint
54
- * (§6.3 says action feedback carries it too) — so a client computes the age
55
+ * `timestamp_ms` is the bridge's capture time, exactly as for a datapoint —
56
+ * action feedback carries it too — so a client computes the age
55
57
  * of a progress report the same way it computes the age of a sensor value,
56
58
  * and a burst of late-delivered feedback after a reconnect is visibly late
57
59
  * rather than looking current.
@@ -87,9 +89,8 @@ declare const jobEvent: z.ZodObject<{
87
89
  }, z.core.$strip>;
88
90
  type JobEvent = z.infer<typeof jobEvent>;
89
91
  /**
90
- * What a busy refusal tells the caller (spec §11.3: "inkl. Information, was
91
- * läuft"). A refusal that only says "busy" forces the caller to guess whether
92
- * to wait or to give up.
92
+ * What a busy refusal tells the caller: what is already running. A refusal that
93
+ * only says "busy" forces the caller to guess whether to wait or to give up.
93
94
  */
94
95
  declare const busyDetails: z.ZodObject<{
95
96
  running: z.ZodObject<{
@@ -118,7 +119,7 @@ type BusyDetails = z.infer<typeof busyDetails>;
118
119
 
119
120
  /**
120
121
  * The REST read of one datapoint. For bridge-captured data `timestamp_ms`
121
- * is the capture time at the bridge (spec §6.3); for the cloud-observed
122
+ * is the capture time at the bridge; for the cloud-observed
122
123
  * built-in `bridge_state` it is the time the cloud observed the state.
123
124
  */
124
125
  declare const datapointValue: z.ZodObject<{
@@ -129,20 +130,18 @@ declare const datapointValue: z.ZodObject<{
129
130
  type DatapointValue = z.infer<typeof datapointValue>;
130
131
  /**
131
132
  * Every job the platform currently believes this robot has — `GET
132
- * /api/robots/:id/jobs` (W6b).
133
+ * /api/robots/:id/jobs`.
133
134
  *
134
135
  * `jobResponse` answers "what is on this slug", which requires knowing the
135
- * slug first. That was enough while a job could only exist on a slug the
136
- * published configuration named. W6b breaks that assumption twice: a
137
- * reconnecting bridge can name a job the cloud has **no row for** and the
138
- * cloud adopts it, and a configuration change can leave a job on a slug the
139
- * document no longer contains. Both are jobs nobody can ask about, because
140
- * asking requires already knowing what to ask for.
136
+ * slug first. Two kinds of job break that assumption: a reconnecting bridge
137
+ * can name a job the cloud has **no row for**, and the cloud adopts it; and a
138
+ * configuration change can leave a job on a slug the document no longer
139
+ * contains. Both are jobs nobody can ask about, because asking requires
140
+ * already knowing what to ask for.
141
141
  *
142
- * So this route exists to answer the question the per-slug route cannot: not
143
- * "is something running here", but "what is this robot doing". A restarted
144
- * cloud that has just reconciled a robot's `hello.active_jobs` has exactly
145
- * this list and, until now, no way to say it out loud.
142
+ * So this route answers the question the per-slug route cannot: not "is
143
+ * something running here", but "what is this robot doing". A cloud that has
144
+ * just reconciled a robot's `hello.active_jobs` has exactly this list.
146
145
  *
147
146
  * The array is ordered newest first and is **never null**: a robot doing
148
147
  * nothing answers `{ jobs: [] }`. "Nothing is running" and "we did not look"
@@ -150,14 +149,11 @@ type DatapointValue = z.infer<typeof datapointValue>;
150
149
  * distinction `robotDeletionSummary` was made all-required for.
151
150
  *
152
151
  * **At most one entry per slug: the current job there, exactly what
153
- * `jobResponse` would answer for that slug.** This is not a history endpoint
154
- * and must not become one. The first implementation returned every job the
155
- * registry still held — six rows and four complete Fibonacci results after a
156
- * few minutes of gate traffic, and unbounded in both count and payload for a
157
- * robot that has been working all day. The list would have grown until a
158
- * console page carried a robot's entire past, and the one thing it exists to
159
- * answer — *what is this robot doing* — would have been the first line of a
160
- * scroll.
152
+ * `jobResponse` would answer for that slug.** This is not a history endpoint.
153
+ * Returning every job a registry still holds is unbounded in both count and
154
+ * payload for a robot that has been working all day, and the one thing this
155
+ * route exists to answer — *what is this robot doing* — would be the first
156
+ * line of a scroll. The durable history has its own routes.
161
157
  *
162
158
  * A settled job stays visible as its slug's current entry until something
163
159
  * else runs there, which is what makes a job that just failed still findable.
@@ -165,7 +161,7 @@ type DatapointValue = z.infer<typeof datapointValue>;
165
161
  * `jobResponse`.
166
162
  */
167
163
  /**
168
- * What a `rate_limited` refusal tells the caller (W6c).
164
+ * What a `rate_limited` refusal tells the caller.
169
165
  *
170
166
  * One number, and it is the only one that matters: **when to come back.** A
171
167
  * limit that says "too many" without saying "in 800 ms" produces a client that
@@ -189,7 +185,7 @@ declare const cameraDescriptor: z.ZodObject<{
189
185
  }, z.core.$strip>;
190
186
  type CameraDescriptor = z.infer<typeof cameraDescriptor>;
191
187
  /**
192
- * Raw samples. `timestamp_ms` is the **bridge's capture time** (§6.3) — the
188
+ * Raw samples. `timestamp_ms` is the **bridge's capture time** — the
193
189
  * same instant the live value carried, so a recorded point and a live one can
194
190
  * be placed on one axis without apology.
195
191
  *
@@ -217,9 +213,8 @@ type HistorySamplesResponse = z.infer<typeof historySamplesResponse>;
217
213
  * inspection.
218
214
  *
219
215
  * `sample_count` exists because an empty bucket and a bucket whose average is
220
- * zero are different facts. W5 established at some cost what happens when two
221
- * facts share one representation, and a chart is the easiest place in this
222
- * product to draw a gap as a line.
216
+ * zero are different facts. When two facts share one representation, a chart
217
+ * is the easiest place to draw a gap as a line.
223
218
  */
224
219
  declare const historyBucketsResponse: z.ZodObject<{
225
220
  slug: z.ZodString;
@@ -238,6 +233,7 @@ declare const historyBucketsResponse: z.ZodObject<{
238
233
  }, z.core.$strip>;
239
234
  type HistoryBucketsResponse = z.infer<typeof historyBucketsResponse>;
240
235
 
236
+
241
237
  /**
242
238
  * One datapoint sample pushed to a subscriber. The current value arrives
243
239
  * immediately on subscribe, then every change. `timestamp_ms` semantics as
@@ -252,8 +248,9 @@ declare const datapointEvent: z.ZodObject<{
252
248
  }, z.core.$strip>;
253
249
  type DatapointEvent = z.infer<typeof datapointEvent>;
254
250
 
251
+
255
252
  /**
256
- * Access plus refresh (spec §3.4). The access token is short-lived; the
253
+ * Access plus refresh. The access token is short-lived; the
257
254
  * refresh token rotates on every use, so a stolen one is detectable when the
258
255
  * original is presented again.
259
256
  *
@@ -267,10 +264,11 @@ declare const sessionTokens: z.ZodObject<{
267
264
  }, z.core.$strip>;
268
265
  type SessionTokens = z.infer<typeof sessionTokens>;
269
266
 
267
+
270
268
  /**
271
269
  * **Why a federated sign-in ended without a session, in a code the app can
272
270
  * branch on** — carried back to the app's own `redirect_uri` as `error`, not
273
- * rendered by Fleetless (D2). The only Fleetless-rendered page in this flow is
271
+ * rendered by Fleetless. The only Fleetless-rendered page in this flow is
274
272
  * the one for a state that can no longer be resolved to a redirect URI, because
275
273
  * then there is nowhere to send the answer.
276
274
  *
@@ -319,7 +317,7 @@ declare const clientOidcErrorCode: z.ZodEnum<{
319
317
  type ClientOidcErrorCode = z.infer<typeof clientOidcErrorCode>;
320
318
  /**
321
319
  * **A pending MCP authorization, as the app's own consent screen reads it**
322
- * (D7). Fleetless renders no page here either: `authorize` redirects to the
320
+ * Fleetless renders no page here either: `authorize` redirects to the
323
321
  * app's `mcp_login_url` with an interaction id, the app authenticates the user
324
322
  * with its normal UI, shows this, and approves or denies through the API.
325
323
  *
@@ -394,7 +392,7 @@ type McpConsentGrant = z.infer<typeof mcpConsentGrant>;
394
392
  * quietest way for a cut like this to go wrong.
395
393
  *
396
394
  * **`act` is gone.** It named the org admin behind an impersonation (the RFC
397
- * 8693 pattern). Impersonation is deleted with no successor (D1), so a field
395
+ * 8693 pattern). Impersonation is deleted with no successor, so a field
398
396
  * that could still arrive would describe a delegation nothing can mint — and a
399
397
  * client rendering "you are acting as …" from it would be showing a state the
400
398
  * platform cannot enter.
@@ -414,6 +412,7 @@ declare const clientIdentity: z.ZodObject<{
414
412
  }, z.core.$strip>;
415
413
  type ClientIdentity = z.infer<typeof clientIdentity>;
416
414
 
415
+
417
416
  declare const asset: z.ZodObject<{
418
417
  id: z.ZodUUID;
419
418
  robot_id: z.ZodUUID;
@@ -436,23 +435,18 @@ type Asset = z.infer<typeof asset>;
436
435
  *
437
436
  * `missing` carries **the reference, verbatim, that no asset answers** — for
438
437
  * a `package://` mesh the URI the bridge could not resolve in the workspace,
439
- * and since W7's security fix also the absolute paths and bare relative paths
440
- * a URDF may carry, which the extractor sees and the sync deliberately never
441
- * offers. The sentence used to say "the `package://` URIs" and the field
442
- * carried three kinds of string (Momus-W7); it is widened here rather than
443
- * narrowed, because a developer whose URDF names `/opt/meshes/arm.stl` is
444
- * entitled to be told that nothing will ever fetch it.
438
+ * and also the absolute paths and bare relative paths a URDF may carry, which
439
+ * the extractor sees and the sync deliberately never offers. A developer whose
440
+ * URDF names `/opt/meshes/arm.stl` is entitled to be told that nothing will
441
+ * ever fetch it.
445
442
  *
446
- * The spec's example is "2 Meshes fehlen" and that number alone is a dead
447
- * end: it tells a developer to go looking through a workspace by hand. The
448
- * references are what they can act on, so the references travel.
443
+ * A bare count of what is missing is a dead end: it tells a developer to go
444
+ * looking through a workspace by hand. The references are what they can act
445
+ * on, so the references travel.
449
446
  *
450
- * **Every entry must be actionable, and that is a constraint on the
451
- * producers, not on this field (W7a).** An entry a developer cannot make
452
- * disappear by fixing what it names is a defect in whoever put it there: for
453
- * a whole wave `<texture>` references were listed here and no sync would ever
454
- * offer them, so the honest instruction behind the list was "fix this, it
455
- * will not help".
447
+ * **Every entry must be actionable, and that is a constraint on the producers,
448
+ * not on this field.** An entry a developer cannot make disappear by fixing
449
+ * what it names is a defect in whoever put it there.
456
450
  */
457
451
  declare const urdfCompleteness: z.ZodObject<{
458
452
  present: z.ZodBoolean;
@@ -552,8 +546,9 @@ declare const assetListResponse: z.ZodObject<{
552
546
  }, z.core.$strip>;
553
547
  type AssetListResponse = z.infer<typeof assetListResponse>;
554
548
 
549
+
555
550
  /**
556
- * One violated §4.4 rule. `details` on the envelope stays `unknown` — codes
551
+ * One violated parameter rule. `details` on the envelope stays `unknown` — codes
557
552
  * are an open set, so their payloads cannot all be enumerated — but the
558
553
  * payload of `parameter_invalid` **is** pinned here, because otherwise every
559
554
  * consumer guesses: the cloud emits one shape, the SDK sniffs for two, the
@@ -586,7 +581,7 @@ declare const parameterInvalidDetails: z.ZodObject<{
586
581
  }, z.core.$strip>;
587
582
  type ParameterInvalidDetails = z.infer<typeof parameterInvalidDetails>;
588
583
  /**
589
- * The codes in use as of W2. The wire deliberately allows any string — this
584
+ * The codes in use today. The wire deliberately allows any string — this
590
585
  * list is the shared vocabulary, not a closed set, so a new refusal never
591
586
  * needs a contracts release before it can be reported honestly.
592
587
  */
@@ -1143,8 +1138,8 @@ interface AssetsApi {
1143
1138
  * in sync.
1144
1139
  *
1145
1140
  * **`urdf-loader` resolves `package://` itself, before any of this runs —
1146
- * a second resolution stage this method has to account for, measured in a
1147
- * real browser rather than read off the source.** `URDFLoader.parse()`'s own `resolvePath()`
1141
+ * a second resolution stage this method has to account for.**
1142
+ * `URDFLoader.parse()`'s own `resolvePath()`
1148
1143
  * rewrites `package://pkg/rel` using `this.packages` (default `''`) to
1149
1144
  * `/pkg/rel` — a root-relative URL — and *that* is what reaches
1150
1145
  * `loadMeshCb`/`ColladaLoader`/`manager.resolveURL()`, not the original
@@ -1361,8 +1356,8 @@ interface McpInteractionDecision {
1361
1356
  redirectTo: string;
1362
1357
  }
1363
1358
  /**
1364
- * Who the caller is, reachable as `client.auth` — the whole client auth API of
1365
- * spec §4, as JSON.
1359
+ * Who the caller is, reachable as `client.auth` — the whole client
1360
+ * authentication API, as JSON.
1366
1361
  *
1367
1362
  * **Fleetless serves an app user no page.** The developer's own UI owns every
1368
1363
  * screen: login, registration, verification, invitation acceptance, password
@@ -1933,8 +1928,8 @@ interface PublishersApi {
1933
1928
  * mean the SDK protects a caller who stops calling `publish` on purpose
1934
1929
  * without stopping cleanly (e.g. no repeated call at a safe rate): the
1935
1930
  * safety pattern for *how often* and *when* to publish belongs in the
1936
- * app, not here. See the README's "No teleop helpers" section before
1937
- * building a publisher-driven control loop.
1931
+ * app, not here. See the README's "Publishers, and no teleop helpers"
1932
+ * section before building a publisher-driven control loop.
1938
1933
  *
1939
1934
  * Rejects `publisher_busy` while a different user is publishing and has
1940
1935
  * not been quiet for its configured quiet timeout yet — whoever publishes
package/dist/index.d.ts CHANGED
@@ -1,16 +1,18 @@
1
+ // SPDX-License-Identifier: MIT
1
2
  import { z } from 'zod';
2
3
 
4
+
3
5
  /**
4
- * Jobs (spec §6.1, §11.3): one running unit of work on a robot — an action
6
+ * Jobs: one running unit of work on a robot — an action
5
7
  * goal or a service call — with an id both sides know, so bridge and cloud
6
8
  * stay in sync across a disconnect.
7
9
  *
8
10
  * Two rules shape everything here:
9
11
  *
10
- * 1. **State is observed by slug, not by id.** The id is informative (§11.3);
11
- * a client watches `robot × slug` and sees whatever job is running there,
12
- * which is also why every observer of a slug sees the same job.
13
- * 2. **`lost` is a real outcome and must be said out loud** (§6.1). Job state
12
+ * 1. **State is observed by slug, not by id.** The id is informative; a client
13
+ * watches `robot × slug` and sees whatever job is running there, which is
14
+ * also why every observer of a slug sees the same job.
15
+ * 2. **`lost` is a real outcome and must be said out loud.** Job state
14
16
  * lives only in the bridge's memory; if it restarts mid-job, the results
15
17
  * are gone. The cloud then marks the job `lost` — never leaves it reading
16
18
  * "running" because nobody contradicted it. A system that reports a
@@ -50,8 +52,8 @@ type Job = z.infer<typeof job>;
50
52
  /**
51
53
  * One update about a job, pushed to subscribers of its slug.
52
54
  *
53
- * `timestamp_ms` is the bridge's capture time, exactly as for a datapoint
54
- * (§6.3 says action feedback carries it too) — so a client computes the age
55
+ * `timestamp_ms` is the bridge's capture time, exactly as for a datapoint —
56
+ * action feedback carries it too — so a client computes the age
55
57
  * of a progress report the same way it computes the age of a sensor value,
56
58
  * and a burst of late-delivered feedback after a reconnect is visibly late
57
59
  * rather than looking current.
@@ -87,9 +89,8 @@ declare const jobEvent: z.ZodObject<{
87
89
  }, z.core.$strip>;
88
90
  type JobEvent = z.infer<typeof jobEvent>;
89
91
  /**
90
- * What a busy refusal tells the caller (spec §11.3: "inkl. Information, was
91
- * läuft"). A refusal that only says "busy" forces the caller to guess whether
92
- * to wait or to give up.
92
+ * What a busy refusal tells the caller: what is already running. A refusal that
93
+ * only says "busy" forces the caller to guess whether to wait or to give up.
93
94
  */
94
95
  declare const busyDetails: z.ZodObject<{
95
96
  running: z.ZodObject<{
@@ -118,7 +119,7 @@ type BusyDetails = z.infer<typeof busyDetails>;
118
119
 
119
120
  /**
120
121
  * The REST read of one datapoint. For bridge-captured data `timestamp_ms`
121
- * is the capture time at the bridge (spec §6.3); for the cloud-observed
122
+ * is the capture time at the bridge; for the cloud-observed
122
123
  * built-in `bridge_state` it is the time the cloud observed the state.
123
124
  */
124
125
  declare const datapointValue: z.ZodObject<{
@@ -129,20 +130,18 @@ declare const datapointValue: z.ZodObject<{
129
130
  type DatapointValue = z.infer<typeof datapointValue>;
130
131
  /**
131
132
  * Every job the platform currently believes this robot has — `GET
132
- * /api/robots/:id/jobs` (W6b).
133
+ * /api/robots/:id/jobs`.
133
134
  *
134
135
  * `jobResponse` answers "what is on this slug", which requires knowing the
135
- * slug first. That was enough while a job could only exist on a slug the
136
- * published configuration named. W6b breaks that assumption twice: a
137
- * reconnecting bridge can name a job the cloud has **no row for** and the
138
- * cloud adopts it, and a configuration change can leave a job on a slug the
139
- * document no longer contains. Both are jobs nobody can ask about, because
140
- * asking requires already knowing what to ask for.
136
+ * slug first. Two kinds of job break that assumption: a reconnecting bridge
137
+ * can name a job the cloud has **no row for**, and the cloud adopts it; and a
138
+ * configuration change can leave a job on a slug the document no longer
139
+ * contains. Both are jobs nobody can ask about, because asking requires
140
+ * already knowing what to ask for.
141
141
  *
142
- * So this route exists to answer the question the per-slug route cannot: not
143
- * "is something running here", but "what is this robot doing". A restarted
144
- * cloud that has just reconciled a robot's `hello.active_jobs` has exactly
145
- * this list and, until now, no way to say it out loud.
142
+ * So this route answers the question the per-slug route cannot: not "is
143
+ * something running here", but "what is this robot doing". A cloud that has
144
+ * just reconciled a robot's `hello.active_jobs` has exactly this list.
146
145
  *
147
146
  * The array is ordered newest first and is **never null**: a robot doing
148
147
  * nothing answers `{ jobs: [] }`. "Nothing is running" and "we did not look"
@@ -150,14 +149,11 @@ type DatapointValue = z.infer<typeof datapointValue>;
150
149
  * distinction `robotDeletionSummary` was made all-required for.
151
150
  *
152
151
  * **At most one entry per slug: the current job there, exactly what
153
- * `jobResponse` would answer for that slug.** This is not a history endpoint
154
- * and must not become one. The first implementation returned every job the
155
- * registry still held — six rows and four complete Fibonacci results after a
156
- * few minutes of gate traffic, and unbounded in both count and payload for a
157
- * robot that has been working all day. The list would have grown until a
158
- * console page carried a robot's entire past, and the one thing it exists to
159
- * answer — *what is this robot doing* — would have been the first line of a
160
- * scroll.
152
+ * `jobResponse` would answer for that slug.** This is not a history endpoint.
153
+ * Returning every job a registry still holds is unbounded in both count and
154
+ * payload for a robot that has been working all day, and the one thing this
155
+ * route exists to answer — *what is this robot doing* — would be the first
156
+ * line of a scroll. The durable history has its own routes.
161
157
  *
162
158
  * A settled job stays visible as its slug's current entry until something
163
159
  * else runs there, which is what makes a job that just failed still findable.
@@ -165,7 +161,7 @@ type DatapointValue = z.infer<typeof datapointValue>;
165
161
  * `jobResponse`.
166
162
  */
167
163
  /**
168
- * What a `rate_limited` refusal tells the caller (W6c).
164
+ * What a `rate_limited` refusal tells the caller.
169
165
  *
170
166
  * One number, and it is the only one that matters: **when to come back.** A
171
167
  * limit that says "too many" without saying "in 800 ms" produces a client that
@@ -189,7 +185,7 @@ declare const cameraDescriptor: z.ZodObject<{
189
185
  }, z.core.$strip>;
190
186
  type CameraDescriptor = z.infer<typeof cameraDescriptor>;
191
187
  /**
192
- * Raw samples. `timestamp_ms` is the **bridge's capture time** (§6.3) — the
188
+ * Raw samples. `timestamp_ms` is the **bridge's capture time** — the
193
189
  * same instant the live value carried, so a recorded point and a live one can
194
190
  * be placed on one axis without apology.
195
191
  *
@@ -217,9 +213,8 @@ type HistorySamplesResponse = z.infer<typeof historySamplesResponse>;
217
213
  * inspection.
218
214
  *
219
215
  * `sample_count` exists because an empty bucket and a bucket whose average is
220
- * zero are different facts. W5 established at some cost what happens when two
221
- * facts share one representation, and a chart is the easiest place in this
222
- * product to draw a gap as a line.
216
+ * zero are different facts. When two facts share one representation, a chart
217
+ * is the easiest place to draw a gap as a line.
223
218
  */
224
219
  declare const historyBucketsResponse: z.ZodObject<{
225
220
  slug: z.ZodString;
@@ -238,6 +233,7 @@ declare const historyBucketsResponse: z.ZodObject<{
238
233
  }, z.core.$strip>;
239
234
  type HistoryBucketsResponse = z.infer<typeof historyBucketsResponse>;
240
235
 
236
+
241
237
  /**
242
238
  * One datapoint sample pushed to a subscriber. The current value arrives
243
239
  * immediately on subscribe, then every change. `timestamp_ms` semantics as
@@ -252,8 +248,9 @@ declare const datapointEvent: z.ZodObject<{
252
248
  }, z.core.$strip>;
253
249
  type DatapointEvent = z.infer<typeof datapointEvent>;
254
250
 
251
+
255
252
  /**
256
- * Access plus refresh (spec §3.4). The access token is short-lived; the
253
+ * Access plus refresh. The access token is short-lived; the
257
254
  * refresh token rotates on every use, so a stolen one is detectable when the
258
255
  * original is presented again.
259
256
  *
@@ -267,10 +264,11 @@ declare const sessionTokens: z.ZodObject<{
267
264
  }, z.core.$strip>;
268
265
  type SessionTokens = z.infer<typeof sessionTokens>;
269
266
 
267
+
270
268
  /**
271
269
  * **Why a federated sign-in ended without a session, in a code the app can
272
270
  * branch on** — carried back to the app's own `redirect_uri` as `error`, not
273
- * rendered by Fleetless (D2). The only Fleetless-rendered page in this flow is
271
+ * rendered by Fleetless. The only Fleetless-rendered page in this flow is
274
272
  * the one for a state that can no longer be resolved to a redirect URI, because
275
273
  * then there is nowhere to send the answer.
276
274
  *
@@ -319,7 +317,7 @@ declare const clientOidcErrorCode: z.ZodEnum<{
319
317
  type ClientOidcErrorCode = z.infer<typeof clientOidcErrorCode>;
320
318
  /**
321
319
  * **A pending MCP authorization, as the app's own consent screen reads it**
322
- * (D7). Fleetless renders no page here either: `authorize` redirects to the
320
+ * Fleetless renders no page here either: `authorize` redirects to the
323
321
  * app's `mcp_login_url` with an interaction id, the app authenticates the user
324
322
  * with its normal UI, shows this, and approves or denies through the API.
325
323
  *
@@ -394,7 +392,7 @@ type McpConsentGrant = z.infer<typeof mcpConsentGrant>;
394
392
  * quietest way for a cut like this to go wrong.
395
393
  *
396
394
  * **`act` is gone.** It named the org admin behind an impersonation (the RFC
397
- * 8693 pattern). Impersonation is deleted with no successor (D1), so a field
395
+ * 8693 pattern). Impersonation is deleted with no successor, so a field
398
396
  * that could still arrive would describe a delegation nothing can mint — and a
399
397
  * client rendering "you are acting as …" from it would be showing a state the
400
398
  * platform cannot enter.
@@ -414,6 +412,7 @@ declare const clientIdentity: z.ZodObject<{
414
412
  }, z.core.$strip>;
415
413
  type ClientIdentity = z.infer<typeof clientIdentity>;
416
414
 
415
+
417
416
  declare const asset: z.ZodObject<{
418
417
  id: z.ZodUUID;
419
418
  robot_id: z.ZodUUID;
@@ -436,23 +435,18 @@ type Asset = z.infer<typeof asset>;
436
435
  *
437
436
  * `missing` carries **the reference, verbatim, that no asset answers** — for
438
437
  * a `package://` mesh the URI the bridge could not resolve in the workspace,
439
- * and since W7's security fix also the absolute paths and bare relative paths
440
- * a URDF may carry, which the extractor sees and the sync deliberately never
441
- * offers. The sentence used to say "the `package://` URIs" and the field
442
- * carried three kinds of string (Momus-W7); it is widened here rather than
443
- * narrowed, because a developer whose URDF names `/opt/meshes/arm.stl` is
444
- * entitled to be told that nothing will ever fetch it.
438
+ * and also the absolute paths and bare relative paths a URDF may carry, which
439
+ * the extractor sees and the sync deliberately never offers. A developer whose
440
+ * URDF names `/opt/meshes/arm.stl` is entitled to be told that nothing will
441
+ * ever fetch it.
445
442
  *
446
- * The spec's example is "2 Meshes fehlen" and that number alone is a dead
447
- * end: it tells a developer to go looking through a workspace by hand. The
448
- * references are what they can act on, so the references travel.
443
+ * A bare count of what is missing is a dead end: it tells a developer to go
444
+ * looking through a workspace by hand. The references are what they can act
445
+ * on, so the references travel.
449
446
  *
450
- * **Every entry must be actionable, and that is a constraint on the
451
- * producers, not on this field (W7a).** An entry a developer cannot make
452
- * disappear by fixing what it names is a defect in whoever put it there: for
453
- * a whole wave `<texture>` references were listed here and no sync would ever
454
- * offer them, so the honest instruction behind the list was "fix this, it
455
- * will not help".
447
+ * **Every entry must be actionable, and that is a constraint on the producers,
448
+ * not on this field.** An entry a developer cannot make disappear by fixing
449
+ * what it names is a defect in whoever put it there.
456
450
  */
457
451
  declare const urdfCompleteness: z.ZodObject<{
458
452
  present: z.ZodBoolean;
@@ -552,8 +546,9 @@ declare const assetListResponse: z.ZodObject<{
552
546
  }, z.core.$strip>;
553
547
  type AssetListResponse = z.infer<typeof assetListResponse>;
554
548
 
549
+
555
550
  /**
556
- * One violated §4.4 rule. `details` on the envelope stays `unknown` — codes
551
+ * One violated parameter rule. `details` on the envelope stays `unknown` — codes
557
552
  * are an open set, so their payloads cannot all be enumerated — but the
558
553
  * payload of `parameter_invalid` **is** pinned here, because otherwise every
559
554
  * consumer guesses: the cloud emits one shape, the SDK sniffs for two, the
@@ -586,7 +581,7 @@ declare const parameterInvalidDetails: z.ZodObject<{
586
581
  }, z.core.$strip>;
587
582
  type ParameterInvalidDetails = z.infer<typeof parameterInvalidDetails>;
588
583
  /**
589
- * The codes in use as of W2. The wire deliberately allows any string — this
584
+ * The codes in use today. The wire deliberately allows any string — this
590
585
  * list is the shared vocabulary, not a closed set, so a new refusal never
591
586
  * needs a contracts release before it can be reported honestly.
592
587
  */
@@ -1143,8 +1138,8 @@ interface AssetsApi {
1143
1138
  * in sync.
1144
1139
  *
1145
1140
  * **`urdf-loader` resolves `package://` itself, before any of this runs —
1146
- * a second resolution stage this method has to account for, measured in a
1147
- * real browser rather than read off the source.** `URDFLoader.parse()`'s own `resolvePath()`
1141
+ * a second resolution stage this method has to account for.**
1142
+ * `URDFLoader.parse()`'s own `resolvePath()`
1148
1143
  * rewrites `package://pkg/rel` using `this.packages` (default `''`) to
1149
1144
  * `/pkg/rel` — a root-relative URL — and *that* is what reaches
1150
1145
  * `loadMeshCb`/`ColladaLoader`/`manager.resolveURL()`, not the original
@@ -1361,8 +1356,8 @@ interface McpInteractionDecision {
1361
1356
  redirectTo: string;
1362
1357
  }
1363
1358
  /**
1364
- * Who the caller is, reachable as `client.auth` — the whole client auth API of
1365
- * spec §4, as JSON.
1359
+ * Who the caller is, reachable as `client.auth` — the whole client
1360
+ * authentication API, as JSON.
1366
1361
  *
1367
1362
  * **Fleetless serves an app user no page.** The developer's own UI owns every
1368
1363
  * screen: login, registration, verification, invitation acceptance, password
@@ -1933,8 +1928,8 @@ interface PublishersApi {
1933
1928
  * mean the SDK protects a caller who stops calling `publish` on purpose
1934
1929
  * without stopping cleanly (e.g. no repeated call at a safe rate): the
1935
1930
  * safety pattern for *how often* and *when* to publish belongs in the
1936
- * app, not here. See the README's "No teleop helpers" section before
1937
- * building a publisher-driven control loop.
1931
+ * app, not here. See the README's "Publishers, and no teleop helpers"
1932
+ * section before building a publisher-driven control loop.
1938
1933
  *
1939
1934
  * Rejects `publisher_busy` while a different user is publishing and has
1940
1935
  * not been quiet for its configured quiet timeout yet — whoever publishes