labnotes 0.2.23__tar.gz → 0.2.25__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 (270) hide show
  1. {labnotes-0.2.23 → labnotes-0.2.25}/PKG-INFO +1 -1
  2. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/daemon/server.py +1 -0
  3. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/experiments.py +14 -0
  4. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/models.py +3 -1
  5. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/read_config.py +6 -1
  6. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/read_path.py +1 -1
  7. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/prepare_experiment.py +4 -0
  8. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/read_experiment_config.py +7 -0
  9. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/run_experiment.py +2 -3
  10. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/start_experiment.py +2 -0
  11. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/static/note-edit.js +1 -1
  12. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/static/run-output.js +1 -1
  13. labnotes-0.2.25/src/labnotes/static/vendor/THIRD_PARTY_NOTICES +648 -0
  14. labnotes-0.2.25/src/labnotes/static/vendor/ansi_up.js +433 -0
  15. labnotes-0.2.25/src/labnotes/static/vendor/atomic-editor-editor-inline-preview.js +810 -0
  16. labnotes-0.2.25/src/labnotes/static/vendor/chunk-3VL5A6CI.js +78 -0
  17. labnotes-0.2.25/src/labnotes/static/vendor/chunk-DDFT2RE5.js +111 -0
  18. labnotes-0.2.25/src/labnotes/static/vendor/chunk-GRK3PUFM.js +1796 -0
  19. labnotes-0.2.25/src/labnotes/static/vendor/chunk-HETKD2IB.js +2066 -0
  20. labnotes-0.2.25/src/labnotes/static/vendor/chunk-JSBRDJBE.js +30 -0
  21. labnotes-0.2.25/src/labnotes/static/vendor/chunk-KGFOUVBD.js +761 -0
  22. labnotes-0.2.25/src/labnotes/static/vendor/chunk-LAFDP4SS.js +2002 -0
  23. labnotes-0.2.25/src/labnotes/static/vendor/chunk-LFGFNL4F.js +2242 -0
  24. labnotes-0.2.25/src/labnotes/static/vendor/chunk-LRGARZ6Y.js +349 -0
  25. labnotes-0.2.25/src/labnotes/static/vendor/chunk-LZVVMIXK.js +10907 -0
  26. labnotes-0.2.25/src/labnotes/static/vendor/chunk-SVHN5VMN.js +139 -0
  27. labnotes-0.2.25/src/labnotes/static/vendor/chunk-YFJJZMCS.js +3447 -0
  28. labnotes-0.2.25/src/labnotes/static/vendor/chunk-YONOI2RA.js +174 -0
  29. labnotes-0.2.25/src/labnotes/static/vendor/chunk-ZO3BUX3P.js +32 -0
  30. labnotes-0.2.25/src/labnotes/static/vendor/codemirror-autocomplete.js +75 -0
  31. labnotes-0.2.25/src/labnotes/static/vendor/codemirror-commands.js +1460 -0
  32. labnotes-0.2.25/src/labnotes/static/vendor/codemirror-lang-python.js +457 -0
  33. labnotes-0.2.25/src/labnotes/static/vendor/codemirror-language.js +123 -0
  34. labnotes-0.2.25/src/labnotes/static/vendor/codemirror-state.js +64 -0
  35. labnotes-0.2.25/src/labnotes/static/vendor/codemirror-streamparser.js +7 -0
  36. labnotes-0.2.25/src/labnotes/static/vendor/codemirror-view.js +112 -0
  37. labnotes-0.2.25/src/labnotes/static/vendor/crelt.js +7 -0
  38. labnotes-0.2.25/src/labnotes/static/vendor/diff-match-patch.js +1475 -0
  39. labnotes-0.2.25/src/labnotes/static/vendor/lezer-common.js +31 -0
  40. labnotes-0.2.25/src/labnotes/static/vendor/lezer-highlight.js +22 -0
  41. labnotes-0.2.25/src/labnotes/static/vendor/lezer-lr.js +18 -0
  42. labnotes-0.2.25/src/labnotes/static/vendor/lezer-markdown.js +2121 -0
  43. labnotes-0.2.25/src/labnotes/static/vendor/lezer-python.js +10 -0
  44. labnotes-0.2.25/src/labnotes/static/vendor/marijn-find-cluster-break.js +9 -0
  45. labnotes-0.2.25/src/labnotes/static/vendor/style-mod.js +7 -0
  46. labnotes-0.2.25/src/labnotes/static/vendor/w3c-keyname.js +11 -0
  47. labnotes-0.2.25/src/labnotes/templates/editor_imports.html +25 -0
  48. {labnotes-0.2.23 → labnotes-0.2.25}/tests/integration/conftest.py +32 -2
  49. labnotes-0.2.23/src/labnotes/templates/editor_imports.html +0 -25
  50. {labnotes-0.2.23 → labnotes-0.2.25}/.gitignore +0 -0
  51. {labnotes-0.2.23 → labnotes-0.2.25}/CHANGELOG.md +0 -0
  52. {labnotes-0.2.23 → labnotes-0.2.25}/MIGRATIONS.md +0 -0
  53. {labnotes-0.2.23 → labnotes-0.2.25}/README.md +0 -0
  54. {labnotes-0.2.23 → labnotes-0.2.25}/conftest.py +0 -0
  55. {labnotes-0.2.23 → labnotes-0.2.25}/pyproject.toml +0 -0
  56. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/__init__.py +0 -0
  57. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/__main__.py +0 -0
  58. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/asset_url.py +0 -0
  59. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/check_counts.py +0 -0
  60. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/cli.py +0 -0
  61. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/command_line_group.py +0 -0
  62. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/compose_experiment.py +0 -0
  63. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/config_migration.py +0 -0
  64. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/context.md +0 -0
  65. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/context_guide.py +0 -0
  66. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/copy_experiment.py +0 -0
  67. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/count_groups.py +0 -0
  68. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/count_runs.py +0 -0
  69. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/create_app.py +0 -0
  70. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/create_experiment.py +0 -0
  71. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/create_note.py +0 -0
  72. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/daemon/__init__.py +0 -0
  73. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/daemon/client.py +0 -0
  74. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/daemon/command.py +0 -0
  75. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/daemon/ensure.py +0 -0
  76. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/daemon/marker.py +0 -0
  77. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/daemon/socket_path.py +0 -0
  78. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/daemon_command.py +0 -0
  79. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/data_html.py +0 -0
  80. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/default_config_text.py +0 -0
  81. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/default_counts.py +0 -0
  82. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/drain_watch.py +0 -0
  83. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/experiment_definition.py +0 -0
  84. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/experiment_notes.py +0 -0
  85. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/experiment_runs.py +0 -0
  86. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/file_changes.py +0 -0
  87. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/format_duration.py +0 -0
  88. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/format_started.py +0 -0
  89. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/format_value.py +0 -0
  90. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/get_state.py +0 -0
  91. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/grid_cell.py +0 -0
  92. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/group_runs.py +0 -0
  93. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/init.py +0 -0
  94. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/invocation_started.py +0 -0
  95. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/is_non_negative_int.py +0 -0
  96. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/is_non_negative_number.py +0 -0
  97. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/is_positive_int.py +0 -0
  98. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/latest_log.py +0 -0
  99. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/list_experiments.py +0 -0
  100. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/list_runs.py +0 -0
  101. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/load_config.py +0 -0
  102. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/load_experiment.py +0 -0
  103. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/load_run.py +0 -0
  104. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/log.py +0 -0
  105. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/log_path.py +0 -0
  106. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/memory_interval.py +0 -0
  107. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/nests_runs.py +0 -0
  108. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/note_path.py +0 -0
  109. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/notebook_kernel.py +0 -0
  110. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/output_html.py +0 -0
  111. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/param_names.py +0 -0
  112. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/parse_param_value.py +0 -0
  113. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/parse_params.py +0 -0
  114. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/parse_run_view.py +0 -0
  115. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/parse_subset.py +0 -0
  116. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/pivot_runs.py +0 -0
  117. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/print_rows.py +0 -0
  118. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/python_blocks.py +0 -0
  119. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/render_markdown.py +0 -0
  120. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/retries.py +0 -0
  121. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/run_columns.py +0 -0
  122. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/run_output.py +0 -0
  123. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/__init__.py +0 -0
  124. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/cgroup_memory.py +0 -0
  125. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/check_args.py +0 -0
  126. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/check_hook_placeholders.py +0 -0
  127. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/check_subset.py +0 -0
  128. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/claim_run.py +0 -0
  129. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/command_flags.py +0 -0
  130. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/container_cgroup.py +0 -0
  131. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/container_memory.py +0 -0
  132. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/continue_run.py +0 -0
  133. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/describe_event.py +0 -0
  134. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/docker_output.py +0 -0
  135. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/execute_run.py +0 -0
  136. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/exit_signal.py +0 -0
  137. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/fill_dirs.py +0 -0
  138. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/fill_experiment_env.py +0 -0
  139. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/finalize_lost_runs.py +0 -0
  140. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/first_invocation.py +0 -0
  141. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/flag_name.py +0 -0
  142. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/group_args.py +0 -0
  143. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/hold_experiment.py +0 -0
  144. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/in_subset.py +0 -0
  145. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/invocation_hook.py +0 -0
  146. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/invocation_meta.py +0 -0
  147. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/new_run_id.py +0 -0
  148. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/new_stamped_run_id.py +0 -0
  149. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/override_flags.py +0 -0
  150. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/param_args.py +0 -0
  151. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/param_grid.py +0 -0
  152. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/placeholders.py +0 -0
  153. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/plan_runs.py +0 -0
  154. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/project_snapshot.py +0 -0
  155. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/record_memory.py +0 -0
  156. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/run_folder.py +0 -0
  157. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/run_git.py +0 -0
  158. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/run_headless.py +0 -0
  159. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/run_locked.py +0 -0
  160. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/run_state.py +0 -0
  161. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/runs_parent.py +0 -0
  162. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/shell_command.py +0 -0
  163. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/signal_tree.py +0 -0
  164. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/stop_then_kill.py +0 -0
  165. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/untracked_diff.py +0 -0
  166. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/wait_for_tree.py +0 -0
  167. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/write_run_json.py +0 -0
  168. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runs_view_command.py +0 -0
  169. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/save_conflict_copy.py +0 -0
  170. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/save_note.py +0 -0
  171. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/saved_outputs.py +0 -0
  172. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/serve_app.py +0 -0
  173. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/server.py +0 -0
  174. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/set_state.py +0 -0
  175. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/shared_params.py +0 -0
  176. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/sort_href.py +0 -0
  177. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/sql_quote.py +0 -0
  178. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/state_path.py +0 -0
  179. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/static/elapsed.js +0 -0
  180. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/static/experiment.js +0 -0
  181. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/static/labnotes.css +0 -0
  182. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/static/local-time.js +0 -0
  183. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/static/new-note.js +0 -0
  184. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/static/note-editor.js +0 -0
  185. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/static/row-link.js +0 -0
  186. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/static/run-cell.js +0 -0
  187. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/static/view-toggle.js +0 -0
  188. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/summarize_config.py +0 -0
  189. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/__init__.py +0 -0
  190. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/experiment_rows.py +0 -0
  191. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/experiment_run_ids.py +0 -0
  192. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/experiment_toml.py +0 -0
  193. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/experiments_ddl.py +0 -0
  194. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/file_prefix.py +0 -0
  195. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/file_text.py +0 -0
  196. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/iso_time.py +0 -0
  197. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/list_experiment_runs.py +0 -0
  198. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/list_resumable_runs.py +0 -0
  199. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/note_text.py +0 -0
  200. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/open_tables.py +0 -0
  201. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/path_glob.py +0 -0
  202. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/path_pattern.py +0 -0
  203. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/read_blocks.py +0 -0
  204. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/read_experiment.py +0 -0
  205. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/read_file.py +0 -0
  206. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/read_log.py +0 -0
  207. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/read_memory.py +0 -0
  208. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/read_run.py +0 -0
  209. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/read_run_file.py +0 -0
  210. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/runs_columns.py +0 -0
  211. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/summarize_experiments.py +0 -0
  212. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/templates/base.html +0 -0
  213. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/templates/experiment.html +0 -0
  214. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/templates/index.html +0 -0
  215. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/templates/note.html +0 -0
  216. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/templates/run.html +0 -0
  217. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/__init__.py +0 -0
  218. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/browse_app.py +0 -0
  219. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/browse_tui.py +0 -0
  220. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/check_view_response.py +0 -0
  221. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/config.py +0 -0
  222. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/dim.py +0 -0
  223. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/experiment_screen.py +0 -0
  224. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/experiments_screen.py +0 -0
  225. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/fill_table.py +0 -0
  226. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/format_cell.py +0 -0
  227. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/format_elapsed.py +0 -0
  228. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/guard_view.py +0 -0
  229. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/leave_prompt.py +0 -0
  230. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/load_view.py +0 -0
  231. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/log_block.py +0 -0
  232. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/log_blocks.py +0 -0
  233. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/native_rows.py +0 -0
  234. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/reload_on_change.py +0 -0
  235. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/run_app.py +0 -0
  236. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/run_cells.py +0 -0
  237. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/run_output.py +0 -0
  238. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/run_panel.py +0 -0
  239. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/run_tui.py +0 -0
  240. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/runs_browser.py +0 -0
  241. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/runs_table.py +0 -0
  242. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/runs_view.py +0 -0
  243. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/stopped_title.py +0 -0
  244. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/table_columns.py +0 -0
  245. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/table_rows.py +0 -0
  246. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/view_column.py +0 -0
  247. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/view_pane.py +0 -0
  248. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/view_process.py +0 -0
  249. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/view_switcher.py +0 -0
  250. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/utils/__init__.py +0 -0
  251. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/utils/format_bytes.py +0 -0
  252. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/utils/process_alive.py +0 -0
  253. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/utils/run_usage.py +0 -0
  254. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/utils/tree_rss.py +0 -0
  255. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/utils/tree_usage.py +0 -0
  256. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/view/__init__.py +0 -0
  257. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/view/answer.py +0 -0
  258. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/view/build.py +0 -0
  259. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/view/changed.py +0 -0
  260. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/view/experiment.py +0 -0
  261. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/view/respond.py +0 -0
  262. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/view/serve.py +0 -0
  263. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/view_specs.py +0 -0
  264. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/wait_for_note.py +0 -0
  265. {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/watch_rows.py +0 -0
  266. {labnotes-0.2.23 → labnotes-0.2.25}/testing-conventions.toml +0 -0
  267. {labnotes-0.2.23 → labnotes-0.2.25}/tests/conftest.py +0 -0
  268. {labnotes-0.2.23 → labnotes-0.2.25}/tests/e2e/conftest.py +0 -0
  269. {labnotes-0.2.23 → labnotes-0.2.25}/tests/perf/conftest.py +0 -0
  270. {labnotes-0.2.23 → labnotes-0.2.25}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: labnotes
3
- Version: 0.2.23
3
+ Version: 0.2.25
4
4
  Summary: Browse experiment designs, notes, and run data from a folder.
5
5
  Project-URL: Repository, https://github.com/thekevinscott/labnotes
6
6
  Author-email: Kevin Scott <me@thekevinscott.com>
@@ -62,6 +62,7 @@ class ExperimentDaemon:
62
62
  cast(str | None, options.get("command_line")),
63
63
  cast(str | None, options.get("run_id")),
64
64
  cast(int | None, options.get("retries")),
65
+ cast(float | None, options.get("retry_wait")),
65
66
  bool(options.get("replace_capped")),
66
67
  )
