@ksp-gonogo/sitrep-sdk 1.0.0-rc.21 → 2.0.0-rc.23

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 (489) hide show
  1. package/README.md +6 -0
  2. package/dist/__generated__/command-map.d.ts +140 -11
  3. package/dist/__generated__/command-map.d.ts.map +1 -1
  4. package/dist/__generated__/command-map.js +6 -3
  5. package/dist/__generated__/command-map.js.map +1 -1
  6. package/dist/__generated__/contract.d.ts +591 -425
  7. package/dist/__generated__/contract.d.ts.map +1 -1
  8. package/dist/__generated__/contract.js +34 -4
  9. package/dist/__generated__/contract.js.map +1 -1
  10. package/dist/__generated__/error-codes.d.ts +46 -55
  11. package/dist/__generated__/error-codes.d.ts.map +1 -1
  12. package/dist/__generated__/error-codes.js +76 -69
  13. package/dist/__generated__/error-codes.js.map +1 -1
  14. package/dist/__generated__/test-theme.d.ts +3 -0
  15. package/dist/__generated__/test-theme.d.ts.map +1 -1
  16. package/dist/__generated__/test-theme.js +3 -0
  17. package/dist/__generated__/test-theme.js.map +1 -1
  18. package/dist/__generated__/topic-map.d.ts +90 -2
  19. package/dist/__generated__/topic-map.d.ts.map +1 -1
  20. package/dist/__generated__/topic-map.js +2 -0
  21. package/dist/__generated__/topic-map.js.map +1 -1
  22. package/dist/__generated__/units.d.ts.map +1 -1
  23. package/dist/__generated__/units.js +89 -47
  24. package/dist/__generated__/units.js.map +1 -1
  25. package/dist/api/alarm-request.d.ts +6 -1
  26. package/dist/api/alarm-request.d.ts.map +1 -1
  27. package/dist/api/alarm-request.js +7 -1
  28. package/dist/api/alarm-request.js.map +1 -1
  29. package/dist/api/contribution-slots.d.ts +87 -17
  30. package/dist/api/contribution-slots.d.ts.map +1 -1
  31. package/dist/api/coverage/CoverageMaskCache.d.ts +1 -1
  32. package/dist/api/coverage/CoverageMaskCache.js +1 -1
  33. package/dist/api/coverage-source.d.ts +3 -1
  34. package/dist/api/coverage-source.d.ts.map +1 -1
  35. package/dist/api/coverage-source.js +3 -1
  36. package/dist/api/coverage-source.js.map +1 -1
  37. package/dist/api/framework-reads.d.ts +20 -0
  38. package/dist/api/framework-reads.d.ts.map +1 -0
  39. package/dist/api/framework-reads.js +30 -0
  40. package/dist/api/framework-reads.js.map +1 -0
  41. package/dist/api/host.d.ts +8 -5
  42. package/dist/api/host.d.ts.map +1 -1
  43. package/dist/api/host.js.map +1 -1
  44. package/dist/api/index.d.ts +96 -17
  45. package/dist/api/index.d.ts.map +1 -1
  46. package/dist/api/index.js +91 -10
  47. package/dist/api/index.js.map +1 -1
  48. package/dist/api/logger.d.ts +14 -2
  49. package/dist/api/logger.d.ts.map +1 -1
  50. package/dist/api/logger.js +14 -2
  51. package/dist/api/logger.js.map +1 -1
  52. package/dist/api/plot-layers.d.ts +81 -6
  53. package/dist/api/plot-layers.d.ts.map +1 -1
  54. package/dist/api/plot-layers.js +4 -3
  55. package/dist/api/plot-layers.js.map +1 -1
  56. package/dist/api/plots.d.ts +19 -0
  57. package/dist/api/plots.d.ts.map +1 -1
  58. package/dist/api/registry.d.ts +11 -0
  59. package/dist/api/registry.d.ts.map +1 -1
  60. package/dist/api/registry.js.map +1 -1
  61. package/dist/api/settings/SettingsContext.d.ts +5 -4
  62. package/dist/api/settings/SettingsContext.d.ts.map +1 -1
  63. package/dist/api/settings/SettingsContext.js +13 -4
  64. package/dist/api/settings/SettingsContext.js.map +1 -1
  65. package/dist/api/settings/SettingsService.d.ts +3 -0
  66. package/dist/api/settings/SettingsService.d.ts.map +1 -1
  67. package/dist/api/settings/SettingsService.js +3 -0
  68. package/dist/api/settings/SettingsService.js.map +1 -1
  69. package/dist/api/settings/store.d.ts +3 -1
  70. package/dist/api/settings/store.d.ts.map +1 -1
  71. package/dist/api/settings/store.js +3 -1
  72. package/dist/api/settings/store.js.map +1 -1
  73. package/dist/api/slots.d.ts +94 -17
  74. package/dist/api/slots.d.ts.map +1 -1
  75. package/dist/api/station-brokers.d.ts +2 -1
  76. package/dist/api/station-brokers.d.ts.map +1 -1
  77. package/dist/api/station-brokers.js +2 -1
  78. package/dist/api/station-brokers.js.map +1 -1
  79. package/dist/api/stock-bodies.d.ts.map +1 -1
  80. package/dist/api/stock-bodies.js +6 -0
  81. package/dist/api/stock-bodies.js.map +1 -1
  82. package/dist/api/tiny-size.d.ts +2 -0
  83. package/dist/api/tiny-size.d.ts.map +1 -1
  84. package/dist/api/tiny-size.js +6 -1
  85. package/dist/api/tiny-size.js.map +1 -1
  86. package/dist/api/tone.d.ts +7 -4
  87. package/dist/api/tone.d.ts.map +1 -1
  88. package/dist/api/tone.js.map +1 -1
  89. package/dist/api/transport.d.ts +10 -2
  90. package/dist/api/transport.d.ts.map +1 -1
  91. package/dist/api/types.d.ts +179 -120
  92. package/dist/api/types.d.ts.map +1 -1
  93. package/dist/binary-frame.d.ts +26 -25
  94. package/dist/binary-frame.d.ts.map +1 -1
  95. package/dist/binary-frame.js +25 -25
  96. package/dist/binary-frame.js.map +1 -1
  97. package/dist/client.d.ts.map +1 -1
  98. package/dist/client.js +2 -0
  99. package/dist/client.js.map +1 -1
  100. package/dist/combine-readings.d.ts +8 -4
  101. package/dist/combine-readings.d.ts.map +1 -1
  102. package/dist/combine-readings.js +6 -4
  103. package/dist/combine-readings.js.map +1 -1
  104. package/dist/command-delay.d.ts +6 -0
  105. package/dist/command-delay.d.ts.map +1 -1
  106. package/dist/command-delay.js.map +1 -1
  107. package/dist/commands.d.ts +1 -1
  108. package/dist/commands.d.ts.map +1 -1
  109. package/dist/compat-versions.d.ts +1 -1
  110. package/dist/compat-versions.d.ts.map +1 -1
  111. package/dist/compat-versions.js +2 -2
  112. package/dist/compat-versions.js.map +1 -1
  113. package/dist/contract-enum-names.d.ts +2 -3
  114. package/dist/contract-enum-names.d.ts.map +1 -1
  115. package/dist/contract-enum-names.js +2 -3
  116. package/dist/contract-enum-names.js.map +1 -1
  117. package/dist/enum-names.d.ts +5 -3
  118. package/dist/enum-names.d.ts.map +1 -1
  119. package/dist/enum-names.js +5 -3
  120. package/dist/enum-names.js.map +1 -1
  121. package/dist/envelope.d.ts +3 -3
  122. package/dist/envelope.d.ts.map +1 -1
  123. package/dist/flight/BufferedDataSource.d.ts.map +1 -1
  124. package/dist/flight/BufferedDataSource.js +4 -2
  125. package/dist/flight/BufferedDataSource.js.map +1 -1
  126. package/dist/flight/types.d.ts +3 -2
  127. package/dist/flight/types.d.ts.map +1 -1
  128. package/dist/frames/index.d.ts +19 -17
  129. package/dist/frames/index.d.ts.map +1 -1
  130. package/dist/frames/index.js +13 -12
  131. package/dist/frames/index.js.map +1 -1
  132. package/dist/index.d.ts +20 -3
  133. package/dist/index.d.ts.map +1 -1
  134. package/dist/index.js +18 -3
  135. package/dist/index.js.map +1 -1
  136. package/dist/ksp-enum-names.d.ts +23 -8
  137. package/dist/ksp-enum-names.d.ts.map +1 -1
  138. package/dist/ksp-enum-names.js +20 -8
  139. package/dist/ksp-enum-names.js.map +1 -1
  140. package/dist/media/radio-support.d.ts +12 -3
  141. package/dist/media/radio-support.d.ts.map +1 -1
  142. package/dist/media/radio-support.js +12 -3
  143. package/dist/media/radio-support.js.map +1 -1
  144. package/dist/perf/PerfBudget.d.ts +7 -5
  145. package/dist/perf/PerfBudget.d.ts.map +1 -1
  146. package/dist/perf/PerfBudget.js +8 -6
  147. package/dist/perf/PerfBudget.js.map +1 -1
  148. package/dist/reading.d.ts +12 -2
  149. package/dist/reading.d.ts.map +1 -1
  150. package/dist/reading.js +7 -2
  151. package/dist/reading.js.map +1 -1
  152. package/dist/reads-index.json +3675 -0
  153. package/dist/spine/body-pose.d.ts +85 -0
  154. package/dist/spine/body-pose.d.ts.map +1 -0
  155. package/dist/spine/body-pose.js +166 -0
  156. package/dist/spine/body-pose.js.map +1 -0
  157. package/dist/spine/capability-lock.d.ts +6 -2
  158. package/dist/spine/capability-lock.d.ts.map +1 -1
  159. package/dist/spine/capability-lock.js +8 -2
  160. package/dist/spine/capability-lock.js.map +1 -1
  161. package/dist/spine/catalogue-elements.d.ts +28 -0
  162. package/dist/spine/catalogue-elements.d.ts.map +1 -0
  163. package/dist/spine/catalogue-elements.js +63 -0
  164. package/dist/spine/catalogue-elements.js.map +1 -0
  165. package/dist/spine/celestial-facts.d.ts +5 -7
  166. package/dist/spine/celestial-facts.d.ts.map +1 -1
  167. package/dist/spine/celestial-facts.js +10 -21
  168. package/dist/spine/celestial-facts.js.map +1 -1
  169. package/dist/spine/client-timeline.d.ts +10 -12
  170. package/dist/spine/client-timeline.d.ts.map +1 -1
  171. package/dist/spine/client-timeline.js.map +1 -1
  172. package/dist/spine/client.d.ts +31 -0
  173. package/dist/spine/client.d.ts.map +1 -1
  174. package/dist/spine/client.js +97 -19
  175. package/dist/spine/client.js.map +1 -1
  176. package/dist/spine/command-gate.d.ts +13 -11
  177. package/dist/spine/command-gate.d.ts.map +1 -1
  178. package/dist/spine/command-gate.js +2 -2
  179. package/dist/spine/command-gate.js.map +1 -1
  180. package/dist/spine/command-group.d.ts +62 -0
  181. package/dist/spine/command-group.d.ts.map +1 -0
  182. package/dist/spine/command-group.js +172 -0
  183. package/dist/spine/command-group.js.map +1 -0
  184. package/dist/spine/comms-delay-reckoning.js.map +1 -1
  185. package/dist/spine/comms-journey.d.ts +9 -0
  186. package/dist/spine/comms-journey.d.ts.map +1 -1
  187. package/dist/spine/comms-journey.js +27 -0
  188. package/dist/spine/comms-journey.js.map +1 -1
  189. package/dist/spine/comms-path-geometry.d.ts +3 -3
  190. package/dist/spine/comms-path-geometry.d.ts.map +1 -1
  191. package/dist/spine/comms-path-geometry.js.map +1 -1
  192. package/dist/spine/connection-error-warning.d.ts +1 -1
  193. package/dist/spine/connection-error-warning.js +1 -1
  194. package/dist/spine/context.d.ts.map +1 -1
  195. package/dist/spine/context.js +4 -0
  196. package/dist/spine/context.js.map +1 -1
  197. package/dist/spine/contributions.d.ts +13 -13
  198. package/dist/spine/contributions.js +13 -13
  199. package/dist/spine/core-reckoners.d.ts.map +1 -1
  200. package/dist/spine/core-reckoners.js +2 -2
  201. package/dist/spine/core-reckoners.js.map +1 -1
  202. package/dist/spine/held-command-actions.d.ts +3 -0
  203. package/dist/spine/held-command-actions.d.ts.map +1 -1
  204. package/dist/spine/held-command-actions.js +12 -7
  205. package/dist/spine/held-command-actions.js.map +1 -1
  206. package/dist/spine/impact-point.d.ts.map +1 -1
  207. package/dist/spine/impact-point.js +6 -29
  208. package/dist/spine/impact-point.js.map +1 -1
  209. package/dist/spine/index.d.ts +5 -0
  210. package/dist/spine/index.d.ts.map +1 -1
  211. package/dist/spine/index.js +5 -0
  212. package/dist/spine/index.js.map +1 -1
  213. package/dist/spine/kepler-reckoning.d.ts +2 -2
  214. package/dist/spine/kepler-reckoning.d.ts.map +1 -1
  215. package/dist/spine/kepler-reckoning.js.map +1 -1
  216. package/dist/spine/kepler.d.ts +8 -6
  217. package/dist/spine/kepler.d.ts.map +1 -1
  218. package/dist/spine/kepler.js +3 -1
  219. package/dist/spine/kepler.js.map +1 -1
  220. package/dist/spine/lagrange.d.ts +6 -6
  221. package/dist/spine/lagrange.d.ts.map +1 -1
  222. package/dist/spine/lagrange.js.map +1 -1
  223. package/dist/spine/lifecycle.d.ts +14 -0
  224. package/dist/spine/lifecycle.d.ts.map +1 -1
  225. package/dist/spine/lifecycle.js.map +1 -1
  226. package/dist/spine/lock-scope.d.ts +11 -1
  227. package/dist/spine/lock-scope.d.ts.map +1 -1
  228. package/dist/spine/lock-scope.js.map +1 -1
  229. package/dist/spine/map-command.d.ts +3 -11
  230. package/dist/spine/map-command.d.ts.map +1 -1
  231. package/dist/spine/map-command.js +3 -11
  232. package/dist/spine/map-command.js.map +1 -1
  233. package/dist/spine/mod-settings.d.ts.map +1 -1
  234. package/dist/spine/mod-settings.js +1 -0
  235. package/dist/spine/mod-settings.js.map +1 -1
  236. package/dist/spine/never-reckonable.d.ts.map +1 -1
  237. package/dist/spine/never-reckonable.js +8 -6
  238. package/dist/spine/never-reckonable.js.map +1 -1
  239. package/dist/spine/orbit-patches.d.ts +16 -4
  240. package/dist/spine/orbit-patches.d.ts.map +1 -1
  241. package/dist/spine/orbit-patches.js +12 -5
  242. package/dist/spine/orbit-patches.js.map +1 -1
  243. package/dist/spine/orbit-trajectory.d.ts +60 -3
  244. package/dist/spine/orbit-trajectory.d.ts.map +1 -1
  245. package/dist/spine/orbit-trajectory.js +133 -40
  246. package/dist/spine/orbit-trajectory.js.map +1 -1
  247. package/dist/spine/orbital-solve.js +1 -1
  248. package/dist/spine/own-craft-vantage.d.ts.map +1 -1
  249. package/dist/spine/own-craft-vantage.js +1 -0
  250. package/dist/spine/own-craft-vantage.js.map +1 -1
  251. package/dist/spine/past-track.d.ts +7 -7
  252. package/dist/spine/past-track.js +7 -7
  253. package/dist/spine/phase-angle.d.ts +19 -0
  254. package/dist/spine/phase-angle.d.ts.map +1 -0
  255. package/dist/spine/phase-angle.js +47 -0
  256. package/dist/spine/phase-angle.js.map +1 -0
  257. package/dist/spine/powered-reckoning.js.map +1 -1
  258. package/dist/spine/processors.d.ts +4 -1
  259. package/dist/spine/processors.d.ts.map +1 -1
  260. package/dist/spine/processors.js.map +1 -1
  261. package/dist/spine/reckoners.d.ts +3 -6
  262. package/dist/spine/reckoners.d.ts.map +1 -1
  263. package/dist/spine/reckoners.js +3 -6
  264. package/dist/spine/reckoners.js.map +1 -1
  265. package/dist/spine/reference-frame.d.ts +14 -14
  266. package/dist/spine/reference-frame.d.ts.map +1 -1
  267. package/dist/spine/reference-frame.js +3 -64
  268. package/dist/spine/reference-frame.js.map +1 -1
  269. package/dist/spine/settings-registry.d.ts +17 -9
  270. package/dist/spine/settings-registry.d.ts.map +1 -1
  271. package/dist/spine/settings-registry.js.map +1 -1
  272. package/dist/spine/settings-tabs.d.ts +4 -3
  273. package/dist/spine/settings-tabs.d.ts.map +1 -1
  274. package/dist/spine/settings-tabs.js.map +1 -1
  275. package/dist/spine/target-range-reckoning.d.ts.map +1 -1
  276. package/dist/spine/target-range-reckoning.js.map +1 -1
  277. package/dist/spine/timeline-store.d.ts +3 -1
  278. package/dist/spine/timeline-store.d.ts.map +1 -1
  279. package/dist/spine/timeline-store.js +2 -2
  280. package/dist/spine/timeline-store.js.map +1 -1
  281. package/dist/spine/topic-ownership.d.ts +2 -2
  282. package/dist/spine/topic-ownership.js +2 -2
  283. package/dist/spine/uplink-clients.d.ts +4 -4
  284. package/dist/spine/uplink-clients.d.ts.map +1 -1
  285. package/dist/spine/uplink-clients.js +1 -0
  286. package/dist/spine/uplink-clients.js.map +1 -1
  287. package/dist/spine/use-body-states.d.ts +3 -7
  288. package/dist/spine/use-body-states.d.ts.map +1 -1
  289. package/dist/spine/use-body-states.js +3 -7
  290. package/dist/spine/use-body-states.js.map +1 -1
  291. package/dist/spine/use-command.d.ts.map +1 -1
  292. package/dist/spine/use-command.js +151 -109
  293. package/dist/spine/use-command.js.map +1 -1
  294. package/dist/spine/use-data-sources.d.ts +2 -5
  295. package/dist/spine/use-data-sources.d.ts.map +1 -1
  296. package/dist/spine/use-data-sources.js.map +1 -1
  297. package/dist/spine/use-late-telemetry-subscribe.d.ts.map +1 -1
  298. package/dist/spine/use-late-telemetry-subscribe.js +1 -0
  299. package/dist/spine/use-late-telemetry-subscribe.js.map +1 -1
  300. package/dist/spine/use-orbit-curve.d.ts +33 -0
  301. package/dist/spine/use-orbit-curve.d.ts.map +1 -0
  302. package/dist/spine/use-orbit-curve.js +28 -0
  303. package/dist/spine/use-orbit-curve.js.map +1 -0
  304. package/dist/spine/use-orbit-trajectory.d.ts +6 -1
  305. package/dist/spine/use-orbit-trajectory.d.ts.map +1 -1
  306. package/dist/spine/use-orbit-trajectory.js +44 -2
  307. package/dist/spine/use-orbit-trajectory.js.map +1 -1
  308. package/dist/spine/use-selected-vantage.d.ts.map +1 -1
  309. package/dist/spine/use-selected-vantage.js +1 -0
  310. package/dist/spine/use-selected-vantage.js.map +1 -1
  311. package/dist/spine/use-system-instant.d.ts +16 -0
  312. package/dist/spine/use-system-instant.d.ts.map +1 -0
  313. package/dist/spine/use-system-instant.js +20 -0
  314. package/dist/spine/use-system-instant.js.map +1 -0
  315. package/dist/spine/use-transmissions.d.ts.map +1 -1
  316. package/dist/spine/use-transmissions.js +1 -0
  317. package/dist/spine/use-transmissions.js.map +1 -1
  318. package/dist/spine/view-clock.d.ts +1 -1
  319. package/dist/spine/view-clock.d.ts.map +1 -1
  320. package/dist/spine/view-clock.js +13 -3
  321. package/dist/spine/view-clock.js.map +1 -1
  322. package/dist/system-instant.d.ts +16 -0
  323. package/dist/system-instant.d.ts.map +1 -0
  324. package/dist/system-instant.js +20 -0
  325. package/dist/system-instant.js.map +1 -0
  326. package/dist/testing/console-logger.d.ts +3 -3
  327. package/dist/testing/console-logger.js +3 -3
  328. package/dist/testing/fake-wall-clock.d.ts +4 -2
  329. package/dist/testing/fake-wall-clock.d.ts.map +1 -1
  330. package/dist/testing/fake-wall-clock.js +4 -2
  331. package/dist/testing/fake-wall-clock.js.map +1 -1
  332. package/dist/testing/install-act-gate-stretch.d.ts +9 -0
  333. package/dist/testing/install-act-gate-stretch.d.ts.map +1 -1
  334. package/dist/testing/install-act-gate-stretch.js +9 -0
  335. package/dist/testing/install-act-gate-stretch.js.map +1 -1
  336. package/dist/testing/install-real-test-host.d.ts +4 -1
  337. package/dist/testing/install-real-test-host.d.ts.map +1 -1
  338. package/dist/testing/install-real-test-host.js +2 -0
  339. package/dist/testing/install-real-test-host.js.map +1 -1
  340. package/dist/testing/memory-storage.d.ts +2 -3
  341. package/dist/testing/memory-storage.d.ts.map +1 -1
  342. package/dist/testing/memory-storage.js +6 -5
  343. package/dist/testing/memory-storage.js.map +1 -1
  344. package/dist/testing/mock-data-source.d.ts +2 -2
  345. package/dist/testing/render.d.ts +4 -2
  346. package/dist/testing/render.d.ts.map +1 -1
  347. package/dist/testing/render.js +4 -2
  348. package/dist/testing/render.js.map +1 -1
  349. package/dist/testing/stub-transport.d.ts +6 -0
  350. package/dist/testing/stub-transport.d.ts.map +1 -1
  351. package/dist/testing/stub-transport.js +64 -52
  352. package/dist/testing/stub-transport.js.map +1 -1
  353. package/dist/timeline.d.ts +14 -6
  354. package/dist/timeline.d.ts.map +1 -1
  355. package/dist/topic-fields.d.ts +1 -0
  356. package/dist/topic-fields.d.ts.map +1 -1
  357. package/dist/topic-fields.js.map +1 -1
  358. package/dist/topics.d.ts +42 -2
  359. package/dist/topics.d.ts.map +1 -1
  360. package/dist/topics.js +33 -24
  361. package/dist/topics.js.map +1 -1
  362. package/dist/unit-system/registry.d.ts +11 -0
  363. package/dist/unit-system/registry.d.ts.map +1 -1
  364. package/dist/unit-system/registry.js.map +1 -1
  365. package/dist/unit-system/value.d.ts +3 -0
  366. package/dist/unit-system/value.d.ts.map +1 -1
  367. package/dist/unit-system/value.js.map +1 -1
  368. package/dist/units.js +1 -1
  369. package/dist/uplink-externals.d.ts +9 -4
  370. package/dist/uplink-externals.d.ts.map +1 -1
  371. package/dist/uplink-externals.js +9 -4
  372. package/dist/uplink-externals.js.map +1 -1
  373. package/dist/uplink-manifest.d.ts +62 -16
  374. package/dist/uplink-manifest.d.ts.map +1 -1
  375. package/dist/uplink-manifest.js.map +1 -1
  376. package/package.json +4 -3
  377. package/src/__generated__/command-map.ts +140 -10
  378. package/src/__generated__/contract.ts +598 -429
  379. package/src/__generated__/error-codes.ts +76 -69
  380. package/src/__generated__/test-theme.ts +3 -0
  381. package/src/__generated__/topic-map.ts +92 -0
  382. package/src/__generated__/units.json +630 -52
  383. package/src/__generated__/units.ts +89 -47
  384. package/src/api/alarm-request.ts +7 -1
  385. package/src/api/contribution-slots.ts +95 -20
  386. package/src/api/coverage/CoverageMaskCache.ts +1 -1
  387. package/src/api/coverage-source.ts +3 -1
  388. package/src/api/framework-reads.ts +29 -0
  389. package/src/api/host.ts +13 -4
  390. package/src/api/index.ts +113 -14
  391. package/src/api/logger.ts +14 -2
  392. package/src/api/plot-layers.ts +72 -6
  393. package/src/api/plots.ts +19 -0
  394. package/src/api/registry.ts +11 -0
  395. package/src/api/settings/SettingsContext.tsx +17 -5
  396. package/src/api/settings/SettingsService.ts +3 -0
  397. package/src/api/settings/store.ts +3 -1
  398. package/src/api/slots.ts +97 -28
  399. package/src/api/station-brokers.ts +2 -1
  400. package/src/api/stock-bodies.ts +6 -0
  401. package/src/api/tiny-size.ts +6 -1
  402. package/src/api/tone.ts +7 -4
  403. package/src/api/transport.ts +13 -2
  404. package/src/api/types.ts +214 -154
  405. package/src/binary-frame.ts +26 -25
  406. package/src/client.ts +2 -0
  407. package/src/combine-readings.ts +8 -4
  408. package/src/command-delay.ts +6 -0
  409. package/src/compat-versions.ts +2 -2
  410. package/src/contract-enum-names.ts +2 -3
  411. package/src/enum-names.ts +5 -3
  412. package/src/envelope.ts +9 -1
  413. package/src/flight/BufferedDataSource.ts +4 -2
  414. package/src/flight/types.ts +3 -2
  415. package/src/frames/index.ts +29 -16
  416. package/src/index.ts +32 -0
  417. package/src/ksp-enum-names.ts +23 -8
  418. package/src/media/radio-support.ts +12 -3
  419. package/src/perf/PerfBudget.ts +8 -6
  420. package/src/reading.ts +20 -4
  421. package/src/spine/body-pose.ts +251 -0
  422. package/src/spine/capability-lock.ts +17 -4
  423. package/src/spine/catalogue-elements.ts +75 -0
  424. package/src/spine/celestial-facts.ts +10 -35
  425. package/src/spine/client-timeline.ts +10 -12
  426. package/src/spine/client.ts +127 -19
  427. package/src/spine/command-gate.ts +13 -11
  428. package/src/spine/command-group.ts +278 -0
  429. package/src/spine/comms-delay-reckoning.ts +2 -2
  430. package/src/spine/comms-journey.ts +29 -0
  431. package/src/spine/comms-path-geometry.ts +4 -4
  432. package/src/spine/connection-error-warning.ts +1 -1
  433. package/src/spine/context.tsx +4 -0
  434. package/src/spine/contributions.ts +13 -13
  435. package/src/spine/core-reckoners.ts +2 -5
  436. package/src/spine/held-command-actions.ts +18 -6
  437. package/src/spine/impact-point.ts +8 -35
  438. package/src/spine/index.ts +5 -0
  439. package/src/spine/kepler-reckoning.ts +2 -2
  440. package/src/spine/kepler.ts +9 -7
  441. package/src/spine/lagrange.ts +6 -6
  442. package/src/spine/lifecycle.ts +14 -0
  443. package/src/spine/lock-scope.ts +11 -1
  444. package/src/spine/map-command.ts +3 -11
  445. package/src/spine/mod-settings.ts +1 -0
  446. package/src/spine/never-reckonable.ts +8 -6
  447. package/src/spine/orbit-patches.ts +33 -6
  448. package/src/spine/orbit-trajectory.ts +172 -57
  449. package/src/spine/orbital-solve.ts +1 -1
  450. package/src/spine/own-craft-vantage.tsx +1 -0
  451. package/src/spine/past-track.ts +7 -7
  452. package/src/spine/phase-angle.ts +51 -0
  453. package/src/spine/powered-reckoning.ts +16 -16
  454. package/src/spine/processors.ts +4 -1
  455. package/src/spine/reckoners.ts +3 -6
  456. package/src/spine/reference-frame.ts +49 -115
  457. package/src/spine/settings-registry.ts +17 -9
  458. package/src/spine/settings-tabs.ts +4 -3
  459. package/src/spine/target-range-reckoning.ts +3 -3
  460. package/src/spine/timeline-store.ts +6 -1
  461. package/src/spine/topic-ownership.ts +2 -2
  462. package/src/spine/uplink-clients.ts +5 -4
  463. package/src/spine/use-body-states.ts +3 -7
  464. package/src/spine/use-command.ts +167 -125
  465. package/src/spine/use-data-sources.ts +2 -5
  466. package/src/spine/use-late-telemetry-subscribe.ts +1 -0
  467. package/src/spine/use-orbit-curve.ts +49 -0
  468. package/src/spine/use-orbit-trajectory.ts +54 -2
  469. package/src/spine/use-selected-vantage.ts +1 -0
  470. package/src/spine/use-system-instant.ts +20 -0
  471. package/src/spine/use-transmissions.ts +1 -0
  472. package/src/spine/view-clock.ts +20 -3
  473. package/src/system-instant.ts +20 -0
  474. package/src/testing/console-logger.ts +3 -3
  475. package/src/testing/fake-wall-clock.ts +4 -2
  476. package/src/testing/install-act-gate-stretch.ts +9 -0
  477. package/src/testing/install-real-test-host.ts +6 -1
  478. package/src/testing/memory-storage.ts +6 -5
  479. package/src/testing/mock-data-source.ts +2 -2
  480. package/src/testing/render.tsx +4 -2
  481. package/src/testing/stub-transport.ts +66 -52
  482. package/src/timeline.ts +14 -6
  483. package/src/topic-fields.ts +1 -0
  484. package/src/topics.ts +59 -26
  485. package/src/unit-system/registry.ts +11 -0
  486. package/src/unit-system/value.ts +3 -0
  487. package/src/units.ts +1 -1
  488. package/src/uplink-externals.ts +9 -4
  489. package/src/uplink-manifest.ts +62 -16
