calkit-python 0.42.0__tar.gz → 0.42.1__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 (822) hide show
  1. {calkit_python-0.42.0 → calkit_python-0.42.1}/PKG-INFO +7 -2
  2. {calkit_python-0.42.0 → calkit_python-0.42.1}/README.md +5 -0
  3. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/check.py +4 -1
  4. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/main/core.py +59 -0
  5. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/new.py +36 -0
  6. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/scheduler.py +264 -43
  7. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/update.py +19 -0
  8. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/core.py +76 -8
  9. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/environments.py +10 -1
  10. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/models/core.py +8 -1
  11. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/main/test_core.py +49 -0
  12. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/test_check.py +14 -0
  13. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/test_scheduler.py +170 -16
  14. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/browser-ext/index.md +6 -2
  15. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/cli-reference.md +33 -28
  16. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/environments.md +8 -7
  17. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/hpc.md +31 -0
  18. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/index.md +5 -0
  19. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/AGENTS.md +3 -1
  20. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/routes/projects/core.py +251 -40
  21. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/core.py +60 -4
  22. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/dvc.py +4 -0
  23. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/git.py +264 -64
  24. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/models/core.py +5 -0
  25. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/pipeline.py +86 -12
  26. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/projects.py +71 -43
  27. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/api/routes/projects/test_core.py +281 -10
  28. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/test_git.py +46 -0
  29. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/test_pipeline.py +97 -2
  30. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/test_projects.py +66 -0
  31. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/test_users.py +55 -1
  32. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/users.py +35 -13
  33. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/pyproject.toml +9 -0
  34. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/index.ts +1 -0
  35. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/schemas.gen.ts +40 -0
  36. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/sdk.gen.ts +23 -0
  37. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/types.gen.ts +53 -3
  38. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/ArtifactCompareModal.tsx +68 -22
  39. calkit_python-0.42.1/hub/frontend/src/components/Notebooks/NotebookView.tsx +84 -0
  40. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/hooks/useProject.ts +34 -9
  41. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/api.test.ts +19 -1
  42. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/api.ts +20 -0
  43. calkit_python-0.42.1/hub/frontend/src/lib/staleChunks.test.ts +86 -0
  44. calkit_python-0.42.1/hub/frontend/src/lib/staleChunks.ts +49 -0
  45. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/main.tsx +3 -0
  46. calkit_python-0.42.1/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/figures.tsx +575 -0
  47. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/notebooks.tsx +1 -70
  48. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/pipeline.tsx +39 -13
  49. calkit_python-0.42.1/hub/frontend/tests/figures-pagination.spec.ts +237 -0
  50. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/vite.config.ts +9 -5
  51. {calkit_python-0.42.0 → calkit_python-0.42.1}/pyproject.toml +6 -1
  52. {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/src/environments.ts +1 -0
  53. calkit_python-0.42.0/hub/frontend/src/components/Notebooks/NotebookView.tsx +0 -37
  54. calkit_python-0.42.0/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/figures.tsx +0 -350
  55. {calkit_python-0.42.0 → calkit_python-0.42.1}/.claude-plugin/marketplace.json +0 -0
  56. {calkit_python-0.42.0 → calkit_python-0.42.1}/.dockerignore +0 -0
  57. {calkit_python-0.42.0 → calkit_python-0.42.1}/.gitattributes +0 -0
  58. {calkit_python-0.42.0 → calkit_python-0.42.1}/.gitignore +0 -0
  59. {calkit_python-0.42.0 → calkit_python-0.42.1}/.gitmodules +0 -0
  60. {calkit_python-0.42.0 → calkit_python-0.42.1}/.pre-commit-config.yaml +0 -0
  61. {calkit_python-0.42.0 → calkit_python-0.42.1}/.prettierignore +0 -0
  62. {calkit_python-0.42.0 → calkit_python-0.42.1}/.prettierrc.json +0 -0
  63. {calkit_python-0.42.0 → calkit_python-0.42.1}/.python-version +0 -0
  64. {calkit_python-0.42.0 → calkit_python-0.42.1}/.vscode/launch.json +0 -0
  65. {calkit_python-0.42.0 → calkit_python-0.42.1}/.vscode/tasks.json +0 -0
  66. {calkit_python-0.42.0 → calkit_python-0.42.1}/AGENTS.md +0 -0
  67. {calkit_python-0.42.0 → calkit_python-0.42.1}/CITATION.cff +0 -0
  68. {calkit_python-0.42.0 → calkit_python-0.42.1}/CODE_OF_CONDUCT.md +0 -0
  69. {calkit_python-0.42.0 → calkit_python-0.42.1}/CONTRIBUTING.md +0 -0
  70. {calkit_python-0.42.0 → calkit_python-0.42.1}/LICENSE +0 -0
  71. {calkit_python-0.42.0 → calkit_python-0.42.1}/Makefile +0 -0
  72. {calkit_python-0.42.0 → calkit_python-0.42.1}/agent-plugin/.claude-plugin/plugin.json +0 -0
  73. {calkit_python-0.42.0 → calkit_python-0.42.1}/agent-plugin/skills/add-pipeline-stage/SKILL.md +0 -0
  74. {calkit_python-0.42.0 → calkit_python-0.42.1}/agent-plugin/skills/conventions/SKILL.md +0 -0
  75. {calkit_python-0.42.0 → calkit_python-0.42.1}/agent-plugin/skills/create-pipeline/SKILL.md +0 -0
  76. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/.gitignore +0 -0
  77. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/README.md +0 -0
  78. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/options.html +0 -0
  79. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/package-lock.json +0 -0
  80. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/package.json +0 -0
  81. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/popup.html +0 -0
  82. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/public/icons/calkit-128.png +0 -0
  83. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/public/icons/calkit-16.png +0 -0
  84. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/public/icons/calkit-32.png +0 -0
  85. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/public/icons/calkit-48.png +0 -0
  86. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/public/icons/calkit.svg +0 -0
  87. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/public/manifest.json +0 -0
  88. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/scripts/build-content.mjs +0 -0
  89. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/scripts/package-manifest.mjs +0 -0
  90. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/scripts/store-screenshots.py +0 -0
  91. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/scripts/watch.mjs +0 -0
  92. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/background/index.ts +0 -0
  93. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/content/github.ts +0 -0
  94. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/content/overleaf.ts +0 -0
  95. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/content/references.ts +0 -0
  96. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/api.ts +0 -0
  97. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/auth.ts +0 -0
  98. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/calkit-yaml.test.ts +0 -0
  99. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/calkit-yaml.ts +0 -0
  100. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/detect.test.ts +0 -0
  101. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/detect.ts +0 -0
  102. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/hub-url.ts +0 -0
  103. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/hubs.test.ts +0 -0
  104. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/hubs.ts +0 -0
  105. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/latex.test.ts +0 -0
  106. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/latex.ts +0 -0
  107. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/lifecycle.ts +0 -0
  108. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/messages.test.ts +0 -0
  109. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/messages.ts +0 -0
  110. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/pickers.ts +0 -0
  111. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/storage.ts +0 -0
  112. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/types.ts +0 -0
  113. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/ui.test.ts +0 -0
  114. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/ui.ts +0 -0
  115. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/options/options.ts +0 -0
  116. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/popup/popup.css +0 -0
  117. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/popup/popup.ts +0 -0
  118. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/viewer/viewer.ts +0 -0
  119. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/tsconfig.json +0 -0
  120. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/viewer.html +0 -0
  121. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/vite.config.ts +0 -0
  122. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/vite.content.config.ts +0 -0
  123. {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/vitest.config.ts +0 -0
  124. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/__init__.py +0 -0
  125. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/__main__.py +0 -0
  126. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/calc.py +0 -0
  127. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/check.py +0 -0
  128. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/__init__.py +0 -0
  129. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/config.py +0 -0
  130. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/core.py +0 -0
  131. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/delete.py +0 -0
  132. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/describe.py +0 -0
  133. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/dev.py +0 -0
  134. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/hub.py +0 -0
  135. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/import_.py +0 -0
  136. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/latex.py +0 -0
  137. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/list.py +0 -0
  138. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/main/__init__.py +0 -0
  139. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/main/xr.py +0 -0
  140. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/notebooks.py +0 -0
  141. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/office.py +0 -0
  142. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/overleaf.py +0 -0
  143. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/sync.py +0 -0
  144. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/conda.py +0 -0
  145. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/config.py +0 -0
  146. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/datasets.py +0 -0
  147. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/dependencies.py +0 -0
  148. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/detect.py +0 -0
  149. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/docker.py +0 -0
  150. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/dvc/__init__.py +0 -0
  151. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/dvc/core.py +0 -0
  152. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/dvc/zip.py +0 -0
  153. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/fs.py +0 -0
  154. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/git.py +0 -0
  155. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/github.py +0 -0
  156. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/gui.py +0 -0
  157. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/hub.py +0 -0
  158. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/install.py +0 -0
  159. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/invenio.py +0 -0
  160. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/julia.py +0 -0
  161. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/jupyter.py +0 -0
  162. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/jupyterlab/__init__.py +0 -0
  163. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/jupyterlab/routes.py +0 -0
  164. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/labextension/package.json +0 -0
  165. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/labextension/schemas/calkit/package.json.orig +0 -0
  166. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/labextension/schemas/calkit/plugin.json +0 -0
  167. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/labextension/static/502.9a2c5772a15466e923ef.js +0 -0
  168. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/labextension/static/695.2c41003a452d43d2b358.js +0 -0
  169. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/labextension/static/867.a42a046aa5108f54f8fb.js +0 -0
  170. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/labextension/static/909.e3f9cc3408834a7fdcc3.js +0 -0
  171. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/labextension/static/946.050af2abf7845cfbdbd2.js +0 -0
  172. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/labextension/static/946.050af2abf7845cfbdbd2.js.LICENSE.txt +0 -0
  173. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/labextension/static/b2f1c3efe70cb539d121.png +0 -0
  174. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/labextension/static/remoteEntry.ac9035764d5b2adbb542.js +0 -0
  175. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/labextension/static/style.js +0 -0
  176. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/labextension/static/third-party-licenses.json +0 -0
  177. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/latex.py +0 -0
  178. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/licenses.py +0 -0
  179. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/magics.py +0 -0
  180. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/matlab.py +0 -0
  181. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/models/__init__.py +0 -0
  182. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/models/io.py +0 -0
  183. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/models/iteration.py +0 -0
  184. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/models/pipeline.py +0 -0
  185. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/notebooks.py +0 -0
  186. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/office.py +0 -0
  187. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/ops.py +0 -0
  188. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/overleaf.py +0 -0
  189. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/pipeline.py +0 -0
  190. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/releases.py +0 -0
  191. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/server.py +0 -0
  192. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/templates/__init__.py +0 -0
  193. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/templates/core.py +0 -0
  194. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/templates/latex/__init__.py +0 -0
  195. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/templates/latex/article/paper.tex +0 -0
  196. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/templates/latex/core.py +0 -0
  197. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/templates/latex/jfm/jfm.bst +0 -0
  198. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/templates/latex/jfm/jfm.cls +0 -0
  199. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/templates/latex/jfm/lineno-FLM.sty +0 -0
  200. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/templates/latex/jfm/paper.tex +0 -0
  201. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/templates/latex/jfm/upmath.sty +0 -0
  202. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/__init__.py +0 -0
  203. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/__init__.py +0 -0
  204. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/main/__init__.py +0 -0
  205. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/main/test_lock.py +0 -0
  206. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/main/test_subprojects.py +0 -0
  207. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/main/test_xr.py +0 -0
  208. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/test_config.py +0 -0
  209. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/test_core.py +0 -0
  210. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/test_delete.py +0 -0
  211. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/test_describe.py +0 -0
  212. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/test_hub.py +0 -0
  213. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/test_import.py +0 -0
  214. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/test_latex.py +0 -0
  215. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/test_list.py +0 -0
  216. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/test_new.py +0 -0
  217. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/test_notebooks.py +0 -0
  218. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/test_overleaf.py +0 -0
  219. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/test_sync.py +0 -0
  220. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/test_update.py +0 -0
  221. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/dvc/__init__.py +0 -0
  222. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/dvc/test_core.py +0 -0
  223. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/dvc/test_zip.py +0 -0
  224. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/jupyterlab/__init__.py +0 -0
  225. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/jupyterlab/conftest.py +0 -0
  226. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/jupyterlab/test_routes.py +0 -0
  227. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/models/__init__.py +0 -0
  228. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/models/test_core.py +0 -0
  229. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/models/test_iteration.py +0 -0
  230. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/models/test_pipeline.py +0 -0
  231. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_calc.py +0 -0
  232. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_check.py +0 -0
  233. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_conda.py +0 -0
  234. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_config.py +0 -0
  235. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_core.py +0 -0
  236. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_dependencies.py +0 -0
  237. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_detect.py +0 -0
  238. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_docker.py +0 -0
  239. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_environments.py +0 -0
  240. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_fs.py +0 -0
  241. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_git.py +0 -0
  242. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_hub.py +0 -0
  243. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_install.py +0 -0
  244. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_invenio.py +0 -0
  245. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_julia.py +0 -0
  246. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_jupyter.py +0 -0
  247. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_keyring_windows.py +0 -0
  248. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_licenses.py +0 -0
  249. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_magics.py +0 -0
  250. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_matlab.py +0 -0
  251. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_notebooks.py +0 -0
  252. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_overleaf.py +0 -0
  253. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_pipeline.py +0 -0
  254. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_releases.py +0 -0
  255. {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_templates.py +0 -0
  256. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/CNAME +0 -0
  257. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/acknowledgements.md +0 -0
  258. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/ai-tools.md +0 -0
  259. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/apps.md +0 -0
  260. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/browser-ext/privacy.md +0 -0
  261. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/calculations.md +0 -0
  262. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/calkit-yaml.md +0 -0
  263. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/cloud-integration.md +0 -0
  264. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/datasets.md +0 -0
  265. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/dependencies.md +0 -0
  266. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/examples.md +0 -0
  267. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/governance.md +0 -0
  268. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/help.md +0 -0
  269. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/hub/index.md +0 -0
  270. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/hub/self-hosting.md +0 -0
  271. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/img/c-to-the-k-white.svg +0 -0
  272. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/img/calkit-fragmentation-compendium.png +0 -0
  273. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/img/calkit-no-bg.png +0 -0
  274. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/img/caltech.png +0 -0
  275. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/img/connect-zenodo.png +0 -0
  276. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/img/jupyterlab/all-green.png +0 -0
  277. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/img/jupyterlab/collect-data-stale.png +0 -0
  278. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/img/jupyterlab/new-env.png +0 -0
  279. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/img/jupyterlab/new-notebook.png +0 -0
  280. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/img/jupyterlab/pipeline-badge.png +0 -0
  281. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/img/jupyterlab-params.png +0 -0
  282. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/img/pipeline.png +0 -0
  283. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/img/plos-osi-code-2024-03.png +0 -0
  284. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/img/schmidt-sciences.png +0 -0
  285. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/img/vscode-nb-params.png +0 -0
  286. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/installation.md +0 -0
  287. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/jupyterlab.md +0 -0
  288. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/latex.md +0 -0
  289. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/local-server.md +0 -0
  290. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/notebooks.md +0 -0
  291. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/overleaf.md +0 -0
  292. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/pipeline/index.md +0 -0
  293. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/pipeline/manual-steps.md +0 -0
  294. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/pipeline/running-and-logging.md +0 -0
  295. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/questions.md +0 -0
  296. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/quickstart.md +0 -0
  297. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/references.md +0 -0
  298. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/releases.md +0 -0
  299. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/reproducibility.md +0 -0
  300. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/subprojects.md +0 -0
  301. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/adding-latex-pub-docker.md +0 -0
  302. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/ai-agents.md +0 -0
  303. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/conda-envs.md +0 -0
  304. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/existing-project.md +0 -0
  305. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/first-project.md +0 -0
  306. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/github-actions.md +0 -0
  307. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/actions-repo-secrets.png +0 -0
  308. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/latex-codespaces/building-codespace.png +0 -0
  309. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/latex-codespaces/codespaces-secrets-2.png +0 -0
  310. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/latex-codespaces/editor-split.png +0 -0
  311. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/latex-codespaces/go-to-linked-code.png +0 -0
  312. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/latex-codespaces/issue-from-selection.png +0 -0
  313. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/latex-codespaces/new-project.png +0 -0
  314. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/latex-codespaces/new-pub-2.png +0 -0
  315. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/latex-codespaces/new-token.png +0 -0
  316. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/latex-codespaces/paper.tex.png +0 -0
  317. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/latex-codespaces/project-home-3.png +0 -0
  318. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/latex-codespaces/push.png +0 -0
  319. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/latex-codespaces/stage.png +0 -0
  320. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/anakin-excel.jpg +0 -0
  321. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/chart-more-rows.png +0 -0
  322. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/create-project.png +0 -0
  323. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/elsevier-research-data-guidelines.png +0 -0
  324. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/excel-chart.png +0 -0
  325. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/excel-data.png +0 -0
  326. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/insert-link-to-file.png +0 -0
  327. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/needs-clone.png +0 -0
  328. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/new-stage.png +0 -0
  329. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/phd-comics-version-control.webp +0 -0
  330. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/pipeline-out-of-date.png +0 -0
  331. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/status-more-rows.png +0 -0
  332. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/uncommitted-changes.png +0 -0
  333. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/untracked-data.png +0 -0
  334. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/updated-publication.png +0 -0
  335. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/word-to-pdf-stage-2.png +0 -0
  336. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/workflow-page.png +0 -0
  337. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/openfoam/clone.png +0 -0
  338. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/openfoam/create-project.png +0 -0
  339. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/openfoam/datasets-page.png +0 -0
  340. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/openfoam/figure-on-website-updated.png +0 -0
  341. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/openfoam/figure-on-website.png +0 -0
  342. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/openfoam/new-token.png +0 -0
  343. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/openfoam/reclone.png +0 -0
  344. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/openfoam/status-after-import-dataset.png +0 -0
  345. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/quick-actions.png +0 -0
  346. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/run-proc.png +0 -0
  347. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/vscode-slurm-notebook/create-calkit-env.png +0 -0
  348. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/vscode-slurm-notebook/create-inner-env.png +0 -0
  349. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/vscode-slurm-notebook/create-new-calkit-env.png +0 -0
  350. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/vscode-slurm-notebook/select-calkit-env.png +0 -0
  351. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/vscode-slurm-notebook/slurm-job-running.png +0 -0
  352. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/vscode-slurm-notebook/slurm-launch-options.png +0 -0
  353. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/vscode-slurm-notebook/starting-slurm-job.png +0 -0
  354. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/index.md +0 -0
  355. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/jupyterlab.md +0 -0
  356. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/latex-codespaces.md +0 -0
  357. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/matlab.md +0 -0
  358. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/notebook-pipeline.md +0 -0
  359. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/office.md +0 -0
  360. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/openfoam.md +0 -0
  361. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/procedures.md +0 -0
  362. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/vscode-slurm-notebook.md +0 -0
  363. {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/version-control.md +0 -0
  364. {calkit_python-0.42.0 → calkit_python-0.42.1}/flake.lock +0 -0
  365. {calkit_python-0.42.0 → calkit_python-0.42.1}/flake.nix +0 -0
  366. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/.env.example +0 -0
  367. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/.gitattributes +0 -0
  368. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/.gitignore +0 -0
  369. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/.vscode/launch.json +0 -0
  370. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/LICENSE +0 -0
  371. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/Makefile +0 -0
  372. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/README.md +0 -0
  373. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/.gitignore +0 -0
  374. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/.python-version +0 -0
  375. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/Dockerfile +0 -0
  376. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/Makefile +0 -0
  377. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/README.md +0 -0
  378. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/alembic.ini +0 -0
  379. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/__init__.py +0 -0
  380. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/README +0 -0
  381. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/env.py +0 -0
  382. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/script.py.mako +0 -0
  383. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/.keep +0 -0
  384. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/07c8236476c4_add_fields_to_usertoken.py +0 -0
  385. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/10a05eaedfbd_add_dataset_table.py +0 -0
  386. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/1546aa334cd5_make_project_description_nullable.py +0 -0
  387. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/1a31ce608336_add_cascade_delete_relationships.py +0 -0
  388. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/1fb6e38eb0e9_add_deviceauth_table.py +0 -0
  389. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/208e7457f3ba_add_title_to_project.py +0 -0
  390. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/2e7c25a00842_add_is_public_to_project.py +0 -0
  391. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/38e178698db2_update_subscription_model_to_use_plan_.py +0 -0
  392. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/3b1e67e9c318_add_usertoken_table.py +0 -0
  393. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/4dac15c0282a_add_stripe_customer_id_to_user.py +0 -0
  394. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/4e1c917fcca4_add_status_columns_to_project_table.py +0 -0
  395. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/5ba89308431f_add_project_table.py +0 -0
  396. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/5d6f8217c890_add_subscriber_user_id_to_org_.py +0 -0
  397. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/65b2d15cc702_add_github_username_field_to_user.py +0 -0
  398. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/697c3c1a8a27_add_git_repo_url_to_project.py +0 -0
  399. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/6f3a3afbea8b_add_number_field_to_question.py +0 -0
  400. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/7076d9b5c887_use_account_for_project_owner.py +0 -0
  401. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/71e1d1e69bbd_add_table_for_storing_user_github_tokens.py +0 -0
  402. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/799476973bce_add_created_ts_to_user_github_token_.py +0 -0
  403. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/7cacee34034c_add_parent_child_relationship_to_.py +0 -0
  404. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/9c0a54914c78_add_max_length_for_string_varchar_.py +0 -0
  405. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/9c4f70636d73_add_fields_to_usertoken.py +0 -0
  406. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/a333fc5aa994_index_project_folders_synced_with_.py +0 -0
  407. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/a4af19842927_create_table_to_store_user_zenodo_tokens.py +0 -0
  408. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/ab7816be480b_drop_items.py +0 -0
  409. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/ac622559475f_save_timestamps_for_github_token_.py +0 -0
  410. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/af024967630d_lowercase_account_names.py +0 -0
  411. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/c1f9a3e27d48_consolidate_comment_tables.py +0 -0
  412. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/c46a78ba506c_add_created_column_to_account.py +0 -0
  413. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/c749b39072d3_add_figurecomment.py +0 -0
  414. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/c7c41c3f0d22_add_user_external_credential_table.py +0 -0
  415. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/d01ce914143d_make_question_a_table.py +0 -0
  416. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/d21ed1c9537e_add_zenodo_user_id_column_to_user.py +0 -0
  417. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/d3a8021fb433_add_table_for_user_project_access.py +0 -0
  418. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/d4e5f6a7b8c9_ghless_membership_and_invitations.py +0 -0
  419. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/d6366015af35_add_discount_code_table.py +0 -0
  420. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/d98dd8ec85a3_edit_replace_id_integers_in_all_models_.py +0 -0
  421. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/dcef842dee10_add_refreshtoken_table.py +0 -0
  422. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/e1b0fa2a6d34_backfill_external_credentials_from_legacy_.py +0 -0
  423. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/e2412789c190_initialize_models.py +0 -0
  424. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/e7671197c00b_add_account_table.py +0 -0
  425. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/ed74edb0a9e6_create_table_for_user_overleaf_token.py +0 -0
  426. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/edcabfca98df_add_subscription_and_org_membership_.py +0 -0
  427. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/f0e23e048b1b_add_fields_to_project.py +0 -0
  428. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/f3a9c1b7e240_add_releases_feature.py +0 -0
  429. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/f5ad6445ad03_enable_user_project_access_to_be_null.py +0 -0
  430. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/f74a96172dbd_add_table_for_locking_project_files.py +0 -0
  431. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/__init__.py +0 -0
  432. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/deps.py +0 -0
  433. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/main.py +0 -0
  434. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/routes/__init__.py +0 -0
  435. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/routes/accounts.py +0 -0
  436. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/routes/datasets.py +0 -0
  437. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/routes/feature_votes.py +0 -0
  438. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/routes/login.py +0 -0
  439. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/routes/misc.py +0 -0
  440. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/routes/orgs.py +0 -0
  441. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/routes/projects/__init__.py +0 -0
  442. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/routes/projects/dvc.py +0 -0
  443. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/routes/projects/fs.py +0 -0
  444. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/routes/projects/releases.py +0 -0
  445. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/routes/references.py +0 -0
  446. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/routes/users.py +0 -0
  447. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/arxiv.py +0 -0
  448. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/client.py +0 -0
  449. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/config.py +0 -0
  450. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/db.py +0 -0
  451. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/email-templates/build/new_account.html +0 -0
  452. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/email-templates/build/project_invitation.html +0 -0
  453. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/email-templates/build/release_share.html +0 -0
  454. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/email-templates/build/reset_password.html +0 -0
  455. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/email-templates/build/test_email.html +0 -0
  456. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/email-templates/src/new_account.mjml +0 -0
  457. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/email-templates/src/project_invitation.mjml +0 -0
  458. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/email-templates/src/release_share.mjml +0 -0
  459. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/email-templates/src/reset_password.mjml +0 -0
  460. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/email-templates/src/test_email.mjml +0 -0
  461. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/github.py +0 -0
  462. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/main.py +0 -0
  463. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/messaging.py +0 -0
  464. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/mixpanel.py +0 -0
  465. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/models/__init__.py +0 -0
  466. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/models/projects.py +0 -0
  467. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/models/releases.py +0 -0
  468. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/orgs.py +0 -0
  469. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/pdftext.py +0 -0
  470. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/security.py +0 -0
  471. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/storage.py +0 -0
  472. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/stripe.py +0 -0
  473. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/subscriptions.py +0 -0
  474. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/__init__.py +0 -0
  475. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/api/__init__.py +0 -0
  476. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/api/routes/__init__.py +0 -0
  477. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/api/routes/projects/__init__.py +0 -0
  478. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/api/routes/projects/test_dvc.py +0 -0
  479. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/api/routes/projects/test_fs.py +0 -0
  480. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/api/routes/projects/test_overleaf_links.py +0 -0
  481. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/api/routes/test_feature_votes.py +0 -0
  482. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/api/routes/test_login.py +0 -0
  483. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/api/routes/test_misc.py +0 -0
  484. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/api/routes/test_releases.py +0 -0
  485. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/api/routes/test_users.py +0 -0
  486. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/conftest.py +0 -0
  487. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/test_arxiv.py +0 -0
  488. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/test_client.py +0 -0
  489. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/test_core.py +0 -0
  490. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/test_db.py +0 -0
  491. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/test_dvc.py +0 -0
  492. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/test_pdftext.py +0 -0
  493. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/test_version.py +0 -0
  494. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/version.py +0 -0
  495. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/zenodo.py +0 -0
  496. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/zotero.py +0 -0
  497. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/prestart.sh +0 -0
  498. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/scripts/backend-pre-start.py +0 -0
  499. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/scripts/create-initial-data.py +0 -0
  500. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/scripts/format.sh +0 -0
  501. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/scripts/generate-client.py +0 -0
  502. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/scripts/lint.sh +0 -0
  503. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/scripts/rotate-fernet-secrets.py +0 -0
  504. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/scripts/test.sh +0 -0
  505. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/tests-start.sh +0 -0
  506. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/config/alloy/config.alloy +0 -0
  507. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/config/grafana/provisioning/dashboards/dashboards.yml +0 -0
  508. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/config/grafana/provisioning/dashboards/fastapi.json +0 -0
  509. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/config/grafana/provisioning/datasources/datasources.yml +0 -0
  510. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/config/loki/loki.yml +0 -0
  511. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/config/prometheus/prometheus.yml +0 -0
  512. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/docker-compose.override.yml +0 -0
  513. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/docker-compose.traefik.yml +0 -0
  514. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/docker-compose.yml +0 -0
  515. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/docs/dev/database-migrations.md +0 -0
  516. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/docs/dev/deployment.md +0 -0
  517. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/docs/dev/development.md +0 -0
  518. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/.dockerignore +0 -0
  519. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/.gitignore +0 -0
  520. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/.nvmrc +0 -0
  521. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/Dockerfile +0 -0
  522. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/Makefile +0 -0
  523. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/README.md +0 -0
  524. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/biome.json +0 -0
  525. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/index.html +0 -0
  526. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/modify-openapi-operationids.js +0 -0
  527. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/nginx-backend-not-found.conf +0 -0
  528. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/nginx.conf +0 -0
  529. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/openapi-ts.config.ts +0 -0
  530. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/package-lock.json +0 -0
  531. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/package.json +0 -0
  532. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/playwright.config.ts +0 -0
  533. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/public/assets/images/c-to-the-k.svg +0 -0
  534. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/public/assets/images/calkit-no-bg.svg +0 -0
  535. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/public/assets/images/calkit.svg +0 -0
  536. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/public/assets/images/fastapi-logo.svg +0 -0
  537. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/public/assets/images/favicon.png +0 -0
  538. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/public/assets/images/kdot.svg +0 -0
  539. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/public/tex/.gitignore +0 -0
  540. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/public/tex/LICENSE-busytex +0 -0
  541. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/public/tex/busytex.js +0 -0
  542. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/public/tex/busytex.wasm +0 -0
  543. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/public/tex/busytex_pipeline.js +0 -0
  544. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/public/tex/busytex_worker.js +0 -0
  545. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/scripts/download-tex-engine.sh +0 -0
  546. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/client/client.gen.ts +0 -0
  547. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/client/index.ts +0 -0
  548. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/client/types.gen.ts +0 -0
  549. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/client/utils.gen.ts +0 -0
  550. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/client.gen.ts +0 -0
  551. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/core/auth.gen.ts +0 -0
  552. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/core/bodySerializer.gen.ts +0 -0
  553. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/core/params.gen.ts +0 -0
  554. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/core/pathSerializer.gen.ts +0 -0
  555. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/core/queryKeySerializer.gen.ts +0 -0
  556. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/core/serverSentEvents.gen.ts +0 -0
  557. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/core/types.gen.ts +0 -0
  558. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/core/utils.gen.ts +0 -0
  559. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Admin/AddUser.tsx +0 -0
  560. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Admin/EditUser.tsx +0 -0
  561. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/ActionsMenu.tsx +0 -0
  562. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/ClearableInput.tsx +0 -0
  563. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/CodeEditorPane.tsx +0 -0
  564. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/CommentsPanel.tsx +0 -0
  565. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/ConnectGitHubPrompt.tsx +0 -0
  566. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/ConnectZoteroPrompt.tsx +0 -0
  567. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/DeleteAlert.tsx +0 -0
  568. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/GlobalSearch.tsx +0 -0
  569. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/LoadingSpinner.tsx +0 -0
  570. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/Markdown.tsx +0 -0
  571. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/Mermaid.tsx +0 -0
  572. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/Navbar.tsx +0 -0
  573. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/NotBuiltAlert.tsx +0 -0
  574. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/NotFound.tsx +0 -0
  575. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/NotificationBell.tsx +0 -0
  576. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/PageMenu.tsx +0 -0
  577. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/PdfCanvas.tsx +0 -0
  578. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/PdfDocumentViewer.tsx +0 -0
  579. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/ProjectCommandPalette.tsx +0 -0
  580. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/RefPicker.tsx +0 -0
  581. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/Sidebar.tsx +0 -0
  582. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/SidebarItems.tsx +0 -0
  583. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/Tooltip.tsx +0 -0
  584. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/Topbar.tsx +0 -0
  585. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/UserMenu.tsx +0 -0
  586. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Datasets/DatasetFromExisting.tsx +0 -0
  587. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Datasets/UploadDataset.tsx +0 -0
  588. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Environments/ViewEnvironment.tsx +0 -0
  589. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Figures/FigureFromExisting.tsx +0 -0
  590. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Figures/FigureView.tsx +0 -0
  591. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Figures/UploadFigure.tsx +0 -0
  592. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Files/EditFileInfo.tsx +0 -0
  593. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Files/FileContent.tsx +0 -0
  594. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Files/FileEditorModal.tsx +0 -0
  595. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Files/SelectedItemInfo.tsx +0 -0
  596. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Files/UploadFile.tsx +0 -0
  597. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Local/AddPath.tsx +0 -0
  598. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Local/DiscardChanges.tsx +0 -0
  599. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Local/IgnorePath.tsx +0 -0
  600. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Local/NewStage.tsx +0 -0
  601. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Local/SaveFiles.tsx +0 -0
  602. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Orgs/AddMember.tsx +0 -0
  603. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Orgs/NewOrg.tsx +0 -0
  604. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Pipeline/StageEditorModal.tsx +0 -0
  605. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Presentations/PresentationView.tsx +0 -0
  606. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Projects/AddCollaborator.tsx +0 -0
  607. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Projects/CloneProject.tsx +0 -0
  608. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Projects/CreateIssue.tsx +0 -0
  609. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Projects/CreateQuestion.tsx +0 -0
  610. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Projects/EditProject.tsx +0 -0
  611. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Projects/EditQuestion.tsx +0 -0
  612. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Projects/HelpContent.tsx +0 -0
  613. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Projects/InviteLinks.tsx +0 -0
  614. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Projects/MakeProjectPublic.tsx +0 -0
  615. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Projects/NewProject.tsx +0 -0
  616. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Projects/ProjectShowcase.tsx +0 -0
  617. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Projects/ProjectStatus.tsx +0 -0
  618. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Publications/ImportOverleaf.tsx +0 -0
  619. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Publications/LatexEditor.tsx +0 -0
  620. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Publications/NewPublication.tsx +0 -0
  621. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Publications/PdfAnnotator.tsx +0 -0
  622. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Publications/PublicationView.tsx +0 -0
  623. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/References/DeleteReferenceItemDialog.tsx +0 -0
  624. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/References/DeleteReferencesCollectionDialog.tsx +0 -0
  625. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/References/EditReferenceItemModal.tsx +0 -0
  626. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/References/FileViewModal.tsx +0 -0
  627. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/References/ImportFromZoteroModal.tsx +0 -0
  628. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/References/LabelExistingReferences.tsx +0 -0
  629. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/References/NewReferencesCollection.tsx +0 -0
  630. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/References/ReferenceItemModal.tsx +0 -0
  631. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/References/ReferencesInfoPanel.tsx +0 -0
  632. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Releases/ArtifactReleasesPanel.tsx +0 -0
  633. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Releases/NewRelease.tsx +0 -0
  634. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Releases/PathPicker.tsx +0 -0
  635. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Releases/ReleasePdfAnnotator.tsx +0 -0
  636. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Releases/ReleaseViewer.tsx +0 -0
  637. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Releases/ReleasesTable.tsx +0 -0
  638. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Releases/ShareDialog.tsx +0 -0
  639. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Releases/releaseSort.ts +0 -0
  640. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/UserSettings/Appearance.tsx +0 -0
  641. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/UserSettings/ChangePassword.tsx +0 -0
  642. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/UserSettings/ConnectedAccounts.tsx +0 -0
  643. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/UserSettings/DeleteAccount.tsx +0 -0
  644. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/UserSettings/DeleteConfirmation.tsx +0 -0
  645. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/UserSettings/NewToken.tsx +0 -0
  646. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/UserSettings/PickSubscription.tsx +0 -0
  647. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/UserSettings/Subscription.tsx +0 -0
  648. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/UserSettings/UpdateOverleafToken.tsx +0 -0
  649. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/UserSettings/UserInformation.tsx +0 -0
  650. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/UserSettings/UserTokens.tsx +0 -0
  651. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/hooks/useAuth.ts +0 -0
  652. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/hooks/useCustomToast.ts +0 -0
  653. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/analytics.test.ts +0 -0
  654. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/analytics.ts +0 -0
  655. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/auth.test.ts +0 -0
  656. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/auth.ts +0 -0
  657. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/bibtex.test.ts +0 -0
  658. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/bibtex.ts +0 -0
  659. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/core.ts +0 -0
  660. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/errors.ts +0 -0
  661. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/github.test.ts +0 -0
  662. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/github.ts +0 -0
  663. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/google.ts +0 -0
  664. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/keyboard.ts +0 -0
  665. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/latexCompiler.ts +0 -0
  666. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/latexProject.mapPaths.test.ts +0 -0
  667. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/latexProject.test.ts +0 -0
  668. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/latexProject.ts +0 -0
  669. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/layout.ts +0 -0
  670. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/pipelineYaml.test.ts +0 -0
  671. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/pipelineYaml.ts +0 -0
  672. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/releases.ts +0 -0
  673. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/strings.test.ts +0 -0
  674. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/strings.ts +0 -0
  675. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/zenodo.ts +0 -0
  676. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/zotero.ts +0 -0
  677. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routeTree.gen.ts +0 -0
  678. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/__root.tsx +0 -0
  679. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/app.tsx +0 -0
  680. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/collaborators.tsx +0 -0
  681. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/datasets.tsx +0 -0
  682. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/environments.tsx +0 -0
  683. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/files.tsx +0 -0
  684. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/history.tsx +0 -0
  685. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/index.tsx +0 -0
  686. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/local.tsx +0 -0
  687. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/presentations.tsx +0 -0
  688. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/publications.tsx +0 -0
  689. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/references.tsx +0 -0
  690. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/releases.tsx +0 -0
  691. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/software.tsx +0 -0
  692. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout.tsx +0 -0
  693. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/releases/$releaseName.tsx +0 -0
  694. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/index.tsx +0 -0
  695. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/admin.tsx +0 -0
  696. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/datasets.tsx +0 -0
  697. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/index.tsx +0 -0
  698. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/learn.tsx +0 -0
  699. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/orgs.tsx +0 -0
  700. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/projects.tsx +0 -0
  701. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/settings.tsx +0 -0
  702. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout.tsx +0 -0
  703. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/auth/google.tsx +0 -0
  704. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/auth/zenodo.tsx +0 -0
  705. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/auth/zotero.tsx +0 -0
  706. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/checkout.tsx +0 -0
  707. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/join/$token.tsx +0 -0
  708. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/login/device.tsx +0 -0
  709. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/login/index.tsx +0 -0
  710. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/recover-password.tsx +0 -0
  711. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/reset-password.tsx +0 -0
  712. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/signup.tsx +0 -0
  713. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/theme.tsx +0 -0
  714. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/vite-env.d.ts +0 -0
  715. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/tests/auth.setup.ts +0 -0
  716. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/tests/config.ts +0 -0
  717. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/tests/login.spec.ts +0 -0
  718. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/tests/reset-password.spec.ts +0 -0
  719. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/tests/user-settings.spec.ts +0 -0
  720. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/tests/utils/mailcatcher.ts +0 -0
  721. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/tests/utils/random.ts +0 -0
  722. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/tests/utils/user.ts +0 -0
  723. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/tsconfig.json +0 -0
  724. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/tsconfig.node.json +0 -0
  725. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/vitest.config.ts +0 -0
  726. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/scripts/build-push.sh +0 -0
  727. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/scripts/build.sh +0 -0
  728. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/scripts/deploy.sh +0 -0
  729. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/scripts/pem-to-env.sh +0 -0
  730. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/scripts/test-local.sh +0 -0
  731. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/scripts/test.sh +0 -0
  732. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/texmf-proxy/Dockerfile +0 -0
  733. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/texmf-proxy/README.md +0 -0
  734. {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/texmf-proxy/proxy.py +0 -0
  735. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/.yarnrc.yml +0 -0
  736. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/babel.config.js +0 -0
  737. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/install.json +0 -0
  738. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/jest.config.js +0 -0
  739. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/jupyter-config/server-config/calkit.json +0 -0
  740. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/package.json +0 -0
  741. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/schema/plugin.json +0 -0
  742. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/__tests__/useQueries.spec.ts +0 -0
  743. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/calkit-config.ts +0 -0
  744. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/cell-output-marker.ts +0 -0
  745. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/components/commit-dialog.tsx +0 -0
  746. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/components/environment-editor.tsx +0 -0
  747. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/components/notebook-registration.tsx +0 -0
  748. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/components/notebook-toolbar.tsx +0 -0
  749. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/components/pipeline-status-bar.tsx +0 -0
  750. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/components/project-info-editor.tsx +0 -0
  751. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/components/sidebar-settings.tsx +0 -0
  752. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/components/sidebar.tsx +0 -0
  753. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/components/stage-editor.tsx +0 -0
  754. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/feature-flags.ts +0 -0
  755. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/file-browser-menu.ts +0 -0
  756. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/hooks/__tests__/useQueries.test.tsx +0 -0
  757. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/hooks/useQueries.ts +0 -0
  758. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/icons.ts +0 -0
  759. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/index.ts +0 -0
  760. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/io-tracker.ts +0 -0
  761. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/pipeline-state.ts +0 -0
  762. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/queryClient.ts +0 -0
  763. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/request.ts +0 -0
  764. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/shims-mainmenu.d.ts +0 -0
  765. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/style/base.css +0 -0
  766. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/style/cell-output-marker.css +0 -0
  767. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/style/environment-editor.css +0 -0
  768. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/style/environment-selector.css +0 -0
  769. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/style/img/calkit-no-bg.png +0 -0
  770. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/style/index.css +0 -0
  771. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/style/index.js +0 -0
  772. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/style/notebook-toolbar.css +0 -0
  773. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/style/pipeline-status-bar.css +0 -0
  774. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/style/sidebar.css +0 -0
  775. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/tsconfig.json +0 -0
  776. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/tsconfig.test.json +0 -0
  777. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/ui-tests/.gitignore +0 -0
  778. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/ui-tests/README.md +0 -0
  779. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/ui-tests/jupyter_server_test_config.py +0 -0
  780. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/ui-tests/package.json +0 -0
  781. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/ui-tests/playwright.config.js +0 -0
  782. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/ui-tests/tests/calkit.spec.ts +0 -0
  783. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/ui-tests/yarn.lock +0 -0
  784. {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/yarn.lock +0 -0
  785. {calkit_python-0.42.0 → calkit_python-0.42.1}/mkdocs.yml +0 -0
  786. {calkit_python-0.42.0 → calkit_python-0.42.1}/scripts/generate-docs-references.py +0 -0
  787. {calkit_python-0.42.0 → calkit_python-0.42.1}/scripts/install.ps1 +0 -0
  788. {calkit_python-0.42.0 → calkit_python-0.42.1}/scripts/install.sh +0 -0
  789. {calkit_python-0.42.0 → calkit_python-0.42.1}/scripts/make-calk9.sh +0 -0
  790. {calkit_python-0.42.0 → calkit_python-0.42.1}/scripts/sync-docs.py +0 -0
  791. {calkit_python-0.42.0 → calkit_python-0.42.1}/test/dvc-md5-dir/osx-arm64.txt +0 -0
  792. {calkit_python-0.42.0 → calkit_python-0.42.1}/test/nb-julia.ipynb +0 -0
  793. {calkit_python-0.42.0 → calkit_python-0.42.1}/test/nb-params.ipynb +0 -0
  794. {calkit_python-0.42.0 → calkit_python-0.42.1}/test/nb-subdir.ipynb +0 -0
  795. {calkit_python-0.42.0 → calkit_python-0.42.1}/test/pipeline.ipynb +0 -0
  796. {calkit_python-0.42.0 → calkit_python-0.42.1}/test/script.py +0 -0
  797. {calkit_python-0.42.0 → calkit_python-0.42.1}/test/test-log.log +0 -0
  798. {calkit_python-0.42.0 → calkit_python-0.42.1}/uv.lock +0 -0
  799. {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/.gitignore +0 -0
  800. {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/.vscodeignore +0 -0
  801. {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/CHANGELOG.md +0 -0
  802. {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/LICENSE +0 -0
  803. {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/README.md +0 -0
  804. {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/images/calkit-icon.svg +0 -0
  805. {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/images/calkit-no-bg.png +0 -0
  806. {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/package-lock.json +0 -0
  807. {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/package.json +0 -0
  808. {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/scripts/set-proposed-api.js +0 -0
  809. {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/src/extension.ts +0 -0
  810. {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/src/figures/core.ts +0 -0
  811. {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/src/figures/view.ts +0 -0
  812. {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/src/notebooks.ts +0 -0
  813. {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/src/pipeline/core.ts +0 -0
  814. {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/src/sidebar.ts +0 -0
  815. {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/src/test/environments.test.ts +0 -0
  816. {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/src/test/figures.test.ts +0 -0
  817. {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/src/test/kernel-selection.test.ts +0 -0
  818. {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/src/test/notebooks.test.ts +0 -0
  819. {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/src/test/pipeline.test.ts +0 -0
  820. {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/src/test/sidebar.test.ts +0 -0
  821. {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/src/types.ts +0 -0
  822. {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/tsconfig.json +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: calkit-python
3
- Version: 0.42.0
3
+ Version: 0.42.1
4
4
  Summary: Reproducibility simplified.
5
5
  Project-URL: Homepage, https://calkit.org
6
6
  Project-URL: Issues, https://github.com/calkit/calkit/issues
@@ -132,6 +132,11 @@ without the cognitive overhead.
132
132
  - Extensions for doing all of the above graphically in
133
133
  [JupyterLab](https://docs.calkit.org/jupyterlab) and
134
134
  [VS Code](https://marketplace.visualstudio.com/items?itemName=Calkit.calkit-vscode).
135
+ - A [browser extension](https://docs.calkit.org/browser-ext) for collecting references
136
+ directly to BibTeX (optionally synced with Zotero),
137
+ viewing DVC-stored files on GitHub,
138
+ and syncing figures and results with Overleaf directly in Chrome,
139
+ Microsoft Edge, and more.
135
140
 
136
141
  <!-- END INCLUDE -->
137
142
 
@@ -73,6 +73,11 @@ without the cognitive overhead.
73
73
  - Extensions for doing all of the above graphically in
74
74
  [JupyterLab](https://docs.calkit.org/jupyterlab) and
75
75
  [VS Code](https://marketplace.visualstudio.com/items?itemName=Calkit.calkit-vscode).
76
+ - A [browser extension](https://docs.calkit.org/browser-ext) for collecting references
77
+ directly to BibTeX (optionally synced with Zotero),
78
+ viewing DVC-stored files on GitHub,
79
+ and syncing figures and results with Overleaf directly in Chrome,
80
+ Microsoft Edge, and more.
76
81
 
77
82
  <!-- END INCLUDE -->
78
83
 
@@ -1203,10 +1203,13 @@ def check_venv(
1203
1203
  else os.path.join(wdir or ".", prefix)
1204
1204
  )
1205
1205
  if os.path.isdir(prefix_full_path):
1206
+ # This can fail if the environment is in use, e.g., on
1207
+ # Windows, where files can't be removed while open, in which
1208
+ # case we keep it and fall back to rebuilding from the spec
1206
1209
  shutil.rmtree(prefix_full_path)
1207
1210
  create_venv()
1208
1211
  pip_install_and_freeze(dep_file_txt)
1209
- except subprocess.CalledProcessError:
1212
+ except (subprocess.CalledProcessError, OSError):
1210
1213
  warn(
1211
1214
  f"Failed to create environment from lock file ({reqs_to_use}); "
1212
1215
  f"attempting rebuild from input file {path}"
@@ -2440,6 +2440,26 @@ def manual_step(
2440
2440
  typer.echo("Done")
2441
2441
 
2442
2442
 
2443
+ def _env_prefix_exists(
2444
+ env: dict, envs: dict, env_name: str, wdir: str | None
2445
+ ) -> bool:
2446
+ """Check that a venv-like environment's prefix exists on disk.
2447
+
2448
+ The environment check cache only hashes a prefix that's pinned in
2449
+ ``calkit.yaml``, so a virtual environment living at its default location
2450
+ could have been deleted since the last check without invalidating the
2451
+ cache, in which case it still needs to be rebuilt.
2452
+ """
2453
+ if env.get("kind") not in ["uv-venv", "venv"]:
2454
+ return True
2455
+ if env.get("prefix") or "path" not in env:
2456
+ return True
2457
+ prefix = calkit.environments.get_default_venv_prefix(
2458
+ envs, env["path"], env_name
2459
+ )
2460
+ return os.path.isdir(os.path.join(wdir or ".", prefix))
2461
+
2462
+
2443
2463
  @app.command(
2444
2464
  name="xenv|runenv",
2445
2465
  help="Execute a command in an environment.",
@@ -2529,6 +2549,38 @@ def run_in_env(
2529
2549
  docker_wdir = posixpath.join(docker_wdir, wdir)
2530
2550
  shell = env.get("shell", "sh")
2531
2551
  platform = env.get("platform")
2552
+
2553
+ def save_env_check_cache() -> None:
2554
+ """Record a successful check so repeat calls can skip it."""
2555
+ try:
2556
+ calkit.environments.save_cache(
2557
+ env_name=env_name, env=env, wdir=wdir, success=True
2558
+ )
2559
+ except Exception as e:
2560
+ if verbose:
2561
+ typer.echo(f"Failed to save environment check cache: {e}")
2562
+
2563
+ # This command is typically called once per pipeline stage, so checking
2564
+ # the environment every time is wasteful, and on Windows can fail
2565
+ # outright, e.g., if a package installed into the environment provides
2566
+ # the executable that's currently running. Consult the same cache
2567
+ # ``calkit run`` uses and only check if something relevant has changed.
2568
+ if (
2569
+ not no_check
2570
+ and env["kind"] not in calkit.environments.KINDS_NO_CHECK
2571
+ and calkit.environments.check_cache(
2572
+ env_name=env_name, env=env, wdir=wdir
2573
+ )
2574
+ and _env_prefix_exists(
2575
+ env=env, envs=envs, env_name=env_name, wdir=wdir
2576
+ )
2577
+ ):
2578
+ if verbose:
2579
+ typer.echo(
2580
+ f"Skipping check for environment '{env_name}' since it was "
2581
+ "recently checked and nothing has changed"
2582
+ )
2583
+ no_check = True
2532
2584
  if env["kind"] == "docker":
2533
2585
  if "image" not in env:
2534
2586
  raise_error("Image must be defined for Docker environments")
@@ -2555,6 +2607,7 @@ def run_in_env(
2555
2607
  args=env.get("args", []),
2556
2608
  quiet=not verbose,
2557
2609
  )
2610
+ save_env_check_cache()
2558
2611
  docker_cmd = [
2559
2612
  "docker",
2560
2613
  "run",
@@ -2630,6 +2683,7 @@ def run_in_env(
2630
2683
  relaxed=relaxed_check,
2631
2684
  quiet=not verbose,
2632
2685
  )
2686
+ save_env_check_cache()
2633
2687
  # TODO: Prefix should only be in the env file or calkit.yaml, not both?
2634
2688
  prefix = env.get("prefix")
2635
2689
  # Conda is often not on the PATH (especially on Windows), so search
@@ -2708,6 +2762,7 @@ def run_in_env(
2708
2762
  quiet=True,
2709
2763
  verbose=verbose,
2710
2764
  )
2765
+ save_env_check_cache()
2711
2766
  # Now run the command
2712
2767
  cmd = f"{activate_cmd} && {shell_cmd} && deactivate" # type: ignore
2713
2768
  if verbose:
@@ -2719,6 +2774,7 @@ def run_in_env(
2719
2774
  elif env["kind"] == "julia":
2720
2775
  if not no_check:
2721
2776
  check_environment(env_name=env_name, verbose=verbose)
2777
+ save_env_check_cache()
2722
2778
  env_path = env.get("path")
2723
2779
  if env_path is None:
2724
2780
  raise_error(
@@ -2884,6 +2940,7 @@ def run_in_env(
2884
2940
  assert isinstance(env_path, str)
2885
2941
  if not no_check:
2886
2942
  check_renv(env_path=env_path, verbose=verbose)
2943
+ save_env_check_cache()
2887
2944
  # For renv, we need to run from the renv project directory so renv
2888
2945
  # properly initializes the library, but the script needs to run
2889
2946
  # from its original working directory
@@ -2935,6 +2992,7 @@ def run_in_env(
2935
2992
  )
2936
2993
  if not no_check:
2937
2994
  check_nix_env(env=env, verbose=verbose)
2995
+ save_env_check_cache()
2938
2996
  env_dir = os.path.dirname(os.path.abspath(env_path)) or "."
2939
2997
  flake_ref = f"path:{env_dir}"
2940
2998
  shell_name = env.get("shell")
@@ -2966,6 +3024,7 @@ def run_in_env(
2966
3024
  env=env, env_name=env_name, as_posix=False
2967
3025
  ), # type: ignore
2968
3026
  )
3027
+ save_env_check_cache()
2969
3028
  image_name = calkit.matlab.get_docker_image_name(
2970
3029
  ck_info=ck_info,
2971
3030
  env_name=env_name,
@@ -1572,6 +1572,18 @@ def new_slurm_env(
1572
1572
  ),
1573
1573
  ),
1574
1574
  ] = [],
1575
+ max_concurrent_jobs: Annotated[
1576
+ int | None,
1577
+ typer.Option(
1578
+ "--max-concurrent-jobs",
1579
+ help=(
1580
+ "Maximum number of this project's jobs allowed in the "
1581
+ "queue at once, or 0 for no limit. Submissions beyond this "
1582
+ "wait for a slot, so an iterated stage does not take over a "
1583
+ "shared cluster's queue. Unlimited by default."
1584
+ ),
1585
+ ),
1586
+ ] = None,
1575
1587
  description: Annotated[
1576
1588
  str | None, typer.Option("--description", help="Description.")
1577
1589
  ] = None,
@@ -1612,6 +1624,12 @@ def new_slurm_env(
1612
1624
  env["default_options"] = normalized_default_options # type: ignore
1613
1625
  if normalized_default_setup:
1614
1626
  env["default_setup"] = normalized_default_setup # type: ignore
1627
+ if max_concurrent_jobs is not None:
1628
+ if max_concurrent_jobs < 0:
1629
+ raise_error("--max-concurrent-jobs cannot be negative")
1630
+ # 0 means no limit, the same as it does for `calkit update`.
1631
+ if max_concurrent_jobs:
1632
+ env["max_concurrent_jobs"] = max_concurrent_jobs # type: ignore
1615
1633
  if description is not None:
1616
1634
  env["description"] = description
1617
1635
  envs[name] = env
@@ -1661,6 +1679,18 @@ def new_pbs_env(
1661
1679
  ),
1662
1680
  ),
1663
1681
  ] = [],
1682
+ max_concurrent_jobs: Annotated[
1683
+ int | None,
1684
+ typer.Option(
1685
+ "--max-concurrent-jobs",
1686
+ help=(
1687
+ "Maximum number of this project's jobs allowed in the "
1688
+ "queue at once, or 0 for no limit. Submissions beyond this "
1689
+ "wait for a slot, so an iterated stage does not take over a "
1690
+ "shared cluster's queue. Unlimited by default."
1691
+ ),
1692
+ ),
1693
+ ] = None,
1664
1694
  description: Annotated[
1665
1695
  str | None, typer.Option("--description", help="Description.")
1666
1696
  ] = None,
@@ -1703,6 +1733,12 @@ def new_pbs_env(
1703
1733
  env["default_options"] = normalized_default_options # type: ignore
1704
1734
  if normalized_default_setup:
1705
1735
  env["default_setup"] = normalized_default_setup # type: ignore
1736
+ if max_concurrent_jobs is not None:
1737
+ if max_concurrent_jobs < 0:
1738
+ raise_error("--max-concurrent-jobs cannot be negative")
1739
+ # 0 means no limit, the same as it does for `calkit update`.
1740
+ if max_concurrent_jobs:
1741
+ env["max_concurrent_jobs"] = max_concurrent_jobs # type: ignore
1706
1742
  if description is not None:
1707
1743
  env["description"] = description
1708
1744
  envs[name] = env
@@ -8,12 +8,15 @@ Registered as ``scheduler|sch``.
8
8
 
9
9
  from __future__ import annotations
10
10
 
11
+ import contextlib
11
12
  import os
13
+ import random
12
14
  import re
13
15
  import shlex
14
16
  import shutil
15
17
  import signal
16
18
  import socket
19
+ import sqlite3
17
20
  import subprocess
18
21
  import sys
19
22
  import time
@@ -44,6 +47,23 @@ LOCAL_DIR = os.path.join(".calkit", "local")
44
47
  # (e.g. `scheduler queue`) never see a half-written file.
45
48
  JOBS_DB_PATH = os.path.join(LOCAL_DIR, "scheduler-jobs.db")
46
49
  MOCK_DIR = os.path.join(LOCAL_DIR, "mock-scheduler")
50
+ # Serializes the check-for-a-free-slot-then-submit sequence across the
51
+ # parallel batch processes that fan out an iterated stage. Without it they
52
+ # would all see the same free slot and submit together, which is exactly what
53
+ # an environment's max_concurrent_jobs exists to prevent.
54
+ QUEUE_LOCK_PATH = os.path.join(LOCAL_DIR, "scheduler-queue-lock.db")
55
+ # Seconds SQLite waits for the lock before raising; retried past this, so it
56
+ # only bounds how long a single attempt blocks.
57
+ QUEUE_LOCK_TIMEOUT = 60
58
+ # How often a job waiting for a queue slot rechecks. Long enough not to hammer
59
+ # the scheduler with status queries, short enough that a freed slot is taken
60
+ # promptly relative to the runtime of a job worth queueing.
61
+ QUEUE_SLOT_POLL_INTERVAL = 10.0
62
+ MOCK_QUEUE_SLOT_POLL_INTERVAL = 0.25
63
+ # Fraction by which each waiter randomizes its poll interval. A capped sweep
64
+ # leaves one waiting process per unsubmitted case, and without jitter they all
65
+ # wake, take the lock, and query the scheduler in lockstep.
66
+ QUEUE_SLOT_POLL_JITTER = 0.25
47
67
  # When set, scheduler commands run jobs on the local host instead of
48
68
  # dispatching to a real SLURM/PBS install (see _mock_enabled).
49
69
  MOCK_ENV_VAR = "CALKIT_MOCK_SCHEDULER"
@@ -434,6 +454,190 @@ def _is_active(kind: str, job_id: str) -> bool:
434
454
  return _poll_job(kind, job_id)[0]
435
455
 
436
456
 
457
+ def _active_job_ids(kind: str, job_ids: list[str]) -> set[str]:
458
+ """Return which of ``job_ids`` are still queued or running.
459
+
460
+ Answers for the whole set in one scheduler query where possible. Counting
461
+ queue occupancy means asking about every job this project has submitted,
462
+ and doing that one ``squeue`` call per job---from every process waiting
463
+ for a slot, on every poll---would put more load on the scheduler than the
464
+ submissions we are trying to pace.
465
+ """
466
+ if not job_ids:
467
+ return set()
468
+ if not _mock_enabled() and kind == "slurm":
469
+ # Query our own jobs rather than passing `--jobs <ids>`: squeue errors
470
+ # out when any listed id is unknown, and ids do go unknown once the
471
+ # scheduler purges a finished job, which is the common case here.
472
+ p = subprocess.run(
473
+ ["squeue", "--me", "-h", "-o", "%i"],
474
+ capture_output=True,
475
+ text=True,
476
+ check=False,
477
+ )
478
+ if p.returncode == 0:
479
+ wanted = set(job_ids)
480
+ # Array and step ids appear as `123_4` and `123.batch`; both
481
+ # belong to the job we recorded as `123`.
482
+ active = {
483
+ line.strip().split("_")[0].split(".")[0]
484
+ for line in p.stdout.splitlines()
485
+ if line.strip()
486
+ }
487
+ return wanted & active
488
+ # squeue failed---fall through and ask about each job individually
489
+ # rather than reporting an empty queue we have not confirmed.
490
+ return {job_id for job_id in job_ids if _is_active(kind, job_id)}
491
+
492
+
493
+ def _count_queued_jobs(environment: str, exclude: str) -> int:
494
+ """Count this project's jobs sitting in the queue for an environment.
495
+
496
+ Only jobs Calkit submitted for this project are counted; the limit is
497
+ about not monopolizing a shared queue with one project's iterated stage,
498
+ not about the user's jobs at large.
499
+ """
500
+ by_kind: dict[str, list[str]] = {}
501
+ for job_name, info in _load_jobs().items():
502
+ if job_name == exclude:
503
+ continue
504
+ # Records written before environments were tracked have no
505
+ # environment key. Count them: over-counting delays a submission,
506
+ # while under-counting is what floods the queue.
507
+ job_env = info.get("environment")
508
+ if job_env is not None and job_env != environment:
509
+ continue
510
+ if info.get("exit_code") is not None:
511
+ # Already observed to have finished, so it cannot be in the queue.
512
+ continue
513
+ by_kind.setdefault(info.get("kind", "slurm"), []).append(
514
+ info["job_id"]
515
+ )
516
+ return sum(
517
+ len(_active_job_ids(kind, job_ids))
518
+ for kind, job_ids in by_kind.items()
519
+ )
520
+
521
+
522
+ @contextlib.contextmanager
523
+ def _queue_lock():
524
+ """Cross-process mutex around checking for a slot and then submitting.
525
+
526
+ Built on SQLite's own locking---an IMMEDIATE transaction takes a write
527
+ lock that other connections block on---rather than a lock library, since
528
+ scheduler state already depends on SQLite locking correctly here, and it
529
+ keeps this to the standard library.
530
+ """
531
+ calkit.ensure_local_dir()
532
+ conn = sqlite3.connect(
533
+ QUEUE_LOCK_PATH, timeout=QUEUE_LOCK_TIMEOUT, isolation_level=None
534
+ )
535
+ try:
536
+ while True:
537
+ try:
538
+ conn.execute("BEGIN IMMEDIATE")
539
+ break
540
+ except sqlite3.OperationalError as e:
541
+ # Another process is mid-submit. It holds the lock only for as
542
+ # long as one submit command takes, so retrying is better than
543
+ # failing the stage. Only contention is worth retrying though:
544
+ # a read-only file or a bad disk would never clear, and
545
+ # retrying those forever would hang the stage with no
546
+ # explanation instead of surfacing the real problem.
547
+ msg = str(e).lower()
548
+ if "locked" not in msg and "busy" not in msg:
549
+ raise
550
+ time.sleep(1)
551
+ try:
552
+ yield
553
+ finally:
554
+ conn.rollback()
555
+ finally:
556
+ conn.close()
557
+
558
+
559
+ def _parse_max_concurrent_jobs(environment: str, value: object) -> int | None:
560
+ """Interpret an environment's ``max_concurrent_jobs``, or ``None``.
561
+
562
+ The value is read straight out of ``calkit.yaml`` rather than through
563
+ ``SlurmEnvironment``, so its ``ge=1`` constraint never runs and a
564
+ hand-edited file can put anything here. Reject what we cannot honor
565
+ instead of guessing: silently reading a bad value as "no limit" would
566
+ flood the queue this setting exists to protect, and a negative one would
567
+ leave the wait below with a condition that can never come true.
568
+ """
569
+ if value is None:
570
+ return None
571
+ # bool is an int subclass, and `max_concurrent_jobs: true` is a mistake,
572
+ # not a limit of one.
573
+ if isinstance(value, bool) or not isinstance(value, int):
574
+ raise_error(
575
+ f"Environment '{environment}' has an invalid "
576
+ f"max_concurrent_jobs ({value!r}); expected a positive integer"
577
+ )
578
+ # 0 means no limit, matching `calkit update slurm-env
579
+ # --max-concurrent-jobs 0`.
580
+ if value == 0:
581
+ return None
582
+ if value < 0:
583
+ raise_error(
584
+ f"Environment '{environment}' has a negative "
585
+ f"max_concurrent_jobs ({value}); it must be at least 1"
586
+ )
587
+ return value
588
+
589
+
590
+ @contextlib.contextmanager
591
+ def _queue_slot(environment: str, name: str, max_jobs: int | None):
592
+ """Hold a slot in the environment's queue for the duration of the block.
593
+
594
+ Blocks until this project has fewer than ``max_jobs`` jobs queued or
595
+ running, then keeps the lock while the caller submits and records the new
596
+ job, so concurrent waiters see it and do not overshoot the limit.
597
+ """
598
+ max_jobs = _parse_max_concurrent_jobs(environment, max_jobs)
599
+ if max_jobs is None:
600
+ yield
601
+ return
602
+ announced = False
603
+ while True:
604
+ # Check without the lock first. A capped sweep leaves one waiting
605
+ # process per unsubmitted case, and each poll would otherwise hold the
606
+ # exclusive lock across a scheduler query---with enough waiters the
607
+ # lock stays busy and slots go unclaimed long after they free up.
608
+ # A full queue is the common answer while waiting and needs no lock to
609
+ # act on; the authoritative check is still made under it below.
610
+ n_queued = _count_queued_jobs(environment, exclude=name)
611
+ if n_queued < max_jobs:
612
+ with _queue_lock():
613
+ n_queued = _count_queued_jobs(environment, exclude=name)
614
+ if n_queued < max_jobs:
615
+ yield
616
+ return
617
+ if not announced:
618
+ typer.echo(
619
+ f"Waiting for a free slot in environment '{environment}' "
620
+ f"({n_queued} of {max_jobs} jobs queued)"
621
+ )
622
+ announced = True
623
+ # Mocked jobs run locally and finish in seconds, so a full interval
624
+ # would dominate the runtime of anything using the mock scheduler.
625
+ interval = (
626
+ MOCK_QUEUE_SLOT_POLL_INTERVAL
627
+ if _mock_enabled()
628
+ else QUEUE_SLOT_POLL_INTERVAL
629
+ )
630
+ time.sleep(
631
+ interval
632
+ * (
633
+ 1
634
+ + random.uniform(
635
+ -QUEUE_SLOT_POLL_JITTER, QUEUE_SLOT_POLL_JITTER
636
+ )
637
+ )
638
+ )
639
+
640
+
437
641
  def _cancel(kind: str, job_id: str) -> tuple[bool, str]:
438
642
  if _mock_enabled():
439
643
  return _mock_cancel(job_id)
@@ -655,6 +859,11 @@ def run_batch(
655
859
  the same name, we'll wait for it to finish. The only exception is if the
656
860
  dependencies have changed, in which case any queued or running jobs will
657
861
  be canceled and a new one submitted.
862
+
863
+ If the environment sets ``max_concurrent_jobs``, submission waits until
864
+ this project has fewer than that many jobs queued or running, so an
865
+ iterated stage does not put all of its jobs into a shared cluster's queue
866
+ at once.
658
867
  """
659
868
  if args is None:
660
869
  args = []
@@ -872,51 +1081,63 @@ def run_batch(
872
1081
  shutil.rmtree(out)
873
1082
  except Exception as e:
874
1083
  raise_error(f"Error deleting '{out}': {e}")
875
- # Submit and record atomically with respect to Ctrl+C: a SIGINT here would
876
- # otherwise kill the submit command mid-flight or leave a job submitted but
877
- # never written to the database (so a re-run would resubmit it). Defer the
878
- # signal until the job is safely recorded, then act on it.
1084
+ # Wait for room in the queue before submitting, if the environment caps
1085
+ # how many of this project's jobs may be queued at once. This is done
1086
+ # after deleting outputs (which can be slow) so the slot is held only for
1087
+ # as long as submitting takes.
1088
+ max_jobs = env.get("max_concurrent_jobs")
879
1089
  pid = None
880
1090
  interrupted: list[bool] = []
881
- prev_sigint = signal.signal(
882
- signal.SIGINT, lambda *_: interrupted.append(True)
883
- )
884
- try:
885
- if _mock_enabled():
886
- job_id = uuid.uuid4().hex[:12]
887
- pid = _mock_submit(
888
- job_id=job_id, job_command=job_command, log_path=log_path
889
- )
890
- else:
891
- # start_new_session shields the submit command from the terminal's
892
- # Ctrl+C so the submission always completes.
893
- p = subprocess.run(
894
- submit_cmd,
895
- input=submit_input,
896
- capture_output=True,
897
- check=False,
898
- text=True,
899
- start_new_session=True,
900
- )
901
- if p.returncode != 0:
902
- raise_error(f"Failed to submit new job: {p.stderr}")
903
- job_id = p.stdout.strip()
904
- typer.echo(f"Submitted job with ID: {job_id}")
905
- new_job = {
906
- "kind": kind,
907
- "job_id": job_id,
908
- "deps": deps,
909
- "target": target,
910
- "args": args,
911
- "setup": setup_cmds,
912
- "dep_md5s": current_dep_md5s,
913
- "submitted_at": calkit.utcnow().isoformat(),
914
- }
915
- if pid is not None:
916
- new_job["pid"] = pid
917
- _record_job(name, new_job)
918
- finally:
919
- signal.signal(signal.SIGINT, prev_sigint)
1091
+ # The wait for a slot sits outside the SIGINT deferral below so Ctrl+C
1092
+ # still works while waiting---that wait can be long, and deferring the
1093
+ # signal through it would make it uninterruptible.
1094
+ with _queue_slot(environment, name, max_jobs):
1095
+ # Submit and record atomically with respect to Ctrl+C: a SIGINT here
1096
+ # would otherwise kill the submit command mid-flight or leave a job
1097
+ # submitted but never written to the database (so a re-run would
1098
+ # resubmit it). Defer the signal until the job is safely recorded,
1099
+ # then act on it. The queue slot is held across both, so a concurrent
1100
+ # waiter counts this job before deciding it has room to submit.
1101
+ prev_sigint = signal.signal(
1102
+ signal.SIGINT, lambda *_: interrupted.append(True)
1103
+ )
1104
+ try:
1105
+ if _mock_enabled():
1106
+ job_id = uuid.uuid4().hex[:12]
1107
+ pid = _mock_submit(
1108
+ job_id=job_id, job_command=job_command, log_path=log_path
1109
+ )
1110
+ else:
1111
+ # start_new_session shields the submit command from the
1112
+ # terminal's Ctrl+C so the submission always completes.
1113
+ p = subprocess.run(
1114
+ submit_cmd,
1115
+ input=submit_input,
1116
+ capture_output=True,
1117
+ check=False,
1118
+ text=True,
1119
+ start_new_session=True,
1120
+ )
1121
+ if p.returncode != 0:
1122
+ raise_error(f"Failed to submit new job: {p.stderr}")
1123
+ job_id = p.stdout.strip()
1124
+ typer.echo(f"Submitted job with ID: {job_id}")
1125
+ new_job = {
1126
+ "kind": kind,
1127
+ "environment": environment,
1128
+ "job_id": job_id,
1129
+ "deps": deps,
1130
+ "target": target,
1131
+ "args": args,
1132
+ "setup": setup_cmds,
1133
+ "dep_md5s": current_dep_md5s,
1134
+ "submitted_at": calkit.utcnow().isoformat(),
1135
+ }
1136
+ if pid is not None:
1137
+ new_job["pid"] = pid
1138
+ _record_job(name, new_job)
1139
+ finally:
1140
+ signal.signal(signal.SIGINT, prev_sigint)
920
1141
  if interrupted:
921
1142
  typer.echo(
922
1143
  f"Interrupted after submitting job '{name}' ({job_id}); it will "
@@ -928,6 +928,16 @@ def update_slurm_env(
928
928
  "--set-default-setup", help="Replace default setup list."
929
929
  ),
930
930
  ] = [],
931
+ max_concurrent_jobs: Annotated[
932
+ int | None,
933
+ typer.Option(
934
+ "--max-concurrent-jobs",
935
+ help=(
936
+ "Maximum number of this project's jobs allowed in the queue "
937
+ "at once, or 0 to remove the limit."
938
+ ),
939
+ ),
940
+ ] = None,
931
941
  ) -> None:
932
942
  """Update a SLURM environment."""
933
943
  ck_info, env = _load_env(env_name)
@@ -959,6 +969,15 @@ def update_slurm_env(
959
969
  env["default_setup"] = cmds
960
970
  elif "default_setup" in env:
961
971
  del env["default_setup"]
972
+ if max_concurrent_jobs is not None:
973
+ if max_concurrent_jobs < 0:
974
+ raise_error("--max-concurrent-jobs cannot be negative")
975
+ # 0 is the way to clear the limit, since omitting the option means
976
+ # "leave it alone" rather than "unlimited".
977
+ if max_concurrent_jobs == 0:
978
+ env.pop("max_concurrent_jobs", None)
979
+ else:
980
+ env["max_concurrent_jobs"] = max_concurrent_jobs
962
981
  calkit.save_calkit_info(ck_info)
963
982
  typer.echo(f"Updated slurm environment '{env_name}'")
964
983