@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/CHANGELOG.md +143 -0
- package/CODE_OF_CONDUCT.md +83 -0
- package/CONTRIBUTING.md +131 -0
- package/README.md +130 -6
- package/RELEASING.md +195 -0
- package/SECURITY.md +100 -0
- package/dist/index.cjs +376 -501
- package/dist/index.d.cts +57 -62
- package/dist/index.d.ts +57 -62
- package/dist/index.js +376 -501
- package/package.json +11 -6
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
|
|
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
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* 2. **`lost` is a real outcome and must be said out loud
|
|
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
|
-
*
|
|
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
|
|
91
|
-
*
|
|
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
|
|
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
|
|
133
|
+
* /api/robots/:id/jobs`.
|
|
133
134
|
*
|
|
134
135
|
* `jobResponse` answers "what is on this slug", which requires knowing the
|
|
135
|
-
* slug first.
|
|
136
|
-
*
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
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
|
|
143
|
-
*
|
|
144
|
-
*
|
|
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
|
-
*
|
|
155
|
-
*
|
|
156
|
-
*
|
|
157
|
-
*
|
|
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
|
|
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**
|
|
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.
|
|
221
|
-
*
|
|
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
|
|
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
|
|
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
|
-
*
|
|
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
|
|
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
|
|
440
|
-
*
|
|
441
|
-
*
|
|
442
|
-
*
|
|
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
|
-
*
|
|
447
|
-
*
|
|
448
|
-
*
|
|
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
|
-
*
|
|
452
|
-
*
|
|
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
|
|
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
|
|
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
|
|
1147
|
-
*
|
|
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
|
|
1365
|
-
*
|
|
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 "
|
|
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
|
|
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
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* 2. **`lost` is a real outcome and must be said out loud
|
|
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
|
-
*
|
|
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
|
|
91
|
-
*
|
|
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
|
|
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
|
|
133
|
+
* /api/robots/:id/jobs`.
|
|
133
134
|
*
|
|
134
135
|
* `jobResponse` answers "what is on this slug", which requires knowing the
|
|
135
|
-
* slug first.
|
|
136
|
-
*
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
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
|
|
143
|
-
*
|
|
144
|
-
*
|
|
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
|
-
*
|
|
155
|
-
*
|
|
156
|
-
*
|
|
157
|
-
*
|
|
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
|
|
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**
|
|
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.
|
|
221
|
-
*
|
|
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
|
|
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
|
|
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
|
-
*
|
|
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
|
|
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
|
|
440
|
-
*
|
|
441
|
-
*
|
|
442
|
-
*
|
|
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
|
-
*
|
|
447
|
-
*
|
|
448
|
-
*
|
|
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
|
-
*
|
|
452
|
-
*
|
|
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
|
|
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
|
|
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
|
|
1147
|
-
*
|
|
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
|
|
1365
|
-
*
|
|
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 "
|
|
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
|