@fleetless/contracts 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (287) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +17 -0
  4. package/README.md +88 -0
  5. package/artifacts/constants.json +24 -0
  6. package/artifacts/openapi.json +17219 -0
  7. package/artifacts/routes.json +4605 -0
  8. package/artifacts/schema/accept-team-invite-request.schema.json +22 -0
  9. package/artifacts/schema/action-config.schema.json +198 -0
  10. package/artifacts/schema/alert-list-response.schema.json +172 -0
  11. package/artifacts/schema/api-error.schema.json +20 -0
  12. package/artifacts/schema/app-auth-config.schema.json +106 -0
  13. package/artifacts/schema/app-invitation-list-response.schema.json +57 -0
  14. package/artifacts/schema/app-invitation.schema.json +69 -0
  15. package/artifacts/schema/app-list-response.schema.json +82 -0
  16. package/artifacts/schema/app-mail-template-list-response.schema.json +68 -0
  17. package/artifacts/schema/app-mail-template.schema.json +54 -0
  18. package/artifacts/schema/app-oidc-provider-list-response.schema.json +93 -0
  19. package/artifacts/schema/app-oidc-provider.schema.json +80 -0
  20. package/artifacts/schema/app-user-list-response.schema.json +111 -0
  21. package/artifacts/schema/app-user.schema.json +98 -0
  22. package/artifacts/schema/app.schema.json +69 -0
  23. package/artifacts/schema/apply-error.schema.json +41 -0
  24. package/artifacts/schema/asset-list-response.schema.json +288 -0
  25. package/artifacts/schema/asset-sync-request.schema.json +17 -0
  26. package/artifacts/schema/asset-sync-response.schema.json +16 -0
  27. package/artifacts/schema/asset-sync-status.schema.json +136 -0
  28. package/artifacts/schema/asset.schema.json +68 -0
  29. package/artifacts/schema/audit-actor.schema.json +32 -0
  30. package/artifacts/schema/audit-event.schema.json +119 -0
  31. package/artifacts/schema/audit-list-response.schema.json +144 -0
  32. package/artifacts/schema/audit-query.schema.json +79 -0
  33. package/artifacts/schema/auth-error.schema.json +23 -0
  34. package/artifacts/schema/auth-me-response.schema.json +99 -0
  35. package/artifacts/schema/auth-ok.schema.json +115 -0
  36. package/artifacts/schema/authorization-server-metadata.schema.json +80 -0
  37. package/artifacts/schema/bridge-asset-progress.schema.json +99 -0
  38. package/artifacts/schema/bridge-assets-available.schema.json +25 -0
  39. package/artifacts/schema/bridge-camera-state.schema.json +78 -0
  40. package/artifacts/schema/bridge-config-applied.schema.json +67 -0
  41. package/artifacts/schema/bridge-hello.schema.json +65 -0
  42. package/artifacts/schema/bridge-introspect.schema.json +114 -0
  43. package/artifacts/schema/bridge-job-lost.schema.json +22 -0
  44. package/artifacts/schema/bridge-job-update.schema.json +100 -0
  45. package/artifacts/schema/bridge-pong.schema.json +19 -0
  46. package/artifacts/schema/bridge-pressure.schema.json +292 -0
  47. package/artifacts/schema/bridge-state.schema.json +24 -0
  48. package/artifacts/schema/bridge-type-definitions.schema.json +169 -0
  49. package/artifacts/schema/busy-details.schema.json +115 -0
  50. package/artifacts/schema/camera-descriptor.schema.json +45 -0
  51. package/artifacts/schema/camera-list-response.schema.json +58 -0
  52. package/artifacts/schema/camera-source.schema.json +240 -0
  53. package/artifacts/schema/cancel-request.schema.json +20 -0
  54. package/artifacts/schema/client-accept-invitation-request.schema.json +35 -0
  55. package/artifacts/schema/client-auth.schema.json +18 -0
  56. package/artifacts/schema/client-cancel.schema.json +45 -0
  57. package/artifacts/schema/client-identity.schema.json +103 -0
  58. package/artifacts/schema/client-invoke.schema.json +45 -0
  59. package/artifacts/schema/client-login-request.schema.json +29 -0
  60. package/artifacts/schema/client-logout-request.schema.json +14 -0
  61. package/artifacts/schema/client-mcp-interaction-decision-response.schema.json +15 -0
  62. package/artifacts/schema/client-mcp-interaction.schema.json +59 -0
  63. package/artifacts/schema/client-oidc-callback-query.schema.json +28 -0
  64. package/artifacts/schema/client-oidc-exchange-request.schema.json +21 -0
  65. package/artifacts/schema/client-oidc-start-query.schema.json +36 -0
  66. package/artifacts/schema/client-password-reset-confirm-request.schema.json +22 -0
  67. package/artifacts/schema/client-password-reset-request.schema.json +24 -0
  68. package/artifacts/schema/client-provider-list-query.schema.json +17 -0
  69. package/artifacts/schema/client-provider-list-response.schema.json +34 -0
  70. package/artifacts/schema/client-publish.schema.json +40 -0
  71. package/artifacts/schema/client-refresh-request.schema.json +14 -0
  72. package/artifacts/schema/client-register-request.schema.json +44 -0
  73. package/artifacts/schema/client-resend-verification-request.schema.json +24 -0
  74. package/artifacts/schema/client-subscribe.schema.json +43 -0
  75. package/artifacts/schema/client-unsubscribe.schema.json +26 -0
  76. package/artifacts/schema/client-verify-email-request.schema.json +15 -0
  77. package/artifacts/schema/cloud-asset-request.schema.json +37 -0
  78. package/artifacts/schema/cloud-camera-start.schema.json +41 -0
  79. package/artifacts/schema/cloud-camera-stop.schema.json +26 -0
  80. package/artifacts/schema/cloud-cancel.schema.json +33 -0
  81. package/artifacts/schema/cloud-config.schema.json +1635 -0
  82. package/artifacts/schema/cloud-hello-error.schema.json +23 -0
  83. package/artifacts/schema/cloud-hello-ok.schema.json +19 -0
  84. package/artifacts/schema/cloud-introspect-request.schema.json +19 -0
  85. package/artifacts/schema/cloud-invoke.schema.json +40 -0
  86. package/artifacts/schema/cloud-ping.schema.json +19 -0
  87. package/artifacts/schema/cloud-publish.schema.json +28 -0
  88. package/artifacts/schema/cloud-type-request.schema.json +30 -0
  89. package/artifacts/schema/command-result.schema.json +175 -0
  90. package/artifacts/schema/config-draft-response.schema.json +1695 -0
  91. package/artifacts/schema/config-state.schema.json +124 -0
  92. package/artifacts/schema/config-version-response.schema.json +1641 -0
  93. package/artifacts/schema/config-versions-response.schema.json +33 -0
  94. package/artifacts/schema/create-app-invitation-request.schema.json +40 -0
  95. package/artifacts/schema/create-app-oidc-provider-request.schema.json +70 -0
  96. package/artifacts/schema/create-app-request.schema.json +30 -0
  97. package/artifacts/schema/create-app-user-request.schema.json +42 -0
  98. package/artifacts/schema/create-robot-request.schema.json +14 -0
  99. package/artifacts/schema/create-robot-response.schema.json +44 -0
  100. package/artifacts/schema/create-server-key-response.schema.json +65 -0
  101. package/artifacts/schema/create-team-invite-request.schema.json +43 -0
  102. package/artifacts/schema/datapoint-alert-row.schema.json +160 -0
  103. package/artifacts/schema/datapoint-config.schema.json +366 -0
  104. package/artifacts/schema/datapoint-display.schema.json +31 -0
  105. package/artifacts/schema/datapoint-event.schema.json +34 -0
  106. package/artifacts/schema/datapoint-frame.schema.json +28 -0
  107. package/artifacts/schema/datapoint-list-response.schema.json +61 -0
  108. package/artifacts/schema/datapoint-value.schema.json +28 -0
  109. package/artifacts/schema/developer-login-request.schema.json +19 -0
  110. package/artifacts/schema/dynamic-client-registration-request.schema.json +60 -0
  111. package/artifacts/schema/dynamic-client-registration-response.schema.json +68 -0
  112. package/artifacts/schema/error-frame.schema.json +23 -0
  113. package/artifacts/schema/exposure-counts.schema.json +39 -0
  114. package/artifacts/schema/exposure-list-response.schema.json +43 -0
  115. package/artifacts/schema/fetch-types-request.schema.json +19 -0
  116. package/artifacts/schema/fetch-types-response.schema.json +163 -0
  117. package/artifacts/schema/fleetless-user-list-response.schema.json +73 -0
  118. package/artifacts/schema/fleetless-user.schema.json +60 -0
  119. package/artifacts/schema/history-buckets-response.schema.json +79 -0
  120. package/artifacts/schema/history-query.schema.json +58 -0
  121. package/artifacts/schema/history-response.schema.json +150 -0
  122. package/artifacts/schema/history-samples-response.schema.json +68 -0
  123. package/artifacts/schema/introspection-response.schema.json +118 -0
  124. package/artifacts/schema/invoke-or-service-response.schema.json +141 -0
  125. package/artifacts/schema/invoke-request.schema.json +23 -0
  126. package/artifacts/schema/invoke-response.schema.json +125 -0
  127. package/artifacts/schema/job-actor.schema.json +34 -0
  128. package/artifacts/schema/job-event.schema.json +158 -0
  129. package/artifacts/schema/job-response.schema.json +123 -0
  130. package/artifacts/schema/job-run-list-response.schema.json +222 -0
  131. package/artifacts/schema/job-run-query.schema.json +95 -0
  132. package/artifacts/schema/job-run-summary-query.schema.json +23 -0
  133. package/artifacts/schema/job-run-summary.schema.json +33 -0
  134. package/artifacts/schema/job-run.schema.json +195 -0
  135. package/artifacts/schema/job-state.schema.json +11 -0
  136. package/artifacts/schema/job.schema.json +106 -0
  137. package/artifacts/schema/latency-bucket.schema.json +63 -0
  138. package/artifacts/schema/live-session-response.schema.json +41 -0
  139. package/artifacts/schema/mail-outcome.schema.json +20 -0
  140. package/artifacts/schema/mail-template-preview-request.schema.json +35 -0
  141. package/artifacts/schema/mail-template-preview-response.schema.json +31 -0
  142. package/artifacts/schema/mail-template-problem-details.schema.json +24 -0
  143. package/artifacts/schema/mcp-consent-grant-list-response.schema.json +52 -0
  144. package/artifacts/schema/mcp-consent-grant.schema.json +39 -0
  145. package/artifacts/schema/mcp-robot-datasheet.schema.json +115 -0
  146. package/artifacts/schema/mcp-role-preview-response.schema.json +134 -0
  147. package/artifacts/schema/missing-asset-query.schema.json +11 -0
  148. package/artifacts/schema/oauth-authorize-query.schema.json +47 -0
  149. package/artifacts/schema/oauth-redirect-response.schema.json +15 -0
  150. package/artifacts/schema/oauth-token-request.schema.json +47 -0
  151. package/artifacts/schema/oauth-token-response.schema.json +38 -0
  152. package/artifacts/schema/org-alerts-query.schema.json +15 -0
  153. package/artifacts/schema/org-event-dropped.schema.json +26 -0
  154. package/artifacts/schema/org-event-replay.schema.json +97 -0
  155. package/artifacts/schema/org-event-subscribe.schema.json +14 -0
  156. package/artifacts/schema/org-event-unsubscribe.schema.json +14 -0
  157. package/artifacts/schema/org-event.schema.json +75 -0
  158. package/artifacts/schema/org-firing-alerts-response.schema.json +178 -0
  159. package/artifacts/schema/org-health-query.schema.json +13 -0
  160. package/artifacts/schema/org-latency-query.schema.json +42 -0
  161. package/artifacts/schema/org-latency-response.schema.json +124 -0
  162. package/artifacts/schema/org-quota-usage-counts.schema.json +42 -0
  163. package/artifacts/schema/org-quota-usage.schema.json +102 -0
  164. package/artifacts/schema/org-quotas.schema.json +51 -0
  165. package/artifacts/schema/org-usage-query.schema.json +19 -0
  166. package/artifacts/schema/org-usage-response.schema.json +77 -0
  167. package/artifacts/schema/org.schema.json +30 -0
  168. package/artifacts/schema/parameter-invalid-details.schema.json +37 -0
  169. package/artifacts/schema/parameter-spec.schema.json +120 -0
  170. package/artifacts/schema/parameter-violation.schema.json +24 -0
  171. package/artifacts/schema/password-change-request.schema.json +21 -0
  172. package/artifacts/schema/password-reset-confirm.schema.json +19 -0
  173. package/artifacts/schema/password-reset-request.schema.json +14 -0
  174. package/artifacts/schema/patch-app-oidc-provider-request.schema.json +50 -0
  175. package/artifacts/schema/patch-app-user-request.schema.json +34 -0
  176. package/artifacts/schema/patch-auth-me-request.schema.json +22 -0
  177. package/artifacts/schema/patch-fleetless-user-request.schema.json +20 -0
  178. package/artifacts/schema/patch-org-request.schema.json +15 -0
  179. package/artifacts/schema/patch-org-response.schema.json +40 -0
  180. package/artifacts/schema/patch-robot-request.schema.json +15 -0
  181. package/artifacts/schema/patch-robot-response.schema.json +40 -0
  182. package/artifacts/schema/pending-team-invite-list-response.schema.json +52 -0
  183. package/artifacts/schema/pending-team-invite.schema.json +39 -0
  184. package/artifacts/schema/protected-resource-metadata.schema.json +41 -0
  185. package/artifacts/schema/publish-config-response.schema.json +21 -0
  186. package/artifacts/schema/publish-request.schema.json +17 -0
  187. package/artifacts/schema/publisher-config.schema.json +285 -0
  188. package/artifacts/schema/put-app-auth-config-request.schema.json +93 -0
  189. package/artifacts/schema/put-app-mail-template-request.schema.json +35 -0
  190. package/artifacts/schema/put-config-draft-request.schema.json +13 -0
  191. package/artifacts/schema/put-datapoint-display-request.schema.json +31 -0
  192. package/artifacts/schema/put-robot-details-request.schema.json +41 -0
  193. package/artifacts/schema/put-robot-details-response.schema.json +43 -0
  194. package/artifacts/schema/rate-limit-details.schema.json +15 -0
  195. package/artifacts/schema/refresh-request.schema.json +13 -0
  196. package/artifacts/schema/release-live-query.schema.json +13 -0
  197. package/artifacts/schema/rename-slug-request.schema.json +23 -0
  198. package/artifacts/schema/rename-slug-response.schema.json +24 -0
  199. package/artifacts/schema/resource-health-event.schema.json +72 -0
  200. package/artifacts/schema/resource-health-list-response.schema.json +80 -0
  201. package/artifacts/schema/resource-health-state.schema.json +68 -0
  202. package/artifacts/schema/robot-config-doc.schema.json +1616 -0
  203. package/artifacts/schema/robot-delete-query.schema.json +12 -0
  204. package/artifacts/schema/robot-deletion-summary.schema.json +63 -0
  205. package/artifacts/schema/robot-detail-response.schema.json +262 -0
  206. package/artifacts/schema/robot-details-doc.schema.json +33 -0
  207. package/artifacts/schema/robot-jobs-response.schema.json +119 -0
  208. package/artifacts/schema/robot-latency-series.schema.json +81 -0
  209. package/artifacts/schema/robot-list-item.schema.json +94 -0
  210. package/artifacts/schema/robot-list-response.schema.json +106 -0
  211. package/artifacts/schema/robot.schema.json +30 -0
  212. package/artifacts/schema/role-list-response.schema.json +48 -0
  213. package/artifacts/schema/role-permissions.schema.json +61 -0
  214. package/artifacts/schema/role.schema.json +35 -0
  215. package/artifacts/schema/ros-graph.schema.json +99 -0
  216. package/artifacts/schema/server-key-list-response.schema.json +64 -0
  217. package/artifacts/schema/server-key.schema.json +51 -0
  218. package/artifacts/schema/service-call-response.schema.json +13 -0
  219. package/artifacts/schema/service-config.schema.json +198 -0
  220. package/artifacts/schema/session-tokens.schema.json +28 -0
  221. package/artifacts/schema/sign-up-request.schema.json +26 -0
  222. package/artifacts/schema/sign-up-response.schema.json +127 -0
  223. package/artifacts/schema/slug-usage-response.schema.json +32 -0
  224. package/artifacts/schema/snapshot-header.schema.json +44 -0
  225. package/artifacts/schema/snapshot-meta-response.schema.json +85 -0
  226. package/artifacts/schema/subscribe-error.schema.json +31 -0
  227. package/artifacts/schema/team-invite.schema.json +57 -0
  228. package/artifacts/schema/tier-change-request.schema.json +17 -0
  229. package/artifacts/schema/type-definition.schema.json +144 -0
  230. package/artifacts/schema/types-response.schema.json +156 -0
  231. package/artifacts/schema/update-app-request.schema.json +32 -0
  232. package/artifacts/schema/urdf-completeness.schema.json +50 -0
  233. package/artifacts/schema/validation-issue.schema.json +43 -0
  234. package/artifacts/schema/waitlist-request.schema.json +15 -0
  235. package/artifacts/schema-outgoing/bridge-asset-progress.schema.json +102 -0
  236. package/artifacts/schema-outgoing/bridge-assets-available.schema.json +26 -0
  237. package/artifacts/schema-outgoing/bridge-camera-state.schema.json +80 -0
  238. package/artifacts/schema-outgoing/bridge-config-applied.schema.json +69 -0
  239. package/artifacts/schema-outgoing/bridge-hello.schema.json +68 -0
  240. package/artifacts/schema-outgoing/bridge-introspect.schema.json +119 -0
  241. package/artifacts/schema-outgoing/bridge-job-lost.schema.json +23 -0
  242. package/artifacts/schema-outgoing/bridge-job-update.schema.json +102 -0
  243. package/artifacts/schema-outgoing/bridge-pong.schema.json +20 -0
  244. package/artifacts/schema-outgoing/bridge-type-definitions.schema.json +174 -0
  245. package/artifacts/schema-outgoing/datapoint-frame.schema.json +29 -0
  246. package/artifacts/schema-outgoing/snapshot-header.schema.json +45 -0
  247. package/dist/alerts.d.ts +255 -0
  248. package/dist/alerts.js +193 -0
  249. package/dist/app-users.d.ts +606 -0
  250. package/dist/app-users.js +696 -0
  251. package/dist/apps.d.ts +175 -0
  252. package/dist/apps.js +267 -0
  253. package/dist/assets.d.ts +434 -0
  254. package/dist/assets.js +546 -0
  255. package/dist/audit.d.ts +129 -0
  256. package/dist/audit.js +238 -0
  257. package/dist/client-auth.d.ts +409 -0
  258. package/dist/client-auth.js +487 -0
  259. package/dist/common.d.ts +186 -0
  260. package/dist/common.js +199 -0
  261. package/dist/config-issues.d.ts +175 -0
  262. package/dist/config-issues.js +339 -0
  263. package/dist/config.d.ts +862 -0
  264. package/dist/config.js +1988 -0
  265. package/dist/errors.d.ts +52 -0
  266. package/dist/errors.js +786 -0
  267. package/dist/identity.d.ts +549 -0
  268. package/dist/identity.js +503 -0
  269. package/dist/index.d.ts +51 -0
  270. package/dist/index.js +51 -0
  271. package/dist/introspection.d.ts +99 -0
  272. package/dist/introspection.js +97 -0
  273. package/dist/jobs.d.ts +334 -0
  274. package/dist/jobs.js +345 -0
  275. package/dist/mcp.d.ts +239 -0
  276. package/dist/mcp.js +153 -0
  277. package/dist/oauth.d.ts +344 -0
  278. package/dist/oauth.js +488 -0
  279. package/dist/protocol.d.ts +781 -0
  280. package/dist/protocol.js +715 -0
  281. package/dist/realtime.d.ts +494 -0
  282. package/dist/realtime.js +512 -0
  283. package/dist/rest.d.ts +1989 -0
  284. package/dist/rest.js +1963 -0
  285. package/dist/routes.d.ts +94 -0
  286. package/dist/routes.js +2298 -0
  287. package/package.json +61 -0