@@ -36,10 +36,11 @@ export interface StreamBinary {
36
36
  meta: Meta;
37
37
  }
38
38
  /**
39
- * Args for `system.bodies.statesAt`: where one body is at each of a list of
40
- * instants, from the propagation provider in use on this install. The instants
41
- * are the caller's own, such as the departure and arrival times a transfer
42
- * search tries.
39
+ * Ask where a body is at each of a list of instants. Args for
40
+ * `system.bodies.statesAt`: where one body is at each of a list of instants,
41
+ * from the propagation provider in use on this install. The instants are the
42
+ * caller's own, such as the departure and arrival times a transfer search
43
+ * tries.
43
44
  *
44
45
  * The command centre is the sender's, taken from the connection the command
45
46
  * arrives on; there is no field to name another.
@@ -144,14 +145,15 @@ export interface BodyState {
144
145
  vz: Value<"m/s">;
145
146
  }
146
147
  /**
147
- * `career.strategy.activate`'s args: the strategy's stable id plus the slider
148
- * fraction to activate it at. `ActivateStrategyArgs.strategyId` is
149
- * `StrategyConfig.Name` (e.g. `"OutsourceRnDStrategy"`): the same id
150
- * `career.status` publishes for each strategy as `strategies[].id`, so a
151
- * client activates using the id it read. `ActivateStrategyArgs.factor` is the
152
- * 0 to 1 slider fraction the strategy is committed at (its up-front funds,
153
- * science and reputation cost scales with it); a strategy with no factor
154
- * slider ignores it and activates at its fixed factor.
148
+ * Activate a strategy at a chosen commitment. `career.strategy.activate`'s
149
+ * args: the strategy's stable id plus the slider fraction to activate it at.
150
+ * `ActivateStrategyArgs.strategyId` is `StrategyConfig.Name` (e.g.
151
+ * `"OutsourceRnDStrategy"`): the same id `career.status` publishes for each
152
+ * strategy as `strategies[].id`, so a client activates using the id it read.
153
+ * `ActivateStrategyArgs.factor` is the 0 to 1 slider fraction the strategy is
154
+ * committed at (its up-front funds, science and reputation cost scales with
155
+ * it); a strategy with no factor slider ignores it and activates at its fixed
156
+ * factor.
155
157
  *
156
158
  * @category Command arguments
157
159
  */
@@ -165,8 +167,9 @@ export interface ActivateStrategyArgs {
165
167
  factor: number;
166
168
  }
167
169
  /**
168
- * `career.strategy.deactivate`'s args: the strategy's stable
169
- * `StrategyConfig.Name` id (see `ActivateStrategyArgs.strategyId`).
170
+ * Deactivate an active strategy. `career.strategy.deactivate`'s args: the
171
+ * strategy's stable `StrategyConfig.Name` id (see
172
+ * `ActivateStrategyArgs.strategyId`).
170
173
  *
171
174
  * @category Command arguments
172
175
  */
@@ -178,9 +181,9 @@ export interface DeactivateStrategyArgs {
178
181
  strategyId: string;
179
182
  }
