spatialdds 0.7.2__tar.gz → 0.7.4__tar.gz

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 (245) hide show
  1. {spatialdds-0.7.2 → spatialdds-0.7.4}/PKG-INFO +42 -6
  2. {spatialdds-0.7.2 → spatialdds-0.7.4}/README.md +41 -5
  3. {spatialdds-0.7.2 → spatialdds-0.7.4}/pyproject.toml +1 -1
  4. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/__init__.py +1 -1
  5. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/openapi.html +1 -1
  6. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/openapi.yaml +1 -1
  7. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/registry.json +43 -0
  8. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/__init__.py +5 -3
  9. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/_participant.py +104 -24
  10. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/codec.py +55 -4
  11. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/record.py +5 -2
  12. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/registry.py +34 -4
  13. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/demo/manifests/content-fountain-label.json +1 -1
  14. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/demo/manifests/content-fountain-marker.json +1 -1
  15. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/records.py +31 -6
  16. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/serve.py +6 -1
  17. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/server/gateway.py +28 -4
  18. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/server/gw_http.py +13 -2
  19. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/server/idlmodel.py +36 -0
  20. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/server/mcapmeta.py +5 -0
  21. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/server/pin.py +1 -0
  22. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/server/webjson.py +127 -1
  23. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/server/xcdr2.py +7 -2
  24. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds.egg-info/PKG-INFO +42 -6
  25. {spatialdds-0.7.2 → spatialdds-0.7.4}/setup.cfg +0 -0
  26. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/idl/anchors.idl +0 -0
  27. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/idl/argeo.idl +0 -0
  28. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/idl/common.idl +0 -0
  29. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/idl/core.idl +0 -0
  30. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/idl/discovery.idl +0 -0
  31. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/idl/events.idl +0 -0
  32. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/idl/lidar.idl +0 -0
  33. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/idl/mapping.idl +0 -0
  34. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/idl/provisional/owm.idl +0 -0
  35. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/idl/provisional/radio.idl +0 -0
  36. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/idl/provisional/rf_beam.idl +0 -0
  37. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/idl/rad.idl +0 -0
  38. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/idl/semantics.idl +0 -0
  39. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/idl/slam_frontend.idl +0 -0
  40. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/idl/types.idl +0 -0
  41. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/idl/vio.idl +0 -0
  42. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/idl/vision.idl +0 -0
  43. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/builtin_Time.json +0 -0
  44. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_anchors_AnchorDelta.json +0 -0
  45. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_anchors_AnchorEntry.json +0 -0
  46. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_anchors_AnchorSet.json +0 -0
  47. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_anchors_AnchorSetRequest.json +0 -0
  48. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_anchors_AnchorSetResponse.json +0 -0
  49. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_argeo_NodeGeo.json +0 -0
  50. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_argeo_QualityRequirements.json +0 -0
  51. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_argeo_VpsRequest.json +0 -0
  52. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_argeo_VpsResponse.json +0 -0
  53. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_common_AssetRef.json +0 -0
  54. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_common_FrameRef.json +0 -0
  55. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_common_KV.json +0 -0
  56. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_common_MetaKV.json +0 -0
  57. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_common_Vec2.json +0 -0
  58. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_core_Aabb3.json +0 -0
  59. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_core_BlobChunk.json +0 -0
  60. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_core_BlobRef.json +0 -0
  61. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_core_ComponentRef.json +0 -0
  62. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_core_Edge.json +0 -0
  63. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_core_EntityBinding.json +0 -0
  64. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_core_FrameTransform.json +0 -0
  65. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_core_FramedPose.json +0 -0
  66. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_core_GeoAnchor.json +0 -0
  67. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_core_GeoPose.json +0 -0
  68. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_core_NavSatStatus.json +0 -0
  69. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_core_Node.json +0 -0
  70. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_core_PlannedTrajectory.json +0 -0
  71. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_core_PlannedWaypoint.json +0 -0
  72. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_core_PoseSE3.json +0 -0
  73. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_core_SnapshotRequest.json +0 -0
  74. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_core_SnapshotResponse.json +0 -0
  75. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_core_TileKey.json +0 -0
  76. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_core_TileMeta.json +0 -0
  77. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_core_TilePatch.json +0 -0
  78. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_disco_Announce.json +0 -0
  79. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_disco_Capabilities.json +0 -0
  80. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_disco_ContentAnnounce.json +0 -0
  81. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_disco_CoverageElement.json +0 -0
  82. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_disco_CoverageFilter.json +0 -0
  83. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_disco_CoverageHint.json +0 -0
  84. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_disco_CoverageQuery.json +0 -0
  85. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_disco_CoverageResponse.json +0 -0
  86. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_disco_Depart.json +0 -0
  87. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_disco_KV.json +0 -0
  88. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_disco_ProfileSupport.json +0 -0
  89. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_disco_ServiceSummary.json +0 -0
  90. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_disco_TopicMeta.json +0 -0
  91. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_disco_Transform.json +0 -0
  92. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_disco_ValidityWindow.json +0 -0
  93. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_events_CrossingLine.json +0 -0
  94. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_events_SpatialEvent.json +0 -0
  95. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_events_SpatialZone.json +0 -0
  96. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_events_ZoneState.json +0 -0
  97. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_mapping_Edge.json +0 -0
  98. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_mapping_MapAlignment.json +0 -0
  99. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_mapping_MapEvent.json +0 -0
  100. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_mapping_MapMeta.json +0 -0
  101. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_mapping_MapQuality.json +0 -0
  102. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_owm_Entity.json +0 -0
  103. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_owm_ModelCommand.json +0 -0
  104. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_owm_ModelPose.json +0 -0
  105. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_semantics_Detection2D.json +0 -0
  106. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_semantics_Detection2DSet.json +0 -0
  107. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_semantics_Detection3D.json +0 -0
  108. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_semantics_Detection3DSet.json +0 -0
  109. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_semantics_FusedTrack.json +0 -0
  110. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_semantics_FusedTrackSet.json +0 -0
  111. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_semantics_Keypoint3D.json +0 -0
  112. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_semantics_KeypointLink.json +0 -0
  113. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_sensing_common_Axis.json +0 -0
  114. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_sensing_common_FrameHeader.json +0 -0
  115. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_sensing_common_FrameQuality.json +0 -0
  116. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_sensing_common_Linspace.json +0 -0
  117. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_sensing_common_ROI.json +0 -0
  118. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_sensing_common_ROIReply.json +0 -0
  119. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_sensing_common_ROIRequest.json +0 -0
  120. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_sensing_common_StreamMeta.json +0 -0
  121. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_sensing_lidar_LidarDetection.json +0 -0
  122. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_sensing_lidar_LidarDetectionSet.json +0 -0
  123. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_sensing_lidar_LidarFrame.json +0 -0
  124. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_sensing_lidar_LidarMeta.json +0 -0
  125. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_sensing_rad_RadDetection.json +0 -0
  126. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_sensing_rad_RadDetectionSet.json +0 -0
  127. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_sensing_rad_RadSensorMeta.json +0 -0
  128. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_sensing_rad_RadTensorFrame.json +0 -0
  129. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_sensing_rad_RadTensorMeta.json +0 -0
  130. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_sensing_radio_RadioObservation.json +0 -0
  131. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_sensing_radio_RadioScan.json +0 -0
  132. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_sensing_radio_RadioSensorMeta.json +0 -0
  133. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_sensing_rf_beam_RfBeamArraySet.json +0 -0
  134. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_sensing_rf_beam_RfBeamFrame.json +0 -0
  135. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_sensing_rf_beam_RfBeamMeta.json +0 -0
  136. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_sensing_vision_CamIntrinsics.json +0 -0
  137. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_sensing_vision_Keypoint2D.json +0 -0
  138. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_sensing_vision_Track2D.json +0 -0
  139. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_sensing_vision_VisionDetections.json +0 -0
  140. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_sensing_vision_VisionFrame.json +0 -0
  141. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_sensing_vision_VisionMeta.json +0 -0
  142. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_slam_frontend_CameraInfo.json +0 -0
  143. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_slam_frontend_Feature2D.json +0 -0
  144. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_slam_frontend_FeatureMatch.json +0 -0
  145. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_slam_frontend_KeyframeFeatures.json +0 -0
  146. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_slam_frontend_Landmark.json +0 -0
  147. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_slam_frontend_MatchSet.json +0 -0
  148. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_slam_frontend_TrackObs.json +0 -0
  149. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_slam_frontend_Tracklet.json +0 -0
  150. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_vio_FusedState.json +0 -0
  151. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_vio_ImuInfo.json +0 -0
  152. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_vio_ImuSample.json +0 -0
  153. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_vio_MagnetometerSample.json +0 -0
  154. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/schemas/spatial_vio_SensorFusionSample.json +0 -0
  155. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/artifacts/serializer_tables.json +0 -0
  156. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/canonical.py +0 -0
  157. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/canonjson.py +0 -0
  158. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/client.py +0 -0
  159. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/_extra.py +0 -0
  160. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/blob.py +0 -0
  161. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/qos.py +0 -0
  162. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/__init__.py +0 -0
  163. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/_field_aliases.py +0 -0
  164. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/builtin/__init__.py +0 -0
  165. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/builtin/_types.py +0 -0
  166. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/__init__.py +0 -0
  167. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/anchors/__init__.py +0 -0
  168. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/anchors/_anchors.py +0 -0
  169. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/argeo/__init__.py +0 -0
  170. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/argeo/_argeo.py +0 -0
  171. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/common/__init__.py +0 -0
  172. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/common/_types.py +0 -0
  173. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/core/GnssService/__init__.py +0 -0
  174. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/core/GnssService/_core.py +0 -0
  175. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/core/__init__.py +0 -0
  176. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/core/_core.py +0 -0
  177. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/disco/__init__.py +0 -0
  178. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/disco/_discovery.py +0 -0
  179. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/events/__init__.py +0 -0
  180. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/events/_events.py +0 -0
  181. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/events/enums/__init__.py +0 -0
  182. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/events/enums/crossing_direction_enum/__init__.py +0 -0
  183. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/events/enums/crossing_direction_enum/_events.py +0 -0
  184. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/events/enums/event_state_enum/__init__.py +0 -0
  185. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/events/enums/event_state_enum/_events.py +0 -0
  186. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/events/enums/event_type_enum/__init__.py +0 -0
  187. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/events/enums/event_type_enum/_events.py +0 -0
  188. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/events/enums/severity_enum/__init__.py +0 -0
  189. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/events/enums/severity_enum/_events.py +0 -0
  190. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/events/enums/zone_kind_enum/__init__.py +0 -0
  191. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/events/enums/zone_kind_enum/_events.py +0 -0
  192. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/mapping/__init__.py +0 -0
  193. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/mapping/_mapping.py +0 -0
  194. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/mapping/enums/__init__.py +0 -0
  195. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/mapping/enums/alignment_method/__init__.py +0 -0
  196. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/mapping/enums/alignment_method/_mapping.py +0 -0
  197. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/mapping/enums/edge_type/__init__.py +0 -0
  198. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/mapping/enums/edge_type/_mapping.py +0 -0
  199. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/mapping/enums/map_event_kind/__init__.py +0 -0
  200. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/mapping/enums/map_event_kind/_mapping.py +0 -0
  201. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/mapping/enums/map_kind/__init__.py +0 -0
  202. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/mapping/enums/map_kind/_mapping.py +0 -0
  203. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/mapping/enums/map_status/__init__.py +0 -0
  204. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/mapping/enums/map_status/_mapping.py +0 -0
  205. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/owm/__init__.py +0 -0
  206. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/owm/_owm.py +0 -0
  207. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/semantics/__init__.py +0 -0
  208. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/semantics/_semantics.py +0 -0
  209. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/sensing/__init__.py +0 -0
  210. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/sensing/common/__init__.py +0 -0
  211. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/sensing/common/_common.py +0 -0
  212. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/sensing/lidar/__init__.py +0 -0
  213. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/sensing/lidar/_lidar.py +0 -0
  214. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/sensing/rad/__init__.py +0 -0
  215. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/sensing/rad/_rad.py +0 -0
  216. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/sensing/radio/__init__.py +0 -0
  217. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/sensing/radio/_radio.py +0 -0
  218. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/sensing/rf_beam/__init__.py +0 -0
  219. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/sensing/rf_beam/_rf_beam.py +0 -0
  220. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/sensing/vision/__init__.py +0 -0
  221. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/sensing/vision/_vision.py +0 -0
  222. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/slam_frontend/__init__.py +0 -0
  223. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/slam_frontend/_slam_frontend.py +0 -0
  224. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/vio/__init__.py +0 -0
  225. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/dds/types/spatial/vio/_vio.py +0 -0
  226. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/demo/assets/duck.gltf +0 -0
  227. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/demo/assets/fountain-label.txt +0 -0
  228. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/demo/assets/fountain-marker.gltf +0 -0
  229. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/demo/fountain-anchors.mcap +0 -0
  230. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/errors.py +0 -0
  231. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/events.py +0 -0
  232. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/frames.py +0 -0
  233. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/journal.py +0 -0
  234. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/recency.py +0 -0
  235. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/server/__init__.py +0 -0
  236. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/server/commands.py +0 -0
  237. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/server/limits.py +0 -0
  238. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/server/publish.py +0 -0
  239. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/server/tenancy.py +0 -0
  240. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds/tokens.py +0 -0
  241. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds.egg-info/SOURCES.txt +0 -0
  242. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds.egg-info/dependency_links.txt +0 -0
  243. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds.egg-info/entry_points.txt +0 -0
  244. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds.egg-info/requires.txt +0 -0
  245. {spatialdds-0.7.2 → spatialdds-0.7.4}/spatialdds.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: spatialdds