67
68
  path = str(selected.run_state.path)
@@ -71,6 +71,14 @@ class PassthroughCommand(click.Command):
71
71
  " with continues, by a later run. Overrides experiment.toml and"
72
72
  " .labnotes.toml; 3 if none sets it.",
73
73
  )
74
+ @click.option(
75
+ "--retry-wait",
76
+ type=click.FloatRange(min=0),
77
+ metavar="SECONDS",
78
+ help="With run: seconds before the first retry of an exit 75; each later"
79
+ " retry waits twice as long. Overrides experiment.toml and .labnotes.toml;"
80
+ " 30 if none sets it.",
81
+ )
74
82
  @click.option(
75
83
  "--replace-capped",
76
84
  is_flag=True,
@@ -141,6 +149,7 @@ def experiments(
141
149
  concurrency: int | None,
142
150
  run_id: str | None,
143
151
  retries: int | None,
152
+ retry_wait: float | None,
144
153
  replace_capped: bool,
145
154
  headless: bool,
146
155
  experiment_config: Path | None,
@@ -210,6 +219,7 @@ def experiments(
210
219
  "command_line": ctx.meta.get(COMMAND_LINE),
211
220
  "run_id": run_id,
212
221
  "retries": retries,
222
+ "retry_wait": retry_wait,
213
223
  "replace_capped": replace_capped,
214
224
  },
215
225
  },
@@ -241,6 +251,7 @@ def experiments(
241
251
  ctx.meta.get(COMMAND_LINE),
242
252
  run_id,
243
253
  retries,
254
+ retry_wait,
244
255
  replace_capped,
245
256
  )
246
257
  )