@@ -0,0 +1,862 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * What an exposed service *is*, in the developer's own words (§17).
4
+ *
5
+ * This is what `robot_describe` carries verbatim, so it is read by a model
6
+ * that has never seen this robot and cannot ask a follow-up question.
7
+ * `unit` and `range` already say what a number *is*; this says what it
8
+ * *means*.
9
+ *
10
+ * **It lives on the configuration rather than on the app, and that was a
11
+ * decision with a cost.** §17's own wording put the semantic descriptions in
12
+ * the MCP app; André moved them here on 2026-08-18 so that a description is
13
+ * written once per service and true for every app that reaches the robot,
14
+ * beside the other metadata. What is given up is real and should not be
15
+ * rediscovered as a bug: **two apps can no longer describe one service
16
+ * differently for two audiences.** §17 was reworded in the same wave rather
17
+ * than left contradicting this field.
18
+ *
19
+ * **`.optional()` and not `.nullable().default(null)`, deliberately.** The
20
+ * established shape in this file is a default — and every use of it has
21
+ * added an instance to a known contradiction: `.default()` publishes the
22
+ * field as **required** in the generated JSON Schema, because after parsing
23
+ * it is always present. That is recorded four times over in
24
+ * `scripts/export-schemas.ts`, whose fix (`io: 'input'`, applied per schema)
25
+ * is a judgement call across roughly sixty schemas plus a re-vendor and a
26
+ * re-pin in four repos. W7c's playbook said task 0 would do it; reading the
27
+ * measured blast radius — 90 artifacts, 436 deletions for the blanket
28
+ * version — said otherwise, at the start of a wave with five people blocked
29
+ * on this pin. So the field simply does not create a fifth instance:
30
+ * optional is optional in both modes, and *absent* is the single spelling of
31
+ * "not described". `.min(1)` keeps the empty string from becoming a second.
32
+ */
33
+ export declare const serviceDescription: z.ZodOptional<z.ZodString>;
34
+ /**
35
+ * One parameter's prose, for the same reader as `serviceDescription` and
36
+ * under the same rules. Shorter, because it describes one field of one call
37
+ * rather than the call itself.
38
+ */
39
+ export declare const parameterDescription: z.ZodOptional<z.ZodString>;
40
+ /** The ROS 2 primitive field types, spelled as ROS 2 spells them. */
41
+ export declare const parameterType: z.ZodEnum<{
42
+ string: "string";
43
+ bool: "bool";
44
+ byte: "byte";
45
+ char: "char";
46
+ int8: "int8";
47
+ uint8: "uint8";
48
+ int16: "int16";
49
+ uint16: "uint16";
50
+ int32: "int32";
51
+ uint32: "uint32";
52
+ int64: "int64";
53
+ uint64: "uint64";
54
+ float32: "float32";
55
+ float64: "float64";
56
+ wstring: "wstring";
57
+ }>;
58
+ export type ParameterType = z.infer<typeof parameterType>;
59
+ /**
60
+ * One parameter a caller may fill in a message template.
61
+ *
62
+ * `type` is required and **not derived from the template position**, even
63
+ * though introspection usually knows it. The reason is the robot that has
64
+ * never connected: there is nothing to derive there, and that is exactly
65
+ * where the editor has to help most.
66
+ *
67
+ * Which constraints exist depends on the type, and a constraint on the wrong
68
+ * type is refused rather than silently inert. Floats deliberately have no
69
+ * `enum`: equality on floating point is unreliable, so an enumerated float
70
+ * list is a trap that only shows up in operation.
71
+ *
72
+ * **A `default` and every `enum` entry must match `type`**, and that is
73
+ * decided here rather than in the cloud. Its sibling
74
+ * `constraint_not_allowed_for_type` was always here, and leaving one of a
75
+ * pair in zod and the other in the cloud is two policies for one decision.
76
+ * It needs nothing this schema does not have: a value and a declared type.
77
+ * `type_mismatch` — the declared type against the type at the template
78
+ * position — is the one that needs introspection, and it is the cloud's.
79
+ *
80
+ * There is no `required` field. A placeholder cannot be left unfilled, so
81
+ * "required" is exactly "has no `default`" — a second spelling of one fact
82
+ * is the defect this file has spent two waves removing.
83
+ */
84
+ export declare const parameterSpec: z.ZodObject<{
85
+ type: z.ZodEnum<{
86
+ string: "string";
87
+ bool: "bool";
88
+ byte: "byte";
89
+ char: "char";
90
+ int8: "int8";
91
+ uint8: "uint8";
92
+ int16: "int16";
93
+ uint16: "uint16";
94
+ int32: "int32";
95
+ uint32: "uint32";
96
+ int64: "int64";
97
+ uint64: "uint64";
98
+ float32: "float32";
99
+ float64: "float64";
100
+ wstring: "wstring";
101
+ }>;
102
+ default: z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>>;
103
+ min_value: z.ZodOptional<z.ZodNumber>;
104
+ max_value: z.ZodOptional<z.ZodNumber>;
105
+ enum: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
106
+ regex: z.ZodOptional<z.ZodString>;
107
+ description: z.ZodOptional<z.ZodString>;
108
+ }, z.core.$strict>;
109
+ export type ParameterSpec = z.infer<typeof parameterSpec>;
110
+ /** Parameters of one entry, keyed by name. At most 50. */
111
+ export declare const parameterMap: z.ZodRecord<z.ZodString, z.ZodObject<{
112
+ type: z.ZodEnum<{
113
+ string: "string";
114
+ bool: "bool";
115
+ byte: "byte";
116
+ char: "char";
117
+ int8: "int8";
118
+ uint8: "uint8";
119
+ int16: "int16";
120
+ uint16: "uint16";
121
+ int32: "int32";
122
+ uint32: "uint32";
123
+ int64: "int64";
124
+ uint64: "uint64";
125
+ float32: "float32";
126
+ float64: "float64";
127
+ wstring: "wstring";
128
+ }>;
129
+ default: z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>>;
130
+ min_value: z.ZodOptional<z.ZodNumber>;
131
+ max_value: z.ZodOptional<z.ZodNumber>;
132
+ enum: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
133
+ regex: z.ZodOptional<z.ZodString>;
134
+ description: z.ZodOptional<z.ZodString>;
135
+ }, z.core.$strict>>;
136
+ /**
137
+ * Slugs no configured entry may take (spec §4.3), across **all five exposure
138
+ * sections at once** — slugs are one namespace, so a name reserved here is
139
+ * reserved everywhere.
140
+ *
141
+ * The first three are built-ins: the cloud or the bridge already publishes
142
+ * something under them, so a configured entry would be a second producer for
143
+ * one name. `history` is reserved for a different reason and is not a built-in
144
+ * — nothing publishes it. `GET /api/robots/:id/jobs/history` is a **literal
145
+ * sibling** of `GET /api/robots/:id/jobs/:slug`, so an action or service named
146
+ * `history` would have a job route no caller could ever reach. Reserving the
147
+ * name is the honest half of that: the alternative is a slug the format
148
+ * accepts and one route silently cannot address.
149
+ *
150
+ * **This constant is the only list.** The cloud's `validation.ts` builds its
151
+ * set from it and emits `reserved_slug`; `config-store.ts` reads it for the
152
+ * rename target; the console reads it for slug suggestion and repairs. Nothing
153
+ * copies the members. Note that it is NOT the enumeration of built-in
154
+ * datapoints — the cloud keeps that separately, and it must, now that a
155
+ * reserved name exists that no plane serves.
156
+ *
157
+ * **What it does not do: `robotConfigDoc` does not enforce it.** Reservation is
158
+ * a semantic check that belongs with the ones that need the robot's context,
159
+ * and it answers as a `ValidationIssue` carrying the section, the slug and a
160
+ * severity — which a zod issue could not, and which is what the console's
161
+ * repair actions read. The section descriptions below therefore say "refused
162
+ * when the document is validated" rather than "refused here" — the artifact
163
+ * ships those sentences to readers who have only the JSON Schema, and
164
+ * "here" would have promised them a refusal this parse does not make.
165
+ */
166
+ export declare const RESERVED_SLUGS: readonly ["bridge_state", "robot_details", "bridge_pressure", "history"];
167
+ /**
168
+ * When an alert fires and when it is ok again. There is no discriminator:
169
+ * `resolve_at` absent means equality, present means a threshold whose
170
+ * direction follows from the comparison. The gap is the hysteresis, and it
171
+ * is therefore mandatory for thresholds — a value sitting exactly on a
172
+ * threshold with no gap flips on every sample.
173
+ */
174
+ export declare const alertCondition: z.ZodObject<{
175
+ fire_at: z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>;
176
+ resolve_at: z.ZodOptional<z.ZodNumber>;
177
+ }, z.core.$strict>;
178
+ export type AlertCondition = z.infer<typeof alertCondition>;
179
+ /**
180
+ * The four defaults the format names, as constants.
181
+ *
182
+ * **The fields stay `.optional()`, not `.default()`** — that argument is on
183
+ * `serviceDescription` above and has not changed: `.default()` publishes a
184
+ * field as *required* in the generated JSON Schema, and absence is the
185
+ * single spelling of "not set" in this format. What was missing is the
186
+ * number itself. Left only in prose, the cloud and the console each invent
187
+ * their own, and the two agree until one of them is edited. The house answer
188
+ * is a named constant, so a consumer applying a default reads it from here.
189
+ */
190
+ export declare const ALERT_SEVERITY_DEFAULT = "warning";
191
+ export declare const ALERT_ENABLED_DEFAULT = true;
192
+ /** How often a value is written to history — not how often it is sent. */
193
+ export declare const RETENTION_INTERVAL_SECONDS_DEFAULT = 300;
194
+ /** The window a chart opens on, in minutes. Display only. */
195
+ export declare const CHART_WINDOW_MINUTES_DEFAULT = 60;
196
+ /**
197
+ * An alert's definition. Runtime state — whether it is firing, since when,
198
+ * with what value — is NOT here: it lives in the database and survives a
199
+ * restart, and it has no business in a versioned document.
200
+ *
201
+ * `severity` and `enabled` are absent-means-`ALERT_SEVERITY_DEFAULT` and
202
+ * absent-means-`ALERT_ENABLED_DEFAULT`; see those constants for why the
203
+ * default is not applied here.
204
+ */
205
+ export declare const datapointAlert: z.ZodObject<{
206
+ condition: z.ZodObject<{
207
+ fire_at: z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>;
208
+ resolve_at: z.ZodOptional<z.ZodNumber>;
209
+ }, z.core.$strict>;
210
+ severity: z.ZodOptional<z.ZodEnum<{
211
+ error: "error";
212
+ warning: "warning";
213
+ }>>;
214
+ name: z.ZodOptional<z.ZodString>;
215
+ enabled: z.ZodOptional<z.ZodBoolean>;
216
+ }, z.core.$strict>;
217
+ export type DatapointAlert = z.infer<typeof datapointAlert>;
218
+ /** Requires a numeric field — all four fields share that one precondition. */
219
+ export declare const datapointNumeric: z.ZodObject<{
220
+ scale: z.ZodOptional<z.ZodNumber>;
221
+ offset: z.ZodOptional<z.ZodNumber>;
222
+ unit: z.ZodOptional<z.ZodString>;
223
+ decimals: z.ZodOptional<z.ZodNumber>;
224
+ }, z.core.$strict>;
225
+ export type DatapointNumeric = z.infer<typeof datapointNumeric>;
226
+ /**
227
+ * `interval_seconds` absent means `RETENTION_INTERVAL_SECONDS_DEFAULT`.
228
+ *
229
+ * **`enabled` absent means off**, and that direction is the deliberate one.
230
+ * Stored points are what a customer is billed for, so a default that silently
231
+ * turned history on would start charging for a value nobody asked to keep. The
232
+ * cheap mistake is a developer noticing a datapoint has no history and
233
+ * switching it on; the expensive one is nobody noticing that everything has
234
+ * history. Absent-means-off is also what the cloud already does — this comment
235
+ * exists because it was doing it without anything saying so.
236
+ *
237
+ * Not spelled `.default(false)` for the same reason as every other default in
238
+ * this file: the document a developer wrote is the document that is stored,
239
+ * and a parse that inserts fields makes the round trip a lie.
240
+ */
241
+ export declare const datapointRetention: z.ZodObject<{
242
+ enabled: z.ZodOptional<z.ZodBoolean>;
243
+ interval_seconds: z.ZodOptional<z.ZodNumber>;
244
+ max_buffer_values: z.ZodOptional<z.ZodNumber>;
245
+ }, z.core.$strict>;
246
+ export type DatapointRetention = z.infer<typeof datapointRetention>;
247
+ export declare const datapointChart: z.ZodObject<{
248
+ y_min: z.ZodOptional<z.ZodNumber>;
249
+ y_max: z.ZodOptional<z.ZodNumber>;
250
+ style: z.ZodOptional<z.ZodEnum<{
251
+ line: "line";
252
+ step: "step";
253
+ }>>;
254
+ default_window_minutes: z.ZodOptional<z.ZodNumber>;
255
+ }, z.core.$strict>;
256
+ export type DatapointChart = z.infer<typeof datapointChart>;
257
+ /**
258
+ * The ceiling lives here once. `rest.ts`'s `datapointDescriptor` reuses it,
259
+ * so the two cannot drift apart the way a number spelled out twice always
260
+ * eventually does. `0` is deliberately admitted — zero and "omitted"
261
+ * (`datapointConfig`) or `null` (`datapointDescriptor`) are the same fact,
262
+ * "no throttling", not a refused value: `.positive()` here would exclude
263
+ * the very thing this field's own absence already means.
264
+ */
265
+ export declare const rateThrottleHz: z.ZodNumber;
266
+ /**
267
+ * One exposed datapoint: one field of a topic, or the whole topic
268
+ * (`field` omitted). Never several topics.
269
+ *
270
+ * `rate_throttle_hz` is an upper bound, not a clock — the bridge drops what
271
+ * arrives too fast and never repeats a value to manufacture a rate. The
272
+ * ceiling is 20: an app's surface has no use for more, and a control loop
273
+ * belongs on a tool that reads at the robot.
274
+ */
275
+ export declare const datapointConfig: z.ZodObject<{
276
+ topic: z.ZodString;
277
+ type: z.ZodString;
278
+ field: z.ZodOptional<z.ZodString>;
279
+ rate_throttle_hz: z.ZodOptional<z.ZodNumber>;
280
+ description: z.ZodOptional<z.ZodString>;
281
+ numeric: z.ZodOptional<z.ZodObject<{
282
+ scale: z.ZodOptional<z.ZodNumber>;
283
+ offset: z.ZodOptional<z.ZodNumber>;
284
+ unit: z.ZodOptional<z.ZodString>;
285
+ decimals: z.ZodOptional<z.ZodNumber>;
286
+ }, z.core.$strict>>;
287
+ retention: z.ZodOptional<z.ZodObject<{
288
+ enabled: z.ZodOptional<z.ZodBoolean>;
289
+ interval_seconds: z.ZodOptional<z.ZodNumber>;
290
+ max_buffer_values: z.ZodOptional<z.ZodNumber>;
291
+ }, z.core.$strict>>;
292
+ chart: z.ZodOptional<z.ZodObject<{
293
+ y_min: z.ZodOptional<z.ZodNumber>;
294
+ y_max: z.ZodOptional<z.ZodNumber>;
295
+ style: z.ZodOptional<z.ZodEnum<{
296
+ line: "line";
297
+ step: "step";
298
+ }>>;
299
+ default_window_minutes: z.ZodOptional<z.ZodNumber>;
300
+ }, z.core.$strict>>;
301
+ alerts: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
302
+ condition: z.ZodObject<{
303
+ fire_at: z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>;
304
+ resolve_at: z.ZodOptional<z.ZodNumber>;
305
+ }, z.core.$strict>;
306
+ severity: z.ZodOptional<z.ZodEnum<{
307
+ error: "error";
308
+ warning: "warning";
309
+ }>>;
310
+ name: z.ZodOptional<z.ZodString>;
311
+ enabled: z.ZodOptional<z.ZodBoolean>;
312
+ }, z.core.$strict>>>;
313
+ }, z.core.$strict>;
314
+ export type DatapointConfig = z.infer<typeof datapointConfig>;
315
+ /**
316
+ * A message template: the goal, request or published message, written out in
317
+ * full. Literals are fixed; `${name}` is a hole a caller fills.
318
+ *
319
+ * The shape cannot be narrower than `unknown` here — it is the shape of an
320
+ * arbitrary ROS message, which only the robot's own type definition knows.
321
+ * What CAN be checked here is the placeholder grammar; everything else is
322
+ * checked in the cloud against the introspected type.
323
+ *
324
+ * **`null` is refused, at every depth of this position.** Omission is the
325
+ * only spelling of "not set" in this format, and a bare `z.unknown()` made
326
+ * every message position the one place that also accepted the second
327
+ * spelling: `publishers.p.message: null`, `failsafe.message: null`,
328
+ * `actions.a.message: null` and `messages: {stop: null}` all parsed. Every
329
+ * other field gets this from its own type refusing `null`; this one has no
330
+ * type to get it from, so it says it here.
331
+ *
332
+ * The refusal is a refinement and therefore **invisible in the JSON Schema
333
+ * artifact**, which publishes this position as `{}`. The artifact says what
334
+ * the shape is, not what the parser refuses; a consumer that validates
335
+ * against the artifact instead of against this schema does not get it.
336
+ */
337
+ export declare const messageTemplate: z.ZodUnknown;
338
+ /** `${name}` and nothing else. A bare word is always a literal. */
339
+ export declare const PLACEHOLDER_RE: RegExp;
340
+ export declare const messageRef: z.ZodString;
341
+ /**
342
+ * What may stand at a `message:` position: a shared message by name
343
+ * (`${name}`), or an inline template. Position decides which — directly after
344
+ * `message:` a `${name}` resolves to a shared message, inside a body it
345
+ * resolves to a parameter.
346
+ *
347
+ * **This is `messageTemplate`, not a union with `messageRef`, and that is a
348
+ * correction rather than a simplification.** It was written as
349
+ * `z.union([messageRef, messageTemplate])`, whose second member accepts
350
+ * everything the first does: the union could never refuse, never narrowed
351
+ * anything (`string | unknown` is `unknown`), and published as
352
+ * `anyOf: [{pattern: …}, {}]` — an artifact that claims a distinction no
353
+ * validator makes. The distinction is real but it is not a shape distinction:
354
+ * a `${name}` here means a reference and elsewhere means a parameter, and
355
+ * only the cloud can say whether that name is a defined message
356
+ * (`unknown_message`) or a nested one (`nested_message_reference`).
357
+ *
358
+ * `messageRef` stays exported as the predicate that decides it. It is what a
359
+ * consumer applies to a body to ask "is this a reference?"; it is not what
360
+ * validates one.
361
+ */
362
+ export declare const messageBody: z.ZodUnknown;
363
+ /**
364
+ * Every placeholder name in a template, at any depth.
365
+ *
366
+ * **An explicit stack, not recursion, and the reason is `safeParse`'s
367
+ * contract.** This runs inside `publisherConfig`'s failsafe refinement, so a
368
+ * `RangeError: Maximum call stack size exceeded` did not stay here: it
369
+ * propagated out of `safeParse`, which is specified to return a result and
370
+ * not to throw. Measured on the recursive version — fine at 8 000 levels of
371
+ * nesting, throwing at 20 000 — and a flow-style YAML one-liner reaches that
372
+ * in about 120 KB of input. A draft PUT would have answered 500 where it
373
+ * meant 400.
374
+ *
375
+ * `seen` is not an optimisation. YAML anchors can express a cycle
376
+ * (`&a { b: *a }`), and the parser resolves an alias to the same object, so
377
+ * without it the loop that fixed the overflow would hang instead — the
378
+ * failure mode a stack trades for, made worse by being silent.
379
+ *
380
+ * The array branch is explicit, not necessary: `Object.values()` on an array
381
+ * yields the same elements. It is here so the walk reads as covering both
382
+ * shapes; a reader does not have to know that property of `Object.values`.
383
+ */
384
+ export declare function placeholderNames(node: unknown, found?: Set<string>): Set<string>;
385
+ /**
386
+ * Reusable message bodies, keyed by name. A shared message may hold
387
+ * placeholders; whoever inserts it declares the parameters. It may NOT
388
+ * insert another — that excludes cycles and lets every check look at exactly
389
+ * one body instead of walking a reference tree.
390
+ */
391
+ export declare const messageMap: z.ZodRecord<z.ZodString, z.ZodUnknown>;
392
+ /**
393
+ * An action the robot can be asked to perform (spec §4.2, §11.3). At most one
394
+ * job runs per action slug; a second call is refused `busy`, and every
395
+ * observer of the slug watches the same job.
396
+ */
397
+ export declare const actionConfig: z.ZodObject<{
398
+ ros_name: z.ZodString;
399
+ type: z.ZodString;
400
+ message: z.ZodOptional<z.ZodUnknown>;
401
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
402
+ type: z.ZodEnum<{
403
+ string: "string";
404
+ bool: "bool";
405
+ byte: "byte";
406
+ char: "char";
407
+ int8: "int8";
408
+ uint8: "uint8";
409
+ int16: "int16";
410
+ uint16: "uint16";
411
+ int32: "int32";
412
+ uint32: "uint32";
413
+ int64: "int64";
414
+ uint64: "uint64";
415
+ float32: "float32";
416
+ float64: "float64";
417
+ wstring: "wstring";
418
+ }>;
419
+ default: z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>>;
420
+ min_value: z.ZodOptional<z.ZodNumber>;
421
+ max_value: z.ZodOptional<z.ZodNumber>;
422
+ enum: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
423
+ regex: z.ZodOptional<z.ZodString>;
424
+ description: z.ZodOptional<z.ZodString>;
425
+ }, z.core.$strict>>>;
426
+ description: z.ZodOptional<z.ZodString>;
427
+ }, z.core.$strict>;
428
+ export type ActionConfig = z.infer<typeof actionConfig>;
429
+ /** A ROS service call with validated parameters (spec §4.2). */
430
+ export declare const serviceConfig: z.ZodObject<{
431
+ ros_name: z.ZodString;
432
+ type: z.ZodString;
433
+ message: z.ZodOptional<z.ZodUnknown>;
434
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
435
+ type: z.ZodEnum<{
436
+ string: "string";
437
+ bool: "bool";
438
+ byte: "byte";
439
+ char: "char";
440
+ int8: "int8";
441
+ uint8: "uint8";
442
+ int16: "int16";
443
+ uint16: "uint16";
444
+ int32: "int32";
445
+ uint32: "uint32";
446
+ int64: "int64";
447
+ uint64: "uint64";
448
+ float32: "float32";
449
+ float64: "float64";
450
+ wstring: "wstring";
451
+ }>;
452
+ default: z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>>;
453
+ min_value: z.ZodOptional<z.ZodNumber>;
454
+ max_value: z.ZodOptional<z.ZodNumber>;
455
+ enum: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
456
+ regex: z.ZodOptional<z.ZodString>;
457
+ description: z.ZodOptional<z.ZodString>;
458
+ }, z.core.$strict>>>;
459
+ description: z.ZodOptional<z.ZodString>;
460
+ }, z.core.$strict>;
461
+ export type ServiceConfig = z.infer<typeof serviceConfig>;
462
+ /**
463
+ * A topic clients may publish to.
464
+ *
465
+ * `failsafe` groups the deadline with the message it triggers, because the
466
+ * deadline exists for nothing else. The message must hold no placeholder:
467
+ * the bridge sends it with no caller present, so there would be nobody to
468
+ * fill one.
469
+ *
470
+ * **What that check can and cannot see.** It refuses a placeholder written
471
+ * into an inline failsafe body. It does not refuse
472
+ * `failsafe: { message: '${anything}' }` — a string at a `message:` position
473
+ * is a *reference to a shared message*, and whether that message holds a
474
+ * placeholder is a question about another section of the document, which a
475
+ * schema over one publisher cannot answer. So `failsafe_has_parameters` is
476
+ * half here and half in the cloud, on purpose and by position rather than by
477
+ * accident: the inline half is decidable here, the referenced half is one of
478
+ * the name-resolution codes the file header assigns to the cloud.
479
+ *
480
+ * `quiet_timeout_ms` is unrelated — how long a publisher must be silent
481
+ * before a *different* user may send.
482
+ */
483
+ export declare const publisherConfig: z.ZodObject<{
484
+ topic: z.ZodString;
485
+ type: z.ZodString;
486
+ message: z.ZodUnknown;
487
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
488
+ type: z.ZodEnum<{
489
+ string: "string";
490
+ bool: "bool";
491
+ byte: "byte";
492
+ char: "char";
493
+ int8: "int8";
494
+ uint8: "uint8";
495
+ int16: "int16";
496
+ uint16: "uint16";
497
+ int32: "int32";
498
+ uint32: "uint32";
499
+ int64: "int64";
500
+ uint64: "uint64";
501
+ float32: "float32";
502
+ float64: "float64";
503
+ wstring: "wstring";
504
+ }>;
505
+ default: z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>>;
506
+ min_value: z.ZodOptional<z.ZodNumber>;
507
+ max_value: z.ZodOptional<z.ZodNumber>;
508
+ enum: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
509
+ regex: z.ZodOptional<z.ZodString>;
510
+ description: z.ZodOptional<z.ZodString>;
511
+ }, z.core.$strict>>>;
512
+ failsafe: z.ZodObject<{
513
+ timeout_ms: z.ZodNumber;
514
+ message: z.ZodUnknown;
515
+ }, z.core.$strict>;
516
+ quiet_timeout_ms: z.ZodNumber;
517
+ description: z.ZodOptional<z.ZodString>;
518
+ }, z.core.$strict>;
519
+ export type PublisherConfig = z.infer<typeof publisherConfig>;
520
+ /**
521
+ * Camera credentials, in the document. There is no separate store any more.
522
+ *
523
+ * This was decided against a recorded objection, and the objection stands: a
524
+ * password here is in every published version, and those are immutable. It
525
+ * cannot be removed from history and cannot be rotated without republishing.
526
+ * The bound on that decision is elsewhere and load-bearing — the publish
527
+ * audit event and the org event stream must not carry the document body.
528
+ */
529
+ export declare const cameraCredentials: z.ZodObject<{
530
+ username: z.ZodOptional<z.ZodString>;
531
+ password: z.ZodOptional<z.ZodString>;
532
+ }, z.core.$strict>;
533
+ export type CameraCredentials = z.infer<typeof cameraCredentials>;
534
+ export declare const cameraSource: z.ZodDiscriminatedUnion<[z.ZodObject<{
535
+ kind: z.ZodLiteral<"ros">;
536
+ topic: z.ZodString;
537
+ type: z.ZodString;
538
+ }, z.core.$strict>, z.ZodObject<{
539
+ kind: z.ZodLiteral<"rtsp">;
540
+ url: z.ZodString;
541
+ transport: z.ZodOptional<z.ZodEnum<{
542
+ tcp: "tcp";
543
+ udp: "udp";
544
+ }>>;
545
+ credentials: z.ZodOptional<z.ZodObject<{
546
+ username: z.ZodOptional<z.ZodString>;
547
+ password: z.ZodOptional<z.ZodString>;
548
+ }, z.core.$strict>>;
549
+ }, z.core.$strict>, z.ZodObject<{
550
+ kind: z.ZodLiteral<"mjpeg">;
551
+ url: z.ZodString;
552
+ credentials: z.ZodOptional<z.ZodObject<{
553
+ username: z.ZodOptional<z.ZodString>;
554
+ password: z.ZodOptional<z.ZodString>;
555
+ }, z.core.$strict>>;
556
+ }, z.core.$strict>, z.ZodObject<{
557
+ kind: z.ZodLiteral<"v4l2">;
558
+ device: z.ZodString;
559
+ }, z.core.$strict>], "kind">;
560
+ export type CameraSource = z.infer<typeof cameraSource>;
561
+ /**
562
+ * How often a snapshot is captured, in seconds. Bounded below at one second
563
+ * because a snapshot is the *cheap* mode — a developer who wants motion wants
564
+ * live, and an interval faster than this is a live stream wearing a disguise.
565
+ *
566
+ * The bound lives here once, and `rest.ts`'s `cameraDescriptor` reuses it —
567
+ * the same treatment `rateThrottleHz` got, and for the same reason: the
568
+ * descriptor used to say `snapshot_interval_ms` while the document said
569
+ * seconds, so the cloud converted on one descriptor and not its sibling, with
570
+ * nothing in either file saying so.
571
+ */
572
+ export declare const snapshotIntervalSeconds: z.ZodNumber;
573
+ /**
574
+ * A camera the robot exposes (spec §10).
575
+ *
576
+ * `width`/`height`/`fps`/`bitrate_kbps` are not cosmetic: §10 makes them the
577
+ * developer's control over **the robot's own bandwidth**, which is why they
578
+ * live in the configuration rather than in a viewer's request. A viewer never
579
+ * gets to make a robot send more.
580
+ *
581
+ * The two modes are deliberately independent (§10):
582
+ *
583
+ * - **Snapshot** runs always, at `snapshot_interval_seconds`, whether or not
584
+ * anyone is watching live. The cloud caches the one frame and serves every
585
+ * client from it, so a hundred pollers cost the robot exactly one image per
586
+ * interval.
587
+ * - **Live** runs on demand and is refcounted in the cloud: the first viewer
588
+ * starts it, the last one ends it.
589
+ */
590
+ export declare const cameraConfig: z.ZodObject<{
591
+ source: z.ZodDiscriminatedUnion<[z.ZodObject<{
592
+ kind: z.ZodLiteral<"ros">;
593
+ topic: z.ZodString;
594
+ type: z.ZodString;
595
+ }, z.core.$strict>, z.ZodObject<{
596
+ kind: z.ZodLiteral<"rtsp">;
597
+ url: z.ZodString;
598
+ transport: z.ZodOptional<z.ZodEnum<{
599
+ tcp: "tcp";
600
+ udp: "udp";
601
+ }>>;
602
+ credentials: z.ZodOptional<z.ZodObject<{
603
+ username: z.ZodOptional<z.ZodString>;
604
+ password: z.ZodOptional<z.ZodString>;
605
+ }, z.core.$strict>>;
606
+ }, z.core.$strict>, z.ZodObject<{
607
+ kind: z.ZodLiteral<"mjpeg">;
608
+ url: z.ZodString;
609
+ credentials: z.ZodOptional<z.ZodObject<{
610
+ username: z.ZodOptional<z.ZodString>;
611
+ password: z.ZodOptional<z.ZodString>;
612
+ }, z.core.$strict>>;
613
+ }, z.core.$strict>, z.ZodObject<{
614
+ kind: z.ZodLiteral<"v4l2">;
615
+ device: z.ZodString;
616
+ }, z.core.$strict>], "kind">;
617
+ width: z.ZodNumber;
618
+ height: z.ZodNumber;
619
+ fps: z.ZodNumber;
620
+ bitrate_kbps: z.ZodNumber;
621
+ snapshot_interval_seconds: z.ZodNumber;
622
+ description: z.ZodOptional<z.ZodString>;
623
+ }, z.core.$strict>;
624
+ export type CameraConfig = z.infer<typeof cameraConfig>;
625
+ /**
626
+ * The format version of a `fleetless.yaml`. Deliberately not called
627
+ * `version`: the console counts published states with "v12 → v13", and two
628
+ * numbers called version would be the likeliest confusion in the format.
629
+ */
630
+ export declare const FLEETLESS_FORMAT_VERSION = 1;
631
+ /**
632
+ * A whole robot configuration — everything configurable about one robot.
633
+ *
634
+ * Every section is a mapping keyed by name, not a list of objects carrying
635
+ * their own name. A duplicate name is then a YAML syntax error rather than a
636
+ * rule somebody has to write, and the name reads as the entry's heading.
637
+ *
638
+ * Slugs remain ONE namespace across all five exposure sections (§4.1), which
639
+ * is what lets a role grant say `{robot, slug}` without naming a kind. That
640
+ * check spans sections and therefore lives in the cloud, not here.
641
+ */
642
+ export declare const robotConfigDoc: z.ZodObject<{
643
+ fleetless: z.ZodLiteral<1>;
644
+ messages: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
645
+ datapoints: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
646
+ topic: z.ZodString;
647
+ type: z.ZodString;
648
+ field: z.ZodOptional<z.ZodString>;
649
+ rate_throttle_hz: z.ZodOptional<z.ZodNumber>;
650
+ description: z.ZodOptional<z.ZodString>;
651
+ numeric: z.ZodOptional<z.ZodObject<{
652
+ scale: z.ZodOptional<z.ZodNumber>;
653
+ offset: z.ZodOptional<z.ZodNumber>;
654
+ unit: z.ZodOptional<z.ZodString>;
655
+ decimals: z.ZodOptional<z.ZodNumber>;
656
+ }, z.core.$strict>>;
657
+ retention: z.ZodOptional<z.ZodObject<{
658
+ enabled: z.ZodOptional<z.ZodBoolean>;
659
+ interval_seconds: z.ZodOptional<z.ZodNumber>;
660
+ max_buffer_values: z.ZodOptional<z.ZodNumber>;
661
+ }, z.core.$strict>>;
662
+ chart: z.ZodOptional<z.ZodObject<{
663
+ y_min: z.ZodOptional<z.ZodNumber>;
664
+ y_max: z.ZodOptional<z.ZodNumber>;
665
+ style: z.ZodOptional<z.ZodEnum<{
666
+ line: "line";
667
+ step: "step";
668
+ }>>;
669
+ default_window_minutes: z.ZodOptional<z.ZodNumber>;
670
+ }, z.core.$strict>>;
671
+ alerts: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
672
+ condition: z.ZodObject<{
673
+ fire_at: z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>;
674
+ resolve_at: z.ZodOptional<z.ZodNumber>;
675
+ }, z.core.$strict>;
676
+ severity: z.ZodOptional<z.ZodEnum<{
677
+ error: "error";
678
+ warning: "warning";
679
+ }>>;
680
+ name: z.ZodOptional<z.ZodString>;
681
+ enabled: z.ZodOptional<z.ZodBoolean>;
682
+ }, z.core.$strict>>>;
683
+ }, z.core.$strict>>>;
684
+ actions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
685
+ ros_name: z.ZodString;
686
+ type: z.ZodString;
687
+ message: z.ZodOptional<z.ZodUnknown>;
688
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
689
+ type: z.ZodEnum<{
690
+ string: "string";
691
+ bool: "bool";
692
+ byte: "byte";
693
+ char: "char";
694
+ int8: "int8";
695
+ uint8: "uint8";
696
+ int16: "int16";
697
+ uint16: "uint16";
698
+ int32: "int32";
699
+ uint32: "uint32";
700
+ int64: "int64";
701
+ uint64: "uint64";
702
+ float32: "float32";
703
+ float64: "float64";
704
+ wstring: "wstring";
705
+ }>;
706
+ default: z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>>;
707
+ min_value: z.ZodOptional<z.ZodNumber>;
708
+ max_value: z.ZodOptional<z.ZodNumber>;
709
+ enum: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
710
+ regex: z.ZodOptional<z.ZodString>;
711
+ description: z.ZodOptional<z.ZodString>;
712
+ }, z.core.$strict>>>;
713
+ description: z.ZodOptional<z.ZodString>;
714
+ }, z.core.$strict>>>;
715
+ services: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
716
+ ros_name: z.ZodString;
717
+ type: z.ZodString;
718
+ message: z.ZodOptional<z.ZodUnknown>;
719
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
720
+ type: z.ZodEnum<{
721
+ string: "string";
722
+ bool: "bool";
723
+ byte: "byte";
724
+ char: "char";
725
+ int8: "int8";
726
+ uint8: "uint8";
727
+ int16: "int16";
728
+ uint16: "uint16";
729
+ int32: "int32";
730
+ uint32: "uint32";
731
+ int64: "int64";
732
+ uint64: "uint64";
733
+ float32: "float32";
734
+ float64: "float64";
735
+ wstring: "wstring";
736
+ }>;
737
+ default: z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>>;
738
+ min_value: z.ZodOptional<z.ZodNumber>;
739
+ max_value: z.ZodOptional<z.ZodNumber>;
740
+ enum: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
741
+ regex: z.ZodOptional<z.ZodString>;
742
+ description: z.ZodOptional<z.ZodString>;
743
+ }, z.core.$strict>>>;
744
+ description: z.ZodOptional<z.ZodString>;
745
+ }, z.core.$strict>>>;
746
+ publishers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
747
+ topic: z.ZodString;
748
+ type: z.ZodString;
749
+ message: z.ZodUnknown;
750
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
751
+ type: z.ZodEnum<{
752
+ string: "string";
753
+ bool: "bool";
754
+ byte: "byte";
755
+ char: "char";
756
+ int8: "int8";
757
+ uint8: "uint8";
758
+ int16: "int16";
759
+ uint16: "uint16";
760
+ int32: "int32";
761
+ uint32: "uint32";
762
+ int64: "int64";
763
+ uint64: "uint64";
764
+ float32: "float32";
765
+ float64: "float64";
766
+ wstring: "wstring";
767
+ }>;
768
+ default: z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>>;
769
+ min_value: z.ZodOptional<z.ZodNumber>;
770
+ max_value: z.ZodOptional<z.ZodNumber>;
771
+ enum: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
772
+ regex: z.ZodOptional<z.ZodString>;
773
+ description: z.ZodOptional<z.ZodString>;
774
+ }, z.core.$strict>>>;
775
+ failsafe: z.ZodObject<{
776
+ timeout_ms: z.ZodNumber;
777
+ message: z.ZodUnknown;
778
+ }, z.core.$strict>;
779
+ quiet_timeout_ms: z.ZodNumber;
780
+ description: z.ZodOptional<z.ZodString>;
781
+ }, z.core.$strict>>>;
782
+ cameras: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
783
+ source: z.ZodDiscriminatedUnion<[z.ZodObject<{
784
+ kind: z.ZodLiteral<"ros">;
785
+ topic: z.ZodString;
786
+ type: z.ZodString;
787
+ }, z.core.$strict>, z.ZodObject<{
788
+ kind: z.ZodLiteral<"rtsp">;
789
+ url: z.ZodString;
790
+ transport: z.ZodOptional<z.ZodEnum<{
791
+ tcp: "tcp";
792
+ udp: "udp";
793
+ }>>;
794
+ credentials: z.ZodOptional<z.ZodObject<{
795
+ username: z.ZodOptional<z.ZodString>;
796
+ password: z.ZodOptional<z.ZodString>;
797
+ }, z.core.$strict>>;
798
+ }, z.core.$strict>, z.ZodObject<{
799
+ kind: z.ZodLiteral<"mjpeg">;
800
+ url: z.ZodString;
801
+ credentials: z.ZodOptional<z.ZodObject<{
802
+ username: z.ZodOptional<z.ZodString>;
803
+ password: z.ZodOptional<z.ZodString>;
804
+ }, z.core.$strict>>;
805
+ }, z.core.$strict>, z.ZodObject<{
806
+ kind: z.ZodLiteral<"v4l2">;
807
+ device: z.ZodString;
808
+ }, z.core.$strict>], "kind">;
809
+ width: z.ZodNumber;
810
+ height: z.ZodNumber;
811
+ fps: z.ZodNumber;
812
+ bitrate_kbps: z.ZodNumber;
813
+ snapshot_interval_seconds: z.ZodNumber;
814
+ description: z.ZodOptional<z.ZodString>;
815
+ }, z.core.$strict>>>;
816
+ }, z.core.$strict>;
817
+ export type RobotConfigDoc = z.infer<typeof robotConfigDoc>;
818
+ /**
819
+ * One thing the cloud has to say about a configuration (spec §11.5: field +
820
+ * violated rule).
821
+ *
822
+ * `error` blocks the publish. `warning` does not — an unknown topic is a
823
+ * warning on purpose, because configuring a robot that has never been
824
+ * connected must stay possible (spec §4.1).
825
+ */
826
+ export declare const validationIssue: z.ZodObject<{
827
+ path: z.ZodString;
828
+ slug: z.ZodNullable<z.ZodString>;
829
+ code: z.ZodString;
830
+ message: z.ZodString;
831
+ severity: z.ZodEnum<{
832
+ error: "error";
833
+ warning: "warning";
834
+ }>;
835
+ }, z.core.$strip>;
836
+ export type ValidationIssue = z.infer<typeof validationIssue>;
837
+ /**
838
+ * Where a robot's configuration stands — the material for the console's
839
+ * "draft newer than published", "published v2 · applied v1 · bridge offline"
840
+ * (spec §15.2, robot tab 1).
841
+ */
842
+ export declare const configState: z.ZodObject<{
843
+ published_version: z.ZodNullable<z.ZodNumber>;
844
+ published_at: z.ZodNullable<z.ZodISODateTime>;
845
+ draft_updated_at: z.ZodNullable<z.ZodISODateTime>;
846
+ applied_version: z.ZodNullable<z.ZodNumber>;
847
+ applied_ok: z.ZodNullable<z.ZodBoolean>;
848
+ applied_errors: z.ZodNullable<z.ZodArray<z.ZodObject<{
849
+ slug: z.ZodString;
850
+ kind: z.ZodEnum<{
851
+ datapoint: "datapoint";
852
+ action: "action";
853
+ service: "service";
854
+ publisher: "publisher";
855
+ camera: "camera";
856
+ }>;
857
+ code: z.ZodString;
858
+ message: z.ZodString;
859
+ details: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
860
+ }, z.core.$strip>>>;
861
+ }, z.core.$strip>;
862
+ export type ConfigState = z.infer<typeof configState>;