mostlyright-data 0.9.0__py3-none-any.whl

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 (314) hide show
  1. mostlyright/data_harness/__init__.py +158 -0
  2. mostlyright/data_harness/acquisition/__init__.py +55 -0
  3. mostlyright/data_harness/acquisition/http.py +2773 -0
  4. mostlyright/data_harness/acquisition/parsing.py +809 -0
  5. mostlyright/data_harness/acquisition/ranges.py +495 -0
  6. mostlyright/data_harness/acquisition/result_download.py +360 -0
  7. mostlyright/data_harness/acquisition/retention_admission.py +248 -0
  8. mostlyright/data_harness/acquisition/sandbox.py +4888 -0
  9. mostlyright/data_harness/acquisition/url_policy.py +530 -0
  10. mostlyright/data_harness/agent_runtime.py +2743 -0
  11. mostlyright/data_harness/assets/logo-ink.svg +31 -0
  12. mostlyright/data_harness/backends/__init__.py +28 -0
  13. mostlyright/data_harness/backends/pandas_backend.py +350 -0
  14. mostlyright/data_harness/backends/polars_backend.py +366 -0
  15. mostlyright/data_harness/backends/protocol.py +124 -0
  16. mostlyright/data_harness/backends/reference.py +83 -0
  17. mostlyright/data_harness/backends/registry.py +55 -0
  18. mostlyright/data_harness/backends/restrictions.py +126 -0
  19. mostlyright/data_harness/canonical.py +333 -0
  20. mostlyright/data_harness/catalog_job.py +625 -0
  21. mostlyright/data_harness/cli.py +5398 -0
  22. mostlyright/data_harness/contracts.py +53 -0
  23. mostlyright/data_harness/coordinator.py +1307 -0
  24. mostlyright/data_harness/deploy.py +924 -0
  25. mostlyright/data_harness/deploy_target.py +312 -0
  26. mostlyright/data_harness/deployment_evidence.py +1067 -0
  27. mostlyright/data_harness/event_presentation.py +576 -0
  28. mostlyright/data_harness/events.py +2152 -0
  29. mostlyright/data_harness/fast_delimited.py +239 -0
  30. mostlyright/data_harness/fleet.py +237 -0
  31. mostlyright/data_harness/formats.py +236 -0
  32. mostlyright/data_harness/governors.py +1163 -0
  33. mostlyright/data_harness/hosted_bootstrap.py +972 -0
  34. mostlyright/data_harness/hosted_crawler.py +1115 -0
  35. mostlyright/data_harness/hosted_crawler_container_smoke.py +351 -0
  36. mostlyright/data_harness/hosted_crawler_fetch.py +423 -0
  37. mostlyright/data_harness/hosted_crawler_job.py +1277 -0
  38. mostlyright/data_harness/hosted_crawler_protocol.py +676 -0
  39. mostlyright/data_harness/hosted_dataset.py +1500 -0
  40. mostlyright/data_harness/hosted_deploy.py +3037 -0
  41. mostlyright/data_harness/hosted_handoff.py +62 -0
  42. mostlyright/data_harness/hosted_ingestion_contract.py +504 -0
  43. mostlyright/data_harness/hosted_ingestion_job.py +356 -0
  44. mostlyright/data_harness/hosted_ingestion_job_smoke.py +40 -0
  45. mostlyright/data_harness/hosted_session_container_smoke.py +194 -0
  46. mostlyright/data_harness/hosted_session_worker.py +3554 -0
  47. mostlyright/data_harness/hosted_session_worker_job_smoke.py +46 -0
  48. mostlyright/data_harness/hosted_worker.py +6784 -0
  49. mostlyright/data_harness/ingestion/__init__.py +56 -0
  50. mostlyright/data_harness/ingestion/contracts.py +461 -0
  51. mostlyright/data_harness/ingestion/faults.py +42 -0
  52. mostlyright/data_harness/ingestion/gcs_store.py +1162 -0
  53. mostlyright/data_harness/ingestion/spool.py +130 -0
  54. mostlyright/data_harness/ingestion/store.py +885 -0
  55. mostlyright/data_harness/key_seam.py +434 -0
  56. mostlyright/data_harness/linux_process_boundary.py +262 -0
  57. mostlyright/data_harness/local_contracts.py +2880 -0
  58. mostlyright/data_harness/local_search/__init__.py +5 -0
  59. mostlyright/data_harness/local_search/build_index.py +1087 -0
  60. mostlyright/data_harness/local_search/contracts.py +920 -0
  61. mostlyright/data_harness/local_search/query_trace.py +266 -0
  62. mostlyright/data_harness/local_search/retrieval.py +700 -0
  63. mostlyright/data_harness/local_search/sealed.py +474 -0
  64. mostlyright/data_harness/local_search/service.py +784 -0
  65. mostlyright/data_harness/nbrender/CONTRACT.md +212 -0
  66. mostlyright/data_harness/nbrender/__init__.py +12 -0
  67. mostlyright/data_harness/nbrender/chrome.py +359 -0
  68. mostlyright/data_harness/nbrender/code_body.py +266 -0
  69. mostlyright/data_harness/nbrender/document.py +407 -0
  70. mostlyright/data_harness/nbrender/frame.py +275 -0
  71. mostlyright/data_harness/nbrender/interactive.py +337 -0
  72. mostlyright/data_harness/nbrender/markdown_body.py +477 -0
  73. mostlyright/data_harness/nbrender/mr_components.py +134 -0
  74. mostlyright/data_harness/nbrender/outputs_data.py +595 -0
  75. mostlyright/data_harness/nbrender/outputs_rich.py +906 -0
  76. mostlyright/data_harness/nbrender/outputs_source.py +260 -0
  77. mostlyright/data_harness/nbrender/outputs_stage.py +176 -0
  78. mostlyright/data_harness/nbrender/outputs_text.py +400 -0
  79. mostlyright/data_harness/nbrender/parse.py +394 -0
  80. mostlyright/data_harness/nbrender/status.py +40 -0
  81. mostlyright/data_harness/nbrender/tokens.py +1295 -0
  82. mostlyright/data_harness/notebook.py +1710 -0
  83. mostlyright/data_harness/offline.py +2049 -0
  84. mostlyright/data_harness/operation_registry.py +1007 -0
  85. mostlyright/data_harness/operator_setup.py +239 -0
  86. mostlyright/data_harness/pipeline.py +6428 -0
  87. mostlyright/data_harness/plan_graph.py +2026 -0
  88. mostlyright/data_harness/preparation/__init__.py +104 -0
  89. mostlyright/data_harness/preparation/contracts.py +1017 -0
  90. mostlyright/data_harness/preparation/engine.py +221 -0
  91. mostlyright/data_harness/preparation/errors.py +14 -0
  92. mostlyright/data_harness/preparation/gates.py +751 -0
  93. mostlyright/data_harness/preparation/joins.py +574 -0
  94. mostlyright/data_harness/preparation/profile.py +384 -0
  95. mostlyright/data_harness/preparation/table.py +217 -0
  96. mostlyright/data_harness/preparation/transforms.py +568 -0
  97. mostlyright/data_harness/progress_events.py +534 -0
  98. mostlyright/data_harness/readers/__init__.py +46 -0
  99. mostlyright/data_harness/readers/containers.py +963 -0
  100. mostlyright/data_harness/readers/contracts.py +542 -0
  101. mostlyright/data_harness/readers/delimited.py +257 -0
  102. mostlyright/data_harness/readers/grib2/__init__.py +33 -0
  103. mostlyright/data_harness/readers/grib2/admission.py +722 -0
  104. mostlyright/data_harness/readers/grib2/decode.py +1009 -0
  105. mostlyright/data_harness/readers/grib2/geometry.py +1133 -0
  106. mostlyright/data_harness/readers/grib2/portable_math.py +501 -0
  107. mostlyright/data_harness/readers/json_tabular.py +485 -0
  108. mostlyright/data_harness/readers/registry.py +514 -0
  109. mostlyright/data_harness/readers/samples/README.md +110 -0
  110. mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/cities.csv.gz +0 -0
  111. mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/expected.json +24 -0
  112. mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/cities.csv.gz +0 -0
  113. mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/expected.json +24 -0
  114. mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/cities.tar +0 -0
  115. mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/expected.json +24 -0
  116. mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/cities.tar +0 -0
  117. mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/expected.json +24 -0
  118. mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/cities.zip +0 -0
  119. mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/expected.json +25 -0
  120. mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
  121. mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/expected.json +25 -0
  122. mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
  123. mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/expected.json +25 -0
  124. mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/cities.csv +3 -0
  125. mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/expected.json +23 -0
  126. mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/cities.tsv +5 -0
  127. mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/expected.json +25 -0
  128. mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/expected.json +30 -0
  129. mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/observations.csv +5 -0
  130. mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/expected.json +44 -0
  131. mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/stations.json +1 -0
  132. mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/expected.json +48 -0
  133. mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/observations.ndjson +4 -0
  134. mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/cities.xlsx +0 -0
  135. mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/expected.json +24 -0
  136. mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/expected.json +27 -0
  137. mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
  138. mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/expected.json +27 -0
  139. mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
  140. mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/README.md +20 -0
  141. mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/expected.json +55 -0
  142. mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/gfs-2m-temperature.grib2 +0 -0
  143. mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/expected.json +54 -0
  144. mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
  145. mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/expected.json +54 -0
  146. mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/hrrr-categorical-rain.grib2 +0 -0
  147. mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/expected.json +54 -0
  148. mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
  149. mostlyright/data_harness/readers/samples.py +582 -0
  150. mostlyright/data_harness/readers/spreadsheet.py +803 -0
  151. mostlyright/data_harness/readers/tabular.py +510 -0
  152. mostlyright/data_harness/recipe.py +5321 -0
  153. mostlyright/data_harness/repair/__init__.py +78 -0
  154. mostlyright/data_harness/repair/adapters.py +274 -0
  155. mostlyright/data_harness/repair/contracts.py +872 -0
  156. mostlyright/data_harness/repair/coordinator.py +1099 -0
  157. mostlyright/data_harness/repair/errors.py +16 -0
  158. mostlyright/data_harness/review.py +2533 -0
  159. mostlyright/data_harness/rowset.py +283 -0
  160. mostlyright/data_harness/serving.py +1975 -0
  161. mostlyright/data_harness/serving_edge.py +590 -0
  162. mostlyright/data_harness/serving_http.py +1031 -0
  163. mostlyright/data_harness/session_probes.py +759 -0
  164. mostlyright/data_harness/signing.py +101 -0
  165. mostlyright/data_harness/source_discovery.py +898 -0
  166. mostlyright/data_harness/sources/__init__.py +209 -0
  167. mostlyright/data_harness/sources/_adapter_steps.py +213 -0
  168. mostlyright/data_harness/sources/adapters.py +1214 -0
  169. mostlyright/data_harness/sources/cadence.py +1428 -0
  170. mostlyright/data_harness/sources/cadence_emission.py +453 -0
  171. mostlyright/data_harness/sources/cadence_history.py +546 -0
  172. mostlyright/data_harness/sources/catalog/__init__.py +17 -0
  173. mostlyright/data_harness/sources/catalog/admission.py +477 -0
  174. mostlyright/data_harness/sources/catalog/authoring.py +1701 -0
  175. mostlyright/data_harness/sources/catalog/authoring_policy.py +701 -0
  176. mostlyright/data_harness/sources/catalog/authoring_shards.py +1217 -0
  177. mostlyright/data_harness/sources/catalog/bounded_io.py +231 -0
  178. mostlyright/data_harness/sources/catalog/channel.py +523 -0
  179. mostlyright/data_harness/sources/catalog/channel_client.py +296 -0
  180. mostlyright/data_harness/sources/catalog/contracts.py +825 -0
  181. mostlyright/data_harness/sources/catalog/coverage.py +137 -0
  182. mostlyright/data_harness/sources/catalog/delta.py +1340 -0
  183. mostlyright/data_harness/sources/catalog/embedding.py +532 -0
  184. mostlyright/data_harness/sources/catalog/entry_v2.py +1182 -0
  185. mostlyright/data_harness/sources/catalog/fill.py +3889 -0
  186. mostlyright/data_harness/sources/catalog/fill_partitions.py +459 -0
  187. mostlyright/data_harness/sources/catalog/fill_staging.py +1105 -0
  188. mostlyright/data_harness/sources/catalog/gating.py +374 -0
  189. mostlyright/data_harness/sources/catalog/generation_receipt.py +1607 -0
  190. mostlyright/data_harness/sources/catalog/harvest/__init__.py +7 -0
  191. mostlyright/data_harness/sources/catalog/harvest/ckan.py +384 -0
  192. mostlyright/data_harness/sources/catalog/harvest/datagov_v4.py +798 -0
  193. mostlyright/data_harness/sources/catalog/harvest/protocol.py +964 -0
  194. mostlyright/data_harness/sources/catalog/harvest/sdmx.py +445 -0
  195. mostlyright/data_harness/sources/catalog/harvest/stac.py +384 -0
  196. mostlyright/data_harness/sources/catalog/health.py +447 -0
  197. mostlyright/data_harness/sources/catalog/hosted_catalog.py +105 -0
  198. mostlyright/data_harness/sources/catalog/identity_history.py +1549 -0
  199. mostlyright/data_harness/sources/catalog/neural.py +1618 -0
  200. mostlyright/data_harness/sources/catalog/packed_catalog.py +2345 -0
  201. mostlyright/data_harness/sources/catalog/packed_retrieval.py +1517 -0
  202. mostlyright/data_harness/sources/catalog/packed_writer.py +2802 -0
  203. mostlyright/data_harness/sources/catalog/query_trace.py +1037 -0
  204. mostlyright/data_harness/sources/catalog/recommend.py +171 -0
  205. mostlyright/data_harness/sources/catalog/retrieval.py +230 -0
  206. mostlyright/data_harness/sources/catalog/retrieval_manifest.py +995 -0
  207. mostlyright/data_harness/sources/catalog/rights_decisions.py +254 -0
  208. mostlyright/data_harness/sources/catalog/sealed.py +560 -0
  209. mostlyright/data_harness/sources/catalog/search.py +230 -0
  210. mostlyright/data_harness/sources/catalog/streaming_delta.py +1097 -0
  211. mostlyright/data_harness/sources/catalog/update.py +891 -0
  212. mostlyright/data_harness/sources/collections.py +815 -0
  213. mostlyright/data_harness/sources/contracts.py +2223 -0
  214. mostlyright/data_harness/sources/deletion.py +761 -0
  215. mostlyright/data_harness/sources/fitness.py +162 -0
  216. mostlyright/data_harness/sources/governance.py +163 -0
  217. mostlyright/data_harness/sources/hosted.py +173 -0
  218. mostlyright/data_harness/sources/integration.py +218 -0
  219. mostlyright/data_harness/sources/range_reader.py +418 -0
  220. mostlyright/data_harness/sources/registry.py +514 -0
  221. mostlyright/data_harness/sources/rights_rule.py +59 -0
  222. mostlyright/data_harness/sources/source_cadence_vectors.v1.json +1 -0
  223. mostlyright/data_harness/sources/sports.py +521 -0
  224. mostlyright/data_harness/sources/stream.py +524 -0
  225. mostlyright/data_harness/sources/stream_connector.py +418 -0
  226. mostlyright/data_harness/sources/stream_recorder.py +1404 -0
  227. mostlyright/data_harness/studio_boundary.py +2019 -0
  228. mostlyright/data_harness/thin/__init__.py +37 -0
  229. mostlyright/data_harness/thin/acquire.py +1137 -0
  230. mostlyright/data_harness/thin/acquire_cancel.py +579 -0
  231. mostlyright/data_harness/thin/approvals.py +617 -0
  232. mostlyright/data_harness/thin/commands.py +406 -0
  233. mostlyright/data_harness/thin/download.py +194 -0
  234. mostlyright/data_harness/thin/narrative.py +589 -0
  235. mostlyright/data_harness/thin/parity.py +1070 -0
  236. mostlyright/data_harness/thin/propose.py +2759 -0
  237. mostlyright/data_harness/thin/research.py +1663 -0
  238. mostlyright/data_harness/thin/router.py +924 -0
  239. mostlyright/data_harness/thin/runs.py +519 -0
  240. mostlyright/data_harness/thin/session.py +281 -0
  241. mostlyright/data_harness/thin/stream.py +501 -0
  242. mostlyright/data_harness/thin/transport.py +187 -0
  243. mostlyright/data_harness/thin/vocabulary.py +368 -0
  244. mostlyright/data_harness/thin/workers.py +164 -0
  245. mostlyright/data_harness/ucum/TABLE-PIN.json +40 -0
  246. mostlyright/data_harness/ucum/ucum-subset.v1.json +632 -0
  247. mostlyright/data_harness/unit_flow.py +927 -0
  248. mostlyright/data_harness/units.py +572 -0
  249. mostlyright/data_harness/ux/__init__.py +9 -0
  250. mostlyright/data_harness/ux/approve.py +485 -0
  251. mostlyright/data_harness/ux/author_yaml.py +597 -0
  252. mostlyright/data_harness/ux/cloud_auth.py +447 -0
  253. mostlyright/data_harness/ux/commands/__init__.py +260 -0
  254. mostlyright/data_harness/ux/commands/approve.py +136 -0
  255. mostlyright/data_harness/ux/commands/auth.py +744 -0
  256. mostlyright/data_harness/ux/commands/author.py +79 -0
  257. mostlyright/data_harness/ux/commands/catalog_author.py +403 -0
  258. mostlyright/data_harness/ux/commands/catalog_fill.py +523 -0
  259. mostlyright/data_harness/ux/commands/catalog_harvest.py +545 -0
  260. mostlyright/data_harness/ux/commands/catalog_publish.py +1838 -0
  261. mostlyright/data_harness/ux/commands/catalog_search.py +71 -0
  262. mostlyright/data_harness/ux/commands/catalog_update.py +437 -0
  263. mostlyright/data_harness/ux/commands/deploy.py +134 -0
  264. mostlyright/data_harness/ux/commands/deploy_dataset.py +98 -0
  265. mostlyright/data_harness/ux/commands/deploy_plan.py +105 -0
  266. mostlyright/data_harness/ux/commands/deploy_status.py +104 -0
  267. mostlyright/data_harness/ux/commands/diff.py +74 -0
  268. mostlyright/data_harness/ux/commands/index.py +84 -0
  269. mostlyright/data_harness/ux/commands/inventory.py +47 -0
  270. mostlyright/data_harness/ux/commands/list_builds.py +143 -0
  271. mostlyright/data_harness/ux/commands/login.py +63 -0
  272. mostlyright/data_harness/ux/commands/peek.py +236 -0
  273. mostlyright/data_harness/ux/commands/plan_check.py +90 -0
  274. mostlyright/data_harness/ux/commands/preflight.py +97 -0
  275. mostlyright/data_harness/ux/commands/record.py +107 -0
  276. mostlyright/data_harness/ux/commands/review_setup.py +47 -0
  277. mostlyright/data_harness/ux/commands/search.py +440 -0
  278. mostlyright/data_harness/ux/commands/show.py +61 -0
  279. mostlyright/data_harness/ux/commands/whoami.py +37 -0
  280. mostlyright/data_harness/ux/credential_native.py +551 -0
  281. mostlyright/data_harness/ux/credential_store.py +1055 -0
  282. mostlyright/data_harness/ux/credentials.py +631 -0
  283. mostlyright/data_harness/ux/diffing.py +444 -0
  284. mostlyright/data_harness/ux/headline.py +671 -0
  285. mostlyright/data_harness/ux/hosted_acquisition.py +974 -0
  286. mostlyright/data_harness/ux/hosted_run_status.py +619 -0
  287. mostlyright/data_harness/ux/inventory.py +427 -0
  288. mostlyright/data_harness/ux/local_review.py +375 -0
  289. mostlyright/data_harness/ux/login.py +691 -0
  290. mostlyright/data_harness/ux/path_kind.py +147 -0
  291. mostlyright/data_harness/ux/peek.py +1000 -0
  292. mostlyright/data_harness/ux/plain_file.py +178 -0
  293. mostlyright/data_harness/ux/plan_check.py +311 -0
  294. mostlyright/data_harness/ux/preflight.py +918 -0
  295. mostlyright/data_harness/ux/readers.py +1124 -0
  296. mostlyright/data_harness/ux/remediation.py +2195 -0
  297. mostlyright/data_harness/ux/render.py +657 -0
  298. mostlyright/data_harness/ux/workload.py +1077 -0
  299. mostlyright/data_harness/viewer.py +3713 -0
  300. mostlyright/data_harness/visual_run/__init__.py +83 -0
  301. mostlyright/data_harness/visual_run/authoring.py +235 -0
  302. mostlyright/data_harness/visual_run/contracts.py +673 -0
  303. mostlyright/data_harness/visual_run/materialize.py +486 -0
  304. mostlyright/data_harness/visual_run/observations.py +874 -0
  305. mostlyright/data_harness/visual_run/query.py +259 -0
  306. mostlyright/data_harness/visual_run/reducer.py +280 -0
  307. mostlyright/data_harness/visual_run/sdk.py +892 -0
  308. mostlyright/data_harness/visual_run/store.py +584 -0
  309. mostlyright/data_harness/visual_run/transport.py +239 -0
  310. mostlyright/data_harness/watch.py +2999 -0
  311. mostlyright_data-0.9.0.dist-info/METADATA +607 -0
  312. mostlyright_data-0.9.0.dist-info/RECORD +314 -0
  313. mostlyright_data-0.9.0.dist-info/WHEEL +4 -0
  314. mostlyright_data-0.9.0.dist-info/entry_points.txt +12 -0
