@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/CHANGELOG.md +60 -0
- package/CODE_OF_CONDUCT.md +83 -0
- package/CONTRIBUTING.md +130 -0
- package/README.md +102 -4
- package/SECURITY.md +100 -0
- package/dist/index.cjs +374 -499
- package/dist/index.d.cts +63 -62
- package/dist/index.d.ts +63 -62
- package/dist/index.js +374 -499
- package/package.json +13 -5
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
|
|
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
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* 2. **`lost` is a real outcome and must be said out loud
|
|
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
|
-
*
|
|
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
|
|
91
|
-
*
|
|
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
|
|
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
|
|
134
|
+
* /api/robots/:id/jobs`.
|
|
133
135
|
*
|
|
134
136
|
* `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.
|
|
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
|
|
143
|
-
*
|
|
144
|
-
*
|
|
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
|
-
*
|
|
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.
|
|
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
|
|
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**
|
|
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.
|
|
221
|
-
*
|
|
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
|
|
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
|
|
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
|
-
*
|
|
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
|
|
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
|
|
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.
|
|
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
|
-
*
|
|
447
|
-
*
|
|
448
|
-
*
|
|
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
|
-
*
|
|
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".
|
|
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
|
|
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
|
|
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
|
|
1147
|
-
*
|
|
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
|
|
1365
|
-
*
|
|
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 "
|
|
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
|
|
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
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* 2. **`lost` is a real outcome and must be said out loud
|
|
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
|
-
*
|
|
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
|
|
91
|
-
*
|
|
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
|
|
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
|
|
134
|
+
* /api/robots/:id/jobs`.
|
|
133
135
|
*
|
|
134
136
|
* `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.
|
|
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
|
|
143
|
-
*
|
|
144
|
-
*
|
|
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
|
-
*
|
|
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.
|
|
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
|
|
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**
|
|
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.
|
|
221
|
-
*
|
|
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
|
|
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
|
|
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
|
-
*
|
|
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
|
|
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
|
|
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.
|
|
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
|
-
*
|
|
447
|
-
*
|
|
448
|
-
*
|
|
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
|
-
*
|
|
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".
|
|
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
|
|
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
|
|
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
|
|
1147
|
-
*
|
|
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
|
|
1365
|
-
*
|
|
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 "
|
|
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
|