180
183
  /**
181
- * `career.tech.unlock`'s args: the tech node's `techID`, the same id
182
- * `career.status` publishes for each tech node as `tech.nodes[].id`. Unlocking
183
- * deducts the node's science cost.
184
+ * Unlock a tech node, spending its science cost. `career.tech.unlock`'s args:
185
+ * the tech node's `techID`, the same id `career.status` publishes for each
186
+ * tech node as `tech.nodes[].id`. Unlocking deducts the node's science cost.
184
187
  *
185
188
  * @category Command arguments
186
189
  */
@@ -192,10 +195,11 @@ export interface UnlockTechArgs {
192
195
  techId: string;
193
196
  }
194
197
  /**
195
- * Args shared by `career.contract.accept`/`decline`/`cancel`: the contract's
196
- * stable `ContractID` as a string, the same id `career.status` publishes for
197
- * each contract as `contracts[].id`. Which of the three verbs is valid depends
198
- * on the contract's current state (accept/decline require an offered contract,
198
+ * Accept, decline or cancel a contract. Args shared by
199
+ * `career.contract.accept`/`decline`/`cancel`: the contract's stable
200
+ * `ContractID` as a string, the same id `career.status` publishes for each
201
+ * contract as `contracts[].id`. Which of the three verbs is valid depends on
202
+ * the contract's current state (accept/decline require an offered contract,
199
203
  * cancel an active one); an out-of-state request comes back
200
204
  * `CommandErrorCode.ModeUnavailable`.
201
205
  *
@@ -209,8 +213,9 @@ export interface ContractActionArgs {
209
213
  contractId: string;
210
214
  }
211
215
  /**
212
- * `career.facility.upgrade`'s args: the facility's `SpaceCenterFacility` enum
213
- * name (e.g. `"VehicleAssemblyBuilding"`, `"LaunchPad"`), the same key
216
+ * Raise a Space Center facility by one tier. `career.facility.upgrade`'s args:
217
+ * the facility's `SpaceCenterFacility` enum name (e.g.
218
+ * `"VehicleAssemblyBuilding"`, `"LaunchPad"`), the same key
214
219
  * `CareerFacilities`'s `facilities` map uses on the `career.facilities`
215
220
  * channel (the buildings are not on `career.status`). Upgrading raises the
216
221
  * facility one tier and deducts its upgrade cost from funds.
@@ -225,8 +230,9 @@ export interface UpgradeFacilityArgs {
225
230
  facilityId: string;
226
231
  }
227
232
  /**
228
- * `career.crew.hire`'s args: the applicant's `ProtoCrewMember.name`, the same
229
- * id `spaceCenter.astronautComplex` publishes for each applicant as
233
+ * Hire an applicant into the crew roster. `career.crew.hire`'s args: the
234
+ * applicant's `ProtoCrewMember.name`, the same id
235
+ * `spaceCenter.astronautComplex` publishes for each applicant as
230
236
  * `applicants[].name`, so a client hires the applicant it read. Hiring debits
231
237
  * the current recruit cost from funds and moves the applicant into the crew
232
238
  * roster. An applicant that has left the pool since it was read (someone else
@@ -245,6 +251,7 @@ export interface HireApplicantArgs {
245
251
  applicantName: string;
246
252
  }
247
253
  /**
254
+ * Fire a hired kerbal, returning them to the applicant pool.
248
255
  * `career.crew.fire`'s args: a hired kerbal's `ProtoCrewMember.name`, the same
249
256
  * id `spaceCenter.crewRoster` publishes for each roster entry. Firing costs
250
257
  * nothing and returns the kerbal to the applicant pool, so it is reversible: a
@@ -293,10 +300,10 @@ export declare enum GameMode {
293
300
  Unknown = 3
294
301
  }
295
302
  /**
296
- * The `career.mode` channel payload: the active save's `GameMode`, as `{
297
- * "mode": <int> }`. The whole payload is `null` when no game is loaded (main
298
- * menu, no save). Once a save is loaded the mode is always one of the four
299
- * `GameMode` members.
303
+ * The `career.mode` Topic payload: the active save's `GameMode`, as `{ "mode":
304
+ * <int> }`. The whole payload is `null` when no game is loaded (main menu, no
305
+ * save). Once a save is loaded the mode is always one of the four `GameMode`
306
+ * members.
300
307
  *
301
308
  * @category Career
302
309
  */
@@ -305,10 +312,10 @@ export interface CareerMode {
305
312
  mode: GameMode;
306
313
  }
307
314
  /**
308
- * The `career.status` channel payload: the KSC and career-mode snapshot, in
309
- * four groups (balances, contracts, strategies, tech). The space centre's
310
- * buildings are not here: they are on `CareerFacilities`, which can be held on
311
- * its own while this channel keeps arriving.
315
+ * The `career.status` Topic payload: the KSC and career-mode snapshot, in four
316
+ * groups (balances, contracts, strategies, tech). The space centre's buildings
317
+ * are not here: they are on `CareerFacilities`, which can be held on its own
318
+ * while this channel keeps arriving.
312
319
  *
313
320
  * **Three states.** The whole payload is `null` in a sandbox save, where there
314
321
  * is no career at all. A non-null payload with a sub-group `null` means career
@@ -361,7 +368,7 @@ export interface CareerStatus {
361
368
  meta: PayloadMeta;
362
369
  }
363
370
  /**
364
- * The `career.facilities` channel payload: the space centre's buildings, each
371
+ * The `career.facilities` Topic payload: the space centre's buildings, each
365
372
  * with the tier it stands at and the ladder it stands on.
366
373
  *
367
374
  * **When it arrives.** A facility's tier count and prices are readable from
@@ -897,7 +904,7 @@ export interface ChannelEmissionReport {
897
904
  * CommNet home nodes (KSC, Extra Ground Stations, Kerbal Konstructs sites) and
898
905
  * crewed control-source vessels.
899
906
  *
900
- * The channel payload is a bare array of these entries, like
907
+ * The Topic payload is a bare array of these entries, like
901
908
  * `SpaceCenterPoiEntry`, one per centre, keyed by `CommandCentreEntry.id`.
902
909
  *
903
910
  * Each command centre is sent its own roster, the centres it knows of. A
@@ -993,7 +1000,7 @@ export interface CommandCentreEntry {
993
1000
  * station whose node went away, a crewed vessel that lost its crew or was
994
1001
  * destroyed or recovered.
995
1002
  *
996
- * The channel payload is a bare array of these entries, one per remembered
1003
+ * The Topic payload is a bare array of these entries, one per remembered
997
1004
  * centre that is currently off the roster, keyed by
998
1005
  * `UnreachableCentreEntry.id`. A centre that comes back leaves this channel
999
1006
  * and rejoins the roster, and a centre that has not been on the roster since
@@ -1445,9 +1452,11 @@ export interface CommcastMessageSendArgs {
1445
1452
  author: CommcastAuthor;
1446
1453
  }
1447
1454
  /**
1448
- * What `commcast.message.send` did with a message: who it left for, and who it
1449
- * could not leave for. It says nothing of arrival, which only each listener's
1450
- * acknowledgement does.
1455
+ * What `commcast.message.send`, the command that says a text message to a
1456
+ * group (its args are `CommcastMessageSendArgs`), did with a message: which
1457
+ * command centres it left for, and which it could not leave for. A centre is a
1458
+ * `commandCentre.roster` entry, a place commands are sent from. It says
1459
+ * nothing of arrival, which only each listener's acknowledgement does.
1451
1460
  *
1452
1461
  * @category Command results
1453
1462
  * @categoryDescription Command results
@@ -1456,14 +1465,15 @@ export interface CommcastMessageSendArgs {
1456
1465
  */
1457
1466
  export interface CommcastSendReceipt {
1458
1467
  /**
1459
- * Every centre the message left for, the speaker's own included, in ordinal id
1460
- * order. The same list its listeners read as the message's `to`.
1468
+ * Every centre the message left for, the speaker's own included, sorted by id.
1469
+ * The same list its listeners read as the message's `to`.
1461
1470
  */
1462
1471
  addressed: string[];
1463
1472
  /**
1464
1473
  * Every member it was meant for that no signal from the speaker could reach
1465
- * when it was said, in ordinal id order. The message never left for these, so
1466
- * no wait will bring an acknowledgement from them.
1474
+ * when it was said, sorted by id. The message was never sent to these centres,
1475
+ * so none of them will ever acknowledge it; to reach them, send it again later
1476
+ * naming them in `to`.
1467
1477
  */
1468
1478
  unreached: string[];
1469
1479
  }