3
- Version: 0.7.2
3
+ Version: 0.7.4
4
4
  Summary: SpatialDDS for programs: a client for the web binding (Appendix N), a native DDS participant, and the reference registry behind one command.
5
5
  Author: Open AR Cloud
6
6
  License: Apache-2.0
@@ -114,7 +114,7 @@ What it asks of you, and what it will not guess:
114
114
  | `service_id` and `authority` | to write or announce |
115
115
  | `qos_profile` | where the §3.3.2 row names none, as `model_entity`'s and `model_pose`'s do; the refusal lists the §3.3.3 profiles that fit, or pass a `sd.dds.Profile(...)` extension |
116
116
  | `on_exit="keep"` or `"withdraw"` | on every latched, keyed writer: whether a record outlives its writer is a claim only you can make |
117
- | `withdraw(key, reason=...)` | with an empty reason |
117
+ | `withdraw(key, reason=..., **changes)` | with an empty reason, or a change to the members it sets itself or to the key |
118
118
 
119
119
  And what it does without being asked:
120
120
 
@@ -139,14 +139,18 @@ scene:
139
139
  tick, a framework's timer, or a request handler.
140
140
  - **`topic=`** on `writer()` and `reader()` gives the whole name, for another
141
141
  scene's lane or one the spec names only by example. It is held to §3.3.1's
142
- grammar, and a templated type to its template. `history=` sets a reader's
143
- own cache, for a reply reader that must keep every reply.
142
+ grammar, a templated type to its template, and a name that fills §2's
143
+ template for its type is admitted though it is longer
144
+ (`spatialdds/<scene>/plan/<agent_id>/trajectory/v1`). `history=` sets a
145
+ reader's own cache, for a reply reader that must keep every reply.
144
146
  - **`ignore_local=True`** on a reader drops the participant's own writes, for
145
147
  a bridge that writes and reads one lane. **`matched()`** and
146
148
  **`wait_matched()`** on writers and readers count the other side.
147
149
  - **`p.announce(transforms=...)`** carries the service's frame placement.
148
150
  `service_id=` and `topics=` announce several services from one
149
- participant.
151
+ participant. `topics=` may list readers as well as writers, for a service
152
+ that announces where requests go, and `auth_hint=` and
153
+ `coverage_frame_ref=` pass through.
150
154
  - **`p.relay()`** re-publishes other services' announces. It uses a writer of
151
155
  its own and marks each with a `relayed_by` hint naming the relay, so it
152
156
  never speaks as the asserter.
@@ -598,6 +602,38 @@ explicitly was tried first and is what missed two paths.
598
602
 
599
603
  If your clients are not browsers, nothing here changes anything for you.
600
604
 
605
+ ## New in 0.7.4: what the first extension found
606
+
607
+ A deployment's own type, registered with `sd.dds.extend()`, is now served
608
+ the way a pinned one is. The gateway publishes a schema for it, written from
609
+ the model it decodes the type with by the specification generator's rules,
610
+ because N.2 requires a schema for every type an endpoint serves. A
611
+ recording's extension lane is served latched when its writer opened it so,
612
+ and `serve --public FQN` opens it to uncredentialed readers.
613
+
614
+ - `withdraw(key, reason=..., **changes)` sets other members on the terminal
615
+ sample, such as a closed validity interval.
616
+ - `close()` finishes when a reader is slow to acknowledge (cyclonedds-python
617
+ 11.0.1 raised on that timeout).
618
+ - `sd.stamp` keeps `nanosec` in range, and floors a time before the epoch.
619
+ - `sd.dds.extensions()` and `sd.dds.extension_of()` are exported.
620
+
621
+ ## New in 0.7.3: what the first migration found
622
+
623
+ Mostly additive; one fix changes bytes. Every frame this package builds now
624
+ carries the uuid its name derives to, because Appendix G makes the uuid a
625
+ frame's identity. Until 0.7.3 the earth-fixed frame's uuid was empty in
626
+ announces, built manifests and the gateway's manifest, and a conforming
627
+ consumer could match it to nothing. If you compare such documents by digest,
628
+ expect the uuid, and the ETags over it, to change.
629
+
630
+ - `check_topic` and `topic=` admit §2's lane templates, so the six-segment
631
+ plan lane opens.
632
+ - `p.announce(topics=)` takes readers, plus `auth_hint=` and
633
+ `coverage_frame_ref=`.
634
+ - `sd.dds.from_json(..., strict=True)` refuses unknown members by name.
635
+ - `sd.dds.WireError` is exported and is a `ValueError`.
636
+
601
637
  ## New in 0.7.2: a deployment's own types
602
638
 
603
639
  `sd.dds.extend(name, cls, idl)` brings a deployment's own documented type
@@ -659,7 +695,7 @@ Two changes may need a line of yours:
659
695
  The security fixes, the limits table and the details are in the
