@fleetless/sdk 3.0.0 → 3.0.1

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