@@ -1709,8 +1719,9 @@ export interface CommsConnectivity {
1709
1719
  * The `comms.signal` payload: the active vessel's own reading of its link,
1710
1720
  * from the elected comms backend. A strength from 0 to 1 whose meaning depends
1711
1721
  * on the backend: stock CommNet reports a coarse fraction of the link's range,
1712
- * RealAntennas how much headroom the link has over its data rate. Nothing on
1713
- * the wire says which, so compare values only within one install.
1722
+ * RealAntennas how much headroom the link has over its data rate.
1723
+ * `CommsSignal.quantity` says which, so a reader names the figure correctly
1724
+ * and never compares two that are different quantities.
1714
1725
  *
1715
1726
  * Each command centre is sent its own, the newest reading to have reached it.
1716
1727
  * A reading is of the vessel's whole path at one instant, so it reaches a
@@ -1736,6 +1747,13 @@ export interface CommsSignal {
1736
1747
  */
1737
1748
  strength: Value<"ratio">;
1738
1749
  /**
1750
+ * Which quantity `CommsSignal.strength` is: a fraction of the link's range, a
1751
+ * fraction of its data-rate headroom, or a stand-in where no link is modelled.
1752
+ * A strength worked out for a path carries the quantity its hops were stated
1753
+ * in, and `SignalQuantity.Unknown` where they disagree.
1754
+ */
1755
+ quantity: SignalQuantity;
1756
+ /**
1739
1757
  * Whether `CommsSignal.strength` is worked out and not measured. A command
1740
1758
  * centre is sent the strength of the path it believes in. Where the active
1741
1759
  * vessel's radio last reported on that very path, the reported strength is
@@ -1767,6 +1785,35 @@ export interface CommsSignal {
1767
1785
  measuredPath?: CommsMeasuredPath | null;
1768
1786
  }
1769
1787
  /**
1788
+ * Which quantity a signal strength from 0 to 1 is. Two backends that both
1789
+ * report "0 to 1" are not saying the same thing, and a figure is only
1790
+ * comparable with another of the same quantity.
1791
+ *
1792
+ * @category Comms
1793
+ */
1794
+ export declare enum SignalQuantity {
1795
+ /**
1796
+ * Nothing says which: the hops of a worked-out path disagree, or a read
1797
+ * failed.
1798
+ */
1799
+ Unknown = 0,
1800
+ /**
1801
+ * How far inside its range the link is, 0 at the edge of range and 1 at no
1802
+ * distance: stock CommNet's.
1803
+ */
1804
+ RangeFraction = 1,
1805
+ /**
1806
+ * How much headroom the link has over its data rate, 0 where the lowest rate
1807
+ * fails and 1 at the top of the ladder: RealAntennas'.
1808
+ */
1809
+ DataRateHeadroom = 2,
1810
+ /**
1811
+ * A stand-in: the save models no comms network, so there is no link to grade
1812
+ * and the figure is 1.
1813
+ */
1814
+ NoModel = 3
1815
+ }
1816
+ /**
1770
1817
  * A path a vessel's radio reported a strength on, as the nodes it runs
1771
1818
  * through. It is the path the game had the vessel on when the radio was read,
1772
1819
  * which a command centre may not believe in.
@@ -1898,6 +1945,11 @@ export interface CommsHop {
1898
1945
  */
1899
1946
  strength?: Value<"ratio"> | null;
1900
1947
  /**
1948
+ * Which quantity `CommsHop.strength` is, as the comms backend stated it for
1949
+ * this hop. Null exactly when `CommsHop.strength` is.
1950
+ */
1951
+ quantity?: SignalQuantity | null;
1952
+ /**
1901
1953
  * The provider-namespaced extension bag: how the elected comms backend carries
1902
1954
  * per-hop facts this shared shape does not declare (see
1903
1955
  * ProviderExtensionBagAttribute for the whole mechanism). A RealAntennas
@@ -1917,20 +1969,25 @@ export interface CommsHop {
1917
1969
  extensions?: ProviderExtensions;
1918
1970
  }
1919
1971
  /**
1920
- * The `comms.path` payload: the active vessel's path as the receiving command
1921
- * centre believes it to stand now. Ordered hops from the active vessel to the
1972
+ * The `comms.path` payload: the route the active vessel's samples take to the
1973
+ * receiving command centre. Ordered hops from the active vessel to the
1922
1974
  * receiving centre itself, or, for the home centre, to whichever ground
1923
1975
  * station the signal reaches first. An empty `CommsPath.hops` means the centre
1924
1976
  * knows of no path that is open all the way now, which includes a path that
1925
1977
  * would have the signal wait at a relay (`comms.route` says where it would
1926
1978
  * wait).
1927
1979
  *
1928
- * Each command centre is sent its own, and no other centre's. It is worked out
1929
- * from that centre's contact plan, which is made of what the centre has heard
1930
- * of each craft, so a hop changes here only once the news of it has reached
1931
- * the centre: a relay that drops out is still on the path until its silence
1932
- * has crossed to you. Nothing is sent until the centre has a contact plan, so
1933
- * the topic is absent, not empty, for the first moments of a session.
1980
+ * Each command centre is sent its own, and no other centre's. Where the game
1981
+ * routes the vessel's samples to the centre (at home, the vessel's own path to
1982
+ * the ground), the hops are that route, the one `comms.delay` and the arrival
1983
+ * of every sample are timed over. Where the game states no route, they are
1984
+ * worked out from that centre's contact plan, which is made of what the centre
1985
+ * has heard of each craft, so a hop changes here only once the news of it has
1986
+ * reached the centre: a relay that drops out is still on the path until its
1987
+ * silence has crossed to you. Predictions (`comms.route`, held commands,
1988
+ * cancel deadlines) are always the plan's. Nothing is sent until the centre
1989
+ * has a contact plan or a game route, so the topic is absent, not empty, for
1990
+ * the first moments of a session.
1934
1991
  *
1935
1992
  * Not reckonable: a route changes in steps (a relay drops below the horizon
1936
1993
  * and the whole chain re-solves to different hops), and every reckoning basis
@@ -2056,13 +2113,14 @@ export declare enum CommsDelaySource {
2056
2113
  * `connected:true`.
2057
2114
  *
2058
2115
  * Each command centre is sent its own, and no other centre's. It is the
2059
- * light-time of the active vessel's path as the receiving centre believes it
2060
- * to stand, which is the path that centre is sent on `comms.path`, so the two
2061
- * always agree. The path is worked out from what the centre has heard of each
2062
- * craft, so the figure moves only once the news that moves it has reached the
2063
- * centre: a relay that drops out goes on counting towards the delay until its
2064
- * silence has crossed to you. A zero that is a setting (delay switched off, or
2065
- * a save with no comms network) is sent at once.
2116
+ * light-time of the active vessel's path that centre is sent on `comms.path`,
2117
+ * so the two always agree. Where the game routes the vessel's samples to the
2118
+ * centre (at home, the vessel's own path to the ground), that path is the
2119
+ * game's route and this is the delay the samples arrive by. Wherever the game
2120
+ * states no route, it is the path the centre's own plan has, worked out from
2121
+ * what the centre has heard of each craft, so the figure moves only once the
2122
+ * news that moves it has reached the centre. A zero that is a setting (delay
2123
+ * switched off, or a save with no comms network) is sent at once.
2066
2124
  *
2067
2125
  * @category Comms
2068
2126
  */
@@ -2207,6 +2265,14 @@ export interface CommsContactPair {
2207
2265
  */
2208
2266
  windows: CommsContactWindow[];
2209
2267
  /**
2268
+ * The stretches in which either end could turn an idle dish to the other and
2269
+ * carry a message, in time order: the dish has no contact on its own aim then,
2270
+ * the turned dish would close the link, and the other end could already
2271
+ * receive. A message held at the turning node may use one; nothing else does.
2272
+ * Empty when no dish would be turned or the backend turns none.
2273
+ */
2274
+ retargetWindows: CommsRetargetWindow[];
2275
+ /**
2210
2276
  * True while either end was last heard of with its orbit still changing. It is
2211
2277
  * reckoned on the orbit it reported mid-burn, which it has since left, so
2212
2278
  * these windows are a rough guide until its next report.
@@ -2223,6 +2289,35 @@ export interface CommsContactWindow {
2223
2289
  openUt?: Value<"ut"> | null;
2224
2290
  /** When contact ends, or `null` when it is still open at the pair's horizon. */
2225
2291
  closeUt?: Value<"ut"> | null;
2292
+ /**
2293
+ * The dish on the pair's `CommsContactPair.a` end that carries this stretch of
2294
+ * contact, as `"<nodeId>#<partPersistentId>/<ordinal>"`, or absent when that
2295
+ * end has no steered dish on it.
2296
+ */
2297
+ fromDish?: string;
2298
+ /**
2299
+ * The dish on the pair's `CommsContactPair.b` end that carries this stretch,
2300
+ * or absent.
2301
+ */
2302
+ toDish?: string;
2303
+ }
2304
+ /**
2305
+ * A stretch in which a node could turn an idle dish to a peer to carry a
2306
+ * message.
2307
+ *
2308
+ * @category Comms
2309
+ */
2310
+ export interface CommsRetargetWindow {
2311
+ /** The node that would turn, in the `commandCentre.roster` vocabulary. */
2312
+ node: string;
2313
+ /** The dish it would turn, as `"<nodeId>#<partPersistentId>/<ordinal>"`. */
2314
+ dish: string;
2315
+ /** The node it would turn the dish to. */
2316
+ peer: string;
2317
+ /** When the turn may start. */
2318
+ openUt: Value<"ut">;
2319
+ /** When the turned dish must be back on its own aim. */
2320
+ closeUt: Value<"ut">;
2226
2321
  }
2227
2322
  /**
2228
2323
  * The `comms.degrade` payload: how degraded the active vessel's link home is
@@ -2437,7 +2532,13 @@ export interface UplinkResendRequest {
2437
2532
  laneSeq: Value<"count">;
2438
2533
  }
2439
2534
  /**
2440
- * What a cancel or a send again did at this centre.
2535
+ * The reply to `system.uplink.cancel` (`UplinkCancelRequest`, stop a delayed
2536
+ * command still on its way to the craft) and to `system.uplink.resend`
2537
+ * (`UplinkResendRequest`, send a held or overdue command again). It reports
2538
+ * what the command centre that asked did, not what happened at the craft; that
2539
+ * arrives later as `comms.journey` reports (`CommsJourneyEvent`). A lane is
2540
+ * the ordered run of delayed commands one centre sends to one craft, and a
2541
+ * lane number is a command's place in it (`PendingUplink.laneSeq`).
2441
2542
  *
2442
2543
  * @category Command results
2443
2544
  */
@@ -2697,7 +2798,8 @@ export interface ControlFrameOption {
2697
2798
  targetFrameSelected?: boolean | null;
2698
2799
  }
2699
2800
  /**
2700
- * `system.frame.set`'s args: the frame to put the view in.
2801
+ * Put the view in a different reference frame. `system.frame.set`'s args: the
2802
+ * frame to put the view in.
2701
2803
  *
2702
2804
  * It names the two head bodies, not the sets: where `ControlFrame` reports
2703
2805
  * `PrimaryBodies` and `SecondaryBodies`, the mod that owns the view works out
@@ -2860,6 +2962,21 @@ export interface CrashFlightStats {
2860
2962
  liftOff: boolean;
2861
2963
  }
2862
2964
  /**
2965
+ * The payload for the `crash.hasRecent` channel: one flag saying a notable
2966
+ * crash is on record for the current save, published beside `CrashReport` on
2967
+ * `crash.lastCrash`. It is true from the first crash a flight records and is
2968
+ * not published before one.
2969
+ *
2970
+ * @category Flights
2971
+ */
2972
+ export interface CrashRecent {
2973
+ /**
2974
+ * True when a notable crash is on record, so `crash.lastCrash` has a report to
2975
+ * read.
2976
+ */
2977
+ recent: boolean;
2978
+ }
2979
+ /**
2863
2980
  * What a kerbal's place on the books is, as the dashboard means it: this
2864
2981
  * contract's own vocabulary, not a mirror of any game enum.
2865
2982
  *
@@ -3110,6 +3227,27 @@ export interface CommandRequest<Args> {
3110
3227
  sentAt: number;
3111
3228
  }
3112
3229
  /**
3230
+ * Several commands the client sends as one message: they travel together,
3231
+ * arrive whole or not at all, are refused together, and run in order within a
3232
+ * single physics tick. Each member is an ordinary `CommandRequest` with its
3233
+ * own `requestId`, and each is answered under that id as if it had been sent
3234
+ * alone.
3235
+ *
3236
+ * Every member must be a delayed command addressed to the same craft and sent
3237
+ * from the same command centre. A group that breaks either rule, or is empty,
3238
+ * is refused whole. If any member is refused for any reason, none is sent.
3239
+ *
3240
+ * @category Stream messages
3241
+ */
3242
+ export interface CommandGroupRequest {
3243
+ /** The frame type, always `"command-group"`. */
3244
+ type: "command-group";
3245
+ /** An id the client chooses for the group as a whole. */
3246
+ groupId: string;
3247
+ /** The commands, in the order they run. */
3248
+ members: CommandRequest<unknown>[];
3249
+ }
3250
+ /**
3113
3251
  * The server's reply to a `CommandRequest`, matched to it by
3114
3252
  * `CommandResponse.requestId`.
3115
3253
  *
@@ -3643,8 +3781,10 @@ export interface FleetSilenceEntry {
3643
3781
  predictionGraceSeconds?: Value<"s"> | null;
3644
3782
  }
3645
3783
  /**
3646
- * The fleet-wide silence roster on `fleet.silence`: every vessel the tracker
3647
- * holds a reckoning for, in one payload.
3784
+ * The fleet-wide silence roster on `fleet.silence`: every vessel still in the
3785
+ * game that the tracker holds a reckoning for, in one payload. A vessel that
3786
+ * has been destroyed leaves the roster; its last `silence.<guid>.state` says
3787
+ * it was lost as `destroyed`.
3648
3788
  *
3649
3789
  * A per-vessel topic can only be read by something that already knows which
3650
3790
  * vessel to ask for. This one static topic lists every vessel, so a consumer
@@ -3661,8 +3801,8 @@ export interface FleetSilenceEntry {
3661
3801
  */
3662
3802
  export interface FleetSilence {
3663
3803
  /**
3664
- * One entry per vessel the tracker holds a reckoning for, in no guaranteed
3665
- * order. Never null; empty when there are none.
3804
+ * One entry per vessel still in the game, in no guaranteed order. Never null;
3805
+ * empty when there are none.
3666
3806
  */
3667
3807
  vessels: FleetSilenceEntry[];
3668
3808
  }
@@ -3692,7 +3832,7 @@ export declare enum FlightEndReason {
3692
3832
  Destroyed = 3
3693
3833
  }
3694
3834
  /**
3695
- * The `flight.current` channel payload: a UT-indexed value, delivered
3835
+ * The `flight.current` Topic payload: a UT-indexed value, delivered
3696
3836
  * latest-wins and delayed like every `vessel.*` channel. It says which flight
3697
3837
  * is active and what phase it is in, for the vessel gonogo is reporting as
3698
3838
  * active. That is the vessel the game is flying, with one exception: a kerbal
@@ -3729,9 +3869,9 @@ export interface FlightCurrent {
3729
3869
  phase: Situation;
3730
3870
  }
3731
3871
  /**
3732
- * The `flight.started` channel payload: a reliable, ordered, delayed event
3733
- * sent when a new flight begins. A flight is new when its vessel id has not
3734
- * been started before in this game session (a launch, or a first switch onto a
3872
+ * The `flight.started` Topic payload: a reliable, ordered, delayed event sent
3873
+ * when a new flight begins. A flight is new when its vessel id has not been
3874
+ * started before in this game session (a launch, or a first switch onto a
3735
3875
  * vessel), and every vessel active just after a revert or a quickload starts a
3736
3876
  * new flight, even one with the same id.
3737
3877
  *
@@ -3760,7 +3900,7 @@ export interface FlightStarted {
3760
3900
  ut: Value<"ut">;
3761
3901
  }
3762
3902
  /**
3763
- * The `flight.ended` channel payload: a reliable, ordered, delayed event sent
3903
+ * The `flight.ended` Topic payload: a reliable, ordered, delayed event sent
3764
3904
  * once per flight when it stops being trackable: recovered, crashed, destroyed
3765
3905
  * or reverted. It shares the delay class of `crash.lastCrash` and
3766
3906
  * `recovery.lastSummary`, so an end that a rewind discards before its
@@ -3792,13 +3932,13 @@ export interface FlightEnded {
3792
3932
  ut: Value<"ut">;
3793
3933
  }
3794
3934
  /**
3795
- * The `flight.vesselChanged` channel payload: a reliable, ordered, delayed
3796
- * event sent whenever the active vessel changes after the first observation of
3797
- * the session (docking, undocking, a tracking-station reselect). Switching
3798
- * away from a vessel that is still flying does not end its flight, and
3799
- * switching back to a known one does not start a new one. Switching onto a
3800
- * vessel for the first time also sends `FlightStarted`. Going on EVA does not
3801
- * change the active vessel (see `FlightCurrent`).
3935
+ * The `flight.vesselChanged` Topic payload: a reliable, ordered, delayed event
3936
+ * sent whenever the active vessel changes after the first observation of the
3937
+ * session (docking, undocking, a tracking-station reselect). Switching away
3938
+ * from a vessel that is still flying does not end its flight, and switching
3939
+ * back to a known one does not start a new one. Switching onto a vessel for
3940
+ * the first time also sends `FlightStarted`. Going on EVA does not change the
3941
+ * active vessel (see `FlightCurrent`).
3802
3942
  *
3803
3943
  * @category Flights
3804
3944
  */
@@ -3818,10 +3958,11 @@ export interface FlightVesselChanged {
3818
3958
  ut: Value<"ut">;
3819
3959
  }
3820
3960
  /**
3821
- * `ksp.revertToEditor`'s args, which editor the flight reverts back into.
3822
- * `RevertToEditorArgs.editor` is a small opaque string (`"vab"` or `"sph"`,
3823
- * case-insensitive) rather than the KSP `EditorFacility` enum; an unrecognised
3824
- * value fails with `CommandErrorCode.Range` before the game is ever touched.
3961
+ * Revert the flight back into the VAB or SPH. `ksp.revertToEditor`'s args,
3962
+ * which editor the flight reverts back into. `RevertToEditorArgs.editor` is a
3963
+ * small opaque string (`"vab"` or `"sph"`, case-insensitive) rather than the
3964
+ * KSP `EditorFacility` enum; an unrecognised value fails with
3965
+ * `CommandErrorCode.Range` before the game is ever touched.
3825
3966
  *
3826
3967
  * `ksp.revertToLaunch`, `ksp.toTrackingStation`, `ksp.toSpaceCenter` and
3827
3968
  * `ksp.recover` take no args (they operate on the current flight / active
@@ -3837,9 +3978,10 @@ export interface RevertToEditorArgs {
3837
3978
  editor: string;
3838
3979
  }
3839
3980
  /**
3840
- * `ksp.switchVessel`'s args: the stable vessel id (`vessel.id.ToString()`, the
3841
- * same id `SetTargetArgs.vesselId` uses), never a roster array index. An empty
3842
- * id fails with `CommandErrorCode.NotFound` before the game is ever touched.
3981
+ * Switch the flight to another tracked vessel. `ksp.switchVessel`'s args: the
3982
+ * stable vessel id (`vessel.id.ToString()`, the same id
3983
+ * `SetTargetArgs.vesselId` uses), never a roster array index. An empty id
3984
+ * fails with `CommandErrorCode.NotFound` before the game is ever touched.
3843
3985
  * Works from the flight scene, where it changes the active vessel, and from
3844
3986
  * the Space Center and the Tracking Station, where it saves and then loads the
3845
3987
  * vessel's flight. Refused with `CommandErrorCode.WrongScene` from the editors
@@ -3913,6 +4055,7 @@ export interface SetFlyByWireArgs {
3913
4055
  enabled: boolean;
3914
4056
  }
3915
4057
  /**
4058
+ * Drive the held control axes of the fly-by-wire override.
3916
4059
  * `vessel.control.setAxes`'s args: a partial update of the held fly-by-wire
3917
4060
  * override. Every field is nullable, and only the fields you set change their
3918
4061
  * held value, so one axis can be driven on its own without disturbing the
@@ -3962,8 +4105,8 @@ export interface SetControlAxesArgs {
3962
4105
  rollTrim?: number;
3963
4106
  }
3964
4107
  /**
3965
- * The `game.dlc` channel payload: which KSP expansions ("DLC") are installed.
3966
- * A fact about the install, independent of scene, so a widget can tell "the
4108
+ * The `game.dlc` Topic payload: which KSP expansions ("DLC") are installed. A
4109
+ * fact about the install, independent of scene, so a widget can tell "the
3967
4110
  * player has no DLC" from "the DLC is present but nothing is deployed yet"
3968
4111
  * (deployed science, for instance, needs Breaking Ground).
3969
4112
  *
@@ -3977,8 +4120,8 @@ export interface SetControlAxesArgs {
3977
4120
  */
3978
4121
  export interface GameDlc {
3979
4122
  /**
3980
- * Whether the Breaking Ground expansion ("Serenity") is installed: deployed
3981
- * science, robotics and surface features.
4123
+ * Whether the Breaking Ground expansion is installed: deployed science,
4124
+ * robotics and surface features.
3982
4125
  */
3983
4126
  breakingGround: boolean;
3984
4127
  /**
@@ -4483,8 +4626,8 @@ export interface OrbitPayloadMeta {
4483
4626
  quality: Quality;
4484
4627
  }
4485
4628
  /**
4486
- * Where one Making History mission objective stands, defined by this contract
4487
- * rather than by KSP.
4629
+ * Where one Making History mission objective stands. Gonogo works this out
4630
+ * from the mission's progress: KSP itself keeps no per-objective state.
4488
4631
  *
4489
4632
  * On the wire it is an integer ordinal.
4490
4633
  *
@@ -4494,8 +4637,8 @@ export declare enum MissionObjectiveState {
4494
4637
  /** The mission has not reached this objective yet. */
4495
4638
  Pending = 0,
4496
4639
  /**
4497
- * The mission is on this objective now: it is the mission's active node and
4498
- * the mission is still running.
4640
+ * The mission is on this objective now: it is the step the mission is on now
4641
+ * and the mission is still running.
4499
4642
  */
4500
4643
  Active = 1,
4501
4644
  /**
@@ -4525,11 +4668,11 @@ export interface MissionObjectiveEntry {
4525
4668
  state?: MissionObjectiveState | null;
4526
4669
  }
4527
4670
  /**
4528
- * The `missions.active` channel payload: the Making History mission that is
4671
+ * The `missions.active` Topic payload: the Making History mission that is
4529
4672
  * running, or has just ended, in the current game. The whole payload is `null`
4530
4673
  * when there is no mission game, when no mission has been set up, or when the
4531
- * expansion is not installed; read `game.dlc` to tell the last from the
4532
- * others.
4674
+ * expansion is not installed; read the `game.dlc` Topic (`GameDlc`) to tell
4675
+ * the last from the others.
4533
4676
  *
4534
4677
  * A mission that has ended stays in the payload with `MissionStatus.finished`
4535
4678
  * true until the game leaves the mission, so a client can show the outcome.
@@ -4571,11 +4714,11 @@ export interface MissionStatus {
4571
4714
  * The mission's objectives in flow order. A node of the mission that nothing
4572
4715
  * leads to is left out. Empty when it has none.
4573
4716
  */
4574
- objectives?: MissionObjectiveEntry[] | null;
4717
+ objectives: MissionObjectiveEntry[];
4575
4718
  }
4576
4719
  /**
4577
- * The `settings.<uplink>` channel payload: one Uplink's host mod's own
4578
- * settings, as the Uplink read them.
4720
+ * The `settings.<uplink>` Topic payload: one Uplink's host mod's own settings,
4721
+ * as the Uplink read them.
4579
4722
  *
4580
4723
  * **One topic per Uplink**, declared only for an Uplink that implements
4581
4724
  * IModSettingsSource; its entry on `system.uplinks` says so with
@@ -4599,7 +4742,11 @@ export interface ModSettingsModel {
4599
4742
  * `ModSettingsModel.settings` is then empty.
4600
4743
  */
4601
4744
  failure?: string | null;
4602
- /** The game install's own configuration, about no vessel. */
4745
+ /**
4746
+ * The payload's provenance. Its `source` is always `"game"`: these settings
4747
+ * describe the game install, never a craft, and like the rest of this Topic
4748
+ * they are always current and never delayed.
4749
+ */
4603
4750
  meta: PayloadMeta;
4604
4751
  }
4605
4752
  /**
@@ -4660,10 +4807,11 @@ export interface WriteModSettingArgs {
4660
4807
  value: string;
4661
4808
  }
4662
4809
  /**
4663
- * The empty args shape, for the core commands that operate on the current
4664
- * flight or the active vessel and so take nothing: `vessel.control.stage`,
4665
- * `vessel.target.clear`, `ksp.recover`, `ksp.revertToLaunch`,
4666
- * `ksp.toTrackingStation` and `ksp.toSpaceCenter`.
4810
+ * Take no args: stage, clear the target, recover, revert to launch, or go to
4811
+ * the Tracking Station or Space Center. The empty args shape, for the core
4812
+ * commands that operate on the current flight or the active vessel and so take
4813
+ * nothing: `vessel.control.stage`, `vessel.target.clear`, `ksp.recover`,
4814
+ * `ksp.revertToLaunch`, `ksp.toTrackingStation` and `ksp.toSpaceCenter`.
4667
4815
  *
4668
4816
  * **Send no `args` at all for these six.** The SDK's `send()` takes no second
4669
4817
  * argument for a command typed this way, and anything you do put on the wire
@@ -4692,9 +4840,11 @@ export interface NoCommandArgs {
4692
4840
  * (`VesselOrbit.referenceBodyIndex` among them). `OrbitPatch.referenceBody`
4693
4841
  * and `OrbitPatch.closestEncounterBody` are the body's name, for display.
4694
4842
  *
4695
- * Every element is a plain, non-nullable double, unlike `VesselOrbit.lan` and
4696
- * `VesselOrbit.argPe`: a patch missing any element needed to propagate it is
4697
- * not sent at all, rather than sent with a stand-in.
4843
+ * `OrbitPatch.lan`, `OrbitPatch.argPe` and `OrbitPatch.meanAnomalyAtEpoch` are
4844
+ * null when KSP's value for them is undefined, as `VesselOrbit.lan` and
4845
+ * `VesselOrbit.argPe` are, and the patch is still sent. A patch with a null
4846
+ * element cannot be propagated, so a reader that propagates one declines to
4847
+ * rather than substituting a value.
4698
4848
  *
4699
4849
  * @category Orbits and trajectories
4700
4850
  */
@@ -4706,20 +4856,20 @@ export interface OrbitPatch {
4706
4856
  /** Inclination in degrees, KSP's `Orbit.inclination`. */
4707
4857
  inc: Value<"°">;
4708
4858
  /**
4709
- * Longitude of the ascending node in degrees, KSP's `Orbit.LAN`. `0` when
4859
+ * Longitude of the ascending node in degrees, KSP's `Orbit.LAN`. Null when
4710
4860
  * KSP's value is undefined (NaN).
4711
4861
  */
4712
- lan: Value<"°">;
4862
+ lan?: Value<"°"> | null;
4713
4863
  /**
4714
- * Argument of periapsis in degrees, KSP's `Orbit.argumentOfPeriapsis`. `0`
4864
+ * Argument of periapsis in degrees, KSP's `Orbit.argumentOfPeriapsis`. Null
4715
4865
  * when KSP's value is undefined (NaN).
4716
4866
  */
4717
- argPe: Value<"°">;
4867
+ argPe?: Value<"°"> | null;
4718
4868
  /**
4719
4869
  * Mean anomaly at `OrbitPatch.epoch` in radians, KSP's
4720
- * `Orbit.meanAnomalyAtEpoch`. `0` when KSP's value is undefined (NaN).
4870
+ * `Orbit.meanAnomalyAtEpoch`. Null when KSP's value is undefined (NaN).
4721
4871
  */
4722
- meanAnomalyAtEpoch: Value<"rad">;
4872
+ meanAnomalyAtEpoch?: Value<"rad"> | null;
4723
4873
  /**
4724
4874
  * The universal time at which `OrbitPatch.meanAnomalyAtEpoch` holds, KSP's
4725
4875
  * `Orbit.epoch`.
@@ -4942,154 +5092,24 @@ export interface PartActions {
4942
5092
  meta: PayloadMeta;
4943
5093
  }
4944
5094
  /**
4945
- * One deployable solar panel module in the `parts.power` payload's
4946
- * `solarPanels` array. A part with several panel modules contributes one entry
4947
- * per module. Every field is `null` when its value could not be read, never a
4948
- * sentinel.
4949
- *
4950
- * @category Parts
4951
- */
4952
- export interface SolarPanelEntry {
4953
- /**
4954
- * The part's display title (KSP's `Part.partInfo.title`), or its internal name
4955
- * when it has no part info.
4956
- */
4957
- partName?: string | null;
4958
- /**
4959
- * The part's `Part.flightID` as a string: unique per part for the life of the
4960
- * flight, so it tells apart symmetric parts that share a name. Null when the
4961
- * part has no flight id yet.
4962
- */
4963
- partId?: string | null;
4964
- /**
4965
- * The panel's deploy state, KSP's `ModuleDeployablePart.DeployState` name
4966
- * as-is: `"RETRACTED"`, `"EXTENDING"`, `"EXTENDED"`, `"RETRACTING"` or
4967
- * `"BROKEN"`.
4968
- */
4969
- deployState?: string | null;
4970
- /**
4971
- * The panel's current electric-charge output (KSP's `flowRate`), in EC per
4972
- * second. This is what counts toward `PartsPower.totalProductionEc`.
4973
- */
4974
- flowRate?: Value<"units/s"> | null;
4975
- /**
4976
- * The panel's rated charge rate from its part configuration (KSP's
4977
- * `chargeRate`), in EC per second, before sun exposure and distance are
4978
- * applied.
4979
- */
4980
- chargeRate?: Value<"units/s"> | null;
4981
- /**
4982
- * KSP's `ModuleDeployableSolarPanel.sunAOA`: despite the name and the declared
4983
- * unit, a sun-exposure factor from 0 (no sunlight on the panel) to 1 (facing
4984
- * the sun squarely), not an angle.
4985
- */
4986
- sunAOA?: Value<"°"> | null;
4987
- }
4988
- /**
4989
- * One electric-charge store in the `parts.power` payload's `batteries` array:
4990
- * every part with an `ElectricCharge` capacity above zero, so command pods and
4991
- * probe cores appear here as well as batteries. Every field is `null` when its
4992
- * value could not be read.
4993
- *
4994
- * @category Parts
4995
- */
4996
- export interface BatteryEntry {
4997
- /**
4998
- * The part's display title (KSP's `Part.partInfo.title`), or its internal name
4999
- * when it has no part info.
5000
- */
5001
- partName?: string | null;
5002
- /**
5003
- * The part's `Part.flightID` as a string, the same join key as
5004
- * `SolarPanelEntry.partId`. Null when the part has no flight id yet.
5005
- */
5006
- partId?: string | null;
5007
- /** Electric charge currently held in this part, in EC. */
5008
- current?: Value<"units"> | null;
5009
- /** This part's electric-charge capacity, in EC. */
5010
- max?: Value<"units"> | null;
5011
- }
5012
- /**
5013
- * One electric-charge-producing converter in the `parts.power` payload's
5014
- * `fuelCells` array: every `ModuleResourceConverter` whose outputs include
5015
- * `ElectricCharge`, one entry per module. Every field is `null` when its value
5016
- * could not be read.
5017
- *
5018
- * @category Parts
5019
- */
5020
- export interface FuelCellEntry {
5021
- /**
5022
- * The part's display title (KSP's `Part.partInfo.title`), or its internal name
5023
- * when it has no part info.
5024
- */
5025
- partName?: string | null;
5026
- /**
5027
- * The part's `Part.flightID` as a string, the same join key as
5028
- * `SolarPanelEntry.partId`. Null when the part has no flight id yet.
5029
- */
5030
- partId?: string | null;
5031
- /** True when the converter is switched on (KSP's `IsActivated`). */
5032
- active?: boolean | null;
5033
- /**
5034
- * The converter's own status text as KSP displays it
5035
- * (`ModuleResourceConverter.status`). Free text, not a fixed vocabulary.
5036
- */
5037
- status?: string | null;
5038
- }
5039
- /**
5040
- * One engine alternator module in the `parts.power` payload's `alternators`
5041
- * array. Every field is `null` when its value could not be read.
5042
- *
5043
- * @category Parts
5044
- */
5045
- export interface AlternatorEntry {
5046
- /**
5047
- * The part's display title (KSP's `Part.partInfo.title`), or its internal name
5048
- * when it has no part info.
5049
- */
5050
- partName?: string | null;
5051
- /**
5052
- * The part's `Part.flightID` as a string, the same join key as
5053
- * `SolarPanelEntry.partId`. Null when the part has no flight id yet.
5054
- */
5055
- partId?: string | null;
5056
- /**
5057
- * The alternator's current electric-charge output (KSP's
5058
- * `ModuleAlternator.outputRate`), in EC per second.
5059
- */
5060
- outputRate?: Value<"units/s"> | null;
5061
- }
5062
- /**
5063
- * The `parts.power` channel payload: the active vessel's electric-charge
5064
- * production surface (solar panels, batteries, fuel cells, engine alternators,
5065
- * and a rolled-up production total). A single object, or `null` when there is
5066
- * no active vessel or it carries none of the four kinds of part.
5067
- *
5068
- * When the payload is present all four arrays are present too, each possibly
5069
- * empty; they are typed nullable so a client stays safe if one is ever
5070
- * missing.
5095
+ * The `parts.power` Topic payload: the active vessel's rolled-up
5096
+ * electric-charge production. A single object, or `null` when there is no
5097
+ * active vessel or it carries no solar panel, battery, electric-charge
5098
+ * converter or alternator. The parts themselves are itemised on
5099
+ * `vessel.parts`.
5071
5100
  *
5072
5101
  * @category Parts
5073
5102
  */
5074
5103
  export interface PartsPower {
5075
- /** Every deployable solar panel module on the vessel. */
5076
- solarPanels?: SolarPanelEntry[] | null;
5077
- /** Every part that stores electric charge. */
5078
- batteries?: BatteryEntry[] | null;
5079
- /** Every converter module that produces electric charge. */
5080
- fuelCells?: FuelCellEntry[] | null;
5081
- /** Every engine alternator module on the vessel. */
5082
- alternators?: AlternatorEntry[] | null;
5083
5104
  /**
5084
5105
  * Total electric-charge production in EC per second: the sum of every solar
5085
- * panel's `SolarPanelEntry.flowRate` and every alternator's
5086
- * `AlternatorEntry.outputRate`. Fuel cells are not included. Null when no
5087
- * finite total could be read.
5106
+ * panel's live flow rate and every alternator's live output rate. Fuel cells
5107
+ * are not included. Null when no finite total could be read.
5088
5108
  */
5089
5109
  totalProductionEc?: Value<"units/s"> | null;
5090
5110
  }
5091
5111
  /**
5092
- * One entry in the `robotics.servos` channel payload, a single Breaking Ground
5112
+ * One entry in the `robotics.servos` Topic payload, a single Breaking Ground
5093
5113
  * robotic servo on the active vessel. The payload is a bare array of these, or
5094
5114
  * `null` when there is no active vessel or it carries no servo; read
5095
5115
  * `robotics.available` to tell those two apart.
@@ -5190,7 +5210,7 @@ export interface ServoEntry {
5190
5210
  maxTorque?: Value<"kN"> | null;
5191
5211
  }
5192
5212
  /**
5193
- * The `robotics.available` channel payload: a single object (or `null` when
5213
+ * The `robotics.available` Topic payload: a single object (or `null` when
5194
5214
  * there is no active vessel) whose one field states whether the active vessel
5195
5215
  * carries any Breaking Ground robotic servo. It is its own Topic because the
5196
5216
  * `robotics.servos` array is `null` both when the vessel has no robotic parts
@@ -5227,6 +5247,11 @@ export interface RoboticsAvailability {
5227
5247
  * unknown type publishes nothing. The four breakdown lists can be empty while
5228
5248
  * the totals are present, if KSP's dialog could not be read for them.
5229
5249
  *
5250
+ * A figure the save cannot award is `null`, never 0: funds and science are
5251
+ * null in a Sandbox save (and funds in a Science save). A Sandbox recovery
5252
+ * still produces a record, with the craft, where it came down, its parts and
5253
+ * its crew, and nothing awarded.
5254
+ *
5230
5255
  * @category Flights
5231
5256
  */
5232
5257
  export interface RecoveryReport {
@@ -5244,23 +5269,27 @@ export interface RecoveryReport {
5244
5269
  * multiplier for landing precision.
5245
5270
  */
5246
5271
  recoveryFactor: string;
5247
- /** Science this recovery earned, as KSP's recovery dialog totals it. */
5248
- scienceEarned: Value<"science">;
5249
5272
  /**
5250
- * The career's science balance as the recovery dialog reports it. 0 in a save
5251
- * with no science (Sandbox).
5273
+ * Science this recovery earned, as KSP's recovery dialog totals it. Null in a
5274
+ * save with no science (Sandbox).
5275
+ */
5276
+ scienceEarned?: Value<"science"> | null;
5277
+ /**
5278
+ * The career's science balance as the recovery dialog reports it. Null in a
5279
+ * save with no science (Sandbox).
5252
5280
  */
5253
- totalScience: Value<"science">;
5281
+ totalScience?: Value<"science"> | null;
5254
5282
  /**
5255
5283
  * Funds this recovery earned, after the recovery factor and any strategy
5256
- * modifiers KSP applies to a recovery.
5284
+ * modifiers KSP applies to a recovery. Null in a save with no funds (Science
5285
+ * or Sandbox).
5257
5286
  */
5258
- fundsEarned: Value<"funds">;
5287
+ fundsEarned?: Value<"funds"> | null;
5259
5288
  /**
5260
- * The career's funds balance as the recovery dialog reports it. 0 in a save
5289
+ * The career's funds balance as the recovery dialog reports it. Null in a save
5261
5290
  * with no funds (Science or Sandbox).
5262
5291
  */
5263
- totalFunds: Value<"funds">;
5292
+ totalFunds?: Value<"funds"> | null;
5264
5293
  /**
5265
5294
  * Reputation this recovery earned, after any strategy modifiers KSP applies.
5266
5295
  * Show it only when `RecoveryReport.displayReputation` is true.
@@ -5328,19 +5357,22 @@ export interface RecoveryPartEntry {
5328
5357
  partTitle: string;
5329
5358
  /** How many parts are in this group. At least 1. */
5330
5359
  count: Value<"count">;
5331
- /** The recovered dry value of one part in the group, excluding its resources. */
5332
- partValue: Value<"funds">;
5360
+ /**
5361
+ * The recovered dry value of one part in the group, excluding its resources.
5362
+ * Null in a save with no funds.
5363
+ */
5364
+ partValue?: Value<"funds"> | null;
5333
5365
  /**
5334
5366
  * The recovered value of the resources the group's parts held, summed over the
5335
- * group.
5367
+ * group. Null in a save with no funds.
5336
5368
  */
5337
- resourcesValue: Value<"funds">;
5369
+ resourcesValue?: Value<"funds"> | null;
5338
5370
  /**
5339
5371
  * The group's recovered dry value: `RecoveryPartEntry.partValue` times
5340
5372
  * `RecoveryPartEntry.count`. Does not include
5341
- * `RecoveryPartEntry.resourcesValue`.
5373
+ * `RecoveryPartEntry.resourcesValue`. Null in a save with no funds.
5342
5374
  */
5343
- totalValue: Value<"funds">;
5375
+ totalValue?: Value<"funds"> | null;
5344
5376
  }
5345
5377
  /**
5346
5378
  * One recovered-resource group: an entry of
@@ -5377,17 +5409,35 @@ export interface RecoveryCrewEntry {
5377
5409
  trait: string;
5378
5410
  /** Whether the kerbal is a tourist, who earns no experience. */
5379
5411
  isTourist: boolean;
5380
- /** Experience points this flight added. */
5381
- xpGained: Value<"count">;
5412
+ /**
5413
+ * Experience points this flight added. Null in a save that awards no
5414
+ * experience (Sandbox).
5415
+ */
5416
+ xpGained?: Value<"count"> | null;
5382
5417
  /**
5383
5418
  * How many experience levels this flight added: `RecoveryCrewEntry.newLevel`
5384
- * minus the level before.
5419
+ * minus the level before. Null in a save that awards no experience (Sandbox).
5385
5420
  */
5386
- levelsGained: Value<"count">;
5421
+ levelsGained?: Value<"count"> | null;
5387
5422
  /** The kerbal's experience level after this flight, 0 to 5 in stock. */
5388
5423
  newLevel: Value<"count">;
5389
5424
  }
5390
5425
  /**
5426
+ * The payload for the `recovery.hasRecent` channel: one flag saying a vessel
5427
+ * recovery is on record for the current save, published beside
5428
+ * `RecoveryReport` on `recovery.lastSummary`. It is true from the first
5429
+ * recovery of a real craft and is not published before one.
5430
+ *
5431
+ * @category Flights
5432
+ */
5433
+ export interface RecoveryRecent {
5434
+ /**
5435
+ * True when a recovery is on record, so `recovery.lastSummary` has a summary
5436
+ * to read.
5437
+ */
5438
+ recent: boolean;
5439
+ }
5440
+ /**
5391
5441
  * The `ksp.revertAvailability` Topic payload: whether the two stock in-flight
5392
5442
  * revert actions are available right now, so a widget can enable its Revert to
5393
5443
  * Launch and Revert to Editor controls exactly when KSP's own pause menu shows
@@ -5416,28 +5466,47 @@ export interface RevertAvailability {
5416
5466
  canRevertToLaunch: boolean;
5417
5467
  }
5418
5468
  /**
5419
- * Args for `robotics.servo.setTarget`: the absolute angle (hinge) or extension
5420
- * (piston) to drive to, keyed by the part's `ServoSetTargetArgs.partId`.
5421
- * `ServoSetTargetArgs.partId` is the same `flightID` string `parts.robotics`
5469
+ * Drive a hinge or rotation servo to an angle. Args for
5470
+ * `robotics.servo.setAngle`: the absolute angle a hinge or rotation servo is
5471
+ * to drive to, keyed by the part's `ServoSetAngleArgs.partId`.
5472
+ * `ServoSetAngleArgs.partId` is the same `flightID` string `parts.robotics`
5422
5473
  * publishes on each servo entry, so a widget sends back the exact id it
5423
- * displays. A rotor has no target (it spins continuously); a `setTarget` aimed
5424
- * at one fails with `CommandResult.errorCode`
5425
- * `CommandErrorCode.ModeUnavailable`.
5474
+ * displays. A piston has no angle and a rotor no target: a `setAngle` aimed at
5475
+ * either fails with `CommandResult.errorCode`
5476
+ * `CommandErrorCode.CapabilityMismatch`.
5426
5477
  *
5427
5478
  * @category Command arguments
5428
5479
  */
5429
- export interface ServoSetTargetArgs {
5480
+ export interface ServoSetAngleArgs {
5430
5481
  /**
5431
5482
  * The part's `flightID.ToString()`: the id the read side stamps on each
5432
5483
  * `parts.robotics` entry.
5433
5484
  */
5434
5485
  partId: string;
5435
- /** Absolute target: hinge angle (degrees) or piston extension. */
5436
- value: number;
5486
+ /** The absolute target angle. */
5487
+ degrees: number;
5488
+ }
5489
+ /**
5490
+ * Drive a piston to an extension. Args for `robotics.servo.setExtension`: the
5491
+ * absolute extension a piston is to drive to, keyed by the part's
5492
+ * `ServoSetExtensionArgs.partId`. A hinge or rotation servo has no extension
5493
+ * and a rotor no target: a `setExtension` aimed at one fails with
5494
+ * `CommandResult.errorCode` `CommandErrorCode.CapabilityMismatch`.
5495
+ *
5496
+ * @category Command arguments
5497
+ */
5498
+ export interface ServoSetExtensionArgs {
5499
+ /**
5500
+ * The part's `flightID.ToString()`: the id the read side stamps on each
5501
+ * `parts.robotics` entry.
5502
+ */
5503
+ partId: string;
5504
+ /** The absolute target extension. */
5505
+ metres: number;
5437
5506
  }
5438
5507
  /**
5439
- * Args shared by every robotics boolean actuation
5440
- * (`robotics.servo.setMotor`/`setLock` and
5508
+ * Switch a robotics servo or rotor motor or lock on or off. Args shared by
5509
+ * every robotics boolean actuation (`robotics.servo.setMotor`/`setLock` and
5441
5510
  * `robotics.rotor.setMotor`/`setLock`): an absolute state to apply, never a
5442
5511
  * toggle, like every other actuation command (see `SetEnabledArgs`). Keyed by
5443
5512
  * `ServoSetEnabledArgs.partId`, the `flightID` string `parts.robotics`
@@ -5460,25 +5529,51 @@ export interface ServoSetEnabledArgs {
5460
5529
  enabled: boolean;
5461
5530
  }
5462
5531
  /**
5463
- * Args for the rotor scalar-limit commands
5464
- * (`robotics.rotor.setRpmLimit`/`setTorqueLimit`/`setBrake`): the absolute
5465
- * value to apply, keyed by `RotorSetValueArgs.partId`. The bounded ones
5466
- * (torque 0 to 100, brake 0 to 200) are range-checked; a value out of range
5467
- * fails with `CommandErrorCode.Range`.
5532
+ * Set a rotor's rpm cap. Args for `robotics.rotor.setRpmLimit`: the absolute
5533
+ * rpm cap to apply, keyed by `RotorSetRpmLimitArgs.partId`.
5468
5534
  *
5469
5535
  * @category Command arguments
5470
5536
  */
5471
- export interface RotorSetValueArgs {
5537
+ export interface RotorSetRpmLimitArgs {
5472
5538
  /**
5473
5539
  * The part's `flightID.ToString()`: the id the read side stamps on each
5474
5540
  * `parts.robotics` entry.
5475
5541
  */
5476
5542
  partId: string;
5543
+ /** The rpm cap to apply, in revolutions per minute. */
5544
+ rpm: number;
5545
+ }
5546
+ /**
5547
+ * Set a rotor's torque limit. Args for `robotics.rotor.setTorqueLimit`: the
5548
+ * absolute torque limit to apply, keyed by `RotorSetTorqueLimitArgs.partId`. A
5549
+ * value outside 0 to 100 fails with `CommandErrorCode.Range`.
5550
+ *
5551
+ * @category Command arguments
5552
+ */
5553
+ export interface RotorSetTorqueLimitArgs {
5477
5554
  /**
5478
- * The absolute value to apply: the rpm limit, the torque-limit percent (0 to
5479
- * 100), or the brake percent (0 to 200).
5555
+ * The part's `flightID.ToString()`: the id the read side stamps on each
5556
+ * `parts.robotics` entry.
5480
5557
  */
5481
- value: number;
5558
+ partId: string;
5559
+ /** The torque limit as a percentage of the rotor's maximum torque, 0 to 100. */
5560
+ percent: number;
5561
+ }
5562
+ /**
5563
+ * Set a rotor's brake strength. Args for `robotics.rotor.setBrake`: the
5564
+ * absolute brake strength to apply, keyed by `RotorSetBrakeArgs.partId`. A
5565
+ * value outside 0 to 200 fails with `CommandErrorCode.Range`.
5566
+ *
5567
+ * @category Command arguments
5568
+ */
5569
+ export interface RotorSetBrakeArgs {
5570
+ /**
5571
+ * The part's `flightID.ToString()`: the id the read side stamps on each
5572
+ * `parts.robotics` entry.
5573
+ */
5574
+ partId: string;
5575
+ /** The brake strength as KSP's brake percentage, 0 to 200. */
5576
+ percent: number;
5482
5577
  }
5483
5578
  /**
5484
5579
  * Args for `robotics.rotor.reverse`: flips the rotor's spin direction. It is
@@ -5999,13 +6094,13 @@ export interface ScetAddressableTopic {
5999
6094
  topic: string;
6000
6095
  }
6001
6096
  /**
6002
- * Args shared by every science-experiment actuation command
6003
- * (`science.experiment.deploy` and `science.experiment.transmit`): the
6004
- * experiment is named by `ExperimentActionArgs.partId`, the part's
6005
- * `flightID.ToString()`, the same id `science.instruments` carries on each
6006
- * experiment entry. It is looked up among the active vessel's parts, never by
6007
- * array index. An empty or unknown `ExperimentActionArgs.partId` fails with
6008
- * `CommandErrorCode.NotFound`.
6097
+ * Deploy or transmit a science experiment on a part. Args shared by every
6098
+ * science-experiment actuation command (`science.experiment.deploy` and
6099
+ * `science.experiment.transmit`): the experiment is named by
6100
+ * `ExperimentActionArgs.partId`, the part's `flightID.ToString()`, the same id
6101
+ * `science.instruments` carries on each experiment entry. It is looked up
6102
+ * among the active vessel's parts, never by array index. An empty or unknown
6103
+ * `ExperimentActionArgs.partId` fails with `CommandErrorCode.NotFound`.
6009
6104
  *
6010
6105
  * @category Command arguments
6011
6106
  */
@@ -6052,7 +6147,7 @@ export interface ScienceTransmission {
6052
6147
  dataAmount: Value<"Mit">;
6053
6148
  }
6054
6149
  /**
6055
- * One entry in the `science.experiments` channel payload: a single stored
6150
+ * One entry in the `science.experiments` Topic payload: a single stored
6056
6151
  * science result on the active vessel, held either by the science module that
6057
6152
  * collected it or by a container part. The channel payload is a bare array of
6058
6153
  * these (`ExperimentEntry[]`) or `null`, never a wrapper object. The whole
@@ -6164,7 +6259,7 @@ export interface ExperimentEntry {
6164
6259
  extensions?: ProviderExtensions;
6165
6260
  }
6166
6261
  /**
6167
- * One entry in the `science.instruments` channel payload: a single
6262
+ * One entry in the `science.instruments` Topic payload: a single
6168
6263
  * `ModuleScienceExperiment` on the active vessel, as an inventory and status
6169
6264
  * row keyed by `InstrumentEntry.partId` (the part's KSP `flightID`).
6170
6265
  *
@@ -6175,8 +6270,8 @@ export interface ExperimentEntry {
6175
6270
  * rerunnable, resettable, collectable) an operator needs to decide what to run
6176
6271
  * next.
6177
6272
  *
6178
- * The channel payload is a bare array (`InstrumentEntry[]`) or `null` when
6179
- * there is no active vessel or it carries no experiment module. Every field is
6273
+ * The Topic payload is a bare array (`InstrumentEntry[]`) or `null` when there
6274
+ * is no active vessel or it carries no experiment module. Every field is
6180
6275
  * nullable, and is `null` whenever the raw value is absent.
6181
6276
  *
6182
6277
  * @category Science
@@ -6243,11 +6338,11 @@ export interface InstrumentEntry {
6243
6338
  extensions?: ProviderExtensions;
6244
6339
  }
6245
6340
  /**
6246
- * One entry in the `science.lab` channel payload: a Mobile Processing Lab
6247
- * (KSP's `ModuleScienceLab`) on the active vessel. The channel payload is a
6248
- * bare array (`LabEntry[]`) or `null` when there is no active vessel or it
6249
- * carries no lab. Every field is nullable, and is `null` whenever the raw
6250
- * value is absent or non-finite.
6341
+ * One entry in the `science.lab` Topic payload: a Mobile Processing Lab (KSP's
6342
+ * `ModuleScienceLab`) on the active vessel. The channel payload is a bare
6343
+ * array (`LabEntry[]`) or `null` when there is no active vessel or it carries
6344
+ * no lab. Every field is nullable, and is `null` whenever the raw value is
6345
+ * absent or non-finite.
6251
6346
  *
6252
6347
  * @category Science
6253
6348
  */
@@ -6317,10 +6412,10 @@ export interface LabEntry {
6317
6412
  extensions?: ProviderExtensions;
6318
6413
  }
6319
6414
  /**
6320
- * One entry in the `deployed.bases` channel payload: a Breaking Ground
6321
- * deployed-science experiment (`ModuleGroundExperiment`). The channel payload
6322
- * is a bare array (`DeployedEntry[]`) or `null` when no loaded vessel carries
6323
- * a deployed experiment (including an install without Breaking Ground).
6415
+ * One entry in the `deployed.bases` Topic payload: a Breaking Ground
6416
+ * deployed-science experiment (`ModuleGroundExperiment`). The Topic payload is
6417
+ * a bare array (`DeployedEntry[]`) or `null` when no loaded vessel carries a
6418
+ * deployed experiment (including an install without Breaking Ground).
6324
6419
  *
6325
6420
  * Unlike the `science.*` channels, `deployed.bases` covers every loaded
6326
6421
  * vessel, not just the active one: a deployed cluster is its own ground
@@ -6469,11 +6564,11 @@ export declare enum DeployedPowerState {
6469
6564
  NotConnected = 4
6470
6565
  }
6471
6566
  /**
6472
- * One entry in the `science.sensors` channel payload: a single
6567
+ * One entry in the `science.sensors` Topic payload: a single
6473
6568
  * environmental-sensor module (`ModuleEnviroSensor`: thermometer, barometer,
6474
6569
  * gravioli detector, accelerometer, and any modded sensor sharing the module)
6475
- * on the active vessel. The channel payload is a bare array (`SensorEntry[]`)
6476
- * or `null` when there is no active vessel or it carries no sensor module.
6570
+ * on the active vessel. The Topic payload is a bare array (`SensorEntry[]`) or
6571
+ * `null` when there is no active vessel or it carries no sensor module.
6477
6572
  *
6478
6573
  * One entry per sensor module, with `SensorEntry.type` carrying the raw
6479
6574
  * `SensorType` enum name (`TEMP`/`PRES`/`GRAV`/`ACC`/...) as a string, so
@@ -6509,18 +6604,17 @@ export interface SensorEntry {
6509
6604
  active?: boolean | null;
6510
6605
  }
6511
6606
  /**
6512
- * One entry in the `science.experimentBreakdown` channel payload: a
6513
- * per-subject rollup of the stored science results that `science.experiments`
6514
- * lists one row per result. One row per distinct subject id: several stored
6515
- * results for the same subject (for example two crew reports from the same
6516
- * biome) collapse into one entry with `ExperimentBreakdownEntry.dataMits`
6517
- * summed across them.
6607
+ * One entry in the `science.experimentBreakdown` Topic payload: a per-subject
6608
+ * rollup of the stored science results that `science.experiments` lists one
6609
+ * row per result. One row per distinct subject id: several stored results for
6610
+ * the same subject (for example two crew reports from the same biome) collapse
6611
+ * into one entry with `ExperimentBreakdownEntry.dataMits` summed across them.
6518
6612
  *
6519
- * The channel payload is a bare array (`ExperimentBreakdownEntry[]`) or
6520
- * `null`, never a wrapper object. The whole array is `null` when there is no
6521
- * active vessel or the vessel holds no stored science data; there is no
6522
- * separate empty-array state. Every field is nullable, and is `null` whenever
6523
- * the raw value is absent or non-finite.
6613
+ * The Topic payload is a bare array (`ExperimentBreakdownEntry[]`) or `null`,
6614
+ * never a wrapper object. The whole array is `null` when there is no active
6615
+ * vessel or the vessel holds no stored science data; there is no separate
6616
+ * empty-array state. Every field is nullable, and is `null` whenever the raw
6617
+ * value is absent or non-finite.
6524
6618
  *
6525
6619
  * `ExperimentBreakdownEntry.biome` and `ExperimentBreakdownEntry.situation`
6526
6620
  * are parsed from the subject id by KSP's
@@ -6583,12 +6677,12 @@ export interface ExperimentBreakdownEntry {
6583
6677
  extensions?: ProviderExtensions;
6584
6678
  }
6585
6679
  /**
6586
- * One entry in the `science.archive` channel payload: a single subject out of
6680
+ * One entry in the `science.archive` Topic payload: a single subject out of
6587
6681
  * the whole-career R&D archive (`ResearchAndDevelopment.GetSubjects()`). That
6588
6682
  * is every subject the career has ever collected or recovered, across every
6589
6683
  * mission and every body, not scoped to the active vessel.
6590
6684
  *
6591
- * The channel payload is a bare array (`ArchiveEntry[]`), or `null` when the
6685
+ * The Topic payload is a bare array (`ArchiveEntry[]`), or `null` when the
6592
6686
  * save has no R&D to walk (Sandbox mode). A save with R&D but nothing
6593
6687
  * collected yet emits an empty array, so an empty array and `null` mean
6594
6688
  * different things here.
@@ -6642,7 +6736,7 @@ export interface ArchiveEntry {
6642
6736
  subjectValue?: Value<"1"> | null;
6643
6737
  }
6644
6738
  /**
6645
- * The `settings.gonogo` channel payload: every setting the mod and its Uplinks
6739
+ * The `settings.gonogo` Topic payload: every setting the mod and its Uplinks
6646
6740
  * declared, what each holds now, and whether the settings file on the KSP
6647
6741
  * machine holds the same.
6648
6742
  *
@@ -6650,8 +6744,9 @@ export interface ArchiveEntry {
6650
6744
  * row's own description, so a setting an Uplink adds needs no client code of
6651
6745
  * its own.
6652
6746
  *
6653
- * It is never delayed by light time: a setting configures the system the
6654
- * operator is sitting at, not a craft.
6747
+ * It is never delayed by light time, the time a signal takes to cross between
6748
+ * a craft and the command centre (the screen an operator sends commands from):
6749
+ * a setting configures the system the operator is sitting at, not a craft.
6655
6750
  *
6656
6751
  * This is where a client learns whether a save landed. The `settings.save`
6657
6752
  * command can time out and still land, so read the outcome here, never from
@@ -6662,7 +6757,10 @@ export interface ArchiveEntry {
6662
6757
  * Settings as the stream carries them: Gonogo's own, its Uplinks', and a host
6663
6758
  * mod's own settings read through its Uplink. Each row says what it may hold,
6664
6759
  * what it holds now and whether it can be written, and the model says whether
6665
- * the settings file on the KSP machine agrees.
6760
+ * the settings file on the KSP machine agrees. A client reads Gonogo's with
6761
+ * `useTelemetry("settings.gonogo")` and a host mod's with
6762
+ * `useModSettings(uplinkId)`; a setting that lives only in the browser is
6763
+ * declared with `registerSetting` instead.
6666
6764
  */
6667
6765
  export interface SettingsModel {
6668
6766
  /**
@@ -6782,8 +6880,9 @@ export interface SettingsDeclarationFailure {
6782
6880
  reason: string;
6783
6881
  }
6784
6882
  /**
6785
- * Arguments to `settings.save`: one Save press, applied together and written
6786
- * to the settings file once. Never delayed by light time.
6883
+ * Apply the settings from one Save press together and write the settings file
6884
+ * once. Arguments to `settings.save`: one Save press, applied together and
6885
+ * written to the settings file once. Never delayed by light time.
6787
6886
  *
6788
6887
  * Safe to send again. A save sets each row to the value named, so repeating
6789
6888
  * one that already landed changes nothing. That matters because a save that
@@ -6885,7 +6984,7 @@ export interface LaunchSiteEntry {
6885
6984
  padVesselTitle?: string | null;
6886
6985
  }
6887
6986
  /**
6888
- * The `spaceCenter.scene` channel payload: the single current KSP game scene.
6987
+ * The `spaceCenter.scene` Topic payload: the single current KSP game scene.
6889
6988
  * `SpaceCenterScene.scene` carries exactly one of the six strings
6890
6989
  * `{"Flight","SpaceCenter","Editor","TrackingStation","MainMenu","Other"}`:
6891
6990
  * KSP's `GameScenes` enum folded onto that fixed set, with any scene outside
@@ -7126,9 +7225,9 @@ export interface SavedShipEntry {
7126
7225
  missingParts?: string[] | null;
7127
7226
  }
7128
7227
  /**
7129
- * The `spaceCenter.partsAvailable` channel payload: a wrapper carrying the
7130
- * count of parts the player can place right now (tech-unlocked and purchased
7131
- * in career; the full `PartLoader` catalogue in sandbox).
7228
+ * The `spaceCenter.partsAvailable` Topic payload: a wrapper carrying the count
7229
+ * of parts the player can place right now (tech-unlocked and purchased in
7230
+ * career; the full `PartLoader` catalogue in sandbox).
7132
7231
  *
7133
7232
  * A wrapper object, because a bare scalar has no Topic shape: read
7134
7233
  * `spaceCenter.partsAvailable.count`. The whole payload is `null` when no
@@ -7144,8 +7243,8 @@ export interface SpaceCenterPartsAvailable {
7144
7243
  count?: Value<"count"> | null;
7145
7244
  }
7146
7245
  /**
7147
- * The `spaceCenter.astronautComplex` channel payload: the Astronaut Complex
7148
- * hire tab, the rolling pool of applicants the operator can recruit, plus the
7246
+ * The `spaceCenter.astronautComplex` Topic payload: the Astronaut Complex hire
7247
+ * tab, the rolling pool of applicants the operator can recruit, plus the
7149
7248
  * roster-cap context a hire is gated on.
7150
7249
  *
7151
7250
  * A wrapper object, not a bare array, so the applicant list arrives with the
@@ -7320,7 +7419,7 @@ export interface StageDeltaVEntry {
7320
7419
  } | null;
7321
7420
  }
7322
7421
  /**
7323
- * The `dv.summary` channel payload: the whole-vessel ΔV rollup KSP's stock
7422
+ * The `dv.summary` Topic payload: the whole-vessel ΔV rollup KSP's stock
7324
7423
  * `VesselDeltaV` exposes alongside the per-stage `StageDeltaVEntry` list: the
7325
7424
  * ΔV-producing stage count plus the vacuum, sea-level and current totals and
7326
7425
  * total burn time. A single object, or `null` when the stock simulation is not
@@ -7349,7 +7448,7 @@ export interface StageDeltaVSummary {
7349
7448
  totalBurnTime?: Value<"s"> | null;
7350
7449
  }
7351
7450
  /**
7352
- * The `system.bodies` channel payload: every celestial body in the game, as a
7451
+ * The `system.bodies` Topic payload: every celestial body in the game, as a
7353
7452
  * tree, wrapped as `{ "bodies": [ ... ] }`. The whole payload is `null`, not
7354
7453
  * an empty list, when no sample has been taken yet, so "no data yet" and "zero
7355
7454
  * bodies" stay distinct.
@@ -7594,7 +7693,7 @@ export interface OrbitEntry {
7594
7693
  epoch?: Value<"ut"> | null;
7595
7694
  }
7596
7695
  /**
7597
- * The `system.vessels` channel payload: every vessel the receiving command
7696
+ * The `system.vessels` Topic payload: every vessel the receiving command
7598
7697
  * centre knows of, wrapped as `{ "vessels": [ ... ] }`. Like `SystemBodies`,
7599
7698
  * it carries no per-payload `Meta`: that rides the envelope.
7600
7699
  *
@@ -7865,8 +7964,8 @@ export interface TargetListEntry {
7865
7964
  orbitBodyIndex?: number | null;
7866
7965
  }
7867
7966
  /**
7868
- * The `target.available` channel payload: the list of everything targetable
7869
- * from the active vessel, as the active vessel knows it. Wrapper object `{
7967
+ * The `target.available` Topic payload: the list of everything targetable from
7968
+ * the active vessel, as the active vessel knows it. Wrapper object `{
7870
7969
  * "entries": [ ... ] }`, like `system.vessels`.
7871
7970
  *
7872
7971
  * A vessel is on the list once the active vessel has come to know of it, by
@@ -7896,7 +7995,7 @@ export interface TargetAvailable {
7896
7995
  entries: TargetListEntry[];
7897
7996
  }
7898
7997
  /**
7899
- * The `time.calendar` channel payload: how long a minute, hour, day and year
7998
+ * The `time.calendar` Topic payload: how long a minute, hour, day and year
7900
7999
  * are, and what real-world instant UT 0 is (when the game has one), as the
7901
8000
  * running game defines them.
7902
8001
  *
@@ -7959,13 +8058,14 @@ export interface TimeCalendar {
7959
8058
  * deadline can be shown as `14 Mar 1957` rather than `Y3 D122`.
7960
8059
  *
7961
8060
  * It is read from the date formatter itself. Formatters that model a real
7962
- * calendar (RSSTimeFormatter, Kronometer) hold an anchor date; the stock
7963
- * formatter holds none.
8061
+ * calendar hold an anchor date: RSS installs RSSTimeFormatter, which does, and
8062
+ * Kronometer can. The stock formatter holds none.
7964
8063
  *
7965
8064
  * `null` is the normal value, and it is not zero. Stock KSP has no real
7966
- * calendar: its own UI prints Year 1, Day 1, and so should every consumer.
7967
- * That holds for a planet pack too whenever no date-based formatter is
7968
- * installed alongside it. Do not render a default anchor for those games.
8065
+ * calendar: its own UI prints Year 1, Day 1, and so should every consumer. A
8066
+ * planet pack that changes the day length without installing a date-based
8067
+ * formatter has no anchor either. Do not render a default anchor for those
8068
+ * games.
7969
8069
  */
7970
8070
  epoch?: string | null;
7971
8071
  /**
@@ -8237,8 +8337,12 @@ export interface PendingUplink {
8237
8337
  */
8238
8338
  attempts: Value<"count">;
8239
8339
  /**
8240
- * The `PendingUplink.id` of every command sent together with this one, itself
8241
- * included. Currently always one entry, its own.
8340
+ * The commands this entry stands for. A command sent alone lists its own
8341
+ * `PendingUplink.id`. A group sent with `command-group` is one entry on one
8342
+ * lane number and lists the `requestId` of each member as the client sent it,
8343
+ * in the order they run, with the first also on
8344
+ * `PendingUplink.clientRequestId`; its `PendingUplink.label` joins the
8345
+ * members' labels.
8242
8346
  */
8243
8347
  members: string[];
8244
8348
  }
@@ -8299,9 +8403,9 @@ export interface Vec3 {
8299
8403
  z: number;
8300
8404
  }
8301
8405
  /**
8302
- * The `vessel.attitude` channel payload: pitch, heading and roll of the
8303
- * vessel's control reference (`Vessel.GetTransform()`) against the local
8304
- * surface up and north, in two named frames.
8406
+ * The `vessel.attitude` Topic payload: pitch, heading and roll of the vessel's
8407
+ * control reference (`Vessel.GetTransform()`) against the local surface up and
8408
+ * north, in two named frames.
8305
8409
  *
8306
8410
  * `VesselAttitude.pitch`, `VesselAttitude.heading` and `VesselAttitude.roll`
8307
8411
  * are the primary frame, with up and north measured at `Vessel.CoM` (MechJeb's
@@ -8339,6 +8443,7 @@ export interface VesselAttitude {
8339
8443
  meta: PayloadMeta;
8340
8444
  }
8341
8445
  /**
8446
+ * Switch SAS, RCS, landing gear, brakes, lights or the abort group on or off.
8342
8447
  * Args shared by every plain on/off actuation command (`setSas`, `setRcs`,
8343
8448
  * `setGear`, `setBrakes`, `setLights`, `setAbort`): an absolute state to
8344
8449
  * apply, never a toggle. Under light-time delay a toggle that arrives after
@@ -8352,7 +8457,8 @@ export interface SetEnabledArgs {
8352
8457
  enabled: boolean;
8353
8458
  }
8354
8459
  /**
8355
- * `vessel.control.setSasMode`'s arguments: the SAS mode to hold.
8460
+ * Set the SAS mode to hold. `vessel.control.setSasMode`'s arguments: the SAS
8461
+ * mode to hold.
8356
8462
  *
8357
8463
  * @category Command arguments
8358
8464
  */
@@ -8361,7 +8467,8 @@ export interface SetSasModeArgs {
8361
8467
  mode: SasMode;
8362
8468
  }
8363
8469
  /**
8364
- * `vessel.control.setThrottle`'s arguments: the main throttle setting.
8470
+ * Set the main throttle. `vessel.control.setThrottle`'s arguments: the main
8471
+ * throttle setting.
8365
8472
  *
8366
8473
  * @category Command arguments
8367
8474
  */
@@ -8391,9 +8498,9 @@ export interface SetActionGroupArgs {
8391
8498
  state: boolean;
8392
8499
  }
8393
8500
  /**
8394
- * `vessel.maneuver.add`'s args: a new manoeuvre node's time and its delta-v as
8395
- * named components in the node's own prograde, normal and radial-out frame,
8396
- * the same shape as `ManeuverNode`.
8501
+ * Add a manoeuvre node. `vessel.maneuver.add`'s args: a new manoeuvre node's
8502
+ * time and its delta-v as named components in the node's own prograde, normal
8503
+ * and radial-out frame, the same shape as `ManeuverNode`.
8397
8504
  *
8398
8505
  * The result is a `CommandResult<string>` whose `Payload` is the new node's
8399
8506
  * opaque id, the same id `ManeuverNode.id` carries on `vessel.maneuver`. A
@@ -8444,7 +8551,8 @@ export interface UpdateManeuverNodeArgs {
8444
8551
  radialOut: number;
8445
8552
  }
8446
8553
  /**
8447
- * `vessel.maneuver.remove`'s arguments: the manoeuvre node to delete.
8554
+ * Delete a manoeuvre node. `vessel.maneuver.remove`'s arguments: the manoeuvre
8555
+ * node to delete.
8448
8556
  *
8449
8557
  * @category Command arguments
8450
8558
  */
@@ -8453,8 +8561,8 @@ export interface RemoveManeuverNodeArgs {
8453
8561
  nodeId: string;
8454
8562
  }
8455
8563
  /**
8456
- * `vessel.target.set`'s args: a discriminated union, written as
8457
- * `SetTargetArgs.kind` plus the fields that kind uses.
8564
+ * Set the active vessel's target. `vessel.target.set`'s args: a discriminated
8565
+ * union, written as `SetTargetArgs.kind` plus the fields that kind uses.
8458
8566
  * `SetTargetArgs.vesselId` is the stable vessel id, never an array index, and
8459
8567
  * a vessel id and a body index travel in separate fields so they cannot be
8460
8568
  * confused.
@@ -8519,7 +8627,8 @@ export interface SetWarpIndexArgs {
8519
8627
  index: number;
8520
8628
  }
8521
8629
  /**
8522
- * `time.setPaused`'s arguments: whether the game is paused.
8630
+ * Pause or resume the game. `time.setPaused`'s arguments: whether the game is
8631
+ * paused.
8523
8632
  *
8524
8633
  * @category Command arguments
8525
8634
  */
@@ -8565,7 +8674,7 @@ export declare enum ControlState {
8565
8674
  Unknown = 11
8566
8675
  }
8567
8676
  /**
8568
- * The `vessel.comms` channel payload: the active vessel's own CommNet
8677
+ * The `vessel.comms` Topic payload: the active vessel's own CommNet
8569
8678
  * connection, from KSP's `vessel.connection`. The whole payload is null when
8570
8679
  * the vessel has no CommNet connection object; there is no zero or
8571
8680
  * disconnected placeholder reading.
@@ -8587,6 +8696,11 @@ export interface VesselComms {
8587
8696
  */
8588
8697
  signalStrength: Value<"ratio">;
8589
8698
  /**
8699
+ * Which quantity `VesselComms.signalStrength` is, as the elected comms backend
8700
+ * declares it: `SignalQuantity.Unknown` while no backend has answered.
8701
+ */
8702
+ signalQuantity: SignalQuantity;
8703
+ /**
8590
8704
  * What is controlling the vessel and how much control it has, from
8591
8705
  * `vessel.connection.ControlState`.
8592
8706
  */
@@ -8662,7 +8776,7 @@ export interface ActionGroupState {
8662
8776
  state?: boolean | null;
8663
8777
  }
8664
8778
  /**
8665
- * The `vessel.control` channel payload: the active vessel's control state (the
8779
+ * The `vessel.control` Topic payload: the active vessel's control state (the
8666
8780
  * stock toggles, SAS mode, throttle, the commanded fly-by-wire axes and the
8667
8781
  * custom action groups). The payload is present whenever there is an active
8668
8782
  * vessel; each field is individually nullable, and `null` means that input
@@ -8863,12 +8977,12 @@ export interface VesselCrew {
8863
8977
  meta: PayloadMeta;
8864
8978
  }
8865
8979
  /**
8866
- * The `vessel.dock` channel payload: the relative position, velocity and
8867
- * coarse orientation between the active vessel's nearest free (undocked)
8868
- * docking port and the targeted docking port, for docking-alignment widgets.
8869
- * The whole payload is absent when docking is not relevant right now: nothing
8870
- * is targeted, the target is not a docking port, or the active vessel has no
8871
- * free port. It is never an old or zero-distance placeholder record, the same
8980
+ * The `vessel.dock` Topic payload: the relative position, velocity and coarse
8981
+ * orientation between the active vessel's nearest free (undocked) docking port
8982
+ * and the targeted docking port, for docking-alignment widgets. The whole
8983
+ * payload is absent when docking is not relevant right now: nothing is
8984
+ * targeted, the target is not a docking port, or the active vessel has no free
8985
+ * port. It is never an old or zero-distance placeholder record, the same
8872
8986
  * convention as `VesselTarget`.
8873
8987
  *
8874
8988
  * `DockAlignment.forwardDot` is the dot product of the two ports' forward
@@ -9031,7 +9145,7 @@ export declare enum ManeuverFrame {
9031
9145
  Unknown = 1
9032
9146
  }
9033
9147
  /**
9034
- * The `vessel.flight` channel payload: quantities the game measures, either
9148
+ * The `vessel.flight` Topic payload: quantities the game measures, either
9035
9149
  * because they cannot be derived from orbital elements (terrain height,
9036
9150
  * aerodynamic state) or because they are the measured value to check a
9037
9151
  * prediction against (speeds). One field per quantity.
@@ -9106,8 +9220,8 @@ export interface VesselFlight {
9106
9220
  meta: PayloadMeta;
9107
9221
  }
9108
9222
  /**
9109
- * The `vessel.identity` channel payload: who the active vessel is, what kind
9110
- * of craft it is, and where it is.
9223
+ * The `vessel.identity` Topic payload: who the active vessel is, what kind of
9224
+ * craft it is, and where it is.
9111
9225
  *
9112
9226
  * There is no mission time field. `VesselIdentity.launchUt` is fixed after
9113
9227
  * liftoff, so mission elapsed time is `viewUt - launchUt`, computed by the
@@ -9238,11 +9352,11 @@ export interface InventoryItem {
9238
9352
  packedVolume?: Value<"1"> | null;
9239
9353
  }
9240
9354
  /**
9241
- * The `vessel.landing` channel payload: landing data for the active vessel
9242
- * that needs KSP's PQS terrain heightmap (slope, roughness and elevation at
9243
- * the touchdown site), plus an atmosphere-aware descent estimate built from
9244
- * the vessel's measured drag. The vacuum ballistic figures (which need no
9245
- * terrain) are not here; a client solves those itself.
9355
+ * The `vessel.landing` Topic payload: landing data for the active vessel that
9356
+ * needs KSP's PQS terrain heightmap (slope, roughness and elevation at the
9357
+ * touchdown site), plus an atmosphere-aware descent estimate built from the
9358
+ * vessel's measured drag. The vacuum ballistic figures (which need no terrain)
9359
+ * are not here; a client solves those itself.
9246
9360
  *
9247
9361
  * The whole payload is absent unless the vessel is descending toward a solid
9248
9362
  * surface: the body must have a solid surface and PQS terrain, and the vessel
@@ -9336,22 +9450,50 @@ export interface VesselLanding {
9336
9450
  */
9337
9451
  predictedBiome?: string | null;
9338
9452
  /**
9339
- * A flattened row-major NxN grid of terrain elevations in metres around the
9340
- * sampled point, for a shaded relief view; its length is
9341
- * `VesselLanding.terrainPatchSize` squared. Not currently produced, so always
9342
- * null.
9453
+ * The distance in metres of each `VesselLanding.groundTrackElevations` sample
9454
+ * along the predicted ground track, signed: 0 is the point on the ground
9455
+ * beneath the vessel, positive is toward the predicted site and on past it,
9456
+ * negative is behind the vessel. Ascending, the same length as
9457
+ * `VesselLanding.groundTrackElevations`. The strip always holds the ground
9458
+ * directly beneath the vessel, with at least one vessel height (and never less
9459
+ * than 120 m) of ground behind it, and runs on to the far edge of the
9460
+ * footprint of a cone of 60 degrees either side of the vessel's travel vector:
9461
+ * where the cone's two edges, in the plane of the vessel's motion, meet the
9462
+ * ground. A flat or climbing approach has an edge that never meets it, and
9463
+ * that edge is cut at the horizon. The strip also reaches the predicted site
9464
+ * and a tenth of its distance past it. The number of samples is fixed, so they
9465
+ * are closer together the narrower the strip, which narrows as the vessel
9466
+ * descends. Null when no track could be sampled.
9343
9467
  */
9344
- terrainPatch?: Value<"m">[] | null;
9468
+ groundTrackDistances?: Value<"m">[] | null;
9345
9469
  /**
9346
- * The N of the NxN `VesselLanding.terrainPatch` grid. Null when there is no
9347
- * patch, which is currently always.
9470
+ * Terrain elevation in metres at each `VesselLanding.groundTrackDistances`
9471
+ * entry, from the body's terrain model (ocean floor reads negative). Null when
9472
+ * no track could be sampled.
9348
9473
  */
9349
- terrainPatchSize?: Value<"count"> | null;
9474
+ groundTrackElevations?: Value<"m">[] | null;
9350
9475
  /**
9351
- * The full width in metres the `VesselLanding.terrainPatch` grid spans. Null
9352
- * when there is no patch, which is currently always.
9476
+ * A square of terrain elevations in metres around the predicted site, for a
9477
+ * top-down view of it: `VesselLanding.siteHeightsSize` by
9478
+ * `VesselLanding.siteHeightsSize` values row by row, the northern row first
9479
+ * and the western column first in each row, so laying them out in that order
9480
+ * puts north at the top. The grid is centred on the site and its width is
9481
+ * `VesselLanding.siteHeightsExtentMeters`: wide enough to hold the ground
9482
+ * between the vessel and the site, and about the vessel's height of it either
9483
+ * side, so it narrows as the vessel descends and closes on the site, and it
9484
+ * may be a second old. Null when no site could be sampled.
9353
9485
  */
9354
- terrainPatchExtentMeters?: Value<"m"> | null;
9486
+ siteHeights?: Value<"m">[] | null;
9487
+ /**
9488
+ * The number of values along each side of `VesselLanding.siteHeights`. Null
9489
+ * when there is no grid.
9490
+ */
9491
+ siteHeightsSize?: Value<"count"> | null;
9492
+ /**
9493
+ * The full width in metres that `VesselLanding.siteHeights` spans. Null when
9494
+ * there is no grid.
9495
+ */
9496
+ siteHeightsExtentMeters?: Value<"m"> | null;
9355
9497
  /**
9356
9498
  * Terminal velocity in m/s at the current altitude and configuration, from the
9357
9499
  * measured aggregate drag force against local gravity. An estimate that
@@ -9393,6 +9535,32 @@ export interface VesselLanding {
9393
9535
  * outside an atmosphere.
9394
9536
  */
9395
9537
  parachuteState?: string | null;
9538
+ /**
9539
+ * How far the craft's parachutes have opened, taken from the one furthest
9540
+ * along: `"none"` (the craft carries no parachute), `"stowed"` (packed, not
9541
+ * yet staged), `"armed"` (staged and waiting for air thick enough to open in),
9542
+ * `"semi-deployed"` (open as a streamer, slowing the craft a little),
9543
+ * `"deployed"` (fully open) or `"cut"` (every one cut away). Unlike
9544
+ * `VesselLanding.parachuteState` it tells semi-deployed from fully deployed,
9545
+ * and a packed parachute from none. Null outside an atmosphere.
9546
+ */
9547
+ parachuteDeployment?: string | null;
9548
+ /**
9549
+ * Whether opening the parachutes not yet open would survive the current speed
9550
+ * and air, as the game rates it from the heating a canopy would take:
9551
+ * `"safe"`, `"risky"` (the canopy would heat but hold for a few seconds) or
9552
+ * `"unsafe"` (it would burn through). The worst rating among the stowed and
9553
+ * armed parachutes. Null outside an atmosphere, when every parachute is
9554
+ * already open or cut, and for a parachute the game does not rate.
9555
+ */
9556
+ parachuteDeploySafety?: string | null;
9557
+ /**
9558
+ * The height above the ground or the sea at which an armed or semi-deployed
9559
+ * parachute opens fully, the greatest when there are several, since that one
9560
+ * opens first. Null when none is armed or semi-deployed, outside an
9561
+ * atmosphere, and for a parachute the game does not report one for.
9562
+ */
9563
+ parachuteFullDeployAltitude?: Value<"m"> | null;
9396
9564
  /** The payload's provenance (`"vessel:<guid>"`). */
9397
9565
  meta: PayloadMeta;
9398
9566
  }
@@ -9511,7 +9679,7 @@ export interface ManeuverNode {
9511
9679
  patches: OrbitPatch[];
9512
9680
  }
9513
9681
  /**
9514
- * The `vessel.maneuver` channel payload: the active vessel's planned burns.
9682
+ * The `vessel.maneuver` Topic payload: the active vessel's planned burns.
9515
9683
  * `VesselManeuver.nodes` is always an array, empty when no burn is queued,
9516
9684
  * never null.
9517
9685
  *
@@ -9548,7 +9716,7 @@ export interface VesselManeuver {
9548
9716
  meta: PayloadMeta;
9549
9717
  }
9550
9718
  /**
9551
- * The `vessel.orbit` channel payload: the active vessel's orbital elements.
9719
+ * The `vessel.orbit` Topic payload: the active vessel's orbital elements.
9552
9720
  * Elements are the cause; every kinematic quantity (position, velocity,
9553
9721
  * apsides, anomalies, period) is derived by the consumer at its view UT
9554
9722
  * through the propagation capability, and is not streamed here. The one
@@ -9809,7 +9977,7 @@ export interface OrbitEncounter {
9809
9977
  bodyIndex?: number | null;
9810
9978
  }
9811
9979
  /**
9812
- * The `vessel.orbit.truth` channel payload: KSP's own maintained state vector
9980
+ * The `vessel.orbit.truth` Topic payload: KSP's own maintained state vector
9813
9981
  * for the active vessel (`Orbit.pos` and `Orbit.vel`), relative to the body it
9814
9982
  * orbits. A development channel for checking element-to-position math against
9815
9983
  * KSP's own state, not a source of altitude or velocity for a widget: read
@@ -9852,7 +10020,7 @@ export interface VesselOrbitTruth {
9852
10020
  meta: PayloadMeta;
9853
10021
  }
9854
10022
  /**
9855
- * The `vessel.parts` channel payload: the active vessel's full part tree, with
10023
+ * The `vessel.parts` Topic payload: the active vessel's full part tree, with
9856
10024
  * each part's position, mass, temperatures, resources, module states and
9857
10025
  * action-group bindings. A single object, or `null` when there is no active
9858
10026
  * vessel.
@@ -10192,10 +10360,9 @@ export interface VesselPhysicsMode {
10192
10360
  meta: PayloadMeta;
10193
10361
  }
10194
10362
  /**
10195
- * The `vessel.propulsion` channel payload: the active vessel's mass and
10196
- * thrust, the inputs to thrust-to-weight and burn-time figures. Mass is in
10197
- * tonnes and thrust in kN, so `thrust / (mass · g)` is a thrust-to-weight
10198
- * ratio directly.
10363
+ * The `vessel.propulsion` Topic payload: the active vessel's mass and thrust,
10364
+ * the inputs to thrust-to-weight and burn-time figures. Mass is in tonnes and
10365
+ * thrust in kN, so `thrust / (mass · g)` is a thrust-to-weight ratio directly.
10199
10366
  *
10200
10367
  * TWR, maximum TWR and a vessel-level burn-time estimate are derived by the
10201
10368
  * client from these fields, and are not streamed here.
@@ -10308,7 +10475,7 @@ export interface ResourceAmount {
10308
10475
  active: boolean;
10309
10476
  }
10310
10477
  /**
10311
- * The `vessel.resources` channel payload: a keyframed map, keyed by resource
10478
+ * The `vessel.resources` Topic payload: a keyframed map, keyed by resource
10312
10479
  * name. No value is ever a sentinel such as `-1`.
10313
10480
  *
10314
10481
  * Only these stock resources are reported: `LiquidFuel`, `Oxidizer`,
@@ -10349,7 +10516,7 @@ export interface VesselResources {
10349
10516
  meta: PayloadMeta;
10350
10517
  }
10351
10518
  /**
10352
- * The `vessel.structure` channel payload: the active vessel's stage and part
10519
+ * The `vessel.structure` Topic payload: the active vessel's stage and part
10353
10520
  * counts. Absent when there is no active vessel.
10354
10521
  *
10355
10522
  * `VesselStructure.currentStage` uses KSP's own staging numbering unchanged,
@@ -10378,9 +10545,9 @@ export interface VesselStructure {
10378
10545
  meta: PayloadMeta;
10379
10546
  }
10380
10547
  /**
10381
- * The `vessel.surface` channel payload: surface data a landing widget needs
10382
- * that `vessel.flight` doesn't already carry. `vessel.flight.AltitudeTerrain`
10383
- * is the height of the vessel's root part above the terrain;
10548
+ * The `vessel.surface` Topic payload: surface data a landing widget needs that
10549
+ * `vessel.flight` doesn't already carry. `vessel.flight.AltitudeTerrain` is
10550
+ * the height of the vessel's root part above the terrain;
10384
10551
  * `VesselSurface.heightFromTerrain` is the height of the vessel's lowest
10385
10552
  * point, the number a landing-gear or suicide-burn readout cares about. The
10386
10553
  * two differ by how far the vessel reaches below its root.
@@ -10477,9 +10644,9 @@ export interface ClosestApproach {
10477
10644
  distance: Value<"m">;
10478
10645
  }
10479
10646
  /**
10480
- * The `vessel.target` channel payload: the active vessel's current target
10481
- * only. `VesselTarget.relativePosition`/`VesselTarget.relativeVelocity` both
10482
- * use the one `Vec3` shape.
10647
+ * The `vessel.target` Topic payload: the active vessel's current target only.
10648
+ * `VesselTarget.relativePosition`/`VesselTarget.relativeVelocity` both use the
10649
+ * one `Vec3` shape.
10483
10650
  *
10484
10651
  * `VesselTarget.orbit` reuses `VesselOrbit` itself (not a separate "target
10485
10652
  * orbit" shape), so the SDK propagates a target with the same code path as the
@@ -10573,11 +10740,10 @@ export interface ThermalHottestPart {
10573
10740
  /** The part's current skin temperature, Kelvin (`Part.skinTemperature`). */
10574
10741
  skinTemp: Value<"K">;
10575
10742
  /**
10576
- * The part's maximum skin temperature, Kelvin (`Part.skinMaxTemp`), passed
10577
- * through raw: KSP reports `-1` for a part with no skin-thermal model, and
10578
- * that value arrives here unchanged.
10743
+ * The part's maximum skin temperature, Kelvin (`Part.skinMaxTemp`); `null` for
10744
+ * a part with no skin-thermal model, where KSP reports `-1`.
10579
10745
  */
10580
- skinMaxTemp: Value<"K">;
10746
+ skinMaxTemp?: Value<"K"> | null;
10581
10747
  /**
10582
10748
  * Display name of the hottest part (`Part.partInfo.title`, falling back to
10583
10749
  * `Part.name`, same convention as `VesselPart.title`). Never null when
@@ -10593,9 +10759,9 @@ export interface ThermalHottestPart {
10593
10759
  id?: string | null;
10594
10760
  }
10595
10761
  /**
10596
- * The `vessel.thermal` channel payload: the active vessel's thermal rollup,
10597
- * its hottest part, heat shield and engine. Each ratio is null when no part
10598
- * had a valid maximum temperature this tick, never 0, so "no valid part" and
10762
+ * The `vessel.thermal` Topic payload: the active vessel's thermal rollup, its
10763
+ * hottest part, heat shield and engine. Each ratio is null when no part had a
10764
+ * valid maximum temperature this tick, never 0, so "no valid part" and
10599
10765
  * "coldest possible part" stay distinct.
10600
10766
  *
10601
10767
  * The whole payload is null when the vessel has no parts at all, a different,
@@ -10678,12 +10844,12 @@ export declare enum WarpMode {
10678
10844
  Unknown = 2
10679
10845
  }
10680
10846
  /**
10681
- * The `time.warp` channel payload: the game's time-warp and pause state, as
10847
+ * The `time.warp` Topic payload: the game's time-warp and pause state, as
10682
10848
  * separate typed fields.
10683
10849
  *
10684
- * Current UT is not a field here (or anywhere in this contract):
10685
- * `meta.validAt` stamps every sample, and the SDK's view clock is the "what
10686
- * time is it" surface.
10850
+ * Current UT is not a field here, nor on any other Topic of the wire contract:
10851
+ * `meta.validAt` stamps every sample with the UT it describes, and a client
10852
+ * asks what time it is with the SDK's `useViewUt`.
10687
10853
  *
10688
10854
  * Warp and pause are game-wide state, so `WarpState.meta` is stamped `Source =
10689
10855
  * "game"`, not `"vessel:<guid>"`, and the channel emits at the Space Center
@@ -10740,13 +10906,13 @@ export interface WarpState {
10740
10906
  * seconds, or `null` where the host did not report its physics step.
10741
10907
  *
10742
10908
  * Equal to `WarpState.sampleIntervalUt` up to 10x warp. Above that the mod
10743
- * samples at most ten times a real second, so this is a tenth of a second of
10744
- * game time at the current rate (10,000 at 100,000x), or one physics tick
10745
- * where a tick advances the game further than that. Nothing between two
10746
- * consecutive samples was observed, so a line drawn between two samples that
10747
- * differ asserts a path across this span that only a model of the value can
10748
- * stand behind. Two samples further apart than this are a channel that did not
10749
- * change in between.
10909
+ * samples at most ten times a real second, so this is the game time that
10910
+ * passes in a tenth of a real second at the current rate (0.1 s x 100,000 =
10911
+ * 10,000 s at 100,000x), or one physics tick where a tick advances the game
10912
+ * further than that. Nothing between two consecutive samples was observed, so
10913
+ * a line drawn between two samples that differ asserts a path across this span
10914
+ * that only a model of the value can stand behind. Two samples further apart
10915
+ * than this are a channel that did not change in between.
10750
10916
  *
10751
10917
  * It changes only when the warp rate does. A client judging a gap reads the
10752
10918
  * quantum in force when the later sample was taken.