660
696
  [changelog](https://github.com/OpenArCloud/spatialdds-py/blob/main/lib/spatialdds/CHANGELOG.md).
661
697
 
662
- ## Not in 0.7.2
698
+ ## Not in 0.7.4
663
699
 
664
700
  Stated so nobody waits for them:
665
701
 
@@ -86,7 +86,7 @@ What it asks of you, and what it will not guess:
86
86
  | `service_id` and `authority` | to write or announce |
87
87
  | `qos_profile` | where the §3.3.2 row names none, as `model_entity`'s and `model_pose`'s do; the refusal lists the §3.3.3 profiles that fit, or pass a `sd.dds.Profile(...)` extension |
88
88
  | `on_exit="keep"` or `"withdraw"` | on every latched, keyed writer: whether a record outlives its writer is a claim only you can make |
89
- | `withdraw(key, reason=...)` | with an empty reason |
89
+ | `withdraw(key, reason=..., **changes)` | with an empty reason, or a change to the members it sets itself or to the key |
90
90
 
91
91
  And what it does without being asked:
92
92
 
@@ -111,14 +111,18 @@ scene:
111
111
  tick, a framework's timer, or a request handler.
112
112
  - **`topic=`** on `writer()` and `reader()` gives the whole name, for another
113
113
  scene's lane or one the spec names only by example. It is held to §3.3.1's
114
- grammar, and a templated type to its template. `history=` sets a reader's
115
- own cache, for a reply reader that must keep every reply.
114
+ grammar, a templated type to its template, and a name that fills §2's
115
+ template for its type is admitted though it is longer
116
+ (`spatialdds/<scene>/plan/<agent_id>/trajectory/v1`). `history=` sets a
117
+ reader's own cache, for a reply reader that must keep every reply.
116
118
  - **`ignore_local=True`** on a reader drops the participant's own writes, for
117
119
  a bridge that writes and reads one lane. **`matched()`** and
118
120
  **`wait_matched()`** on writers and readers count the other side.
119
121
  - **`p.announce(transforms=...)`** carries the service's frame placement.
120
122
  `service_id=` and `topics=` announce several services from one
121
- participant.
123
+ participant. `topics=` may list readers as well as writers, for a service
124
+ that announces where requests go, and `auth_hint=` and
125
+ `coverage_frame_ref=` pass through.
122
126
  - **`p.relay()`** re-publishes other services' announces. It uses a writer of
123
127
  its own and marks each with a `relayed_by` hint naming the relay, so it
124
128
  never speaks as the asserter.
@@ -570,6 +574,38 @@ explicitly was tried first and is what missed two paths.
570
574
 
571
575
  If your clients are not browsers, nothing here changes anything for you.
572
576
 
577
+ ## New in 0.7.4: what the first extension found
578
+
579
+ A deployment's own type, registered with `sd.dds.extend()`, is now served
580
+ the way a pinned one is. The gateway publishes a schema for it, written from
581
+ the model it decodes the type with by the specification generator's rules,
582
+ because N.2 requires a schema for every type an endpoint serves. A
583
+ recording's extension lane is served latched when its writer opened it so,
584
+ and `serve --public FQN` opens it to uncredentialed readers.
585
+
586
+ - `withdraw(key, reason=..., **changes)` sets other members on the terminal
587
+ sample, such as a closed validity interval.
588
+ - `close()` finishes when a reader is slow to acknowledge (cyclonedds-python
589
+ 11.0.1 raised on that timeout).
590
+ - `sd.stamp` keeps `nanosec` in range, and floors a time before the epoch.
591
+ - `sd.dds.extensions()` and `sd.dds.extension_of()` are exported.
592
+
593
+ ## New in 0.7.3: what the first migration found
594
+
595
+ Mostly additive; one fix changes bytes. Every frame this package builds now
596
+ carries the uuid its name derives to, because Appendix G makes the uuid a
597
+ frame's identity. Until 0.7.3 the earth-fixed frame's uuid was empty in
598
+ announces, built manifests and the gateway's manifest, and a conforming
599
+ consumer could match it to nothing. If you compare such documents by digest,
600
+ expect the uuid, and the ETags over it, to change.
601
+
602
+ - `check_topic` and `topic=` admit §2's lane templates, so the six-segment
603
+ plan lane opens.
604
+ - `p.announce(topics=)` takes readers, plus `auth_hint=` and
605
+ `coverage_frame_ref=`.
606
+ - `sd.dds.from_json(..., strict=True)` refuses unknown members by name.
607
+ - `sd.dds.WireError` is exported and is a `ValueError`.
608
+
573
609
  ## New in 0.7.2: a deployment's own types
574
610
 
575
611
  `sd.dds.extend(name, cls, idl)` brings a deployment's own documented type
@@ -631,7 +667,7 @@ Two changes may need a line of yours:
631
667
  The security fixes, the limits table and the details are in the
632
668
  [changelog](https://github.com/OpenArCloud/spatialdds-py/blob/main/lib/spatialdds/CHANGELOG.md).
633
669
 
634
- ## Not in 0.7.2
670
+ ## Not in 0.7.4
635
671
 
636
672
  Stated so nobody waits for them:
637
673
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "spatialdds"
7
- version = "0.7.2"
7
+ version = "0.7.4"
8
8
  description = "SpatialDDS for programs: a client for the web binding (Appendix N), a native DDS participant, and the reference registry behind one command."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -41,7 +41,7 @@ __all__ = [
41
41
  "participant", "MissingExtra", "dds", "events", "frames", "Recency",
42
42
  ]
43
43
 
44
- __version__ = "0.7.2"
44
+ __version__ = "0.7.4"
45
45
  #: The SpatialDDS-spec commit whose Appendix N and generated artifacts this
46
46
  #: package implements. Package versions and specification versions move
47
47
  #: independently; this is the one that says what the wire looks like.
@@ -14,4 +14,4 @@ border-bottom:1px solid var(--line)}p{margin:.35rem 0}.mut,.sum .auth{color:
14
14
  var(--mut)}.auth{font-size:.85rem;margin-left:.4rem}.v{display:inline-block;
15
15
  min-width:4.2rem;font:600 12px ui-monospace,monospace;letter-spacing:.04em;
16
16
  color:var(--acc)}.codes{font:12px ui-monospace,monospace;color:var(--mut)}
17
- .s{margin-right:.5rem}.s4,.s5{color:#b5482c}a{color:var(--acc)}</style></head><body><main><h1>SpatialDDS web binding (spatialdds-py)</h1><p class=mut>Version 0.7.2 · OpenAPI 3.1.0 · generated, never hand-written · <a href='openapi'>openapi.yaml</a></p><p>Generated by <code>tools/gen_openapi.py</code> from the gateway&#x27;s own tables and the published JSON Schemas; never edited by hand. Reads are open; writes take a bearer token scoped to scenes. The WebSocket streams (N.5) are described on each collection path, not modelled.</p><h2>Operations</h2><section id="search"><h3><span class="v get">GET</span> <code>/.well-known/spatialdds/search</code></h3><p class="sum">Services near a geohash (§8.2.3 manifests) <span class="auth">open</span></p><p class="codes"><span class="s s2">200</span> <span class="s s4">429</span></p></section><section id="searchPost"><h3><span class="v post">POST</span> <code>/.well-known/spatialdds/search</code></h3><p class="sum">The same search, as a POST body <span class="auth">open</span></p><p class="codes"><span class="s s2">200</span> <span class="s s4">429</span> <span class="s s4">413</span> <span class="s s4">415</span></p></section><section id="listSchemas"><h3><span class="v get">GET</span> <code>/.well-known/spatialdds/schemas</code></h3><p class="sum">The published JSON Schemas, by type <span class="auth">open</span></p><p class="codes"><span class="s s2">200</span> <span class="s s4">429</span></p></section><section id="getSchema"><h3><span class="v get">GET</span> <code>/.well-known/spatialdds/schemas/{type}</code></h3><p class="sum"> <span class="auth">open</span></p><p class="codes"><span class="s s2">200</span> <span class="s s4">404</span> <span class="s s4">429</span></p></section><section id="bootstrap"><h3><span class="v get">GET</span> <code>/.well-known/spatialdds/bootstrap</code></h3><p class="sum">DDS-join material (N.2); optional <span class="auth">open</span></p><p class="codes"><span class="s s2">200</span> <span class="s s4">404</span> <span class="s s4">429</span></p></section><section id="resolverMetadata"><h3><span class="v get">GET</span> <code>/.well-known/spatialdds/resolver</code></h3><p class="sum">§7.5.2 resolver metadata <span class="auth">open</span></p><p class="codes"><span class="s s2">200</span> <span class="s s4">404</span> <span class="s s4">429</span></p></section><section id="openapi"><h3><span class="v get">GET</span> <code>/.well-known/spatialdds/openapi</code></h3><p class="sum">This document <span class="auth">open</span></p><p class="codes"><span class="s s2">200</span> <span class="s s4">429</span></p></section><section id="openapiPage"><h3><span class="v get">GET</span> <code>/.well-known/spatialdds/openapi.html</code></h3><p class="sum">This document as a static reference page <span class="auth">open</span></p><p class="codes"><span class="s s2">200</span> <span class="s s4">429</span></p></section><section id="resolve"><h3><span class="v get">GET</span> <code>/spatialdds/resolve</code></h3><p class="sum">Resolve a URI to its manifest (§7.5.2) <span class="auth">open</span></p><p class="codes"><span class="s s2">200</span> <span class="s s4">400</span> <span class="s s4">404</span> <span class="s s4">429</span></p></section><section id="putManifest"><h3><span class="v put">PUT</span> <code>/spatialdds/resolve</code></h3><p class="sum">Publish a manifest, keyed by its own <code>id</code> <span class="auth">token</span></p><p>The <code>uri</code> parameter is not used; the body&#x27;s <code>id</code> is the key. Its scene segment is the lane. **Writes are per lane.** The path&#x27;s first segment is the scene; the bearer token must be granted it (<code>tenancy.WRITE_REFUSALS</code>).</p><p class="codes"><span class="s s2">200</span> <span class="s s2">201</span> <span class="s s4">400</span> <span class="s s4">401</span> <span class="s s4">403</span> <span class="s s4">405</span> <span class="s s4">429</span> <span class="s s4">413</span> <span class="s s4">415</span> <span class="s s5">503</span></p></section><section id="withdrawManifest"><h3><span class="v delete">DELETE</span> <code>/spatialdds/resolve</code></h3><p class="sum">Withdraw a manifest; <code>resolve</code> then answers 404 <span class="auth">token</span></p><p>Owner-checked by the URI&#x27;s scene segment. **Writes are per lane.** The path&#x27;s first segment is the scene; the bearer token must be granted it (<code>tenancy.WRITE_REFUSALS</code>).</p><p class="codes"><span class="s s2">204</span> <span class="s s4">400</span> <span class="s s4">401</span> <span class="s s4">403</span> <span class="s s4">404</span> <span class="s s4">405</span> <span class="s s4">429</span> <span class="s s5">503</span></p></section><section id="getAsset"><h3><span class="v get">GET</span> <code>/assets/{name}</code></h3><p class="sum">Asset bytes this endpoint hosts (implementation-defined) <span class="auth">open</span></p><p class="codes"><span class="s s2">200</span> <span class="s s4">404</span> <span class="s s4">429</span></p></section><section id="listAnnounce"><h3><span class="v get">GET</span> <code>/{scene}/{stream}/announce/v1</code></h3><p class="sum">Every spatial.disco.Announce instance in the latched set <span class="auth">open</span></p><p>**The same URL is also a WebSocket** (N.5): connect with <code>wss://</code> and receive the latched set as <code>sample</code> events, exactly one <code>end_of_replay</code> carrying the replay count, then live <code>sample</code> and <code>dispose</code> events (<code>{event, topic, key, data | reason}</code>). Not modelled here; see [Appendix N.5](https://spatialdds.org/v1.8/appendix-n/).</p><p class="codes"><span class="s s2">200</span> <span class="s s3">304</span> <span class="s s4">404</span> <span class="s s4">429</span> <span class="s s5">503</span></p></section><section id="commandAnnounce"><h3><span class="v post">POST</span> <code>/{scene}/{stream}/announce/v1</code></h3><p class="sum">An N.6 command addressed through the announce lane <span class="auth">token</span></p><p>Accepted only on a lane whose topic advertises <code>accepts_commands</code>; otherwise <code>405</code>. **Writes are per lane.** The path&#x27;s first segment is the scene; the bearer token must be granted it (<code>tenancy.WRITE_REFUSALS</code>). Every member of the record is required: a body is a whole record, never a patch.</p><p class="codes"><span class="s s2">202</span> <span class="s s4">400</span> <span class="s s4">401</span> <span class="s s4">403</span> <span class="s s4">405</span> <span class="s s4">409</span> <span class="s s4">429</span> <span class="s s4">413</span> <span class="s s4">415</span></p></section><section id="getAnnounce"><h3><span class="v get">GET</span> <code>/{scene}/{stream}/announce/v1/{key}</code></h3><p class="sum">One spatial.disco.Announce instance <span class="auth">open</span></p><p class="codes"><span class="s s2">200</span> <span class="s s3">304</span> <span class="s s4">404</span> <span class="s s4">429</span></p></section><section id="putAnnounce"><h3><span class="v put">PUT</span> <code>/{scene}/{stream}/announce/v1/{key}</code></h3><p class="sum">Publish or replace a spatial.disco.Announce <span class="auth">token</span></p><p>**Writes are per lane.** The path&#x27;s first segment is the scene; the bearer token must be granted it (<code>tenancy.WRITE_REFUSALS</code>). Every member of the record is required: a body is a whole record, never a patch. The body&#x27;s key must equal the URL&#x27;s. <code>If-Match</code> is honoured when present.</p><p class="codes"><span class="s s2">200</span> <span class="s s2">201</span> <span class="s s4">400</span> <span class="s s4">401</span> <span class="s s4">403</span> <span class="s s4">405</span> <span class="s s4">412</span> <span class="s s4">429</span> <span class="s s4">413</span> <span class="s s4">415</span> <span class="s s5">503</span></p></section><section id="withdrawAnnounce"><h3><span class="v delete">DELETE</span> <code>/{scene}/{stream}/announce/v1/{key}</code></h3><p class="sum">Withdraw (dispose) a spatial.disco.Announce <span class="auth">token</span></p><p>**Writes are per lane.** The path&#x27;s first segment is the scene; the bearer token must be granted it (<code>tenancy.WRITE_REFUSALS</code>). The dispose streams on the collection&#x27;s WebSocket with its <code>reason</code>.</p><p class="codes"><span class="s s2">204</span> <span class="s s4">400</span> <span class="s s4">401</span> <span class="s s4">403</span> <span class="s s4">404</span> <span class="s s4">405</span> <span class="s s4">429</span> <span class="s s5">503</span></p></section><section id="listContentAnnounce"><h3><span class="v get">GET</span> <code>/{scene}/{stream}/content_announce/v1</code></h3><p class="sum">Every spatial.disco.ContentAnnounce instance in the latched set <span class="auth">open</span></p><p>**The same URL is also a WebSocket** (N.5): connect with <code>wss://</code> and receive the latched set as <code>sample</code> events, exactly one <code>end_of_replay</code> carrying the replay count, then live <code>sample</code> and <code>dispose</code> events (<code>{event, topic, key, data | reason}</code>). Not modelled here; see [Appendix N.5](https://spatialdds.org/v1.8/appendix-n/).</p><p class="codes"><span class="s s2">200</span> <span class="s s3">304</span> <span class="s s4">404</span> <span class="s s4">429</span> <span class="s s5">503</span></p></section><section id="commandContentAnnounce"><h3><span class="v post">POST</span> <code>/{scene}/{stream}/content_announce/v1</code></h3><p class="sum">An N.6 command addressed through the content_announce lane <span class="auth">token</span></p><p>Accepted only on a lane whose topic advertises <code>accepts_commands</code>; otherwise <code>405</code>. **Writes are per lane.** The path&#x27;s first segment is the scene; the bearer token must be granted it (<code>tenancy.WRITE_REFUSALS</code>). Every member of the record is required: a body is a whole record, never a patch.</p><p class="codes"><span class="s s2">202</span> <span class="s s4">400</span> <span class="s s4">401</span> <span class="s s4">403</span> <span class="s s4">405</span> <span class="s s4">409</span> <span class="s s4">429</span> <span class="s s4">413</span> <span class="s s4">415</span></p></section><section id="getContentAnnounce"><h3><span class="v get">GET</span> <code>/{scene}/{stream}/content_announce/v1/{key}</code></h3><p class="sum">One spatial.disco.ContentAnnounce instance <span class="auth">open</span></p><p class="codes"><span class="s s2">200</span> <span class="s s3">304</span> <span class="s s4">404</span> <span class="s s4">429</span></p></section><section id="putContentAnnounce"><h3><span class="v put">PUT</span> <code>/{scene}/{stream}/content_announce/v1/{key}</code></h3><p class="sum">Publish or replace a spatial.disco.ContentAnnounce <span class="auth">token</span></p><p>**Writes are per lane.** The path&#x27;s first segment is the scene; the bearer token must be granted it (<code>tenancy.WRITE_REFUSALS</code>). Every member of the record is required: a body is a whole record, never a patch. The body&#x27;s key must equal the URL&#x27;s. <code>If-Match</code> is honoured when present.</p><p class="codes"><span class="s s2">200</span> <span class="s s2">201</span> <span class="s s4">400</span> <span class="s s4">401</span> <span class="s s4">403</span> <span class="s s4">405</span> <span class="s s4">412</span> <span class="s s4">429</span> <span class="s s4">413</span> <span class="s s4">415</span> <span class="s s5">503</span></p></section><section id="withdrawContentAnnounce"><h3><span class="v delete">DELETE</span> <code>/{scene}/{stream}/content_announce/v1/{key}</code></h3><p class="sum">Withdraw (dispose) a spatial.disco.ContentAnnounce <span class="auth">token</span></p><p>**Writes are per lane.** The path&#x27;s first segment is the scene; the bearer token must be granted it (<code>tenancy.WRITE_REFUSALS</code>). The dispose streams on the collection&#x27;s WebSocket with its <code>reason</code>.</p><p class="codes"><span class="s s2">204</span> <span class="s s4">400</span> <span class="s s4">401</span> <span class="s s4">403</span> <span class="s s4">404</span> <span class="s s4">405</span> <span class="s s4">429</span> <span class="s s5">503</span></p></section><section id="listGeoAnchor"><h3><span class="v get">GET</span> <code>/{scene}/{stream}/geo_anchor/v1</code></h3><p class="sum">Every spatial.core.GeoAnchor instance in the latched set <span class="auth">open</span></p><p>**The same URL is also a WebSocket** (N.5): connect with <code>wss://</code> and receive the latched set as <code>sample</code> events, exactly one <code>end_of_replay</code> carrying the replay count, then live <code>sample</code> and <code>dispose</code> events (<code>{event, topic, key, data | reason}</code>). Not modelled here; see [Appendix N.5](https://spatialdds.org/v1.8/appendix-n/).</p><p class="codes"><span class="s s2">200</span> <span class="s s3">304</span> <span class="s s4">404</span> <span class="s s4">429</span> <span class="s s5">503</span></p></section><section id="commandGeoAnchor"><h3><span class="v post">POST</span> <code>/{scene}/{stream}/geo_anchor/v1</code></h3><p class="sum">An N.6 command addressed through the geo_anchor lane <span class="auth">token</span></p><p>Accepted only on a lane whose topic advertises <code>accepts_commands</code>; otherwise <code>405</code>. **Writes are per lane.** The path&#x27;s first segment is the scene; the bearer token must be granted it (<code>tenancy.WRITE_REFUSALS</code>). Every member of the record is required: a body is a whole record, never a patch.</p><p class="codes"><span class="s s2">202</span> <span class="s s4">400</span> <span class="s s4">401</span> <span class="s s4">403</span> <span class="s s4">405</span> <span class="s s4">409</span> <span class="s s4">429</span> <span class="s s4">413</span> <span class="s s4">415</span></p></section><section id="getGeoAnchor"><h3><span class="v get">GET</span> <code>/{scene}/{stream}/geo_anchor/v1/{key}</code></h3><p class="sum">One spatial.core.GeoAnchor instance <span class="auth">open</span></p><p class="codes"><span class="s s2">200</span> <span class="s s3">304</span> <span class="s s4">404</span> <span class="s s4">429</span></p></section><section id="putGeoAnchor"><h3><span class="v put">PUT</span> <code>/{scene}/{stream}/geo_anchor/v1/{key}</code></h3><p class="sum">Publish or replace a spatial.core.GeoAnchor <span class="auth">token</span></p><p>**Writes are per lane.** The path&#x27;s first segment is the scene; the bearer token must be granted it (<code>tenancy.WRITE_REFUSALS</code>). Every member of the record is required: a body is a whole record, never a patch. The body&#x27;s key must equal the URL&#x27;s. <code>If-Match</code> is honoured when present.</p><p class="codes"><span class="s s2">200</span> <span class="s s2">201</span> <span class="s s4">400</span> <span class="s s4">401</span> <span class="s s4">403</span> <span class="s s4">405</span> <span class="s s4">412</span> <span class="s s4">429</span> <span class="s s4">413</span> <span class="s s4">415</span> <span class="s s5">503</span></p></section><section id="withdrawGeoAnchor"><h3><span class="v delete">DELETE</span> <code>/{scene}/{stream}/geo_anchor/v1/{key}</code></h3><p class="sum">Withdraw (dispose) a spatial.core.GeoAnchor <span class="auth">token</span></p><p>**Writes are per lane.** The path&#x27;s first segment is the scene; the bearer token must be granted it (<code>tenancy.WRITE_REFUSALS</code>). The dispose streams on the collection&#x27;s WebSocket with its <code>reason</code>.</p><p class="codes"><span class="s s2">204</span> <span class="s s4">400</span> <span class="s s4">401</span> <span class="s s4">403</span> <span class="s s4">404</span> <span class="s s4">405</span> <span class="s s4">429</span> <span class="s s5">503</span></p></section><section id="listInstances"><h3><span class="v get">GET</span> <code>/{scene}/{stream}/{type}/{version}</code></h3><p class="sum">Any other served topic, read-only <span class="auth">token for operator-scoped</span></p><p>Latched types answer with the latched set; streamed types with the replayed window. Public or operator-scoped per the type: <code>spatial.core.FrameTransform</code> latched public, <code>spatial.events.CrossingLine</code> latched public, <code>spatial.events.SpatialEvent</code> stream bearer, <code>spatial.events.SpatialZone</code> latched public, <code>spatial.owm.Entity</code> latched bearer, <code>spatial.owm.ModelPose</code> stream bearer, <code>spatial.semantics.Detection2DSet</code> stream bearer, <code>spatial.semantics.Detection3DSet</code> stream bearer, <code>spatial.semantics.FusedTrackSet</code> stream bearer. **The same URL is also a WebSocket** (N.5): connect with <code>wss://</code> and receive the latched set as <code>sample</code> events, exactly one <code>end_of_replay</code> carrying the replay count, then live <code>sample</code> and <code>dispose</code> events (<code>{event, topic, key, data | reason}</code>). Not modelled here; see [Appendix N.5](https://spatialdds.org/v1.8/appendix-n/).</p><p class="codes"><span class="s s2">200</span> <span class="s s3">304</span> <span class="s s4">401</span> <span class="s s4">404</span> <span class="s s4">429</span> <span class="s s5">503</span></p></section><section id="listWellKnownInstances"><h3><span class="v get">GET</span> <code>/.well-known/spatialdds/{stream}/{type}/{version}</code></h3><p class="sum">A four-segment topic&#x27;s collection <span class="auth">token for operator-scoped</span></p><p>A four-segment topic (<code>spatialdds/&lt;stream&gt;/&lt;type&gt;/&lt;version&gt;</code>, no scene), such as the discovery announce lane, served exactly as a scene-scoped collection is: latched set, <code>ETag</code>, <code>304</code>, the same access classes, and the N.5 stream by upgrading the same path. Read-only: a topic with no scene is in no lane. **The same URL is also a WebSocket** (N.5): connect with <code>wss://</code> and receive the latched set as <code>sample</code> events, exactly one <code>end_of_replay</code> carrying the replay count, then live <code>sample</code> and <code>dispose</code> events (<code>{event, topic, key, data | reason}</code>). Not modelled here; see [Appendix N.5](https://spatialdds.org/v1.8/appendix-n/).</p><p class="codes"><span class="s s2">200</span> <span class="s s3">304</span> <span class="s s4">401</span> <span class="s s4">404</span> <span class="s s4">429</span> <span class="s s5">503</span></p></section><section id="getWellKnownInstance"><h3><span class="v get">GET</span> <code>/.well-known/spatialdds/{stream}/{type}/{version}/{key}</code></h3><p class="sum">One instance of a four-segment topic <span class="auth">token for operator-scoped</span></p><p>A four-segment topic (<code>spatialdds/&lt;stream&gt;/&lt;type&gt;/&lt;version&gt;</code>, no scene), such as the discovery announce lane, served exactly as a scene-scoped collection is: latched set, <code>ETag</code>, <code>304</code>, the same access classes, and the N.5 stream by upgrading the same path. Read-only: a topic with no scene is in no lane. </p><p class="codes"><span class="s s2">200</span> <span class="s s3">304</span> <span class="s s4">401</span> <span class="s s4">404</span> <span class="s s4">429</span> <span class="s s5">503</span></p></section><h2>Schemas</h2><p class=mut>115 components, from the published JSON Schemas at <code>/.well-known/spatialdds/schemas</code>.</p></main></body></html>
17
+ .s{margin-right:.5rem}.s4,.s5{color:#b5482c}a{color:var(--acc)}</style></head><body><main><h1>SpatialDDS web binding (spatialdds-py)</h1><p class=mut>Version 0.7.4 · OpenAPI 3.1.0 · generated, never hand-written · <a href='openapi'>openapi.yaml</a></p><p>Generated by <code>tools/gen_openapi.py</code> from the gateway&#x27;s own tables and the published JSON Schemas; never edited by hand. Reads are open; writes take a bearer token scoped to scenes. The WebSocket streams (N.5) are described on each collection path, not modelled.</p><h2>Operations</h2><section id="search"><h3><span class="v get">GET</span> <code>/.well-known/spatialdds/search</code></h3><p class="sum">Services near a geohash (§8.2.3 manifests) <span class="auth">open</span></p><p class="codes"><span class="s s2">200</span> <span class="s s4">429</span></p></section><section id="searchPost"><h3><span class="v post">POST</span> <code>/.well-known/spatialdds/search</code></h3><p class="sum">The same search, as a POST body <span class="auth">open</span></p><p class="codes"><span class="s s2">200</span> <span class="s s4">429</span> <span class="s s4">413</span> <span class="s s4">415</span></p></section><section id="listSchemas"><h3><span class="v get">GET</span> <code>/.well-known/spatialdds/schemas</code></h3><p class="sum">The published JSON Schemas, by type <span class="auth">open</span></p><p class="codes"><span class="s s2">200</span> <span class="s s4">429</span></p></section><section id="getSchema"><h3><span class="v get">GET</span> <code>/.well-known/spatialdds/schemas/{type}</code></h3><p class="sum"> <span class="auth">open</span></p><p class="codes"><span class="s s2">200</span> <span class="s s4">404</span> <span class="s s4">429</span></p></section><section id="bootstrap"><h3><span class="v get">GET</span> <code>/.well-known/spatialdds/bootstrap</code></h3><p class="sum">DDS-join material (N.2); optional <span class="auth">open</span></p><p class="codes"><span class="s s2">200</span> <span class="s s4">404</span> <span class="s s4">429</span></p></section><section id="resolverMetadata"><h3><span class="v get">GET</span> <code>/.well-known/spatialdds/resolver</code></h3><p class="sum">§7.5.2 resolver metadata <span class="auth">open</span></p><p class="codes"><span class="s s2">200</span> <span class="s s4">404</span> <span class="s s4">429</span></p></section><section id="openapi"><h3><span class="v get">GET</span> <code>/.well-known/spatialdds/openapi</code></h3><p class="sum">This document <span class="auth">open</span></p><p class="codes"><span class="s s2">200</span> <span class="s s4">429</span></p></section><section id="openapiPage"><h3><span class="v get">GET</span> <code>/.well-known/spatialdds/openapi.html</code></h3><p class="sum">This document as a static reference page <span class="auth">open</span></p><p class="codes"><span class="s s2">200</span> <span class="s s4">429</span></p></section><section id="resolve"><h3><span class="v get">GET</span> <code>/spatialdds/resolve</code></h3><p class="sum">Resolve a URI to its manifest (§7.5.2) <span class="auth">open</span></p><p class="codes"><span class="s s2">200</span> <span class="s s4">400</span> <span class="s s4">404</span> <span class="s s4">429</span></p></section><section id="putManifest"><h3><span class="v put">PUT</span> <code>/spatialdds/resolve</code></h3><p class="sum">Publish a manifest, keyed by its own <code>id</code> <span class="auth">token</span></p><p>The <code>uri</code> parameter is not used; the body&#x27;s <code>id</code> is the key. Its scene segment is the lane. **Writes are per lane.** The path&#x27;s first segment is the scene; the bearer token must be granted it (<code>tenancy.WRITE_REFUSALS</code>).</p><p class="codes"><span class="s s2">200</span> <span class="s s2">201</span> <span class="s s4">400</span> <span class="s s4">401</span> <span class="s s4">403</span> <span class="s s4">405</span> <span class="s s4">429</span> <span class="s s4">413</span> <span class="s s4">415</span> <span class="s s5">503</span></p></section><section id="withdrawManifest"><h3><span class="v delete">DELETE</span> <code>/spatialdds/resolve</code></h3><p class="sum">Withdraw a manifest; <code>resolve</code> then answers 404 <span class="auth">token</span></p><p>Owner-checked by the URI&#x27;s scene segment. **Writes are per lane.** The path&#x27;s first segment is the scene; the bearer token must be granted it (<code>tenancy.WRITE_REFUSALS</code>).</p><p class="codes"><span class="s s2">204</span> <span class="s s4">400</span> <span class="s s4">401</span> <span class="s s4">403</span> <span class="s s4">404</span> <span class="s s4">405</span> <span class="s s4">429</span> <span class="s s5">503</span></p></section><section id="getAsset"><h3><span class="v get">GET</span> <code>/assets/{name}</code></h3><p class="sum">Asset bytes this endpoint hosts (implementation-defined) <span class="auth">open</span></p><p class="codes"><span class="s s2">200</span> <span class="s s4">404</span> <span class="s s4">429</span></p></section><section id="listAnnounce"><h3><span class="v get">GET</span> <code>/{scene}/{stream}/announce/v1</code></h3><p class="sum">Every spatial.disco.Announce instance in the latched set <span class="auth">open</span></p><p>**The same URL is also a WebSocket** (N.5): connect with <code>wss://</code> and receive the latched set as <code>sample</code> events, exactly one <code>end_of_replay</code> carrying the replay count, then live <code>sample</code> and <code>dispose</code> events (<code>{event, topic, key, data | reason}</code>). Not modelled here; see [Appendix N.5](https://spatialdds.org/v1.8/appendix-n/).</p><p class="codes"><span class="s s2">200</span> <span class="s s3">304</span> <span class="s s4">404</span> <span class="s s4">429</span> <span class="s s5">503</span></p></section><section id="commandAnnounce"><h3><span class="v post">POST</span> <code>/{scene}/{stream}/announce/v1</code></h3><p class="sum">An N.6 command addressed through the announce lane <span class="auth">token</span></p><p>Accepted only on a lane whose topic advertises <code>accepts_commands</code>; otherwise <code>405</code>. **Writes are per lane.** The path&#x27;s first segment is the scene; the bearer token must be granted it (<code>tenancy.WRITE_REFUSALS</code>). Every member of the record is required: a body is a whole record, never a patch.</p><p class="codes"><span class="s s2">202</span> <span class="s s4">400</span> <span class="s s4">401</span> <span class="s s4">403</span> <span class="s s4">405</span> <span class="s s4">409</span> <span class="s s4">429</span> <span class="s s4">413</span> <span class="s s4">415</span></p></section><section id="getAnnounce"><h3><span class="v get">GET</span> <code>/{scene}/{stream}/announce/v1/{key}</code></h3><p class="sum">One spatial.disco.Announce instance <span class="auth">open</span></p><p class="codes"><span class="s s2">200</span> <span class="s s3">304</span> <span class="s s4">404</span> <span class="s s4">429</span></p></section><section id="putAnnounce"><h3><span class="v put">PUT</span> <code>/{scene}/{stream}/announce/v1/{key}</code></h3><p class="sum">Publish or replace a spatial.disco.Announce <span class="auth">token</span></p><p>**Writes are per lane.** The path&#x27;s first segment is the scene; the bearer token must be granted it (<code>tenancy.WRITE_REFUSALS</code>). Every member of the record is required: a body is a whole record, never a patch. The body&#x27;s key must equal the URL&#x27;s. <code>If-Match</code> is honoured when present.</p><p class="codes"><span class="s s2">200</span> <span class="s s2">201</span> <span class="s s4">400</span> <span class="s s4">401</span> <span class="s s4">403</span> <span class="s s4">405</span> <span class="s s4">412</span> <span class="s s4">429</span> <span class="s s4">413</span> <span class="s s4">415</span> <span class="s s5">503</span></p></section><section id="withdrawAnnounce"><h3><span class="v delete">DELETE</span> <code>/{scene}/{stream}/announce/v1/{key}</code></h3><p class="sum">Withdraw (dispose) a spatial.disco.Announce <span class="auth">token</span></p><p>**Writes are per lane.** The path&#x27;s first segment is the scene; the bearer token must be granted it (<code>tenancy.WRITE_REFUSALS</code>). The dispose streams on the collection&#x27;s WebSocket with its <code>reason</code>.</p><p class="codes"><span class="s s2">204</span> <span class="s s4">400</span> <span class="s s4">401</span> <span class="s s4">403</span> <span class="s s4">404</span> <span class="s s4">405</span> <span class="s s4">429</span> <span class="s s5">503</span></p></section><section id="listContentAnnounce"><h3><span class="v get">GET</span> <code>/{scene}/{stream}/content_announce/v1</code></h3><p class="sum">Every spatial.disco.ContentAnnounce instance in the latched set <span class="auth">open</span></p><p>**The same URL is also a WebSocket** (N.5): connect with <code>wss://</code> and receive the latched set as <code>sample</code> events, exactly one <code>end_of_replay</code> carrying the replay count, then live <code>sample</code> and <code>dispose</code> events (<code>{event, topic, key, data | reason}</code>). Not modelled here; see [Appendix N.5](https://spatialdds.org/v1.8/appendix-n/).</p><p class="codes"><span class="s s2">200</span> <span class="s s3">304</span> <span class="s s4">404</span> <span class="s s4">429</span> <span class="s s5">503</span></p></section><section id="commandContentAnnounce"><h3><span class="v post">POST</span> <code>/{scene}/{stream}/content_announce/v1</code></h3><p class="sum">An N.6 command addressed through the content_announce lane <span class="auth">token</span></p><p>Accepted only on a lane whose topic advertises <code>accepts_commands</code>; otherwise <code>405</code>. **Writes are per lane.** The path&#x27;s first segment is the scene; the bearer token must be granted it (<code>tenancy.WRITE_REFUSALS</code>). Every member of the record is required: a body is a whole record, never a patch.</p><p class="codes"><span class="s s2">202</span> <span class="s s4">400</span> <span class="s s4">401</span> <span class="s s4">403</span> <span class="s s4">405</span> <span class="s s4">409</span> <span class="s s4">429</span> <span class="s s4">413</span> <span class="s s4">415</span></p></section><section id="getContentAnnounce"><h3><span class="v get">GET</span> <code>/{scene}/{stream}/content_announce/v1/{key}</code></h3><p class="sum">One spatial.disco.ContentAnnounce instance <span class="auth">open</span></p><p class="codes"><span class="s s2">200</span> <span class="s s3">304</span> <span class="s s4">404</span> <span class="s s4">429</span></p></section><section id="putContentAnnounce"><h3><span class="v put">PUT</span> <code>/{scene}/{stream}/content_announce/v1/{key}</code></h3><p class="sum">Publish or replace a spatial.disco.ContentAnnounce <span class="auth">token</span></p><p>**Writes are per lane.** The path&#x27;s first segment is the scene; the bearer token must be granted it (<code>tenancy.WRITE_REFUSALS</code>). Every member of the record is required: a body is a whole record, never a patch. The body&#x27;s key must equal the URL&#x27;s. <code>If-Match</code> is honoured when present.</p><p class="codes"><span class="s s2">200</span> <span class="s s2">201</span> <span class="s s4">400</span> <span class="s s4">401</span> <span class="s s4">403</span> <span class="s s4">405</span> <span class="s s4">412</span> <span class="s s4">429</span> <span class="s s4">413</span> <span class="s s4">415</span> <span class="s s5">503</span></p></section><section id="withdrawContentAnnounce"><h3><span class="v delete">DELETE</span> <code>/{scene}/{stream}/content_announce/v1/{key}</code></h3><p class="sum">Withdraw (dispose) a spatial.disco.ContentAnnounce <span class="auth">token</span></p><p>**Writes are per lane.** The path&#x27;s first segment is the scene; the bearer token must be granted it (<code>tenancy.WRITE_REFUSALS</code>). The dispose streams on the collection&#x27;s WebSocket with its <code>reason</code>.</p><p class="codes"><span class="s s2">204</span> <span class="s s4">400</span> <span class="s s4">401</span> <span class="s s4">403</span> <span class="s s4">404</span> <span class="s s4">405</span> <span class="s s4">429</span> <span class="s s5">503</span></p></section><section id="listGeoAnchor"><h3><span class="v get">GET</span> <code>/{scene}/{stream}/geo_anchor/v1</code></h3><p class="sum">Every spatial.core.GeoAnchor instance in the latched set <span class="auth">open</span></p><p>**The same URL is also a WebSocket** (N.5): connect with <code>wss://</code> and receive the latched set as <code>sample</code> events, exactly one <code>end_of_replay</code> carrying the replay count, then live <code>sample</code> and <code>dispose</code> events (<code>{event, topic, key, data | reason}</code>). Not modelled here; see [Appendix N.5](https://spatialdds.org/v1.8/appendix-n/).</p><p class="codes"><span class="s s2">200</span> <span class="s s3">304</span> <span class="s s4">404</span> <span class="s s4">429</span> <span class="s s5">503</span></p></section><section id="commandGeoAnchor"><h3><span class="v post">POST</span> <code>/{scene}/{stream}/geo_anchor/v1</code></h3><p class="sum">An N.6 command addressed through the geo_anchor lane <span class="auth">token</span></p><p>Accepted only on a lane whose topic advertises <code>accepts_commands</code>; otherwise <code>405</code>. **Writes are per lane.** The path&#x27;s first segment is the scene; the bearer token must be granted it (<code>tenancy.WRITE_REFUSALS</code>). Every member of the record is required: a body is a whole record, never a patch.</p><p class="codes"><span class="s s2">202</span> <span class="s s4">400</span> <span class="s s4">401</span> <span class="s s4">403</span> <span class="s s4">405</span> <span class="s s4">409</span> <span class="s s4">429</span> <span class="s s4">413</span> <span class="s s4">415</span></p></section><section id="getGeoAnchor"><h3><span class="v get">GET</span> <code>/{scene}/{stream}/geo_anchor/v1/{key}</code></h3><p class="sum">One spatial.core.GeoAnchor instance <span class="auth">open</span></p><p class="codes"><span class="s s2">200</span> <span class="s s3">304</span> <span class="s s4">404</span> <span class="s s4">429</span></p></section><section id="putGeoAnchor"><h3><span class="v put">PUT</span> <code>/{scene}/{stream}/geo_anchor/v1/{key}</code></h3><p class="sum">Publish or replace a spatial.core.GeoAnchor <span class="auth">token</span></p><p>**Writes are per lane.** The path&#x27;s first segment is the scene; the bearer token must be granted it (<code>tenancy.WRITE_REFUSALS</code>). Every member of the record is required: a body is a whole record, never a patch. The body&#x27;s key must equal the URL&#x27;s. <code>If-Match</code> is honoured when present.</p><p class="codes"><span class="s s2">200</span> <span class="s s2">201</span> <span class="s s4">400</span> <span class="s s4">401</span> <span class="s s4">403</span> <span class="s s4">405</span> <span class="s s4">412</span> <span class="s s4">429</span> <span class="s s4">413</span> <span class="s s4">415</span> <span class="s s5">503</span></p></section><section id="withdrawGeoAnchor"><h3><span class="v delete">DELETE</span> <code>/{scene}/{stream}/geo_anchor/v1/{key}</code></h3><p class="sum">Withdraw (dispose) a spatial.core.GeoAnchor <span class="auth">token</span></p><p>**Writes are per lane.** The path&#x27;s first segment is the scene; the bearer token must be granted it (<code>tenancy.WRITE_REFUSALS</code>). The dispose streams on the collection&#x27;s WebSocket with its <code>reason</code>.</p><p class="codes"><span class="s s2">204</span> <span class="s s4">400</span> <span class="s s4">401</span> <span class="s s4">403</span> <span class="s s4">404</span> <span class="s s4">405</span> <span class="s s4">429</span> <span class="s s5">503</span></p></section><section id="listInstances"><h3><span class="v get">GET</span> <code>/{scene}/{stream}/{type}/{version}</code></h3><p class="sum">Any other served topic, read-only <span class="auth">token for operator-scoped</span></p><p>Latched types answer with the latched set; streamed types with the replayed window. Public or operator-scoped per the type: <code>spatial.core.FrameTransform</code> latched public, <code>spatial.events.CrossingLine</code> latched public, <code>spatial.events.SpatialEvent</code> stream bearer, <code>spatial.events.SpatialZone</code> latched public, <code>spatial.owm.Entity</code> latched bearer, <code>spatial.owm.ModelPose</code> stream bearer, <code>spatial.semantics.Detection2DSet</code> stream bearer, <code>spatial.semantics.Detection3DSet</code> stream bearer, <code>spatial.semantics.FusedTrackSet</code> stream bearer. **The same URL is also a WebSocket** (N.5): connect with <code>wss://</code> and receive the latched set as <code>sample</code> events, exactly one <code>end_of_replay</code> carrying the replay count, then live <code>sample</code> and <code>dispose</code> events (<code>{event, topic, key, data | reason}</code>). Not modelled here; see [Appendix N.5](https://spatialdds.org/v1.8/appendix-n/).</p><p class="codes"><span class="s s2">200</span> <span class="s s3">304</span> <span class="s s4">401</span> <span class="s s4">404</span> <span class="s s4">429</span> <span class="s s5">503</span></p></section><section id="listWellKnownInstances"><h3><span class="v get">GET</span> <code>/.well-known/spatialdds/{stream}/{type}/{version}</code></h3><p class="sum">A four-segment topic&#x27;s collection <span class="auth">token for operator-scoped</span></p><p>A four-segment topic (<code>spatialdds/&lt;stream&gt;/&lt;type&gt;/&lt;version&gt;</code>, no scene), such as the discovery announce lane, served exactly as a scene-scoped collection is: latched set, <code>ETag</code>, <code>304</code>, the same access classes, and the N.5 stream by upgrading the same path. Read-only: a topic with no scene is in no lane. **The same URL is also a WebSocket** (N.5): connect with <code>wss://</code> and receive the latched set as <code>sample</code> events, exactly one <code>end_of_replay</code> carrying the replay count, then live <code>sample</code> and <code>dispose</code> events (<code>{event, topic, key, data | reason}</code>). Not modelled here; see [Appendix N.5](https://spatialdds.org/v1.8/appendix-n/).</p><p class="codes"><span class="s s2">200</span> <span class="s s3">304</span> <span class="s s4">401</span> <span class="s s4">404</span> <span class="s s4">429</span> <span class="s s5">503</span></p></section><section id="getWellKnownInstance"><h3><span class="v get">GET</span> <code>/.well-known/spatialdds/{stream}/{type}/{version}/{key}</code></h3><p class="sum">One instance of a four-segment topic <span class="auth">token for operator-scoped</span></p><p>A four-segment topic (<code>spatialdds/&lt;stream&gt;/&lt;type&gt;/&lt;version&gt;</code>, no scene), such as the discovery announce lane, served exactly as a scene-scoped collection is: latched set, <code>ETag</code>, <code>304</code>, the same access classes, and the N.5 stream by upgrading the same path. Read-only: a topic with no scene is in no lane. </p><p class="codes"><span class="s s2">200</span> <span class="s s3">304</span> <span class="s s4">401</span> <span class="s s4">404</span> <span class="s s4">429</span> <span class="s s5">503</span></p></section><h2>Schemas</h2><p class=mut>115 components, from the published JSON Schemas at <code>/.well-known/spatialdds/schemas</code>.</p></main></body></html>
@@ -2,7 +2,7 @@
2
2
  openapi: 3.1.0
3
3
  info:
4
4
  title: SpatialDDS web binding (spatialdds-py)
5
- version: 0.7.2
5
+ version: 0.7.4
6
6
  summary: SpatialDDS 1.8 Appendix N over HTTPS, plus this endpoint's write surface.
7
7
  description: Generated by `tools/gen_openapi.py` from the gateway's own tables and the published JSON Schemas; never edited by hand. Reads are open; writes take a bearer token scoped to scenes. The WebSocket streams (N.5) are described on each collection path, not modelled.
8
8
  servers:
@@ -216,6 +216,7 @@
216
216
  "anchor_delta": {
217
217
  "idl": "spatial::anchors::AnchorDelta",
218
218
  "profile": "ANCHOR_DELTA",
219
+ "profile_template": null,
219
220
  "provisional": false,
220
221
  "spelled_qos": {},
221
222
  "topic_template": null
@@ -223,6 +224,7 @@
223
224
  "crossing_line": {
224
225
  "idl": "spatial::events::CrossingLine",
225
226
  "profile": "ZONE_META",
227
+ "profile_template": null,
226
228
  "provisional": false,
227
229
  "spelled_qos": {},
228
230
  "topic_template": null
@@ -230,6 +232,7 @@
230
232
  "desc_array": {
231
233
  "idl": "spatial::slam_frontend::KeyframeFeatures",
232
234
  "profile": "DESC_BATCH",
235
+ "profile_template": null,
233
236
  "provisional": false,
234
237
  "spelled_qos": {},
235
238
  "topic_template": null
@@ -237,6 +240,7 @@
237
240
  "detection2d": {
238
241
  "idl": "spatial::semantics::Detection2DSet",
239
242
  "profile": "DET_RT",
243
+ "profile_template": null,
240
244
  "provisional": false,
241
245
  "spelled_qos": {},
242
246
  "topic_template": null
@@ -244,6 +248,7 @@
244
248
  "detection3d": {
245
249
  "idl": "spatial::semantics::Detection3DSet",
246
250
  "profile": "DET_RT",
251
+ "profile_template": null,
247
252
  "provisional": false,
248
253
  "spelled_qos": {},
249
254
  "topic_template": null
@@ -251,6 +256,10 @@
251
256
  "entity_binding": {
252
257
  "idl": "spatial::core::EntityBinding",
253
258
  "profile": null,
259
+ "profile_template": {
260
+ "level": "SHOULD",
261
+ "topic": "spatialdds/<scene>/entity/binding/v1"
262
+ },
254
263
  "provisional": false,
255
264
  "spelled_qos": {},
256
265
  "topic_template": null
@@ -258,6 +267,7 @@
258
267
  "framed_pose": {
259
268
  "idl": "spatial::core::FramedPose",
260
269
  "profile": "POSE_RT",
270
+ "profile_template": null,
261
271
  "provisional": false,
262
272
  "spelled_qos": {},
263
273
  "topic_template": null
@@ -265,6 +275,7 @@
265
275
  "fused_track": {
266
276
  "idl": "spatial::semantics::FusedTrackSet",
267
277
  "profile": "DET_RT",
278
+ "profile_template": null,
268
279
  "provisional": false,
269
280
  "spelled_qos": {},
270
281
  "topic_template": null
@@ -272,6 +283,7 @@
272
283
  "geometry_tile": {
273
284
  "idl": "spatial::core::TileMeta",
274
285
  "profile": "GEOM_TILE",
286
+ "profile_template": null,
275
287
  "provisional": false,
276
288
  "spelled_qos": {},
277
289
  "topic_template": null
@@ -279,6 +291,7 @@
279
291
  "geopose": {
280
292
  "idl": "spatial::core::GeoPose",
281
293
  "profile": "POSE_RT",
294
+ "profile_template": null,
282
295
  "provisional": false,
283
296
  "spelled_qos": {},
284
297
  "topic_template": null
@@ -286,6 +299,7 @@
286
299
  "imu_sample": {
287
300
  "idl": "spatial::vio::ImuSample",
288
301
  "profile": "IMU_RT",
302
+ "profile_template": null,
289
303
  "provisional": false,
290
304
  "spelled_qos": {},
291
305
  "topic_template": null
@@ -293,6 +307,7 @@
293
307
  "lidar_frame": {
294
308
  "idl": "spatial::sensing::lidar::LidarFrame",
295
309
  "profile": "LIDAR_RT",
310
+ "profile_template": null,
296
311
  "provisional": false,
297
312
  "spelled_qos": {},
298
313
  "topic_template": null
@@ -300,6 +315,7 @@
300
315
  "lidar_meta": {
301
316
  "idl": "spatial::sensing::lidar::LidarMeta",
302
317
  "profile": "SENSOR_META",
318
+ "profile_template": null,
303
319
  "provisional": false,
304
320
  "spelled_qos": {},
305
321
  "topic_template": null
@@ -307,6 +323,7 @@
307
323
  "map_alignment": {
308
324
  "idl": "spatial::mapping::MapAlignment",
309
325
  "profile": "MAP_META",
326
+ "profile_template": null,
310
327
  "provisional": false,
311
328
  "spelled_qos": {},
312
329
  "topic_template": null
@@ -314,6 +331,7 @@
314
331
  "map_event": {
315
332
  "idl": "spatial::mapping::MapEvent",
316
333
  "profile": "MAP_META",
334
+ "profile_template": null,
317
335
  "provisional": false,
318
336
  "spelled_qos": {},
319
337
  "topic_template": null
@@ -321,6 +339,7 @@
321
339
  "map_meta": {
322
340
  "idl": "spatial::mapping::MapMeta",
323
341
  "profile": "MAP_META",
342
+ "profile_template": null,
324
343
  "provisional": false,
325
344
  "spelled_qos": {},
326
345
  "topic_template": null
@@ -328,6 +347,7 @@
328
347
  "model_command": {
329
348
  "idl": "spatial::owm::ModelCommand",
330
349
  "profile": null,
350
+ "profile_template": null,
331
351
  "provisional": true,
332
352
  "spelled_qos": {
333
353
  "durability": "VOLATILE",
@@ -341,6 +361,7 @@
341
361
  "model_entity": {
342
362
  "idl": "spatial::owm::Entity",
343
363
  "profile": null,
364
+ "profile_template": null,
344
365
  "provisional": true,
345
366
  "spelled_qos": {
346
367
  "durability": "TRANSIENT_LOCAL",
@@ -355,6 +376,7 @@
355
376
  "model_pose": {
356
377
  "idl": "spatial::owm::ModelPose",
357
378
  "profile": null,
379
+ "profile_template": null,
358
380
  "provisional": true,
359
381
  "spelled_qos": {
360
382
  "durability": "VOLATILE",
@@ -368,6 +390,7 @@
368
390
  "navsat_status": {
369
391
  "idl": "spatial::core::NavSatStatus",
370
392
  "profile": null,
393
+ "profile_template": null,
371
394
  "provisional": false,
372
395
  "spelled_qos": {},
373
396
  "topic_template": null
@@ -375,6 +398,10 @@
375
398
  "planned_trajectory": {
376
399
  "idl": "spatial::core::PlannedTrajectory",
377
400
  "profile": "EVENT_RT",
401
+ "profile_template": {
402
+ "level": "SHOULD",
403
+ "topic": "spatialdds/<scene>/plan/<agent_id>/trajectory/v1"
404
+ },
378
405
  "provisional": false,
379
406
  "spelled_qos": {},
380
407
  "topic_template": null
@@ -382,6 +409,7 @@
382
409
  "rad_sensor_meta": {
383
410
  "idl": "spatial::sensing::rad::RadSensorMeta",
384
411
  "profile": "SENSOR_META",
412
+ "profile_template": null,
385
413
  "provisional": false,
386
414
  "spelled_qos": {},
387
415
  "topic_template": null
@@ -389,6 +417,7 @@
389
417
  "radar_detection": {
390
418
  "idl": "spatial::sensing::rad::RadDetectionSet",
391
419
  "profile": "RADAR_RT",
420
+ "profile_template": null,
392
421
  "provisional": false,
393
422
  "spelled_qos": {},
394
423
  "topic_template": null
@@ -396,6 +425,7 @@
396
425
  "radar_tensor": {
397
426
  "idl": "spatial::sensing::rad::RadTensorFrame",
398
427
  "profile": "RADAR_RT",
428
+ "profile_template": null,
399
429
  "provisional": false,
400
430
  "spelled_qos": {},
401
431
  "topic_template": null
@@ -403,6 +433,7 @@
403
433
  "radar_tensor_meta": {
404
434
  "idl": "spatial::sensing::rad::RadTensorMeta",
405
435
  "profile": "SENSOR_META",
436
+ "profile_template": null,
406
437
  "provisional": false,
407
438
  "spelled_qos": {},
408
439
  "topic_template": null
@@ -410,6 +441,7 @@
410
441
  "radio_scan": {
411
442
  "idl": "spatial::sensing::radio::RadioScan",
412
443
  "profile": "RADIO_SCAN_RT",
444
+ "profile_template": null,
413
445
  "provisional": true,
414
446
  "spelled_qos": {},
415
447
  "topic_template": null
@@ -417,6 +449,7 @@
417
449
  "radio_sensor_meta": {
418
450
  "idl": "spatial::sensing::radio::RadioSensorMeta",
419
451
  "profile": "SENSOR_META",
452
+ "profile_template": null,
420
453
  "provisional": true,
421
454
  "spelled_qos": {},
422
455
  "topic_template": null
@@ -424,6 +457,7 @@
424
457
  "rf_beam": {
425
458
  "idl": "spatial::sensing::rf_beam::RfBeamFrame",
426
459
  "profile": "RF_BEAM_RT",
460
+ "profile_template": null,
427
461
  "provisional": true,
428
462
  "spelled_qos": {},
429
463
  "topic_template": null
@@ -431,6 +465,7 @@
431
465
  "rf_beam_meta": {
432
466
  "idl": "spatial::sensing::rf_beam::RfBeamMeta",
433
467
  "profile": "SENSOR_META",
468
+ "profile_template": null,
434
469
  "provisional": true,
435
470
  "spelled_qos": {},
436
471
  "topic_template": null
@@ -438,6 +473,7 @@
438
473
  "seg_mask": {
439
474
  "idl": "spatial::sensing::vision::VisionFrame",
440
475
  "profile": "SEG_MASK_RT",
476
+ "profile_template": null,
441
477
  "provisional": false,
442
478
  "spelled_qos": {},
443
479
  "topic_template": null
@@ -445,6 +481,7 @@
445
481
  "spatial_event": {
446
482
  "idl": "spatial::events::SpatialEvent",
447
483
  "profile": "EVENT_RT",
484
+ "profile_template": null,
448
485
  "provisional": false,
449
486
  "spelled_qos": {},
450
487
  "topic_template": null
@@ -452,6 +489,7 @@
452
489
  "spatial_zone": {
453
490
  "idl": "spatial::events::SpatialZone",
454
491
  "profile": "ZONE_META",
492
+ "profile_template": null,
455
493
  "provisional": false,
456
494
  "spelled_qos": {},
457
495
  "topic_template": null
@@ -459,6 +497,7 @@
459
497
  "video_frame": {
460
498
  "idl": "spatial::sensing::vision::VisionFrame",
461
499
  "profile": "VIDEO_LIVE",
500
+ "profile_template": null,
462
501
  "provisional": false,
463
502
  "spelled_qos": {},
464
503
  "topic_template": null
@@ -466,6 +505,7 @@
466
505
  "video_meta": {
467
506
  "idl": "spatial::sensing::vision::VisionMeta",
468
507
  "profile": "SENSOR_META",
508
+ "profile_template": null,
469
509
  "provisional": false,
470
510
  "spelled_qos": {},
471
511
  "topic_template": null
@@ -473,6 +513,7 @@
473
513
  "vps_query": {
474
514
  "idl": "spatial::argeo::VpsRequest",
475
515
  "profile": "VPS_REQ",
516
+ "profile_template": null,
476
517
  "provisional": false,
477
518
  "spelled_qos": {},
478
519
  "topic_template": null
@@ -480,6 +521,7 @@
480
521
  "vps_response": {
481
522
  "idl": "spatial::argeo::VpsResponse",
482
523
  "profile": "VPS_RESP",
524
+ "profile_template": null,
483
525
  "provisional": false,
484
526
  "spelled_qos": {},
485
527
  "topic_template": null
@@ -487,6 +529,7 @@
487
529
  "zone_state": {
488
530
  "idl": "spatial::events::ZoneState",
489
531
  "profile": "ZONE_META",
532
+ "profile_template": null,
490
533
  "provisional": false,
491
534
  "spelled_qos": {},
492
535
  "topic_template": null