@@ -262,6 +273,7 @@ def experiments(
262
273
  or concurrency is not None
263
274
  or run_id is not None
264
275
  or retries is not None
276
+ or retry_wait is not None
265
277
  or replace_capped
266
278
  or experiment_config is not None
267
279
  or timeout is not None
@@ -287,6 +299,8 @@ def experiments(
287
299
  raise click.UsageError("--run-id needs run.")
288
300
  if retries is not None:
289
301
  raise click.UsageError("--retries needs run.")
302
+ if retry_wait is not None:
303
+ raise click.UsageError("--retry-wait needs run.")
290
304
  if replace_capped:
291
305
  raise click.UsageError("--replace-capped needs run.")
292
306
  if ctx.args:
@@ -5,7 +5,7 @@ from typing import Any, Protocol
5
5
 
6
6
  from labnotes.default_counts import DEFAULT_COUNTS
7
7
  from labnotes.memory_interval import DEFAULT_MEMORY_INTERVAL
8
- from labnotes.retries import DEFAULT_RETRIES
8
+ from labnotes.retries import DEFAULT_RETRIES, RETRY_SECONDS
9
9
 
10
10
  Report = Callable[[dict[str, object]], None]
11
11
 
@@ -44,6 +44,7 @@ class LabnotesConfig:
44
44
  runs: str
45
45
  concurrency: int = 1
46
46
  retries: int = DEFAULT_RETRIES
47
+ retry_wait: float = RETRY_SECONDS
47
48
  # Set when the config's folder is itself the one experiment.
48
49
  experiment: str | None = None
49
50
  # [experiment] in .labnotes.toml, under each experiment.toml.
@@ -59,6 +60,7 @@ class ExperimentConfig:
59
60
  counts: str = DEFAULT_COUNTS
60
61
  concurrency: int = 1
61
62
  retries: int = DEFAULT_RETRIES
63
+ retry_wait: float = RETRY_SECONDS
62
64
  meta: str | None = None
63
65
  memory_interval: float = DEFAULT_MEMORY_INTERVAL
64
66
  setup: str | None = None
@@ -3,11 +3,12 @@ from pathlib import Path
3
3
 
4
4
  from labnotes.models import LabnotesConfig
5
5
  from labnotes.is_non_negative_int import is_non_negative_int
6
+ from labnotes.is_non_negative_number import is_non_negative_number
6
7
  from labnotes.is_positive_int import is_positive_int
7
8
  from labnotes.config_migration import REMOVED_MODE
8
9
  from labnotes.runner.read_experiment_config import SETTINGS
9
10
  from labnotes.read_path import DEFAULT_PATHS, read_path
10
- from labnotes.retries import DEFAULT_RETRIES
11
+ from labnotes.retries import DEFAULT_RETRIES, RETRY_SECONDS
11
12
 
12
13
  CONFIG_FILE = ".labnotes.toml"
13
14
 
@@ -51,12 +52,16 @@ def read_config(path: Path) -> LabnotesConfig:
51
52
  retries = experiments.get("retries", DEFAULT_RETRIES)
52
53
  if not is_non_negative_int(retries):
53
54
  raise ValueError(f"{path}: [experiments] retries must be 0 or more")
55
+ retry_wait = experiments.get("retry_wait", RETRY_SECONDS)
56
+ if not is_non_negative_number(retry_wait):
57
+ raise ValueError(f"{path}: [experiments] retry_wait must be 0 or more seconds")
54
58
  return LabnotesConfig(
55
59
  path.resolve(),
56
60
  root,
57
61
  **paths,
58
62
  concurrency=concurrency,
59
63
  retries=retries,
64
+ retry_wait=retry_wait,
60
65
  experiment=root.name if single else None,
61
66
  defaults=defaults,
62
67
  )
@@ -16,7 +16,7 @@ PLACEHOLDERS = {
16
16
  # experiments is missing: one experiment has no folder to point at.
17
17
  SINGLE_PLACEHOLDERS: dict[str, set[str]] = {"files": set(), "runs": {"run"}}
18
18
  # Keys other readers own, so the path check lets them through.
19
- OTHER_KEYS = {"experiments": {"mode", "concurrency", "retries"}}
19
+ OTHER_KEYS = {"experiments": {"mode", "concurrency", "retries", "retry_wait"}}
20
20
  PLACEHOLDER = re.compile(r"\{([^}]*)\}")
21
21
  SINGLE = "experiment.toml sits next to .labnotes.toml, so this folder is the experiment"
22
22
 
@@ -18,6 +18,7 @@ async def prepare_experiment(
18
18
  setup: str | None = None,
19
19
  teardown: str | None = None,
20
20
  retries: int | None = None,
21
+ retry_wait: float | None = None,
21
22
  replace_capped: bool = False,
22
23
  ) -> tuple[ExperimentConfig, int]:
23
24
  if config.experiment not in (None, name):
@@ -36,6 +37,7 @@ async def prepare_experiment(
36
37
  config.concurrency,
37
38
  config.retries,
38
39
  config.defaults,
40
+ config.retry_wait,
39
41
  )
40
42
  if setup is not None:
41
43
  experiment = dataclasses.replace(experiment, setup=setup)
@@ -43,6 +45,8 @@ async def prepare_experiment(
43
45
  experiment = dataclasses.replace(experiment, teardown=teardown)
44
46
  if retries is not None:
45
47
  experiment = dataclasses.replace(experiment, retries=retries)
48
+ if retry_wait is not None:
49
+ experiment = dataclasses.replace(experiment, retry_wait=retry_wait)
46
50
  if replace_capped:
47
51
  experiment = dataclasses.replace(experiment, replace_capped=True)
48
52
  if only:
@@ -11,6 +11,7 @@ from labnotes.is_non_negative_number import is_non_negative_number
11
11
  from labnotes.memory_interval import DEFAULT_MEMORY_INTERVAL
12
12
  from labnotes.is_positive_int import is_positive_int
13
13
  from labnotes.config_migration import MISSING_CONTINUES, REMOVED_MODE
14
+ from labnotes.retries import RETRY_SECONDS
14
15
 
15
16
  SETTINGS = {
16
17
  "name",
@@ -20,6 +21,7 @@ SETTINGS = {
20
21
  "counts",
21
22
  "concurrency",
22
23
  "retries",
24
+ "retry_wait",
23
25
  "meta",
24
26
  "memory_interval",
25
27
  "views",
@@ -39,6 +41,7 @@ def read_experiment_config(
39
41
  concurrency: int,
40
42
  retries: int,
41
43
  defaults: dict[str, object] | None = None,
44
+ retry_wait: float = RETRY_SECONDS,
42
45
  ) -> ExperimentConfig:
43
46
  try:
44
47
  layer = tomllib.loads(source)
@@ -78,6 +81,9 @@ def read_experiment_config(
78
81
  retries = values.get("retries", retries)
79
82
  if not is_non_negative_int(retries):
80
83
  raise ValueError(f"{path}: retries must be 0 or more")
84
+ retry_wait = values.get("retry_wait", retry_wait)
85
+ if not is_non_negative_number(retry_wait):
86
+ raise ValueError(f"{path}: retry_wait must be 0 or more seconds")
81
87
  meta = values.get("meta")
82
88
  if meta is not None and (not isinstance(meta, str) or not meta.strip()):
83
89
  raise ValueError(f"{path}: meta must be a string")
@@ -127,6 +133,7 @@ def read_experiment_config(
127
133
  counts,
128
134
  concurrency,
129
135
  retries,
136
+ retry_wait,
130
137
  meta,
131
138
  memory_interval,
132
139
  values.get("setup"),
@@ -14,7 +14,7 @@ from labnotes.models import (
14
14
  Listen,
15
15
  Report,
16
16
  )
17
- from labnotes.retries import RETRY_EXIT_CODE, RETRY_SECONDS
17
+ from labnotes.retries import RETRY_EXIT_CODE
18
18
  from labnotes.runner.check_hook_placeholders import check_hook_placeholders
19
19
  from labnotes.runner.claim_run import LOCK_FILE, claim_run
20
20
  from labnotes.runner.execute_run import execute_run
@@ -49,7 +49,6 @@ async def run_experiment(
49
49
  report: Report,
50
50
  listen: Listen,
51
51
  timeout: float | None = None,
52
- retry_seconds: float = RETRY_SECONDS,
53
52
  only: dict[str, list[str]] | None = None,
54
53
  args: list[str] | None = None,
55
54
  environment: dict[str, str] | None = None,
@@ -254,7 +253,7 @@ async def run_experiment(
254
253
  if tried >= experiment.retries:
255
254
  emit({"event": "gave up", "run": run, "retries": tried})
256
255
  return
257
- seconds = retry_seconds * 2 ** (tried - earlier.get(run, 0))
256
+ seconds = experiment.retry_wait * 2 ** (tried - earlier.get(run, 0))
258
257
 
259
258
  def due() -> None:
260
259
  del waiting[run]
@@ -33,6 +33,7 @@ def start_experiment(
33
33
  command_line: str | None = None,
34
34
  run_id: str | None = None,
35
35
  retries: int | None = None,
36
+ retry_wait: float | None = None,
36
37
  replace_capped: bool = False,
37
38
  ) -> ExperimentStart:
38
39
  state = RunState.create(config, name)
@@ -48,6 +49,7 @@ def start_experiment(
48
49
  setup,
49
50
  teardown,
50
51
  retries,
52
+ retry_wait,
51
53
  replace_capped,
52
54
  )
53
55
  await finalize_lost_runs(config)
@@ -14,7 +14,7 @@ export function attach(note, focus) {
14
14
  editing = edit(note, prose, status);
15
15
  if (focus) editing.view.focus();
16
16
  },
17
- () => {},
17
+ (error) => console.error("Editor import failed:", error),
18
18
  );
19
19
 
20
20
  const changes = new EventSource(note.dataset.changesUrl);
@@ -1,4 +1,4 @@
1
- import { AnsiUp } from "https://esm.sh/ansi_up@6.0.6";
1
+ import { AnsiUp } from "/static/vendor/ansi_up.js";
2
2
 
3
3
  const output = document.querySelector(".run-output");
4
4
  const state = document.querySelector(".run-state");