@@ -0,0 +1,83 @@
1
+ """Durable, transport-independent visual run contracts."""
2
+
3
+ from mostlyright.data_harness.visual_run.contracts import (
4
+ ACTORS,
5
+ ARTIFACT_SCHEMAS,
6
+ DISPLAY_DISPOSITIONS,
7
+ EVENT_REGISTRY,
8
+ EVENT_SCHEMA_VERSION,
9
+ ArtifactReference,
10
+ EventSpec,
11
+ TerminalError,
12
+ VisualRunDraft,
13
+ VisualRunError,
14
+ VisualRunEvent,
15
+ canonical_draft_bytes,
16
+ canonical_event_bytes,
17
+ parse_event,
18
+ )
19
+ from mostlyright.data_harness.visual_run.materialize import (
20
+ materialize_notebook,
21
+ notebook_bytes,
22
+ notebook_digest,
23
+ notebook_value,
24
+ )
25
+ from mostlyright.data_harness.visual_run.reducer import (
26
+ CellState,
27
+ ObjectState,
28
+ ReducedRun,
29
+ apply_event,
30
+ reduce_events,
31
+ )
32
+ from mostlyright.data_harness.visual_run.sdk import VisualWork
33
+ from mostlyright.data_harness.visual_run.store import (
34
+ EventPage,
35
+ VisualRunStore,
36
+ snapshot_json,
37
+ visual_authority_lock,
38
+ )
39
+ from mostlyright.data_harness.visual_run.transport import (
40
+ SNAPSHOT_SCHEMA_VERSION,
41
+ VISUAL_RUN_DIR,
42
+ TransportSnapshot,
43
+ VisualRunTransport,
44
+ discover_visual_transport,
45
+ parse_last_event_id,
46
+ )
47
+
48
+ __all__ = [
49
+ "ACTORS",
50
+ "ARTIFACT_SCHEMAS",
51
+ "DISPLAY_DISPOSITIONS",
52
+ "EVENT_REGISTRY",
53
+ "EVENT_SCHEMA_VERSION",
54
+ "SNAPSHOT_SCHEMA_VERSION",
55
+ "VISUAL_RUN_DIR",
56
+ "ArtifactReference",
57
+ "CellState",
58
+ "EventPage",
59
+ "EventSpec",
60
+ "ObjectState",
61
+ "ReducedRun",
62
+ "TerminalError",
63
+ "TransportSnapshot",
64
+ "VisualRunDraft",
65
+ "VisualRunError",
66
+ "VisualRunEvent",
67
+ "VisualRunStore",
68
+ "VisualRunTransport",
69
+ "VisualWork",
70
+ "apply_event",
71
+ "canonical_draft_bytes",
72
+ "canonical_event_bytes",
73
+ "discover_visual_transport",
74
+ "materialize_notebook",
75
+ "notebook_bytes",
76
+ "notebook_digest",
77
+ "notebook_value",
78
+ "parse_event",
79
+ "parse_last_event_id",
80
+ "reduce_events",
81
+ "snapshot_json",
82
+ "visual_authority_lock",
83
+ ]
@@ -0,0 +1,235 @@
1
+ """Deterministic admission rules for agent-authored visible markdown."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import unicodedata
6
+ from collections.abc import Callable
7
+ from html.parser import HTMLParser
8
+
9
+ from mostlyright.data_harness.nbrender.markdown_body import render_markdown
10
+ from mostlyright.data_harness.nbrender.parse import Cell, RenderContext
11
+ from mostlyright.data_harness.visual_run.contracts import (
12
+ ArtifactReference,
13
+ VisualRunError,
14
+ VisualRunEvent,
15
+ )
16
+ from mostlyright.data_harness.visual_run.reducer import ReducedRun
17
+
18
+ MAX_MARKDOWN_CHECKPOINT_CHARS = 900
19
+ LONG_MARKDOWN_CHARS = 600
20
+ _VOID_HTML_TAGS = {
21
+ "area",
22
+ "base",
23
+ "br",
24
+ "col",
25
+ "embed",
26
+ "hr",
27
+ "img",
28
+ "input",
29
+ "link",
30
+ "meta",
31
+ "param",
32
+ "source",
33
+ "track",
34
+ "wbr",
35
+ }
36
+ _HEADING_TAGS = {"h2", "h3", "h4"}
37
+ _BODY_BLOCK_TAGS = {"blockquote", "ol", "p", "pre", "table", "ul"}
38
+
39
+
40
+ def _normalize_newlines(source: str) -> str:
41
+ return source.replace("\r\n", "\n").replace("\r", "\n")
42
+
43
+
44
+ def _has_visible_text(value: str) -> bool:
45
+ return any(
46
+ not character.isspace() and unicodedata.category(character) not in {"Cc", "Cf", "Cs"}
47
+ for character in value
48
+ )
49
+
50
+
51
+ class _TopLevelMarkdownBlocks(HTMLParser):
52
+ """Collect the block tags emitted directly under the renderer's markdown root."""
53
+
54
+ def __init__(self) -> None:
55
+ super().__init__(convert_charrefs=True)
56
+ self._in_root = False
57
+ self._depth = 0
58
+ self.blocks: list[tuple[str, bool]] = []
59
+ self._active_block: int | None = None
60
+
61
+ def handle_starttag(self, tag: str, attrs: list[tuple[str, str | None]]) -> None:
62
+ if not self._in_root:
63
+ classes = next((value for name, value in attrs if name == "class"), None)
64
+ if tag == "div" and classes is not None and "nb-md" in classes.split():
65
+ self._in_root = True
66
+ self._depth = 1
67
+ return
68
+ if self._depth == 1:
69
+ self.blocks.append((tag, False))
70
+ self._active_block = len(self.blocks) - 1
71
+ if self._active_block is not None and tag in {"img", "input"}:
72
+ accessible_text = next(
73
+ (value for name, value in attrs if name in {"alt", "value"} and value), None
74
+ )
75
+ if accessible_text and _has_visible_text(accessible_text):
76
+ block_tag, _ = self.blocks[self._active_block]
77
+ self.blocks[self._active_block] = (block_tag, True)
78
+ if tag not in _VOID_HTML_TAGS:
79
+ self._depth += 1
80
+ elif self._depth == 1:
81
+ self._active_block = None
82
+
83
+ def handle_startendtag(self, tag: str, attrs: list[tuple[str, str | None]]) -> None:
84
+ if self._in_root and self._depth == 1:
85
+ accessible_text = next(
86
+ (value for name, value in attrs if name in {"alt", "value"} and value), None
87
+ )
88
+ self.blocks.append((tag, bool(accessible_text and _has_visible_text(accessible_text))))
89
+
90
+ def handle_data(self, data: str) -> None:
91
+ if self._active_block is None or not _has_visible_text(data):
92
+ return
93
+ tag, _ = self.blocks[self._active_block]
94
+ self.blocks[self._active_block] = (tag, True)
95
+
96
+ def handle_endtag(self, tag: str) -> None:
97
+ if not self._in_root:
98
+ return
99
+ if self._depth == 2:
100
+ self._active_block = None
101
+ self._depth -= 1
102
+ if self._depth == 0 and tag == "div":
103
+ self._in_root = False
104
+
105
+
106
+ def markdown_block_tags(source: str) -> tuple[str, ...]:
107
+ """Return visible top-level blocks using the production renderer's semantics."""
108
+
109
+ parser = _TopLevelMarkdownBlocks()
110
+ parser.feed(
111
+ render_markdown(
112
+ Cell(cell_type="markdown", cell_id="authoring-check", source=source),
113
+ RenderContext(mode="static", cell_index=0, cell_count=1),
114
+ )
115
+ )
116
+ parser.close()
117
+ return tuple(tag for tag, _ in parser.blocks)
118
+
119
+
120
+ def _visible_markdown_blocks(source: str) -> tuple[tuple[str, bool], ...]:
121
+ parser = _TopLevelMarkdownBlocks()
122
+ parser.feed(
123
+ render_markdown(
124
+ Cell(cell_type="markdown", cell_id="authoring-check", source=source),
125
+ RenderContext(mode="static", cell_index=0, cell_count=1),
126
+ )
127
+ )
128
+ parser.close()
129
+ return tuple(parser.blocks)
130
+
131
+
132
+ def validate_markdown_document(source: str) -> None:
133
+ """Reserve the single document title for the deterministic materializer."""
134
+
135
+ blocks = _visible_markdown_blocks(_normalize_newlines(source))
136
+ if any(tag == "h1" and visible for tag, visible in blocks):
137
+ raise VisualRunError(
138
+ "VISUAL_WORK_MARKDOWN_UNSTRUCTURED",
139
+ "the document title is added automatically; agent markdown must start at H2",
140
+ )
141
+
142
+
143
+ def validate_markdown_checkpoint(source: str) -> None:
144
+ """Admit one readable unit, or one heading followed by its first readable unit."""
145
+
146
+ normalized = _normalize_newlines(source)
147
+ blocks = _visible_markdown_blocks(normalized)
148
+ validate_markdown_document(normalized)
149
+ heading_with_body = (
150
+ len(blocks) == 2
151
+ and blocks[0][0] in _HEADING_TAGS
152
+ and blocks[0][1]
153
+ and blocks[1][0] in _BODY_BLOCK_TAGS
154
+ and blocks[1][1]
155
+ )
156
+ one_visible_block = len(blocks) == 1 and blocks[0][1]
157
+ if len(normalized) > MAX_MARKDOWN_CHECKPOINT_CHARS or not (
158
+ one_visible_block or heading_with_body
159
+ ):
160
+ raise VisualRunError(
161
+ "VISUAL_WORK_CHECKPOINT_TOO_LARGE",
162
+ "markdown checkpoints may add at most 900 characters and one readable block, "
163
+ "or one heading with its first block",
164
+ )
165
+
166
+
167
+ def validate_markdown_completion(source: str) -> None:
168
+ """Require hierarchy or a table before a long markdown cell becomes terminal."""
169
+
170
+ normalized = _normalize_newlines(source)
171
+ blocks = _visible_markdown_blocks(normalized)
172
+ validate_markdown_document(normalized)
173
+ if len(normalized.strip()) <= LONG_MARKDOWN_CHARS:
174
+ return
175
+ has_secondary_structure = any(
176
+ visible and (tag == "table" or tag in _HEADING_TAGS) for tag, visible in blocks[1:]
177
+ )
178
+ if not blocks or blocks[0] != ("h2", True) or not has_secondary_structure:
179
+ raise VisualRunError(
180
+ "VISUAL_WORK_MARKDOWN_UNSTRUCTURED",
181
+ "markdown longer than 600 characters must begin with an H2 outcome heading and "
182
+ "include a table or second heading",
183
+ )
184
+
185
+
186
+ def validate_agent_authoring_event(
187
+ before: ReducedRun,
188
+ event: VisualRunEvent,
189
+ prospective: ReducedRun,
190
+ read_artifact: Callable[[ArtifactReference], bytes],
191
+ ) -> None:
192
+ """Validate the exact event and state while the durable append lock is held."""
193
+
194
+ if event.actor != "agent" or not event.event_type.startswith("cell."):
195
+ return
196
+ cell = prospective.cells.get(event.object_id)
197
+ if cell is None or cell.cell_type != "markdown":
198
+ return
199
+ if event.event_type in {"cell.source_extended", "cell.source_revised"}:
200
+ if event.artifact is None:
201
+ return
202
+ source = read_artifact(event.artifact).decode("utf-8")
203
+ if int(event.payload["source_length"]) != len(source):
204
+ raise VisualRunError(
205
+ "VISUAL_RUN_SOURCE_LENGTH_INVALID",
206
+ "source_length must equal the decoded source character length",
207
+ )
208
+ validate_markdown_document(source)
209
+ if event.event_type == "cell.source_extended":
210
+ previous_cell = before.cells.get(event.object_id)
211
+ previous = (
212
+ ""
213
+ if previous_cell is None or previous_cell.source is None
214
+ else read_artifact(previous_cell.source).decode("utf-8")
215
+ )
216
+ if not source.startswith(previous):
217
+ raise VisualRunError(
218
+ "VISUAL_RUN_SOURCE_EXTENSION_INVALID",
219
+ "source extension artifact must preserve the prior source prefix",
220
+ )
221
+ source = source[len(previous) :]
222
+ validate_markdown_checkpoint(source)
223
+ elif event.event_type == "cell.completed" and cell.source is not None:
224
+ validate_markdown_completion(read_artifact(cell.source).decode("utf-8"))
225
+
226
+
227
+ __all__ = [
228
+ "LONG_MARKDOWN_CHARS",
229
+ "MAX_MARKDOWN_CHECKPOINT_CHARS",
230
+ "markdown_block_tags",
231
+ "validate_agent_authoring_event",
232
+ "validate_markdown_checkpoint",
233
+ "validate_markdown_completion",
234
+ "validate_markdown_document",
235
+ ]