labnotes 0.0.136__tar.gz → 0.0.137__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 (221) hide show
  1. {labnotes-0.0.136 → labnotes-0.0.137}/PKG-INFO +1 -1
  2. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/context.md +7 -1
  3. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/daemon_app.py +4 -2
  4. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/serve_daemon.py +6 -2
  5. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/socket_path.py +3 -1
  6. {labnotes-0.0.136 → labnotes-0.0.137}/.gitignore +0 -0
  7. {labnotes-0.0.136 → labnotes-0.0.137}/CHANGELOG.md +0 -0
  8. {labnotes-0.0.136 → labnotes-0.0.137}/MIGRATIONS.md +0 -0
  9. {labnotes-0.0.136 → labnotes-0.0.137}/README.md +0 -0
  10. {labnotes-0.0.136 → labnotes-0.0.137}/pyproject.toml +0 -0
  11. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/__init__.py +0 -0
  12. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/__main__.py +0 -0
  13. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/asset_url.py +0 -0
  14. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/check_counts.py +0 -0
  15. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/cli.py +0 -0
  16. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/compose_experiment.py +0 -0
  17. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/context_guide.py +0 -0
  18. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/count_groups.py +0 -0
  19. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/count_runs.py +0 -0
  20. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/create_app.py +0 -0
  21. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/create_experiment.py +0 -0
  22. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/create_note.py +0 -0
  23. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/__init__.py +0 -0
  24. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/control_run.py +0 -0
  25. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/daemon_client.py +0 -0
  26. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/daemon_running.py +0 -0
  27. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/daemon_server.py +0 -0
  28. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/describe_status.py +0 -0
  29. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/ensure_daemon.py +0 -0
  30. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/exit_when_idle.py +0 -0
  31. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/finalize_lost_runs.py +0 -0
  32. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/last_stderr.py +0 -0
  33. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/remote_start.py +0 -0
  34. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/run_daemon.py +0 -0
  35. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/run_logs.py +0 -0
  36. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/stop_runs.py +0 -0
  37. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/watch_daemon.py +0 -0
  38. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/watch_status.py +0 -0
  39. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon_command.py +0 -0
  40. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/data_html.py +0 -0
  41. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/default_config_text.py +0 -0
  42. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/default_counts.py +0 -0
  43. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/drain_watch.py +0 -0
  44. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/experiment_notes.py +0 -0
  45. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/experiment_runs.py +0 -0
  46. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/experiments.py +0 -0
  47. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/file_changes.py +0 -0
  48. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/format_duration.py +0 -0
  49. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/format_started.py +0 -0
  50. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/format_value.py +0 -0
  51. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/get_state.py +0 -0
  52. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/grid_cell.py +0 -0
  53. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/group_runs.py +0 -0
  54. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/init.py +0 -0
  55. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/invocation_started.py +0 -0
  56. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/is_non_negative_int.py +0 -0
  57. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/is_non_negative_number.py +0 -0
  58. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/is_positive_int.py +0 -0
  59. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/list_experiments.py +0 -0
  60. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/list_runs.py +0 -0
  61. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/load_config.py +0 -0
  62. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/load_experiment.py +0 -0
  63. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/load_run.py +0 -0
  64. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/log.py +0 -0
  65. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/log_path.py +0 -0
  66. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/memory_interval.py +0 -0
  67. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/models.py +0 -0
  68. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/modes.py +0 -0
  69. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/nests_runs.py +0 -0
  70. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/note_path.py +0 -0
  71. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/notebook_kernel.py +0 -0
  72. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/output_html.py +0 -0
  73. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/parse_run_view.py +0 -0
  74. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/parse_subset.py +0 -0
  75. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/pivot_runs.py +0 -0
  76. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/print_rows.py +0 -0
  77. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/python_blocks.py +0 -0
  78. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/read_config.py +0 -0
  79. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/read_path.py +0 -0
  80. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/render_markdown.py +0 -0
  81. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/retries.py +0 -0
  82. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/run_command.py +0 -0
  83. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/run_control.py +0 -0
  84. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/run_output.py +0 -0
  85. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/run_status.py +0 -0
  86. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/__init__.py +0 -0
  87. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/cgroup_memory.py +0 -0
  88. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/check_args.py +0 -0
  89. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/check_subset.py +0 -0
  90. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/container_cgroup.py +0 -0
  91. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/container_memory.py +0 -0
  92. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/describe_event.py +0 -0
  93. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/docker_output.py +0 -0
  94. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/execute_run.py +0 -0
  95. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/exit_signal.py +0 -0
  96. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/fill_dirs.py +0 -0
  97. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/fill_experiment_env.py +0 -0
  98. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/flag_name.py +0 -0
  99. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/hold_folder.py +0 -0
  100. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/hook_dirs.py +0 -0
  101. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/in_subset.py +0 -0
  102. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/invocation_hook.py +0 -0
  103. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/invocation_meta.py +0 -0
  104. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/new_param_run_id.py +0 -0
  105. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/new_run_id.py +0 -0
  106. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/new_stamped_run_id.py +0 -0
  107. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/param_args.py +0 -0
  108. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/param_grid.py +0 -0
  109. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/param_run_name.py +0 -0
  110. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/plan_runs.py +0 -0
  111. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/prepare_experiment.py +0 -0
  112. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/read_experiment_config.py +0 -0
  113. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/record_memory.py +0 -0
  114. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/run_experiment.py +0 -0
  115. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/run_folder.py +0 -0
  116. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/run_git.py +0 -0
  117. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/run_headless.py +0 -0
  118. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/runs_parent.py +0 -0
  119. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/shell_command.py +0 -0
  120. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/signal_tree.py +0 -0
  121. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/stop_then_kill.py +0 -0
  122. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/wait_for_tree.py +0 -0
  123. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/write_run_json.py +0 -0
  124. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runs_view_command.py +0 -0
  125. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/save_conflict_copy.py +0 -0
  126. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/save_note.py +0 -0
  127. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/saved_outputs.py +0 -0
  128. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/serve_app.py +0 -0
  129. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/server.py +0 -0
  130. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/set_state.py +0 -0
  131. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/shared_params.py +0 -0
  132. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/sort_href.py +0 -0
  133. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/sql_quote.py +0 -0
  134. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/state_path.py +0 -0
  135. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/static/elapsed.js +0 -0
  136. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/static/experiment.js +0 -0
  137. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/static/labnotes.css +0 -0
  138. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/static/local-time.js +0 -0
  139. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/static/new-note.js +0 -0
  140. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/static/note-edit.js +0 -0
  141. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/static/note-editor.js +0 -0
  142. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/static/row-link.js +0 -0
  143. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/static/run-cell.js +0 -0
  144. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/static/run-output.js +0 -0
  145. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/static/view-toggle.js +0 -0
  146. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/summarize_config.py +0 -0
  147. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/__init__.py +0 -0
  148. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/experiment_rows.py +0 -0
  149. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/experiment_run_ids.py +0 -0
  150. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/experiment_toml.py +0 -0
  151. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/experiments_ddl.py +0 -0
  152. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/file_prefix.py +0 -0
  153. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/file_text.py +0 -0
  154. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/iso_time.py +0 -0
  155. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/list_experiment_runs.py +0 -0
  156. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/note_text.py +0 -0
  157. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/open_tables.py +0 -0
  158. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/path_glob.py +0 -0
  159. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/path_pattern.py +0 -0
  160. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/read_blocks.py +0 -0
  161. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/read_experiment.py +0 -0
  162. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/read_file.py +0 -0
  163. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/read_log.py +0 -0
  164. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/read_memory.py +0 -0
  165. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/read_run.py +0 -0
  166. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/read_run_file.py +0 -0
  167. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/runs_columns.py +0 -0
  168. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/summarize_experiments.py +0 -0
  169. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/templates/base.html +0 -0
  170. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/templates/editor_imports.html +0 -0
  171. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/templates/experiment.html +0 -0
  172. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/templates/index.html +0 -0
  173. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/templates/note.html +0 -0
  174. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/templates/run.html +0 -0
  175. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/__init__.py +0 -0
  176. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/browse_app.py +0 -0
  177. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/browse_tui.py +0 -0
  178. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/check_view_response.py +0 -0
  179. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/config.py +0 -0
  180. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/dim.py +0 -0
  181. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/experiment_screen.py +0 -0
  182. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/experiments_screen.py +0 -0
  183. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/fill_table.py +0 -0
  184. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/format_cell.py +0 -0
  185. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/format_elapsed.py +0 -0
  186. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/group_cells.py +0 -0
  187. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/invocation_columns.py +0 -0
  188. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/invocation_rows.py +0 -0
  189. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/leave_prompt.py +0 -0
  190. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/log_block.py +0 -0
  191. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/log_blocks.py +0 -0
  192. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/native_rows.py +0 -0
  193. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/reload_on_change.py +0 -0
  194. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/run_app.py +0 -0
  195. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/run_cells.py +0 -0
  196. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/run_output.py +0 -0
  197. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/run_screen.py +0 -0
  198. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/run_tui.py +0 -0
  199. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/runs_table.py +0 -0
  200. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/runs_view.py +0 -0
  201. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/stopped_title.py +0 -0
  202. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/view_column.py +0 -0
  203. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/view_process.py +0 -0
  204. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/utils/__init__.py +0 -0
  205. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/utils/format_bytes.py +0 -0
  206. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/utils/process_alive.py +0 -0
  207. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/utils/run_usage.py +0 -0
  208. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/utils/tree_rss.py +0 -0
  209. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/utils/tree_usage.py +0 -0
  210. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/view/__init__.py +0 -0
  211. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/view/answer.py +0 -0
  212. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/view/build.py +0 -0
  213. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/view/respond.py +0 -0
  214. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/view/serve.py +0 -0
  215. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/wait_for_note.py +0 -0
  216. {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/watch_rows.py +0 -0
  217. {labnotes-0.0.136 → labnotes-0.0.137}/testing-conventions.toml +0 -0
  218. {labnotes-0.0.136 → labnotes-0.0.137}/tests/conftest.py +0 -0
  219. {labnotes-0.0.136 → labnotes-0.0.137}/tests/e2e/conftest.py +0 -0
  220. {labnotes-0.0.136 → labnotes-0.0.137}/tests/integration/conftest.py +0 -0
  221. {labnotes-0.0.136 → labnotes-0.0.137}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: labnotes
3
- Version: 0.0.136
3
+ Version: 0.0.137
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>
@@ -207,6 +207,11 @@ going. Elsewhere, it prints a line per event instead.
207
207
  `/tmp/labnotes-<uid>/` and exits once nothing is running and no client has
208
208
  been connected for 15 seconds. Runs belong to the daemon, so quitting the
209
209
  live view, closing its terminal, or killing `run` outright leaves them going.
210
+ - Each labnotes version starts its own daemon. After an upgrade, new runs go
211
+ to the new version's daemon while an older one finishes its runs and exits.
212
+ `run status`, `run stop` and `run control` reach only the daemon of the
213
+ version you call them with. Each `run` reads `.labnotes.toml` as it is on
214
+ disk, even when the daemon is already up.
210
215
  - Ctrl-C stops the running scripts and records their end. A second Ctrl-C
211
216
  kills them. SIGTERM stops them the same way, then kills any still going 5
212
217
  seconds later. Once the runs are done, either one closes the live view.
@@ -220,7 +225,8 @@ going. Elsewhere, it prints a line per event instead.
220
225
  - `labnotes run control NAME ACTION [ARG]` sends one live-view control to a
221
226
  running experiment: `kill` a run, `set_concurrency` to a number,
222
227
  `interrupt` or `finish`.
223
- - A second `run` of the same experiment fails while the first is going.
228
+ - A second `run` of the same experiment fails while the first is going on
229
+ the same daemon.
224
230
  - It exits 0 even if runs fail; the summary line counts failures. A run that
225
231
  was retried counts as retried, not failed. If it can't
226
232
  start or reach the daemon, it prints the cause on one line and exits 1.
@@ -11,6 +11,7 @@ from starlette.responses import JSONResponse, Response, StreamingResponse
11
11
  from starlette.routing import Route
12
12
 
13
13
  from labnotes.models import Controls, LabnotesConfig
14
+ from labnotes.read_config import read_config
14
15
  from labnotes.runner.prepare_experiment import prepare_experiment
15
16
  from labnotes.runner.run_experiment import run_experiment
16
17
  from labnotes.runner.stop_then_kill import GRACE_SECONDS
@@ -73,8 +74,9 @@ def daemon_app(config: LabnotesConfig) -> Starlette:
73
74
  async def start(name: str, body: dict[str, object]) -> Response:
74
75
  path = body.get("experiment_config")
75
76
  try:
77
+ current = read_config(config.path)
76
78
  experiment, concurrency = await prepare_experiment(
77
- config,
79
+ current,
78
80
  name,
79
81
  None if path is None else Path(str(path)),
80
82
  body.get("concurrency"), # type: ignore[arg-type]
@@ -100,7 +102,7 @@ def daemon_app(config: LabnotesConfig) -> Starlette:
100
102
  error = None
101
103
  try:
102
104
  await run_experiment(
103
- config,
105
+ current,
104
106
  name,
105
107
  experiment,
106
108
  concurrency,
@@ -2,15 +2,19 @@ import asyncio
2
2
  import contextlib
3
3
 
4
4
  from labnotes.daemon.run_daemon import run_daemon
5
+ from labnotes.daemon.socket_path import socket_path
5
6
  from labnotes.models import LabnotesConfig
6
7
  from labnotes.runner.hold_folder import hold_folder
7
8
 
8
9
 
9
10
  def serve_daemon(config: LabnotesConfig) -> None:
11
+ # Labnotes 0.0.136 and older lock the project folder itself.
12
+ path = socket_path(config.root).with_suffix(".lock")
13
+ path.touch()
10
14
  lock = contextlib.ExitStack()
11
15
  try:
12
- lock.enter_context(hold_folder(config.root))
16
+ lock.enter_context(hold_folder(path))
13
17
  except BlockingIOError:
14
- return # Another daemon already serves this project.
18
+ return # Another daemon of this version already serves this project.
15
19
  with lock:
16
20
  asyncio.run(run_daemon(config))
@@ -1,13 +1,15 @@
1
1
  import hashlib
2
2
  import os
3
+ from importlib.metadata import version
3
4
  from pathlib import Path
4
5
 
5
6
 
6
7
  # Unix socket paths cap at 107 bytes, so the socket can't live in a deep project.
7
8
  # A fixed folder, not XDG_RUNTIME_DIR or TMPDIR, so every shell finds the daemon.
9
+ # Each version gets its own daemon, so an upgrade never runs on an older one.
8
10
  def socket_path(root: Path) -> Path:
9
11
  folder = Path("/tmp") / f"labnotes-{os.getuid()}"
10
12
  folder.mkdir(exist_ok=True)
11
13
  folder.chmod(0o700)
12
14
  digest = hashlib.sha256(str(root.resolve()).encode()).hexdigest()[:16]
13
- return folder / f"{digest}.sock"
15
+ return folder / f"{digest}-{version('labnotes')}.sock"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes